]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiDocument.cpp
Use <cstdint> instead of <boost/cstdint.hpp>
[lyx.git] / src / frontends / qt4 / GuiDocument.cpp
index 4cbd9774a3c6bdc2c1ea9179ec390547cee9b269..0f143b2cc032e4be23a0e9a96949e2ab5a14a456 100644 (file)
@@ -156,6 +156,11 @@ QMap<QString, QString> sffonts_;
 QMap<QString, QString> ttfonts_;
 QMap<QString, QString> mathfonts_;
 
+enum EncodingSets {
+       unicode = 0,
+       legacy = 1,
+       custom = 2
+};
 
 } // anonymous namespace
 
@@ -865,7 +870,7 @@ GuiDocument::GuiDocument(GuiView & lv)
        // initialize the length validator
        bc().addCheckedLineEdit(textLayoutModule->indentLE);
        bc().addCheckedLineEdit(textLayoutModule->skipLE);
-       
+
        textLayoutModule->tableStyleCO->addItem(qt_("Default"), toqstr("default"));
        getTableStyles();
 
@@ -935,6 +940,8 @@ GuiDocument::GuiDocument(GuiView & lv)
                this, SLOT(change_adaptor()));
        connect(langModule->encodingCO, SIGNAL(activated(int)),
                this, SLOT(encodingSwitched(int)));
+       connect(langModule->unicodeEncodingCO, SIGNAL(activated(int)),
+               this, SLOT(change_adaptor()));
        connect(langModule->customEncodingCO, SIGNAL(activated(int)),
                this, SLOT(change_adaptor()));
        connect(langModule->noInputencCB, SIGNAL(clicked()),
@@ -959,15 +966,32 @@ GuiDocument::GuiDocument(GuiView & lv)
        langModule->languageCO->setModel(language_model);
        langModule->languageCO->setModelColumn(0);
 
-       langModule->encodingCO->addItem(qt_("Unicode (utf8)"), toqstr("utf8"));
-       langModule->encodingCO->addItem(qt_("Traditional (auto-selected)"),
-                                       toqstr("auto-legacy"));
-       // langModule->encodingCO->addItem(qt_("ASCII"), toqstr("ascii"));
-       langModule->encodingCO->addItem(qt_("Custom"), toqstr("custom"));
+       langModule->encodingCO->addItem(qt_("Unicode (utf8)"));
+       langModule->encodingCO->addItem(qt_("Traditional (auto-selected)"));
+       langModule->encodingCO->addItem(qt_("Custom"));
+       langModule->encodingCO->setItemData(EncodingSets::unicode,
+               "Use Unicode (utf8) for the latex source.", Qt::ToolTipRole);
+       langModule->encodingCO->setItemData(EncodingSets::legacy,
+               "Use legacy default encodings depending on text language.", Qt::ToolTipRole);
+       langModule->encodingCO->setItemData(EncodingSets::custom,
+               "Select a custom, document-wide encoding.", Qt::ToolTipRole);
+       
+       QMap<QString,QString> encodingmap_utf8;
+       for (auto const & encvar : encodings) {
+               if (!encvar.unsafe() && !encvar.guiName().empty()
+                       && std::string(encvar.name()).find("utf8") == 0)
+                       encodingmap_utf8.insert(qt_(encvar.guiName()), qt_(encvar.name()));
+       }
+       QMap<QString, QString>::const_iterator it8 = encodingmap_utf8.constBegin();
+       while (it8 != encodingmap_utf8.constEnd()) {
+               langModule->unicodeEncodingCO->addItem(it8.key(), it8.value());
+               ++it8;
+       }
 
        QMap<QString,QString> encodingmap;
        for (auto const & encvar : encodings) {
-               if (!encvar.unsafe() && !encvar.guiName().empty())
+               if (!encvar.unsafe() && !encvar.guiName().empty()
+                       && std::string(encvar.name()).find("utf8") != 0)
                        encodingmap.insert(qt_(encvar.guiName()), qt_(encvar.name()));
        }
        QMap<QString, QString>::const_iterator it = encodingmap.constBegin();
@@ -975,6 +999,11 @@ GuiDocument::GuiDocument(GuiView & lv)
                langModule->customEncodingCO->addItem(it.key(), it.value());
                ++it;
        }
