commit 43f51f79bc8fb54ab0c7d1f365a1c2251d169aa4
Author: Juergen Spitzmueller <[email protected]>
Date:   Wed Aug 5 06:52:48 2026 +0200

    Allow to group matters in submenus
    
    This improves the user interface with many variants (as in KOMA)
---
 lib/doc/Customization.lyx     | 46 ++++++++++++++++++++++++++---
 lib/doc/de/Customization.lyx  | 23 +++++++++++++--
 lib/layouts/memoir.layout     | 15 ++++++----
 lib/layouts/recipebook.layout | 67 ++++++++++++++++++++++++++++++-------------
 lib/layouts/scrbook.layout    | 66 +++++++++++++++++++++++++++++-------------
 po/lyx_pot.py                 |  7 +++++
 src/TextClass.cpp             |  7 +++++
 src/TextClass.h               |  2 ++
 src/frontends/qt/Menus.cpp    | 30 +++++++++++++++++--
 9 files changed, 210 insertions(+), 53 deletions(-)

diff --git a/lib/doc/Customization.lyx b/lib/doc/Customization.lyx
index ed61dd3c52..3f14b3ee02 100644
--- a/lib/doc/Customization.lyx
+++ b/lib/doc/Customization.lyx
@@ -10664,6 +10664,8 @@ status collapsed
 
 \change_inserted -712698321 1785853142
 Matter
+\change_unchanged
+
 \end_layout
 
 \end_inset
@@ -10676,6 +10678,8 @@ status collapsed
 
 \change_inserted -712698321 1785853156
 string
+\change_unchanged
+
 \end_layout
 
 \end_inset
@@ -10690,6 +10694,8 @@ status collapsed
 
 \backslash
 frontmatter
+\change_unchanged
+
 \end_layout
 
 \end_inset
@@ -10705,6 +10711,8 @@ status collapsed
 
 \backslash
 mainmatter
+\change_unchanged
+
 \end_layout
 
 \end_inset
@@ -10720,6 +10728,8 @@ status collapsed
 
 \backslash
 backmatter
+\change_unchanged
+
 \end_layout
 
 \end_inset
@@ -10734,6 +10744,8 @@ status collapsed
 
 \change_inserted -712698321 1785853205
 EndMatter
+\change_unchanged
+
 \end_layout
 
 \end_inset
@@ -10747,7 +10759,7 @@ EndMatter
 \begin_deeper
 \begin_layout Description
 
-\change_inserted -712698321 1785853319
+\change_inserted -712698321 1785905337
 \begin_inset Flex Code
 status open
 
@@ -10765,12 +10777,12 @@ GuiName
 
 \end_inset
 
- The name as shown in the workarea
+ The name as shown in the workarea.
 \end_layout
 
 \begin_layout Description
 
-\change_inserted -712698321 1785853381
+\change_inserted -712698321 1785905336
 \begin_inset Flex Code
 status collapsed
 
@@ -10788,7 +10800,29 @@ MenuString
 
 \end_inset
 
- The string shown in the menu including accelerators
+ The string shown in the menu including accelerators.
+\end_layout
+
+\begin_layout Description
+
+\change_inserted -712698321 1785905491
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\change_inserted -712698321 1785905234
+SubMenu
+\begin_inset space ~
+\end_inset
+
+<string>
+\end_layout
+
+\end_inset
+
+ Put the function in a submenu with the given label.
+ Use this if you have many variants of a matter.
 \end_layout
 
 \begin_layout Description
@@ -10814,6 +10848,8 @@ status collapsed
 
 \emph on
 0
+\change_unchanged
+
 \end_layout
 
 \end_inset
@@ -10830,6 +10866,8 @@ status collapsed
 
 \change_inserted -712698321 1785853402
 1
+\change_unchanged
+
 \end_layout
 
 \end_inset
diff --git a/lib/doc/de/Customization.lyx b/lib/doc/de/Customization.lyx
index fc63830b1e..81620c87ed 100644
--- a/lib/doc/de/Customization.lyx
+++ b/lib/doc/de/Customization.lyx
@@ -9261,7 +9261,7 @@ GuiName
 \end_inset
 
  Der Name,
