X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/f7bbe21b5b2d3bc85dcba1d03494879aac9e37c7..596e07c0f325ea475cfa0ccc42231ea977e35c3f:/src/dolphinmainwindow.cpp diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 46b28cada..3e63dc6c9 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,17 +24,19 @@ #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 + #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" @@ -50,46 +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 -#include #include /* @@ -211,27 +213,12 @@ void DolphinMainWindow::openFiles(const QList& files) const int tabCount = m_viewTab.count(); for (int i = 0; i < tabCount; ++i) { m_viewTab[i].primaryView->view()->markUrlsAsSelected(files); - if (m_viewTab[i].secondaryView != 0) { + if (m_viewTab[i].secondaryView) { m_viewTab[i].secondaryView->view()->markUrlsAsSelected(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(); @@ -269,7 +256,7 @@ void DolphinMainWindow::showCommand(CommandType command) void DolphinMainWindow::refreshViews() { - Q_ASSERT(m_viewTab[m_tabIndex].primaryView != 0); + Q_ASSERT(m_viewTab[m_tabIndex].primaryView); // remember the current active view, as because of // the refreshing the active view might change to @@ -279,7 +266,7 @@ void DolphinMainWindow::refreshViews() const int tabCount = m_viewTab.count(); for (int i = 0; i < tabCount; ++i) { m_viewTab[i].primaryView->refresh(); - if (m_viewTab[i].secondaryView != 0) { + if (m_viewTab[i].secondaryView) { m_viewTab[i].secondaryView->refresh(); } } @@ -292,8 +279,8 @@ void DolphinMainWindow::refreshViews() // 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)); + const bool toggle = ( splitView && !activeTab.secondaryView) + || (!splitView && activeTab.secondaryView); if (toggle) { toggleSplitView(); } @@ -315,7 +302,7 @@ void DolphinMainWindow::changeUrl(const KUrl& url) } DolphinViewContainer* view = activeViewContainer(); - if (view != 0) { + if (view) { view->setUrl(url); updateEditActions(); updateViewActions(); @@ -341,9 +328,9 @@ void DolphinMainWindow::slotSelectionChanged(const KFileItemList& selection) { updateEditActions(); - Q_ASSERT(m_viewTab[m_tabIndex].primaryView != 0); + Q_ASSERT(m_viewTab[m_tabIndex].primaryView); int selectedUrlsCount = m_viewTab[m_tabIndex].primaryView->view()->selectedItemsCount(); - if (m_viewTab[m_tabIndex].secondaryView != 0) { + if (m_viewTab[m_tabIndex].secondaryView) { selectedUrlsCount += m_viewTab[m_tabIndex].secondaryView->view()->selectedItemsCount(); } @@ -369,13 +356,13 @@ void DolphinMainWindow::updateHistory() QAction* backAction = actionCollection()->action("go_back"); backAction->setToolTip(i18nc("@info", "Go back")); - if (backAction != 0) { + if (backAction) { backAction->setEnabled(index < urlNavigator->historySize() - 1); } QAction* forwardAction = actionCollection()->action("go_forward"); forwardAction->setToolTip(i18nc("@info", "Go forward")); - if (forwardAction != 0) { + if (forwardAction) { forwardAction->setEnabled(index > 0); } } @@ -447,7 +434,7 @@ void DolphinMainWindow::openNewTab(const KUrl& url) m_viewTab[tabIndex].isPrimaryViewActive = false; } - if (focusWidget != 0) { + if (focusWidget) { // The DolphinViewContainer grabbed the keyboard focus. As the tab is opened // in background, assure that the previous focused widget gets the focus back. focusWidget->setFocus(); @@ -507,13 +494,13 @@ void DolphinMainWindow::openInNewWindow() void DolphinMainWindow::toggleActiveView() { - if (m_viewTab[m_tabIndex].secondaryView == 0) { + if (!m_viewTab[m_tabIndex].secondaryView) { // only one view is available return; } - Q_ASSERT(m_activeViewContainer != 0); - Q_ASSERT(m_viewTab[m_tabIndex].primaryView != 0); + Q_ASSERT(m_activeViewContainer); + Q_ASSERT(m_viewTab[m_tabIndex].primaryView); DolphinViewContainer* left = m_viewTab[m_tabIndex].primaryView; DolphinViewContainer* right = m_viewTab[m_tabIndex].secondaryView; @@ -589,7 +576,7 @@ void DolphinMainWindow::closeEvent(QCloseEvent* event) if (m_filterDockIsTemporaryVisible) { QDockWidget* filterDock = findChild("filterDock"); - if (filterDock != 0) { + if (filterDock) { filterDock->hide(); } m_filterDockIsTemporaryVisible = false; @@ -611,7 +598,7 @@ void DolphinMainWindow::saveProperties(KConfigGroup& group) cont->urlNavigator()->isUrlEditable()); cont = m_viewTab[i].secondaryView; - if (cont != 0) { + if (cont) { group.writeEntry(tabProperty("Secondary URL", i), cont->url().url()); group.writeEntry(tabProperty("Secondary Editable", i), cont->urlNavigator()->isUrlEditable()); @@ -632,18 +619,18 @@ void DolphinMainWindow::readProperties(const KConfigGroup& group) cont = m_viewTab[i].secondaryView; const QString secondaryUrl = group.readEntry(tabProperty("Secondary URL", i)); if (!secondaryUrl.isEmpty()) { - if (cont == 0) { + if (!cont) { // a secondary view should be shown, but no one is available // currently -> create a new view toggleSplitView(); cont = m_viewTab[i].secondaryView; - Q_ASSERT(cont != 0); + Q_ASSERT(cont); } cont->setUrl(secondaryUrl); const bool editable = group.readEntry(tabProperty("Secondary Editable", i), false); cont->urlNavigator()->setUrlEditable(editable); - } else if (cont != 0) { + } else if (cont) { // no secondary view should be shown, but the default setting shows // one already -> close the view toggleSplitView(); @@ -689,7 +676,7 @@ void DolphinMainWindow::showErrorMessage(const QString& message) void DolphinMainWindow::slotUndoAvailable(bool available) { QAction* undoAction = actionCollection()->action(KStandardAction::name(KStandardAction::Undo)); - if (undoAction != 0) { + if (undoAction) { undoAction->setEnabled(available); } } @@ -726,7 +713,7 @@ void DolphinMainWindow::restoreClosedTab(QAction* action) void DolphinMainWindow::slotUndoTextChanged(const QString& text) { QAction* undoAction = actionCollection()->action(KStandardAction::name(KStandardAction::Undo)); - if (undoAction != 0) { + if (undoAction) { undoAction->setText(text); } } @@ -792,7 +779,7 @@ void DolphinMainWindow::invertSelection() void DolphinMainWindow::toggleSplitView() { - if (m_viewTab[m_tabIndex].secondaryView == 0) { + if (!m_viewTab[m_tabIndex].secondaryView) { createSecondaryView(m_tabIndex); setActiveViewContainer(m_viewTab[m_tabIndex].secondaryView); } else if (m_activeViewContainer == m_viewTab[m_tabIndex].secondaryView) { @@ -862,8 +849,22 @@ 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) { + dock->setLocked(newLockState); + } + } + + generalSettings->setLockPanels(newLockState); } void DolphinMainWindow::goBack() @@ -934,7 +935,7 @@ void DolphinMainWindow::compareFiles() // - both in the secondary view // - one in the primary view and the other in the secondary // view - Q_ASSERT(m_viewTab[m_tabIndex].primaryView != 0); + Q_ASSERT(m_viewTab[m_tabIndex].primaryView); KUrl urlA; KUrl urlB; @@ -943,7 +944,7 @@ void DolphinMainWindow::compareFiles() switch (items.count()) { case 0: { - Q_ASSERT(m_viewTab[m_tabIndex].secondaryView != 0); + Q_ASSERT(m_viewTab[m_tabIndex].secondaryView); items = m_viewTab[m_tabIndex].secondaryView->view()->selectedItems(); Q_ASSERT(items.count() == 2); urlA = items[0].url(); @@ -953,7 +954,7 @@ void DolphinMainWindow::compareFiles() case 1: { urlA = items[0].url(); - Q_ASSERT(m_viewTab[m_tabIndex].secondaryView != 0); + Q_ASSERT(m_viewTab[m_tabIndex].secondaryView); items = m_viewTab[m_tabIndex].secondaryView->view()->selectedItems(); Q_ASSERT(items.count() == 1); urlB = items[0].url(); @@ -1005,7 +1006,7 @@ void DolphinMainWindow::openTerminal() void DolphinMainWindow::editSettings() { - if (m_settingsDialog == 0) { + if (!m_settingsDialog) { const KUrl url = activeViewContainer()->url(); m_settingsDialog = new DolphinSettingsDialog(url, this); m_settingsDialog->setAttribute(Qt::WA_DeleteOnClose); @@ -1027,7 +1028,7 @@ void DolphinMainWindow::setActiveTab(int index) ViewTab& hiddenTab = m_viewTab[m_tabIndex]; hiddenTab.isPrimaryViewActive = hiddenTab.primaryView->isActive(); hiddenTab.primaryView->setActive(false); - if (hiddenTab.secondaryView != 0) { + if (hiddenTab.secondaryView) { hiddenTab.secondaryView->setActive(false); } QSplitter* splitter = m_viewTab[m_tabIndex].splitter; @@ -1040,7 +1041,7 @@ void DolphinMainWindow::setActiveTab(int index) ViewTab& viewTab = m_viewTab[index]; m_centralWidgetLayout->addWidget(viewTab.splitter, 1); viewTab.primaryView->show(); - if (viewTab.secondaryView != 0) { + if (viewTab.secondaryView) { viewTab.secondaryView->show(); } viewTab.splitter->show(); @@ -1072,7 +1073,7 @@ void DolphinMainWindow::closeTab(int index) // delete tab m_viewTab[index].primaryView->deleteLater(); - if (m_viewTab[index].secondaryView != 0) { + if (m_viewTab[index].secondaryView) { m_viewTab[index].secondaryView->deleteLater(); } m_viewTab[index].splitter->deleteLater(); @@ -1112,21 +1113,23 @@ void DolphinMainWindow::openTabContextMenu(int index, const QPoint& pos) QAction* selectedAction = menu.exec(pos); if (selectedAction == newTabAction) { const ViewTab& tab = m_viewTab[index]; - Q_ASSERT(tab.primaryView != 0); - const KUrl url = (tab.secondaryView != 0) && tab.secondaryView->isActive() ? + Q_ASSERT(tab.primaryView); + const KUrl url = tab.secondaryView && tab.secondaryView->isActive() ? tab.secondaryView->url() : tab.primaryView->url(); openNewTab(url); m_tabBar->setCurrentIndex(m_viewTab.count() - 1); } else if (selectedAction == detachTabAction) { const ViewTab& tab = m_viewTab[index]; - Q_ASSERT(tab.primaryView != 0); + Q_ASSERT(tab.primaryView); const KUrl primaryUrl = tab.primaryView->url(); DolphinMainWindow* window = DolphinApplication::app()->createMainWindow(); window->changeUrl(primaryUrl); - if (tab.secondaryView != 0) { + if (tab.secondaryView) { const KUrl secondaryUrl = tab.secondaryView->url(); - window->toggleSplitView(); + 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); @@ -1218,13 +1221,14 @@ void DolphinMainWindow::slotWriteStateChanged(bool isFolderWritable) void DolphinMainWindow::slotSearchModeChanged(bool enabled) { #ifdef HAVE_NEPOMUK - if (Nepomuk::ResourceManager::instance()->init() != 0) { - // Currently the Filter Panel only works with Nepomuk enabled + 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) || !filterDock->isEnabled()) { + if (!filterDock) { return; } @@ -1371,7 +1375,7 @@ void DolphinMainWindow::init() void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContainer) { - Q_ASSERT(viewContainer != 0); + Q_ASSERT(viewContainer); Q_ASSERT((viewContainer == m_viewTab[m_tabIndex].primaryView) || (viewContainer == m_viewTab[m_tabIndex].secondaryView)); if (m_activeViewContainer == viewContainer) { @@ -1408,7 +1412,7 @@ void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContain void DolphinMainWindow::setupActions() { // setup 'File' menu - m_newFileMenu = new DolphinNewFileMenu(this, this); + m_newFileMenu = new DolphinNewFileMenu(this); KMenu* menu = m_newFileMenu->menu(); menu->setTitle(i18nc("@title:menu Create new folder, file, link, etc.", "Create New")); menu->setIcon(KIcon("document-new")); @@ -1580,11 +1584,23 @@ 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); @@ -1601,11 +1617,13 @@ 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(); @@ -1619,12 +1637,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())); @@ -1639,12 +1659,14 @@ void DolphinMainWindow::setupDockWidgets() terminalPanel, SLOT(setUrl(KUrl))); #endif - // setup "Filter" + // Setup "Filter" #ifdef HAVE_NEPOMUK - QDockWidget* filterDock = new QDockWidget(i18nc("@title:window", "Filter")); + 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); @@ -1669,15 +1691,22 @@ void DolphinMainWindow::setupDockWidgets() #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); @@ -1690,6 +1719,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); @@ -1702,6 +1732,8 @@ void DolphinMainWindow::setupDockWidgets() #ifdef HAVE_NEPOMUK panelsMenu->addAction(filterAction); #endif + panelsMenu->addSeparator(); + panelsMenu->addAction(lockLayoutAction); } void DolphinMainWindow::updateEditActions() @@ -1764,7 +1796,7 @@ void DolphinMainWindow::rememberClosedTab(int index) ClosedTab closedTab; closedTab.primaryUrl = m_viewTab[index].primaryView->url(); - if (m_viewTab[index].secondaryView != 0) { + if (m_viewTab[index].secondaryView) { closedTab.secondaryUrl = m_viewTab[index].secondaryView->url(); closedTab.isSplit = true; } else { @@ -1834,7 +1866,7 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container) void DolphinMainWindow::updateSplitAction() { QAction* splitAction = actionCollection()->action("split_view"); - if (m_viewTab[m_tabIndex].secondaryView != 0) { + if (m_viewTab[m_tabIndex].secondaryView) { if (m_activeViewContainer == m_viewTab[m_tabIndex].secondaryView) { splitAction->setText(i18nc("@action:intoolbar Close right view", "Close")); splitAction->setToolTip(i18nc("@info", "Close right view"));