]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinmainwindow.cpp
Optimize alignment of toolbar menu
[dolphin.git] / src / dolphinmainwindow.cpp
index 1fb9b63e7aeb12f4b7acef2cb5f1cfb0d4f0ced3..dbb46a239d494dbdaa2cf5ae6edf001d16177686 100644 (file)
 #include <KUrlComboBox>
 #include <KToolInvocation>
 
+#include <QDesktopWidget>
 #include <QDBusMessage>
 #include <QKeyEvent>
 #include <QClipboard>
 #include <QToolButton>
 #include <QSplitter>
 
+/*
+ * Menu shown when pressing the configure-button in the toolbar.
+ */
+class ToolBarMenu : public KMenu
+{
+public:
+    ToolBarMenu(QWidget* parent);
+    virtual ~ToolBarMenu();
+protected:
+    virtual void showEvent(QShowEvent* event);
+};
+
 /*
  * Remembers the tab configuration if a tab has been closed.
  * Each closed tab can be restored by the menu
@@ -123,7 +136,6 @@ DolphinMainWindow::DolphinMainWindow(int id) :
     m_settingsDialog(0),
     m_toolBarSpacer(0),
     m_openToolBarMenuButton(0),
-    m_toolBarMenu(),
     m_updateToolBarTimer(0),
     m_lastHandleUrlStatJob(0),
     m_searchDockIsTemporaryVisible(false)
@@ -891,8 +903,6 @@ void DolphinMainWindow::slotPlacesPanelVisibilityChanged(bool visible)
 
 void DolphinMainWindow::goBack()
 {
-    clearStatusBar();
-
     KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator();
     urlNavigator->goBack();
 
@@ -905,16 +915,19 @@ void DolphinMainWindow::goBack()
 
 void DolphinMainWindow::goForward()
 {
-    clearStatusBar();
     m_activeViewContainer->urlNavigator()->goForward();
 }
 
 void DolphinMainWindow::goUp()
 {
-    clearStatusBar();
     m_activeViewContainer->urlNavigator()->goUp();
 }
 
+void DolphinMainWindow::goHome()
+{
+    m_activeViewContainer->urlNavigator()->goHome();
+}
+
 void DolphinMainWindow::goBack(Qt::MouseButtons buttons)
 {
     // The default case (left button pressed) is handled in goBack().
@@ -1311,24 +1324,14 @@ void DolphinMainWindow::openContextMenu(const KFileItem& item,
     delete contextMenu;
 }
 
-void DolphinMainWindow::openToolBarMenu()
-{
-    const int height = m_openToolBarMenuButton->height();
-    const QPoint pos = m_openToolBarMenuButton->mapToGlobal(QPoint(0, height));
-
-    m_toolBarMenu = new KMenu(m_openToolBarMenuButton);
-    m_toolBarMenu.data()->setAttribute(Qt::WA_DeleteOnClose);
-    connect(m_toolBarMenu.data(), SIGNAL(aboutToShow()), this, SLOT(updateToolBarMenu()));
-
-    m_toolBarMenu.data()->exec(pos);
-}
-
 void DolphinMainWindow::updateToolBarMenu()
 {
-    KMenu* menu = m_toolBarMenu.data();
-    if (!menu) {
-        return;
-    }
+    KMenu* menu = qobject_cast<KMenu*>(sender());
+    Q_ASSERT(menu);
+
+    // All actions get cleared by KMenu::clear(). The sub-menus are deleted
+    // by connecting to the aboutToHide() signal from the parent-menu.
+    menu->clear();
 
     const GeneralSettings* generalSettings = DolphinSettings::instance().generalSettings();
 
@@ -1379,14 +1382,17 @@ void DolphinMainWindow::updateToolBarMenu()
 
     // Add "Go" menu
     KMenu* goMenu = new KMenu(i18nc("@action:inmenu", "Go"), menu);
+    connect(menu, SIGNAL(aboutToHide()), goMenu, SLOT(deleteLater()));
     goMenu->addAction(ac->action(KStandardAction::name(KStandardAction::Back)));
     goMenu->addAction(ac->action(KStandardAction::name(KStandardAction::Forward)));
     goMenu->addAction(ac->action(KStandardAction::name(KStandardAction::Up)));
+    goMenu->addAction(ac->action(KStandardAction::name(KStandardAction::Home)));
     goMenu->addAction(ac->action("closed_tabs"));
     menu->addMenu(goMenu);
 
     // Add "Tool" menu
     KMenu* toolsMenu = new KMenu(i18nc("@action:inmenu", "Tools"), menu);
+    connect(menu, SIGNAL(aboutToHide()), toolsMenu, SLOT(deleteLater()));
     toolsMenu->addAction(ac->action("show_filter_bar"));
     toolsMenu->addAction(ac->action("compare_files"));
     toolsMenu->addAction(ac->action("open_terminal"));
@@ -1400,6 +1406,7 @@ void DolphinMainWindow::updateToolBarMenu()
 
     // Add "Help" menu
     KMenu* helpMenu = new KMenu(i18nc("@action:inmenu", "Help"), menu);
+    connect(menu, SIGNAL(aboutToHide()), helpMenu, SLOT(deleteLater()));
     helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::HelpContents)));
     helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::WhatsThis)));
     helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::AboutApp)));
@@ -1429,6 +1436,13 @@ void DolphinMainWindow::slotToolBarMenuButtonDeleted()
     m_updateToolBarTimer->start();
 }
 
+void DolphinMainWindow::slotToolBarIconSizeChanged(const QSize& iconSize)
+{
+    if (m_openToolBarMenuButton) {
+        m_openToolBarMenuButton->setIconSize(iconSize);
+    }
+}
+
 void DolphinMainWindow::init()
 {
     DolphinSettings& settings = DolphinSettings::instance();
@@ -1682,7 +1696,7 @@ void DolphinMainWindow::setupActions()
     connect(m_recentTabsMenu->menu(), SIGNAL(triggered(QAction *)),
             this, SLOT(restoreClosedTab(QAction *)));
 
-    QAction* action = new QAction("Empty Recently Closed Tabs", m_recentTabsMenu);
+    QAction* action = new QAction(i18n("Empty Recently Closed Tabs"), m_recentTabsMenu);
     action->setIcon(KIcon("edit-clear-list"));
     action->setData(QVariant::fromValue(true));
     m_recentTabsMenu->addAction(action);
@@ -1695,6 +1709,8 @@ void DolphinMainWindow::setupActions()
     KAction* upAction = KStandardAction::up(this, SLOT(goUp()), actionCollection());
     connect(upAction, SIGNAL(triggered(Qt::MouseButtons, Qt::KeyboardModifiers)), this, SLOT(goUp(Qt::MouseButtons)));
 
+    KStandardAction::home(this, SLOT(goHome()), actionCollection());
+
     // setup 'Tools' menu
     KAction* showFilterBar = actionCollection()->addAction("show_filter_bar");
     showFilterBar->setText(i18nc("@action:inmenu Tools", "Show Filter Bar"));
@@ -1966,13 +1982,17 @@ void DolphinMainWindow::createToolBarMenuButton()
 
     m_openToolBarMenuButton = new QToolButton(this);
     m_openToolBarMenuButton->setIcon(KIcon("configure"));
+    m_openToolBarMenuButton->setPopupMode(QToolButton::InstantPopup);
+    m_openToolBarMenuButton->setToolTip(i18nc("@info:tooltip", "Configure and control Dolphin"));
+
+    KMenu* toolBarMenu = new ToolBarMenu(m_openToolBarMenuButton);
+    connect(toolBarMenu, SIGNAL(aboutToShow()), this, SLOT(updateToolBarMenu()));
 
-    // Instead of using QPushButton::setMenu() the opening of the menu is done manually
-    // to prevent the "clutter" of the down-arrow drawn by the style.
-    connect(m_openToolBarMenuButton, SIGNAL(clicked()), this, SLOT(openToolBarMenu()));
+    m_openToolBarMenuButton->setMenu(toolBarMenu);
 
     toolBar()->addWidget(m_toolBarSpacer);
     toolBar()->addWidget(m_openToolBarMenuButton);
+    connect(toolBar(), SIGNAL(iconSizeChanged(QSize)), this, SLOT(slotToolBarIconSizeChanged(QSize)));
 
     // The added widgets are owned by the toolbar and may get deleted when e.g. the toolbar
     // gets edited. In this case we must add them again. The adding is done asynchronously by
@@ -2211,4 +2231,47 @@ void DolphinMainWindow::UndoUiInterface::jobError(KIO::Job* job)
     }
 }
 
+ToolBarMenu::ToolBarMenu(QWidget* parent) :
+    KMenu(parent)
+{
+}
+
+ToolBarMenu::~ToolBarMenu()
+{
+}
+
+void ToolBarMenu::showEvent(QShowEvent* event)
+{
+    KMenu::showEvent(event);
+
+    // Adjust the position of the menu to be shown within the
+    // Dolphin window to reduce the cases that sub-menus might overlap
+    // the right screen border.
+    QPoint pos;
+    QWidget* button = parentWidget();
+    if (layoutDirection() == Qt::RightToLeft) {
+        pos = button->mapToGlobal(QPoint(0, button->height()));
+    } else {
+        pos = button->mapToGlobal(QPoint(button->width(), button->height()));
+        pos.rx() -= width();
+    }
+
+    // Assure that the menu is not shown outside the screen boundaries and
+    // that it does not overlap with the parent button.
+    const QRect screen = QApplication::desktop()->screenGeometry(QCursor::pos());
+    if (pos.x() < 0) {
+        pos.rx() = 0;
+    } else if (pos.x() + width() >= screen.width()) {
+        pos.rx() = screen.width() - width();
+    }
+
+    if (pos.y() < 0) {
+        pos.ry() = 0;
+    } else if (pos.y() + height() >= screen.height()) {
+        pos.ry() = button->mapToGlobal(QPoint(0, 0)).y() - height();
+    }
+
+    move(pos);
+}
+
 #include "dolphinmainwindow.moc"