}
}
+void DolphinMainWindow::slotTerminalDirectoryChanged(const KUrl& url)
+{
+ m_activeViewContainer->setAutoGrabFocus(false);
+ changeUrl(url);
+ m_activeViewContainer->setAutoGrabFocus(true);
+}
+
void DolphinMainWindow::slotEditableStateChanged(bool editable)
{
KToggleAction* editableLocationAction =
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()));
*/
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();
#include <KRun>
#include "dolphin_generalsettings.h"
-#include "dolphinmainwindow.h"
#include "filterbar/filterbar.h"
#include "search/dolphinsearchbox.h"
#include "statusbar/dolphinstatusbar.h"
m_filterBar(0),
m_statusBar(0),
m_statusBarTimer(0),
- m_statusBarTimestamp()
+ m_statusBarTimestamp(),
+ m_autoGrabFocus(true)
{
hide();
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;
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.
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();
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
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);
// 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 = "/";
}
}
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();
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,
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"
class StatJob;
}
+namespace KParts {
+ class ReadOnlyPart;
+}
+
/**
* @brief Shows the terminal which is synchronized with the URL of the
* active view.
signals:
void hideTerminalPanel();
+ /**
+ * Is emitted if the an URL change is requested.
+ */
+ void changeUrl(const KUrl& url);
+
protected:
/** @see Panel::urlChanged() */
virtual bool urlChanged();
private slots:
void slotMostLocalUrlResult(KJob* job);
+ void slotKonsolePartCurrentDirectoryChanged(const QString& dir);
private:
void changeDir(const KUrl& url);
QVBoxLayout* m_layout;
TerminalInterfaceV2* m_terminal;
QWidget* m_terminalWidget;
+ KParts::ReadOnlyPart* m_konsolePart;
+ QString m_konsolePartCurrentDirectory;
};
#endif // TERMINALPANEL_H