Initial commit
[forms.git] / F / F_Scrollbar.H
blob04ad837a010ae57adb8ea61bf8d57e9c58ad9f3b
2 #ifndef _F_SCROLLBAR_H_
3 #define _F_SCROLLBAR_H_
5 #include <F_Text_Display.H>
6 #include <F_Widget.H>
7 #include <math.h>
9 namespace F {
11 class F_Scrollbar : public F_Widget {
13   unsigned int size_; // visible scrollbar size [ 1 <-> (h() - 1) ]
14   unsigned int value_; // current virtual value
15   unsigned int bounds_; // virtual value bounds
16   char type_;
18   void draw();
19   void size(int sz) {
20     if (type_ == F_VERTICAL) {
21       if (sz > (h() - 2))
22         sz = h() - 2;
23     } else {
24       if (sz > (w() - 2))
25         sz = w() - 2;
26     }
27     if (sz < 1)
28       sz = 1;
29     size_ = sz;
30     redraw();
31   }
33  public:
34   F_Scrollbar(F_Box_Type_t btype, char type, coord_t x, coord_t y, dim_t w, dim_t h,
35     const char *label = 0) : F_Widget(x, y, w, h, label) {
36       hide();
37       type_ = type;
38       size_ = 1;
39       bounds_ = value_ = 0;
40  }
41   ~F_Scrollbar() { }
42   bool handle(F_Event_t &ev);
43   unsigned int value() { return value_; }
44   void value(int val) {
45     if (val < 0)
46       val = 0;
47     if (val > (int)bounds_)
48       value_ = bounds_;
49     else
50       value_ = val;
51   }
52   void bounds(unsigned int b) {
53     bounds_ = b;
54     if (type_ == F_VERTICAL) {
55       if (int(bounds_) < (h() - 2))
56         size((int)floorf(((float)bounds_/((float)(h() - 2))) * (float(h() - 2))));
57       else
58         size((int)floorf(((float)(h() - 2)/((float)bounds_)) * (float(h() - 2))));
59     } else {
60       if (int(bounds_) < (w() - 2))
61         size((int)floorf(((float)bounds_/((float)(w() - 2))) * (float(w() - 2))));
62       else
63         size((int)floorf(((float)(w() - 2)/((float)bounds_)) * (float(w() - 2))));
64     }
65     value(value_);
66    }
67  };
70 #endif