]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinmainwindow.cpp
Move the pasteIntoFolder() method from the contextmenu into DolphinView. This allows...
[dolphin.git] / src / dolphinmainwindow.cpp
index c1d6cef39b583d0f1e90ac1f5388a3448524e40d..126591b6c9e486616b5d2eeb87a491a6add4873f 100644 (file)
@@ -26,6 +26,7 @@
 #include <config-nepomuk.h>
 
 #include "dolphinapplication.h"
+#include "dolphinfileplacesview.h"
 #include "dolphinnewmenu.h"
 #include "dolphinsettings.h"
 #include "dolphinsettingsdialog.h"
 #include "infosidebarpage.h"
 #include "metadatawidget.h"
 #include "mainwindowadaptor.h"
-#include "terminalsidebarpage.h"
 #include "treeviewsidebarpage.h"
-#include "kurlnavigator.h"
 #include "viewpropertiesdialog.h"
 #include "viewproperties.h"
-#include "kfileplacesmodel.h"
-#include "kfileplacesview.h"
+
+#ifndef Q_OS_WIN
+#include "terminalsidebarpage.h"
+#endif
 
 #include "dolphin_generalsettings.h"
 #include "dolphin_iconsmodesettings.h"
@@ -51,6 +52,7 @@
 #include <kdesktopfile.h>
 #include <kdeversion.h>
 #include <kfiledialog.h>
+#include <kfileplacesmodel.h>
 #include <kglobal.h>
 #include <kicon.h>
 #include <kiconloader.h>
@@ -60,6 +62,7 @@
 #include <kmenu.h>
 #include <kmenubar.h>
 #include <kmessagebox.h>
+#include <kurlnavigator.h>
 #include <konqmimedata.h>
 #include <kpropertiesdialog.h>
 #include <kprotocolinfo.h>
@@ -84,9 +87,11 @@ DolphinMainWindow::DolphinMainWindow(int id) :
     m_showMenuBar(0),
     m_splitter(0),
     m_activeViewContainer(0),
-    m_id(id)
+    m_id(id),
+    m_viewContainer(),
+    m_actionHandler(0)
 {
-    setObjectName("Dolphin");
+    setObjectName("Dolphin#");
     m_viewContainer[PrimaryView] = 0;
     m_viewContainer[SecondaryView] = 0;
 
@@ -159,6 +164,11 @@ void DolphinMainWindow::dropUrls(const KUrl::List& urls,
     dropController.dropUrls(urls, destination);
 }
 
+void DolphinMainWindow::pasteIntoFolder()
+{
+    m_activeViewContainer->view()->pasteIntoFolder();
+}
+
 void DolphinMainWindow::changeUrl(const KUrl& url)
 {
     DolphinViewContainer* view = activeViewContainer();
@@ -177,51 +187,11 @@ void DolphinMainWindow::changeSelection(const KFileItemList& selection)
     activeViewContainer()->view()->changeSelection(selection);
 }
 
-void DolphinMainWindow::slotViewModeChanged()
+void DolphinMainWindow::slotEditableStateChanged(bool editable)
 {
-    updateViewActions();
-}
-
-void DolphinMainWindow::slotSortingChanged(DolphinView::Sorting sorting)
-{
-    QAction* action = 0;
-    switch (sorting) {
-    case DolphinView::SortByName:
-        action = actionCollection()->action("sort_by_name");
-        break;
-    case DolphinView::SortBySize:
-        action = actionCollection()->action("sort_by_size");
-        break;
-    case DolphinView::SortByDate:
-        action = actionCollection()->action("sort_by_date");
-        break;
-    case DolphinView::SortByPermissions:
-        action = actionCollection()->action("sort_by_permissions");
-        break;
-    case DolphinView::SortByOwner:
-        action = actionCollection()->action("sort_by_owner");
-        break;
-    case DolphinView::SortByGroup:
-        action = actionCollection()->action("sort_by_group");
-        break;
-    case DolphinView::SortByType:
-        action = actionCollection()->action("sort_by_type");
-        break;
-#ifdef HAVE_NEPOMUK
-    case DolphinView::SortByRating:
-        action = actionCollection()->action("sort_by_rating");
-        break;
-    case DolphinView::SortByTags:
-        action = actionCollection()->action("sort_by_tags");
-        break;
-#endif
-    default:
-        break;
-    }
-
-    if (action != 0) {
-        action->setChecked(true);
-    }
+    KToggleAction* editableLocationAction =
+        static_cast<KToggleAction*>(actionCollection()->action("editable_location"));
+    editableLocationAction->setChecked(editable);
 }
 
 void DolphinMainWindow::slotSelectionChanged(const KFileItemList& selection)
@@ -252,9 +222,20 @@ void DolphinMainWindow::slotRequestItemInfo(const KFileItem& item)
     emit requestItemInfo(item);
 }
 
