]> git.lyx.org Git - features.git/blobdiff - src/frontends/qt/Menus.cpp
Fix broken Apple speller interface
[features.git] / src / frontends / qt / Menus.cpp
index afe43c70f1f697d7d11cf02f625025456b80887c..c69ba5f0bcdc7dacf88c7740b861b0ecbae0b5fc 100644 (file)
@@ -197,7 +197,9 @@ public:
                /** Commands to separate environments (context menu version). */
                EnvironmentSeparatorsContext,
                /** This is the list of quotation marks available */
-               SwitchQuotes
+               SwitchQuotes,
+               /** Options in the Zoom menu **/
+               ZoomOptions
        };
 
        explicit MenuItem(Kind kind) : kind_(kind), optional_(false) {}
@@ -356,9 +358,9 @@ public:
        void expandFormats(MenuItem::Kind const kind, Buffer const * buf);
        void expandFloatListInsert(Buffer const * buf);
        void expandFloatInsert(Buffer const * buf);
-       void expandFlexInsert(Buffer const * buf, InsetLayout::InsetLyXType type);
+       void expandFlexInsert(Buffer const * buf, InsetLyXType type);
        void expandTocSubmenu(std::string const & type, Toc const & toc_list);
-       void expandToc2(Toc const & toc_list, size_t from, size_t to, int depth, string toc_type);
+       void expandToc2(Toc const & toc_list, size_t from, size_t to, int depth, const string & toc_type);
        void expandToc(Buffer const * buf);
        void expandPasteRecent(Buffer const * buf);
        void expandToolbars();
@@ -374,6 +376,7 @@ public:
        void expandCaptions(Buffer const * buf, bool switchcap = false);
        void expandEnvironmentSeparators(BufferView const *, bool contextmenu = false);
        void expandQuotes(BufferView const *);
+       void expandZoomOptions(BufferView const *);
        ///
        ItemList items_;
        ///
@@ -489,7 +492,8 @@ void MenuDefinition::read(Lexer & lex)
                md_switchcaptions,
                md_env_separators,
                md_env_separatorscontext,
-               md_switchquotes
+               md_switchquotes,
+               md_zoomoptions
        };
 
        LexerKeyword menutags[] = {
@@ -530,7 +534,8 @@ void MenuDefinition::read(Lexer & lex)
                { "toc", md_toc },
                { "toolbars", md_toolbars },
                { "updateformats", md_updateformats },
-               { "viewformats", md_viewformats }
+               { "viewformats", md_viewformats },
+               { "zoomoptions", md_zoomoptions }
        };
 
        lex.pushTable(menutags);
@@ -687,6 +692,10 @@ void MenuDefinition::read(Lexer & lex)
                        add(MenuItem(MenuItem::SwitchQuotes));
                        break;
 
+               case md_zoomoptions:
+                       add(MenuItem(MenuItem::ZoomOptions));
+                       break;
+
                case md_optsubmenu:
                case md_submenu: {
                        lex.next(true);
@@ -847,7 +856,9 @@ void MenuDefinition::expandSpellingSuggestions(BufferView const * bv)
                                                                true,     // match word
                                                                false,    // all words
                                                                true,     // forward
-                                                               false))); // find next
+                                                               false,    // find next
+                                                               false,    // auto-wrap
+                                                               false))); // only selection
                                        if (i < m)
                                                add(w);
                                        else
@@ -860,26 +871,42 @@ void MenuDefinition::expandSpellingSuggestions(BufferView const * bv)
                                docstring const arg = wl.word() + " " + from_ascii(wl.lang()->lang());
                                add(MenuItem(MenuItem::Command, qt_("Add to personal dictionary|n"),
                                                FuncRequest(LFUN_SPELLING_ADD, arg)));
-                               add(MenuItem(MenuItem::Command, qt_("Ignore all|I"),
+                               add(MenuItem(MenuItem::Command, qt_("Ignore this occurrence|g"),
+                                               FuncRequest(LFUN_FONT_NO_SPELLCHECK, arg)));
+                               add(MenuItem(MenuItem::Command, qt_("Ignore all for this session|I"),
                                                FuncRequest(LFUN_SPELLING_IGNORE, arg)));
+                               add(MenuItem(MenuItem::Command, qt_("Ignore all in this document|d"),
+                                               FuncRequest(LFUN_SPELLING_ADD_LOCAL, arg)));
                        }
                }
                break;
