32 #include "range.h" |
32 #include "range.h" |
33 #include "container.h" |
33 #include "container.h" |
34 #include "../common/context.h" |
34 #include "../common/context.h" |
35 #include "../common/object.h" |
35 #include "../common/object.h" |
36 |
36 |
37 |
|
38 static UIWIDGET ui_scrollbar(UiObject *obj, UiOrientation orientation, UiRange *range, ui_callback f, void *userdata) { |
|
39 UiContainer *ct = uic_get_current_container(obj); |
|
40 |
|
41 int n = 0; |
|
42 Arg args[16]; |
|
43 XtSetArg(args[n], XmNorientation, orientation == UI_HORIZONTAL ? XmHORIZONTAL : XmVERTICAL); |
|
44 n++; |
|
45 XtSetArg (args[n], XmNmaximum, 10); |
|
46 n++; |
|
47 XtSetArg (args[n], XmNsliderSize, 1); |
|
48 n++; |
|
49 Widget parent = ct->prepare(ct, args, &n, FALSE); |
|
50 Widget scrollbar = XmCreateScrollBar(parent, "scrollbar", args, n); |
|
51 XtManageChild(scrollbar); |
|
52 ct->add(ct, scrollbar); |
|
53 |
|
54 if(range) { |
|
55 range->get = ui_scrollbar_get; |
|
56 range->set = ui_scrollbar_set; |
|
57 range->setrange = ui_scrollbar_setrange; |
|
58 range->setextent = ui_scrollbar_setextent; |
|
59 range->obj = scrollbar; |
|
60 } |
|
61 |
|
62 if(f) { |
|
63 UiEventData *event = cxMalloc( |
|
64 obj->ctx->allocator, |
|
65 sizeof(UiEventData)); |
|
66 event->obj = obj; |
|
67 event->userdata = userdata; |
|
68 event->callback = f; |
|
69 event->value = 0; |
|
70 XtAddCallback( |
|
71 scrollbar, |
|
72 XmNvalueChangedCallback, |
|
73 (XtCallbackProc)ui_scrollbar_callback, |
|
74 event); |
|
75 } |
|
76 |
|
77 return scrollbar; |
|
78 } |
|
79 |
|
80 UIWIDGET ui_hscrollbar(UiObject *obj, UiRange *range, ui_callback f, void *userdata) { |
|
81 return ui_scrollbar(obj, UI_HORIZONTAL, range, f, userdata); |
|
82 } |
|
83 |
|
84 UIWIDGET ui_vscrollbar(UiObject *obj, UiRange *range, ui_callback f, void *userdata) { |
|
85 return ui_scrollbar(obj, UI_VERTICAL, range, f, userdata); |
|
86 } |
|
87 |
|
88 void ui_scrollbar_callback(Widget scrollbar, UiEventData *event, XtPointer cdata) { |
|
89 UiEvent e; |
|
90 e.obj = event->obj; |
|
91 e.window = event->obj->window; |
|
92 e.document = event->obj->ctx->document; |
|
93 e.intval = event->value; |
|
94 event->callback(&e, event->userdata); |
|
95 } |
|
96 |
|
97 double ui_scrollbar_get(UiRange *range) { |
|
98 int intval; |
|
99 XtVaGetValues( |
|
100 range->obj, |
|
101 XmNvalue, |
|
102 &intval, |
|
103 NULL); |
|
104 double value = (double)intval / 10; |
|
105 range->value = value; |
|
106 return value; |
|
107 } |
|
108 |
|
109 void ui_scrollbar_set(UiRange *range, double value) { |
|
110 XtVaSetValues( |
|
111 range->obj, |
|
112 XmNvalue, |
|
113 (int)(value * 10), |
|
114 NULL); |
|
115 range->value = value; |
|
116 } |
|
117 |
|
118 void ui_scrollbar_setrange(UiRange *range, double min, double max) { |
|
119 XtVaSetValues( |
|
120 range->obj, |
|
121 XmNminimum, |
|
122 (int)(min * 10), |
|
123 XmNmaximum, |
|
124 (int)(max * 10), |
|
125 NULL); |
|
126 range->min = min; |
|
127 range->max = max; |
|
128 } |
|
129 |
|
130 void ui_scrollbar_setextent(UiRange *range, double extent) { |
|
131 XtVaSetValues( |
|
132 range->obj, |
|
133 XmNsliderSize, |
|
134 (int)(extent * 10), |
|
135 NULL); |
|
136 range->extent = extent; |
|
137 } |
|