X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/09e1cc4d7726b649710fe5ce49741ae736ce4d06..94815093253e5db99aa100f0834cd6c74c96a91a:/src/dolphinmainwindow.cpp diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index e58b81740..64f26387f 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -24,10 +24,15 @@ #include #include "dolphinapplication.h" +#include "dolphindockwidget.h" #include "dolphincontextmenu.h" #include "dolphinnewfilemenu.h" #include "dolphinviewcontainer.h" #include "mainwindowadaptor.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" @@ -52,6 +57,7 @@ #include #include #include +#include #include #include #include @@ -85,7 +91,6 @@ #include #include #include -#include #include /* @@ -114,9 +119,14 @@ DolphinMainWindow::DolphinMainWindow(int id) : m_actionHandler(0), m_remoteEncoding(0), m_settingsDialog(0), - m_captionStatJob(0), - m_lastHandleUrlStatJob(0) + m_lastHandleUrlStatJob(0), + m_filterDockIsTemporaryVisible(false) { + // Workaround for a X11-issue in combination with KModifierInfo + // (see DolphinContextMenu::initializeModifierKeyInfo() for + // more information): + DolphinContextMenu::initializeModifierKeyInfo(); + setObjectName("Dolphin#"); m_viewTab.append(ViewTab()); @@ -276,6 +286,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() @@ -335,15 +358,6 @@ void DolphinMainWindow::slotSelectionChanged(const KFileItemList& selection) emit selectionChanged(selection); } -void DolphinMainWindow::slotWheelMoved(int wheelDelta) -{ - if (wheelDelta > 0) { - activatePrevTab(); - } else { - activateNextTab(); - } -} - void DolphinMainWindow::slotRequestItemInfo(const KFileItem& item) { emit requestItemInfo(item); @@ -467,17 +481,27 @@ void DolphinMainWindow::activatePrevTab() void DolphinMainWindow::openInNewTab() { const KFileItemList list = m_activeViewContainer->view()->selectedItems(); - if ((list.count() == 1) && list[0].isDir()) { - openNewTab(m_activeViewContainer->view()->selectedUrls()[0]); + if (list.isEmpty()) { + openNewTab(m_activeViewContainer->url()); + } else if ((list.count() == 1) && list[0].isDir()) { + openNewTab(list[0].url()); } } void DolphinMainWindow::openInNewWindow() { + KUrl newWindowUrl; + const KFileItemList list = m_activeViewContainer->view()->selectedItems(); - if ((list.count() == 1) && list[0].isDir()) { + if (list.isEmpty()) { + newWindowUrl = m_activeViewContainer->url(); + } else if ((list.count() == 1) && list[0].isDir()) { + newWindowUrl = list[0].url(); + } + + if (!newWindowUrl.isEmpty()) { DolphinMainWindow* window = DolphinApplication::app()->createMainWindow(); - window->changeUrl(m_activeViewContainer->view()->selectedUrls()[0]); + window->changeUrl(newWindowUrl); window->show(); } } @@ -564,6 +588,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); } @@ -796,11 +828,22 @@ void DolphinMainWindow::reloadView() void DolphinMainWindow::stopLoading() { + m_activeViewContainer->view()->stopLoading(); +} + +void DolphinMainWindow::enableStopAction() +{ + actionCollection()->action("stop")->setEnabled(true); +} + +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() @@ -824,17 +867,32 @@ void DolphinMainWindow::replaceLocation() lineEdit->setSelection(0, text.length()); } +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(); } } @@ -896,30 +954,31 @@ void DolphinMainWindow::compareFiles() KUrl urlA; KUrl urlB; - KUrl::List urls = m_viewTab[m_tabIndex].primaryView->view()->selectedUrls(); - switch (urls.count()) { + KFileItemList items = m_viewTab[m_tabIndex].primaryView->view()->selectedItems(); + + switch (items.count()) { case 0: { Q_ASSERT(m_viewTab[m_tabIndex].secondaryView != 0); - urls = m_viewTab[m_tabIndex].secondaryView->view()->selectedUrls(); - Q_ASSERT(urls.count() == 2); - urlA = urls[0]; - urlB = urls[1]; + items = m_viewTab[m_tabIndex].secondaryView->view()->selectedItems(); + Q_ASSERT(items.count() == 2); + urlA = items[0].url(); + urlB = items[1].url(); break; } case 1: { - urlA = urls[0]; + urlA = items[0].url(); Q_ASSERT(m_viewTab[m_tabIndex].secondaryView != 0); - urls = m_viewTab[m_tabIndex].secondaryView->view()->selectedUrls(); - Q_ASSERT(urls.count() == 1); - urlB = urls[0]; + items = m_viewTab[m_tabIndex].secondaryView->view()->selectedItems(); + Q_ASSERT(items.count() == 1); + urlB = items[0].url(); break; } case 2: { - urlA = urls[0]; - urlB = urls[1]; + urlA = items[0].url(); + urlB = items[1].url(); break; } @@ -963,7 +1022,7 @@ void DolphinMainWindow::openTerminal() void DolphinMainWindow::editSettings() { if (m_settingsDialog == 0) { - const KUrl& url = activeViewContainer()->url(); + const KUrl url = activeViewContainer()->url(); m_settingsDialog = new DolphinSettingsDialog(url, this); m_settingsDialog->setAttribute(Qt::WA_DeleteOnClose); m_settingsDialog->show(); @@ -1150,7 +1209,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); @@ -1167,26 +1226,66 @@ void DolphinMainWindow::tabDropEvent(int tab, QDropEvent* event) } } -void DolphinMainWindow::slotCaptionStatFinished(KJob* job) +void DolphinMainWindow::slotWriteStateChanged(bool isFolderWritable) { - m_captionStatJob = 0; - const KIO::UDSEntry entry = static_cast(job)->statResult(); - const QString name = entry.stringValue(KIO::UDSEntry::UDS_DISPLAY_NAME); - setCaption(name); + newFileMenu()->setEnabled(isFolderWritable); } -void DolphinMainWindow::slotWriteStateChanged(bool isFolderWritable) +void DolphinMainWindow::slotSearchModeChanged(bool enabled) { - newFileMenu()->setEnabled(isFolderWritable); +#ifdef HAVE_NEPOMUK + if (Nepomuk::ResourceManager::instance()->init() != 0) { + // Currently the Filter Panel only works with Nepomuk enabled + return; + } + + QDockWidget* filterDock = findChild("filterDock"); + if ((filterDock == 0) || !filterDock->isEnabled()) { + 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) { - DolphinContextMenu contextMenu(this, item, url); - contextMenu.setCustomActions(customActions); - contextMenu.open(); + QPointer contextMenu = new DolphinContextMenu(this, item, url); + contextMenu->setCustomActions(customActions); + const DolphinContextMenu::Command command = contextMenu->open(); + + switch (command) { + case DolphinContextMenu::OpenParentFolderInNewWindow: { + DolphinMainWindow* window = DolphinApplication::app()->createMainWindow(); + window->changeUrl(item.url().upUrl()); + window->show(); + break; + } + + case DolphinContextMenu::OpenParentFolderInNewTab: + openNewTab(item.url().upUrl()); + break; + + case DolphinContextMenu::None: + default: + break; + } + + delete contextMenu; } void DolphinMainWindow::init() @@ -1208,7 +1307,7 @@ void DolphinMainWindow::init() setupActions(); - const KUrl& homeUrl = generalSettings->homeUrl(); + const KUrl homeUrl(generalSettings->homeUrl()); setUrlAsCaption(homeUrl); m_actionHandler = new DolphinViewActionHandler(actionCollection(), this); connect(m_actionHandler, SIGNAL(actionBeingHandled()), SLOT(clearStatusBar())); @@ -1241,8 +1340,6 @@ void DolphinMainWindow::init() this, SLOT(openNewTab())); connect(m_tabBar, SIGNAL(testCanDecode(const QDragMoveEvent*, bool&)), this, SLOT(slotTestCanDecode(const QDragMoveEvent*, bool&))); - connect(m_tabBar, SIGNAL(wheelDelta(int)), - this, SLOT(slotWheelMoved(int))); connect(m_tabBar, SIGNAL(mouseMiddleClick(int)), this, SLOT(closeTab(int))); connect(m_tabBar, SIGNAL(tabMoved(int, int)), @@ -1314,9 +1411,9 @@ void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContain updateViewActions(); updateGoActions(); - const KUrl& url = m_activeViewContainer->url(); + const KUrl url = m_activeViewContainer->url(); setUrlAsCaption(url); - if (m_viewTab.count() > 1 && m_viewTab[m_tabIndex].secondaryView != 0) { + if (m_viewTab.count() > 1) { m_tabBar->setTabText(m_tabIndex, tabName(url)); m_tabBar->setTabIcon(m_tabIndex, KIcon(KMimeType::iconNameForUrl(url))); } @@ -1444,11 +1541,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")); @@ -1499,17 +1596,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)), @@ -1519,16 +1629,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)), @@ -1536,12 +1649,14 @@ void DolphinMainWindow::setupDockWidgets() connect(foldersPanel, SIGNAL(changeUrl(KUrl, Qt::MouseButtons)), this, SLOT(handlePlacesClick(KUrl, Qt::MouseButtons))); - // 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())); @@ -1549,34 +1664,61 @@ 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); placesPanel->setModel(DolphinSettings::instance().placesModel()); placesPanel->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + connect(placesPanel, SIGNAL(lockChangeRequested(bool)), this, SLOT(slotPanelLockChangeRequested(bool))); + 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)), @@ -1584,6 +1726,7 @@ 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); @@ -1593,6 +1736,11 @@ void DolphinMainWindow::setupDockWidgets() #ifndef Q_OS_WIN panelsMenu->addAction(terminalAction); #endif +#ifdef HAVE_NEPOMUK + panelsMenu->addAction(filterAction); +#endif + panelsMenu->addSeparator(); + panelsMenu->addAction(lockLayoutAction); } void DolphinMainWindow::updateEditActions() @@ -1639,7 +1787,7 @@ void DolphinMainWindow::updateViewActions() void DolphinMainWindow::updateGoActions() { QAction* goUpAction = actionCollection()->action(KStandardAction::name(KStandardAction::Up)); - const KUrl& currentUrl = m_activeViewContainer->url(); + const KUrl currentUrl = m_activeViewContainer->url(); goUpAction->setEnabled(currentUrl.upUrl() != currentUrl); } @@ -1692,6 +1840,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)), @@ -1704,6 +1854,10 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container) this, SLOT(openNewTab(const KUrl&))); connect(view, SIGNAL(requestContextMenu(KFileItem, const KUrl&, const QList&)), this, SLOT(openContextMenu(KFileItem, const KUrl&, const QList&))); + connect(view, SIGNAL(startedPathLoading(KUrl)), + this, SLOT(enableStopAction())); + connect(view, SIGNAL(finishedPathLoading(KUrl)), + this, SLOT(disableStopAction())); const KUrlNavigator* navigator = container->urlNavigator(); connect(navigator, SIGNAL(urlChanged(const KUrl&)), @@ -1789,26 +1943,18 @@ QString DolphinMainWindow::tabProperty(const QString& property, int tabIndex) co void DolphinMainWindow::setUrlAsCaption(const KUrl& url) { - delete m_captionStatJob; - m_captionStatJob = 0; - - if (url.protocol() == QLatin1String("file")) { - QString caption; - if (url.equals(KUrl("file:///"))) { - caption = '/'; - } else { - caption = url.fileName(); - if (caption.isEmpty()) { - caption = url.protocol(); - } + QString caption; + if (!url.isLocalFile()) { + caption.append(url.protocol() + " - "); + if (url.hasHost()) { + caption.append(url.host() + " - "); } - - setCaption(caption); - } else { - m_captionStatJob = KIO::stat(url, KIO::HideProgressInfo); - connect(m_captionStatJob, SIGNAL(result(KJob*)), - this, SLOT(slotCaptionStatFinished(KJob*))); } + + const QString fileName = url.fileName().isEmpty() ? "/" : url.fileName(); + caption.append(fileName); + + setCaption(caption); } QString DolphinMainWindow::squeezedText(const QString& text) const @@ -1817,6 +1963,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() {