┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Reininghaus <[email protected]>2012-04-26 08:31:46 +0200
committerFrank Reininghaus <[email protected]>2012-04-26 08:31:59 +0200
commit12c239ae149cfed254066248f411b114743f5836 (patch)
treef6b27cede4b07376bcfaa71d48c7881326583881
parent640696db728ad3163384e19f789ebc022d183da6 (diff)
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
-rw-r--r--src/dolphinmainwindow.cpp8
-rw-r--r--src/dolphinmainwindow.h7
-rw-r--r--src/dolphinviewcontainer.cpp16
-rw-r--r--src/dolphinviewcontainer.h9
-rw-r--r--src/panels/terminal/terminalpanel.cpp40
-rw-r--r--src/panels/terminal/terminalpanel.h12
6 files changed, 83 insertions, 9 deletions
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 <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.
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<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"
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