]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt/GuiRef.cpp
Properly scale some icons for HiDPI (#12695)
[lyx.git] / src / frontends / qt / GuiRef.cpp
index f16c6565a60aaea14f4b094b955d6c8ed329cfbe..9b9144377a244428820f1d6b64fb57faff5572cf 100644 (file)
@@ -22,6 +22,7 @@
 #include "Cursor.h"
 #include "FancyLineEdit.h"
 #include "FuncRequest.h"
+#include "PDFOptions.h"
 
 #include "qt_helpers.h"
 
@@ -56,19 +57,11 @@ GuiRef::GuiRef(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 labels"));
        filter_->setToolTip(qt_("Enter string to filter the list of available labels"));
-#if (QT_VERSION < 0x050000)
-       connect(filter_, SIGNAL(downPressed()),
-               refsTW, SLOT(setFocus()));
-#else
        connect(filter_, &FancyLineEdit::downPressed,
-               refsTW, [=](){ focusAndHighlight(refsTW); });
-#endif
+               refsTW, [this](){ focusAndHighlight(refsTW); });
 
        filterBarL->addWidget(filter_, 0);
        findKeysLA->setBuddy(filter_);
@@ -117,6 +110,8 @@ GuiRef::GuiRef(GuiView & lv)
                this, SLOT(changed_adaptor()));
        connect(noprefixCB, SIGNAL(clicked()),
                this, SLOT(changed_adaptor()));
+       connect(nolinkCB, SIGNAL(clicked()),
+               this, SLOT(changed_adaptor()));
 
        enableBoxes();
 
@@ -145,13 +140,17 @@ void GuiRef::enableView(bool enable)
 void GuiRef::enableBoxes()
 {
        QString const reftype =
-               typeCO->itemData(typeCO->currentIndex()).toString();
+           typeCO->itemData(typeCO->currentIndex()).toString();
        bool const isFormatted = (reftype == "formatted");
        bool const isLabelOnly = (reftype == "labelonly");
        bool const usingRefStyle = buffer().params().use_refstyle;
-       pluralCB->setEnabled(isFormatted && usingRefStyle);
-       capsCB->setEnabled(isFormatted && usingRefStyle);
-       noprefixCB->setEnabled(isLabelOnly);
+       bool const intext = bufferview()->cursor().inTexted();
+       bool const hyper_on = buffer().params().pdfoptions().use_hyperref;
+       pluralCB->setEnabled(intext && isFormatted && usingRefStyle);
+       capsCB->setEnabled(intext && isFormatted && usingRefStyle);
+       noprefixCB->setEnabled(intext && isLabelOnly);
+       // disabling of hyperlinks not supported by formatted references
+       nolinkCB->setEnabled(hyper_on && intext && !isFormatted && !isLabelOnly);
 }
 
 
@@ -204,7 +203,7 @@ void GuiRef::refHighlighted(QTreeWidgetItem * sel)
        bool const cur_item_selected = sel->isSelected();
 
        if (cur_item_selected)
-               referenceED->setText(sel->text(0));
+               referenceED->setText(sel->data(0, Qt::UserRole).toString());
 
        if (at_ref_)
                gotoRef();
@@ -238,7 +237,7 @@ void GuiRef::refSelected(QTreeWidgetItem * sel)
        bool const cur_item_selected = sel->isSelected();
 
        if (cur_item_selected)
-               referenceED->setText(sel->text(0));
+               referenceED->setText(sel->data(0, Qt::UserRole).toString());
        // <enter> or double click, inserts ref and closes dialog
        slotOK();
 }
@@ -317,18 +316,15 @@ void GuiRef::updateContents()
        typeCO->clear();
 
        // FIXME Bring InsetMathRef on par with InsetRef
-       // (see #9798)
+       // (see #11104)
        typeCO->addItem(qt_("<reference>"), "ref");
        typeCO->addItem(qt_("(<reference>)"), "eqref");
        typeCO->addItem(qt_("<page>"), "pageref");
        typeCO->addItem(qt_("on page <page>"), "vpageref");
        typeCO->addItem(qt_("<reference> on page <page>"), "vref");
        typeCO->addItem(qt_("Textual reference"), "nameref");
-       if (bufferview()->cursor().inTexted()) {
-               typeCO->addItem(qt_("Formatted reference"), "formatted");
-               typeCO->addItem(qt_("Label only"), "labelonly");
-       } else
-               typeCO->addItem(qt_("Formatted reference"), "prettyref");
+       typeCO->addItem(qt_("Formatted reference"), "formatted");
+       typeCO->addItem(qt_("Label only"), "labelonly");
 
        referenceED->setText(toqstr(params_["reference"]));
 
@@ -348,6 +344,7 @@ void GuiRef::updateContents()
        pluralCB->setChecked(params_["plural"] == "true");
        capsCB->setChecked(params_["caps"] == "true");
        noprefixCB->setChecked(params_["noprefix"] == "true");
