]> git.lyx.org Git - features.git/commitdiff
GuiDocument: Add filter to modules selection
authorJuergen Spitzmueller <spitz@lyx.org>
Fri, 5 Apr 2019 09:52:37 +0000 (11:52 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 18 Jun 2020 13:48:24 +0000 (15:48 +0200)
Sorting by category is needs more work, since the GuiIdListModel is
not suitable for trees.

src/frontends/qt4/GuiDocument.cpp
src/frontends/qt4/GuiDocument.h
src/frontends/qt4/ui/ModulesUi.ui

index 59e04aa73e6e32b1aa1ae043f70cc80d94da165a..3d84dc610bd84db8e2defdcb1a9644d391f2ffa3 100644 (file)
@@ -264,7 +264,7 @@ public:
        ///
        ModuleSelectionManager(QObject * parent,
                               QTreeView * availableLV,
-                              QListView * selectedLV,
+                              QTreeView * selectedLV,
                               QPushButton * addPB,
                               QPushButton * delPB,
                               QPushButton * upPB,
@@ -1523,6 +1523,9 @@ GuiDocument::GuiDocument(GuiView & lv)
        modulesModule->availableLV->header()->setVisible(false);
        setSectionResizeMode(modulesModule->availableLV->header(), QHeaderView::ResizeToContents);
        modulesModule->availableLV->header()->setStretchLastSection(false);
+       modulesModule->selectedLV->header()->setVisible(false);
+       setSectionResizeMode(modulesModule->selectedLV->header(), QHeaderView::ResizeToContents);
+       modulesModule->selectedLV->header()->setStretchLastSection(false);
        selectionManager =
                new ModuleSelectionManager(this, modulesModule->availableLV,
                                           modulesModule->selectedLV,
@@ -1530,11 +1533,34 @@ GuiDocument::GuiDocument(GuiView & lv)
                                           modulesModule->deletePB,
                                           modulesModule->upPB,
                                           modulesModule->downPB,
-                                          availableModel(), selectedModel(), this);
+                                          availableModel(), selectedModel(), this);
        connect(selectionManager, SIGNAL(updateHook()),
                this, SLOT(updateModuleInfo()));
        connect(selectionManager, SIGNAL(selectionChanged()),
                this, SLOT(modulesChanged()));
+       // The filter bar
+       filter_ = new FancyLineEdit(this);
+       filter_->setButtonPixmap(FancyLineEdit::Right, getPixmap("images/", "editclear", "svgz,png"));
+       filter_->setButtonVisible(FancyLineEdit::Right, true);
+       filter_->setButtonToolTip(FancyLineEdit::Right, qt_("Clear text"));
+       filter_->setAutoHideButton(FancyLineEdit::Right, true);
+       filter_->setPlaceholderText(qt_("All avail. modules"));
+       modulesModule->moduleFilterBarL->addWidget(filter_, 0);
+       modulesModule->findModulesLA->setBuddy(filter_);
+
+       connect(filter_, SIGNAL(rightButtonClicked()),
+               this, SLOT(resetModuleFilter()));
+       connect(filter_, SIGNAL(textEdited(QString)),
+               this, SLOT(moduleFilterChanged(QString)));
+       connect(filter_, SIGNAL(returnPressed()),
+               this, SLOT(moduleFilterPressed()));
+#if (QT_VERSION < 0x050000)
+       connect(filter_, SIGNAL(downPressed()),
+               modulesModule->availableLV, SLOT(setFocus()));
+#else
+       connect(filter_, &FancyLineEdit::downPressed,
+               modulesModule->availableLV, [=](){ focusAndHighlight(modulesModule->availableLV); });
+#endif
 
 
        // PDF support
@@ -1722,6 +1748,52 @@ void GuiDocument::slotButtonBox(QAbstractButton * button)
 }
 
 
