#include "config.h"
#include "gtkshortcutlabel.h"
+#include "gtkboxlayout.h"
#include "gtklabel.h"
#include "gtkframe.h"
#include "gtkstylecontext.h"
struct _GtkShortcutLabel
{
- GtkBox parent_instance;
+ GtkWidget parent_instance;
gchar *accelerator;
gchar *disabled_text;
};
struct _GtkShortcutLabelClass
{
- GtkBoxClass parent_class;
+ GtkWidgetClass parent_class;
};
-G_DEFINE_TYPE (GtkShortcutLabel, gtk_shortcut_label, GTK_TYPE_BOX)
+G_DEFINE_TYPE (GtkShortcutLabel, gtk_shortcut_label, GTK_TYPE_WIDGET)
enum {
PROP_0,
}
static void
-display_shortcut (GtkContainer *self,
+display_shortcut (GtkWidget *self,
guint key,
GdkModifierType modifier)
{
GtkWidget *disp;
if (i > 0)
- gtk_container_add (self, dim_label ("+"));
+ gtk_widget_set_parent (dim_label ("+"), self);
disp = gtk_label_new (keys[i]);
if (i < n_mods)
gtk_style_context_add_class (gtk_widget_get_style_context (disp), "keycap");
gtk_label_set_use_markup (GTK_LABEL (disp), TRUE);
- gtk_container_add (self, disp);
+ gtk_widget_set_parent (disp, self);
}
g_strfreev (keys);
}
break;
}
if (k > 0)
- gtk_container_add (GTK_CONTAINER (self), dim_label ("+"));
+ gtk_widget_set_parent (dim_label ("+"), GTK_WIDGET (self));
- display_shortcut (GTK_CONTAINER (self), key, modifier);
+ display_shortcut (GTK_WIDGET (self), key, modifier);
}
g_strfreev (accels);
if (!parse_sequence (self, str))
return FALSE;
- gtk_container_add (GTK_CONTAINER (self), dim_label ("⋯"));
+ gtk_widget_set_parent (dim_label ("⋯"), GTK_WIDGET (self));
if (!parse_sequence (self, dots + 3))
return FALSE;
return TRUE;
}
+static void
+clear_children (GtkShortcutLabel *self)
+{
+ GtkWidget *child;
+
+ child = gtk_widget_get_first_child (GTK_WIDGET (self));
+
+ while (child)
+ {
+ GtkWidget *next = gtk_widget_get_next_sibling (child);
+
+ gtk_widget_unparent (child);
+
+ child = next;
+ }
+}
+
static void
gtk_shortcut_label_rebuild (GtkShortcutLabel *self)
{
gchar **accels;
gint k;
- gtk_container_foreach (GTK_CONTAINER (self), (GtkCallback)gtk_widget_destroy, NULL);
+ clear_children (self);
if (self->accelerator == NULL || self->accelerator[0] == '\0')
{
label = dim_label (self->disabled_text);
- gtk_container_add (GTK_CONTAINER (self), label);
+ gtk_widget_set_parent (label, GTK_WIDGET (self));
return;
}
for (k = 0; accels[k]; k++)
{
if (k > 0)
- gtk_container_add (GTK_CONTAINER (self), dim_label ("/"));
+ gtk_widget_set_parent (dim_label ("/"), GTK_WIDGET (self));
if (!parse_range (self, accels[k]))
{
g_free (self->accelerator);
g_free (self->disabled_text);
+ clear_children (self);
+
G_OBJECT_CLASS (gtk_shortcut_label_parent_class)->finalize (object);
}
gtk_shortcut_label_class_init (GtkShortcutLabelClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
object_class->finalize = gtk_shortcut_label_finalize;
object_class->get_property = gtk_shortcut_label_get_property;
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_properties (object_class, LAST_PROP, properties);
+
+ gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT);
+ gtk_widget_class_set_css_name (widget_class, I_("shortcut"));
}
static void
gtk_shortcut_label_init (GtkShortcutLabel *self)
{
- gtk_box_set_spacing (GTK_BOX (self), 6);
-
/* Always use LTR so that modifiers are always left to the keyval */
gtk_widget_set_direction (GTK_WIDGET (self), GTK_TEXT_DIR_LTR);
}