summaryrefslogtreecommitdiff
path: root/libs/gtkmm2ext/cairocell.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2011-06-03 22:18:47 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2011-06-03 22:18:47 +0000
commite77b5261d2811a1ad139afc29250e3a3337c455d (patch)
treedbd09a97b2b7489ac04b1e68a89854fd655c5ff8 /libs/gtkmm2ext/cairocell.cc
parent11bcfd84296d5c4224e94bbae606180c5b58ef5b (diff)
next iteration of clock work. still far from complete, and probably waiting on a rethink of text rendering+layout. but it has the info block now, and it semi-works
git-svn-id: svn://localhost/ardour2/branches/3.0@9676 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/gtkmm2ext/cairocell.cc')
-rw-r--r--libs/gtkmm2ext/cairocell.cc142
1 files changed, 58 insertions, 84 deletions
diff --git a/libs/gtkmm2ext/cairocell.cc b/libs/gtkmm2ext/cairocell.cc
index 6de397b1f3..4f2566554f 100644
--- a/libs/gtkmm2ext/cairocell.cc
+++ b/libs/gtkmm2ext/cairocell.cc
@@ -30,9 +30,10 @@ using std::cerr;
using std::endl;
using namespace Gtkmm2ext;
-CairoCell::CairoCell ()
- : _visible (true)
- , _xpad (5)
+CairoCell::CairoCell (int32_t id)
+ : _id (id)
+ , _visible (true)
+ , _xpad (2)
{
bbox.x = 0;
bbox.y = 0;
@@ -58,8 +59,9 @@ CairoColonCell::set_size (Glib::RefPtr<Pango::Context>& context, const Pango::Fo
bbox.height = (metrics.get_ascent() + metrics.get_descent()) / PANGO_SCALE;
}
-CairoTextCell::CairoTextCell (double wc)
- : _width_chars (wc)
+CairoTextCell::CairoTextCell (int32_t id, double wc)
+ : CairoCell (id)
+ , _width_chars (wc)
{
}
@@ -96,18 +98,9 @@ CairoTextCell::set_size (Glib::RefPtr<Pango::Context>& context, const Pango::Fon
bbox.height = (metrics.get_ascent() + metrics.get_descent()) / PANGO_SCALE;
}
-CairoCell*
-CairoEditableText::get_cell (uint32_t id)
-{
- CellMap::iterator i = cells.find (id);
- if (i == cells.end()) {
- return 0;
- }
- return i->second;
-}
-
CairoEditableText::CairoEditableText ()
- : editing_id (0)
+ : editing_cell (0)
+ , _draw_bg (true)
, width (0)
, max_cell_height (0)
, height (0)
@@ -125,19 +118,16 @@ CairoEditableText::CairoEditableText ()
CairoEditableText::~CairoEditableText ()
{
- for (CellMap::iterator i = cells.begin(); i != cells.end(); ++i) {
- delete i->second;
- }
+ /* we don't own cells */
}
bool
CairoEditableText::on_scroll_event (GdkEventScroll* ev)
{
- uint32_t id;
- CairoCell* cell = find_cell (ev->x, ev->y, id);
+ CairoCell* cell = find_cell (ev->x, ev->y);
if (cell) {
- return scroll (ev, id);
+ return scroll (ev, cell);
}
return false;
@@ -152,38 +142,37 @@ CairoEditableText::on_focus_in_event (GdkEventFocus* ev)
bool
CairoEditableText::on_focus_out_event (GdkEventFocus* ev)
{
- if (editing_id) {
- CairoCell* cell = get_cell (editing_id);
- queue_draw_cell (cell);
- editing_id = 0;
+ if (editing_cell) {
+ queue_draw_cell (editing_cell);
+ editing_cell = 0;
}
return false;
}
void
-CairoEditableText::add_cell (uint32_t id, CairoCell* cell)
+CairoEditableText::add_cell (CairoCell* cell)
{
- if (id > 0) {
- Glib::RefPtr<Pango::Context> context = get_pango_context ();
- cell->set_size (context, font);
-
- cells[id] = cell; /* we own it */
- }
+ Glib::RefPtr<Pango::Context> context = get_pango_context ();
+ cell->set_size (context, _font);
+ cells.push_back (cell);
+ queue_resize ();
+ queue_draw ();
}
void
-CairoEditableText::set_text (uint32_t id, const string& text)
+CairoEditableText::clear_cells ()
{
- CellMap::iterator i = cells.find (id);
-
- if (i == cells.end()) {
- return;
- }
-
- CairoTextCell* textcell = dynamic_cast<CairoTextCell*> (i->second);
+ cells.clear ();
+ queue_resize ();
+ queue_draw ();
+}
- if (textcell) {
- set_text (textcell, text);
+void
+CairoEditableText::set_width_chars (CairoTextCell* cell, uint32_t wc)
+{
+ if (cell) {
+ cell->set_width_chars (wc);
+ queue_resize ();
}
}
@@ -206,24 +195,25 @@ CairoEditableText::on_expose_event (GdkEventExpose* ev)
context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
context->clip ();
- context->set_source_rgba (bg_r, bg_g, bg_b, bg_a);
- if (_corner_radius) {
- rounded_rectangle (context, 0, 0, width, height, _corner_radius);
- } else {
- context->rectangle (0, 0, width, height);
+ if (_draw_bg) {
+ context->set_source_rgba (bg_r, bg_g, bg_b, bg_a);
+ if (_corner_radius) {
+ rounded_rectangle (context, 0, 0, width, height, _corner_radius);
+ } else {
+ context->rectangle (0, 0, width, height);
+ }
+ context->fill ();
}
- context->fill ();
for (CellMap::iterator i = cells.begin(); i != cells.end(); ++i) {
- uint32_t id = i->first;
- CairoCell* cell = i->second;
+ CairoCell* cell = (*i);
/* is cell inside the expose area?
*/
if (cell->intersects (ev->area)) {
- if (id == editing_id) {
+ if (cell == editing_cell) {
context->set_source_rgba (edit_r, edit_b, edit_g, edit_a);
} else {
context->set_source_rgba (r, g, b, a);
@@ -257,12 +247,11 @@ CairoEditableText::queue_draw_cell (CairoCell* cell)
}
CairoCell*
-CairoEditableText::find_cell (uint32_t x, uint32_t y, uint32_t& id)
+CairoEditableText::find_cell (uint32_t x, uint32_t y)
{
for (CellMap::iterator i = cells.begin(); i != cells.end(); ++i) {
- if (i->second->covers (x, y)) {
- id = i->first;
- return i->second;
+ if ((*i)->covers (x, y)) {
+ return (*i);
}
}
@@ -272,38 +261,24 @@ CairoEditableText::find_cell (uint32_t x, uint32_t y, uint32_t& id)
bool
CairoEditableText::on_button_press_event (GdkEventButton* ev)
{
- uint32_t id;
- CairoCell* cell = find_cell (ev->x, ev->y, id);
-
- if (!cell) {
- return false;
- }
-
- return button_press (ev, id);
+ CairoCell* cell = find_cell (ev->x, ev->y);
+ return button_press (ev, cell);
}
bool
CairoEditableText::on_button_release_event (GdkEventButton* ev)
{
- uint32_t id;
- CairoCell* cell = find_cell (ev->x, ev->y, id);
-
- if (!cell) {
- return false;
- }
-
- return button_release (ev, id);
+ CairoCell* cell = find_cell (ev->x, ev->y);
+ return button_release (ev, cell);
}
void
-CairoEditableText::start_editing (uint32_t id)
+CairoEditableText::start_editing (CairoCell* cell)
{
- CairoCell* cell = get_cell (id);
-
stop_editing ();
if (cell) {
- editing_id = id;
+ editing_cell = cell;
queue_draw_cell (cell);
grab_focus ();
}
@@ -312,12 +287,9 @@ CairoEditableText::start_editing (uint32_t id)
void
CairoEditableText::stop_editing ()
{
- if (editing_id) {
- CairoCell* cell;
- if ((cell = get_cell (editing_id))) {
- queue_draw_cell (cell);
- }
- editing_id = 0;
+ if (editing_cell) {
+ queue_draw_cell (editing_cell);
+ editing_cell = 0;
}
}
@@ -333,7 +305,7 @@ CairoEditableText::on_size_request (GtkRequisition* req)
CellMap::iterator i = cells.begin();
while (i != cells.end()) {
- CairoCell* cell = i->second;
+ CairoCell* cell = (*i);
if (cell->visible()) {
cell->set_position (x, _ypad);
@@ -378,8 +350,10 @@ CairoEditableText::set_font (const Pango::FontDescription& fd)
{
Glib::RefPtr<Pango::Context> context = get_pango_context ();
+ _font = fd;
+
for (CellMap::iterator i = cells.begin(); i != cells.end(); ++i) {
- i->second->set_size (context, fd);
+ (*i)->set_size (context, _font);
}
queue_resize ();