From 7e94f32e4c99ced99ab4efaef1e56ad96430fb40 Mon Sep 17 00:00:00 2001 From: Ole Loots Date: Tue, 20 Nov 2012 01:41:42 +0100 Subject: Initial work at making scrolling work --- atari/gemtk/gemtk.h | 5 +- atari/gemtk/guiwin.c | 176 +++++++++++++++++++++++++++++++++------------------ atari/gui.c | 2 + atari/treeview.c | 30 +++++---- 4 files changed, 139 insertions(+), 74 deletions(-) diff --git a/atari/gemtk/gemtk.h b/atari/gemtk/gemtk.h index 5e0f5c464..412871598 100644 --- a/atari/gemtk/gemtk.h +++ b/atari/gemtk/gemtk.h @@ -84,6 +84,7 @@ enum guwin_area_e { }; short guiwin_init(void); +void guiwin_exit(void); GUIWIN * guiwin_add(short handle, uint32_t flags, guiwin_event_handler_f handler); GUIWIN *guiwin_find(short handle); @@ -99,11 +100,13 @@ void guiwin_set_toolbar(GUIWIN *win, OBJECT *toolbar, short idx, void guiwin_set_event_handler(GUIWIN *win,guiwin_event_handler_f cb); void guiwin_set_user_data(GUIWIN *win, void *data); void *guiwin_get_user_data(GUIWIN *win); -struct guiwin_scroll_info_s *guiwin_get_scroll_info(GUIWIN *win); +struct guiwin_scroll_info_s * guiwin_get_scroll_info(GUIWIN *win); void guiwin_update_slider(GUIWIN *win, short mode); +void guiwin_send_redraw(GUIWIN *win, GRECT *area); VdiHdl guiwin_get_vdi_handle(GUIWIN *win); + /* * AES Scroller Object */ diff --git a/atari/gemtk/guiwin.c b/atari/gemtk/guiwin.c index fa496bf6b..e055abae9 100644 --- a/atari/gemtk/guiwin.c +++ b/atari/gemtk/guiwin.c @@ -27,64 +27,92 @@ static GUIWIN * winlist; static VdiHdl v_vdi_h = -1; static short work_out[57]; +static void move_screen( int vhandle, GRECT *screen, int dx, int dy) { + INT16 xy[ 8]; + long dum = 0L; + GRECT g; + + /* get intersection with screen area */ + wind_get_grect(0, WF_CURRXYWH, &g); + rc_intersect(&g, screen); + xy[ 0] = screen -> g_x; + xy[ 1] = screen -> g_y; + xy[ 2] = xy[ 0] + screen -> g_w - 1; + xy[ 3] = xy[ 1] + screen -> g_h - 1; + xy[ 4] = xy[ 0] + dx; + xy[ 5] = xy[ 1] + dy; + xy[ 6] = xy[ 2] + dx; + xy[ 7] = xy[ 3] + dy; + vro_cpyfm( vhandle, S_ONLY, xy, (MFDB *)&dum, (MFDB *)&dum); +} + static short preproc_wm(GUIWIN * gw, EVMULT_OUT *ev_out, short msg[8]) { - GRECT g, tb_area, tb_area_ro; + GRECT g, g_ro, tb_area, tb_area_ro; short retval = 1; int val; struct guiwin_scroll_info_s *slid; switch(msg[0]) { - case WM_ARROWED: - if((gw->flag & GW_FLAG_CUSTOM_SCROLLING) == 0){ - - slid = guiwin_get_scroll_info(win); - - switch(msg[4]){ - case WA_DNPAGE: - guiwin_get_grect(win, GUIWIN_AREA_CONTENT, &g); - val = g.g_h; - // complete redraw - // increase scroll val by page size... - break; - - case WA_UPLINE: - slid->g_y = MAX(0, slid->g_y-1); - // partial redraw - break; - - case WA_DNLINE: - slid->g_y = MIN(slid->y_pos_max, slid->g_y+1); - // move content up by unit size and sched redraw for the - // bottom 16 px - // partial redraw - break; - - case WA_LFPAGE: - // complete redraw - // increase scroll val by page size... - break; - - case WA_RTPAGE: - // complete redraw - // increase scroll val by page size... - break; - - case WA_LFLINE: - slid->g_x = MAX(0, slid->g_x-1); - // partial redraw - break; - - case WA_RTLINE: - slid->g_x = MIN(slid->x_pos_max, slid->g_x+1); - // partial redraw - break; - - default: break; - } - } - break; + case WM_ARROWED: + if((gw->flags & GW_FLAG_CUSTOM_SCROLLING) == 0) { + + slid = guiwin_get_scroll_info(gw); + guiwin_get_grect(gw, GUIWIN_AREA_CONTENT, &g); + g_ro = g; + + switch(msg[4]) { + case WA_DNPAGE: + + val = g.g_h; + // complete redraw + // increase scroll val by page size... + break; + + case WA_UPLINE: + slid->y_pos = MAX(0, slid->y_pos-1); + // partial redraw + break; + + case WA_DNLINE: + slid->y_pos = MIN(slid->y_pos_max, slid->y_pos+1); + g.g_y += slid->y_unit_px; + g.g_h -= slid->y_unit_px; + move_screen(v_vdi_h, &g, 0, -slid->y_unit_px); + g.g_y = g_ro.g_y + g_ro.g_h - slid->y_unit_px; + g.g_h = slid->y_unit_px; + guiwin_send_redraw(gw, &g); + // move content up by unit size and sched redraw for the + // bottom 16 px + // partial redraw + break; + + case WA_LFPAGE: + // complete redraw + // increase scroll val by page size... + break; + + case WA_RTPAGE: + // complete redraw + // increase scroll val by page size... + break; + + case WA_LFLINE: + slid->x_pos = MAX(0, slid->x_pos-1); + // partial redraw + break; + + case WA_RTLINE: + slid->x_pos = MIN(slid->x_pos_max, slid->x_pos+1); + // partial redraw + break; + + default: + break; + } + } + break; case WM_TOPPED: wind_set(gw->handle, WF_TOP, 1, 0, 0, 0); @@ -248,17 +276,18 @@ short guiwin_dispatch_event(EVMULT_IN *ev_in, EVMULT_OUT *ev_out, short msg[8]) short guiwin_init(void) { - if(v_vdi_h == -1){ - short dummy; - static short work_in[12] = {1,1,1,1,1,1,1,1,1,1,2,1}; - v_vdi_h=graf_handle(&dummy, &dummy, &dummy, &dummy); - v_opnvwk(work_in, &v_vdi_h, work_out); - } + if(v_vdi_h == -1) { + short dummy; + static short work_in[12] = {1,1,1,1,1,1,1,1,1,1,2,1}; + v_vdi_h=graf_handle(&dummy, &dummy, &dummy, &dummy); + v_opnvwk(work_in, &v_vdi_h, work_out); + } + return(0); } void guiwin_exit(void) { - v_clsvwk(v_vdi_h); + v_clsvwk(v_vdi_h); } GUIWIN * guiwin_add(short handle, uint32_t flags, guiwin_event_handler_f cb) @@ -368,9 +397,9 @@ void guiwin_update_slider(GUIWIN *win, short mode) struct guiwin_scroll_info_s * slid; unsigned long size, pos; - short handle = guiwin_get_handle(win); + short handle = guiwin_get_handle(win); guiwin_get_grect(win, GUIWIN_AREA_CONTENT, &viewport); - slid = guiwin_get_scroll_info(win); + slid = guiwin_get_scroll_info(win); if((mode & 1) && (slid->y_unit_px > 0)) { if ( slid->y_pos_max < (long)viewport.g_h/slid->y_unit_px) @@ -440,8 +469,35 @@ void *guiwin_get_user_data(GUIWIN *win) struct guiwin_scroll_info_s *guiwin_get_scroll_info(GUIWIN *win) { - return(&win->scroll_info); + return(&win->scroll_info); +} + +void guiwin_send_redraw(GUIWIN *win, GRECT *area) +{ + short msg[8]; + GRECT work; + + if(area == NULL){ + guiwin_get_grect(win, GUIWIN_AREA_WORK, &work); + area = &work; + } + + msg[0] = WM_REDRAW; + msg[1] = gl_apid; + msg[2] = 0; + msg[3] = win->handle; + msg[4] = area->g_x; + msg[5] = area->g_y; + msg[6] = area->g_w; + msg[7] = area->g_h; + + appl_write(gl_apid, 16, &msg); +} +/* +void guiwin_exec_redraw(){ + } +*/ diff --git a/atari/gui.c b/atari/gui.c index fb412f376..7204705a0 100755 --- a/atari/gui.c +++ b/atari/gui.c @@ -1117,7 +1117,9 @@ int main(int argc, char** argv) freopen("stdout.log", "a+", stdout); freopen("stderr.log", "a+", stderr); #endif + // todo: replace with appl_init ApplInit(); + gl_apid = _AESapid; graf_mouse(BUSY_BEE, NULL); init_os_info(); atari_find_resource((char*)&messages, "messages", "res/messages"); diff --git a/atari/treeview.c b/atari/treeview.c index ab0afb515..4cddea417 100755 --- a/atari/treeview.c +++ b/atari/treeview.c @@ -86,6 +86,11 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8]) on_redraw_event(tv, ev_out, msg); break; + case WM_SIZED: + case WM_FULLED: + guiwin_update_slider(win, 3); + break; + default: break; } @@ -322,18 +327,16 @@ void atari_treeview_destroy( NSTREEVIEW tv ) bool atari_treeview_mevent( NSTREEVIEW tv, browser_mouse_state bms, int x, int y) { GRECT work; + struct guiwin_scroll_info_s *slid; if( tv == NULL ) return ( false ); guiwin_get_grect(tv->window, GUIWIN_AREA_CONTENT, &work); + slid = guiwin_get_scroll_info(tv->window); - //int rx = (x-work.g_x)+(tv->window->xpos*tv->window->w_u); - //int ry = (y-work.g_y)+(tv->window->ypos*tv->window->h_u); - - // TODO: get slider values - int rx = (x-work.g_x); - int ry = (y-work.g_y); + int rx = (x-work.g_x)+(slid->x_pos*slid->x_unit_px); + int ry = (y-work.g_y)+(slid->y_pos*slid->y_unit_px); tree_mouse_action(tv->tree, bms, rx, ry); @@ -353,9 +356,11 @@ void atari_treeview_redraw( NSTREEVIEW tv) short todo[4]; GRECT work; - short handle = guiwin_get_handle(tv->window); + short handle = guiwin_get_handle(tv->window); + struct guiwin_scroll_info_s *slid; guiwin_get_grect(tv->window, GUIWIN_AREA_CONTENT, &work); + slid = guiwin_get_scroll_info(tv->window); struct redraw_context ctx = { .interactive = true, @@ -378,8 +383,8 @@ void atari_treeview_redraw( NSTREEVIEW tv) /* convert screen to treeview coords: */ // TODO: get slider values: - todo[0] = todo[0] - work.g_x;/*+ tv->window->xpos*tv->window->w_u;*/ - todo[1] = todo[1] - work.g_y;/*+ tv->window->ypos*tv->window->h_u;*/ + todo[0] = todo[0] - work.g_x + slid->x_pos*slid->x_unit_px; + todo[1] = todo[1] - work.g_y + slid->y_pos*slid->y_unit_px; if( todo[0] < 0 ){ todo[2] = todo[2] + todo[0]; todo[0] = 0; @@ -389,10 +394,10 @@ void atari_treeview_redraw( NSTREEVIEW tv) todo[1] = 0; } - // TODO: get slider values + // TODO: get slider values if (rc_intersect((GRECT *)&tv->rdw_area,(GRECT *)&todo)) { - tree_draw(tv->tree, 0/*-tv->window->xpos*16*/, - 0 /*-tv->window->ypos*16*/, + tree_draw(tv->tree, -(slid->x_pos*slid->x_unit_px), + -(slid->y_pos*slid->y_unit_px), todo[0], todo[1], todo[2], todo[3], &ctx ); } @@ -472,7 +477,6 @@ void atari_treeview_resized(struct tree *tree, int width, int height, void *pw) struct guiwin_scroll_info_s *slid = guiwin_get_scroll_info(tv->window); slid->x_pos_max = (width / slid->x_unit_px); slid->y_pos_max = (height / slid->y_unit_px); - printf("updating slider...\n"); guiwin_update_slider(tv->window, 3); } } -- cgit v1.2.3