diff --git a/TeXmacs/misc/themes/liii-night.css b/TeXmacs/misc/themes/liii-night.css index 9124301fa7..eca8917ef5 100644 --- a/TeXmacs/misc/themes/liii-night.css +++ b/TeXmacs/misc/themes/liii-night.css @@ -430,18 +430,25 @@ 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 { + 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 +458,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..e59d8b1b48 100644 --- a/TeXmacs/misc/themes/liii.css +++ b/TeXmacs/misc/themes/liii.css @@ -419,18 +419,25 @@ 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 { + 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 +447,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..ff4219c544 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,22 @@ 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); + pageOutlineBtn->setAutoRaise (true); + pageOutlineBtn->setCheckable (true); + pageOutlineBtn->setIcon (QIcon (":/pdf-reader/sidebar.svg")); + pageOutlineBtn->setIconSize ( + QSize (DpiUtils::scaled (16), DpiUtils::scaled (16))); + pageOutlineBtn->setText (pagePrefix + "1 / 1"); + pageOutlineBtn->setToolTip (qt_translate ("Outline")); + + QObject::connect (pageOutlineBtn, &QToolButton::clicked, + [this] () { toggle_outline_sidebar (); }); + leftLabel = new QLabel (qt_translate ("Welcome to TeXmacs"), bar); middleLabel= new QLabel ("", bar); rightLabel = new QLabel (qt_translate ("Booting"), bar); @@ -619,8 +636,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); @@ -744,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 (); @@ -961,6 +976,9 @@ qt_tm_widget_rep::qt_tm_widget_rep (int mask, command _quit) pdfToolBar->setOutlineEnabled (hasContent); pdfToolBar->setOutlineChecked (visible && hasContent); } + if (pageOutlineBtn && is_editor_tab_mode ()) { + pageOutlineBtn->setChecked (visible); + } }); QObject::connect (pdfOutlineDock, &OutlineWidget::outlineActivated, @@ -1640,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))) @@ -1791,6 +1820,12 @@ qt_tm_widget_rep::update_visibility () { pdfToolBar->setOutlineChecked (new_pdfOutlineVisibility); } + if (pageOutlineBtn) { + bool shouldShow= is_editor_tab_mode (); + pageOutlineBtn->setVisible (shouldShow); + if (shouldShow) pageOutlineBtn->setChecked (new_pdfOutlineVisibility); + } + // AI 聊天侧边栏浮动按钮可见性(community 版无 AI Chat,始终隐藏) if (chatSidebarToggleBtn) { bool shouldShow= !is_community_stem () && !chatTabMode && @@ -2011,8 +2046,7 @@ qt_tm_widget_rep::send (slot s, blackbox val) { case SLOT_MIDDLE_FOOTER: { check_type (val, s); string msg= open_box (val); - middleLabel->setText (to_qstring (msg)); - middleLabel->update (); + if (pageOutlineBtn) pageOutlineBtn->setText (pagePrefix + to_qstring (msg)); } break; case SLOT_RIGHT_FOOTER: { check_type (val, s); @@ -2029,6 +2063,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 +2074,10 @@ qt_tm_widget_rep::send (slot s, blackbox val) { else { if (prompt) prompt->end (); mainwindow ()->statusBar ()->removeWidget (prompt); + if (pageOutlineBtn) { + mainwindow ()->statusBar ()->addWidget (pageOutlineBtn); + pageOutlineBtn->setVisible (is_editor_tab_mode ()); + } 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..aeb9eb6f67 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,23 @@ 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; ///< 文档编辑界面左下角展示/隐藏目录的页码按钮 + QString pagePrefix; ///< 页码按钮文本前缀(构造时翻译一次) + 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; @@ -289,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 ();