]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinmainwindow.cpp
Fixed shortcuts, removed warnings.
[dolphin.git] / src / dolphinmainwindow.cpp
index 792c39c1e2f07437a48be4fc0842aa8ef0b69a51..dda1bdd47efafd13d252057f5d3141cf21db7277 100644 (file)
@@ -24,6 +24,7 @@
 #include <assert.h>\r
 \r
 #include "dolphinapplication.h"\r
+#include "dolphinnewmenu.h"\r
 #include "dolphinsettings.h"\r
 #include "dolphinsettingsdialog.h"\r
 #include "dolphinstatusbar.h"\r
 #include <kicon.h>\r
 #include <kiconloader.h>\r
 #include <kio/netaccess.h>\r
+#include <kio/deletejob.h>\r
 #include <kio/renamedialog.h>\r
 #include <kinputdialog.h>\r
 #include <klocale.h>\r
 #include <kmenu.h>\r
 #include <kmessagebox.h>\r
-#include <knewmenu.h>\r
 #include <konqmimedata.h>\r
-#include <konq_undo.h>\r
 #include <kpropertiesdialog.h>\r
 #include <kprotocolinfo.h>\r
 #include <ktoggleaction.h>\r
@@ -65,7 +65,6 @@
 #include <kstandardaction.h>\r
 #include <kurl.h>\r
 \r
-#include <Q3ValueList>  // TODO\r
 #include <QCloseEvent>\r
 #include <QClipboard>\r
 #include <QSplitter>\r
@@ -83,9 +82,12 @@ DolphinMainWindow::DolphinMainWindow() :
 \r
     KonqUndoManager::incRef();\r
 \r
