/** * @brief Opens up a system. */ static void uniedit_btnOpen( unsigned int wid_unused, char *unused ) { (void) wid_unused; (void) unused; if (uniedit_nsys != 1) return; sysedit_open( uniedit_sys[0] ); }
/** * @brief Opens up a system. */ static void uniedit_btnOpen( unsigned int wid_unused, char *unused ) { (void) wid_unused; (void) unused; if (uniedit_nsys != 1) return; sysedit_open( uniedit_sys[0] ); /* Update sidebar text. */ uniedit_selectText(); }
/** * @brief System editor custom widget mouse handling. */ static void uniedit_mouse( unsigned int wid, SDL_Event* event, double mx, double my, double w, double h, void *data ) { (void) wid; (void) data; int i; double x,y, t; StarSystem *sys; SDLMod mod; t = 15.*15.; /* threshold */ /* Handle modifiers. */ mod = SDL_GetModState(); switch (event->type) { case SDL_MOUSEBUTTONDOWN: /* Must be in bounds. */ if ((mx < 0.) || (mx > w) || (my < 0.) || (my > h)) return; /* Zooming */ if (event->button.button == SDL_BUTTON_WHEELUP) uniedit_buttonZoom( 0, "btnZoomIn" ); else if (event->button.button == SDL_BUTTON_WHEELDOWN) uniedit_buttonZoom( 0, "btnZoomOut" ); /* selecting star system */ else { mx -= w/2 - uniedit_xpos; my -= h/2 - uniedit_ypos; if (uniedit_mode == UNIEDIT_NEWSYS) { uniedit_newSys( mx, my ); uniedit_mode = UNIEDIT_DEFAULT; return; } for (i=0; i<systems_nstack; i++) { sys = system_getIndex( i ); /* get position */ x = sys->pos.x * uniedit_zoom; y = sys->pos.y * uniedit_zoom; if ((pow2(mx-x)+pow2(my-y)) < t) { /* Try to find in selected systems - begin drag move. */ for (i=0; i<uniedit_nsys; i++) { /* Must match. */ if (uniedit_sys[i] != sys) continue; /* Detect double click to open system. */ if ((SDL_GetTicks() - uniedit_dragTime < UNIEDIT_DRAG_THRESHOLD*2) && (uniedit_moved < UNIEDIT_MOVE_THRESHOLD)) { if (uniedit_nsys == 1) { sysedit_open( uniedit_sys[0] ); return; } } /* Handle normal click. */ if (uniedit_mode == UNIEDIT_DEFAULT) { uniedit_dragSys = 1; uniedit_tsys = sys; /* Check modifier. */ if (mod & (KMOD_LCTRL | KMOD_RCTRL)) uniedit_tadd = 0; else uniedit_tadd = -1; uniedit_dragTime = SDL_GetTicks(); uniedit_moved = 0; } return; } if (uniedit_mode == UNIEDIT_DEFAULT) { /* Add the system if not selected. */ if (mod & (KMOD_LCTRL | KMOD_RCTRL)) uniedit_selectAdd( sys ); else { uniedit_deselect(); uniedit_selectAdd( sys ); } uniedit_tsys = NULL; /* Start dragging anyway. */ uniedit_dragSys = 1; uniedit_dragTime = SDL_GetTicks(); uniedit_moved = 0; } else if (uniedit_mode == UNIEDIT_JUMP) { uniedit_toggleJump( sys ); uniedit_mode = UNIEDIT_DEFAULT; } return; } } /* Start dragging. */ if ((uniedit_mode == UNIEDIT_DEFAULT) && !(mod & (KMOD_LCTRL | KMOD_RCTRL))) { uniedit_drag = 1; uniedit_dragTime = SDL_GetTicks(); uniedit_moved = 0; uniedit_tsys = NULL; } return; } break; case SDL_MOUSEBUTTONUP: if (uniedit_drag) { if ((SDL_GetTicks() - uniedit_dragTime < UNIEDIT_DRAG_THRESHOLD) && (uniedit_moved < UNIEDIT_MOVE_THRESHOLD)) { if (uniedit_tsys == NULL) uniedit_deselect(); else uniedit_selectAdd( uniedit_tsys ); } uniedit_drag = 0; } if (uniedit_dragSys) { if ((SDL_GetTicks() - uniedit_dragTime < UNIEDIT_DRAG_THRESHOLD) && (uniedit_moved < UNIEDIT_MOVE_THRESHOLD) && (uniedit_tsys != NULL)) { if (uniedit_tadd == 0) uniedit_selectRm( uniedit_tsys ); else { uniedit_deselect(); uniedit_selectAdd( uniedit_tsys ); } } uniedit_dragSys = 0; for (i=0; i<uniedit_nsys; i++) { dsys_saveSystem(uniedit_sys[i]); } } break; case SDL_MOUSEMOTION: /* Update mouse positions. */ uniedit_mx = mx; uniedit_my = my; /* Handle dragging. */ if (uniedit_drag) { /* axis is inverted */ uniedit_xpos -= event->motion.xrel; uniedit_ypos += event->motion.yrel; /* Update mouse movement. */ uniedit_moved += ABS( event->motion.xrel ) + ABS( event->motion.yrel ); } else if (uniedit_dragSys && (uniedit_nsys > 0)) { if ((uniedit_moved > UNIEDIT_MOVE_THRESHOLD) || (SDL_GetTicks() - uniedit_dragTime > UNIEDIT_DRAG_THRESHOLD)) { for (i=0; i<uniedit_nsys; i++) { uniedit_sys[i]->pos.x += ((double)event->motion.xrel) / uniedit_zoom; uniedit_sys[i]->pos.y -= ((double)event->motion.yrel) / uniedit_zoom; } } /* Update mouse movement. */ uniedit_moved += ABS( event->motion.xrel ) + ABS( event->motion.yrel ); } break; } }