drawable.h

00001 /***************************************************************************
00002  *   Copyright (C) 2004 by Rick L. Vinyard, Jr.                            *
00003  *   rvinyard@cs.nmsu.edu                                                  *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU Lesser General Public License as        *
00007  *   published by the Free Software Foundation version 2.1.                *
00008  *                                                                         *
00009  *   This program is distributed in the hope that it will be useful,       *
00010  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00011  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00012  *   GNU General Public License for more details.                          *
00013  *                                                                         *
00014  *   You should have received a copy of the GNU Lesser General Public      *
00015  *   License along with this library; if not, write to the                 *
00016  *   Free Software Foundation, Inc.,                                       *
00017  *   51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA              *
00018  ***************************************************************************/
00019 #ifndef PAPYRUSDRAWABLE_H
00020 #define PAPYRUSDRAWABLE_H
00021 
00022 #include <papyrus/smart_pointer.h>
00023 #include <papyrus/utility.h>
00024 
00025 #include <papyrus/renderable.h>
00026 #include <papyrus/region.h>
00027 #include <papyrus/viewbox.h>
00028 
00029 namespace Papyrus
00030   {
00031 
00032   class Group;
00033 
00066   class Drawable : public Renderable
00067     {
00068     public:
00069       typedef PapyrusSmartPointer<Drawable> pointer;
00070 
00079       Drawable( double tx = 0.0, double ty = 0.0, double sx = 1.0, double sy = 1.0, double r = 0.0 );
00080 
00081       virtual ~Drawable();
00082 
00083       bool is_visible();
00084 
00085       void show();
00086 
00087       void hide();
00088 
00090       double get_translate_x();
00091 
00093       double get_translate_y();
00094 
00096       void get_translate( double& tx, double& ty );
00097 
00103       void set_translate_x( double tx );
00104 
00110       void set_translate_y( double ty );
00111 
00117       void set_translate( double tx, double ty );
00118 
00124       void translate_x( double tx );
00125 
00131       void translate_y( double ty );
00132 
00138       void translate( double tx, double ty );
00139 
00141       double get_scale_x();
00142 
00144       double get_scale_y();
00145 
00147       void get_scale( double& sx, double& sy );
00148 
00154       void set_scale_x( double sx );
00155 
00161       void set_scale_y( double sy );
00162 
00169       void set_scale( double scale_x, double scale_y );
00170 
00176       void set_scale( double s );
00177 
00183       void scale_x( double s );
00184 
00190       void scale_y( double s );
00191 
00197       void scale( double s );
00198 
00205       void scale( double scale_x, double scale_y );
00206 
00208       double get_rotate();
00209 
00211       void set_rotate( double r );
00212 
00218       void rotate( double r );
00219 
00225       double get_skew_x();
00226 
00232       void set_skew_x(double skewx);
00233 
00239       void skew_x(double skewx);
00240 
00246       double get_skew_y();
00247 
00253       void set_skew_y(double skewy);
00254 
00260       void skew_y(double skewy);
00261 
00263       void get_skew(double& skewx, double& skewy);
00264 
00266       void set_skew(double skewx, double skewy);
00267 
00269       void skew(double s);
00270 
00272       void skew(double skewx, double skewy);
00273 
00275       double get_centroid_x();
00276 
00278       void set_centroid_x(double centroid_x);
00279 
00281       double get_centroid_y();
00282 
00284       void set_centroid_y(double centroid_y);
00285 
00287       void get_centroid(double& centroid_x, double& centroid_y);
00288 
00290       void set_centroid(double centroid_x, double centroid_y);
00291 
00296       void reset_position();
00297 
00299       const Cairo::Matrix& matrix();
00300 
00302       Cairo::Matrix global_matrix();
00303 
00305       void global_to_local( double& x, double& y );
00306 
00308       void local_to_global( double& x, double& y );
00309 
00311       void distance_global_to_local( double& x, double& y );
00312 
00314       void distance_local_to_global( double& x, double& y );
00315 
00329       virtual void render( Cairo::RefPtr<Cairo::Context> cairo );
00330 
00337       virtual void draw( Cairo::RefPtr<Cairo::Context> cairo ) = 0;
00338 
00346       virtual Region& extents();
00347 
00348       virtual Region local_extents();
00349 
00359       virtual Region global_extents();
00360 
00372       virtual Region extents_transformed( Cairo::Matrix& globalmatrix );
00373 
00377       virtual bool inside( double x, double y );
00378 
00379       bool exclude_from_extents();
00380 
00381       void set_exclude_from_extents(bool b);
00382 
00390       void set_selectable( bool selectable = true );
00391 
00396       bool is_selectable();
00397 
00399       virtual bool is_group();
00400 
00407       Viewbox::pointer viewbox();
00408 
00418       void set_viewbox(Viewbox::pointer viewbox = Viewbox::pointer() );
00419 
00426       void set_viewbox(const Viewbox& viewbox );
00427 
00429       sigc::signal<void, double, double, double, double> signal_redraw();
00430 
00432       sigc::signal<void> signal_xy();
00433 
00435       sigc::signal<void> signal_scale();
00436 
00438       sigc::signal<void> signal_rotation();
00439 
00441       sigc::signal<void> signal_skew();
00442 
00444       sigc::signal<void> signal_selectable();
00445 
00447       sigc::signal<void> signal_centroid();
00448 
00456       void need_redraw_proxy();
00457 
00458       virtual Drawable::pointer clone() const = 0;
00459 
00460       virtual Group* parent();
00461 
00462       PAPYRUS_CLASS_NAME("Drawable");
00463 
00464       protected:
00465       Group* m_parent;
00466 
00467       Group* m_drawing_parent;
00468 
00469       bool m_visible;
00470 
00472       double m_tx;
00473 
00475       double m_ty;
00476 
00478       double m_sx;
00479 
00481       double m_sy;
00482 
00484       double m_r;
00485 
00487       double m_skewx;
00488 
00490       double m_skewy;
00491 
00493       bool m_selectable;
00494 
00496       double m_centroid_x;
00497 
00499       double m_centroid_y;
00500 
00501       bool m_exclude_from_extents;
00502 
00506       Viewbox::pointer m_viewbox;
00507 
00508       sigc::connection m_viewbox_connection;
00509 
00514       bool m_regenerate_matrix;
00515 
00517       Cairo::Matrix m_matrix;
00518 
00524       void recalculate_matrix();
00525 
00529       sigc::signal<void, double, double, double, double> m_signal_redraw;
00530 
00532       sigc::signal<void> m_signal_xy;
00533 
00535       sigc::signal<void> m_signal_scale;
00536 
00538       sigc::signal<void> m_signal_rotation;
00539 
00541       sigc::signal<void> m_signal_skew;
00542 
00544       sigc::signal<void> m_signal_selectable;
00545 
00547       sigc::signal<void> m_signal_centroid;
00548 
00549       friend class Group;
00550 
00558       virtual void need_redraw( );
00559 
00566       virtual void set_extents( const Region& extents );
00567 
00568     private:
00573       Region m_extents, m_extentsold;
00574 
00575     };
00576 
00577 }
00578 
00579 #endif

Generated on Sun Mar 11 10:01:28 2007 by  doxygen 1.5.1