summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/gradient-image.cpp31
-rw-r--r--src/widgets/gradient-image.h1
-rw-r--r--src/widgets/gradient-toolbar.cpp175
3 files changed, 124 insertions, 83 deletions
diff --git a/src/widgets/gradient-image.cpp b/src/widgets/gradient-image.cpp
index 09a06370d..b835dc36b 100644
--- a/src/widgets/gradient-image.cpp
+++ b/src/widgets/gradient-image.cpp
@@ -153,6 +153,37 @@ sp_gradient_image_new (SPGradient *gradient)
return (GtkWidget *) image;
}
+GdkPixbuf*
+sp_gradient_to_pixbuf (SPGradient *gr, int width, int height)
+{
+ cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
+ cairo_t *ct = cairo_create(s);
+
+ cairo_pattern_t *check = ink_cairo_pattern_create_checkerboard();
+ cairo_set_source(ct, check);
+ cairo_paint(ct);
+ cairo_pattern_destroy(check);
+
+ if (gr) {
+ cairo_pattern_t *p = sp_gradient_create_preview_pattern(gr, width);
+ cairo_set_source(ct, p);
+ cairo_paint(ct);
+ cairo_pattern_destroy(p);
+ }
+
+ cairo_destroy(ct);
+ cairo_surface_flush(s);
+
+ GdkPixbuf* pixbuf = gdk_pixbuf_new_from_data( cairo_image_surface_get_data(s),
+ GDK_COLORSPACE_RGB, TRUE, 8,
+ width, height, cairo_image_surface_get_stride(s),
+ ink_cairo_pixbuf_cleanup, s);
+ convert_pixbuf_argb32_to_normal(pixbuf);
+
+ return pixbuf;
+}
+
+
void
sp_gradient_image_set_gradient (SPGradientImage *image, SPGradient *gradient)
{
diff --git a/src/widgets/gradient-image.h b/src/widgets/gradient-image.h
index 0fbed879f..904ce4cac 100644
--- a/src/widgets/gradient-image.h
+++ b/src/widgets/gradient-image.h
@@ -43,6 +43,7 @@ struct SPGradientImageClass {
GType sp_gradient_image_get_type (void);
GtkWidget *sp_gradient_image_new (SPGradient *gradient);
+GdkPixbuf *sp_gradient_to_pixbuf (SPGradient *gr, int width, int height);
void sp_gradient_image_set_gradient (SPGradientImage *gi, SPGradient *gr);
#endif
diff --git a/src/widgets/gradient-toolbar.cpp b/src/widgets/gradient-toolbar.cpp
index 6443e09cb..984e91e24 100644
--- a/src/widgets/gradient-toolbar.cpp
+++ b/src/widgets/gradient-toolbar.cpp
@@ -141,35 +141,60 @@ void gr_apply_gradient (Inkscape::Selection *selection, GrDrag *drag, SPGradient
}
}
-void gr_item_activate (GtkMenuItem *menuitem, gpointer data)
+void gr_combo_box_changed (GtkComboBox *widget, gpointer data)
{
- SPGradient *gr = static_cast<SPGradient *>(g_object_get_data (G_OBJECT (menuitem), "gradient"));
- gr = sp_gradient_ensure_vector_normalized(gr);
+ GtkTreeIter iter;
+ if (!gtk_combo_box_get_active_iter (widget, &iter)) {
+ return;
+ }
- SPDesktop *desktop = static_cast<SPDesktop *>(data);
- Inkscape::Selection *selection = sp_desktop_selection (desktop);
- SPEventContext *ev = sp_desktop_event_context (desktop);
+ GtkTreeModel *model = gtk_combo_box_get_model (widget);
+ SPGradient *gr = NULL;
+ gtk_tree_model_get (model, &iter, 2, &gr, -1);
- gr_apply_gradient (selection, ev? ev->get_drag() : NULL, gr);
+ if (gr) {
+ gr = sp_gradient_ensure_vector_normalized(gr);
+
+ SPDesktop *desktop = static_cast<SPDesktop *>(data);
+ Inkscape::Selection *selection = sp_desktop_selection (desktop);
+ SPEventContext *ev = sp_desktop_event_context (desktop);
+
+ gr_apply_gradient (selection, ev? ev->get_drag() : NULL, gr);
+
+ DocumentUndo::done(sp_desktop_document (desktop), SP_VERB_CONTEXT_GRADIENT,
+ _("Assign gradient to object"));
+ }
- DocumentUndo::done(sp_desktop_document (desktop), SP_VERB_CONTEXT_GRADIENT,
- _("Assign gradient to object"));
}
gchar *gr_prepare_label (SPObject *obj)
{
const gchar *id = obj->defaultLabel();
if (strlen(id) > 15 && (!strncmp (id, "#linearGradient", 15) || !strncmp (id, "#radialGradient", 15)))
- return g_strdup_printf ("<small>#%s</small>", id+15);
- return g_strdup_printf ("<small>%s</small>", id);
+ return g_strdup_printf ("#%s", id+15);
+ return g_strdup_printf ("%s", id);
}
GtkWidget *gr_vector_list(SPDesktop *desktop, bool selection_empty, SPGradient *gr_selected, bool gr_multi)
{
SPDocument *document = sp_desktop_document (desktop);
- GtkWidget *om = gtk_option_menu_new ();
- GtkWidget *m = gtk_menu_new ();
+ GtkListStore *store;
+ GtkTreeIter iter;
+ GtkCellRenderer *renderer;
+ GtkWidget *combo_box;
+
+ store = gtk_list_store_new (3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER);
+ combo_box = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
+
+ renderer = gtk_cell_renderer_pixbuf_new ();
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), renderer, FALSE);
+ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), renderer, "pixbuf", 0, NULL);
+ gtk_cell_renderer_set_padding(renderer, 5, 0);
+
+ renderer = gtk_cell_renderer_text_new ();
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), renderer, TRUE);
+ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), renderer, "text", 1, NULL);
GSList *gl = NULL;
const GSList *gradients = document->getResourceList("gradient");
@@ -186,87 +211,65 @@ GtkWidget *gr_vector_list(SPDesktop *desktop, bool selection_empty, SPGradient *
if (!gl) {
// The document has no gradients
- GtkWidget *l = gtk_label_new("");
- gtk_label_set_markup (GTK_LABEL(l), _("<small>No gradients</small>"));
- GtkWidget *i = gtk_menu_item_new ();
- gtk_container_add (GTK_CONTAINER (i), l);
-
- gtk_widget_show (i);
- gtk_menu_shell_append(GTK_MENU_SHELL (m), i);
- gtk_widget_set_sensitive (om, FALSE);
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, NULL, 1, _("No gradients"), 2, NULL, -1);
+ gtk_widget_set_sensitive (combo_box, FALSE);
+
} else if (selection_empty) {
// Document has gradients, but nothing is currently selected.
- GtkWidget *l = gtk_label_new("");
- gtk_label_set_markup (GTK_LABEL(l), _("<small>Nothing selected</small>"));
- GtkWidget *i = gtk_menu_item_new ();
- gtk_container_add (GTK_CONTAINER (i), l);
-
- gtk_widget_show (i);
- gtk_menu_shell_append(GTK_MENU_SHELL (m), i);
- gtk_widget_set_sensitive (om, FALSE);
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, NULL, 1, _("Nothing selected"), 2, NULL, -1);
+ gtk_widget_set_sensitive (combo_box, FALSE);
+
} else {
if (gr_selected == NULL) {
- GtkWidget *l = gtk_label_new("");
- gtk_label_set_markup (GTK_LABEL(l), _("<small>No gradients in selection</small>"));
- GtkWidget *i = gtk_menu_item_new ();
- gtk_container_add (GTK_CONTAINER (i), l);
- gtk_widget_show (i);
- gtk_menu_shell_append(GTK_MENU_SHELL (m), i);
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, NULL, 1, _("No gradient"), 2, NULL, -1);
+ gtk_widget_set_sensitive (combo_box, FALSE);
+
}
if (gr_multi) {
- GtkWidget *l = gtk_label_new("");
- gtk_label_set_markup (GTK_LABEL(l), _("<small>Multiple gradients</small>"));
- GtkWidget *i = gtk_menu_item_new ();
- gtk_container_add (GTK_CONTAINER (i), l);
- gtk_widget_show (i);
- gtk_menu_shell_append(GTK_MENU_SHELL (m), i);
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, NULL, 1, _("Multiple gradients"), 2, NULL, -1);
+ gtk_widget_set_sensitive (combo_box, FALSE);
+
}
while (gl) {
SPGradient *gradient = SP_GRADIENT (gl->data);
gl = g_slist_remove (gl, gradient);
- GtkWidget *i = gtk_menu_item_new ();
- g_object_set_data (G_OBJECT (i), "gradient", gradient);
- g_signal_connect (G_OBJECT (i), "activate", G_CALLBACK (gr_item_activate), desktop);
-
- GtkWidget *image = sp_gradient_image_new (gradient);
-
- GtkWidget *hb = gtk_hbox_new (FALSE, 4);
- GtkWidget *l = gtk_label_new ("");
gchar *label = gr_prepare_label(gradient);
- gtk_label_set_markup (GTK_LABEL(l), label);
+ GdkPixbuf *pixb = sp_gradient_to_pixbuf (gradient, 60, 22);
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, pixb, 1, label, 2, gradient, -1);
g_free (label);
- gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
- gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (hb), image, FALSE, FALSE, 0);
-
- gtk_widget_show_all (i);
-
- gtk_container_add (GTK_CONTAINER (i), hb);
-
- gtk_menu_shell_append(GTK_MENU_SHELL (m), i);
if (gradient == gr_selected) {
pos = idx;
}
idx ++;
}
- gtk_widget_set_sensitive (om, TRUE);
+ gtk_widget_set_sensitive (combo_box, TRUE);
}
- gtk_option_menu_set_menu (GTK_OPTION_MENU (om), m);
/* Select the current gradient, or the Multi/Nothing line */
- if (gr_multi || gr_selected == NULL)
- gtk_option_menu_set_history (GTK_OPTION_MENU (om), 0);
- else
- gtk_option_menu_set_history (GTK_OPTION_MENU (om), pos);
+ if (gr_multi || gr_selected == NULL) {
+ gtk_combo_box_set_active (GTK_COMBO_BOX(combo_box) , 0);
+ }
+ else {
+ gtk_combo_box_set_active (GTK_COMBO_BOX(combo_box) , pos);
+ }
+
+ sp_set_font_size_smaller(combo_box);
- return om;
+ g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (gr_combo_box_changed), desktop);
+
+ return combo_box;
}
@@ -377,10 +380,10 @@ static void gr_tb_selection_changed(Inkscape::Selection * /*selection*/, gpointe
if (selection) {
SPEventContext *ev = sp_desktop_event_context(desktop);
- GtkWidget *om = (GtkWidget *) g_object_get_data(G_OBJECT(widget), "menu");
- if (om) {
- gtk_widget_destroy(om);
- om = 0;
+ GtkWidget *combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(widget), "combobox");
+ if (combo_box) {
+ gtk_widget_destroy(combo_box);
+ combo_box = 0;
}
SPGradient *gr_selected = 0;
@@ -391,13 +394,13 @@ static void gr_tb_selection_changed(Inkscape::Selection * /*selection*/, gpointe
gr_read_selection(selection, ev ? ev->get_drag() : 0, gr_selected, gr_multi, spr_selected, spr_multi);
- om = gr_vector_list(desktop, selection->isEmpty(), gr_selected, gr_multi);
- g_object_set_data(G_OBJECT(widget), "menu", om);
+ combo_box = gr_vector_list(desktop, selection->isEmpty(), gr_selected, gr_multi);
+ g_object_set_data(G_OBJECT(widget), "combobox", combo_box);
GtkWidget *buttons = (GtkWidget *) g_object_get_data(G_OBJECT(widget), "buttons");
gtk_widget_set_sensitive(buttons, (gr_selected && !gr_multi));
- gtk_box_pack_start(GTK_BOX(widget), om, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(widget), combo_box, TRUE, TRUE, 0);
gtk_widget_show_all(widget);
}
@@ -436,13 +439,19 @@ static void gr_disconnect_sigc (GObject */*obj*/, sigc::connection *connection)
static void
gr_edit (GtkWidget */*button*/, GtkWidget *widget)
{
- GtkWidget *om = (GtkWidget *) g_object_get_data (G_OBJECT(widget), "menu");
+ GtkWidget *combo_box = (GtkWidget *) g_object_get_data (G_OBJECT(widget), "combobox");
spinbutton_defocus(GTK_OBJECT(widget));
- if (om) {
- GtkWidget *i = gtk_menu_get_active (GTK_MENU (gtk_option_menu_get_menu (GTK_OPTION_MENU (om))));
- SPGradient *gr = (SPGradient *) g_object_get_data (G_OBJECT(i), "gradient");
+ if (combo_box) {
+ GtkTreeIter iter;
+ if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX(combo_box), &iter)) {
+ return;
+ }
+
+ GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX(combo_box));
+ SPGradient *gr = NULL;
+ gtk_tree_model_get (model, &iter, 2, &gr, -1);
if (gr) {
GtkWidget *dialog = sp_gradient_vector_editor_new (gr);
@@ -469,10 +478,10 @@ GtkWidget * gr_change_widget(SPDesktop *desktop)
g_object_set_data(G_OBJECT(widget), "dtw", desktop->canvas);
g_object_set_data (G_OBJECT (widget), "desktop", desktop);
- GtkWidget *om = gr_vector_list (desktop, selection->isEmpty(), gr_selected, gr_multi);
- g_object_set_data (G_OBJECT (widget), "menu", om);
+ GtkWidget *combo_box = gr_vector_list(desktop, selection->isEmpty(), gr_selected, gr_multi);
+ g_object_set_data(G_OBJECT(widget), "combobox", combo_box);
- gtk_box_pack_start (GTK_BOX (widget), om, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (widget), combo_box, TRUE, TRUE, 0);
{
GtkWidget *buttons = gtk_hbox_new(FALSE, 1);
@@ -628,9 +637,9 @@ sp_gradient_toolbox_new(SPDesktop *desktop)
{
GtkWidget *vectors = gr_change_widget (desktop);
- GtkToolItem *vectors_toolitem = gtk_tool_item_new();
- gtk_container_add(GTK_CONTAINER(vectors_toolitem), vectors);
- gtk_toolbar_insert(GTK_TOOLBAR(tbl), vectors_toolitem, -1);
+ GtkToolItem *vectors_toolitem = gtk_tool_item_new();
+ gtk_container_add(GTK_CONTAINER(vectors_toolitem), vectors);
+ gtk_toolbar_insert(GTK_TOOLBAR(tbl), vectors_toolitem, -1);
}
gtk_widget_show_all(tbl);