From 9d23d76c8eb31562706bbe16c2f54f935bf290db Mon Sep 17 00:00:00 2001 From: Abdelrazak Younes Date: Wed, 7 May 2008 18:53:48 +0000 Subject: [PATCH] Revamp of the character dialog: - many simplification all over the place. - improvement to the "Immediate apply" feature. AFAICS all functionality is restored but please test and report. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@24661 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/Language.cpp | 7 +- src/Language.h | 8 + src/frontends/qt4/GuiCharacter.cpp | 325 +++++++++++------------------ src/frontends/qt4/GuiCharacter.h | 54 +---- src/frontends/qt4/GuiDocument.cpp | 2 +- src/frontends/qt4/GuiPrefs.cpp | 2 +- src/frontends/qt4/qt_helpers.cpp | 29 +-- src/frontends/qt4/qt_helpers.h | 8 +- 8 files changed, 155 insertions(+), 280 deletions(-) diff --git a/src/Language.cpp b/src/Language.cpp index ae9de0d63f..e4bb4314d8 100644 --- a/src/Language.cpp +++ b/src/Language.cpp @@ -33,6 +33,7 @@ Language latex_lang; Language const * default_language; Language const * ignore_language = &ignore_lang; Language const * latex_language = &latex_lang; +Language const * reset_language = 0; bool Language::read(Lexer & lex) @@ -90,8 +91,12 @@ void Languages::read(FileName const & filename) Language const * Languages::getLanguage(string const & language) const { + if (language == "reset") + return reset_language; + if (language == "ignore") + return ignore_language; const_iterator it = languagelist.find(language); - return it == languagelist.end() ? 0 : &it->second; + return it == languagelist.end() ? reset_language : &it->second; } diff --git a/src/Language.h b/src/Language.h index f7ff5f2891..278d796a58 100644 --- a/src/Language.h +++ b/src/Language.h @@ -94,10 +94,18 @@ private: LanguageList languagelist; }; +/// Global singleton instance. extern Languages languages; +/// Default language defined in LyXRC extern Language const * default_language; +/// Used to indicate that the language should be left unchanged when +/// applying a font change. extern Language const * ignore_language; +/// Default language defined in LyXRC extern Language const * latex_language; +/// Used to indicate that the language should be reset to the Buffer +// language when applying a font change. +extern Language const * reset_language; } // namespace lyx diff --git a/src/frontends/qt4/GuiCharacter.cpp b/src/frontends/qt4/GuiCharacter.cpp index 3086fa5d98..71fcf979ef 100644 --- a/src/frontends/qt4/GuiCharacter.cpp +++ b/src/frontends/qt4/GuiCharacter.cpp @@ -18,8 +18,11 @@ #include "Font.h" #include "Buffer.h" #include "BufferParams.h" +#include "BufferView.h" +#include "Cursor.h" #include "FuncRequest.h" #include "Language.h" +#include "Paragraph.h" using namespace std; @@ -113,6 +116,17 @@ static QList familyData() return families; } +namespace { + +template +void fillCombo(QComboBox * combo, QList list) +{ + QList::const_iterator cit = list.begin(); + for (; cit != list.end(); ++cit) + combo->addItem(cit->first); +} + +} GuiCharacter::GuiCharacter(GuiView & lv) : GuiDialog(lv, "character", qt_("Text Style")), font_(ignore_font, ignore_language), @@ -146,37 +160,18 @@ GuiCharacter::GuiCharacter(GuiView & lv) size = sizeData(); bar = barData(); color = colorData(); - language = languageData(true); - for (QList::const_iterator cit = family.begin(); - cit != family.end(); ++cit) { - familyCO->addItem(cit->first); - } + language = languageData(); + language.prepend(LanguagePair(qt_("Reset"), "reset")); + language.prepend(LanguagePair(qt_("No change"), "ignore")); - for (QList::const_iterator cit = series.begin(); - cit != series.end(); ++cit) { - seriesCO->addItem(cit->first); - } - for (QList::const_iterator cit = shape.begin(); - cit != shape.end(); ++cit) { - shapeCO->addItem(cit->first); - } - for (QList::const_iterator cit = size.begin(); - cit != size.end(); ++cit) { - sizeCO->addItem(cit->first); - } - for (QList::const_iterator cit = bar.begin(); - cit != bar.end(); ++cit) { - miscCO->addItem(cit->first); - } - for (QList::const_iterator cit = color.begin(); - cit != color.end(); ++cit) { - colorCO->addItem(cit->first); - } - for (QList::const_iterator cit = language.begin(); - cit != language.end(); ++cit) { - langCO->addItem(cit->first); - } + fillCombo(familyCO, family); + fillCombo(seriesCO, series); + fillCombo(sizeCO, size); + fillCombo(shapeCO, shape); + fillCombo(miscCO, bar); + fillCombo(colorCO, color); + fillCombo(langCO, language); bc().setPolicy(ButtonPolicy::OkApplyCancelReadOnlyPolicy); bc().setOK(okPB); @@ -213,13 +208,6 @@ void GuiCharacter::change_adaptor() // stay the same between applys. Might be difficult though wrt to a // moved cursor - jbl slotApply(); - familyCO->setCurrentIndex(0); - seriesCO->setCurrentIndex(0); - sizeCO->setCurrentIndex(0); - shapeCO->setCurrentIndex(0); - miscCO->setCurrentIndex(0); - langCO->setCurrentIndex(0); - colorCO->setCurrentIndex(0); } @@ -235,13 +223,82 @@ static int findPos2nd(QList

