Code

r11516@tres: ted | 2006-04-26 21:30:18 -0700
[inkscape.git] / src / dyna-draw-context.cpp
index 96882f3f3e24c05cb2181b61778d8be994ce357c..05e4450866eeaafa8317637b882897de97ecfc22 100644 (file)
@@ -47,7 +47,6 @@
 #include "sp-item.h"
 
 #define DDC_RED_RGBA 0xff0000ff
-#define DDC_GREEN_RGBA 0x000000ff
 
 #define SAMPLE_TIMEOUT 10
 #define TOLERANCE_LINE 1.0
@@ -145,10 +144,7 @@ sp_dyna_draw_context_init(SPDynaDrawContext *ddc)
     ddc->del = NR::Point(0,0);
 
     /* attributes */
-    ddc->use_timeout = FALSE;
-    ddc->timer_id = 0;
     ddc->dragging = FALSE;
-    ddc->dynahand = FALSE;
 
     ddc->mass = 0.3;
     ddc->drag = DRAG_DEFAULT;
@@ -157,6 +153,8 @@ sp_dyna_draw_context_init(SPDynaDrawContext *ddc)
 
     ddc->vel_thin = 0.1;
     ddc->flatness = 0.9;
+
+    ddc->abs_width = false;
 }
 
 static void
@@ -203,7 +201,7 @@ sp_dyna_draw_context_setup(SPEventContext *ec)
     ddc->cal1 = sp_curve_new_sized(32);
     ddc->cal2 = sp_curve_new_sized(32);
 
-    ddc->currentshape = sp_canvas_item_new(SP_DT_SKETCH(ec->desktop), SP_TYPE_CANVAS_BPATH, NULL);
+    ddc->currentshape = sp_canvas_item_new(sp_desktop_sketch(ec->desktop), SP_TYPE_CANVAS_BPATH, NULL);
     sp_canvas_bpath_set_fill(SP_CANVAS_BPATH(ddc->currentshape), DDC_RED_RGBA, SP_WIND_RULE_EVENODD);
     sp_canvas_bpath_set_stroke(SP_CANVAS_BPATH(ddc->currentshape), 0x00000000, 1.0, SP_STROKE_LINEJOIN_MITER, SP_STROKE_LINECAP_BUTT);
     /* fixme: Cannot we cascade it to root more clearly? */
@@ -218,6 +216,7 @@ sp_dyna_draw_context_setup(SPEventContext *ec)
     sp_event_context_read(ec, "flatness");
     sp_event_context_read(ec, "usepressure");
     sp_event_context_read(ec, "usetilt");
+    sp_event_context_read(ec, "abs_width");
 
     ddc->is_drawing = false;
 
@@ -254,6 +253,8 @@ sp_dyna_draw_context_set(SPEventContext *ec, gchar const *key, gchar const *val)
         ddc->usepressure = (val && strcmp(val, "0"));
     } else if (!strcmp(key, "usetilt")) {
         ddc->usetilt = (val && strcmp(val, "0"));
+    } else if (!strcmp(key, "abs_width")) {
+        ddc->abs_width = (val && strcmp(val, "0"));
     }
 
     //g_print("DDC: %g %g %g %g\n", ddc->mass, ddc->drag, ddc->angle, ddc->width);
@@ -430,42 +431,22 @@ sp_dyna_draw_brush(SPDynaDrawContext *dc)
         width = 0.02 * dc->width;
     }
 
-    NR::Point del_left = 0.05 * (width + tremble_left) * dc->ang;
-    NR::Point del_right = 0.05 * (width + tremble_right) * dc->ang;
-
-    dc->point1[dc->npoints] = sp_dyna_draw_get_vpoint(dc, dc->cur + del_left);
-    dc->point2[dc->npoints] = sp_dyna_draw_get_vpoint(dc, dc->cur - del_right);
-
-    dc->del = 0.5*(del_left + del_right);
-
-    dc->npoints++;
-}
+    double dezoomify_factor = 0.05 * 1000;
+    if (!dc->abs_width) {
+        dezoomify_factor /= SP_EVENT_CONTEXT(dc)->desktop->current_zoom();
+    }
 
