X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/817f3952e2bed820ea3b50dfdfe91ccb99dcb748..040bdcea237e2576aad744bc4e7b5cadedcc98dc:/src/dolphinmainwindow.cpp diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 75d0a059f..d93ff83e4 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); @@ -278,10 +315,52 @@ void DolphinMainWindow::openNewTab(const KUrl& url) viewTab.primaryView->view()->reload(); m_viewTab.append(viewTab); - + actionCollection()->action("close_tab")->setEnabled(true); } +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]); + m_tabBar->setCurrentIndex(m_viewTab.count() - 1); + } +} + +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() { if (m_viewTab[m_tabIndex].secondaryView == 0) { @@ -363,7 +442,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(); @@ -377,42 +456,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) @@ -542,7 +585,7 @@ void DolphinMainWindow::toggleEditLocation() urlNavigator->setUrlEditable(action->isChecked()); } -void DolphinMainWindow::editLocation() +void DolphinMainWindow::replaceLocation() { KUrlNavigator* navigator = m_activeViewContainer->urlNavigator(); navigator->setUrlEditable(true); @@ -834,15 +877,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()), @@ -863,7 +904,7 @@ void DolphinMainWindow::init() resize(750, 500); } - emit urlChanged(homeUrl); + m_showMenuBar->setChecked(!menuBar()->isHidden()); // workaround for bug #171080 } void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContainer) @@ -974,16 +1015,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()); @@ -1010,13 +1050,37 @@ void DolphinMainWindow::setupActions() 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())); // 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() @@ -1058,8 +1122,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 @@ -1173,8 +1235,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&)));