Code

Moved compass like display of angles from windows to steps in preferences
[inkscape.git] / src / ui / widget / selected-style.cpp
index 8a5aa1f46b329ddfb1ced1bfd9ad9ec98ebb4ce2..44d8232e0d24ecb4c17b308ff1320173e9faf99e 100644 (file)
@@ -32,7 +32,7 @@
 #include "document.h"
 #include "widgets/widget-sizes.h"
 #include "widgets/spinbutton-events.h"
-#include "svg/svg.h"
+#include "svg/svg-color.h"
 #include "svg/css-ostringstream.h"
 #include "helper/units.h"
 
@@ -111,8 +111,8 @@ SelectedStyle::SelectedStyle(bool layout)
 
       _tooltips (),
 
-      _dropF(0),
-      _dropS(0)
+      _drop((void*[]){0,0}),
+      _dropEnabled((bool[]){false, false})
 {
     _fill_label.set_alignment(0.0, 0.5);
     _fill_label.set_padding(0, 0);
@@ -331,35 +331,23 @@ SelectedStyle::SelectedStyle(bool layout)
     sp_set_font_size_smaller (GTK_WIDGET(_fill_label.gobj()));
     sp_set_font_size_smaller (GTK_WIDGET(_stroke_label.gobj()));
 
-    _dropF = new DropTracker();
-    ((DropTracker*)_dropF)->parent = this;
-    ((DropTracker*)_dropF)->item = SS_FILL;
+    _drop[SS_FILL] = new DropTracker();
+    ((DropTracker*)_drop[SS_FILL])->parent = this;
+    ((DropTracker*)_drop[SS_FILL])->item = SS_FILL;
 
-    _dropS = new DropTracker();
-    ((DropTracker*)_dropS)->parent = this;
-    ((DropTracker*)_dropS)->item = SS_STROKE;
+    _drop[SS_STROKE] = new DropTracker();
+    ((DropTracker*)_drop[SS_STROKE])->parent = this;
+    ((DropTracker*)_drop[SS_STROKE])->item = SS_STROKE;
 
-    {
-        gtk_drag_dest_set(GTK_WIDGET(_stroke_place.gobj()),
-                          GTK_DEST_DEFAULT_ALL,
-                          ui_drop_target_entries,
-                          nui_drop_target_entries,
-                          GdkDragAction(GDK_ACTION_COPY | GDK_ACTION_MOVE));
-        g_signal_connect(_stroke_place.gobj(),
-                         "drag_data_received",
-                         G_CALLBACK(dragDataReceived),
-                         _dropS);
-
-        gtk_drag_dest_set(GTK_WIDGET(_fill_place.gobj()),
-                          GTK_DEST_DEFAULT_ALL,
-                          ui_drop_target_entries,
-                          nui_drop_target_entries,
-                          GdkDragAction(GDK_ACTION_COPY | GDK_ACTION_MOVE));
-        g_signal_connect(_fill_place.gobj(),
-                         "drag_data_received",
-                         G_CALLBACK(dragDataReceived),
-                         _dropF);
-    }
+    g_signal_connect(_stroke_place.gobj(),
+                     "drag_data_received",
+                     G_CALLBACK(dragDataReceived),
+                     _drop[SS_STROKE]);
+
+    g_signal_connect(_fill_place.gobj(),
+                     "drag_data_received",
+                     G_CALLBACK(dragDataReceived),
+                     _drop[SS_FILL]);
 }
 
 SelectedStyle::~SelectedStyle()
@@ -375,8 +363,8 @@ SelectedStyle::~SelectedStyle()
         delete _color_preview[i];
     }
 
-    delete (DropTracker*)_dropF;
-    delete (DropTracker*)_dropS;
+    delete (DropTracker*)_drop[SS_FILL];
+    delete (DropTracker*)_drop[SS_STROKE];
 }
 
 void
@@ -385,7 +373,7 @@ SelectedStyle::setDesktop(SPDesktop *desktop)
     _desktop = desktop;
     gtk_object_set_data (GTK_OBJECT(_opacity_sb.gobj()), "dtw", _desktop->canvas);
 