+       case SpellChecker::WORD_OK: {
+                       if (wl.word().empty())
+                               break;
+                       SpellChecker * speller = theSpellChecker();
+                       if (speller && speller->canCheckParagraph())
+                               break;
+                       LYXERR(Debug::GUI, "Valid Word.");
+               }
+               // FALLTHROUGH
        case SpellChecker::LEARNED_WORD: {
-                       LYXERR(Debug::GUI, "Learned Word.");
+                       if (res == SpellChecker::LEARNED_WORD)
+                               LYXERR(Debug::GUI, "Learned Word.");
                        docstring const arg = wl.word() + " " + from_ascii(wl.lang()->lang());
                        add(MenuItem(MenuItem::Command, qt_("Remove from personal dictionary|r"),
                                        FuncRequest(LFUN_SPELLING_REMOVE, arg)));
                }
                break;
+       case SpellChecker::DOCUMENT_LEARNED_WORD: {
+                       LYXERR(Debug::GUI, "Document-Learned Word.");
+                       docstring const arg = wl.word() + " " + from_ascii(wl.lang()->lang());
+                       add(MenuItem(MenuItem::Command, qt_("Remove from document dictionary|r"),
+                                       FuncRequest(LFUN_SPELLING_REMOVE_LOCAL, arg)));
+               }
+               break;
        case SpellChecker::NO_DICTIONARY:
                LYXERR(Debug::GUI, "No dictionary for language " + from_ascii(wl.lang()->lang()));
                // FALLTHROUGH
-       case SpellChecker::WORD_OK:
-       case SpellChecker::COMPOUND_WORD:
-       case SpellChecker::ROOT_FOUND:
-       case SpellChecker::IGNORED_WORD:
-               break;
        }
 }
 
@@ -987,9 +1014,9 @@ void MenuDefinition::expandDocuments()
        MenuItem item(MenuItem::Submenu, qt_("Hidden|H"));
        item.setSubmenu(MenuDefinition(qt_("Hidden|H")));
 
-       Buffer * first = theBufferList().first();
+       Buffer * const first = theBufferList().first();
        if (!first) {
-               add(MenuItem(MenuItem::Info, qt_("<No Documents Open>")));
+               add(MenuItem(MenuItem::Info, qt_("(No Documents Open)")));
                return;
        }
 
@@ -1005,7 +1032,7 @@ void MenuDefinition::expandDocuments()
                if (!b.isClean())
                        label += "*";
                if (b.notifiesExternalModification())
-                       label += QChar(0x26a0);
+                       label += QChar(0x26a0); // warning sign ⚠
                if (i < 10)
                        label = QString::number(i) + ". " + label + '|' + QString::number(i);
                add(MenuItem(MenuItem::Command, label,
@@ -1055,7 +1082,7 @@ void MenuDefinition::expandBookmarks()
                }
        }
        if (empty)
-               add(MenuItem(MenuItem::Info, qt_("<No Bookmarks Saved Yet>")));
+               add(MenuItem(MenuItem::Info, qt_("(No Bookmarks Saved Yet)")));
 }
 
 
@@ -1216,7 +1243,7 @@ void MenuDefinition::expandFloatInsert(Buffer const * buf)
 
 
 void MenuDefinition::expandFlexInsert(
-               Buffer const * buf, InsetLayout::InsetLyXType type)
+               Buffer const * buf, InsetLyXType type)
 {
        if (!buf)
                return;
@@ -1242,8 +1269,8 @@ void MenuDefinition::expandFlexInsert(
                }
        }
        // FIXME This is a little clunky.
-       if (items_.empty() && type == InsetLayout::CUSTOM && !buf->hasReadonlyFlag())
-               add(MenuItem(MenuItem::Help, qt_("No Custom Insets Defined!")));
+       if (items_.empty() && type == InsetLyXType::CUSTOM && !buf->hasReadonlyFlag())
+               add(MenuItem(MenuItem::Help, qt_("(No Custom Insets Defined)")));
 }
 
 
@@ -1258,7 +1285,7 @@ size_t const menu_size_limit = 80;
 
 void MenuDefinition::expandToc2(Toc const & toc_list,
                                 size_t from, size_t to, int depth,
-                                string toc_type)
+                                string const & toc_type)
 {
        int shortcut_count = 0;
 
@@ -1280,8 +1307,7 @@ void MenuDefinition::expandToc2(Toc const & toc_list,
                                                label += QString::number(++shortcut_count);
                                }
                        }
