Code

Merge and cleanup of GSoC C++-ification project.
[inkscape.git] / src / widgets / gradient-vector.cpp
index ffa5b12dd11392c6d56f827e348359fac0d5e56c..1be0aae8e658e5f7f0acf4d8303b5a55e4338b56 100644 (file)
@@ -6,6 +6,7 @@
  *   bulia byak <buliabyak@users.sf.net>
  *   MenTaLguY <mental@rydia.net>
  *   Jon A. Cruz <jon@joncruz.org>
+ *   Abhishek Sharma
  *
  * Copyright (C) 2001-2002 Lauris Kaplinski
  * Copyright (C) 2001 Ximian, Inc.
@@ -43,6 +44,8 @@
 #include <sigc++/functors/ptr_fun.h>
 #include <sigc++/adaptors/bind.h>
 
+using Inkscape::DocumentUndo;
+
 enum {
     VECTOR_SET,
     LAST_SIGNAL
@@ -174,6 +177,10 @@ GtkWidget *sp_gradient_vector_selector_new(SPDocument *doc, SPGradient *gr)
 
 void sp_gradient_vector_selector_set_gradient(SPGradientVectorSelector *gvs, SPDocument *doc, SPGradient *gr)
 {
+//     g_message("sp_gradient_vector_selector_set_gradient(%p, %p, %p) [%s] %d %d", gvs, doc, gr,
+//               (gr ? gr->getId():"N/A"),
+//               (gr ? gr->isSwatch() : -1),
+//               (gr ? gr->isSolid() : -1));
     static gboolean suppress = FALSE;
 
     g_return_if_fail(gvs != NULL);
@@ -249,7 +256,7 @@ static void sp_gvs_rebuild_gui_full(SPGradientVectorSelector *gvs)
     /* Pick up all gradients with vectors */
     GSList *gl = NULL;
     if (gvs->gr) {
-        const GSList *gradients = SP_OBJECT_DOCUMENT(gvs->gr)->get_resource_list("gradient");
+        const GSList *gradients = SP_OBJECT_DOCUMENT(gvs->gr)->getResourceList("gradient");
         for (const GSList *curr = gradients; curr; curr = curr->next) {
             SPGradient* grad = SP_GRADIENT(curr->data);
             if ( grad->hasStops() && (grad->isSwatch() == gvs->swatched) ) {
@@ -336,11 +343,12 @@ static void sp_gvs_gradient_activate(GtkMenuItem *mi, SPGradientVectorSelector *
     /* Namely - menuitems etc. will be fucked up */
     /* Hmmm - probably we can just re-set it as menuitem data (Lauris) */
 
-    //g_print("SPGradientVectorSelector: gradient %s activated\n", SP_OBJECT_ID(gr));
+    //g_print("SPGradientVectorSelector: gradient %s activated\n", gr->getId());
+    //g_message("Setting to gradient %p   swatch:%d   solid:%d", gr, gr->isSwatch(), gr->isSolid());
 
     norm = sp_gradient_ensure_vector_normalized(gr);
     if (norm != gr) {
-        //g_print("SPGradientVectorSelector: become %s after normalization\n", SP_OBJECT_ID(norm));
+        //g_print("SPGradientVectorSelector: become %s after normalization\n", norm->getId());
         /* But be careful that we do not have gradient saved anywhere else */
         g_object_set_data(G_OBJECT(mi), "gradient", norm);
     }
@@ -363,8 +371,8 @@ static void sp_gvs_gradient_activate(GtkMenuItem *mi, SPGradientVectorSelector *
         /* We do extra undo push here */
         /* If handler has already done it, it is just NOP */
         // FIXME: looks like this is never a valid undo step, consider removing this
-        SPDocumentUndo::done(SP_OBJECT_DOCUMENT(norm), SP_VERB_CONTEXT_GRADIENT,
-                          /* TODO: annotate */ "gradient-vector.cpp:350");
+        DocumentUndo::done(SP_OBJECT_DOCUMENT(norm), SP_VERB_CONTEXT_GRADIENT,
+                           /* TODO: annotate */ "gradient-vector.cpp:350");
     }
 }
 
@@ -463,7 +471,7 @@ static void verify_grad(SPGradient *gradient)
     int i = 0;
     SPStop *stop = NULL;
     /* count stops */
-    for ( SPObject *ochild = SP_OBJECT(gradient)->first_child() ; ochild != NULL ; ochild = SP_OBJECT_NEXT(ochild) ) {
+    for ( SPObject *ochild = gradient->firstChild() ; ochild ; ochild = ochild->getNext() ) {
         if (SP_IS_STOP(ochild)) {
             i++;
             stop = SP_STOP(ochild);
@@ -474,11 +482,8 @@ static void verify_grad(SPGradient *gradient)
     xml_doc = SP_OBJECT_REPR(gradient)->document();
 
     if (i < 1) {
-        gchar c[64];
-        sp_svg_write_color(c, sizeof(c), 0x00000000);
-
         Inkscape::CSSOStringStream os;
-        os << "stop-color:" << c << ";stop-opacity:" << 1.0 << ";";
+        os << "stop-color: #000000;stop-opacity:" << 1.0 << ";";
 
         Inkscape::XML::Node *child;
 
@@ -506,7 +511,7 @@ static void verify_grad(SPGradient *gradient)
 static void select_stop_in_list( GtkWidget *mnu, SPGradient *gradient, SPStop *new_stop)
 {
     int i = 0;
-    for ( SPObject *ochild = SP_OBJECT(gradient)->first_child() ; ochild != NULL ; ochild = SP_OBJECT_NEXT(ochild) ) {
+    for ( SPObject *ochild = gradient->firstChild() ; ochild ; ochild = ochild->getNext() ) {
         if (SP_IS_STOP(ochild)) {
             if (SP_OBJECT(ochild) == SP_OBJECT(new_stop)) {
                 gtk_option_menu_set_history(GTK_OPTION_MENU(mnu), i);
@@ -536,7 +541,7 @@ static void update_stop_list( GtkWidget *mnu, SPGradient *gradient, SPStop *new_
     gtk_widget_show(m);
     GSList *sl = NULL;
     if ( gradient->hasStops() ) {
-        for ( SPObject *ochild = SP_OBJECT(gradient)->first_child() ; ochild != NULL ; ochild = SP_OBJECT_NEXT(ochild) ) {
+        for ( SPObject *ochild = gradient->firstChild() ; ochild ; ochild = ochild->getNext() ) {
             if (SP_IS_STOP(ochild)) {
                 sl = g_slist_append(sl, ochild);
             }
@@ -550,11 +555,9 @@ static void update_stop_list( GtkWidget *mnu, SPGradient *gradient, SPStop *new_
     } else {
 
         for (; sl != NULL; sl = sl->next){
-            SPStop *stop;
-            GtkWidget *i;
             if (SP_IS_STOP(sl->data)){
-                stop = SP_STOP(sl->data);
-                i = gtk_menu_item_new();
+                SPStop *stop = SP_STOP(sl->data);
+                GtkWidget *i = gtk_menu_item_new();
                 gtk_widget_show(i);
                 g_object_set_data(G_OBJECT(i), "stop", stop);
                 GtkWidget *hb = gtk_hbox_new(FALSE, 4);
@@ -600,11 +603,8 @@ static void sp_grad_edit_select(GtkOptionMenu *mnu, GtkWidget *tbl)
     blocked = TRUE;
 
     SPColorSelector *csel = (SPColorSelector*)g_object_get_data(G_OBJECT(tbl), "cselector");
-    guint32 const c = sp_stop_get_rgba32(stop);
-    csel->base->setAlpha(SP_RGBA32_A_F(c));
-    SPColor color( SP_RGBA32_R_F(c), SP_RGBA32_G_F(c), SP_RGBA32_B_F(c) );
     // set its color, from the stored array
-    csel->base->setColor( color );
+    csel->base->setColorAlpha( stop->getEffectiveColor(), stop->opacity );
     GtkWidget *offspin = GTK_WIDGET(g_object_get_data(G_OBJECT(tbl), "offspn"));
     GtkWidget *offslide =GTK_WIDGET(g_object_get_data(G_OBJECT(tbl), "offslide"));
 
@@ -651,25 +651,22 @@ static void sp_grad_edit_select(GtkOptionMenu *mnu, GtkWidget *tbl)
 
 static void offadjustmentChanged( GtkAdjustment *adjustment, GtkWidget *vb)
 {
-    if (blocked) {
-        return;
-    }
-
-    blocked = TRUE;
+    if (!blocked) {
+        blocked = TRUE;
 
-    GtkOptionMenu *mnu = static_cast<GtkOptionMenu *>(g_object_get_data(G_OBJECT(vb), "stopmenu"));
-    if (!g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop")) {
-        return;
-    }
-    SPStop *stop = SP_STOP(g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop"));
+        GtkOptionMenu *mnu = static_cast<GtkOptionMenu *>(g_object_get_data(G_OBJECT(vb), "stopmenu"));
+        if ( g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop") ) {
+            SPStop *stop = SP_STOP(g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop"));
 
-    stop->offset = adjustment->value;
-    sp_repr_set_css_double(SP_OBJECT_REPR(stop), "offset", stop->offset);
+            stop->offset = adjustment->value;
+            sp_repr_set_css_double(SP_OBJECT_REPR(stop), "offset", stop->offset);
 
-    SPDocumentUndo::done(SP_OBJECT_DOCUMENT(stop), SP_VERB_CONTEXT_GRADIENT,
-                      _("Change gradient stop offset"));
+            DocumentUndo::maybeDone(SP_OBJECT_DOCUMENT(stop), "gradient:stop:offset", SP_VERB_CONTEXT_GRADIENT,
+                                    _("Change gradient stop offset"));
 
-    blocked = FALSE;
+            blocked = FALSE;
+        }
+    }
 }
 
 guint32 sp_average_color(guint32 c1, guint32 c2, gdouble p = 0.5)
@@ -739,8 +736,8 @@ static void sp_grd_ed_add_stop(GtkWidget */*widget*/,  GtkWidget *vb)
     GtkWidget *offslide =GTK_WIDGET(g_object_get_data(G_OBJECT(vb), "offslide"));
     gtk_widget_set_sensitive(offslide, TRUE);
     gtk_widget_set_sensitive(GTK_WIDGET(offspin), TRUE);
-    SPDocumentUndo::done(SP_OBJECT_DOCUMENT(gradient), SP_VERB_CONTEXT_GRADIENT,
-                      _("Add gradient stop"));
+    DocumentUndo::done(SP_OBJECT_DOCUMENT(gradient), SP_VERB_CONTEXT_GRADIENT,
+                       _("Add gradient stop"));
 }
 
 static void sp_grd_ed_del_stop(GtkWidget */*widget*/,  GtkWidget *vb)
@@ -770,8 +767,8 @@ static void sp_grd_ed_del_stop(GtkWidget */*widget*/,  GtkWidget *vb)
         SP_OBJECT_REPR(gradient)->removeChild(SP_OBJECT_REPR(stop));
         sp_gradient_vector_widget_load_gradient(vb, gradient);
         update_stop_list(GTK_WIDGET(mnu), gradient, NULL);
-        SPDocumentUndo::done(SP_OBJECT_DOCUMENT(gradient), SP_VERB_CONTEXT_GRADIENT,
-                          _("Delete gradient stop"));
+        DocumentUndo::done(SP_OBJECT_DOCUMENT(gradient), SP_VERB_CONTEXT_GRADIENT,
+                           _("Delete gradient stop"));
     }
 
 }
@@ -1021,15 +1018,11 @@ static void sp_gradient_vector_widget_load_gradient(GtkWidget *widget, SPGradien
 
         GtkOptionMenu *mnu = static_cast<GtkOptionMenu *>(g_object_get_data(G_OBJECT(widget), "stopmenu"));
         SPStop *stop = SP_STOP(g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop"));
-        guint32 const c = sp_stop_get_rgba32(stop);
 
-        /// get the color selector
+        // get the color selector
         SPColorSelector *csel = SP_COLOR_SELECTOR(g_object_get_data(G_OBJECT(widget), "cselector"));
-        // set alpha
-        csel->base->setAlpha(SP_RGBA32_A_F(c));
-        SPColor color( SP_RGBA32_R_F(c), SP_RGBA32_G_F(c), SP_RGBA32_B_F(c) );
-        // set color
-        csel->base->setColor( color );
+
+        csel->base->setColorAlpha( stop->getEffectiveColor(), stop->opacity );
 
         /* Fill preview */
         GtkWidget *w = static_cast<GtkWidget *>(g_object_get_data(G_OBJECT(widget), "preview"));
@@ -1040,10 +1033,10 @@ static void sp_gradient_vector_widget_load_gradient(GtkWidget *widget, SPGradien
         // Once the user edits a gradient, it stops being auto-collectable
         if (SP_OBJECT_REPR(gradient)->attribute("inkscape:collect")) {
             SPDocument *document = SP_OBJECT_DOCUMENT(gradient);
-            bool saved = SPDocumentUndo::get_undo_sensitive(document);
-                       SPDocumentUndo::set_undo_sensitive(document, false);
+            bool saved = DocumentUndo::getUndoSensitive(document);
+            DocumentUndo::setUndoSensitive(document, false);
             SP_OBJECT_REPR(gradient)->setAttribute("inkscape:collect", NULL);
-                       SPDocumentUndo::set_undo_sensitive(document, saved);
+            DocumentUndo::setUndoSensitive(document, saved);
         }
     } else { // no gradient, disable everything
         gtk_widget_set_sensitive(widget, FALSE);
@@ -1154,10 +1147,6 @@ static void sp_gradient_vector_color_dragged(SPColorSelector *csel, GtkObject *o
 
 static void sp_gradient_vector_color_changed(SPColorSelector *csel, GtkObject *object)
 {
-    SPColor color;
-    float alpha;
-    guint32 rgb;
-
     if (blocked) {
         return;
     }
@@ -1185,20 +1174,19 @@ static void sp_gradient_vector_color_changed(SPColorSelector *csel, GtkObject *o
     SPStop *stop = SP_STOP(g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop"));
 
     csel = static_cast<SPColorSelector*>(g_object_get_data(G_OBJECT(object), "cselector"));
+    SPColor color;
+    float alpha = 0;
     csel->base->getColorAlpha( color, alpha );
-    rgb = color.toRGBA32( 0x00 );
 
     sp_repr_set_css_double(SP_OBJECT_REPR(stop), "offset", stop->offset);
     Inkscape::CSSOStringStream os;
-    gchar c[64];
-    sp_svg_write_color(c, sizeof(c), rgb);
-    os << "stop-color:" << c << ";stop-opacity:" << static_cast<gdouble>(alpha) <<";";
+    os << "stop-color:" << color.toString() << ";stop-opacity:" << static_cast<gdouble>(alpha) <<";";
     SP_OBJECT_REPR(stop)->setAttribute("style", os.str().c_str());
     // g_snprintf(c, 256, "stop-color:#%06x;stop-opacity:%g;", rgb >> 8, static_cast<gdouble>(alpha));
     //SP_OBJECT_REPR(stop)->setAttribute("style", c);
 
-    SPDocumentUndo::done(SP_OBJECT_DOCUMENT(ngr), SP_VERB_CONTEXT_GRADIENT,
-                      _("Change gradient stop color"));
+    DocumentUndo::done(SP_OBJECT_DOCUMENT(ngr), SP_VERB_CONTEXT_GRADIENT,
+                       _("Change gradient stop color"));
 
     blocked = FALSE;
 
@@ -1215,4 +1203,4 @@ static void sp_gradient_vector_color_changed(SPColorSelector *csel, GtkObject *o
   fill-column:99
   End:
 */
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :