draw only when needed
This commit is contained in:
parent
5fdd493d0d
commit
d222c56543
2 changed files with 66 additions and 59 deletions
|
@ -81,49 +81,52 @@ void OBButtonWidget::update()
|
|||
{
|
||||
otk::PixmapMask *pm;
|
||||
int width;
|
||||
bool draw = _dirty;
|
||||
|
||||
otk::OtkWidget::update();
|
||||
|
||||
switch (type()) {
|
||||
case Type_StickyButton:
|
||||
pm = _style->getStickyButtonMask();
|
||||
break;
|
||||
case Type_CloseButton:
|
||||
pm = _style->getCloseButtonMask();
|
||||
break;
|
||||
case Type_MaximizeButton:
|
||||
pm = _style->getMaximizeButtonMask();
|
||||
break;
|
||||
case Type_IconifyButton:
|
||||
pm = _style->getIconifyButtonMask();
|
||||
break;
|
||||
case Type_LeftGrip:
|
||||
case Type_RightGrip:
|
||||
return; // no drawing
|
||||
default:
|
||||
assert(false); // there's no other button widgets!
|
||||
if (draw) {
|
||||
switch (type()) {
|
||||
case Type_StickyButton:
|
||||
pm = _style->getStickyButtonMask();
|
||||
break;
|
||||
case Type_CloseButton:
|
||||
pm = _style->getCloseButtonMask();
|
||||
break;
|
||||
case Type_MaximizeButton:
|
||||
pm = _style->getMaximizeButtonMask();
|
||||
break;
|
||||
case Type_IconifyButton:
|
||||
pm = _style->getIconifyButtonMask();
|
||||
break;
|
||||
case Type_LeftGrip:
|
||||
case Type_RightGrip:
|
||||
return; // no drawing
|
||||
default:
|
||||
assert(false); // there's no other button widgets!
|
||||
}
|
||||
|
||||
if (pm->mask == None) return; // no mask for the button, leave it empty
|
||||
|
||||
width = _rect.width();
|
||||
|
||||
otk::BPen pen(_focused ? *_style->getButtonPicFocus() :
|
||||
*_style->getButtonPicUnfocus());
|
||||
|
||||
// set the clip region
|
||||
XSetClipMask(otk::OBDisplay::display, pen.gc(), pm->mask);
|
||||
XSetClipOrigin(otk::OBDisplay::display, pen.gc(),
|
||||
(width - pm->w)/2, (width - pm->h)/2);
|
||||
|
||||
// fill in the clipped region
|
||||
XFillRectangle(otk::OBDisplay::display, _window, pen.gc(),
|
||||
(width - pm->w)/2, (width - pm->h)/2,
|
||||
(width + pm->w)/2, (width + pm->h)/2);
|
||||
|
||||
// unset the clip region
|
||||
XSetClipMask(otk::OBDisplay::display, pen.gc(), None);
|
||||
XSetClipOrigin(otk::OBDisplay::display, pen.gc(), 0, 0);
|
||||
}
|
||||
|
||||
if (pm->mask == None) return; // no mask for the button, leave it empty
|
||||
|
||||
width = _rect.width();
|
||||
|
||||
otk::BPen pen(_focused ? *_style->getButtonPicFocus() :
|
||||
*_style->getButtonPicUnfocus());
|
||||
|
||||
// set the clip region
|
||||
XSetClipMask(otk::OBDisplay::display, pen.gc(), pm->mask);
|
||||
XSetClipOrigin(otk::OBDisplay::display, pen.gc(),
|
||||
(width - pm->w)/2, (width - pm->h)/2);
|
||||
|
||||
// fill in the clipped region
|
||||
XFillRectangle(otk::OBDisplay::display, _window, pen.gc(),
|
||||
(width - pm->w)/2, (width - pm->h)/2,
|
||||
(width + pm->w)/2, (width + pm->h)/2);
|
||||
|
||||
// unset the clip region
|
||||
XSetClipMask(otk::OBDisplay::display, pen.gc(), None);
|
||||
XSetClipOrigin(otk::OBDisplay::display, pen.gc(), 0, 0);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -72,38 +72,42 @@ void OBLabelWidget::unfocus()
|
|||
|
||||
void OBLabelWidget::update()
|
||||
{
|
||||
bool draw = _dirty;
|
||||
|
||||
OtkWidget::update();
|
||||
|
||||
std::string t = _text;
|
||||
int x = _sidemargin; // x coord for the text
|
||||
if (draw) {
|
||||
std::string t = _text;
|
||||
int x = _sidemargin; // x coord for the text
|
||||
|
||||
// find a string that will fit inside the area for text
|
||||
int max_length = width() - _sidemargin * 2;
|
||||
if (max_length <= 0) {
|
||||
t = ""; // can't fit anything
|
||||
} else {
|
||||
size_t text_len = t.size();
|
||||
int length;
|
||||
// find a string that will fit inside the area for text
|
||||
int max_length = width() - _sidemargin * 2;
|
||||
if (max_length <= 0) {
|
||||
t = ""; // can't fit anything
|
||||
} else {
|
||||
size_t text_len = t.size();
|
||||
int length;
|
||||
|
||||
do {
|
||||
t.resize(text_len);
|
||||
length = _font->measureString(t);
|
||||
} while (length > max_length && text_len-- > 0);
|
||||
do {
|
||||
t.resize(text_len);
|
||||
length = _font->measureString(t);
|
||||
} while (length > max_length && text_len-- > 0);
|
||||
|
||||
// justify the text
|
||||
switch (_justify) {
|
||||
case otk::Style::RightJustify:
|
||||
x += max_length - length;
|
||||
break;
|
||||
case otk::Style::CenterJustify:
|
||||
x += (max_length - length) / 2;
|
||||
break;
|
||||
case otk::Style::LeftJustify:
|
||||
break;
|
||||
// justify the text
|
||||
switch (_justify) {
|
||||
case otk::Style::RightJustify:
|
||||
x += max_length - length;
|
||||
break;
|
||||
case otk::Style::CenterJustify:
|
||||
x += (max_length - length) / 2;
|
||||
break;
|
||||
case otk::Style::LeftJustify:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_font->drawString(_xftdraw, x, 0, *_text_color, t);
|
||||
_font->drawString(_xftdraw, x, 0, *_text_color, t);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue