]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphintabwidget.cpp
Add more tab access functions
[dolphin.git] / src / dolphintabwidget.cpp
index a0c9b9d8198269bcf9c560106332cdf0dd9b45a7..a5c2f8c98c77e48dd72d02aaec36f5bf92838483 100644 (file)
 #include "dolphintabbar.h"
 #include "dolphintabpage.h"
 #include "dolphinviewcontainer.h"
-#include "dolphin_generalsettings.h"
-#include "views/draganddrophelper.h"
 
-#include <QApplication>
 #include <KConfigGroup>
-#include <kio/global.h>
 #include <KRun>
+#include <KShell>
+#include <kio/global.h>
+
+#include <QApplication>
+#include <QDropEvent>
 
 DolphinTabWidget::DolphinTabWidget(QWidget* parent) :
     QTabWidget(parent),
-    m_placesSelectorVisible(true)
+    m_placesSelectorVisible(true),
+    m_lastViewedTab(0)
 {
-    connect(this, SIGNAL(tabCloseRequested(int)),
-            this, SLOT(closeTab(int)));
-    connect(this, SIGNAL(currentChanged(int)),
-            this, SLOT(currentTabChanged(int)));
+    connect(this, &DolphinTabWidget::tabCloseRequested,
+            this, static_cast<void (DolphinTabWidget::*)(int)>(&DolphinTabWidget::closeTab));
+    connect(this, &DolphinTabWidget::currentChanged,
+            this, &DolphinTabWidget::currentTabChanged);
 
     DolphinTabBar* tabBar = new DolphinTabBar(this);
-    connect(tabBar, SIGNAL(openNewActivatedTab(int)),
-            this, SLOT(openNewActivatedTab(int)));
-    connect(tabBar, SIGNAL(tabDropEvent(int,QDropEvent*)),
-            this, SLOT(tabDropEvent(int,QDropEvent*)));
-    connect(tabBar, SIGNAL(tabDetachRequested(int)),
-            this, SLOT(detachTab(int)));
+    connect(tabBar, &DolphinTabBar::openNewActivatedTab,
+            this,  static_cast<void (DolphinTabWidget::*)(int)>(&DolphinTabWidget::openNewActivatedTab));
+    connect(tabBar, &DolphinTabBar::tabDropEvent,
+            this, &DolphinTabWidget::tabDropEvent);
+    connect(tabBar, &DolphinTabBar::tabDetachRequested,
+            this, &DolphinTabWidget::detachTab);
     tabBar->hide();
 
     setTabBar(tabBar);
@@ -59,6 +61,18 @@ DolphinTabPage* DolphinTabWidget::currentTabPage() const
     return tabPageAt(currentIndex());
 }
 
