diff options
| author | Victor Kareh <[email protected]> | 2025-10-15 14:36:45 -0400 |
|---|---|---|
| committer | Victor Kareh <[email protected]> | 2026-03-09 08:37:00 -0400 |
| commit | 5d0124afa9c8adc95f8ad3c163f7190d8d2690a3 (patch) | |
| tree | 15892088ff03fcd6e9335ab33a8925ac3b431505 | |
| parent | 01ba5fede9ab601002c4e4d122b0585e16b3f3ce (diff) | |
| download | pluma-5d0124afa9c8adc95f8ad3c163f7190d8d2690a3.tar.bz2 pluma-5d0124afa9c8adc95f8ad3c163f7190d8d2690a3.tar.xz | |
pluma-window: Add right-side panel support
Add a third panel on the right side of the editor window, enabling
a three-panel layout with left, right, and bottom panes.
The right panel is hidden by default and its state persists across
sessions. The main use case is enabling plugins for previews, document
outline viewers, or tag lists, similar to other IDEs.
| -rw-r--r-- | data/org.mate.pluma.gschema.xml.in | 15 | ||||
| -rw-r--r-- | pluma/pluma-commands-view.c | 24 | ||||
| -rw-r--r-- | pluma/pluma-commands.h | 2 | ||||
| -rw-r--r-- | pluma/pluma-settings.h | 3 | ||||
| -rw-r--r-- | pluma/pluma-ui.h | 5 | ||||
| -rw-r--r-- | pluma/pluma-ui.xml | 1 | ||||
| -rw-r--r-- | pluma/pluma-window-private.h | 3 | ||||
| -rw-r--r-- | pluma/pluma-window.c | 158 | ||||
| -rw-r--r-- | pluma/pluma-window.h | 2 |
9 files changed, 207 insertions, 6 deletions
diff --git a/data/org.mate.pluma.gschema.xml.in b/data/org.mate.pluma.gschema.xml.in index 45dd196e..78a57c41 100644 --- a/data/org.mate.pluma.gschema.xml.in +++ b/data/org.mate.pluma.gschema.xml.in @@ -170,6 +170,11 @@ <summary>Bottom Panel is Visible</summary> <description>Whether the bottom panel at the bottom of editing windows should be visible.</description> </key> + <key name="right-panel-visible" type="b"> + <default>false</default> + <summary>Right Panel is Visible</summary> + <description>Whether the right panel at the right of editing windows should be visible.</description> + </key> <key name="max-recents" type="u"> <default>5</default> <summary>Maximum Recent Files</summary> @@ -285,6 +290,16 @@ <summary>bottom-panel-active-page</summary> <description>The pluma bottom-panel-active-page</description> </key> + <key name="right-panel-size" type="i"> + <default>200</default> + <summary>right-panel-size</summary> + <description>The pluma right-panel-size</description> + </key> + <key name="right-panel-active-page" type="i"> + <default>0</default> + <summary>right-panel-active-page</summary> + <description>The pluma right-panel-active-page</description> + </key> <key name="filter-id" type="i"> <default>0</default> <summary>filter-id</summary> diff --git a/pluma/pluma-commands-view.c b/pluma/pluma-commands-view.c index d81824a7..68181598 100644 --- a/pluma/pluma-commands-view.c +++ b/pluma/pluma-commands-view.c @@ -124,6 +124,30 @@ _pluma_cmd_view_show_bottom_pane (GtkAction *action, } void +_pluma_cmd_view_show_right_pane (GtkAction *action, + PlumaWindow *window) +{ + gboolean visible; + PlumaPanel *panel; + + pluma_debug (DEBUG_COMMANDS); + + visible = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); + + panel = pluma_window_get_right_panel (window); + + if (visible) + { + gtk_widget_show (GTK_WIDGET (panel)); + gtk_widget_grab_focus (GTK_WIDGET (panel)); + } + else + { + gtk_widget_hide (GTK_WIDGET (panel)); + } +} + +void _pluma_cmd_view_toggle_fullscreen_mode (GtkAction *action, PlumaWindow *window) { diff --git a/pluma/pluma-commands.h b/pluma/pluma-commands.h index 54860ea4..ebc8e222 100644 --- a/pluma/pluma-commands.h +++ b/pluma/pluma-commands.h @@ -125,6 +125,8 @@ void _pluma_cmd_view_show_side_pane (GtkAction *action, PlumaWindow *window); void _pluma_cmd_view_show_bottom_pane (GtkAction *action, PlumaWindow *window); +void _pluma_cmd_view_show_right_pane (GtkAction *action, + PlumaWindow *window); void _pluma_cmd_view_toggle_fullscreen_mode (GtkAction *action, PlumaWindow *window); void _pluma_cmd_view_leave_fullscreen_mode (GtkAction *action, diff --git a/pluma/pluma-settings.h b/pluma/pluma-settings.h index a429c093..b4578d72 100644 --- a/pluma/pluma-settings.h +++ b/pluma/pluma-settings.h @@ -121,6 +121,7 @@ GSList * pluma_settings_get_writable_vfs_schemes (GSettings *sett #define PLUMA_SETTINGS_STATUSBAR_VISIBLE "statusbar-visible" #define PLUMA_SETTINGS_SIDE_PANE_VISIBLE "side-pane-visible" #define PLUMA_SETTINGS_BOTTOM_PANE_VISIBLE "bottom-panel-visible" +#define PLUMA_SETTINGS_RIGHT_PANE_VISIBLE "right-panel-visible" #define PLUMA_SETTINGS_MAX_RECENTS "max-recents" #define PLUMA_SETTINGS_PRINT_SYNTAX_HIGHLIGHTING "print-syntax-highlighting" #define PLUMA_SETTINGS_PRINT_HEADER "print-header" @@ -154,6 +155,8 @@ GSList * pluma_settings_get_writable_vfs_schemes (GSettings *sett #define PLUMA_SETTINGS_SIDE_PANEL_ACTIVE_PAGE "side-panel-active-page" #define PLUMA_SETTINGS_BOTTOM_PANEL_SIZE "bottom-panel-size" #define PLUMA_SETTINGS_BOTTOM_PANEL_ACTIVE_PAGE "bottom-panel-active-page" +#define PLUMA_SETTINGS_RIGHT_PANEL_SIZE "right-panel-size" +#define PLUMA_SETTINGS_RIGHT_PANEL_ACTIVE_PAGE "right-panel-active-page" #define PLUMA_SETTINGS_ACTIVE_FILE_FILTER "filter-id" G_END_DECLS diff --git a/pluma/pluma-ui.h b/pluma/pluma-ui.h index 394a42e9..4c737937 100644 --- a/pluma/pluma-ui.h +++ b/pluma/pluma-ui.h @@ -181,7 +181,10 @@ static const GtkToggleActionEntry pluma_panes_toggle_menu_entries[] = G_CALLBACK (_pluma_cmd_view_show_side_pane), FALSE }, { "ViewBottomPane", NULL, N_("_Bottom Pane"), "<control>F9", N_("Show or hide the bottom pane in the current window"), - G_CALLBACK (_pluma_cmd_view_show_bottom_pane), FALSE } + G_CALLBACK (_pluma_cmd_view_show_bottom_pane), FALSE }, + { "ViewRightPane", NULL, N_("_Right Pane"), "<shift>F9", + N_("Show or hide the right pane in the current window"), + G_CALLBACK (_pluma_cmd_view_show_right_pane), FALSE } }; G_END_DECLS diff --git a/pluma/pluma-ui.xml b/pluma/pluma-ui.xml index 7231b763..6ba43a5b 100644 --- a/pluma/pluma-ui.xml +++ b/pluma/pluma-ui.xml @@ -87,6 +87,7 @@ <menuitem name="ViewStatusbarMenu" action="ViewStatusbar"/> <menuitem name="ViewSidePaneMenu" action="ViewSidePane"/> <menuitem name="ViewBottomPaneMenu" action="ViewBottomPane"/> + <menuitem name="ViewRightPaneMenu" action="ViewRightPane"/> <separator/> <menuitem name="ViewFullscreenMenu" action="ViewFullscreen"/> <separator/> diff --git a/pluma/pluma-window-private.h b/pluma/pluma-window-private.h index 25e22296..ee63b016 100644 --- a/pluma/pluma-window-private.h +++ b/pluma/pluma-window-private.h @@ -50,8 +50,10 @@ struct _PlumaWindowPrivate GtkWidget *side_panel; GtkWidget *bottom_panel; + GtkWidget *right_panel; GtkWidget *hpaned; + GtkWidget *hpaned_inner; GtkWidget *vpaned; GtkWidget *tab_width_combo; @@ -105,6 +107,7 @@ struct _PlumaWindowPrivate gint side_panel_size; gint bottom_panel_size; + gint right_panel_size; PlumaWindowState state; diff --git a/pluma/pluma-window.c b/pluma/pluma-window.c index 7a12bdd1..24538d39 100644 --- a/pluma/pluma-window.c +++ b/pluma/pluma-window.c @@ -154,6 +154,16 @@ save_panes_state (PlumaWindow *window) if (pane_page != 0) g_settings_set_int (window->priv->editor_settings, PLUMA_SETTINGS_BOTTOM_PANEL_ACTIVE_PAGE, pane_page); + + if (window->priv->right_panel_size > 0) + g_settings_set_int (window->priv->editor_settings, + PLUMA_SETTINGS_RIGHT_PANEL_SIZE, + window->priv->right_panel_size); + + pane_page = _pluma_panel_get_active_item_id (PLUMA_PANEL (window->priv->right_panel)); + if (pane_page != 0) + g_settings_set_int (window->priv->editor_settings, + PLUMA_SETTINGS_RIGHT_PANEL_ACTIVE_PAGE, pane_page); } static void @@ -2092,6 +2102,7 @@ clone_window (PlumaWindow *origin) * they are mapped */ window->priv->side_panel_size = origin->priv->side_panel_size; window->priv->bottom_panel_size = origin->priv->bottom_panel_size; + window->priv->right_panel_size = origin->priv->right_panel_size; panel_page = _pluma_panel_get_active_item_id (PLUMA_PANEL (origin->priv->side_panel)); _pluma_panel_set_active_item_by_id (PLUMA_PANEL (window->priv->side_panel), panel_page); @@ -2099,6 +2110,9 @@ clone_window (PlumaWindow *origin) panel_page = _pluma_panel_get_active_item_id (PLUMA_PANEL (origin->priv->bottom_panel)); _pluma_panel_set_active_item_by_id (PLUMA_PANEL (window->priv->bottom_panel), panel_page); + panel_page = _pluma_panel_get_active_item_id (PLUMA_PANEL (origin->priv->right_panel)); + _pluma_panel_set_active_item_by_id (PLUMA_PANEL (window->priv->right_panel), panel_page); + if (gtk_widget_get_visible (origin->priv->side_panel)) gtk_widget_show (window->priv->side_panel); else @@ -2109,6 +2123,11 @@ clone_window (PlumaWindow *origin) else gtk_widget_hide (window->priv->bottom_panel); + if (gtk_widget_get_visible (origin->priv->right_panel)) + gtk_widget_show (window->priv->right_panel); + else + gtk_widget_hide (window->priv->right_panel); + set_statusbar_style (window, origin); set_toolbar_style (window, origin); @@ -3548,6 +3567,14 @@ bottom_panel_size_allocate (GtkWidget *widget, } static void +right_panel_size_allocate (GtkWidget *widget, + GtkAllocation *allocation, + PlumaWindow *window) +{ + window->priv->right_panel_size = allocation->width; +} + +static void hpaned_restore_position (GtkWidget *widget, PlumaWindow *window) { @@ -3597,6 +3624,32 @@ vpaned_restore_position (GtkWidget *widget, } static void +hpaned_inner_restore_position (GtkWidget *widget, + PlumaWindow *window) +{ + GtkAllocation allocation; + gint pos; + + gtk_widget_get_allocation (widget, &allocation); + + pluma_debug_message (DEBUG_WINDOW, + "Restoring hpaned_inner position: right panel size %d", + window->priv->right_panel_size); + + pos = allocation.width - MAX (50, window->priv->right_panel_size); + gtk_paned_set_position (GTK_PANED (window->priv->hpaned_inner), pos); + + /* start monitoring the size */ + g_signal_connect (window->priv->right_panel, + "size-allocate", + G_CALLBACK (right_panel_size_allocate), + window); + + /* run this only once */ + g_signal_handlers_disconnect_by_func (widget, hpaned_inner_restore_position, window); +} + +static void side_panel_visibility_changed (GtkWidget *side_panel, PlumaWindow *window) { @@ -3750,11 +3803,58 @@ create_bottom_panel (PlumaWindow *window) } static void +right_panel_visibility_changed (PlumaPanel *right_panel, + PlumaWindow *window) +{ + gboolean visible; + GtkAction *action; + + visible = gtk_widget_get_visible (GTK_WIDGET (right_panel)); + + g_settings_set_boolean (window->priv->editor_settings, + PLUMA_SETTINGS_RIGHT_PANE_VISIBLE, + visible); + + action = gtk_action_group_get_action (window->priv->panes_action_group, + "ViewRightPane"); + + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != visible) + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible); + + /* focus the document */ + if (!visible && window->priv->active_tab != NULL) + gtk_widget_grab_focus (GTK_WIDGET (pluma_tab_get_view (PLUMA_TAB (window->priv->active_tab)))); +} + +static void +create_right_panel (PlumaWindow *window) +{ + pluma_debug (DEBUG_WINDOW); + + window->priv->right_panel = pluma_panel_new (GTK_ORIENTATION_VERTICAL); + + gtk_paned_pack2 (GTK_PANED (window->priv->hpaned_inner), + window->priv->right_panel, + FALSE, + FALSE); + + g_signal_connect_after (window->priv->right_panel, + "show", + G_CALLBACK (right_panel_visibility_changed), + window); + g_signal_connect_after (window->priv->right_panel, + "hide", + G_CALLBACK (right_panel_visibility_changed), + window); +} + +static void init_panels_visibility (PlumaWindow *window) { gint active_page; gboolean side_pane_visible; gboolean bottom_pane_visible; + gboolean right_pane_visible; pluma_debug (DEBUG_WINDOW); @@ -3768,6 +3868,8 @@ init_panels_visibility (PlumaWindow *window) PLUMA_SETTINGS_SIDE_PANE_VISIBLE); bottom_pane_visible = g_settings_get_boolean (window->priv->editor_settings, PLUMA_SETTINGS_BOTTOM_PANE_VISIBLE); + right_pane_visible = g_settings_get_boolean (window->priv->editor_settings, + PLUMA_SETTINGS_RIGHT_PANE_VISIBLE); if (side_pane_visible) @@ -3796,6 +3898,20 @@ init_panels_visibility (PlumaWindow *window) gtk_action_set_sensitive (action, FALSE); } + /* right pane */ + if (pluma_panel_get_n_items (PLUMA_PANEL (window->priv->right_panel)) > 0) + { + active_page = g_settings_get_int (window->priv->editor_settings, + PLUMA_SETTINGS_RIGHT_PANEL_ACTIVE_PAGE); + _pluma_panel_set_active_item_by_id (PLUMA_PANEL (window->priv->right_panel), + active_page); + + if (right_pane_visible) + { + gtk_widget_show (window->priv->right_panel); + } + } + /* start track sensitivity after the initial state is set */ window->priv->bottom_panel_item_removed_handler_id = g_signal_connect (window->priv->bottom_panel, @@ -3990,19 +4106,28 @@ pluma_window_init (PlumaWindow *window) TRUE, 0); + /* Create nested horizontal paned for center+right layout */ + window->priv->hpaned_inner = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL); + gtk_paned_pack2 (GTK_PANED (window->priv->hpaned), + window->priv->hpaned_inner, + TRUE, + FALSE); + + /* Create vertical paned for notebook+bottom panel */ window->priv->vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL); - gtk_paned_pack2 (GTK_PANED (window->priv->hpaned), - window->priv->vpaned, - TRUE, - FALSE); + gtk_paned_pack1 (GTK_PANED (window->priv->hpaned_inner), + window->priv->vpaned, + TRUE, + TRUE); pluma_debug_message (DEBUG_WINDOW, "Create pluma notebook"); window->priv->notebook = pluma_notebook_new (); add_notebook (window, window->priv->notebook); /* side and bottom panels */ - create_side_panel (window); + create_side_panel (window); create_bottom_panel (window); + create_right_panel (window); /* panes' state must be restored after panels have been mapped, * since the bottom pane position depends on the size of the vpaned. */ @@ -4010,6 +4135,8 @@ pluma_window_init (PlumaWindow *window) PLUMA_SETTINGS_SIDE_PANEL_SIZE); window->priv->bottom_panel_size = g_settings_get_int (window->priv->editor_settings, PLUMA_SETTINGS_BOTTOM_PANEL_SIZE); + window->priv->right_panel_size = g_settings_get_int (window->priv->editor_settings, + PLUMA_SETTINGS_RIGHT_PANEL_SIZE); g_signal_connect_after (window->priv->hpaned, "map", @@ -4019,8 +4146,13 @@ pluma_window_init (PlumaWindow *window) "map", G_CALLBACK (vpaned_restore_position), window); + g_signal_connect_after (window->priv->hpaned_inner, + "map", + G_CALLBACK (hpaned_inner_restore_position), + window); gtk_widget_show (window->priv->hpaned); + gtk_widget_show (window->priv->hpaned_inner); gtk_widget_show (window->priv->vpaned); /* Drag and drop support, set targets to NULL because we add the @@ -4514,6 +4646,22 @@ pluma_window_get_bottom_panel (PlumaWindow *window) } /** + * pluma_window_get_right_panel: + * @window: a #PlumaWindow + * + * Gets the right #PlumaPanel of the @window. + * + * Returns: (transfer none): the right #PlumaPanel. + */ +PlumaPanel * +pluma_window_get_right_panel (PlumaWindow *window) +{ + g_return_val_if_fail (PLUMA_IS_WINDOW (window), NULL); + + return PLUMA_PANEL (window->priv->right_panel); +} + +/** * pluma_window_get_statusbar: * @window: a #PlumaWindow * diff --git a/pluma/pluma-window.h b/pluma/pluma-window.h index 5b9ae841..0878e82a 100644 --- a/pluma/pluma-window.h +++ b/pluma/pluma-window.h @@ -146,6 +146,8 @@ PlumaPanel *pluma_window_get_side_panel (PlumaWindow *window); PlumaPanel *pluma_window_get_bottom_panel (PlumaWindow *window); +PlumaPanel *pluma_window_get_right_panel (PlumaWindow *window); + GtkWidget *pluma_window_get_statusbar (PlumaWindow *window); GtkUIManager *pluma_window_get_ui_manager (PlumaWindow *window); |
