1
mirror of https://invent.kde.org/network/falkon.git synced 2024-11-11 01:22:10 +01:00

[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.
This commit is contained in:
nowrep 2013-03-08 21:01:55 +01:00
parent 8820703a2e
commit b12c324f87
11 changed files with 190 additions and 22 deletions

View File

@ -7,6 +7,7 @@ Version 1.4.0
* added support for saving passwords of multiple users per site * added support for saving passwords of multiple users per site
* added support for showing tabs on top * added support for showing tabs on top
* added bash autocompletion file * 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 * possibility to select text on page with Shift+Arrow keys
* asking user whether to allow site to use notifications/geolocation * asking user whether to allow site to use notifications/geolocation
* option to set JavaScript privacy permissions * option to set JavaScript privacy permissions

View File

@ -27,7 +27,7 @@
#navigation-button-back::menu-indicator #navigation-button-back::menu-indicator
{ {
background: url(images/transp.png); image: none;
} }
#navigation-button-next #navigation-button-next
@ -39,7 +39,7 @@
#navigation-button-next::menu-indicator #navigation-button-next::menu-indicator
{ {
background: url(images/transp.png); image: none;
} }
#navigation-button-stop #navigation-button-stop
@ -77,6 +77,11 @@
qproperty-iconSize: 24px 24px; qproperty-iconSize: 24px 24px;
} }
#navigation-button-supermenu::menu-indicator
{
image: none;
}
/*TabWidget*/ /*TabWidget*/
#tabbar::tab #tabbar::tab
{ {
@ -103,7 +108,7 @@
#tabwidget-button-opentabs::menu-indicator #tabwidget-button-opentabs::menu-indicator
{ {
background: url(images/transp.png); image: none;
} }
/*IconProvider*/ /*IconProvider*/
@ -182,7 +187,7 @@ IconProvider
#bookmarksbar QToolButton::menu-indicator #bookmarksbar QToolButton::menu-indicator
{ {
background: url(images/transp.png); image: none;
} }
/*SideBar*/ /*SideBar*/
@ -219,7 +224,7 @@ IconProvider
#websearchbar-searchprovider-comobobox::menu-indicator #websearchbar-searchprovider-comobobox::menu-indicator
{ {
background: url(images/transp.png); image: none;
} }
/*SourceViewer*/ /*SourceViewer*/

View File

@ -57,6 +57,7 @@
#include "webinspectordockwidget.h" #include "webinspectordockwidget.h"
#include "bookmarksimportdialog.h" #include "bookmarksimportdialog.h"
#include "qztools.h" #include "qztools.h"
#include "actioncopy.h"
#include "reloadstopbutton.h" #include "reloadstopbutton.h"
#include "enhancedmenu.h" #include "enhancedmenu.h"
#include "navigationcontainer.h" #include "navigationcontainer.h"
@ -341,7 +342,7 @@ void QupZilla::setupMenu()
#endif #endif
// Standard actions - needed on Mac to be placed correctly in "application" menu // 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); m_actionAbout->setMenuRole(QAction::AboutRole);
connect(m_actionAbout, SIGNAL(triggered()), MENU_RECEIVER, SLOT(aboutQupZilla())); connect(m_actionAbout, SIGNAL(triggered()), MENU_RECEIVER, SLOT(aboutQupZilla()));
@ -366,8 +367,8 @@ void QupZilla::setupMenu()
* File Menu * * File Menu *
*************/ *************/
m_menuFile = new QMenu(tr("&File")); 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(":/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-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(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")); 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->addAction(m_actionAbout);
m_menuHelp->addSeparator(); m_menuHelp->addSeparator();
#endif #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->setData(QUrl("qupzilla:about"));
infoAction->setShortcut(QKeySequence(QKeySequence::HelpContents)); infoAction->setShortcut(QKeySequence(QKeySequence::HelpContents));
connect(infoAction, SIGNAL(triggered()), MENU_RECEIVER, SLOT(loadActionUrlInNewTab())); connect(infoAction, SIGNAL(triggered()), MENU_RECEIVER, SLOT(loadActionUrlInNewTab()));
@ -589,13 +590,35 @@ void QupZilla::setupMenu()
setupOtherActions(); setupOtherActions();
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
m_superMenu->addMenu(m_menuFile); m_superMenu->addAction(new ActionCopy(m_menuFile->actions().at(0), this));
m_superMenu->addMenu(m_menuEdit); 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_menuView);
m_superMenu->addMenu(m_menuHistory); m_superMenu->addMenu(m_menuHistory);
m_superMenu->addMenu(m_menuBookmarks); m_superMenu->addMenu(m_menuBookmarks);
m_superMenu->addMenu(m_menuTools); 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 #endif
} }
@ -726,7 +749,7 @@ void QupZilla::loadSettings()
menuBar()->setVisible(showMenuBar); menuBar()->setVisible(showMenuBar);
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
m_navigationBar->buttonSuperMenu()->setVisible(!showMenuBar); m_navigationBar->setSuperMenuVisible(!showMenuBar);
#endif #endif
m_navigationBar->buttonReloadStop()->setVisible(showReloadButton); m_navigationBar->buttonReloadStop()->setVisible(showReloadButton);
m_navigationBar->buttonHome()->setVisible(showHomeButton); m_navigationBar->buttonHome()->setVisible(showHomeButton);
@ -1535,7 +1558,7 @@ void QupZilla::showMenubar()
} }
menuBar()->setVisible(!menuBar()->isVisible()); menuBar()->setVisible(!menuBar()->isVisible());
m_navigationBar->buttonSuperMenu()->setVisible(!menuBar()->isVisible()); m_navigationBar->setSuperMenuVisible(!menuBar()->isVisible());
Settings settings; Settings settings;
settings.setValue("Browser-View-Settings/showMenubar", menuBar()->isVisible()); settings.setValue("Browser-View-Settings/showMenubar", menuBar()->isVisible());
@ -1766,7 +1789,7 @@ bool QupZilla::event(QEvent* event)
m_navigationContainer->hide(); m_navigationContainer->hide();
m_tabWidget->getTabBar()->hide(); m_tabWidget->getTabBar()->hide();
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
m_navigationBar->buttonSuperMenu()->hide(); m_navigationBar->setSuperMenuVisible(false);
#endif #endif
m_hideNavigationTimer->stop(); m_hideNavigationTimer->stop();
m_actionShowFullScreen->setChecked(true); m_actionShowFullScreen->setChecked(true);
@ -1789,7 +1812,7 @@ bool QupZilla::event(QEvent* event)
m_tabWidget->showTabBar(); m_tabWidget->showTabBar();
m_tabWidget->getTabBar()->updateVisibilityWithFullscreen(true); m_tabWidget->getTabBar()->updateVisibilityWithFullscreen(true);
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
m_navigationBar->buttonSuperMenu()->setVisible(!m_menuBarVisible); m_navigationBar->setSuperMenuVisible(!m_menuBarVisible);
#endif #endif
m_hideNavigationTimer->stop(); m_hideNavigationTimer->stop();
m_actionShowFullScreen->setChecked(false); m_actionShowFullScreen->setChecked(false);

