X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Fbutton.cc;h=313d8acfcf52751e0b56162444763cba6a84ec4b;hb=8269fc2b3965d12ba308caa554bfa7ee037fba13;hp=410f00838bcf37eb7179ad0e8b978a4e15855eaa;hpb=0856b11de843db30b5053c8cb7d9c84eae262852;p=chaz%2Fopenbox diff --git a/otk/button.cc b/otk/button.cc index 410f0083..313d8acf 100644 --- a/otk/button.cc +++ b/otk/button.cc @@ -1,81 +1,77 @@ +// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- + +#include "config.h" + #include "button.hh" namespace otk { -OtkButton::OtkButton(OtkWidget *parent) - : OtkFocusWidget(parent), _text(""), _pressed(false), _dirty(false), - _pressed_focus_tx(0), _pressed_unfocus_tx(0), _unpr_focus_tx(0), - _unpr_unfocus_tx(0) +Button::Button(Widget *parent) + : Label(parent), + _pressed(false) { - setTexture(getStyle()->getButtonFocus()); - setUnfocusTexture(getStyle()->getButtonUnfocus()); - _pressed_focus_tx = getStyle()->getButtonPressedFocus(); - _pressed_unfocus_tx = getStyle()->getButtonPressedUnfocus(); + setHorizontalJustify(RenderStyle::CenterJustify); + setVerticalJustify(RenderStyle::CenterJustify); + styleChanged(*RenderStyle::style(screen())); } -OtkButton::~OtkButton() +Button::~Button() { - if (_pressed_focus_tx) delete _pressed_focus_tx; - if (_pressed_unfocus_tx) delete _pressed_unfocus_tx; } -void OtkButton::press(void) +void Button::press(unsigned int mouse_button) { - if (_pressed_focus_tx) - OtkFocusWidget::setTexture(_pressed_focus_tx); - if (_pressed_unfocus_tx) - OtkFocusWidget::setUnfocusTexture(_pressed_unfocus_tx); + if (_pressed) return; + _pressed = true; -} + _mouse_button = mouse_button; -void OtkButton::release(void) -{ - OtkFocusWidget::setTexture(_unpr_focus_tx); - OtkFocusWidget::setUnfocusTexture(_unpr_unfocus_tx); - _pressed = false; + styleChanged(*RenderStyle::style(screen())); + refresh(); } -void OtkButton::setTexture(BTexture *texture) +void Button::release(unsigned int mouse_button) { - OtkFocusWidget::setTexture(texture); - _unpr_focus_tx = texture; -} + if (!_pressed || _mouse_button != mouse_button) return; // wrong button -void OtkButton::setUnfocusTexture(BTexture *texture) -{ - OtkFocusWidget::setUnfocusTexture(texture); - _unpr_unfocus_tx = texture; + _pressed = false; + + styleChanged(*RenderStyle::style(screen())); + refresh(); } -void OtkButton::update(void) +void Button::buttonPressHandler(const XButtonEvent &e) { - 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; + Widget::buttonPressHandler(e); + press(e.button); } -bool OtkButton::expose(const XExposeEvent &e) +void Button::buttonReleaseHandler(const XButtonEvent &e) { - _dirty = true; - return OtkFocusWidget::expose(e); + Widget::buttonReleaseHandler(e); + bool p = _pressed; + release(e.button); + if (p && !_pressed && e.x > 0 && e.y > 0 && + e.x < area().width() && e.y < area().height()) + clickHandler(_mouse_button); } -bool OtkButton::configure(const XConfigureEvent &e) +void Button::styleChanged(const RenderStyle &style) { - _dirty = true; - return OtkFocusWidget::configure(e); + if (isHighlighted()) { + if (_pressed) + _texture = style.buttonPressFocusBackground(); + else + _texture = style.buttonUnpressFocusBackground(); + _forecolor = style.buttonFocusColor(); + } else { + if (_pressed) + _texture = style.buttonPressUnfocusBackground(); + else + _texture = style.buttonUnpressUnfocusBackground(); + _forecolor = style.buttonUnfocusColor(); + } + refresh(); } }