summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Jürgen Buchmüller <pullmoll@t-online.de>2014-01-17 03:09:23 +0000
committer Jürgen Buchmüller <pullmoll@t-online.de>2014-01-17 03:09:23 +0000
commit432a2d29f347befa7af9ddbb9fd61edd9c160e5a (patch)
treed3ad66e3df165ac08959f655327be97e7ed729db
parentf7d6b5d7216e950c919183387e6f38d2f63cc4fe (diff)
Renamed uimenu.? ==> ui/menu.?, uimain.? ==>
mainmenu.?/miscmenu.?/selgame.?
-rw-r--r--.gitattributes12
-rw-r--r--src/emu/drivers/empty.c2
-rw-r--r--src/emu/emu.h2
-rw-r--r--src/emu/emu.mak7
-rw-r--r--src/emu/machine.c2
-rw-r--r--src/emu/softlist.h2
-rw-r--r--src/emu/ui.c3
-rw-r--r--src/emu/ui/mainmenu.c241
-rw-r--r--src/emu/ui/mainmenu.h54
-rw-r--r--src/emu/ui/menu.c (renamed from src/emu/uimenu.c)5
-rw-r--r--src/emu/ui/menu.h (renamed from src/emu/uimenu.h)8
-rw-r--r--src/emu/ui/miscmenu.c (renamed from src/emu/uimain.c)594
-rw-r--r--src/emu/ui/miscmenu.h (renamed from src/emu/uimain.h)66
-rw-r--r--src/emu/ui/selgame.c407
-rw-r--r--src/emu/ui/selgame.h44
15 files changed, 778 insertions, 671 deletions
diff --git a/.gitattributes b/.gitattributes
index 1bb8d307039..f5241b65548 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2505,16 +2505,20 @@ src/emu/timer.c svneol=native#text/plain
src/emu/timer.h svneol=native#text/plain
src/emu/ui.c svneol=native#text/plain
src/emu/ui.h svneol=native#text/plain
+src/emu/ui/mainmenu.c svneol=native#text/plain
+src/emu/ui/mainmenu.h svneol=native#text/plain
+src/emu/ui/menu.c svneol=native#text/plain
+src/emu/ui/menu.h svneol=native#text/plain
+src/emu/ui/miscmenu.c svneol=native#text/plain
+src/emu/ui/miscmenu.h svneol=native#text/plain
+src/emu/ui/selgame.c svneol=native#text/plain
+src/emu/ui/selgame.h svneol=native#text/plain
src/emu/uigfx.c svneol=native#text/plain
src/emu/uigfx.h svneol=native#text/plain
src/emu/uiimage.c svneol=native#text/plain
src/emu/uiimage.h svneol=native#text/plain
src/emu/uiinput.c svneol=native#text/plain
src/emu/uiinput.h svneol=native#text/plain
-src/emu/uimain.c svneol=native#text/plain
-src/emu/uimain.h svneol=native#text/plain
-src/emu/uimenu.c svneol=native#text/plain
-src/emu/uimenu.h svneol=native#text/plain
src/emu/uismall.png -text svneol=unset#image/png
src/emu/uiswlist.c svneol=native#text/plain
src/emu/uiswlist.h svneol=native#text/plain
diff --git a/src/emu/drivers/empty.c b/src/emu/drivers/empty.c
index ef36e759e01..e256b2f240e 100644
--- a/src/emu/drivers/empty.c
+++ b/src/emu/drivers/empty.c
@@ -10,7 +10,7 @@
#include "emu.h"
#include "render.h"
-#include "uimain.h"
+#include "ui/selgame.h"
//**************************************************************************
diff --git a/src/emu/emu.h b/src/emu/emu.h
index 775929b000a..425613dd547 100644
--- a/src/emu/emu.h
+++ b/src/emu/emu.h
@@ -57,7 +57,7 @@ typedef device_t * (*machine_config_constructor)(machine_config &config, device_
#include "output.h"
// diimage requires uimenu
-#include "uimenu.h"
+#include "ui/menu.h"
// devices and callbacks
#include "device.h"
diff --git a/src/emu/emu.mak b/src/emu/emu.mak
index f7fe1f269b4..880470cb740 100644
--- a/src/emu/emu.mak
+++ b/src/emu/emu.mak
@@ -63,6 +63,7 @@ OBJDIRS += \
$(EMUOBJ)/machine \
$(EMUOBJ)/layout \
$(EMUOBJ)/imagedev \
+ $(EMUOBJ)/ui \
$(EMUOBJ)/video \
OSDSRC = $(SRC)/osd
@@ -145,8 +146,10 @@ EMUOBJS = \
$(EMUOBJ)/uiimage.o \
$(EMUOBJ)/uiinput.o \
$(EMUOBJ)/uiswlist.o \
- $(EMUOBJ)/uimain.o \
- $(EMUOBJ)/uimenu.o \
+ $(EMUOBJ)/ui/menu.o \
+ $(EMUOBJ)/ui/mainmenu.o \
+ $(EMUOBJ)/ui/miscmenu.o \
+ $(EMUOBJ)/ui/selgame.o \
$(EMUOBJ)/validity.o \
$(EMUOBJ)/video.o \
$(EMUOBJ)/debug/debugcmd.o \
diff --git a/src/emu/machine.c b/src/emu/machine.c
index 0d9acf9bc1e..c7054ccdcb5 100644
--- a/src/emu/machine.c
+++ b/src/emu/machine.c
@@ -75,7 +75,7 @@
#include "debugger.h"
#include "render.h"
#include "cheat.h"
-#include "uimain.h"
+#include "ui/selgame.h"
#include "uiinput.h"
#include "crsshair.h"
#include "validity.h"
diff --git a/src/emu/softlist.h b/src/emu/softlist.h
index ae6626b73ee..c0d48b6ac88 100644
--- a/src/emu/softlist.h
+++ b/src/emu/softlist.h
@@ -9,7 +9,7 @@
#ifndef __SOFTLIST_H_
#define __SOFTLIST_H_
-#include "uimenu.h"
+#include "ui/menu.h"
#include "expat.h"
#include "pool.h"
diff --git a/src/emu/ui.c b/src/emu/ui.c
index 7ffcf7311c6..7c8ec70c2cc 100644
--- a/src/emu/ui.c
+++ b/src/emu/ui.c
@@ -18,7 +18,8 @@
#include "rendfont.h"
#include "ui.h"
#include "uiinput.h"
-#include "uimain.h"
+#include "ui/mainmenu.h"
+#include "ui/miscmenu.h"
#include "uigfx.h"
#include <ctype.h>
diff --git a/src/emu/ui/mainmenu.c b/src/emu/ui/mainmenu.c
new file mode 100644
index 00000000000..e7c16879b2b
--- /dev/null
+++ b/src/emu/ui/mainmenu.c
@@ -0,0 +1,241 @@
+/*********************************************************************
+
+ ui/mainmenu.c
+
+ Internal MAME menus for the user interface.
+
+ Copyright Nicola Salmoria and the MAME Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#include "emu.h"
+#include "osdnet.h"
+#include "emuopts.h"
+#include "ui.h"
+#include "rendutil.h"
+#include "cheat.h"
+#include "uiimage.h"
+#include "uiinput.h"
+#include "ui/mainmenu.h"
+#include "ui/miscmenu.h"
+#include "ui/selgame.h"
+#include "audit.h"
+#include "crsshair.h"
+#include <ctype.h>
+#include "imagedev/cassette.h"
+#include "imagedev/bitbngr.h"
+
+
+
+/***************************************************************************
+ MENU HANDLERS
+***************************************************************************/
+
+/*-------------------------------------------------
+ ui_menu_main constructor - populate the main menu
+-------------------------------------------------*/
+
+ui_menu_main::ui_menu_main(running_machine &machine, render_container *container) : ui_menu(machine, container)
+{
+}
+
+void ui_menu_main::populate()
+{
+ astring menu_text;
+
+ /* add input menu items */
+ item_append("Input (general)", NULL, 0, (void *)INPUT_GROUPS);
+
+ menu_text.printf("Input (this %s)",emulator_info::get_capstartgamenoun());
+ item_append(menu_text.cstr(), NULL, 0, (void *)INPUT_SPECIFIC);
+
+ /* add optional input-related menus */
+ if (machine().ioport().has_analog())
+ item_append("Analog Controls", NULL, 0, (void *)ANALOG);
+ if (machine().ioport().has_dips())
+ item_append("Dip Switches", NULL, 0, (void *)SETTINGS_DIP_SWITCHES);
+ if (machine().ioport().has_configs())
+ {
+ menu_text.printf("%s Configuration",emulator_info::get_capstartgamenoun());
+ item_append(menu_text.cstr(), NULL, 0, (void *)SETTINGS_DRIVER_CONFIG);
+ }
+
+ /* add bookkeeping menu */
+ item_append("Bookkeeping Info", NULL, 0, (void *)BOOKKEEPING);
+
+ /* add game info menu */
+ menu_text.printf("%s Information",emulator_info::get_capstartgamenoun());
+ item_append(menu_text.cstr(), NULL, 0, (void *)GAME_INFO);
+
+ image_interface_iterator imgiter(machine().root_device());
+ if (imgiter.first() != NULL)
+ {
+ /* add image info menu */
+ item_append("Image Information", NULL, 0, (void *)IMAGE_MENU_IMAGE_INFO);
+
+ /* add file manager menu */
+ item_append("File Manager", NULL, 0, (void *)IMAGE_MENU_FILE_MANAGER);
+
+ /* add tape control menu */
+ cassette_device_iterator cassiter(machine().root_device());
+ if (cassiter.first() != NULL)
+ item_append("Tape Control", NULL, 0, (void *)MESS_MENU_TAPE_CONTROL);
+
+ /* add bitbanger control menu */
+ bitbanger_device_iterator bititer(machine().root_device());
+ if (bititer.first() != NULL)
+ item_append("Bitbanger Control", NULL, 0, (void *)MESS_MENU_BITBANGER_CONTROL);
+ }
+
+ if (machine().ioport().has_bioses())
+ item_append("Bios Selection", NULL, 0, (void *)BIOS_SELECTION);
+
+ slot_interface_iterator slotiter(machine().root_device());
+ if (slotiter.first() != NULL)
+ {
+ /* add slot info menu */
+ item_append("Slot Devices", NULL, 0, (void *)SLOT_DEVICES);
+ }
+
+ network_interface_iterator netiter(machine().root_device());
+ if (netiter.first() != NULL)
+ {
+ /* add image info menu */
+ item_append("Network Devices", NULL, 0, (void*)NETWORK_DEVICES);
+ }
+
+ /* add keyboard mode menu */
+ if (machine().ioport().has_keyboard() && machine().ioport().natkeyboard().can_post())
+ item_append("Keyboard Mode", NULL, 0, (void *)KEYBOARD_MODE);
+
+ /* add sliders menu */
+ item_append("Slider Controls", NULL, 0, (void *)SLIDERS);
+
+ /* add video options menu */
+ item_append("Video Options", NULL, 0, (machine().render().target_by_index(1) != NULL) ? (void *)VIDEO_TARGETS : (void *)VIDEO_OPTIONS);
+
+ /* add crosshair options menu */
+ if (crosshair_get_usage(machine()))
+ item_append("Crosshair Options", NULL, 0, (void *)CROSSHAIR);
+
+ /* add cheat menu */
+ if (machine().options().cheat() && machine().cheat().first() != NULL)
+ item_append("Cheat", NULL, 0, (void *)CHEAT);
+
+ /* add memory card menu */
+ if (machine().config().m_memcard_handler != NULL)
+ item_append("Memory Card", NULL, 0, (void *)MEMORY_CARD);
+
+ /* add reset and exit menus */
+ menu_text.printf("Select New %s",emulator_info::get_capstartgamenoun());
+ item_append(menu_text.cstr(), NULL, 0, (void *)SELECT_GAME);
+}
+
+ui_menu_main::~ui_menu_main()
+{
+}
+
+/*-------------------------------------------------
+ menu_main - handle the main menu
+-------------------------------------------------*/
+
+void ui_menu_main::handle()
+{
+ /* process the menu */
+ const ui_menu_event *menu_event = process(0);
+ if (menu_event != NULL && menu_event->iptkey == IPT_UI_SELECT) {
+ switch((long long)(menu_event->itemref)) {
+ case INPUT_GROUPS:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_groups(machine(), container)));
+ break;
+
+ case INPUT_SPECIFIC:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_specific(machine(), container)));
+ break;
+
+ case SETTINGS_DIP_SWITCHES:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_settings_dip_switches(machine(), container)));
+ break;
+
+ case SETTINGS_DRIVER_CONFIG:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_settings_driver_config(machine(), container)));
+ break;
+
+ case ANALOG:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_analog(machine(), container)));
+ break;
+
+ case BOOKKEEPING:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_bookkeeping(machine(), container)));
+ break;
+
+ case GAME_INFO:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_game_info(machine(), container)));
+ break;
+
+ case IMAGE_MENU_IMAGE_INFO:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_image_info(machine(), container)));
+ break;
+
+ case IMAGE_MENU_FILE_MANAGER:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_file_manager(machine(), container)));
+ break;
+
+ case MESS_MENU_TAPE_CONTROL:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_mess_tape_control(machine(), container)));
+ break;
+
+ case MESS_MENU_BITBANGER_CONTROL:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_mess_bitbanger_control(machine(), container)));
+ break;
+
+ case SLOT_DEVICES:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_slot_devices(machine(), container)));
+ break;
+
+ case NETWORK_DEVICES:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_network_devices(machine(), container)));
+ break;
+
+ case KEYBOARD_MODE:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_keyboard_mode(machine(), container)));
+ break;
+
+ case SLIDERS:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_sliders(machine(), container, false)));
+ break;
+
+ case VIDEO_TARGETS:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_video_targets(machine(), container)));
+ break;
+
+ case VIDEO_OPTIONS:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_video_options(machine(), container, machine().render().first_target())));
+ break;
+
+ case CROSSHAIR:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_crosshair(machine(), container)));
+ break;
+
+ case CHEAT:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_cheat(machine(), container)));
+ break;
+
+ case MEMORY_CARD:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_memory_card(machine(), container)));
+ break;
+
+ case SELECT_GAME:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_select_game(machine(), container, 0)));
+ break;
+
+ case BIOS_SELECTION:
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_bios_selection(machine(), container)));
+ break;
+
+ default:
+ fatalerror("ui_menu_main::handle - unknown reference\n");
+ }
+ }
+}
diff --git a/src/emu/ui/mainmenu.h b/src/emu/ui/mainmenu.h
new file mode 100644
index 00000000000..f92a0ccfe02
--- /dev/null
+++ b/src/emu/ui/mainmenu.h
@@ -0,0 +1,54 @@
+/***************************************************************************
+
+ ui/mainmenu.h
+
+ Internal MAME menus for the user interface.
+
+ Copyright Nicola Salmoria and the MAME Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __UI_MAINMENU_H__
+#define __UI_MAINMENU_H__
+
+#include "crsshair.h"
+#include "drivenum.h"
+
+class ui_menu_main : public ui_menu {
+public:
+ ui_menu_main(running_machine &machine, render_container *container);
+ virtual ~ui_menu_main();
+ virtual void populate();
+ virtual void handle();
+
+private:
+ enum {
+ INPUT_GROUPS,
+ INPUT_SPECIFIC,
+ SETTINGS_DIP_SWITCHES,
+ SETTINGS_DRIVER_CONFIG,
+ ANALOG,
+ BOOKKEEPING,
+ GAME_INFO,
+ IMAGE_MENU_IMAGE_INFO,
+ IMAGE_MENU_FILE_MANAGER,
+ MESS_MENU_TAPE_CONTROL,
+ MESS_MENU_BITBANGER_CONTROL,
+ SLOT_DEVICES,
+ NETWORK_DEVICES,
+ KEYBOARD_MODE,
+ SLIDERS,
+ VIDEO_TARGETS,
+ VIDEO_OPTIONS,
+ CROSSHAIR,
+ CHEAT,
+ MEMORY_CARD,
+ SELECT_GAME,
+ BIOS_SELECTION,
+ };
+};
+
+#endif /* __UI_MAINMENU_H__ */
diff --git a/src/emu/uimenu.c b/src/emu/ui/menu.c
index ae4de629314..88dbac4713f 100644
--- a/src/emu/uimenu.c
+++ b/src/emu/ui/menu.c
@@ -1,6 +1,6 @@
/*********************************************************************
- uimenu.c
+ ui/menu.c
Internal MAME menus for the user interface.
@@ -15,7 +15,8 @@
#include "rendutil.h"
#include "uiinput.h"
#include "cheat.h"
-#include "uimain.h"
+#include "ui/mainmenu.h"
+#include "ui/miscmenu.h"
#include <ctype.h>
diff --git a/src/emu/uimenu.h b/src/emu/ui/menu.h
index 76654c17d41..3e5d6b74930 100644
--- a/src/emu/uimenu.h
+++ b/src/emu/ui/menu.h
@@ -1,6 +1,6 @@
/***************************************************************************
- uimenu.h
+ ui/menu.h
Internal MAME menus for the user interface.
@@ -11,8 +11,8 @@
#pragma once
-#ifndef __UIMENU_H__
-#define __UIMENU_H__
+#ifndef __UI_MENU_H__
+#define __UI_MENU_H__
#include "render.h"
@@ -183,4 +183,4 @@ private:
static void render_triangle(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param);
};
-#endif /* __UIMENU_H__ */
+#endif /* __UI_MENU_H__ */
diff --git a/src/emu/uimain.c b/src/emu/ui/miscmenu.c
index 82033ae1232..947db37f1ae 100644
--- a/src/emu/uimain.c
+++ b/src/emu/ui/miscmenu.c
@@ -1,6 +1,6 @@
/*********************************************************************
- uimenu.c
+ miscmenu.c
Internal MAME menus for the user interface.
@@ -17,7 +17,7 @@
#include "cheat.h"
#include "uiimage.h"
#include "uiinput.h"
-#include "uimain.h"
+#include "ui/miscmenu.h"
#include "audit.h"
#include "crsshair.h"
#include <ctype.h>
@@ -69,246 +69,11 @@ UINT32 ui_menu_sliders::ui_handler(running_machine &machine, render_container *c
}
-/*-------------------------------------------------
- force_game_select - force the game
- select menu to be visible and inescapable
--------------------------------------------------*/
-
-void ui_menu_select_game::force_game_select(running_machine &machine, render_container *container)
-{
- char *gamename = (char *)machine.options().system_name();
-
- /* reset the menu stack */
- ui_menu::stack_reset(machine);
-
- /* add the quit entry followed by the game select entry */
- ui_menu *quit = auto_alloc_clear(machine, ui_menu_quit_game(machine, container));
- quit->set_special_main_menu(true);
- ui_menu::stack_push(quit);
- ui_menu::stack_push(auto_alloc_clear(machine, ui_menu_select_game(machine, container, gamename)));
-
- /* force the menus on */
- ui_show_menu();
-
- /* make sure MAME is paused */
- machine.pause();
-}
-
-
/***************************************************************************
MENU HANDLERS
***************************************************************************/
/*-------------------------------------------------
- ui_menu_main constructor - populate the main menu
--------------------------------------------------*/
-
-ui_menu_main::ui_menu_main(running_machine &machine, render_container *container) : ui_menu(machine, container)
-{
-}
-
-void ui_menu_main::populate()
-{
- astring menu_text;
-
- /* add input menu items */
- item_append("Input (general)", NULL, 0, (void *)INPUT_GROUPS);
-
- menu_text.printf("Input (this %s)",emulator_info::get_capstartgamenoun());
- item_append(menu_text.cstr(), NULL, 0, (void *)INPUT_SPECIFIC);
-
- /* add optional input-related menus */
- if (machine().ioport().has_analog())
- item_append("Analog Controls", NULL, 0, (void *)ANALOG);
- if (machine().ioport().has_dips())
- item_append("Dip Switches", NULL, 0, (void *)SETTINGS_DIP_SWITCHES);
- if (machine().ioport().has_configs())
- {
- menu_text.printf("%s Configuration",emulator_info::get_capstartgamenoun());
- item_append(menu_text.cstr(), NULL, 0, (void *)SETTINGS_DRIVER_CONFIG);
- }
-
- /* add bookkeeping menu */
- item_append("Bookkeeping Info", NULL, 0, (void *)BOOKKEEPING);
-
- /* add game info menu */
- menu_text.printf("%s Information",emulator_info::get_capstartgamenoun());
- item_append(menu_text.cstr(), NULL, 0, (void *)GAME_INFO);
-
- image_interface_iterator imgiter(machine().root_device());
- if (imgiter.first() != NULL)
- {
- /* add image info menu */
- item_append("Image Information", NULL, 0, (void *)IMAGE_MENU_IMAGE_INFO);
-
- /* add file manager menu */
- item_append("File Manager", NULL, 0, (void *)IMAGE_MENU_FILE_MANAGER);
-
- /* add tape control menu */
- cassette_device_iterator cassiter(machine().root_device());
- if (cassiter.first() != NULL)
- item_append("Tape Control", NULL, 0, (void *)MESS_MENU_TAPE_CONTROL);
-
- /* add bitbanger control menu */
- bitbanger_device_iterator bititer(machine().root_device());
- if (bititer.first() != NULL)
- item_append("Bitbanger Control", NULL, 0, (void *)MESS_MENU_BITBANGER_CONTROL);
- }
-
- if (machine().ioport().has_bioses())
- item_append("Bios Selection", NULL, 0, (void *)BIOS_SELECTION);
-
- slot_interface_iterator slotiter(machine().root_device());
- if (slotiter.first() != NULL)
- {
- /* add slot info menu */
- item_append("Slot Devices", NULL, 0, (void *)SLOT_DEVICES);
- }
-
- network_interface_iterator netiter(machine().root_device());
- if (netiter.first() != NULL)
- {
- /* add image info menu */
- item_append("Network Devices", NULL, 0, (void*)NETWORK_DEVICES);
- }
-
- /* add keyboard mode menu */
- if (machine().ioport().has_keyboard() && machine().ioport().natkeyboard().can_post())
- item_append("Keyboard Mode", NULL, 0, (void *)KEYBOARD_MODE);
-
- /* add sliders menu */
- item_append("Slider Controls", NULL, 0, (void *)SLIDERS);
-
- /* add video options menu */
- item_append("Video Options", NULL, 0, (machine().render().target_by_index(1) != NULL) ? (void *)VIDEO_TARGETS : (void *)VIDEO_OPTIONS);
-
- /* add crosshair options menu */
- if (crosshair_get_usage(machine()))
- item_append("Crosshair Options", NULL, 0, (void *)CROSSHAIR);
-
- /* add cheat menu */
- if (machine().options().cheat() && machine().cheat().first() != NULL)
- item_append("Cheat", NULL, 0, (void *)CHEAT);
-
- /* add memory card menu */
- if (machine().config().m_memcard_handler != NULL)
- item_append("Memory Card", NULL, 0, (void *)MEMORY_CARD);
-
- /* add reset and exit menus */
- menu_text.printf("Select New %s",emulator_info::get_capstartgamenoun());
- item_append(menu_text.cstr(), NULL, 0, (void *)SELECT_GAME);
-}
-
-ui_menu_main::~ui_menu_main()
-{
-}
-
-/*-------------------------------------------------
- menu_main - handle the main menu
--------------------------------------------------*/
-
-void ui_menu_main::handle()
-{
- /* process the menu */
- const ui_menu_event *menu_event = process(0);
- if (menu_event != NULL && menu_event->iptkey == IPT_UI_SELECT) {
- switch((long long)(menu_event->itemref)) {
- case INPUT_GROUPS:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_groups(machine(), container)));
- break;
-
- case INPUT_SPECIFIC:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_specific(machine(), container)));
- break;
-
- case SETTINGS_DIP_SWITCHES:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_settings_dip_switches(machine(), container)));
- break;
-
- case SETTINGS_DRIVER_CONFIG:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_settings_driver_config(machine(), container)));
- break;
-
- case ANALOG:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_analog(machine(), container)));
- break;
-
- case BOOKKEEPING:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_bookkeeping(machine(), container)));
- break;
-
- case GAME_INFO:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_game_info(machine(), container)));
- break;
-
- case IMAGE_MENU_IMAGE_INFO:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_image_info(machine(), container)));
- break;
-
- case IMAGE_MENU_FILE_MANAGER:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_file_manager(machine(), container)));
- break;
-
- case MESS_MENU_TAPE_CONTROL:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_mess_tape_control(machine(), container)));
- break;
-
- case MESS_MENU_BITBANGER_CONTROL:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_mess_bitbanger_control(machine(), container)));
- break;
-
- case SLOT_DEVICES:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_slot_devices(machine(), container)));
- break;
-
- case NETWORK_DEVICES:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_network_devices(machine(), container)));
- break;
-
- case KEYBOARD_MODE:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_keyboard_mode(machine(), container)));
- break;
-
- case SLIDERS:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_sliders(machine(), container, false)));
- break;
-
- case VIDEO_TARGETS:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_video_targets(machine(), container)));
- break;
-
- case VIDEO_OPTIONS:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_video_options(machine(), container, machine().render().first_target())));
- break;
-
- case CROSSHAIR:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_crosshair(machine(), container)));
- break;
-
- case CHEAT:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_cheat(machine(), container)));
- break;
-
- case MEMORY_CARD:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_memory_card(machine(), container)));
- break;
-
- case SELECT_GAME:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_select_game(machine(), container, 0)));
- break;
-
- case BIOS_SELECTION:
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_bios_selection(machine(), container)));
- break;
-
- default:
- fatalerror("ui_menu_main::handle - unknown reference\n");
- }
- }
-}
-
-
-/*-------------------------------------------------
ui_menu_keyboard_mode - menu that
-------------------------------------------------*/
@@ -2538,358 +2303,3 @@ void ui_menu_quit_game::handle()
/* reset the menu stack */
ui_menu::stack_reset(machine());
}
-
-
-/*-------------------------------------------------
- menu_select_game - handle the game select
- menu
--------------------------------------------------*/
-
-void ui_menu_select_game::handle()
-{
- /* ignore pause keys by swallowing them before we process the menu */
- ui_input_pressed(machine(), IPT_UI_PAUSE);
-
- /* process the menu */
- const ui_menu_event *menu_event = process(0);
- if (menu_event != NULL && menu_event->itemref != NULL)
- {
- /* reset the error on any future menu_event */
- if (error)
- error = false;
-
- /* handle selections */
- else if (menu_event->iptkey == IPT_UI_SELECT)
- {
- const game_driver *driver = (const game_driver *)menu_event->itemref;
-
- /* special case for configure inputs */
- if ((FPTR)driver == 1)
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_groups(machine(), container)));
-
- /* anything else is a driver */
- else
- {
- // audit the game first to see if we're going to work
- driver_enumerator enumerator(machine().options(), *driver);
- enumerator.next();
- media_auditor auditor(enumerator);
- media_auditor::summary summary = auditor.audit_media(AUDIT_VALIDATE_FAST);
-
- // if everything looks good, schedule the new driver
- if (summary == media_auditor::CORRECT || summary == media_auditor::BEST_AVAILABLE)
- {
- machine().schedule_new_driver(*driver);
- ui_menu::stack_reset(machine());
- }
-
- // otherwise, display an error
- else
- {
- reset(UI_MENU_RESET_REMEMBER_REF);
- error = true;
- }
- }
- }
-
- /* escape pressed with non-empty text clears the text */
- else if (menu_event->iptkey == IPT_UI_CANCEL && search[0] != 0)
- {
- /* since we have already been popped, we must recreate ourself from scratch */
- ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_select_game(machine(), container, NULL)));
- }
-
- /* typed characters append to the buffer */
- else if (menu_event->iptkey == IPT_SPECIAL)
- {
- int buflen = strlen(search);
-
- /* if it's a backspace and we can handle it, do so */
- if ((menu_event->unichar == 8 || menu_event->unichar == 0x7f) && buflen > 0)
- {
- *(char *)utf8_previous_char(&search[buflen]) = 0;
- rerandomize = true;
- reset(UI_MENU_RESET_SELECT_FIRST);
- }
-
- /* if it's any other key and we're not maxed out, update */
- else if (menu_event->unichar >= ' ' && menu_event->unichar < 0x7f)
- {
- buflen += utf8_from_uchar(&search[buflen], ARRAY_LENGTH(search) - buflen, menu_event->unichar);
- search[buflen] = 0;
- reset(UI_MENU_RESET_SELECT_FIRST);
- }
- }
- }
-
- /* if we're in an error state, overlay an error message */
- if (error)
- ui_draw_text_box(container,
- "The selected game is missing one or more required ROM or CHD images. "
- "Please select a different game.\n\nPress any key to continue.",
- JUSTIFY_CENTER, 0.5f, 0.5f, UI_RED_COLOR);
-}
-
-
-/*-------------------------------------------------
- menu_select_game_populate - populate the game
- select menu
--------------------------------------------------*/
-ui_menu_select_game::ui_menu_select_game(running_machine &machine, render_container *container, const char *gamename) : ui_menu(machine, container)
-{
- driverlist = global_alloc_array(const game_driver *, driver_list::total()+1);
- build_driver_list();
- if(gamename)
- strcpy(search, gamename);
- matchlist[0] = -1;
-}
-
-void ui_menu_select_game::populate()
-{
- int matchcount;
- int curitem;
-
- for (curitem = matchcount = 0; driverlist[curitem] != NULL && matchcount < VISIBLE_GAMES_IN_LIST; curitem++)
- if (!(driverlist[curitem]->flags & GAME_NO_STANDALONE))
- matchcount++;
-
- /* if nothing there, add a single multiline item and return */
- if (matchcount == 0)
- {
- astring txt;
- txt.printf("No %s found. Please check the rompath specified in the %s.ini file.\n\n"
- "If this is your first time using %s, please see the config.txt file in "
- "the docs directory for information on configuring %s.",
- emulator_info::get_gamesnoun(),
- emulator_info::get_configname(),
- emulator_info::get_appname(),emulator_info::get_appname() );
- item_append(txt.cstr(), NULL, MENU_FLAG_MULTILINE | MENU_FLAG_REDTEXT, NULL);
- return;
- }
-
- /* otherwise, rebuild the match list */
- assert(drivlist != NULL);
- if (search[0] != 0 || matchlist[0] == -1 || rerandomize)
- drivlist->find_approximate_matches(search, matchcount, matchlist);
- rerandomize = false;
-
- /* iterate over entries */
- for (curitem = 0; curitem < matchcount; curitem++)
- {
- int curmatch = matchlist[curitem];
- if (curmatch != -1)
- {
- int cloneof = drivlist->non_bios_clone(curmatch);
- item_append(drivlist->driver(curmatch).name, drivlist->driver(curmatch).description, (cloneof == -1) ? 0 : MENU_FLAG_INVERT, (void *)&drivlist->driver(curmatch));
- }
- }
-
- /* if we're forced into this, allow general input configuration as well */
- if (ui_menu::stack_has_special_main_menu())
- {
- item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL);
- item_append("Configure General Inputs", NULL, 0, (void *)1);
- }
-
- /* configure the custom rendering */
- customtop = ui_get_line_height(machine()) + 3.0f * UI_BOX_TB_BORDER;
- custombottom = 4.0f * ui_get_line_height(machine()) + 3.0f * UI_BOX_TB_BORDER;
-}
-
-ui_menu_select_game::~ui_menu_select_game()
-{
- global_free(drivlist);
- global_free(driverlist);
-}
-
-/*-------------------------------------------------
- menu_select_game_build_driver_list - build a
- list of available drivers
--------------------------------------------------*/
-
-void ui_menu_select_game::build_driver_list()
-{
- // start with an empty list
- drivlist = global_alloc(driver_enumerator(machine().options()));
- drivlist->exclude_all();
-
- /* open a path to the ROMs and find them in the array */
- file_enumerator path(machine().options().media_path());
- const osd_directory_entry *dir;
-
- /* iterate while we get new objects */
- while ((dir = path.next()) != NULL)
- {
- char drivername[50];
- char *dst = drivername;
- const char *src;
-
- /* build a name for it */
- for (src = dir->name; *src != 0 && *src != '.' && dst < &drivername[ARRAY_LENGTH(drivername) - 1]; src++)
- *dst++ = tolower((UINT8)*src);
- *dst = 0;
-
- int drivnum = drivlist->find(drivername);
- if (drivnum != -1)
- drivlist->include(drivnum);
- }
-
- /* now build the final list */
- drivlist->reset();
- int listnum = 0;
- while (drivlist->next())
- driverlist[listnum++] = &drivlist->driver();
-
- /* NULL-terminate */
- driverlist[listnum] = NULL;
-}
-
-
-/*-------------------------------------------------
- menu_select_game_custom_render - perform our
- special rendering
--------------------------------------------------*/
-
-void ui_menu_select_game::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2)
-{
- const game_driver *driver;
- float width, maxwidth;
- float x1, y1, x2, y2;
- astring tempbuf[5];
- rgb_t color;
- int line;
-
- /* display the current typeahead */
- if (search[0] != 0)
- tempbuf[0].printf("Type name or select: %s_", search);
- else
- tempbuf[0].printf("Type name or select: (random)");
-
- /* get the size of the text */
- ui_draw_text_full(container, tempbuf[0], 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE,
- DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, NULL);
- width += 2 * UI_BOX_LR_BORDER;
- maxwidth = MAX(width, origx2 - origx1);
-
- /* compute our bounds */
- x1 = 0.5f - 0.5f * maxwidth;
- x2 = x1 + maxwidth;
- y1 = origy1 - top;
- y2 = origy1 - UI_BOX_TB_BORDER;
-
- /* draw a box */
- ui_draw_outlined_box(container, x1, y1, x2, y2, UI_BACKGROUND_COLOR);
-
- /* take off the borders */
- x1 += UI_BOX_LR_BORDER;
- x2 -= UI_BOX_LR_BORDER;
- y1 += UI_BOX_TB_BORDER;
- y2 -= UI_BOX_TB_BORDER;
-
- /* draw the text within it */
- ui_draw_text_full(container, tempbuf[0], x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE,
- DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL);
-
- /* determine the text to render below */
- driver = ((FPTR)selectedref > 1) ? (const game_driver *)selectedref : NULL;
- if ((FPTR)driver > 1)
- {
- const char *gfxstat, *soundstat;
-
- /* first line is game name */
- tempbuf[0].printf("%-.100s", driver->description);
-
- /* next line is year, manufacturer */
- tempbuf[1].printf("%s, %-.100s", driver->year, driver->manufacturer);
-
- /* next line source path */
- tempbuf[2].printf("Driver: %-.100s", core_filename_extract_base(tempbuf[3], driver->source_file).cstr());
-
- /* next line is overall driver status */
- if (driver->flags & GAME_NOT_WORKING)
- tempbuf[3].cpy("Overall: NOT WORKING");
- else if (driver->flags & GAME_UNEMULATED_PROTECTION)
- tempbuf[3].cpy("Overall: Unemulated Protection");
- else
- tempbuf[3].cpy("Overall: Working");
-
- /* next line is graphics, sound status */
- if (driver->flags & (GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS | GAME_IMPERFECT_COLORS))
- gfxstat = "Imperfect";
- else
- gfxstat = "OK";
-
- if (driver->flags & GAME_NO_SOUND)
- soundstat = "Unimplemented";
- else if (driver->flags & GAME_IMPERFECT_SOUND)
- soundstat = "Imperfect";
- else
- soundstat = "OK";
-
- tempbuf[4].printf("Gfx: %s, Sound: %s", gfxstat, soundstat);
- }
- else
- {
- const char *s = emulator_info::get_copyright();
- line = 0;
-
- /* first line is version string */
- tempbuf[line++].printf("%s %s", emulator_info::get_applongname(), build_version);
-
- /* output message */
- while (line < ARRAY_LENGTH(tempbuf))
- {
- if (!(*s == 0 || *s == '\n'))
- tempbuf[line].cat(*s);
-
- if (*s == '\n')
- {
- line++;
- s++;
- } else if (*s != 0)
- s++;
- else
- line++;
- }
- }
-
- /* get the size of the text */
- maxwidth = origx2 - origx1;
- for (line = 0; line < 4; line++)
- {
- ui_draw_text_full(container, tempbuf[line], 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE,
- DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, NULL);
- width += 2 * UI_BOX_LR_BORDER;
- maxwidth = MAX(maxwidth, width);
- }
-
- /* compute our bounds */
- x1 = 0.5f - 0.5f * maxwidth;
- x2 = x1 + maxwidth;
- y1 = origy2 + UI_BOX_TB_BORDER;
- y2 = origy2 + bottom;
-
- /* draw a box */
- color = UI_BACKGROUND_COLOR;
- if (driver != NULL)
- color = UI_GREEN_COLOR;
- if (driver != NULL && (driver->flags & (GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS | GAME_IMPERFECT_COLORS | GAME_NO_SOUND | GAME_IMPERFECT_SOUND)) != 0)
- color = UI_YELLOW_COLOR;
- if (driver != NULL && (driver->flags & (GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION)) != 0)
- color = UI_RED_COLOR;
- ui_draw_outlined_box(container, x1, y1, x2, y2, color);
-
- /* take off the borders */
- x1 += UI_BOX_LR_BORDER;
- x2 -= UI_BOX_LR_BORDER;
- y1 += UI_BOX_TB_BORDER;
- y2 -= UI_BOX_TB_BORDER;
-
- /* draw all lines */
- for (line = 0; line < 4; line++)
- {
- ui_draw_text_full(container, tempbuf[line], x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE,
- DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL);
- y1 += ui_get_line_height(machine());
- }
-}
diff --git a/src/emu/uimain.h b/src/emu/ui/miscmenu.h
index 0f1b2a7f64e..668ccfdb2bf 100644
--- a/src/emu/uimain.h
+++ b/src/emu/ui/miscmenu.h
@@ -1,6 +1,6 @@
/***************************************************************************
- uimain.h
+ ui/miscmenu.h
Internal MAME menus for the user interface.
@@ -11,46 +11,12 @@
#pragma once
-#ifndef __UIMAIN_H__
-#define __UIMAIN_H__
+#ifndef __UI_MISCMENU_H__
+#define __UI_MISCMENU_H__
#include "crsshair.h"
#include "drivenum.h"
-class ui_menu_main : public ui_menu {
-public:
- ui_menu_main(running_machine &machine, render_container *container);
- virtual ~ui_menu_main();
- virtual void populate();
- virtual void handle();
-
-private:
- enum {
- INPUT_GROUPS,
- INPUT_SPECIFIC,
- SETTINGS_DIP_SWITCHES,
- SETTINGS_DRIVER_CONFIG,
- ANALOG,
- BOOKKEEPING,
- GAME_INFO,
- IMAGE_MENU_IMAGE_INFO,
- IMAGE_MENU_FILE_MANAGER,
- MESS_MENU_TAPE_CONTROL,
- MESS_MENU_BITBANGER_CONTROL,
- SLOT_DEVICES,
- NETWORK_DEVICES,
- KEYBOARD_MODE,
- SLIDERS,
- VIDEO_TARGETS,
- VIDEO_OPTIONS,
- CROSSHAIR,
- CHEAT,
- MEMORY_CARD,
- SELECT_GAME,
- BIOS_SELECTION,
- };
-};
-
class ui_menu_keyboard_mode : public ui_menu {
public:
ui_menu_keyboard_mode(running_machine &machine, render_container *container);
@@ -344,30 +310,6 @@ public:
virtual void handle();
};
-class ui_menu_select_game : public ui_menu {
-public:
- ui_menu_select_game(running_machine &machine, render_container *container, const char *gamename);
- virtual ~ui_menu_select_game();
- virtual void populate();
- virtual void handle();
- virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2);
-
- // force game select menu
- static void force_game_select(running_machine &machine, render_container *container);
-
-private:
- enum { VISIBLE_GAMES_IN_LIST = 15 };
- UINT8 error;
- UINT8 rerandomize;
- char search[40];
- int matchlist[VISIBLE_GAMES_IN_LIST];
- const game_driver **driverlist;
-
- driver_enumerator *drivlist;
-
- void build_driver_list();
-};
-
class ui_menu_bios_selection : public ui_menu {
public:
ui_menu_bios_selection(running_machine &machine, render_container *container);
@@ -378,4 +320,4 @@ public:
private:
};
-#endif /* __UIMAIN_H__ */
+#endif /* __UI_MISCMENU_H__ */
diff --git a/src/emu/ui/selgame.c b/src/emu/ui/selgame.c
new file mode 100644
index 00000000000..571349a11e9
--- /dev/null
+++ b/src/emu/ui/selgame.c
@@ -0,0 +1,407 @@
+/*********************************************************************
+
+ selgame.c
+
+ Internal MAME menus for the user interface.
+
+ Copyright Nicola Salmoria and the MAME Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#include "emu.h"
+#include "osdnet.h"
+#include "emuopts.h"
+#include "ui.h"
+#include "rendutil.h"
+#include "cheat.h"
+#include "uiimage.h"
+#include "uiinput.h"
+#include "ui/selgame.h"
+#include "ui/miscmenu.h"
+#include "audit.h"
+#include "crsshair.h"
+#include <ctype.h>
+
+
+/*-------------------------------------------------
+ menu_select_game - handle the game select
+ menu
+-------------------------------------------------*/
+
+void ui_menu_select_game::handle()
+{
+ /* ignore pause keys by swallowing them before we process the menu */
+ ui_input_pressed(machine(), IPT_UI_PAUSE);
+
+ /* process the menu */
+ const ui_menu_event *menu_event = process(0);
+ if (menu_event != NULL && menu_event->itemref != NULL)
+ {
+ /* reset the error on any future menu_event */
+ if (error)
+ error = false;
+
+ /* handle selections */
+ else if (menu_event->iptkey == IPT_UI_SELECT)
+ {
+ const game_driver *driver = (const game_driver *)menu_event->itemref;
+
+ /* special case for configure inputs */
+ if ((FPTR)driver == 1)
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_groups(machine(), container)));
+
+ /* anything else is a driver */
+ else
+ {
+ // audit the game first to see if we're going to work
+ driver_enumerator enumerator(machine().options(), *driver);
+ enumerator.next();
+ media_auditor auditor(enumerator);
+ media_auditor::summary summary = auditor.audit_media(AUDIT_VALIDATE_FAST);
+
+ // if everything looks good, schedule the new driver
+ if (summary == media_auditor::CORRECT || summary == media_auditor::BEST_AVAILABLE)
+ {
+ machine().schedule_new_driver(*driver);
+ ui_menu::stack_reset(machine());
+ }
+
+ // otherwise, display an error
+ else
+ {
+ reset(UI_MENU_RESET_REMEMBER_REF);
+ error = true;
+ }
+ }
+ }
+
+ /* escape pressed with non-empty text clears the text */
+ else if (menu_event->iptkey == IPT_UI_CANCEL && search[0] != 0)
+ {
+ /* since we have already been popped, we must recreate ourself from scratch */
+ ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_select_game(machine(), container, NULL)));
+ }
+
+ /* typed characters append to the buffer */
+ else if (menu_event->iptkey == IPT_SPECIAL)
+ {
+ int buflen = strlen(search);
+
+ /* if it's a backspace and we can handle it, do so */
+ if ((menu_event->unichar == 8 || menu_event->unichar == 0x7f) && buflen > 0)
+ {
+ *(char *)utf8_previous_char(&search[buflen]) = 0;
+ rerandomize = true;
+ reset(UI_MENU_RESET_SELECT_FIRST);
+ }
+
+ /* if it's any other key and we're not maxed out, update */
+ else if (menu_event->unichar >= ' ' && menu_event->unichar < 0x7f)
+ {
+ buflen += utf8_from_uchar(&search[buflen], ARRAY_LENGTH(search) - buflen, menu_event->unichar);
+ search[buflen] = 0;
+ reset(UI_MENU_RESET_SELECT_FIRST);
+ }
+ }
+ }
+
+ /* if we're in an error state, overlay an error message */
+ if (error)
+ ui_draw_text_box(container,
+ "The selected game is missing one or more required ROM or CHD images. "
+ "Please select a different game.\n\nPress any key to continue.",
+ JUSTIFY_CENTER, 0.5f, 0.5f, UI_RED_COLOR);
+}
+
+
+/*-------------------------------------------------
+ menu_select_game_populate - populate the game
+ select menu
+-------------------------------------------------*/
+ui_menu_select_game::ui_menu_select_game(running_machine &machine, render_container *container, const char *gamename) : ui_menu(machine, container)
+{
+ driverlist = global_alloc_array(const game_driver *, driver_list::total()+1);
+ build_driver_list();
+ if(gamename)
+ strcpy(search, gamename);
+ matchlist[0] = -1;
+}
+
+void ui_menu_select_game::populate()
+{
+ int matchcount;
+ int curitem;
+
+ for (curitem = matchcount = 0; driverlist[curitem] != NULL && matchcount < VISIBLE_GAMES_IN_LIST; curitem++)
+ if (!(driverlist[curitem]->flags & GAME_NO_STANDALONE))
+ matchcount++;
+
+ /* if nothing there, add a single multiline item and return */
+ if (matchcount == 0)
+ {
+ astring txt;
+ txt.printf("No %s found. Please check the rompath specified in the %s.ini file.\n\n"
+ "If this is your first time using %s, please see the config.txt file in "
+ "the docs directory for information on configuring %s.",
+ emulator_info::get_gamesnoun(),
+ emulator_info::get_configname(),
+ emulator_info::get_appname(),emulator_info::get_appname() );
+ item_append(txt.cstr(), NULL, MENU_FLAG_MULTILINE | MENU_FLAG_REDTEXT, NULL);
+ return;
+ }
+
+ /* otherwise, rebuild the match list */
+ assert(drivlist != NULL);
+ if (search[0] != 0 || matchlist[0] == -1 || rerandomize)
+ drivlist->find_approximate_matches(search, matchcount, matchlist);
+ rerandomize = false;
+
+ /* iterate over entries */
+ for (curitem = 0; curitem < matchcount; curitem++)
+ {
+ int curmatch = matchlist[curitem];
+ if (curmatch != -1)
+ {
+ int cloneof = drivlist->non_bios_clone(curmatch);
+ item_append(drivlist->driver(curmatch).name, drivlist->driver(curmatch).description, (cloneof == -1) ? 0 : MENU_FLAG_INVERT, (void *)&drivlist->driver(curmatch));
+ }
+ }
+
+ /* if we're forced into this, allow general input configuration as well */
+ if (ui_menu::stack_has_special_main_menu())
+ {
+ item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL);
+ item_append("Configure General Inputs", NULL, 0, (void *)1);
+ }
+
+ /* configure the custom rendering */
+ customtop = ui_get_line_height(machine()) + 3.0f * UI_BOX_TB_BORDER;
+ custombottom = 4.0f * ui_get_line_height(machine()) + 3.0f * UI_BOX_TB_BORDER;
+}
+
+ui_menu_select_game::~ui_menu_select_game()
+{
+ global_free(drivlist);
+ global_free(driverlist);
+}
+
+/*-------------------------------------------------
+ menu_select_game_build_driver_list - build a
+ list of available drivers
+-------------------------------------------------*/
+
+void ui_menu_select_game::build_driver_list()
+{
+ // start with an empty list
+ drivlist = global_alloc(driver_enumerator(machine().options()));
+ drivlist->exclude_all();
+
+ /* open a path to the ROMs and find them in the array */
+ file_enumerator path(machine().options().media_path());
+ const osd_directory_entry *dir;
+
+ /* iterate while we get new objects */
+ while ((dir = path.next()) != NULL)
+ {
+ char drivername[50];
+ char *dst = drivername;
+ const char *src;
+
+ /* build a name for it */
+ for (src = dir->name; *src != 0 && *src != '.' && dst < &drivername[ARRAY_LENGTH(drivername) - 1]; src++)
+ *dst++ = tolower((UINT8)*src);
+ *dst = 0;
+
+ int drivnum = drivlist->find(drivername);
+ if (drivnum != -1)
+ drivlist->include(drivnum);
+ }
+
+ /* now build the final list */
+ drivlist->reset();
+ int listnum = 0;
+ while (drivlist->next())
+ driverlist[listnum++] = &drivlist->driver();
+
+ /* NULL-terminate */
+ driverlist[listnum] = NULL;
+}
+
+
+/*-------------------------------------------------
+ menu_select_game_custom_render - perform our
+ special rendering
+-------------------------------------------------*/
+
+void ui_menu_select_game::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2)
+{
+ const game_driver *driver;
+ float width, maxwidth;
+ float x1, y1, x2, y2;
+ astring tempbuf[5];
+ rgb_t color;
+ int line;
+
+ /* display the current typeahead */
+ if (search[0] != 0)
+ tempbuf[0].printf("Type name or select: %s_", search);
+ else
+ tempbuf[0].printf("Type name or select: (random)");
+
+ /* get the size of the text */
+ ui_draw_text_full(container, tempbuf[0], 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE,
+ DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, NULL);
+ width += 2 * UI_BOX_LR_BORDER;
+ maxwidth = MAX(width, origx2 - origx1);
+
+ /* compute our bounds */
+ x1 = 0.5f - 0.5f * maxwidth;
+ x2 = x1 + maxwidth;
+ y1 = origy1 - top;
+ y2 = origy1 - UI_BOX_TB_BORDER;
+
+ /* draw a box */
+ ui_draw_outlined_box(container, x1, y1, x2, y2, UI_BACKGROUND_COLOR);
+
+ /* take off the borders */
+ x1 += UI_BOX_LR_BORDER;
+ x2 -= UI_BOX_LR_BORDER;
+ y1 += UI_BOX_TB_BORDER;
+ y2 -= UI_BOX_TB_BORDER;
+
+ /* draw the text within it */
+ ui_draw_text_full(container, tempbuf[0], x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE,
+ DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL);
+
+ /* determine the text to render below */
+ driver = ((FPTR)selectedref > 1) ? (const game_driver *)selectedref : NULL;
+ if ((FPTR)driver > 1)
+ {
+ const char *gfxstat, *soundstat;
+
+ /* first line is game name */
+ tempbuf[0].printf("%-.100s", driver->description);
+
+ /* next line is year, manufacturer */
+ tempbuf[1].printf("%s, %-.100s", driver->year, driver->manufacturer);
+
+ /* next line source path */
+ tempbuf[2].printf("Driver: %-.100s", core_filename_extract_base(tempbuf[3], driver->source_file).cstr());
+
+ /* next line is overall driver status */
+ if (driver->flags & GAME_NOT_WORKING)
+ tempbuf[3].cpy("Overall: NOT WORKING");
+ else if (driver->flags & GAME_UNEMULATED_PROTECTION)
+ tempbuf[3].cpy("Overall: Unemulated Protection");
+ else
+ tempbuf[3].cpy("Overall: Working");
+
+ /* next line is graphics, sound status */
+ if (driver->flags & (GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS | GAME_IMPERFECT_COLORS))
+ gfxstat = "Imperfect";
+ else
+ gfxstat = "OK";
+
+ if (driver->flags & GAME_NO_SOUND)
+ soundstat = "Unimplemented";
+ else if (driver->flags & GAME_IMPERFECT_SOUND)
+ soundstat = "Imperfect";
+ else
+ soundstat = "OK";
+
+ tempbuf[4].printf("Gfx: %s, Sound: %s", gfxstat, soundstat);
+ }
+ else
+ {
+ const char *s = emulator_info::get_copyright();
+ line = 0;
+
+ /* first line is version string */
+ tempbuf[line++].printf("%s %s", emulator_info::get_applongname(), build_version);
+
+ /* output message */
+ while (line < ARRAY_LENGTH(tempbuf))
+ {
+ if (!(*s == 0 || *s == '\n'))
+ tempbuf[line].cat(*s);
+
+ if (*s == '\n')
+ {
+ line++;
+ s++;
+ } else if (*s != 0)
+ s++;
+ else
+ line++;
+ }
+ }
+
+ /* get the size of the text */
+ maxwidth = origx2 - origx1;
+ for (line = 0; line < 4; line++)
+ {
+ ui_draw_text_full(container, tempbuf[line], 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE,
+ DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, NULL);
+ width += 2 * UI_BOX_LR_BORDER;
+ maxwidth = MAX(maxwidth, width);
+ }
+
+ /* compute our bounds */
+ x1 = 0.5f - 0.5f * maxwidth;
+ x2 = x1 + maxwidth;
+ y1 = origy2 + UI_BOX_TB_BORDER;
+ y2 = origy2 + bottom;
+
+ /* draw a box */
+ color = UI_BACKGROUND_COLOR;
+ if (driver != NULL)
+ color = UI_GREEN_COLOR;
+ if (driver != NULL && (driver->flags & (GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS | GAME_IMPERFECT_COLORS | GAME_NO_SOUND | GAME_IMPERFECT_SOUND)) != 0)
+ color = UI_YELLOW_COLOR;
+ if (driver != NULL && (driver->flags & (GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION)) != 0)
+ color = UI_RED_COLOR;
+ ui_draw_outlined_box(container, x1, y1, x2, y2, color);
+
+ /* take off the borders */
+ x1 += UI_BOX_LR_BORDER;
+ x2 -= UI_BOX_LR_BORDER;
+ y1 += UI_BOX_TB_BORDER;
+ y2 -= UI_BOX_TB_BORDER;
+
+ /* draw all lines */
+ for (line = 0; line < 4; line++)
+ {
+ ui_draw_text_full(container, tempbuf[line], x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE,
+ DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL);
+ y1 += ui_get_line_height(machine());
+ }
+}
+
+
+/*-------------------------------------------------
+ force_game_select - force the game
+ select menu to be visible and inescapable
+-------------------------------------------------*/
+
+void ui_menu_select_game::force_game_select(running_machine &machine, render_container *container)
+{
+ char *gamename = (char *)machine.options().system_name();
+
+ /* reset the menu stack */
+ ui_menu::stack_reset(machine);
+
+ /* add the quit entry followed by the game select entry */
+ ui_menu *quit = auto_alloc_clear(machine, ui_menu_quit_game(machine, container));
+ quit->set_special_main_menu(true);
+ ui_menu::stack_push(quit);
+ ui_menu::stack_push(auto_alloc_clear(machine, ui_menu_select_game(machine, container, gamename)));
+
+ /* force the menus on */
+ ui_show_menu();
+
+ /* make sure MAME is paused */
+ machine.pause();
+}
+
+
diff --git a/src/emu/ui/selgame.h b/src/emu/ui/selgame.h
new file mode 100644
index 00000000000..3208d0cbf13
--- /dev/null
+++ b/src/emu/ui/selgame.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+
+ ui/selgame.h
+
+ Internal MAME menus for the user interface.
+
+ Copyright Nicola Salmoria and the MAME Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __UI_SELGAME_H__
+#define __UI_SELGAME_H__
+
+#include "drivenum.h"
+
+
+class ui_menu_select_game : public ui_menu {
+public:
+ ui_menu_select_game(running_machine &machine, render_container *container, const char *gamename);
+ virtual ~ui_menu_select_game();
+ virtual void populate();
+ virtual void handle();
+ virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2);
+
+ // force game select menu
+ static void force_game_select(running_machine &machine, render_container *container);
+
+private:
+ enum { VISIBLE_GAMES_IN_LIST = 15 };
+ UINT8 error;
+ UINT8 rerandomize;
+ char search[40];
+ int matchlist[VISIBLE_GAMES_IN_LIST];
+ const game_driver **driverlist;
+
+ driver_enumerator *drivlist;
+
+ void build_driver_list();
+};
+
+#endif /* __UI_SELGAME_H__ */