move CairoWidget into gtkmm2ext, add CairoPacker, made the time info box use CairoPacker, make the info status "bar" use CairoPacker
git-svn-id: svn://localhost/ardour2/branches/3.0@10933 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
56
libs/gtkmm2ext/cairo_packer.cc
Normal file
56
libs/gtkmm2ext/cairo_packer.cc
Normal file
@@ -0,0 +1,56 @@
|
||||
#include "gtkmm2ext/utils.h"
|
||||
#include "gtkmm2ext/cairo_widget.h"
|
||||
#include "gtkmm2ext/cairo_packer.h"
|
||||
|
||||
void
|
||||
CairoPacker::draw_background (Gtk::Widget& w, GdkEventExpose* ev)
|
||||
{
|
||||
int x, y;
|
||||
Gtk::Widget* window_parent;
|
||||
Glib::RefPtr<Gdk::Window> win = Gtkmm2ext::window_to_draw_on (w, &window_parent);
|
||||
|
||||
if (win) {
|
||||
|
||||
Cairo::RefPtr<Cairo::Context> context = win->create_cairo_context();
|
||||
w.translate_coordinates (*window_parent, 0, 0, x, y);
|
||||
context->set_source_rgba (0.149, 0.149, 0.149, 1.0);
|
||||
Gtkmm2ext::rounded_rectangle (context, x, y, w.get_allocation().get_width(), w.get_allocation().get_height(), 9);
|
||||
context->fill ();
|
||||
}
|
||||
}
|
||||
|
||||
CairoHPacker::CairoHPacker ()
|
||||
{
|
||||
Gdk::Color bg;
|
||||
|
||||
bg.set_red (lrint (0.149 * 65535));
|
||||
bg.set_green (lrint (0.149 * 65535));
|
||||
bg.set_blue (lrint (0.149 * 65535));
|
||||
|
||||
CairoWidget::provide_background_for_cairo_widget (*this, bg);
|
||||
}
|
||||
|
||||
bool
|
||||
CairoHPacker::on_expose_event (GdkEventExpose* ev)
|
||||
{
|
||||
draw_background (*this, ev);
|
||||
return HBox::on_expose_event (ev);
|
||||
}
|
||||
|
||||
CairoVPacker::CairoVPacker ()
|
||||
{
|
||||
Gdk::Color bg;
|
||||
|
||||
bg.set_red (lrint (0.149 * 65535));
|
||||
bg.set_green (lrint (0.149 * 65535));
|
||||
bg.set_blue (lrint (0.149 * 65535));
|
||||
|
||||
CairoWidget::provide_background_for_cairo_widget (*this, bg);
|
||||
}
|
||||
|
||||
bool
|
||||
CairoVPacker::on_expose_event (GdkEventExpose* ev)
|
||||
{
|
||||
draw_background (*this, ev);
|
||||
return VBox::on_expose_event (ev);
|
||||
}
|
||||
178
libs/gtkmm2ext/cairo_widget.cc
Normal file
178
libs/gtkmm2ext/cairo_widget.cc
Normal file
@@ -0,0 +1,178 @@
|
||||
/*
|
||||
Copyright (C) 2009 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 "gtkmm2ext/cairo_widget.h"
|
||||
#include "gtkmm2ext/gui_thread.h"
|
||||
|
||||
static const char* has_cairo_widget_background_info = "has_cairo_widget_background_info";
|
||||
|
||||
CairoWidget::CairoWidget ()
|
||||
: _active_state (Gtkmm2ext::ActiveState (0))
|
||||
, _visual_state (Gtkmm2ext::VisualState (0))
|
||||
, _need_bg (true)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CairoWidget::~CairoWidget ()
|
||||
{
|
||||
}
|
||||
|
||||
bool
|
||||
CairoWidget::on_expose_event (GdkEventExpose *ev)
|
||||
{
|
||||
cairo_t* cr = gdk_cairo_create (get_window ()->gobj());
|
||||
cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
|
||||
cairo_clip (cr);
|
||||
|
||||
/* paint expose area the color of the parent window bg
|
||||
*/
|
||||
|
||||
Gdk::Color bg (get_parent_bg());
|
||||
|
||||
cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
|
||||
cairo_set_source_rgb (cr, bg.get_red_p(), bg.get_green_p(), bg.get_blue_p());
|
||||
cairo_fill (cr);
|
||||
|
||||
render (cr);
|
||||
|
||||
cairo_destroy (cr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Marks the widget as dirty, so that render () will be called on
|
||||
* the next GTK expose event.
|
||||
*/
|
||||
|
||||
void
|
||||
CairoWidget::set_dirty ()
|
||||
{
|
||||
ENSURE_GUI_THREAD (*this, &CairoWidget::set_dirty);
|
||||
queue_draw ();
|
||||
}
|
||||
|
||||
/** Handle a size allocation.
|
||||
* @param alloc GTK allocation.
|
||||
*/
|
||||
void
|
||||
CairoWidget::on_size_allocate (Gtk::Allocation& alloc)
|
||||
{
|
||||
Gtk::EventBox::on_size_allocate (alloc);
|
||||
|
||||
set_dirty ();
|
||||
}
|
||||
|
||||
Gdk::Color
|
||||
CairoWidget::get_parent_bg ()
|
||||
{
|
||||
Widget* parent;
|
||||
|
||||
parent = get_parent ();
|
||||
|
||||
while (parent) {
|
||||
void* p = g_object_get_data (G_OBJECT(parent->gobj()), has_cairo_widget_background_info);
|
||||
|
||||
if (p) {
|
||||
Glib::RefPtr<Gtk::Style> style = parent->get_style();
|
||||
return style->get_bg (get_state());
|
||||
}
|
||||
|
||||
if (!parent->get_has_window()) {
|
||||
parent = parent->get_parent();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (parent && parent->get_has_window()) {
|
||||
return parent->get_style ()->get_bg (parent->get_state());
|
||||
}
|
||||
|
||||
return get_style ()->get_bg (get_state());
|
||||
}
|
||||
|
||||
void
|
||||
CairoWidget::set_active_state (Gtkmm2ext::ActiveState s)
|
||||
{
|
||||
if (_active_state != s) {
|
||||
_active_state = s;
|
||||
StateChanged ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CairoWidget::set_visual_state (Gtkmm2ext::VisualState s)
|
||||
{
|
||||
if (_visual_state != s) {
|
||||
_visual_state = s;
|
||||
StateChanged ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CairoWidget::set_active (bool yn)
|
||||
{
|
||||
/* this is an API simplification for buttons
|
||||
that only use the Active and Normal states.
|
||||
*/
|
||||
|
||||
if (yn) {
|
||||
set_active_state (Gtkmm2ext::Active);
|
||||
} else {
|
||||
unset_active_state ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CairoWidget::on_state_changed (Gtk::StateType)
|
||||
{
|
||||
/* this will catch GTK-level state changes from calls like
|
||||
::set_sensitive()
|
||||
*/
|
||||
|
||||
if (get_state() == Gtk::STATE_INSENSITIVE) {
|
||||
set_visual_state (Gtkmm2ext::VisualState (visual_state() | Gtkmm2ext::Insensitive));
|
||||
} else {
|
||||
set_visual_state (Gtkmm2ext::VisualState (visual_state() & ~Gtkmm2ext::Insensitive));
|
||||
}
|
||||
|
||||
queue_draw ();
|
||||
}
|
||||
|
||||
void
|
||||
CairoWidget::set_draw_background (bool yn)
|
||||
{
|
||||
_need_bg = yn;
|
||||
}
|
||||
|
||||
void
|
||||
CairoWidget::provide_background_for_cairo_widget (Gtk::Widget& w, const Gdk::Color& bg)
|
||||
{
|
||||
/* set up @w to be able to provide bg information to
|
||||
any CairoWidgets that are packed inside it.
|
||||
*/
|
||||
|
||||
w.modify_bg (Gtk::STATE_NORMAL, bg);
|
||||
w.modify_bg (Gtk::STATE_INSENSITIVE, bg);
|
||||
w.modify_bg (Gtk::STATE_ACTIVE, bg);
|
||||
w.modify_bg (Gtk::STATE_SELECTED, bg);
|
||||
|
||||
g_object_set_data (G_OBJECT(w.gobj()), has_cairo_widget_background_info, (void*) 0xfeedface);
|
||||
}
|
||||
34
libs/gtkmm2ext/gtkmm2ext/cairo_packer.h
Normal file
34
libs/gtkmm2ext/gtkmm2ext/cairo_packer.h
Normal file
@@ -0,0 +1,34 @@
|
||||
#ifndef __gtkmm2ext_cairo_packer_h__
|
||||
#define __gtkmm2ext_cairo_packer_h__
|
||||
|
||||
#include <gtkmm/box.h>
|
||||
|
||||
class CairoPacker
|
||||
{
|
||||
public:
|
||||
CairoPacker () {}
|
||||
virtual ~CairoPacker () {}
|
||||
|
||||
protected:
|
||||
virtual void draw_background (Gtk::Widget&, GdkEventExpose*);
|
||||
};
|
||||
|
||||
class CairoHPacker : public CairoPacker, public Gtk::HBox
|
||||
{
|
||||
public:
|
||||
CairoHPacker ();
|
||||
~CairoHPacker() {}
|
||||
|
||||
bool on_expose_event (GdkEventExpose*);
|
||||
};
|
||||
|
||||
class CairoVPacker : public CairoPacker, public Gtk::VBox
|
||||
{
|
||||
public:
|
||||
CairoVPacker ();
|
||||
~CairoVPacker () {}
|
||||
|
||||
bool on_expose_event (GdkEventExpose*);
|
||||
};
|
||||
|
||||
#endif /* __gtkmm2ext_cairo_packer_h__ */
|
||||
81
libs/gtkmm2ext/gtkmm2ext/cairo_widget.h
Normal file
81
libs/gtkmm2ext/gtkmm2ext/cairo_widget.h
Normal file
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
Copyright (C) 2009 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.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __gtk2_ardour_cairo_widget_h__
|
||||
#define __gtk2_ardour_cairo_widget_h__
|
||||
|
||||
#include <gtkmm/eventbox.h>
|
||||
#include "gtkmm2ext/widget_state.h"
|
||||
|
||||
/** A parent class for widgets that are rendered using Cairo.
|
||||
*/
|
||||
|
||||
class CairoWidget : public Gtk::EventBox
|
||||
{
|
||||
public:
|
||||
CairoWidget ();
|
||||
virtual ~CairoWidget ();
|
||||
|
||||
void set_dirty ();
|
||||
|
||||
Gtkmm2ext::ActiveState active_state() const { return _active_state; }
|
||||
Gtkmm2ext::VisualState visual_state() const { return _visual_state; }
|
||||
|
||||
/* derived widgets can override these two to catch
|
||||
changes in active & visual state
|
||||
*/
|
||||
|
||||
virtual void set_active_state (Gtkmm2ext::ActiveState);
|
||||
virtual void set_visual_state (Gtkmm2ext::VisualState);
|
||||
|
||||
void unset_active_state () { set_active_state (Gtkmm2ext::ActiveState (0)); }
|
||||
void unset_visual_state () { set_visual_state (Gtkmm2ext::VisualState (0)); }
|
||||
|
||||
/* this is an API simplification for widgets
|
||||
that only use the Active and Normal active states.
|
||||
*/
|
||||
void set_active (bool);
|
||||
bool get_active () { return active_state() != Gtkmm2ext::ActiveState (0); }
|
||||
|
||||
/* widgets can be told to only draw their "foreground, and thus leave
|
||||
in place whatever background is drawn by their parent. the default
|
||||
is that the widget will fill its event window with the background
|
||||
color of the parent container.
|
||||
*/
|
||||
|
||||
void set_draw_background (bool yn);
|
||||
|
||||
sigc::signal<void> StateChanged;
|
||||
|
||||
static void provide_background_for_cairo_widget (Gtk::Widget& w, const Gdk::Color& bg);
|
||||
|
||||
protected:
|
||||
/** Render the widget to the given Cairo context */
|
||||
virtual void render (cairo_t *) = 0;
|
||||
virtual bool on_expose_event (GdkEventExpose *);
|
||||
void on_size_allocate (Gtk::Allocation &);
|
||||
void on_state_changed (Gtk::StateType);
|
||||
Gdk::Color get_parent_bg ();
|
||||
|
||||
Gtkmm2ext::ActiveState _active_state;
|
||||
Gtkmm2ext::VisualState _visual_state;
|
||||
bool _need_bg;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -28,6 +28,8 @@ gtkmm2ext_sources = [
|
||||
'bindable_button.cc',
|
||||
'bindings.cc',
|
||||
'cairocell.cc',
|
||||
'cairo_packer.cc',
|
||||
'cairo_widget.cc',
|
||||
'cell_renderer_color_selector.cc',
|
||||
'cell_renderer_pixbuf_multi.cc',
|
||||
'cell_renderer_pixbuf_toggle.cc',
|
||||
|
||||
Reference in New Issue
Block a user