1
2 /******************************************************************************
3 * MODULE : separator_widget.cpp
4 * DESCRIPTION: Widgets for filling up space between a group of widgets.
5 * COPYRIGHT : (C) 1999 Joris van der Hoeven
6 *******************************************************************************
7 * This software falls under the GNU general public license version 3 or later.
8 * It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
9 * in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>.
10 ******************************************************************************/
11
12 #include "gui.hpp"
13 #include "renderer.hpp"
14 #include "window.hpp"
15 #include "Widkit/attribute_widget.hpp"
16 #include "Widkit/layout.hpp"
17
18 /******************************************************************************
19 * Glue widgets
20 ******************************************************************************/
21
22 class separator_widget_rep: public attribute_widget_rep {
23 SI pre, post;
24 bool vert;
25
26 public:
27 separator_widget_rep (SI pre, SI post, bool vert);
28 operator tree ();
29
30 void handle_get_size (get_size_event ev);
31 void handle_repaint (repaint_event ev);
32 void handle_get_coord2 (get_coord2_event ev);
33 void handle_set_coord2 (set_coord2_event ev);
34 };
35
separator_widget_rep(SI pre2,SI post2,bool vert2)36 separator_widget_rep::separator_widget_rep (
37 SI pre2, SI post2, bool vert2):
38 attribute_widget_rep (), pre (pre2), post (post2), vert (vert2) {}
39
operator tree()40 separator_widget_rep::operator tree () {
41 return "separator";
42 }
43
44 void
handle_get_size(get_size_event ev)45 separator_widget_rep::handle_get_size (get_size_event ev) {
46 if (vert) {
47 if (ev->mode==1) gui_maximal_extents (ev->w, ev->h);
48 ev->w= 2*PIXEL+ pre+ post;
49 ev->h= 0;
50 }
51 else {
52 if (ev->mode==-1) ev->w= 0;
53 if (ev->mode==1) gui_maximal_extents (ev->w, ev->h);
54 ev->h= 2*PIXEL+ pre+ post;
55 }
56 }
57
58 void
handle_repaint(repaint_event ev)59 separator_widget_rep::handle_repaint (repaint_event ev) {
60 renderer ren= ev->win;
61 layout_default (ren, ev->x1, ev->y1, ev->x2, ev->y2);
62 ren->set_pencil (pencil (layout_dark (ren), PIXEL));
63 if (vert) ren->line (pre+PIXEL, ev->y1, pre+PIXEL, ev->y2);
64 else ren->line (ev->x1, -pre-PIXEL, ev->x2, -pre-PIXEL);
65 ren->set_pencil (pencil (white, PIXEL));
66 if (vert) ren->line (pre+2*PIXEL, ev->y1, pre+2*PIXEL, ev->y2);
67 else ren->line (ev->x1, -pre-2*PIXEL, ev->x2, -pre-2*PIXEL);
68 }
69
70 void
handle_get_coord2(get_coord2_event ev)71 separator_widget_rep::handle_get_coord2 (get_coord2_event ev) {
72 if (ev->which != "extra width") attribute_widget_rep::handle_get_coord2 (ev);
73 else { ev->c1= 0; ev->c2= 0; }
74 }
75
76 void
handle_set_coord2(set_coord2_event ev)77 separator_widget_rep::handle_set_coord2 (set_coord2_event ev) {
78 if (ev->which != "extra width") attribute_widget_rep::handle_set_coord2 (ev);
79 }
80
81 /******************************************************************************
82 * Interface
83 ******************************************************************************/
84
85 wk_widget
separator_wk_widget(SI pre,SI post,bool vert)86 separator_wk_widget (SI pre, SI post, bool vert) {
87 return tm_new<separator_widget_rep> (pre, post, vert);
88 }
89