Main Page | Alphabetical List | Class List | File List | Class Members | File Members

editor/menu.c

Go to the documentation of this file.
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         // Option
00114         draw_string(menu->entries[ii].str, xpos+2, 11+7*ii);
00115         // Hotkey (right-aligned)
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) // If the menu didn't change 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 

Generated on Thu Apr 22 14:06:32 2004 for SKye by doxygen 1.3.6