int mouse_get_pos_unscaled( int *xpos, int *ypos ) { int flags = mouse_get_pos( xpos, ypos ); gr_unsize_screen_pos( (xpos) ? xpos : NULL, (ypos) ? ypos : NULL, NULL, NULL, GR_RESIZE_MENU ); return flags; }
void UI_WINDOW::draw() { UI_GADGET *tmp; gr_reset_clip(); font::set_font(f_id); if (foreground_bmap_id >= 0) { gr_set_bitmap(foreground_bmap_id); gr_bitmap(x, y, GR_RESIZE_MENU); } if (flags & WIN_FILLED) { ui_draw_box_out(x, y, x+w-1, y+h-1); } if (flags & WIN_BORDER) { ui_draw_frame(x-BORDER_WIDTH, y-BORDER_WIDTH, x+w+BORDER_WIDTH-1, y+h+BORDER_WIDTH-1); } if (first_gadget) { tmp = first_gadget; do { if (!tmp->hidden) tmp->draw(); tmp = tmp->next; } while (tmp != first_gadget); } if (first_gadget) { tmp = first_gadget; do { if (!tmp->hidden && (tmp->kind == UI_KIND_BUTTON) && ((UI_BUTTON *) tmp)->button_down()){ tmp->draw(); } tmp = tmp->next; } while (tmp != first_gadget); } // draw all xstrs draw_xstrs(); // draw tooltips draw_tooltip(); // convenient debug code for showing mouse coords if(Cmdline_mouse_coords){ int mx, my; mouse_get_pos(&mx, &my); // mprintf(("MOUSE (%d, %d)\n", mx, my)); gr_set_color_fast(&Color_normal); gr_printf_no_resize(mx, my - 12, "%d %d", mx, my); } }
static int menu_is_mouse_on( ITEM * item ) { int x, y, z; mouse_get_pos(&x, &y, &z); if ((x >= item->x) && (x < item->x + item->w ) && (y >= item->y) && (y <= item->y + item->h ) ) return 1; else return 0; }
int MenuX( int x, int y, int NumButtons, char * text[] ) { UI_DIALOG * dlg; menu *m; int button_width, button_height, width, height; int i; int w, h; int choice; MALLOC(m, menu, 1); m->num_buttons = NumButtons; m->button_g = (UI_GADGET_BUTTON **) d_malloc(sizeof(UI_GADGET_BUTTON *)*NumButtons); MALLOC(m->button, char *, NumButtons); m->choice = &choice; button_width = button_height = 0; for (i=0; i<NumButtons; i++ ) { m->button[i] = text[i]; ui_get_button_size( m->button[i], &width, &height ); if ( width > button_width ) button_width = width; if ( height > button_height ) button_height = height; } width = button_width + 2*(MENU_BORDER+3); height = (button_height*NumButtons) + (MENU_VERT_SPACING*(NumButtons-1)) ; height += (MENU_BORDER+3) * 2; w = grd_curscreen->sc_w; h = grd_curscreen->sc_h; { int mx, my, mz; mouse_get_pos(&mx, &my, &mz); if ( x == -1 ) x = mx - width/2; if ( y == -1 ) y = my; } if (x < 0 ) { x = 0; } if ( (x+width-1) >= w ) { x = w - width; } if (y < 0 ) { y = 0; } if ( (y+height-1) >= h ) { y = h - height; } dlg = ui_create_dialog( x, y, width, height, DF_FILLED | DF_SAVE_BG | DF_MODAL, (int (*)(UI_DIALOG *, d_event *, void *))menu_handler, m ); x = MENU_BORDER+3; y = MENU_BORDER+3; for (i=0; i<NumButtons; i++ ) { m->button_g[i] = ui_add_gadget_button( dlg, x, y, button_width, button_height, m->button[i], NULL ); y += button_height+MENU_VERT_SPACING; } choice = 0; while(choice==0) event_process(); ui_close_dialog(dlg); d_free(m->button); d_free(m->button_g); d_free(m); return choice; }
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; }
// Use: Left button (button 0) goes down, then up, then this is called // as opposed to straight after the button goes down, holding down // until an option is chosen. // This is like the 'modern' behaviour of popup menus and also happens // to be easier to implement because of the button code. // Recommended for use in conjunction with a button gadget, // i.e. when that button is pressed, call PopupMenu, // update the button's text then the value in question. int PopupMenu( int NumButtons, char * text[] ) { UI_DIALOG * dlg; popup *p; char * Button[10]; int button_width, button_height, width, height; short i, x, y; short w, h; int choice; MALLOC(p, popup, 1); p->num_buttons = NumButtons; p->choice = &choice; if ((NumButtons < 1) || (NumButtons>10)) { d_free(p); return -1; } button_width = button_height = 0; gr_set_current_canvas( &grd_curscreen->sc_canvas ); for (i=0; i<NumButtons; i++ ) { Button[i] = text[i]; ui_get_button_size( Button[i], &width, &height ); if ( width > button_width ) button_width = width; if ( height > button_height ) button_height = height; } width = button_width + 2*(MENU_BORDER+3); height = (button_height*NumButtons) + (MENU_VERT_SPACING*(NumButtons-1)) ; height += (MENU_BORDER+3) * 2; { int mx, my, mz; mouse_get_pos(&mx, &my, &mz); x = mx - width/2; y = my - (MENU_BORDER+3) - button_height/2; } w = grd_curscreen->sc_w; h = grd_curscreen->sc_h; if (x < 0 ) { x = 0; //Mouse.x = x + width / 2; } if ( (x+width-1) >= w ) { x = w - width; //Mouse.x = x + width / 2; } if (y < 0 ) { y = 0; //Mouse.y = y + (MENU_BORDER+3) + button_height/2; } if ( (y+height-1) >= h ) { y = h - height; //Mouse.y = y + (MENU_BORDER+3) + button_height/2; } dlg = ui_create_dialog( x, y, width, height, DF_DIALOG | DF_MODAL, (int (*)(UI_DIALOG *, d_event *, void *))popup_handler, p ); //mouse_set_pos(Mouse.x, Mouse.y); x = MENU_BORDER+3; y = MENU_BORDER+3; for (i=0; i<NumButtons; i++ ) { p->button_g[i] = ui_add_gadget_button( dlg, x, y, button_width, button_height, Button[i], NULL ); y += button_height+MENU_VERT_SPACING; } choice = 0; while(choice==0) event_process(); ui_close_dialog(dlg); d_free(p); return choice; }
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 MenuX( int x, int y, int NumButtons, const char *const text[] ) { UI_DIALOG * dlg; int button_width, button_height; int w, h; int choice; auto m = make_unique<menu>(); m->num_buttons = NumButtons; m->button_g = make_unique<std::unique_ptr<UI_GADGET_BUTTON>[]>(NumButtons); m->button = make_unique<const char *[]>(NumButtons); m->choice = &choice; button_width = button_height = 0; for (int i=0; i<NumButtons; i++ ) { m->button[i] = text[i]; int width, height; ui_get_button_size(*grd_curcanv->cv_font, m->button[i], width, height); if ( width > button_width ) button_width = width; if ( height > button_height ) button_height = height; } unsigned width, height; width = button_width + 2*(MENU_BORDER+3); height = (button_height*NumButtons) + (MENU_VERT_SPACING*(NumButtons-1)) ; height += (MENU_BORDER+3) * 2; w = grd_curscreen->get_screen_width(); h = grd_curscreen->get_screen_height(); { int mx, my, mz; mouse_get_pos(&mx, &my, &mz); if ( x == -1 ) x = mx - width/2; if ( y == -1 ) y = my; } if (x < 0 ) { x = 0; } if ( (x+width-1) >= w ) { x = w - width; } if (y < 0 ) { y = 0; } if ( (y+height-1) >= h ) { y = h - height; } dlg = ui_create_dialog(x, y, width, height, static_cast<dialog_flags>(DF_FILLED | DF_SAVE_BG | DF_MODAL), menu_handler, m.get()); x = MENU_BORDER+3; y = MENU_BORDER+3; for (int i=0; i<NumButtons; i++ ) { m->button_g[i] = ui_add_gadget_button( dlg, x, y, button_width, button_height, m->button[i], NULL ); y += button_height+MENU_VERT_SPACING; } choice = 0; while(choice==0) event_process(); ui_close_dialog(dlg); return choice; }