]> icculus.org git repositories - mikachu/openbox.git/blob - otk/button.cc
Brand spankin new widgets for otk (Label and Button).
[mikachu/openbox.git] / otk / button.cc
1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
2
3 #ifdef HAVE_CONFIG_H
4 # include "../config.h"
5 #endif
6
7 #include "button.hh"
8
9 namespace otk {
10
11 Button::Button(Widget *parent)
12   : Label(parent), _default(false), _pressed(false)
13 {
14   setHorizontalJustify(RenderStyle::CenterJustify);
15   setVerticalJustify(RenderStyle::CenterJustify);
16   styleChanged(*RenderStyle::style(screen()));
17 }
18
19 Button::~Button()
20 {
21 }
22
23 void Button::press(unsigned int mouse_button)
24 {
25   if (_pressed) return;
26
27   _pressed = true;
28   _mouse_button = mouse_button;
29
30   styleChanged(*RenderStyle::style(screen()));
31   refresh();
32 }
33
34 void Button::release(unsigned int mouse_button)
35 {
36   if (!_pressed || _mouse_button != mouse_button) return; // wrong button
37
38   _pressed = false;
39
40   styleChanged(*RenderStyle::style(screen()));
41   refresh();
42 }
43
44 void Button::buttonPressHandler(const XButtonEvent &e)
45 {
46   Widget::buttonPressHandler(e);
47   press(e.button);
48 }
49
50 void Button::buttonReleaseHandler(const XButtonEvent &e)
51 {
52   Widget::buttonReleaseHandler(e);
53   release(e.button);
54 }
55
56 void Button::setDefault(bool d)
57 {
58   _default = d;
59   styleChanged(*RenderStyle::style(screen()));
60   refresh();
61 }
62
63 void Button::styleChanged(const RenderStyle &style)
64 {
65   if (_default) {
66     if (_pressed)
67       _texture = style.buttonPressFocusBackground();
68     else
69       _texture = style.buttonUnpressFocusBackground();
70     _forecolor = style.buttonFocusColor();
71   } else {
72     if (_pressed)
73       _texture = style.buttonPressUnfocusBackground();
74     else
75       _texture = style.buttonUnpressUnfocusBackground();
76     _forecolor = style.buttonUnfocusColor();
77   }
78   Widget::styleChanged(style);
79 }
80
81 }