X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftags%2Fsynfigstudio_%40VERSION_MAJ%40_%40VERSION_MIN%40_%40VERSION_REV%40%2Fsrc%2Fgtkmm%2Fstate_stroke.cpp;fp=synfig-studio%2Ftags%2Fsynfigstudio_%40VERSION_MAJ%40_%40VERSION_MIN%40_%40VERSION_REV%40%2Fsrc%2Fgtkmm%2Fstate_stroke.cpp;h=fc16a320e9a6a76a37bb69d5f50e3ba22779b37b;hb=d98a5bdd45e2c836aa7996f22516008f1ce29947;hp=0000000000000000000000000000000000000000;hpb=c33037508a9f5a0607b14f3feed692a0d364d68a;p=synfig.git diff --git a/synfig-studio/tags/synfigstudio_@VERSION_MAJ@_@VERSION_MIN@_@VERSION_REV@/src/gtkmm/state_stroke.cpp b/synfig-studio/tags/synfigstudio_@VERSION_MAJ@_@VERSION_MIN@_@VERSION_REV@/src/gtkmm/state_stroke.cpp new file mode 100644 index 0000000..fc16a32 --- /dev/null +++ b/synfig-studio/tags/synfigstudio_@VERSION_MAJ@_@VERSION_MIN@_@VERSION_REV@/src/gtkmm/state_stroke.cpp @@ -0,0 +1,208 @@ +/* === S Y N F I G ========================================================= */ +/*! \file state_stroke.cpp +** \brief Template File +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007 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 +** 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 +#include + +#include + +#include "state_stroke.h" +#include "canvasview.h" +#include "workarea.h" +#include "app.h" +#include +#include +#include +#include +#include "event_mouse.h" +#include "event_layerclick.h" +#include "toolbox.h" +#include + +#include "general.h" + +#endif + +/* === U S I N G =========================================================== */ + +using namespace std; +using namespace etl; +using namespace synfig; +using namespace studio; + +/* === M A C R O S ========================================================= */ + +/* === G L O B A L S ======================================================= */ + +StateStroke studio::state_stroke; + +/* === C L A S S E S & S T R U C T S ======================================= */ + +class studio::StateStroke_Context : public sigc::trackable +{ + etl::handle canvas_view_; + CanvasView::IsWorking is_working; + + Duckmatic::Push duckmatic_push; + + etl::smart_ptr > stroke_data; + + etl::smart_ptr > width_data; + + Gdk::ModifierType modifier; + +public: + + Smach::event_result event_stop_handler(const Smach::event& x); + + Smach::event_result event_refresh_handler(const Smach::event& x); + + Smach::event_result event_mouse_up_handler(const Smach::event& x); + + Smach::event_result event_mouse_draw_handler(const Smach::event& x); + Smach::event_result event_refresh_tool_options(const Smach::event& x); + + StateStroke_Context(CanvasView* canvas_view); + + ~StateStroke_Context(); + + const etl::handle& get_canvas_view()const{return canvas_view_;} + etl::handle 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();} + +}; // END of class StateStroke_Context + + +/* === M E T H O D S ======================================================= */ + +StateStroke::StateStroke(): + Smach::state("stroke") +{ + insert(event_def(EVENT_STOP,&StateStroke_Context::event_stop_handler)); + insert(event_def(EVENT_REFRESH,&StateStroke_Context::event_refresh_handler)); +// insert(event_def(EVENT_WORKAREA_MOUSE_BUTTON_DOWN,&StateStroke_Context::event_mouse_down_handler)); + insert(event_def(EVENT_WORKAREA_MOUSE_BUTTON_UP,&StateStroke_Context::event_mouse_up_handler)); + insert(event_def(EVENT_WORKAREA_MOUSE_BUTTON_DRAG,&StateStroke_Context::event_mouse_draw_handler)); + insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateStroke_Context::event_refresh_tool_options)); +} + +StateStroke::~StateStroke() +{ +} + + +StateStroke_Context::StateStroke_Context(CanvasView* canvas_view): + canvas_view_(canvas_view), + is_working(*canvas_view), + duckmatic_push(get_work_area()) +{ + width_data.spawn(); + stroke_data.spawn(); + + get_work_area()->add_stroke(stroke_data, synfigapp::Main::get_foreground_color()); +} + +StateStroke_Context::~StateStroke_Context() +{ + duckmatic_push.restore(); + + App::toolbox->refresh(); + + // Send the stroke data to whatever previously called this state. + if(stroke_data->size()>=2) + get_canvas_view()->get_smach().process_event(EventStroke(stroke_data,width_data,modifier)); +} + +Smach::event_result +StateStroke_Context::event_refresh_tool_options(const Smach::event& /*x*/) +{ + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateStroke_Context::event_stop_handler(const Smach::event& /*x*/) +{ + throw Smach::pop_exception(); +} + +Smach::event_result +StateStroke_Context::event_refresh_handler(const Smach::event& /*x*/) +{ + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateStroke_Context::event_mouse_up_handler(const Smach::event& x) +{ + const EventMouse& event(*reinterpret_cast(&x)); + switch(event.button) + { + case BUTTON_LEFT: + { + modifier=event.modifier; + throw Smach::pop_exception(); + } + + case BUTTON_RIGHT: // Intercept the right-button click to short-circuit the pop-up menu + printf("%s:%d BUTTON_RIGHT\n", __FILE__, __LINE__); + if (!getenv("SYNFIG_ENABLE_POPUP_MENU_IN_ALL_TOOLS")) + return Smach::RESULT_ACCEPT; + + default: + return Smach::RESULT_OK; + } +} + +Smach::event_result +StateStroke_Context::event_mouse_draw_handler(const Smach::event& x) +{ + const EventMouse& event(*reinterpret_cast(&x)); + switch(event.button) + { + case BUTTON_LEFT: + { + stroke_data->push_back(event.pos); + width_data->push_back(event.pressure); + get_work_area()->queue_draw(); + return Smach::RESULT_ACCEPT; + } + + case BUTTON_RIGHT: // Intercept the right-button click to short-circuit the pop-up menu + printf("%s:%d BUTTON_RIGHT\n", __FILE__, __LINE__); + if (!getenv("SYNFIG_ENABLE_POPUP_MENU_IN_ALL_TOOLS")) + return Smach::RESULT_ACCEPT; + + default: + return Smach::RESULT_OK; + } +}