-    connect(KonqUndoManager::self(), SIGNAL(undoAvailable(bool)),\r
+    KonqUndoManager* undoManager = KonqUndoManager::self();\r
+    undoManager->setUiInterface(new UndoUiInterface(this));\r
+\r
+    connect(undoManager, SIGNAL(undoAvailable(bool)),\r
             this, SLOT(slotUndoAvailable(bool)));\r
-    connect(KonqUndoManager::self(), SIGNAL(undoTextChanged(const QString&)),\r
+    connect(undoManager, SIGNAL(undoTextChanged(const QString&)),\r
             this, SLOT(slotUndoTextChanged(const QString&)));\r
 }\r
 \r
@@ -117,48 +119,81 @@ void DolphinMainWindow::setActiveView(DolphinView* view)
 void DolphinMainWindow::dropUrls(const KUrl::List& urls,\r
                                  const KUrl& destination)\r
 {\r
-    m_dropDestination = destination;\r
-    m_droppedUrls = urls;\r
-\r
-    /* KDE4-TODO\r
-    const ButtonState keyboardState = KApplication::keyboardMouseState();\r
-    const bool shiftPressed = (keyboardState & ShiftButton) > 0;\r
-    const bool controlPressed = (keyboardState & ControlButton) > 0;\r
-\r
-\r
+    Qt::DropAction action = Qt::CopyAction;\r
 \r
+    Qt::KeyboardModifiers modifier = QApplication::keyboardModifiers();\r
+    const bool shiftPressed   = modifier & Qt::ShiftModifier;\r
+    const bool controlPressed = modifier & Qt::ControlModifier;\r
     if (shiftPressed && controlPressed) {\r
-        // shortcut for 'Linke Here' is used\r
-        selectedIndex = 2;\r
-    }\r
-    else if (controlPressed) {\r
-        // shortcut for 'Copy Here' is used\r
-        selectedIndex = 1;\r
+        // shortcut for 'Link Here' is used\r
+        action = Qt::LinkAction;\r
     }\r
     else if (shiftPressed) {\r
         // shortcut for 'Move Here' is used\r
-        selectedIndex = 0;\r
+        action = Qt::MoveAction;\r
+    }\r
+    else if (controlPressed) {\r
+        // shortcut for 'Copy Here' is used\r
+        action = Qt::CopyAction;\r
     }\r
-    else*/ {\r
-        // no shortcut is used, hence open a popup menu\r
+    else {\r
+        // open a context menu which offers the following actions:\r
+        // - Move Here\r
+        // - Copy Here\r
+        // - Link Here\r
+        // - Cancel\r
+\r
         KMenu popup(this);\r
 \r
-        QAction* moveAction = popup.addAction(SmallIcon("goto"), i18n("&Move Here"));\r
-        connect(moveAction, SIGNAL(triggered()), this, SLOT(moveDroppedItems()));\r
+        QString seq = QKeySequence(Qt::ShiftModifier).toString();\r
+        seq.chop(1); // chop superfluous '+'\r
+        QAction* moveAction = popup.addAction(KIcon("goto"),\r
+                                              i18n("&Move Here") + "\t" + seq);\r
 \r
-        QAction* copyAction = popup.addAction(SmallIcon("editcopy"), i18n( "&Copy Here" ));\r
-        connect(copyAction, SIGNAL(triggered()), this, SLOT(copyDroppedItems()));\r
+        seq = QKeySequence(Qt::ControlModifier).toString();\r
+        seq.chop(1);\r
+        QAction* copyAction = popup.addAction(KIcon("editcopy"),\r
+                                              i18n("&Copy Here") + "\t" + seq);\r
 \r
-        QAction* linkAction = popup.addAction(i18n("&Link Here"));\r
-        connect(linkAction, SIGNAL(triggered()), this, SLOT(linkDroppedItems()));\r
+        seq = QKeySequence(Qt::ControlModifier + Qt::ShiftModifier).toString();\r
+        seq.chop(1);\r
+        QAction* linkAction = popup.addAction(KIcon("www"),\r
+                                              i18n("&Link Here") + "\t" + seq);\r
 \r
-        QAction* cancelAction = popup.addAction(SmallIcon("stop"), i18n("Cancel"));\r
-        popup.insertSeparator(cancelAction);\r
+        popup.addSeparator();\r
+        popup.addAction(KIcon("stop"), i18n("Cancel"));\r
 \r
-        popup.exec(QCursor::pos());\r
+        QAction* activatedAction = popup.exec(QCursor::pos());\r
+        if (activatedAction == moveAction) {\r
+            action = Qt::MoveAction;\r
+        }\r
+        else if (activatedAction == copyAction) {\r
+            action = Qt::CopyAction;\r
+        }\r
+        else if (activatedAction == linkAction) {\r
+            action = Qt::LinkAction;\r
+        }\r
+        else {\r
+            return;\r
+        }\r
     }\r
 \r
-    m_droppedUrls.clear();\r
+    switch (action) {\r
+        case Qt::MoveAction:\r
+            moveUrls(urls, destination);\r
+            break;\r
+\r
+        case Qt::CopyAction:\r
+            copyUrls(urls, destination);\r
+            break;\r
+\r
+        case Qt::LinkAction:\r
+            linkUrls(urls, destination);\r
+            break;\r
+\r
+        default:\r
+            break;\r
+    }\r
 }\r
 \r
 void DolphinMainWindow::refreshViews()\r
@@ -221,6 +256,15 @@ void DolphinMainWindow::slotSortingChanged(DolphinView::Sorting sorting)
         case DolphinView::SortByDate:\r
             action = actionCollection()->action("by_date");\r
             break;\r
+        case DolphinView::SortByPermissions:\r
+            action = actionCollection()->action("by_permissions");\r
+            break;\r
+        case DolphinView::SortByOwner:\r
+            action = actionCollection()->action("by_owner");\r
+            break;\r
+        case DolphinView::SortByGroup:\r
+            action = actionCollection()->action("by_group");\r
+            break;\r
         default:\r
             break;\r
     }\r
@@ -280,22 +324,6 @@ void DolphinMainWindow::openNewMainWindow()
     DolphinApplication::app()->createMainWindow()->show();\r
 }\r
 \r
