00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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