- der im Arbeitsbereich angezeigt wird
+ der im Arbeitsbereich angezeigt wird.
 \end_layout
 
 \begin_layout Description
@@ -9280,7 +9280,26 @@ MenuString
 
  Die Zeichenklette,
  die im Menü erscheint (inkl.
- Tastenkürzel)
+ Tastenkürzel).
+\end_layout
+
+\begin_layout Description
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+SubMenu
+\begin_inset space ~
+\end_inset
+
+<string>
+\end_layout
+
+\end_inset
+
+ Verschiebt die Funktion in ein Untermenü mit der angegebenen Bezeichnung.
+ Verwenden Sie dies,
+ wenn die Klasse viele Varianten von Strukturierungsbefehlen bietet.
 \end_layout
 
 \begin_layout Description
diff --git a/lib/layouts/memoir.layout b/lib/layouts/memoir.layout
index 938f314caa..273096eb74 100644
--- a/lib/layouts/memoir.layout
+++ b/lib/layouts/memoir.layout
@@ -42,29 +42,34 @@ End
 
 Matter frontmatter
        GuiName "Front Matter"
-       MenuString "Front Matter|F"
+       SubMenu "Front Matter|F"
+       MenuString "Default|D"
 EndMatter
 
 Matter frontmatter*
        GuiName "Front Matter (Continuous Pagination)"
-       MenuString "Front Matter (Continuous Pagination)|r"
+       SubMenu "Front Matter|F"
+       MenuString "Continuous Pagination|C"
 EndMatter
 
 Matter mainmatter
        GuiName "Main Matter"
-       MenuString "Main Matter|M"
+       SubMenu "Main Matter|M"
+       MenuString "Default|D"
        UseCounters 1
 EndMatter
 
 Matter mainmatter*
        GuiName "Main Matter (Continuous Pagination)"
-       MenuString "Main Matter (Continuous Pagination)|a"
+       SubMenu "Main Matter|M"
+       MenuString "Continuous Pagination|C"
        UseCounters 1
 EndMatter
 
 Matter backmatter
        GuiName "Back Matter"
-       MenuString "Back Matter|B"
+       SubMenu "Back Matter|B"
+       MenuString "Default|D"
 EndMatter
 
 
diff --git a/lib/layouts/recipebook.layout b/lib/layouts/recipebook.layout
index 7dc2ea2ee0..7edd8456d2 100644
--- a/lib/layouts/recipebook.layout
+++ b/lib/layouts/recipebook.layout
@@ -43,111 +43,138 @@ DocBookRoot               book
 
 Matter frontmatter
        GuiName "Front Matter"
-       MenuString "Front Matter|F"
+       SubMenu "Front Matter|F"
+       MenuString "Default|D"
 EndMatter
 
 Matter frontmatter*
        GuiName "Front Matter (Continuous Pagination)"
-       MenuString "Front Matter (Continuous Pagination)|r"
+       SubMenu "Front Matter|F"
+       MenuString "Continuous Pagination|C"
 EndMatter
 
 Matter frontmatter[arabic]
        GuiName "Front Matter (Arabic Pagination)"
-       MenuString "Front Matter (Arabic Pagination)|o"
+       SubMenu "Front Matter|F"
+       MenuString "Arabic Pagination|A"
 EndMatter
 
 Matter frontmatter[roman]
        GuiName "Front Matter (Lowercase Roman Pagination)"
-       MenuString "Front Matter (Lowercase Roman Pagination)|n"
+       SubMenu "Front Matter|F"
+       MenuString "Lowercase Roman Pagination|o"
 EndMatter
 
 Matter frontmatter[Roman]
        GuiName "Front Matter (Uppercase Roman Pagination)"
-       MenuString "Front Matter (Uppercase Roman Pagination)|t"
+       SubMenu "Front Matter|F"
+       MenuString "Uppercase Roman Pagination|R"
 EndMatter
 
 Matter frontmatter[alph]
        GuiName "Front Matter (Lowercase Alphabetic Pagination)"