-void DolphinMainWindow::moveDroppedItems()\r
-{\r
-    moveUrls(m_droppedUrls, m_dropDestination);\r
-}\r
-\r
-void DolphinMainWindow::copyDroppedItems()\r
-{\r
-    copyUrls(m_droppedUrls, m_dropDestination);\r
-}\r
-\r
-void DolphinMainWindow::linkDroppedItems()\r
-{\r
-    KonqOperations::copy(this, KonqOperations::LINK, m_droppedUrls, m_dropDestination);\r
-    m_undoOperations.append(KonqOperations::LINK);\r
-}\r
-\r
 void DolphinMainWindow::closeEvent(QCloseEvent* event)\r
 {\r
     DolphinSettings& settings = DolphinSettings::instance();\r
@@ -306,7 +334,7 @@ void DolphinMainWindow::closeEvent(QCloseEvent* event)
 \r
     // TODO: I assume there will be a generic way in KDE 4 to store the docks\r
     // of the main window. In the meantime they are stored manually:\r
-    QString filename = KStandardDirs::locateLocal("data", KGlobal::instance()->instanceName());\r
+    QString filename = KStandardDirs::locateLocal("data", KGlobal::mainComponent().componentName());\r
     filename.append("/panels_layout");\r
     QFile file(filename);\r
     if (file.open(QIODevice::WriteOnly)) {\r
@@ -413,22 +441,18 @@ void DolphinMainWindow::quit()
 void DolphinMainWindow::slotHandleJobError(KJob* job)\r
 {\r
     if (job->error() != 0) {\r
-        m_activeView->statusBar()->setMessage(job->errorString(),\r
-                                              DolphinStatusBar::Error);\r
+        DolphinStatusBar* statusBar = m_activeView->statusBar();\r
+        statusBar->setMessage(job->errorString(),\r
+                              DolphinStatusBar::Error);\r
     }\r
 }\r
 \r
 void DolphinMainWindow::slotDeleteFileFinished(KJob* job)\r
 {\r
     if (job->error() == 0) {\r
-        m_activeView->statusBar()->setMessage(i18n("Delete operation completed."),\r
-                                               DolphinStatusBar::OperationCompleted);\r
-\r
-        // TODO: In opposite to the 'Move to Trash' operation in the class KFileIconView\r
-        // no rearranging of the item position is done when a file has been deleted.\r
-        // This is bypassed by reloading the view, but it might be worth to investigate\r
-        // deeper for the root of this issue.\r
-        m_activeView->reload();\r
+        DolphinStatusBar* statusBar = m_activeView->statusBar();\r
+        statusBar->setMessage(i18n("Delete operation completed."),\r
+                              DolphinStatusBar::OperationCompleted);\r
     }\r
 }\r
 \r
@@ -474,6 +498,12 @@ void DolphinMainWindow::slotUndoTextChanged(const QString& text)
     }\r
 }\r
 \r
+void DolphinMainWindow::undo()\r
+{\r
+    clearStatusBar();\r
+    KonqUndoManager::self()->undo();\r
+}\r
+\r
 void DolphinMainWindow::cut()\r
 {\r
     QMimeData* mimeData = new QMimeData();\r
@@ -614,6 +644,21 @@ void DolphinMainWindow::sortByDate()
     m_activeView->setSorting(DolphinView::SortByDate);\r
 }\r
 \r
+void DolphinMainWindow::sortByPermissions()\r
+{\r
+    m_activeView->setSorting(DolphinView::SortByPermissions);\r
+}\r
+\r
+void DolphinMainWindow::sortByOwner()\r
+{\r
+    m_activeView->setSorting(DolphinView::SortByOwner);\r
+}\r
+\r
+void DolphinMainWindow::sortByGroup()\r
+{\r
+    m_activeView->setSorting(DolphinView::SortByGroup);\r
+}\r
+\r
 void DolphinMainWindow::toggleSortOrder()\r
 {\r
     const Qt::SortOrder order = (m_activeView->sortOrder() == Qt::Ascending) ?\r
@@ -657,6 +702,7 @@ void DolphinMainWindow::toggleSplitView()
             setActiveView(m_view[PrimaryIdx]);\r
         }\r
     }\r
+    emit activeViewChanged();\r
 }\r
 \r
 void DolphinMainWindow::reloadView()\r
@@ -721,8 +767,6 @@ void DolphinMainWindow::toggleEditLocation()
 \r
 void DolphinMainWindow::editLocation()\r
 {\r
-    KToggleAction* action = static_cast<KToggleAction*>(actionCollection()->action("editable_location"));\r
-    action->setChecked(true);\r
     m_activeView->setUrlEditable(true);\r
 }\r
 \r
