00001
00002
00003
00004
00005
00006
00007 #ifndef __MENU_H__
00008 #define __MENU_H__
00009
00010 #include <string>
00011 #include <vector>
00012 #include <algorithm>
00013 #include <time.h>
00014 #include "externs.h"
00015 #include "format.h"
00016 #include "defines.h"
00017 #include "libutil.h"
00018
00019 #ifdef USE_TILE
00020 #include "tilebuf.h"
00021 #include "tiledoll.h"
00022 #endif
00023
00024 class formatted_string;
00025
00026 enum MenuEntryLevel
00027 {
00028 MEL_NONE = -1,
00029 MEL_TITLE,
00030 MEL_SUBTITLE,
00031 MEL_ITEM,
00032 };
00033
00034 struct menu_letter
00035 {
00036 char letter;
00037
00038 menu_letter() : letter('a') { }
00039 menu_letter(char c) : letter(c) { }
00040
00041 operator char () const { return letter; }
00042
00043 const menu_letter &operator ++ ()
00044 {
00045 letter = letter == 'z'? 'A' :
00046 letter == 'Z'? 'a' :
00047 letter + 1;
00048 return *this;
00049 }
00050
00051
00052 menu_letter operator ++ (int)
00053 {
00054 menu_letter copy = *this;
00055 this->operator++();
00056 return copy;
00057 }
00058 };
00059
00060 struct item_def;
00061 class Menu;
00062
00063 int menu_colour(const std::string &itemtext,
00064 const std::string &prefix = "",
00065 const std::string &tag = "");
00066
00067 class MenuEntry
00068 {
00069 public:
00070 std::string tag;
00071 std::string text;
00072 int quantity, selected_qty;
00073 int colour;
00074 std::vector<int> hotkeys;
00075 MenuEntryLevel level;
00076 void *data;
00077
00078 #ifdef USE_TILE
00079 std::vector<tile_def> tiles;
00080 #endif
00081
00082 public:
00083 MenuEntry(const std::string &txt = std::string(),
00084 MenuEntryLevel lev = MEL_ITEM,
00085 int qty = 0,
00086 int hotk = 0) :
00087 text(txt), quantity(qty), selected_qty(0), colour(-1),
00088 hotkeys(), level(lev), data(NULL)
00089 {
00090 colour = (lev == MEL_ITEM ? LIGHTGREY :
00091 lev == MEL_SUBTITLE ? BLUE :
00092 WHITE);
00093 if (hotk)
00094 hotkeys.push_back(hotk);
00095 }
00096 virtual ~MenuEntry() { }
00097
00098 bool operator<(const MenuEntry& rhs) const
00099 {
00100 return text < rhs.text;
00101 }
00102
00103 void add_hotkey(int key)
00104 {
00105 if (key && !is_hotkey(key))
00106 hotkeys.push_back(key);
00107 }
00108
00109 bool is_hotkey(int key) const
00110 {
00111 return find(hotkeys.begin(), hotkeys.end(), key) != hotkeys.end();
00112 }
00113
00114 bool is_primary_hotkey(int key) const
00115 {
00116 return (hotkeys.size()? hotkeys[0] == key : false);
00117 }
00118
00119 virtual std::string get_text(const bool unused = false) const
00120 {
00121 if (level == MEL_ITEM && hotkeys.size())
00122 {
00123 char buf[300];
00124 snprintf(buf, sizeof buf,
00125 " %c - %s", hotkeys[0], text.c_str());
00126 return std::string(buf);
00127 }
00128 return text;
00129 }
00130
00131 virtual int highlight_colour() const
00132 {
00133 return (menu_colour(get_text(), "", tag));
00134 }
00135
00136 virtual bool selected() const
00137 {
00138 return (selected_qty > 0 && quantity);
00139 }
00140
00141
00142
00143 virtual void select(int qty = -1)
00144 {
00145 if (qty == -2)
00146 selected_qty = quantity;
00147 else if (selected())
00148 selected_qty = 0;
00149 else if (quantity)
00150 selected_qty = (qty == -1? quantity : qty);
00151 }
00152
00153 virtual std::string get_filter_text() const
00154 {
00155 return get_text();
00156 }
00157
00158 #ifdef USE_TILE
00159 virtual bool get_tiles(std::vector<tile_def>& tileset) const;
00160
00161 virtual void add_tile(tile_def tile);
00162 #endif
00163 };
00164
00165 class ToggleableMenuEntry : public MenuEntry
00166 {
00167 public:
00168 std::string alt_text;
00169
00170 ToggleableMenuEntry(const std::string &txt = std::string(),
00171 const std::string &alt_txt = std::string(),
00172 MenuEntryLevel lev = MEL_ITEM,
00173 int qty = 0, int hotk = 0) :
00174 MenuEntry(txt, lev, qty, hotk), alt_text(alt_txt) {}
00175
00176 void toggle() { text.swap(alt_text); }
00177 };
00178
00179 class MonsterMenuEntry : public MenuEntry
00180 {
00181 public:
00182 MonsterMenuEntry(const std::string &str, const monster* mon, int hotkey);
00183
00184 #ifdef USE_TILE
00185 virtual bool get_tiles(std::vector<tile_def>& tileset) const;
00186 #endif
00187 };
00188
00189 #ifdef USE_TILE
00190 class PlayerMenuEntry : public MenuEntry
00191 {
00192 public:
00193 PlayerMenuEntry(const std::string &str);
00194
00195 virtual bool get_tiles(std::vector<tile_def>& tileset) const;
00196 };
00197 #endif
00198
00199 class FeatureMenuEntry : public MenuEntry
00200 {
00201 public:
00202 coord_def pos;
00203 dungeon_feature_type feat;
00204
00205 FeatureMenuEntry(const std::string &str, const coord_def p, int hotkey);
00206 FeatureMenuEntry(const std::string &str, const dungeon_feature_type f,
00207 int hotkey);
00208
00209 #ifdef USE_TILE
00210 virtual bool get_tiles(std::vector<tile_def>& tileset) const;
00211 #endif
00212 };
00213
00214 class MenuHighlighter
00215 {
00216 public:
00217 virtual int entry_colour(const MenuEntry *entry) const;
00218 virtual ~MenuHighlighter() { }
00219 };
00220
00221 enum MenuFlag
00222 {
00223 MF_NOSELECT = 0x0000,
00224 MF_SINGLESELECT = 0x0001,
00225 MF_MULTISELECT = 0x0002,
00226 MF_NO_SELECT_QTY = 0x0004,
00227 MF_ANYPRINTABLE = 0x0008,
00228
00229 MF_SELECT_BY_PAGE = 0x0010,
00230
00231
00232 MF_ALWAYS_SHOW_MORE = 0x0020,
00233 MF_NOWRAP = 0x0040,
00234
00235 MF_ALLOW_FILTER = 0x0080,
00236
00237 MF_ALLOW_FORMATTING = 0x0100,
00238 MF_SHOW_PAGENUMBERS = 0x0200,
00239 MF_EASY_EXIT = 0x1000,
00240 MF_START_AT_END = 0x2000,
00241 };
00242
00243 class MenuDisplay
00244 {
00245 public:
00246 MenuDisplay(Menu *menu);
00247 virtual ~MenuDisplay() {}
00248 virtual void draw_stock_item(int index, const MenuEntry *me) = 0;
00249 virtual void set_offset(int lines) = 0;
00250 virtual void draw_more() = 0;
00251 virtual void set_num_columns(int columns) = 0;
00252 protected:
00253 Menu *m_menu;
00254 };
00255
00256 class MenuDisplayText : public MenuDisplay
00257 {
00258 public:
00259 MenuDisplayText(Menu *menu);
00260 virtual void draw_stock_item(int index, const MenuEntry *me);
00261 virtual void draw_more();
00262 virtual void set_offset(int lines) { m_starty = lines; }
00263 virtual void set_num_columns(int columns) {}
00264 protected:
00265 int m_starty;
00266 };
00267
00268 class MenuDisplayTile : public MenuDisplay
00269 {
00270 public:
00271 MenuDisplayTile(Menu *menu);
00272 virtual void draw_stock_item(int index, const MenuEntry *me);
00273 virtual void set_offset(int lines);
00274 virtual void draw_more();
00275 virtual void set_num_columns(int columns);
00276 };
00277
00279
00280
00281
00282
00283
00284 #define NUMBUFSIZ 10
00285
00286
00287
00288
00289 class Menu
00290 {
00291 public:
00292 Menu(int flags = MF_MULTISELECT, const std::string& tagname = "",
00293 bool text_only = true);
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 Menu(const formatted_string &fs);
00305
00306 virtual ~Menu();
00307
00308
00309 void clear();
00310
00311
00312
00313 void set_flags(int new_flags, bool use_options = true);
00314 int get_flags() const { return flags; }
00315 virtual bool is_set(int flag) const;
00316 void set_tag(const std::string& t) { tag = t; }
00317
00318 bool draw_title_suffix(const std::string &s, bool titlefirst = true);
00319 bool draw_title_suffix(const formatted_string &fs, bool titlefirst = true);
00320 void update_title();
00321
00322
00323 void set_more(const formatted_string &more);
00324 const formatted_string &get_more() const { return more; }
00325
00326 void set_highlighter(MenuHighlighter *h);
00327 void set_title(MenuEntry *e, bool first = true);
00328 void add_entry(MenuEntry *entry);
00329 void get_selected(std::vector<MenuEntry*> *sel) const;
00330 virtual int get_cursor() const;
00331
00332 void set_maxpagesize(int max);
00333 int maxpagesize() const { return max_pagesize; }
00334
00335 void set_select_filter(std::vector<text_pattern> filter)
00336 {
00337 select_filter = filter;
00338 }
00339
00340 unsigned char getkey() const { return lastch; }
00341
00342 void reset();
00343 std::vector<MenuEntry *> show(bool reuse_selections = false);
00344 std::vector<MenuEntry *> selected_entries() const;
00345
00346 size_t item_count() const { return items.size(); }
00347
00348
00349 int get_entry_index(const MenuEntry *e) const;
00350
00351 virtual int item_colour(int index, const MenuEntry *me) const;
00352 int get_y_offset() const { return y_offset; }
00353 int get_pagesize() const { return pagesize; }
00354 public:
00355 typedef std::string (*selitem_tfn)(const std::vector<MenuEntry*> *sel);
00356 typedef void (*drawitem_tfn)(int index, const MenuEntry *me);
00357 typedef int (*keyfilter_tfn)(int keyin);
00358
00359 selitem_tfn f_selitem;
00360 drawitem_tfn f_drawitem;
00361 keyfilter_tfn f_keyfilter;
00362
00363 enum cycle { CYCLE_NONE, CYCLE_TOGGLE, CYCLE_CYCLE } action_cycle;
00364 enum action { ACT_EXECUTE, ACT_EXAMINE, ACT_MISC, ACT_NUM } menu_action;
00365
00366 protected:
00367 MenuEntry *title;
00368 MenuEntry *title2;
00369
00370 int flags;
00371 std::string tag;
00372
00373 int first_entry, y_offset;
00374 int pagesize, max_pagesize;
00375
00376 formatted_string more;
00377
00378 std::vector<MenuEntry*> items;
00379 std::vector<MenuEntry*> sel;
00380 std::vector<text_pattern> select_filter;
00381
00382
00383 MenuHighlighter *highlighter;
00384
00385 int num;
00386
00387 unsigned char lastch;
00388
00389 bool alive;
00390
00391 int last_selected;
00392
00393 MenuDisplay *mdisplay;
00394
00395 protected:
00396 void check_add_formatted_line(int firstcol, int nextcol,
00397 std::string &line, bool check_eol);
00398 void do_menu();
00399 virtual void draw_select_count(int count, bool force = false);
00400 virtual void draw_item(int index) const;
00401 virtual void draw_index_item(int index, const MenuEntry *me) const;
00402 virtual void draw_stock_item(int index, const MenuEntry *me) const;
00403
00404 virtual void draw_title();
00405 virtual void write_title();
00406 virtual void draw_menu();
00407 virtual bool page_down();
00408 virtual bool line_down();
00409 virtual bool page_up();
00410 virtual bool line_up();
00411
00412 virtual int pre_process(int key);
00413 virtual int post_process(int key);
00414
00415 bool in_page(int index) const;
00416
00417 void deselect_all(bool update_view = true);
00418 virtual void select_items(int key, int qty = -1);
00419 void select_item_index(int idx, int qty, bool draw_cursor = true);
00420 void select_index(int index, int qty = -1);
00421
00422 bool is_hotkey(int index, int key);
00423 virtual bool is_selectable(int index) const;
00424
00425 virtual bool process_key(int keyin);
00426 };
00427
00428
00429 class ToggleableMenu : public Menu
00430 {
00431 public:
00432 ToggleableMenu(int _flags = MF_MULTISELECT, bool text_only = true)
00433 : Menu(_flags, "", text_only) {}
00434 void add_toggle_key(int newkey) { toggle_keys.push_back(newkey); }
00435 protected:
00436 virtual int pre_process(int key);
00437
00438 std::vector<int> toggle_keys;
00439 };
00440
00441
00442
00443 class column_composer
00444 {
00445 public:
00446
00447 column_composer(int ncols, ...);
00448
00449 void clear();
00450 void add_formatted(int ncol,
00451 const std::string &tagged_text,
00452 bool add_separator = true,
00453 bool eol_ends_format = true,
00454 bool (*text_filter)(const std::string &tag) = NULL,
00455 int margin = -1);
00456
00457 std::vector<formatted_string> formatted_lines() const;
00458
00459 void set_pagesize(int pagesize);
00460
00461 private:
00462 struct column;
00463 void compose_formatted_column(
00464 const std::vector<formatted_string> &lines,
00465 int start_col,
00466 int margin);
00467 void strip_blank_lines(std::vector<formatted_string> &) const;
00468
00469 private:
00470 struct column
00471 {
00472 int margin;
00473 int lines;
00474
00475 column(int marg = 1) : margin(marg), lines(0) { }
00476 };
00477
00478 int ncols, pagesize;
00479 std::vector<column> columns;
00480 std::vector<formatted_string> flines;
00481 };
00482
00483
00484
00485
00486
00487
00488
00489 class formatted_scroller : public Menu
00490 {
00491 public:
00492 formatted_scroller();
00493 formatted_scroller(int flags, const std::string& s);
00494 virtual void add_item_formatted_string(const formatted_string& s,
00495 int hotkey = 0);
00496 virtual void add_item_string(const std::string& s, int hotkey = 0);
00497 virtual void add_text(const std::string& s, bool new_line = false);
00498 virtual bool jump_to_hotkey(int keyin);
00499 virtual ~formatted_scroller();
00500 protected:
00501 virtual bool page_down();
00502 virtual bool line_down();
00503 virtual bool page_up();
00504 virtual bool line_up();
00505
00506 virtual void draw_index_item(int index, const MenuEntry* me) const;
00507 virtual bool process_key(int keyin);
00508 bool jump_to(int linenum);
00509 };
00510
00518 class MenuItem
00519 {
00520 public:
00521 MenuItem();
00522 virtual ~MenuItem();
00523
00524 void set_tile_height();
00525
00526 void set_id(int id) { m_item_id = id; }
00527 int get_id() const { return m_item_id; }
00528
00529 virtual void set_bounds(const coord_def& min_coord, const coord_def& max_coord);
00530 virtual void set_bounds_no_multiply(const coord_def& min_coord,
00531 const coord_def& max_coord);
00532 virtual const coord_def& get_min_coord() const { return m_min_coord; }
00533 virtual const coord_def& get_max_coord() const { return m_max_coord; }
00534
00535 virtual void set_description_text(const std::string& text) { m_description = text; }
00536 virtual const std::string& get_description_text() const { return m_description; }
00537
00538 virtual void select(bool toggle);
00539 virtual void select(bool toggle, int value);
00540 virtual bool selected() const;
00541 virtual void allow_highlight(bool toggle);
00542 virtual bool can_be_highlighted() const;
00543 virtual void set_highlight_colour(COLORS colour);
00544 virtual COLORS get_highlight_colour() const;
00545 virtual void set_fg_colour(COLORS colour);
00546 virtual void set_bg_colour(COLORS colour);
00547 virtual COLORS get_fg_colour() const;
00548 virtual COLORS get_bg_colour() const;
00549
00550 virtual void set_visible(bool flag);
00551 virtual bool is_visible() const;
00552
00553 virtual void render() = 0;
00554
00555 void add_hotkey(int key);
00556 const std::vector<int>& get_hotkeys() const;
00557 void clear_hotkeys();
00558
00559 void set_link_left(MenuItem* item);
00560 void set_link_right(MenuItem* item);
00561 void set_link_up(MenuItem* item);
00562 void set_link_down(MenuItem* item);
00563
00564 MenuItem* get_link_left() const;
00565 MenuItem* get_link_right() const;
00566 MenuItem* get_link_up() const;
00567 MenuItem* get_link_down() const;
00568
00569 protected:
00570 coord_def m_min_coord;
00571 coord_def m_max_coord;
00572 bool m_selected;
00573 bool m_allow_highlight;
00574 bool m_dirty;
00575 bool m_visible;
00576 std::vector<int> m_hotkeys;
00577 std::string m_description;
00578
00579 COLORS m_fg_colour;
00580 COLORS m_highlight_colour;
00581 int m_bg_colour;
00582
00583 MenuItem* m_link_left;
00584 MenuItem* m_link_right;
00585 MenuItem* m_link_up;
00586 MenuItem* m_link_down;
00587
00588 #ifdef USE_TILE
00589
00590 unsigned int m_unit_width_pixels;
00591 unsigned int m_unit_height_pixels;
00592 int get_vertical_offset() const;
00593 #endif
00594
00595 int m_item_id;
00596 };
00597
00601 class TextItem : public MenuItem
00602 {
00603 public:
00604 TextItem();
00605 virtual ~TextItem();
00606
00607 virtual void set_bounds(const coord_def& min_coord, const coord_def& max_coord);
00608 virtual void set_bounds_no_multiply(const coord_def& min_coord,
00609 const coord_def& max_coord);
00610
00611 virtual void render();
00612
00613 void set_text(const std::string& text);
00614 const std::string& get_text() const;
00615 protected:
00616 void _wrap_text();
00617
00618 std::string m_text;
00619 std::string m_render_text;
00620
00621 #ifdef USE_TILE
00622 FontBuffer m_font_buf;
00623 #endif
00624 };
00625
00630 class NoSelectTextItem : public TextItem
00631 {
00632 public:
00633 NoSelectTextItem();
00634 virtual ~NoSelectTextItem();
00635 virtual bool selected() const;
00636 virtual bool can_be_highlighted() const;
00637 };
00638
00644 class FormattedTextItem : public NoSelectTextItem
00645 {
00646 public:
00647 virtual void render();
00648 };
00649
00653 #ifdef USE_TILE
00654 class TextTileItem : public TextItem
00655 {
00656 public:
00657 TextTileItem();
00658 virtual ~TextTileItem();
00659
00660 virtual void set_bounds(const coord_def& min_coord, const coord_def& max_coord);
00661 virtual void render();
00662
00663 virtual void add_tile(tile_def tile);
00664 void clear_tile() { m_tiles.clear(); };
00665
00666 protected:
00667 std::vector<tile_def> m_tiles;
00668 FixedVector<TileBuffer, TEX_MAX> m_tile_buf;
00669 };
00670
00676 class SaveMenuItem : public TextTileItem
00677 {
00678 public:
00679 friend class TilesFramework;
00680 SaveMenuItem();
00681 virtual ~SaveMenuItem();
00682
00683 virtual void render();
00684
00685 void set_doll(dolls_data doll);
00686
00687 protected:
00688 void _pack_doll();
00689 dolls_data m_save_doll;
00690 };
00691 #endif
00692
00693 class PrecisionMenu;
00694
00702 class MenuObject
00703 {
00704 public:
00705 enum InputReturnValue
00706 {
00707 INPUT_NO_ACTION,
00708 INPUT_SELECTED,
00709 INPUT_DESELECTED,
00710 INPUT_END_MENU_SUCCESS,
00711 INPUT_END_MENU_ABORT,
00712 INPUT_ACTIVE_CHANGED,
00713 INPUT_FOCUS_RELEASE_UP,
00714 INPUT_FOCUS_RELEASE_DOWN,
00715 INPUT_FOCUS_RELEASE_LEFT,
00716 INPUT_FOCUS_RELEASE_RIGHT,
00717 INPUT_FOCUS_LOST,
00718 };
00719
00720 MenuObject();
00721 virtual ~MenuObject();
00722
00723 void set_tile_height();
00724 void init(const coord_def& min_coord, const coord_def& max_coord,
00725 const std::string& name);
00726 const coord_def& get_min_coord() const { return m_min_coord; }
00727 const coord_def& get_max_coord() const { return m_max_coord; }
00728 const std::string& get_name() const { return m_object_name; }
00729
00730 virtual void allow_focus(bool toggle);
00731 virtual bool can_be_focused();
00732
00733 virtual InputReturnValue process_input(int key) = 0;
00734 #ifdef USE_TILE
00735 virtual InputReturnValue handle_mouse(const MouseEvent& me) = 0;
00736 #endif
00737 virtual void render() = 0;
00738
00739 virtual void set_active_item(int ID) = 0;
00740 virtual void set_active_item(MenuItem* item) = 0;
00741 virtual void activate_first_item() = 0;
00742 virtual void activate_last_item() = 0;
00743
00744 virtual void set_visible(bool flag);
00745 virtual bool is_visible() const;
00746
00747 virtual std::vector<MenuItem*> get_selected_items();
00748 virtual bool select_item(int index) = 0;
00749 virtual bool select_item(MenuItem* item) = 0;
00750 virtual MenuItem* find_item_by_hotkey(int key);
00751 virtual MenuItem* select_item_by_hotkey(int key);
00752 virtual void clear_selections();
00753 virtual MenuItem* get_active_item() = 0;
00754
00755 virtual bool attach_item(MenuItem* item) = 0;
00756
00757 protected:
00758 enum Direction{
00759 UP,
00760 DOWN,
00761 LEFT,
00762 RIGHT,
00763 };
00764 virtual void _place_items() = 0;
00765 virtual bool _is_mouse_in_bounds(const coord_def& pos);
00766 virtual MenuItem* _find_item_by_mouse_coords(const coord_def& pos);
00767 virtual MenuItem* _find_item_by_direction(const MenuItem* start,
00768 MenuObject::Direction dir) = 0;
00769
00770 bool m_dirty;
00771 bool m_allow_focus;
00772 bool m_visible;
00773
00774 coord_def m_min_coord;
00775 coord_def m_max_coord;
00776 std::string m_object_name;
00777
00778
00779
00780 std::vector<MenuItem*> m_entries;
00781 #ifdef USE_TILE
00782
00783 unsigned int m_unit_width_pixels;
00784 unsigned int m_unit_height_pixels;
00785 #endif
00786 };
00787
00793 class MenuFreeform : public MenuObject
00794 {
00795 public:
00796 MenuFreeform();
00797 virtual ~MenuFreeform();
00798
00799 virtual InputReturnValue process_input(int key);
00800 #ifdef USE_TILE
00801 virtual InputReturnValue handle_mouse(const MouseEvent& me);
00802 #endif
00803 virtual void render();
00804 virtual MenuItem* get_active_item();
00805 virtual void set_active_item(int ID);
00806 virtual void set_active_item(MenuItem* item);
00807 virtual void activate_first_item();
00808 virtual void activate_last_item();
00809 void set_default_item(MenuItem* item);
00810 void activate_default_item();
00811
00812 virtual bool select_item(int index);
00813 virtual bool select_item(MenuItem* item);
00814 virtual bool attach_item(MenuItem* item);
00815
00816 protected:
00817 virtual void _place_items();
00818 virtual void _set_active_item_by_index(int index);
00819 virtual MenuItem* _find_item_by_direction(const MenuItem* start,
00820 MenuObject::Direction dir);
00821
00822
00823 MenuItem* m_active_item;
00824 MenuItem* m_default_item;
00825 };
00826
00833 class MenuScroller : public MenuObject
00834 {
00835 public:
00836 MenuScroller();
00837 virtual ~MenuScroller();
00838
00839 virtual InputReturnValue process_input(int key);
00840 #ifdef USE_TILE
00841 virtual InputReturnValue handle_mouse(const MouseEvent& me);
00842 #endif
00843 virtual void render();
00844 virtual MenuItem* get_active_item();
00845 virtual void set_active_item(int ID);
00846 virtual void set_active_item(MenuItem* item);
00847 virtual void activate_first_item();
00848 virtual void activate_last_item();
00849
00850 virtual bool select_item(int index);
00851 virtual bool select_item(MenuItem* item);
00852 virtual bool attach_item(MenuItem* item);
00853 protected:
00854 virtual void _place_items();
00855 virtual void _set_active_item_by_index(int index);
00856 virtual MenuItem* _find_item_by_direction(int start_index,
00857 MenuObject::Direction dir);
00858 virtual MenuItem* _find_item_by_direction(const MenuItem* start,
00859 MenuObject::Direction dir) { return NULL; }
00860
00861 int m_topmost_visible;
00862 int m_currently_active;
00863 int m_items_shown;
00864 };
00865
00870 class MenuDescriptor : public MenuObject
00871 {
00872 public:
00873 MenuDescriptor(PrecisionMenu* parent);
00874 virtual ~MenuDescriptor();
00875
00876 void init(const coord_def& min_coord, const coord_def& max_coord,
00877 const std::string& name);
00878
00879 virtual InputReturnValue process_input(int key);
00880 #ifdef USE_TILE
00881 virtual InputReturnValue handle_mouse(const MouseEvent& me);
00882 #endif
00883 virtual void render();
00884
00885
00886 virtual std::vector<MenuItem*> get_selected_items();
00887 virtual MenuItem* get_active_item() { return NULL; }
00888 virtual bool attach_item(MenuItem* item) { return false; }
00889 virtual void set_active_item(int index) {}
00890 virtual void set_active_item(MenuItem* item) {}
00891 virtual void activate_first_item() {}
00892 virtual void activate_last_item() {}
00893
00894 virtual bool select_item(int index) { return false; }
00895 virtual bool select_item(MenuItem* item) { return false;}
00896 virtual MenuItem* select_item_by_hotkey(int key) { return NULL; }
00897 virtual void clear_selections() {}
00898
00899
00900 virtual void allow_focus(bool toggle) {}
00901 virtual bool can_be_focused() { return false; }
00902
00903 protected:
00904 virtual void _place_items();
00905 virtual MenuItem* _find_item_by_mouse_coords(const coord_def& pos) { return NULL; }
00906 virtual MenuItem* _find_item_by_direction(const MenuItem* start,
00907 MenuObject::Direction dir) { return NULL; }
00908
00909
00910 PrecisionMenu* m_parent;
00911 MenuItem* m_active_item;
00912 NoSelectTextItem m_desc_item;
00913 };
00914
00919 class MenuTooltip : public MenuDescriptor
00920 {
00921 public:
00922 MenuTooltip(PrecisionMenu* parent);
00923 virtual ~MenuTooltip();
00924
00925 #ifdef USE_TILE
00926 virtual InputReturnValue handle_mouse(const MouseEvent& me);
00927 #endif
00928 virtual void render();
00929 protected:
00930 virtual void _place_items();
00931
00932 #ifdef USE_TILE
00933 ShapeBuffer m_background;
00934 FontBuffer m_font_buf;
00935 #endif
00936 };
00937
00944 class BoxMenuHighlighter : public MenuObject
00945 {
00946 public:
00947 BoxMenuHighlighter(PrecisionMenu* parent);
00948 virtual ~BoxMenuHighlighter();
00949
00950 virtual InputReturnValue process_input(int key);
00951 #ifdef USE_TILE
00952 virtual InputReturnValue handle_mouse(const MouseEvent& me);
00953 #endif
00954 virtual void render();
00955
00956
00957 virtual std::vector<MenuItem*> get_selected_items();
00958 virtual MenuItem* get_active_item() { return NULL; }
00959 virtual bool attach_item(MenuItem* item) { return false; }
00960 virtual void set_active_item(int index) {}
00961 virtual void set_active_item(MenuItem* item) {}
00962 virtual void activate_first_item() {}
00963 virtual void activate_last_item() {}
00964
00965 virtual bool select_item(int index) { return false; }
00966 virtual bool select_item(MenuItem* item) { return false;}
00967 virtual MenuItem* select_item_by_hotkey(int key) { return NULL; }
00968 virtual void clear_selections() {}
00969
00970
00971 virtual void allow_focus(bool toggle) {}
00972 virtual bool can_be_focused() { return false; }
00973
00974 protected:
00975 virtual void _place_items();
00976 virtual MenuItem* _find_item_by_mouse_coords(const coord_def& pos) { return NULL; }
00977 virtual MenuItem* _find_item_by_direction(const MenuItem* start,
00978 MenuObject::Direction dir) { return NULL; }
00979
00980
00981 PrecisionMenu* m_parent;
00982 MenuItem* m_active_item;
00983
00984 #ifdef USE_TILE
00985 LineBuffer m_line_buf;
00986 #else
00987 COLORS m_old_bg_colour;
00988 #endif
00989 };
00990
00991 class BlackWhiteHighlighter : public BoxMenuHighlighter
00992 {
00993 public:
00994 BlackWhiteHighlighter(PrecisionMenu* parent);
00995 virtual ~BlackWhiteHighlighter();
00996
00997 virtual void render();
00998 protected:
00999 virtual void _place_items();
01000
01001 #ifdef USE_TILE
01002
01003 ShapeBuffer m_shape_buf;
01004 #endif
01005 COLORS m_old_bg_colour;
01006 COLORS m_old_fg_colour;
01007 };
01008
01013 class MenuButton : public MenuObject
01014 {
01015 public:
01016
01017 protected:
01018
01019 };
01020
01028 class PrecisionMenu
01029 {
01030 public:
01031 enum SelectType
01032 {
01033 PRECISION_SINGLESELECT,
01034 PRECISION_MULTISELECT,
01035 };
01036
01037 PrecisionMenu();
01038 virtual ~PrecisionMenu();
01039
01040 virtual void set_select_type(SelectType flag);
01041 virtual void clear();
01042
01043 virtual void draw_menu();
01044 virtual bool process_key(int key);
01045 #ifdef USE_TILE
01046 virtual int handle_mouse(const MouseEvent& me);
01047 #endif
01048
01049
01050 virtual std::vector<MenuItem*> get_selected_items();
01051
01052 virtual void attach_object(MenuObject* item);
01053 virtual MenuObject* get_object_by_name(const std::string& search);
01054 virtual MenuItem* get_active_item();
01055 virtual void set_active_object(MenuObject* object);
01056 protected:
01057
01058 enum Direction{
01059 UP,
01060 DOWN,
01061 LEFT,
01062 RIGHT,
01063 };
01064 void _clear_selections();
01065 MenuObject* _find_object_by_direction(const MenuObject* start, Direction dir);
01066
01067 std::vector<MenuObject*> m_attached_objects;
01068 MenuObject* m_active_object;
01069
01070 SelectType m_select_type;
01071 };
01072
01073 int linebreak_string(std::string& s, int wrapcol, int maxcol);
01074 int linebreak_string2(std::string& s, int maxcol);
01075 std::string get_linebreak_string(const std::string& s, int maxcol);
01076
01077 #endif