/* ============================================================ * * This file is a part of the rekonq project * * Copyright (C) 2009 by Andrea Diamantini * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * ============================================================ */ // Self Includes #include "previewimage.h" #include "previewimage.moc" // Local Includes #include "application.h" #include "history.h" #include "rekonq.h" // KDE Includes #include #include #include #include #include #include // Qt Includes #include #include #include #include PreviewImage::PreviewImage(const QUrl &url, const QStringList &argumentNames, const QStringList &argumentValues) : QLabel() , ws(0) , m_url(0) , m_isFavorite(false) , m_index(-1) , m_button(0) { int i; i = argumentNames.indexOf(QRegExp(QString("isFavorite"), Qt::CaseInsensitive, QRegExp::FixedString)); if(i > -1 && argumentValues.at(i) == "true") m_isFavorite = true; i = argumentNames.indexOf(QRegExp(QString("index"), Qt::CaseInsensitive, QRegExp::FixedString)); if(i > -1) m_index = argumentValues.at(i).toInt(); setUrl(url); } PreviewImage::~PreviewImage() { delete ws; } void PreviewImage::setUrl(const QUrl& url) { m_url = url; if(url.isEmpty()) { showEmptyPreview(); return; } m_savePath = KStandardDirs::locateLocal("cache", QString("thumbs/") + guessNameFromUrl(m_url) + ".png", true); if(QFile::exists(m_savePath)) { m_pixmap.load(m_savePath); setPixmap(m_pixmap); } else { ws = new WebSnap( url ); connect(ws, SIGNAL(finished()), this, SLOT(snapFinished())); QString path = KStandardDirs::locate("appdata", "pics/busywidget.gif"); QMovie *movie = new QMovie(path, QByteArray(), this); movie->setSpeed(50); setMovie(movie); movie->start(); } } void PreviewImage::snapFinished() { QMovie *m = movie(); delete m; setMovie(0); m_pixmap = ws->previewImage(); setPixmap(m_pixmap); m_pixmap.save(m_savePath); if(m_index > -1) { // Update title QStringList names = ReKonfig::previewNames(); // update url (for added thumbs) QStringList urls = ReKonfig::previewUrls(); // stripTrailingSlash to be sure to get the same string for same adress urls.replace(m_index, ws->snapUrl().toString(QUrl::StripTrailingSlash)); names.replace(m_index, ws->snapTitle()); ReKonfig::setPreviewNames(names); ReKonfig::setPreviewUrls(urls); } } void PreviewImage::showEmptyPreview() { clear(); QHBoxLayout *layout = new QHBoxLayout(this); m_button = new QToolButton(this); m_button->setDefaultAction(historyMenu()); m_button->setPopupMode(QToolButton::InstantPopup); m_button->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); m_button->setText(i18n("Add Preview")); m_button->setAutoRaise(true); m_button->setIconSize(QSize(48, 48)); layout->addWidget(m_button); } void PreviewImage::mouseDoubleClickEvent(QMouseEvent *event) { Q_UNUSED(event); } void PreviewImage::mouseMoveEvent(QMouseEvent *event) { kDebug() << "moving mouse over preview image"; Q_UNUSED(event) } void PreviewImage::mousePressEvent(QMouseEvent *event) { switch(event->button()) { case Qt::LeftButton: Application::instance()->loadUrl(m_url); break; case Qt::RightButton: // TODO break; default: QLabel::mousePressEvent(event); }; } void PreviewImage::mouseReleaseEvent(QMouseEvent *event) { Q_UNUSED(event) } void PreviewImage::contextMenuEvent(QContextMenuEvent* event) { if(!m_isFavorite) return; KMenu menu(this); KAction *a; if(!m_url.isEmpty()) { a = new KAction(KIcon("edit-delete"), i18n("Remove Thumbnail"), this); connect(a, SIGNAL(triggered(bool)), this, SLOT(removeMe())); menu.addAction(a); } menu.addAction(historyMenu()); menu.exec(mapToGlobal(event->pos())); } KActionMenu* PreviewImage::historyMenu() { KActionMenu *histMenu = new KActionMenu(KIcon("insert-image"), i18n("Set page to preview"), this); QList history = Application::historyManager()->history(); if(history.isEmpty()) { KAction *a = new KAction(i18n("History is empty"), this); a->setEnabled(false); histMenu->addAction(a); return histMenu; } int maxItems = 15; for (int i = 0; i < maxItems && i < history.size() ; ++i) { HistoryItem it = history.at(i); KAction *a = new KAction(Application::icon(it.url), it.title, this); connect(a, SIGNAL(triggered(bool)), this, SLOT(setUrlFromAction())); a->setData(it.url); histMenu->addAction(a); } return histMenu; } void PreviewImage::removeMe() { QStringList names = ReKonfig::previewNames(); QStringList urls = ReKonfig::previewUrls(); int index = urls.indexOf(QRegExp(m_url.toString(QUrl::StripTrailingSlash), Qt::CaseSensitive, QRegExp::FixedString)); urls.replace(index, QString("")); names.replace(index, QString("")); ReKonfig::setPreviewNames(names); ReKonfig::setPreviewUrls(urls); showEmptyPreview(); QString path = KStandardDirs::locateLocal("cache", QString("thumbs/") + guessNameFromUrl(m_url) + ".png", true); QFile::remove(path); m_url = ""; } void PreviewImage::setUrlFromAction() { KAction *a = qobject_cast(sender()); KUrl url = KUrl(a->data().toString()); // delete thumb if exists to get a refreshed one. QString path = KStandardDirs::locateLocal("cache", QString("thumbs/") + guessNameFromUrl(url) + ".png", true); QFile::remove(path); if(m_button) { layout()->deleteLater(); m_button->menu()->deleteLater(); m_button->deleteLater(); } setUrl(url); } QString PreviewImage::guessNameFromUrl(QUrl url) { QString name = url.toString( QUrl::RemoveScheme | QUrl::RemoveUserInfo | QUrl::StripTrailingSlash ); // TODO learn Regular Expressions :) // and implement something better here.. name.remove('/'); name.remove('&'); name.remove('.'); name.remove('-'); name.remove('_'); return name; }