summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2007-04-05 21:56:32 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2007-04-05 21:56:32 +0000
commit6bd31cc7a3324f0f48a3c6f4358721975dc217c2 (patch)
treea08e77cef4e7a29639c3e56e6ee33c4f21d0d54b /gtk2_ardour
parent100e6981fb7b3f9771bcc1ff3a96f361964ed959 (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.c2
-rw-r--r--gtk2_ardour/time_axis_view_item.cc94
-rw-r--r--gtk2_ardour/time_axis_view_item.h2
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 */