]> git.lyx.org Git - features.git/blobdiff - src/frontends/qt/TocWidget.cpp
Show suggestions containing the input in the command buffer
[features.git] / src / frontends / qt / TocWidget.cpp
index 3f5928368dc974da0a91e4f738f5be12db48e9d2..573e232993d80705f92e33134343f8b70984d752 100644 (file)
 #include "GuiView.h"
 #include "qt_helpers.h"
 #include "TocModel.h"
+#include "FancyLineEdit.h"
 
 #include "Buffer.h"
 #include "BufferView.h"
+#include "Cursor.h"
 #include "CutAndPaste.h"
 #include "FuncRequest.h"
 #include "FuncStatus.h"
@@ -35,6 +37,7 @@
 
 #include <QHeaderView>
 #include <QMenu>
+#include <QTimer>
 
 #include <vector>
 
@@ -75,11 +78,18 @@ TocWidget::TocWidget(GuiView & gui_view, QWidget * parent)
 
        // Only one item selected at a time.
        tocTV->setSelectionMode(QAbstractItemView::SingleSelection);
-       setFocusProxy(tocTV);
 
        // The toc types combo won't change its model.
        typeCO->setModel(gui_view_.tocModels().nameModel());
 
+       // The filter bar
+       filter_ = new FancyLineEdit(this);
+       filter_->setClearButton(true);
+       filter_->setPlaceholderText(qt_("All items"));
+       filterBarL->addWidget(filter_, 0);
+       filterLA->setBuddy(filter_);
+       setFocusProxy(filter_);
+
        // Make sure the buttons are disabled when first shown without a loaded
        // Buffer.
        enableControls(false);
@@ -90,8 +100,15 @@ TocWidget::TocWidget(GuiView & gui_view, QWidget * parent)
                this, SLOT(showContextMenu(const QPoint &)));
        connect(tocTV, SIGNAL(customContextMenuRequested(const QPoint &)),
                this, SLOT(showContextMenu(const QPoint &)));
-       connect(filterLE, SIGNAL(textEdited(QString)),
+       connect(filter_, SIGNAL(textEdited(QString)),
                this, SLOT(filterContents()));
+#if (QT_VERSION < 0x050000)
+       connect(filter_, SIGNAL(downPressed()),
+               tocTV, SLOT(setFocus()));
+#else
+       connect(filter_, &FancyLineEdit::downPressed,
+               tocTV, [this](){ focusAndHighlight(tocTV); });
+#endif
        connect(activeFilterCO, SIGNAL(activated(int)),
                this, SLOT(filterContents()));
 
@@ -329,9 +346,8 @@ void TocWidget::setTreeDepth(int depth)
 }
 
 
-void TocWidget::on_typeCO_currentIndexChanged(int index)
+void TocWidget::on_typeCO_activated(int index)
 {
-
        if (index == -1)
                return;
        current_type_ = typeCO->itemData(index).toString();
@@ -349,7 +365,7 @@ void TocWidget::outline(FuncCode func_code)
 
        //if another window is active, this attempt will fail,
        //but it will work at least for the second attempt
-       gui_view_.activateWindow(); 
+       gui_view_.activateWindow();
 
        enableControls(false);
        goTo(list[0]);
@@ -363,7 +379,22 @@ void TocWidget::sendDispatch(FuncRequest fr)
 {
 
        fr.setViewOrigin(&gui_view_);
-       DispatchResult dr=dispatch(fr);
+       GuiWorkArea * old_wa = gui_view_.currentWorkArea();
+       GuiWorkArea * doc_wa = gui_view_.currentMainWorkArea();
+       /* The ToC command should be dispatched to the document work area,
+        * not the Adv. Find&Replace (which is the only other know
+        * possibility.
+        */
+       if (doc_wa != nullptr && doc_wa != old_wa)
+               gui_view_.setCurrentWorkArea(doc_wa);
+       DispatchResult const & dr = dispatch(fr);
+       /* If the current workarea has not explicitely changed, and the
+        * original one is still visible, let's reset it.
+        */
+       if (gui_view_.currentWorkArea() == doc_wa
+            && gui_view_.hasVisibleWorkArea(old_wa)
+            && doc_wa != old_wa)
+               gui_view_.setCurrentWorkArea(old_wa);
        if (dr.error())
                gui_view_.message(dr.message());
 }
@@ -506,8 +537,13 @@ void TocWidget::filterContents()
 
        QModelIndexList indices = tocTV->model()->match(
                tocTV->model()->index(0, 0),
-               Qt::DisplayRole, "*", -1,
-               Qt::MatchFlags(Qt::MatchWildcard|Qt::MatchRecursive));
+               Qt::DisplayRole, ".*", -1,
+#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
+               Qt::MatchFlags(Qt::MatchRegularExpression|Qt::MatchRecursive));
+#else
+               // deprecated in Qt 5.15.
+               Qt::MatchFlags(Qt::MatchRegExp|Qt::MatchRecursive));
+#endif
 
        bool const show_active =
                activeFilterCO->currentIndex() != 2;
@@ -515,11 +551,11 @@ void TocWidget::filterContents()
                activeFilterCO->currentIndex() != 1;
 
        int size = indices.size();
+       QString const matchstring = filter_ ? filter_->text() : QString();
        for (int i = 0; i < size; i++) {
                QModelIndex index = indices[i];
-               bool matches =
-                       index.data().toString().contains(
-                               filterLE->text(), Qt::CaseInsensitive);
+               bool matches = index.data().toString().contains(
+                                       matchstring, Qt::CaseInsensitive);
                TocItem const & item =
                        gui_view_.tocModels().currentItem(current_type_, index);
                matches &= (show_active && item.isOutput()) || (show_inactive && !item.isOutput());