-static gint
-sp_dyna_draw_timeout_handler(gpointer data)
-{
-    SPDynaDrawContext *dc = SP_DYNA_DRAW_CONTEXT(data);
-    SPDesktop *desktop = SP_EVENT_CONTEXT(dc)->desktop;
-    SPCanvas *canvas = SP_CANVAS(SP_DT_CANVAS(desktop));
+    NR::Point del_left = dezoomify_factor * (width + tremble_left) * dc->ang;
+    NR::Point del_right = dezoomify_factor * (width + tremble_right) * dc->ang;
 
-    dc->dragging = TRUE;
-    dc->dynahand = TRUE;
+    NR::Point abs_middle = sp_dyna_draw_get_vpoint(dc, dc->cur);
 
-    int x, y;
-    gtk_widget_get_pointer(GTK_WIDGET(canvas), &x, &y);
-    NR::Point p = sp_canvas_window_to_world(canvas, NR::Point(x, y));
-    p = desktop->w2d(p);
-    if (! sp_dyna_draw_apply(dc, p)) {
-        return TRUE;
-    }
+    dc->point1[dc->npoints] = abs_middle + del_left;
+    dc->point2[dc->npoints] = abs_middle - del_right;
 
-    if ( dc->cur != dc->last ) {
-        sp_dyna_draw_brush(dc);
-        g_assert( dc->npoints > 0 );
-        fit_and_split(dc, FALSE);
-    }
+    dc->del = 0.5*(del_left + del_right);
 
-    return TRUE;
+    dc->npoints++;
 }
 
 void
@@ -508,29 +489,21 @@ sp_dyna_draw_context_root_handler(SPEventContext *event_context,
             dc->npoints = 0;
 
             sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate),
-                                ( dc->use_timeout
-                                  ? ( GDK_KEY_PRESS_MASK |
-                                      GDK_BUTTON_RELEASE_MASK |
-                                      GDK_BUTTON_PRESS_MASK    )
-                                  : ( GDK_KEY_PRESS_MASK |
-                                      GDK_BUTTON_RELEASE_MASK |
-                                      GDK_POINTER_MOTION_MASK |
-                                      GDK_BUTTON_PRESS_MASK    ) ),
+                                ( GDK_KEY_PRESS_MASK |
+                                  GDK_BUTTON_RELEASE_MASK |
+                                  GDK_POINTER_MOTION_MASK |
+                                  GDK_BUTTON_PRESS_MASK ),
                                 NULL,
                                 event->button.time);
 
-            if ( dc->use_timeout && !dc->timer_id ) {
-                dc->timer_id = gtk_timeout_add(SAMPLE_TIMEOUT, sp_dyna_draw_timeout_handler, dc);
-            }
             ret = TRUE;
 
             dc->is_drawing = true;
         }
         break;
     case GDK_MOTION_NOTIFY:
