X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Feditor.c;h=6f750d3b1df0f3ba0199ecea1b2b89209bd2e639;hp=081e134d692628c9aa3ab8a4f801c3b23ad72acd;hb=81db33c45aa3bb6cf5c2650855795cf524e2c943;hpb=c6d3f1920cf2aeffc05b1d00466ee66b4ac1adbc diff --git a/src/editor.c b/src/editor.c index 081e134d..6f750d3b 100644 --- a/src/editor.c +++ b/src/editor.c @@ -3505,6 +3505,7 @@ static void HandleCheckbuttons(struct GadgetInfo *); static void HandleControlButtons(struct GadgetInfo *); static void HandleDrawingAreaInfo(struct GadgetInfo *); static void PrintEditorGadgetInfoText(struct GadgetInfo *); +static boolean AskToCopyAndModifyLevelTemplate(); static int num_editor_gadgets = 0; /* dynamically determined */ @@ -7280,6 +7281,8 @@ static void replace_custom_element_in_playfield(int element_from, static boolean CopyCustomElement(int element_old, int element_new, int copy_mode) { + int copy_mode_orig = copy_mode; + if (copy_mode == GADGET_ID_CUSTOM_COPY) { element_new = (IS_CUSTOM_ELEMENT(element_old) ? @@ -7311,6 +7314,13 @@ static boolean CopyCustomElement(int element_old, int element_new, level.changed = TRUE; } + /* when modifying custom/group element, ask for copying level template */ + if (copy_mode_orig != GADGET_ID_CUSTOM_COPY && level.use_custom_template) + { + if (!AskToCopyAndModifyLevelTemplate()) + return FALSE; + } + if (copy_mode == GADGET_ID_CUSTOM_COPY_FROM) { copy_custom_element_settings(element_new, element_old); @@ -7516,7 +7526,7 @@ static void CopyElementPropertiesToEditor(int element) CopyClassicElementPropertiesToEditor(element); } -static void AskToCopyAndModifyLevelTemplate() +static boolean AskToCopyAndModifyLevelTemplate() { if (Request("Copy and modify level template?", REQ_ASK)) { @@ -7524,12 +7534,16 @@ static void AskToCopyAndModifyLevelTemplate() ModifyGadget(level_editor_gadget[GADGET_ID_CUSTOM_USE_TEMPLATE], GDI_CHECKED, FALSE, GDI_END); + + return TRUE; } else { LoadLevelTemplate(-1); /* this resets all element modifications ... */ DrawEditModeWindow(); /* ... and copies them to 'custom_element' */ + + return FALSE; } } @@ -11059,7 +11073,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) SetElementButton(lx, ly, new_element, button); } } - else + else if (!button_release_event) { int type_id = gi->custom_type_id; int pos = sx * drawingarea_info[type_id].area_ysize + sy; @@ -11194,11 +11208,14 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) PickDrawingElement(button, drawingarea_info[type_id].value[pos]); } - break; + /* do not mark level as changed when picking element from drawing area */ + return; default: break; } + + level.changed = TRUE; } static void HandleCounterButtons(struct GadgetInfo *gi) @@ -11404,6 +11421,10 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) { struct ElementInfo *ei = &element_info[properties_element]; + /* when modifying custom element, ask for copying level template */ + if (level.use_custom_template && !AskToCopyAndModifyLevelTemplate()) + return; + setElementChangePages(ei, ei->num_change_pages + 1); /* set new change page to be new current change page */ @@ -11421,6 +11442,10 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) { struct ElementInfo *ei = &element_info[properties_element]; + /* when modifying custom element, ask for copying level template */ + if (level.use_custom_template && !AskToCopyAndModifyLevelTemplate()) + return; + /* copy all change pages after change page to be deleted */ for (i = ei->current_change_page; i < ei->num_change_pages - 1; i++) ei->change_page[i] = ei->change_page[i + 1]; @@ -11460,10 +11485,16 @@ static void HandleGraphicbuttonGadgets(struct GadgetInfo *gi) int current_change_page = ei->current_change_page; if (type_id == ED_GRAPHICBUTTON_ID_COPY_CHANGE_PAGE) + { element_info[EL_INTERNAL_CLIPBOARD_CHANGE].change_page[0] = ei->change_page[current_change_page]; + } else if (type_id == ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE) { + /* when modifying custom element, ask for copying level template */ + if (level.use_custom_template && !AskToCopyAndModifyLevelTemplate()) + return; + ei->change_page[current_change_page] = element_info[EL_INTERNAL_CLIPBOARD_CHANGE].change_page[0]; @@ -11506,6 +11537,15 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) } else if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE) { + boolean template_related_changes_found = FALSE; + int i; + + /* check if any custom or group elements have been changed */ + for (i = 0; i < NUM_FILE_ELEMENTS; i++) + if ((IS_CUSTOM_ELEMENT(i) || IS_GROUP_ELEMENT(i)) && + element_info[i].modified_settings) + template_related_changes_found = TRUE; + if (level.use_custom_template && !fileExists(getGlobalLevelTemplateFilename())) { @@ -11519,6 +11559,7 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) } if (level.use_custom_template && + template_related_changes_found && !Request("Discard changes and use level template?", REQ_ASK)) { level.use_custom_template = FALSE;