all repos — openbox @ b169547797768acdb1ca90330375bba5b5caa19e

openbox fork - make it a bit more like ryudo

working button class (minus fonts)
Marius Nita marius@cs.pdx.edu
commit

b169547797768acdb1ca90330375bba5b5caa19e

parent

b33e8f66129db596fcf22499c2abc7c4505a8f48

2 files changed, 67 insertions(+), 12 deletions(-)

jump to
M otk/button.ccotk/button.cc

@@ -3,29 +3,66 @@

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); + ft.drawString(getWindow(), bevel, bevel, *text_color, _text); + + OtkFocusWidget::update(); + } + + _dirty = false; } }
M otk/button.hhotk/button.hh

@@ -1,19 +1,30 @@

-#include "widget.hh" -#include "style.hh" -#include "texture.hh" +#include "focuswidget.hh" //#include "pixmap.hh" namespace otk { -class OtkButton : public OtkWidget { +class OtkButton : public OtkFocusWidget { public: OtkButton(OtkWidget *parent); ~OtkButton(); + inline const BTexture *getPressedFocusTexture(void) const + { return _pressed_focus_tx; } + void setPressedFocusTexture(BTexture *texture) + { _pressed_focus_tx = texture; } + + inline const BTexture *getPressedUnfocusTexture(void) const + { return _pressed_unfocus_tx; } + void setPressedUnfocusTexture(BTexture *texture) + { _pressed_unfocus_tx = texture; } + + void setTexture(BTexture *texture); + void setUnfocusTexture(BTexture *texture); + inline const std::string &getText(void) const { return _text; } - void setText(const std::string &text); + void setText(const std::string &text) { _text = text; _dirty = true; } //inline const OtkPixmap &getPixmap(void) const { return _pixmap; } //void setPixmap(const OtkPixmap &pixmap);

@@ -21,14 +32,21 @@

inline bool isPressed(void) const { return _pressed; } void press(void); void release(void); + + void update(void); private: std::string _text; //OtkPixmap _pixmap; bool _pressed; - BTexture *_unfocus_tx; + bool _dirty; + + BTexture *_pressed_focus_tx; + BTexture *_pressed_unfocus_tx; + BTexture *_unpr_focus_tx; + BTexture *_unpr_unfocus_tx; }; }