-    Inkscape::Selection *selection = SP_DT_SELECTION (desktop);
+    Inkscape::Selection *selection = sp_desktop_selection (desktop);
 
     selection_changed_connection = new sigc::connection (selection->connectChanged(
         sigc::bind (
@@ -403,7 +391,7 @@ SelectedStyle::setDesktop(SPDesktop *desktop)
             this )
     ));
 
-    //_sw_unit = (SPUnit *) SP_DT_NAMEDVIEW(desktop)->doc_units;
+    //_sw_unit = (SPUnit *) sp_desktop_namedview(desktop)->doc_units;
 }
 
 void SelectedStyle::dragDataReceived( GtkWidget *widget,
@@ -436,7 +424,7 @@ void SelectedStyle::dragDataReceived( GtkWidget *widget,
                 sp_repr_css_set_property( css, (tracker->item == SS_FILL) ? "fill":"stroke", c );
                 sp_desktop_set_style( tracker->parent->_desktop, css );
                 sp_repr_css_attr_unref( css );
-                sp_document_done( SP_DT_DOCUMENT(tracker->parent->_desktop) );
+                sp_document_done( sp_desktop_document(tracker->parent->_desktop) );
             }
         }
         break;
@@ -446,33 +434,33 @@ void SelectedStyle::dragDataReceived( GtkWidget *widget,
 void SelectedStyle::on_fill_remove() {
     SPCSSAttr *css = sp_repr_css_attr_new ();
     sp_repr_css_set_property (css, "fill", "none");
-    sp_desktop_set_style (_desktop, css, true, false); // do not write to current, to preserve current color
+    sp_desktop_set_style (_desktop, css, true, true); 
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_stroke_remove() {
     SPCSSAttr *css = sp_repr_css_attr_new ();
     sp_repr_css_set_property (css, "stroke", "none");
-    sp_desktop_set_style (_desktop, css, true, false); // do not write to current, to preserve current color
+    sp_desktop_set_style (_desktop, css, true, true); 
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_fill_unset() {
     SPCSSAttr *css = sp_repr_css_attr_new ();
     sp_repr_css_unset_property (css, "fill");
-    sp_desktop_set_style (_desktop, css, true, false); // do not write to current, to preserve current color
+    sp_desktop_set_style (_desktop, css, true, true); 
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_stroke_unset() {
     SPCSSAttr *css = sp_repr_css_attr_new ();
     sp_repr_css_unset_property (css, "stroke");
-    sp_desktop_set_style (_desktop, css, true, false); // do not write to current, to preserve current color
+    sp_desktop_set_style (_desktop, css, true, true);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_fill_opaque() {
@@ -480,7 +468,7 @@ void SelectedStyle::on_fill_opaque() {
     sp_repr_css_set_property (css, "fill-opacity", "1");
     sp_desktop_set_style (_desktop, css, true);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_stroke_opaque() {
@@ -488,7 +476,7 @@ void SelectedStyle::on_stroke_opaque() {
     sp_repr_css_set_property (css, "stroke-opacity", "1");
     sp_desktop_set_style (_desktop, css, true);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_fill_lastused() {
@@ -499,7 +487,7 @@ void SelectedStyle::on_fill_lastused() {
     sp_repr_css_set_property (css, "fill", c);
     sp_desktop_set_style (_desktop, css);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_stroke_lastused() {
@@ -510,7 +498,7 @@ void SelectedStyle::on_stroke_lastused() {
     sp_repr_css_set_property (css, "stroke", c);
     sp_desktop_set_style (_desktop, css);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_fill_lastselected() {
@@ -520,7 +508,7 @@ void SelectedStyle::on_fill_lastselected() {
     sp_repr_css_set_property (css, "fill", c);
     sp_desktop_set_style (_desktop, css);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_stroke_lastselected() {
@@ -530,7 +518,7 @@ void SelectedStyle::on_stroke_lastselected() {
     sp_repr_css_set_property (css, "stroke", c);
     sp_desktop_set_style (_desktop, css);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_fill_invert() {
@@ -549,7 +537,7 @@ void SelectedStyle::on_fill_invert() {
     sp_repr_css_set_property (css, "fill", c);
     sp_desktop_set_style (_desktop, css);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_stroke_invert() {
@@ -568,7 +556,7 @@ void SelectedStyle::on_stroke_invert() {
     sp_repr_css_set_property (css, "stroke", c);
     sp_desktop_set_style (_desktop, css);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 } 
 
 void SelectedStyle::on_fill_white() {
@@ -579,7 +567,7 @@ void SelectedStyle::on_fill_white() {
     sp_repr_css_set_property (css, "fill-opacity", "1");
     sp_desktop_set_style (_desktop, css);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_stroke_white() {
@@ -590,7 +578,7 @@ void SelectedStyle::on_stroke_white() {
     sp_repr_css_set_property (css, "stroke-opacity", "1");
     sp_desktop_set_style (_desktop, css);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_fill_black() {
@@ -601,7 +589,7 @@ void SelectedStyle::on_fill_black() {
     sp_repr_css_set_property (css, "fill-opacity", "1.0");
     sp_desktop_set_style (_desktop, css);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_stroke_black() {
@@ -612,7 +600,7 @@ void SelectedStyle::on_stroke_black() {
     sp_repr_css_set_property (css, "stroke-opacity", "1.0");
     sp_desktop_set_style (_desktop, css);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_fill_copy() {
@@ -654,7 +642,7 @@ void SelectedStyle::on_fill_paste() {
         sp_repr_css_set_property (css, "fill", text.c_str());
         sp_desktop_set_style (_desktop, css);
         sp_repr_css_attr_unref (css);
-        sp_document_done (SP_DT_DOCUMENT(_desktop));
+        sp_document_done (sp_desktop_document(_desktop));
     }
 }
 
@@ -671,13 +659,15 @@ void SelectedStyle::on_stroke_paste() {
         sp_repr_css_set_property (css, "stroke", text.c_str());
         sp_desktop_set_style (_desktop, css);
         sp_repr_css_attr_unref (css);
-        sp_document_done (SP_DT_DOCUMENT(_desktop));
+        sp_document_done (sp_desktop_document(_desktop));
     }
 }
 
 void SelectedStyle::on_fillstroke_swap() {
     SPCSSAttr *css = sp_repr_css_attr_new ();
 
+    g_message("on_fillstroke_swap()");
+
     switch (_mode[SS_FILL]) {
     case SS_NA:
     case SS_MANY:
@@ -724,7 +714,7 @@ void SelectedStyle::on_fillstroke_swap() {
 
     sp_desktop_set_style (_desktop, css);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void SelectedStyle::on_fill_edit() {
@@ -791,7 +781,7 @@ SelectedStyle::on_opacity_click(GdkEventButton *event)
         sp_repr_css_set_property (css, "opacity", opacity);
         sp_desktop_set_style (_desktop, css);
         sp_repr_css_attr_unref (css);
-        sp_document_done (SP_DT_DOCUMENT (_desktop));
+        sp_document_done (sp_desktop_document (_desktop));
         return true;
     }
 
@@ -824,7 +814,7 @@ void SelectedStyle::on_popup_preset(int i) {
     sp_repr_css_set_property (css, "stroke-width", os.str().c_str());
     sp_desktop_set_style (_desktop, css, true);
     sp_repr_css_attr_unref (css);
-    sp_document_done (SP_DT_DOCUMENT(_desktop));
+    sp_document_done (sp_desktop_document(_desktop));
 }
 
 void
@@ -859,10 +849,22 @@ SelectedStyle::update()
             place->add(_na[i]);
             _tooltips.set_tip(*place, __na[i]);
             _mode[i] = SS_NA;
+            if ( _dropEnabled[i] ) {
+                gtk_drag_dest_unset( GTK_WIDGET((i==SS_FILL) ? _fill_place.gobj():_stroke_place.gobj()) );
+                _dropEnabled[i] = false;
+            }
             break;
         case QUERY_STYLE_SINGLE:
         case QUERY_STYLE_MULTIPLE_AVERAGED:
         case QUERY_STYLE_MULTIPLE_SAME: 
+            if ( !_dropEnabled[i] ) {
+                gtk_drag_dest_set( GTK_WIDGET( (i==SS_FILL) ? _fill_place.gobj():_stroke_place.gobj()),
+                                   GTK_DEST_DEFAULT_ALL,
+                                   ui_drop_target_entries,
+                                   nui_drop_target_entries,
+                                   GdkDragAction(GDK_ACTION_COPY | GDK_ACTION_MOVE) );
+                _dropEnabled[i] = true;
+            }
             SPIPaint *paint;
             if (i == SS_FILL) {
                 paint = &(query->fill);
@@ -885,24 +887,27 @@ SelectedStyle::update()
 
             } else if (paint->set && paint->type == SP_PAINT_TYPE_PAINTSERVER) {
                 SPPaintServer *server = (i == SS_FILL)? SP_STYLE_FILL_SERVER (query) : SP_STYLE_STROKE_SERVER (query);
-
-                Inkscape::XML::Node *srepr = SP_OBJECT_REPR(server);
-                _paintserver_id[i] += "url(#";
-                _paintserver_id[i] += srepr->attribute("id");
-                _paintserver_id[i] += ")";
-
-                if (SP_IS_LINEARGRADIENT (server)) {
-                    place->add(_lgradient[i]);
-                    _tooltips.set_tip(*place, __lgradient[i]);
-                    _mode[i] = SS_LGRADIENT;
-                } else if (SP_IS_RADIALGRADIENT (server)) {
-                    place->add(_rgradient[i]);
-                    _tooltips.set_tip(*place, __rgradient[i]);
-                    _mode[i] = SS_RGRADIENT;
-                } else if (SP_IS_PATTERN (server)) {
-                    place->add(_pattern[i]);
-                    _tooltips.set_tip(*place, __pattern[i]);
-                    _mode[i] = SS_PATTERN;
+                if ( server ) {
+                    Inkscape::XML::Node *srepr = SP_OBJECT_REPR(server);
+                    _paintserver_id[i] += "url(#";
+                    _paintserver_id[i] += srepr->attribute("id");
+                    _paintserver_id[i] += ")";
+
+                    if (SP_IS_LINEARGRADIENT (server)) {
+                        place->add(_lgradient[i]);
+                        _tooltips.set_tip(*place, __lgradient[i]);
+                        _mode[i] = SS_LGRADIENT;
+                    } else if (SP_IS_RADIALGRADIENT (server)) {
+                        place->add(_rgradient[i]);
+                        _tooltips.set_tip(*place, __rgradient[i]);
+                        _mode[i] = SS_RGRADIENT;
+                    } else if (SP_IS_PATTERN (server)) {
+                        place->add(_pattern[i]);
+                        _tooltips.set_tip(*place, __pattern[i]);
+                        _mode[i] = SS_PATTERN;
+                    }
+                } else {
+                    g_warning ("file %s: line %d: Unknown paint server", __FILE__, __LINE__);
                 }
 
             } else if (paint->set && paint->type == SP_PAINT_TYPE_NONE) {
@@ -1049,7 +1054,7 @@ void SelectedStyle::on_opacity_changed () {
     sp_repr_css_set_property (css, "opacity", os.str().c_str());
     sp_desktop_set_style (_desktop, css);
     sp_repr_css_attr_unref (css);
-    sp_document_maybe_done (SP_DT_DOCUMENT (_desktop), "fillstroke:opacity");
+    sp_document_maybe_done (sp_desktop_document (_desktop), "fillstroke:opacity");
     spinbutton_defocus(GTK_OBJECT(_opacity_sb.gobj()));
     _opacity_blocked = false;
 }