diff --git a/krunner/view.cpp b/krunner/view.cpp index bdec4d802..3b4636625 100644 --- a/krunner/view.cpp +++ b/krunner/view.cpp @@ -50,8 +50,7 @@ View::View(QWindow *) : PlasmaQuick::Dialog(), m_offset(.5), - m_floating(false), - m_retainPriorSearch(false) + m_floating(false) { setClearBeforeRendering(true); setColor(QColor(Qt::transparent)); @@ -158,24 +157,6 @@ void View::loadConfig() { setFreeFloating(m_config.readEntry("FreeFloating", false)); setPinned(m_config.readEntry("Pinned", false)); - - m_historyEnabled = m_config.readEntry("HistoryEnabled", true); - QStringList history; - if (m_historyEnabled) { - history = m_config.readEntry("history", QStringList()); - } - if (m_history != history) { - m_history = history; - emit historyChanged(); - } - bool retainPriorSearch = m_config.readEntry("RetainPriorSearch", true); - if (retainPriorSearch != m_retainPriorSearch) { - m_retainPriorSearch = retainPriorSearch; - if (!m_retainPriorSearch) { - m_qmlObj->rootObject()->setProperty("query", QString()); - } - Q_EMIT retainPriorSearchChanged(); - } } bool View::event(QEvent *event) @@ -377,70 +358,6 @@ bool View::canConfigure() const return KAuthorized::authorizeControlModule(QStringLiteral("kcm_plasmasearch.desktop")); } -QStringList View::history() const -{ - return m_history; -} - -void View::addToHistory(const QString &item) -{ - if (!m_historyEnabled) { - return; - } - if (item.isEmpty()) { - return; - } - - if (item == QLatin1String("SESSIONS")) { - return; - } - - // Mimic shell behavior of not storing lines starting with a space - if (item.at(0).isSpace()) { - return; - } - - // Avoid removing the same item from the front and prepending it again - if (!m_history.isEmpty() && m_history.constFirst() == item) { - return; - } - - if (!KAuthorized::authorize(QStringLiteral("lineedit_text_completion"))) { - return; - } - - m_history.removeOne(item); - m_history.prepend(item); - - while (m_history.count() > 50) { // make configurable? - m_history.removeLast(); - } - - emit historyChanged(); - writeHistory(); - m_config.sync(); -} - -void View::removeFromHistory(int index) -{ - if (index < 0 || index >= m_history.count()) { - return; - } - - m_history.removeAt(index); - emit historyChanged(); - - writeHistory(); -} - -void View::writeHistory() -{ - if (!m_historyEnabled) { - return; - } - m_config.writeEntry("history", m_history); -} - void View::setVisible(bool visible) { m_requestedVisible = visible; @@ -452,10 +369,6 @@ void View::setVisible(bool visible) } } -bool View::retainPriorSearch() const { - return m_retainPriorSearch; -} - bool View::pinned() const { return m_pinned; diff --git a/krunner/view.h b/krunner/view.h index 26f5643b6..0fea420a2 100644 --- a/krunner/view.h +++ b/krunner/view.h @@ -48,8 +48,6 @@ class View : public PlasmaQuick::Dialog Q_CLASSINFO("D-Bus Interface", "org.kde.krunner.App") Q_PROPERTY(bool canConfigure READ canConfigure CONSTANT) - Q_PROPERTY(QStringList history READ history NOTIFY historyChanged) - Q_PROPERTY(bool retainPriorSearch READ retainPriorSearch NOTIFY retainPriorSearchChanged) Q_PROPERTY(bool pinned READ pinned WRITE setPinned NOTIFY pinnedChanged) public: @@ -64,17 +62,10 @@ public: bool canConfigure() const; QStringList history() const; - Q_INVOKABLE void addToHistory(const QString &item); - Q_INVOKABLE void removeFromHistory(int index); - - bool retainPriorSearch() const; - bool pinned() const; void setPinned(bool pinned); Q_SIGNALS: - void historyChanged(); - void retainPriorSearchChanged(); void pinnedChanged(); protected: @@ -109,9 +100,6 @@ private: qreal m_offset; bool m_floating : 1; bool m_requestedVisible = false; - QStringList m_history; - bool m_retainPriorSearch; - bool m_historyEnabled; bool m_pinned = false; }; diff --git a/lookandfeel/contents/runcommand/RunCommand.qml b/lookandfeel/contents/runcommand/RunCommand.qml index 23886b090..26de825c7 100644 --- a/lookandfeel/contents/runcommand/RunCommand.qml +++ b/lookandfeel/contents/runcommand/RunCommand.qml @@ -29,7 +29,7 @@ ColumnLayout { property string query property string runner property bool showHistory: false - property string priorSearch + property alias runnerManager: results.runnerManager LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft LayoutMirroring.childrenInherit: true @@ -44,16 +44,16 @@ ColumnLayout { if (runnerWindow.visible) { queryField.forceActiveFocus(); listView.currentIndex = -1 - if (runnerWindow.retainPriorSearch) { + if (runnerManager.retainPriorSearch) { // If we manually specified a query(D-Bus invocation) we don't want to retain the prior search if (!query) { - queryField.text = priorSearch + queryField.text = runnerManager.priorSearch queryField.select(root.query.length, 0) } } } else { - if (runnerWindow.retainPriorSearch) { - priorSearch = root.query + if (runnerManager.retainPriorSearch) { + runnerManager.priorSearch = root.query } root.runner = "" root.query = "" @@ -62,6 +62,18 @@ ColumnLayout { } } + Connections { + target: root + function onShowHistoryChanged() { + if (showHistory) { + // we store 50 entries in the history but only show 20 in the UI so it doesn't get too huge + listView.model = runnerManager.history.slice(0, 20) + } else { + listView.model = [] + } + } + } + RowLayout { Layout.alignment: Qt.AlignTop PlasmaComponents3.ToolButton { @@ -139,20 +151,12 @@ ColumnLayout { onTextChanged: { root.query = queryField.text - if (allowCompletion && length > 0) { - var history = runnerWindow.history - - // search the first item in the history rather than the shortest matching one - // this way more recently used entries take precedence over older ones (Bug 358985) - for (var i = 0, j = history.length; i < j; ++i) { - var item = history[i] - - if (item.toLowerCase().indexOf(text.toLowerCase()) === 0) { - var oldText = text - text = text + item.substr(oldText.length) - select(text.length, oldText.length) - break - } + if (allowCompletion && length > 0 && runnerManager.historyEnabled) { + var oldText = text + var suggestedText = runnerManager.getHistorySuggestion(text); + if (suggestedText.length > 0) { + text = suggestedText + select(text.length, oldText.length) } } } @@ -200,7 +204,7 @@ ColumnLayout { colorGroup: PlasmaCore.Theme.ButtonColorGroup } elementId: "down-arrow" - visible: queryField.length === 0 && runnerWindow.history.length > 0 + visible: queryField.length === 0 && runnerManager.historyEnabled MouseArea { anchors.fill: parent @@ -256,7 +260,6 @@ ColumnLayout { } onActivated: { - runnerWindow.addToHistory(queryString) runnerWindow.visible = false } @@ -281,8 +284,7 @@ ColumnLayout { highlight: PlasmaComponents.Highlight {} highlightMoveDuration: 0 activeFocusOnTab: true - // we store 50 entries in the history but only show 20 in the UI so it doesn't get too huge - model: root.showHistory ? runnerWindow.history.slice(0, 20) : [] + model: [] delegate: Milou.ResultDelegate { id: resultDelegate width: listView.width @@ -332,7 +334,7 @@ ColumnLayout { Keys.onDownPressed: incrementCurrentIndex() function runCurrentIndex(event) { - var entry = runnerWindow.history[currentIndex] + var entry = runnerManager.history[currentIndex] if (entry) { // If user presses Shift+Return to invoke an action, invoke the first runner action if (event && event.modifiers === Qt.ShiftModifier @@ -350,7 +352,8 @@ ColumnLayout { if (actionIndex === 0) { // QStringList changes just reset the model, so we'll remember the index and set it again var currentIndex = listView.currentIndex - runnerWindow.removeFromHistory(currentIndex) + runnerManager.removeFromHistory(currentIndex) + model = runnerManager.history listView.currentIndex = currentIndex } }