new PBD::ControllableDescriptor class to encapsulate parsing of binding URIs and...
[ardour.git] / libs / gtkmm2ext / utils.cc
index 0a0737becde57226325498663f27b11f306302a3..3a021bbe7bb94304fcec4322453d47b8a5e5596d 100644 (file)
 
 using namespace std;
 
+void
+Gtkmm2ext::get_ink_pixel_size (Glib::RefPtr<Pango::Layout> layout,
+                              int& width,
+                              int& height)
+{
+       Pango::Rectangle ink_rect = layout->get_ink_extents ();
+       
+       width = (ink_rect.get_width() + PANGO_SCALE / 2) / PANGO_SCALE;
+       height = (ink_rect.get_height() + PANGO_SCALE / 2) / PANGO_SCALE;
+}
+
 void
 Gtkmm2ext::set_size_request_to_display_given_text (Gtk::Widget &w, const gchar *text,
                                                   gint hpadding, gint vpadding)
-
+       
 {
-       int height = 0;
-       int width = 0;
-
+       int width, height;
        w.ensure_style ();
-       w.create_pango_layout (text)->get_pixel_size (width, height);
-
-       height += vpadding;
-       width += hpadding;
+       
+       get_ink_pixel_size (w.create_pango_layout (text), width, height);
+       w.set_size_request(width + hpadding, height + vpadding);
+}
 
-       w.set_size_request(width, height);
+void
+Gtkmm2ext::set_size_request_to_display_given_text (Gtk::Widget &w, 
+                                                  const std::vector<std::string>& strings,
+                                                  gint hpadding, gint vpadding)
+       
+{
+       int width, height;
+       int width_max = 0;
+       int height_max = 0;
+       w.ensure_style ();
+       
+       for (vector<string>::const_iterator i = strings.begin(); i != strings.end(); ++i) {
+               get_ink_pixel_size (w.create_pango_layout (*i), width, height);
+               width_max = max(width_max,width);
+               height_max = max(height_max, height);
+       }
+       w.set_size_request(width_max + hpadding, height_max + vpadding);
 }
 
 void
@@ -59,11 +84,36 @@ Gtkmm2ext::init ()
 }
 
 void
-Gtkmm2ext::set_popdown_strings (Gtk::ComboBoxText& cr, const vector<string>& strings)
+Gtkmm2ext::set_popdown_strings (Gtk::ComboBoxText& cr, const vector<string>& strings, bool set_size, gint hpadding, gint vpadding)
 {
+       vector<string>::const_iterator i;
+
        cr.clear ();
 
-       for (vector<string>::const_iterator i = strings.begin(); i != strings.end(); ++i) {
+       if (set_size) {
+               vector<string> copy;
+
+               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 descener */
+                       
+                       copy = strings;
+                       copy.push_back ("g");
+                       set_size_request_to_display_given_text (cr, copy, COMBO_FUDGE+10+hpadding, 15+vpadding); 
+
+               } else {
+                       set_size_request_to_display_given_text (cr, strings, COMBO_FUDGE+10+hpadding, 15+vpadding); 
+               }
+       }
+
+       for (i = strings.begin(); i != strings.end(); ++i) {
                cr.append_text (*i);
        }
 }