X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt%2FTocWidget.cpp;h=573e232993d80705f92e33134343f8b70984d752;hb=89394bcd0f3b5079a066d8c3f6f7a5e606073db3;hp=4c69aa3ba5cecbd13add035873b8b2dd651d5979;hpb=e5b6be0712a245901ec54aee44da45db77594382;p=features.git diff --git a/src/frontends/qt/TocWidget.cpp b/src/frontends/qt/TocWidget.cpp index 4c69aa3ba5..573e232993 100644 --- a/src/frontends/qt/TocWidget.cpp +++ b/src/frontends/qt/TocWidget.cpp @@ -17,9 +17,11 @@ #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 #include +#include #include @@ -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,7 +100,16 @@ 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())); // setting the update timer @@ -327,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(); @@ -347,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]); @@ -361,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()); } @@ -504,15 +537,28 @@ 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; + bool const show_inactive = + 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 const 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()); tocTV->setRowHidden(index.row(), index.parent(), !matches); } // recursively unhide parents of unhidden children