summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/ui/filemngr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/ui/filemngr.c')
-rw-r--r--src/emu/ui/filemngr.c103
1 files changed, 66 insertions, 37 deletions
diff --git a/src/emu/ui/filemngr.c b/src/emu/ui/filemngr.c
index b641f40eb81..00390696963 100644
--- a/src/emu/ui/filemngr.c
+++ b/src/emu/ui/filemngr.c
@@ -59,57 +59,86 @@ void ui_menu_file_manager::custom_render(void *selectedref, float top, float bot
}
+void ui_menu_file_manager::fill_image_line(device_image_interface *img, astring &instance, astring &filename)
+{
+ // get the image type/id
+ instance.printf("%s (%s)", img->instance_name(), img->brief_instance_name());
+
+ // get the base name
+ if (img->basename() != NULL)
+ {
+ filename.cpy(img->basename());
+
+ // if the image has been loaded through softlist, also show the loaded part
+ if (img->part_entry() != NULL)
+ {
+ const software_part *tmp = img->part_entry();
+ if (tmp->name() != NULL)
+ {
+ filename.cat(" (");
+ filename.cat(tmp->name());
+ // also check if this part has a specific part_id (e.g. "Map Disc", "Bonus Disc", etc.), and in case display it
+ if (img->get_feature("part_id") != NULL)
+ {
+ filename.cat(": ");
+ filename.cat(img->get_feature("part_id"));
+ }
+ filename.cat(")");
+ }
+ }
+ }
+ else
+ filename.cpy("---");
+}
+
//-------------------------------------------------
// populate
//-------------------------------------------------
void ui_menu_file_manager::populate()
{
- astring buffer;
- bool first = true;
+ astring buffer, tmp_inst, tmp_name;
+ bool first_entry = true;
+ astring prev_owner;
// cycle through all devices for this system
- image_interface_iterator iter(machine().root_device());
- for (device_image_interface *image = iter.first(); image != NULL; image = iter.next())
+ device_iterator iter(machine().root_device());
+ tagmap_t<UINT8> devtags;
+ for (device_t *dev = iter.first(); dev != NULL; dev = iter.next())
{
- if (first)
- first = false;
- else
- item_append("", NULL, MENU_FLAG_DISABLE, NULL);
-
- // get the image type/id
- buffer.printf("%s (%s)", image->instance_name(), image->brief_instance_name());
- item_append(buffer, "", MENU_FLAG_DISABLE, NULL);
- item_append("Device", image->device().tag(), MENU_FLAG_DISABLE, NULL);
-
- // get the base name
- if (image->basename() != NULL)
- {
- buffer.cpy(image->basename());
-
- // if the image has been loaded through softlist, also show the loaded part
- if (image->part_entry() != NULL)
+ bool tag_appended = false;
+ if (devtags.add(dev->tag(), 1, FALSE) == TMERR_DUPLICATE)
+ continue;
+
+ // check whether it owns an image interface
+ image_interface_iterator subiter(*dev);
+ if (subiter.count() > 0)
+ {
+ // if so, cycle through all its image interfaces
+ image_interface_iterator subiter(*dev);
+ for (device_image_interface *scan = subiter.first(); scan != NULL; scan = subiter.next())
{
- const software_part *tmp = image->part_entry();
- if (tmp->name() != NULL)
- {
- buffer.cat(" (");
- buffer.cat(tmp->name());
- // also check if this part has a specific part_id (e.g. "Map Disc", "Bonus Disc", etc.), and in case display it
- if (image->get_feature("part_id") != NULL)
+ // if it is a children device, and not something further down the device tree, we want it in the menu!
+ if (strcmp(scan->device().owner()->tag(), dev->tag()) == 0)
+ if (devtags.add(scan->device().tag(), 1, FALSE) != TMERR_DUPLICATE)
{
- buffer.cat(": ");
- buffer.cat(image->get_feature("part_id"));
+ // check whether we already had some devices with the same owner: if not, output the owner tag!
+ if (!tag_appended)
+ {
+ if (first_entry)
+ first_entry = false;
+ else
+ item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL);
+ buffer.printf("[root%s]", dev->tag());
+ item_append(buffer, NULL, 0, NULL);
+ tag_appended = true;
+ }
+ // finally, append the image interface to the menu
+ fill_image_line(scan, tmp_inst, tmp_name);
+ item_append(tmp_inst, tmp_name, 0, (void *) scan);
}
- buffer.cat(")");
- }
}
}
- else
- buffer.cpy("---");
-
- // record the menu item
- item_append("Mounted File", buffer, 0, (void *) image);
}
item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL);
item_append("Reset", NULL, 0, (void *)1);