Initial commit
[forms.git] / src / F_Menu.C
blob9011fdf4732dbeb999e5517360606813c1067860
2 #include <F_Menu.H>
4 using namespace F;
6 void F_Menu::draw_label()
8  if (!label().size())
9    return;
10  F_Point p(0, 0);
11  bool bright = fg() & 0x8;
12  if (state_ != F_BUTTON_NORMAL)
13    fg((fg() & 0x7) | (bright ? 0 : 0x8));
14  put_string(p, label());
15  if (state_ != F_BUTTON_NORMAL)
16    fg((fg() & 0x7) | (bright ? 0x8 : 0));
17  damage(F_DAMAGE_FLUSH);
20 void F_Menu::draw()
22  F_Widget::draw();
23  F_Point p(w() - 1, 0);
24  F_Text_Symbol smb;
25  smb.color(parent()->fg(), parent()->bg());
26  // ÒÉÓÕÅÍ ÔÅÎØ ÓÂÏËÕ
27  smb.ch_ = f_text_display->recode('Œ');
28  draw_buf.set(p, smb);
29  smb.ch_ = f_text_display->recode('�');
30  for (int y = 1; y < h(); y++) {
31   p.move(w() - 1, y);
32   draw_buf.set(p, smb);
33  }
34  // ÓÎÉÚÕ
35  smb.ch_ = f_text_display->recode('‹');
36  for (int x = 1; x < w(); x++) {
37    p.move(x, h() - 1);
38    draw_buf.set(p, smb);
39  }
40   p.move(0, h() - 1);
41   smb.ch_ = ' ';
42   draw_buf.set(p, smb);
43   draw_label();
44   // ÒÉÓÕÅÍ ÐÕÎËÔÙ
45   std::string it;
46   smb.color(fg(), bg());
47   smb.ch_ = f_text_display->recode('–');
48   for (int i = 0; i < size(); i++) {
49     if (value(i)) {
50      p.move(0, 1 + i);
51      draw_buf.set(p, smb);
52   }
53     p.move(2, 1 + i);
54     it = text(i);
55     put_string(p, it); // F_ALIGN_RIGHT
56   }
59 bool F_Menu::handle(F_Event_t &ev)
61  switch(ev.type) {
62    case F_ENTER:
63    case F_FOCUS:
64 //     debug("F_ENTER: bid - %d", id());
65      state_ = F_BUTTON_ON_FOCUS;
66      draw();
67      return true;
68    case F_LEAVE:
69    case F_UNFOCUS:
70 //     debug("F_LEAVE: bid - %d", id());
71      state_ = F_BUTTON_NORMAL;
72      draw();
73      return true;
74    case F_KEY_PRESS:
75      if (ev.kbd.key == F_Escape) {
76        hide();
77 //       b_->show();
78        return true;
79      } else
80      if (ev.kbd.key == F_Enter) {
81        state_ = F_BUTTON_PRESSED;
82        draw();
83        // ÞÅÒÅÚ 50 ms ÐÏÓÌÁÔØ event ÄÁÎÎÏÍÕ ÂÁÔÔ'ÏÎÕ
84        ev.type = F_KEY_RELEASE;
85        ev.delay = 5; // 50 ms
86        ev.widget = this;
87        f_text_display->event(ev);
88        return true;
89     }
90      break;
91    case F_KEY_RELEASE:
92      if (ev.kbd.key == F_Enter) {
93        state_ = F_BUTTON_ON_FOCUS;
94        do_callback();
95        draw();
96        return true;
97     }
98      break;
99    case F_POINTER_PRESS:
100 //     debug("F_POINTER_PRESS: bid - %d", id());
101      state_ = F_BUTTON_PRESSED;
102      draw();
103      return true;
104    case F_POINTER_RELEASE:
105    case F_POINTER_DROP:
106 //     debug("F_POINTER_RELEASE: bid - %d", id());
107      state_ = F_BUTTON_ON_FOCUS;
108      do_callback();
109      draw();
110      return true;
111    default:
112      debug("bid - %d, evtype - %d", id(), ev.type);
113      break;
115  return false;