Use the name of each action's class is its internal name. This makes it easier to...
[synfig.git] / synfig-studio / trunk / src / gtkmm / state_width.cpp
index d9d7697..1c7ef4f 100644 (file)
@@ -1,11 +1,12 @@
 /* === S Y N F I G ========================================================= */
-/*!    \file state_gradient.cpp
+/*!    \file state_width.cpp
 **     \brief Template File
 **
-**     $Id: state_width.cpp,v 1.1.1.1 2005/01/07 03:34:37 darco Exp $
+**     $Id$
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**  Copyright (c) 2008 Chris Moore
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -55,6 +56,8 @@
 
 #include <ETL/clock>
 
+#include "general.h"
+
 #endif
 
 /* === U S I N G =========================================================== */
@@ -77,56 +80,54 @@ class studio::StateWidth_Context : public sigc::trackable
 {
        etl::handle<CanvasView> canvas_view_;
        CanvasView::IsWorking is_working;
-       
+
        //Point mouse_pos;
-       
+
        handle<Duck> center;
        handle<Duck> radius;
        handle<Duck> closestpoint;
-       
+
        map<handle<Duck>,Real>  changetable;
-       
+
        etl::clock      clocktime;
        Real            lastt;
-       
+
        bool added;
 
        void refresh_ducks();
-       
+
        bool prev_workarea_layer_clicking;
        bool prev_workarea_duck_clicking;
        Duckmatic::Type old_duckmask;
-               
+
        //Toolbox settings
        synfigapp::Settings& settings;
-       
+
        //Toolbox display
        Gtk::Table options_table;
-       
-       //Gtk::Entry            entry_id; //what to name the layer
-               
+
        Gtk::Adjustment adj_delta;
        Gtk::SpinButton spin_delta;
-       
+
        Gtk::Adjustment adj_radius;
        Gtk::SpinButton spin_radius;
-       
+
        Gtk::CheckButton check_relative;
-               
+
        void AdjustWidth(handle<Duckmatic::Bezier> c, float t, Real mult, bool invert);
-       
+
 public:
 
        Real get_delta()const { return adj_delta.get_value(); }
        void set_delta(Real f) { adj_delta.set_value(f); }
-       
+
        Real get_radius()const { return adj_radius.get_value(); }
        void set_radius(Real f) { adj_radius.set_value(f); }
-       
+
        bool get_relative() const { return check_relative.get_active(); }
        void set_relative(bool r) { check_relative.set_active(r); }
-       
-       void refresh_tool_options(); //to refresh the toolbox   
+
+       void refresh_tool_options(); //to refresh the toolbox
 
        //events
        Smach::event_result event_stop_handler(const Smach::event& x);
@@ -143,13 +144,13 @@ public:
        etl::handle<synfigapp::CanvasInterface> get_canvas_interface()const{return canvas_view_->canvas_interface();}
        synfig::Canvas::Handle get_canvas()const{return canvas_view_->get_canvas();}
        WorkArea * get_work_area()const{return canvas_view_->get_work_area();}
-       
+
        //Modifying settings etc.
        void load_settings();
        void save_settings();
        void reset();
-       
-};     // END of class StateGradient_Context
+
+};     // END of class StateWidth_Context
 
 /* === M E T H O D S ======================================================= */
 
@@ -170,30 +171,30 @@ StateWidth::~StateWidth()
 
 void
 StateWidth_Context::load_settings()
