diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-06-03 23:57:12 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-06-05 12:04:42 -0400 |
commit | 1d354f746a1352506505112a051a49e43ddebadc (patch) | |
tree | 4db9a1e79ca3924f5659c818ff665a63b33f7fee /libs/canvas | |
parent | 55009368c52699b0a0c20dea2cbe0d41d77abc57 (diff) |
basic, initial structure for canvas widget item
Diffstat (limited to 'libs/canvas')
-rw-r--r-- | libs/canvas/canvas/widget.h | 50 | ||||
-rw-r--r-- | libs/canvas/widget.cc | 105 | ||||
-rw-r--r-- | libs/canvas/wscript | 1 |
3 files changed, 156 insertions, 0 deletions
diff --git a/libs/canvas/canvas/widget.h b/libs/canvas/canvas/widget.h new file mode 100644 index 0000000000..18822ef185 --- /dev/null +++ b/libs/canvas/canvas/widget.h @@ -0,0 +1,50 @@ +/* + 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_WIDGET_H__ +#define __CANVAS_WIDGET_H__ + +#include "canvas/visibility.h" +#include "canvas/item.h" + +#include "gtkmm2ext/cairo_widget.h" + +namespace ArdourCanvas +{ + +class LIBCANVAS_API Widget : virtual public Item +{ +public: + Widget (Group *, CairoWidget&); + + void render (Rect const &, Cairo::RefPtr<Cairo::Context>) const; + void compute_bounding_box () const; + + CairoWidget const & get () const { + return _widget; + } + +private: + CairoWidget& _widget; + bool event_proxy (GdkEvent*); +}; + +} + +#endif diff --git a/libs/canvas/widget.cc b/libs/canvas/widget.cc new file mode 100644 index 0000000000..97d7b91a1a --- /dev/null +++ b/libs/canvas/widget.cc @@ -0,0 +1,105 @@ +/* + Copyright (C) 2014 Paul Davis + + 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/canvas.h" +#include "canvas/widget.h" +#include "canvas/debug.h" +#include "canvas/utils.h" + +using namespace std; +using namespace ArdourCanvas; + +Widget::Widget (Group* parent, CairoWidget& w) + : Item (parent) + , _widget (w) +{ + Event.connect (sigc::mem_fun (*this, &Widget::event_proxy)); +} + +bool +Widget::event_proxy (GdkEvent* ev) +{ + return _widget.event (ev); +} + +void +Widget::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const +{ + std::cerr << "Render widget\n"; + + if (!_bounding_box) { + std::cerr << "no bbox\n"; + return; + } + + Rect self = item_to_window (_bounding_box.get()); + boost::optional<Rect> r = self.intersection (area); + + if (!r) { + std::cerr << "no intersection\n"; + return; + } + + Rect draw = r.get (); + cairo_rectangle_t crect; + crect.x = draw.x0; + crect.y = draw.y0; + crect.height = draw.height(); + crect.width = draw.width(); + + std::cerr << "will draw " << draw << "\n"; + context->save (); + context->translate (-draw.x0, -draw.y0); + //context->rectangle (draw.x0, draw.y0, draw.width(), draw.height()); + // context->clip (); + + _widget.render (context->cobj(), &crect); + + context->restore (); +} + +void +Widget::compute_bounding_box () const +{ + std::cerr << "cbbox for widget\n"; + + GtkRequisition req; + Gtk::Allocation alloc; + + _widget.size_request (req); + + std::cerr << "widget wants " << req.width << " x " << req.height << "\n"; + + _bounding_box = Rect (0, 0, req.width, req.height); + + /* make sure the widget knows that it got what it asked for */ + alloc.set_x (0); + alloc.set_y (0); + alloc.set_width (req.width); + alloc.set_height (req.height); + + _widget.size_allocate (alloc); + + _bounding_box_dirty = false; +} + diff --git a/libs/canvas/wscript b/libs/canvas/wscript index d0cbfc882f..83ba2223ea 100644 --- a/libs/canvas/wscript +++ b/libs/canvas/wscript @@ -56,6 +56,7 @@ canvas_sources = [ 'types.cc', 'utils.cc', 'wave_view.cc', + 'widget.cc', 'xfade_curve.cc', ] |