From 12a9753fb527161cc25ba2a8df6166c96ceabe07 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Thu, 14 May 2020 16:35:51 +0200 Subject: [PATCH] Allow to provide explicit icons for things like command-alternative The automatic icons for "command-alternative", "math-insert", "math-(big)delim" and "command" can be overriden by an explicit icon name. Besides that, the iconName function is refactored, and now returns an additional bool that indicates whether the icon should be flipped. The code that uses resources is still useless. This will be the subject of further work. --- src/frontends/qt/GuiApplication.cpp | 153 +++++++++++++--------------- 1 file changed, 71 insertions(+), 82 deletions(-) diff --git a/src/frontends/qt/GuiApplication.cpp b/src/frontends/qt/GuiApplication.cpp index 5c5c2a6739..e9244e1a78 100644 --- a/src/frontends/qt/GuiApplication.cpp +++ b/src/frontends/qt/GuiApplication.cpp @@ -82,6 +82,7 @@ #endif #include +#include #include #include @@ -486,98 +487,92 @@ QString themeIconName(QString const & action) } -QString iconName(FuncRequest const & f, bool unknown, QString const & suffix) +// the returned bool is true if the icon needs to be flipped +pair iconName(FuncRequest const & f, bool unknown, bool rtl) { initializeResources(); - QString name1; - QString name2; - QString path; - switch (f.action()) { - case LFUN_MATH_INSERT: - if (!f.argument().empty()) { - path = "math/"; - name1 = findImg(toqstr(f.argument()).mid(1)); - } - break; - case LFUN_MATH_DELIM: - case LFUN_MATH_BIGDELIM: - path = "math/"; - name1 = findImg(toqstr(f.argument())); - break; - case LFUN_CALL: - path = "commands/"; - name1 = toqstr(f.argument()); - break; - case LFUN_COMMAND_ALTERNATIVES: { - // use the first of the alternative commands - docstring firstcom; - docstring dummy = split(f.argument(), firstcom, ';'); - name1 = toqstr(firstcom); - name1.replace(' ', '_'); - break; - } - default: - name2 = toqstr(lyxaction.getActionName(f.action())); - name1 = name2; + QStringList names; + QString lfunname = toqstr(lyxaction.getActionName(f.action())); - if (!f.argument().empty()) { - name1 = name2 + ' ' + toqstr(f.argument()); + if (!f.argument().empty()) { + // if there are arguments, first search an icon which name is the full thing + QString name = lfunname + ' ' + toqstr(f.argument()); + name.replace(' ', '_'); + name.replace(';', '_'); + name.replace('\\', "backslash"); + names << name; + + // then special default icon for some lfuns + switch (f.action()) { + case LFUN_MATH_INSERT: + names << "math/" + findImg(toqstr(f.argument()).mid(1)); + break; + case LFUN_MATH_DELIM: + case LFUN_MATH_BIGDELIM: + names << "math/" + findImg(toqstr(f.argument())); + break; + case LFUN_CALL: + names << "commands/" + toqstr(f.argument()); + break; + case LFUN_COMMAND_ALTERNATIVES: { + // use the first of the alternative commands + docstring firstcom; + docstring dummy = split(f.argument(), firstcom, ';'); + QString name1 = toqstr(firstcom); name1.replace(' ', '_'); + name1.replace(';', '_'); name1.replace('\\', "backslash"); + names << name1; + break; + } + default: + break; } } - // maybe a suffix? - name1 += suffix; - name2 += suffix; + // next thing to try is function name alone + names << lfunname; + // and finally maybe the unkown icon + if (unknown) + names << "unknown"; + + search_mode const mode = theGuiApp()->imageSearchMode(); QStringList imagedirs; imagedirs << "images/" << "images/ipa/"; - search_mode mode = theGuiApp()->imageSearchMode(); - for (int i = 0; i < imagedirs.size(); ++i) { - QString imagedir = imagedirs.at(i) + path; - FileName fname = imageLibFileSearch(imagedir, name1, "svgz,png", mode); - if (fname.exists()) - return toqstr(fname.absFileName()); + QStringList suffixes; + if (rtl) + suffixes << "+rtl"; + suffixes << QString(); + for (QString const & imagedir : imagedirs) + for (QString const & name : names) + for (QString const & suffix : suffixes) { + QString id = imagedir; + FileName fname = imageLibFileSearch(id, name + suffix, "svgz,png", mode); + if (fname.exists()) + return make_pair(toqstr(fname.absFileName()), rtl && suffix.isEmpty()); + } - fname = imageLibFileSearch(imagedir, name2, "svgz,png", mode); - if (fname.exists()) - return toqstr(fname.absFileName()); - } - - path = ":/images/" + path; - QDir res(path); + QString const resdir(":/images/"); + QDir res(resdir); if (!res.exists()) { - LYXERR0("Directory " << path << " not found in resource!"); - return QString(); + LYXERR0("Directory :/images/ not found in resource!"); + return make_pair(QString(), false); } - if (res.exists(name1 + ".svgz")) - return path + name1 + ".svgz"; - else if (res.exists(name1 + ".png")) - return path + name1 + ".png"; - if (res.exists(name2 + ".svgz")) - return path + name2 + ".svgz"; - else if (res.exists(name2 + ".png")) - return path + name2 + ".png"; + for (QString const & name : names) + for (QString const & suffix : suffixes) { + if (res.exists(name + suffix + ".svgz")) + return make_pair(resdir + name + ".svgz", rtl && suffix.isEmpty()); + if (res.exists(name + suffix + ".png")) + return make_pair(resdir + name + ".png", rtl && suffix.isEmpty()); + } - LYXERR(Debug::GUI, "Cannot find icon with filename " - << "\"" << name1 << ".{svgz,png}\"" - << " or filename " - << "\"" << name2 << ".{svgz,png}\"" - << " for command \"" + LYXERR(Debug::GUI, "Cannot find icon for command \"" << lyxaction.getActionName(f.action()) << '(' << to_utf8(f.argument()) << ")\""); - if (unknown) { - QString imagedir = "images/"; - FileName fname = imageLibFileSearch(imagedir, "unknown", "svgz,png", mode); - if (fname.exists()) - return toqstr(fname.absFileName()); - return QString(":/images/unknown.svgz"); - } - - return QString(); + return make_pair(QString(), false); } @@ -626,15 +621,9 @@ QIcon getIcon(FuncRequest const & f, bool unknown, bool rtl) } #endif - bool flip = false; QString icon; - if (rtl) { - icon = iconName(f, unknown, "+rtl"); - // No RTL icon, we'll make it ourselves - flip = icon.isEmpty(); - } - if (icon.isEmpty()) - icon = iconName(f, unknown); + bool flip; + tie(icon, flip) = iconName(f, unknown, rtl); if (icon.isEmpty()) return QIcon(); @@ -1144,7 +1133,7 @@ void GuiApplication::clearSession() docstring Application::iconName(FuncRequest const & f, bool unknown) { - return qstring_to_ucs4(lyx::frontend::iconName(f, unknown)); + return qstring_to_ucs4(lyx::frontend::iconName(f, unknown, false).first); }