+void GuiDocument::filterModules(QString const & str)
+{
+       updateAvailableModules();
+       if (str.isEmpty())
+               return;
+
+       modules_av_model_.clear();
+       list<modInfoStruct> modInfoList = getModuleInfo();
+       // Sort names according to the locale
+       modInfoList.sort([](modInfoStruct const & a, modInfoStruct const & b) {
+                       return 0 < b.name.localeAwareCompare(a.name);
+               });
+       int i = 0;
+       for (modInfoStruct const & m : modInfoList) {
+               if (m.name.contains(str, Qt::CaseInsensitive) || contains(m.id, fromqstr(str))) {
+                       modules_av_model_.insertRow(i, m.name, m.id, m.description);
+                       ++i;
+               }
+       }
+}
+
+
+void GuiDocument::moduleFilterChanged(const QString & text)
+{
+       if (!text.isEmpty()) {
+               filterModules(filter_->text());
+               return;
+       }
+       filterModules(filter_->text());
+       filter_->setFocus();
+}
+
+
+void GuiDocument::moduleFilterPressed()
+{
+       filterModules(filter_->text());
+}
+
+
+void GuiDocument::resetModuleFilter()
+{
+       filter_->setText(QString());
+       filterModules(filter_->text());
+}
+
+
 void GuiDocument::includeonlyClicked(QTreeWidgetItem * item, int)
 {
        if (item == 0)
@@ -4693,6 +4765,8 @@ GuiDocument::modInfoStruct GuiDocument::modInfo(LyXModule const & mod)
        modInfoStruct m;
        m.id = mod.getID();
        m.name = toqstr(translateIfPossible(from_utf8(mod.getName())));
+       m.category = mod.category().empty() ? qt_("Miscellaneous")
+                                           : toqstr(translateIfPossible(from_utf8(mod.category())));
        QString desc = toqstr(translateIfPossible(from_utf8(mod.getDescription())));
        // Find the first sentence of the description
        QTextBoundaryFinder bf(QTextBoundaryFinder::Sentence, desc);
@@ -4712,8 +4786,7 @@ void GuiDocument::loadModuleInfo()
 {
        moduleNames_.clear();
        for (LyXModule const & mod : theModuleList)
-               if (mod.category().substr(0, 8) != "Citation")
-                       moduleNames_.push_back(modInfo(mod));
+               moduleNames_.push_back(modInfo(mod));
 }
 
 
index eebd2675f40f245932bdd169205a01084dd2d90a..4f41faad32bf0ffe4a30e7949a0f6c0c01f7f761 100644 (file)
@@ -155,6 +155,9 @@ private Q_SLOTS:
        void allPackagesAuto();
        void allPackagesAlways();
        void allPackagesNot();
+       void moduleFilterPressed();
+       void moduleFilterChanged(const QString & text);
+       void resetModuleFilter();
 private:
        /// validate listings parameters and return an error message, if any
        QString validateListingsParameters();
@@ -219,6 +222,9 @@ private:
        /// selected modules
        GuiIdListModel modules_sel_model_;
 
+       /// Module filter
+       FancyLineEdit * filter_;
+
        /// return false if validate_listings_params returns error
        bool isValid();
 
@@ -249,6 +255,7 @@ private:
                QString name;
                std::string id;
                QString description;
+               QString category;
        };
        ///
        static modInfoStruct modInfo(LyXModule const & mod);
@@ -305,6 +312,8 @@ private:
        ///
        void checkPossibleCiteEngines();
        ///
+       void filterModules(QString const & string);
+       ///
        BufferParams bp_;
        /// List of names of available modules
        std::list<modInfoStruct> moduleNames_;
index 472a0a22c2d53336a409057c77374d8c6fbf35bb..0bfeb39c05e7e5cb4679357d1e5bc4a62555e135 100644 (file)
-<ui version="4.0" >
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
  <class>ModulesUi</class>
- <widget class="QWidget" name="ModulesUi" >
-  <property name="geometry" >
+ <widget class="QWidget" name="ModulesUi">
+  <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>407</width>
-    <height>340</height>
+    <height>343</height>
    </rect>
   </property>
-  <property name="windowTitle" >
+  <property name="windowTitle">
    <string/>
   </property>
-  <layout class="QGridLayout" >
-   <property name="margin" >
-    <number>9</number>
-   </property>
-   <property name="spacing" >
-    <number>6</number>
-   </property>
-   <item row="1" column="0" >
-    <widget class="QTextBrowser" name="infoML" >
-     <property name="sizePolicy" >
-      <sizepolicy vsizetype="Maximum" hsizetype="Expanding" >
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout">
+     <property name="spacing">
+      <number>6</number>
      </property>
-     <property name="maximumSize" >
-      <size>
-       <width>16777215</width>
-       <height>120</height>
-      </size>
+     <property name="leftMargin">
+      <number>0</number>
      </property>
-    </widget>
-   </item>
-   <item row="0" column="0" >
-    <layout class="QHBoxLayout" >
-     <property name="spacing" >
-      <number>6</number>
+     <property name="topMargin">
+      <number>0</number>
      </property>
-     <property name="margin" >
+     <property name="rightMargin">
+      <number>0</number>
+     </property>
+     <property name="bottomMargin">
       <number>0</number>
      </property>
      <item>
-      <layout class="QVBoxLayout" >
-       <property name="spacing" >
+      <layout class="QVBoxLayout">
+       <property name="spacing">
         <number>6</number>
        </property>
-       <property name="margin" >
+       <property name="leftMargin">
+        <number>0</number>
+       </property>
+       <property name="topMargin">
+        <number>0</number>
+       </property>
+       <property name="rightMargin">
+        <number>0</number>
+       </property>
+       <property name="bottomMargin">
         <number>0</number>
        </property>
        <item>
-        <widget class="QLabel" name="availmodL" >
-         <property name="frameShape" >
+        <widget class="QLabel" name="availmodL">
+         <property name="frameShape">
           <enum>QFrame::NoFrame</enum>
          </property>
