]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt/GuiLyXFiles.cpp
Make string-widget combination more l7n friendly
[lyx.git] / src / frontends / qt / GuiLyXFiles.cpp
index 9e1caf929506c205755102be8120812dbcb6a883..1bfbdbb5ce2b5dd620fd922db2cfa33b2e7b5fc6 100644 (file)
@@ -26,6 +26,7 @@
 #include "support/qstring_helpers.h"
 #include "support/Package.h"
 
+#include <QVector>
 #include <QDirIterator>
 #include <QTreeWidget>
 
@@ -149,7 +150,6 @@ QMap<QString, QString> GuiLyXFiles::getFiles()
                ++i;
        }
        setLanguage();
-       languageLA->setText(qt_("Preferred &Language:"));
        return result;
 }
 
@@ -186,19 +186,11 @@ GuiLyXFiles::GuiLyXFiles(GuiView & lv)
 
        // 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_->setClearButton(true);
        filter_->setPlaceholderText(qt_("All available files"));
        filter_->setToolTip(qt_("Enter string to filter the list of available files"));
-#if (QT_VERSION < 0x050000)
-       connect(filter_, SIGNAL(downPressed()),
-               filesLW, SLOT(setFocus()));
-#else
        connect(filter_, &FancyLineEdit::downPressed,
-               filesLW, [=](){ focusAndHighlight(filesLW); });
-#endif
+               filesLW, [this](){ focusAndHighlight(filesLW); });
 
        filterBarL->addWidget(filter_, 0);
        findKeysLA->setBuddy(filter_);
@@ -313,9 +305,6 @@ void GuiLyXFiles::on_filesLW_itemClicked(QTreeWidgetItem * item, int)
                        languageCO->addItem(i.value(), i.key());
                ++i;
        }
-       languageLA->setText(qt_("File &Language:"));
-       languageCO->setToolTip(qt_("All available languages of the selected file are displayed here.\n"
-                                  "The selected language version will be opened."));
        setLanguage();
        QString const realpath = getRealPath();
        filesLW->currentItem()->setData(0, Qt::ToolTipRole, realpath);
@@ -330,8 +319,18 @@ void GuiLyXFiles::on_filesLW_itemClicked(QTreeWidgetItem * item, int)
 void GuiLyXFiles::setLanguage()
 {
        // Enable language selection only if there is a selection.
-       languageCO->setEnabled(languageCO->count() > 1);
-       languageLA->setEnabled(languageCO->count() > 1);
+       bool const item_selected =  filesLW->currentItem();
+       bool const language_alternatives = languageCO->count() > 1;
+       languageCO->setEnabled(item_selected && language_alternatives);
+       languageLA->setEnabled(item_selected && language_alternatives);
+       if (item_selected && language_alternatives)
+               languageCO->setToolTip(qt_("All available languages of the selected file are displayed here.\n"
+                                          "The selected language version will be opened."));
+       else if (item_selected)
+               languageCO->setToolTip(qt_("No alternative language versions available for the selected file."));
+       else
+               languageCO->setToolTip(qt_("If alternative languages are available for a given file,\n"
+                                          "they can be chosen here if a file is selected."));
        // first try last setting
        if (!savelang_.isEmpty()) {
                int index = languageCO->findData(savelang_);
@@ -413,6 +412,8 @@ void GuiLyXFiles::updateContents()
        filesLW->clear();
        QIcon user_icon(getPixmap("images/", "lyxfiles-user", "svgz,png"));
        QIcon system_icon(getPixmap("images/", "lyxfiles-system", "svgz,png"));
+       QIcon user_folder_icon(getPixmap("images/", "lyxfiles-user-folder", "svgz,png"));
+       QIcon system_folder_icon(getPixmap("images/", "lyxfiles-system-folder", "svgz,png"));
        QStringList cats;
        QMap<QString, QString>::const_iterator it = files.constBegin();
        QFont capfont;
@@ -448,8 +449,8 @@ void GuiLyXFiles::updateContents()
                        guiname = qt_("Default Template");
                else if (translateName())
                        guiname = toqstr(translateIfPossible(qstring_to_ucs4(guiString(guiname))));
-               QIcon file_icon = (realpath.startsWith(toqstr(package().user_support().absFileName()))) ?
-                               user_icon : system_icon;
+               bool const user = realpath.startsWith(toqstr(package().user_support().absFileName()));
+               QIcon file_icon = user ? user_icon : system_icon;
                item->setIcon(0, file_icon);
                item->setData(0, Qt::UserRole, it.key());
                item->setData(0, Qt::DisplayRole, guiname);
@@ -472,6 +473,7 @@ void GuiLyXFiles::updateContents()
                        if (!subcatItem) {
                                subcatItem = new QTreeWidgetItem();
                                subcatItem->setText(0, subcat);
+                               file_icon = user ? user_folder_icon : system_folder_icon;
                                subcatItem->setIcon(0, file_icon);
                                cats << catsave;
                        }
@@ -505,12 +507,43 @@ void GuiLyXFiles::filterLabels()
 {
        Qt::CaseSensitivity cs = csFindCB->isChecked() ?
                Qt::CaseSensitive : Qt::CaseInsensitive;
+       // Collect "active" categories (containing entries
+       // that match the filter)
+       QVector<QTreeWidgetItem*> activeCats;
        QTreeWidgetItemIterator it(filesLW);
        while (*it) {
-               (*it)->setHidden(
-                       (*it)->childCount() == 0
-                       && !(*it)->text(0).contains(filter_->text(), cs)
-               );
+               if ((*it)->childCount() > 0) {
+                       // Unhide parents (will be hidden
+                       // below if necessary)
+                       (*it)->setHidden(false);
+                       ++it;
+                       continue;
+               }
+               bool const match = (*it)->text(0).contains(filter_->text(), cs);
+               if (match) {
+                       // Register parents of matched entries
+                       // so we don't hide those later.
+                       QTreeWidgetItem * twi = *it;
+                       while (true) {
+                               if (!twi->parent())
+                                       break;
+                               activeCats << twi->parent();
+                               // ascend further up if possible
+                               twi = twi->parent();
+                       }
+               }
+               (*it)->setHidden(!match);
+               ++it;
+       }
+       // Iterate through parents once more
+       // to hide empty categories
+       it = QTreeWidgetItemIterator(filesLW);
+       while (*it) {
+               if ((*it)->childCount() == 0) {
+                       ++it;
+                       continue;
+               }
+               (*it)->setHidden(!activeCats.contains(*it));
                ++it;
        }
 }
@@ -600,7 +633,7 @@ void GuiLyXFiles::dispatchParams()
        string arg;
        if (type_ == "templates")
                arg = "newfile ";
-       arg += fromqstr(file_);
+       arg += quoteName(fromqstr(file_));
        FuncCode const lfun = getLfun();
 
        if (lfun == LFUN_NOACTION)
@@ -620,8 +653,6 @@ FuncCode GuiLyXFiles::getLfun() const
        return LFUN_NOACTION;
 }
 
-Dialog * createGuiLyXFiles(GuiView & lv) { return new GuiLyXFiles(lv); }
-
 
 } // namespace frontend
 } // namespace lyx