X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Fbutton.cc;h=3f283b00085ac9869a7e0d3b661995a34ede48ff;hb=6f5e60f0337e60d904a8f549aeaa631afefc8033;hp=c88fc707c3fa631657ba8e4cd71d792d004ca42f;hpb=cbf9dd0c4c8669392d9c7c8461d1af411f0ab0a4;p=chaz%2Fopenbox diff --git a/otk/button.cc b/otk/button.cc index c88fc707..3f283b00 100644 --- a/otk/button.cc +++ b/otk/button.cc @@ -1,31 +1,99 @@ +#include #include "button.hh" namespace otk { OtkButton::OtkButton(OtkWidget *parent) - : OtkWidget(parent), _text(""), _pressed(false), - _unfocus_tx(OtkWidget::getStyle()->getButtonUnfocus()) + : OtkFocusWidget(parent), _text(""), _pressed(false), _dirty(false), + _pressed_focus_tx(0), _pressed_unfocus_tx(0), _unpr_focus_tx(0), + _unpr_unfocus_tx(0) { + setTexture(getStyle()->getButtonFocus()); + setUnfocusTexture(getStyle()->getButtonUnfocus()); + _pressed_focus_tx = getStyle()->getButtonPressedFocus(); + _pressed_unfocus_tx = getStyle()->getButtonPressedUnfocus(); } OtkButton::~OtkButton() { + if (_pressed_focus_tx) delete _pressed_focus_tx; + if (_pressed_unfocus_tx) delete _pressed_unfocus_tx; +} +void OtkButton::press(void) +{ + if (_pressed_focus_tx) + OtkFocusWidget::setTexture(_pressed_focus_tx); + if (_pressed_unfocus_tx) + OtkFocusWidget::setUnfocusTexture(_pressed_unfocus_tx); + _pressed = true; } -void OtkButton::setText(const std::string &text) +void OtkButton::release(void) { - std::string a = text; + OtkFocusWidget::setTexture(_unpr_focus_tx); + OtkFocusWidget::setUnfocusTexture(_unpr_unfocus_tx); + _pressed = false; } -void OtkButton::press(void) +void OtkButton::setTexture(BTexture *texture) { + OtkFocusWidget::setTexture(texture); + _unpr_focus_tx = texture; +} +void OtkButton::setUnfocusTexture(BTexture *texture) +{ + OtkFocusWidget::setUnfocusTexture(texture); + _unpr_unfocus_tx = texture; } -void OtkButton::release(void) +void OtkButton::update(void) +{ + if (_dirty) { + const BFont ft = getStyle()->getFont(); + BColor *text_color = (isFocused() ? getStyle()->getTextFocus() + : getStyle()->getTextUnfocus()); + unsigned int bevel = getStyle()->getBevelWidth(); + + OtkFocusWidget::resize(ft.measureString(_text) + bevel * 2, + ft.height() + bevel * 2); + OtkFocusWidget::update(); + + ft.drawString(getWindow(), bevel, bevel, *text_color, _text); + } else + OtkFocusWidget::update(); + + _dirty = false; +} + +int OtkButton::buttonPressHandler(const XButtonEvent &e) { + press(); + _dirty = true; + update(); + return OtkFocusWidget::buttonPressHandler(e); +} +int OtkButton::buttonReleaseHandler(const XButtonEvent &e) +{ + release(); + _dirty = true; + update(); + return OtkFocusWidget::buttonReleaseHandler(e); +} + +int OtkButton::exposeHandler(const XExposeEvent &e) +{ + _dirty = true; + return OtkFocusWidget::exposeHandler(e); +} + +int OtkButton::configureHandler(const XConfigureEvent &e) +{ + if (!(e.width == width() && e.height == height())) + _dirty = true; + return OtkFocusWidget::configureHandler(e); } }