-void DolphinMainWindow::slotHistoryChanged()
+void DolphinMainWindow::updateHistory()
 {
-    updateHistory();
+    const KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator();
+    const int index = urlNavigator->historyIndex();
+
+    QAction* backAction = actionCollection()->action("go_back");
+    if (backAction != 0) {
+        backAction->setEnabled(index < urlNavigator->historySize() - 1);
+    }
+
+    QAction* forwardAction = actionCollection()->action("go_forward");
+    if (forwardAction != 0) {
+        forwardAction->setEnabled(index > 0);
+    }
 }
 
 void DolphinMainWindow::updateFilterBarAction(bool show)
@@ -368,7 +349,7 @@ void DolphinMainWindow::slotHandlePlacesError(const QString &message)
 
 void DolphinMainWindow::slotUndoAvailable(bool available)
 {
-    QAction* undoAction = actionCollection()->action(KStandardAction::stdName(KStandardAction::Undo));
+    QAction* undoAction = actionCollection()->action(KStandardAction::name(KStandardAction::Undo));
     if (undoAction != 0) {
         undoAction->setEnabled(available);
     }
@@ -412,7 +393,7 @@ void DolphinMainWindow::slotUndoAvailable(bool available)
 
 void DolphinMainWindow::slotUndoTextChanged(const QString& text)
 {
-    QAction* undoAction = actionCollection()->action(KStandardAction::stdName(KStandardAction::Undo));
+    QAction* undoAction = actionCollection()->action(KStandardAction::name(KStandardAction::Undo));
     if (undoAction != 0) {
         undoAction->setText(text);
     }
@@ -441,7 +422,7 @@ void DolphinMainWindow::paste()
 
 void DolphinMainWindow::updatePasteAction()
 {
-    QAction* pasteAction = actionCollection()->action(KStandardAction::stdName(KStandardAction::Paste));
+    QAction* pasteAction = actionCollection()->action(KStandardAction::name(KStandardAction::Paste));
     if (pasteAction == 0) {
         return;
     }
@@ -475,61 +456,6 @@ void DolphinMainWindow::invertSelection()
     m_activeViewContainer->view()->invertSelection();
 }
 
-void DolphinMainWindow::setViewMode(QAction* action)
-{
-    const DolphinView::Mode mode = action->data().value<DolphinView::Mode>();
-    m_activeViewContainer->view()->setMode(mode);
-}
-
-void DolphinMainWindow::sortByName()
-{
-    m_activeViewContainer->view()->setSorting(DolphinView::SortByName);
-}
-
-void DolphinMainWindow::sortBySize()
-{
-    m_activeViewContainer->view()->setSorting(DolphinView::SortBySize);
-}
-
-void DolphinMainWindow::sortByDate()
-{
-    m_activeViewContainer->view()->setSorting(DolphinView::SortByDate);
-}
-
-void DolphinMainWindow::sortByPermissions()
-{
-    m_activeViewContainer->view()->setSorting(DolphinView::SortByPermissions);
-}
-
-void DolphinMainWindow::sortByOwner()
-{
-    m_activeViewContainer->view()->setSorting(DolphinView::SortByOwner);
-}
-
-void DolphinMainWindow::sortByGroup()
-{
-    m_activeViewContainer->view()->setSorting(DolphinView::SortByGroup);
-}
-
-void DolphinMainWindow::sortByType()
-{
-    m_activeViewContainer->view()->setSorting(DolphinView::SortByType);
-}
-
-void DolphinMainWindow::sortByRating()
-{
-#ifdef HAVE_NEPOMUK
-    m_activeViewContainer->view()->setSorting(DolphinView::SortByRating);
-#endif
-}
-
-void DolphinMainWindow::sortByTags()
-{
-#ifdef HAVE_NEPOMUK
-    m_activeViewContainer->view()->setSorting(DolphinView::SortByTags);
-#endif
-}
-
 void DolphinMainWindow::toggleSplitView()
 {
     if (m_viewContainer[SecondaryView] == 0) {
@@ -562,7 +488,6 @@ void DolphinMainWindow::toggleSplitView()
 
     setActiveViewContainer(m_viewContainer[PrimaryView]);
     updateViewActions();
-    emit activeViewChanged(); // TODO unused; remove?
 }
 
 void DolphinMainWindow::reloadView()
@@ -594,6 +519,11 @@ void DolphinMainWindow::editLocation()
     KUrlNavigator* navigator = m_activeViewContainer->urlNavigator();
     navigator->setUrlEditable(true);
     navigator->setFocus();
+
+    // select the whole text of the combo box editor
+    QLineEdit* lineEdit = navigator->editor()->lineEdit();
+    const QString text = lineEdit->text();
+    lineEdit->setSelection(0, text.length());
 }
 
 void DolphinMainWindow::adjustViewProperties()
@@ -701,9 +631,11 @@ void DolphinMainWindow::editSettings()
 
 void DolphinMainWindow::init()
 {
+    DolphinSettings& settings = DolphinSettings::instance();
+
     // Check whether Dolphin runs the first time. If yes then
     // a proper default window size is given at the end of DolphinMainWindow::init().
-    GeneralSettings* generalSettings = DolphinSettings::instance().generalSettings();
+    GeneralSettings* generalSettings = settings.generalSettings();
     const bool firstRun = generalSettings->firstRun();
     if (firstRun) {
         generalSettings->setViewPropsTimestamp(QDateTime::currentDateTime());
@@ -713,11 +645,9 @@ void DolphinMainWindow::init()
 
     m_splitter = new QSplitter(this);
 
-    DolphinSettings& settings = DolphinSettings::instance();
-
     setupActions();
 
-    const KUrl& homeUrl = settings.generalSettings()->homeUrl();
+    const KUrl& homeUrl = generalSettings->homeUrl();
     setCaption(homeUrl.fileName());
     m_actionHandler = new DolphinViewActionHandler(actionCollection(), this);
     connect(m_actionHandler, SIGNAL(actionBeingHandled()), SLOT(clearStatusBar()));
@@ -755,7 +685,7 @@ void DolphinMainWindow::init()
 
     if (firstRun) {
         // assure a proper default size if Dolphin runs the first time
-        resize(700, 500);
+        resize(750, 500);
     }
 
     emit urlChanged(homeUrl);
@@ -773,6 +703,8 @@ void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContain
     m_activeViewContainer = viewContainer;
     m_activeViewContainer->setActive(true);
 
+    m_actionHandler->setCurrentView(viewContainer->view());
+
     updateHistory();
     updateEditActions();
     updateViewActions();
@@ -781,9 +713,6 @@ void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContain
     const KUrl& url = m_activeViewContainer->url();
     setCaption(url.fileName());
 
-    m_actionHandler->setCurrentView(viewContainer->view());
-
-    emit activeViewChanged(); // TODO unused; remove?
     emit urlChanged(url);
 }
 
@@ -792,7 +721,7 @@ void DolphinMainWindow::setupActions()
     // setup 'File' menu
     m_newMenu = new DolphinNewMenu(this);
     KMenu* menu = m_newMenu->menu();
-    menu->setTitle(i18nc("@title:menu", "Create New"));
+    menu->setTitle(i18nc("@title:menu Create new folder, file, link, etc.", "Create New"));
     menu->setIcon(KIcon("document-new"));
     connect(menu, SIGNAL(aboutToShow()),
             this, SLOT(updateNewMenu()));
@@ -815,8 +744,8 @@ void DolphinMainWindow::setupActions()
                           SLOT(undo()),
                           actionCollection());
 
-    //Need to remove shift+del from cut action, else the shortcut for deletejob
-    //doesn't work
+    // need to remove shift+del from cut action, else the shortcut for deletejob
+    // doesn't work
     KAction* cut = KStandardAction::cut(this, SLOT(cut()), actionCollection());
     KShortcut cutShortcut = cut->shortcut();
     cutShortcut.remove(Qt::SHIFT + Qt::Key_Delete, KShortcut::KeepEmpty);
@@ -835,86 +764,7 @@ void DolphinMainWindow::setupActions()
     connect(invertSelection, SIGNAL(triggered()), this, SLOT(invertSelection()));
 
     // setup 'View' menu
-
-    KToggleAction* iconsView = DolphinView::iconsModeAction(actionCollection());
-    KToggleAction* detailsView = DolphinView::detailsModeAction(actionCollection());
-    KToggleAction* columnView = DolphinView::columnsModeAction(actionCollection());
-
-    QActionGroup* viewModeGroup = new QActionGroup(this);
-    viewModeGroup->addAction(iconsView);
-    viewModeGroup->addAction(detailsView);
-    viewModeGroup->addAction(columnView);
-    connect(viewModeGroup, SIGNAL(triggered(QAction*)), this, SLOT(setViewMode(QAction*)));
-
-    //QActionGroup* sortActionGroup = DolphinView::createSortActionGroup(actionCollection());
-    //connect(sortActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(sortActionGroupTriggered(QAction*)));
-
-    // TODO use a QActionGroup
-
-    KToggleAction* sortByName = actionCollection()->add<KToggleAction>("sort_by_name");
-    sortByName->setText(i18nc("@action:inmenu Sort By", "Name"));
-    connect(sortByName, SIGNAL(triggered()), this, SLOT(sortByName()));
-
-    KToggleAction* sortBySize = actionCollection()->add<KToggleAction>("sort_by_size");
-    sortBySize->setText(i18nc("@action:inmenu Sort By", "Size"));
-    connect(sortBySize, SIGNAL(triggered()), this, SLOT(sortBySize()));
-
-    KToggleAction* sortByDate = actionCollection()->add<KToggleAction>("sort_by_date");
-    sortByDate->setText(i18nc("@action:inmenu Sort By", "Date"));
-    connect(sortByDate, SIGNAL(triggered()), this, SLOT(sortByDate()));
-
-    KToggleAction* sortByPermissions = actionCollection()->add<KToggleAction>("sort_by_permissions");
-    sortByPermissions->setText(i18nc("@action:inmenu Sort By", "Permissions"));
-    connect(sortByPermissions, SIGNAL(triggered()), this, SLOT(sortByPermissions()));
-
-    KToggleAction* sortByOwner = actionCollection()->add<KToggleAction>("sort_by_owner");
-    sortByOwner->setText(i18nc("@action:inmenu Sort By", "Owner"));
-    connect(sortByOwner, SIGNAL(triggered()), this, SLOT(sortByOwner()));
-
-    KToggleAction* sortByGroup = actionCollection()->add<KToggleAction>("sort_by_group");
-    sortByGroup->setText(i18nc("@action:inmenu Sort By", "Group"));
-    connect(sortByGroup, SIGNAL(triggered()), this, SLOT(sortByGroup()));
-
-    KToggleAction* sortByType = actionCollection()->add<KToggleAction>("sort_by_type");
-    sortByType->setText(i18nc("@action:inmenu Sort By", "Type"));
-    connect(sortByType, SIGNAL(triggered()), this, SLOT(sortByType()));
-
-    // TODO: Hided "sort by rating" and "sort by tags" as without caching the performance
-    // is too slow currently (Nepomuk will support caching in future releases).
-    //
-    // KToggleAction* sortByRating = actionCollection()->add<KToggleAction>("sort_by_rating");
-    // sortByRating->setText(i18nc("@action:inmenu Sort By", "Rating"));
-    //
-    // KToggleAction* sortByTags = actionCollection()->add<KToggleAction>("sort_by_tags");
-    // sortByTags->setText(i18nc("@action:inmenu Sort By", "Tags"));
-    //
-#ifdef HAVE_NEPOMUK
-    // if (MetaDataWidget::metaDataAvailable()) {
-    //     connect(sortByRating, SIGNAL(triggered()), this, SLOT(sortByRating()));
-    //     connect(sortByTags, SIGNAL(triggered()), this, SLOT(sortByTags()));
-    // }
-    // else {
-    //     sortByRating->setEnabled(false);
-    //     sortByTags->setEnabled(false);
-    // }
-#else
-    // sortByRating->setEnabled(false);
-    // sortByTags->setEnabled(false);
-#endif
-
-    QActionGroup* sortGroup = new QActionGroup(this);
-    sortGroup->addAction(sortByName);
-    sortGroup->addAction(sortBySize);
-    sortGroup->addAction(sortByDate);
-    sortGroup->addAction(sortByPermissions);
-    sortGroup->addAction(sortByOwner);
-    sortGroup->addAction(sortByGroup);
-    sortGroup->addAction(sortByType);
-
-    // TODO: Hided "sort by rating" and "sort by tags" as without caching the performance
-    // is too slow currently (Nepomuk will support caching in future releases).
-    //sortGroup->addAction(sortByRating);
-    //sortGroup->addAction(sortByTags);
+    // (note that most of it is set up in DolphinViewActionHandler)
 
     KAction* split = actionCollection()->addAction("split_view");
     split->setShortcut(Qt::Key_F3);
@@ -932,9 +782,7 @@ void DolphinMainWindow::setupActions()
     stop->setIcon(KIcon("process-stop"));
     connect(stop, SIGNAL(triggered()), this, SLOT(stopLoading()));
 
-    // TODO: the URL navigator must emit a signal if the editable state has been
-    // changed, so that the corresponding showFullLocation action is updated. Also
-    // the naming "Show full Location" is currently confusing...
+    // TODO: the naming "Show full Location" is currently confusing...
     KToggleAction* showFullLocation = actionCollection()->add<KToggleAction>("editable_location");
     showFullLocation->setText(i18nc("@action:inmenu Navigation Bar", "Show Full Location"));
     showFullLocation->setShortcut(Qt::CTRL | Qt::Key_L);
@@ -1025,7 +873,8 @@ void DolphinMainWindow::setupDockWidgets()
             this, SLOT(dropUrls(KUrl::List, KUrl)));
 
     // setup "Terminal"
-    QDockWidget* terminalDock = new QDockWidget(i18nc("@title:window", "Terminal"));
+#ifndef Q_OS_WIN
+    QDockWidget* terminalDock = new QDockWidget(i18nc("@title:window Shell terminal", "Terminal"));
     terminalDock->setObjectName("terminalDock");
     terminalDock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
     SidebarPage* terminalWidget = new TerminalSidebarPage(terminalDock);
@@ -1033,25 +882,28 @@ void DolphinMainWindow::setupDockWidgets()
 
     connect(terminalWidget, SIGNAL(hideTerminalSidebarPage()), terminalDock, SLOT(hide()));
 
-    terminalDock->toggleViewAction()->setText(i18nc("@title:window", "Terminal"));
+    terminalDock->toggleViewAction()->setText(i18nc("@title:window Shell terminal", "Terminal"));
     terminalDock->toggleViewAction()->setShortcut(Qt::Key_F4);
     actionCollection()->addAction("show_terminal_panel", terminalDock->toggleViewAction());
 
     addDockWidget(Qt::BottomDockWidgetArea, terminalDock);
     connect(this, SIGNAL(urlChanged(KUrl)),
             terminalWidget, SLOT(setUrl(KUrl)));
+#endif
 
     const bool firstRun = DolphinSettings::instance().generalSettings()->firstRun();
     if (firstRun) {
-        infoDock->hide();
         treeViewDock->hide();
+#ifndef Q_OS_WIN
         terminalDock->hide();
+#endif
     }
 
     QDockWidget* placesDock = new QDockWidget(i18nc("@title:window", "Places"));
     placesDock->setObjectName("placesDock");
     placesDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
-    KFilePlacesView* placesView = new KFilePlacesView(placesDock);
+
+    DolphinFilePlacesView* placesView = new DolphinFilePlacesView(placesDock);
     placesDock->setWidget(placesView);
     placesView->setModel(DolphinSettings::instance().placesModel());
     placesView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
@@ -1067,22 +919,6 @@ void DolphinMainWindow::setupDockWidgets()
             placesView, SLOT(setUrl(KUrl)));
 }
 