-{      
+{
        String value;
-       
+
        //parse the arguments yargh!
        if(settings.get_value("width.delta",value))
                set_delta(atof(value.c_str()));
        else
                set_delta(6);
-       
+
        if(settings.get_value("width.radius",value))
                set_radius(atof(value.c_str()));
        else
                set_radius(15);
-       
-       //defaults to true
-       if(settings.get_value("width.relative",value) && value == "0")
-               set_relative(false);
-       else
+
+       //defaults to false
+       if(settings.get_value("width.relative",value) && value == "1")
                set_relative(true);
+       else
+               set_relative(false);
 }
 
 void
 StateWidth_Context::save_settings()
-{      
+{
        settings.set_value("width.delta",strprintf("%f",get_delta()));
        settings.set_value("width.radius",strprintf("%f",get_radius()));
        settings.set_value("width.relative",get_relative()?"1":"0");
@@ -208,52 +209,51 @@ StateWidth_Context::reset()
 StateWidth_Context::StateWidth_Context(CanvasView* canvas_view):
        canvas_view_(canvas_view),
        is_working(*canvas_view),
-       prev_workarea_layer_clicking(get_work_area()->allow_layer_clicks),
-       prev_workarea_duck_clicking(get_work_area()->allow_duck_clicks),
+       prev_workarea_layer_clicking(get_work_area()->get_allow_layer_clicks()),
+       prev_workarea_duck_clicking(get_work_area()->get_allow_duck_clicks()),
        old_duckmask(get_work_area()->get_type_mask()),
 
        settings(synfigapp::Main::get_selected_input_device()->settings()),
-       
-       adj_delta(6,0,1,0.001,0.01),
+
+       adj_delta(6,0,20,0.01,0.1),
        spin_delta(adj_delta,0.01,3),
-       
-       adj_radius(0,0,1e50,1,10),
+
+       adj_radius(200,0,1e50,1,10),
        spin_radius(adj_radius,1,1),
 
        check_relative(_("Relative Growth"))
 {
        load_settings();
-       
+
        // Set up the tool options dialog
-       //options_table.attach(*manage(new Gtk::Label(_("Width Tool"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);       
-       //options_table.attach(entry_id, 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+       options_table.attach(*manage(new Gtk::Label(_("Width Tool"))),  0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
 
        //expand stuff
-       options_table.attach(*manage(new Gtk::Label(_("Growth:"))), 0, 1, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
-       options_table.attach(spin_delta, 1, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
-       
-       options_table.attach(*manage(new Gtk::Label(_("Radius:"))), 0, 1, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
-       options_table.attach(spin_radius, 1, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
-       
-       options_table.attach(check_relative, 0, 2, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
-                       
+       options_table.attach(*manage(new Gtk::Label(_("Growth:"))),             0, 1, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+       options_table.attach(spin_delta,                                                                1, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+
+       options_table.attach(*manage(new Gtk::Label(_("Radius:"))),             0, 1, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+       options_table.attach(spin_radius,                                                               1, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+
+       options_table.attach(check_relative,                                                    0, 2, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+
        options_table.show_all();
-       
+
        refresh_tool_options();
        App::dialog_tool_options->present();
 
        // Turn off layer clicking
-       get_work_area()->allow_layer_clicks=false;
-       
+       get_work_area()->set_allow_layer_clicks(false);
+
        // clear out the ducks
        //get_work_area()->clear_ducks();
-       
+
        // Refresh the work area
        get_work_area()->queue_draw();
-       
+
        //Create the new ducks
        added = false;
-       
+
        if(!center)
        {
                center = new Duck();
@@ -269,16 +269,16 @@ StateWidth_Context::StateWidth_Context(CanvasView* canvas_view):
                radius->set_type(Duck::TYPE_RADIUS);
                radius->set_name("radius");
        }
-               
+
        if(!closestpoint)
        {
                closestpoint = new Duck();
                closestpoint->set_name("closest");
                closestpoint->set_type(Duck::TYPE_POSITION);
        }
-       
+
        //Disable duck clicking for the maximum coolness :)
-       get_work_area()->allow_duck_clicks = false;
+       get_work_area()->set_allow_duck_clicks(false);
        get_work_area()->set_type_mask((Duck::Type)((int)Duck::TYPE_WIDTH + (int)Duck::TYPE_RADIUS));
 
        // Turn the mouse pointer to crosshairs
@@ -287,10 +287,10 @@ StateWidth_Context::StateWidth_Context(CanvasView* canvas_view):
        // Hide the tables if they are showing
        //prev_table_status=get_canvas_view()->tables_are_visible();
        //if(prev_table_status)get_canvas_view()->hide_tables();
-               
-       // Hide the time bar
-       //get_canvas_view()->hide_timebar();
-       
+
+       // Disable the time bar
+       //get_canvas_view()->set_sensitive_timebar(false);
+
        // Connect a signal
        //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateWidth_Context::on_user_click));
 
@@ -307,7 +307,7 @@ StateWidth_Context::refresh_tool_options()
 }
 
 Smach::event_result
-StateWidth_Context::event_refresh_tool_options(const Smach::event& x)
+StateWidth_Context::event_refresh_tool_options(const Smach::event& /*x*/)
 {
        refresh_tool_options();
        return Smach::RESULT_ACCEPT;
@@ -316,7 +316,7 @@ StateWidth_Context::event_refresh_tool_options(const Smach::event& x)
 StateWidth_Context::~StateWidth_Context()
 {
        save_settings();
-       
+
        //remove ducks if need be
        if(added)
        {
@@ -325,29 +325,28 @@ StateWidth_Context::~StateWidth_Context()
                get_work_area()->erase_duck(closestpoint);
                added = false;
        }
-       
+
        // Restore Duck clicking
-       get_work_area()->allow_duck_clicks = prev_workarea_duck_clicking;
+       get_work_area()->set_allow_duck_clicks(prev_workarea_duck_clicking);
 
        // Restore layer clicking
-       get_work_area()->allow_layer_clicks = prev_workarea_layer_clicking;
+       get_work_area()->set_allow_layer_clicks(prev_workarea_layer_clicking);
 
        // Restore the mouse pointer
        get_work_area()->reset_cursor();
-       
+
        // Restore duck masking
        get_work_area()->set_type_mask(old_duckmask);
 
        // Tool options be rid of ye!!
        App::dialog_tool_options->clear();
 
-       // Show the time bar
-       if(get_canvas_view()->get_canvas()->rend_desc().get_time_start()!=get_canvas_view()->get_canvas()->rend_desc().get_time_end())
-               get_canvas_view()->show_timebar();
+       // Enable the time bar
+       //get_canvas_view()->set_sensitive_timebar(true);
 
        // Bring back the tables if they were out before
        //if(prev_table_status)get_canvas_view()->show_tables();
-                       
+
        // Refresh the work area
        get_work_area()->queue_draw();
 
@@ -355,36 +354,36 @@ StateWidth_Context::~StateWidth_Context()
 }
 
 Smach::event_result
-StateWidth_Context::event_stop_handler(const Smach::event& x)
+StateWidth_Context::event_stop_handler(const Smach::event& /*x*/)
 {
        throw Smach::egress_exception();
 }
 
 Smach::event_result
-StateWidth_Context::event_refresh_handler(const Smach::event& x)
+StateWidth_Context::event_refresh_handler(const Smach::event& /*x*/)
 {
        refresh_ducks();
        return Smach::RESULT_ACCEPT;
 }
 
-void 
+void
 StateWidth_Context::AdjustWidth(handle<Duckmatic::Bezier> c, float t, Real mult, bool invert)
 {
        //Leave the function if there is no curve
        if(!c)return;
-       
+
        Real amount1=0,amount2=0;
-       
+
        //decide how much to change each width
        /*
        t \in [0,1]
-       
+
        both pressure and multiply amount are in mult
                (may want to change this to allow different types of falloff)
-       
+
        rsq is the squared distance from the point on the curve (also part of the falloff)
-       
-               
+
+
        */
        //may want to provide a different falloff function...
        if(t <= 0.2)
@@ -397,24 +396,24 @@ StateWidth_Context::AdjustWidth(handle<Duckmatic::Bezier> c, float t, Real mult,
                amount1 = (1-t)*mult;
                amount2 = t*mult;
        }
-       
+
        if(invert)
        {
                amount1 *= -1;
                amount2 *= -1;
        }
-       
+
        handle<Duck>    p1 = c->p1;
        handle<Duck>    p2 = c->p2;
-       
+
        handle<Duck>    w1,w2;
-       
+
        //find w1,w2
        {
                const DuckList dl = get_work_area()->get_duck_list();
-               
+
                DuckList::const_iterator i = dl.begin();
-               
+
                for(;i != dl.end(); ++i)
                {
                        if((*i)->get_type() == Duck::TYPE_WIDTH)
@@ -423,7 +422,7 @@ StateWidth_Context::AdjustWidth(handle<Duckmatic::Bezier> c, float t, Real mult,
                                {
                                        w1 = *i;
                                }
-                               
+
                                if((*i)->get_origin_duck() == p2)
                                {
                                        w2 = *i;
@@ -431,26 +430,26 @@ StateWidth_Context::AdjustWidth(handle<Duckmatic::Bezier> c, float t, Real mult,
                        }
                }
        }
-       
+
        if(amount1 != 0 && w1)
        {
                Real width = w1->get_point().mag();
-               
+
                width += amount1;
                w1->set_point(Vector(width,0));
-               
+
                //log in the list of changes...
                //to truly be changed after everything is said and done
                changetable[w1] = width;
        }
-       
+
        if(amount2 != 0 && w2)
        {
                Real width = w2->get_point().mag();
-               
+
                width += amount2;
                w2->set_point(Vector(width,0));
-               
+
                //log in the list of changes...
                //to truly be changed after everything is said and done
                changetable[w2] = width;
@@ -461,8 +460,8 @@ Smach::event_result
 StateWidth_Context::event_mouse_handler(const Smach::event& x)
 {
        const EventMouse& event(*reinterpret_cast<const EventMouse*>(&x));
-       
-       //handle ze click       
+
+       //handle the click
        if( (event.key == EVENT_WORKAREA_MOUSE_BUTTON_DOWN || event.key == EVENT_WORKAREA_MOUSE_BUTTON_DRAG)
                        && event.button == BUTTON_LEFT )
        {
@@ -470,81 +469,81 @@ StateWidth_Context::event_mouse_handler(const Smach::event& x)
                const Real ph = get_work_area()->get_ph();
                const Real scale = sqrt(pw*pw+ph*ph);
                const Real rad = get_relative() ? scale * get_radius() : get_radius();
-               
+
                bool invert = (event.modifier&Gdk::CONTROL_MASK);
-               
+
                const Real threshold = 0.08;
-               
+
                float t = 0;
                Real rsq = 0;
-               
+
                Real dtime = 1/60.0;
-                               
+
                //if we're dragging get the difference in time between now and then
                if(event.key == EVENT_WORKAREA_MOUSE_BUTTON_DRAG)
                {
                        dtime = min(1/15.0,clocktime());
                }
                clocktime.reset();
-               
+
                //make way for new ducks
                //get_work_area()->clear_ducks();
-               
+
                //update positions
                //mouse_pos = event.pos;
-               
+
                center->set_point(event.pos);
                if(!added)get_work_area()->add_duck(center);
 
                radius->set_scalar(rad);
                if(!added)get_work_area()->add_duck(radius);
-               
+
                //the other duck is at the current duck
                closestpoint->set_point(event.pos);
                if(!added)get_work_area()->add_duck(closestpoint);
-                       
+
                //get the closest curve...
                handle<Duckmatic::Bezier>       c;
                if(event.pressure >= threshold)
                        c = get_work_area()->find_bezier(event.pos,scale*8,rad,&t);
-                       
+
                //run algorithm on event.pos to get 2nd placement
                if(!c.empty())
                {
                        bezier<Point> curve;
                        Point p;
-                       
+
                        curve[0] = c->p1->get_trans_point();
                        curve[1] = c->c1->get_trans_point();
                        curve[2] = c->c2->get_trans_point();
                        curve[3] = c->p2->get_trans_point();
-                       
+
                        p = curve(t);
                        rsq = (p-event.pos).mag_squared();
-                       
+
                        const Real r = rad*rad;
-                       
+
                        if(rsq < r)
                        {
                                closestpoint->set_point(curve(t));
-                               
+
                                //adjust the width...
-                               //squared falloff for radius... [0,1]                           
-                               
+                               //squared falloff for radius... [0,1]
+
                                Real ri = (r - rsq)/r;
                                AdjustWidth(c,t,ri*event.pressure*get_delta()*dtime,invert);
                        }
                }
-               
+
                //the points have been added
                added = true;
-                               
+
                //draw where it is yo!
                get_work_area()->queue_draw();
-                               
+
                return Smach::RESULT_ACCEPT;
        }
-       
+
        if(event.key == EVENT_WORKAREA_MOUSE_BUTTON_UP && event.button == BUTTON_LEFT)
        {
                if(added)
@@ -554,11 +553,11 @@ StateWidth_Context::event_mouse_handler(const Smach::event& x)
                        get_work_area()->erase_duck(closestpoint);
                        added = false;
                }
-               
+
                //Affect the width changes here...
                map<handle<Duck>,Real>::iterator i = changetable.begin();
 
-               synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Sketch Width")); 
+               synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Sketch Width"));
                for(; i != changetable.end(); ++i)
                {
                        //for each duck modify IT!!!
@@ -566,16 +565,16 @@ StateWidth_Context::event_mouse_handler(const Smach::event& x)
 
                        if(     desc.get_value_type() == ValueBase::TYPE_REAL )
                        {
-                               Action::Handle action(Action::create("value_desc_set"));
+                               Action::Handle action(Action::create("ValueDescSet"));
                                assert(action);
-                               
-                               action->set_param("canvas",get_canvas());                                       
-                               action->set_param("canvas_interface",get_canvas_interface());                   
-                               
-                               action->set_param("value_desc",desc);                                   
+
+                               action->set_param("canvas",get_canvas());
+                               action->set_param("canvas_interface",get_canvas_interface());
+
+                               action->set_param("value_desc",desc);
                                action->set_param("new_value",ValueBase(i->second));
                                action->set_param("time",get_canvas_view()->get_time());
-                               
+
                                if(!action->is_ready() || !get_canvas_view()->get_instance()->perform_action(action))
                                {
                                        group.cancel();
@@ -583,12 +582,12 @@ StateWidth_Context::event_mouse_handler(const Smach::event& x)
                                        return Smach::RESULT_ERROR;
                                }
                        }
-               }                       
-               
+               }
+
                changetable.clear();
-               
+
                get_work_area()->queue_draw();
-               
+
                return Smach::RESULT_ACCEPT;
        }