Code

Disable the page selector when there's only one page
[inkscape.git] / src / widgets / gradient-toolbar.cpp
index 2ffd33d257f012b7d8ccf43135b55878ae988dc5..49e72bc2182f80b041ed8baf85a4145019ffcb4a 100644 (file)
@@ -3,7 +3,9 @@
  *
  * Authors:
  *   bulia byak <bulia@dr.com>
+ *   Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
  *
+ * Copyright (C) 2007 Johan Engelen
  * Copyright (C) 2005 authors
  *
  * Released under GNU GPL, read the file 'COPYING' for more information
@@ -114,9 +116,12 @@ gr_apply_gradient (Inkscape::Selection *selection, GrDrag *drag, SPGradient *gr)
     SPGradientType new_type = (SPGradientType) prefs_get_int_attribute ("tools.gradient", "newgradient", SP_GRADIENT_TYPE_LINEAR);
     guint new_fill = prefs_get_int_attribute ("tools.gradient", "newfillorstroke", 1);
 
+
+    // GRADIENTFIXME: make this work for multiple selected draggers.
+    
     // First try selected dragger
     if (drag && drag->selected) {
-        GrDragger *dragger = drag->selected;
+        GrDragger *dragger = (GrDragger*) drag->selected->data;
         for (GSList const* i = dragger->draggables; i != NULL; i = i->next) { // for all draggables of dragger
             GrDraggable *draggable = (GrDraggable *) i->data;
             gr_apply_gradient_to_item (draggable->item, gr, new_type, new_fill, draggable->fill_or_stroke, !draggable->fill_or_stroke);
@@ -126,7 +131,7 @@ gr_apply_gradient (Inkscape::Selection *selection, GrDrag *drag, SPGradient *gr)
 
    // If no drag or no dragger selected, act on selection
    for (GSList const* i = selection->itemList(); i != NULL; i = i->next) {
-       gr_apply_gradient_to_item (SP_ITEM(i->data), gr, new_type, new_fill, true, true);
+       gr_apply_gradient_to_item (SP_ITEM(i->data), gr, new_type, new_fill, new_fill, !new_fill);
    }
 }
 
@@ -137,12 +142,13 @@ gr_item_activate (GtkMenuItem *menuitem, gpointer data)
     gr = sp_gradient_ensure_vector_normalized(gr);
 
     SPDesktop *desktop = (SPDesktop *) data;
-    Inkscape::Selection *selection = SP_DT_SELECTION (desktop);
-    SPEventContext *ev = SP_DT_EVENTCONTEXT (desktop);
+    Inkscape::Selection *selection = sp_desktop_selection (desktop);
+    SPEventContext *ev = sp_desktop_event_context (desktop);
 
     gr_apply_gradient (selection, ev? ev->get_drag() : NULL, gr);
 
-    sp_document_done (SP_DT_DOCUMENT (desktop));
+    sp_document_done (sp_desktop_document (desktop), SP_VERB_CONTEXT_GRADIENT,
+                      _("Assign gradient to object"));
 }
 
 gchar *