-       MenuString "Front Matter (Lowercase Alphabetic Pagination)|L"
+       SubMenu "Front Matter|F"
+       MenuString "Lowercase Alphabetic Pagination|p"
 EndMatter
 
 Matter frontmatter[Alph]
        GuiName "Front Matter (Uppercase Alphabetic Pagination)"
-       MenuString "Front Matter (Uppercase Alphabetic Pagination)|U"
+       SubMenu "Front Matter|F"
+       MenuString "Uppercase Alphabetic Pagination|b"
 EndMatter
 
 Matter mainmatter
        GuiName "Main Matter"
-       MenuString "Main Matter|M"
+       SubMenu "Main Matter|M"
+       MenuString "Default|D"
        UseCounters 1
 EndMatter
 
 Matter mainmatter*
        GuiName "Main Matter (Continuous Pagination)"
-       MenuString "Main Matter (Continuous Pagination)|a"
+       SubMenu "Main Matter|M"
+       MenuString "Continuous Pagination|C"
        UseCounters 1
 EndMatter
 
 Matter frontmatter[arabic]
        GuiName "Main Matter (Arabic Pagination)"
-       MenuString "Main Matter (Arabic Pagination)|i"
+       SubMenu "Main Matter|M"
+       MenuString "Arabic Pagination|A"
        UseCounters 1
 EndMatter
 
 Matter mainmatter[roman]
        GuiName "Main Matter (Lowercase Roman Pagination)"
-       MenuString "Main Matter (Lowercase Roman Pagination)|w"
+       SubMenu "Main Matter|M"
+       MenuString "Lowercase Roman Pagination|o"
        UseCounters 1
 EndMatter
 
 Matter mainmatter[Roman]
        GuiName "Main Matter (Uppercase Roman Pagination)"
-       MenuString "Main Matter (Uppercase Roman Pagination)|c"
+       SubMenu "Main Matter|M"
+       MenuString "Uppercase Roman Pagination|R"
        UseCounters 1
 EndMatter
 
 Matter mainmatter[alph]
        GuiName "Main Matter (Lowercase Alphabetic Pagination)"
-       MenuString "Main Matter (Lowercase Alphabetic Pagination)|s"
+       SubMenu "Main Matter|M"
+       MenuString "Lowercase Alphabetic Pagination|p"
        UseCounters 1
 EndMatter
 
 Matter mainmatter[Alph]
        GuiName "Main Matter (Uppercase Alphabetic Pagination)"
-       MenuString "Main Matter (Uppercase Alphabetic Pagination)|p"
+       SubMenu "Main Matter|M"
+       MenuString "Uppercase Alphabetic Pagination|b"
        UseCounters 1
 EndMatter
 
 Matter backmatter
        GuiName "Back Matter"
-       MenuString "Back Matter|B"
+       SubMenu "Back Matter|B"
+       MenuString "Default|D"
+EndMatter
+
+Matter backmatter*
+       GuiName "Back Matter (Continuous Pagination)"
+       SubMenu "Back Matter|B"
+       MenuString "Continuous Pagination|C"
 EndMatter
 
 Matter backmatter[arabic]
        GuiName "Back Matter (Arabic Pagination)"
-       MenuString "Back Matter (Arabic Pagination)|k"
+       SubMenu "Back Matter|B"
+       MenuString "Arabic Pagination|A"
 EndMatter
 
 Matter backmatter[roman]
        GuiName "Back Matter (Lowercase Roman Pagination)"
-       MenuString "Back Matter (Lowercase Roman Pagination)|e"
+       SubMenu "Back Matter|B"
+       MenuString "Lowercase Roman Pagination|o"
 EndMatter
 
 Matter backmatter[Roman]
        GuiName "Back Matter (Uppercase Roman Pagination)"
-       MenuString "Back Matter (Uppercase Roman Pagination)|g"
+       SubMenu "Back Matter|B"
+       MenuString "Uppercase Roman Pagination|R"
 EndMatter
 
 Matter backmatter[alph]
        GuiName "Back Matter (Lowercase Alphabetic Pagination)"
