]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Update the view when changing the directory using 'cd' in the terminal
authorFrank Reininghaus <frank78ac@googlemail.com>
Thu, 26 Apr 2012 06:31:46 +0000 (08:31 +0200)
committerFrank Reininghaus <frank78ac@googlemail.com>
Thu, 26 Apr 2012 06:31:59 +0000 (08:31 +0200)
Thanks to Jekyll Wu for helping to implement this feature!

FEATURE: 156732
FIXED-IN: 4.9.0

src/dolphinmainwindow.cpp
src/dolphinmainwindow.h
src/dolphinviewcontainer.cpp
src/dolphinviewcontainer.h
src/panels/terminal/terminalpanel.cpp
src/panels/terminal/terminalpanel.h

index 01cc62fcebd6df9b8eb941188e50e4cb8029efa3..699a1a7776a4684ee79bbbb3d7f548a6f5e39e0e 100644 (file)
@@ -376,6 +376,13 @@ void DolphinMainWindow::changeUrl(const KUrl& url)
     }
 }
 
+void DolphinMainWindow::slotTerminalDirectoryChanged(const KUrl& url)
+{
+    m_activeViewContainer->setAutoGrabFocus(false);
+    changeUrl(url);
+    m_activeViewContainer->setAutoGrabFocus(true);
+}
+
 void DolphinMainWindow::slotEditableStateChanged(bool editable)
 {
     KToggleAction* editableLocationAction =
@@ -1712,6 +1719,7 @@ void DolphinMainWindow::setupDockWidgets()
     terminalDock->setWidget(terminalPanel);
 
     connect(terminalPanel, SIGNAL(hideTerminalPanel()), terminalDock, SLOT(hide()));
+    connect(terminalPanel, SIGNAL(changeUrl(KUrl)), this, SLOT(slotTerminalDirectoryChanged(KUrl)));
     connect(terminalDock, SIGNAL(visibilityChanged(bool)),
             terminalPanel, SLOT(dockVisibilityChanged()));
 
index 4bc3c8d4dddfbcfae3ad6e09764afa59f7ee83a6..722e3ab7a6f1611d32c8b194b1f89d3c7228d860 100644 (file)
@@ -125,6 +125,13 @@ public slots:
      */
     void changeUrl(const KUrl& url);
 
+    /**
+     * The current directory of the Terminal Panel has changed, probably because
+     * the user entered a 'cd' command. This slot calls changeUrl(url) and makes
+     * sure that the panel keeps the keyboard focus.
+     */
+    void slotTerminalDirectoryChanged(const KUrl& url);
+
     /** Stores all settings and quits Dolphin. */
     void quit();
 
index 22be3a8332a5c65c03f689e6cad83d9a93dbbfc7..5f8b8f3b4504cfeddc50cddbd057a3f499a30923 100644 (file)
@@ -45,7 +45,6 @@
 #include <KRun>
 
 #include "dolphin_generalsettings.h"
-#include "dolphinmainwindow.h"
 #include "filterbar/filterbar.h"
 #include "search/dolphinsearchbox.h"
 #include "statusbar/dolphinstatusbar.h"
@@ -64,7 +63,8 @@ DolphinViewContainer::DolphinViewContainer(const KUrl& url, QWidget* parent) :
     m_filterBar(0),
     m_statusBar(0),
     m_statusBarTimer(0),
-    m_statusBarTimestamp()
+    m_statusBarTimestamp(),
+    m_autoGrabFocus(true)
 {
     hide();
 
@@ -180,6 +180,16 @@ bool DolphinViewContainer::isActive() const
     return m_view->isActive();
 }
 
+void DolphinViewContainer::setAutoGrabFocus(bool grab)
+{
+    m_autoGrabFocus = grab;
+}
+
+bool DolphinViewContainer::autoGrabFocus() const
+{
+    return m_autoGrabFocus;
+}
+
 const DolphinStatusBar* DolphinViewContainer::statusBar() const
 {
     return m_statusBar;
@@ -496,7 +506,7 @@ void DolphinViewContainer::slotUrlNavigatorLocationChanged(const KUrl& url)
         setSearchModeEnabled(isSearchUrl(url));
         m_view->setUrl(url);
 
-        if (isActive() && !isSearchUrl(url)) {
+        if (m_autoGrabFocus && isActive() && !isSearchUrl(url)) {
             // When an URL has been entered, the view should get the focus.
             // The focus must be requested asynchronously, as changing the URL might create
             // a new view widget.
index 10dd67246ce4739812ec5737b3dac29a7ba8da6a..a1569ea8b99b014b4466fc6e86d6d88bfb9bf238 100644 (file)
@@ -79,6 +79,14 @@ public:
     void setActive(bool active);
     bool isActive() const;
 
+    /**
+     * If \a grab is set to true, the container automatically grabs the focus
+     * as soon as the URL has been changed. Per default the grabbing
+     * of the focus is enabled.
+     */
+    void setAutoGrabFocus(bool grab);
+    bool autoGrabFocus() const;
+
     const DolphinStatusBar* statusBar() const;
     DolphinStatusBar* statusBar();
 
@@ -288,6 +296,7 @@ private:
     DolphinStatusBar* m_statusBar;
     QTimer* m_statusBarTimer;            // Triggers a delayed update
     QElapsedTimer m_statusBarTimestamp;  // Time in ms since last update
+    bool m_autoGrabFocus;
 };
 
 #endif // DOLPHINVIEWCONTAINER_H
index 51df818069fd2f84c9f5d9b97d456d58c5cea61e..5fa0a0762e0191ca0ed556f169708caa79f7d24a 100644 (file)
@@ -38,7 +38,9 @@ TerminalPanel::TerminalPanel(QWidget* parent) :
     m_mostLocalUrlJob(0),
     m_layout(0),
     m_terminal(0),
-    m_terminalWidget(0)
+    m_terminalWidget(0),
+    m_konsolePart(0),
+    m_konsolePartCurrentDirectory()
 {
     m_layout = new QVBoxLayout(this);
     m_layout->setMargin(0);
@@ -60,8 +62,18 @@ void TerminalPanel::dockVisibilityChanged()
     // respond when e.g. Dolphin is minimized.
     if (parentWidget() && parentWidget()->isHidden() &&
         m_terminal && (m_terminal->foregroundProcessId() == -1)) {
+        // Make sure that the following "cd /" command will not affect the view.
+        disconnect(m_konsolePart, SIGNAL(currentDirectoryChanged(QString)),
+                   this, SLOT(slotKonsolePartCurrentDirectoryChanged(QString)));
+
         // Make sure this terminal does not prevent unmounting any removable drives
         changeDir(KUrl::fromPath("/"));
+
+        // Because we have disconnected from the part's currentDirectoryChanged()
+        // signal, we have to update m_konsolePartCurrentDirectory manually. If this
+        // was not done, showing the panel again might not set the part's working
+        // directory correctly.
+        m_konsolePartCurrentDirectory = "/";
     }
 }
 
@@ -89,15 +101,17 @@ void TerminalPanel::showEvent(QShowEvent* event)
     if (!m_terminal) {
         m_clearTerminal = true;
         KPluginFactory* factory = KPluginLoader("libkonsolepart").factory();
-        KParts::ReadOnlyPart* part = factory ? (factory->create<KParts::ReadOnlyPart>(this)) : 0;
-        if (part) {
-            connect(part, SIGNAL(destroyed(QObject*)), this, SLOT(terminalExited()));
-            m_terminalWidget = part->widget();
+        m_konsolePart = factory ? (factory->create<KParts::ReadOnlyPart>(this)) : 0;
+        if (m_konsolePart) {
+            connect(m_konsolePart, SIGNAL(destroyed(QObject*)), this, SLOT(terminalExited()));
+            m_terminalWidget = m_konsolePart->widget();
             m_layout->addWidget(m_terminalWidget);
-            m_terminal = qobject_cast<TerminalInterfaceV2 *>(part);
+            m_terminal = qobject_cast<TerminalInterfaceV2 *>(m_konsolePart);
         }
     }
     if (m_terminal) {
+        connect(m_konsolePart, SIGNAL(currentDirectoryChanged(QString)),
+                this, SLOT(slotKonsolePartCurrentDirectoryChanged(QString)));
         m_terminal->showShellInDir(url().toLocalFile());
         changeDir(url());
         m_terminalWidget->setFocus();
@@ -124,6 +138,10 @@ void TerminalPanel::changeDir(const KUrl& url)
 
 void TerminalPanel::sendCdToTerminal(const QString& dir)
 {
+    if (dir == m_konsolePartCurrentDirectory) {
+        return;
+    }
+
     if (!m_clearTerminal) {
         // The TerminalV2 interface does not provide a way to delete the
         // current line before sending a new input. This is mandatory,
@@ -154,4 +172,14 @@ void TerminalPanel::slotMostLocalUrlResult(KJob* job)
     m_mostLocalUrlJob = 0;
 }
 
+void TerminalPanel::slotKonsolePartCurrentDirectoryChanged(const QString& dir)
+{
+    m_konsolePartCurrentDirectory = dir;
+
+    const KUrl newUrl(dir);
+    if (newUrl != url()) {
+        emit changeUrl(newUrl);
+    }
+}
+
 #include "terminalpanel.moc"
index cc27212e8cdec5823d0532b8963f0f0265d20f11..374476e1c054c023737b7b3b4a159fbbad707b83 100644 (file)
@@ -30,6 +30,10 @@ namespace KIO {
     class StatJob;
 }
 
+namespace KParts {
+    class ReadOnlyPart;
+}
+
 /**
  * @brief Shows the terminal which is synchronized with the URL of the
  *        active view.
@@ -49,6 +53,11 @@ public slots:
 signals:
     void hideTerminalPanel();
 
+    /**
+     * Is emitted if the an URL change is requested.
+     */
+    void changeUrl(const KUrl& url);
+
 protected:
     /** @see Panel::urlChanged() */
     virtual bool urlChanged();
@@ -58,6 +67,7 @@ protected:
 
 private slots:
     void slotMostLocalUrlResult(KJob* job);
+    void slotKonsolePartCurrentDirectoryChanged(const QString& dir);
 
 private:
     void changeDir(const KUrl& url);
@@ -70,6 +80,8 @@ private:
     QVBoxLayout* m_layout;
     TerminalInterfaceV2* m_terminal;
     QWidget* m_terminalWidget;
+    KParts::ReadOnlyPart* m_konsolePart;
+    QString m_konsolePartCurrentDirectory;
 };
 
 #endif // TERMINALPANEL_H