- if (edit_mode == ED_MODE_DRAWING && drawing_function == ED_CTRL_ID_TEXT)
- {
- char *keyname = getKeyNameFromKeySym(key);
- char letter = 0;
-
- if (strlen(keyname) == 1)
- letter = keyname[0];
- else if (strcmp(keyname, "space") == 0)
- letter = ' ';
- else if (strcmp(keyname, "less") == 0)
- letter = '<';
- else if (strcmp(keyname, "equal") == 0)
- letter = '=';
- else if (strcmp(keyname, "greater") == 0)
- letter = '>';
-
- /* map lower case letters to upper case */
- if (letter >= 'a' && letter <= 'z')
- letter += (int)('A' - 'a');
- else if (letter == 'ä')
- letter = 'Ä';
- else if (letter == 'ä')
- letter = 'Ö';
- else if (letter == 'ä')
- letter = 'Ü';
-
- if (letter)
- DrawLevelText(0, 0, letter, TEXT_WRITECHAR);
- else if (key == XK_Delete || key == XK_BackSpace)
- DrawLevelText(0, 0, 0, TEXT_BACKSPACE);
- else if (key == XK_Return)
- DrawLevelText(0, 0, 0, TEXT_NEWLINE);
+ if (edit_mode == ED_MODE_DRAWING)
+ {
+ char letter = getCharFromKeySym(key);
+
+ if (drawing_function == GADGET_ID_TEXT)
+ {
+ if (letter)
+ DrawLevelText(0, 0, letter, TEXT_WRITECHAR);
+ else if (key == XK_Delete || key == XK_BackSpace)
+ DrawLevelText(0, 0, 0, TEXT_BACKSPACE);
+ else if (key == XK_Return)
+ DrawLevelText(0, 0, 0, TEXT_NEWLINE);
+ }
+ else if (button_status == MB_RELEASED)
+ {
+ int i, id;
+
+ switch (key)
+ {
+ case XK_Left:
+ id = GADGET_ID_SCROLL_LEFT;
+ break;
+ case XK_Right:
+ id = GADGET_ID_SCROLL_RIGHT;
+ break;
+ case XK_Up:
+ id = GADGET_ID_SCROLL_UP;
+ break;
+ case XK_Down:
+ id = GADGET_ID_SCROLL_DOWN;
+ break;
+
+ default:
+ id = GADGET_ID_NONE;
+ break;
+ }
+
+ if (id != GADGET_ID_NONE)
+ ClickOnGadget(level_editor_gadget[id]);
+ else if (letter == '.')
+ ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS]);
+ else
+ for (i=0; i<ED_NUM_CTRL_BUTTONS; i++)
+ if (letter && letter == control_info[i].shortcut)
+ ClickOnGadget(level_editor_gadget[i]);
+ }
+ }
+}
+
+void ClearEditorGadgetInfoText()
+{
+ XFillRectangle(display, drawto, gc,
+ INFOTEXT_XPOS, INFOTEXT_YPOS, INFOTEXT_XSIZE, INFOTEXT_YSIZE);
+ redraw_mask |= REDRAW_FIELD;
+}
+
+void HandleEditorGadgetInfoText(void *ptr)
+{
+ struct GadgetInfo *gi = (struct GadgetInfo *)ptr;
+ char infotext[MAX_INFOTEXT_LEN + 1];
+ char shortcut[20];
+
+ ClearEditorGadgetInfoText();
+
+ /* misuse this function to delete brush cursor, if needed */
+ if (edit_mode == ED_MODE_DRAWING && draw_with_brush)
+ DeleteBrushFromCursor();
+
+ if (gi == NULL || gi->info_text == NULL)
+ return;
+
+ strncpy(infotext, gi->info_text, MAX_INFOTEXT_LEN);
+ infotext[MAX_INFOTEXT_LEN] = '\0';
+
+ if (gi->custom_id < ED_NUM_CTRL_BUTTONS)
+ {
+ int key = control_info[gi->custom_id].shortcut;
+
+ if (key)
+ {
+ sprintf(shortcut, " ('%s%c')",
+ (key >= 'A' && key <= 'Z' ? "Shift-" :
+ gi->custom_id == GADGET_ID_SINGLE_ITEMS ? ".' or '" : ""),
+ key);
+
+ if (strlen(infotext) + strlen(shortcut) <= MAX_INFOTEXT_LEN)
+ strcat(infotext, shortcut);
+ }
+ }
+
+ DrawText(INFOTEXT_XPOS, INFOTEXT_YPOS, infotext, FS_SMALL, FC_YELLOW);
+}
+
+static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
+{
+ static int start_lx, start_ly;
+ char *infotext;
+ int id = gi->custom_id;
+ int sx = gi->event.x;
+ int sy = gi->event.y;
+ int lx = sx + level_xpos;
+ int ly = sy + level_ypos;
+
+ ClearEditorGadgetInfoText();
+
+ if (id == GADGET_ID_DRAWING_LEVEL)
+ {
+ if (button_status)
+ {
+ int min_sx = 0, min_sy = 0;
+ int max_sx = gi->drawing.area_xsize - 1;
+ int max_sy = gi->drawing.area_ysize - 1;
+ int min_lx = 0, min_ly = 0;
+ int max_lx = lev_fieldx - 1, max_ly = lev_fieldy - 1;
+
+ /* make sure to stay inside drawing area boundaries */
+ sx = (sx < min_sx ? min_sx : sx > max_sx ? max_sx : sx);
+ sy = (sy < min_sy ? min_sy : sy > max_sy ? max_sy : sy);
+
+ /* get positions inside level field */
+ lx = sx + level_xpos;
+ ly = sy + level_ypos;
+
+ /* make sure to stay inside level field boundaries */
+ lx = (lx < min_lx ? min_lx : lx > max_lx ? max_lx : lx);
+ ly = (ly < min_ly ? min_ly : ly > max_ly ? max_ly : ly);
+
+ /* correct drawing area positions accordingly */
+ sx = lx - level_xpos;
+ sy = ly - level_ypos;
+ }
+
+ if (IN_ED_FIELD(sx,sy) && IN_LEV_FIELD(lx, ly))
+ {
+ if (button_status) /* if (gi->state == GD_BUTTON_PRESSED) */
+ {
+ if (gi->event.type == GD_EVENT_PRESSED)
+ {
+ start_lx = lx;
+ start_ly = ly;
+ }
+
+ switch (drawing_function)
+ {
+ case GADGET_ID_SINGLE_ITEMS:
+ infotext = "Drawing single items";
+ break;
+ case GADGET_ID_CONNECTED_ITEMS:
+ infotext = "Drawing connected items";
+ break;
+ case GADGET_ID_LINE:
+ infotext = "Drawing line";
+ break;
+ case GADGET_ID_ARC:
+ infotext = "Drawing arc";
+ break;
+ case GADGET_ID_TEXT:
+ infotext = "Setting text cursor";
+ break;
+ case GADGET_ID_RECTANGLE:
+ infotext = "Drawing rectangle";
+ break;
+ case GADGET_ID_FILLED_BOX:
+ infotext = "Drawing filled box";
+ break;
+ case GADGET_ID_FLOOD_FILL:
+ infotext = "Flood fill";
+ break;
+ case GADGET_ID_GRAB_BRUSH:
+ infotext = "Grabbing brush";
+ break;
+ case GADGET_ID_PICK_ELEMENT:
+ infotext = "Picking element";
+ break;
+
+ default:
+ infotext = "Drawing position";
+ break;
+ }
+
+ DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW,
+ "%s: %d, %d", infotext,
+ ABS(lx - start_lx) + 1,
+ ABS(ly - start_ly) + 1);
+ }
+ else
+ DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW,
+ "Level position: %d, %d", lx, ly);
+ }
+
+ /* misuse this function to draw brush cursor, if needed */
+ if (edit_mode == ED_MODE_DRAWING && draw_with_brush && !button_status)
+ {
+ if (IN_ED_FIELD(sx, sy) && IN_LEV_FIELD(lx, ly))
+ CopyBrushToCursor(sx, sy);
+ else
+ DeleteBrushFromCursor();
+ }