X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/e521e260b6c95242e87fad9f22a0faa696cfa948..fd74aa8e2057158d2eadb835eb61564854c81020:/src/dolphinmainwindow.cpp diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index e44495015..4387a4746 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006 by Peter Penz * + * Copyright (C) 2006 by Peter Penz * * Copyright (C) 2006 by Stefan Monov * * Copyright (C) 2006 by Cvetoslav Ludmiloff * * * @@ -24,14 +24,19 @@ #include #include "dolphinapplication.h" +#include "dolphindockwidget.h" #include "dolphincontextmenu.h" #include "dolphinnewfilemenu.h" #include "dolphinviewcontainer.h" #include "mainwindowadaptor.h" -#include "panels/filter/filterpanel.h" +#ifdef HAVE_NEPOMUK + #include "panels/filter/filterpanel.h" + #include +#endif #include "panels/folders/folderspanel.h" #include "panels/places/placespanel.h" #include "panels/information/informationpanel.h" +#include "search/dolphinsearchinformation.h" #include "settings/dolphinsettings.h" #include "settings/dolphinsettingsdialog.h" #include "statusbar/dolphinstatusbar.h" @@ -47,47 +52,46 @@ #include "dolphin_generalsettings.h" #include "dolphin_iconsmodesettings.h" -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include -#include -#include -#include +#include +#include +#include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include -#include -#include -#include -#include +#include +#include +#include +#include #include -#include +#include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include #include #include -#include #include /* @@ -116,7 +120,8 @@ DolphinMainWindow::DolphinMainWindow(int id) : m_actionHandler(0), m_remoteEncoding(0), m_settingsDialog(0), - m_lastHandleUrlStatJob(0) + m_lastHandleUrlStatJob(0), + m_filterDockIsTemporaryVisible(false) { // Workaround for a X11-issue in combination with KModifierInfo // (see DolphinContextMenu::initializeModifierKeyInfo() for @@ -214,21 +219,6 @@ void DolphinMainWindow::openFiles(const QList& files) } } -void DolphinMainWindow::toggleViews() -{ - if (m_viewTab[m_tabIndex].primaryView == 0) { - return; - } - - // move secondary view from the last position of the splitter - // to the first position - m_viewTab[m_tabIndex].splitter->insertWidget(0, m_viewTab[m_tabIndex].secondaryView); - - DolphinViewContainer* container = m_viewTab[m_tabIndex].primaryView; - m_viewTab[m_tabIndex].primaryView = m_viewTab[m_tabIndex].secondaryView; - m_viewTab[m_tabIndex].secondaryView = container; -} - void DolphinMainWindow::showCommand(CommandType command) { DolphinStatusBar* statusBar = m_activeViewContainer->statusBar(); @@ -282,6 +272,19 @@ void DolphinMainWindow::refreshViews() } 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 == 0)) + || (!splitView && (activeTab.secondaryView != 0)); + if (toggle) { + toggleSplitView(); + } + } } void DolphinMainWindow::pasteIntoFolder() @@ -571,6 +574,14 @@ void DolphinMainWindow::closeEvent(QCloseEvent* event) settings.save(); + if (m_filterDockIsTemporaryVisible) { + QDockWidget* filterDock = findChild("filterDock"); + if (filterDock != 0) { + filterDock->hide(); + } + m_filterDockIsTemporaryVisible = false; + } + KXmlGuiWindow::closeEvent(event); } @@ -816,9 +827,9 @@ void DolphinMainWindow::disableStopAction() actionCollection()->action("stop")->setEnabled(false); } -void DolphinMainWindow::toggleFilterBarVisibility(bool show) +void DolphinMainWindow::showFilterBar() { - m_activeViewContainer->showFilterBar(show); + m_activeViewContainer->setFilterBarVisible(true); } void DolphinMainWindow::toggleEditLocation() @@ -838,21 +849,35 @@ void DolphinMainWindow::replaceLocation() // select the whole text of the combo box editor QLineEdit* lineEdit = navigator->editor()->lineEdit(); // krazy:exclude=qclasses - const QString text = lineEdit->text(); - lineEdit->setSelection(0, text.length()); + lineEdit->selectAll(); +} + +void DolphinMainWindow::togglePanelLockState() +{ + GeneralSettings* generalSettings = DolphinSettings::instance().generalSettings(); + + const bool newLockState = !generalSettings->lockPanels(); + foreach (QObject* child, children()) { + DolphinDockWidget* dock = qobject_cast(child); + if (dock != 0) { + dock->setLocked(newLockState); + } + } + + generalSettings->setLockPanels(newLockState); } void DolphinMainWindow::goBack() { clearStatusBar(); - + KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator(); urlNavigator->goBack(); - + if (urlNavigator->locationState().isEmpty()) { // An empty location state indicates a redirection URL, // which must be skipped too - urlNavigator->goBack(); + urlNavigator->goBack(); } } @@ -1102,7 +1127,9 @@ void DolphinMainWindow::openTabContextMenu(int index, const QPoint& pos) if (tab.secondaryView != 0) { const KUrl secondaryUrl = tab.secondaryView->url(); - window->toggleSplitView(); + if (window->m_viewTab[0].secondaryView == 0) { + window->toggleSplitView(); + } window->m_viewTab[0].secondaryView->setUrl(secondaryUrl); if (tab.primaryView->isActive()) { window->m_viewTab[0].primaryView->setActive(true); @@ -1169,7 +1196,7 @@ void DolphinMainWindow::slotHandleUrlStatFinished(KJob* job) m_lastHandleUrlStatJob = 0; const KIO::UDSEntry entry = static_cast(job)->statResult(); const KUrl url = static_cast(job)->url(); - if ( entry.isDir() ) { + if (entry.isDir()) { activeViewContainer()->setUrl(url); } else { new KRun(url, this); @@ -1191,6 +1218,36 @@ void DolphinMainWindow::slotWriteStateChanged(bool isFolderWritable) newFileMenu()->setEnabled(isFolderWritable); } +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)) { + return; + } + + QDockWidget* filterDock = findChild("filterDock"); + if (filterDock == 0) { + return; + } + + if (enabled) { + if (!filterDock->isVisible()) { + m_filterDockIsTemporaryVisible = true; + } + filterDock->show(); + } else { + if (filterDock->isVisible() && m_filterDockIsTemporaryVisible) { + filterDock->hide(); + } + m_filterDockIsTemporaryVisible = false; + } +#else + Q_UNUSED(enabled); +#endif +} + void DolphinMainWindow::openContextMenu(const KFileItem& item, const KUrl& url, const QList& customActions) @@ -1472,11 +1529,11 @@ void DolphinMainWindow::setupActions() KStandardAction::home(this, SLOT(goHome()), actionCollection()); // setup 'Tools' menu - KToggleAction* showFilterBar = actionCollection()->add("show_filter_bar"); + KAction* showFilterBar = actionCollection()->addAction("show_filter_bar"); showFilterBar->setText(i18nc("@action:inmenu Tools", "Show Filter Bar")); showFilterBar->setIcon(KIcon("view-filter")); showFilterBar->setShortcut(Qt::CTRL | Qt::Key_I); - connect(showFilterBar, SIGNAL(triggered(bool)), this, SLOT(toggleFilterBarVisibility(bool))); + connect(showFilterBar, SIGNAL(triggered()), this, SLOT(showFilterBar())); KAction* compareFiles = actionCollection()->addAction("compare_files"); compareFiles->setText(i18nc("@action:inmenu Tools", "Compare Files")); @@ -1491,7 +1548,7 @@ void DolphinMainWindow::setupActions() connect(openTerminal, SIGNAL(triggered()), this, SLOT(openTerminal())); // setup 'Settings' menu - m_showMenuBar = KStandardAction::showHideMenubar(this, SLOT(toggleShowMenuBar()), actionCollection()); + m_showMenuBar = KStandardAction::showMenubar(this, SLOT(toggleShowMenuBar()), actionCollection()); KStandardAction::preferences(this, SLOT(editSettings()), actionCollection()); // not in menu actions @@ -1527,17 +1584,30 @@ void DolphinMainWindow::setupActions() void DolphinMainWindow::setupDockWidgets() { - // setup "Information" - QDockWidget* infoDock = new QDockWidget(i18nc("@title:window", "Information")); + const bool lock = DolphinSettings::instance().generalSettings()->lockPanels(); + + KDualAction* lockLayoutAction = actionCollection()->add("lock_panels"); + lockLayoutAction->setActiveText(i18nc("@action:inmenu Panels", "Unlock Panels")); + lockLayoutAction->setActiveIcon(KIcon("object-unlocked")); + lockLayoutAction->setInactiveText(i18nc("@action:inmenu Panels", "Lock Panels")); + lockLayoutAction->setInactiveIcon(KIcon("object-locked")); + lockLayoutAction->setActive(lock); + connect(lockLayoutAction, SIGNAL(triggered()), this, SLOT(togglePanelLockState())); + + // Setup "Information" + DolphinDockWidget* infoDock = new DolphinDockWidget(i18nc("@title:window", "Information")); + infoDock->setLocked(lock); infoDock->setObjectName("infoDock"); infoDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); Panel* infoPanel = new InformationPanel(infoDock); + infoPanel->setCustomContextMenuActions(QList() << lockLayoutAction); connect(infoPanel, SIGNAL(urlActivated(KUrl)), this, SLOT(handleUrl(KUrl))); infoDock->setWidget(infoPanel); QAction* infoAction = infoDock->toggleViewAction(); infoAction->setIcon(KIcon("dialog-information")); infoAction->setShortcut(Qt::Key_F11); + addActionCloneToCollection(infoAction, "show_information_panel"); addDockWidget(Qt::RightDockWidgetArea, infoDock); connect(this, SIGNAL(urlChanged(KUrl)), @@ -1547,16 +1617,19 @@ void DolphinMainWindow::setupDockWidgets() connect(this, SIGNAL(requestItemInfo(KFileItem)), infoPanel, SLOT(requestDelayedItemInfo(KFileItem))); - // setup "Folders" - QDockWidget* foldersDock = new QDockWidget(i18nc("@title:window", "Folders")); + // Setup "Folders" + DolphinDockWidget* foldersDock = new DolphinDockWidget(i18nc("@title:window", "Folders")); + foldersDock->setLocked(lock); foldersDock->setObjectName("foldersDock"); foldersDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); FoldersPanel* foldersPanel = new FoldersPanel(foldersDock); + foldersPanel->setCustomContextMenuActions(QList() << lockLayoutAction); foldersDock->setWidget(foldersPanel); QAction* foldersAction = foldersDock->toggleViewAction(); foldersAction->setShortcut(Qt::Key_F7); foldersAction->setIcon(KIcon("folder")); + addActionCloneToCollection(foldersAction, "show_folders_panel"); addDockWidget(Qt::LeftDockWidgetArea, foldersDock); connect(this, SIGNAL(urlChanged(KUrl)), @@ -1564,28 +1637,14 @@ void DolphinMainWindow::setupDockWidgets() connect(foldersPanel, SIGNAL(changeUrl(KUrl, Qt::MouseButtons)), this, SLOT(handlePlacesClick(KUrl, Qt::MouseButtons))); - // setup "Filter" -#ifdef HAVE_NEPOMUK - QDockWidget* filterDock = new QDockWidget(i18nc("@title:window", "Filter")); - filterDock->setObjectName("filterDock"); - filterDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); - Panel* filterPanel = new FilterPanel(filterDock); - connect(filterPanel, SIGNAL(urlActivated(KUrl)), this, SLOT(handleUrl(KUrl))); - filterDock->setWidget(filterPanel); - - QAction* filterAction = filterDock->toggleViewAction(); - filterAction->setIcon(KIcon("dialog-facet")); - addDockWidget(Qt::RightDockWidgetArea, filterDock); - connect(this, SIGNAL(urlChanged(KUrl)), - filterPanel, SLOT(setUrl(KUrl))); -#endif - - // setup "Terminal" + // Setup "Terminal" #ifndef Q_OS_WIN - QDockWidget* terminalDock = new QDockWidget(i18nc("@title:window Shell terminal", "Terminal")); + DolphinDockWidget* terminalDock = new DolphinDockWidget(i18nc("@title:window Shell terminal", "Terminal")); + terminalDock->setLocked(lock); terminalDock->setObjectName("terminalDock"); terminalDock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea); Panel* terminalPanel = new TerminalPanel(terminalDock); + terminalPanel->setCustomContextMenuActions(QList() << lockLayoutAction); terminalDock->setWidget(terminalPanel); connect(terminalPanel, SIGNAL(hideTerminalPanel()), terminalDock, SLOT(hide())); @@ -1593,34 +1652,66 @@ void DolphinMainWindow::setupDockWidgets() QAction* terminalAction = terminalDock->toggleViewAction(); terminalAction->setShortcut(Qt::Key_F4); terminalAction->setIcon(KIcon("utilities-terminal")); + addActionCloneToCollection(terminalAction, "show_terminal_panel"); addDockWidget(Qt::BottomDockWidgetArea, terminalDock); connect(this, SIGNAL(urlChanged(KUrl)), terminalPanel, SLOT(setUrl(KUrl))); #endif + // Setup "Filter" +#ifdef HAVE_NEPOMUK + DolphinDockWidget* filterDock = new DolphinDockWidget(i18nc("@title:window", "Filter")); + filterDock->setLocked(lock); + filterDock->setObjectName("filterDock"); + filterDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + Panel* filterPanel = new FilterPanel(filterDock); + filterPanel->setCustomContextMenuActions(QList() << lockLayoutAction); + connect(filterPanel, SIGNAL(urlActivated(KUrl)), this, SLOT(handleUrl(KUrl))); + filterDock->setWidget(filterPanel); + + QAction* filterAction = filterDock->toggleViewAction(); + filterAction->setShortcut(Qt::Key_F12); + filterAction->setIcon(KIcon("view-filter")); + addActionCloneToCollection(filterAction, "show_filter_panel"); + addDockWidget(Qt::RightDockWidgetArea, filterDock); + connect(this, SIGNAL(urlChanged(KUrl)), + filterPanel, SLOT(setUrl(KUrl))); +#endif + const bool firstRun = DolphinSettings::instance().generalSettings()->firstRun(); if (firstRun) { infoDock->hide(); foldersDock->hide(); #ifndef Q_OS_WIN terminalDock->hide(); +#endif +#ifdef HAVE_NEPOMUK + filterDock->hide(); #endif } - // setup "Places" - QDockWidget* placesDock = new QDockWidget(i18nc("@title:window", "Places")); + // Setup "Places" + DolphinDockWidget* placesDock = new DolphinDockWidget(i18nc("@title:window", "Places")); + placesDock->setLocked(lock); placesDock->setObjectName("placesDock"); placesDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); PlacesPanel* placesPanel = new PlacesPanel(placesDock); - placesDock->setWidget(placesPanel); + QAction* separator = new QAction(placesPanel); + separator->setSeparator(true); + QList placesActions; + placesActions.append(separator); + placesActions.append(lockLayoutAction); + placesPanel->addActions(placesActions); placesPanel->setModel(DolphinSettings::instance().placesModel()); placesPanel->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + placesDock->setWidget(placesPanel); QAction* placesAction = placesDock->toggleViewAction(); placesAction->setShortcut(Qt::Key_F9); placesAction->setIcon(KIcon("bookmarks")); + addActionCloneToCollection(placesAction, "show_places_panel"); addDockWidget(Qt::LeftDockWidgetArea, placesDock); connect(placesPanel, SIGNAL(urlChanged(KUrl, Qt::MouseButtons)), @@ -1628,18 +1719,21 @@ void DolphinMainWindow::setupDockWidgets() connect(this, SIGNAL(urlChanged(KUrl)), placesPanel, SLOT(setUrl(KUrl))); + // Add actions into the "Panels" menu KActionMenu* panelsMenu = new KActionMenu(i18nc("@action:inmenu View", "Panels"), this); actionCollection()->addAction("panels", panelsMenu); panelsMenu->setDelayed(false); panelsMenu->addAction(placesAction); panelsMenu->addAction(infoAction); panelsMenu->addAction(foldersAction); -#ifdef HAVE_NEPOMUK - panelsMenu->addAction(filterAction); -#endif #ifndef Q_OS_WIN panelsMenu->addAction(terminalAction); #endif +#ifdef HAVE_NEPOMUK + panelsMenu->addAction(filterAction); +#endif + panelsMenu->addSeparator(); + panelsMenu->addAction(lockLayoutAction); } void DolphinMainWindow::updateEditActions() @@ -1739,6 +1833,8 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container) this, SLOT(updateFilterBarAction(bool))); connect(container, SIGNAL(writeStateChanged(bool)), this, SLOT(slotWriteStateChanged(bool))); + connect(container, SIGNAL(searchModeChanged(bool)), + this, SLOT(slotSearchModeChanged(bool))); DolphinView* view = container->view(); connect(view, SIGNAL(selectionChanged(KFileItemList)), @@ -1860,6 +1956,14 @@ QString DolphinMainWindow::squeezedText(const QString& text) const return fm.elidedText(text, Qt::ElideMiddle, fm.maxWidth() * 10); } +void DolphinMainWindow::addActionCloneToCollection(QAction* action, const QString& actionName) +{ + KAction* actionClone = actionCollection()->addAction(actionName); + actionClone->setText(action->text()); + actionClone->setIcon(action->icon()); + connect(actionClone, SIGNAL(triggered()), action, SLOT(trigger())); +} + DolphinMainWindow::UndoUiInterface::UndoUiInterface() : KIO::FileUndoManager::UiInterface() {