X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt%2FGuiLyXFiles.cpp;h=1bfbdbb5ce2b5dd620fd922db2cfa33b2e7b5fc6;hb=29a8097c3c14aad871c7e396a59542fe47e39ea1;hp=00c2ea0015a4a10cf5565e114affd7eb2fe7af9e;hpb=d3ca28b468199408c5adb01c33cf0117469ad25c;p=lyx.git diff --git a/src/frontends/qt/GuiLyXFiles.cpp b/src/frontends/qt/GuiLyXFiles.cpp index 00c2ea0015..1bfbdbb5ce 100644 --- a/src/frontends/qt/GuiLyXFiles.cpp +++ b/src/frontends/qt/GuiLyXFiles.cpp @@ -26,6 +26,7 @@ #include "support/qstring_helpers.h" #include "support/Package.h" +#include #include #include @@ -149,7 +150,6 @@ QMap 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, [this](){ focusAndHighlight(filesLW); }); -#endif 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::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 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)