X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/bd7b4faa4aa54e8bbfeee345449cd9d29c8c16c3..39f89141b06c:/src/dolphinmainwindow.cpp diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 5f44249b7..0913503d2 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -20,27 +20,24 @@ ***************************************************************************/ #include "dolphinmainwindow.h" -#include "dolphinviewactionhandler.h" -#include "dolphinremoteencoding.h" #include -#ifdef HAVE_NEPOMUK -#include "search/dolphinsearchoptionsconfigurator.h" -#endif #include "dolphinapplication.h" #include "dolphincontextmenu.h" -#include "dolphinnewmenu.h" -#include "search/dolphinsearchbox.h" -#include "settings/dolphinsettings.h" -#include "settings/dolphinsettingsdialog.h" +#include "dolphinnewfilemenu.h" #include "dolphinviewcontainer.h" +#include "mainwindowadaptor.h" #include "panels/folders/folderspanel.h" #include "panels/places/placespanel.h" #include "panels/information/informationpanel.h" -#include "mainwindowadaptor.h" +#include "settings/dolphinsettings.h" +#include "settings/dolphinsettingsdialog.h" #include "statusbar/dolphinstatusbar.h" -#include "viewproperties.h" +#include "views/dolphinviewactionhandler.h" +#include "views/dolphinremoteencoding.h" +#include "views/draganddrophelper.h" +#include "views/viewproperties.h" #ifndef Q_OS_WIN #include "panels/terminal/terminalpanel.h" @@ -48,7 +45,6 @@ #include "dolphin_generalsettings.h" #include "dolphin_iconsmodesettings.h" -#include "draganddrophelper.h" #include #include @@ -107,24 +103,24 @@ Q_DECLARE_METATYPE(ClosedTab) DolphinMainWindow::DolphinMainWindow(int id) : KXmlGuiWindow(0), - m_newMenu(0), + m_newFileMenu(0), m_showMenuBar(0), m_tabBar(0), m_activeViewContainer(0), m_centralWidgetLayout(0), - m_searchBox(0), -#ifdef HAVE_NEPOMUK - m_searchOptionsConfigurator(0), -#endif m_id(id), m_tabIndex(0), m_viewTab(), m_actionHandler(0), m_remoteEncoding(0), m_settingsDialog(0), - m_captionStatJob(0), m_lastHandleUrlStatJob(0) { + // Workaround for a X11-issue in combination with KModifierInfo + // (see DolphinContextMenu::initializeModifierKeyInfo() for + // more information): + DolphinContextMenu::initializeModifierKeyInfo(); + setObjectName("Dolphin#"); m_viewTab.append(ViewTab()); @@ -343,15 +339,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); @@ -475,17 +462,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(); } } @@ -536,7 +533,6 @@ void DolphinMainWindow::closeEvent(QCloseEvent* event) dialog->setCaption(i18nc("@title:window", "Confirmation")); dialog->setButtons(KDialog::Yes | KDialog::No | KDialog::Cancel); dialog->setModal(true); - dialog->showButtonSeparator(true); dialog->setButtonGuiItem(KDialog::Yes, KStandardGuiItem::quit()); dialog->setButtonGuiItem(KDialog::No, KGuiItem(i18n("C&lose Current Tab"), KIcon("tab-close"))); dialog->setButtonGuiItem(KDialog::Cancel, KStandardGuiItem::cancel()); @@ -639,16 +635,16 @@ void DolphinMainWindow::readProperties(const KConfigGroup& group) void DolphinMainWindow::updateNewMenu() { - m_newMenu->setViewShowsHiddenFiles(activeViewContainer()->view()->showHiddenFiles()); - m_newMenu->checkUpToDate(); - m_newMenu->setPopupFiles(activeViewContainer()->url()); + m_newFileMenu->setViewShowsHiddenFiles(activeViewContainer()->view()->showHiddenFiles()); + m_newFileMenu->checkUpToDate(); + m_newFileMenu->setPopupFiles(activeViewContainer()->url()); } void DolphinMainWindow::createDirectory() { - m_newMenu->setViewShowsHiddenFiles(activeViewContainer()->view()->showHiddenFiles()); - m_newMenu->setPopupFiles(activeViewContainer()->url()); - m_newMenu->createDirectory(); + m_newFileMenu->setViewShowsHiddenFiles(activeViewContainer()->view()->showHiddenFiles()); + m_newFileMenu->setPopupFiles(activeViewContainer()->url()); + m_newFileMenu->createDirectory(); } void DolphinMainWindow::quit() @@ -731,6 +727,11 @@ void DolphinMainWindow::paste() m_activeViewContainer->view()->paste(); } +void DolphinMainWindow::find() +{ + m_activeViewContainer->setSearchModeEnabled(true); +} + void DolphinMainWindow::updatePasteAction() { QAction* pasteAction = actionCollection()->action(KStandardAction::name(KStandardAction::Paste)); @@ -800,6 +801,17 @@ 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) @@ -831,7 +843,15 @@ void DolphinMainWindow::replaceLocation() void DolphinMainWindow::goBack() { clearStatusBar(); - m_activeViewContainer->urlNavigator()->goBack(); + + 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(); + } } void DolphinMainWindow::goForward() @@ -892,30 +912,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; } @@ -959,7 +980,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(); @@ -1123,21 +1144,6 @@ void DolphinMainWindow::slotTestCanDecode(const QDragMoveEvent* event, bool& can canDecode = KUrl::List::canDecode(event->mimeData()); } -void DolphinMainWindow::searchItems() -{ -#ifdef HAVE_NEPOMUK - const KUrl nepomukSearchUrl = m_searchOptionsConfigurator->nepomukSearchUrl(); - m_activeViewContainer->setUrl(nepomukSearchUrl); -#endif -} - -void DolphinMainWindow::showSearchOptions() -{ -#ifdef HAVE_NEPOMUK - m_searchOptionsConfigurator->show(); -#endif -} - void DolphinMainWindow::handleUrl(const KUrl& url) { delete m_lastHandleUrlStatJob; @@ -1178,17 +1184,9 @@ void DolphinMainWindow::tabDropEvent(int tab, QDropEvent* event) } } -void DolphinMainWindow::slotCaptionStatFinished(KJob* job) -{ - m_captionStatJob = 0; - const KIO::UDSEntry entry = static_cast(job)->statResult(); - const QString name = entry.stringValue(KIO::UDSEntry::UDS_DISPLAY_NAME); - setCaption(name); -} - void DolphinMainWindow::slotWriteStateChanged(bool isFolderWritable) { - newMenu()->setEnabled(isFolderWritable); + newFileMenu()->setEnabled(isFolderWritable); } void DolphinMainWindow::openContextMenu(const KFileItem& item, @@ -1197,7 +1195,24 @@ void DolphinMainWindow::openContextMenu(const KFileItem& item, { DolphinContextMenu contextMenu(this, item, url); contextMenu.setCustomActions(customActions); - contextMenu.open(); + 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; + } } void DolphinMainWindow::init() @@ -1219,7 +1234,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())); @@ -1239,14 +1254,6 @@ void DolphinMainWindow::init() connect(this, SIGNAL(urlChanged(const KUrl&)), m_remoteEncoding, SLOT(slotAboutToOpenUrl())); -#ifdef HAVE_NEPOMUK - m_searchOptionsConfigurator = new DolphinSearchOptionsConfigurator(this); - 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); m_tabBar->setMovable(true); m_tabBar->setTabsClosable(true); @@ -1260,8 +1267,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)), @@ -1275,9 +1280,6 @@ void DolphinMainWindow::init() m_centralWidgetLayout = new QVBoxLayout(centralWidget); m_centralWidgetLayout->setSpacing(0); m_centralWidgetLayout->setMargin(0); -#ifdef HAVE_NEPOMUK - m_centralWidgetLayout->addWidget(m_searchOptionsConfigurator); -#endif m_centralWidgetLayout->addWidget(m_tabBar); m_centralWidgetLayout->addWidget(m_viewTab[m_tabIndex].splitter, 1); @@ -1286,28 +1288,18 @@ void DolphinMainWindow::init() emit urlChanged(homeUrl); setupGUI(Keys | Save | Create | ToolBar); - - m_searchBox->setParent(toolBar("searchToolBar")); - m_searchBox->show(); - connect(m_searchBox, SIGNAL(requestSearchOptions()), - this, SLOT(showSearchOptions())); -#ifdef HAVE_NEPOMUK - connect(m_searchBox, SIGNAL(searchTextChanged(QString)), - m_searchOptionsConfigurator, SLOT(setCustomSearchQuery(QString))); -#endif - stateChanged("new_file"); QClipboard* clipboard = QApplication::clipboard(); connect(clipboard, SIGNAL(dataChanged()), this, SLOT(updatePasteAction())); - updatePasteAction(); - updateGoActions(); if (generalSettings->splitView()) { toggleSplitView(); } + updateEditActions(); updateViewActions(); + updateGoActions(); QAction* showFilterBarAction = actionCollection()->action("show_filter_bar"); showFilterBarAction->setChecked(generalSettings->filterBar()); @@ -1346,9 +1338,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))); } @@ -1359,8 +1351,8 @@ void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContain void DolphinMainWindow::setupActions() { // setup 'File' menu - m_newMenu = new DolphinNewMenu(this, this); - KMenu* menu = m_newMenu->menu(); + m_newFileMenu = new DolphinNewFileMenu(this, this); + KMenu* menu = m_newFileMenu->menu(); menu->setTitle(i18nc("@title:menu Create new folder, file, link, etc.", "Create New")); menu->setIcon(KIcon("document-new")); connect(menu, SIGNAL(aboutToShow()), @@ -1405,6 +1397,8 @@ void DolphinMainWindow::setupActions() // due to the long text, the text "Paste" is used: paste->setIconText(i18nc("@action:inmenu Edit", "Paste")); + KStandardAction::find(this, SLOT(find()), actionCollection()); + KAction* selectAll = actionCollection()->addAction("select_all"); selectAll->setText(i18nc("@action:inmenu Edit", "Select All")); selectAll->setShortcut(Qt::CTRL + Qt::Key_A); @@ -1474,11 +1468,6 @@ void DolphinMainWindow::setupActions() KStandardAction::home(this, SLOT(goHome()), actionCollection()); // setup 'Tools' menu - KToggleAction* showSearchBar = actionCollection()->add("show_search_bar"); - showSearchBar->setText(i18nc("@action:inmenu Tools", "Show Search Bar")); - showSearchBar->setShortcut(Qt::CTRL | Qt::Key_S); - connect(showSearchBar, SIGNAL(triggered(bool)), this, SLOT(toggleFilterBarVisibility(bool))); - KToggleAction* showFilterBar = actionCollection()->add("show_filter_bar"); showFilterBar->setText(i18nc("@action:inmenu Tools", "Show Filter Bar")); showFilterBar->setIcon(KIcon("view-filter")); @@ -1530,16 +1519,6 @@ void DolphinMainWindow::setupActions() openInNewWindow->setText(i18nc("@action:inmenu", "Open in New Window")); openInNewWindow->setIcon(KIcon("window-new")); connect(openInNewWindow, SIGNAL(triggered()), this, SLOT(openInNewWindow())); - - // 'Search' toolbar - m_searchBox = new DolphinSearchBox(this); - connect(m_searchBox, SIGNAL(search(QString)), this, SLOT(searchItems())); - - KAction* search = new KAction(this); - actionCollection()->addAction("search_bar", search); - search->setText(i18nc("@action:inmenu", "Search Bar")); - search->setDefaultWidget(m_searchBox); - search->setShortcutConfigurable(false); } void DolphinMainWindow::setupDockWidgets() @@ -1602,6 +1581,7 @@ void DolphinMainWindow::setupDockWidgets() const bool firstRun = DolphinSettings::instance().generalSettings()->firstRun(); if (firstRun) { + infoDock->hide(); foldersDock->hide(); #ifndef Q_OS_WIN terminalDock->hide(); @@ -1628,7 +1608,7 @@ void DolphinMainWindow::setupDockWidgets() connect(this, SIGNAL(urlChanged(KUrl)), placesPanel, SLOT(setUrl(KUrl))); - KActionMenu* panelsMenu = new KActionMenu(i18nc("@action:inmenu File", "Panels"), this); + KActionMenu* panelsMenu = new KActionMenu(i18nc("@action:inmenu View", "Panels"), this); actionCollection()->addAction("panels", panelsMenu); panelsMenu->setDelayed(false); panelsMenu->addAction(placesAction); @@ -1683,7 +1663,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); } @@ -1748,6 +1728,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&)), @@ -1833,26 +1817,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