+       // equalise the width of encoding selectors
+       langModule->unicodeEncodingCO->setMinimumSize(
+               langModule->customEncodingCO->minimumSizeHint());
+       langModule->noInputencCB->setMinimumSize(
+               langModule->customEncodingCO->minimumSizeHint());
 
        langModule->languagePackageCO->addItem(
                qt_("Default"), toqstr("default"));
@@ -2262,14 +2291,9 @@ void GuiDocument::osFontsChanged(bool nontexfonts)
        fontModule->font_sf_scale = font_sf_scale;
        fontModule->font_tt_scale = font_tt_scale;
 
-       langModule->customEncodingCO->setEnabled(tex_fonts &&
-               langModule->encodingCO->itemData(
-                       langModule->encodingCO->currentIndex()).toString() == "custom");
+       // non-tex fonts override the "\inputencoding" option with "utf8-plain"
        langModule->encodingCO->setEnabled(tex_fonts);
-       langModule->noInputencCB->setEnabled(tex_fonts
-                                            && langModule->encodingCO->currentIndex() < 2);
-       if (!tex_fonts)
-               langModule->noInputencCB->setChecked(false);
+       inputencodingToDialog();
 
        fontModule->fontsDefaultCO->setEnabled(tex_fonts);
        fontModule->fontsDefaultLA->setEnabled(tex_fonts);
@@ -2289,14 +2313,40 @@ void GuiDocument::osFontsChanged(bool nontexfonts)
 
 void GuiDocument::encodingSwitched(int i)
 {
-       langModule->customEncodingCO->setEnabled(
-                               !fontModule->osFontsCB->isChecked()
-                               && langModule->encodingCO->itemData(i).toString() == "custom");
-       langModule->noInputencCB->setEnabled(!fontModule->osFontsCB->isChecked()
-                                            && langModule->encodingCO->currentIndex() < 2);
-       if (!langModule->noInputencCB->isEnabled())
-               langModule->noInputencCB->setChecked(false);
+       bool const tex_fonts = !fontModule->osFontsCB->isChecked();
+       langModule->unicodeEncodingCO->setEnabled(tex_fonts);
+       langModule->customEncodingCO->setEnabled(tex_fonts);
+       langModule->noInputencCB->setEnabled(tex_fonts);
+       langModule->unicodeEncodingCO->setVisible(i == EncodingSets::unicode);
+       langModule->noInputencCB->setVisible(i == EncodingSets::legacy);
+       langModule->customEncodingCO->setVisible(i == EncodingSets::custom);
+}
 
+void GuiDocument::inputencodingToDialog()
+{
+       QString inputenc = toqstr(bp_.inputenc);
+       int p;
+       if (fontModule->osFontsCB->isChecked()) { // non-tex fonts require utf8-plain
+               langModule->encodingCO->setCurrentIndex(EncodingSets::unicode);
+               langModule->unicodeEncodingCO->setCurrentIndex(
+                       langModule->unicodeEncodingCO->findData("utf8-plain"));
+       } else if (inputenc.startsWith("utf8")) {
+               langModule->encodingCO->setCurrentIndex(EncodingSets::unicode);
+               p = langModule->unicodeEncodingCO->findData(inputenc);
+               if (p != -1)
+                       langModule->unicodeEncodingCO->setCurrentIndex(p);
+       } else if (inputenc.startsWith("auto")) {
+               langModule->encodingCO->setCurrentIndex(EncodingSets::legacy);
+               langModule->noInputencCB->setChecked(inputenc == "auto-legacy-plain");
+       } else {
+               langModule->encodingCO->setCurrentIndex(EncodingSets::custom);
+               p = langModule->customEncodingCO->findData(inputenc);
+               if (p != -1)
+                       langModule->customEncodingCO->setCurrentIndex(p);
+               else
+                       langModule->encodingCO->setCurrentIndex(EncodingSets::unicode);
+       }
+       encodingSwitched(langModule->encodingCO->currentIndex());
 }
 
 
