diff --git a/src/cdrom/cdrom_image.c b/src/cdrom/cdrom_image.c index b777bcdee..302ab8db1 100644 --- a/src/cdrom/cdrom_image.c +++ b/src/cdrom/cdrom_image.c @@ -290,10 +290,11 @@ cdrom_image_open(cdrom_t *dev, const char *fn) return image_open_abort(dev); /* All good, reset state. */ - if (i == 2) + if (i >= 2) dev->cd_status = CD_STATUS_DATA_ONLY; else dev->cd_status = CD_STATUS_STOPPED; + dev->is_dir = (i == 3); dev->seek_pos = 0; dev->cd_buflen = 0; dev->cdrom_capacity = image_get_capacity(dev); diff --git a/src/cdrom/cdrom_image_backend.c b/src/cdrom/cdrom_image_backend.c index c8d1c3570..6a717fc97 100644 --- a/src/cdrom/cdrom_image_backend.c +++ b/src/cdrom/cdrom_image_backend.c @@ -222,11 +222,13 @@ cdi_close(cd_img_t *cdi) int cdi_set_device(cd_img_t *cdi, const char *path) { - if (cdi_load_cue(cdi, path)) - return 1; + int ret; - if (cdi_load_iso(cdi, path)) - return 2; + if ((ret = cdi_load_cue(cdi, path))) + return ret; + + if ((ret = cdi_load_iso(cdi, path))) + return ret; return 0; } @@ -528,7 +530,7 @@ cdi_track_push_back(cd_img_t *cdi, track_t *trk) int cdi_load_iso(cd_img_t *cdi, const char *filename) { - int error; + int error, ret = 2; track_t trk; cdi->tracks = NULL; @@ -541,6 +543,7 @@ cdi_load_iso(cd_img_t *cdi, const char *filename) if (error) { if ((trk.file != NULL) && (trk.file->close != NULL)) trk.file->close(trk.file); + ret = 3; trk.file = viso_init(filename, &error); if (error) { if ((trk.file != NULL) && (trk.file->close != NULL)) @@ -586,7 +589,7 @@ cdi_load_iso(cd_img_t *cdi, const char *filename) trk.file = NULL; cdi_track_push_back(cdi, &trk); - return 1; + return ret; } static int diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index f9040a4ed..6cd660c5c 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -104,7 +104,7 @@ typedef struct cdrom { media status. */ speed, cur_speed; - FILE* img_fp; + int is_dir; void *priv; char image_path[1024], diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index d6dec74a7..4365243c0 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -438,7 +438,8 @@ #define IDM_CDROM_EMPTY 0x4300 #define IDM_CDROM_RELOAD 0x4400 #define IDM_CDROM_IMAGE 0x4500 -#define IDM_CDROM_HOST_DRIVE 0x4600 +#define IDM_CDROM_DIR 0x4600 +#define IDM_CDROM_HOST_DRIVE 0x4700 #define IDM_ZIP_IMAGE_NEW 0x5200 #define IDM_ZIP_IMAGE_EXISTING 0x5300 diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 6f7ecc69e..b7881f6fa 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -229,6 +229,9 @@ msgstr "&Načíst znova předchozí obraz" msgid "&Image" msgstr "&Obraz..." +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "&Cílová snímková frekvence" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 2951c7b85..a3796654f 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -229,6 +229,9 @@ msgstr "&Voriges Image neu laden" msgid "&Image" msgstr "&Image" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "Ziel&framerate" diff --git a/src/qt/languages/en-GB.po b/src/qt/languages/en-GB.po index 90820a569..04c121ace 100644 --- a/src/qt/languages/en-GB.po +++ b/src/qt/languages/en-GB.po @@ -229,6 +229,9 @@ msgstr "&Reload previous image" msgid "&Image" msgstr "&Image" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "Target &framerate" diff --git a/src/qt/languages/en-US.po b/src/qt/languages/en-US.po index b11e1cdea..a54986788 100644 --- a/src/qt/languages/en-US.po +++ b/src/qt/languages/en-US.po @@ -229,6 +229,9 @@ msgstr "&Reload previous image" msgid "&Image" msgstr "&Image" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "Target &framerate" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index c7b306e1c..466976dc8 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -229,6 +229,9 @@ msgstr "&Recargar imagen previa" msgid "&Image" msgstr "&Imagen..." +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "&Tasa de refresco objetivo" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 991b13205..36222d59e 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -229,6 +229,9 @@ msgstr "&Lataa edellinen levykuva uudelleen" msgid "&Image" msgstr "L&evykuva" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "&Kuvataajuustavoite" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 7fa029045..6c913ac64 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -229,6 +229,9 @@ msgstr "&Recharger image précedente" msgid "&Image" msgstr "&Image" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "&Taux de rafraîchissement cible" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 1d3ab11a2..ba0d03870 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -229,6 +229,9 @@ msgstr "&Ponovo učitaj prethodnu sliku" msgid "&Image" msgstr "&Slika" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "&Ciljni broj okvira u sekundi" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 716ad22fc..3fc69df7f 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -229,6 +229,9 @@ msgstr "Előző képfájl &újratöltése" msgid "&Image" msgstr "&Meglévő képfájl &megnyitása..." +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "Cél &képkockasebesség" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index ee5e2a01a..0a83a5bd9 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -229,6 +229,9 @@ msgstr "&Ricarica l'immagine precedente" msgid "&Image" msgstr "&Immagine" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "Imposta obiettivo &fotogrammi" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index d1da289c4..a3c6b60ee 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -229,6 +229,9 @@ msgstr "前のイメージを再読み込み(&R)" msgid "&Image" msgstr "イメージ(&I)" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "目標フレームレート(&F)" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index bd5cd3e37..43a788d48 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -229,6 +229,9 @@ msgstr "이전 이미지 다시 불러오기(&R)" msgid "&Image" msgstr "이미지(&I)" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "목표 프레임 레이트(&F)" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 5c60b1eda..e5227f15a 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -229,6 +229,9 @@ msgstr "&Przeładuj poprzedni obraz" msgid "&Image" msgstr "&Obraz" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "Docelowa &liczba klatek na sekundę" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 7d1eecb09..7898fbbdf 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -229,6 +229,9 @@ msgstr "&Recarregar imagem anterior" msgid "&Image" msgstr "&Imagem" +msgid "&Folder" +msgstr "&Pasta" + msgid "Target &framerate" msgstr "&Taxa de quadro pretendida" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 301b52566..25a6a44e0 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -229,6 +229,9 @@ msgstr "&Recarregar imagem anterior" msgid "&Image" msgstr "&Imagem" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "&Taxa de quadros de destino" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index a33cc81dd..13cc96f7c 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -229,6 +229,9 @@ msgstr "&Снова загрузить предыдущий образ" msgid "&Image" msgstr "&Образ..." +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "Целевая &частота кадров" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 5a396c855..153d71534 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -229,6 +229,9 @@ msgstr "&Naloži zadnjo sliko" msgid "&Image" msgstr "&Slika" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "&Ciljno št. sličic na sekundo" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 2a12b3d85..20c4cf388 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -229,6 +229,9 @@ msgstr "&Önceki imajı seç" msgid "&Image" msgstr "&İmaj seç" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "Hedef &kare oranı" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 76382a9c7..c1248e7f8 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -229,6 +229,9 @@ msgstr "&Знову завантажити попередній образ" msgid "&Image" msgstr "&Образ..." +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "Цільова &частота кадрів" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index b9c6f6c98..a734d2264 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -229,6 +229,9 @@ msgstr "载入上一个镜像(&R)" msgid "&Image" msgstr "镜像(&I)" +msgid "&Folder" +msgstr "&Folder" + msgid "Target &framerate" msgstr "目标帧率(&F)" diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index 8ffccffdd..6b81e0d79 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -119,7 +119,9 @@ void MediaMenu::refresh(QMenu *parentMenu) { menu->addAction(tr("&Reload previous image"), [this, i]() { cdromReload(i); }); menu->addSeparator(); cdromImagePos = menu->children().count(); - menu->addAction(tr("&Image"), [this, i]() { cdromMount(i); })->setCheckable(true); + menu->addAction(tr("&Image"), [this, i]() { cdromMount(i, 0); })->setCheckable(true); + cdromDirPos = menu->children().count(); + menu->addAction(tr("&Folder"), [this, i]() { cdromMount(i, 1); })->setCheckable(true); cdromMenus[i] = menu; cdromUpdateMenu(i); }); @@ -358,18 +360,23 @@ void MediaMenu::cdromMute(int i) { sound_cd_thread_reset(); } -void MediaMenu::cdromMount(int i) { - QString dir; +void MediaMenu::cdromMount(int i, int dir) { + QString filename; QFileInfo fi(cdrom[i].image_path); - auto filename = QFileDialog::getOpenFileName( - parentWidget, - QString(), - QString(), - tr("CD-ROM images") % - util::DlgFilter({ "iso","cue" }) % - tr("All files") % - util::DlgFilter({ "*" }, true)); + if (dir) { + filename = QFileDialog::getExistingDirectory( + parentWidget); + } else { + filename = QFileDialog::getOpenFileName( + parentWidget, + QString(), + QString(), + tr("CD-ROM images") % + util::DlgFilter({ "iso","cue" }) % + tr("All files") % + util::DlgFilter({ "*" }, true)); + } if (filename.isEmpty()) { return; @@ -419,8 +426,10 @@ void MediaMenu::cdromUpdateMenu(int i) { muteMenu->setChecked(cdrom[i].sound_on == 0); auto* imageMenu = dynamic_cast(childs[cdromImagePos]); + auto* dirMenu = dynamic_cast(childs[cdromDirPos]); auto* emptyMenu = dynamic_cast(childs[cdromEmptyPos]); - imageMenu->setChecked(cdrom[i].host_drive == 200); + imageMenu->setChecked((cdrom[i].host_drive == 200) && !cdrom[i].is_dir); + dirMenu->setChecked((cdrom[i].host_drive == 200) && cdrom[i].is_dir); emptyMenu->setChecked(cdrom[i].host_drive != 200); auto* prevMenu = dynamic_cast(childs[cdromReloadPos]); diff --git a/src/qt/qt_mediamenu.hpp b/src/qt/qt_mediamenu.hpp index 3dc859fe9..0ff8f7214 100644 --- a/src/qt/qt_mediamenu.hpp +++ b/src/qt/qt_mediamenu.hpp @@ -36,7 +36,7 @@ public: void floppyUpdateMenu(int i); void cdromMute(int i); - void cdromMount(int i); + void cdromMount(int i, int dir); void cdromEject(int i); void cdromReload(int i); void cdromUpdateMenu(int i); @@ -79,6 +79,7 @@ private: int cdromEmptyPos; int cdromReloadPos; int cdromImagePos; + int cdromDirPos; int zipEjectPos; int zipReloadPos; diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 508103169..18b3679bb 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -184,6 +184,13 @@ plat_getcwd(char *bufp, int max) return 0; } +char * +plat_get_basename(const char *path) +{ + QFileInfo fi(path); + return fi.fileName().toUtf8().data(); +} + void plat_get_dirname(char *dest, const char *path) { diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp index bf26c5162..6bf9859ce 100644 --- a/src/qt/qt_settingsfloppycdrom.cpp +++ b/src/qt/qt_settingsfloppycdrom.cpp @@ -154,7 +154,7 @@ void SettingsFloppyCDROM::save() { /* Removable devices category */ model = ui->tableViewCDROM->model(); for (int i = 0; i < CDROM_NUM; i++) { - cdrom[i].img_fp = NULL; + cdrom[i].is_dir = 0; cdrom[i].priv = NULL; cdrom[i].ops = NULL; cdrom[i].image = NULL; diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index 530a706c9..5e89d3376 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Načíst znova předchozí obraz", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Obraz...", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index f348d5c97..d9a21fa12 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Voriges Image neu laden", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Image", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index ae2def0bd..bfb92015c 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Reload previous image", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Image", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index 12afe10ce..50abbba44 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Reload previous image", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Image", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index 350017861..e9fbea09f 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Recargar imagen previa", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Imagen...", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index bddde501c..4d45c4639 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Lataa edellinen levykuva uudelleen", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "L&evykuva", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index 7f76c649c..b6aa48089 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Recharger image précedente", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Image", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index d41441721..f8230e25e 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Ponovo učitaj prethodnu sliku", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Slika", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index d0cccad1a..89d66f18d 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -182,6 +182,7 @@ BEGIN MENUITEM "Előző képfájl &újratöltése", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Meglévő képfájl &megnyitása...", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index 9e31ffabd..17bb217dd 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -178,6 +178,7 @@ BEGIN MENUITEM "&Ricarica l'immagine precedente", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Immagine", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index 3917f59c4..1dc3c2987 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "前のイメージを再読み込み(&R)", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "イメージ(&I)", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index b9f68c3b4..b461b2cbd 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "이전 이미지 다시 불러오기(&R)", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "이미지(&I)", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/pl-PL.rc b/src/win/languages/pl-PL.rc index 45869d68b..4aa55b154 100644 --- a/src/win/languages/pl-PL.rc +++ b/src/win/languages/pl-PL.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Przeładuj poprzedni obraz", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Obraz", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 6f74e40d5..bf3c37f7b 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -180,6 +180,7 @@ BEGIN MENUITEM "&Recarregar imagem anterior", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Imagem", IDM_CDROM_IMAGE + MENUITEM "&Pasta", IDM_CDROM_DIR END END diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index 009e3f0df..86625ab3b 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Recarregar imagem anterior", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Imagem", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 10d7a3f5e..217b2754e 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Снова загрузить предыдущий образ", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Образ...", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index 008b1a2c6..18fd22d4c 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Naloži zadnjo sliko", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Slika", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index ac0ab6400..251ae6233 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Önceki imajı seç", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&İmaj seç", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/uk-UA.rc b/src/win/languages/uk-UA.rc index 3279e016d..b0887df7a 100644 --- a/src/win/languages/uk-UA.rc +++ b/src/win/languages/uk-UA.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "&Знову завантажити попередній образ", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Образ...", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index accc0dd47..c852222a4 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -177,6 +177,7 @@ BEGIN MENUITEM "载入上一个镜像(&R)", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "镜像(&I)", IDM_CDROM_IMAGE + MENUITEM "&Folder", IDM_CDROM_DIR END END diff --git a/src/win/win_media_menu.c b/src/win/win_media_menu.c index cf7974dd4..09eafa9dc 100644 --- a/src/win/win_media_menu.c +++ b/src/win/win_media_menu.c @@ -3,6 +3,7 @@ #include #include #include +#include #include <86box/86box.h> #include <86box/cdrom.h> #include <86box/config.h> @@ -308,11 +309,13 @@ media_menu_update_cdrom(int id) CheckMenuItem(menus[i], IDM_CDROM_MUTE | id, MF_BYCOMMAND | MF_UNCHECKED); if (cdrom[id].host_drive == 200) { - CheckMenuItem(menus[i], IDM_CDROM_IMAGE | id, MF_BYCOMMAND | MF_CHECKED); + CheckMenuItem(menus[i], IDM_CDROM_IMAGE | id, MF_BYCOMMAND | (cdrom[id].is_dir ? MF_UNCHECKED : MF_CHECKED)); + CheckMenuItem(menus[i], IDM_CDROM_DIR | id, MF_BYCOMMAND | (cdrom[id].is_dir ? MF_CHECKED : MF_UNCHECKED)); CheckMenuItem(menus[i], IDM_CDROM_EMPTY | id, MF_BYCOMMAND | MF_UNCHECKED); } else { cdrom[id].host_drive = 0; CheckMenuItem(menus[i], IDM_CDROM_IMAGE | id, MF_BYCOMMAND | MF_UNCHECKED); + CheckMenuItem(menus[i], IDM_CDROM_DIR | id, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(menus[i], IDM_CDROM_EMPTY | id, MF_BYCOMMAND | MF_CHECKED); } @@ -672,6 +675,27 @@ media_menu_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } break; + case IDM_CDROM_DIR: + BROWSEINFO bi = { + .hwndOwner = hwnd, + .ulFlags = BIF_EDITBOX + }; + OleInitialize(NULL); + int old_dopause = dopause; + plat_pause(1); + LPITEMIDLIST pidl = SHBrowseForFolder(&bi); + plat_pause(old_dopause); + plat_chdir(usr_path); + if (pidl) { + wchar_t wbuf[MAX_PATH + 1]; + if (SHGetPathFromIDList(pidl, wbuf)) { + char buf[MAX_PATH + 1]; + c16stombs(buf, wbuf, sizeof(buf) - 1); + cdrom_mount(id, buf); + } + } + break; + case IDM_ZIP_IMAGE_NEW: NewFloppyDialogCreate(hwnd, id | 0x80, 0); /* NewZIPDialogCreate */ break; diff --git a/src/win/win_settings.c b/src/win/win_settings.c index e6b4226b6..5d9bdea38 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -599,7 +599,7 @@ win_settings_save(void) /* Removable devices category */ memcpy(cdrom, temp_cdrom, CDROM_NUM * sizeof(cdrom_t)); for (i = 0; i < CDROM_NUM; i++) { - cdrom[i].img_fp = NULL; + cdrom[i].is_dir = 0; cdrom[i].priv = NULL; cdrom[i].ops = NULL; cdrom[i].image = NULL;