diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-04-05 21:56:32 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-04-05 21:56:32 +0000 |
commit | 6bd31cc7a3324f0f48a3c6f4358721975dc217c2 (patch) | |
tree | a08e77cef4e7a29639c3e56e6ee33c4f21d0d54b /gtk2_ardour | |
parent | 100e6981fb7b3f9771bcc1ff3a96f361964ed959 (diff) |
wash that pango right out of your hair
git-svn-id: svn://localhost/ardour2/trunk@1668 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/canvas-waveview.c | 2 | ||||
-rw-r--r-- | gtk2_ardour/time_axis_view_item.cc | 94 | ||||
-rw-r--r-- | gtk2_ardour/time_axis_view_item.h | 2 |
3 files changed, 73 insertions, 25 deletions
diff --git a/gtk2_ardour/canvas-waveview.c b/gtk2_ardour/canvas-waveview.c index 857eeea286..b78bf63ea7 100644 --- a/gtk2_ardour/canvas-waveview.c +++ b/gtk2_ardour/canvas-waveview.c @@ -1202,7 +1202,7 @@ gnome_canvas_waveview_render (GnomeCanvasItem *item, unsigned char zero_r, zero_g, zero_b, zero_a; UINT_TO_RGBA( waveview->zero_color, &zero_r, &zero_g, &zero_b, &zero_a ); int zeroline_y = (int) rint ((item->y1 + origin) * item->canvas->pixels_per_unit); - PAINT_HORIZA(buf, zero_r, zero_g, zero_b, zero_a, zbegin, zend, zeroline_y); + PAINT_HORIZA(buf, zero_r, zero_g, zero_b, zero_a, zbegin, end, zeroline_y); } #undef origin diff --git a/gtk2_ardour/time_axis_view_item.cc b/gtk2_ardour/time_axis_view_item.cc index cf29fae9bd..37daaf9ecc 100644 --- a/gtk2_ardour/time_axis_view_item.cc +++ b/gtk2_ardour/time_axis_view_item.cc @@ -559,8 +559,9 @@ void TimeAxisViewItem::set_name_text(const ustring& new_name) { if (name_text) { - name_text->property_text() = new_name.c_str(); + name_text->property_text() = new_name; name_text_width = pixel_width (new_name, NAME_FONT); + name_text_size_cache.clear (); } } @@ -918,42 +919,87 @@ TimeAxisViewItem::reset_name_width (double pixel_width) return; } - if ((last_name_text_width && // we did this once - (name_text_width <= pixel_width - NAME_X_OFFSET) && // fits the new size + int limit = (int) floor (pixel_width - NAME_X_OFFSET); + bool shrinking = (last_name_text_width > pixel_width); + int actual_width; + ustring ustr; + ustring::size_type n; + + if ((last_name_text_width && // we did this once + shrinking && // we're getting smaller + (name_text_width <= limit) && // fits the new size (name_text_width <= last_name_text_width - NAME_X_OFFSET))) { // fit into the old size too last_name_text_width = pixel_width; return; } - - int width; - - ustring ustr = fit_to_pixels (item_name, (int) floor (pixel_width - NAME_X_OFFSET), NAME_FONT, width); - if (ustr.empty()) { - - name_text->hide (); - - } else { - - /* don't use name for event handling if it leaves no room - for trimming to work. - */ + /* now check the cache of existing truncations */ + + Gtk::Label foo; + Glib::RefPtr<Pango::Layout> layout = foo.create_pango_layout (""); + + for (n = item_name.length(); n > 0; --n) { - if (pixel_width - width < (NAME_X_OFFSET * 2.0)) { - if (name_connected) { - name_connected = false; + map<ustring::size_type,int>::iterator i; + + if ((i = name_text_size_cache.find (n)) != name_text_size_cache.end()) { + + /* we know the length of this substring already */ + + if ((actual_width = (*i).second) < limit) { + + /* it fits, use it */ + + ustr = item_name.substr (0, n); + break; } + } else { - if (!name_connected) { - name_connected = true; + + /* we don't know the length of this substring already, so compute + it and put it into the cache. + */ + + layout->set_text (item_name.substr (0, n)); + + int width, height; + Gtkmm2ext::get_ink_pixel_size (layout, width, height); + + name_text_size_cache[n] = width; + + if ((actual_width = width) < limit) { + ustr = item_name.substr (0, n); + break; } } - - name_text->property_text() = ustr; - name_text->show(); } + if (n == 0) { + /* nothing will fit */ + name_text->hide (); + last_name_text_width = pixel_width; + return; + } + + /* don't use name for event handling if it leaves no room + for trimming to work. + */ + + if (pixel_width - actual_width < (NAME_X_OFFSET * 2.0)) { + if (name_connected) { + name_connected = false; + } + } else { + if (!name_connected) { + name_connected = true; + } + } + + name_text->property_text() = ustr; + name_text_width = actual_width; + name_text->show(); last_name_text_width = pixel_width; + } diff --git a/gtk2_ardour/time_axis_view_item.h b/gtk2_ardour/time_axis_view_item.h index 960d940268..aeeebe1c79 100644 --- a/gtk2_ardour/time_axis_view_item.h +++ b/gtk2_ardour/time_axis_view_item.h @@ -464,6 +464,8 @@ class TimeAxisViewItem : public Selectable int name_text_width; double last_name_text_width; + std::map<Glib::ustring::size_type,int> name_text_size_cache; + Visibility visibility; }; /* class TimeAxisViewItem */ |