-       MenuString "Back Matter (Lowercase Alphabetic Pagination)|h"
+       SubMenu "Back Matter|B"
+       MenuString "Lowercase Alphabetic Pagination|p"
 EndMatter
 
 Matter backmatter[Alph]
        GuiName "Back Matter (Uppercase Alphabetic Pagination)"
-       MenuString "Back Matter (Uppercase Alphabetic Pagination)"
+       SubMenu "Back Matter|B"
+       MenuString "Uppercase Alphabetic Pagination|b"
 EndMatter
 
+
 # There is no abstract environment in scrbook.cls
 NoStyle Abstract
 
diff --git a/lib/layouts/scrbook.layout b/lib/layouts/scrbook.layout
index 80798c478a..2441703668 100644
--- a/lib/layouts/scrbook.layout
+++ b/lib/layouts/scrbook.layout
@@ -21,109 +21,135 @@ NoStyle Abstract
 
 Matter frontmatter
        GuiName "Front Matter"
-       MenuString "Front Matter|F"
+       SubMenu "Front Matter|F"
+       MenuString "Default|D"
 EndMatter
 
 Matter frontmatter*
        GuiName "Front Matter (Continuous Pagination)"
-       MenuString "Front Matter (Continuous Pagination)|r"
+       SubMenu "Front Matter|F"
+       MenuString "Continuous Pagination|C"
 EndMatter
 
 Matter frontmatter[arabic]
        GuiName "Front Matter (Arabic Pagination)"
-       MenuString "Front Matter (Arabic Pagination)|o"
+       SubMenu "Front Matter|F"
+       MenuString "Arabic Pagination|A"
 EndMatter
 
 Matter frontmatter[roman]
        GuiName "Front Matter (Lowercase Roman Pagination)"
-       MenuString "Front Matter (Lowercase Roman Pagination)|n"
+       SubMenu "Front Matter|F"
+       MenuString "Lowercase Roman Pagination|o"
 EndMatter
 
 Matter frontmatter[Roman]
        GuiName "Front Matter (Uppercase Roman Pagination)"
-       MenuString "Front Matter (Uppercase Roman Pagination)|t"
+       SubMenu "Front Matter|F"
+       MenuString "Uppercase Roman Pagination|R"
 EndMatter
 
 Matter frontmatter[alph]
        GuiName "Front Matter (Lowercase Alphabetic Pagination)"
-       MenuString "Front Matter (Lowercase Alphabetic Pagination)|L"
+       SubMenu "Front Matter|F"
+       MenuString "Lowercase Alphabetic Pagination|p"
 EndMatter
 
 Matter frontmatter[Alph]
        GuiName "Front Matter (Uppercase Alphabetic Pagination)"
-       MenuString "Front Matter (Uppercase Alphabetic Pagination)|U"
+       SubMenu "Front Matter|F"
+       MenuString "Uppercase Alphabetic Pagination|b"
 EndMatter
 
 Matter mainmatter
        GuiName "Main Matter"
-       MenuString "Main Matter|M"
+       SubMenu "Main Matter|M"
+       MenuString "Default|D"
        UseCounters 1
 EndMatter
 
 Matter mainmatter*
        GuiName "Main Matter (Continuous Pagination)"
-       MenuString "Main Matter (Continuous Pagination)|a"
+       SubMenu "Main Matter|M"
+       MenuString "Continuous Pagination|C"
        UseCounters 1
 EndMatter
 
 Matter frontmatter[arabic]
        GuiName "Main Matter (Arabic Pagination)"
-       MenuString "Main Matter (Arabic Pagination)|i"
+       SubMenu "Main Matter|M"
+       MenuString "Arabic Pagination|A"
        UseCounters 1
 EndMatter
 
 Matter mainmatter[roman]
        GuiName "Main Matter (Lowercase Roman Pagination)"
-       MenuString "Main Matter (Lowercase Roman Pagination)|w"
+       SubMenu "Main Matter|M"
+       MenuString "Lowercase Roman Pagination|o"
        UseCounters 1
 EndMatter
 
 Matter mainmatter[Roman]
        GuiName "Main Matter (Uppercase Roman Pagination)"
