2 Copyright (C) 1999 Paul Barton-Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include <cstdio> /* for sprintf, sigh ... */
24 #include <gtkmm2ext/utils.h>
25 #include <gtkmm2ext/click_box.h>
29 using namespace Gtkmm2ext
;
32 ClickBox::ClickBox (Gtk::Adjustment
*adjp
, const string
&name
, bool round_to_steps
)
33 : AutoSpin (*adjp
,0,round_to_steps
)
35 print_func
= default_printer
;
37 layout
= create_pango_layout ("");
42 add_events (Gdk::BUTTON_RELEASE_MASK
|
43 Gdk::BUTTON_PRESS_MASK
|
44 Gdk::ENTER_NOTIFY_MASK
|
45 Gdk::LEAVE_NOTIFY_MASK
);
47 get_adjustment().signal_value_changed().connect (mem_fun (*this, &ClickBox::set_label
));
48 signal_style_changed().connect (mem_fun (*this, &ClickBox::style_changed
));
49 signal_button_press_event().connect (mem_fun (*this, &ClickBox::button_press_handler
));
50 signal_button_release_event().connect (mem_fun (*this, &ClickBox::button_release_handler
));
55 ClickBox::~ClickBox ()
60 ClickBox::button_press_handler (GdkEventButton
* ev
)
63 AutoSpin::button_press (ev
);
68 ClickBox::button_release_handler (GdkEventButton
* ev
)
83 ClickBox::default_printer (char buf
[32], Gtk::Adjustment
&adj
,
86 sprintf (buf
, "%.2f", adj
.get_value());
90 ClickBox::set_label ()
98 print_func (buf
, get_adjustment(), print_arg
);
100 layout
->set_text (buf
);
101 layout
->get_pixel_size (twidth
, theight
);
107 ClickBox::style_changed (const Glib::RefPtr
<Gtk::Style
>&)
109 layout
->context_changed ();
110 layout
->get_pixel_size (twidth
, theight
);
114 ClickBox::on_expose_event (GdkEventExpose
*ev
)
116 /* Why do we do things like this rather than use a Gtk::Label?
117 Because whenever Gtk::Label::set_label() is called, it
118 triggers a recomputation of its own size, along with that
119 of its container and on up the tree. That's intended
120 to be unnecessary here.
123 Gtk::DrawingArea::on_expose_event (ev
);
127 Glib::RefPtr
<Gtk::Style
> style (get_style());
128 Glib::RefPtr
<Gdk::GC
> fg_gc (style
->get_fg_gc (Gtk::STATE_NORMAL
));
129 Glib::RefPtr
<Gdk::GC
> bg_gc (style
->get_bg_gc (Gtk::STATE_NORMAL
));
130 Glib::RefPtr
<Gdk::Window
> win (get_window());
132 GdkRectangle base_rect
;
133 GdkRectangle draw_rect
;
134 gint x
, y
, width
, height
, depth
;
136 win
->get_geometry (x
, y
, width
, height
, depth
);
138 base_rect
.width
= width
;
139 base_rect
.height
= height
;
143 gdk_rectangle_intersect (&ev
->area
, &base_rect
, &draw_rect
);
144 win
->draw_rectangle (bg_gc
, true, draw_rect
.x
, draw_rect
.y
, draw_rect
.width
, draw_rect
.height
);
146 if (twidth
&& theight
) {
147 win
->draw_layout (fg_gc
, (width
- twidth
) / 2, (height
- theight
) / 2, layout
);