X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/d324e790d62c8a341abd06e845f8fe8d64aa8ef3..f18e6e6bb81e0466c16150ca6c74624f148e6071:/src/dolphinmainwindow.cpp diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index ebc8dc268..7ee5fa035 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -31,7 +31,6 @@ #include "dolphinapplication.h" #include "dolphinnewmenu.h" #include "search/dolphinsearchbox.h" -#include "search/dolphinsearchoptionsconfigurator.h" #include "settings/dolphinsettings.h" #include "settings/dolphinsettingsdialog.h" #include "dolphinviewcontainer.h" @@ -151,6 +150,68 @@ DolphinMainWindow::~DolphinMainWindow() DolphinApplication::app()->removeMainWindow(this); } +void DolphinMainWindow::openDirectories(const QList& dirs) +{ + if (dirs.isEmpty()) { + return; + } + + const int oldOpenTabsCount = m_viewTab.count(); + + const GeneralSettings* generalSettings = DolphinSettings::instance().generalSettings(); + const bool hasSplitView = generalSettings->splitView(); + + // Open each directory inside a new tab. If the "split view" option has been enabled, + // always show two directories within one tab. + QList::const_iterator it = dirs.begin(); + while (it != dirs.end()) { + openNewTab(*it); + ++it; + + if (hasSplitView && (it != dirs.end())) { + const int tabIndex = m_viewTab.count() - 1; + m_viewTab[tabIndex].secondaryView->setUrl(*it); + ++it; + } + } + + // remove the previously opened tabs + for (int i = 0; i < oldOpenTabsCount; ++i) { + closeTab(0); + } +} + +void DolphinMainWindow::openFiles(const QList& files) +{ + if (files.isEmpty()) { + return; + } + + // Get all distinct directories from 'files' and open a tab + // for each directory. If the "split view" option is enabled, two + // directories are shown inside one tab (see openDirectories()). + QList dirs; + foreach (const KUrl& url, files) { + const KUrl dir(url.directory()); + if (!dirs.contains(dir)) { + dirs.append(dir); + } + } + + openDirectories(dirs); + + // Select the files. Although the files can be split between several + // tabs, there is no need to split 'files' accordingly, as + // the DolphinView will just ignore invalid selections. + 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) { + m_viewTab[i].secondaryView->view()->markUrlsAsSelected(files); + } + } +} + void DolphinMainWindow::toggleViews() { if (m_viewTab[m_tabIndex].primaryView == 0) { @@ -251,11 +312,6 @@ void DolphinMainWindow::changeUrl(const KUrl& url) } } -void DolphinMainWindow::changeSelection(const KFileItemList& selection) -{ - activeViewContainer()->view()->changeSelection(selection); -} - void DolphinMainWindow::slotEditableStateChanged(bool editable) { KToggleAction* editableLocationAction = @@ -341,15 +397,19 @@ void DolphinMainWindow::openNewTab() void DolphinMainWindow::openNewTab(const KUrl& url) { - const KIcon icon = KIcon(KMimeType::iconNameForUrl(m_activeViewContainer->url())); + QWidget* focusWidget = QApplication::focusWidget(); + if (m_viewTab.count() == 1) { // Only one view is open currently and hence no tab is shown at // all. Before creating a tab for 'url', provide a tab for the current URL. - m_tabBar->addTab(icon, squeezedText(tabName(m_activeViewContainer->url()))); + const KUrl currentUrl = m_activeViewContainer->url(); + m_tabBar->addTab(KIcon(KMimeType::iconNameForUrl(currentUrl)), + squeezedText(tabName(currentUrl))); m_tabBar->blockSignals(false); } - m_tabBar->addTab(icon, squeezedText(tabName(url))); + m_tabBar->addTab(KIcon(KMimeType::iconNameForUrl(url)), + squeezedText(tabName(url))); ViewTab viewTab; viewTab.splitter = new QSplitter(this); @@ -371,6 +431,12 @@ void DolphinMainWindow::openNewTab(const KUrl& url) m_viewTab[tabIndex].secondaryView->setActive(true); m_viewTab[tabIndex].isPrimaryViewActive = false; } + + if (focusWidget != 0) { + // 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(); + } } void DolphinMainWindow::activateNextTab() @@ -429,6 +495,14 @@ void DolphinMainWindow::toggleActiveView() setActiveViewContainer(m_activeViewContainer == right ? left : right); } +void DolphinMainWindow::showEvent(QShowEvent* event) +{ + KXmlGuiWindow::showEvent(event); + if (!event->spontaneous()) { + m_activeViewContainer->view()->setFocus(); + } +} + void DolphinMainWindow::closeEvent(QCloseEvent* event) { DolphinSettings& settings = DolphinSettings::instance(); @@ -1011,8 +1085,8 @@ void DolphinMainWindow::slotTestCanDecode(const QDragMoveEvent* event, bool& can void DolphinMainWindow::searchItems() { #ifdef HAVE_NEPOMUK - const KUrl nepomukUrl = m_searchOptionsConfigurator->nepomukUrl(); - m_activeViewContainer->setUrl(nepomukUrl); + const KUrl nepomukSearchUrl = m_searchOptionsConfigurator->nepomukSearchUrl(); + m_activeViewContainer->setUrl(nepomukSearchUrl); #endif } @@ -1074,6 +1148,7 @@ void DolphinMainWindow::init() m_searchOptionsConfigurator->hide(); connect(m_searchOptionsConfigurator, SIGNAL(searchOptionsChanged()), this, SLOT(searchItems())); + connect(this, SIGNAL(urlChanged(KUrl)), m_searchOptionsConfigurator, SLOT(setDirectory(KUrl))); #endif m_tabBar = new KTabBar(this); @@ -1373,11 +1448,12 @@ void DolphinMainWindow::setupDockWidgets() connect(infoPanel, SIGNAL(urlActivated(KUrl)), this, SLOT(handleUrl(KUrl))); infoDock->setWidget(infoPanel); - QAction* infoAction = infoDock->toggleViewAction(); + KAction* infoAction = new KAction(this); infoAction->setText(i18nc("@title:window", "Information")); infoAction->setShortcut(Qt::Key_F11); infoAction->setIcon(KIcon("dialog-information")); - actionCollection()->addAction("show_info_panel", infoDock->toggleViewAction()); + actionCollection()->addAction("show_info_panel", infoAction); + connect(infoAction, SIGNAL(triggered()), infoDock->toggleViewAction(), SLOT(trigger())); addDockWidget(Qt::RightDockWidgetArea, infoDock); connect(this, SIGNAL(urlChanged(KUrl)), @@ -1394,19 +1470,18 @@ void DolphinMainWindow::setupDockWidgets() FoldersPanel* foldersPanel = new FoldersPanel(foldersDock); foldersDock->setWidget(foldersPanel); - QAction* foldersAction = foldersDock->toggleViewAction(); + KAction* foldersAction = new KAction(this); foldersAction->setText(i18nc("@title:window", "Folders")); foldersAction->setShortcut(Qt::Key_F7); foldersAction->setIcon(KIcon("folder")); - actionCollection()->addAction("show_folders_panel", foldersDock->toggleViewAction()); + actionCollection()->addAction("show_folders_panel", foldersAction); + connect(foldersAction, SIGNAL(triggered()), foldersDock->toggleViewAction(), SLOT(trigger())); addDockWidget(Qt::LeftDockWidgetArea, foldersDock); connect(this, SIGNAL(urlChanged(KUrl)), foldersPanel, SLOT(setUrl(KUrl))); connect(foldersPanel, SIGNAL(changeUrl(KUrl, Qt::MouseButtons)), this, SLOT(handlePlacesClick(KUrl, Qt::MouseButtons))); - connect(foldersPanel, SIGNAL(changeSelection(KFileItemList)), - this, SLOT(changeSelection(KFileItemList))); // setup "Terminal" #ifndef Q_OS_WIN @@ -1418,11 +1493,12 @@ void DolphinMainWindow::setupDockWidgets() connect(terminalPanel, SIGNAL(hideTerminalPanel()), terminalDock, SLOT(hide())); - QAction* terminalAction = terminalDock->toggleViewAction(); + KAction* terminalAction = new KAction(this); terminalAction->setText(i18nc("@title:window Shell terminal", "Terminal")); terminalAction->setShortcut(Qt::Key_F4); terminalAction->setIcon(KIcon("utilities-terminal")); - actionCollection()->addAction("show_terminal_panel", terminalDock->toggleViewAction()); + actionCollection()->addAction("show_terminal_panel", terminalAction); + connect(terminalAction, SIGNAL(triggered()), terminalDock->toggleViewAction(), SLOT(trigger())); addDockWidget(Qt::BottomDockWidgetArea, terminalDock); connect(this, SIGNAL(urlChanged(KUrl)), @@ -1437,6 +1513,7 @@ void DolphinMainWindow::setupDockWidgets() #endif } + // setup "Places" QDockWidget* placesDock = new QDockWidget(i18nc("@title:window", "Places")); placesDock->setObjectName("placesDock"); placesDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); @@ -1446,11 +1523,12 @@ void DolphinMainWindow::setupDockWidgets() placesPanel->setModel(DolphinSettings::instance().placesModel()); placesPanel->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - QAction* placesAction = placesDock->toggleViewAction(); + KAction* placesAction = new KAction(this); placesAction->setText(i18nc("@title:window", "Places")); placesAction->setShortcut(Qt::Key_F9); placesAction->setIcon(KIcon("bookmarks")); - actionCollection()->addAction("show_places_panel", placesDock->toggleViewAction()); + actionCollection()->addAction("show_places_panel", placesAction); + connect(placesAction, SIGNAL(triggered()), placesDock->toggleViewAction(), SLOT(trigger())); addDockWidget(Qt::LeftDockWidgetArea, placesDock); connect(placesPanel, SIGNAL(urlChanged(KUrl, Qt::MouseButtons)),