yet another button tweak..
This commit is contained in:
parent
5dab88c3fa
commit
cb07f0f99b
@ -42,6 +42,7 @@
|
||||
#include "i18n.h"
|
||||
|
||||
#define BASELINESTRETCH (1.25)
|
||||
#define TRACKHEADERBTNW (3.10)
|
||||
|
||||
using namespace Gdk;
|
||||
using namespace Gtk;
|
||||
@ -60,6 +61,7 @@ ArdourButton::ArdourButton (Element e)
|
||||
, _tweaks (Tweaks (0))
|
||||
, _char_pixel_width (0)
|
||||
, _char_pixel_height (0)
|
||||
, _char_avg_pixel_width (0)
|
||||
, _text_width (0)
|
||||
, _text_height (0)
|
||||
, _diameter (0)
|
||||
@ -128,6 +130,7 @@ ArdourButton::ArdourButton (const std::string& str, Element e)
|
||||
{
|
||||
set_text (str);
|
||||
ARDOUR_UI_UTILS::ColorsChanged.connect (sigc::mem_fun (*this, &ArdourButton::color_handler));
|
||||
ARDOUR_UI_UTILS::DPIReset.connect (sigc::mem_fun (*this, &ArdourButton::on_name_changed));
|
||||
}
|
||||
|
||||
ArdourButton::~ArdourButton()
|
||||
@ -373,11 +376,11 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
|
||||
layout_font = false;
|
||||
fd = get_pango_context()->get_font_description();
|
||||
}
|
||||
printf("%s: f:%dx%d bh:%.0f tw:%d (%dx%d) %s\"%s\"\n",
|
||||
printf("%s: f:%dx%d aw:%.3f bh:%.0f t:%dx%d (%dx%d) %s\"%s\"\n",
|
||||
get_name().c_str(),
|
||||
char_pixel_width(), char_pixel_height(),
|
||||
char_pixel_width(), char_pixel_height(), char_avg_pixel_width(),
|
||||
ceil(char_pixel_height() * BASELINESTRETCH),
|
||||
_text_width,
|
||||
_text_width, _text_height,
|
||||
get_width(), get_height(),
|
||||
layout_font ? "L:" : "W:",
|
||||
fd.to_string().c_str());
|
||||
@ -601,23 +604,35 @@ ArdourButton::on_size_request (Gtk::Requisition* req)
|
||||
|
||||
if (_elements & (RecButton | CloseCross)) {
|
||||
assert(!(_elements & Text));
|
||||
const int wh = std::max(3.5 * char_pixel_width(), ceil(char_pixel_height() * BASELINESTRETCH + 1));
|
||||
const int wh = std::max (rint (TRACKHEADERBTNW * char_avg_pixel_width()), ceil (char_pixel_height() * BASELINESTRETCH + 1.));
|
||||
req->width += wh;
|
||||
req->height = std::max(req->height, wh);
|
||||
}
|
||||
|
||||
if (_tweaks & Square) {
|
||||
// squared buttons are also grouped, we cannot align all texts
|
||||
// -> skip proper center adjustment
|
||||
/* Tweaks to mess the nice stuff above up again. */
|
||||
if (_tweaks & TrackHeader) {
|
||||
// forget everything above and just use a fixed square [em] size
|
||||
// "TrackHeader Buttons" are single letter (usually uppercase)
|
||||
// a SizeGroup is much less efficient (lots of gtk work under the hood for each track)
|
||||
const int wh = std::max (rint (TRACKHEADERBTNW * char_avg_pixel_width()), ceil (char_pixel_height() * BASELINESTRETCH + 1.));
|
||||
req->width = wh;
|
||||
req->height = wh;
|
||||
}
|
||||
else if (_tweaks & Square) {
|
||||
// currerntly unused (again)
|
||||
if (req->width < req->height)
|
||||
req->width = req->height;
|
||||
if (req->height < req->width)
|
||||
req->height = req->width;
|
||||
} else if (_text_width > 0 && !(_elements & (Menu | Indicator))) {
|
||||
// properly centered text for those elements that are centered
|
||||
// (no sub-pixel offset)
|
||||
if ((req->width - _text_width) & 1) { ++req->width; }
|
||||
if ((req->height - _text_height) & 1) { ++req->height; }
|
||||
}
|
||||
#if 0
|
||||
printf("REQ: %s: %dx%d\n", get_name().c_str(), req->width, req->height);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1094,7 +1109,8 @@ ArdourButton::recalc_char_pixel_geometry ()
|
||||
// number of actual chars in the string (not bytes)
|
||||
// Glib to the rescue.
|
||||
Glib::ustring gx(x);
|
||||
_char_pixel_width = std::max(4, w / (int)gx.size());
|
||||
_char_avg_pixel_width = w / (float)gx.size();
|
||||
_char_pixel_width = std::max(4, (int) ceil (_char_avg_pixel_width));
|
||||
_layout->set_text (_text);
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,7 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
|
||||
|
||||
enum Tweaks {
|
||||
Square = 0x1,
|
||||
unused2 = 0x2,
|
||||
TrackHeader = 0x2,
|
||||
unused3 = 0x4,
|
||||
};
|
||||
|
||||
@ -105,6 +105,7 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
|
||||
|
||||
unsigned int char_pixel_width() { if (_char_pixel_width < 1) recalc_char_pixel_geometry() ; return _char_pixel_width; }
|
||||
unsigned int char_pixel_height() { if (_char_pixel_height < 1) recalc_char_pixel_geometry() ; return _char_pixel_height; }
|
||||
float char_avg_pixel_width() { if (_char_pixel_width < 1) recalc_char_pixel_geometry() ; return _char_avg_pixel_width; }
|
||||
|
||||
protected:
|
||||
void render (cairo_t *, cairo_rectangle_t *);
|
||||
@ -133,6 +134,7 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
|
||||
void recalc_char_pixel_geometry ();
|
||||
unsigned int _char_pixel_width;
|
||||
unsigned int _char_pixel_height;
|
||||
float _char_avg_pixel_width;
|
||||
|
||||
int _text_width;
|
||||
int _text_height;
|
||||
|
Loading…
Reference in New Issue
Block a user