This commit is contained in:
OBattler
2024-08-27 05:09:35 +02:00
parent cd3f29f622
commit 26cc61fdba
5 changed files with 149 additions and 27 deletions

View File

@@ -870,7 +870,7 @@ load_storage_controllers(void)
if (p[0] != 0x00) {
if (path_abs(p)) {
if (strlen(p) > 511)
fatal("load_storage_controllers(): strlen(p) > 511 (cassette_fname)\n);
fatal("load_storage_controllers(): strlen(p) > 511 (cassette_fname)\n");
else
strncpy(cassette_fname, p, 511);
} else
@@ -894,11 +894,11 @@ load_storage_controllers(void)
fatal("load_storage_controllers(): strlen(p) > 2047 "
"(cassette_image_history[%i])\n", i);
else
snprintf(cassette_image_history[c][i], (MAX_IMAGE_PATH_LEN - 1), "%s", p);
snprintf(cassette_image_history[i], (MAX_IMAGE_PATH_LEN - 1), "%s", p);
} else
snprintf(csasette_image_history[c][i], (MAX_IMAGE_PATH_LEN - 1), "%s%s%s", usr_path,
snprintf(cassette_image_history[i], (MAX_IMAGE_PATH_LEN - 1), "%s%s%s", usr_path,
path_get_slash(usr_path), p);
path_normalize(cassette_image_history[c][i]);
path_normalize(cassette_image_history[i]);
}
}
cassette_pos = ini_section_get_int(cat, "cassette_position", 0);
@@ -927,7 +927,7 @@ load_storage_controllers(void)
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
cart_image_history[c][i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char));
sprintf(temp, "cart_%02i_image_history_%02i", c + 1, i + 1);
sprintf(temp, "cartridge_%02i_image_history_%02i", c + 1, i + 1);
p = ini_section_get_string(cat, temp, NULL);
if (p) {
if (path_abs(p)) {

View File

@@ -24,10 +24,12 @@
extern "C" {
#include <86box/timer.h>
#include <86box/device.h>
#include <86box/cassette.h>
#include <86box/cartridge.h>
#include <86box/fdd.h>
#include <86box/cdrom.h>
#include <86box/scsi_device.h>
#include <86box/zip.h>
#include <86box/mo.h>
#include <86box/path.h>
@@ -191,10 +193,10 @@ MediaHistoryManager::initialDeduplication()
current_image = cdrom[device_index].image_path;
break;
case ui::MediaType::Zip:
current_image = zip[device_index].image_path;
current_image = zip_drives[device_index].image_path;
break;
case ui::MediaType::Mo:
current_image = mo[device_index].image_path;
current_image = mo_drives[device_index].image_path;
break;
}
deduplicateList(device_history, QVector<QString>(1, current_image));
@@ -225,9 +227,9 @@ MediaHistoryManager::getEmuHistoryVarForType(ui::MediaType type, int index)
case ui::MediaType::Optical:
return &cdrom[index].image_history[0];
case ui::MediaType::Zip:
return &zip[index].image_history[0];
return &zip_drives[index].image_history[0];
case ui::MediaType::Mo:
return &mo[index].image_history[0];
return &mo_drives[index].image_history[0];
}
}

View File

