]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/scout-gfx/lib/simple_window_deco.cc
update
[l4.git] / l4 / pkg / scout-gfx / lib / simple_window_deco.cc
1
2 #include <l4/scout-gfx/simple_window_deco>
3 #include <l4/scout-gfx/icon>
4 #include <l4/scout-gfx/factory>
5
6 #define SIZER_RGBA    _binary_sizer_rgba_start
7 extern unsigned char SIZER_RGBA[];
8
9
10 namespace Scout_gfx {
11
12 namespace {
13
14 class Deco_widget : public Parent_widget
15 {
16 public:
17   enum  { th = 16 };
18   Icon *_sizer;
19
20   Sizer_event_handler _sevh;
21   Mover_event_handler _mevh;
22
23   Deco_widget(Factory *f, Window *w)
24   : _sevh(w), _mevh(w)
25   {
26     _sizer = f->create_icon(SIZER_RGBA, Area(32, 32));
27     _sizer->alpha(100);
28     _sizer->event_handler(&_sevh);
29     append(_sizer);
30   }
31
32   Mag_gfx::Area preferred_size() const { return Mag_gfx::Area(0,0); }
33   Mag_gfx::Area min_size() const  { return Mag_gfx::Area(0,0); }
34   Mag_gfx::Area max_size() const  { return Mag_gfx::Area(Mag_gfx::Area::Max_w, Mag_gfx::Area::Max_h); }
35   Mag_gfx::Orientations expanding() const { return Mag_gfx::Horz; }
36   bool empty() const { return false; }
37
38   void draw(Mag_gfx::Canvas *c, Mag_gfx::Point const &p)
39   {
40     using namespace Mag_gfx;
41     static const Mag_gfx::Rgba32::Color grey(42, 62, 62);
42     static const Mag_gfx::Rgba32::Color black(0, 0, 0);
43
44     c->draw_box(Rect(p, Area(size().w(), th)), grey);
45
46     c->draw_box(Rect(p + Point(0, size().h() - 1), Area(size().w(), 1)), black);
47     Area hl(1, size().h() - th);
48     c->draw_box(Rect(p + Point(0, th), hl), black);
49     c->draw_box(Rect(p + Point(size().w() - 1, th), hl), black);
50
51     Parent_widget::draw(c, p);
52
53   //  _sizer->draw(c, p + Point(size() - _sizer->size()));
54   }
55
56   Rect title_rect() const
57   {
58     Rect r = geometry();
59     r = Rect(r.p1(), Area(r.w(), th));
60     return r;
61   }
62
63   Widget *find(Point const &p)
64   {
65      if (!findable() || !geometry().contains(p))
66        return 0;
67
68      if (title_rect().contains(p))
69        return this;
70
71      return _sizer->find(p - pos());
72   }
73
74   Widget *handle_event(Event const &e)
75   {
76     if (!visible())
77       return 0;
78
79     _mevh.handle(e);
80     return this;
81   }
82
83   void set_geometry(Rect const &r)
84   {
85     Widget::set_geometry(r);
86     _sizer->set_geometry(Rect(Point(size() - _sizer->size()), _sizer->size()));
87   }
88 };
89
90 }
91
92 Widget *
93 Simple_window_deco_policy::create_deco(Window *w) const
94 {
95   return new Deco_widget(_f, w);
96 }
97
98 void
99 Simple_window_deco_policy::set_deco_mode(Window::Mode mode, Widget *deco,
100                                          Insets *insets)
101 {
102   if (mode == Window::Fullscreen)
103     {
104       insets->tl = Area(0, 0);
105       insets->br = Area(0, 0);
106       deco->findable(false);
107       deco->visible(false);
108     }
109   else
110     {
111       insets->tl = Area(1, 16);
112       insets->br = Area(1, 1);
113       deco->findable(true);
114       deco->visible(true);
115     }
116 }
117
118 }