X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Feditor.c;h=507f9c3b71cfc71ed8a446898a57c26e3a42cfc7;hp=479fec7af807ebc7dbd3bbb34c3f5a078c6a0197;hb=2adec83bef3e75ccb9af305cb44693c467c4d665;hpb=bb43be9a97c4c6b8fd4ac94c7438f1b0ca1d33eb diff --git a/src/editor.c b/src/editor.c index 479fec7a..507f9c3b 100644 --- a/src/editor.c +++ b/src/editor.c @@ -32,26 +32,35 @@ */ /* values for the control window */ -#define ED_CTRL1_BUTTONS_HORIZ 4 +#define ED_CTRL1_BUTTONS_HORIZ 4 /* toolbox */ #define ED_CTRL1_BUTTONS_VERT 4 -#define ED_CTRL2_BUTTONS_HORIZ 3 +#define ED_CTRL2_BUTTONS_HORIZ 3 /* level */ #define ED_CTRL2_BUTTONS_VERT 2 -#define ED_CTRL3_BUTTONS_HORIZ 3 +#define ED_CTRL3_BUTTONS_HORIZ 3 /* CE and GE */ #define ED_CTRL3_BUTTONS_VERT 1 -#define ED_CTRL4_BUTTONS_HORIZ 2 +#define ED_CTRL4_BUTTONS_HORIZ 2 /* CE and GE */ #define ED_CTRL4_BUTTONS_VERT 1 -#define ED_CTRL5_BUTTONS_HORIZ 1 +#define ED_CTRL5_BUTTONS_HORIZ 1 /* properties */ #define ED_CTRL5_BUTTONS_VERT 1 +#define ED_CTRL6_BUTTONS_HORIZ 3 /* properties */ +#define ED_CTRL6_BUTTONS_VERT 1 +#define ED_CTRL7_BUTTONS_HORIZ 1 /* palette */ +#define ED_CTRL7_BUTTONS_VERT 1 #define ED_NUM_CTRL1_BUTTONS (ED_CTRL1_BUTTONS_HORIZ * ED_CTRL1_BUTTONS_VERT) #define ED_NUM_CTRL2_BUTTONS (ED_CTRL2_BUTTONS_HORIZ * ED_CTRL2_BUTTONS_VERT) #define ED_NUM_CTRL3_BUTTONS (ED_CTRL3_BUTTONS_HORIZ * ED_CTRL3_BUTTONS_VERT) #define ED_NUM_CTRL4_BUTTONS (ED_CTRL4_BUTTONS_HORIZ * ED_CTRL4_BUTTONS_VERT) #define ED_NUM_CTRL5_BUTTONS (ED_CTRL5_BUTTONS_HORIZ * ED_CTRL5_BUTTONS_VERT) +#define ED_NUM_CTRL6_BUTTONS (ED_CTRL6_BUTTONS_HORIZ * ED_CTRL6_BUTTONS_VERT) +#define ED_NUM_CTRL7_BUTTONS (ED_CTRL7_BUTTONS_HORIZ * ED_CTRL7_BUTTONS_VERT) #define ED_NUM_CTRL1_2_BUTTONS (ED_NUM_CTRL1_BUTTONS + ED_NUM_CTRL2_BUTTONS) #define ED_NUM_CTRL1_3_BUTTONS (ED_NUM_CTRL1_2_BUTTONS + ED_NUM_CTRL3_BUTTONS) #define ED_NUM_CTRL1_4_BUTTONS (ED_NUM_CTRL1_3_BUTTONS + ED_NUM_CTRL4_BUTTONS) -#define ED_NUM_CTRL_BUTTONS (ED_NUM_CTRL1_4_BUTTONS + ED_NUM_CTRL5_BUTTONS) +#define ED_NUM_CTRL1_5_BUTTONS (ED_NUM_CTRL1_4_BUTTONS + ED_NUM_CTRL5_BUTTONS) +#define ED_NUM_CTRL1_6_BUTTONS (ED_NUM_CTRL1_5_BUTTONS + ED_NUM_CTRL6_BUTTONS) +#define ED_NUM_CTRL1_7_BUTTONS (ED_NUM_CTRL1_6_BUTTONS + ED_NUM_CTRL7_BUTTONS) +#define ED_NUM_CTRL_BUTTONS ED_NUM_CTRL1_7_BUTTONS /* values for the element list */ #define ED_ELEMENTLIST_XPOS (editor.palette.x) @@ -248,8 +257,8 @@ ED_AREA_YOFFSET_2(3)) /* values for scrolling gadgets for drawing area */ -#define ED_SCROLLBUTTON_XSIZE 16 -#define ED_SCROLLBUTTON_YSIZE 16 +#define ED_SCROLLBUTTON_XSIZE (graphic_info[IMG_EDITOR_PLAYFIELD_SCROLLBAR].width) +#define ED_SCROLLBUTTON_YSIZE (graphic_info[IMG_EDITOR_PLAYFIELD_SCROLLBAR].height) #define ED_SCROLL_UP_XPOS (SXSIZE - ED_SCROLLBUTTON_XSIZE) #define ED_SCROLL_UP_YPOS (0) @@ -341,9 +350,13 @@ #define GADGET_ID_CUSTOM_PASTE (GADGET_ID_TOOLBOX_FIRST + 26) #define GADGET_ID_PROPERTIES (GADGET_ID_TOOLBOX_FIRST + 27) +#define GADGET_ID_ELEMENT_LEFT (GADGET_ID_TOOLBOX_FIRST + 28) +#define GADGET_ID_ELEMENT_MIDDLE (GADGET_ID_TOOLBOX_FIRST + 29) +#define GADGET_ID_ELEMENT_RIGHT (GADGET_ID_TOOLBOX_FIRST + 30) +#define GADGET_ID_PALETTE (GADGET_ID_TOOLBOX_FIRST + 31) /* counter gadget identifiers */ -#define GADGET_ID_COUNTER_FIRST (GADGET_ID_TOOLBOX_FIRST + 28) +#define GADGET_ID_COUNTER_FIRST (GADGET_ID_TOOLBOX_FIRST + 32) #define GADGET_ID_SELECT_LEVEL_DOWN (GADGET_ID_COUNTER_FIRST + 0) #define GADGET_ID_SELECT_LEVEL_TEXT (GADGET_ID_COUNTER_FIRST + 1) @@ -952,6 +965,7 @@ #define ED_MODE_DRAWING 0 #define ED_MODE_INFO 1 #define ED_MODE_PROPERTIES 2 +#define ED_MODE_PALETTE 3 /* sub-screens in the global settings section */ #define ED_MODE_LEVELINFO_LEVEL ED_TEXTBUTTON_ID_LEVELINFO_LEVEL @@ -993,7 +1007,7 @@ static struct { int graphic; int gadget_id; - struct XY *pos; + struct XYTileSize *pos; int gadget_type; char *infotext; char shortcut; @@ -1152,6 +1166,26 @@ static struct IMG_GFX_EDITOR_BUTTON_PROPERTIES, GADGET_ID_PROPERTIES, &editor.button.properties, GD_TYPE_NORMAL_BUTTON, "properties of drawing element", 'p' + }, + { + IMG_GFX_EDITOR_BUTTON_ELEMENT_LEFT, GADGET_ID_ELEMENT_LEFT, + &editor.button.element_left, GD_TYPE_NORMAL_BUTTON, + "properties of drawing element 1", '1' + }, + { + IMG_GFX_EDITOR_BUTTON_ELEMENT_MIDDLE, GADGET_ID_ELEMENT_MIDDLE, + &editor.button.element_middle, GD_TYPE_NORMAL_BUTTON, + "properties of drawing element 2", '2' + }, + { + IMG_GFX_EDITOR_BUTTON_ELEMENT_RIGHT, GADGET_ID_ELEMENT_RIGHT, + &editor.button.element_right, GD_TYPE_NORMAL_BUTTON, + "properties of drawing element 3", '3' + }, + { + IMG_GFX_EDITOR_BUTTON_PALETTE, GADGET_ID_PALETTE, + &editor.button.palette, GD_TYPE_NORMAL_BUTTON, + "show list of elements", 'e' } }; @@ -3434,6 +3468,15 @@ static int new_element3 = EL_SAND; (button) == 2 ? new_element2 : \ (button) == 3 ? new_element3 : EL_EMPTY) +#define BUTTON_TILE_SIZE(x) ((x) >= TILESIZE ? TILESIZE : MINI_TILESIZE) + +static int use_permanent_palette = TRUE; + +#define PX (use_permanent_palette ? DX : SX) +#define PY (use_permanent_palette ? DY : SY) +#define PXSIZE (use_permanent_palette ? DXSIZE : SXSIZE) +#define PYSIZE (use_permanent_palette ? DYSIZE : SYSIZE) + /* forward declaration for internal use */ static void ModifyEditorCounterValue(int, int); static void ModifyEditorCounterLimits(int, int, int); @@ -3446,6 +3489,7 @@ static void RedrawDrawingElements(); static void DrawDrawingWindow(); static void DrawLevelInfoWindow(); static void DrawPropertiesWindow(); +static void DrawPaletteWindow(); static void UpdateCustomElementGraphicGadgets(); static boolean checkPropertiesConfig(int); static void CopyLevelToUndoBuffer(int); @@ -5403,13 +5447,10 @@ static void ScrollEditorLevel(int from_x, int from_y, int scroll) BackToFront(); } -void getElementListGraphicSource(int element, Bitmap **bitmap, int *x, int *y) +void getEditorGraphicSource(int element, int tile_size, Bitmap **bitmap, + int *x, int *y) { - int graphic = el2edimg(element); - int tile_size = (editor.palette.tile_size >= TILESIZE ? TILESIZE : - MINI_TILESIZE); - - getSizedGraphicSource(graphic, 0, tile_size, bitmap, x, y); + getSizedGraphicSource(el2edimg(element), 0, tile_size, bitmap, x, y); } static void CreateControlButtons() @@ -5423,8 +5464,12 @@ static void CreateControlButtons() int id = controlbutton_info[i].gadget_id; int type = controlbutton_info[i].gadget_type; int graphic = controlbutton_info[i].graphic; - struct XY *pos = controlbutton_info[i].pos; + struct XYTileSize *pos = controlbutton_info[i].pos; struct GraphicInfo *gd = &graphic_info[graphic]; + Bitmap *deco_bitmap = NULL; + int deco_x = 0, deco_y = 0, deco_xpos = 0, deco_ypos = 0; + int tile_size = 0, deco_shift = 0; + boolean deco_masked = FALSE; int gd_x1 = gd->src_x; int gd_y1 = gd->src_y; int gd_x2 = gd->src_x + gd->pressed_xoffset; @@ -5458,11 +5503,40 @@ static void CreateControlButtons() event_mask = GD_EVENT_RELEASED; } - if (id == GADGET_ID_PROPERTIES) + if (id == GADGET_ID_PROPERTIES || + id == GADGET_ID_PALETTE) { x += DX; y += DY; } + else if (id == GADGET_ID_ELEMENT_LEFT || + id == GADGET_ID_ELEMENT_MIDDLE || + id == GADGET_ID_ELEMENT_RIGHT) + { + x += DX; + y += DY; + + int element = (id == GADGET_ID_ELEMENT_LEFT ? new_element1 : + id == GADGET_ID_ELEMENT_MIDDLE ? new_element2 : + id == GADGET_ID_ELEMENT_RIGHT ? new_element3 : EL_EMPTY); + + tile_size = BUTTON_TILE_SIZE(id == GADGET_ID_ELEMENT_LEFT ? + editor.button.element_left.tile_size : + id == GADGET_ID_ELEMENT_MIDDLE ? + editor.button.element_middle.tile_size : + id == GADGET_ID_ELEMENT_RIGHT ? + editor.button.element_right.tile_size : 0); + + // make sure that decoration does not overlap gadget border + tile_size = MIN(tile_size, MIN(gd->width, gd->height)); + + getEditorGraphicSource(element, tile_size, &deco_bitmap, &deco_x,&deco_y); + + deco_xpos = (gd->width - tile_size) / 2; + deco_ypos = (gd->height - tile_size) / 2; + deco_shift = 1; + deco_masked = gd->draw_masked; + } else { x += EX; @@ -5484,6 +5558,11 @@ static void CreateControlButtons() GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y2, GDI_ALT_DESIGN_UNPRESSED, gd->bitmap, gd_x1a, gd_y1a, GDI_ALT_DESIGN_PRESSED, gd->bitmap, gd_x2a, gd_y2a, + GDI_DECORATION_DESIGN, deco_bitmap, deco_x, deco_y, + GDI_DECORATION_POSITION, deco_xpos, deco_ypos, + GDI_DECORATION_SIZE, tile_size, tile_size, + GDI_DECORATION_SHIFTING, deco_shift, deco_shift, + GDI_DECORATION_MASKED, deco_masked, GDI_EVENT_MASK, event_mask, GDI_CALLBACK_INFO, HandleEditorGadgetInfoText, GDI_CALLBACK_ACTION, HandleControlButtons, @@ -5529,8 +5608,8 @@ static void CreateControlButtons() if (id == GADGET_ID_SCROLL_LIST_UP || id == GADGET_ID_SCROLL_LIST_DOWN) { - x += DX; - y += DY; + x += PX; + y += PY; } else { @@ -5575,14 +5654,14 @@ static void CreateControlButtons() int gd_y2 = gd->src_y + gd->pressed_yoffset; int xx = i % ED_ELEMENTLIST_BUTTONS_HORIZ; int yy = i / ED_ELEMENTLIST_BUTTONS_HORIZ; - int x = DX + ED_ELEMENTLIST_XPOS + xx * gd->width; - int y = DY + ED_ELEMENTLIST_YPOS + yy * gd->height; + int x = PX + ED_ELEMENTLIST_XPOS + xx * gd->width; + int y = PY + ED_ELEMENTLIST_YPOS + yy * gd->height; int element = editor_elements[i]; - int tile_size = (editor.palette.tile_size >= TILESIZE ? TILESIZE : - MINI_TILESIZE); + int tile_size = BUTTON_TILE_SIZE(editor.palette.tile_size); unsigned int event_mask = GD_EVENT_RELEASED; - getElementListGraphicSource(element, &deco_bitmap, &deco_x, &deco_y); + getEditorGraphicSource(element, tile_size, &deco_bitmap, &deco_x, &deco_y); + deco_xpos = (gd->width - tile_size) / 2; deco_ypos = (gd->height - tile_size) / 2; @@ -6197,17 +6276,17 @@ static void CreateScrollbarGadgets() scrollbar_pos[ED_SCROLLBAR_ID_AREA_VERTICAL].wheel_height = SYSIZE; scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].x = - DX + ED_SCROLL2_VERTICAL_XPOS; + PX + ED_SCROLL2_VERTICAL_XPOS; scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].y = - DY + ED_SCROLL2_VERTICAL_YPOS; + PY + ED_SCROLL2_VERTICAL_YPOS; scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].width = ED_SCROLL2_VERTICAL_XSIZE; scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].height = ED_SCROLL2_VERTICAL_YSIZE; - scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_x = DX; - scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_y = DY; - scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_width = DXSIZE; - scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_height = DYSIZE; + scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_x = PX; + scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_y = PY; + scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_width = PXSIZE; + scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_height = PYSIZE; for (i = 0; i < ED_NUM_SCROLLBARS; i++) { @@ -6422,6 +6501,8 @@ void CreateLevelEditorGadgets() editor_el_empty = checked_calloc(ED_NUM_ELEMENTLIST_BUTTONS * sizeof(int)); editor_el_empty_ptr = editor_el_empty; + use_permanent_palette = !editor.palette.show_as_separate_screen; + ReinitializeElementList(); CreateControlButtons(); @@ -6527,15 +6608,19 @@ static void MapControlButtons() for (i = 0; i < ED_NUM_CTRL1_2_BUTTONS; i++) MapGadget(level_editor_gadget[i]); - /* map toolbox buttons (element properties button) */ - MapGadget(level_editor_gadget[ED_NUM_CTRL1_4_BUTTONS]); + /* map toolbox buttons (element properties buttons) */ + for (i = ED_NUM_CTRL1_4_BUTTONS; i < ED_NUM_CTRL1_7_BUTTONS; i++) + MapGadget(level_editor_gadget[i]); - /* map buttons to select elements */ - for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++) - MapGadget(level_editor_gadget[GADGET_ID_ELEMENTLIST_FIRST + i]); - MapGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL]); - MapGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_UP]); - MapGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_DOWN]); + if (use_permanent_palette) + { + /* map buttons to select elements */ + for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++) + MapGadget(level_editor_gadget[GADGET_ID_ELEMENTLIST_FIRST + i]); + MapGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL]); + MapGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_UP]); + MapGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_DOWN]); + } /* map buttons to select level */ counter_id = ED_COUNTER_ID_SELECT_LEVEL; @@ -6884,10 +6969,19 @@ static void DrawEditModeWindow() DrawLevelInfoWindow(); else if (edit_mode == ED_MODE_PROPERTIES) DrawPropertiesWindow(); + else if (edit_mode == ED_MODE_PALETTE) + DrawPaletteWindow(); else /* edit_mode == ED_MODE_DRAWING */ DrawDrawingWindow(); } +static void ChangeEditModeWindow(int new_edit_mode) +{ + edit_mode = (new_edit_mode != edit_mode ? new_edit_mode : ED_MODE_DRAWING); + + DrawEditModeWindow(); +} + static boolean LevelChanged() { boolean field_changed = FALSE; @@ -7669,7 +7763,9 @@ void DrawLevelEd() BlitBitmap(graphic_info[IMG_BACKGROUND_PALETTE].bitmap, drawto, graphic_info[IMG_BACKGROUND_PALETTE].src_x, graphic_info[IMG_BACKGROUND_PALETTE].src_y, - DXSIZE, DYSIZE, DX, DY); + MIN(DXSIZE, graphic_info[IMG_BACKGROUND_PALETTE].width), + MIN(DYSIZE, graphic_info[IMG_BACKGROUND_PALETTE].height), + DX, DY); /* draw bigger door */ DrawSpecialEditorDoor(); @@ -7678,7 +7774,9 @@ void DrawLevelEd() BlitBitmap(graphic_info[IMG_BACKGROUND_TOOLBOX].bitmap, drawto, graphic_info[IMG_BACKGROUND_TOOLBOX].src_x, graphic_info[IMG_BACKGROUND_TOOLBOX].src_y, - EXSIZE, EYSIZE, EX, EY); + MIN(EXSIZE, graphic_info[IMG_BACKGROUND_TOOLBOX].width), + MIN(EYSIZE, graphic_info[IMG_BACKGROUND_TOOLBOX].height), + EX, EY); // redraw_mask |= REDRAW_ALL; @@ -7903,16 +8001,20 @@ static void ModifyEditorElementList() { int i; + if (!use_permanent_palette && edit_mode != ED_MODE_PALETTE) + return; + for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++) { int gadget_id = GADGET_ID_ELEMENTLIST_FIRST + i; struct GadgetInfo *gi = level_editor_gadget[gadget_id]; struct GadgetDesign *gd = &gi->deco.design; int element = editor_elements[element_shift + i]; + int tile_size = BUTTON_TILE_SIZE(editor.palette.tile_size); UnmapGadget(gi); - getElementListGraphicSource(element, &gd->bitmap, &gd->x, &gd->y); + getEditorGraphicSource(element, tile_size, &gd->bitmap, &gd->x, &gd->y); ModifyGadget(gi, GDI_INFO_TEXT, getElementInfoText(element), GDI_END); @@ -7920,12 +8022,28 @@ static void ModifyEditorElementList() } } -static void DrawDrawingElement(int element, struct EditorPaletteElementInfo *e) +static void DrawDrawingElementGraphic(int element, struct XYTileSize *pos) { int graphic = el2edimg(element); - int tile_size = (e->tile_size >= TILESIZE ? TILESIZE : MINI_TILESIZE); + int tile_size = BUTTON_TILE_SIZE(pos->tile_size); - DrawSizedGraphicExt(drawto, DX + e->x, DY + e->y, graphic, 0, tile_size); + if (pos->x == -1 && + pos->y == -1) + return; + + DrawSizedGraphicExt(drawto, DX + pos->x, DY + pos->y, graphic, 0, tile_size); +} + +static void ModifyDrawingElementButton(int element, int id) +{ + struct GadgetInfo *gi = level_editor_gadget[id]; + Bitmap *deco_bitmap; + int deco_x, deco_y; + int tile_size = gi->deco.width; + + getEditorGraphicSource(element, tile_size, &deco_bitmap, &deco_x, &deco_y); + + ModifyGadget(gi, GDI_DECORATION_DESIGN, deco_bitmap, deco_x, deco_y, GDI_END); } static void PickDrawingElement(int button, int element) @@ -7933,12 +8051,13 @@ static void PickDrawingElement(int button, int element) struct { int *new_element; - struct EditorPaletteElementInfo *e; + struct XYTileSize *pos; + int id; } de, drawing_elements[] = { - { &new_element1, &editor.palette.element_left }, - { &new_element2, &editor.palette.element_middle }, - { &new_element3, &editor.palette.element_right }, + { &new_element1, &editor.palette.element_left, GADGET_ID_ELEMENT_LEFT }, + { &new_element2, &editor.palette.element_middle, GADGET_ID_ELEMENT_MIDDLE }, + { &new_element3, &editor.palette.element_right, GADGET_ID_ELEMENT_RIGHT }, }; if (button < 1 || button > 3) @@ -7946,7 +8065,10 @@ static void PickDrawingElement(int button, int element) de = drawing_elements[button - 1]; - DrawDrawingElement((*de.new_element = element), de.e); + *de.new_element = element; // update global drawing element variable + + DrawDrawingElementGraphic(element, de.pos); + ModifyDrawingElementButton(element, de.id); redraw_mask |= REDRAW_DOOR_1; } @@ -9168,6 +9290,23 @@ static void DrawPropertiesWindow() DrawPropertiesConfig(); } +static void DrawPaletteWindow() +{ + int i; + + UnmapLevelEditorFieldGadgets(); + + SetMainBackgroundImage(IMG_BACKGROUND_EDITOR); + ClearField(); + + /* map buttons to select elements */ + for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++) + MapGadget(level_editor_gadget[GADGET_ID_ELEMENTLIST_FIRST + i]); + MapGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL]); + MapGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_UP]); + MapGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_DOWN]); +} + static void UpdateCustomElementGraphicGadgets() { struct ElementInfo *ei = &element_info[properties_element]; @@ -11237,8 +11376,7 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) } else if (type_id == ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE) { - char *template_filename = getDefaultLevelFilename(-1); - boolean new_template = !fileExists(template_filename); + boolean new_template = !fileExists(getLocalLevelTemplateFilename()); /* backup original "level.field" (needed to track playfield changes) */ CopyPlayfield(level.field, FieldBackup); @@ -11363,13 +11501,13 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) } else if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE) { - char *template_filename = getDefaultLevelFilename(-1); - - if (level.use_custom_template && !fileExists(template_filename)) + if (level.use_custom_template && + !fileExists(getGlobalLevelTemplateFilename())) { Request("No level template found!", REQ_CONFIRM); level.use_custom_template = FALSE; + ModifyGadget(gi, GDI_CHECKED, FALSE, GDI_END); return; @@ -11388,10 +11526,12 @@ static void HandleControlButtons(struct GadgetInfo *gi) static int last_level_drawing_function = GADGET_ID_SINGLE_ITEMS; static int last_edit_mode = ED_MODE_DRAWING; static int last_custom_copy_mode = -1; + static int last_button = 0; int id = gi->custom_id; int button = gi->event.button; int step = BUTTON_STEPSIZE(button); int new_element = BUTTON_ELEMENT(button); + int last_properties_element = properties_element; int x, y; if (edit_mode == ED_MODE_DRAWING && drawing_function == GADGET_ID_TEXT) @@ -11403,15 +11543,21 @@ static void HandleControlButtons(struct GadgetInfo *gi) edit_mode != ED_MODE_DRAWING && drawing_function != GADGET_ID_PICK_ELEMENT && !(GetKeyModState() & KMOD_Control)) - { - DrawDrawingWindow(); - edit_mode = ED_MODE_DRAWING; - } + ChangeEditModeWindow(ED_MODE_DRAWING); /* element copy mode active, but no element button pressed => deactivate */ if (last_custom_copy_mode != -1 && id < ED_NUM_CTRL_BUTTONS) last_custom_copy_mode = -1; + /* when showing palette on element buttons, change element of button used */ + if (editor.palette.show_on_element_buttons && + id >= GADGET_ID_ELEMENT_LEFT && id <= GADGET_ID_ELEMENT_RIGHT) + { + last_button = id - GADGET_ID_ELEMENT_LEFT + 1; + + id = GADGET_ID_PALETTE; + } + switch (id) { case GADGET_ID_SCROLL_LEFT: @@ -11531,26 +11677,52 @@ static void HandleControlButtons(struct GadgetInfo *gi) break; case GADGET_ID_PROPERTIES: + // always switch off element properties when they are already displayed + last_properties_element = new_element; + case GADGET_ID_ELEMENT_LEFT: + case GADGET_ID_ELEMENT_MIDDLE: + case GADGET_ID_ELEMENT_RIGHT: + properties_element = (id == GADGET_ID_ELEMENT_LEFT ? new_element1 : + id == GADGET_ID_ELEMENT_MIDDLE ? new_element2 : + id == GADGET_ID_ELEMENT_RIGHT ? new_element3 : + new_element); + if (edit_mode != ED_MODE_PROPERTIES) { - properties_element = new_element; - DrawPropertiesWindow(); - edit_mode = ED_MODE_PROPERTIES; + last_edit_mode = edit_mode; + + ChangeEditModeWindow(ED_MODE_PROPERTIES); last_level_drawing_function = drawing_function; ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS], MB_LEFTBUTTON); } + else if (properties_element != last_properties_element) + { + DrawEditModeWindow(); + } else { - DrawDrawingWindow(); - edit_mode = ED_MODE_DRAWING; + ChangeEditModeWindow(last_edit_mode); ClickOnGadget(level_editor_gadget[last_level_drawing_function], MB_LEFTBUTTON); } break; + case GADGET_ID_PALETTE: + if (edit_mode != ED_MODE_PALETTE) + { + last_edit_mode = edit_mode; + + ChangeEditModeWindow(ED_MODE_PALETTE); + } + else + { + ChangeEditModeWindow(last_edit_mode); + } + break; + case GADGET_ID_WRAP_LEFT: WrapLevel(-step, 0); break; @@ -11637,10 +11809,7 @@ static void HandleControlButtons(struct GadgetInfo *gi) } if (edit_mode != ED_MODE_DRAWING) - { - DrawDrawingWindow(); - edit_mode = ED_MODE_DRAWING; - } + ChangeEditModeWindow(ED_MODE_DRAWING); if (button == 1) { @@ -11677,24 +11846,18 @@ static void HandleControlButtons(struct GadgetInfo *gi) if (edit_mode != ED_MODE_INFO) { last_edit_mode = edit_mode; - edit_mode = ED_MODE_INFO; - DrawLevelInfoWindow(); + ChangeEditModeWindow(ED_MODE_INFO); } else { - edit_mode = last_edit_mode; - - DrawEditModeWindow(); + ChangeEditModeWindow(last_edit_mode); } break; case GADGET_ID_CLEAR: if (edit_mode != ED_MODE_DRAWING) - { - DrawDrawingWindow(); - edit_mode = ED_MODE_DRAWING; - } + ChangeEditModeWindow(ED_MODE_DRAWING); for (x = 0; x < MAX_LEV_FIELDX; x++) for (y = 0; y < MAX_LEV_FIELDY; y++) @@ -11835,6 +11998,10 @@ static void HandleControlButtons(struct GadgetInfo *gi) break; } + /* change element of button used to show palette */ + if (editor.palette.show_on_element_buttons) + button = last_button; + PickDrawingElement(button, new_element); if (!stick_element_properties_window && @@ -11849,6 +12016,9 @@ static void HandleControlButtons(struct GadgetInfo *gi) if (drawing_function == GADGET_ID_PICK_ELEMENT) ClickOnGadget(level_editor_gadget[last_drawing_function], MB_LEFTBUTTON); + + if (!use_permanent_palette) + ChangeEditModeWindow(last_edit_mode); } #ifdef DEBUG else if (gi->event.type == GD_EVENT_PRESSED) @@ -11980,10 +12150,13 @@ void HandleLevelEditorKeyInput(Key key) { HandleControlButtons(level_editor_gadget[GADGET_ID_PROPERTIES]); } + else if (edit_mode == ED_MODE_PALETTE) + { + HandleControlButtons(level_editor_gadget[GADGET_ID_PALETTE]); + } else /* should never happen */ { - DrawDrawingWindow(); - edit_mode = ED_MODE_DRAWING; + ChangeEditModeWindow(ED_MODE_DRAWING); } break; @@ -11994,10 +12167,12 @@ void HandleLevelEditorKeyInput(Key key) if (id != GADGET_ID_NONE) ClickOnGadget(level_editor_gadget[id], button); - else if (letter >= '1' && letter <= '3') - ClickOnGadget(level_editor_gadget[GADGET_ID_PROPERTIES], letter - '0'); - else if (letter == '?') - ClickOnGadget(level_editor_gadget[GADGET_ID_PROPERTIES], button); + else if (letter == '1' || letter == '?') + ClickOnGadget(level_editor_gadget[GADGET_ID_ELEMENT_LEFT], button); + else if (letter == '2') + ClickOnGadget(level_editor_gadget[GADGET_ID_ELEMENT_MIDDLE], button); + else if (letter == '3') + ClickOnGadget(level_editor_gadget[GADGET_ID_ELEMENT_RIGHT], button); else if (letter == '.') ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS], button); else if (letter == 'U')