@@ -157,7 +163,7 @@ gr_prepare_label (SPObject *obj)
 GtkWidget *
 gr_vector_list (SPDesktop *desktop, bool selection_empty, SPGradient *gr_selected, bool gr_multi)
 {
-    SPDocument *document = SP_DT_DOCUMENT (desktop);
+    SPDocument *document = sp_desktop_document (desktop);
 
     GtkWidget *om = gtk_option_menu_new ();
     GtkWidget *m = gtk_menu_new ();
@@ -262,7 +268,8 @@ void
 gr_read_selection (Inkscape::Selection *selection, GrDrag *drag, SPGradient **gr_selected, bool *gr_multi, SPGradientSpread *spr_selected, bool *spr_multi) 
 {
     if (drag && drag->selected) {
-        GrDragger *dragger = drag->selected;
+        // GRADIENTFIXME: make this work for more than one selected dragger?
+        GrDragger *dragger = (GrDragger*) drag->selected->data;
         for (GSList const* i = dragger->draggables; i != NULL; i = i->next) { // for all draggables of dragger
             GrDraggable *draggable = (GrDraggable *) i->data;
             SPGradient *gradient = sp_item_gradient_get_vector (draggable->item, draggable->fill_or_stroke);
@@ -345,11 +352,11 @@ gr_tb_selection_changed (Inkscape::Selection *, gpointer data)
     if (!desktop)
         return;
 
-    Inkscape::Selection *selection = SP_DT_SELECTION (desktop); // take from desktop, not from args
+    Inkscape::Selection *selection = sp_desktop_selection (desktop); // take from desktop, not from args
     if (!selection) 
         return;
     
-    SPEventContext *ev = SP_DT_EVENTCONTEXT (desktop);
+    SPEventContext *ev = sp_desktop_event_context (desktop);
 
     GtkWidget *om = (GtkWidget *) g_object_get_data (G_OBJECT (widget), "menu");
     if (om) gtk_widget_destroy (om);
@@ -401,9 +408,9 @@ static void
 gr_fork (GtkWidget *button, GtkWidget *widget)
 {
     SPDesktop *desktop = (SPDesktop *) g_object_get_data (G_OBJECT(widget), "desktop");
-    SPDocument *document = SP_DT_DOCUMENT (desktop);
-    Inkscape::Selection *selection = SP_DT_SELECTION (desktop);
-    SPEventContext *ev = SP_DT_EVENTCONTEXT (desktop);
+    SPDocument *document = sp_desktop_document (desktop);
+    Inkscape::Selection *selection = sp_desktop_selection (desktop);
+    SPEventContext *ev = sp_desktop_event_context (desktop);
     GtkWidget *om = (GtkWidget *) g_object_get_data (G_OBJECT(widget), "menu");
 
     if (om && document) {
@@ -414,7 +421,8 @@ gr_fork (GtkWidget *button, GtkWidget *widget)
             SPGradient *gr_new = sp_gradient_fork_vector_if_necessary (gr);
             if (gr_new != gr) {
                 gr_apply_gradient (selection, ev? ev->get_drag() : NULL, gr_new);
-                sp_document_done (document);
+                sp_document_done (document, SP_VERB_CONTEXT_GRADIENT,
+                                  _("Duplicate gradient"));
             }
         }
     }
@@ -427,12 +435,6 @@ static void gr_disconnect_sigc (GObject *obj, sigc::connection *connection) {
     delete connection;
 }
 
-static void gr_disconnect_gsignal (GObject *widget, gpointer defs) {
-    if (defs && G_IS_OBJECT(defs))
-        sp_signal_disconnect_by_data (defs, widget);
-}
-
-
 static void
 gr_edit (GtkWidget *button, GtkWidget *widget)
 {
@@ -454,9 +456,9 @@ gr_edit (GtkWidget *button, GtkWidget *widget)
 GtkWidget *
 gr_change_widget (SPDesktop *desktop)
 {
-    Inkscape::Selection *selection = SP_DT_SELECTION (desktop);
-    SPDocument *document = SP_DT_DOCUMENT (desktop);
-    SPEventContext *ev = SP_DT_EVENTCONTEXT (desktop);
+    Inkscape::Selection *selection = sp_desktop_selection (desktop);
+    SPDocument *document = sp_desktop_document (desktop);
+    SPEventContext *ev = sp_desktop_event_context (desktop);
 
     SPGradient *gr_selected = NULL;
     bool gr_multi = false;
@@ -531,12 +533,14 @@ gr_change_widget (SPDesktop *desktop)
     g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), conn3);
 
     // connect to release and modified signals of the defs (i.e. when someone changes gradient)
-    g_signal_connect (G_OBJECT (SP_DOCUMENT_DEFS (document)), "release", G_CALLBACK (gr_defs_release), widget);
-    g_signal_connect (G_OBJECT (SP_DOCUMENT_DEFS (document)), "modified", G_CALLBACK (gr_defs_modified), widget);
+    sigc::connection *release_connection = new sigc::connection();
+    *release_connection = SP_DOCUMENT_DEFS(document)->connectRelease(sigc::bind<1>(sigc::ptr_fun(&gr_defs_release), widget));
+    sigc::connection *modified_connection = new sigc::connection();
+    *modified_connection = SP_DOCUMENT_DEFS(document)->connectModified(sigc::bind<2>(sigc::ptr_fun(&gr_defs_modified), widget));
 
     // when widget is destroyed, disconnect
-    g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_gsignal), G_OBJECT (SP_DOCUMENT_DEFS (document)));
-    g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_gsignal), G_OBJECT (SP_DOCUMENT_DEFS (document)));
+    g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), release_connection);
+    g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), modified_connection);
 
     gtk_widget_show_all (widget);
     return widget;
@@ -561,7 +565,7 @@ sp_gradient_toolbox_new(SPDesktop *desktop)
     GtkWidget *cbox = gtk_hbox_new (FALSE, 0);
 
     {
-    GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_SMALL_TOOLBAR,
+    GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
                                               SP_BUTTON_TYPE_TOGGLE,
                                               NULL,
                                               "fill_gradient",
@@ -575,7 +579,7 @@ sp_gradient_toolbox_new(SPDesktop *desktop)
     }
 
     {
-    GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_SMALL_TOOLBAR,
+    GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
                                               SP_BUTTON_TYPE_TOGGLE,
                                               NULL,
                                               "fill_radial",
@@ -603,7 +607,7 @@ sp_gradient_toolbox_new(SPDesktop *desktop)
     GtkWidget *cbox = gtk_hbox_new (FALSE, 0);
 
     {
-    GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_SMALL_TOOLBAR,
+    GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
                                               SP_BUTTON_TYPE_TOGGLE,
                                               NULL,
                                               "controls_fill",
@@ -617,7 +621,7 @@ sp_gradient_toolbox_new(SPDesktop *desktop)
     }
 
     {
-    GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_SMALL_TOOLBAR,
+    GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
                                               SP_BUTTON_TYPE_TOGGLE,
                                               NULL,
                                               "controls_stroke",