diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-06-21 11:43:42 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-06-21 11:43:42 -0400 |
commit | a8bd6ecc4fe4016090fad92daf6d9a572941d035 (patch) | |
tree | dbde5ef9b5b280656a95be7dce72b67dafbe46e7 | |
parent | 5d6dc388f71dbb4910832ed766af92592b000e52 (diff) |
refactor Canvas so that all Items have children; add Container abstract base class; rename Group as "Layout" and retain only drawing semantics
51 files changed, 442 insertions, 637 deletions
diff --git a/libs/canvas/arc.cc b/libs/canvas/arc.cc index 80141d4c66..baec2fafb1 100644 --- a/libs/canvas/arc.cc +++ b/libs/canvas/arc.cc @@ -39,8 +39,8 @@ Arc::Arc (Canvas* c) { } -Arc::Arc (Group* g) - : Item (g) +Arc::Arc (Item* parent) + : Item (parent) , _radius (0.0) , _arc_degrees (0.0) , _start_degrees (0.0) diff --git a/libs/canvas/arrow.cc b/libs/canvas/arrow.cc index 86d4e33ca9..5cac31300e 100644 --- a/libs/canvas/arrow.cc +++ b/libs/canvas/arrow.cc @@ -35,13 +35,13 @@ using namespace ArdourCanvas; * @param parent Parent canvas group. */ Arrow::Arrow (Canvas* c) - : Group (c) + : Layout (c) { setup (); } -Arrow::Arrow (Group* g) - : Group (g) +Arrow::Arrow (Item* parent) + : Layout (parent) { setup (); } diff --git a/libs/canvas/canvas.cc b/libs/canvas/canvas.cc index 4ccf46b019..8c7960a217 100644 --- a/libs/canvas/canvas.cc +++ b/libs/canvas/canvas.cc @@ -396,7 +396,7 @@ GtkCanvas::pick_current_item (Duple const & point, int state) /* We ignore invisible items, groups and items that ignore events */ - if (!new_item->visible() || new_item->ignore_events() || dynamic_cast<Group const *>(new_item) != 0) { + if (!new_item->visible() || new_item->ignore_events() || dynamic_cast<Container const *>(new_item) != 0) { continue; } diff --git a/libs/canvas/canvas/arc.h b/libs/canvas/canvas/arc.h index 5eaa4a0ab9..c2b32d9e10 100644 --- a/libs/canvas/canvas/arc.h +++ b/libs/canvas/canvas/arc.h @@ -32,7 +32,7 @@ class LIBCANVAS_API Arc : public Item { public: Arc (Canvas*); - Arc (Group*); + Arc (Item*); void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const; void compute_bounding_box () const; diff --git a/libs/canvas/canvas/arrow.h b/libs/canvas/canvas/arrow.h index 75c21da07c..7db225553e 100644 --- a/libs/canvas/canvas/arrow.h +++ b/libs/canvas/canvas/arrow.h @@ -26,8 +26,7 @@ #define __CANVAS_ARROW_H__ #include "canvas/visibility.h" - -#include "canvas/group.h" +#include "canvas/layout.h" namespace ArdourCanvas { @@ -46,11 +45,11 @@ class Polygon; * to draw lines at any angle. */ -class LIBCANVAS_API Arrow : public Group +class LIBCANVAS_API Arrow : public Layout { public: Arrow (Canvas*); - Arrow (Group*); + Arrow (Item*); void set_show_head (int, bool); void set_head_outward (int, bool); diff --git a/libs/canvas/canvas/canvas.h b/libs/canvas/canvas/canvas.h index fac9367985..94005f4cc7 100644 --- a/libs/canvas/canvas/canvas.h +++ b/libs/canvas/canvas/canvas.h @@ -42,7 +42,7 @@ namespace ArdourCanvas { class Rect; -class Group; +class Item; class ScrollGroup; /** The base class for our different types of canvas. @@ -78,7 +78,7 @@ public: void render (Rect const &, Cairo::RefPtr<Cairo::Context> const &) const; /** @return root group */ - Group* root () { + Item* root () { return &_root; } @@ -122,8 +122,8 @@ public: protected: void queue_draw_item_area (Item *, Rect); - /** our root group */ - RootGroup _root; + /** our root item */ + Root _root; virtual void pick_current_item (int state) = 0; virtual void pick_current_item (Duple const &, int state) = 0; diff --git a/libs/canvas/canvas/circle.h b/libs/canvas/canvas/circle.h index 1ca376a7a2..c84e3aceec 100644 --- a/libs/canvas/canvas/circle.h +++ b/libs/canvas/canvas/circle.h @@ -29,7 +29,7 @@ class LIBCANVAS_API Circle : public Arc { public: Circle (Canvas*); - Circle (Group*); + Circle (Item*); }; } diff --git a/libs/canvas/canvas/curve.h b/libs/canvas/canvas/curve.h index 1bcab58e32..d27291e353 100644 --- a/libs/canvas/canvas/curve.h +++ b/libs/canvas/canvas/curve.h @@ -33,7 +33,7 @@ class LIBCANVAS_API Curve : public PolyItem, public InterpolatedCurve { public: Curve (Canvas*); - Curve (Group*); + Curve (Item*); enum CurveFill { None, diff --git a/libs/canvas/canvas/flag.h b/libs/canvas/canvas/flag.h index 2429e1775e..05c0e2777d 100644 --- a/libs/canvas/canvas/flag.h +++ b/libs/canvas/canvas/flag.h @@ -18,8 +18,8 @@ */ #include "canvas/visibility.h" -#include "canvas/group.h" #include "canvas/types.h" +#include "canvas/layout.h" namespace ArdourCanvas { @@ -27,11 +27,11 @@ class Text; class Line; class Rectangle; -class LIBCANVAS_API Flag : public Group +class LIBCANVAS_API Flag : public Layout { public: Flag (Canvas *, Distance, Color, Color, Duple); - Flag (Group*, Distance, Color, Color, Duple); + Flag (Item*, Distance, Color, Color, Duple); void set_text (std::string const &); void set_height (Distance); diff --git a/libs/canvas/canvas/fwd.h b/libs/canvas/canvas/fwd.h index 728e6988d4..61cab3c9d2 100644 --- a/libs/canvas/canvas/fwd.h +++ b/libs/canvas/canvas/fwd.h @@ -33,6 +33,7 @@ namespace ArdourCanvas { class GtkCanvasViewport; class Text; class Curve; + class ScrollGroup; } #endif /* __canvas_canvas_fwd_h__ */ diff --git a/libs/canvas/canvas/group.h b/libs/canvas/canvas/group.h deleted file mode 100644 index 6bfc40ba28..0000000000 --- a/libs/canvas/canvas/group.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - Copyright (C) 2011-2013 Paul Davis - Author: Carl Hetherington <cth@carlh.net> - - This program 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 program 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef __CANVAS_GROUP_H__ -#define __CANVAS_GROUP_H__ - -#include <list> -#include <vector> - -#include "canvas/visibility.h" -#include "canvas/item.h" -#include "canvas/types.h" -#include "canvas/lookup_table.h" - -namespace ArdourCanvas { - -class LIBCANVAS_API Group : public Item -{ -public: - Group (Canvas*); - Group (Group*); - Group (Group*, Duple const& positon); - virtual ~Group (); - - void render (Rect const &, Cairo::RefPtr<Cairo::Context>) const; - virtual void compute_bounding_box () const; - - void add (Item *); - void remove (Item *); - void clear (bool with_delete = false); - std::list<Item*> const & items () const { - return _items; - } - - void raise_child_to_top (Item *); - void raise_child (Item *, int); - void lower_child_to_bottom (Item *); - void child_changed (); - - void scroll_to (Duple const& d); - - void add_items_at_point (Duple, std::vector<Item const *> &) const; - - void dump (std::ostream&) const; - - static int default_items_per_cell; - -private: - friend class ::OptimizingLookupTableTest; - - void ensure_lut () const; - void invalidate_lut () const; - void clear_items (bool with_delete); - - /* our items, from lowest to highest in the stack */ - std::list<Item*> _items; - - mutable LookupTable* _lut; -}; - -} - -#endif diff --git a/libs/canvas/canvas/image.h b/libs/canvas/canvas/image.h index fd86818c21..64d70a5751 100644 --- a/libs/canvas/canvas/image.h +++ b/libs/canvas/canvas/image.h @@ -35,7 +35,7 @@ class LIBCANVAS_API Image : public Item { public: Image (Canvas *, Cairo::Format, int width, int height); - Image (Group*, Cairo::Format, int width, int height); + Image (Item*, Cairo::Format, int width, int height); struct Data { Data (uint8_t *d, int w, int h, int s, Cairo::Format fmt) diff --git a/libs/canvas/canvas/item.h b/libs/canvas/canvas/item.h index bf752f66db..ced94e1e3b 100644 --- a/libs/canvas/canvas/item.h +++ b/libs/canvas/canvas/item.h @@ -32,12 +32,12 @@ #include "canvas/types.h" #include "canvas/fill.h" #include "canvas/outline.h" +#include "canvas/lookup_table.h" namespace ArdourCanvas { class Canvas; -class Group; class Rect; class ScrollGroup; @@ -56,8 +56,8 @@ class LIBCANVAS_API Item : public Fill, public Outline { public: Item (Canvas *); - Item (Group *); - Item (Group *, Duple const& p); + Item (Item *); + Item (Item *, Duple const& p); virtual ~Item (); void redraw () const; @@ -80,13 +80,11 @@ public: * * Note that Item::add_items_at_window_point() is only intended to be * called on items already looked up in a LookupTable (i.e. by a - * parent group) and thus known to cover @param point already. + * parent) and thus known to cover @param point already. * - * Derived classes may add more items than themselves (e.g. Group). + * Derived classes may add more items than themselves (e.g. containers). */ - virtual void add_items_at_point (Duple /*point*/, std::vector<Item const *>& items) const { - items.push_back (this); - } + virtual void add_items_at_point (Duple /*point*/, std::vector<Item const *>& items) const; virtual bool covers (Duple const &) const; @@ -97,10 +95,10 @@ public: void ungrab (); void unparent (); - void reparent (Group *); + void reparent (Item *); /** @return Parent group, or 0 if this is the root group */ - Group* parent () const { + Item* parent () const { return _parent; } @@ -124,8 +122,6 @@ public: void set_y_position (Coord); void move (Duple); - virtual void scroll_to (Duple const&) {} - /** @return Position of this item in the parent's coordinates */ Duple position () const { return _position; @@ -187,6 +183,21 @@ public: void set_data (std::string const &, void *); void* get_data (std::string const &) const; + + /* nested item ("grouping") API */ + void add (Item *); + void remove (Item *); + void clear (bool with_delete = false); + std::list<Item*> const & items () const { + return _items; + } + void raise_child_to_top (Item *); + void raise_child (Item *, int); + void lower_child_to_bottom (Item *); + void child_changed (); + + static int default_items_per_cell; + /* This is a sigc++ signal because it is solely concerned with GUI stuff and is thus single-threaded @@ -243,7 +254,7 @@ protected: Canvas* _canvas; /** parent group; may be 0 if we are the root group or if we have been unparent()ed */ - Group* _parent; + Item* _parent; /** scroll parent group; may be 0 if we are the root group or if we have been unparent()ed */ ScrollGroup* _scroll_parent; /** position of this item in parent coordinates */ @@ -261,6 +272,18 @@ protected: /* XXX: this is a bit grubby */ std::map<std::string, void *> _data; + /* nesting ("grouping") API */ + + void invalidate_lut () const; + void clear_items (bool with_delete); + + void ensure_lut () const; + mutable LookupTable* _lut; + /* our items, from lowest to highest in the stack */ + std::list<Item*> _items; + + void add_child_bounding_boxes() const; + private: void init (); diff --git a/libs/canvas/canvas/line.h b/libs/canvas/canvas/line.h index e8f57a00ba..b178554c84 100644 --- a/libs/canvas/canvas/line.h +++ b/libs/canvas/canvas/line.h @@ -31,7 +31,7 @@ class LIBCANVAS_API Line : public Item { public: Line (Canvas*); - Line (Group*); + Line (Item*); void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const; void compute_bounding_box () const; diff --git a/libs/canvas/canvas/line_set.h b/libs/canvas/canvas/line_set.h index 38f97250ce..fad100fdf9 100644 --- a/libs/canvas/canvas/line_set.h +++ b/libs/canvas/canvas/line_set.h @@ -36,7 +36,7 @@ public: }; LineSet (Canvas*, Orientation o = Vertical); - LineSet (Group*, Orientation o = Vertical); + LineSet (Item*, Orientation o = Vertical); void compute_bounding_box () const; void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const; diff --git a/libs/canvas/canvas/lookup_table.h b/libs/canvas/canvas/lookup_table.h index 5be33c1bca..29452365cd 100644 --- a/libs/canvas/canvas/lookup_table.h +++ b/libs/canvas/canvas/lookup_table.h @@ -31,12 +31,11 @@ class OptimizingLookupTableTest; namespace ArdourCanvas { class Item; -class Group; class LIBCANVAS_API LookupTable { public: - LookupTable (Group const &); + LookupTable (Item const &); virtual ~LookupTable (); virtual std::vector<Item*> get (Rect const &) = 0; @@ -45,13 +44,13 @@ public: protected: - Group const & _group; + Item const & _item; }; class LIBCANVAS_API DumbLookupTable : public LookupTable { public: - DumbLookupTable (Group const &); + DumbLookupTable (Item const &); std::vector<Item*> get (Rect const &); std::vector<Item*> items_at_point (Duple const &) const; @@ -61,7 +60,7 @@ public: class LIBCANVAS_API OptimizingLookupTable : public LookupTable { public: - OptimizingLookupTable (Group const &, int); + OptimizingLookupTable (Item const &, int); ~OptimizingLookupTable (); std::vector<Item*> get (Rect const &); std::vector<Item*> items_at_point (Duple const &) const; diff --git a/libs/canvas/canvas/pixbuf.h b/libs/canvas/canvas/pixbuf.h index eba73e57bf..2749b96668 100644 --- a/libs/canvas/canvas/pixbuf.h +++ b/libs/canvas/canvas/pixbuf.h @@ -35,7 +35,7 @@ class LIBCANVAS_API Pixbuf : public Item { public: Pixbuf (Canvas*); - Pixbuf (Group*); + Pixbuf (Item*); void render (Rect const &, Cairo::RefPtr<Cairo::Context>) const; void compute_bounding_box () const; diff --git a/libs/canvas/canvas/poly_item.h b/libs/canvas/canvas/poly_item.h index ab68204ff0..732adb14b3 100644 --- a/libs/canvas/canvas/poly_item.h +++ b/libs/canvas/canvas/poly_item.h @@ -30,7 +30,7 @@ class LIBCANVAS_API PolyItem : public Item { public: PolyItem (Canvas*); - PolyItem (Group*); + PolyItem (Item*); void compute_bounding_box () const; diff --git a/libs/canvas/canvas/poly_line.h b/libs/canvas/canvas/poly_line.h index 5476711e97..16db9a69e2 100644 --- a/libs/canvas/canvas/poly_line.h +++ b/libs/canvas/canvas/poly_line.h @@ -30,7 +30,7 @@ class LIBCANVAS_API PolyLine : public PolyItem { public: PolyLine (Canvas*); - PolyLine (Group*); + PolyLine (Item*); void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const; diff --git a/libs/canvas/canvas/polygon.h b/libs/canvas/canvas/polygon.h index a3eed37cdc..9703eb46e9 100644 --- a/libs/canvas/canvas/polygon.h +++ b/libs/canvas/canvas/polygon.h @@ -31,7 +31,7 @@ class LIBCANVAS_API Polygon : public PolyItem { public: Polygon (Canvas*); - Polygon (Group*); + Polygon (Item*); virtual ~Polygon(); void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const; diff --git a/libs/canvas/canvas/rectangle.h b/libs/canvas/canvas/rectangle.h index ff6eca3cd9..2983d33ed2 100644 --- a/libs/canvas/canvas/rectangle.h +++ b/libs/canvas/canvas/rectangle.h @@ -34,8 +34,8 @@ class LIBCANVAS_API Rectangle : public Item public: Rectangle (Canvas*); Rectangle (Canvas*, Rect const &); - Rectangle (Group*); - Rectangle (Group*, Rect const &); + Rectangle (Item*); + Rectangle (Item*, Rect const &); void render (Rect const &, Cairo::RefPtr<Cairo::Context>) const; void compute_bounding_box () const; diff --git a/libs/canvas/canvas/root_group.h b/libs/canvas/canvas/root_group.h index 70c3e5b90b..5db8024f51 100644 --- a/libs/canvas/canvas/root_group.h +++ b/libs/canvas/canvas/root_group.h @@ -21,19 +21,18 @@ #define __CANVAS_ROOT_GROUP_H__ #include "canvas/visibility.h" -#include "canvas/group.h" +#include "canvas/layout.h" namespace ArdourCanvas { -class LIBCANVAS_API RootGroup : public Group +class LIBCANVAS_API Root : public Layout { private: friend class Canvas; - RootGroup (Canvas *); + Root (Canvas *); void compute_bounding_box () const; - void child_changed (); }; } diff --git a/libs/canvas/canvas/ruler.h b/libs/canvas/canvas/ruler.h index 633a1d569e..25040247c9 100644 --- a/libs/canvas/canvas/ruler.h +++ b/libs/canvas/canvas/ruler.h @@ -57,8 +57,8 @@ public: Ruler (Canvas*, const Metric& m); Ruler (Canvas*, const Metric& m, Rect const&); - Ruler (Group*, const Metric& m); - Ruler (Group*, const Metric& m, Rect const&); + Ruler (Item*, const Metric& m); + Ruler (Item*, const Metric& m, Rect const&); void set_range (double lower, double upper); void set_font_description (Pango::FontDescription); diff --git a/libs/canvas/canvas/scroll_group.h b/libs/canvas/canvas/scroll_group.h index 552538eb21..013d769c2f 100644 --- a/libs/canvas/canvas/scroll_group.h +++ b/libs/canvas/canvas/scroll_group.h @@ -19,11 +19,15 @@ #ifndef __CANVAS_SCROLL_GROUP_H__ #define __CANVAS_SCROLL_GROUP_H__ -#include "canvas/group.h" +#include "canvas/layout.h" namespace ArdourCanvas { -class LIBCANVAS_API ScrollGroup : public Group +/** A ScrollGroup has no contents of its own, but renders + * its children in a way that reflects the most recent + * call to its scroll_to() method. + */ +class LIBCANVAS_API ScrollGroup : public Layout { public: enum ScrollSensitivity { @@ -32,7 +36,7 @@ class LIBCANVAS_API ScrollGroup : public Group }; ScrollGroup (Canvas*, ScrollSensitivity); - ScrollGroup (Group*, ScrollSensitivity); + ScrollGroup (Item*, ScrollSensitivity); void scroll_to (Duple const& d); Duple scroll_offset() const { return _scroll_offset; } diff --git a/libs/canvas/canvas/stateful_image.h b/libs/canvas/canvas/stateful_image.h index 5952752e71..7c00b0c5a4 100644 --- a/libs/canvas/canvas/stateful_image.h +++ b/libs/canvas/canvas/stateful_image.h @@ -50,7 +50,7 @@ class StatefulImage : public Item public: StatefulImage (Canvas*, const XMLNode&); - StatefulImage (Group*, const XMLNode&); + StatefulImage (Item*, const XMLNode&); ~StatefulImage (); bool set_state (States::size_type); diff --git a/libs/canvas/canvas/text.h b/libs/canvas/canvas/text.h index cc6d5c815d..85262ee984 100644 --- a/libs/canvas/canvas/text.h +++ b/libs/canvas/canvas/text.h @@ -32,7 +32,7 @@ class LIBCANVAS_API Text : public Item { public: Text (Canvas*); - Text (Group*); + Text (Item*); ~Text(); void render (Rect const &, Cairo::RefPtr<Cairo::Context>) const; diff --git a/libs/canvas/canvas/wave_view.h b/libs/canvas/canvas/wave_view.h index c98c62c7a3..042414e1e2 100644 --- a/libs/canvas/canvas/wave_view.h +++ b/libs/canvas/canvas/wave_view.h @@ -92,7 +92,7 @@ public: WaveView (Canvas *, boost::shared_ptr<ARDOUR::AudioRegion>); - WaveView (Group*, boost::shared_ptr<ARDOUR::AudioRegion>); + WaveView (Item*, boost::shared_ptr<ARDOUR::AudioRegion>); ~WaveView (); void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const; diff --git a/libs/canvas/canvas/widget.h b/libs/canvas/canvas/widget.h index 842f336a51..590bb3af7d 100644 --- a/libs/canvas/canvas/widget.h +++ b/libs/canvas/canvas/widget.h @@ -32,7 +32,7 @@ class LIBCANVAS_API Widget : public Item { public: Widget (Canvas*, CairoWidget&); - Widget (Group*, CairoWidget&); + Widget (Item*, CairoWidget&); void render (Rect const &, Cairo::RefPtr<Cairo::Context>) const; void compute_bounding_box () const; diff --git a/libs/canvas/canvas/xfade_curve.h b/libs/canvas/canvas/xfade_curve.h index d6a10d1f86..c63e47c583 100644 --- a/libs/canvas/canvas/xfade_curve.h +++ b/libs/canvas/canvas/xfade_curve.h @@ -36,8 +36,8 @@ public: XFadeCurve (Canvas *); XFadeCurve (Canvas *, XFadePosition); - XFadeCurve (Group*); - XFadeCurve (Group*, XFadePosition); + XFadeCurve (Item*); + XFadeCurve (Item*, XFadePosition); void set_fade_position (XFadePosition xfp) { _xfadeposition = xfp; } diff --git a/libs/canvas/circle.cc b/libs/canvas/circle.cc index 3799bf60ac..1859434123 100644 --- a/libs/canvas/circle.cc +++ b/libs/canvas/circle.cc @@ -26,8 +26,8 @@ Circle::Circle (Canvas* c) set_arc (360.0); } -Circle::Circle (Group* g) - : Arc (g) +Circle::Circle (Item * parent) + : Arc (parent) { set_arc (360.0); } diff --git a/libs/canvas/curve.cc b/libs/canvas/curve.cc index 547783ae08..ba6ac68df6 100644 --- a/libs/canvas/curve.cc +++ b/libs/canvas/curve.cc @@ -36,8 +36,8 @@ Curve::Curve (Canvas* c) { } -Curve::Curve (Group* g) - : PolyItem (g) +Curve::Curve (Item* parent) + : PolyItem (parent) , n_samples (0) , points_per_segment (16) , curve_type (CatmullRomCentripetal) diff --git a/libs/canvas/flag.cc b/libs/canvas/flag.cc index f5379791df..b6532d7fd2 100644 --- a/libs/canvas/flag.cc +++ b/libs/canvas/flag.cc @@ -26,15 +26,15 @@ using namespace std; using namespace ArdourCanvas; Flag::Flag (Canvas* canvas, Distance height, Color outline_color, Color fill_color, Duple position) - : Group (canvas) + : Layout (canvas) , _outline_color (outline_color) , _fill_color (fill_color) { setup (height, position); } -Flag::Flag (Group* group, Distance height, Color outline_color, Color fill_color, Duple position) - : Group (group) +Flag::Flag (Item* parent, Distance height, Color outline_color, Color fill_color, Duple position) + : Layout (parent) , _outline_color (outline_color) , _fill_color (fill_color) { diff --git a/libs/canvas/group.cc b/libs/canvas/group.cc deleted file mode 100644 index d63b217396..0000000000 --- a/libs/canvas/group.cc +++ /dev/null @@ -1,395 +0,0 @@ -/* - Copyright (C) 2011-2013 Paul Davis - Author: Carl Hetherington <cth@carlh.net> - - This program 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 program 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include <iostream> -#include <cairomm/context.h> - -#include "pbd/stacktrace.h" -#include "pbd/compose.h" - -#include "canvas/group.h" -#include "canvas/types.h" -#include "canvas/debug.h" -#include "canvas/item.h" -#include "canvas/canvas.h" - -using namespace std; -using namespace ArdourCanvas; - -int Group::default_items_per_cell = 64; - - -Group::Group (Canvas* canvas) - : Item (canvas) - , _lut (0) -{ -} - -Group::Group (Group* group) - : Item (group) - , _lut (0) -{ -} - -Group::Group (Group* group, Duple const& p) - : Item (group, p) - , _lut (0) -{ -} - -Group::~Group () -{ - clear_items (true); -} - -/** @param area Area to draw in window coordinates. - * @param context Context, set up with its origin at this group's position. - */ -void -Group::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const -{ - ensure_lut (); - vector<Item*> items = _lut->get (area); - -#ifdef CANVAS_DEBUG - if (DEBUG_ENABLED(PBD::DEBUG::CanvasRender)) { - cerr << string_compose ("%1GROUP %2 @ %7 render %5 @ %6 %3 items out of %4\n", - _canvas->render_indent(), (name.empty() ? string ("[unnamed]") : name), items.size(), _items.size(), area, _position, this); - } -#endif - - ++render_depth; - - for (vector<Item*>::const_iterator i = items.begin(); i != items.end(); ++i) { - - if (!(*i)->visible ()) { -#ifdef CANVAS_DEBUG - if (DEBUG_ENABLED(PBD::DEBUG::CanvasRender)) { - cerr << _canvas->render_indent() << "Item " << (*i)->whatami() << " [" << (*i)->name << "] invisible - skipped\n"; - } -#endif - continue; - } - - boost::optional<Rect> item_bbox = (*i)->bounding_box (); - - if (!item_bbox) { -#ifdef CANVAS_DEBUG - if (DEBUG_ENABLED(PBD::DEBUG::CanvasRender)) { - cerr << _canvas->render_indent() << "Item " << (*i)->whatami() << " [" << (*i)->name << "] empty - skipped\n"; - } -#endif - continue; - } - - Rect item = (*i)->item_to_window (item_bbox.get()); - boost::optional<Rect> d = item.intersection (area); - - if (d) { - Rect draw = d.get(); - if (draw.width() && draw.height()) { -#ifdef CANVAS_DEBUG - if (DEBUG_ENABLED(PBD::DEBUG::CanvasRender)) { - if (dynamic_cast<Group*>(*i) == 0) { - cerr << _canvas->render_indent() << "render " - << ' ' - << (*i) - << ' ' - << (*i)->whatami() - << ' ' - << (*i)->name - << " item " - << item_bbox.get() - << " window = " - << item - << " intersect = " - << draw - << " @ " - << _position - << endl; - } - } -#endif - - (*i)->render (area, context); - ++render_count; - } - - } else { - -#ifdef CANVAS_DEBUG - if (DEBUG_ENABLED(PBD::DEBUG::CanvasRender)) { - cerr << string_compose ("%1skip render of %2 %3, no intersection between %4 and %5\n", _canvas->render_indent(), (*i)->whatami(), - (*i)->name, item, area); - } -#endif - - } - } - - --render_depth; -} - -void -Group::scroll_to (Duple const& d) -{ - Item::scroll_to (d); - - for (list<Item*>::iterator i = _items.begin(); i != _items.end(); ++i) { - (*i)->scroll_to (d); - } -} - -void -Group::compute_bounding_box () const -{ - Rect bbox; - bool have_one = false; - - for (list<Item*>::const_iterator i = _items.begin(); i != _items.end(); ++i) { - - boost::optional<Rect> item_bbox = (*i)->bounding_box (); - - if (!item_bbox) { - continue; - } - - Rect group_bbox = (*i)->item_to_parent (item_bbox.get ()); - if (have_one) { - bbox = bbox.extend (group_bbox); - } else { - bbox = group_bbox; - have_one = true; - } - } - - if (!have_one) { - _bounding_box = boost::optional<Rect> (); - } else { - _bounding_box = bbox; - } - - _bounding_box_dirty = false; -} - -void -Group::add (Item* i) -{ - /* XXX should really notify canvas about this */ - - _items.push_back (i); - i->reparent (this); - invalidate_lut (); - _bounding_box_dirty = true; -} - -void -Group::remove (Item* i) -{ - - if (i->parent() != this) { - return; - } - - /* we cannot call bounding_box() here because that will iterate over - _items, one of which (the argument, i) may be in the middle of - deletion, making it impossible to call compute_bounding_box() - on it. - */ - - if (_bounding_box) { - _pre_change_bounding_box = _bounding_box; - } else { - _pre_change_bounding_box = Rect(); - } - - i->unparent (); - _items.remove (i); - invalidate_lut (); - _bounding_box_dirty = true; - - end_change (); -} - -void -Group::clear (bool with_delete) -{ - begin_change (); - - clear_items (with_delete); - - invalidate_lut (); - _bounding_box_dirty = true; - - end_change (); -} - -void -Group::clear_items (bool with_delete) -{ - for (list<Item*>::iterator i = _items.begin(); i != _items.end(); ) { - - list<Item*>::iterator tmp = i; - Item *item = *i; - - ++tmp; - - /* remove from list before doing anything else, because we - * don't want to find the item in _items during any activity - * driven by unparent-ing or deletion. - */ - - _items.erase (i); - item->unparent (); - - if (with_delete) { - delete item; - } - - i = tmp; - } -} - -void -Group::raise_child_to_top (Item* i) -{ - if (!_items.empty()) { - if (_items.back() == i) { - return; - } - } - - _items.remove (i); - _items.push_back (i); - invalidate_lut (); -} - -void -Group::raise_child (Item* i, int levels) -{ - list<Item*>::iterator j = find (_items.begin(), _items.end(), i); - assert (j != _items.end ()); - - ++j; - _items.remove (i); - - while (levels > 0 && j != _items.end ()) { - ++j; - --levels; - } - - _items.insert (j, i); - invalidate_lut (); -} - -void -Group::lower_child_to_bottom (Item* i) -{ - if (!_items.empty()) { - if (_items.front() == i) { - return; - } - } - _items.remove (i); - _items.push_front (i); - invalidate_lut (); -} - -void -Group::ensure_lut () const -{ - if (!_lut) { - _lut = new DumbLookupTable (*this); - } -} - -void -Group::invalidate_lut () const -{ - delete _lut; - _lut = 0; -} - -void -Group::child_changed () -{ - invalidate_lut (); - _bounding_box_dirty = true; - - if (_parent) { - _parent->child_changed (); - } -} - -void -Group::add_items_at_point (Duple const point, vector<Item const *>& items) const -{ - boost::optional<Rect> const bbox = bounding_box (); - - /* Point is in window coordinate system */ - - if (!bbox || !item_to_window (bbox.get()).contains (point)) { - return; - } - - /* now recurse and add any items within our group that contain point */ - - ensure_lut (); - vector<Item*> our_items = _lut->items_at_point (point); - - if (!our_items.empty()) { - /* this adds this group itself to the list of items at point */ - Item::add_items_at_point (point, items); - } - - for (vector<Item*>::iterator i = our_items.begin(); i != our_items.end(); ++i) { - (*i)->add_items_at_point (point, items); - } -} - -void -Group::dump (ostream& o) const -{ -#ifdef CANVAS_DEBUG - o << _canvas->indent(); - o << "Group " << this << " [" << name << ']'; - o << " @ " << position(); - o << " Items: " << _items.size(); - o << " Visible ? " << _visible; - - boost::optional<Rect> bb = bounding_box(); - - if (bb) { - o << endl << _canvas->indent() << " bbox: " << bb.get(); - o << endl << _canvas->indent() << " CANVAS bbox: " << item_to_canvas (bb.get()); - } else { - o << " bbox unset"; - } - - o << endl; -#endif - - ArdourCanvas::dump_depth++; - - for (list<Item*>::const_iterator i = _items.begin(); i != _items.end(); ++i) { - o << **i; - } - - ArdourCanvas::dump_depth--; -} diff --git a/libs/canvas/image.cc b/libs/canvas/image.cc index 5ab280cbbc..46cadd0d1c 100644 --- a/libs/canvas/image.cc +++ b/libs/canvas/image.cc @@ -32,8 +32,8 @@ Image::Image (Canvas* canvas, Cairo::Format fmt, int width, int height) DataReady.connect (data_connections, MISSING_INVALIDATOR, boost::bind (&Image::accept_data, this), gui_context()); } -Image::Image (Group* group, Cairo::Format fmt, int width, int height) - : Item (group) +Image::Image (Item* parent, Cairo::Format fmt, int width, int height) + : Item (parent) , _format (fmt) , _width (width) , _height (height) diff --git a/libs/canvas/item.cc b/libs/canvas/item.cc index ea77008b5f..e58411f17f 100644 --- a/libs/canvas/item.cc +++ b/libs/canvas/item.cc @@ -25,7 +25,6 @@ #include "canvas/canvas.h" #include "canvas/debug.h" -#include "canvas/group.h" #include "canvas/item.h" #include "canvas/scroll_group.h" @@ -33,6 +32,8 @@ using namespace std; using namespace PBD; using namespace ArdourCanvas; +int Item::default_items_per_cell = 64; + Item::Item (Canvas* canvas) : Fill (*this) , Outline (*this) @@ -41,12 +42,13 @@ Item::Item (Canvas* canvas) , _scroll_parent (0) , _visible (true) , _bounding_box_dirty (true) + , _lut (0) , _ignore_events (false) { DEBUG_TRACE (DEBUG::CanvasItems, string_compose ("new canvas item %1\n", this)); } -Item::Item (Group* parent) +Item::Item (Item* parent) : Fill (*this) , Outline (*this) , _canvas (parent->canvas()) @@ -54,6 +56,7 @@ Item::Item (Group* parent) , _scroll_parent (0) , _visible (true) , _bounding_box_dirty (true) + , _lut (0) , _ignore_events (false) { DEBUG_TRACE (DEBUG::CanvasItems, string_compose ("new canvas item %1\n", this)); @@ -65,7 +68,7 @@ Item::Item (Group* parent) find_scroll_parent (); } -Item::Item (Group* parent, Duple const& p) +Item::Item (Item* parent, Duple const& p) : Fill (*this) , Outline (*this) , _canvas (parent->canvas()) @@ -74,6 +77,7 @@ Item::Item (Group* parent, Duple const& p) , _position (p) , _visible (true) , _bounding_box_dirty (true) + , _lut (0) , _ignore_events (false) { DEBUG_TRACE (DEBUG::CanvasItems, string_compose ("new canvas item %1\n", this)); @@ -95,6 +99,9 @@ Item::~Item () if (_canvas) { _canvas->item_going_away (this, _bounding_box); } + + clear_items (true); + delete _lut; } Duple @@ -350,7 +357,7 @@ Item::unparent () } void -Item::reparent (Group* new_parent) +Item::reparent (Item* new_parent) { if (new_parent == _parent) { return; @@ -516,6 +523,7 @@ Item::bounding_box () const if (_bounding_box_dirty) { compute_bounding_box (); assert (!_bounding_box_dirty); + add_child_bounding_boxes (); } return _bounding_box; @@ -626,30 +634,6 @@ Item::set_ignore_events (bool ignore) _ignore_events = ignore; } -void -Item::dump (ostream& o) const -{ - boost::optional<ArdourCanvas::Rect> bb = bounding_box(); - - o << _canvas->indent() << whatami() << ' ' << this << " Visible ? " << _visible; - o << " @ " << position(); - -#ifdef CANVAS_DEBUG - if (!name.empty()) { - o << ' ' << name; - } -#endif - - if (bb) { - o << endl << _canvas->indent() << "\tbbox: " << bb.get(); - o << endl << _canvas->indent() << "\tCANVAS bbox: " << item_to_canvas (bb.get()); - } else { - o << " bbox unset"; - } - - o << endl; -} - std::string Item::whatami () const { @@ -687,6 +671,276 @@ Item::covers (Duple const & point) const return r.get().contains (p); } +/* nesting/grouping API */ + +void +Item::add_child_bounding_boxes() const +{ + boost::optional<Rect> self; + Rect bbox; + bool have_one = false; + + if (_bounding_box) { + bbox = _bounding_box.get(); + have_one = true; + } + + for (list<Item*>::const_iterator i = _items.begin(); i != _items.end(); ++i) { + + boost::optional<Rect> item_bbox = (*i)->bounding_box (); + + if (!item_bbox) { + continue; + } + + Rect group_bbox = (*i)->item_to_parent (item_bbox.get ()); + if (have_one) { + bbox = bbox.extend (group_bbox); + } else { + bbox = group_bbox; + have_one = true; + } + } + + if (!have_one) { + _bounding_box = boost::optional<Rect> (); + } else { + _bounding_box = bbox; + } +} + +void +Item::add (Item* i) +{ + /* XXX should really notify canvas about this */ + + _items.push_back (i); + i->reparent (this); + invalidate_lut (); + _bounding_box_dirty = true; +} + +void +Item::remove (Item* i) +{ + + if (i->parent() != this) { + return; + } + + /* we cannot call bounding_box() here because that will iterate over + _items, one of which (the argument, i) may be in the middle of + deletion, making it impossible to call compute_bounding_box() + on it. + */ + + if (_bounding_box) { + _pre_change_bounding_box = _bounding_box; + } else { + _pre_change_bounding_box = Rect(); + } + + i->unparent (); + _items.remove (i); + invalidate_lut (); + _bounding_box_dirty = true; + + end_change (); +} + +void +Item::clear (bool with_delete) +{ + begin_change (); + + clear_items (with_delete); + + invalidate_lut (); + _bounding_box_dirty = true; + + end_change (); +} + +void +Item::clear_items (bool with_delete) +{ + for (list<Item*>::iterator i = _items.begin(); i != _items.end(); ) { + + list<Item*>::iterator tmp = i; + Item *item = *i; + + ++tmp; + + /* remove from list before doing anything else, because we + * don't want to find the item in _items during any activity + * driven by unparent-ing or deletion. + */ + + _items.erase (i); + item->unparent (); + + if (with_delete) { + delete item; + } + + i = tmp; + } +} + +void +Item::raise_child_to_top (Item* i) +{ + if (!_items.empty()) { + if (_items.back() == i) { + return; + } + } + + _items.remove (i); + _items.push_back (i); + invalidate_lut (); +} + +void +Item::raise_child (Item* i, int levels) +{ + list<Item*>::iterator j = find (_items.begin(), _items.end(), i); + assert (j != _items.end ()); + + ++j; + _items.remove (i); + + while (levels > 0 && j != _items.end ()) { + ++j; + --levels; + } + + _items.insert (j, i); + invalidate_lut (); +} + +void +Item::lower_child_to_bottom (Item* i) +{ + if (!_items.empty()) { + if (_items.front() == i) { + return; + } + } + _items.remove (i); + _items.push_front (i); + invalidate_lut (); +} + +void +Item::ensure_lut () const +{ + if (!_lut) { + _lut = new DumbLookupTable (*this); + } +} + +void +Item::invalidate_lut () const +{ + delete _lut; + _lut = 0; +} + +void +Item::child_changed () +{ + invalidate_lut (); + _bounding_box_dirty = true; + + if (_parent) { + _parent->child_changed (); + } +} + +void +Item::add_items_at_point (Duple const point, vector<Item const *>& items) const +{ + boost::optional<Rect> const bbox = bounding_box (); + + /* Point is in window coordinate system */ + + if (!bbox || !item_to_window (bbox.get()).contains (point)) { + return; + } + + /* recurse and add any items within our group that contain point */ + + vector<Item*> our_items; + + if (!_items.empty()) { + ensure_lut (); + our_items = _lut->items_at_point (point); + } + + if (!our_items.empty() || covers (point)) { + /* this adds this item itself to the list of items at point */ + items.push_back (this); + } + + for (vector<Item*>::iterator i = our_items.begin(); i != our_items.end(); ++i) { + (*i)->add_items_at_point (point, items); + } +} + +void +Item::dump (ostream& o) const +{ + boost::optional<ArdourCanvas::Rect> bb = bounding_box(); + + o << _canvas->indent() << whatami() << ' ' << this << " Visible ? " << _visible; + o << " @ " << position(); + +#ifdef CANVAS_DEBUG + if (!name.empty()) { + o << ' ' << name; + } +#endif + + if (bb) { + o << endl << _canvas->indent() << "\tbbox: " << bb.get(); + o << endl << _canvas->indent() << "\tCANVAS bbox: " << item_to_canvas (bb.get()); + } else { + o << " bbox unset"; + } + + o << endl; + + if (!_items.empty()) { + +#ifdef CANVAS_DEBUG + o << _canvas->indent(); + o << " @ " << position(); + o << " Items: " << _items.size(); + o << " Visible ? " << _visible; + + boost::optional<Rect> bb = bounding_box(); + + if (bb) { + o << endl << _canvas->indent() << " bbox: " << bb.get(); + o << endl << _canvas->indent() << " CANVAS bbox: " << item_to_canvas (bb.get()); + } else { + o << " bbox unset"; + } + + o << endl; +#endif + + ArdourCanvas::dump_depth++; + + for (list<Item*>::const_iterator i = _items.begin(); i != _items.end(); ++i) { + o << **i; + } + + ArdourCanvas::dump_depth--; + } +} + ostream& ArdourCanvas::operator<< (ostream& o, const Item& i) { diff --git a/libs/canvas/line.cc b/libs/canvas/line.cc index 844f05522d..8bd26b9067 100644 --- a/libs/canvas/line.cc +++ b/libs/canvas/line.cc @@ -34,8 +34,8 @@ Line::Line (Canvas* c) { } -Line::Line (Group* group) - : Item (group) +Line::Line (Item* parent) + : Item (parent) { } diff --git a/libs/canvas/line_set.cc b/libs/canvas/line_set.cc index 3eacadaba2..54fe980b1c 100644 --- a/libs/canvas/line_set.cc +++ b/libs/canvas/line_set.cc @@ -38,8 +38,8 @@ LineSet::LineSet (Canvas* c, Orientation o) } -LineSet::LineSet (Group* group, Orientation o) - : Item (group) +LineSet::LineSet (Item* parent, Orientation o) + : Item (parent) , _extent (0) , _orientation (o) { diff --git a/libs/canvas/lookup_table.cc b/libs/canvas/lookup_table.cc index 8e744638d8..2396f59635 100644 --- a/libs/canvas/lookup_table.cc +++ b/libs/canvas/lookup_table.cc @@ -17,14 +17,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "canvas/item.h" #include "canvas/lookup_table.h" -#include "canvas/group.h" using namespace std; using namespace ArdourCanvas; -LookupTable::LookupTable (Group const & group) - : _group (group) +LookupTable::LookupTable (Item const & item) + : _item (item) { } @@ -34,8 +34,8 @@ LookupTable::~LookupTable () } -DumbLookupTable::DumbLookupTable (Group const & group) - : LookupTable (group) +DumbLookupTable::DumbLookupTable (Item const & item) + : LookupTable (item) { } @@ -43,7 +43,7 @@ DumbLookupTable::DumbLookupTable (Group const & group) vector<Item *> DumbLookupTable::get (Rect const &) { - list<Item *> const & items = _group.items (); + list<Item *> const & items = _item.items (); vector<Item *> vitems; copy (items.begin(), items.end(), back_inserter (vitems)); return vitems; @@ -54,7 +54,7 @@ DumbLookupTable::items_at_point (Duple const & point) const { /* Point is in window coordinate system */ - list<Item *> const & items (_group.items ()); + list<Item *> const & items (_item.items ()); vector<Item *> vitems; for (list<Item *>::const_iterator i = items.begin(); i != items.end(); ++i) { @@ -73,7 +73,7 @@ DumbLookupTable::has_item_at_point (Duple const & point) const { /* Point is in window coordinate system */ - list<Item *> const & items (_group.items ()); + list<Item *> const & items (_item.items ()); vector<Item *> vitems; for (list<Item *>::const_iterator i = items.begin(); i != items.end(); ++i) { @@ -92,12 +92,12 @@ DumbLookupTable::has_item_at_point (Duple const & point) const return false; } -OptimizingLookupTable::OptimizingLookupTable (Group const & group, int items_per_cell) - : LookupTable (group) +OptimizingLookupTable::OptimizingLookupTable (Item const & item, int items_per_cell) + : LookupTable (item) , _items_per_cell (items_per_cell) , _added (false) { - list<Item*> const & items = _group.items (); + list<Item*> const & items = _item.items (); /* number of cells */ int const cells = items.size() / _items_per_cell; @@ -109,8 +109,8 @@ OptimizingLookupTable::OptimizingLookupTable (Group const & group, int items_per _cells[i] = new Cell[_dimension]; } - /* our group's bounding box in its coordinates */ - boost::optional<Rect> bbox = _group.bounding_box (); + /* our item's bounding box in its coordinates */ + boost::optional<Rect> bbox = _item.bounding_box (); if (!bbox) { return; } @@ -130,11 +130,11 @@ OptimizingLookupTable::OptimizingLookupTable (Group const & group, int items_per continue; } - /* and in the group's coordinates */ - Rect const item_bbox_in_group = (*i)->item_to_parent (item_bbox.get ()); + /* and in the item's coordinates */ + Rect const item_bbox_in_item = (*i)->item_to_parent (item_bbox.get ()); int x0, y0, x1, y1; - area_to_indices (item_bbox_in_group, x0, y0, x1, y1); + area_to_indices (item_bbox_in_item, x0, y0, x1, y1); /* XXX */ assert (x0 >= 0); @@ -147,19 +147,19 @@ OptimizingLookupTable::OptimizingLookupTable (Group const & group, int items_per //assert (y1 <= _dimension); if (x0 > _dimension) { - cout << "WARNING: item outside bbox by " << (item_bbox_in_group.x0 - bbox.get().x0) << "\n"; + cout << "WARNING: item outside bbox by " << (item_bbox_in_item.x0 - bbox.get().x0) << "\n"; x0 = _dimension; } if (x1 > _dimension) { - cout << "WARNING: item outside bbox by " << (item_bbox_in_group.x1 - bbox.get().x1) << "\n"; + cout << "WARNING: item outside bbox by " << (item_bbox_in_item.x1 - bbox.get().x1) << "\n"; x1 = _dimension; } if (y0 > _dimension) { - cout << "WARNING: item outside bbox by " << (item_bbox_in_group.y0 - bbox.get().y0) << "\n"; + cout << "WARNING: item outside bbox by " << (item_bbox_in_item.y0 - bbox.get().y0) << "\n"; y0 = _dimension; } if (y1 > _dimension) { - cout << "WARNING: item outside bbox by " << (item_bbox_in_group.y1 - bbox.get().y1) << "\n"; + cout << "WARNING: item outside bbox by " << (item_bbox_in_item.y1 - bbox.get().y1) << "\n"; y1 = _dimension; } @@ -284,7 +284,7 @@ OptimizingLookupTable::has_item_at_point (Duple const & point) const return false; } -/** @param area Area in our owning group's coordinates */ +/** @param area Area in our owning item's coordinates */ vector<Item*> OptimizingLookupTable::get (Rect const & area) { diff --git a/libs/canvas/pixbuf.cc b/libs/canvas/pixbuf.cc index 82eb916397..d285c41b10 100644 --- a/libs/canvas/pixbuf.cc +++ b/libs/canvas/pixbuf.cc @@ -30,8 +30,8 @@ Pixbuf::Pixbuf (Canvas* c) { } -Pixbuf::Pixbuf (Group* g) - : Item (g) +Pixbuf::Pixbuf (Item* parent) + : Item (parent) { } diff --git a/libs/canvas/poly_item.cc b/libs/canvas/poly_item.cc index 618983db97..d50c097e07 100644 --- a/libs/canvas/poly_item.cc +++ b/libs/canvas/poly_item.cc @@ -32,8 +32,8 @@ PolyItem::PolyItem (Canvas* c) { } -PolyItem::PolyItem (Group* g) - : Item (g) +PolyItem::PolyItem (Item* parent) + : Item (parent) { } diff --git a/libs/canvas/poly_line.cc b/libs/canvas/poly_line.cc index bade7d855e..60bca6bccf 100644 --- a/libs/canvas/poly_line.cc +++ b/libs/canvas/poly_line.cc @@ -31,8 +31,8 @@ PolyLine::PolyLine (Canvas* c) { } -PolyLine::PolyLine (Group* g) - : PolyItem (g) +PolyLine::PolyLine (Item* parent) + : PolyItem (parent) , _threshold (1.0) { } diff --git a/libs/canvas/polygon.cc b/libs/canvas/polygon.cc index d84bca4af6..aa16a60178 100644 --- a/libs/canvas/polygon.cc +++ b/libs/canvas/polygon.cc @@ -29,8 +29,8 @@ Polygon::Polygon (Canvas* c) { } -Polygon::Polygon (Group* g) - : PolyItem (g) +Polygon::Polygon (Item* parent) + : PolyItem (parent) , multiple (0) , constant (0) , cached_size (0) diff --git a/libs/canvas/rectangle.cc b/libs/canvas/rectangle.cc index ac05003693..bc4ad0c960 100644 --- a/libs/canvas/rectangle.cc +++ b/libs/canvas/rectangle.cc @@ -43,14 +43,14 @@ Rectangle::Rectangle (Canvas* c, Rect const & rect) { } -Rectangle::Rectangle (Group* g) - : Item (g) +Rectangle::Rectangle (Item* parent) + : Item (parent) , _outline_what ((What) (LEFT | RIGHT | TOP | BOTTOM)) { } -Rectangle::Rectangle (Group* g, Rect const & rect) - : Item (g) +Rectangle::Rectangle (Item* parent, Rect const & rect) + : Item (parent) , _rect (rect) , _outline_what ((What) (LEFT | RIGHT | TOP | BOTTOM)) { diff --git a/libs/canvas/root_group.cc b/libs/canvas/root_group.cc index cded570b2c..015f52bb54 100644 --- a/libs/canvas/root_group.cc +++ b/libs/canvas/root_group.cc @@ -23,8 +23,8 @@ using namespace std; using namespace ArdourCanvas; -RootGroup::RootGroup (Canvas* canvas) - : Group (canvas) +Root::Root (Canvas* canvas) + : Layout (canvas) { #ifdef CANVAS_DEBUG name = "ROOT"; @@ -32,11 +32,12 @@ RootGroup::RootGroup (Canvas* canvas) } void -RootGroup::compute_bounding_box () const +Root::compute_bounding_box () const { - Group::compute_bounding_box (); + Layout::compute_bounding_box (); if (_bounding_box) { - _canvas->request_size (Duple (_bounding_box.get().width (), _bounding_box.get().height ())); + Rect r (_bounding_box.get()); + _canvas->request_size (Duple (r.width (), r.height ())); } } diff --git a/libs/canvas/ruler.cc b/libs/canvas/ruler.cc index 1e7a731899..120ba845a5 100644 --- a/libs/canvas/ruler.cc +++ b/libs/canvas/ruler.cc @@ -49,8 +49,8 @@ Ruler::Ruler (Canvas* c, const Metric& m, Rect const& r) { } -Ruler::Ruler (Group* g, const Metric& m) - : Rectangle (g) +Ruler::Ruler (Item* parent, const Metric& m) + : Rectangle (parent) , _metric (m) , _lower (0) , _upper (0) @@ -58,8 +58,8 @@ Ruler::Ruler (Group* g, const Metric& m) { } -Ruler::Ruler (Group* g, const Metric& m, Rect const& r) - : Rectangle (g, r) +Ruler::Ruler (Item* parent, const Metric& m, Rect const& r) + : Rectangle (parent, r) , _metric (m) , _lower (0) , _upper (0) diff --git a/libs/canvas/scroll_group.cc b/libs/canvas/scroll_group.cc index d78caf4ed0..15b607a564 100644 --- a/libs/canvas/scroll_group.cc +++ b/libs/canvas/scroll_group.cc @@ -28,13 +28,13 @@ using namespace std; using namespace ArdourCanvas; ScrollGroup::ScrollGroup (Canvas* c, ScrollSensitivity s) - : Group (c) + : Layout (c) , _scroll_sensitivity (s) { } -ScrollGroup::ScrollGroup (Group* g, ScrollSensitivity s) - : Group (g) +ScrollGroup::ScrollGroup (Item* parent, ScrollSensitivity s) + : Layout (parent) , _scroll_sensitivity (s) { } @@ -60,12 +60,10 @@ ScrollGroup::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) c context->save (); context->rectangle (self.x0, self.y0, self.width(), self.height()); context->clip (); - - Group::render (area, context); + + Layout::render (area, context); context->restore (); - - } void diff --git a/libs/canvas/text.cc b/libs/canvas/text.cc index 4c2077a70b..cfad375814 100644 --- a/libs/canvas/text.cc +++ b/libs/canvas/text.cc @@ -43,8 +43,8 @@ Text::Text (Canvas* c) { } -Text::Text (Group* g) - : Item (g) +Text::Text (Item* parent) + : Item (parent) , _color (0x000000ff) , _font_description (0) , _alignment (Pango::ALIGN_LEFT) diff --git a/libs/canvas/wave_view.cc b/libs/canvas/wave_view.cc index 631be6254a..3e131487b6 100644 --- a/libs/canvas/wave_view.cc +++ b/libs/canvas/wave_view.cc @@ -76,8 +76,8 @@ WaveView::WaveView (Canvas* c, boost::shared_ptr<ARDOUR::AudioRegion> region) ClipLevelChanged.connect_same_thread (invalidation_connection, boost::bind (&WaveView::handle_clip_level_change, this)); } -WaveView::WaveView (Group* g, boost::shared_ptr<ARDOUR::AudioRegion> region) - : Item (g) +WaveView::WaveView (Item* parent, boost::shared_ptr<ARDOUR::AudioRegion> region) + : Item (parent) , _region (region) , _channel (0) , _samples_per_pixel (0) diff --git a/libs/canvas/widget.cc b/libs/canvas/widget.cc index 0961382128..17d0d29e59 100644 --- a/libs/canvas/widget.cc +++ b/libs/canvas/widget.cc @@ -36,8 +36,8 @@ Widget::Widget (Canvas* c, CairoWidget& w) Event.connect (sigc::mem_fun (*this, &Widget::event_proxy)); } -Widget::Widget (Group* g, CairoWidget& w) - : Item (g) +Widget::Widget (Item* parent, CairoWidget& w) + : Item (parent) , _widget (w) { Event.connect (sigc::mem_fun (*this, &Widget::event_proxy)); diff --git a/libs/canvas/wscript b/libs/canvas/wscript index 483e19d338..c6e31cafd6 100644 --- a/libs/canvas/wscript +++ b/libs/canvas/wscript @@ -32,13 +32,14 @@ canvas_sources = [ 'arrow.cc', 'canvas.cc', 'circle.cc', + 'container.cc', 'curve.cc', 'debug.cc', 'item.cc', 'fill.cc', 'flag.cc', - 'group.cc', 'image.cc', + 'layout.cc', 'line.cc', 'line_set.cc', 'lookup_table.cc', diff --git a/libs/canvas/xfade_curve.cc b/libs/canvas/xfade_curve.cc index 9a854cd54e..f97cd234d2 100644 --- a/libs/canvas/xfade_curve.cc +++ b/libs/canvas/xfade_curve.cc @@ -48,8 +48,8 @@ XFadeCurve::XFadeCurve (Canvas* c, XFadePosition pos) { } -XFadeCurve::XFadeCurve (Group* g) - : Item (g) +XFadeCurve::XFadeCurve (Item* parent) + : Item (parent) , points_per_segment (32) , _xfadeposition (Start) , _outline_color (0x000000ff) @@ -57,8 +57,8 @@ XFadeCurve::XFadeCurve (Group* g) { } -XFadeCurve::XFadeCurve (Group* g, XFadePosition pos) - : Item (g) +XFadeCurve::XFadeCurve (Item* parent, XFadePosition pos) + : Item (parent) , points_per_segment (32) , _xfadeposition (pos) , _outline_color (0x000000ff) |