ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/cf.schmorp.de/dclient/src/backend/ndk/panel.cpp
Revision: 1.4
Committed: Sun Oct 24 20:31:51 2010 UTC (16 years ago) by sf-pippijn
Branch: MAIN
CVS Tags: HEAD
Changes since 1.3: +5 -5 lines
Log Message:
use EV and plain sockets instead of asio

File Contents

# Content
1 /* panel.cc
2 * This file is part of NDK++ library
3 * Copyright (c) 2003,2004 by Stanislav Ievlev
4 *
5 * This file is covered by the GNU Library General Public License,
6 * which should be included with libndk as the file COPYING.
7 */
8 #include <ndk/pen.hh>
9 #include <ndk/palette.hh>
10
11 #include <ndk/panel.hh>
12 #include <ndk/application.hh>
13
14 #include <algorithm>
15
16 ndk::panel::panel (panel *parent)
17 : parent_ (parent)
18 , events_ (parent ? parent->events () : 0, this)
19 {
20 /* create panel object */
21 panel_ = new_panel (win ());
22 if (!panel_)
23 throw std::runtime_error ("new_panel failed");
24 if (parent_)
25 {
26 move_panel (panel_, parent_->y (), parent_->x ()); /* move to default position relative to father */
27 parent_->add_child (this); /* append itself to the father */
28 }
29 hide (); /* hide widget by default */
30
31 events ()->on_system (ndk::slot (&panel::at_system, this));
32 }
33
34 ndk::panel::~panel ()
35 {
36 if (parent_)
37 parent_->del_child (this); /* remove child from the parent's list */
38 del_panel (panel_);
39 }
40
41 void
42 ndk::panel::add_child (panel *item)
43 {
44 childs_.push_back (item); /* append a new child to the list */
45 }
46
47 void
48 ndk::panel::del_child (panel *item)
49 {
50 childs_.erase (std::remove (childs_.begin (),
51 childs_.end (),
52 item), childs_.end ());
53 }
54
55 void
56 ndk::panel::top ()
57 {
58 if (hidden ())
59 return; /* we should skip this function if panel hidden */
60 return_unless (::top_panel (panel_) == OK);
61 foreach (panel *p, childs_)
62 p->top ();
63 }
64
65 void
66 ndk::panel::bottom ()
67 {
68 if (hidden ())
69 return; /* we should skip this function if panel hidden */
70 return_unless (::bottom_panel (panel_) == OK);
71 foreach (panel *p, childs_)
72 p->bottom ();
73 }
74
75 void
76 ndk::panel::show ()
77 {
78 /* we should skip this function if panel already visible */
79 if (hidden ())
80 return_unless (::show_panel (panel_) == OK);
81 foreach (panel *p, childs_)
82 p->show ();
83 }
84
85 void
86 ndk::panel::hide ()
87 {
88 /* we should skip this function if panel already hidden */
89 if (!hidden ())
90 return_unless (::hide_panel (panel_) == OK);
91 foreach (panel *p, childs_)
92 p->hide ();
93 }
94
95 bool
96 ndk::panel::hidden () const
97 {
98 return ::panel_hidden (panel_) == TRUE;
99 }
100
101 bool
102 ndk::panel::higher (panel const &other) const
103 {
104 PANEL *below = panel_;
105
106 while ((below = panel_below (below)) != 0)
107 if (below == other.panel_)
108 return true;
109 return false;
110 }
111
112 void
113 ndk::panel::prepare (bool recursive)
114 {
115 draw ();
116 if (recursive)
117 foreach (panel *child, childs_)
118 child->prepare ();
119 }
120
121 void
122 ndk::panel::visualize (bool recursive)
123 {
124 prepare (recursive);
125 show ();
126 }
127
128 void
129 ndk::panel::move (int new_x, int new_y, coords_type type)
130 {
131 /* save difference */
132 int const diffx = new_x - x ();
133 int const diffy = new_y - y ();
134 bool const abs_type = type == absolute || type == rel_parent;
135
136 if (type == rel_parent && parent ())
137 {
138 new_x += parent ()->x ();
139 new_y += parent ()->y ();
140 }
141
142 move_panel ( panel_
143 , abs_type ? new_y : y () + new_y
144 , abs_type ? new_x : x () + new_x
145 );
146
147 /* childs_ always moving in relative coordinates */
148 foreach (panel *p, childs_)
149 p->move (abs_type ? diffx : new_x, abs_type ? diffy : new_y);
150 }
151
152 /**
153 * @todo add support for palette
154 */
155 void
156 ndk::panel::draw ()
157 {
158 pen (*this).fill (palette::instance ().find (colors::panel)->second);
159 }
160
161 int
162 ndk::panel::padding () const
163 {
164 return 0;
165 }
166
167 void
168 ndk::panel::emit (int type)
169 {
170 events_.emit (type);
171 }
172
173 ndk::engine *
174 ndk::panel::events ()
175 {
176 return &events_;
177 }
178
179 void
180 ndk::panel::in_focus (panel &other)
181 {
182 events_.in_focus (other.events ());
183 }
184
185 void
186 ndk::panel::focus ()
187 {
188 if (parent ())
189 {
190 dynamic_cast<panel &> (*parent ()).focus ();
191 dynamic_cast<panel &> (*parent ()).in_focus (*this);
192 }
193 else
194 ndk::app->in_focus (*this);
195 }
196
197 ndk::event::result
198 ndk::panel::at_system (event const &ev)
199 {
200 if (!ev.sender_ && engine::enter_focus == ev.type_)
201 {
202 top ();
203 return event::accepted;
204 }
205 return event::ignored;
206 }