#include "dolphin_iconsmodesettings.h"
#include "dolphin_searchsettings.h"
+#include <KAcceleratorManager>
#include <KAction>
#include <KActionCollection>
#include <KActionMenu>
#include <KFilePlacesModel>
#include <KGlobal>
#include <KLineEdit>
-#include <ktoolbar.h>
+#include <KToolBar>
#include <KIcon>
#include <KIconLoader>
#include <KIO/NetAccess>
#include <KUrlComboBox>
#include <KToolInvocation>
+#include <QDesktopWidget>
#include <QDBusMessage>
#include <QKeyEvent>
#include <QClipboard>
+#include <QToolButton>
#include <QSplitter>
-#include <kacceleratormanager.h>
+
+/*
+ * 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.
DolphinMainWindow::DolphinMainWindow(int id) :
KXmlGuiWindow(0),
m_newFileMenu(0),
- m_showMenuBar(0),
m_tabBar(0),
m_activeViewContainer(0),
m_centralWidgetLayout(0),
m_actionHandler(0),
m_remoteEncoding(0),
m_settingsDialog(0),
+ m_toolBarSpacer(0),
+ m_openToolBarMenuButton(0),
+ m_updateToolBarTimer(0),
m_lastHandleUrlStatJob(0),
m_searchDockIsTemporaryVisible(false)
{
void DolphinMainWindow::goBack()
{
- clearStatusBar();
-
KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator();
urlNavigator->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().
}
}
-void DolphinMainWindow::goHome()
-{
- clearStatusBar();
- m_activeViewContainer->urlNavigator()->goHome();
-}
-
void DolphinMainWindow::compareFiles()
{
// The method is only invoked if exactly 2 files have
{
const bool visible = menuBar()->isVisible();
menuBar()->setVisible(!visible);
+ if (visible) {
+ createToolBarMenuButton();
+ } else {
+ deleteToolBarMenuButton();
+ }
}
void DolphinMainWindow::openTerminal()
delete contextMenu;
}
+void DolphinMainWindow::updateToolBarMenu()
+{
+ 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();
+
+ KActionCollection* ac = actionCollection();
+
+ // Add "Edit" actions
+ bool added = addActionToMenu(ac->action(KStandardAction::name(KStandardAction::Undo)), menu) |
+ addActionToMenu(ac->action(KStandardAction::name(KStandardAction::Find)), menu) |
+ addActionToMenu(ac->action("select_all"), menu) |
+ addActionToMenu(ac->action("invert_selection"), menu);
+
+ if (added) {
+ menu->addSeparator();
+ }
+
+ // Add "View" actions
+ if (!generalSettings->showZoomSlider()) {
+ addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ZoomIn)), menu);
+ addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ZoomOut)), menu);
+ menu->addSeparator();
+ }
+
+ added = addActionToMenu(ac->action("view_mode"), menu) |
+ addActionToMenu(ac->action("sort"), menu) |
+ addActionToMenu(ac->action("additional_info"), menu) |
+ addActionToMenu(ac->action("show_preview"), menu) |
+ addActionToMenu(ac->action("show_in_groups"), menu) |
+ addActionToMenu(ac->action("show_hidden_files"), menu);
+
+ if (added) {
+ menu->addSeparator();
+ }
+
+ added = addActionToMenu(ac->action("split_view"), menu) |
+ addActionToMenu(ac->action("reload"), menu) |
+ addActionToMenu(ac->action("view_properties"), menu);
+ if (added) {
+ menu->addSeparator();
+ }
+
+ addActionToMenu(ac->action("panels"), menu);
+ KMenu* locationBarMenu = new KMenu(i18nc("@action:inmenu", "Location Bar"), menu);
+ locationBarMenu->addAction(ac->action("editable_location"));
+ locationBarMenu->addAction(ac->action("replace_location"));
+ menu->addMenu(locationBarMenu);
+
+ menu->addSeparator();
+
+ // 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"));
+ toolsMenu->addAction(ac->action("change_remote_encoding"));
+ menu->addMenu(toolsMenu);
+
+ // Add "Settings" menu entries
+ addActionToMenu(ac->action(KStandardAction::name(KStandardAction::KeyBindings)), menu);
+ addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ConfigureToolbars)), menu);
+ addActionToMenu(ac->action(KStandardAction::name(KStandardAction::Preferences)), menu);
+
+ // 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)));
+ helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::AboutKDE)));
+ menu->addMenu(helpMenu);
+
+ menu->addSeparator();
+ addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ShowMenubar)), menu);
+}
+
+void DolphinMainWindow::updateToolBar()
+{
+ if (!menuBar()->isVisible()) {
+ createToolBarMenuButton();
+ }
+}
+
+void DolphinMainWindow::slotToolBarSpacerDeleted()
+{
+ m_toolBarSpacer = 0;
+ m_updateToolBarTimer->start();
+}
+
+void DolphinMainWindow::slotToolBarMenuButtonDeleted()
+{
+ m_openToolBarMenuButton = 0;
+ m_updateToolBarTimer->start();
+}
+
+void DolphinMainWindow::slotToolBarIconSizeChanged(const QSize& iconSize)
+{
+ if (m_openToolBarMenuButton) {
+ m_openToolBarMenuButton->setIconSize(iconSize);
+ }
+}
+
void DolphinMainWindow::init()
{
DolphinSettings& settings = DolphinSettings::instance();
showFilterBarAction->setChecked(generalSettings->filterBar());
if (firstRun) {
- // assure a proper default size if Dolphin runs the first time
+ menuBar()->setVisible(false);
+ // Assure a proper default size if Dolphin runs the first time
resize(750, 500);
}
- m_showMenuBar->setChecked(!menuBar()->isHidden()); // workaround for bug #171080
+ const bool showMenu = !menuBar()->isHidden();
+ QAction* showMenuBarAction = actionCollection()->action(KStandardAction::name(KStandardAction::ShowMenubar));
+ showMenuBarAction->setChecked(showMenu); // workaround for bug #171080
+ if (!showMenu) {
+ createToolBarMenuButton();
+ }
}
void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContainer)
stop->setIcon(KIcon("process-stop"));
connect(stop, SIGNAL(triggered()), this, SLOT(stopLoading()));
- KToggleAction* showFullLocation = actionCollection()->add<KToggleAction>("editable_location");
- showFullLocation->setText(i18nc("@action:inmenu Navigation Bar", "Editable Location"));
- showFullLocation->setShortcut(Qt::CTRL | Qt::Key_L);
- connect(showFullLocation, SIGNAL(triggered()), this, SLOT(toggleEditLocation()));
+ KToggleAction* editableLocation = actionCollection()->add<KToggleAction>("editable_location");
+ editableLocation->setText(i18nc("@action:inmenu Navigation Bar", "Editable Location"));
+ editableLocation->setShortcut(Qt::CTRL | Qt::Key_L);
+ connect(editableLocation, SIGNAL(triggered()), this, SLOT(toggleEditLocation()));
KAction* replaceLocation = actionCollection()->addAction("replace_location");
replaceLocation->setText(i18nc("@action:inmenu Navigation Bar", "Replace Location"));
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);
connect(openTerminal, SIGNAL(triggered()), this, SLOT(openTerminal()));
// setup 'Settings' menu
- m_showMenuBar = KStandardAction::showMenubar(this, SLOT(toggleShowMenuBar()), actionCollection());
+ KStandardAction::showMenubar(this, SLOT(toggleShowMenuBar()), actionCollection());
KStandardAction::preferences(this, SLOT(editSettings()), actionCollection());
// not in menu actions
goUpAction->setEnabled(currentUrl.upUrl() != currentUrl);
}
+void DolphinMainWindow::createToolBarMenuButton()
+{
+ if (m_toolBarSpacer && m_openToolBarMenuButton) {
+ return;
+ }
+ Q_ASSERT(!m_toolBarSpacer);
+ Q_ASSERT(!m_openToolBarMenuButton);
+
+ m_toolBarSpacer = new QWidget(this);
+ m_toolBarSpacer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+
+ 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()));
+
+ 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
+ // m_updateToolBarTimer.
+ connect(m_toolBarSpacer, SIGNAL(destroyed()), this, SLOT(slotToolBarSpacerDeleted()));
+ connect(m_openToolBarMenuButton, SIGNAL(destroyed()), this, SLOT(slotToolBarMenuButtonDeleted()));
+ m_updateToolBarTimer = new QTimer(this);
+ m_updateToolBarTimer->setInterval(500);
+ connect(m_updateToolBarTimer, SIGNAL(timeout()), this, SLOT(updateToolBar()));
+}
+
+void DolphinMainWindow::deleteToolBarMenuButton()
+{
+ delete m_toolBarSpacer;
+ m_toolBarSpacer = 0;
+
+ delete m_openToolBarMenuButton;
+ m_openToolBarMenuButton = 0;
+
+ delete m_updateToolBarTimer;
+ m_updateToolBarTimer = 0;
+}
+
+bool DolphinMainWindow::addActionToMenu(QAction* action, KMenu* menu)
+{
+ Q_ASSERT(action);
+ Q_ASSERT(menu);
+
+ const KToolBar* toolBarWidget = toolBar();
+ foreach (const QWidget* widget, action->associatedWidgets()) {
+ if (widget == toolBarWidget) {
+ return false;
+ }
+ }
+
+ menu->addAction(action);
+ return true;
+}
+
void DolphinMainWindow::rememberClosedTab(int index)
{
KMenu* tabsMenu = m_recentTabsMenu->menu();
}
}
+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"