1 /* $Id: scroll.c,v 1.5 2005-01-25 19:44:27 schaffner Exp $ */
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
16 static char rcsid[] = "$Id: scroll.c,v 1.5 2005-01-25 19:44:27 schaffner Exp $";
32 void ui_draw_scrollbar( UI_GADGET_SCROLLBAR * scrollbar )
36 if (scrollbar->status==0)
39 scrollbar->status = 0;
42 gr_set_current_canvas( scrollbar->canvas );
44 if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)scrollbar)
49 gr_rect( 0, 0, scrollbar->width-1, scrollbar->fake_position-1 );
50 gr_rect( 0, scrollbar->fake_position+scrollbar->fake_size, scrollbar->width-1, scrollbar->height-1);
52 ui_draw_box_out(0, scrollbar->fake_position, scrollbar->width-1, scrollbar->fake_position+scrollbar->fake_size-1 );
58 UI_GADGET_SCROLLBAR * ui_add_gadget_scrollbar( UI_WINDOW * wnd, short x, short y, short w, short h, int start, int stop, int position, int window_size )
62 UI_GADGET_SCROLLBAR * scrollbar;
65 up[0] = 30; up[1] = 0;
66 down[0] = 31; down[1] = 0;
68 gr_get_string_size( up, &tw, &th, &taw );
72 if (stop < start ) stop = start;
74 scrollbar = (UI_GADGET_SCROLLBAR *)ui_gadget_add( wnd, 3, x, y+w, x+w-1, y+h-w-1 );
76 scrollbar->up_button = ui_add_gadget_button( wnd, x, y, w, w, up, NULL );
77 scrollbar->up_button->parent = (UI_GADGET *)scrollbar;
79 scrollbar->down_button =ui_add_gadget_button( wnd, x, y+h-w, w, w, down, NULL );
80 scrollbar->down_button->parent = (UI_GADGET *)scrollbar;
83 scrollbar->width = scrollbar->x2-scrollbar->x1+1;
84 scrollbar->height = scrollbar->y2-scrollbar->y1+1;
85 scrollbar->start = start;
86 scrollbar->stop = stop;
87 scrollbar->position = position;
88 scrollbar->window_size = window_size;
89 scrollbar->fake_length = scrollbar->height;
90 scrollbar->fake_position = 0;
92 scrollbar->fake_size = (window_size * scrollbar->height)/(stop-start+1+window_size);
94 scrollbar->fake_size = scrollbar->height;
96 if (scrollbar->fake_size < 7) scrollbar->fake_size = 7;
97 scrollbar->dragging = 0;
99 scrollbar->last_scrolled = 0;
104 void ui_scrollbar_do( UI_GADGET_SCROLLBAR * scrollbar, int keypress )
106 int OnMe, OnSlider, keyfocus;
113 if (CurWindow->keyboard_focus_gadget==(UI_GADGET *)scrollbar)
116 if (scrollbar->start==scrollbar->stop)
118 scrollbar->position = 0;
119 scrollbar->fake_position = 0;
120 ui_draw_scrollbar( scrollbar );
124 op = scrollbar->position;
126 oldpos = scrollbar->fake_position;
128 scrollbar->moved = 0;
131 if ( (scrollbar->up_button->position!=0) || (keyfocus && keyd_pressed[KEY_UP]) )
133 if (timer_get_fixed_seconds() > scrollbar->last_scrolled + 1)
135 scrollbar->last_scrolled = timer_get_fixed_seconds();
136 scrollbar->position--;
137 if (scrollbar->position < scrollbar->start )
138 scrollbar->position = scrollbar->start;
139 scrollbar->fake_position = scrollbar->position-scrollbar->start;
140 scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
141 scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
145 if ( (scrollbar->down_button->position!=0) || (keyfocus && keyd_pressed[KEY_DOWN]) )
147 if (timer_get_fixed_seconds() > scrollbar->last_scrolled + 1)
149 scrollbar->last_scrolled = timer_get_fixed_seconds();
150 scrollbar->position++;
151 if (scrollbar->position > scrollbar->stop )
152 scrollbar->position = scrollbar->stop;
153 scrollbar->fake_position = scrollbar->position-scrollbar->start;
154 scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
155 scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
159 OnMe = ui_mouse_on_gadget( (UI_GADGET *)scrollbar );
161 //gr_ubox(0, scrollbar->fake_position, scrollbar->width-1, scrollbar->fake_position+scrollbar->fake_size-1 );
164 scrollbar->dragging = 0;
166 //if (B1_PRESSED && OnMe )
167 // listbox->dragging = 1;
171 if ((Mouse.y >= scrollbar->fake_position+scrollbar->y1) && \
172 (Mouse.y < scrollbar->fake_position+scrollbar->y1+scrollbar->fake_size) && OnMe )
175 if (B1_JUST_PRESSED && OnSlider )
177 scrollbar->dragging = 1;
178 scrollbar->drag_x = Mouse.x;
179 scrollbar->drag_y = Mouse.y;
180 scrollbar->drag_starting = scrollbar->fake_position;
183 if (B1_PRESSED && OnMe && !OnSlider && (timer_get_fixed_seconds() > scrollbar->last_scrolled + 4))
185 scrollbar->last_scrolled = timer_get_fixed_seconds();
187 if ( Mouse.y < scrollbar->fake_position+scrollbar->y1 )
190 scrollbar->position -= scrollbar->window_size;
191 if (scrollbar->position < scrollbar->start )
192 scrollbar->position = scrollbar->start;
196 scrollbar->position += scrollbar->window_size;
197 if (scrollbar->position > scrollbar->stop )
198 scrollbar->position = scrollbar->stop;
200 scrollbar->fake_position = scrollbar->position-scrollbar->start;
201 scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
202 scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
205 if ((selected_gadget==(UI_GADGET *)scrollbar) && B1_PRESSED && scrollbar->dragging )
207 //Mouse.x = scrollbar->drag_x;
208 scrollbar->fake_position = scrollbar->drag_starting + (Mouse.y - scrollbar->drag_y );
209 if (scrollbar->fake_position<0)
211 scrollbar->fake_position = 0;
212 //Mouse.y = scrollbar->fake_position + scrollbar->drag_y - scrollbar->drag_starting;
214 if (scrollbar->fake_position > (scrollbar->height-scrollbar->fake_size))
216 scrollbar->fake_position = (scrollbar->height-scrollbar->fake_size);
217 //Mouse.y = scrollbar->fake_position + scrollbar->drag_y - scrollbar->drag_starting;
220 //mouse_set_pos( Mouse.x, Mouse.y );
222 scrollbar->position = scrollbar->fake_position;
223 scrollbar->position *= (scrollbar->stop-scrollbar->start);
224 scrollbar->position /= ( scrollbar->height-scrollbar->fake_size ) ;
225 scrollbar->position += scrollbar->start;
227 if (scrollbar->position > scrollbar->stop )
228 scrollbar->position = scrollbar->stop;
230 if (scrollbar->position < scrollbar->start )
231 scrollbar->position = scrollbar->start;
233 //scrollbar->fake_position = scrollbar->position-scrollbar->start;
234 //scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
235 //scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
239 if (op != scrollbar->position )
240 scrollbar->moved = 1;
242 if (oldpos != scrollbar->fake_position)
243 scrollbar->status = 1;
244 ui_draw_scrollbar( scrollbar );