From: Frank Reininghaus Date: Thu, 26 Apr 2012 06:31:46 +0000 (+0200) Subject: Update the view when changing the directory using 'cd' in the terminal X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/12c239ae149cfed254066248f411b114743f5836 Update the view when changing the directory using 'cd' in the terminal Thanks to Jekyll Wu for helping to implement this feature! FEATURE: 156732 FIXED-IN: 4.9.0 --- diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 01cc62fce..699a1a777 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -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())); diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h index 4bc3c8d4d..722e3ab7a 100644 --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -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(); diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index 22be3a833..5f8b8f3b4 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -45,7 +45,6 @@ #include #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. diff --git a/src/dolphinviewcontainer.h b/src/dolphinviewcontainer.h index 10dd67246..a1569ea8b 100644 --- a/src/dolphinviewcontainer.h +++ b/src/dolphinviewcontainer.h @@ -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 diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index 51df81806..5fa0a0762 100644 --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -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(this)) : 0; - if (part) { - connect(part, SIGNAL(destroyed(QObject*)), this, SLOT(terminalExited())); - m_terminalWidget = part->widget(); + m_konsolePart = factory ? (factory->create(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(part); + m_terminal = qobject_cast(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" diff --git a/src/panels/terminal/terminalpanel.h b/src/panels/terminal/terminalpanel.h index cc27212e8..374476e1c 100644 --- a/src/panels/terminal/terminalpanel.h +++ b/src/panels/terminal/terminalpanel.h @@ -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