#include <gtk/gtkhbox.h>
#include <gtk/gtklabel.h>
#include <gtk/gtkdrawingarea.h>
+#include <gtk/gtkbutton.h>
#include <gdk/gdkkeysyms.h>
#include <gconf/gconf-client.h>
#define HILDON_COLOR_PALETTE_POS_PAD 45
#define HILDON_COLOR_BAR_WIDTH 449
-#define HILDON_MORE_BUTTON_RESPONSE 1234
-
/* gconf definitions */
#define HILDON_COLOR_GCONF_PATH "/system/osso/af/color_selector"
#define HILDON_COLOR_GCONF_KEYS "/system/osso/af/color_selector/custom_colors"
{
GConfClient *client;
GtkWidget *drawing_area;
+ GtkWidget *modify_button;
gint index;
guint notify_id;
GdkEventExpose * event,
gpointer data);
-static void
-hildon_color_selector_response (GtkWidget * widget,
- gint response_id,
- gpointer data);
-
static gboolean
key_pressed (GtkWidget * widget,
- GdkEventKey * event,
- gpointer user_data);
+ GdkEventKey * event);
static gboolean
color_pressed (GtkWidget * widget,
static void
select_color (HildonColorSelector * selector,
int event_x,
- int event_y);
+ int event_y,
+ gboolean motion);
static gboolean
color_moved (GtkWidget * widget,
GdkEventMotion * event,
gpointer data);
-GType
+static void
+modify_button_clicked (GtkWidget * button,
+ HildonColorSelector * selector);
+
+static void
+modify_selected(HildonColorSelector * colselector);
+
+GType
hildon_color_selector_get_type(void)
{
static GType selector_type = 0;
static void
hildon_color_selector_class_init(HildonColorSelectorClass * selector_class)
{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(selector_class);
+
parent_class = g_type_class_peek_parent(selector_class);
-
+
+ widget_class->key_press_event = key_pressed;
+
g_type_class_add_private(selector_class,
sizeof(HildonColorSelectorPriv));
g_assert(HILDON_IS_COLOR_SELECTOR(selector));
/* We have to be really carefull. At least gconftool's
- stress test can generate pretty ugly value setups */
+ stress test may generate unexpected value setups */
if (value == NULL || value->type != GCONF_VALUE_LIST ||
gconf_value_get_list_type(value) != GCONF_VALUE_STRING)
list = NULL;
G_CALLBACK(color_pressed), selector);
g_signal_connect (selector->priv->drawing_area, "motion-notify-event",
G_CALLBACK(color_moved), selector);
- g_signal_connect (selector, "key-press-event",
- G_CALLBACK(key_pressed), selector);
-
gtk_dialog_add_button (GTK_DIALOG(selector),
_("ecdg_bd_colour_selector_ok"), GTK_RESPONSE_OK);
- gtk_dialog_add_button (GTK_DIALOG(selector),
- _("ecdg_ti_5bit_colour_selector"),
- HILDON_MORE_BUTTON_RESPONSE);
+
+ selector->priv->modify_button =
+ gtk_button_new_with_label(_("ecdg_bd_colour_selector_modify"));
+ gtk_widget_set_sensitive(selector->priv->modify_button, FALSE);
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(selector)->action_area),
+ selector->priv->modify_button, FALSE, TRUE, 0);
+
+ g_signal_connect(selector->priv->modify_button, "clicked",
+ G_CALLBACK(modify_button_clicked), selector);
+
gtk_dialog_add_button (GTK_DIALOG(selector),
_("ecdg_bd_colour_selector_cancel"),
GTK_RESPONSE_CANCEL);
gtk_dialog_set_default_response (GTK_DIALOG(selector), GTK_RESPONSE_OK);
- g_signal_connect (G_OBJECT(selector), "response",
- G_CALLBACK(hildon_color_selector_response), selector);
-
gtk_window_set_title ( GTK_WINDOW(selector),
_("ecdg_ti_colour_selector") );
gtk_widget_show_all (GTK_DIALOG(selector)->vbox);
selector->priv->color[i].blue == color->blue)
{
selector->priv->index = i;
+ gtk_widget_set_sensitive(selector->priv->modify_button,
+ selector->priv->index >= HILDON_BASE_COLOR_NUM);
gtk_widget_queue_draw(selector->priv->drawing_area);
break;
}
color_pressed(GtkWidget * widget, GdkEventButton * event,
gpointer user_data)
{
- select_color(HILDON_COLOR_SELECTOR(user_data), event->x, event->y);
+ select_color(HILDON_COLOR_SELECTOR(user_data), event->x, event->y, FALSE);
return TRUE;
}
static gboolean key_pressed(GtkWidget * widget,
- GdkEventKey * event, gpointer user_data)
+ GdkEventKey * event)
{
HildonColorSelector *selector;
gint index;
g_return_val_if_fail(widget, FALSE);
- g_return_val_if_fail(user_data, FALSE);
- selector = HILDON_COLOR_SELECTOR(user_data);
+ selector = HILDON_COLOR_SELECTOR(widget);
index = selector->priv->index;
/* if dialog buttons has the focus */
if (GTK_WIDGET_HAS_FOCUS(selector->priv->drawing_area) == FALSE)
- return FALSE;
+ return GTK_WIDGET_CLASS(parent_class)->key_press_event(widget, event);
/* go for if available index otherwise stop keypress handler because
wrapping around is not allowed. */
}
else
{
- return FALSE;
+ return GTK_WIDGET_CLASS(parent_class)->key_press_event(widget, event);
}
break;
case GDK_KP_Down:
}
else
{
- return FALSE;
+ return GTK_WIDGET_CLASS(parent_class)->key_press_event(widget, event);
}
break;
+ case GDK_KP_Enter:
+ case GDK_Return:
+ if (index < HILDON_BASE_COLOR_NUM)
+ return GTK_WIDGET_CLASS(parent_class)->key_press_event(widget, event);
+
+ modify_selected(selector);
default:
- return FALSE;
+ return GTK_WIDGET_CLASS(parent_class)->key_press_event(widget, event);
}
if (index < (HILDON_BASE_COLOR_NUM + HILDON_CUSTOM_COLOR_NUM))
selector->priv->index =
HILDON_BASE_COLOR_NUM + HILDON_CUSTOM_COLOR_NUM - 1;
}
-
+ gtk_widget_set_sensitive(selector->priv->modify_button,
+ selector->priv->index >= HILDON_BASE_COLOR_NUM);
+
gtk_widget_queue_draw(selector->priv->drawing_area);
return TRUE;
}
static void
-select_color(HildonColorSelector * selector, int event_x, int event_y)
+select_color(HildonColorSelector * selector, int event_x, int event_y,
+ gboolean motion)
{
gint x, y;
{
y = 0;
}
-
+
+ if (!motion &&
+ selector->priv->index >= HILDON_BASE_COLOR_NUM &&
+ selector->priv->index == (x + y * HILDON_COLOR_SELECTOR_COLS))
+ modify_selected(selector);
+
selector->priv->index = (x + y * HILDON_COLOR_SELECTOR_COLS);
+ gtk_widget_set_sensitive(selector->priv->modify_button,
+ selector->priv->index >= HILDON_BASE_COLOR_NUM);
gtk_widget_queue_draw(selector->priv->drawing_area);
}
if ( event->state &
(GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK) )
{
- select_color(HILDON_COLOR_SELECTOR(data), event->x, event->y);
+ select_color(HILDON_COLOR_SELECTOR(data), event->x, event->y, TRUE);
return TRUE;
}
return FALSE;
}
-static void
-hildon_color_selector_response(GtkWidget * widget,
- gint response_id,
- gpointer data)
+static void
+modify_button_clicked(GtkWidget * button, HildonColorSelector * selector)
+{
+ modify_selected (selector);
+}
+
+static void
+modify_selected(HildonColorSelector * colselector)
{
- HildonColorSelector * colselector;
HildonColorPopup popupdata;
GtkWidget *popup;
- g_return_if_fail (HILDON_IS_COLOR_SELECTOR(data));
-
- if (response_id != HILDON_MORE_BUTTON_RESPONSE)
- return;
-
- g_signal_stop_emission_by_name (widget, "response");
- colselector = HILDON_COLOR_SELECTOR(data);
-
popup = hildon_color_popup_new(GTK_WINDOW(GTK_WIDGET(colselector)->window),
hildon_color_selector_get_color(colselector), &popupdata);