X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Fsrc%2Fgtkmm%2Frenderer_guides.cpp;fp=synfig-studio%2Fsrc%2Fgtkmm%2Frenderer_guides.cpp;h=c1f5d9f8779ff3b259f2b2b21f419736a665a4d4;hb=a095981e18cc37a8ecc7cd237cc22b9c10329264;hp=0000000000000000000000000000000000000000;hpb=9459638ad6797b8139f1e9f0715c96076dbf0890;p=synfig.git diff --git a/synfig-studio/src/gtkmm/renderer_guides.cpp b/synfig-studio/src/gtkmm/renderer_guides.cpp new file mode 100644 index 0000000..c1f5d9f --- /dev/null +++ b/synfig-studio/src/gtkmm/renderer_guides.cpp @@ -0,0 +1,284 @@ +/* === S Y N F I G ========================================================= */ +/*! \file renderer_guides.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 "renderer_guides.h" +#include "workarea.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 ======================================================= */ + +/* === P R O C E D U R E S ================================================= */ + +/* === M E T H O D S ======================================================= */ + +Renderer_Guides::Renderer_Guides(): + dragging(false) +{ + +} + +Renderer_Guides::~Renderer_Guides() +{ +} + +bool +Renderer_Guides::get_enabled_vfunc()const +{ + return get_work_area()->get_show_guides(); +} + +std::list& +Renderer_Guides::get_guide_list_x() +{ + return get_work_area()->get_guide_list_x(); +} + +std::list& +Renderer_Guides::get_guide_list_y() +{ + return get_work_area()->get_guide_list_y(); +} + +bool +Renderer_Guides::event_vfunc(GdkEvent* event) +{ + synfig::Point mouse_pos; + // float bezier_click_pos; + // const float radius((abs(get_pw())+abs(get_ph()))*4); + int button_pressed(0); + float pressure(0); + bool is_mouse(false); + Gdk::ModifierType modifier(Gdk::ModifierType(0)); + + // Handle input stuff + if( + event->any.type==GDK_MOTION_NOTIFY || + event->any.type==GDK_BUTTON_PRESS || + event->any.type==GDK_2BUTTON_PRESS || + event->any.type==GDK_3BUTTON_PRESS || + event->any.type==GDK_BUTTON_RELEASE + ) + { + GdkDevice *device; + if(event->any.type==GDK_MOTION_NOTIFY) + { + device=event->motion.device; + modifier=Gdk::ModifierType(event->motion.state); + } + else + { + device=event->button.device; + modifier=Gdk::ModifierType(event->button.state); + } + + // Make sure we recognize the device + /*if(curr_input_device) + { + if(curr_input_device!=device) + { + assert(device); + curr_input_device=device; + signal_input_device_changed()(curr_input_device); + } + } + else*/ if(device) + { + //curr_input_device=device; + //signal_input_device_changed()(curr_input_device); + } + + //assert(curr_input_device); + + // Calculate the position of the + // input device in canvas coordinates + // and the buttons + if(!event->button.axes) + { + mouse_pos=synfig::Point(screen_to_comp_coords(synfig::Point(event->button.x,event->button.y))); + button_pressed=event->button.button; + pressure=1.0f; + is_mouse=true; + if(isnan(event->button.x) || isnan(event->button.y)) + return false; + } + else + { + double x(event->button.axes[0]); + double y(event->button.axes[1]); + if(isnan(x) || isnan(y)) + return false; + + pressure=event->button.axes[2]; + //synfig::info("pressure=%f",pressure); + pressure-=0.04f; + pressure/=1.0f-0.04f; + + + assert(!isnan(pressure)); + + mouse_pos=synfig::Point(screen_to_comp_coords(synfig::Point(x,y))); + + button_pressed=event->button.button; + + if(button_pressed==1 && pressure<0 && (event->any.type!=GDK_BUTTON_RELEASE && event->any.type!=GDK_BUTTON_PRESS)) + button_pressed=0; + if(pressure<0) + pressure=0; + + //if(event->any.type==GDK_BUTTON_PRESS && button_pressed) + // synfig::info("Button pressed on input device = %d",event->button.button); + + //if(event->button.axes[2]>0.1) + // button_pressed=1; + //else + // button_pressed=0; + } + } + switch(event->type) + { + case GDK_BUTTON_PRESS: + break; + case GDK_MOTION_NOTIFY: + break; + case GDK_BUTTON_RELEASE: + break; + default: + break; + } + + return false; +} + +void +Renderer_Guides::render_vfunc( + const Glib::RefPtr& drawable, + const Gdk::Rectangle& /*expose_area*/ +) +{ + assert(get_work_area()); + if(!get_work_area()) + return; + + // const synfig::RendDesc &rend_desc(get_work_area()->get_canvas()->rend_desc()); + + const synfig::Vector focus_point(get_work_area()->get_focus_point()); + + //std::vector< std::pair,int> >& tile_book(get_tile_book()); + + int drawable_w,drawable_h; + drawable->get_size(drawable_w,drawable_h); + + // Calculate the window coordinates of the top-left + // corner of the canvas. + // const synfig::Vector::value_type + // x(focus_point[0]/get_pw()+drawable_w/2-get_w()/2), + // y(focus_point[1]/get_ph()+drawable_h/2-get_h()/2); + + /*const synfig::Vector::value_type window_startx(window_tl[0]); + const synfig::Vector::value_type window_endx(window_br[0]); + const synfig::Vector::value_type window_starty(window_tl[1]); + const synfig::Vector::value_type window_endy(window_br[1]); + */ + // const int + // tile_w(get_work_area()->get_tile_w()), + // tile_h(get_work_area()->get_tile_h()); + + // const int + // w(get_w()), + // h(get_h()); + + Glib::RefPtr gc(Gdk::GC::create(drawable)); + + //const synfig::Vector grid_size(get_grid_size()); + + const synfig::Vector::value_type window_startx(get_work_area()->get_window_tl()[0]); + // const synfig::Vector::value_type window_endx(get_work_area()->get_window_br()[0]); + const synfig::Vector::value_type window_starty(get_work_area()->get_window_tl()[1]); + // const synfig::Vector::value_type window_endy(get_work_area()->get_window_br()[1]); + const float pw(get_pw()),ph(get_ph()); + + // Draw out the guides + { + gc->set_function(Gdk::COPY); + gc->set_rgb_fg_color(Gdk::Color("#9f9fff")); + gc->set_line_attributes(1,Gdk::LINE_ON_OFF_DASH,Gdk::CAP_BUTT,Gdk::JOIN_MITER); + + Duckmatic::GuideList::const_iterator iter; + + // vertical + for(iter=get_guide_list_x().begin();iter!=get_guide_list_x().end();++iter) + { + const float x((*iter-window_startx)/pw); + + if(iter==get_work_area()->curr_guide) + gc->set_rgb_fg_color(Gdk::Color("#ff6f6f")); + else + gc->set_rgb_fg_color(Gdk::Color("#6f6fff")); + + drawable->draw_line(gc, + round_to_int(x), + 0, + round_to_int(x), + drawable_h + ); + } + // horizontal + for(iter=get_guide_list_y().begin();iter!=get_guide_list_y().end();++iter) + { + const float y((*iter-window_starty)/ph); + + if(iter==get_work_area()->curr_guide) + gc->set_rgb_fg_color(Gdk::Color("#ff6f6f")); + else + gc->set_rgb_fg_color(Gdk::Color("#6f6fff")); + + drawable->draw_line(gc, + 0, + round_to_int(y), + drawable_w, + round_to_int(y) + ); + } + } +}