const & vec, B const & val) void GuiCharacter::updateContents() { - familyCO->setCurrentIndex(findPos2nd(family, getFamily())); - seriesCO->setCurrentIndex(findPos2nd(series, getSeries())); - shapeCO->setCurrentIndex(findPos2nd(shape, getShape())); - sizeCO->setCurrentIndex(findPos2nd(size, getSize())); - miscCO->setCurrentIndex(findPos2nd(bar, getBar())); - colorCO->setCurrentIndex(findPos2nd(color, getColor())); - langCO->setCurrentIndex(findPos2nd(language, getLanguage())); + if (!autoapplyCB->isChecked()) + return; + if (bufferview()->cursor().selection()) { + //FIXME: it would be better to check if each font attribute is constant + // for the selection range. + font_ = Font(ignore_font, ignore_language); + } else + font_ = bufferview()->cursor().current_font; + + paramsToDialog(font_); +} + + +static FontState getBar(FontInfo const & fi) +{ + if (fi.emph() == FONT_TOGGLE) + return EMPH_TOGGLE; + + if (fi.underbar() == FONT_TOGGLE) + return UNDERBAR_TOGGLE; + + if (fi.noun() == FONT_TOGGLE) + return NOUN_TOGGLE; + + if (fi.emph() == FONT_IGNORE + && fi.underbar() == FONT_IGNORE + && fi.noun() == FONT_IGNORE) + return IGNORE; + + return INHERIT; +} + + +static void setBar(FontInfo & fi, FontState val) +{ + switch (val) { + case IGNORE: + fi.setEmph(FONT_IGNORE); + fi.setUnderbar(FONT_IGNORE); + fi.setNoun(FONT_IGNORE); + break; + + case EMPH_TOGGLE: + fi.setEmph(FONT_TOGGLE); + break; + + case UNDERBAR_TOGGLE: + fi.setUnderbar(FONT_TOGGLE); + break; + + case NOUN_TOGGLE: + fi.setNoun(FONT_TOGGLE); + break; + + case INHERIT: + fi.setEmph(FONT_INHERIT); + fi.setUnderbar(FONT_INHERIT); + fi.setNoun(FONT_INHERIT); + break; + } +} + + +void GuiCharacter::paramsToDialog(Font const & font) +{ + FontInfo const & fi = font.fontInfo(); + familyCO->setCurrentIndex(findPos2nd(family, fi.family())); + seriesCO->setCurrentIndex(findPos2nd(series, fi.series())); + shapeCO->setCurrentIndex(findPos2nd(shape, fi.shape())); + sizeCO->setCurrentIndex(findPos2nd(size, fi.size())); + miscCO->setCurrentIndex(findPos2nd(bar, getBar(fi))); + colorCO->setCurrentIndex(findPos2nd(color, fi.color())); + + QString const lang = (font.language() == ignore_language) + ? "ignore" : toqstr(font.language()->lang()); + langCO->setCurrentIndex(findPos2nd(language, lang)); toggleallCB->setChecked(toggleall_); } @@ -249,13 +306,16 @@ void GuiCharacter::updateContents() void GuiCharacter::applyView() { - setFamily(family[familyCO->currentIndex()].second); - setSeries(series[seriesCO->currentIndex()].second); - setShape(shape[shapeCO->currentIndex()].second); - setSize(size[sizeCO->currentIndex()].second); - setBar(bar[miscCO->currentIndex()].second); - setColor(color[colorCO->currentIndex()].second); - setLanguage(language[langCO->currentIndex()].second); + FontInfo & fi = font_.fontInfo(); + fi.setFamily(family[familyCO->currentIndex()].second); + fi.setSeries(series[seriesCO->currentIndex()].second); + fi.setShape(shape[shapeCO->currentIndex()].second); + fi.setSize(size[sizeCO->currentIndex()].second); + setBar(fi, bar[miscCO->currentIndex()].second); + fi.setColor(color[colorCO->currentIndex()].second); + + font_.setLanguage(languages.getLanguage( + fromqstr(language[langCO->currentIndex()].second))); toggleall_ = toggleallCB->isChecked(); } @@ -263,16 +323,19 @@ void GuiCharacter::applyView() bool GuiCharacter::initialiseParams(string const &) { + FontInfo & fi = font_.fontInfo(); + // so that the user can press Ok - if (getFamily() != IGNORE_FAMILY - || getSeries() != IGNORE_SERIES - || getShape() != IGNORE_SHAPE - || getSize() != FONT_SIZE_IGNORE - || getBar() != IGNORE - || getColor() != Color_ignore + if (fi.family() != IGNORE_FAMILY + || fi.series() != IGNORE_SERIES + || fi.shape() != IGNORE_SHAPE + || fi.size() != FONT_SIZE_IGNORE + || getBar(fi) != IGNORE + || fi.color() != Color_ignore || font_.language() != ignore_language) setButtonsValid(true); + paramsToDialog(font_); return true; } @@ -283,156 +346,6 @@ void GuiCharacter::dispatchParams() } -FontFamily GuiCharacter::getFamily() const -{ - return font_.fontInfo().family(); -} - - -void GuiCharacter::setFamily(FontFamily val) -{ - font_.fontInfo().setFamily(val); -} - - -FontSeries GuiCharacter::getSeries() const -{ - return font_.fontInfo().series(); -} - - -void GuiCharacter::setSeries(FontSeries val) -{ - font_.fontInfo().setSeries(val); -} - - -FontShape GuiCharacter::getShape() const -{ - return font_.fontInfo().shape(); -} - - -void GuiCharacter::setShape(FontShape val) -{ - font_.fontInfo().setShape(val); -} - - -FontSize GuiCharacter::getSize() const -{ - return font_.fontInfo().size(); -} - - -void GuiCharacter::setSize(FontSize val) -{ - font_.fontInfo().setSize(val); -} - - -FontState GuiCharacter::getBar() const -{ - if (font_.fontInfo().emph() == FONT_TOGGLE) - return EMPH_TOGGLE; - - if (font_.fontInfo().underbar() == FONT_TOGGLE) - return UNDERBAR_TOGGLE; - - if (font_.fontInfo().noun() == FONT_TOGGLE) - return NOUN_TOGGLE; - - if (font_.fontInfo().emph() == FONT_IGNORE - && font_.fontInfo().underbar() == FONT_IGNORE - && font_.fontInfo().noun() == FONT_IGNORE) - return IGNORE; - - return INHERIT; -} - - -void GuiCharacter::setBar(FontState val) -{ - switch (val) { - case IGNORE: - font_.fontInfo().setEmph(FONT_IGNORE); - font_.fontInfo().setUnderbar(FONT_IGNORE); - font_.fontInfo().setNoun(FONT_IGNORE); - break; - - case EMPH_TOGGLE: - font_.fontInfo().setEmph(FONT_TOGGLE); - break; - - case UNDERBAR_TOGGLE: - font_.fontInfo().setUnderbar(FONT_TOGGLE); - break; - - case NOUN_TOGGLE: - font_.fontInfo().setNoun(FONT_TOGGLE); - break; - - case INHERIT: - font_.fontInfo().setEmph(FONT_INHERIT); - font_.fontInfo().setUnderbar(FONT_INHERIT); - font_.fontInfo().setNoun(FONT_INHERIT); - break; - } -} - - -ColorCode GuiCharacter::getColor() const -{ - return font_.fontInfo().color(); -} - - -void GuiCharacter::setColor(ColorCode val) -{ - switch (val) { - case Color_ignore: - case Color_none: - case Color_black: - case Color_white: - case Color_red: - case Color_green: - case Color_blue: - case Color_cyan: - case Color_magenta: - case Color_yellow: - case Color_inherit: - font_.fontInfo().setColor(val); - break; - default: - break; - } -} - - -QString GuiCharacter::getLanguage() const -{ - if (reset_lang_) - return "reset"; - if (font_.language()) - return toqstr(font_.language()->lang()); - return "ignore"; -} - - -void GuiCharacter::setLanguage(QString const & val) -{ - if (val == "ignore") - font_.setLanguage(ignore_language); - else if (val == "reset") { - reset_lang_ = true; - // Ignored in getLanguage, but needed for dispatchParams - font_.setLanguage(buffer().params().language); - } else { - font_.setLanguage(languages.getLanguage(fromqstr(val))); - } -} - - Dialog * createGuiCharacter(GuiView & lv) { return new GuiCharacter(lv); } diff --git a/src/frontends/qt4/GuiCharacter.h b/src/frontends/qt4/GuiCharacter.h index f505ad27bb..3be1401f30 100644 --- a/src/frontends/qt4/GuiCharacter.h +++ b/src/frontends/qt4/GuiCharacter.h @@ -57,10 +57,19 @@ protected Q_SLOTS: void change_adaptor(); private: - /// Apply changes + /// Dialog inherited methods + //@{ void applyView(); - /// update void updateContents(); + bool initialiseParams(std::string const & data); + void clearParams() {} + void dispatchParams(); + bool isBufferDependent() const { return true; } + FuncCode getLfun() const { return LFUN_FONT_FREE_UPDATE; } + //@} + + /// + void paramsToDialog(Font const & font); QList family; QList series; @@ -71,47 +80,6 @@ private: QList language; /// - bool initialiseParams(std::string const & data); - /// - void clearParams() {} - /// - void dispatchParams(); - /// - bool isBufferDependent() const { return true; } - /// - FuncCode getLfun() const { return LFUN_FONT_FREE_UPDATE; } - - /// - void setFamily(FontFamily); - /// - void setSeries(FontSeries); - /// - void setShape(FontShape); - /// - void setSize(FontSize); - /// - void setBar(FontState); - /// - void setColor(ColorCode); - /// - void setLanguage(QString const &); - - /// - FontFamily getFamily() const; - /// - FontSeries getSeries() const; - /// - FontShape getShape() const; - /// - FontSize getSize() const; - /// - FontState getBar() const; - /// - ColorCode getColor() const; - /// - QString getLanguage() const; - -private: /// Font font_; /// diff --git a/src/frontends/qt4/GuiDocument.cpp b/src/frontends/qt4/GuiDocument.cpp index 0e42f8f720..136fa3096c 100644 --- a/src/frontends/qt4/GuiDocument.cpp +++ b/src/frontends/qt4/GuiDocument.cpp @@ -510,7 +510,7 @@ GuiDocument::GuiDocument(GuiView & lv) { setupUi(this); - QList langs = languageData(false); + QList langs = languageData(); for (int i = 0; i != langs.size(); ++i) lang_.append(langs[i].second); diff --git a/src/frontends/qt4/GuiPrefs.cpp b/src/frontends/qt4/GuiPrefs.cpp index d9ee6d2201..764b22d72b 100644 --- a/src/frontends/qt4/GuiPrefs.cpp +++ b/src/frontends/qt4/GuiPrefs.cpp @@ -1660,7 +1660,7 @@ PrefLanguage::PrefLanguage(QWidget * parent) // store the lang identifiers for later //foreach (LanguagePair const & lpair, languageData(false)) { - QList l = languageData(false); + QList l = languageData(); foreach (LanguagePair const & lpair, l) { defaultLanguageCO->addItem(lpair.first); lang_.append(lpair.second); diff --git a/src/frontends/qt4/qt_helpers.cpp b/src/frontends/qt4/qt_helpers.cpp index 08b979d34d..da5de87dac 100644 --- a/src/frontends/qt4/qt_helpers.cpp +++ b/src/frontends/qt4/qt_helpers.cpp @@ -198,31 +198,14 @@ private: } // namespace anon -QList languageData(bool character_dlg) +QList languageData() { - size_t const offset = character_dlg ? 2 : 0; - vector langs(languages.size() + offset); - - if (character_dlg) { - langs[0].first = qt_("No change"); - langs[0].second = "ignore"; - langs[1].first = qt_("Reset"); - langs[1].second = "reset"; - } - - Languages::const_iterator it = languages.begin(); - for (size_t i = 0; i != languages.size(); ++i, ++it) { - langs[i + offset].first = qt_(it->second.display()); - langs[i + offset].second = toqstr(it->second.lang()); - } - - // Don't sort "ignore" and "reset" - vector::iterator begin = langs.begin() + offset; - sort(begin, langs.end(), Sorter()); - QList list; - foreach (LanguagePair const & l, langs) - list.append(l); + Languages::const_iterator it = languages.begin(); + for (; it != languages.end(); ++it) { + list << LanguagePair( + qt_(it->second.display()), toqstr(it->second.lang())); + } return list; } diff --git a/src/frontends/qt4/qt_helpers.h b/src/frontends/qt4/qt_helpers.h index 5774b65699..7084cc95cc 100644 --- a/src/frontends/qt4/qt_helpers.h +++ b/src/frontends/qt4/qt_helpers.h @@ -68,12 +68,10 @@ void setValid(QWidget * widget, bool valid); QString const qt_(std::string const & str); /// -struct LanguagePair { QString first; QString second; }; +typedef std::pair LanguagePair; -/** If the caller is the character dialog, add "No change" and "Reset" -* to the vector. -*/ -QList languageData(bool character_dlg); +/// +QList languageData(); support::FileName libFileSearch(QString const & dir, QString const & name, QString const & ext = QString());