-       MenuString "Main Matter (Uppercase Roman Pagination)|c"
+       SubMenu "Main Matter|M"
+       MenuString "Uppercase Roman Pagination|R"
        UseCounters 1
 EndMatter
 
 Matter mainmatter[alph]
        GuiName "Main Matter (Lowercase Alphabetic Pagination)"
-       MenuString "Main Matter (Lowercase Alphabetic Pagination)|s"
+       SubMenu "Main Matter|M"
+       MenuString "Lowercase Alphabetic Pagination|p"
        UseCounters 1
 EndMatter
 
 Matter mainmatter[Alph]
        GuiName "Main Matter (Uppercase Alphabetic Pagination)"
-       MenuString "Main Matter (Uppercase Alphabetic Pagination)|p"
+       SubMenu "Main Matter|M"
+       MenuString "Uppercase Alphabetic Pagination|b"
        UseCounters 1
 EndMatter
 
 Matter backmatter
        GuiName "Back Matter"
-       MenuString "Back Matter|B"
+       SubMenu "Back Matter|B"
+       MenuString "Default|D"
+EndMatter
+
+Matter backmatter*
+       GuiName "Back Matter (Continuous Pagination)"
+       SubMenu "Back Matter|B"
+       MenuString "Continuous Pagination|C"
 EndMatter
 
 Matter backmatter[arabic]
        GuiName "Back Matter (Arabic Pagination)"
-       MenuString "Back Matter (Arabic Pagination)|k"
+       SubMenu "Back Matter|B"
+       MenuString "Arabic Pagination|A"
 EndMatter
 
 Matter backmatter[roman]
        GuiName "Back Matter (Lowercase Roman Pagination)"
-       MenuString "Back Matter (Lowercase Roman Pagination)|e"
+       SubMenu "Back Matter|B"
+       MenuString "Lowercase Roman Pagination|o"
 EndMatter
 
 Matter backmatter[Roman]
        GuiName "Back Matter (Uppercase Roman Pagination)"
-       MenuString "Back Matter (Uppercase Roman Pagination)|g"
+       SubMenu "Back Matter|B"
+       MenuString "Uppercase Roman Pagination|R"
 EndMatter
 
 Matter backmatter[alph]
        GuiName "Back Matter (Lowercase Alphabetic Pagination)"
-       MenuString "Back Matter (Lowercase Alphabetic Pagination)|h"
+       SubMenu "Back Matter|B"
+       MenuString "Lowercase Alphabetic Pagination|p"
 EndMatter
 
 Matter backmatter[Alph]
        GuiName "Back Matter (Uppercase Alphabetic Pagination)"
-       MenuString "Back Matter (Uppercase Alphabetic Pagination)"
+       SubMenu "Back Matter|B"
+       MenuString "Uppercase Alphabetic Pagination|b"
 EndMatter
 
 
diff --git a/po/lyx_pot.py b/po/lyx_pot.py
index 13c6f0c7b6..dbec87886c 100755
--- a/po/lyx_pot.py
+++ b/po/lyx_pot.py
@@ -88,6 +88,7 @@ def layouts_l10n(input_files, output, base, 
layouttranslations):
     # match LabelString, EndLabelString, LabelStringAppendix and maybe others 
but no comments
     LabelString = re.compile(r'^[^#]*LabelString\S*\s+(.*\S)\s*$', 
re.IGNORECASE)
     MenuString = re.compile(r'^[^#]*MenuString\S*\s+(.*\S)\s*$', re.IGNORECASE)
+    SubMenu = re.compile(r'^[^#]*SubMenu\S*\s+(.*\S)\s*$', re.IGNORECASE)
     OutlinerName = 
re.compile(r'^[^#]*OutlinerName\s+(\S+|\"[^\"]*\")\s+\"([^\"]*)\"', 
re.IGNORECASE)
     Tooltip = re.compile(r'^\s*Tooltip\S*\s+(.*\S)\s*$', re.IGNORECASE)
     GuiName = re.compile(r'^\s*GuiName\s+(.*\S)\s*$', re.IGNORECASE)
@@ -265,6 +266,12 @@ def layouts_l10n(input_files, output, base, 
layouttranslations):
                     writeString(out, src, base, lineno, string)
                 continue
             res = MenuString.search(line)