@@ -910,8 +954,7 @@ void DolphinMainWindow::loadSettings()
     // TODO: I assume there will be a generic way in KDE 4 to restore the docks\r
     // of the main window. In the meantime they are restored manually (see also\r
     // DolphinMainWindow::closeEvent() for more details):\r
-    QString filename = KStandardDirs::locateLocal("data", KGlobal::instance()->instanceName());\r
-    filename.append("/panels_layout");\r
+    QString filename = KStandardDirs::locateLocal("data", KGlobal::mainComponent().componentName());   filename.append("/panels_layout");\r
     QFile file(filename);\r
     if (file.open(QIODevice::ReadOnly)) {\r
         QByteArray data = file.readAll();\r
@@ -923,7 +966,7 @@ void DolphinMainWindow::loadSettings()
 void DolphinMainWindow::setupActions()\r
 {\r
     // setup 'File' menu\r
-    m_newMenu = new KNewMenu(actionCollection(), this, "create_new");\r
+    m_newMenu = new DolphinNewMenu(this);\r
     KMenu* menu = m_newMenu->menu();\r
     menu->setTitle(i18n("Create New..."));\r
     menu->setIcon(SmallIcon("filenew"));\r
@@ -953,14 +996,14 @@ void DolphinMainWindow::setupActions()
     connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteItems()));\r
 \r
     QAction* properties = actionCollection()->addAction("properties");\r
-    properties->setText(i18n("Propert&ies"));\r
-    properties->setShortcut(Qt::Key_Alt | Qt::Key_Return);\r
+    properties->setText(i18n("Properties"));\r
+    properties->setShortcut(Qt::ALT | Qt::Key_Return);\r
     connect(properties, SIGNAL(triggered()), this, SLOT(properties()));\r
 \r
     KStandardAction::quit(this, SLOT(quit()), actionCollection());\r
 \r
     // setup 'Edit' menu\r