-         <property name="text" >
+         <property name="text">
           <string>A&amp;vailable:</string>
          </property>
-         <property name="buddy" >
+         <property name="buddy">
           <cstring>availableLV</cstring>
          </property>
         </widget>
        </item>
        <item>
-        <widget class="QTreeView" name="availableLV" >
-         <property name="rootIsDecorated" >
+        <widget class="QTreeView" name="availableLV">
+         <property name="rootIsDecorated">
           <bool>false</bool>
          </property>
         </widget>
        </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_6">
+         <item>
+          <widget class="QLabel" name="findModulesLA">
+           <property name="text">
+            <string>&amp;Filter:</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="moduleFilterBarL"/>
+         </item>
+        </layout>
+       </item>
       </layout>
      </item>
      <item>
-      <layout class="QVBoxLayout" >
-       <property name="spacing" >
+      <layout class="QVBoxLayout">
+       <property name="spacing">
         <number>6</number>
        </property>
-       <property name="margin" >
+       <property name="leftMargin">
+        <number>0</number>
+       </property>
+       <property name="topMargin">
+        <number>0</number>
+       </property>
+       <property name="rightMargin">
+        <number>0</number>
+       </property>
+       <property name="bottomMargin">
         <number>0</number>
        </property>
        <item>
         <spacer>
-         <property name="orientation" >
+         <property name="orientation">
           <enum>Qt::Horizontal</enum>
          </property>
-         <property name="sizeHint" stdset="0" >
+         <property name="sizeType">
+          <enum>QSizePolicy::Minimum</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
           <size>
            <width>51</width>
            <height>20</height>
           </size>
          </property>
-         <property name="sizeType">
-          <enum>QSizePolicy::Minimum</enum>
-         </property>
         </spacer>
        </item>
        <item>
-        <widget class="QPushButton" name="addPB" >
-         <property name="text" >
+        <widget class="QPushButton" name="addPB">
+         <property name="text">
           <string>A&amp;dd</string>
          </property>
         </widget>
        </item>
        <item>
-        <widget class="QPushButton" name="deletePB" >
-         <property name="text" >
+        <widget class="QPushButton" name="deletePB">
+         <property name="text">
           <string>De&amp;lete</string>
          </property>
         </widget>
        </item>
        <item>
-        <widget class="QPushButton" name="upPB" >
-         <property name="text" >
+        <widget class="QPushButton" name="upPB">
+         <property name="text">
           <string>&amp;Up</string>
          </property>
         </widget>
        </item>
        <item>
-        <widget class="QPushButton" name="downPB" >
-         <property name="text" >
+        <widget class="QPushButton" name="downPB">
+         <property name="text">
           <string>Do&amp;wn</string>
          </property>
         </widget>
        </item>
        <item>
         <spacer>
-         <property name="orientation" >
+         <property name="orientation">
           <enum>Qt::Vertical</enum>
          </property>
-         <property name="sizeHint" stdset="0" >
+         <property name="sizeHint" stdset="0">
           <size>
            <width>60</width>
            <height>16</height>
       </layout>
      </item>
      <item>
-      <layout class="QVBoxLayout" >
-       <property name="spacing" >
+      <layout class="QVBoxLayout">
+       <property name="spacing">
         <number>6</number>
        </property>
-       <property name="margin" >
+       <property name="leftMargin">
+        <number>0</number>
+       </property>
+       <property name="topMargin">
+        <number>0</number>
+       </property>
+       <property name="rightMargin">
+        <number>0</number>
+       </property>
+       <property name="bottomMargin">
         <number>0</number>
        </property>
        <item>
-        <widget class="QLabel" name="selmodL" >
-         <property name="text" >
+        <widget class="QLabel" name="selmodL">
+         <property name="text">
           <string>S&amp;elected:</string>
          </property>
-         <property name="buddy" >
+         <property name="buddy">
           <cstring>selectedLV</cstring>
          </property>
         </widget>
        </item>
        <item>
-        <widget class="QListView" name="selectedLV" >
-         <property name="editTriggers" >
-          <set>QAbstractItemView::NoEditTriggers</set>
+        <widget class="QTreeView" name="selectedLV">
+         <property name="rootIsDecorated">
+          <bool>false</bool>
          </property>
         </widget>
        </item>
      </item>
     </layout>
    </item>
+   <item row="1" column="0">
+    <widget class="QTextBrowser" name="infoML">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>120</height>
+      </size>
+     </property>
+    </widget>
+   </item>
   </layout>
  </widget>
  <tabstops>
   <tabstop>deletePB</tabstop>
   <tabstop>upPB</tabstop>
   <tabstop>downPB</tabstop>
-  <tabstop>selectedLV</tabstop>
   <tabstop>infoML</tabstop>
  </tabstops>
  <includes>
-  <include location="local" >qt_i18n.h</include>
+  <include location="local">qt_i18n.h</include>
  </includes>
  <resources/>
  <connections/>