From b12c324f8775fed32c447459896c50a088172b66 Mon Sep 17 00:00:00 2001 From: nowrep Date: Fri, 8 Mar 2013 21:01:55 +0100 Subject: [PATCH] [SuperMenu] Improved menu in button used instead of menubar. The menu is now displayed inside window, even when window is not in fullscreen. It now also contains the most important actions in addition to copy of top level menus. --- CHANGELOG | 1 + bin/themes/linux/main.css | 15 ++++++--- src/lib/app/qupzilla.cpp | 43 ++++++++++++++++++------ src/lib/lib.pro | 4 ++- src/lib/navigation/navigationbar.cpp | 6 ++++ src/lib/navigation/navigationbar.h | 3 +- src/lib/tools/actioncopy.cpp | 49 ++++++++++++++++++++++++++++ src/lib/tools/actioncopy.h | 42 ++++++++++++++++++++++++ src/lib/tools/toolbutton.cpp | 37 +++++++++++++++++++-- src/lib/tools/toolbutton.h | 8 ++++- src/lib/tools/treewidget.cpp | 4 +-- 11 files changed, 190 insertions(+), 22 deletions(-) create mode 100644 src/lib/tools/actioncopy.cpp create mode 100644 src/lib/tools/actioncopy.h diff --git a/CHANGELOG b/CHANGELOG index 3e0b5a16d..d46856bba 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,6 +7,7 @@ Version 1.4.0 * added support for saving passwords of multiple users per site * added support for showing tabs on top * added bash autocompletion file + * added more actions to super menu, also show menu inside window * possibility to select text on page with Shift+Arrow keys * asking user whether to allow site to use notifications/geolocation * option to set JavaScript privacy permissions diff --git a/bin/themes/linux/main.css b/bin/themes/linux/main.css index e0a7c046c..d0c009df3 100644 --- a/bin/themes/linux/main.css +++ b/bin/themes/linux/main.css @@ -27,7 +27,7 @@ #navigation-button-back::menu-indicator { - background: url(images/transp.png); + image: none; } #navigation-button-next @@ -39,7 +39,7 @@ #navigation-button-next::menu-indicator { - background: url(images/transp.png); + image: none; } #navigation-button-stop @@ -77,6 +77,11 @@ qproperty-iconSize: 24px 24px; } +#navigation-button-supermenu::menu-indicator +{ + image: none; +} + /*TabWidget*/ #tabbar::tab { @@ -103,7 +108,7 @@ #tabwidget-button-opentabs::menu-indicator { - background: url(images/transp.png); + image: none; } /*IconProvider*/ @@ -182,7 +187,7 @@ IconProvider #bookmarksbar QToolButton::menu-indicator { - background: url(images/transp.png); + image: none; } /*SideBar*/ @@ -219,7 +224,7 @@ IconProvider #websearchbar-searchprovider-comobobox::menu-indicator { - background: url(images/transp.png); + image: none; } /*SourceViewer*/ diff --git a/src/lib/app/qupzilla.cpp b/src/lib/app/qupzilla.cpp index 826dd2721..e1ec9ee25 100644 --- a/src/lib/app/qupzilla.cpp +++ b/src/lib/app/qupzilla.cpp @@ -57,6 +57,7 @@ #include "webinspectordockwidget.h" #include "bookmarksimportdialog.h" #include "qztools.h" +#include "actioncopy.h" #include "reloadstopbutton.h" #include "enhancedmenu.h" #include "navigationcontainer.h" @@ -341,7 +342,7 @@ void QupZilla::setupMenu() #endif // Standard actions - needed on Mac to be placed correctly in "application" menu - m_actionAbout = new QAction(QIcon(":/icons/qupzilla.png"), tr("&About QupZilla"), 0); + m_actionAbout = new QAction(QIcon::fromTheme("help-about"), tr("&About QupZilla"), 0); m_actionAbout->setMenuRole(QAction::AboutRole); connect(m_actionAbout, SIGNAL(triggered()), MENU_RECEIVER, SLOT(aboutQupZilla())); @@ -366,8 +367,8 @@ void QupZilla::setupMenu() * File Menu * *************/ m_menuFile = new QMenu(tr("&File")); - m_menuFile->addAction(QIcon::fromTheme("window-new"), tr("&New Window"), MENU_RECEIVER, SLOT(newWindow()))->setShortcut(QKeySequence("Ctrl+N")); m_menuFile->addAction(QIcon(":/icons/menu/new-tab.png"), tr("New Tab"), MENU_RECEIVER, SLOT(addTab()))->setShortcut(QKeySequence("Ctrl+T")); + m_menuFile->addAction(QIcon::fromTheme("window-new"), tr("&New Window"), MENU_RECEIVER, SLOT(newWindow()))->setShortcut(QKeySequence("Ctrl+N")); m_menuFile->addAction(QIcon::fromTheme("document-open-remote"), tr("Open Location"), MENU_RECEIVER, SLOT(openLocation()))->setShortcut(QKeySequence("Ctrl+L")); m_menuFile->addAction(QIcon::fromTheme("document-open"), tr("Open &File"), MENU_RECEIVER, SLOT(openFile()))->setShortcut(QKeySequence("Ctrl+O")); m_menuFile->addAction(tr("Close Tab"), MENU_RECEIVER, SLOT(closeTab()))->setShortcut(QKeySequence("Ctrl+W")); @@ -564,7 +565,7 @@ void QupZilla::setupMenu() m_menuHelp->addAction(m_actionAbout); m_menuHelp->addSeparator(); #endif - QAction* infoAction = new QAction(tr("Information about application"), m_menuHelp); + QAction* infoAction = new QAction(QIcon::fromTheme("help-contents"), tr("Information about application"), m_menuHelp); infoAction->setData(QUrl("qupzilla:about")); infoAction->setShortcut(QKeySequence(QKeySequence::HelpContents)); connect(infoAction, SIGNAL(triggered()), MENU_RECEIVER, SLOT(loadActionUrlInNewTab())); @@ -589,13 +590,35 @@ void QupZilla::setupMenu() setupOtherActions(); #ifndef Q_OS_MAC - m_superMenu->addMenu(m_menuFile); - m_superMenu->addMenu(m_menuEdit); + m_superMenu->addAction(new ActionCopy(m_menuFile->actions().at(0), this)); + m_superMenu->addAction(new ActionCopy(m_menuFile->actions().at(1), this)); + m_superMenu->addAction(new ActionCopy(m_menuFile->actions().at(3), this)); + + m_superMenu->addSeparator(); + m_superMenu->addAction(new ActionCopy(m_menuFile->actions().at(7), this)); + m_superMenu->addAction(new ActionCopy(m_menuFile->actions().at(10), this)); + + m_superMenu->addSeparator(); + m_superMenu->addAction(new ActionCopy(m_menuEdit->actions().at(7), this)); + m_superMenu->addAction(new ActionCopy(m_menuEdit->actions().at(8), this)); + + m_superMenu->addSeparator(); + m_superMenu->addAction(new ActionCopy(m_actionPreferences, this)); + + m_superMenu->addSeparator(); m_superMenu->addMenu(m_menuView); m_superMenu->addMenu(m_menuHistory); m_superMenu->addMenu(m_menuBookmarks); m_superMenu->addMenu(m_menuTools); - m_superMenu->addMenu(m_menuHelp); + + m_superMenu->addSeparator(); + m_superMenu->addAction(new ActionCopy(m_actionAbout, this)); + m_superMenu->addAction(new ActionCopy(m_menuHelp->actions().at(3), this)); + m_superMenu->addAction(new ActionCopy(m_menuHelp->actions().at(4), this)); + m_superMenu->addAction(new ActionCopy(m_menuHelp->actions().at(5), this)); + + m_superMenu->addSeparator(); + m_superMenu->addAction(new ActionCopy(m_actionQuit, this)); #endif } @@ -726,7 +749,7 @@ void QupZilla::loadSettings() menuBar()->setVisible(showMenuBar); #ifndef Q_OS_MAC - m_navigationBar->buttonSuperMenu()->setVisible(!showMenuBar); + m_navigationBar->setSuperMenuVisible(!showMenuBar); #endif m_navigationBar->buttonReloadStop()->setVisible(showReloadButton); m_navigationBar->buttonHome()->setVisible(showHomeButton); @@ -1535,7 +1558,7 @@ void QupZilla::showMenubar() } menuBar()->setVisible(!menuBar()->isVisible()); - m_navigationBar->buttonSuperMenu()->setVisible(!menuBar()->isVisible()); + m_navigationBar->setSuperMenuVisible(!menuBar()->isVisible()); Settings settings; settings.setValue("Browser-View-Settings/showMenubar", menuBar()->isVisible()); @@ -1766,7 +1789,7 @@ bool QupZilla::event(QEvent* event) m_navigationContainer->hide(); m_tabWidget->getTabBar()->hide(); #ifndef Q_OS_MAC - m_navigationBar->buttonSuperMenu()->hide(); + m_navigationBar->setSuperMenuVisible(false); #endif m_hideNavigationTimer->stop(); m_actionShowFullScreen->setChecked(true); @@ -1789,7 +1812,7 @@ bool QupZilla::event(QEvent* event) m_tabWidget->showTabBar(); m_tabWidget->getTabBar()->updateVisibilityWithFullscreen(true); #ifndef Q_OS_MAC - m_navigationBar->buttonSuperMenu()->setVisible(!m_menuBarVisible); + m_navigationBar->setSuperMenuVisible(!m_menuBarVisible); #endif m_hideNavigationTimer->stop(); m_actionShowFullScreen->setChecked(false); diff --git a/src/lib/lib.pro b/src/lib/lib.pro index 31de45ad1..8e6911466 100644 --- a/src/lib/lib.pro +++ b/src/lib/lib.pro @@ -212,6 +212,7 @@ SOURCES += \ navigation/navigationcontainer.cpp \ tools/horizontallistwidget.cpp \ tools/mactoolbutton.cpp \ + tools/actioncopy.cpp HEADERS += \ webview/tabpreview.h \ @@ -382,7 +383,8 @@ HEADERS += \ navigation/navigationcontainer.h \ tools/horizontallistwidget.h \ tools/mactoolbutton.h \ - tools/qzregexp.h + tools/qzregexp.h \ + tools/actioncopy.h FORMS += \ preferences/autofillmanager.ui \ diff --git a/src/lib/navigation/navigationbar.cpp b/src/lib/navigation/navigationbar.cpp index 21580db0c..e6e51d8aa 100644 --- a/src/lib/navigation/navigationbar.cpp +++ b/src/lib/navigation/navigationbar.cpp @@ -120,6 +120,7 @@ NavigationBar::NavigationBar(QupZilla* mainClass) m_supMenu->setAutoRaise(true); m_supMenu->setFocusPolicy(Qt::NoFocus); m_supMenu->setMenu(p_QupZilla->superMenu()); + m_supMenu->setShowMenuInside(true); #endif m_searchLine = new WebSearchBar(p_QupZilla); @@ -193,6 +194,11 @@ void NavigationBar::showStopButton() m_reloadStop->showStopButton(); } +void NavigationBar::setSuperMenuVisible(bool visible) +{ + m_supMenu->setVisible(visible); +} + void NavigationBar::aboutToShowHistoryBackMenu() { if (!m_menuBack || !p_QupZilla->weView()) { diff --git a/src/lib/navigation/navigationbar.h b/src/lib/navigation/navigationbar.h index 82a1a5c29..6620995f3 100644 --- a/src/lib/navigation/navigationbar.h +++ b/src/lib/navigation/navigationbar.h @@ -47,12 +47,13 @@ public: ToolButton* buttonNext() { return m_buttonNext; } ToolButton* buttonHome() { return m_buttonHome; } ToolButton* buttonAddTab() { return m_buttonAddTab; } - ToolButton* buttonSuperMenu() { return m_supMenu; } ToolButton* buttonExitFullscreen() { return m_exitFullscreen; } ReloadStopButton* buttonReloadStop() { return m_reloadStop; } WebSearchBar* searchLine() { return m_searchLine; } QSplitter* splitter() { return m_navigationSplitter; } + void setSuperMenuVisible(bool visible); + signals: public slots: diff --git a/src/lib/tools/actioncopy.cpp b/src/lib/tools/actioncopy.cpp new file mode 100644 index 000000000..ac6491738 --- /dev/null +++ b/src/lib/tools/actioncopy.cpp @@ -0,0 +1,49 @@ +/* ============================================================ +* QupZilla - WebKit based browser +* Copyright (C) 2013 David Rosca +* +* 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 3 of the License, or +* (at your option) any later version. +* +* 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 . +* ============================================================ */ +#include "actioncopy.h" + +ActionCopy::ActionCopy(QAction* original, QObject* parent) + : QAction(parent) + , m_action(original) +{ + updateAction(); + + connect(m_action, SIGNAL(changed()), this, SLOT(updateAction())); + connect(this, SIGNAL(toggled(bool)), this, SLOT(actionToggled())); + connect(this, SIGNAL(triggered()), this, SLOT(actionTriggered())); +} + +void ActionCopy::updateAction() +{ + const QString &shortcutString = m_action->shortcut().toString(QKeySequence::NativeText); + const QString &actionText = QString("%1\t%2").arg(m_action->text(), shortcutString); + + setText(actionText); + setIcon(m_action->icon()); + +} + +void ActionCopy::actionToggled() +{ + m_action->toggle(); +} + +void ActionCopy::actionTriggered() +{ + m_action->trigger(); +} diff --git a/src/lib/tools/actioncopy.h b/src/lib/tools/actioncopy.h new file mode 100644 index 000000000..393298f18 --- /dev/null +++ b/src/lib/tools/actioncopy.h @@ -0,0 +1,42 @@ +/* ============================================================ +* QupZilla - WebKit based browser +* Copyright (C) 2013 David Rosca +* +* 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 3 of the License, or +* (at your option) any later version. +* +* 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 . +* ============================================================ */ +#ifndef ACTIONCOPY_H +#define ACTIONCOPY_H + +#include + +#include "qz_namespace.h" + +class QT_QUPZILLA_EXPORT ActionCopy : public QAction +{ + Q_OBJECT +public: + explicit ActionCopy(QAction* original, QObject* parent = 0); + +private slots: + void updateAction(); + + void actionToggled(); + void actionTriggered(); + +private: + QAction* m_action; + +}; + +#endif // ACTIONCOPY_H diff --git a/src/lib/tools/toolbutton.cpp b/src/lib/tools/toolbutton.cpp index df217917c..a7a4e3d2e 100644 --- a/src/lib/tools/toolbutton.cpp +++ b/src/lib/tools/toolbutton.cpp @@ -1,6 +1,6 @@ /* ============================================================ * QupZilla - WebKit based browser -* Copyright (C) 2010-2012 David Rosca +* Copyright (C) 2010-2013 David Rosca * * 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 @@ -18,12 +18,14 @@ #include "toolbutton.h" #include +#include #include #include ToolButton::ToolButton(QWidget* parent) : QToolButton(parent) , m_usingMultiIcon(false) + , m_showMenuInside(false) { setMinimumWidth(16); } @@ -53,6 +55,16 @@ void ToolButton::setIcon(const QIcon &image) QToolButton::setIcon(image); } +void ToolButton::setShowMenuInside(bool inside) +{ + m_showMenuInside = inside; +} + +bool ToolButton::showMenuInside() const +{ + return m_showMenuInside; +} + void ToolButton::setData(const QVariant &data) { m_data = data; @@ -80,7 +92,7 @@ void ToolButton::setMultiIcon(const QPixmap &image) void ToolButton::mousePressEvent(QMouseEvent* e) { - if (e->button() == Qt::RightButton && menu()) { + if (e->button() != Qt::MiddleButton && menu()) { setDown(true); showMenu(); return; @@ -111,6 +123,27 @@ void ToolButton::mouseReleaseEvent(QMouseEvent* e) setDown(false); } +void ToolButton::showMenu() +{ + if (!m_showMenuInside) { + QToolButton::showMenu(); + return; + } + + QMenu* m = menu(); + + if (!m) { + return; + } + + QPoint pos = mapToGlobal(rect().bottomRight()); + pos.setX(pos.x() - m->sizeHint().width()); + + setDown(true); + m->exec(pos); + setDown(false); +} + void ToolButton::paintEvent(QPaintEvent* e) { if (!m_usingMultiIcon) { diff --git a/src/lib/tools/toolbutton.h b/src/lib/tools/toolbutton.h index dd07290ed..6229d42f2 100644 --- a/src/lib/tools/toolbutton.h +++ b/src/lib/tools/toolbutton.h @@ -1,6 +1,6 @@ /* ============================================================ * QupZilla - WebKit based browser -* Copyright (C) 2010-2012 David Rosca +* Copyright (C) 2010-2013 David Rosca * * 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 @@ -50,11 +50,16 @@ public: void setFallbackIcon(const QIcon &image); void setIcon(const QIcon &image); + void setShowMenuInside(bool inside); + bool showMenuInside() const; + + signals: void middleMouseClicked(); void controlClicked(); public slots: + void showMenu(); protected: void mousePressEvent(QMouseEvent* e); @@ -64,6 +69,7 @@ private: void paintEvent(QPaintEvent* e); bool m_usingMultiIcon; + bool m_showMenuInside; QPixmap m_normalIcon; QPixmap m_hoverIcon; diff --git a/src/lib/tools/treewidget.cpp b/src/lib/tools/treewidget.cpp index f1c2f3333..758728f21 100644 --- a/src/lib/tools/treewidget.cpp +++ b/src/lib/tools/treewidget.cpp @@ -331,7 +331,7 @@ void TreeWidget::filterString(const QString &string) QList _allItems = allItems(); QList parents; bool stringIsEmpty = string.isEmpty(); - foreach(QTreeWidgetItem * item, _allItems) { + foreach (QTreeWidgetItem* item, _allItems) { bool containsString = stringIsEmpty || item->text(0).contains(string, Qt::CaseInsensitive); if (containsString) { item->setHidden(false); @@ -349,7 +349,7 @@ void TreeWidget::filterString(const QString &string) } } - for(int i = 0; i < parents.size(); ++i) { + for (int i = 0; i < parents.size(); ++i) { QTreeWidgetItem* parentItem = parents.at(i); parentItem->setHidden(false); if (stringIsEmpty) {