View File

@ -212,6 +212,7 @@ SOURCES += \
navigation/navigationcontainer.cpp \ navigation/navigationcontainer.cpp \
tools/horizontallistwidget.cpp \ tools/horizontallistwidget.cpp \
tools/mactoolbutton.cpp \ tools/mactoolbutton.cpp \
tools/actioncopy.cpp
HEADERS += \ HEADERS += \
webview/tabpreview.h \ webview/tabpreview.h \
@ -382,7 +383,8 @@ HEADERS += \
navigation/navigationcontainer.h \ navigation/navigationcontainer.h \
tools/horizontallistwidget.h \ tools/horizontallistwidget.h \
tools/mactoolbutton.h \ tools/mactoolbutton.h \
tools/qzregexp.h tools/qzregexp.h \
tools/actioncopy.h
FORMS += \ FORMS += \
preferences/autofillmanager.ui \ preferences/autofillmanager.ui \

View File

@ -120,6 +120,7 @@ NavigationBar::NavigationBar(QupZilla* mainClass)
m_supMenu->setAutoRaise(true); m_supMenu->setAutoRaise(true);
m_supMenu->setFocusPolicy(Qt::NoFocus); m_supMenu->setFocusPolicy(Qt::NoFocus);
m_supMenu->setMenu(p_QupZilla->superMenu()); m_supMenu->setMenu(p_QupZilla->superMenu());
m_supMenu->setShowMenuInside(true);
#endif #endif
m_searchLine = new WebSearchBar(p_QupZilla); m_searchLine = new WebSearchBar(p_QupZilla);
@ -193,6 +194,11 @@ void NavigationBar::showStopButton()
m_reloadStop->showStopButton(); m_reloadStop->showStopButton();
} }
void NavigationBar::setSuperMenuVisible(bool visible)
{
m_supMenu->setVisible(visible);
}
void NavigationBar::aboutToShowHistoryBackMenu() void NavigationBar::aboutToShowHistoryBackMenu()
{ {
if (!m_menuBack || !p_QupZilla->weView()) { if (!m_menuBack || !p_QupZilla->weView()) {

View File

@ -47,12 +47,13 @@ public:
ToolButton* buttonNext() { return m_buttonNext; } ToolButton* buttonNext() { return m_buttonNext; }
ToolButton* buttonHome() { return m_buttonHome; } ToolButton* buttonHome() { return m_buttonHome; }
ToolButton* buttonAddTab() { return m_buttonAddTab; } ToolButton* buttonAddTab() { return m_buttonAddTab; }
ToolButton* buttonSuperMenu() { return m_supMenu; }
ToolButton* buttonExitFullscreen() { return m_exitFullscreen; } ToolButton* buttonExitFullscreen() { return m_exitFullscreen; }
ReloadStopButton* buttonReloadStop() { return m_reloadStop; } ReloadStopButton* buttonReloadStop() { return m_reloadStop; }
WebSearchBar* searchLine() { return m_searchLine; } WebSearchBar* searchLine() { return m_searchLine; }
QSplitter* splitter() { return m_navigationSplitter; } QSplitter* splitter() { return m_navigationSplitter; }
void setSuperMenuVisible(bool visible);
signals: signals:
public slots: public slots:

View File

@ -0,0 +1,49 @@
/* ============================================================
* QupZilla - WebKit based browser
* Copyright (C) 2013 David Rosca <nowrep@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
* ============================================================ */
#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();
}

View File

@ -0,0 +1,42 @@
/* ============================================================
* QupZilla - WebKit based browser
* Copyright (C) 2013 David Rosca <nowrep@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
* ============================================================ */
#ifndef ACTIONCOPY_H
#define ACTIONCOPY_H
#include <QAction>
#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

View File

@ -1,6 +1,6 @@
/* ============================================================ /* ============================================================
* QupZilla - WebKit based browser * QupZilla - WebKit based browser
* Copyright (C) 2010-2012 David Rosca <nowrep@gmail.com> * Copyright (C) 2010-2013 David Rosca <nowrep@gmail.com>
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -18,12 +18,14 @@
#include "toolbutton.h" #include "toolbutton.h"
#include <QMouseEvent> #include <QMouseEvent>
#include <QMenu>
#include <QPainter> #include <QPainter>
#include <QStyleOptionToolButton> #include <QStyleOptionToolButton>
ToolButton::ToolButton(QWidget* parent) ToolButton::ToolButton(QWidget* parent)
: QToolButton(parent) : QToolButton(parent)
, m_usingMultiIcon(false) , m_usingMultiIcon(false)
, m_showMenuInside(false)
{ {
setMinimumWidth(16); setMinimumWidth(16);
} }
@ -53,6 +55,16 @@ void ToolButton::setIcon(const QIcon &image)
QToolButton::setIcon(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) void ToolButton::setData(const QVariant &data)
{ {
m_data = data; m_data = data;
@ -80,7 +92,7 @@ void ToolButton::setMultiIcon(const QPixmap &image)
void ToolButton::mousePressEvent(QMouseEvent* e) void ToolButton::mousePressEvent(QMouseEvent* e)
{ {
if (e->button() == Qt::RightButton && menu()) { if (e->button() != Qt::MiddleButton && menu()) {
setDown(true); setDown(true);
showMenu(); showMenu();
return; return;
@ -111,6 +123,27 @@ void ToolButton::mouseReleaseEvent(QMouseEvent* e)
setDown(false); 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) void ToolButton::paintEvent(QPaintEvent* e)
{ {
if (!m_usingMultiIcon) { if (!m_usingMultiIcon) {

View File

@ -1,6 +1,6 @@
/* ============================================================ /* ============================================================
* QupZilla - WebKit based browser * QupZilla - WebKit based browser
* Copyright (C) 2010-2012 David Rosca <nowrep@gmail.com> * Copyright (C) 2010-2013 David Rosca <nowrep@gmail.com>
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -50,11 +50,16 @@ public:
void setFallbackIcon(const QIcon &image); void setFallbackIcon(const QIcon &image);
void setIcon(const QIcon &image); void setIcon(const QIcon &image);
void setShowMenuInside(bool inside);
bool showMenuInside() const;
signals: signals:
void middleMouseClicked(); void middleMouseClicked();
void controlClicked(); void controlClicked();
public slots: public slots:
void showMenu();
protected: protected:
void mousePressEvent(QMouseEvent* e); void mousePressEvent(QMouseEvent* e);
@ -64,6 +69,7 @@ private:
void paintEvent(QPaintEvent* e); void paintEvent(QPaintEvent* e);
bool m_usingMultiIcon; bool m_usingMultiIcon;
bool m_showMenuInside;
QPixmap m_normalIcon; QPixmap m_normalIcon;
QPixmap m_hoverIcon; QPixmap m_hoverIcon;

View File

@ -331,7 +331,7 @@ void TreeWidget::filterString(const QString &string)
QList<QTreeWidgetItem*> _allItems = allItems(); QList<QTreeWidgetItem*> _allItems = allItems();
QList<QTreeWidgetItem*> parents; QList<QTreeWidgetItem*> parents;
bool stringIsEmpty = string.isEmpty(); bool stringIsEmpty = string.isEmpty();
foreach(QTreeWidgetItem * item, _allItems) { foreach (QTreeWidgetItem* item, _allItems) {
bool containsString = stringIsEmpty || item->text(0).contains(string, Qt::CaseInsensitive); bool containsString = stringIsEmpty || item->text(0).contains(string, Qt::CaseInsensitive);
if (containsString) { if (containsString) {
item->setHidden(false); 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); QTreeWidgetItem* parentItem = parents.at(i);
parentItem->setHidden(false); parentItem->setHidden(false);
if (stringIsEmpty) { if (stringIsEmpty) {