From 494bc8da14809a94769dab7bc78d39e8d43b1fe1 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 7 Sep 2021 14:45:31 -0600 Subject: [PATCH] canvas: add ::set_size_request_to_display_given_text() analogous to Gtkmm2ext utility --- libs/canvas/canvas/item.h | 1 + libs/canvas/item.cc | 40 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/libs/canvas/canvas/item.h b/libs/canvas/canvas/item.h index 8a0fb05d55..05b3f0451c 100644 --- a/libs/canvas/canvas/item.h +++ b/libs/canvas/canvas/item.h @@ -150,6 +150,7 @@ public: virtual void size_request (double& w, double& h) const; void set_size_request (double w, double h); + void set_size_request_to_display_given_text (const std::vector& strings, gint hpadding, gint vpadding); void size_allocate (Rect const&); virtual void _size_allocate (Rect const&); diff --git a/libs/canvas/item.cc b/libs/canvas/item.cc index 997f914272..6c4c66fc35 100644 --- a/libs/canvas/item.cc +++ b/libs/canvas/item.cc @@ -656,6 +656,46 @@ Item::set_size_request (double w, double h) end_change (); } +void +Item::set_size_request_to_display_given_text (const std::vector& strings, gint hpadding, gint vpadding) +{ + Glib::RefPtr context = _canvas->get_pango_context(); + Glib::RefPtr layout = Pango::Layout::create (context); + + int width, height; + int width_max = 0; + int height_max = 0; + + vector copy; + const vector* to_use; + vector::const_iterator i; + + for (i = strings.begin(); i != strings.end(); ++i) { + if ((*i).find_first_of ("gy") != string::npos) { + /* contains a descender */ + break; + } + } + + if (i == strings.end()) { + /* make a copy of the strings then add one that has a descender */ + copy = strings; + copy.push_back ("g"); + to_use = © + } else { + to_use = &strings; + } + + for (vector::const_iterator i = to_use->begin(); i != to_use->end(); ++i) { + layout->set_text (*i); + layout->get_pixel_size (width, height); + width_max = max (width_max,width); + height_max = max (height_max, height); + } + + set_size_request (width_max + hpadding, height_max + vpadding); +} + /** @return Bounding box in this item's coordinates */ ArdourCanvas::Rect Item::bounding_box () const