diff options
Diffstat (limited to 'libowl/owlcolourselectordialog.c')
-rw-r--r-- | libowl/owlcolourselectordialog.c | 169 |
1 files changed, 136 insertions, 33 deletions
diff --git a/libowl/owlcolourselectordialog.c b/libowl/owlcolourselectordialog.c index c2571b9..4f722b0 100644 --- a/libowl/owlcolourselectordialog.c +++ b/libowl/owlcolourselectordialog.c @@ -37,16 +37,60 @@ typedef struct _OwlColourSelectorDialogPrivate OwlColourSelectorDialogPrivate; struct _OwlColourSelectorDialogPrivate { GtkWidget *frame; - GtkWidget *vbox; + GtkWidget *main_box; GtkWidget *palette; GtkWidget *swatch; + GtkWidget *swatch_box; + GtkWidget *alignment; + + gint orientation; +}; + +enum { + PROP_ORIENTATION = 1 }; +GType +owl_colour_selector_dialog_orientation_get_type (void) +{ + static GType etype = 0; + if (etype == 0) { + static const GEnumValue values[] = { + { OWL_COLOUR_SELECTOR_DIALOG_HORIZONTAL, "OWL_COLOUR_SELECTOR_DIALOG_HORIZONTAL", "horizontal" }, + { OWL_COLOUR_SELECTOR_DIALOG_VERTICAL, "OWL_COLOUR_SELECTOR_DIALOG_VERTICAL", "vertical" }, + { OWL_COLOUR_SELECTOR_DIALOG_AUTOMATIC, "OWL_COLOUR_SELECTOR_DIALOG_AUTOMATIC", "automatic" }, + { 0, NULL, NULL } + }; + etype = g_enum_register_static (g_intern_static_string ("OwlColourSelectorDialogOrientation"), values); + } + return etype; +} + +#define OWL_TYPE_COLOUR_SELECTOR_DIALOG_ORIENTATION owl_colour_selector_dialog_orientation_get_type () + +static const guint32 colours[] = + {0xfce94f00, 0xedd40000, 0xc4a00000, + 0xfcaf3e00, 0xf5790000, 0xce5c0000, + 0xe9b96e00, 0xc17d1100, 0x8f590200, + 0x8ae23400, 0x73d21600, 0x4e9a0600, + 0x729fcf00, 0x3465a400, 0x204a8700, + 0xad7fa800, 0x75507b00, 0x5c356600, + 0xef292900, 0xcc000000, 0xa4000000, + 0xffffffff, 0xbabdb600, 0x00000000}; + +static void colour_selected_cb (GtkWidget *widget, OwlColourSwatch *swatch, gpointer user_data); + + static void owl_colour_selector_dialog_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { + OwlColourSelectorDialogPrivate *priv = COLOUR_SELECTOR_DIALOG_PRIVATE (object); + switch (property_id) { + case PROP_ORIENTATION: + g_value_set_enum (value, priv->orientation); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } @@ -56,7 +100,12 @@ static void owl_colour_selector_dialog_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { + OwlColourSelectorDialogPrivate *priv = COLOUR_SELECTOR_DIALOG_PRIVATE (object); + switch (property_id) { + case PROP_ORIENTATION: + priv->orientation = g_value_get_enum (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } @@ -75,10 +124,74 @@ owl_colour_selector_dialog_finalize (GObject *object) G_OBJECT_CLASS (owl_colour_selector_dialog_parent_class)->finalize (object); } +static GObject * +owl_colour_selector_dialog_constructor (GType type, + guint n_construct_properties, GObjectConstructParam *construct_properties) +{ + GObject *obj; + OwlColourSelectorDialogPrivate *priv; + + GtkWidget *main_box = NULL; + GtkWidget *swatch_box = NULL; + GtkWidget *alignment = NULL; + GtkWidget *frame = NULL; + GtkWidget *palette = NULL; + OwlColourSelectorDialogOrientation orientation; + + { + /* Invoke parent constructor. */ + OwlColourSelectorDialogClass *klass; + GObjectClass *parent_class; + klass = OWL_COLOUR_SELECTOR_DIALOG_CLASS ( + g_type_class_peek (OWL_TYPE_COLOUR_SELECTOR_DIALOG)); + + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); + + obj = parent_class->constructor (type, n_construct_properties, + construct_properties); + } + + priv = COLOUR_SELECTOR_DIALOG_PRIVATE (obj); + + alignment = priv->alignment; + frame = priv->frame; + palette = priv->palette; + + if (priv->orientation == OWL_COLOUR_SELECTOR_DIALOG_AUTOMATIC) + { + if (gdk_screen_width () > gdk_screen_height ()) + orientation = OWL_COLOUR_SELECTOR_DIALOG_HORIZONTAL; + else + orientation = OWL_COLOUR_SELECTOR_DIALOG_VERTICAL; + + } else { + orientation = priv->orientation; + } + + if (orientation == OWL_COLOUR_SELECTOR_DIALOG_VERTICAL) + { + main_box = gtk_vbox_new (FALSE, 6); + swatch_box = gtk_hbox_new (FALSE, 0); + } else { + main_box = gtk_hbox_new (FALSE, 6); + swatch_box = gtk_vbox_new (FALSE, 0); + } + + gtk_box_pack_start (GTK_BOX (swatch_box), alignment, TRUE, FALSE, 6); + gtk_container_add (GTK_CONTAINER (frame), main_box); + gtk_box_pack_start (GTK_BOX (main_box), palette, TRUE, TRUE, 6); + gtk_box_pack_start (GTK_BOX (main_box), swatch_box, FALSE, FALSE, 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (obj)->vbox), frame); + gtk_widget_show_all (frame); + + return obj; +} + static void owl_colour_selector_dialog_class_init (OwlColourSelectorDialogClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + GParamSpec *pspec; g_type_class_add_private (klass, sizeof (OwlColourSelectorDialogPrivate)); @@ -86,6 +199,18 @@ owl_colour_selector_dialog_class_init (OwlColourSelectorDialogClass *klass) object_class->set_property = owl_colour_selector_dialog_set_property; object_class->dispose = owl_colour_selector_dialog_dispose; object_class->finalize = owl_colour_selector_dialog_finalize; + object_class->constructor = owl_colour_selector_dialog_constructor; + + pspec = g_param_spec_enum ("orientation", + "The orientation of the dialog", + "Set orientation of the dialog", + OWL_TYPE_COLOUR_SELECTOR_DIALOG_ORIENTATION, + OWL_COLOUR_SELECTOR_DIALOG_AUTOMATIC, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + + g_object_class_install_property (object_class, + PROP_ORIENTATION, + pspec); } static void @@ -117,50 +242,24 @@ static void owl_colour_selector_dialog_init (OwlColourSelectorDialog *self) { GtkWidget *frame; - GtkWidget *vbox; - GtkWidget *palette; GtkWidget *swatch; - GtkWidget *hbox; GtkWidget *alignment; - - guint32 colours[] = {0xfce94f00, 0xedd40000, 0xc4a00000, - 0xfcaf3e00, 0xf5790000, 0xce5c0000, - 0xe9b96e00, 0xc17d1100, 0x8f590200, - 0x8ae23400, 0x73d21600, 0x4e9a0600, - 0x729fcf00, 0x3465a400, 0x204a8700, - 0xad7fa800, 0x75507b00, 0x5c356600, - 0xef292900, 0xcc000000, 0xa4000000, - 0xffffffff, 0xbabdb600, 0x00000000}; + GtkWidget *palette; OwlColourSelectorDialogPrivate *priv = COLOUR_SELECTOR_DIALOG_PRIVATE (self); - frame = gtk_frame_new (NULL); - vbox = gtk_vbox_new (FALSE, 6); - - gtk_container_add (GTK_CONTAINER(frame), vbox); - palette = owl_colour_palette_new (6, 4); - gtk_box_pack_start (GTK_BOX (vbox), palette, TRUE, TRUE, 6); - owl_colour_palette_set_colours (OWL_COLOUR_PALETTE (palette), colours, 24); - g_signal_connect (palette, "colour-selected", (GCallback)colour_selected_cb, self); + frame = gtk_frame_new (NULL); swatch = owl_colour_swatch_new (); - hbox = gtk_hbox_new (FALSE, 0); alignment = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_container_add (GTK_CONTAINER (alignment), swatch); - gtk_box_pack_start (GTK_BOX (hbox), alignment, TRUE, FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 6); - gtk_widget_set_size_request (swatch, 64, 64); - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (self)->vbox), frame); - - gtk_widget_show_all (frame); - gtk_dialog_add_buttons (GTK_DIALOG (self), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, @@ -168,14 +267,19 @@ owl_colour_selector_dialog_init (OwlColourSelectorDialog *self) GTK_RESPONSE_OK, NULL); - gtk_window_set_resizable (GTK_WINDOW (self), FALSE); gtk_window_set_title (GTK_WINDOW (self), "Pick a colour"); - priv->palette = palette; priv->swatch = swatch; - priv->vbox = vbox; priv->frame = frame; + priv->alignment = alignment; + priv->palette = palette; +} + +GtkWidget* +owl_colour_selector_dialog_new_with_orientation (OwlColourSelectorDialogOrientation orientation) +{ + return GTK_WIDGET(g_object_new (OWL_TYPE_COLOUR_SELECTOR_DIALOG, "orientation", orientation, NULL)); } GtkWidget* @@ -183,4 +287,3 @@ owl_colour_selector_dialog_new (void) { return GTK_WIDGET(g_object_new (OWL_TYPE_COLOUR_SELECTOR_DIALOG, NULL)); } - |