/** * @brief Renames all the currently selected systems. */ static void uniedit_renameSys (void) { int i, j; char *name, *oldName, *newName; StarSystem *sys; for (i=0; i<uniedit_nsys; i++) { sys = uniedit_sys[i]; /* Get name. */ name = dialogue_input( "Rename Star System", 1, 32, "What do you want to rename \er%s\e0?", sys->name ); /* Keep current name. */ if (name == NULL) continue; /* Try again. */ if (uniedit_checkName( name )) { free(name); i--; continue; } /* Change the name. */ oldName = malloc((14+strlen(sys->name))); nsnprintf(oldName,14+strlen(sys->name),"dat/ssys/%s.xml", uniedit_nameFilter(sys->name) ); newName = malloc(14+strlen(name)); nsnprintf(newName,14+strlen(name),"dat/ssys/%s.xml", uniedit_nameFilter(name) ); nfile_rename(oldName,newName); free(oldName); free(newName); free(sys->name); sys->name = name; if (conf.devautosave) { dsys_saveSystem(sys); /* Re-save adjacent systems. */ for (j=0; j<sys->njumps; j++) dsys_saveSystem( sys->jumps[j].target ); } } }
/** * @brief Toggles the jump point for the selected systems. */ static void uniedit_toggleJump( StarSystem *sys ) { int i, j, rm; StarSystem *isys, *target; for (i=0; i<uniedit_nsys; i++) { isys = uniedit_sys[i]; rm = 0; for (j=0; j<isys->njumps; j++) { target = isys->jumps[j].target; /* Target already exists, remove. */ if (target == sys) { uniedit_jumpRm( isys, sys ); uniedit_jumpRm( sys, isys ); rm = 1; break; } } /* Target doesn't exist, add. */ if (!rm) { uniedit_jumpAdd( isys, sys ); uniedit_jumpAdd( sys, isys ); } } /* Reconstruct jumps just in case. */ systems_reconstructJumps(); /* Reconstruct universe presences. */ space_reconstructPresences(); if (conf.devautosave) { dsys_saveSystem( sys ); dsys_saveSystem( isys ); } /* Update sidebar text. */ uniedit_selectText(); }
/** * @brief Saves all the star systems. * * @return 0 on success. */ int dsys_saveAll (void) { int i; int nsys; StarSystem *sys; sys = system_getAll( &nsys ); /* Write systems. */ for (i=0; i<nsys; i++) dsys_saveSystem( &sys[i] ); return 0; }
/** * @brief Creates a new system. */ static void uniedit_newSys( double x, double y ) { char *name; StarSystem *sys; /* Get name. */ name = dialogue_inputRaw( "New Star System Creation", 1, 32, "What do you want to name the new system?" ); /* Abort. */ if (name == NULL) { dialogue_alert( "Star System creation aborted!" ); return; } /* Make sure there is no collision. */ if (uniedit_checkName( name )) { free(name); uniedit_newSys( x, y ); return; } /* Transform coordinates back to normal if zoomed */ x /= uniedit_zoom; y /= uniedit_zoom; /* Create the system. */ sys = system_new(); sys->name = name; sys->pos.x = x; sys->pos.y = y; sys->stars = STARS_DENSITY_DEFAULT; sys->radius = RADIUS_DEFAULT; /* Select new system. */ uniedit_deselect(); uniedit_selectAdd( sys ); if (conf.devautosave) dsys_saveSystem( sys ); }
/** * @brief Renames all the currently selected systems. */ static void uniedit_renameSys (void) { int i; char *name, *oldName, *newName; StarSystem *sys; for (i=0; i<uniedit_nsys; i++) { sys = uniedit_sys[i]; /* Get name. */ name = dialogue_input( "Rename Star System", 1, 32, "What do you want to rename \er%s\e0?", sys->name ); /* Keep current name. */ if (name == NULL) continue; /* Try again. */ if (uniedit_checkName( name )) { free(name); i--; continue; } /* Change the name. */ oldName = malloc((16+strlen(sys->name))*sizeof(char)); nsnprintf(oldName,15+strlen(sys->name),"dat/ssys/%s.xml",sys->name); newName = malloc((16+strlen(name))*sizeof(char)); nsnprintf(newName,15+strlen(name),"dat/ssys/%s.xml",name); nfile_rename(oldName,newName); free(oldName); free(newName); free(sys->name); sys->name = name; dsys_saveSystem(sys); } }
/** * @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; } }