-                       add(MenuItem(MenuItem::Command, label,
-                                           FuncRequest(toc_list[i].action())));
+                       add(MenuItem(MenuItem::Command, label, toc_list[i].action()));
                        // separator after the menu heading
                        if (toc_list[i].depth() < depth)
                                add(MenuItem(MenuItem::Separator));
@@ -1309,8 +1335,7 @@ void MenuDefinition::expandToc2(Toc const & toc_list,
                                break;
                        }
                        if (new_pos == pos + 1) {
-                               add(MenuItem(MenuItem::Command,
-                                                   label, FuncRequest(toc_list[pos].action())));
+                               add(MenuItem(MenuItem::Command, label, toc_list[pos].action()));
                        } else {
                                MenuDefinition sub;
                                sub.expandToc2(toc_list, pos, new_pos, depth + 1, toc_type);
@@ -1370,7 +1395,7 @@ void MenuDefinition::expandToc(Buffer const * buf)
        }
        // Handle normal TOC
        add(MenuItem(MenuItem::Separator));
-       TocList::const_iterator cit = toc_list.find("tableofcontents");
+       TocList::const_iterator const cit = toc_list.find("tableofcontents");
        if (cit == toc_list.end())
                LYXERR(Debug::GUI, "No table of contents.");
        else {
@@ -1415,8 +1440,19 @@ void MenuDefinition::expandToolbars()
        Toolbars::Infos::const_iterator cit = guiApp->toolbars().begin();
        Toolbars::Infos::const_iterator end = guiApp->toolbars().end();
        for (; cit != end; ++cit) {
-               MenuItem const item(MenuItem::Command, toqstr(cit->gui_name),
-                               FuncRequest(LFUN_TOOLBAR_TOGGLE, cit->name));
+               MenuItem item(MenuItem::Command, toqstr(cit->gui_name),
+                             FuncRequest(LFUN_TOOLBAR_TOGGLE, cit->name));
+               if (cit->allow_auto) {
+                       MenuDefinition tristate;
+                       tristate.add(MenuItem(MenuItem::Command, qt_("[[Toolbar]]On|O"),
+                                             FuncRequest(LFUN_TOOLBAR_SET, cit->name + " on")));
+                       tristate.add(MenuItem(MenuItem::Command, qt_("[[Toolbar]]Off|f"),
+                                             FuncRequest(LFUN_TOOLBAR_SET, cit->name + " off")));
+                       tristate.add(MenuItem(MenuItem::Command, qt_("[[Toolbar]]Automatic|A"),
+                                             FuncRequest(LFUN_TOOLBAR_SET, cit->name + " auto")));
+                       item = MenuItem(MenuItem::Submenu,toqstr(cit->gui_name));
+                       item.setSubmenu(tristate);
+               }
                if (guiApp->toolbars().isMainToolbar(cit->name))
                        add(item);
                else
@@ -1791,6 +1827,48 @@ void MenuDefinition::expandCaptions(Buffer const * buf, bool switchcap)
 }
 
 
+void MenuDefinition::expandZoomOptions(BufferView const * bv)
+{
+       if (!bv)
+               return;
+
+       add(MenuItem(MenuItem::Command,
+                    toqstr(bformat(_("Reset to Default (%1$d%)|R"),
+                                   lyxrc.defaultZoom)),
+                    FuncRequest(LFUN_BUFFER_ZOOM)));
+       add(MenuItem(MenuItem::Command, qt_("Zoom In|I"),
+                    FuncRequest(LFUN_BUFFER_ZOOM_IN)));
+       add(MenuItem(MenuItem::Command, qt_("Zoom Out|O"),
+                    FuncRequest(LFUN_BUFFER_ZOOM_OUT)));
+       add(MenuItem(MenuItem::Separator));
+       // Offer some fractional values of the default
+       int z = lyxrc.defaultZoom * 1.75;
+       add(MenuItem(MenuItem::Command,
+                    toqstr(bformat(_("[[ZOOM]]%1$d%"), z)),
+                    FuncRequest(LFUN_BUFFER_ZOOM, convert<string>(z))));
+       z = lyxrc.defaultZoom * 1.5;
+       add(MenuItem(MenuItem::Command,
+                    toqstr(bformat(_("[[ZOOM]]%1$d%"), z)),
+                    FuncRequest(LFUN_BUFFER_ZOOM, convert<string>(z))));
+       z = lyxrc.defaultZoom * 1.25;
+       add(MenuItem(MenuItem::Command,
+                    toqstr(bformat(_("[[ZOOM]]%1$d%"), z)),
+                    FuncRequest(LFUN_BUFFER_ZOOM, convert<string>(z))));
+       z = lyxrc.defaultZoom * 0.75;
+       add(MenuItem(MenuItem::Command,
+                    toqstr(bformat(_("[[ZOOM]]%1$d%"), z)),
+                    FuncRequest(LFUN_BUFFER_ZOOM, convert<string>(z))));
+       z = lyxrc.defaultZoom * 0.5;
+       add(MenuItem(MenuItem::Command,
+                    toqstr(bformat(_("[[ZOOM]]%1$d%"), z)),
+                    FuncRequest(LFUN_BUFFER_ZOOM, convert<string>(z))));
+       z = lyxrc.defaultZoom * 0.25;
+       add(MenuItem(MenuItem::Command,
+                    toqstr(bformat(_("[[ZOOM]]%1$d%"), z)),
+                    FuncRequest(LFUN_BUFFER_ZOOM, convert<string>(z))));
+}
+
+
 void MenuDefinition::expandQuotes(BufferView const * bv)
 {
        if (!bv)
@@ -1809,22 +1887,18 @@ void MenuDefinition::expandQuotes(BufferView const * bv)
        InsetQuotes const * qinset =
                static_cast<InsetQuotes const *>(inset);
 
-       map<string, docstring> styles = quoteparams.getTypes();
        string const qtype = qinset->getType();
 
-       map<string, docstring>::const_iterator qq = styles.begin();
-       map<string, docstring>::const_iterator end = styles.end();
-
        MenuDefinition aqs;
 
        BufferParams const & bp = bv->buffer().masterBuffer()->params();
 
        // The global setting
-       InsetQuotesParams::QuoteStyle globalqs = bp.quotes_style;
+       QuoteStyle globalqs = bp.quotes_style;
        char const globalqsc = quoteparams.getStyleChar(globalqs);
 
        // The current language's default
-       InsetQuotesParams::QuoteStyle langdefqs =
+       QuoteStyle langdefqs =
                bp.getQuoteStyle(bv->cursor().current_font.language()->quoteStyle());
        char const langqs = quoteparams.getStyleChar(langdefqs);
 
@@ -1856,10 +1930,12 @@ void MenuDefinition::expandQuotes(BufferView const * bv)
                main_dynamic_qs = true;
        }
        // now traverse through the static styles ...
-       for (; qq != end; ++qq) {
-               docstring const style = from_ascii(qq->first);
-               bool langdef = (style[0] == langqs);
-               bool globaldef = (style[0] == globalqsc);
+       map<string, docstring> styles = quoteparams.getTypes();
+       for (auto const & s : styles) {
+               char style_char = (s.first)[0];
+               bool langdef = (style_char == langqs);
+               bool globaldef = (style_char == globalqsc);
+               docstring const style = from_ascii(s.first);
 
                if (prefixIs(style, qtype[0])) {
                        FuncRequest cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + style);
@@ -2314,11 +2390,11 @@ void Menus::Impl::expand(MenuDefinition const & frommenu,
                }
 
                case MenuItem::CharStyles:
-                       tomenu.expandFlexInsert(buf, InsetLayout::CHARSTYLE);
+                       tomenu.expandFlexInsert(buf, InsetLyXType::CHARSTYLE);
                        break;
 
                case MenuItem::Custom:
-                       tomenu.expandFlexInsert(buf, InsetLayout::CUSTOM);
+                       tomenu.expandFlexInsert(buf, InsetLyXType::CUSTOM);
                        break;
 
                case MenuItem::FloatListInsert:
@@ -2410,6 +2486,10 @@ void Menus::Impl::expand(MenuDefinition const & frommenu,
                        tomenu.expandQuotes(bv);
                        break;
 
+               case MenuItem::ZoomOptions:
+                       tomenu.expandZoomOptions(bv);
+                       break;
+
                case MenuItem::Submenu: {
                        MenuItem item(*cit);
                        item.setSubmenu(MenuDefinition(cit->submenuname()));