X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/c167ffbb4f01a71817e7539364eb864dd2cf0a2e..fbd7cb02a511ff869d74aa4e758203a1cd340962:/src/dolphinmainwindow.cpp diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 76330d1d4..22d2f09fc 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -21,7 +21,6 @@ #include "dolphinmainwindow.h" #include "dolphinviewactionhandler.h" -#include "dolphindropcontroller.h" #include @@ -44,6 +43,7 @@ #include "dolphin_generalsettings.h" #include "dolphin_iconsmodesettings.h" +#include "draganddrophelper.h" #include #include @@ -58,6 +58,7 @@ #include #include #include +#include #include #include #include @@ -108,8 +109,14 @@ DolphinMainWindow::DolphinMainWindow(int id) : this, SLOT(slotUndoAvailable(bool))); connect(undoManager, SIGNAL(undoTextChanged(const QString&)), this, SLOT(slotUndoTextChanged(const QString&))); + connect(undoManager, SIGNAL(jobRecordingStarted(CommandType)), + this, SLOT(clearStatusBar())); + connect(undoManager, SIGNAL(jobRecordingFinished(CommandType)), + this, SLOT(showCommand(CommandType))); connect(DolphinSettings::instance().placesModel(), SIGNAL(errorMessage(const QString&)), - this, SLOT(slotHandlePlacesError(const QString&))); + this, SLOT(showErrorMessage(const QString&))); + connect(&DragAndDropHelper::instance(), SIGNAL(errorMessage(const QString&)), + this, SLOT(showErrorMessage(const QString&))); } DolphinMainWindow::~DolphinMainWindow() @@ -132,10 +139,39 @@ void DolphinMainWindow::toggleViews() m_viewTab[m_tabIndex].secondaryView = container; } -void DolphinMainWindow::slotDoingOperation(KIO::FileUndoManager::CommandType commandType) +void DolphinMainWindow::showCommand(CommandType command) { - clearStatusBar(); - m_undoCommandTypes.append(commandType); + DolphinStatusBar* statusBar = m_activeViewContainer->statusBar(); + switch (command) { + case KIO::FileUndoManager::Copy: + statusBar->setMessage(i18nc("@info:status", "Copy operation completed."), + DolphinStatusBar::OperationCompleted); + break; + case KIO::FileUndoManager::Move: + statusBar->setMessage(i18nc("@info:status", "Move operation completed."), + DolphinStatusBar::OperationCompleted); + break; + case KIO::FileUndoManager::Link: + statusBar->setMessage(i18nc("@info:status", "Link operation completed."), + DolphinStatusBar::OperationCompleted); + break; + case KIO::FileUndoManager::Trash: + statusBar->setMessage(i18nc("@info:status", "Move to trash operation completed."), + DolphinStatusBar::OperationCompleted); + break; + case KIO::FileUndoManager::Rename: + statusBar->setMessage(i18nc("@info:status", "Renaming operation completed."), + DolphinStatusBar::OperationCompleted); + break; + + case KIO::FileUndoManager::Mkdir: + statusBar->setMessage(i18nc("@info:status", "Created folder."), + DolphinStatusBar::OperationCompleted); + break; + + default: + break; + } } void DolphinMainWindow::refreshViews() @@ -147,23 +183,17 @@ void DolphinMainWindow::refreshViews() // the secondary view DolphinViewContainer* activeViewContainer = m_activeViewContainer; - m_viewTab[m_tabIndex].primaryView->view()->refresh(); - if (m_viewTab[m_tabIndex].secondaryView != 0) { - m_viewTab[m_tabIndex].secondaryView->view()->refresh(); + const int tabCount = m_viewTab.count(); + for (int i = 0; i < tabCount; ++i) { + m_viewTab[i].primaryView->refresh(); + if (m_viewTab[i].secondaryView != 0) { + m_viewTab[i].secondaryView->refresh(); + } } setActiveViewContainer(activeViewContainer); } -void DolphinMainWindow::dropUrls(const KUrl::List& urls, - const KUrl& destination) -{ - DolphinDropController dropController(this); - connect(&dropController, SIGNAL(doingOperation(KIO::FileUndoManager::CommandType)), - this, SLOT(slotDoingOperation(KIO::FileUndoManager::CommandType))); - dropController.dropUrls(urls, destination); -} - void DolphinMainWindow::pasteIntoFolder() { m_activeViewContainer->view()->pasteIntoFolder(); @@ -171,6 +201,13 @@ void DolphinMainWindow::pasteIntoFolder() void DolphinMainWindow::changeUrl(const KUrl& url) { + if (!KProtocolManager::supportsListing(url)) { + // The URL navigator only checks for validity, not + // if the URL can be listed. An error message is + // shown due to DolphinViewContainer::restoreView(). + return; + } + DolphinViewContainer* view = activeViewContainer(); if (view != 0) { view->setUrl(url); @@ -214,8 +251,10 @@ void DolphinMainWindow::slotSelectionChanged(const KFileItemList& selection) compareFilesAction->setEnabled(false); } +#if defined(QUICK_VIEW) const bool activeViewHasSelection = (activeViewContainer()->view()->selectedItemsCount() > 0); actionCollection()->action("quick_view")->setEnabled(activeViewHasSelection); +#endif m_activeViewContainer->updateStatusBar(); @@ -258,6 +297,13 @@ void DolphinMainWindow::openNewTab() { openNewTab(m_activeViewContainer->url()); m_tabBar->setCurrentIndex(m_viewTab.count() - 1); + + KUrlNavigator* navigator = m_activeViewContainer->urlNavigator(); + if (navigator->isUrlEditable()) { + // if a new tab is opened and the URL is editable, assure that + // the user can edit the URL without manually setting the focus + navigator->setFocus(); + } } void DolphinMainWindow::openNewTab(const KUrl& url) @@ -274,10 +320,63 @@ void DolphinMainWindow::openNewTab(const KUrl& url) ViewTab viewTab; viewTab.splitter = new QSplitter(this); viewTab.primaryView = new DolphinViewContainer(this, viewTab.splitter, url); + viewTab.primaryView->setActive(false); connectViewSignals(viewTab.primaryView); viewTab.primaryView->view()->reload(); m_viewTab.append(viewTab); + + actionCollection()->action("close_tab")->setEnabled(true); + + // provide a split view, if the startup settings are set this way + const GeneralSettings* generalSettings = DolphinSettings::instance().generalSettings(); + if (generalSettings->splitView()) { + const int tabIndex = m_viewTab.count() - 1; + createSecondaryView(tabIndex); + m_viewTab[tabIndex].secondaryView->setActive(true); + m_viewTab[tabIndex].isPrimaryViewActive = false; + } +} + +void DolphinMainWindow::activateNextTab() +{ + if (m_viewTab.count() == 1 || m_tabBar->count() < 2) { + return; + } + + const int tabIndex = (m_tabBar->currentIndex() + 1) % m_tabBar->count(); + m_tabBar->setCurrentIndex(tabIndex); +} + +void DolphinMainWindow::activatePrevTab() +{ + if (m_viewTab.count() == 1 || m_tabBar->count() < 2) { + return; + } + + int tabIndex = m_tabBar->currentIndex() - 1; + if (tabIndex == -1) { + tabIndex = m_tabBar->count() - 1; + } + m_tabBar->setCurrentIndex(tabIndex); +} + +void DolphinMainWindow::openInNewTab() +{ + const KFileItemList list = m_activeViewContainer->view()->selectedItems(); + if ((list.count() == 1) && list[0].isDir()) { + openNewTab(m_activeViewContainer->view()->selectedUrls()[0]); + } +} + +void DolphinMainWindow::openInNewWindow() +{ + const KFileItemList list = m_activeViewContainer->view()->selectedItems(); + if ((list.count() == 1) && list[0].isDir()) { + DolphinMainWindow* window = DolphinApplication::app()->createMainWindow(); + window->changeUrl(m_activeViewContainer->view()->selectedUrls()[0]); + window->show(); + } } void DolphinMainWindow::toggleActiveView() @@ -361,7 +460,7 @@ void DolphinMainWindow::quit() close(); } -void DolphinMainWindow::slotHandlePlacesError(const QString &message) +void DolphinMainWindow::showErrorMessage(const QString& message) { if (!message.isEmpty()) { DolphinStatusBar* statusBar = m_activeViewContainer->statusBar(); @@ -375,42 +474,6 @@ void DolphinMainWindow::slotUndoAvailable(bool available) if (undoAction != 0) { undoAction->setEnabled(available); } - - if (available && (m_undoCommandTypes.count() > 0)) { - const KIO::FileUndoManager::CommandType command = m_undoCommandTypes.takeFirst(); - DolphinStatusBar* statusBar = m_activeViewContainer->statusBar(); - switch (command) { - case KIO::FileUndoManager::Copy: - statusBar->setMessage(i18nc("@info:status", "Copy operation completed."), - DolphinStatusBar::OperationCompleted); - break; - case KIO::FileUndoManager::Move: - statusBar->setMessage(i18nc("@info:status", "Move operation completed."), - DolphinStatusBar::OperationCompleted); - break; - case KIO::FileUndoManager::Link: - statusBar->setMessage(i18nc("@info:status", "Link operation completed."), - DolphinStatusBar::OperationCompleted); - break; - case KIO::FileUndoManager::Trash: - statusBar->setMessage(i18nc("@info:status", "Move to trash operation completed."), - DolphinStatusBar::OperationCompleted); - break; - case KIO::FileUndoManager::Rename: - statusBar->setMessage(i18nc("@info:status", "Renaming operation completed."), - DolphinStatusBar::OperationCompleted); - break; - - case KIO::FileUndoManager::Mkdir: - statusBar->setMessage(i18nc("@info:status", "Created folder."), - DolphinStatusBar::OperationCompleted); - break; - - default: - break; - } - - } } void DolphinMainWindow::slotUndoTextChanged(const QString& text) @@ -478,19 +541,7 @@ void DolphinMainWindow::invertSelection() void DolphinMainWindow::toggleSplitView() { if (m_viewTab[m_tabIndex].secondaryView == 0) { - // create a secondary view - QSplitter* splitter = m_viewTab[m_tabIndex].splitter; - const int newWidth = (m_viewTab[m_tabIndex].primaryView->width() - splitter->handleWidth()) / 2; - - const DolphinView* view = m_viewTab[m_tabIndex].primaryView->view(); - m_viewTab[m_tabIndex].secondaryView = new DolphinViewContainer(this, 0, view->rootUrl()); - connectViewSignals(m_viewTab[m_tabIndex].secondaryView); - splitter->addWidget(m_viewTab[m_tabIndex].secondaryView); - splitter->setSizes(QList() << newWidth << newWidth); - m_viewTab[m_tabIndex].secondaryView->view()->reload(); - m_viewTab[m_tabIndex].secondaryView->setActive(false); - m_viewTab[m_tabIndex].secondaryView->show(); - + createSecondaryView(m_tabIndex); setActiveViewContainer(m_viewTab[m_tabIndex].secondaryView); } else if (m_activeViewContainer == m_viewTab[m_tabIndex].secondaryView) { // remove secondary view @@ -540,7 +591,7 @@ void DolphinMainWindow::toggleEditLocation() urlNavigator->setUrlEditable(action->isChecked()); } -void DolphinMainWindow::editLocation() +void DolphinMainWindow::replaceLocation() { KUrlNavigator* navigator = m_activeViewContainer->urlNavigator(); navigator->setUrlEditable(true); @@ -663,7 +714,12 @@ void DolphinMainWindow::setActiveTab(int index) } // hide current tab content - m_viewTab[m_tabIndex].isPrimaryViewActive = m_viewTab[m_tabIndex].primaryView->isActive(); + ViewTab& hiddenTab = m_viewTab[m_tabIndex]; + hiddenTab.isPrimaryViewActive = hiddenTab.primaryView->isActive(); + hiddenTab.primaryView->setActive(false); + if (hiddenTab.secondaryView != 0) { + hiddenTab.secondaryView->setActive(false); + } QSplitter* splitter = m_viewTab[m_tabIndex].splitter; splitter->hide(); m_centralWidgetLayout->removeWidget(splitter); @@ -723,6 +779,7 @@ void DolphinMainWindow::closeTab(int index) // closing the last tab is not possible if (m_viewTab.count() == 1) { m_tabBar->removeTab(0); + actionCollection()->action("close_tab")->setEnabled(false); } else { m_tabBar->blockSignals(false); } @@ -771,6 +828,11 @@ void DolphinMainWindow::handlePlacesClick(const KUrl& url, Qt::MouseButtons butt } } +void DolphinMainWindow::slotTestCanDecode(const QDragMoveEvent* event, bool& canDecode) +{ + canDecode = KUrl::List::canDecode(event->mimeData()); +} + void DolphinMainWindow::init() { DolphinSettings& settings = DolphinSettings::instance(); @@ -815,6 +877,8 @@ void DolphinMainWindow::init() this, SLOT(openTabContextMenu(int, const QPoint&))); connect(m_tabBar, SIGNAL(newTabRequest()), this, SLOT(openNewTab())); + connect(m_tabBar, SIGNAL(testCanDecode(const QDragMoveEvent*, bool&)), + this, SLOT(slotTestCanDecode(const QDragMoveEvent*, bool&))); m_tabBar->blockSignals(true); // signals get unblocked after at least 2 tabs are open QWidget* centralWidget = new QWidget(this); @@ -824,15 +888,13 @@ void DolphinMainWindow::init() m_centralWidgetLayout->addWidget(m_tabBar); m_centralWidgetLayout->addWidget(m_viewTab[m_tabIndex].splitter); - setCentralWidget(centralWidget); setupDockWidgets(); + emit urlChanged(homeUrl); setupGUI(Keys | Save | Create | ToolBar); - createGUI(); stateChanged("new_file"); - setAutoSaveSettings(); QClipboard* clipboard = QApplication::clipboard(); connect(clipboard, SIGNAL(dataChanged()), @@ -845,12 +907,15 @@ void DolphinMainWindow::init() } updateViewActions(); + QAction* showFilterBarAction = actionCollection()->action("show_filter_bar"); + showFilterBarAction->setChecked(generalSettings->filterBar()); + if (firstRun) { // assure a proper default size if Dolphin runs the first time resize(750, 500); } - emit urlChanged(homeUrl); + m_showMenuBar->setChecked(!menuBar()->isHidden()); // workaround for bug #171080 } void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContainer) @@ -891,7 +956,7 @@ void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContain void DolphinMainWindow::setupActions() { // setup 'File' menu - m_newMenu = new DolphinNewMenu(this); + m_newMenu = new DolphinNewMenu(this, this); KMenu* menu = m_newMenu->menu(); menu->setTitle(i18nc("@title:menu Create new folder, file, link, etc.", "Create New")); menu->setIcon(KIcon("document-new")); @@ -912,6 +977,7 @@ void DolphinMainWindow::setupActions() QAction* closeTab = new QAction(KIcon("tab-close"), i18nc("@action:inmenu File", "Close Tab"), this); closeTab->setShortcut(Qt::CTRL | Qt::Key_W); + closeTab->setEnabled(false); connect(closeTab, SIGNAL(triggered()), this, SLOT(closeTab())); actionCollection()->addAction("close_tab", closeTab); @@ -960,16 +1026,15 @@ void DolphinMainWindow::setupActions() stop->setIcon(KIcon("process-stop")); connect(stop, SIGNAL(triggered()), this, SLOT(stopLoading())); - // TODO: the naming "Show full Location" is currently confusing... KToggleAction* showFullLocation = actionCollection()->add("editable_location"); - showFullLocation->setText(i18nc("@action:inmenu Navigation Bar", "Show Full Location")); + showFullLocation->setText(i18nc("@action:inmenu Navigation Bar", "Editable Location")); showFullLocation->setShortcut(Qt::CTRL | Qt::Key_L); connect(showFullLocation, SIGNAL(triggered()), this, SLOT(toggleEditLocation())); - KAction* editLocation = actionCollection()->addAction("edit_location"); - editLocation->setText(i18nc("@action:inmenu Navigation Bar", "Edit Location")); - editLocation->setShortcut(Qt::Key_F6); - connect(editLocation, SIGNAL(triggered()), this, SLOT(editLocation())); + KAction* replaceLocation = actionCollection()->addAction("replace_location"); + replaceLocation->setText(i18nc("@action:inmenu Navigation Bar", "Replace Location")); + replaceLocation->setShortcut(Qt::Key_F6); + connect(replaceLocation, SIGNAL(triggered()), this, SLOT(replaceLocation())); // setup 'Go' menu KAction* backAction = KStandardAction::back(this, SLOT(goBack()), actionCollection()); @@ -993,16 +1058,43 @@ void DolphinMainWindow::setupActions() compareFiles->setEnabled(false); connect(compareFiles, SIGNAL(triggered()), this, SLOT(compareFiles())); + // disabled Quick View +#if defined(QUICK_VIEW) KAction* quickView = actionCollection()->addAction("quick_view"); quickView->setText(i18nc("@action:inmenu Tools", "Quick View")); quickView->setIcon(KIcon("view-preview")); - quickView->setShortcut(Qt::Key_Space); + quickView->setShortcut(Qt::CTRL + Qt::Key_Return); quickView->setEnabled(false); connect(quickView, SIGNAL(triggered()), this, SLOT(quickView())); +#endif // setup 'Settings' menu m_showMenuBar = KStandardAction::showMenubar(this, SLOT(toggleShowMenuBar()), actionCollection()); KStandardAction::preferences(this, SLOT(editSettings()), actionCollection()); + + // not in menu actions + KAction* activateNextTab = actionCollection()->addAction("activatenexttab"); + activateNextTab->setText(i18nc("@action:inmenu", "Activate Next Tab")); + connect(activateNextTab, SIGNAL(triggered()), SLOT(activateNextTab())); + activateNextTab->setShortcuts(QApplication::isRightToLeft() ? KStandardShortcut::tabPrev() : + KStandardShortcut::tabNext()); + + KAction* activatePrevTab = actionCollection()->addAction("activateprevtab"); + activatePrevTab->setText(i18nc("@action:inmenu", "Activate Previous Tab")); + connect(activatePrevTab, SIGNAL(triggered()), SLOT(activatePrevTab())); + activatePrevTab->setShortcuts(QApplication::isRightToLeft() ? KStandardShortcut::tabNext() : + KStandardShortcut::tabPrev()); + + // for context menu + KAction* openInNewTab = actionCollection()->addAction("open_in_new_tab"); + openInNewTab->setText(i18nc("@action:inmenu", "Open in New Tab")); + openInNewTab->setIcon(KIcon("tab-new")); + connect(openInNewTab, SIGNAL(triggered()), this, SLOT(openInNewTab())); + + KAction* openInNewWindow = actionCollection()->addAction("open_in_new_window"); + openInNewWindow->setText(i18nc("@action:inmenu", "Open in New Window")); + openInNewWindow->setIcon(KIcon("window-new")); + connect(openInNewWindow, SIGNAL(triggered()), this, SLOT(openInNewWindow())); } void DolphinMainWindow::setupDockWidgets() @@ -1044,8 +1136,6 @@ void DolphinMainWindow::setupDockWidgets() this, SLOT(handlePlacesClick(KUrl, Qt::MouseButtons))); connect(treeWidget, SIGNAL(changeSelection(KFileItemList)), this, SLOT(changeSelection(KFileItemList))); - connect(treeWidget, SIGNAL(urlsDropped(KUrl::List, KUrl)), - this, SLOT(dropUrls(KUrl::List, KUrl))); // setup "Terminal" #ifndef Q_OS_WIN @@ -1159,8 +1249,6 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container) this, SLOT(slotRequestItemInfo(KFileItem))); connect(view, SIGNAL(activated()), this, SLOT(toggleActiveView())); - connect(view, SIGNAL(doingOperation(KIO::FileUndoManager::CommandType)), - this, SLOT(slotDoingOperation(KIO::FileUndoManager::CommandType))); connect(view, SIGNAL(tabRequested(const KUrl&)), this, SLOT(openNewTab(const KUrl&))); @@ -1217,6 +1305,21 @@ bool DolphinMainWindow::isKompareInstalled() const return installed; } +void DolphinMainWindow::createSecondaryView(int tabIndex) +{ + QSplitter* splitter = m_viewTab[tabIndex].splitter; + const int newWidth = (m_viewTab[tabIndex].primaryView->width() - splitter->handleWidth()) / 2; + + const DolphinView* view = m_viewTab[tabIndex].primaryView->view(); + m_viewTab[tabIndex].secondaryView = new DolphinViewContainer(this, 0, view->rootUrl()); + splitter->addWidget(m_viewTab[tabIndex].secondaryView); + splitter->setSizes(QList() << newWidth << newWidth); + connectViewSignals(m_viewTab[tabIndex].secondaryView); + m_viewTab[tabIndex].secondaryView->view()->reload(); + m_viewTab[tabIndex].secondaryView->setActive(false); + m_viewTab[tabIndex].secondaryView->show(); +} + DolphinMainWindow::UndoUiInterface::UndoUiInterface() : KIO::FileUndoManager::UiInterface() {