diff options
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | data/home.html | 19 | ||||
| -rw-r--r-- | src/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/application.cpp | 15 | ||||
| -rw-r--r-- | src/homepage.cpp | 67 | ||||
| -rw-r--r-- | src/homepage.h | 2 | ||||
| -rw-r--r-- | src/main.cpp | 2 | ||||
| -rw-r--r-- | src/mainview.cpp | 18 | ||||
| -rw-r--r-- | src/mainview.h | 7 | ||||
| -rw-r--r-- | src/mainwindow.cpp | 42 | ||||
| -rw-r--r-- | src/previewimage.cpp | 160 | ||||
| -rw-r--r-- | src/previewimage.h | 21 | ||||
| -rw-r--r-- | src/webpluginfactory.cpp | 6 | ||||
| -rw-r--r-- | src/websnap.cpp | 45 | ||||
| -rw-r--r-- | src/websnap.h | 3 | ||||
| -rw-r--r-- | src/webview.cpp | 128 | ||||
| -rw-r--r-- | src/webview.h | 19 | 
17 files changed, 390 insertions, 168 deletions
| diff --git a/CMakeLists.txt b/CMakeLists.txt index 46792384..ded215f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ PROJECT( rekonq )  # rekonq info  SET(REKONQ_MAJOR_VERSION "0")  SET(REKONQ_MINOR_VERSION "2") -SET(REKONQ_PATCH_VERSION "68") +SET(REKONQ_PATCH_VERSION "69")  SET(REKONQ_VERSION_STR      "${REKONQ_MAJOR_VERSION}.${REKONQ_MINOR_VERSION}.${REKONQ_PATCH_VERSION}" diff --git a/data/home.html b/data/home.html index ea683e6d..893f5d76 100644 --- a/data/home.html +++ b/data/home.html @@ -113,26 +113,9 @@ margin-left: 4px;  .thumbnail {  text-align: center;  float:left; -width: 25%; -min-width: 235px; -margin-bottom: 3%; -} - -.thumbnail object{ -background: url(%2/bg.png) no-repeat; -text-align: center; -padding: 14px 16px; --webkit-background-size: 100% 100%; --webkit-background-clip: padding; +margin-bottom: 7%;  cursor: pointer;  } -.thumbnail a { -display: block; -text-align: center; -color: #767676; -font-size: 0.8em; -text-decoration:none; -}  /* -------------------------------------------------------- */  /* Bookmarks page*/ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index daae3f44..71b2d77b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -66,6 +66,8 @@ TARGET_LINK_LIBRARIES ( rekonq                          ${QT_QTUITOOLS_LIBRARY}                          ${KDE4_KUTILS_LIBS}                          ${KDE4_KDEUI_LIBS} +                        ${KDE4_KIO_LIBS} +                        ${KDE4_KPARTS_LIBS}  ) diff --git a/src/application.cpp b/src/application.cpp index 69acf2f2..41fcd515 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -249,8 +249,8 @@ KIcon Application::icon(const KUrl &url)          if(url.isEmpty() && Application::instance()->mainWindow()->currentTab()->url().scheme() == "rekonq")              return KIcon("arrow-right"); -        if(url == KUrl("rekonq:allTabs")) -            return KIcon("tab-duplicate"); +        if(url == KUrl("rekonq:closedTabs")) +            return KIcon("tab-close");          if(url == KUrl("rekonq:history"))              return KIcon("view-history");          if(url == KUrl("rekonq:bookmarks")) @@ -339,12 +339,18 @@ void Application::loadUrl(const KUrl& url, const Rekonq::OpenType& type)          return;      } +    // WARNING this is just a temporary hack waiting for the new "awesome bar" (rekonq 0.4 target) +    // and it may not work in all cases. +    // Known issues are (add that here to test the awesome bar code): +    // - web shortcuts with space separator +    // - relative urls +    // - ...      KUrl loadingUrl(url);      if (loadingUrl.isRelative())      {          QString fn = loadingUrl.url(KUrl::RemoveTrailingSlash); -        if(loadingUrl.path().contains('.')) +        if(loadingUrl.path().contains('.') && !loadingUrl.path().contains(' '))          {              loadingUrl.setUrl("//" + fn);              loadingUrl.setScheme("http"); @@ -365,6 +371,7 @@ void Application::loadUrl(const KUrl& url, const Rekonq::OpenType& type)      {          loadingUrl = data.uri().url();      } +    // ------------------- END WARNING --------------------------------------      WebView *webView = 0;      MainWindow *w = 0; @@ -442,7 +449,7 @@ MainWindowList Application::mainWindowList()  bool Application::homePage(const KUrl &url)  { -    if (    url == KUrl("rekonq:allTabs")  +    if (    url == KUrl("rekonq:closedTabs")            || url == KUrl("rekonq:history")            || url == KUrl("rekonq:bookmarks")           || url == KUrl("rekonq:favorites") diff --git a/src/homepage.cpp b/src/homepage.cpp index 79345556..835be043 100644 --- a/src/homepage.cpp +++ b/src/homepage.cpp @@ -75,10 +75,10 @@ QString HomePage::rekonqHomePage(const KUrl &url)      QString speed;      QString title; -    if(url == KUrl("rekonq:allTabs")) +    if(url == KUrl("rekonq:closedTabs"))      { -        speed = fillAllTabs(); -        title = i18n("All Tabs"); +        speed = fillClosedTabs(); +        title = i18n("Closed Tabs");      }      if(url == KUrl("rekonq:history"))      { @@ -115,26 +115,20 @@ QString HomePage::fillFavorites()      QString speed;      for(int i=0; i<8; ++i)      { -        QString text = names.at(i); -        if(text.length() > 20) -        { -            text.truncate(17); -            text += "..."; -        }          speed += "<div class=\"thumbnail\">"; -        speed += "<object type=\"application/image-preview\" data=\""; -        speed += urls.at(i) + "\" width=\"200\">"; +        speed += "<object type=\"application/image-preview\" data=\"" + urls.at(i) + "\" >"; +        speed += "<param name=\"title\" value=\"" + names.at(i) + "\" />";          speed += "<param name=\"index\" value=\"" + QString::number(i) + "\" />";          speed += "<param name=\"isFavorite\" value=\"true\" />";          speed += "</object>"; -        speed += "<br />"; -        speed += "<a href=\"" + urls.at(i) + "\">" + text + "</a></div>"; +        speed += "</div>";      }      return speed;  } +// FIXME : port to new PreviewImage API to use...  QString HomePage::lastVisitedSites()  {      QString last; @@ -143,11 +137,10 @@ QString HomePage::lastVisitedSites()      {          HistoryItem it = history.at(i);          last += "<div class=\"thumbnail\">"; -        last += "<object type=\"application/image-preview\" data=\"" + it.url; -        last +=  "\" width=\"200\">"; +        last += "<object type=\"application/image-preview\" data=\"" + it.url +  "\" >";          last += "</object>";          last += "<br />"; -        last += "<a href=\"" + it.url + "\">" + it.url + "</a></div>"; +        last += "<a href=\"" + it.url + "\">" + it.title + "</a></div>";      }      return last; @@ -170,11 +163,11 @@ QString HomePage::homePageMenu(KUrl currentUrl)      menu += "</a></div>";      menu += "<div class=\"link"; -    if(currentUrl == "rekonq:allTabs") +    if(currentUrl == "rekonq:closedTabs")          menu += " current"; -    menu += "\"><a href=\"rekonq:allTabs\">"; -    menu += "<img src=\"file:///" + loader->iconPath("tab-duplicate", KIconLoader::Desktop || KIconLoader::SizeSmall) + "\" />"; -    menu += i18n("All Tabs"); +    menu += "\"><a href=\"rekonq:closedTabs\">"; +    menu += "<img src=\"file:///" + loader->iconPath("tab-close", KIconLoader::Desktop || KIconLoader::SizeSmall) + "\" />"; +    menu += i18n("Closed Tabs");      menu += "</a></div>";      menu += "<div class=\"link"; @@ -276,29 +269,19 @@ QString HomePage::createBookItem(const KBookmark &bookmark)  } -QString HomePage::fillAllTabs() +QString HomePage::fillClosedTabs()  { -    QString tabs; +    QList<HistoryItem> links = Application::instance()->mainWindow()->mainView()->recentlyClosedTabs(); +    QString closed; -    MainView *mv = Application::instance()->mainWindow()->mainView(); -    for (int i = 0 ; i < mv->count() -1 ; i++) +    Q_FOREACH( const HistoryItem &item, links)      { -        QString urlString = mv->webView(i)->url().toEncoded(QUrl::StripTrailingSlash); -        QString title = mv->webView(i)->title(); - -        if(title.length() > 20) -        { -            title.truncate(17); -            title += "..."; -        } -        tabs += "<div class=\"thumbnail\">"; -        tabs += "<object type=\"application/image-preview\" data=\""; -        tabs += urlString + "\" width=\"200\">"; -        tabs += "<param name=\"index\" value=\"" + QString::number(i) + "\" />"; -        tabs += "</object>"; -        tabs += "<br />"; -        tabs += "<a href=\"" + urlString + "\">" + title + "</a></div>"; -    } -     -    return tabs; +        closed += "<div class=\"thumbnail\">"; +        closed += "<object type=\"application/image-preview\" data=\"" + item.url + "\" >"; +        closed += "<param name=\"title\" value=\"" + item.title + "\" />"; +        closed += "</object>"; +        closed += "</div>"; +  } + +  return closed;  } diff --git a/src/homepage.h b/src/homepage.h index 06db0822..7963119c 100644 --- a/src/homepage.h +++ b/src/homepage.h @@ -55,7 +55,7 @@ private:      QString lastVisitedSites();      QString fillHistory();      QString fillBookmarks(); -    QString fillAllTabs(); +    QString fillClosedTabs();      QString createBookItem(const KBookmark &bookmark); diff --git a/src/main.cpp b/src/main.cpp index e0e8292f..d30ae8e5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -38,7 +38,7 @@ static const char description[] =      I18N_NOOP("A lightweight Web Browser for KDE based on WebKit"); -static const char version[] = "0.2.68"; +static const char version[] = "0.2.69";  int main(int argc, char **argv) diff --git a/src/mainview.cpp b/src/mainview.cpp index 8c6ba19b..1848e682 100644 --- a/src/mainview.cpp +++ b/src/mainview.cpp @@ -181,6 +181,8 @@ void MainView::clear()      // What exactly do we need to clear here?      m_urlBar->clearHistory();      m_urlBar->clear(); + +    m_recentlyClosedTabs.clear();  } @@ -414,6 +416,16 @@ void MainView::slotCloseTab(int index)                  return;          }          hasFocus = tab->hasFocus(); + +        //store close tab except homepage +        if (!tab->url().prettyUrl().startsWith("rekonq:") && !tab->url().isEmpty()) +        { +            QString title = tab->title(); +            QString url = tab->url().prettyUrl(); +            HistoryItem item(url, QDateTime::currentDateTime(), title); +            m_recentlyClosedTabs.removeAll(item); +            m_recentlyClosedTabs.prepend(item); +        }      }      QWidget *webView = widget(index); @@ -573,6 +585,12 @@ QLabel *MainView::animatedLoading(int index, bool addMovie)  } +QList<HistoryItem> MainView::recentlyClosedTabs() +{ +    return m_recentlyClosedTabs; +} + +  void MainView::resizeEvent(QResizeEvent *event)  {      updateTabBar(); diff --git a/src/mainview.h b/src/mainview.h index 4ba65e28..c2795048 100644 --- a/src/mainview.h +++ b/src/mainview.h @@ -34,6 +34,7 @@  #include "webview.h"  #include "webpage.h"  #include "application.h" +#include "history.h"  // KDE Includes  #include <KTabWidget> @@ -89,6 +90,8 @@ public:       */      WebView *newWebView(bool focused = true, bool nearParent = false); +    QList<HistoryItem> recentlyClosedTabs(); +  signals:      // tab widget signals      void tabsChanged(); @@ -154,8 +157,10 @@ private:      TabBar *m_tabBar;      QString m_loadingGitPath; -     +      int m_currentTabIndex; + +    QList<HistoryItem> m_recentlyClosedTabs;  };  #endif // MAINVIEW_H diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 7f2bcdeb..4e9c4b26 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -147,7 +147,7 @@ MainWindow::~MainWindow()  {      Application::instance()->removeMainWindow(this);      delete m_popup; -    delete m_view; +//     delete m_view;  } @@ -207,7 +207,9 @@ void MainWindow::postLaunch()      // update toolbar actions signals      connect(m_view, SIGNAL(tabsChanged()), this, SLOT(slotUpdateActions()));      connect(m_view, SIGNAL(currentChanged(int)), this, SLOT(slotUpdateActions())); - +    // launch it manually. Just the first time... +    slotUpdateActions(); +          // Find Bar signal      connect(m_findBar, SIGNAL(searchString(const QString &)), this, SLOT(slotFind(const QString &))); @@ -1054,22 +1056,22 @@ void MainWindow::slotAboutToShowBackMenu()          return;      QWebHistory *history = currentTab()->history();      int historyCount = history->count(); +      // Limit history views in the menu to 8 -    int limit = 0; +    if(historyCount > 8) +        historyCount = 8; +     +    kDebug() << "History Count: " << historyCount;      for (int i = history->backItems(historyCount).count() - 1; i >= 0; --i)      { -        qDebug() << history->currentItemIndex();          QWebHistoryItem item = history->backItems(history->count()).at(i);          KAction *action = new KAction(this); -        action->setData(history->currentItemIndex() - (i + 1)); -        QIcon icon = Application::icon(item.url()); +        action->setData( i - history->currentItemIndex() ); +        kDebug() << "Current Item Index: " << history->currentItemIndex(); +        QIcon icon = Application::icon(item.url());           action->setIcon(icon);          action->setText(item.title());          m_historyBackMenu->addAction(action); -        ++limit; -        if (limit >= 8) { -            break; -        }      }  } @@ -1077,20 +1079,26 @@ void MainWindow::slotAboutToShowBackMenu()  void MainWindow::slotOpenActionUrl(QAction *action)  {      int offset = action->data().toInt(); +    kDebug() << "Offset: " << offset;      QWebHistory *history = currentTab()->history(); -    qDebug() << offset; -    qDebug() << history->itemAt(offset).isValid(); +     +    if(!history->itemAt(offset).isValid()) +    { +        kDebug() << "Invalid Offset!"; +        return; +    } +          if (offset < 0)      {          history->goToItem(history->itemAt(offset)); // back +        return;      } -    else +     +    if (offset > 0)      { -        if (offset > 0) -        { -            history->goToItem(history->forwardItems(history->count() - offset + 1).back()); // forward -        } +        history->goToItem(history->forwardItems(history->count() - offset).back()); // forward FIXME CRASH      } +      } diff --git a/src/previewimage.cpp b/src/previewimage.cpp index 03741770..e7f8aea5 100644 --- a/src/previewimage.cpp +++ b/src/previewimage.cpp @@ -48,17 +48,31 @@  #include <QMovie>  #include <QMouseEvent>  #include <QHBoxLayout> +#include <QVBoxLayout> -PreviewImage::PreviewImage(const QUrl &url, int index, bool isFavorite) -    : QLabel() +PreviewImage::PreviewImage(const QUrl &url, const QString &title, int index, bool isFavorite) +    : QWidget()      , ws(0) -    , m_url(0)      , loadingSnapshot(false) +    , m_url(0) +    , m_title(title)      , m_isFavorite(isFavorite)      , m_index(index)      , m_button(0) -{    +    , m_imageLabel(new QLabel) +    , m_textLabel(new QLabel) +{ +    setMinimumSize(300,200); +     +    m_imageLabel->setAlignment(Qt::AlignCenter); +    m_textLabel->setAlignment(Qt::AlignCenter); +     +    QVBoxLayout *mainLayout = new QVBoxLayout; +    mainLayout->addWidget(m_imageLabel); +    mainLayout->addWidget(m_textLabel); +    setLayout(mainLayout); +          loadUrlPreview(url);  } @@ -66,6 +80,8 @@ PreviewImage::PreviewImage(const QUrl &url, int index, bool isFavorite)  PreviewImage::~PreviewImage()  {      delete ws; +    delete m_textLabel; +    delete m_imageLabel;  } @@ -73,33 +89,36 @@ PreviewImage::~PreviewImage()  void PreviewImage::loadUrlPreview(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); +        m_imageLabel->setPixmap(m_pixmap); +        checkTitle(); +        m_textLabel->setText(m_title);      }      else      {          loadingSnapshot = true;          ws = new WebSnap( url );          connect(ws, SIGNAL(finished()), this, SLOT(snapFinished())); -         +          QString path = KStandardDirs::locate("appdata", "pics/busywidget.gif"); -         +          // load an animation waiting for site preview          QMovie *movie = new QMovie(path, QByteArray(), this);          movie->setSpeed(50); -        setMovie(movie); +        m_imageLabel->setMovie(movie);          movie->start(); +        m_textLabel->setText( i18n("Loading preview...") );      }  } @@ -107,29 +126,36 @@ void PreviewImage::loadUrlPreview(const QUrl& url)  void PreviewImage::snapFinished()  {      loadingSnapshot = false; -    QMovie *m = movie(); +    QMovie *m = m_imageLabel->movie();      delete m; -    setMovie(0); +    m_imageLabel->setMovie(0);      m_pixmap = ws->previewImage(); -    setPixmap(m_pixmap); - -    m_pixmap.save(m_savePath); +    m_imageLabel->setPixmap(m_pixmap); +    checkTitle(); +    m_textLabel->setText(m_title); +//     kDebug() << "m_pixmap: " << m_pixmap.size(); +//     kDebug() << "text label: " << m_textLabel->size(); +//     kDebug() << "image label: " << m_imageLabel->size(); +//     kDebug() << "widget: " << size(); +     +    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); -         +          ReKonfig::self()->writeConfig();      }  } @@ -140,10 +166,11 @@ void PreviewImage::showEmptyPreview()      if(!m_isFavorite)          return; -    clear(); +    m_imageLabel->clear(); +    m_textLabel->clear(); -    QHBoxLayout *layout = new QHBoxLayout(this); -    m_button = new QToolButton(this); +    QHBoxLayout *layout = new QHBoxLayout(m_imageLabel); +    m_button = new QToolButton(m_imageLabel);      m_button->setDefaultAction(historyMenu());      m_button->setPopupMode(QToolButton::InstantPopup);      m_button->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); @@ -151,6 +178,7 @@ void PreviewImage::showEmptyPreview()      m_button->setAutoRaise(true);      m_button->setIconSize(QSize(48, 48));      layout->addWidget(m_button); +    m_imageLabel->setLayout(layout);  } @@ -172,24 +200,10 @@ void PreviewImage::mousePressEvent(QMouseEvent *event)  {      if(event->button() == Qt::LeftButton)      { -        if(m_isFavorite) -        { -            Application::instance()->loadUrl(m_url); -        } -        else -        { -            MainView *mv = Application::instance()->mainWindow()->mainView(); -            int actualIndex = mv->currentIndex(); -             -            kDebug() << "Actual index: " << actualIndex; -            kDebug() << "m_index: " << m_index; - -            mv->slotCloseTab(actualIndex); -            mv->setCurrentIndex(m_index); -        } +        Application::instance()->loadUrl(m_url);          return;      }; -    QLabel::mousePressEvent(event); +    QWidget::mousePressEvent(event);  } @@ -198,31 +212,31 @@ void PreviewImage::mouseReleaseEvent(QMouseEvent *event)      kDebug() << "NO000... don't leave your finger from the button!!";      Q_UNUSED(event)  } -     +  void PreviewImage::contextMenuEvent(QContextMenuEvent* event)  {      if(!m_isFavorite)          return; -     +      if(loadingSnapshot)         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); -         +          a = new KAction(KIcon("view-refresh"), i18n("Refresh Thumbnail"), &menu);          connect(a, SIGNAL(triggered(bool)), this, SLOT(refreshPreview()));          menu.addAction(a);      }      menu.addAction(historyMenu()); -     +      menu.exec(mapToGlobal(event->pos()));  } @@ -231,7 +245,7 @@ KActionMenu* PreviewImage::historyMenu()  {      KActionMenu *histMenu = new KActionMenu(KIcon("insert-image"), i18n("Set page to preview"), this);      QList<HistoryItem> history =  Application::historyManager()->history(); -     +      if(history.isEmpty())      {          KAction *a = new KAction(i18n("History is empty"), this); @@ -239,17 +253,19 @@ KActionMenu* PreviewImage::historyMenu()          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); -        a->setData(it.url); +        QStringList urlData; +        urlData << it.url << it.title; +        a->setData(urlData);          connect(a, SIGNAL(triggered(bool)), this, SLOT(setUrlFromAction()));          histMenu->addAction(a);      } -     +      return histMenu;  } @@ -258,20 +274,20 @@ 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); -     +      // sync file data      ReKonfig::self()->writeConfig();      showEmptyPreview(); -     +      m_url = "";  } @@ -279,15 +295,33 @@ void PreviewImage::removeMe()  void PreviewImage::setUrlFromAction()  {      KAction *a = qobject_cast<KAction*>(sender()); -    KUrl url = KUrl(a->data().toString()); -         +    QStringList urlData = a->data().toStringList(); + +    m_url = KUrl(urlData.at(0)); +    m_title = urlData.at(1); +    checkTitle(); +          if(m_button)      { -        layout()->deleteLater(); +        m_imageLabel->layout()->deleteLater();          m_button->menu()->deleteLater();          m_button->deleteLater(); -    }     -    loadUrlPreview(url); +    } +    loadUrlPreview(m_url); + +    // 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, m_url.toString(QUrl::StripTrailingSlash)); +    names.replace(m_index, m_title); + +    ReKonfig::setPreviewNames(names); +    ReKonfig::setPreviewUrls(urls); + +    ReKonfig::self()->writeConfig();  } @@ -313,6 +347,16 @@ QString PreviewImage::guessNameFromUrl(QUrl url)      name.remove('?');      name.remove('=');      name.remove('+'); -     +      return name;  } + + +void PreviewImage::checkTitle() +{ +    if(m_title.length() > 23) +    { +        m_title.truncate(20); +        m_title += "..."; +    } +} diff --git a/src/previewimage.h b/src/previewimage.h index 5568dd29..d7f4d2aa 100644 --- a/src/previewimage.h +++ b/src/previewimage.h @@ -35,16 +35,19 @@  // Qt Includes  #include <QLabel> +#include <QFrame>  #include <QImage>  #include <QUrl>  #include <QToolButton> +#include <QSize> -class PreviewImage : public QLabel + +class PreviewImage : public QWidget  {      Q_OBJECT  public: -    PreviewImage(const QUrl &url, int index, bool isFavorite); +    PreviewImage(const QUrl &url, const QString &title, int index, bool isFavorite);      ~PreviewImage();      QString guessNameFromUrl(QUrl url); @@ -54,7 +57,7 @@ public slots:      void removeMe();      void setUrlFromAction();      void refreshPreview(); - +      protected:      void contextMenuEvent(QContextMenuEvent *event);      void mouseDoubleClickEvent(QMouseEvent *event); @@ -67,17 +70,23 @@ protected:      void showEmptyPreview();  private: +    void checkTitle(); +          QPixmap m_pixmap;      WebSnap *ws; -    QUrl m_url; -    QString m_savePath; -     +    QString m_savePath;          bool loadingSnapshot; +     +    QUrl m_url;     +    QString m_title;      bool m_isFavorite;      int m_index;      QToolButton *m_button; +     +    QLabel *m_imageLabel; +    QLabel *m_textLabel;  };  #endif // PREVIEW_IMAGE_H diff --git a/src/webpluginfactory.cpp b/src/webpluginfactory.cpp index b9d50697..3daffbb6 100644 --- a/src/webpluginfactory.cpp +++ b/src/webpluginfactory.cpp @@ -57,10 +57,14 @@ QObject *WebPluginFactory::create(const QString &mimeType,      if(mimeType == QString("application/image-preview") )      { +        QString title;          int number = -1;          bool isFavorite = false;          int i; +        i = argumentNames.indexOf( QString("title") ); +        if(i > -1) +            title = argumentValues.at(i);          i = argumentNames.indexOf( QString("isFavorite") );          if(i > -1)              isFavorite = true; @@ -68,7 +72,7 @@ QObject *WebPluginFactory::create(const QString &mimeType,          if(i > -1)              number = argumentValues.at(i).toInt(); -        return new PreviewImage(url, number, isFavorite); +        return new PreviewImage(url, title, number, isFavorite);      }      // this let QtWebKit using builtin plugins  diff --git a/src/websnap.cpp b/src/websnap.cpp index 577370ba..bb2baf49 100644 --- a/src/websnap.cpp +++ b/src/websnap.cpp @@ -74,7 +74,7 @@ void WebSnap::load()  } -QPixmap WebSnap::renderPreview(const QWebPage &page,int w, int h) +QPixmap WebSnap::renderPreview(const QWebPage &page,int w, int h, bool border)  {      // prepare page      page.mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff); // Why it doesn't work with one setScrollBarPolicy? @@ -95,16 +95,15 @@ QPixmap WebSnap::renderPreview(const QWebPage &page,int w, int h)          size = QSize(width,width*((0.0+h)/w));          page.setViewportSize(size);      } - -    // create the target surface -    QPixmap image = QPixmap(size); -    image.fill(Qt::transparent); -  -    // render -    QPainter p(&image); +     +    // create the page image +    QImage pageImage = QImage(size, QImage::Format_ARGB32_Premultiplied); +    pageImage.fill(Qt::transparent);  +    // render it +    QPainter p(&pageImage);      page.mainFrame()->render(&p);      p.end(); -    image = image.scaled(w, h, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation); +    pageImage = pageImage.scaled(w, h, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);      // restore page settings      page.mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAsNeeded); @@ -112,7 +111,31 @@ QPixmap WebSnap::renderPreview(const QWebPage &page,int w, int h)      page.mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAsNeeded);      page.mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAsNeeded); -    return image; +    if(!border) +        return QPixmap::fromImage(pageImage); +     +    // background image +    QSize fixedSize(w + 30, h + 26); +    QImage backImage = QImage(fixedSize, QImage::Format_ARGB32_Premultiplied); +    QString backImagePath = KStandardDirs::locate("appdata", "pics/bg.png"); +    backImage.load( backImagePath ); +     +    // create target +    QImage resultImage = QImage(fixedSize, QImage::Format_ARGB32_Premultiplied); +    resultImage.fill(Qt::transparent);  + +    QPainter pt(&resultImage); +    pt.setCompositionMode(QPainter::CompositionMode_Source); +    pt.fillRect(resultImage.rect(), Qt::transparent); +    pt.setCompositionMode(QPainter::CompositionMode_SourceOver); +    pt.drawImage(0, 0, backImage); +    pt.setCompositionMode(QPainter::CompositionMode_SourceOver); +    pt.drawImage(15, 13, pageImage); +    pt.setCompositionMode(QPainter::CompositionMode_DestinationOver); +    pt.fillRect(resultImage.rect(), Qt::transparent); +    pt.end(); +     +    return QPixmap::fromImage(resultImage);  } @@ -125,7 +148,7 @@ void WebSnap::saveResult(bool ok)          return;      } -    m_image = renderPreview(m_page, WIDTH, HEIGHT); +    m_image = renderPreview(m_page, WIDTH, HEIGHT, true);      emit finished();  } diff --git a/src/websnap.h b/src/websnap.h index 53686677..026c236c 100644 --- a/src/websnap.h +++ b/src/websnap.h @@ -34,6 +34,7 @@  // Qt Includes  #include <QtCore/QObject>  #include <QPixmap> +#include <QImage>  #include <QWebPage> @@ -51,7 +52,7 @@ public:      ~WebSnap();      QPixmap previewImage(); -    static QPixmap renderPreview(const QWebPage &page, int w, int h); +    static QPixmap renderPreview(const QWebPage &page, int w, int h, bool border = false);      QString snapTitle();      QUrl snapUrl(); diff --git a/src/webview.cpp b/src/webview.cpp index 9e06c9da..2fe3775b 100644 --- a/src/webview.cpp +++ b/src/webview.cpp @@ -52,18 +52,27 @@  #include <QtGui/QClipboard>  #include <QtGui/QKeyEvent>  #include <QtGui/QAction> +#include <QtCore/QTimer>  WebView::WebView(QWidget* parent)          : QWebView(parent)          , m_page(new WebPage(this))          , m_progress(0) +        , m_scrollTimer(new QTimer(this)) +        , m_scrollDirection(WebView::NoScroll) +        , m_scrollSpeedVertical(0) +        , m_scrollSpeedHorizontal(0) +  {      setPage(m_page);      connect(page(), SIGNAL(statusBarMessage(const QString&)), this, SLOT(setStatusBarText(const QString&)));      connect(this, SIGNAL(loadProgress(int)), this, SLOT(slotUpdateProgress(int)));      connect(this, SIGNAL(loadFinished(bool)), this, SLOT(slotLoadFinished(bool))); + +    connect(m_scrollTimer, SIGNAL(timeout()), this, SLOT(scrollFrameChanged())); +    m_scrollTimer->setInterval(50);  } @@ -106,6 +115,7 @@ void WebView::setStatusBarText(const QString &string)      m_statusBarText = string;   } +  void WebView::contextMenuEvent(QContextMenuEvent *event)  {      QWebHitTestResult result = page()->mainFrame()->hitTestContent(event->pos()); @@ -135,6 +145,8 @@ void WebView::contextMenuEvent(QContextMenuEvent *event)          a = pageAction(QWebPage::CopyLinkToClipboard);          a->setIcon(KIcon("edit-copy"));          menu.addAction(a); +         +        menu.addSeparator();      }      // is content editable && selected? Add CUT @@ -153,6 +165,10 @@ void WebView::contextMenuEvent(QContextMenuEvent *event)          a = pageAction(QWebPage::Copy);          a->setIcon(KIcon("edit-copy"));          a->setShortcut(KStandardShortcut::copy().primary()); +        if(!result.isContentEditable()) // "Cut" "Copy Text" "Paste" is ugly. Don't add "text" with cut/paste +            a->setText(i18n("Copy Text")); +        else +            a->setText(i18n("Copy"));          menu.addAction(a);      } @@ -168,7 +184,7 @@ void WebView::contextMenuEvent(QContextMenuEvent *event)      // is content selected? Add SEARCH actions      if(result.isContentSelected())      { -        KActionMenu *searchMenu = new KActionMenu(i18n("Search with"), this); +        KActionMenu *searchMenu = new KActionMenu(KIcon("edit-find"), i18n("Search with"), this);          KConfig config("kuriikwsfilterrc"); //Share with konqueror          KConfigGroup cg = config.group("General"); @@ -196,12 +212,12 @@ void WebView::contextMenuEvent(QContextMenuEvent *event)                  }              }          } -         +          if (!searchMenu->menu()->isEmpty())          {              menu.addAction(searchMenu);          } -         +          menu.addSeparator();          // TODO Add translate, show translation         } @@ -233,7 +249,10 @@ void WebView::contextMenuEvent(QContextMenuEvent *event)      {          // page action          QString text = selectedText();  -        if (text.startsWith( QLatin1String("http://") ) || text.startsWith( QLatin1String("https://") ) || text.startsWith( QLatin1String("www.") ) ) +        if (text.startsWith( QLatin1String("http://") )  +            || text.startsWith( QLatin1String("https://") )  +            || text.startsWith( QLatin1String("www.") )  +           )          {              QString truncatedURL = text;              if (text.length() > 18) @@ -322,8 +341,82 @@ void WebView::contextMenuEvent(QContextMenuEvent *event)  } +void WebView::stopScrollAnimation() +{ +    m_scrollTimer->stop(); +    m_scrollSpeedVertical = 0; +    m_scrollSpeedHorizontal = 0; +    m_scrollDirection = WebView::NoScroll; +} + + +void WebView::startScrollAnimation(ScrollDirection direction) +{ +    // if no scrollspeed, set the requested direction, otherwise it's just a slowdown or speedup +    if (m_scrollSpeedVertical == 0 && (direction == WebView::Up || direction == WebView::Down)) +        m_scrollDirection |= direction; +    if (m_scrollSpeedHorizontal == 0 && (direction == WebView::Left || direction == WebView::Right)) +        m_scrollDirection |= direction; + +    // update scrollspeed +    switch (direction) +    { +        case WebView::Up: +            --m_scrollSpeedVertical; +            break; +        case WebView::Down: +            ++m_scrollSpeedVertical; +            break; +        case WebView::Left: +            --m_scrollSpeedHorizontal; +            break; +        case WebView::Right: +            ++m_scrollSpeedHorizontal; +            break; +        default: +            break; +    } + +    if (!m_scrollTimer->isActive()) +        m_scrollTimer->start(); + +    return; +} + + +void WebView::scrollFrameChanged() +{ +    // clear finished scrolling +    if (m_scrollSpeedVertical == 0) +        m_scrollDirection &= ~WebView::Up | ~WebView::Down; +    if (m_scrollSpeedHorizontal == 0) +        m_scrollDirection &= ~WebView::Left | ~WebView::Right; + +    // all scrolling finished +    if (m_scrollDirection == WebView::NoScroll) +    { +        m_scrollTimer->stop(); +        return; +    } + +    // do the scrolling +    page()->currentFrame()->scroll(m_scrollSpeedHorizontal, m_scrollSpeedVertical); + +    // check if we reached the end +    int y = page()->currentFrame()->scrollPosition().y(); +    int x = page()->currentFrame()->scrollPosition().x(); + +    if (y == 0 || y == page()->currentFrame()->scrollBarMaximum(Qt::Vertical)) +        m_scrollSpeedVertical = 0; +    if (x == 0 || x == page()->currentFrame()->scrollBarMaximum(Qt::Horizontal)) +        m_scrollSpeedHorizontal = 0; +} + +  void WebView::mousePressEvent(QMouseEvent *event)  { +    stopScrollAnimation(); +      m_page->m_pressedButtons = event->buttons();      m_page->m_keyboardModifiers = event->modifiers(); @@ -352,6 +445,8 @@ void WebView::mouseMoveEvent(QMouseEvent *event)  void WebView::wheelEvent(QWheelEvent *event)  { +    stopScrollAnimation(); +      if (QApplication::keyboardModifiers() & Qt::ControlModifier)      {          int numDegrees = event->delta() / 8; @@ -395,7 +490,7 @@ void WebView::viewImage(Qt::MouseButtons buttons, Qt::KeyboardModifiers modifier  {      KAction *a = qobject_cast<KAction*>(sender());      KUrl url(a->data().toUrl()); -     +      if (modifiers & Qt::ControlModifier || buttons == Qt::MidButton)      {          Application::instance()->loadUrl(url, Rekonq::SettingOpenTab); @@ -423,7 +518,6 @@ void WebView::openLinkInNewTab()  } -// HACK short term hack: remove this function, unuseful in kdewebkit porting  void WebView::keyPressEvent(QKeyEvent *event)  {      if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_C)) @@ -431,5 +525,27 @@ void WebView::keyPressEvent(QKeyEvent *event)          triggerPageAction(QWebPage::Copy);          return;      } + +    if (event->modifiers() == Qt::ShiftModifier) +    { +        switch (event->key()) +        { +        case Qt::Key_Down: +            startScrollAnimation(WebView::Down); +            return; +        case Qt::Key_Up: +            startScrollAnimation(WebView::Up); +            return; +        case Qt::Key_Left: +            startScrollAnimation(WebView::Left); +            return; +        case Qt::Key_Right: +            startScrollAnimation(WebView::Right); +            return; +        default: +            break; +        } +    } +      QWebView::keyPressEvent(event);  } diff --git a/src/webview.h b/src/webview.h index 3388348d..d3f58f2e 100644 --- a/src/webview.h +++ b/src/webview.h @@ -37,13 +37,24 @@  // Forward Declarations  class WebPage; +class QTimer;  class WebView : public QWebView  {      Q_OBJECT +    Q_ENUMS(ScrollDirection)  public: +    enum ScrollDirection +    { +        NoScroll = 0, +        Up = 2, +        Down = 4, +        Left = 6, +        Right = 16 +    }; +          explicit WebView(QWidget *parent = 0);      ~WebView(); @@ -71,10 +82,18 @@ private slots:      void openLinkInNewWindow();      void openLinkInNewTab(); +    void startScrollAnimation(ScrollDirection direction); +    void stopScrollAnimation(); +    void scrollFrameChanged(); +  private:      WebPage *m_page;      int m_progress;      QString m_statusBarText; +    QTimer *m_scrollTimer; +    int m_scrollDirection; +    int m_scrollSpeedVertical; +    int m_scrollSpeedHorizontal;  };  #endif | 