+            if res != None:
+                string = res.group(1)
+                if not layouttranslations:
+                    writeString(out, src, base, lineno, string)
+                continue
+            res = SubMenu.search(line)
             if res != None:
                 string = res.group(1)
                 if not layouttranslations:
diff --git a/src/TextClass.cpp b/src/TextClass.cpp
index e9c1bf3a39..bb7bf8d754 100644
--- a/src/TextClass.cpp
+++ b/src/TextClass.cpp
@@ -1078,6 +1078,8 @@ void TextClass::readMatter(Lexer & lexrc)
                ///
                MATTER_MENU_STRING,
                ///
+               MATTER_SUBMENU,
+               ///
                MATTER_USE_COUNTERS,
                ///
                MATTER_END
@@ -1087,6 +1089,7 @@ void TextClass::readMatter(Lexer & lexrc)
                { "endmatter",  MATTER_END },
                { "guiname",  MATTER_GUI_NAME },
                { "menustring", MATTER_MENU_STRING },
+               { "submenu", MATTER_SUBMENU },
                { "usecounters", MATTER_USE_COUNTERS }
        };
 
@@ -1114,6 +1117,10 @@ void TextClass::readMatter(Lexer & lexrc)
                        lexrc.next();
                        matter.menustring = rtrim(lexrc.getDocString());
                        break;
+               case MATTER_SUBMENU:
+                       lexrc.next();
+                       matter.submenu = rtrim(lexrc.getDocString());
+                       break;
                case MATTER_USE_COUNTERS:
                        lexrc.next();
                        matter.use_counters = lexrc.getBool();
diff --git a/src/TextClass.h b/src/TextClass.h
index 4e28d8fa9b..e7ec8b6b77 100644
--- a/src/TextClass.h
+++ b/src/TextClass.h
@@ -218,6 +218,8 @@ public:
                ///
                docstring menustring;
                ///
+               docstring submenu;
+               ///
                bool use_counters;
        };
        /// Does this class provide \forntmatter, \mainmatter, and \backmatter?
diff --git a/src/frontends/qt/Menus.cpp b/src/frontends/qt/Menus.cpp
index 4170ee16c7..8e62a0bc75 100644
--- a/src/frontends/qt/Menus.cpp
+++ b/src/frontends/qt/Menus.cpp
@@ -2024,10 +2024,36 @@ void MenuDefinition::expandDocMatters(Buffer const * 
buf)
                return;
 
        DocumentClass const & dc = buf->params().documentClass();
+       vector<MenuDefinition> submenus;
        for (auto const & m : dc.getMatters()) {
                docstring const gui = m.menustring.empty() ? m.guiname : 
m.menustring;
-               add(MenuItem(MenuItem::Command, 
toqstr(translateIfPossible(gui)),
-                            FuncRequest(LFUN_MATTER, from_ascii(m.name))));
+               if (m.submenu.empty())
+                       add(MenuItem(MenuItem::Command, 
toqstr(translateIfPossible(gui)),
+                                    FuncRequest(LFUN_MATTER, 
from_ascii(m.name))));
+               else {
+                       QString sname = toqstr(m.submenu);
+                       bool have_submenu = false;
+                       for (auto & sm : submenus) {
+                               if (sm.name() == sname) {
+                                       sm.add(MenuItem(MenuItem::Command, 
toqstr(translateIfPossible(gui)),
+                                                      FuncRequest(LFUN_MATTER, 
from_ascii(m.name))));
+                                       have_submenu = true;
+                                       break;
+                               }
+                       }
+                       if (!have_submenu) {
+                               MenuDefinition md(sname);
+                               md.add(MenuItem(MenuItem::Command, 
toqstr(translateIfPossible(gui)),
+                                               FuncRequest(LFUN_MATTER, 
from_ascii(m.name))));
+                               submenus.push_back(md);
+                       }
+               }
+       }
+       // append submenus
+       for (auto const & sm : submenus) {
+               MenuItem item(MenuItem::Submenu, qt_(sm.name()));
+               item.setSubmenu(sm);
+               add(item);
        }
 }
 
-- 
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to