fixed bug with marking level as changed for certain non-level-changing gadgets
[rocksndiamonds.git] / src / editor.c
index 48e6feb0b41bed5abdcba92af917cd2d3e2173b1..54bf0c0095212ea7e426e90dce53b73d09cca067 100644 (file)
 
 #define ED_NUM_DRAWING_AREAS                   33
 
+#define ED_DRAWING_ID_EDITOR_FIRST     ED_DRAWING_ID_RANDOM_BACKGROUND
+#define ED_DRAWING_ID_EDITOR_LAST      ED_DRAWING_ID_RANDOM_BACKGROUND
+
 
 /*
   -----------------------------------------------------------------------------
@@ -3505,6 +3508,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 +7284,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 +7317,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,6 +7529,27 @@ static void CopyElementPropertiesToEditor(int element)
     CopyClassicElementPropertiesToEditor(element);
 }
 
+static boolean AskToCopyAndModifyLevelTemplate()
+{
+  if (Request("Copy and modify level template?", REQ_ASK))
+  {
+    level.use_custom_template = FALSE;
+
+    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;
+  }
+}
+
 static void CopyCustomElementPropertiesToGame(int element)
 {
   int i;
@@ -7526,20 +7560,7 @@ static void CopyCustomElementPropertiesToGame(int element)
   level.changed = TRUE;
 
   if (level.use_custom_template)
-  {
-    if (Request("Copy and modify level template?", REQ_ASK))
-    {
-      level.use_custom_template = FALSE;
-      ModifyGadget(level_editor_gadget[GADGET_ID_CUSTOM_USE_TEMPLATE],
-                  GDI_CHECKED, FALSE, GDI_END);
-    }
-    else
-    {
-      LoadLevelTemplate(-1);   /* this resets all element modifications ... */
-
-      DrawEditModeWindow();    /* ... and copies them to 'custom_element' */
-    }
-  }
+    AskToCopyAndModifyLevelTemplate();
 
   element_info[element] = custom_element;
   *element_info[element].change = custom_element_change;
@@ -7650,12 +7671,15 @@ static void CopyCustomElementPropertiesToGame(int element)
 
 static void CopyGroupElementPropertiesToGame(int element)
 {
-  element_info[element] = custom_element;
-  *element_info[element].group = group_element_info;
-
   /* mark that this group element has been modified */
-  element_info[element].modified_settings = TRUE;
+  custom_element.modified_settings = TRUE;
   level.changed = TRUE;
+
+  if (level.use_custom_template)
+    AskToCopyAndModifyLevelTemplate();
+
+  element_info[element] = custom_element;
+  *element_info[element].group = group_element_info;
 }
 
 static void CopyClassicElementPropertiesToGame(int element)
@@ -9309,11 +9333,9 @@ static void DrawPaletteWindow()
 
 static void UpdateCustomElementGraphicGadgets()
 {
-  struct ElementInfo *ei = &element_info[properties_element];
   int i;
 
-  ei->gfx_element = (ei->use_gfx_element ? ei->gfx_element_initial :
-                    properties_element);
+  InitElementPropertiesGfxElement();
 
   ModifyEditorElementList();
   RedrawDrawingElements();
@@ -10945,6 +10967,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
 {
   static boolean started_inside_drawing_area = FALSE;
   int id = gi->custom_id;
+  int type_id = gi->custom_type_id;
   boolean button_press_event;
   boolean button_release_event;
   boolean inside_drawing_area = !gi->event.off_borders;
@@ -11054,9 +11077,8 @@ 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;
 
        if (item_xsize == MINI_TILEX && item_ysize == MINI_TILEY)
@@ -11183,17 +11205,22 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
        PickDrawingElement(button, Feld[lx][ly]);
       else
       {
-       int type_id = gi->custom_type_id;
        int pos = sx * drawingarea_info[type_id].area_ysize + sy;
 
        PickDrawingElement(button, drawingarea_info[type_id].value[pos]);
       }
 
-      break;
-
     default:
       break;
   }
+
+  /* do not mark level as modified for certain non-level-changing gadgets */
+  if ((type_id >= ED_DRAWING_ID_EDITOR_FIRST &&
+       type_id <= ED_DRAWING_ID_EDITOR_LAST) ||
+      actual_drawing_function == GADGET_ID_PICK_ELEMENT)
+    return;
+
+  level.changed = TRUE;
 }
 
 static void HandleCounterButtons(struct GadgetInfo *gi)
@@ -11290,6 +11317,11 @@ static void HandleCounterButtons(struct GadgetInfo *gi)
        counter_id <= ED_COUNTER_ID_CHANGE_LAST))
     CopyElementPropertiesToGame(properties_element);
 
+  /* do not mark level as modified for certain non-level-changing gadgets */
+  if (counter_id >= ED_COUNTER_ID_EDITOR_FIRST &&
+      counter_id <= ED_COUNTER_ID_EDITOR_LAST)
+    return;
+
   level.changed = TRUE;
 }
 
@@ -11399,6 +11431,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 */
@@ -11416,6 +11452,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];
@@ -11455,10 +11495,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];
 
@@ -11471,8 +11517,15 @@ static void HandleGraphicbuttonGadgets(struct GadgetInfo *gi)
 
 static void HandleRadiobuttons(struct GadgetInfo *gi)
 {
-  *radiobutton_info[gi->custom_type_id].value =
-    radiobutton_info[gi->custom_type_id].checked_value;
+  int type_id = gi->custom_type_id;
+
+  *radiobutton_info[type_id].value =
+    radiobutton_info[type_id].checked_value;
+
+  /* do not mark level as modified for certain non-level-changing gadgets */
+  if (type_id >= ED_RADIOBUTTON_ID_EDITOR_FIRST &&
+      type_id <= ED_RADIOBUTTON_ID_EDITOR_LAST)
+    return;
 
   level.changed = TRUE;
 }
@@ -11501,6 +11554,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()))
     {
@@ -11514,6 +11576,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;
@@ -11528,6 +11591,12 @@ static void HandleCheckbuttons(struct GadgetInfo *gi)
     DrawEditModeWindow();
   }
 
+  /* do not mark level as modified for certain non-level-changing gadgets */
+  if ((type_id >= ED_CHECKBUTTON_ID_EDITOR_FIRST &&
+       type_id <= ED_CHECKBUTTON_ID_EDITOR_LAST) ||
+      type_id == ED_CHECKBUTTON_ID_STICK_ELEMENT)
+    return;
+
   level.changed = TRUE;
 }