From 3f18990c5ed8bb30b762b5520062dbda8f700c22 Mon Sep 17 00:00:00 2001
From: Andrea Diamantini <adjam7@gmail.com>
Date: Thu, 3 Sep 2009 02:21:50 +0200
Subject: Improved contextual menu following my ideas and Henry de Valence
 suggestions.

---
 src/mainwindow.cpp |  13 ----
 src/mainwindow.h   |   1 -
 src/webview.cpp    | 177 +++++++++++++++++++++++++----------------------------
 3 files changed, 82 insertions(+), 109 deletions(-)

(limited to 'src')

diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 40ecfb81..31a47033 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -561,19 +561,6 @@ void MainWindow::slotFileOpen()
 }
 
 
-// void MainWindow::slotFilePrintPreview()
-// {
-//     if (!currentTab())
-//         return;
-// 
-//     QPrinter printer;
-//     QPrintPreviewDialog previewdlg(&printer, this);
-//     connect(&previewdlg, SIGNAL(paintRequested(QPrinter *)),
-//             currentTab(), SLOT(print(QPrinter *)));
-//     previewdlg.exec();
-// }
-
-
 void MainWindow::printRequested(QWebFrame *frame)
 {
     if (!currentTab())
diff --git a/src/mainwindow.h b/src/mainwindow.h
index d248b067..fe4d3089 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -125,7 +125,6 @@ private slots:
     
     // File Menu slots
     void slotFileOpen();
-//     void slotFilePrintPreview();
     void slotFileSaveAs();
 
     void slotViewPageSource();
diff --git a/src/webview.cpp b/src/webview.cpp
index 6cf6afbf..85e0e996 100644
--- a/src/webview.cpp
+++ b/src/webview.cpp
@@ -110,6 +110,7 @@ void WebView::contextMenuEvent(QContextMenuEvent *event)
     KMenu menu(this);
     QAction *a;
 
+    // is a link?
     if (!result.linkUrl().isEmpty())
     {
         // link actions
@@ -125,84 +126,40 @@ void WebView::contextMenuEvent(QContextMenuEvent *event)
         a = pageAction(QWebPage::CopyLinkToClipboard);
         a->setIcon(KIcon("edit-copy"));
         menu.addAction(a);
-
-        if (!result.pixmap().isNull())
-        {
-            menu.addSeparator();
-
-            // TODO Add "View Image" && remove copy_this_image action
-            a = pageAction(QWebPage::DownloadImageToDisk);
-            a->setIcon(KIcon("document-save"));
-            menu.addAction(a);
-
-            a = pageAction(QWebPage::CopyImageToClipboard);
-            a->setIcon(KIcon("edit-copy"));
-            menu.addAction(a);
-        }
     }
-    else if (result.isContentEditable() && result.isContentSelected())
+    
+    // is content editable && selected? Add CUT
+    if (result.isContentEditable() && result.isContentSelected())
     {
         // actions for text selected in field
         a = pageAction(QWebPage::Cut);
         a->setIcon(KIcon("edit-cut"));
         a->setShortcut(KStandardShortcut::cut().primary());
         menu.addAction(a);
-
+    }
+    
+    // is content selected) Add COPY
+    if(result.isContentSelected())
+    {
         a = pageAction(QWebPage::Copy);
         a->setIcon(KIcon("edit-copy"));
         a->setShortcut(KStandardShortcut::copy().primary());
         menu.addAction(a);
-
-        a = pageAction(QWebPage::Paste);
-        a->setIcon(KIcon("edit-paste"));
-        a->setShortcut(KStandardShortcut::paste().primary());
-        menu.addAction(a);
-
-        menu.addSeparator();
-
-        KConfig config("kuriikwsfilterrc"); //Share with konqueror
-        KConfigGroup cg = config.group("General");
-        QStringList favoriteEngines;
-        favoriteEngines << "wikipedia" << "google"; //defaults
-        favoriteEngines = cg.readEntry("FavoriteSearchEngines", favoriteEngines);
-        QString keywordDelimiter = cg.readEntry("KeywordDelimiter", ":");
-        KService::Ptr service;
-        KUriFilterData data;
-        foreach (const QString &engine, favoriteEngines)
-        {
-            service = KService::serviceByDesktopPath(QString("searchproviders/%1.desktop").arg(engine));
-            const QString searchProviderPrefix = *(service->property("Keys").toStringList().begin()) + keywordDelimiter;
-            data.setData(searchProviderPrefix + "some keyword");
-            a = new KAction(i18n("Search with ")+service->name(), this);
-            a->setIcon(Application::icon(KUrl(data.uri())));
-            a->setData(searchProviderPrefix);
-            connect(a, SIGNAL(triggered(bool)), this, SLOT(slotSearch()));
-            menu.addAction(a);
-        }
-
-
-        // TODO Add translate, show translation
     }
-    else if (result.isContentEditable())
+    
+    // is content editable? Add PASTE
+    if(result.isContentEditable())
     {
-        // actions for a not selected field or a void field
-        // WARNING: why it doesn't automatically select a field?
-        // Why the paste action is disabled?
-
         a = pageAction(QWebPage::Paste);
         a->setIcon(KIcon("edit-paste"));
         a->setShortcut(KStandardShortcut::paste().primary());
         menu.addAction(a);
     }
-    else if (result.isContentSelected())
-    {
-        // actions for text selected in page
-        a = pageAction(QWebPage::Copy);
-        a->setIcon(KIcon("edit-copy"));
-        a->setShortcut(KStandardShortcut::copy().primary());
-        menu.addAction(a);
-
-        menu.addSeparator();
+    
+    // is content selected? Add SEARCH actions
+    if(result.isContentSelected())
+    {        
+        KActionMenu *searchMenu = new KActionMenu(i18n("Search with..."), this);
 
         KConfig config("kuriikwsfilterrc"); //Share with konqueror
         KConfigGroup cg = config.group("General");
@@ -212,21 +169,28 @@ void WebView::contextMenuEvent(QContextMenuEvent *event)
         QString keywordDelimiter = cg.readEntry("KeywordDelimiter", ":");
         KService::Ptr service;
         KUriFilterData data;
+        
         foreach (const QString &engine, favoriteEngines)
         {
-            service = KService::serviceByDesktopPath(QString("searchproviders/%1.desktop").arg(engine));
-            const QString searchProviderPrefix = *(service->property("Keys").toStringList().begin()) + keywordDelimiter;
-            data.setData(searchProviderPrefix + "some keyword");
-            a = new KAction(i18n("Search with %1", service->name()), this);
-            a->setIcon(Application::icon(KUrl(data.uri())));
-            a->setData(searchProviderPrefix);
-            connect(a, SIGNAL(triggered(bool)), this, SLOT(slotSearch()));
-            menu.addAction(a);
+            if(!engine.isNull())
+            {
+                service = KService::serviceByDesktopPath(QString("searchproviders/%1.desktop").arg(engine));
+                const QString searchProviderPrefix = *(service->property("Keys").toStringList().begin()) + keywordDelimiter;
+                data.setData(searchProviderPrefix + "some keyword");
+                a = new KAction(service->name(), this);
+                a->setIcon(Application::icon(KUrl(data.uri())));
+                a->setData(searchProviderPrefix);
+                connect(a, SIGNAL(triggered(bool)), this, SLOT(slotSearch()));
+                searchMenu->addAction(a);
+            }
         }
-
-        // TODO Add translate, show translation
+        menu.addAction(searchMenu);
+        menu.addSeparator();
+        // TODO Add translate, show translation   
     }
-    else if (!result.pixmap().isNull())
+    
+    // is an image?
+    if (!result.pixmap().isNull())
     {
         menu.addSeparator();
 
@@ -238,37 +202,54 @@ void WebView::contextMenuEvent(QContextMenuEvent *event)
         a = pageAction(QWebPage::CopyImageToClipboard);
         a->setIcon(KIcon("edit-copy"));
         menu.addAction(a);
+
+        menu.addSeparator();
     }
-    else
-    {
-        //page actions
-        menu.addAction(mainwindow->actionByName("new_tab"));
-        
-        if(mainwindow->isFullScreen())
-        {
-            menu.addAction(mainwindow->actionByName("fullscreen"));
-        }
 
+    // last (but not less) actions..
+    if(result.linkUrl().isEmpty())
+    {
+        // page action
+        menu.addAction(mainwindow->actionByName("new_tab"));    
         menu.addSeparator();
+    }
+    
+    QWebHistory *history = page()->history();
+    if(history->canGoBack())
+    {
+        a = pageAction(QWebPage::Back);
+        a->setIcon(KIcon("go-previous"));
+        menu.addAction(a);
+    }
+    
+    if(history->canGoForward())
+    {
+        a = pageAction(QWebPage::Forward);
+        a->setIcon(KIcon("go-next"));
+        menu.addAction(a);
+    }
 
-        menu.addAction(mainwindow->actionByName("history_back"));
-        menu.addAction(mainwindow->actionByName("history_forward"));
-        menu.addAction(mainwindow->actionByName("view_redisplay"));
-        
-        KActionMenu *frameMenu = new KActionMenu(i18n("Frame"), this);
+    menu.addAction(mainwindow->actionByName("view_redisplay"));
+    
+    KActionMenu *frameMenu = new KActionMenu(i18n("Current Frame"), this);
 
-        a = pageAction(QWebPage::OpenFrameInNewWindow);
-        a->setText(i18n("Open in new tab"));
-        a->setIcon(KIcon("view-right-new"));
-        frameMenu->addAction(a);
-        
-        a = new KAction( KIcon("document-print-frame"), i18n("Print frame"), this);
-        connect(a, SIGNAL(triggered()), this, SLOT(printFrame()));
-        frameMenu->addAction(a);
-        menu.addAction(frameMenu);
-        
+    a = pageAction(QWebPage::OpenFrameInNewWindow);
+    a->setText(i18n("Open in new tab"));
+    a->setIcon(KIcon("view-right-new"));
+    frameMenu->addAction(a);
+    
+    a = new KAction( KIcon("document-print-frame"), i18n("Print frame"), this);
+    connect(a, SIGNAL(triggered()), this, SLOT(printFrame()));
+    frameMenu->addAction(a);
+    menu.addAction(frameMenu);
+
+    // empty space actions
+    if(result.linkUrl().isEmpty())
+    {
         menu.addSeparator();
 
+        menu.addAction(mainwindow->actionByName(KStandardAction::name(KStandardAction::SaveAs)));
+
         menu.addAction(mainwindow->actionByName("page_source"));
         QAction *addBookmarkAction = Application::bookmarkProvider()->actionByName("rekonq_add_bookmark");
         menu.addAction(addBookmarkAction);
@@ -282,6 +263,12 @@ void WebView::contextMenuEvent(QContextMenuEvent *event)
         }
     }
 
+    if(mainwindow->isFullScreen())
+    {
+        menu.addSeparator();
+        menu.addAction(mainwindow->actionByName("fullscreen"));
+    }
+
     menu.exec(mapToGlobal(event->pos()));
 }
 
-- 
cgit v1.2.1