+DolphinTabPage* DolphinTabWidget::nextTabPage() const
+{
+    const int index = currentIndex() + 1;
+    return tabPageAt(index < count() ? index : 0);
+}
+
+DolphinTabPage* DolphinTabWidget::prevTabPage() const
+{
+    const int index = currentIndex() - 1;
+    return tabPageAt(index >= 0 ? index : (count() - 1));
+}
+
 DolphinTabPage* DolphinTabWidget::tabPageAt(const int index) const
 {
     return static_cast<DolphinTabPage*>(widget(index));
@@ -142,10 +156,10 @@ void DolphinTabWidget::openNewTab(const QUrl& primaryUrl, const QUrl& secondaryU
 
     DolphinTabPage* tabPage = new DolphinTabPage(primaryUrl, secondaryUrl, this);
     tabPage->setPlacesSelectorVisible(m_placesSelectorVisible);
-    connect(tabPage, SIGNAL(activeViewChanged(DolphinViewContainer*)),
-            this, SIGNAL(activeViewChanged(DolphinViewContainer*)));
-    connect(tabPage, SIGNAL(activeViewUrlChanged(QUrl)),
-            this, SLOT(tabUrlChanged(QUrl)));
+    connect(tabPage, &DolphinTabPage::activeViewChanged,
+            this, &DolphinTabWidget::activeViewChanged);
+    connect(tabPage, &DolphinTabPage::activeViewUrlChanged,
+            this, &DolphinTabWidget::tabUrlChanged);
     addTab(tabPage, QIcon::fromTheme(KIO::iconNameForUrl(primaryUrl)), tabName(primaryUrl));
 
     if (focusWidget) {
@@ -155,16 +169,14 @@ void DolphinTabWidget::openNewTab(const QUrl& primaryUrl, const QUrl& secondaryU
     }
 }
 
-void DolphinTabWidget::openDirectories(const QList<QUrl>& dirs)
+void DolphinTabWidget::openDirectories(const QList<QUrl>& dirs, bool splitView)
 {
-    const bool hasSplitView = GeneralSettings::splitView();
+    Q_ASSERT(dirs.size() > 0);
 
-    // Open each directory inside a new tab. If the "split view" option has been enabled,
-    // always show two directories within one tab.
     QList<QUrl>::const_iterator it = dirs.constBegin();
     while (it != dirs.constEnd()) {
         const QUrl& primaryUrl = *(it++);
-        if (hasSplitView && (it != dirs.constEnd())) {
+        if (splitView && (it != dirs.constEnd())) {
             const QUrl& secondaryUrl = *(it++);
             openNewTab(primaryUrl, secondaryUrl);
         } else {
@@ -173,11 +185,9 @@ void DolphinTabWidget::openDirectories(const QList<QUrl>& dirs)
     }
 }
 
-void DolphinTabWidget::openFiles(const QList<QUrl>& files)
+void DolphinTabWidget::openFiles(const QList<QUrl>& files, bool splitView)
 {
-    if (files.isEmpty()) {
-        return;
-    }
+    Q_ASSERT(files.size() > 0);
 
     // Get all distinct directories from 'files' and open a tab
     // for each directory. If the "split view" option is enabled, two
@@ -191,7 +201,7 @@ void DolphinTabWidget::openFiles(const QList<QUrl>& files)
     }
 
     const int oldTabCount = count();
-    openDirectories(dirs);
+    openDirectories(dirs, splitView);
     const int tabCount = count();
 
     // Select the files. Although the files can be split between several
@@ -261,16 +271,16 @@ void DolphinTabWidget::detachTab(int index)
 {
     Q_ASSERT(index >= 0);
 
-    const QString separator(QLatin1Char(' '));
-    QString command = QLatin1String("dolphin");
+    QStringList args;
 
     const DolphinTabPage* tabPage = tabPageAt(index);
-    command += separator + tabPage->primaryViewContainer()->url().url();
+    args << tabPage->primaryViewContainer()->url().url();
     if (tabPage->splitViewEnabled()) {
-        command += separator + tabPage->secondaryViewContainer()->url().url();
-        command += separator + QLatin1String("-split");
+        args << tabPage->secondaryViewContainer()->url().url();
+        args << QStringLiteral("--split");
     }
 
+    const QString command = QStringLiteral("dolphin %1").arg(KShell::joinArgs(args));
     KRun::runCommand(command, this);
 
     closeTab(index);
@@ -286,13 +296,8 @@ void DolphinTabWidget::openNewActivatedTab(int index)
 void DolphinTabWidget::tabDropEvent(int index, QDropEvent* event)
 {
     if (index >= 0) {
-        const DolphinView* view = tabPageAt(index)->activeViewContainer()->view();
-
-        QString error;
-        DragAndDropHelper::dropUrls(view->rootItem(), view->url(), event, error);
-        if (!error.isEmpty()) {
-            currentTabPage()->activeViewContainer()->showMessage(error, DolphinViewContainer::Error);
-        }
+        DolphinView* view = tabPageAt(index)->activeViewContainer()->view();
+        view->dropUrls(view->url(), event, view);
     }
 }
 
@@ -312,10 +317,16 @@ void DolphinTabWidget::tabUrlChanged(const QUrl& url)
 
 void DolphinTabWidget::currentTabChanged(int index)
 {
-    DolphinViewContainer* viewContainer = tabPageAt(index)->activeViewContainer();
+    // last-viewed tab deactivation
+    if (DolphinTabPage* tabPage = tabPageAt(m_lastViewedTab)) {
+        tabPage->setActive(false);
+    }
+    DolphinTabPage* tabPage = tabPageAt(index);
+    DolphinViewContainer* viewContainer = tabPage->activeViewContainer();
     emit activeViewChanged(viewContainer);
     emit currentUrlChanged(viewContainer->url());
-    viewContainer->view()->setFocus();
+    tabPage->setActive(true);
+    m_lastViewedTab = index;
 }
 
 void DolphinTabWidget::tabInserted(int index)
@@ -345,7 +356,7 @@ void DolphinTabWidget::tabRemoved(int index)
 QString DolphinTabWidget::tabName(const QUrl& url) const
 {
     QString name;
-    if (url == QUrl("file:///")) {
+    if (url == QUrl(QStringLiteral("file:///"))) {
         name = '/';
     } else {
         name = url.adjusted(QUrl::StripTrailingSlash).fileName();
@@ -354,7 +365,7 @@ QString DolphinTabWidget::tabName(const QUrl& url) const
         } else {
             // Make sure that a '&' inside the directory name is displayed correctly
             // and not misinterpreted as a keyboard shortcut in QTabBar::setTabText()
-            name.replace('&', "&&");
+            name.replace('&', QLatin1String("&&"));
         }
     }
     return name;