00001 #include "editor.h"
00002
00003
00004 typedef struct menu_entry
00005 {
00006 const char *str;
00007 const char *hotkey;
00008 void (*func)(void);
00009 } menu_entry;
00010
00011
00012 typedef struct menu_info
00013 {
00014 const char *str;
00015 int xpos, highlight_width, width;
00016 int num_entries;
00017 menu_entry *entries;
00018 } menu_info;
00019
00020
00021 #define ICON_CTRL "\x7F"
00022 #define ICON_SHIFT "\x1B"
00023
00024
00025 menu_entry file_menu[] = {
00026 { "New", ICON_SHIFT "N", file_new },
00027 { "Open", ICON_SHIFT "O", file_open },
00028 { "Save", ICON_SHIFT "S", file_save },
00029 { "Save as", "", file_save_as },
00030 { "Exit", "ESC", file_exit}
00031 };
00032
00033
00034 menu_entry edit_menu[] = {
00035 { "Cut", ICON_SHIFT "X", edit_cut },
00036 { "Copy", ICON_SHIFT "Y", edit_copy },
00037 { "Paste", "=", edit_paste },
00038 { "Clear", "", edit_clear },
00039 { "Select all", ICON_SHIFT "A", edit_select_all }
00040 };
00041
00042
00043 menu_entry transform_menu[] = {
00044 { "Flip horizontal", ICON_SHIFT "H", transform_mirror_horizontal },
00045 { "Flip vertical", ICON_SHIFT "V", transform_mirror_vertical },
00046 { "Rotate 180deg", ICON_SHIFT "R", transform_rotate_180 },
00047 { "Cut corners", ICON_SHIFT "C", transform_smooth }
00048 };
00049
00050
00051 menu_entry map_menu[] = {
00052 { "Properties", "MODE", map_properties },
00053 { "Resize", "", map_resize },
00054 { "Next map", "+", map_next },
00055 { "Previous map", "-", map_previous },
00056 { "Insert map", "", map_insert },
00057 { "Delete", "", map_delete },
00058 { "Move up", ICON_CTRL "\x17", map_move_up },
00059 { "Move down", ICON_CTRL "\x18", map_move_down },
00060 { "Import", "", map_import_level }
00061 };
00062
00063
00064 #define NUM_MENUS 4
00065
00066 menu_info menus[NUM_MENUS] = {
00067 { "File", 11, 17, 45, 5, file_menu },
00068 { "Edit", 28, 17, 55, 5, edit_menu },
00069 { "Transform", 45, 39, 70, 4, transform_menu },
00070 { "Map", 84, 17, 65, 9, map_menu }
00071 };
00072
00073
00074 int open_menu = 0;
00075 int menu_pos = 0;
00076
00077
00078 void enter_menu_state(int menu)
00079 {
00080 input_state = menu_state;
00081 open_menu = menu;
00082 menu_pos = 0;
00083 draw_menu_labels();
00084 menu_toggle_highlight(menu);
00085 draw_open_menu();
00086 }
00087
00088
00089 void draw_menu_labels(void)
00090 {
00091 int ii;
00092 for(ii=0; ii<NUM_MENUS; ii++)
00093 draw_string(menus[ii].str, menus[ii].xpos+1, 2);
00094 }
00095
00096
00097 void undraw_open_menus(void)
00098 {
00099 draw_map_field();
00100 }
00101
00102
00103 void draw_open_menu(void)
00104 {
00105 int ii;
00106 int xpos = menus[open_menu].xpos;
00107 const char *str;
00108 menu_info *menu = &menus[open_menu];
00109 draw_rect(xpos, 9, menu->width+2,
00110 menu->num_entries*7+2);
00111 for(ii=0; ii<menu->num_entries; ii++)
00112 {
00113
00114 draw_string(menu->entries[ii].str, xpos+2, 11+7*ii);
00115
00116 str = menu->entries[ii].hotkey;
00117 draw_string(str, xpos+menu->width-1-DrawStrWidth(str, F_4x6), 11+7*ii);
00118 }
00119 xor_rect(xpos+1, 10+menu_pos*7, menus[open_menu].width, 7);
00120 }
00121
00122
00123 void menu_toggle_highlight(int menu)
00124 {
00125 xor_rect(menus[menu].xpos, 0, menus[menu].highlight_width, 9);
00126 }
00127
00128
00129
00130 void switch_menu(int menu)
00131 {
00132 menu_toggle_highlight(open_menu);
00133 undraw_open_menus();
00134 open_menu = menu;
00135 menu_toggle_highlight(open_menu);
00136 menu_pos = 0;
00137 draw_open_menu();
00138 }
00139
00140
00141 void menu_state(int key)
00142 {
00143 if(key == KEY_RIGHT) {
00144 switch_menu((open_menu+1)%NUM_MENUS);
00145 } else if(key == KEY_LEFT) {
00146 if(open_menu==0) switch_menu(NUM_MENUS-1);
00147 else switch_menu(open_menu-1);
00148 } else if(key == KEY_DOWN) {
00149 menu_pos = (menu_pos+1) % menus[open_menu].num_entries;
00150 draw_open_menu();
00151 } else if(key == KEY_UP) {
00152 if(menu_pos==0) menu_pos = menus[open_menu].num_entries - 1;
00153 else menu_pos--;
00154 draw_open_menu();
00155 } else if(key == KEY_ENTER) {
00156 undraw_open_menus();
00157 menus[open_menu].entries[menu_pos].func();
00158 if(input_state == menu_state)
00159 enter_edit_state();
00160 }
00161 else if(key == KEY_ESC) enter_edit_state();
00162 else if(key == KEY_F1) enter_palette_state();
00163 else if(key == KEY_F2) switch_menu(0);
00164 else if(key == KEY_F3) switch_menu(1);
00165 else if(key == KEY_F4) switch_menu(2);
00166 else if(key == KEY_F5) switch_menu(3);
00167 }
00168
00169
00170