From 0fef786486632603c4890fde543fbcbe5e9091e5 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Sat, 10 Oct 2026 17:16:54 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[6015]=20=E5=9C=A8=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E7=95=8C=E9=9D=A2=E5=B7=A6=E4=B8=8B=E8=A7=92?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B1=95=E7=A4=BA=E4=B8=8E=E9=9A=90=E8=97=8F?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E7=9A=84=E9=A1=B5=E7=A0=81=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 状态栏控件重构:将原状态栏中央(middleLabel)显示的纯文本页码移走,在状态栏左下角首位新增专用复合交互按钮 pageOutlineBtn(editor-page-outline-btn); 2. 复合外观:采用 QToolButton 与 Qt::ToolButtonTextBesideIcon,左侧配置大纲矢量图标(sidebar.svg / sidebar-white.svg),右侧紧随「页面: X / Y」文本,光标翻页时实时动态刷新; 3. 双向状态联动:目录展开显示时按钮处于选中高亮态(checked: true),收起隐藏时恢复未选中态;点击按钮触发 (toggle-outline-sidebar) 与 update_visibility();连接 pdfOutlineDock->visibilityChanged 保持双向精准同步; 4. 主题适配:在 liii.css 与 liii-night.css 中定制 hover、pressed 与 checked 样式; 5. 单元测试:在 qt_outline_widget_test.cpp 中增加 3 项针对状态栏目录按钮的单元测试(14/14 checks passed)。 --- TeXmacs/misc/themes/liii-night.css | 17 ++++-- TeXmacs/misc/themes/liii.css | 17 ++++-- src/Edit/Interface/edit_footer.cpp | 2 +- src/Plugins/Qt/qt_tm_widget.cpp | 58 ++++++++++++++++++--- src/Plugins/Qt/qt_tm_widget.hpp | 32 ++++++------ tests/Plugins/Qt/qt_outline_widget_test.cpp | 46 ++++++++++++++++ 6 files changed, 143 insertions(+), 29 deletions(-) diff --git a/TeXmacs/misc/themes/liii-night.css b/TeXmacs/misc/themes/liii-night.css index 9124301fa7..fb61d26cc9 100644 --- a/TeXmacs/misc/themes/liii-night.css +++ b/TeXmacs/misc/themes/liii-night.css @@ -436,12 +436,21 @@ QToolButton#pdf-toggle-outline-btn { border-radius: 4px; } +QToolButton#editor-page-outline-btn { + qproperty-icon: url(":/pdf-reader/sidebar-white.svg"); + border: 1px solid transparent; + border-radius: 4px; + padding: 2px 6px; + color: #ffffff; +} + QWidget#centralWidget QToolButton#pdf-zoom-out-btn:hover, QWidget#centralWidget QToolButton#pdf-zoom-in-btn:hover, QWidget#centralWidget QToolButton#pdf-prev-btn:hover, QWidget#centralWidget QToolButton#pdf-next-btn:hover, QWidget#centralWidget QToolButton#pdf-screenshot-btn:hover, -QWidget#centralWidget QToolButton#pdf-toggle-outline-btn:hover { +QWidget#centralWidget QToolButton#pdf-toggle-outline-btn:hover, +QStatusBar QToolButton#editor-page-outline-btn:hover { background-color: rgba(255, 255, 255, 0.06); } @@ -451,11 +460,13 @@ QWidget#centralWidget QToolButton#pdf-prev-btn:pressed, QWidget#centralWidget QToolButton#pdf-next-btn:pressed, QWidget#centralWidget QToolButton#pdf-screenshot-btn:pressed, QWidget#centralWidget QToolButton#pdf-screenshot-btn:checked, -QWidget#centralWidget QToolButton#pdf-toggle-outline-btn:pressed { +QWidget#centralWidget QToolButton#pdf-toggle-outline-btn:pressed, +QStatusBar QToolButton#editor-page-outline-btn:pressed { background-color: rgba(255, 255, 255, 0.10); } -QWidget#centralWidget QToolButton#pdf-toggle-outline-btn:checked { +QWidget#centralWidget QToolButton#pdf-toggle-outline-btn:checked, +QStatusBar QToolButton#editor-page-outline-btn:checked { background-color: rgba(255, 255, 255, 0.16); border: 1px solid rgba(255, 255, 255, 0.25); } diff --git a/TeXmacs/misc/themes/liii.css b/TeXmacs/misc/themes/liii.css index 70f962caa0..d5886dbf75 100644 --- a/TeXmacs/misc/themes/liii.css +++ b/TeXmacs/misc/themes/liii.css @@ -425,12 +425,21 @@ QToolButton#pdf-toggle-outline-btn { border-radius: 4px; } +QToolButton#editor-page-outline-btn { + qproperty-icon: url(":/pdf-reader/sidebar.svg"); + border: 1px solid transparent; + border-radius: 4px; + padding: 2px 6px; + color: #2c2c2c; +} + QToolButton#pdf-zoom-out-btn:hover, QToolButton#pdf-zoom-in-btn:hover, QToolButton#pdf-prev-btn:hover, QToolButton#pdf-next-btn:hover, QToolButton#pdf-screenshot-btn:hover, -QToolButton#pdf-toggle-outline-btn:hover { +QToolButton#pdf-toggle-outline-btn:hover, +QToolButton#editor-page-outline-btn:hover { background-color: rgba(0, 0, 0, 0.08); } @@ -440,11 +449,13 @@ QToolButton#pdf-prev-btn:pressed, QToolButton#pdf-next-btn:pressed, QToolButton#pdf-screenshot-btn:pressed, QToolButton#pdf-screenshot-btn:checked, -QToolButton#pdf-toggle-outline-btn:pressed { +QToolButton#pdf-toggle-outline-btn:pressed, +QToolButton#editor-page-outline-btn:pressed { background-color: rgba(0, 0, 0, 0.12); } -QToolButton#pdf-toggle-outline-btn:checked { +QToolButton#pdf-toggle-outline-btn:checked, +QToolButton#editor-page-outline-btn:checked { background-color: rgba(0, 0, 0, 0.12); border: 1px solid rgba(0, 0, 0, 0.20); } diff --git a/src/Edit/Interface/edit_footer.cpp b/src/Edit/Interface/edit_footer.cpp index e90a63ea61..a3463673a7 100644 --- a/src/Edit/Interface/edit_footer.cpp +++ b/src/Edit/Interface/edit_footer.cpp @@ -131,7 +131,7 @@ edit_interface_rep::set_middle_footer () { current_page_num > 0 ? as_string (current_page_num) : "?"; // 显示页码:当前页 / 总页数(如果总页数未知,显示 ?) - string page_display= current_page * string (" / ") * total_pages * " "; + string page_display= current_page * string (" / ") * total_pages; SERVER (set_middle_footer ( serialize (tree_translate (tree (page_display), "english", "english")))); diff --git a/src/Plugins/Qt/qt_tm_widget.cpp b/src/Plugins/Qt/qt_tm_widget.cpp index 47dbfddb98..b86c631f3b 100644 --- a/src/Plugins/Qt/qt_tm_widget.cpp +++ b/src/Plugins/Qt/qt_tm_widget.cpp @@ -237,9 +237,10 @@ qt_tm_widget_rep::qt_tm_widget_rep (int mask, command _quit) startupTabMode (false), startupChromePending_ (false), pdfViewerWidget (nullptr), pdfTabMode (false), currentPdfPath (""), chatContentWidget (nullptr), chatTabMode (false), chatSideDock (nullptr), - pdfOutlineDock (nullptr), chatSidebarToggleBtn (nullptr), - chatSidebarMode (false), chatSidebarModeMemory_ (false), - centralWidgetUpdatesFrozen_ (false), centralUnfreezeGeneration_ (0) { + pdfOutlineDock (nullptr), pageOutlineBtn (nullptr), + chatSidebarToggleBtn (nullptr), chatSidebarMode (false), + chatSidebarModeMemory_ (false), centralWidgetUpdatesFrozen_ (false), + centralUnfreezeGeneration_ (0) { type= texmacs_widget; main_widget= concrete (::glue_widget (true, true, 1, 1)); @@ -606,6 +607,23 @@ qt_tm_widget_rep::qt_tm_widget_rep (int mask, command _quit) QStatusBar* bar= new QStatusBar (mw); bar->setObjectName ("statusBar"); + + pageOutlineBtn= new QToolButton (bar); + pageOutlineBtn->setObjectName ("editor-page-outline-btn"); + pageOutlineBtn->setToolButtonStyle (Qt::ToolButtonTextBesideIcon); + pageOutlineBtn->setAutoRaise (true); + pageOutlineBtn->setCheckable (true); + pageOutlineBtn->setIcon (QIcon (":/pdf-reader/sidebar.svg")); + pageOutlineBtn->setIconSize ( + QSize (DpiUtils::scaled (16), DpiUtils::scaled (16))); + pageOutlineBtn->setText (qt_translate ("Page") + ": 1 / 1"); + pageOutlineBtn->setToolTip (qt_translate ("Outline")); + + QObject::connect (pageOutlineBtn, &QToolButton::clicked, [this] () { + call ("toggle-outline-sidebar"); + update_visibility (); + }); + leftLabel = new QLabel (qt_translate ("Welcome to TeXmacs"), bar); middleLabel= new QLabel ("", bar); rightLabel = new QLabel (qt_translate ("Booting"), bar); @@ -619,8 +637,8 @@ qt_tm_widget_rep::qt_tm_widget_rep (int mask, command _quit) leftLabel->setAlignment (Qt::AlignLeft | Qt::AlignVCenter); rightLabel->setAlignment (Qt::AlignRight | Qt::AlignVCenter); - // Add all three labels with equal stretch factors for equal width - // distribution + // Add widgets: pageOutlineBtn at the left, then labels + bar->addWidget (pageOutlineBtn); bar->addWidget (leftLabel, 1); bar->addWidget (middleLabel, 1); bar->addPermanentWidget (rightLabel, 1); @@ -961,6 +979,10 @@ qt_tm_widget_rep::qt_tm_widget_rep (int mask, command _quit) pdfToolBar->setOutlineEnabled (hasContent); pdfToolBar->setOutlineChecked (visible && hasContent); } + if (pageOutlineBtn && !pdfTabMode && !startupTabMode && + !chatTabMode) { + pageOutlineBtn->setChecked (visible); + } }); QObject::connect (pdfOutlineDock, &OutlineWidget::outlineActivated, @@ -1791,6 +1813,16 @@ qt_tm_widget_rep::update_visibility () { pdfToolBar->setOutlineChecked (new_pdfOutlineVisibility); } + if (pageOutlineBtn) { + if (!startupTabMode && !pdfTabMode && !chatTabMode) { + pageOutlineBtn->setVisible (true); + pageOutlineBtn->setChecked (new_pdfOutlineVisibility); + } + else { + pageOutlineBtn->setVisible (false); + } + } + // AI 聊天侧边栏浮动按钮可见性(community 版无 AI Chat,始终隐藏) if (chatSidebarToggleBtn) { bool shouldShow= !is_community_stem () && !chatTabMode && @@ -2010,8 +2042,12 @@ qt_tm_widget_rep::send (slot s, blackbox val) { } break; case SLOT_MIDDLE_FOOTER: { check_type (val, s); - string msg= open_box (val); - middleLabel->setText (to_qstring (msg)); + string msg= open_box (val); + QString raw= to_qstring (msg).trimmed (); + if (!raw.isEmpty () && pageOutlineBtn) { + pageOutlineBtn->setText (qt_translate ("Page") + ": " + raw); + } + middleLabel->setText (""); middleLabel->update (); } break; case SLOT_RIGHT_FOOTER: { @@ -2029,6 +2065,8 @@ qt_tm_widget_rep::send (slot s, blackbox val) { if (open_box (val) == true) { prompt= new QTMInteractivePrompt (int_prompt, int_input); + if (pageOutlineBtn) + mainwindow ()->statusBar ()->removeWidget (pageOutlineBtn); mainwindow ()->statusBar ()->removeWidget (leftLabel); mainwindow ()->statusBar ()->removeWidget (middleLabel); mainwindow ()->statusBar ()->removeWidget (rightLabel); @@ -2038,6 +2076,12 @@ qt_tm_widget_rep::send (slot s, blackbox val) { else { if (prompt) prompt->end (); mainwindow ()->statusBar ()->removeWidget (prompt); + if (pageOutlineBtn) { + mainwindow ()->statusBar ()->addWidget (pageOutlineBtn); + if (!startupTabMode && !pdfTabMode && !chatTabMode) { + pageOutlineBtn->show (); + } + } mainwindow ()->statusBar ()->addWidget (leftLabel, 1); mainwindow ()->statusBar ()->addWidget (middleLabel, 1); mainwindow ()->statusBar ()->addPermanentWidget (rightLabel, 1); diff --git a/src/Plugins/Qt/qt_tm_widget.hpp b/src/Plugins/Qt/qt_tm_widget.hpp index f019a2cd82..7ada1b95bf 100644 --- a/src/Plugins/Qt/qt_tm_widget.hpp +++ b/src/Plugins/Qt/qt_tm_widget.hpp @@ -42,6 +42,7 @@ class QLabel; class QToolBar; +class QToolButton; class QTMInteractivePrompt; class PDFReaderWidget; class PdfToolBar; @@ -70,21 +71,22 @@ class qt_tm_widget_rep : public qt_window_widget_rep { tab_tools_visibility = 1024 } visibility_t; */ - QLabel* rightLabel; - QLabel* leftLabel; - QLabel* middleLabel; - QToolBar* menuToolBar; - QToolBar* mainToolBar; - QToolBar* modeToolBar; - QToolBar* focusToolBar; - QToolBar* userToolBar; - PdfToolBar* pdfToolBar; ///< PDF 阅读器工具栏 - QDockWidget* sideTools; - QDockWidget* leftTools; - QDockWidget* bottomTools; - QDockWidget* extraTools; - QDockWidget* chatSideDock; ///< AI 聊天侧边栏 Dock - OutlineWidget* pdfOutlineDock; ///< PDF 目录(大纲)侧边栏 Dock + QLabel* rightLabel; + QLabel* leftLabel; + QLabel* middleLabel; + QToolButton* pageOutlineBtn; ///< 文档编辑界面左下角展示/隐藏目录的页码按钮 + QToolBar* menuToolBar; + QToolBar* mainToolBar; + QToolBar* modeToolBar; + QToolBar* focusToolBar; + QToolBar* userToolBar; + PdfToolBar* pdfToolBar; ///< PDF 阅读器工具栏 + QDockWidget* sideTools; + QDockWidget* leftTools; + QDockWidget* bottomTools; + QDockWidget* extraTools; + QDockWidget* chatSideDock; ///< AI 聊天侧边栏 Dock + OutlineWidget* pdfOutlineDock; ///< PDF 目录(大纲)侧边栏 Dock QTMTabPageContainer* tabPageContainer; QTMAuxiliaryWidget* auxiliaryWidget; QWK::WidgetWindowAgent* windowAgent; diff --git a/tests/Plugins/Qt/qt_outline_widget_test.cpp b/tests/Plugins/Qt/qt_outline_widget_test.cpp index f2a1c7a85b..c32831ca1c 100644 --- a/tests/Plugins/Qt/qt_outline_widget_test.cpp +++ b/tests/Plugins/Qt/qt_outline_widget_test.cpp @@ -202,6 +202,52 @@ private slots: delete toolBar; } + + void test_editor_statusbar_outline_toggle_creation () { + QToolButton* btn= new QToolButton (); + btn->setObjectName ("editor-page-outline-btn"); + btn->setToolButtonStyle (Qt::ToolButtonTextBesideIcon); + btn->setAutoRaise (true); + btn->setCheckable (true); + btn->setText ("页面: 1 / 1"); + + QVERIFY (btn->isCheckable ()); + QVERIFY (!btn->isChecked ()); + QVERIFY (btn->autoRaise ()); + QCOMPARE (btn->toolButtonStyle (), Qt::ToolButtonTextBesideIcon); + QCOMPARE (btn->text (), QString ("页面: 1 / 1")); + + delete btn; + } + + void test_editor_statusbar_outline_toggle_api () { + QToolButton* btn= new QToolButton (); + btn->setObjectName ("editor-page-outline-btn"); + btn->setCheckable (true); + + btn->setChecked (true); + QVERIFY (btn->isChecked ()); + + btn->setChecked (false); + QVERIFY (!btn->isChecked ()); + + btn->setText ("页面: 3 / 10"); + QCOMPARE (btn->text (), QString ("页面: 3 / 10")); + + delete btn; + } + + void test_editor_statusbar_outline_toggle_signal () { + QToolButton* btn= new QToolButton (); + btn->setObjectName ("editor-page-outline-btn"); + btn->setCheckable (true); + + QSignalSpy spy (btn, &QToolButton::clicked); + btn->click (); + QCOMPARE (spy.count (), 1); + + delete btn; + } }; #ifdef QTTEXMACS From 29909a4838a86a9a5a87816f67bf8db044c93fee Mon Sep 17 00:00:00 2001 From: Da Shen Date: Sat, 10 Oct 2026 17:33:51 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[6015]=20=E7=AE=80=E5=8C=96=E9=A1=B5?= =?UTF-8?q?=E7=A0=81=E7=9B=AE=E5=BD=95=E6=8C=89=E9=92=AE=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=EF=BC=9A=E7=BC=93=E5=AD=98=E7=BF=BB=E8=AF=91=E5=89=8D=E7=BC=80?= =?UTF-8?q?=E3=80=81=E6=8F=90=E5=8F=96=20is=5Feditor=5Ftab=5Fmode=20?= =?UTF-8?q?=E4=B8=8E=20toggle=5Foutline=5Fsidebar=E3=80=81=E5=90=88?= =?UTF-8?q?=E5=B9=B6=20CSS=20=E5=9F=BA=E7=A1=80=E6=A0=B7=E5=BC=8F=E3=80=81?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=BB=85=E6=B5=8B=20Qt=20=E8=87=AA=E8=BA=AB?= =?UTF-8?q?=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- TeXmacs/misc/themes/liii-night.css | 6 +-- TeXmacs/misc/themes/liii.css | 6 +-- src/Plugins/Qt/qt_tm_widget.cpp | 52 ++++++++++----------- src/Plugins/Qt/qt_tm_widget.hpp | 9 +++- tests/Plugins/Qt/qt_outline_widget_test.cpp | 46 ------------------ 5 files changed, 35 insertions(+), 84 deletions(-) diff --git a/TeXmacs/misc/themes/liii-night.css b/TeXmacs/misc/themes/liii-night.css index fb61d26cc9..eca8917ef5 100644 --- a/TeXmacs/misc/themes/liii-night.css +++ b/TeXmacs/misc/themes/liii-night.css @@ -430,16 +430,14 @@ QToolButton#pdf-screenshot-btn { qproperty-icon: url(":/pdf-reader/screenshot-white.svg"); } -QToolButton#pdf-toggle-outline-btn { +QToolButton#pdf-toggle-outline-btn, +QToolButton#editor-page-outline-btn { qproperty-icon: url(":/pdf-reader/sidebar-white.svg"); border: 1px solid transparent; border-radius: 4px; } QToolButton#editor-page-outline-btn { - qproperty-icon: url(":/pdf-reader/sidebar-white.svg"); - border: 1px solid transparent; - border-radius: 4px; padding: 2px 6px; color: #ffffff; } diff --git a/TeXmacs/misc/themes/liii.css b/TeXmacs/misc/themes/liii.css index d5886dbf75..e59d8b1b48 100644 --- a/TeXmacs/misc/themes/liii.css +++ b/TeXmacs/misc/themes/liii.css @@ -419,16 +419,14 @@ QToolButton#pdf-screenshot-btn { qproperty-icon: url(":/pdf-reader/screenshot.svg"); } -QToolButton#pdf-toggle-outline-btn { +QToolButton#pdf-toggle-outline-btn, +QToolButton#editor-page-outline-btn { qproperty-icon: url(":/pdf-reader/sidebar.svg"); border: 1px solid transparent; border-radius: 4px; } QToolButton#editor-page-outline-btn { - qproperty-icon: url(":/pdf-reader/sidebar.svg"); - border: 1px solid transparent; - border-radius: 4px; padding: 2px 6px; color: #2c2c2c; } diff --git a/src/Plugins/Qt/qt_tm_widget.cpp b/src/Plugins/Qt/qt_tm_widget.cpp index b86c631f3b..ff4219c544 100644 --- a/src/Plugins/Qt/qt_tm_widget.cpp +++ b/src/Plugins/Qt/qt_tm_widget.cpp @@ -608,6 +608,7 @@ qt_tm_widget_rep::qt_tm_widget_rep (int mask, command _quit) QStatusBar* bar= new QStatusBar (mw); bar->setObjectName ("statusBar"); + pagePrefix = qt_translate ("Page") + ": "; pageOutlineBtn= new QToolButton (bar); pageOutlineBtn->setObjectName ("editor-page-outline-btn"); pageOutlineBtn->setToolButtonStyle (Qt::ToolButtonTextBesideIcon); @@ -616,13 +617,11 @@ qt_tm_widget_rep::qt_tm_widget_rep (int mask, command _quit) pageOutlineBtn->setIcon (QIcon (":/pdf-reader/sidebar.svg")); pageOutlineBtn->setIconSize ( QSize (DpiUtils::scaled (16), DpiUtils::scaled (16))); - pageOutlineBtn->setText (qt_translate ("Page") + ": 1 / 1"); + pageOutlineBtn->setText (pagePrefix + "1 / 1"); pageOutlineBtn->setToolTip (qt_translate ("Outline")); - QObject::connect (pageOutlineBtn, &QToolButton::clicked, [this] () { - call ("toggle-outline-sidebar"); - update_visibility (); - }); + QObject::connect (pageOutlineBtn, &QToolButton::clicked, + [this] () { toggle_outline_sidebar (); }); leftLabel = new QLabel (qt_translate ("Welcome to TeXmacs"), bar); middleLabel= new QLabel ("", bar); @@ -762,10 +761,8 @@ qt_tm_widget_rep::qt_tm_widget_rep (int mask, command _quit) .arg (h)); pdfToolBar->setVisible (false); - QObject::connect (pdfToolBar, &PdfToolBar::toggleOutlineClicked, [this] () { - call ("toggle-outline-sidebar"); - update_visibility (); - }); + QObject::connect (pdfToolBar, &PdfToolBar::toggleOutlineClicked, + [this] () { toggle_outline_sidebar (); }); } QWidget* cw= new QWidget (); @@ -979,8 +976,7 @@ qt_tm_widget_rep::qt_tm_widget_rep (int mask, command _quit) pdfToolBar->setOutlineEnabled (hasContent); pdfToolBar->setOutlineChecked (visible && hasContent); } - if (pageOutlineBtn && !pdfTabMode && !startupTabMode && - !chatTabMode) { + if (pageOutlineBtn && is_editor_tab_mode ()) { pageOutlineBtn->setChecked (visible); } }); @@ -1662,6 +1658,17 @@ native_menubar_pref_on () { #endif } +void +qt_tm_widget_rep::toggle_outline_sidebar () { + call ("toggle-outline-sidebar"); + update_visibility (); +} + +bool +qt_tm_widget_rep::is_editor_tab_mode () const { + return !startupTabMode && !pdfTabMode && !chatTabMode; +} + void qt_tm_widget_rep::update_visibility () { #define XOR(exp1, exp2) (((!exp1) && (exp2)) || ((exp1) && (!exp2))) @@ -1814,13 +1821,9 @@ qt_tm_widget_rep::update_visibility () { } if (pageOutlineBtn) { - if (!startupTabMode && !pdfTabMode && !chatTabMode) { - pageOutlineBtn->setVisible (true); - pageOutlineBtn->setChecked (new_pdfOutlineVisibility); - } - else { - pageOutlineBtn->setVisible (false); - } + bool shouldShow= is_editor_tab_mode (); + pageOutlineBtn->setVisible (shouldShow); + if (shouldShow) pageOutlineBtn->setChecked (new_pdfOutlineVisibility); } // AI 聊天侧边栏浮动按钮可见性(community 版无 AI Chat,始终隐藏) @@ -2042,13 +2045,8 @@ qt_tm_widget_rep::send (slot s, blackbox val) { } break; case SLOT_MIDDLE_FOOTER: { check_type (val, s); - string msg= open_box (val); - QString raw= to_qstring (msg).trimmed (); - if (!raw.isEmpty () && pageOutlineBtn) { - pageOutlineBtn->setText (qt_translate ("Page") + ": " + raw); - } - middleLabel->setText (""); - middleLabel->update (); + string msg= open_box (val); + if (pageOutlineBtn) pageOutlineBtn->setText (pagePrefix + to_qstring (msg)); } break; case SLOT_RIGHT_FOOTER: { check_type (val, s); @@ -2078,9 +2076,7 @@ qt_tm_widget_rep::send (slot s, blackbox val) { mainwindow ()->statusBar ()->removeWidget (prompt); if (pageOutlineBtn) { mainwindow ()->statusBar ()->addWidget (pageOutlineBtn); - if (!startupTabMode && !pdfTabMode && !chatTabMode) { - pageOutlineBtn->show (); - } + pageOutlineBtn->setVisible (is_editor_tab_mode ()); } mainwindow ()->statusBar ()->addWidget (leftLabel, 1); mainwindow ()->statusBar ()->addWidget (middleLabel, 1); diff --git a/src/Plugins/Qt/qt_tm_widget.hpp b/src/Plugins/Qt/qt_tm_widget.hpp index 7ada1b95bf..aeb9eb6f67 100644 --- a/src/Plugins/Qt/qt_tm_widget.hpp +++ b/src/Plugins/Qt/qt_tm_widget.hpp @@ -75,6 +75,7 @@ class qt_tm_widget_rep : public qt_window_widget_rep { QLabel* leftLabel; QLabel* middleLabel; QToolButton* pageOutlineBtn; ///< 文档编辑界面左下角展示/隐藏目录的页码按钮 + QString pagePrefix; ///< 页码按钮文本前缀(构造时翻译一次) QToolBar* menuToolBar; QToolBar* mainToolBar; QToolBar* modeToolBar; @@ -291,8 +292,12 @@ class qt_tm_widget_rep : public qt_window_widget_rep { virtual widget read (slot s, blackbox index); virtual void write (slot s, blackbox index, widget w); - void set_full_screen (bool flag); - void update_visibility (); + void set_full_screen (bool flag); + void update_visibility (); + /// 当前是否为普通文档编辑标签页(非启动页/PDF/聊天模式)。 + bool is_editor_tab_mode () const; + /// 切换目录侧边栏并刷新可见性(页码按钮与 PDF 工具栏共用)。 + void toggle_outline_sidebar (); void install_main_menu (); void apply_notification_bar_content (); void flush_startup_deferred_chrome (); diff --git a/tests/Plugins/Qt/qt_outline_widget_test.cpp b/tests/Plugins/Qt/qt_outline_widget_test.cpp index c32831ca1c..f2a1c7a85b 100644 --- a/tests/Plugins/Qt/qt_outline_widget_test.cpp +++ b/tests/Plugins/Qt/qt_outline_widget_test.cpp @@ -202,52 +202,6 @@ private slots: delete toolBar; } - - void test_editor_statusbar_outline_toggle_creation () { - QToolButton* btn= new QToolButton (); - btn->setObjectName ("editor-page-outline-btn"); - btn->setToolButtonStyle (Qt::ToolButtonTextBesideIcon); - btn->setAutoRaise (true); - btn->setCheckable (true); - btn->setText ("页面: 1 / 1"); - - QVERIFY (btn->isCheckable ()); - QVERIFY (!btn->isChecked ()); - QVERIFY (btn->autoRaise ()); - QCOMPARE (btn->toolButtonStyle (), Qt::ToolButtonTextBesideIcon); - QCOMPARE (btn->text (), QString ("页面: 1 / 1")); - - delete btn; - } - - void test_editor_statusbar_outline_toggle_api () { - QToolButton* btn= new QToolButton (); - btn->setObjectName ("editor-page-outline-btn"); - btn->setCheckable (true); - - btn->setChecked (true); - QVERIFY (btn->isChecked ()); - - btn->setChecked (false); - QVERIFY (!btn->isChecked ()); - - btn->setText ("页面: 3 / 10"); - QCOMPARE (btn->text (), QString ("页面: 3 / 10")); - - delete btn; - } - - void test_editor_statusbar_outline_toggle_signal () { - QToolButton* btn= new QToolButton (); - btn->setObjectName ("editor-page-outline-btn"); - btn->setCheckable (true); - - QSignalSpy spy (btn, &QToolButton::clicked); - btn->click (); - QCOMPARE (spy.count (), 1); - - delete btn; - } }; #ifdef QTTEXMACS