summaryrefslogtreecommitdiff
path: root/src/Fl_Scrollbar.cxx
diff options
context:
space:
mode:
authorMichael R Sweet <michael.r.sweet@gmail.com>1998-10-06 18:21:25 +0000
committerMichael R Sweet <michael.r.sweet@gmail.com>1998-10-06 18:21:25 +0000
commitf9039b2ae21988783feae9b362818e7923e82d14 (patch)
tree6d6fe3679d73448758f9794e7d4d4f6b22a4adad /src/Fl_Scrollbar.cxx
parent67e89232f9ba067825a158734a09e0fa21aacbe3 (diff)
Initial revision
git-svn-id: file:///fltk/svn/fltk/trunk@2 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_Scrollbar.cxx')
-rw-r--r--src/Fl_Scrollbar.cxx158
1 files changed, 158 insertions, 0 deletions
diff --git a/src/Fl_Scrollbar.cxx b/src/Fl_Scrollbar.cxx
new file mode 100644
index 000000000..4863d9431
--- /dev/null
+++ b/src/Fl_Scrollbar.cxx
@@ -0,0 +1,158 @@
+// Fl_Scrollbar.C
+
+#include <FL/Fl.H>
+#include <FL/Fl_Scrollbar.H>
+#include <FL/fl_draw.H>
+#include <math.h>
+
+#define INITIALREPEAT .5
+#define REPEAT .05
+
+void Fl_Scrollbar::increment_cb() {
+ handle_drag(clamp(value() + (
+ ((pushed_>1) == (maximum()>=minimum())) ? linesize_ : -linesize_)));
+}
+
+void Fl_Scrollbar::timeout_cb(void* v) {
+ Fl_Scrollbar* s = (Fl_Scrollbar*)v;
+ s->increment_cb();
+ Fl::add_timeout(REPEAT, timeout_cb, s);
+}
+
+int Fl_Scrollbar::handle(int event) {
+ if (!pushed_) {
+ if (horizontal()) {
+ if (w() < 3*h()) return Fl_Slider::handle(event);
+ if (Fl_Slider::handle(event, x()+h(), y(), w()-2*h(), h())) return 1;
+ } else {
+ if (h() < 3*w()) return Fl_Slider::handle(event);
+ if (Fl_Slider::handle(event, x(), y()+w(), w(), h()-2*w())) return 1;
+ }
+ }
+ switch (event) {
+ case FL_RELEASE:
+ if (pushed_) {
+ Fl::remove_timeout(timeout_cb, this);
+ pushed_ = 0;
+ redraw();
+ }
+ handle_release();
+ return 1;
+ case FL_PUSH:
+ if (horizontal()) {
+ if (Fl::event_inside(x(), y(), h(), h())) pushed_ = 1;
+ if (Fl::event_inside(x()+w()-h(), y(), h(), h())) pushed_ = 2;
+ } else {
+ if (Fl::event_inside(x(), y(), w(), w())) pushed_ = 1;
+ if (Fl::event_inside(x(), y()+h()-w(), w(), w())) pushed_ = 2;
+ }
+ if (pushed_) {
+ handle_push();
+ Fl::add_timeout(INITIALREPEAT, timeout_cb, this);
+ increment_cb();
+ redraw();
+ }
+ return 1;
+ case FL_DRAG:
+ return pushed_;
+ case FL_SHORTCUT: {
+ int v = value();
+ int ls = maximum()>=minimum() ? linesize_ : -linesize_;
+ if (horizontal()) {
+ switch (Fl::event_key()) {
+ case FL_Left:
+ v -= ls;
+ break;
+ case FL_Right:
+ v += ls;
+ break;
+ default:
+ return 0;
+ }
+ } else { // vertical
+ switch (Fl::event_key()) {
+ case FL_Up:
+ v -= ls;
+ break;
+ case FL_Down:
+ v += ls;
+ break;
+ case FL_Page_Up:
+ if (slider_size() >= 1.0) return 0;
+ v -= int((maximum()-minimum())*slider_size()/(1.0-slider_size()));
+ v += ls;
+ break;
+ case FL_Page_Down:
+ if (slider_size() >= 1.0) return 0;
+ v += int((maximum()-minimum())*slider_size()/(1.0-slider_size()));
+ v -= ls;
+ break;
+ case FL_Home:
+ v = int(minimum());
+ break;
+ case FL_End:
+ v = int(maximum());
+ break;
+ default:
+ return 0;
+ }
+ }
+ v = int(clamp(v));
+ if (v != value()) {
+ Fl_Slider::value(v);
+ value_damage();
+ do_callback();
+ }
+ return 1;}
+ }
+ return 0;
+}
+
+void Fl_Scrollbar::draw() {
+ if (horizontal()) {
+ if (w() < 3*h()) {Fl_Slider::draw(); return;}
+ Fl_Slider::draw(x()+h(), y(), w()-2*h(), h());
+ if (damage()&128) {
+ draw_box((pushed_&1) ? down(slider()) : slider(),
+ x(), y(), h(), h(), selection_color());
+ draw_box((pushed_&2) ? down(slider()) : slider(),
+ x()+w()-h(), y(), h(), h(), selection_color());
+ fl_color(labelcolor());
+ int w1 = (h()-1)|1; // use odd sizes only
+ int Y = y()+w1/2;
+ int W = w1/3;
+ int X = x()+w1/2+W/2;
+ fl_polygon(X-W, Y, X, Y-W, X, Y+W);
+ X = x()+w()-(X-x())-1;
+ fl_polygon(X+W, Y, X, Y+W, X, Y-W);
+ }
+ } else { // vertical
+ if (h() < 3*w()) {Fl_Slider::draw(); return;}
+ Fl_Slider::draw(x(), y()+w(), w(), h()-2*w());
+ if (damage()&128) {
+ draw_box((pushed_&1) ? down(slider()) : slider(),
+ x(), y(), w(), w(), selection_color());
+ draw_box((pushed_&2) ? down(slider()) : slider(),
+ x(), y()+h()-w(), w(), w(), selection_color());
+ fl_color(labelcolor());
+ int w1 = (w()-1)|1; // use odd sizes only
+ int X = x()+w1/2;
+ int W = w1/3;
+ int Y = y()+w1/2+W/2;
+ fl_polygon(X, Y-W, X+W, Y, X-W, Y);
+ Y = y()+h()-(Y-y())-1;
+ fl_polygon(X, Y+W, X-W, Y, X+W, Y);
+ }
+ }
+}
+
+Fl_Scrollbar::Fl_Scrollbar(int X, int Y, int W, int H, const char* L)
+ : Fl_Slider(X, Y, W, H, L)
+{
+ box(FL_FLAT_BOX);
+ color(FL_DARK2);
+ slider(FL_UP_BOX);
+ linesize_ = 16;
+ pushed_ = 0;
+ step(1);
+}