From 1d354f746a1352506505112a051a49e43ddebadc Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 3 Jun 2014 23:57:12 -0400 Subject: basic, initial structure for canvas widget item --- libs/canvas/widget.cc | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 libs/canvas/widget.cc (limited to 'libs/canvas/widget.cc') 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 +#include +#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 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 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; +} + -- cgit v1.2.3