+       nolinkCB->setChecked(params_["nolink"] == "true");
 
        // insert buffer list
        bufferCO->clear();
@@ -390,6 +387,8 @@ void GuiRef::applyView()
              from_ascii("true") : from_ascii("false");
        params_["noprefix"] = noprefixCB->isChecked() ?
              from_ascii("true") : from_ascii("false");
+       params_["nolink"] = nolinkCB->isChecked() ?
+             from_ascii("true") : from_ascii("false");
        restored_buffer_ = bufferCO->currentIndex();
 }
 
@@ -424,6 +423,11 @@ void GuiRef::gotoRef()
        at_ref_ = !at_ref_;
 }
 
+inline bool caseInsensitiveLessThanVec(QPair<QString, QString> const & s1, QPair<QString, QString> const & s2)
+{
+       return s1.first.toLower() < s2.first.toLower();
+}
+
 inline bool caseInsensitiveLessThan(QString const & s1, QString const & s2)
 {
        return s1.toLower() < s2.toLower();
@@ -444,13 +448,17 @@ void GuiRef::redoRefs()
        // the first item inserted
        QString const oldSelection(referenceED->text());
 
-       QStringList refsStrings;
+       // Plain label and GUI string. This might get resorted below
+       QVector<QPair<QString, QString>> refsNames;
+       // List of categories (prefixes)
        QStringList refsCategories;
-       vector<docstring>::const_iterator iter;
+       // Do we have a prefix-less label at all?
        bool noprefix = false;
+       vector<std::pair<docstring, docstring>>::const_iterator iter;
        for (iter = refs_.begin(); iter != refs_.end(); ++iter) {
-               QString const lab = toqstr(*iter);
-               refsStrings.append(lab);
+               // first: plain label name, second: gui name
+               QString const lab = toqstr((*iter).first);
+               refsNames.append({lab, toqstr((*iter).second)});
                if (groupCB->isChecked()) {
                        if (lab.contains(":")) {
                                QString const pref = lab.split(':')[0];
@@ -474,11 +482,12 @@ void GuiRef::redoRefs()
        QString const sort_method = sortingCO->isEnabled() ?
                                        sortingCO->itemData(sortingCO->currentIndex()).toString()
                                        : QString();
+       // Sort items if so requested.
        if (sort_method == "nocase")
-               sort(refsStrings.begin(), refsStrings.end(),
-                         caseInsensitiveLessThan /*defined above*/);
+               sort(refsNames.begin(), refsNames.end(),
+                         caseInsensitiveLessThanVec /*defined above*/);
        else if (sort_method == "case")
-               sort(refsStrings.begin(), refsStrings.end());
+               sort(refsNames.begin(), refsNames.end());
 
        if (groupCB->isChecked()) {
                QList<QTreeWidgetItem *> refsCats;
@@ -486,14 +495,16 @@ void GuiRef::redoRefs()
                        QString const & cat = refsCategories.at(i);
                        QTreeWidgetItem * item = new QTreeWidgetItem(refsTW);
                        item->setText(0, cat);
-                       for (int j = 0; j < refsStrings.size(); ++j) {
-                               QString const & ref = refsStrings.at(j);
+                       for (int j = 0; j < refsNames.size(); ++j) {
+                               QString const ref = refsNames.at(j).first;
                                if ((ref.startsWith(cat + QString(":")))
                                    || (cat == qt_("<No prefix>")
                                       && (!ref.mid(1).contains(":") || ref.left(1).contains(":")))) {
                                                QTreeWidgetItem * child =
                                                        new QTreeWidgetItem(item);
-                                               child->setText(0, ref);
+                                               QString const val = refsNames.at(j).second;
+                                               child->setText(0, val);
+                                               child->setData(0, Qt::UserRole, ref);
                                                item->addChild(child);
                                }
                        }
@@ -502,9 +513,12 @@ void GuiRef::redoRefs()
                refsTW->addTopLevelItems(refsCats);
        } else {
                QList<QTreeWidgetItem *> refsItems;
-               for (int i = 0; i < refsStrings.size(); ++i) {
+               for (int i = 0; i < refsNames.size(); ++i) {
                        QTreeWidgetItem * item = new QTreeWidgetItem(refsTW);
-                       item->setText(0, refsStrings.at(i));
+                       QString const ref = refsNames.at(i).first;
+                       QString const val = refsNames.at(i).second;
+                       item->setText(0, val);
+                       item->setData(0, Qt::UserRole, ref);
                        refsItems.append(item);
                }
                refsTW->addTopLevelItems(refsItems);
@@ -615,6 +629,7 @@ void GuiRef::dispatchParams()
 {
        std::string const lfun = InsetCommand::params2string(params_);
        dispatch(FuncRequest(getLfun(), lfun));
+       connectToNewInset();
 }