#include "dolphincontextmenu.h"
#include "dolphinnewfilemenu.h"
#include "dolphinviewcontainer.h"
-#include "mainwindowadaptor.h"
#ifdef HAVE_NEPOMUK
#include "panels/search/searchpanel.h"
#include <Nepomuk/ResourceManager>
#include "panels/folders/folderspanel.h"
#include "panels/places/placespanel.h"
#include "panels/information/informationpanel.h"
+#include "search/dolphinsearchbox.h"
#include "search/dolphinsearchinformation.h"
#include "settings/dolphinsettings.h"
#include "settings/dolphinsettingsdialog.h"
#include "statusbar/dolphinstatusbar.h"
#include "views/dolphinviewactionhandler.h"
#include "views/dolphinremoteencoding.h"
-#include "views/draganddrophelper.h"
#include "views/viewproperties.h"
#ifndef Q_OS_WIN
#include "dolphin_generalsettings.h"
#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.
};
Q_DECLARE_METATYPE(ClosedTab)
-DolphinMainWindow::DolphinMainWindow(int id) :
+DolphinMainWindow::DolphinMainWindow() :
KXmlGuiWindow(0),
m_newFileMenu(0),
- m_showMenuBar(0),
m_tabBar(0),
m_activeViewContainer(0),
m_centralWidgetLayout(0),
- m_id(id),
m_tabIndex(0),
m_viewTab(),
m_actionHandler(0),
m_remoteEncoding(0),
- m_settingsDialog(0),
+ m_settingsDialog(),
+ m_toolBarSpacer(0),
+ m_openToolBarMenuButton(0),
+ m_updateToolBarTimer(0),
m_lastHandleUrlStatJob(0),
m_searchDockIsTemporaryVisible(false)
{
m_viewTab.append(ViewTab());
- new MainWindowAdaptor(this);
- QDBusConnection::sessionBus().registerObject(QString("/dolphin/MainWindow%1").arg(m_id), this);
-
KIO::FileUndoManager* undoManager = KIO::FileUndoManager::self();
undoManager->setUiInterface(new UndoUiInterface());
this, SLOT(showCommand(CommandType)));
connect(DolphinSettings::instance().placesModel(), SIGNAL(errorMessage(const QString&)),
this, SLOT(showErrorMessage(const QString&)));
- connect(&DragAndDropHelper::instance(), SIGNAL(errorMessage(const QString&)),
- this, SLOT(showErrorMessage(const QString&)));
+ //connect(&DragAndDropHelper::instance(), SIGNAL(errorMessage(const QString&)),
+ // this, SLOT(showErrorMessage(const QString&)));
+
+ const DolphinSettings& settings = DolphinSettings::instance();
+
+ GeneralSettings* generalSettings = settings.generalSettings();
+ const bool firstRun = generalSettings->firstRun();
+ if (firstRun) {
+ generalSettings->setViewPropsTimestamp(QDateTime::currentDateTime());
+ }
+
+ setAcceptDrops(true);
+
+ m_viewTab[m_tabIndex].splitter = new QSplitter(this);
+ m_viewTab[m_tabIndex].splitter->setChildrenCollapsible(false);
+
+ setupActions();
+
+ const KUrl homeUrl(generalSettings->homeUrl());
+ setUrlAsCaption(homeUrl);
+ m_actionHandler = new DolphinViewActionHandler(actionCollection(), this);
+ connect(m_actionHandler, SIGNAL(actionBeingHandled()), SLOT(clearStatusBar()));
+ connect(m_actionHandler, SIGNAL(createDirectory()), SLOT(createDirectory()));
+
+ m_viewTab[m_tabIndex].primaryView = createViewContainer(homeUrl, m_viewTab[m_tabIndex].splitter);
+
+ m_activeViewContainer = m_viewTab[m_tabIndex].primaryView;
+ connectViewSignals(m_activeViewContainer);
+ DolphinView* view = m_activeViewContainer->view();
+ m_activeViewContainer->show();
+ m_actionHandler->setCurrentView(view);
+
+ m_remoteEncoding = new DolphinRemoteEncoding(this, m_actionHandler);
+ connect(this, SIGNAL(urlChanged(const KUrl&)),
+ m_remoteEncoding, SLOT(slotAboutToOpenUrl()));
+
+ m_tabBar = new KTabBar(this);
+ m_tabBar->setMovable(true);
+ m_tabBar->setTabsClosable(true);
+ connect(m_tabBar, SIGNAL(currentChanged(int)),
+ this, SLOT(setActiveTab(int)));
+ connect(m_tabBar, SIGNAL(tabCloseRequested(int)),
+ this, SLOT(closeTab(int)));
+ connect(m_tabBar, SIGNAL(contextMenu(int, const QPoint&)),
+ this, SLOT(openTabContextMenu(int, const QPoint&)));
+ connect(m_tabBar, SIGNAL(newTabRequest()),
+ this, SLOT(openNewTab()));
+ connect(m_tabBar, SIGNAL(testCanDecode(const QDragMoveEvent*, bool&)),
+ this, SLOT(slotTestCanDecode(const QDragMoveEvent*, bool&)));
+ connect(m_tabBar, SIGNAL(mouseMiddleClick(int)),
+ this, SLOT(closeTab(int)));
+ connect(m_tabBar, SIGNAL(tabMoved(int, int)),
+ this, SLOT(slotTabMoved(int, int)));
+ connect(m_tabBar, SIGNAL(receivedDropEvent(int, QDropEvent*)),
+ this, SLOT(tabDropEvent(int, QDropEvent*)));
+
+ m_tabBar->blockSignals(true); // signals get unblocked after at least 2 tabs are open
+
+ QWidget* centralWidget = new QWidget(this);
+ m_centralWidgetLayout = new QVBoxLayout(centralWidget);
+ m_centralWidgetLayout->setSpacing(0);
+ m_centralWidgetLayout->setMargin(0);
+ m_centralWidgetLayout->addWidget(m_tabBar);
+ m_centralWidgetLayout->addWidget(m_viewTab[m_tabIndex].splitter, 1);
+
+ setCentralWidget(centralWidget);
+ setupDockWidgets();
+ emit urlChanged(homeUrl);
+
+ setupGUI(Keys | Save | Create | ToolBar);
+ stateChanged("new_file");
+
+ QClipboard* clipboard = QApplication::clipboard();
+ connect(clipboard, SIGNAL(dataChanged()),
+ this, SLOT(updatePasteAction()));
+
+ if (generalSettings->splitView()) {
+ toggleSplitView();
+ }
+ updateEditActions();
+ updateViewActions();
+ updateGoActions();
+
+ QAction* showFilterBarAction = actionCollection()->action("show_filter_bar");
+ showFilterBarAction->setChecked(generalSettings->filterBar());
+
+ if (firstRun) {
+ menuBar()->setVisible(false);
+ // Assure a proper default size if Dolphin runs the first time
+ resize(750, 500);
+ }
+
+ const bool showMenu = !menuBar()->isHidden();
+ QAction* showMenuBarAction = actionCollection()->action(KStandardAction::name(KStandardAction::ShowMenubar));
+ showMenuBarAction->setChecked(showMenu); // workaround for bug #171080
+ if (!showMenu) {
+ createToolBarMenuButton();
+ }
}
DolphinMainWindow::~DolphinMainWindow()
{
- DolphinApplication::app()->removeMainWindow(this);
}
void DolphinMainWindow::openDirectories(const QList<KUrl>& dirs)
}
}
- // remove the previously opened tabs
+ // Remove the previously opened tabs
for (int i = 0; i < oldOpenTabsCount; ++i) {
closeTab(0);
}
}
}
-void DolphinMainWindow::refreshViews()
-{
- Q_ASSERT(m_viewTab[m_tabIndex].primaryView);
-
- // remember the current active view, as because of
- // the refreshing the active view might change to
- // the secondary view
- DolphinViewContainer* activeViewContainer = m_activeViewContainer;
-
- const int tabCount = m_viewTab.count();
- for (int i = 0; i < tabCount; ++i) {
- m_viewTab[i].primaryView->refresh();
- if (m_viewTab[i].secondaryView) {
- m_viewTab[i].secondaryView->refresh();
- }
- }
-
- setActiveViewContainer(activeViewContainer);
-
- const GeneralSettings* generalSettings = DolphinSettings::instance().generalSettings();
- if (generalSettings->modifiedStartupSettings()) {
- // The startup settings have been changed by the user (see bug #254947).
- // Synchronize the split-view setting with the active view:
- const bool splitView = generalSettings->splitView();
- const ViewTab& activeTab = m_viewTab[m_tabIndex];
- const bool toggle = ( splitView && !activeTab.secondaryView)
- || (!splitView && activeTab.secondaryView);
- if (toggle) {
- toggleSplitView();
- }
- }
-}
-
void DolphinMainWindow::pasteIntoFolder()
{
m_activeViewContainer->view()->pasteIntoFolder();
void DolphinMainWindow::openNewMainWindow()
{
- DolphinApplication::app()->createMainWindow()->show();
+ KRun::run("dolphin", KUrl::List(), this);
}
void DolphinMainWindow::openNewTab()
ViewTab viewTab;
viewTab.splitter = new QSplitter(this);
viewTab.splitter->setChildrenCollapsible(false);
- viewTab.primaryView = new DolphinViewContainer(url, viewTab.splitter);
+ viewTab.primaryView = createViewContainer(url, viewTab.splitter);
viewTab.primaryView->setActive(false);
connectViewSignals(viewTab.primaryView);
}
if (!newWindowUrl.isEmpty()) {
- DolphinMainWindow* window = DolphinApplication::app()->createMainWindow();
- window->changeUrl(newWindowUrl);
- window->show();
+ KRun::run("dolphin", KUrl::List() << newWindowUrl, this);
}
}
void DolphinMainWindow::updateNewMenu()
{
- m_newFileMenu->setViewShowsHiddenFiles(activeViewContainer()->view()->showHiddenFiles());
+ m_newFileMenu->setViewShowsHiddenFiles(activeViewContainer()->view()->hiddenFilesShown());
m_newFileMenu->checkUpToDate();
m_newFileMenu->setPopupFiles(activeViewContainer()->url());
}
void DolphinMainWindow::createDirectory()
{
- m_newFileMenu->setViewShowsHiddenFiles(activeViewContainer()->view()->showHiddenFiles());
+ m_newFileMenu->setViewShowsHiddenFiles(activeViewContainer()->view()->hiddenFilesShown());
m_newFileMenu->setPopupFiles(activeViewContainer()->url());
m_newFileMenu->createDirectory();
}
m_activeViewContainer->setSearchModeEnabled(true);
}
+void DolphinMainWindow::slotSearchLocationChanged()
+{
+#ifdef HAVE_NEPOMUK
+ QDockWidget* searchDock = findChild<QDockWidget*>("searchDock");
+ if (!searchDock) {
+ return;
+ }
+
+ SearchPanel* searchPanel = qobject_cast<SearchPanel*>(searchDock->widget());
+ if (searchPanel) {
+ searchPanel->setSearchLocation(SearchSettings::location() == QLatin1String("FromHere")
+ ? SearchPanel::FromCurrentDir
+ : SearchPanel::Everywhere);
+ }
+#endif
+}
+
void DolphinMainWindow::updatePasteAction()
{
QAction* pasteAction = actionCollection()->action(KStandardAction::name(KStandardAction::Paste));
generalSettings->setLockPanels(newLockState);
}
-void DolphinMainWindow::goBack()
+void DolphinMainWindow::slotPlacesPanelVisibilityChanged(bool visible)
{
- clearStatusBar();
+ const int tabCount = m_viewTab.count();
+ for (int i = 0; i < tabCount; ++i) {
+ ViewTab& tab = m_viewTab[i];
+ Q_ASSERT(tab.primaryView);
+ tab.primaryView->urlNavigator()->setPlacesSelectorVisible(!visible);
+ if (tab.secondaryView) {
+ tab.secondaryView->urlNavigator()->setPlacesSelectorVisible(!visible);
+ }
+ }
+}
+void DolphinMainWindow::goBack()
+{
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()
{
if (!m_settingsDialog) {
const KUrl url = activeViewContainer()->url();
- m_settingsDialog = new DolphinSettingsDialog(url, this);
- m_settingsDialog->setAttribute(Qt::WA_DeleteOnClose);
- m_settingsDialog->show();
+ DolphinSettingsDialog* settingsDialog = new DolphinSettingsDialog(url, this);
+ connect(settingsDialog, SIGNAL(settingsChanged()), this, SLOT(refreshViews()));
+ settingsDialog->setAttribute(Qt::WA_DeleteOnClose);
+ settingsDialog->show();
+ m_settingsDialog = settingsDialog;
} else {
- m_settingsDialog->raise();
+ m_settingsDialog.data()->raise();
}
}
openNewTab(url);
m_tabBar->setCurrentIndex(m_viewTab.count() - 1);
} else if (selectedAction == detachTabAction) {
+ const QString separator(QLatin1Char(' '));
+ QString command = QLatin1String("dolphin");
+
const ViewTab& tab = m_viewTab[index];
Q_ASSERT(tab.primaryView);
- const KUrl primaryUrl = tab.primaryView->url();
- DolphinMainWindow* window = DolphinApplication::app()->createMainWindow();
- window->changeUrl(primaryUrl);
+ command += separator + tab.primaryView->url().url();
if (tab.secondaryView) {
- const KUrl secondaryUrl = tab.secondaryView->url();
- if (!window->m_viewTab[0].secondaryView) {
- window->toggleSplitView();
- }
- window->m_viewTab[0].secondaryView->setUrl(secondaryUrl);
- if (tab.primaryView->isActive()) {
- window->m_viewTab[0].primaryView->setActive(true);
- } else {
- window->m_viewTab[0].secondaryView->setActive(true);
- }
+ command += separator + tab.secondaryView->url().url();
+ command += separator + QLatin1String("-split");
}
- window->show();
+
+ KRun::runCommand(command, this);
+
closeTab(index);
} else if (selectedAction == closeOtherTabsAction) {
const int count = m_tabBar->count();
if (!urls.isEmpty() && tab != -1) {
const ViewTab& viewTab = m_viewTab[tab];
const KUrl destPath = viewTab.isPrimaryViewActive ? viewTab.primaryView->url() : viewTab.secondaryView->url();
- DragAndDropHelper::instance().dropUrls(KFileItem(), destPath, event, m_tabBar);
+ Q_UNUSED(destPath);
+ //DragAndDropHelper::instance().dropUrls(KFileItem(), destPath, event, m_tabBar);
}
}
void DolphinMainWindow::slotSearchModeChanged(bool enabled)
{
#ifdef HAVE_NEPOMUK
- const KUrl url = m_activeViewContainer->url();
const DolphinSearchInformation& searchInfo = DolphinSearchInformation::instance();
- if (!searchInfo.isIndexingEnabled() || !searchInfo.isPathIndexed(url)) {
+ if (!searchInfo.isIndexingEnabled()) {
return;
}
}
m_searchDockIsTemporaryVisible = false;
}
+
+ SearchPanel* searchPanel = qobject_cast<SearchPanel*>(searchDock->widget());
+ if (!searchPanel) {
+ return;
+ }
+
+ if (enabled) {
+ SearchPanel::SearchLocation searchLocation = SearchPanel::Everywhere;
+ const KUrl url = m_activeViewContainer->url();
+ const bool isSearchUrl = (url.protocol() == QLatin1String("nepomuksearch"));
+ if ((SearchSettings::location() == QLatin1String("FromHere") && !isSearchUrl)) {
+ searchLocation = SearchPanel::FromCurrentDir;
+ }
+ searchPanel->setSearchLocation(searchLocation);
+ } else {
+ searchPanel->setSearchLocation(SearchPanel::Everywhere);
+ }
#else
Q_UNUSED(enabled);
#endif
switch (command) {
case DolphinContextMenu::OpenParentFolderInNewWindow: {
- DolphinMainWindow* window = DolphinApplication::app()->createMainWindow();
- window->changeUrl(item.url().upUrl());
- window->show();
+ KRun::run("dolphin", KUrl::List() << item.url().upUrl(), this);
break;
}
delete contextMenu;
}
-void DolphinMainWindow::init()
+void DolphinMainWindow::updateToolBarMenu()
{
- DolphinSettings& settings = DolphinSettings::instance();
+ KMenu* menu = qobject_cast<KMenu*>(sender());
+ Q_ASSERT(menu);
- // Check whether Dolphin runs the first time. If yes then
- // a proper default window size is given at the end of DolphinMainWindow::init().
- GeneralSettings* generalSettings = settings.generalSettings();
- const bool firstRun = generalSettings->firstRun();
- if (firstRun) {
- generalSettings->setViewPropsTimestamp(QDateTime::currentDateTime());
- }
+ // All actions get cleared by KMenu::clear(). The sub-menus are deleted
+ // by connecting to the aboutToHide() signal from the parent-menu.
+ menu->clear();
- setAcceptDrops(true);
+ const GeneralSettings* generalSettings = DolphinSettings::instance().generalSettings();
- m_viewTab[m_tabIndex].splitter = new QSplitter(this);
- m_viewTab[m_tabIndex].splitter->setChildrenCollapsible(false);
+ KActionCollection* ac = actionCollection();
- setupActions();
+ // 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);
- const KUrl homeUrl(generalSettings->homeUrl());
- setUrlAsCaption(homeUrl);
- m_actionHandler = new DolphinViewActionHandler(actionCollection(), this);
- connect(m_actionHandler, SIGNAL(actionBeingHandled()), SLOT(clearStatusBar()));
- connect(m_actionHandler, SIGNAL(createDirectory()), SLOT(createDirectory()));
- ViewProperties props(homeUrl);
- m_viewTab[m_tabIndex].primaryView = new DolphinViewContainer(homeUrl,
- m_viewTab[m_tabIndex].splitter);
+ if (added) {
+ menu->addSeparator();
+ }
- m_activeViewContainer = m_viewTab[m_tabIndex].primaryView;
- connectViewSignals(m_activeViewContainer);
- DolphinView* view = m_activeViewContainer->view();
- m_activeViewContainer->show();
- m_actionHandler->setCurrentView(view);
+ // Add "View" actions
+ if (!generalSettings->showZoomSlider()) {
+ addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ZoomIn)), menu);
+ addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ZoomOut)), menu);
+ menu->addSeparator();
+ }
- m_remoteEncoding = new DolphinRemoteEncoding(this, m_actionHandler);
- connect(this, SIGNAL(urlChanged(const KUrl&)),
- m_remoteEncoding, SLOT(slotAboutToOpenUrl()));
+ 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);
- m_tabBar = new KTabBar(this);
- m_tabBar->setMovable(true);
- m_tabBar->setTabsClosable(true);
- connect(m_tabBar, SIGNAL(currentChanged(int)),
- this, SLOT(setActiveTab(int)));
- connect(m_tabBar, SIGNAL(tabCloseRequested(int)),
- this, SLOT(closeTab(int)));
- connect(m_tabBar, SIGNAL(contextMenu(int, const QPoint&)),
- this, SLOT(openTabContextMenu(int, const QPoint&)));
- connect(m_tabBar, SIGNAL(newTabRequest()),
- this, SLOT(openNewTab()));
- connect(m_tabBar, SIGNAL(testCanDecode(const QDragMoveEvent*, bool&)),
- this, SLOT(slotTestCanDecode(const QDragMoveEvent*, bool&)));
- connect(m_tabBar, SIGNAL(mouseMiddleClick(int)),
- this, SLOT(closeTab(int)));
- connect(m_tabBar, SIGNAL(tabMoved(int, int)),
- this, SLOT(slotTabMoved(int, int)));
- connect(m_tabBar, SIGNAL(receivedDropEvent(int, QDropEvent*)),
- this, SLOT(tabDropEvent(int, QDropEvent*)));
+ if (added) {
+ menu->addSeparator();
+ }
- m_tabBar->blockSignals(true); // signals get unblocked after at least 2 tabs are open
+ added = addActionToMenu(ac->action("split_view"), menu) |
+ addActionToMenu(ac->action("reload"), menu) |
+ addActionToMenu(ac->action("view_properties"), menu);
+ if (added) {
+ menu->addSeparator();
+ }
- QWidget* centralWidget = new QWidget(this);
- m_centralWidgetLayout = new QVBoxLayout(centralWidget);
- m_centralWidgetLayout->setSpacing(0);
- m_centralWidgetLayout->setMargin(0);
- m_centralWidgetLayout->addWidget(m_tabBar);
- m_centralWidgetLayout->addWidget(m_viewTab[m_tabIndex].splitter, 1);
+ 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);
- setCentralWidget(centralWidget);
- setupDockWidgets();
- emit urlChanged(homeUrl);
+ menu->addSeparator();
- setupGUI(Keys | Save | Create | ToolBar);
- stateChanged("new_file");
+ // 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);
- QClipboard* clipboard = QApplication::clipboard();
- connect(clipboard, SIGNAL(dataChanged()),
- this, SLOT(updatePasteAction()));
+ // 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);
- if (generalSettings->splitView()) {
- toggleSplitView();
- }
- updateEditActions();
- updateViewActions();
- updateGoActions();
+ // 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);
- QAction* showFilterBarAction = actionCollection()->action("show_filter_bar");
- showFilterBarAction->setChecked(generalSettings->filterBar());
+ // 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::ReportBug)));
+ helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::SwitchApplicationLanguage)));
+ helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::AboutApp)));
+ helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::AboutKDE)));
+ menu->addMenu(helpMenu);
- if (firstRun) {
- // assure a proper default size if Dolphin runs the first time
- resize(750, 500);
+ 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();
+}
- m_showMenuBar->setChecked(!menuBar()->isHidden()); // workaround for bug #171080
+void DolphinMainWindow::slotToolBarIconSizeChanged(const QSize& iconSize)
+{
+ if (m_openToolBarMenuButton) {
+ m_openToolBarMenuButton->setIconSize(iconSize);
+ }
}
void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContainer)
emit urlChanged(url);
}
+DolphinViewContainer* DolphinMainWindow::createViewContainer(const KUrl& url, QWidget* parent)
+{
+ DolphinViewContainer* container = new DolphinViewContainer(url, parent);
+
+ // The places-selector from the URL navigator should only be shown
+ // if the places dock is invisible
+ QDockWidget* placesDock = findChild<QDockWidget*>("placesDock");
+ container->urlNavigator()->setPlacesSelectorVisible(!placesDock || !placesDock->isVisible());
+
+ return container;
+}
+
void DolphinMainWindow::setupActions()
{
// setup 'File' menu
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
terminalDock->setWidget(terminalPanel);
connect(terminalPanel, SIGNAL(hideTerminalPanel()), terminalDock, SLOT(hide()));
+ connect(terminalDock, SIGNAL(visibilityChanged(bool)),
+ terminalPanel, SLOT(dockVisibilityChanged()));
QAction* terminalAction = terminalDock->toggleViewAction();
terminalAction->setShortcut(Qt::Key_F4);
this, SLOT(handlePlacesClick(KUrl, Qt::MouseButtons)));
connect(this, SIGNAL(urlChanged(KUrl)),
placesPanel, SLOT(setUrl(KUrl)));
+ connect(placesDock, SIGNAL(visibilityChanged(bool)),
+ this, SLOT(slotPlacesPanelVisibilityChanged(bool)));
// Add actions into the "Panels" menu
KActionMenu* panelsMenu = new KActionMenu(i18nc("@action:inmenu View", "Panels"), this);
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();
KAcceleratorManager::manage(tabsMenu);
}
+void DolphinMainWindow::refreshViews()
+{
+ Q_ASSERT(m_viewTab[m_tabIndex].primaryView);
+
+ // remember the current active view, as because of
+ // the refreshing the active view might change to
+ // the secondary view
+ DolphinViewContainer* activeViewContainer = m_activeViewContainer;
+
+ const int tabCount = m_viewTab.count();
+ for (int i = 0; i < tabCount; ++i) {
+ m_viewTab[i].primaryView->refresh();
+ if (m_viewTab[i].secondaryView) {
+ m_viewTab[i].secondaryView->refresh();
+ }
+ }
+
+ setActiveViewContainer(activeViewContainer);
+
+ const GeneralSettings* generalSettings = DolphinSettings::instance().generalSettings();
+ if (generalSettings->modifiedStartupSettings()) {
+ // The startup settings have been changed by the user (see bug #254947).
+ // Synchronize the split-view setting with the active view:
+ const bool splitView = generalSettings->splitView();
+ const ViewTab& activeTab = m_viewTab[m_tabIndex];
+ const bool toggle = ( splitView && !activeTab.secondaryView)
+ || (!splitView && activeTab.secondaryView);
+ if (toggle) {
+ toggleSplitView();
+ }
+ }
+}
+
void DolphinMainWindow::clearStatusBar()
{
m_activeViewContainer->statusBar()->clear();
connect(container, SIGNAL(searchModeChanged(bool)),
this, SLOT(slotSearchModeChanged(bool)));
+ const DolphinSearchBox* searchBox = container->searchBox();
+ connect(searchBox, SIGNAL(searchLocationChanged(SearchLocation)),
+ this, SLOT(slotSearchLocationChanged()));
+
DolphinView* view = container->view();
connect(view, SIGNAL(selectionChanged(KFileItemList)),
this, SLOT(slotSelectionChanged(KFileItemList)));
const int newWidth = (m_viewTab[tabIndex].primaryView->width() - splitter->handleWidth()) / 2;
const DolphinView* view = m_viewTab[tabIndex].primaryView->view();
- m_viewTab[tabIndex].secondaryView = new DolphinViewContainer(view->rootUrl(), 0);
+ m_viewTab[tabIndex].secondaryView = createViewContainer(view->url(), 0);
splitter->addWidget(m_viewTab[tabIndex].secondaryView);
splitter->setSizes(QList<int>() << newWidth << newWidth);
connectViewSignals(m_viewTab[tabIndex].secondaryView);
}
}
+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() < screen.x()) {
+ pos.rx() = screen.x();
+ } else if (pos.x() + width() > screen.x() + screen.width()) {
+ pos.rx() = screen.x() + screen.width() - width();
+ }
+
+ if (pos.y() < screen.y()) {
+ pos.ry() = screen.y();
+ } else if (pos.y() + height() > screen.y() + screen.height()) {
+ pos.ry() = button->mapToGlobal(QPoint(0, 0)).y() - height();
+ }
+
+ move(pos);
+}
+
#include "dolphinmainwindow.moc"