@@ -65,7 +65,7 @@ static const MediaType AllSupportedMediaHistoryTypes[] = {
MediaType::Zip,
MediaType::Mo,
MediaType::Cassette,
MediaType::Cartridge,
MediaType::Cartridge
};
class MediaHistoryManager {

View File

@@ -91,6 +91,11 @@ MediaMenu::refresh(QMenu *parentMenu)
cassetteMenu->addAction(tr("&Existing image..."), [this]() { cassetteSelectImage(false); });
cassetteMenu->addAction(tr("Existing image (&Write-protected)..."), [this]() { cassetteSelectImage(true); });
cassetteMenu->addSeparator();
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
cassetteImageHistoryPos[slot] = cassetteMenu->children().count();
cassetteMenu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, slot]() { cassetteMenuSelect(slot); })->setCheckable(false);
}
cassetteMenu->addSeparator();
cassetteRecordPos = cassetteMenu->children().count();
cassetteMenu->addAction(tr("&Record"), [this] { pc_cas_set_mode(cassette, 1); cassetteUpdateMenu(); })->setCheckable(true);
cassettePlayPos = cassetteMenu->children().count();
@@ -111,6 +116,11 @@ MediaMenu::refresh(QMenu *parentMenu)
auto *menu = parentMenu->addMenu("");
menu->addAction(tr("&Image..."), [this, i]() { cartridgeSelectImage(i); });
menu->addSeparator();
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
cartridgeImageHistoryPos[slot] = menu->children().count();
menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { cartridgeMenuSelect(i, slot); })->setCheckable(false);
}
menu->addSeparator();
cartridgeEjectPos = menu->children().count();
menu->addAction(tr("E&ject"), [this, i]() { cartridgeEject(i); });
cartridgeMenus[i] = menu;
@@ -179,10 +189,13 @@ MediaMenu::refresh(QMenu *parentMenu)
menu->addAction(tr("&Existing image..."), [this, i]() { zipSelectImage(i, false); });
menu->addAction(tr("Existing image (&Write-protected)..."), [this, i]() { zipSelectImage(i, true); });
menu->addSeparator();
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
zipImageHistoryPos[slot] = menu->children().count();
menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { zipReload(i, slot); })->setCheckable(false);
}
menu->addSeparator();
zipEjectPos = menu->children().count();
menu->addAction(tr("E&ject"), [this, i]() { zipEject(i); });
zipReloadPos = menu->children().count();
menu->addAction(tr("&Reload previous image"), [this, i]() { zipReload(i); });
zipMenus[i] = menu;
zipUpdateMenu(i);
});
@@ -195,10 +208,13 @@ MediaMenu::refresh(QMenu *parentMenu)
menu->addAction(tr("&Existing image..."), [this, i]() { moSelectImage(i, false); });
menu->addAction(tr("Existing image (&Write-protected)..."), [this, i]() { moSelectImage(i, true); });
menu->addSeparator();
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
moImageHistoryPos[slot] = menu->children().count();
menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { moReload(i, slot); })->setCheckable(false);
}
menu->addSeparator();
moEjectPos = menu->children().count();
menu->addAction(tr("E&ject"), [this, i]() { moEject(i); });
moReloadPos = menu->children().count();
menu->addAction(tr("&Reload previous image"), [this, i]() { moReload(i); });
moMenus[i] = menu;
moUpdateMenu(i);
});
@@ -243,9 +259,19 @@ MediaMenu::cassetteSelectImage(bool wp)
cassetteMount(filename, wp);
}
void
MediaMenu::cassetteMenuSelect(int slot)
{
QString filename = mhm.getImageForSlot(0, slot, ui::MediaType::Cassette);
cassetteMount(filename.toUtf8().constData(), 0);
cassetteUpdateMenu();
ui_sb_update_tip(SB_CASSETTE);
}
void
MediaMenu::cassetteMount(const QString &filename, bool wp)
{
auto previous_image = QFileInfo(cassette_fname);
pc_cas_set_fname(cassette, nullptr);
memset(cassette_fname, 0, sizeof(cassette_fname));
cassette_ui_writeprot = wp ? 1 : 0;
@@ -257,6 +283,7 @@ MediaMenu::cassetteMount(const QString &filename, bool wp)
}
ui_sb_update_icon_state(SB_CASSETTE, filename.isEmpty() ? 1 : 0);
mhm.addImageToHistory(0, ui::MediaType::Cassette, previous_image.filePath(), filename);
cassetteUpdateMenu();
ui_sb_update_tip(SB_CASSETTE);
config_save();
@@ -265,6 +292,7 @@ MediaMenu::cassetteMount(const QString &filename, bool wp)
void
MediaMenu::cassetteEject()
{
mhm.addImageToHistory(0, ui::MediaType::Cassette, cassette_fname, QString());
pc_cas_set_fname(cassette, nullptr);
memset(cassette_fname, 0, sizeof(cassette_fname));
ui_sb_update_icon_state(SB_CASSETTE, 1);
@@ -297,16 +325,22 @@ MediaMenu::cassetteUpdateMenu()
cassetteMenu->setTitle(QString::asprintf(tr("Cassette: %s").toUtf8().constData(),
(name.isEmpty() ? tr("(empty)") : name).toUtf8().constData()));
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
updateImageHistory(0, slot, ui::MediaType::Cassette);
}
}
void
MediaMenu::cartridgeMount(int i, const QString &filename)
{
auto previous_image = QFileInfo(cart_fns[i]);
cart_close(i);
QByteArray filenameBytes = filename.toUtf8();
cart_load(i, filenameBytes.data());
ui_sb_update_icon_state(SB_CARTRIDGE | i, filename.isEmpty() ? 1 : 0);
mhm.addImageToHistory(i, ui::MediaType::Cartridge, previous_image.filePath(), filename);
cartridgeUpdateMenu(i);
ui_sb_update_tip(SB_CARTRIDGE | i);
config_save();
@@ -327,9 +361,19 @@ MediaMenu::cartridgeSelectImage(int i)
cartridgeMount(i, filename);
}
void
MediaMenu::cartridgeMenuSelect(int index, int slot)
{
QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Cartridge);
cartridgeMount(index, filename.toUtf8().constData());
cartridgeUpdateMenu(index);
ui_sb_update_tip(SB_CARTRIDGE | index);
}
void
MediaMenu::cartridgeEject(int i)
{
mhm.addImageToHistory(i, ui::MediaType::Cartridge, cart_fns[i], QString());
cart_close(i);
ui_sb_update_icon_state(SB_CARTRIDGE | i, 1);
cartridgeUpdateMenu(i);
@@ -347,6 +391,10 @@ MediaMenu::cartridgeUpdateMenu(int i)
ejectMenu->setEnabled(!name.isEmpty());
// menu->setTitle(tr("Cartridge %1: %2").arg(QString::number(i+1), name.isEmpty() ? tr("(empty)") : name));
menu->setTitle(QString::asprintf(tr("Cartridge %i: %ls").toUtf8().constData(), i + 1, name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
updateImageHistory(i, slot, ui::MediaType::Cartridge);
}
}
void
@@ -580,6 +628,36 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
QString menu_item_name;
switch (type) {
default:
menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
return;
case ui::MediaType::Cassette:
if (!MachineStatus::hasCassette())
return;
menu = cassetteMenu;
children = menu->children();
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[cassetteImageHistoryPos[slot]]);
fi.setFile(fn);
menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
break;
case ui::MediaType::Cartridge:
if (!machine_has_cartridge(machine))
return;
menu = cartridgeMenus[index];
children = menu->children();
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[cartridgeImageHistoryPos[slot]]);
fi.setFile(fn);
menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
break;
case ui::MediaType::Floppy:
if (!floppyMenus.contains(index))
return;
menu = floppyMenus[index];
children = menu->children();
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[floppyImageHistoryPos[slot]]);
fi.setFile(fn);
menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
break;
case ui::MediaType::Optical:
if (!cdromMenus.contains(index))
return;
@@ -600,18 +678,24 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
}
imageHistoryUpdatePos->setIcon(menu_icon);
break;
case ui::MediaType::Floppy:
if (!floppyMenus.contains(index))
case ui::MediaType::Zip:
if (!zipMenus.contains(index))
return;
menu = floppyMenus[index];
menu = zipMenus[index];
children = menu->children();
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[floppyImageHistoryPos[slot]]);
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[zipImageHistoryPos[slot]]);
fi.setFile(fn);
menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
break;
default:
case ui::MediaType::Mo:
if (!moMenus.contains(index))
return;
menu = moMenus[index];
children = menu->children();
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[moImageHistoryPos[slot]]);
fi.setFile(fn);
menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
return;
break;
}
imageHistoryUpdatePos->setText(QString::asprintf(tr("%s").toUtf8().constData(), menu_item_name.toUtf8().constData()));
@@ -727,6 +811,7 @@ MediaMenu::zipMount(int i, const QString &filename, bool wp)
zip_load(dev, filenameBytes.data());
zip_insert(dev);
}
mhm.addImageToHistory(i, ui::MediaType::Zip, zip_drives[i].prev_image_path, zip_drives[i].image_path);
ui_sb_update_icon_state(SB_ZIP | i, filename.isEmpty() ? 1 : 0);
zipUpdateMenu(i);
@@ -740,6 +825,7 @@ MediaMenu::zipEject(int i)
{
const auto dev = static_cast<zip_t *>(zip_drives[i].priv);
mhm.addImageToHistory(i, ui::MediaType::Zip, zip_drives[i].image_path, QString());
zip_disk_close(dev);
zip_drives[i].image_path[0] = 0;
if (zip_drives[i].bus_type) {
@@ -754,7 +840,7 @@ MediaMenu::zipEject(int i)
}
void
MediaMenu::zipReload(int i)
MediaMenu::zipReloadPrev(int i)
{
const auto dev = static_cast<zip_t *>(zip_drives[i].priv);
@@ -771,6 +857,15 @@ MediaMenu::zipReload(int i)
config_save();
}
void
MediaMenu::zipReload(int index, int slot)
{
const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Zip);
zipMount(index, filename, false);
zipUpdateMenu(index);
ui_sb_update_tip(SB_ZIP | index);
}
void
MediaMenu::zipUpdateMenu(int i)
{
@@ -800,6 +895,9 @@ MediaMenu::zipUpdateMenu(int i)
// menu->setTitle(tr("ZIP %1 %2 (%3): %4").arg((zip_drives[i].is_250 > 0) ? "250" : "100", QString::number(i+1), busName, name.isEmpty() ? tr("(empty)") : name));
menu->setTitle(QString::asprintf(tr("ZIP %03i %i (%s): %ls").toUtf8().constData(), (zip_drives[i].is_250 > 0) ? 250 : 100, i + 1, busName.toUtf8().data(), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
updateImageHistory(i, slot, ui::MediaType::Zip);
}
void
@@ -844,6 +942,7 @@ MediaMenu::moMount(int i, const QString &filename, bool wp)
mo_load(dev, filenameBytes.data());
mo_insert(dev);
}
mhm.addImageToHistory(i, ui::MediaType::Mo, mo_drives[i].prev_image_path, mo_drives[i].image_path);
ui_sb_update_icon_state(SB_MO | i, filename.isEmpty() ? 1 : 0);
moUpdateMenu(i);
@@ -857,6 +956,7 @@ MediaMenu::moEject(int i)
{
const auto dev = static_cast<mo_t *>(mo_drives[i].priv);
mhm.addImageToHistory(i, ui::MediaType::Mo, mo_drives[i].image_path, QString());
mo_disk_close(dev);
mo_drives[i].image_path[0] = 0;
if (mo_drives[i].bus_type) {
@@ -871,7 +971,7 @@ MediaMenu::moEject(int i)
}
void
MediaMenu::moReload(int i)
MediaMenu::moReloadPrev(int i)
{
mo_t *dev = (mo_t *) mo_drives[i].priv;
@@ -888,6 +988,15 @@ MediaMenu::moReload(int i)
config_save();
}
void
MediaMenu::moReload(int index, int slot)
{
const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Mo);
moMount(index, filename, false);
moUpdateMenu(index);
ui_sb_update_tip(SB_MO | index);
}
void
MediaMenu::moUpdateMenu(int i)
{
@@ -916,6 +1025,9 @@ MediaMenu::moUpdateMenu(int i)
}
menu->setTitle(QString::asprintf(tr("MO %i (%ls): %ls").toUtf8().constData(), i + 1, busName.toStdU16String().data(), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
updateImageHistory(i, slot, ui::MediaType::Mo);
}
void
@@ -1043,7 +1155,7 @@ zip_mount(uint8_t id, char *fn, uint8_t wp)
void
zip_reload(uint8_t id)
{
MediaMenu::ptr->zipReload(id);
MediaMenu::ptr->zipReloadPrev(id);
}
void
@@ -1061,6 +1173,6 @@ mo_mount(uint8_t id, char *fn, uint8_t wp)
void
mo_reload(uint8_t id)
{
MediaMenu::ptr->moReload(id);
MediaMenu::ptr->moReloadPrev(id);
}
}

View File

@@ -24,12 +24,14 @@ public:
void cassetteNewImage();
void cassetteSelectImage(bool wp);
void cassetteMount(const QString &filename, bool wp);
void cassetteMenuSelect(int slot);
void cassetteEject();
void cassetteUpdateMenu();
void cartridgeSelectImage(int i);
void cartridgeMount(int i, const QString &filename);
void cartridgeEject(int i);
void cartridgeMenuSelect(int index, int slot);
void cartridgeUpdateMenu(int i);
void floppyNewImage(int i);
@@ -53,14 +55,16 @@ public:
void zipSelectImage(int i, bool wp);
void zipMount(int i, const QString &filename, bool wp);
void zipEject(int i);
void zipReload(int i);
void zipReloadPrev(int i);
void zipReload(int index, int slot);
void zipUpdateMenu(int i);
void moNewImage(int i);
void moSelectImage(int i, bool wp);
void moMount(int i, const QString &filename, bool wp);
void moEject(int i);
void moReload(int i);
void moReloadPrev(int i);
void moReload(int index, int slot);
void moUpdateMenu(int i);
void nicConnect(int i);
@@ -94,24 +98,28 @@ private:
int cassetteRewindPos;
int cassetteFastFwdPos;
int cassetteEjectPos;
int cassetteImageHistoryPos[MAX_PREV_IMAGES];
int cartridgeEjectPos;
int cartridgeImageHistoryPos[MAX_PREV_IMAGES];
int floppyExportPos;
int floppyEjectPos;
int floppyImageHistoryPos[MAX_PREV_IMAGES];
int cdromMutePos;
int cdromReloadPos;
int cdromImagePos;
int cdromDirPos;
int cdromImageHistoryPos[MAX_PREV_IMAGES];
int floppyImageHistoryPos[MAX_PREV_IMAGES];
int zipEjectPos;
int zipReloadPos;
int zipImageHistoryPos[MAX_PREV_IMAGES];
int moEjectPos;
int moReloadPos;
int moImageHistoryPos[MAX_PREV_IMAGES];
int netDisconnPos;