[gtk+] modelbutton: Use a builtin icon for the arrow
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] modelbutton: Use a builtin icon for the arrow
- Date: Sat, 19 Dec 2015 21:33:52 +0000 (UTC)
commit bca47552289f7ecdba48dc3994f2d54628ff5209
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Dec 19 14:53:57 2015 -0500
modelbutton: Use a builtin icon for the arrow
No need to do this manually.
gtk/gtkmodelbutton.c | 124 ++++++++++--------------------
gtk/theme/Adwaita/_common.scss | 5 +
gtk/theme/Adwaita/gtk-contained-dark.css | 7 ++
gtk/theme/Adwaita/gtk-contained.css | 7 ++
4 files changed, 60 insertions(+), 83 deletions(-)
---
diff --git a/gtk/gtkmodelbutton.c b/gtk/gtkmodelbutton.c
index f536afe..c7f22c5 100644
--- a/gtk/gtkmodelbutton.c
+++ b/gtk/gtkmodelbutton.c
@@ -36,6 +36,8 @@
#include "gtkintl.h"
#include "gtkcssnodeprivate.h"
#include "gtkcsscustomgadgetprivate.h"
+#include "gtkbuiltiniconprivate.h"
+#include "gtkcsstypesprivate.h"
#include "gtkstylecontextprivate.h"
#include "gtkcontainerprivate.h"
@@ -195,29 +197,48 @@ static void
gtk_model_button_update_state (GtkModelButton *button)
{
GtkStateFlags state;
+ GtkCssImageBuiltinType image_type = GTK_CSS_IMAGE_BUILTIN_NONE;
state = gtk_widget_get_state_flags (GTK_WIDGET (button));
gtk_css_node_set_state (gtk_css_gadget_get_node (button->gadget), state);
- if (button->role == GTK_BUTTON_ROLE_CHECK ||
- button->role == GTK_BUTTON_ROLE_RADIO)
+ if (button->role == GTK_BUTTON_ROLE_CHECK)
+ {
+ if (button->active && !button->menu_name)
+ {
+ state &= ~GTK_STATE_FLAG_CHECKED;
+ image_type = GTK_CSS_IMAGE_BUILTIN_CHECK_CHECKED;
+ }
+ else
+ {
+ state |= GTK_STATE_FLAG_CHECKED;
+ image_type = GTK_CSS_IMAGE_BUILTIN_CHECK;
+ }
+ }
+ if (button->role == GTK_BUTTON_ROLE_RADIO)
{
- state &= ~GTK_STATE_FLAG_CHECKED;
-
if (button->active && !button->menu_name)
- state |= GTK_STATE_FLAG_CHECKED;
+ {
+ state &= ~GTK_STATE_FLAG_CHECKED;
+ image_type = GTK_CSS_IMAGE_BUILTIN_OPTION_CHECKED;
+ }
+ else
+ {
+ state |= GTK_STATE_FLAG_CHECKED;
+ image_type = GTK_CSS_IMAGE_BUILTIN_OPTION;
+ }
}
if (button->menu_name)
{
- state = state & ~(GTK_STATE_FLAG_DIR_LTR|GTK_STATE_FLAG_DIR_RTL);
if (indicator_is_left (GTK_WIDGET (button)))
- state = state | GTK_STATE_FLAG_DIR_RTL;
+ image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT;
else
- state = state | GTK_STATE_FLAG_DIR_LTR;
+ image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT;
}
+ gtk_builtin_icon_set_image (GTK_BUILTIN_ICON (button->indicator_gadget), image_type);
gtk_css_node_set_state (gtk_css_gadget_get_node (button->indicator_gadget), state);
}
@@ -392,11 +413,6 @@ gtk_model_button_set_menu_name (GtkModelButton *button,
update_node_name (button);
gtk_model_button_update_state (button);
- if (menu_name)
- gtk_css_gadget_add_class (button->indicator_gadget, GTK_STYLE_CLASS_EXPANDER);
- else
- gtk_css_gadget_remove_class (button->indicator_gadget, GTK_STYLE_CLASS_EXPANDER);
-
gtk_widget_queue_resize (GTK_WIDGET (button));
g_object_notify_by_pspec (G_OBJECT (button), properties[PROP_MENU_NAME]);
}
@@ -710,23 +726,6 @@ gtk_model_button_get_preferred_height (GtkWidget *widget,
}
static void
-gtk_model_button_measure_indicator (GtkCssGadget *gadget,
- GtkOrientation orientation,
- int for_size,
- int *minimum,
- int *natural,
- int *minimum_baseline,
- int *natural_baseline,
- gpointer data)
-{
- gint indicator_size;
-
- gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &indicator_size, NULL);
-
- *minimum = *natural = indicator_size;
-}
-
-static void
gtk_model_button_measure (GtkCssGadget *gadget,
GtkOrientation orientation,
int for_size,
@@ -983,48 +982,6 @@ gtk_model_button_draw (GtkWidget *widget,
}
static gboolean
-gtk_model_button_render_indicator (GtkCssGadget *gadget,
- cairo_t *cr,
- int x,
- int y,
- int width,
- int height,
- gpointer data)
-{
- GtkWidget *widget;
- GtkModelButton *button;
- GtkCssNode *indicator_node;
- GtkStyleContext *context;
-
- widget = gtk_css_gadget_get_owner (gadget);
- button = GTK_MODEL_BUTTON (widget);
- context = gtk_widget_get_style_context (widget);
-
- indicator_node = gtk_css_gadget_get_node (button->indicator_gadget);
-
- if (button->menu_name)
- {
- gtk_style_context_save_to_node (context, indicator_node);
- gtk_render_expander (context, cr, x, y, width, height);
- gtk_style_context_restore (context);
- }
- else if (button->role == GTK_BUTTON_ROLE_CHECK)
- {
- gtk_style_context_save_to_node (context, indicator_node);
- gtk_render_check (context, cr, x, y, width, height);
- gtk_style_context_restore (context);
- }
- else if (button->role == GTK_BUTTON_ROLE_RADIO)
- {
- gtk_style_context_save_to_node (context, indicator_node);
- gtk_render_option (context, cr, x, y, width, height);
- gtk_style_context_restore (context);
- }
-
- return FALSE;
-}
-
-static gboolean
gtk_model_button_render (GtkCssGadget *gadget,
cairo_t *cr,
int x,
@@ -1040,7 +997,12 @@ gtk_model_button_render (GtkCssGadget *gadget,
widget = gtk_css_gadget_get_owner (gadget);
button = GTK_MODEL_BUTTON (widget);
- gtk_css_gadget_draw (button->indicator_gadget, cr);
+ if (gtk_css_node_get_visible (gtk_css_gadget_get_node (button->indicator_gadget)))
+ {
+ cairo_save (cr);
+ gtk_css_gadget_draw (button->indicator_gadget, cr);
+ cairo_restore (cr);
+ }
child = gtk_bin_get_child (GTK_BIN (widget));
if (child)
@@ -1275,16 +1237,12 @@ gtk_model_button_init (GtkModelButton *button)
gtk_model_button_render,
NULL,
NULL);
-
- button->indicator_gadget = gtk_css_custom_gadget_new ("check",
- GTK_WIDGET (button),
- button->gadget,
- NULL,
- gtk_model_button_measure_indicator,
- NULL,
- gtk_model_button_render_indicator,
- NULL,
- NULL);
+ button->indicator_gadget = gtk_builtin_icon_new ("check",
+ GTK_WIDGET (button),
+ button->gadget,
+ NULL);
+ gtk_builtin_icon_set_default_size (GTK_BUILTIN_ICON (button->indicator_gadget), 16);
+ update_node_ordering (button);
}
/**
diff --git a/gtk/theme/Adwaita/_common.scss b/gtk/theme/Adwaita/_common.scss
index 17fa5c7..aa9ce8c 100644
--- a/gtk/theme/Adwaita/_common.scss
+++ b/gtk/theme/Adwaita/_common.scss
@@ -741,6 +741,11 @@ modelbutton.flat,
}
}
+modelbutton arrow {
+ background: none;
+ &.left { -gtk-icon-source: -gtk-icontheme("pan-start-symbolic"); }
+ &.right { -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); }
+}
button.color {
padding: 5px; // Uniform padding on the GtkColorButton
diff --git a/gtk/theme/Adwaita/gtk-contained-dark.css b/gtk/theme/Adwaita/gtk-contained-dark.css
index c5c0749..861a096 100644
--- a/gtk/theme/Adwaita/gtk-contained-dark.css
+++ b/gtk/theme/Adwaita/gtk-contained-dark.css
@@ -1241,6 +1241,13 @@ modelbutton.flat,
.menuitem.button.flat:hover {
background-color: #4b5150; }
+modelbutton arrow {
+ background: none; }
+ modelbutton arrow.left {
+ -gtk-icon-source: -gtk-icontheme("pan-start-symbolic"); }
+ modelbutton arrow.right {
+ -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); }
+
button.color, headerbar button.color.titlebutton,
.titlebar button.color.titlebutton {
padding: 5px; }
diff --git a/gtk/theme/Adwaita/gtk-contained.css b/gtk/theme/Adwaita/gtk-contained.css
index 72012a9..d8c5251 100644
--- a/gtk/theme/Adwaita/gtk-contained.css
+++ b/gtk/theme/Adwaita/gtk-contained.css
@@ -1241,6 +1241,13 @@ modelbutton.flat,
.menuitem.button.flat:hover {
background-color: #d5d6d5; }
+modelbutton arrow {
+ background: none; }
+ modelbutton arrow.left {
+ -gtk-icon-source: -gtk-icontheme("pan-start-symbolic"); }
+ modelbutton arrow.right {
+ -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); }
+
button.color, headerbar button.color.titlebutton,
.titlebar button.color.titlebutton {
padding: 5px; }
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]