int ui_radio_do( UI_DIALOG *dlg, UI_GADGET_RADIO * radio, d_event *event ) { UI_GADGET * tmp; UI_GADGET_RADIO * tmpr; int rval = 0; radio->oldposition = radio->position; radio->pressed = 0; if (event->type == EVENT_MOUSE_BUTTON_DOWN || event->type == EVENT_MOUSE_BUTTON_UP) { int OnMe; OnMe = ui_mouse_on_gadget( (UI_GADGET *)radio ); if ( B1_JUST_PRESSED && OnMe) { radio->position = 1; rval = 1; } else if (B1_JUST_RELEASED) { if ((radio->position==1) && OnMe) radio->pressed = 1; radio->position = 0; } } if (event->type == EVENT_KEY_COMMAND) { int key; key = event_key_get(event); if ((dlg->keyboard_focus_gadget==(UI_GADGET *)radio) && ((key==KEY_SPACEBAR) || (key==KEY_ENTER)) ) { radio->position = 2; rval = 1; } } else if (event->type == EVENT_KEY_RELEASE) { int key; key = event_key_get(event); radio->position = 0; if ((dlg->keyboard_focus_gadget==(UI_GADGET *)radio) && ((key==KEY_SPACEBAR) || (key==KEY_ENTER)) ) radio->pressed = 1; } if ((radio->pressed == 1) && (radio->flag==0)) { tmp = (UI_GADGET *)radio->next; while (tmp != (UI_GADGET *)radio ) { if (tmp->kind==4) { tmpr = (UI_GADGET_RADIO *)tmp; if ((tmpr->group == radio->group ) && (tmpr->flag) ) { tmpr->flag = 0; tmpr->status = 1; tmpr->pressed = 0; } } tmp = tmp->next; } radio->flag = 1; ui_gadget_send_event(dlg, EVENT_UI_GADGET_PRESSED, (UI_GADGET *)radio); rval = 1; } if (event->type == EVENT_WINDOW_DRAW) ui_draw_radio( dlg, radio ); return rval; }
window_event_result ui_checkbox_do( UI_DIALOG *dlg, UI_GADGET_CHECKBOX * checkbox,const d_event &event ) { checkbox->oldposition = checkbox->position; checkbox->pressed = 0; if (event.type == EVENT_MOUSE_BUTTON_DOWN || event.type == EVENT_MOUSE_BUTTON_UP) { int OnMe; OnMe = ui_mouse_on_gadget( checkbox ); if (B1_JUST_PRESSED && OnMe) { checkbox->position = 1; return window_event_result::handled; } else if (B1_JUST_RELEASED) { if ((checkbox->position==1) && OnMe) checkbox->pressed = 1; checkbox->position = 0; } } if (event.type == EVENT_KEY_COMMAND) { int key; key = event_key_get(event); if ((dlg->keyboard_focus_gadget==checkbox) && ((key==KEY_SPACEBAR) || (key==KEY_ENTER)) ) { checkbox->position = 2; return window_event_result::handled; } } else if (event.type == EVENT_KEY_RELEASE) { int key; key = event_key_get(event); checkbox->position = 0; if ((dlg->keyboard_focus_gadget==checkbox) && ((key==KEY_SPACEBAR) || (key==KEY_ENTER)) ) checkbox->pressed = 1; } if (checkbox->pressed == 1) { checkbox->flag ^= 1; auto rval = ui_gadget_send_event(dlg, EVENT_UI_GADGET_PRESSED, checkbox); if (rval == window_event_result::ignored) rval = window_event_result::handled; return rval; } if (event.type == EVENT_WINDOW_DRAW) ui_draw_checkbox( dlg, checkbox ); return window_event_result::ignored; }
int ui_listbox_do( UI_DIALOG *dlg, UI_GADGET_LISTBOX * listbox, d_event *event ) { int mitem, oldfakepos, kf; int keypress = 0; int rval = 0; if (event->type == EVENT_WINDOW_DRAW) { ui_draw_listbox( dlg, listbox ); return 0; } if (event->type == EVENT_KEY_COMMAND) keypress = event_key_get(event); listbox->selected_item = -1; listbox->moved = 0; if (listbox->num_items < 1 ) { listbox->current_item = -1; listbox->first_item = 0; listbox->old_current_item = listbox->current_item; listbox->old_first_item = listbox->first_item; //ui_draw_listbox( dlg, listbox ); if (dlg->keyboard_focus_gadget == (UI_GADGET *)listbox) { dlg->keyboard_focus_gadget = ui_gadget_get_next((UI_GADGET *)listbox); } return rval; } listbox->old_current_item = listbox->current_item; listbox->old_first_item = listbox->first_item; if (GADGET_PRESSED(listbox->scrollbar)) { listbox->moved = 1; listbox->first_item = listbox->scrollbar->position; if (listbox->current_item<listbox->first_item) listbox->current_item = listbox->first_item; if (listbox->current_item>(listbox->first_item+listbox->num_items_displayed-1)) listbox->current_item = listbox->first_item + listbox->num_items_displayed-1; } if (B1_JUST_RELEASED) listbox->dragging = 0; if (B1_JUST_PRESSED && ui_mouse_on_gadget( (UI_GADGET *)listbox )) { listbox->dragging = 1; rval = 1; } if ( dlg->keyboard_focus_gadget==(UI_GADGET *)listbox ) { if (keypress==KEY_ENTER) { listbox->selected_item = listbox->current_item; rval = 1; } kf = 0; switch(keypress) { case (KEY_UP): listbox->current_item--; kf = 1; break; case (KEY_DOWN): listbox->current_item++; kf = 1; break; case (KEY_HOME): listbox->current_item=0; kf = 1; break; case (KEY_END): listbox->current_item=listbox->num_items-1; kf = 1; break; case (KEY_PAGEUP): listbox->current_item -= listbox->num_items_displayed; kf = 1; break; case (KEY_PAGEDOWN): listbox->current_item += listbox->num_items_displayed; kf = 1; break; } if (kf==1) { listbox->moved = 1; rval = 1; if (listbox->current_item<0) listbox->current_item=0; if (listbox->current_item>=listbox->num_items) listbox->current_item = listbox->num_items-1; if (listbox->current_item<listbox->first_item) listbox->first_item = listbox->current_item; if (listbox->current_item>=(listbox->first_item+listbox->num_items_displayed)) listbox->first_item = listbox->current_item-listbox->num_items_displayed+1; if (listbox->num_items <= listbox->num_items_displayed ) listbox->first_item = 0; else { oldfakepos = listbox->scrollbar->position; listbox->scrollbar->position = listbox->first_item; listbox->scrollbar->fake_position = listbox->scrollbar->position-listbox->scrollbar->start; listbox->scrollbar->fake_position *= listbox->scrollbar->height-listbox->scrollbar->fake_size; listbox->scrollbar->fake_position /= (listbox->scrollbar->stop-listbox->scrollbar->start); if (listbox->scrollbar->fake_position<0) { listbox->scrollbar->fake_position = 0; } if (listbox->scrollbar->fake_position > (listbox->scrollbar->height-listbox->scrollbar->fake_size)) { listbox->scrollbar->fake_position = (listbox->scrollbar->height-listbox->scrollbar->fake_size); } if (oldfakepos != listbox->scrollbar->position ) listbox->scrollbar->status = 1; } } } if (selected_gadget==(UI_GADGET *)listbox) { if (listbox->dragging) { int x, y, z; mouse_get_pos(&x, &y, &z); if (y < listbox->y1) mitem = -1; else mitem = (y - listbox->y1)/listbox->textheight; if ((mitem < 0) && (timer_query() > listbox->last_scrolled + 1)) { listbox->current_item--; listbox->last_scrolled = timer_query(); listbox->moved = 1; } if ((mitem >= listbox->num_items_displayed) && (timer_query() > listbox->last_scrolled + 1)) { listbox->current_item++; listbox->last_scrolled = timer_query(); listbox->moved = 1; } if ((mitem>=0) && (mitem<listbox->num_items_displayed)) { listbox->current_item = mitem+listbox->first_item; listbox->moved=1; } if (listbox->current_item <0 ) listbox->current_item = 0; if (listbox->current_item >= listbox->num_items ) listbox->current_item = listbox->num_items-1; if (listbox->current_item<listbox->first_item) listbox->first_item = listbox->current_item; if (listbox->current_item>=(listbox->first_item+listbox->num_items_displayed)) listbox->first_item = listbox->current_item-listbox->num_items_displayed+1; if (listbox->num_items <= listbox->num_items_displayed ) listbox->first_item = 0; else { oldfakepos = listbox->scrollbar->position; listbox->scrollbar->position = listbox->first_item; listbox->scrollbar->fake_position = listbox->scrollbar->position-listbox->scrollbar->start; listbox->scrollbar->fake_position *= listbox->scrollbar->height-listbox->scrollbar->fake_size; listbox->scrollbar->fake_position /= (listbox->scrollbar->stop-listbox->scrollbar->start); if (listbox->scrollbar->fake_position<0) { listbox->scrollbar->fake_position = 0; } if (listbox->scrollbar->fake_position > (listbox->scrollbar->height-listbox->scrollbar->fake_size)) { listbox->scrollbar->fake_position = (listbox->scrollbar->height-listbox->scrollbar->fake_size); } if (oldfakepos != listbox->scrollbar->position ) listbox->scrollbar->status = 1; } } if (B1_DOUBLE_CLICKED ) { listbox->selected_item = listbox->current_item; rval = 1; } } if (listbox->moved || (listbox->selected_item > 0)) { ui_gadget_send_event(dlg, (listbox->selected_item > 0) ? EVENT_UI_LISTBOX_SELECTED : EVENT_UI_LISTBOX_MOVED, (UI_GADGET *)listbox); rval = 1; } return rval; }
window_event_result ui_userbox_do( UI_DIALOG *dlg, UI_GADGET_USERBOX * userbox,const d_event &event ) { int OnMe, olddrag; int x, y, z; int keypress = 0; window_event_result rval = window_event_result::ignored; if (event.type == EVENT_WINDOW_DRAW) ui_draw_userbox( dlg, userbox ); if (event.type == EVENT_KEY_COMMAND) keypress = event_key_get(event); mouse_get_pos(&x, &y, &z); OnMe = ui_mouse_on_gadget( userbox ); olddrag = userbox->b1_held_down; userbox->mouse_onme = OnMe; userbox->mouse_x = x - userbox->x1; userbox->mouse_y = y - userbox->y1; userbox->b1_dragging = 0; userbox->b1_clicked = 0; if (OnMe) { if ( B1_JUST_PRESSED ) { userbox->b1_held_down = 1; userbox->b1_drag_x1 = x - userbox->x1; userbox->b1_drag_y1 = y - userbox->y1; rval = window_event_result::handled; } else if (B1_JUST_RELEASED) { if (userbox->b1_held_down) userbox->b1_clicked = 1; userbox->b1_held_down = 0; rval = window_event_result::handled; } if ( (event.type == EVENT_MOUSE_MOVED) && userbox->b1_held_down ) { userbox->b1_dragging = 1; userbox->b1_drag_x2 = x - userbox->x1; userbox->b1_drag_y2 = y - userbox->y1; } if ( B1_DOUBLE_CLICKED ) { userbox->b1_double_clicked = 1; rval = window_event_result::handled; } else userbox->b1_double_clicked = 0; } if (B1_JUST_RELEASED) userbox->b1_held_down = 0; userbox->b1_done_dragging = 0; if (olddrag==1 && userbox->b1_held_down==0 ) { if ((userbox->b1_drag_x1 != userbox->b1_drag_x2) || (userbox->b1_drag_y1 != userbox->b1_drag_y2) ) userbox->b1_done_dragging = 1; } if (dlg->keyboard_focus_gadget==userbox) { userbox->keypress = keypress; rval = window_event_result::handled; } if (userbox->b1_clicked || userbox->b1_dragging) { rval = ui_gadget_send_event(dlg, userbox->b1_clicked ? EVENT_UI_GADGET_PRESSED : EVENT_UI_USERBOX_DRAGGED, userbox); if (rval == window_event_result::ignored) rval = window_event_result::handled; } return rval; }
int ui_inputbox_do( UI_DIALOG *dlg, UI_GADGET_INPUTBOX * inputbox, d_event *event ) { unsigned char ascii; int keypress = 0; int rval = 0; if (event->type == EVENT_KEY_COMMAND) keypress = event_key_get(event); inputbox->oldposition = inputbox->position; inputbox->pressed=0; if (dlg->keyboard_focus_gadget==(UI_GADGET *)inputbox) { switch( keypress ) { case 0: break; case (KEY_LEFT): case (KEY_BACKSP): if (inputbox->position > 0) inputbox->position--; inputbox->text[inputbox->position] = 0; inputbox->status = 1; if (inputbox->first_time) inputbox->first_time = 0; rval = 1; break; case (KEY_ENTER): inputbox->pressed=1; inputbox->status = 1; if (inputbox->first_time) inputbox->first_time = 0; rval = 1; break; default: ascii = key_ascii(); if ((ascii < 255 ) && (inputbox->position < inputbox->length-2)) { if (inputbox->first_time) { inputbox->first_time = 0; inputbox->position = 0; } inputbox->text[inputbox->position++] = ascii; inputbox->text[inputbox->position] = 0; rval = 1; } inputbox->status = 1; break; } } else { inputbox->first_time = 1; } if (inputbox->pressed) { ui_gadget_send_event(dlg, EVENT_UI_GADGET_PRESSED, (UI_GADGET *)inputbox); rval = 1; } if (event->type == EVENT_WINDOW_DRAW) ui_draw_inputbox( dlg, inputbox ); return rval; }
window_event_result ui_icon_do( UI_DIALOG *dlg, UI_GADGET_ICON * icon,const d_event &event ) { icon->oldposition = icon->position; icon->pressed = 0; window_event_result rval = window_event_result::ignored; if (event.type == EVENT_MOUSE_BUTTON_DOWN || event.type == EVENT_MOUSE_BUTTON_UP) { int OnMe; OnMe = ui_mouse_on_gadget( icon ); if (B1_JUST_PRESSED && OnMe) { icon->position = 1; rval = window_event_result::handled; } else if (B1_JUST_RELEASED) { if ((icon->position == 1) && OnMe) icon->pressed = 1; icon->position = 0; } } if (event.type == EVENT_KEY_COMMAND) { int key; key = event_key_get(event); if (key == icon->trap_key) { icon->position = 1; rval = window_event_result::handled; } } else if (event.type == EVENT_KEY_RELEASE) { int key; key = event_key_get(event); icon->position = 0; if (key == icon->trap_key) icon->pressed = 1; } if (icon->pressed == 1) { icon->status = 1; icon->flag = static_cast<int8_t>(icon->user_function()); rval = ui_gadget_send_event(dlg, EVENT_UI_GADGET_PRESSED, icon); if (rval == window_event_result::ignored) rval = window_event_result::handled; } if (event.type == EVENT_WINDOW_DRAW) ui_draw_icon( icon ); return rval; }