X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fduckmatic.cpp;h=bbf6f749c676ab501702885d82b83166e46ab943;hb=587d6ca07e817b7a98e8eb4833492b2388184df4;hp=da1b6a24faee7d7caa2bdd2cf1c1bfe1049ed5c5;hpb=1c01fe75a985bf1c5927bb70a33f14941c370b4e;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/duckmatic.cpp b/synfig-studio/trunk/src/gtkmm/duckmatic.cpp index da1b6a2..bbf6f74 100644 --- a/synfig-studio/trunk/src/gtkmm/duckmatic.cpp +++ b/synfig-studio/trunk/src/gtkmm/duckmatic.cpp @@ -6,7 +6,7 @@ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** Copyright (c) 2007 Chris Moore +** Copyright (c) 2007, 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 @@ -99,7 +99,24 @@ Duckmatic::Duckmatic(): Duckmatic::~Duckmatic() { clear_ducks(); - //synfig::info("Duckmatic::~Duckmatic(): Deleted. Duck Count=%d",Duck::duck_count); + + if (Duck::duck_count) + synfig::error("%d ducks not yet deleted!", Duck::duck_count); + + if (getenv("SYNFIG_DEBUG_DESTRUCTORS")) + synfig::info("Duckmatic::~Duckmatic(): Deleted"); +} + +void +Duckmatic::set_flip_x(bool flip_x) +{ + flip_x_ = flip_x; +} + +void +Duckmatic::set_flip_y(bool flip_y) +{ + flip_y_ = flip_y; } void @@ -242,21 +259,18 @@ Duckmatic::is_duck_group_selectable(const etl::handle& x)const { const Type type(get_type_mask()); - if(( x->get_type() && (!(type & x->get_type())) ) ) - { + if(( x->get_type() && (!(type & x->get_type())) || !x->get_editable() ) ) return false; - } + if(x->get_value_desc().parent_is_layer_param() && type & Duck::TYPE_POSITION) { Layer::Handle layer(x->get_value_desc().get_layer()); String layer_name(layer->get_name()); - if( - layer_name=="outline" || - layer_name=="region" || - layer_name=="polygon" || - layer_name=="curve_gradient" - ) + + if (layer_name == "outline" || layer_name == "region" || layer_name == "plant" || + layer_name == "polygon" || layer_name == "curve_gradient") return false; + if((layer_name=="PasteCanvas"|| layer_name=="paste_canvas") && !layer->get_param("children_lock").get(bool())) return false; @@ -408,7 +422,7 @@ Duckmatic::end_duck_drag() } Point -Duckmatic::snap_point_to_grid(const Point& x, float radius)const +Duckmatic::snap_point_to_grid(const synfig::Point& x, float radius)const { Point ret(x); @@ -534,8 +548,7 @@ Duckmatic::signal_edited_selected_ducks() // Go ahead and call everyone's signals for(iter=ducks.begin();iter!=ducks.end();++iter) { - if ((*iter)->get_type() == Duck::TYPE_ANGLE || - (*iter)->get_type() == Duck::TYPE_TANGENT) + if ((*iter)->get_type() == Duck::TYPE_ANGLE) { if(!(*iter)->signal_edited_angle()((*iter)->get_rotations())) { @@ -543,6 +556,31 @@ Duckmatic::signal_edited_selected_ducks() throw String("Bad edit"); } } + else if (App::restrict_radius_ducks && + (*iter)->is_radius()) + { + Point point((*iter)->get_point()); + bool changed = false; + + if (point[0] * (flip_x_ ? -1 : 1) < 0) + { + point[0] = 0; + changed = true; + } + if (point[1] * (flip_y_ ? -1 : 1) < 0) + { + point[1] = 0; + changed = true; + } + + if (changed) (*iter)->set_point(point); + + if(!(*iter)->signal_edited()(point)) + { + selected_ducks=old_set; + throw String("Bad edit"); + } + } else { if(!(*iter)->signal_edited()((*iter)->get_point())) @@ -730,12 +768,14 @@ Duckmatic::find_duck(synfig::Point point, synfig::Real radius, Duck::Type type) { const Duck::Handle& duck(iter->second); - if(!duck->get_editable()) + if(duck->get_ignore()) continue; Real dist((duck->get_trans_point()-point).mag_squared()); if(duck->get_type()&Duck::TYPE_VERTEX) dist*=1.0001; + else if(duck->get_type()&Duck::TYPE_RADIUS) + dist*=0.9999; if(dist<=closest && !( duck->get_type() && (!(type & duck->get_type())) ) ) { @@ -818,6 +858,7 @@ Duckmatic::find_bezier(synfig::Point pos, synfig::Real scale, synfig::Real radiu bool Duckmatic::save_sketch(const synfig::String& filename)const { + ChangeLocale change_locale(LC_NUMERIC, "C"); std::ofstream file(filename.c_str()); if(!file)return false; @@ -851,6 +892,7 @@ Duckmatic::save_sketch(const synfig::String& filename)const bool Duckmatic::load_sketch(const synfig::String& filename) { + ChangeLocale change_locale(LC_NUMERIC, "C"); std::ifstream file(filename.c_str()); if(!file) @@ -992,7 +1034,8 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handleset_radius(true); duck->set_type(Duck::TYPE_RADIUS); - duck->set_point(Point(value_desc.get_value(get_time()).get(Real()),0)); + // put the duck on the right hand side of the center, whether the display is flipped or not + duck->set_point(Point(value_desc.get_value(get_time()).get(Real()) * (flip_x_ ? -1 : 1), 0)); duck->set_name(guid_string(value_desc)); if(value_desc.is_value_node()) { @@ -1020,7 +1063,6 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handlesignal_edited().clear(); // value_desc.get_value_type() == ValueBase::TYPE_REAL: - printf("DESC REAL, DUCK %d\n", int(duck->get_type())); duck->signal_edited().connect( sigc::bind( sigc::mem_fun( @@ -1097,7 +1139,6 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handlesignal_edited().clear(); // value_desc.get_value_type() == ValueBase::TYPE_ANGLE: - printf("DESC ANGLE, DUCK %d\n", int(duck->get_type())); duck->signal_edited_angle().clear(); duck->signal_edited_angle().connect( sigc::bind( @@ -1197,7 +1238,6 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handleset_type(Duck::TYPE_POSITION); duck->signal_edited().clear(); // value_desc.get_value_type() == ValueBase::TYPE_VECTOR: - printf("DESC VECTOR, DUCK %d\n", int(duck->get_type())); duck->signal_edited().connect( sigc::bind( sigc::mem_fun(