@@ -3242,17 +3292,27 @@ void GuiDocument::applyView()
        indicesModule->apply(bp_);
 
        // language & quotes
-       QString const encoding = langModule->encodingCO->itemData(
-                               langModule->encodingCO->currentIndex()).toString();
-       if (encoding != "custom")
-               bp_.inputenc = fromqstr(encoding);
-       else
-               bp_.inputenc = fromqstr(langModule->customEncodingCO->itemData(
-                                       langModule->customEncodingCO->currentIndex()).toString());
-       if (langModule->noInputencCB->isChecked()
-           && (encoding == "auto-legacy" || encoding == "utf8"))
-               bp_.inputenc += "-plain";
-
+       switch (langModule->encodingCO->currentIndex()) {
+               case EncodingSets::unicode: {
+                       bp_.inputenc = fromqstr(langModule->unicodeEncodingCO->itemData(
+                               langModule->unicodeEncodingCO->currentIndex()).toString());
+                       break;
+               }
+               case EncodingSets::legacy: {
+                       bp_.inputenc = "auto-legacy";
+                       if (langModule->noInputencCB->isChecked())
+                               bp_.inputenc = "auto-legacy-plain";
+                       break;
+               }
+               case EncodingSets::custom: {
+                       bp_.inputenc = fromqstr(langModule->customEncodingCO->itemData(
+                               langModule->customEncodingCO->currentIndex()).toString());
+                       break;
+               }
+               default:
+                       // this should never happen
+                       bp_.inputenc = "utf8";
+       }
        bp_.quotes_style = (InsetQuotesParams::QuoteStyle) langModule->quoteStyleCO->itemData(
                langModule->quoteStyleCO->currentIndex()).toInt();
        bp_.dynamic_quotes = langModule->dynamicQuotesCB->isChecked();
@@ -3745,27 +3805,9 @@ void GuiDocument::paramsToDialog()
                langModule->quoteStyleCO->findData(bp_.quotes_style));
        langModule->dynamicQuotesCB->setChecked(bp_.dynamic_quotes);
 
-       QString inputenc = toqstr(bp_.inputenc);
-       bool plain = false;
-       if (inputenc.endsWith("-plain")) {
-               inputenc = inputenc.left(inputenc.lastIndexOf("-plain"));
-               plain = true;
-       }
-       langModule->noInputencCB->setChecked(plain);
-       int p = langModule->encodingCO->findData(inputenc);
-       if (p != -1)
-               langModule->encodingCO->setCurrentIndex(p);
-       else {
-               langModule->encodingCO->setCurrentIndex(
-                         langModule->encodingCO->findData("custom"));
-               p = langModule->customEncodingCO->findData(inputenc);
-               if (p != -1)
-                       langModule->customEncodingCO->setCurrentIndex(p);
-               else
-                       langModule->encodingCO->setCurrentIndex(0);
-       }
+       // LaTeX input encoding: set after the fonts (see below)
 
-       p = langModule->languagePackageCO->findData(toqstr(bp_.lang_package));
+       int p = langModule->languagePackageCO->findData(toqstr(bp_.lang_package));
        if (p == -1) {
                langModule->languagePackageCO->setCurrentIndex(
                          langModule->languagePackageCO->findData("custom"));
@@ -4122,6 +4164,10 @@ void GuiDocument::paramsToDialog()
                fontModule->fontencLE->setText(toqstr(bp_.fontenc));
        }
 
+       // LaTeX input encoding
+       // Set after fonts because non-tex fonts override "\inputencoding".
+       inputencodingToDialog();
+
        // Formats
        // This must be set _after_ fonts since updateDefaultFormat()
        // checks osFontsCB settings.