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
00084 double get_translate_x();
00085
00087 double get_translate_y();
00088
00090 void get_translate( double& tx, double& ty );
00091
00097 void set_translate_x( double tx );
00098
00104 void set_translate_y( double ty );
00105
00111 void set_translate( double tx, double ty );
00112
00118 void translate_x( double tx );
00119
00125 void translate_y( double ty );
00126
00132 void translate( double tx, double ty );
00133
00135 double get_scale_x();
00136
00138 double get_scale_y();
00139
00141 void get_scale( double& sx, double& sy );
00142
00148 void set_scale_x( double sx );
00149
00155 void set_scale_y( double sy );
00156
00163 void set_scale( double scale_x, double scale_y );
00164
00170 void set_scale( double s );
00171
00177 void scale_x( double s );
00178
00184 void scale_y( double s );
00185
00191 void scale( double s );
00192
00199 void scale( double scale_x, double scale_y );
00200
00202 double get_rotate();
00203
00205 void set_rotate( double r );
00206
00212 void rotate( double r );
00213
00219 double get_skew_x();
00220
00226 void set_skew_x(double skewx);
00227
00233 void skew_x(double skewx);
00234
00240 double get_skew_y();
00241
00247 void set_skew_y(double skewy);
00248
00254 void skew_y(double skewy);
00255
00257 void get_skew(double& skewx, double& skewy);
00258
00260 void set_skew(double skewx, double skewy);
00261
00263 void skew(double s);
00264
00266 void skew(double skewx, double skewy);
00267
00269 double get_centroid_x();
00270
00272 void set_centroid_x(double centroid_x);
00273
00275 double get_centroid_y();
00276
00278 void set_centroid_y(double centroid_y);
00279
00281 void get_centroid(double& centroid_x, double& centroid_y);
00282
00284 void set_centroid(double centroid_x, double centroid_y);
00285
00290 void reset_position();
00291
00293 const Cairo::Matrix& matrix();
00294
00296 Cairo::Matrix global_matrix();
00297
00299 void global_to_local( double& x, double& y );
00300
00302 void local_to_global( double& x, double& y );
00303
00305 void distance_global_to_local( double& x, double& y );
00306
00308 void distance_local_to_global( double& x, double& y );
00309
00323 virtual void render( Cairo::RefPtr<Cairo::Context> cairo );
00324
00331 virtual void draw( Cairo::RefPtr<Cairo::Context> cairo ) = 0;
00332
00340 virtual Region& extents();
00341
00342 virtual Region local_extents();
00343
00353 virtual Region global_extents();
00354
00366 virtual Region extents_transformed( Cairo::Matrix& globalmatrix );
00367
00371 virtual bool inside( double x, double y );
00372
00380 void set_selectable( bool selectable = true );
00381
00386 bool is_selectable();
00387
00389 virtual bool is_group();
00390
00397 ViewBox::pointer viewbox();
00398
00405 void set_viewbox(ViewBox::pointer viewbox = ViewBox::pointer() );
00406
00408 sigc::signal<void, double, double, double, double> signal_redraw();
00409
00411 sigc::signal<void> signal_xy();
00412
00414 sigc::signal<void> signal_scale();
00415
00417 sigc::signal<void> signal_rotation();
00418
00420 sigc::signal<void> signal_skew();
00421
00423 sigc::signal<void> signal_selectable();
00424
00426 sigc::signal<void> signal_centroid();
00427
00435 void need_redraw_proxy();
00436
00437 virtual Drawable::pointer clone() const = 0;
00438
00439 virtual Group* parent();
00440
00441 PAPYRUS_CLASS_NAME("Drawable");
00442
00443 protected:
00444 Group* m_parent;
00445
00446 Group* m_drawing_parent;
00447
00449 double m_tx;
00450
00452 double m_ty;
00453
00455 double m_sx;
00456
00458 double m_sy;
00459
00461 double m_r;
00462
00464 double m_skewx;
00465
00467 double m_skewy;
00468
00470 bool m_selectable;
00471
00473 double m_centroid_x;
00474
00476 double m_centroid_y;
00477
00481 ViewBox::pointer m_viewbox;
00482
00483 sigc::connection m_viewbox_connection;
00484
00489 bool m_regenerate_matrix;
00490
00492 Cairo::Matrix m_matrix;
00493
00499 void recalculate_matrix();
00500
00504 sigc::signal<void, double, double, double, double> m_signal_redraw;
00505
00507 sigc::signal<void> m_signal_xy;
00508
00510 sigc::signal<void> m_signal_scale;
00511
00513 sigc::signal<void> m_signal_rotation;
00514
00516 sigc::signal<void> m_signal_skew;
00517
00519 sigc::signal<void> m_signal_selectable;
00520
00522 sigc::signal<void> m_signal_centroid;
00523
00524 friend class Group;
00525
00533 virtual void need_redraw( );
00534
00541 virtual void set_extents( const Region& extents );
00542
00543 private:
00548 Region m_extents, m_extentsold;
00549
00550 };
00551
00552 }
00553
00554 #endif