diff options
author | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2022-01-19 19:19:56 -0300 |
---|---|---|
committer | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2022-01-20 02:23:42 +0000 |
commit | b756f1e07a9153de46e109d3d80a49ecb9f7e6af (patch) | |
tree | 6afaf5ac850a44e9b8c2560e79e94c668f3eaa2e /panels | |
parent | 4300a4a2908d0c81f427745e55b570dbdd6726ba (diff) | |
download | gnome-control-center-b756f1e07a9153de46e109d3d80a49ecb9f7e6af.tar.gz |
display: Rework titlebar handling entirely
Move all titlebars to the panel itself. Add an overlay with
the apply titlebar, which shows the apply / cancel titlebar
above whatever current titlebar is visible.
Add titlebars to the Night Light, and display settings pages.
Diffstat (limited to 'panels')
-rw-r--r-- | panels/display/cc-display-panel.c | 95 | ||||
-rw-r--r-- | panels/display/cc-display-panel.ui | 349 |
2 files changed, 255 insertions, 189 deletions
diff --git a/panels/display/cc-display-panel.c b/panels/display/cc-display-panel.c index c9015d16f..79605cd76 100644 --- a/panels/display/cc-display-panel.c +++ b/panels/display/cc-display-panel.c @@ -82,23 +82,22 @@ struct _CcDisplayPanel GDBusProxy *shell_proxy; - gchar *main_title; - GtkWidget *apply_titlebar; - GtkWidget *apply_titlebar_apply; - GtkWidget *apply_titlebar_cancel; - GtkWidget *apply_titlebar_warning; + GtkWidget *apply_titlebar; + GtkWidget *apply_button; + GtkWidget *cancel_button; + AdwWindowTitle *apply_titlebar_title_widget; GListStore *primary_display_list; GList *monitor_rows; GtkWidget *arrangement_group; AdwBin *arrangement_bin; - GtkWidget *back_button; GtkToggleButton *config_type_join; GtkToggleButton *config_type_mirror; GtkWidget *config_type_switcher_row; AdwBin *display_settings_bin; GtkWidget *display_settings_group; + AdwWindowTitle *display_settings_title_widget; AdwLeaflet *leaflet; AdwComboRow *primary_display_row; AdwPreferencesGroup *single_display_settings_group; @@ -123,6 +122,8 @@ static void set_current_output (CcDisplayPanel *panel, CcDisplayMonitor *output, gboolean force); +static void +on_screen_changed (CcDisplayPanel *panel); static CcDisplayConfigType @@ -392,17 +393,9 @@ dialog_toplevel_focus_changed (CcDisplayPanel *self) static void reset_titlebar (CcDisplayPanel *self) { - CcShell *shell = cc_panel_get_shell (CC_PANEL (self)); - gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (self->toplevel_shortcuts), GTK_PHASE_NONE); - - cc_shell_set_custom_titlebar (shell, NULL); - - g_clear_object (&self->apply_titlebar); - g_clear_object (&self->apply_titlebar_apply); - g_clear_object (&self->apply_titlebar_cancel); - g_clear_object (&self->apply_titlebar_warning); + gtk_widget_hide (self->apply_titlebar); } static void @@ -545,16 +538,6 @@ on_primary_display_selected_index_changed_cb (CcDisplayPanel *panel) } static void -on_stack_visible_child_name_changed_cb (GtkStack *stack, - GParamSpec *pspec, - CcDisplayPanel *self) -{ - const gchar *visible_child_name = adw_leaflet_get_visible_child_name (self->leaflet); - - gtk_widget_set_visible (self->back_button, g_strcmp0 (visible_child_name, "displays") != 0); -} - -static void on_toplevel_folded (CcDisplayPanel *panel, GParamSpec *pspec, GtkWidget *toplevel) { gboolean folded; @@ -568,9 +551,9 @@ on_toplevel_escape_pressed_cb (GtkWidget *widget, GVariant *args, CcDisplayPanel *self) { - if (self->apply_titlebar_cancel) + if (gtk_widget_get_visible (self->apply_titlebar)) { - g_signal_emit_by_name (self->apply_titlebar_cancel, "activate"); + gtk_widget_activate (self->cancel_button); return GDK_EVENT_STOP; } @@ -614,14 +597,18 @@ cc_display_panel_class_init (CcDisplayPanelClass *klass) gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/display/cc-display-panel.ui"); + gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, apply_button); + gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, apply_titlebar); + gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, apply_titlebar_title_widget); gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, arrangement_group); gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, arrangement_bin); - gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, back_button); + gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, cancel_button); gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, config_type_switcher_row); gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, config_type_join); gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, config_type_mirror); gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, display_settings_bin); gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, display_settings_group); + gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, display_settings_title_widget); gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, escape_shortcut); gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, leaflet); gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, night_light_page); @@ -630,12 +617,13 @@ cc_display_panel_class_init (CcDisplayPanelClass *klass) gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, single_display_settings_group); gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, toplevel_shortcuts); + gtk_widget_class_bind_template_callback (widget_class, apply_current_configuration); gtk_widget_class_bind_template_callback (widget_class, on_back_button_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, on_config_type_toggled_cb); gtk_widget_class_bind_template_callback (widget_class, on_night_light_list_box_row_activated_cb); gtk_widget_class_bind_template_callback (widget_class, on_night_light_row_activated_cb); gtk_widget_class_bind_template_callback (widget_class, on_primary_display_selected_index_changed_cb); - gtk_widget_class_bind_template_callback (widget_class, on_stack_visible_child_name_changed_cb); + gtk_widget_class_bind_template_callback (widget_class, on_screen_changed); gtk_widget_class_bind_template_callback (widget_class, on_toplevel_escape_pressed_cb); } @@ -674,6 +662,9 @@ on_monitor_row_activated_cb (GtkListBoxRow *row, monitor = g_object_get_data (G_OBJECT (row), "monitor"); set_current_output (self, monitor, FALSE); + adw_window_title_set_title (self->display_settings_title_widget, + cc_display_monitor_get_ui_name (monitor)); + adw_leaflet_set_visible_child_name (self->leaflet, "display-settings"); } @@ -932,51 +923,21 @@ on_screen_changed (CcDisplayPanel *panel) static void show_apply_titlebar (CcDisplayPanel *panel, gboolean is_applicable) { - GtkWidget *title; - - if (!panel->apply_titlebar) - { - g_autoptr(GtkSizeGroup) size_group = NULL; - GtkWidget *header, *button; - CcShell *shell; - - shell = cc_panel_get_shell (CC_PANEL (panel)); - - panel->apply_titlebar = header = gtk_header_bar_new (); - gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE); - - size_group = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL); - - panel->apply_titlebar_cancel = button = gtk_button_new_with_mnemonic (_("_Cancel")); - gtk_header_bar_pack_start (GTK_HEADER_BAR (header), button); - gtk_size_group_add_widget (size_group, button); - g_signal_connect_object (button, "clicked", G_CALLBACK (on_screen_changed), - panel, G_CONNECT_SWAPPED); - - panel->apply_titlebar_apply = button = gtk_button_new_with_mnemonic (_("_Apply")); - gtk_header_bar_pack_end (GTK_HEADER_BAR (header), button); - gtk_size_group_add_widget (size_group, button); - g_signal_connect_object (button, "clicked", G_CALLBACK (apply_current_configuration), - panel, G_CONNECT_SWAPPED); - gtk_widget_add_css_class (button, "suggested-action"); - - cc_shell_set_custom_titlebar (shell, panel->apply_titlebar); - g_object_ref (panel->apply_titlebar); - g_object_ref (panel->apply_titlebar_apply); - g_object_ref (panel->apply_titlebar_cancel); - } + gtk_widget_show (panel->apply_titlebar); + gtk_widget_set_sensitive (panel->apply_button, is_applicable); if (is_applicable) { - title = adw_window_title_new (_("Apply Changes?"), NULL); + adw_window_title_set_title (panel->apply_titlebar_title_widget, + _("Apply Changes?")); } else { - title = adw_window_title_new (_("Changes Cannot be Applied"), - _("This could be due to hardware limitations.")); + adw_window_title_set_title (panel->apply_titlebar_title_widget, + _("Changes Cannot be Applied")); + adw_window_title_set_subtitle (panel->apply_titlebar_title_widget, + _("This could be due to hardware limitations.")); } - gtk_header_bar_set_title_widget (GTK_HEADER_BAR (panel->apply_titlebar), title); - gtk_widget_set_sensitive (panel->apply_titlebar_apply, is_applicable); gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (panel->toplevel_shortcuts), GTK_PHASE_BUBBLE); diff --git a/panels/display/cc-display-panel.ui b/panels/display/cc-display-panel.ui index 22350b271..4de2fb2fb 100644 --- a/panels/display/cc-display-panel.ui +++ b/panels/display/cc-display-panel.ui @@ -15,173 +15,278 @@ </object> </child> - <child type="titlebar-start"> - <object class="GtkButton" id="back_button"> - <property name="visible">False</property> - <property name="icon-name">go-previous-symbolic</property> - <signal name="clicked" handler="on_back_button_clicked_cb" object="CcDisplayPanel" swapped="no" /> - </object> - </child> + <child> + <object class="GtkOverlay"> + + <child type="overlay"> + <object class="AdwHeaderBar" id="apply_titlebar"> + <property name="visible">False</property> + <property name="valign">start</property> + <property name="show-start-title-buttons">False</property> + <property name="show-end-title-buttons">False</property> + + <child type="start"> + <object class="GtkButton" id="cancel_button"> + <property name="use-underline">True</property> + <property name="label" translatable="yes">_Cancel</property> + <signal name="clicked" handler="on_screen_changed" object="CcDisplayPanel" swapped="yes" /> + </object> + </child> - <child type="content"> - <object class="AdwLeaflet" id="leaflet"> - <property name="can-unfold">False</property> - <signal name="notify::visible-child-name" handler="on_stack_visible_child_name_changed_cb" object="CcDisplayPanel" swapped="no" /> + <property name="title-widget"> + <object class="AdwWindowTitle" id="apply_titlebar_title_widget" /> + </property> + + <child type="end"> + <object class="GtkButton" id="apply_button"> + <property name="use-underline">True</property> + <property name="label" translatable="yes">_Apply</property> + <signal name="clicked" handler="apply_current_configuration" object="CcDisplayPanel" swapped="yes" /> + <style> + <class name="suggested-action" /> + </style> + </object> + </child> + + </object> + </child> - <!-- Displays page --> <child> - <object class="AdwLeafletPage"> - <property name="name">displays</property> - <property name="child"> - <object class="GtkScrolledWindow"> - <property name="hscrollbar_policy">never</property> - <child> - <object class="GtkViewport"> + <object class="AdwLeaflet" id="leaflet"> + <property name="can-unfold">False</property> + + <!-- Displays page --> + <child> + <object class="AdwLeafletPage"> + <property name="name">displays</property> + <property name="child"> + <object class="GtkBox"> + <property name="orientation">vertical</property> + + <!-- Displays page titlebar --> <child> - <object class="AdwClamp"> - <property name="valign">start</property> - <property name="margin_top">32</property> - <property name="margin_bottom">32</property> - <property name="margin_start">12</property> - <property name="margin_end">12</property> - <child> - <object class="GtkBox"> - <property name="hexpand">True</property> - <property name="orientation">vertical</property> - <property name="spacing">32</property> + <object class="AdwHeaderBar" id="displays_titlebar"> + <property name="show-end-title-buttons">True</property> + <property name="show-start-title-buttons" bind-source="CcDisplayPanel" bind-property="folded" bind-flags="default|sync-create" /> + <child type="start"> + <object class="GtkButton"> + <property name="visible" bind-source="CcDisplayPanel" bind-property="folded" bind-flags="default|sync-create" /> + <property name="icon-name">go-previous-symbolic</property> + </object> + </child> + <property name="title-widget"> + <object class="AdwWindowTitle"> + <property name="title" bind-source="CcDisplayPanel" bind-property="title" bind-flags="default|sync-create" /> + </object> + </property> + </object> + </child> + + <child> + <object class="AdwPreferencesPage"> + <child> + <object class="AdwPreferencesGroup" id="arrangement_group"> <child> - <object class="AdwPreferencesGroup" id="arrangement_group"> - <child> - <object class="AdwBin" id="arrangement_bin"> - <style> - <class name="card"/> - </style> - </object> - </child> - <accessibility> - <property name="label" translatable="yes">Display Arrangement</property> - </accessibility> + <object class="AdwBin" id="arrangement_bin"> + <style> + <class name="card"/> + </style> </object> </child> + <accessibility> + <property name="label" translatable="yes">Display Arrangement</property> + </accessibility> + </object> + </child> + + <child> + <object class="AdwPreferencesGroup" id="display_settings_group"> + <!-- Config Type --> <child> - <object class="AdwPreferencesGroup" id="display_settings_group"> - - <!-- Config Type --> - <child> - <object class="AdwActionRow" id="config_type_switcher_row"> - <property name="title" translatable="yes">Multiple Displays</property> - <child type="suffix"> - <object class="GtkBox"> - <property name="valign">center</property> - <style> - <class name="linked" /> - </style> - <child> - <object class="GtkToggleButton" id="config_type_join"> - <property name="label" translatable="yes" comments="'Join' as in 'Join displays'">Join</property> - <property name="active">True</property> - <signal name="toggled" handler="on_config_type_toggled_cb" swapped="yes"/> - </object> - </child> - <child> - <object class="GtkToggleButton" id="config_type_mirror"> - <property name="label" translatable="yes">Mirror</property> - <property name="group">config_type_join</property> - <signal name="toggled" handler="on_config_type_toggled_cb" swapped="yes"/> - </object> - </child> + <object class="AdwActionRow" id="config_type_switcher_row"> + <property name="title" translatable="yes">Multiple Displays</property> + <child type="suffix"> + <object class="GtkBox"> + <property name="valign">center</property> + <style> + <class name="linked" /> + </style> + <child> + <object class="GtkToggleButton" id="config_type_join"> + <property name="label" translatable="yes" comments="'Join' as in 'Join displays'">Join</property> + <property name="active">True</property> + <signal name="toggled" handler="on_config_type_toggled_cb" swapped="yes"/> + </object> + </child> + <child> + <object class="GtkToggleButton" id="config_type_mirror"> + <property name="label" translatable="yes">Mirror</property> + <property name="group">config_type_join</property> + <signal name="toggled" handler="on_config_type_toggled_cb" swapped="yes"/> </object> </child> - </object> - </child> - - <!-- Primary Display --> - <child> - <object class="AdwComboRow" id="primary_display_row"> - <property name="subtitle" translatable="yes">Contains top bar and Activities</property> - <property name="title" translatable="yes">Primary Display</property> - <signal name="notify::selected-index" handler="on_primary_display_selected_index_changed_cb" swapped="yes"/> </object> </child> </object> - </child> - <!-- Single Display Settings --> + <!-- Primary Display --> <child> - <object class="AdwPreferencesGroup" id="single_display_settings_group"> - <property name="visible">False</property> + <object class="AdwComboRow" id="primary_display_row"> + <property name="subtitle" translatable="yes">Contains top bar and Activities</property> + <property name="title" translatable="yes">Primary Display</property> + <signal name="notify::selected-index" handler="on_primary_display_selected_index_changed_cb" swapped="yes"/> </object> </child> + </object> + + </child> - <!-- Night Light --> + <!-- Single Display Settings --> + <child> + <object class="AdwPreferencesGroup" id="single_display_settings_group"> + <property name="visible">False</property> + </object> + </child> + + <!-- Night Light --> + <child> + <object class="AdwPreferencesGroup"> <child> - <object class="AdwPreferencesGroup"> - <child> - <object class="AdwActionRow"> - <property name="activatable">True</property> - <property name="title" translatable="yes" comments="This is the redshift functionality where we suppress blue light when the sun has gone down">Night Light</property> - <signal name="activated" handler="on_night_light_row_activated_cb" object="CcDisplayPanel" swapped="no" /> - - <child type="suffix"> - <object class="GtkLabel" id="night_light_state_label"> - <property name="label">On</property> - </object> - </child> + <object class="AdwActionRow"> + <property name="activatable">True</property> + <property name="title" translatable="yes" comments="This is the redshift functionality where we suppress blue light when the sun has gone down">Night Light</property> + <signal name="activated" handler="on_night_light_row_activated_cb" object="CcDisplayPanel" swapped="no" /> - <child type="suffix"> - <object class="GtkImage"> - <property name="icon-name">go-next-symbolic</property> - </object> - </child> + <child type="suffix"> + <object class="GtkLabel" id="night_light_state_label"> + <property name="label">On</property> + </object> + </child> + <child type="suffix"> + <object class="GtkImage"> + <property name="icon-name">go-next-symbolic</property> </object> </child> + </object> </child> + </object> + </child> + + </object> + </child> + </object> + </property> + </object> + </child> + + <!-- Night Light page --> + <child> + <object class="AdwLeafletPage"> + <property name="name">night-light</property> + <property name="child"> + <object class="GtkBox"> + <property name="orientation">vertical</property> + <!-- Night Light titlebar --> + <child> + <object class="AdwHeaderBar" id="night_light_titlebar"> + <property name="show-start-title-buttons">True</property> + <property name="show-end-title-buttons">True</property> + <child type="start"> + <object class="GtkButton"> + <property name="icon-name">go-previous-symbolic</property> + <signal name="clicked" handler="on_back_button_clicked_cb" object="CcDisplayPanel" swapped="no" /> </object> </child> + <property name="title-widget"> + <object class="AdwWindowTitle"> + <property name="title" translatable="yes">Night Light</property> + </object> + </property> </object> </child> + + <!-- Night Light --> + <child> + <object class="CcNightLightPage" id="night_light_page" /> + </child> + </object> - </child> + </property> </object> - </property> - </object> - </child> + </child> - <!-- Night Light page --> - <child> - <object class="AdwLeafletPage"> - <property name="name">night-light</property> - <property name="child"> - <object class="CcNightLightPage" id="night_light_page" /> - </property> - </object> - </child> + <!-- Display Settings page --> + <child> + <object class="AdwLeafletPage"> + <property name="name">display-settings</property> + <property name="child"><object class="GtkBox"> + <property name="orientation">vertical</property> - <!-- Display Settings page --> - <child> - <object class="AdwLeafletPage"> - <property name="name">display-settings</property> - <property name="child"> - <object class="AdwPreferencesPage"> - <child> - <object class="AdwPreferencesGroup"> + <!-- Display Settings titlebar --> <child> - <object class="AdwBin" id="display_settings_bin" /> + <object class="AdwHeaderBar" id="display_settings_titlebar"> + <property name="show-start-title-buttons">True</property> + <property name="show-end-title-buttons">True</property> + <child type="start"> + <object class="GtkButton"> + <property name="icon-name">go-previous-symbolic</property> + <signal name="clicked" handler="on_back_button_clicked_cb" object="CcDisplayPanel" swapped="no" /> + </object> + </child> + <property name="title-widget"> + <object class="AdwWindowTitle" id="display_settings_title_widget" /> + </property> + </object> </child> + + <!-- Display Settings --> + <child> + <object class="AdwPreferencesPage"> + <child> + <object class="AdwPreferencesGroup"> + <child> + <object class="AdwBin" id="display_settings_bin" /> + </child> + </object> + </child> + </object> + </child> + </object> - </child> + </property> </object> - </property> + </child> + </object> </child> </object> </child> + </template> + + <object class="GtkSizeGroup"> + <property name="mode">horizontal</property> + <widgets> + <widget name="apply_button" /> + <widget name="cancel_button" /> + </widgets> + </object> + + <object class="GtkSizeGroup"> + <property name="mode">vertical</property> + <widgets> + <widget name="apply_titlebar" /> + <widget name="displays_titlebar" /> + <widget name="display_settings_titlebar" /> + <widget name="night_light_titlebar" /> + </widgets> + </object> + </interface> |