diff -upr mate-control-center/font-viewer/gd-main-toolbar.c mate-control-center-test/font-viewer/gd-main-toolbar.c --- mate-control-center/font-viewer/gd-main-toolbar.c 2015-08-30 21:29:23.096452237 +0200 +++ mate-control-center-test/font-viewer/gd-main-toolbar.c 2015-08-30 21:28:49.876105000 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 Red Hat, Inc. + * Copyright (c) 2011, 2012 Red Hat, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by @@ -26,6 +26,12 @@ G_DEFINE_TYPE (GdMainToolbar, gd_main_toolbar, GTK_TYPE_TOOLBAR) +typedef enum { + CHILD_NORMAL = 0, + CHILD_TOGGLE = 1, + CHILD_MENU = 2, +} ChildType; + struct _GdMainToolbarPrivate { GtkSizeGroup *size_group; GtkSizeGroup *vertical_size_group; @@ -35,12 +41,25 @@ struct _GdMainToolbarPrivate { GtkToolItem *right_group; GtkWidget *left_grid; + GtkWidget *center_grid; + GtkWidget *labels_grid; GtkWidget *title_label; GtkWidget *detail_label; + GtkWidget *modes_box; + + GtkWidget *center_menu; + GtkWidget *center_menu_child; + GtkWidget *right_grid; + gboolean show_modes; +}; + +enum { + PROP_0, + PROP_SHOW_MODES, }; static void @@ -54,30 +73,102 @@ gd_main_toolbar_dispose (GObject *obj) G_OBJECT_CLASS (gd_main_toolbar_parent_class)->dispose (obj); } -static gint -get_icon_margin (void) +static GtkWidget * +get_empty_button (ChildType type) { - gint toolbar_size, menu_size; + GtkWidget *button; + + switch (type) + { + case CHILD_MENU: + button = gtk_menu_button_new (); + break; + case CHILD_TOGGLE: + button = gtk_toggle_button_new (); + break; + case CHILD_NORMAL: + default: + button = gtk_button_new (); + break; + } - gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &menu_size, NULL); - gtk_icon_size_lookup (GTK_ICON_SIZE_LARGE_TOOLBAR, &toolbar_size, NULL); - return (gint) floor ((toolbar_size - menu_size) / 2.0); + return button; +} + +static GtkWidget * +get_symbolic_button (const gchar *icon_name, + ChildType type) +{ + GtkWidget *button, *w; + + switch (type) + { + case CHILD_MENU: + button = gtk_menu_button_new (); + gtk_widget_destroy (gtk_bin_get_child (GTK_BIN (button))); + break; + case CHILD_TOGGLE: + button = gtk_toggle_button_new (); + break; + case CHILD_NORMAL: + default: + button = gtk_button_new (); + break; + } + + gtk_style_context_add_class (gtk_widget_get_style_context (button), "raised"); + gtk_style_context_add_class (gtk_widget_get_style_context (button), "image-button"); + + w = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU); + gtk_widget_show (w); + gtk_container_add (GTK_CONTAINER (button), w); + + return button; +} + +static GtkWidget * +get_text_button (const gchar *label, + ChildType type) +{ + GtkWidget *button, *w; + + switch (type) + { + case CHILD_MENU: + button = gtk_menu_button_new (); + gtk_widget_destroy (gtk_bin_get_child (GTK_BIN (button))); + + w = gtk_label_new (label); + gtk_widget_show (w); + gtk_container_add (GTK_CONTAINER (button), w); + break; + case CHILD_TOGGLE: + button = gtk_toggle_button_new_with_label (label); + break; + case CHILD_NORMAL: + default: + button = gtk_button_new_with_label (label); + break; + } + + gtk_style_context_add_class (gtk_widget_get_style_context (button), "raised"); + gtk_style_context_add_class (gtk_widget_get_style_context (button), "text-button"); + + return button; } static GtkSizeGroup * -get_vertical_size_group (void) +get_vertical_size_group (GdMainToolbar *self) { GtkSizeGroup *retval; - GtkWidget *w, *dummy; - gint icon_margin; - - icon_margin = get_icon_margin (); + GtkWidget *dummy; + GtkToolItem *container; - dummy = gtk_toggle_button_new (); - w = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU); - g_object_set (w, "margin", icon_margin, NULL); - gtk_container_add (GTK_CONTAINER (dummy), w); - gtk_widget_show_all (dummy); + dummy = get_text_button ("Dummy", CHILD_NORMAL); + container = gtk_tool_item_new (); + gtk_widget_set_no_show_all (GTK_WIDGET (container), TRUE); + gtk_container_add (GTK_CONTAINER (container), dummy); + gtk_toolbar_insert (GTK_TOOLBAR (self), container, -1); retval = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL); gtk_size_group_add_widget (retval, dummy); @@ -85,32 +176,79 @@ get_vertical_size_group (void) return retval; } -static GtkWidget * -get_symbolic_button (const gchar *icon_name) +gboolean +gd_main_toolbar_get_show_modes (GdMainToolbar *self) { - GtkWidget *button, *w; + return self->priv->show_modes; +} - button = gtk_button_new (); - gtk_style_context_add_class (gtk_widget_get_style_context (button), "raised"); +void +gd_main_toolbar_set_show_modes (GdMainToolbar *self, + gboolean show_modes) +{ + if (self->priv->show_modes == show_modes) + return; - w = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU); - g_object_set (w, "margin", get_icon_margin (), NULL); - gtk_widget_show (w); - gtk_container_add (GTK_CONTAINER (button), w); + self->priv->show_modes = show_modes; + if (self->priv->show_modes) + { + gtk_widget_set_no_show_all (self->priv->labels_grid, TRUE); + gtk_widget_hide (self->priv->labels_grid); - return button; + gtk_widget_set_valign (self->priv->center_grid, GTK_ALIGN_FILL); + gtk_widget_set_no_show_all (self->priv->modes_box, FALSE); + gtk_widget_show_all (self->priv->modes_box); + } + else + { + gtk_widget_set_no_show_all (self->priv->modes_box, TRUE); + gtk_widget_hide (self->priv->modes_box); + + gtk_widget_set_valign (self->priv->center_grid, GTK_ALIGN_CENTER); + gtk_widget_set_no_show_all (self->priv->labels_grid, FALSE); + gtk_widget_show_all (self->priv->labels_grid); + } + + g_object_notify (G_OBJECT (self), "show-modes"); } -static GtkWidget * -get_text_button (const gchar *label) +static void +gd_main_toolbar_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) { - GtkWidget *w; - w = gtk_button_new_with_label (label); - gtk_widget_set_vexpand (w, TRUE); - gtk_style_context_add_class (gtk_widget_get_style_context (w), "raised"); + GdMainToolbar *self = GD_MAIN_TOOLBAR (object); - return w; + switch (prop_id) + { + case PROP_SHOW_MODES: + gd_main_toolbar_set_show_modes (GD_MAIN_TOOLBAR (self), g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gd_main_toolbar_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GdMainToolbar *self = GD_MAIN_TOOLBAR (object); + + switch (prop_id) + { + case PROP_SHOW_MODES: + g_value_set_boolean (value, self->priv->show_modes); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } } static void @@ -122,7 +260,7 @@ gd_main_toolbar_constructed (GObject *ob G_OBJECT_CLASS (gd_main_toolbar_parent_class)->constructed (obj); - self->priv->vertical_size_group = get_vertical_size_group (); + self->priv->vertical_size_group = get_vertical_size_group (self); /* left section */ self->priv->left_group = gtk_tool_item_new (); @@ -135,30 +273,41 @@ gd_main_toolbar_constructed (GObject *ob self->priv->left_grid = gtk_grid_new (); gtk_grid_set_column_spacing (GTK_GRID (self->priv->left_grid), 12); gtk_container_add (GTK_CONTAINER (self->priv->left_group), self->priv->left_grid); + gtk_widget_set_halign (self->priv->left_grid, GTK_ALIGN_START); /* center section */ self->priv->center_group = gtk_tool_item_new (); gtk_tool_item_set_expand (self->priv->center_group, TRUE); gtk_toolbar_insert (tb, self->priv->center_group, -1); + self->priv->center_grid = gtk_grid_new (); + gtk_widget_set_halign (self->priv->center_grid, GTK_ALIGN_CENTER); + gtk_widget_set_valign (self->priv->center_grid, GTK_ALIGN_CENTER); + gtk_container_add (GTK_CONTAINER (self->priv->center_group), self->priv->center_grid); gtk_size_group_add_widget (self->priv->vertical_size_group, GTK_WIDGET (self->priv->center_group)); /* centered label group */ - grid = gtk_grid_new (); - gtk_widget_set_halign (grid, GTK_ALIGN_CENTER); - gtk_widget_set_valign (grid, GTK_ALIGN_CENTER); + self->priv->labels_grid = grid = gtk_grid_new (); gtk_grid_set_column_spacing (GTK_GRID (grid), 12); - gtk_container_add (GTK_CONTAINER (self->priv->center_group), grid); + gtk_container_add (GTK_CONTAINER (self->priv->center_grid), grid); self->priv->title_label = gtk_label_new (NULL); gtk_label_set_ellipsize (GTK_LABEL (self->priv->title_label), PANGO_ELLIPSIZE_END); gtk_container_add (GTK_CONTAINER (grid), self->priv->title_label); self->priv->detail_label = gtk_label_new (NULL); + gtk_label_set_ellipsize (GTK_LABEL (self->priv->detail_label), PANGO_ELLIPSIZE_END); gtk_widget_set_no_show_all (self->priv->detail_label, TRUE); gtk_style_context_add_class (gtk_widget_get_style_context (self->priv->detail_label), "dim-label"); gtk_container_add (GTK_CONTAINER (grid), self->priv->detail_label); + /* centered mode group */ + self->priv->modes_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_set_homogeneous (GTK_BOX (self->priv->modes_box), TRUE); + gtk_widget_set_no_show_all (self->priv->modes_box, TRUE); + gtk_style_context_add_class (gtk_widget_get_style_context (self->priv->modes_box), "linked"); + gtk_container_add (GTK_CONTAINER (self->priv->center_grid), self->priv->modes_box); + /* right section */ self->priv->right_group = gtk_tool_item_new (); gtk_widget_set_margin_start (GTK_WIDGET (self->priv->right_group), 12); @@ -169,6 +318,7 @@ gd_main_toolbar_constructed (GObject *ob self->priv->right_grid = gtk_grid_new (); gtk_grid_set_column_spacing (GTK_GRID (self->priv->right_grid), 12); gtk_container_add (GTK_CONTAINER (self->priv->right_group), self->priv->right_grid); + gtk_widget_set_halign (self->priv->right_grid, GTK_ALIGN_END); self->priv->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); gtk_size_group_add_widget (self->priv->size_group, GTK_WIDGET (self->priv->left_group)); @@ -188,8 +338,18 @@ gd_main_toolbar_class_init (GdMainToolba oclass = G_OBJECT_CLASS (klass); oclass->constructed = gd_main_toolbar_constructed; + oclass->set_property = gd_main_toolbar_set_property; + oclass->get_property = gd_main_toolbar_get_property; oclass->dispose = gd_main_toolbar_dispose; + g_object_class_install_property (oclass, + PROP_SHOW_MODES, + g_param_spec_boolean ("show-modes", + "Show Modes", + "Show Modes", + FALSE, + G_PARAM_READWRITE)); + g_type_class_add_private (klass, sizeof (GdMainToolbarPrivate)); } @@ -203,6 +363,8 @@ gd_main_toolbar_clear (GdMainToolbar *se /* clear all added buttons */ gtk_container_foreach (GTK_CONTAINER (self->priv->left_grid), (GtkCallback) gtk_widget_destroy, self); + gtk_container_foreach (GTK_CONTAINER (self->priv->modes_box), + (GtkCallback) gtk_widget_destroy, self); gtk_container_foreach (GTK_CONTAINER (self->priv->right_grid), (GtkCallback) gtk_widget_destroy, self); } @@ -255,6 +417,129 @@ gd_main_toolbar_new (void) return g_object_new (GD_TYPE_MAIN_TOOLBAR, NULL); } +static GtkWidget * +add_button_internal (GdMainToolbar *self, + const gchar *icon_name, + const gchar *label, + gboolean pack_start, + ChildType type) +{ + GtkWidget *button; + + if (icon_name != NULL) + { + button = get_symbolic_button (icon_name, type); + if (label != NULL) + gtk_widget_set_tooltip_text (button, label); + } + else if (label != NULL) + { + button = get_text_button (label, type); + } + else + { + button = get_empty_button (type); + } + + gd_main_toolbar_add_widget (self, button, pack_start); + + gtk_widget_show_all (button); + + return button; +} + +/** + * gd_main_toolbar_set_labels_menu: + * @self: + * @menu: (allow-none): + * + */ +void +gd_main_toolbar_set_labels_menu (GdMainToolbar *self, + GMenuModel *menu) +{ + GtkWidget *button, *grid, *w; + + if (menu == NULL && + ((gtk_widget_get_parent (self->priv->labels_grid) == self->priv->center_grid) || + self->priv->center_menu_child == NULL)) + return; + + if (menu != NULL) + { + g_object_ref (self->priv->labels_grid); + gtk_container_remove (GTK_CONTAINER (self->priv->center_grid), + self->priv->labels_grid); + + self->priv->center_menu_child = grid = gtk_grid_new (); + gtk_grid_set_column_spacing (GTK_GRID (grid), 6); + gtk_container_add (GTK_CONTAINER (grid), self->priv->labels_grid); + g_object_unref (self->priv->labels_grid); + + w = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE); + gtk_container_add (GTK_CONTAINER (grid), w); + + self->priv->center_menu = button = gtk_menu_button_new (); + gtk_style_context_add_class (gtk_widget_get_style_context (self->priv->center_menu), + "selection-menu"); + gtk_widget_destroy (gtk_bin_get_child (GTK_BIN (button))); + gtk_widget_set_halign (button, GTK_ALIGN_CENTER); + gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (button), menu); + gtk_container_add (GTK_CONTAINER (self->priv->center_menu), grid); + + gtk_container_add (GTK_CONTAINER (self->priv->center_grid), button); + } + else + { + g_object_ref (self->priv->labels_grid); + gtk_container_remove (GTK_CONTAINER (self->priv->center_menu_child), + self->priv->labels_grid); + gtk_widget_destroy (self->priv->center_menu); + + self->priv->center_menu = NULL; + self->priv->center_menu_child = NULL; + + gtk_container_add (GTK_CONTAINER (self->priv->center_grid), + self->priv->labels_grid); + g_object_unref (self->priv->labels_grid); + } + + gtk_widget_show_all (self->priv->center_grid); +} + +/** + * gd_main_toolbar_add_mode: + * @self: + * @label: + * + * Returns: (transfer none): + */ +GtkWidget * +gd_main_toolbar_add_mode (GdMainToolbar *self, + const gchar *label) +{ + GtkWidget *button; + GList *group; + + button = gtk_radio_button_new_with_label (NULL, label); + gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE); + gtk_widget_set_size_request (button, 100, -1); + gtk_style_context_add_class (gtk_widget_get_style_context (button), "raised"); + gtk_style_context_add_class (gtk_widget_get_style_context (button), "text-button"); + + group = gtk_container_get_children (GTK_CONTAINER (self->priv->modes_box)); + if (group != NULL) + { + gtk_radio_button_join_group (GTK_RADIO_BUTTON (button), GTK_RADIO_BUTTON (group->data)); + g_list_free (group); + } + + gtk_container_add (GTK_CONTAINER (self->priv->modes_box), button); + gtk_widget_show (button); + + return button; +} + /** * gd_main_toolbar_add_button: * @self: @@ -264,33 +549,66 @@ gd_main_toolbar_new (void) * * Returns: (transfer none): */ - GtkWidget * gd_main_toolbar_add_button (GdMainToolbar *self, const gchar *icon_name, const gchar *label, gboolean pack_start) { - GtkWidget *button; + return add_button_internal (self, icon_name, label, pack_start, CHILD_NORMAL); +} - if (icon_name != NULL) - { - button = get_symbolic_button (icon_name); - if (label != NULL) - gtk_widget_set_tooltip_text (button, label); - } - else if (label != NULL) - { - button = get_text_button (label); - } +/** + * gd_main_toolbar_add_menu: + * @self: + * @icon_name: (allow-none): + * @label: (allow-none): + * @pack_start: + * + * Returns: (transfer none): + */ +GtkWidget * +gd_main_toolbar_add_menu (GdMainToolbar *self, + const gchar *icon_name, + const gchar *label, + gboolean pack_start) +{ + return add_button_internal (self, icon_name, label, pack_start, CHILD_MENU); +} + +/** + * gd_main_toolbar_add_toggle: + * @self: + * @icon_name: (allow-none): + * @label: (allow-none): + * @pack_start: + * + * Returns: (transfer none): + */ +GtkWidget * +gd_main_toolbar_add_toggle (GdMainToolbar *self, + const gchar *icon_name, + const gchar *label, + gboolean pack_start) +{ + return add_button_internal (self, icon_name, label, pack_start, CHILD_TOGGLE); +} +/** + * gd_main_toolbar_add_widget: + * @self: + * @widget: + * @pack_start: + * + */ +void +gd_main_toolbar_add_widget (GdMainToolbar *self, + GtkWidget *widget, + gboolean pack_start) +{ if (pack_start) - gtk_container_add (GTK_CONTAINER (self->priv->left_grid), button); + gtk_container_add (GTK_CONTAINER (self->priv->left_grid), widget); else - gtk_container_add (GTK_CONTAINER (self->priv->right_grid), button); - - gtk_widget_show_all (button); - - return button; + gtk_container_add (GTK_CONTAINER (self->priv->right_grid), widget); } diff -upr mate-control-center/font-viewer/gd-main-toolbar.h mate-control-center-test/font-viewer/gd-main-toolbar.h --- mate-control-center/font-viewer/gd-main-toolbar.h 2015-08-30 21:29:26.610488909 +0200 +++ mate-control-center-test/font-viewer/gd-main-toolbar.h 2015-08-30 20:35:45.001854000 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 Red Hat, Inc. + * Copyright (c) 2011, 2012 Red Hat, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by @@ -74,6 +74,12 @@ void gd_main_toolbar_set_labels ( const gchar *primary, const gchar *detail); +void gd_main_toolbar_set_labels_menu (GdMainToolbar *self, + GMenuModel *menu); + +GtkWidget * gd_main_toolbar_add_mode (GdMainToolbar *self, + const gchar *label); + void gd_main_toolbar_clear (GdMainToolbar *self); GtkWidget * gd_main_toolbar_add_button (GdMainToolbar *self, @@ -81,6 +87,25 @@ GtkWidget * gd_main_toolbar_add_button ( const gchar *label, gboolean pack_start); +GtkWidget * gd_main_toolbar_add_toggle (GdMainToolbar *self, + const gchar *icon_name, + const gchar *label, + gboolean pack_start); + +GtkWidget * gd_main_toolbar_add_menu (GdMainToolbar *self, + const gchar *icon_name, + const gchar *label, + gboolean pack_start); + +void gd_main_toolbar_add_widget (GdMainToolbar *self, + GtkWidget *widget, + gboolean pack_start); + +gboolean gd_main_toolbar_get_show_modes (GdMainToolbar *self); + +void gd_main_toolbar_set_show_modes (GdMainToolbar *self, + gboolean show_modes); + G_END_DECLS #endif /* __GD_MAIN_TOOLBAR_H__ */