diff options
Diffstat (limited to 'src/frontend/mame/ui/ui.h')
-rw-r--r-- | src/frontend/mame/ui/ui.h | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/src/frontend/mame/ui/ui.h b/src/frontend/mame/ui/ui.h new file mode 100644 index 00000000000..b45d20c6e63 --- /dev/null +++ b/src/frontend/mame/ui/ui.h @@ -0,0 +1,223 @@ +// license:BSD-3-Clause +// copyright-holders:Nicola Salmoria, Aaron Giles, Nathan Woods +/*************************************************************************** + + ui.h + + Functions used to handle MAME's crude user interface. + +***************************************************************************/ + +#pragma once + +#ifndef __USRINTRF_H__ +#define __USRINTRF_H__ + +#include <vector> + +#include "render.h" +#include "moptions.h" +#include "mame.h" +#include "language.h" +#include "ui/uimain.h" + +class ui_menu_item; + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +/* preferred font height; use ui_get_line_height() to get actual height */ +#define UI_TARGET_FONT_ROWS get_font_rows() + +#define UI_TARGET_FONT_HEIGHT (1.0f / (float)UI_TARGET_FONT_ROWS) +#define UI_MAX_FONT_HEIGHT (1.0f / 15.0f) + +/* width of lines drawn in the UI */ +#define UI_LINE_WIDTH (1.0f / 500.0f) + +/* border between outlines and inner text on left/right and top/bottom sides */ +#define UI_BOX_LR_BORDER (UI_TARGET_FONT_HEIGHT * 0.25f) +#define UI_BOX_TB_BORDER (UI_TARGET_FONT_HEIGHT * 0.25f) + +/* handy colors */ +#define ARGB_WHITE rgb_t(0xff,0xff,0xff,0xff) +#define ARGB_BLACK rgb_t(0xff,0x00,0x00,0x00) +#define UI_GREEN_COLOR rgb_t(0xef,0x10,0x60,0x10) +#define UI_YELLOW_COLOR rgb_t(0xef,0x60,0x60,0x10) +#define UI_RED_COLOR rgb_t(0xf0,0x60,0x10,0x10) +#define UI_BORDER_COLOR decode_ui_color(0) +#define UI_BACKGROUND_COLOR decode_ui_color(1) +#define UI_GFXVIEWER_BG_COLOR decode_ui_color(2) +#define UI_UNAVAILABLE_COLOR decode_ui_color(3) +#define UI_TEXT_COLOR decode_ui_color(4) +#define UI_TEXT_BG_COLOR decode_ui_color(5) +#define UI_SUBITEM_COLOR decode_ui_color(6) +#define UI_CLONE_COLOR decode_ui_color(7) +#define UI_SELECTED_COLOR decode_ui_color(8) +#define UI_SELECTED_BG_COLOR decode_ui_color(9) +#define UI_MOUSEOVER_COLOR decode_ui_color(10) +#define UI_MOUSEOVER_BG_COLOR decode_ui_color(11) +#define UI_MOUSEDOWN_COLOR decode_ui_color(12) +#define UI_MOUSEDOWN_BG_COLOR decode_ui_color(13) +#define UI_DIPSW_COLOR decode_ui_color(14) +#define UI_SLIDER_COLOR decode_ui_color(15) + +/* cancel return value for a UI handler */ +#define UI_HANDLER_CANCEL ((UINT32)~0) + +/* justification options for ui_draw_text_full */ +enum +{ + JUSTIFY_LEFT = 0, + JUSTIFY_CENTER, + JUSTIFY_RIGHT +}; + +/* word wrapping options for ui_draw_text_full */ +enum +{ + WRAP_NEVER, + WRAP_TRUNCATE, + WRAP_WORD +}; + +/* drawing options for ui_draw_text_full */ +enum +{ + DRAW_NONE, + DRAW_NORMAL, + DRAW_OPAQUE +}; + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +typedef UINT32 (*ui_callback)(running_machine &, render_container *, UINT32); + +// ======================> mame_ui_manager + +class mame_ui_manager : public ui_manager +{ +public: + // construction/destruction + mame_ui_manager(running_machine &machine); + + void init(); + + // getters + running_machine &machine() const { return m_machine; } + bool single_step() const { return m_single_step; } + ui_options &options() { return m_ui_options; } + + // setters + void set_single_step(bool single_step) { m_single_step = single_step; } + + // methods + void initialize(running_machine &machine); + std::vector<ui_menu_item> slider_init(running_machine &machine); + UINT32 set_handler(ui_callback callback, UINT32 param); + void display_startup_screens(bool first_time); + virtual void set_startup_text(const char *text, bool force) override; + void update_and_render(render_container *container); + render_font *get_font(); + float get_line_height(); + float get_char_width(unicode_char ch); + float get_string_width(const char *s, float text_size = 1.0f); + void draw_outlined_box(render_container *container, float x0, float y0, float x1, float y1, rgb_t backcolor); + void draw_outlined_box(render_container *container, float x0, float y0, float x1, float y1, rgb_t fgcolor, rgb_t bgcolor); + void draw_text(render_container *container, const char *buf, float x, float y); + void draw_text_full(render_container *container, const char *origs, float x, float y, float origwrapwidth, int justify, int wrap, int draw, rgb_t fgcolor, rgb_t bgcolor, float *totalwidth = nullptr, float *totalheight = nullptr, float text_size = 1.0f); + void draw_text_box(render_container *container, const char *text, int justify, float xpos, float ypos, rgb_t backcolor); + void draw_message_window(render_container *container, const char *text); + + template <typename Format, typename... Params> void popup_time(int seconds, Format &&fmt, Params &&... args); + void show_fps_temp(double seconds); + void set_show_fps(bool show); + bool show_fps() const; + bool show_fps_counter(); + void set_show_profiler(bool show); + bool show_profiler() const; + void show_menu(); + void show_mouse(bool status); + virtual bool is_menu_active() override; + bool can_paste(); + void paste(); + void set_use_natural_keyboard(bool use_natural_keyboard); + void image_handler_ingame(); + void increase_frameskip(); + void decrease_frameskip(); + void request_quit(); + + // print the game info string into a buffer + std::string &game_info_astring(std::string &str); + + // slider controls + std::vector<ui_menu_item>& get_slider_list(void); + + // other + void process_natural_keyboard(); + + // word wrap + int wrap_text(render_container *container, const char *origs, float x, float y, float origwrapwidth, std::vector<int> &xstart, std::vector<int> &xend, float text_size = 1.0f); + + // draw an outlined box with given line color and filled with a texture + void draw_textured_box(render_container *container, float x0, float y0, float x1, float y1, rgb_t backcolor, rgb_t linecolor, render_texture *texture = nullptr, UINT32 flags = PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + virtual void popup_time_string(int seconds, std::string message) override; + + virtual void image_display(const device_type &type, device_image_interface *image) override; +private: + // instance variables + render_font * m_font; + ui_callback m_handler_callback; + UINT32 m_handler_param; + bool m_single_step; + bool m_showfps; + osd_ticks_t m_showfps_end; + bool m_show_profiler; + osd_ticks_t m_popup_text_end; + std::unique_ptr<UINT8[]> m_non_char_keys_down; + render_texture * m_mouse_arrow_texture; + bool m_mouse_show; + bool m_load_save_hold; + ui_options m_ui_options; + + // static variables + static std::string messagebox_text; + static std::string messagebox_poptext; + static rgb_t messagebox_backcolor; + + static std::vector<ui_menu_item> slider_list; + static slider_state *slider_current; + + // text generators + std::string &warnings_string(std::string &buffer); + + // UI handlers + static UINT32 handler_messagebox(running_machine &machine, render_container *container, UINT32 state); + static UINT32 handler_messagebox_anykey(running_machine &machine, render_container *container, UINT32 state); + static UINT32 handler_ingame(running_machine &machine, render_container *container, UINT32 state); + static UINT32 handler_load_save(running_machine &machine, render_container *container, UINT32 state); + static UINT32 handler_confirm_quit(running_machine &machine, render_container *container, UINT32 state); + + // private methods + void exit(); +}; + + +/*************************************************************************** + FUNCTION PROTOTYPES +***************************************************************************/ +rgb_t decode_ui_color(int id, running_machine *machine = nullptr); +int get_font_rows(running_machine *machine = nullptr); + +template <typename Format, typename... Params> +inline void mame_ui_manager::popup_time(int seconds, Format &&fmt, Params &&... args) +{ + // extract the text + popup_time_string(seconds, string_format(std::forward<Format>(fmt), std::forward<Params>(args)...)); +} + +#endif /* __USRINTRF_H__ */ |