-        if ( dc->is_drawing && !dc->use_timeout && ( event->motion.state & GDK_BUTTON1_MASK ) ) {
+        if ( dc->is_drawing && ( event->motion.state & GDK_BUTTON1_MASK ) ) {
             dc->dragging = TRUE;
-            dc->dynahand = TRUE;
 
             NR::Point const motion_w(event->motion.x,
                                      event->motion.y);
@@ -554,34 +527,23 @@ sp_dyna_draw_context_root_handler(SPEventContext *event_context,
     case GDK_BUTTON_RELEASE:
         sp_canvas_item_ungrab(SP_CANVAS_ITEM(desktop->acetate), event->button.time);
         dc->is_drawing = false;
-        if ( event->button.button == 1
-             && dc->use_timeout
-             && dc->timer_id != 0 )
-        {
-            gtk_timeout_remove(dc->timer_id);
-            dc->timer_id = 0;
-        }
         if ( dc->dragging && event->button.button == 1 ) {
             dc->dragging = FALSE;
 
-            /* release */
-            if (dc->dynahand) {
-                dc->dynahand = FALSE;
-                /* Remove all temporary line segments */
-                while (dc->segments) {
-                    gtk_object_destroy(GTK_OBJECT(dc->segments->data));
-                    dc->segments = g_slist_remove(dc->segments, dc->segments->data);
-                }
-                /* Create object */
-                fit_and_split(dc, TRUE);
-                accumulate_calligraphic(dc);
-                set_to_accumulated(dc); /* temporal implementation */
-                /* reset accumulated curve */
-                sp_curve_reset(dc->accumulated);
-                clear_current(dc);
-                if (dc->repr) {
-                    dc->repr = NULL;
-                }
+            /* Remove all temporary line segments */
+            while (dc->segments) {
+                gtk_object_destroy(GTK_OBJECT(dc->segments->data));
+                dc->segments = g_slist_remove(dc->segments, dc->segments->data);
+            }
+            /* Create object */
+            fit_and_split(dc, TRUE);
+            accumulate_calligraphic(dc);
+            set_to_accumulated(dc); /* temporal implementation */
+            /* reset accumulated curve */
+            sp_curve_reset(dc->accumulated);
+            clear_current(dc);
+            if (dc->repr) {
+                dc->repr = NULL;
             }
             ret = TRUE;
         }
@@ -614,7 +576,7 @@ sp_dyna_draw_context_root_handler(SPEventContext *event_context,
                 dc->width += 0.01;
                 if (dc->width > 1.0)
                     dc->width = 1.0;
-                sp_ddc_update_toolbox (desktop, "altx-calligraphy", dc->width); // the same spinbutton is for alt+x
+                sp_ddc_update_toolbox (desktop, "altx-calligraphy", dc->width * 100); // the same spinbutton is for alt+x
                 ret = TRUE;
             }
             break;
@@ -624,7 +586,7 @@ sp_dyna_draw_context_root_handler(SPEventContext *event_context,
                 dc->width -= 0.01;
                 if (dc->width < 0.01)
                     dc->width = 0.01;
-                sp_ddc_update_toolbox (desktop, "altx-calligraphy", dc->width);
+                sp_ddc_update_toolbox (desktop, "altx-calligraphy", dc->width * 100);
                 ret = TRUE;
             }
             break;
@@ -636,7 +598,7 @@ sp_dyna_draw_context_root_handler(SPEventContext *event_context,
             }
             break;
         case GDK_Escape:
-            SP_DT_SELECTION(desktop)->clear();
+            sp_desktop_selection(desktop)->clear();
             break;
 
         default:
@@ -691,7 +653,7 @@ set_to_accumulated(SPDynaDrawContext *dc)
             Inkscape::GC::release(dc->repr);
             item->transform = SP_ITEM(desktop->currentRoot())->getRelativeTransform(desktop->currentLayer());
             item->updateRepr();
-            SP_DT_SELECTION(desktop)->set(dc->repr);
+            sp_desktop_selection(desktop)->set(dc->repr);
         }
         abp = nr_artpath_affine(sp_curve_first_bpath(dc->accumulated), sp_desktop_dt2root_affine(desktop));
         str = sp_svg_write_path(abp);
@@ -706,7 +668,7 @@ set_to_accumulated(SPDynaDrawContext *dc)
         dc->repr = NULL;
     }
 
-    sp_document_done(SP_DT_DOCUMENT(desktop));
+    sp_document_done(sp_desktop_document(desktop));
 }
 
 static void
@@ -832,7 +794,7 @@ fit_and_split_calligraphics(SPDynaDrawContext *dc, gboolean release)
         if (!release) {
             g_assert(!sp_curve_empty(dc->currentcurve));
 
-            SPCanvasItem *cbp = sp_canvas_item_new(SP_DT_SKETCH(SP_EVENT_CONTEXT(dc)->desktop),
+            SPCanvasItem *cbp = sp_canvas_item_new(sp_desktop_sketch(SP_EVENT_CONTEXT(dc)->desktop),
                                                    SP_TYPE_CANVAS_BPATH,
                                                    NULL);
             SPCurve *curve = sp_curve_copy(dc->currentcurve);