-void DolphinMainWindow::updateHistory()
-{
-    const KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator();
-    const int index = urlNavigator->historyIndex();
-
-    QAction* backAction = actionCollection()->action("go_back");
-    if (backAction != 0) {
-        backAction->setEnabled(index < urlNavigator->historySize() - 1);
-    }
-
-    QAction* forwardAction = actionCollection()->action("go_forward");
-    if (forwardAction != 0) {
-        forwardAction->setEnabled(index > 0);
-    }
-}
-
 void DolphinMainWindow::updateEditActions()
 {
     const KFileItemList list = m_activeViewContainer->view()->selectedItems();
@@ -1119,14 +955,6 @@ void DolphinMainWindow::updateViewActions()
 {
     m_actionHandler->updateViewActions();
 
-    const DolphinView* view = m_activeViewContainer->view();
-    QAction* action = actionCollection()->action(view->currentViewModeActionName());
-    if (action != 0) {
-        action->setChecked(true);
-    }
-
-    slotSortingChanged(view->sorting());
-
     QAction* showFilterBarAction = actionCollection()->action("show_filter_bar");
     showFilterBarAction->setChecked(m_activeViewContainer->isFilterBarVisible());
 
@@ -1139,7 +967,7 @@ void DolphinMainWindow::updateViewActions()
 
 void DolphinMainWindow::updateGoActions()
 {
-    QAction* goUpAction = actionCollection()->action(KStandardAction::stdName(KStandardAction::Up));
+    QAction* goUpAction = actionCollection()->action(KStandardAction::name(KStandardAction::Up));
     const KUrl& currentUrl = m_activeViewContainer->url();
     goUpAction->setEnabled(currentUrl.upUrl() != currentUrl);
 }
@@ -1156,10 +984,6 @@ void DolphinMainWindow::connectViewSignals(int viewIndex)
             this, SLOT(updateFilterBarAction(bool)));
 
     DolphinView* view = container->view();
-    connect(view, SIGNAL(modeChanged()),
-            this, SLOT(slotViewModeChanged()));
-    connect(view, SIGNAL(sortingChanged(DolphinView::Sorting)),
-            this, SLOT(slotSortingChanged(DolphinView::Sorting)));
     connect(view, SIGNAL(selectionChanged(KFileItemList)),
             this, SLOT(slotSelectionChanged(KFileItemList)));
     connect(view, SIGNAL(requestItemInfo(KFileItem)),
@@ -1173,7 +997,9 @@ void DolphinMainWindow::connectViewSignals(int viewIndex)
     connect(navigator, SIGNAL(urlChanged(const KUrl&)),
             this, SLOT(changeUrl(const KUrl&)));
     connect(navigator, SIGNAL(historyChanged()),
-            this, SLOT(slotHistoryChanged()));
+            this, SLOT(updateHistory()));
+    connect(navigator, SIGNAL(editableStateChanged(bool)),
+            this, SLOT(slotEditableStateChanged(bool)));
 }
 
 void DolphinMainWindow::updateSplitAction()