-    KStandardAction::undo(KonqUndoManager::self(),\r
+    KStandardAction::undo(this,\r
                           SLOT(undo()),\r
                           actionCollection());\r
 \r
@@ -1015,10 +1058,25 @@ void DolphinMainWindow::setupActions()
     sortByDate->setText(i18n("By Date"));\r
     connect(sortByDate, SIGNAL(triggered()), this, SLOT(sortByDate()));\r
 \r
+    KToggleAction* sortByPermissions = actionCollection()->add<KToggleAction>("by_permissions");\r
+    sortByPermissions->setText(i18n("By Permissions"));\r
+    connect(sortByPermissions, SIGNAL(triggered()), this, SLOT(sortByPermissions()));\r
+\r
+    KToggleAction* sortByOwner = actionCollection()->add<KToggleAction>("by_owner");\r
+    sortByOwner->setText(i18n("By Owner"));\r
+    connect(sortByOwner, SIGNAL(triggered()), this, SLOT(sortByOwner()));\r
+\r
+    KToggleAction* sortByGroup = actionCollection()->add<KToggleAction>("by_group");\r
+    sortByGroup->setText(i18n("By Group"));\r
+    connect(sortByGroup, SIGNAL(triggered()), this, SLOT(sortByGroup()));\r
+\r
     QActionGroup* sortGroup = new QActionGroup(this);\r
     sortGroup->addAction(sortByName);\r
     sortGroup->addAction(sortBySize);\r
     sortGroup->addAction(sortByDate);\r
+    sortGroup->addAction(sortByPermissions);\r
+    sortGroup->addAction(sortByOwner);\r
+    sortGroup->addAction(sortByGroup);\r
 \r
     KToggleAction* sortDescending = actionCollection()->add<KToggleAction>("descending");\r
     sortDescending->setText(i18n("Descending"));\r
@@ -1030,7 +1088,7 @@ void DolphinMainWindow::setupActions()
 \r
     KToggleAction* showHiddenFiles = actionCollection()->add<KToggleAction>("show_hidden_files");\r
     showHiddenFiles->setText(i18n("Show Hidden Files"));\r
-    //showHiddenFiles->setShortcut(Qt::ALT | Qt::Key_      KDE4-TODO: what Qt-Key represents '.'?\r
+    showHiddenFiles->setShortcut(Qt::ALT | Qt::Key_Period);\r
     connect(showHiddenFiles, SIGNAL(triggered()), this, SLOT(toggleShowHiddenFiles()));\r
 \r
     KToggleAction* split = actionCollection()->add<KToggleAction>("split_view");\r
@@ -1050,12 +1108,15 @@ void DolphinMainWindow::setupActions()
     stop->setIcon(KIcon("stop"));\r
     connect(stop, SIGNAL(triggered()), this, SLOT(stopLoading()));\r
 \r
+    // TODO: the URL navigator must emit a signal if the editable state has been\r
+    // changed, so that the corresponding showFullLocation action is updated. Also\r
+    // the naming "Show full Location" is currently confusing...\r
     KToggleAction* showFullLocation = actionCollection()->add<KToggleAction>("editable_location");\r
     showFullLocation->setText(i18n("Show Full Location"));\r
     showFullLocation->setShortcut(Qt::CTRL | Qt::Key_L);\r
     connect(showFullLocation, SIGNAL(triggered()), this, SLOT(toggleEditLocation()));\r
 \r
-    KToggleAction* editLocation = actionCollection()->add<KToggleAction>("edit_location");\r
+    QAction* editLocation = actionCollection()->addAction("edit_location");\r
     editLocation->setText(i18n("Edit Location"));\r
     editLocation->setShortcut(Qt::Key_F6);\r
     connect(editLocation, SIGNAL(triggered()), this, SLOT(editLocation()));\r
@@ -1124,7 +1185,7 @@ void DolphinMainWindow::setupDockWidgets()
 void DolphinMainWindow::updateHistory()\r
 {\r
     int index = 0;\r
-    const Q3ValueList<UrlNavigator::HistoryElem> list = m_activeView->urlHistory(index);\r
+    const QLinkedList<UrlNavigator::HistoryElem> list = m_activeView->urlHistory(index);\r
 \r
     QAction* backAction = actionCollection()->action("go_back");\r
     if (backAction != 0) {\r
@@ -1213,6 +1274,10 @@ void DolphinMainWindow::updateViewActions()
 \r
     KToggleAction* splitAction = static_cast<KToggleAction*>(actionCollection()->action("split_view"));\r
     splitAction->setChecked(m_view[SecondaryIdx] != 0);\r
+\r
+    KToggleAction* editableLocactionAction =\r
+        static_cast<KToggleAction*>(actionCollection()->action("editable_location"));\r
+    editableLocactionAction->setChecked(m_activeView->isUrlEditable());\r
 }\r
 \r
 void DolphinMainWindow::updateGoActions()\r
@@ -1234,6 +1299,12 @@ void DolphinMainWindow::moveUrls(const KUrl::List& source, const KUrl& dest)
     m_undoOperations.append(KonqOperations::MOVE);\r
 }\r
 \r
+void DolphinMainWindow::linkUrls(const KUrl::List& source, const KUrl& dest)\r
+{\r
+    KonqOperations::copy(this, KonqOperations::LINK, source, dest);\r
+    m_undoOperations.append(KonqOperations::LINK);\r
+}\r
+\r
 void DolphinMainWindow::clearStatusBar()\r
 {\r
     m_activeView->statusBar()->clear();\r
@@ -1263,4 +1334,21 @@ void DolphinMainWindow::connectViewSignals(int viewIndex)
 \r
 }\r
 \r
+DolphinMainWindow::UndoUiInterface::UndoUiInterface(DolphinMainWindow* mainWin) :\r
+    KonqUndoManager::UiInterface(mainWin),\r
+    m_mainWin(mainWin)\r
+{\r
+    assert(m_mainWin != 0);\r
+}\r
+\r
+DolphinMainWindow::UndoUiInterface::~UndoUiInterface()\r
+{\r
+}\r
+\r
+void DolphinMainWindow::UndoUiInterface::jobError(KIO::Job* job)\r
+{\r
+    DolphinStatusBar* statusBar = m_mainWin->activeView()->statusBar();\r
+    statusBar->setMessage(job->errorString(), DolphinStatusBar::Error);\r
+}\r
+\r
 #include "dolphinmainwindow.moc"\r