X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Fsrc%2Fsynfigapp%2Finputdevice.cpp;fp=synfig-studio%2Fsrc%2Fsynfigapp%2Finputdevice.cpp;h=874fb190af97bfafc520876514e4d33795b067ca;hb=a095981e18cc37a8ecc7cd237cc22b9c10329264;hp=0000000000000000000000000000000000000000;hpb=9459638ad6797b8139f1e9f0715c96076dbf0890;p=synfig.git diff --git a/synfig-studio/src/synfigapp/inputdevice.cpp b/synfig-studio/src/synfigapp/inputdevice.cpp new file mode 100644 index 0000000..874fb19 --- /dev/null +++ b/synfig-studio/src/synfigapp/inputdevice.cpp @@ -0,0 +1,306 @@ +/* === S Y N F I G ========================================================= */ +/*! \file inputdevice.cpp +** \brief Template File +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. +** +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** \endlegal +*/ +/* ========================================================================= */ + +/* === H E A D E R S ======================================================= */ + +#ifdef USING_PCH +# include "pch.h" +#else +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "inputdevice.h" +#include "settings.h" +#include +#include +#include "main.h" + +#include "general.h" + +#endif + +/* === U S I N G =========================================================== */ + +using namespace std; +using namespace etl; +using namespace synfig; +using namespace synfigapp; + +/* === M A C R O S ========================================================= */ + +/* === G L O B A L S ======================================================= */ + +class DeviceSettings : public Settings +{ + InputDevice* input_device; +public: + DeviceSettings(InputDevice* input_device): + input_device(input_device) { } + + + virtual bool get_value(const synfig::String& key, synfig::String& value)const + { + if(key=="state") + { + value=input_device->get_state(); + return true; + } + if(key=="bline_width") + { + value=strprintf("%s",input_device->get_bline_width().get_string().c_str()); + return true; + } + if(key=="opacity") + { + value=strprintf("%f",(float)input_device->get_opacity()); + return true; + } + if(key=="blend_method") + { + value=strprintf("%i",(int)input_device->get_blend_method()); + return true; + } + if(key=="outline_color") + { + Color c(input_device->get_outline_color()); + value=strprintf("%f %f %f %f",(float)c.get_r(),(float)c.get_g(),(float)c.get_b(),(float)c.get_a()); + + return true; + } + if(key=="fill_color") + { + Color c(input_device->get_fill_color()); + value=strprintf("%f %f %f %f",(float)c.get_r(),(float)c.get_g(),(float)c.get_b(),(float)c.get_a()); + + return true; + } + if(key=="mode") + { + get_mode_value(value); + return true; + } + if(key=="axes") + { + get_axes_value(value); + return true; + } + if(key=="keys") + { + get_keys_value(value); + return true; + } + + return Settings::get_value(key, value); + } + + void get_mode_value(synfig::String & value) const + { + if (input_device->get_mode() == InputDevice::MODE_SCREEN) + value = "screen"; + else if (input_device->get_mode() == InputDevice::MODE_WINDOW) + value = "window"; + else + value = "disabled"; + } + + void get_axes_value(synfig::String & value) const + { + vector axes = input_device->get_axes(); + value = strprintf("%u", axes.size()); + vector::const_iterator itr; + for (itr = axes.begin(); itr != axes.end(); itr++) + value += strprintf(" %u", (unsigned int) *itr); + } + + void get_keys_value(synfig::String & value) const + { + vector keys = input_device->get_keys(); + value = strprintf("%u", keys.size()); + vector::const_iterator itr; + for (itr = keys.begin(); itr != keys.end(); itr++) + value += strprintf(" %u %u", itr->keyval, itr->modifiers); + } + + virtual bool set_value(const synfig::String& key,const synfig::String& value) + { + if(key=="state") + { + input_device->set_state(value); + return true; + } + if(key=="bline_width") + { + input_device->set_bline_width(synfig::Distance(value)); + return true; + } + if(key=="opacity") + { + input_device->set_opacity(atof(value.c_str())); + return true; + } + if(key=="blend_method") + { + input_device->set_blend_method(Color::BlendMethod(atoi(value.c_str()))); + return true; + } + if(key=="outline_color") + { + float r=0,g=0,b=0,a=1; + if(!strscanf(value,"%f %f %f %f",&r,&g,&b,&a)) + return false; + input_device->set_outline_color(synfig::Color(r,g,b,a)); + return true; + } + if(key=="fill_color") + { + float r=0,g=0,b=0,a=1; + if(!strscanf(value,"%f %f %f %f",&r,&g,&b,&a)) + return false; + input_device->set_fill_color(synfig::Color(r,g,b,a)); + return true; + } + if(key=="mode") + { + set_mode_value(value); + return true; + } + if(key=="axes") + { + set_axes_value(value); + return true; + } + if(key=="keys") + { + set_keys_value(value); + return true; + } + + return Settings::set_value(key, value); + } + + void set_mode_value(const synfig::String & value) + { + InputDevice::Mode mode; + if (value == "screen") + mode = InputDevice::MODE_SCREEN; + else if (value == "window") + mode = InputDevice::MODE_WINDOW; + else + mode = InputDevice::MODE_DISABLED; + + input_device->set_mode(mode); + } + + void set_axes_value(const synfig::String & value) + { + std::vector axes; + + unsigned pos = value.find(' ', 0); + if (pos < value.size()) { + int num_axes = atoi(value.substr(0, pos).c_str()); + axes.resize(num_axes); + + for (int axis = 0; axis < num_axes; axis++) { + int last = pos; + pos = value.find(' ', pos + 1); + axes[axis] = InputDevice::AxisUse(atoi(value.substr(last, pos).c_str())); + } + } + + input_device->set_axes(axes); + } + + void set_keys_value(const synfig::String & value) + { + std::vector keys; + + unsigned pos = value.find(' ', 0); + if (pos < value.size()) { + int num_keys = atoi(value.substr(0, pos).c_str()); + keys.resize(num_keys); + + for (int key = 0; key < num_keys; key++) { + int last = pos; + pos = value.find(' ', pos + 1); + keys[key].keyval = (unsigned int) atol(value.substr(last, pos).c_str()); + last = pos; + pos = value.find(' ', pos + 1); + keys[key].modifiers = (unsigned int) atol(value.substr(last, pos).c_str()); + } + } + + input_device->set_keys(keys); + } + + virtual KeyList get_key_list()const + { + KeyList ret(Settings::get_key_list()); + ret.push_back("outline_color"); + ret.push_back("fill_color"); + ret.push_back("state"); + ret.push_back("bline_width"); + ret.push_back("blend_method"); + ret.push_back("opacity"); + ret.push_back("mode"); + ret.push_back("axes"); + ret.push_back("keys"); + return ret; + } +}; + +/* === P R O C E D U R E S ================================================= */ + +/* === M E T H O D S ======================================================= */ + +InputDevice::InputDevice(const synfig::String id_, Type type_): + id_(id_), + type_(type_), + state_((type_==TYPE_PEN)?"draw":"normal"), + outline_color_(Color::black()), + fill_color_(Color::white()), + bline_width_(Distance(1,Distance::SYSTEM_POINTS)), + opacity_(1.0f), + blend_method_(Color::BLEND_COMPOSITE), + mode_(MODE_DISABLED) +{ + device_settings=new DeviceSettings(this); + Main::settings().add_domain(device_settings,"input_device."+id_); +} + +InputDevice::~InputDevice() +{ + Main::settings().remove_domain("input_device."+id_); + delete device_settings; +} + +Settings& +InputDevice::settings() +{ + return *device_settings; +} + +const Settings& +InputDevice::settings()const +{ + return *device_settings; +}