From 5c2ed532f5698e6b97188043844aad5a44fedbc9 Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Sat, 12 Jan 2019 22:41:19 +0900 Subject: [PATCH] [UI][Qt] Implement new feature of upstream 2018-12-28. --- source/src/common.cpp | 3 +- source/src/qt/common/util_fd2.cpp | 11 ---- source/src/qt/gui/menu_disk.cpp | 110 +++++++++++++++++++++++++++++++++++++- source/src/qt/gui/menu_disk.h | 7 +++ source/src/qt/gui/qt_dialogs.cpp | 31 +++++++++++ source/src/qt/gui/qt_dialogs.h | 31 +++++++++++ source/src/qt/gui/util_fd.cpp | 3 ++ 7 files changed, 183 insertions(+), 13 deletions(-) diff --git a/source/src/common.cpp b/source/src/common.cpp index a6ccfda93..79da4e0f6 100644 --- a/source/src/common.cpp +++ b/source/src/common.cpp @@ -399,6 +399,7 @@ DWORD DLL_PREFIX MyGetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, lpp[0] = '\0'; } FILEIO* fio = new FILEIO(); + if(!(fio->IsFileExisting(lpFileName))) return 0; if(fio->Fopen(lpFileName, FILEIO_READ_ASCII)) { bool in_section = false; char section[1024], line[1024], *equal; @@ -424,7 +425,7 @@ DWORD DLL_PREFIX MyGetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, fio->Fclose(); } delete fio; - //csp_logger->debug_log(CSP_LOG_DEBUG, CSP_LOG_TYPE_GENERAL, "Try App: %s Key: %s", lpAppName, lpKeyName); + csp_logger->debug_log(CSP_LOG_DEBUG, CSP_LOG_TYPE_GENERAL, "Try App: %s Key: %s", lpAppName, lpKeyName); return strlen(lpp); } diff --git a/source/src/qt/common/util_fd2.cpp b/source/src/qt/common/util_fd2.cpp index 881b8e126..133560d2e 100644 --- a/source/src/qt/common/util_fd2.cpp +++ b/source/src/qt/common/util_fd2.cpp @@ -31,16 +31,6 @@ int Ui_MainWindowBase::set_d88_slot(int drive, int num) //path = QString::fromUtf8(emu->d88_file[drive].path); path = hRunEmu->get_d88_file_path(drive); menu_fds[drive]->do_select_inner_media(num); -#if 0 - if(emu && emu->d88_file[drive].cur_bank != num) { - emit sig_open_disk(drive, path, num); - if(emu->is_floppy_disk_protected(drive)) { - menu_fds[drive]->do_set_write_protect(true); - } else { - menu_fds[drive]->do_set_write_protect(false); - } - } -#else if(hRunEmu->get_d88_file_cur_bank(drive) != num) { emit sig_open_disk(drive, path, num); if(hRunEmu->is_floppy_disk_protected(drive)) { @@ -49,7 +39,6 @@ int Ui_MainWindowBase::set_d88_slot(int drive, int num) menu_fds[drive]->do_set_write_protect(false); } } -#endif return 0; } diff --git a/source/src/qt/gui/menu_disk.cpp b/source/src/qt/gui/menu_disk.cpp index 31a9536fe..b014856aa 100644 --- a/source/src/qt/gui/menu_disk.cpp +++ b/source/src/qt/gui/menu_disk.cpp @@ -19,12 +19,109 @@ Menu_FDClass::Menu_FDClass(QMenuBar *root_entry, QString desc, USING_FLAGS *p, Q use_write_protect = true; use_d88_menus = true; icon_floppy = QIcon(":/icon_floppy.png"); + + for(int i = 0; i < 4; i++) { + type_mask[i] = true; + } } Menu_FDClass::~Menu_FDClass() { } +void Menu_FDClass::do_set_create_mask(quint8 type, bool flag) +{ + switch(type) { + case 0x00: // 2D + type_mask[0] = flag; + break; + case 0x10: // 2DD + type_mask[1] = flag; + break; + case 0x20: // 2HD + type_mask[2] = flag; + break; + case 0x30: // 2HD/1.44M + type_mask[3] = flag; + break; + } +} + +void Menu_FDClass::do_open_dialog_create_fd() +{ + CSP_CreateDiskDialog dlg(type_mask); + + if(initial_dir.isEmpty()) { + QDir dir; + char app[PATH_MAX]; + initial_dir = dir.currentPath(); + strncpy(app, initial_dir.toLocal8Bit().constData(), PATH_MAX - 1); + initial_dir = QString::fromLocal8Bit(get_parent_dir(app)); + } + + dlg.dlg->setDirectory(initial_dir); + QString create_ext = QString::fromUtf8("*.d88 *.d77"); + QString create_desc = QString::fromUtf8("D88/D77 Virtual Floppy Image."); + QString all = QString::fromUtf8("All Files (*.*)"); + QString tmps = create_desc; + tmps.append(QString::fromUtf8(" (")); + tmps.append(create_ext.toLower()); + tmps.append(QString::fromUtf8(" ")); + tmps.append(create_ext.toUpper()); + tmps.append(QString::fromUtf8(")")); + QStringList __filter; + __filter.clear(); + __filter << tmps; + __filter << all; + __filter.removeDuplicates(); + dlg.dlg->setNameFilters(__filter); + + tmps.clear(); + tmps = QApplication::translate("MenuMedia", "Create D88/D77 virtual floppy", 0); + if(!window_title.isEmpty()) { + tmps = tmps + QString::fromUtf8(" ") + window_title; + } else { + tmps = tmps + QString::fromUtf8(" ") + this->title(); + } + dlg.dlg->setWindowTitle(tmps); + + QObject::connect(&dlg, SIGNAL(sig_create_disk(quint8, QString)), this, SLOT(do_create_media(quint8, QString))); + + dlg.show(); + dlg.dlg->exec(); + return; +} + +void Menu_FDClass::do_create_media(quint8 media_type, QString name) +{ + + if(!(name.isEmpty())) { +#pragma pack(1) + struct { + char title[17]; + uint8_t rsrv[9]; + uint8_t protect; + uint8_t type; + uint32_t size; + uint32_t trkptr[164]; + } d88_hdr; +#pragma pack() + memset(&d88_hdr, 0, sizeof(d88_hdr)); + my_strcpy_s(d88_hdr.title, sizeof(d88_hdr.title), "BLANK"); + d88_hdr.type = media_type; + d88_hdr.size = sizeof(d88_hdr); + + FILEIO *fio = new FILEIO(); + if(fio->Fopen(name.toUtf8().data(), FILEIO_WRITE_BINARY)) { + fio->Fwrite(&d88_hdr, sizeof(d88_hdr), 1); + fio->Fclose(); + emit sig_open_media(media_drive, name); + } + delete fio; + } +} + + void Menu_FDClass::create_pulldown_menu_device_sub(void) { config_t *p; @@ -43,6 +140,10 @@ void Menu_FDClass::create_pulldown_menu_device_sub(void) action_count_immediate->setCheckable(true); action_count_immediate->binds->setDrive(media_drive); + action_create_fd = new Action_Control(p_wid, using_flags); + action_create_fd->setVisible(true); + action_create_fd->setCheckable(false); + p = p_config; if(p != NULL) { if(p->correct_disk_timing[media_drive]) action_correct_timing->setChecked(true); @@ -55,6 +156,8 @@ void Menu_FDClass::create_pulldown_menu_device_sub(void) void Menu_FDClass::connect_menu_device_sub(void) { this->addSeparator(); + this->addAction(action_create_fd); + this->addSeparator(); this->addAction(action_ignore_crc_error); this->addAction(action_correct_timing); this->addAction(action_count_immediate); @@ -67,7 +170,9 @@ void Menu_FDClass::connect_menu_device_sub(void) connect(action_count_immediate, SIGNAL(toggled(bool)), action_count_immediate->binds, SLOT(do_set_disk_count_immediate(bool))); - + + connect(action_create_fd, SIGNAL(triggered()), this, SLOT(do_open_dialog_create_fd())); + connect(this, SIGNAL(sig_open_media(int, QString)), p_wid, SLOT(_open_disk(int, QString))); connect(this, SIGNAL(sig_eject_media(int)), p_wid, SLOT(eject_fd(int))); connect(this, SIGNAL(sig_write_protect_media(int, bool)), p_wid, SLOT(write_protect_fd(int, bool))); @@ -86,6 +191,9 @@ void Menu_FDClass::retranslate_pulldown_menu_device_sub(void) action_correct_timing->setText(QApplication::translate("MenuMedia", "Correct transfer timing", 0)); action_correct_timing->setToolTip(QApplication::translate("MenuMedia", "Correct transferring timing.\nUseful for some softwares\n needs strict transfer timing.", 0)); + action_create_fd->setText(QApplication::translate("MenuMedia", "Create Virtual Floppy", 0)); + action_create_fd->setToolTip(QApplication::translate("MenuMedia", "Create and mount virtual blank-floppy disk.\nThis makes only D88/D77 format.", 0)); + action_count_immediate->setText(QApplication::translate("MenuMedia", "Immediate increment", 0)); action_count_immediate->setToolTip(QApplication::translate("MenuMedia", "Increment data pointer immediately.\nThis is test hack for MB8877.\nUseful for some softwares\n needs strict transfer timing.", 0)); } diff --git a/source/src/qt/gui/menu_disk.h b/source/src/qt/gui/menu_disk.h index 3240df4e2..c2730b308 100644 --- a/source/src/qt/gui/menu_disk.h +++ b/source/src/qt/gui/menu_disk.h @@ -16,16 +16,23 @@ QT_BEGIN_NAMESPACE class DLL_PREFIX Menu_FDClass: public Menu_MetaClass { Q_OBJECT protected: + class Action_Control *action_create_fd; class Action_Control *action_ignore_crc_error; class Action_Control *action_correct_timing; class Action_Control *action_count_immediate; QIcon icon_floppy; + bool type_mask[6]; public: Menu_FDClass(QMenuBar *root_entry, QString desc, USING_FLAGS *p, QWidget *parent = 0, int drv = 0, int base_drv = 1); ~Menu_FDClass(); void create_pulldown_menu_device_sub(); void connect_menu_device_sub(void); void retranslate_pulldown_menu_device_sub(void); + +public slots: + void do_open_dialog_create_fd(); + void do_create_media(quint8 media_type, QString name); + void do_set_create_mask(quint8 type, bool flag); }; QT_END_NAMESPACE diff --git a/source/src/qt/gui/qt_dialogs.cpp b/source/src/qt/gui/qt_dialogs.cpp index 4546485cb..8f915715c 100644 --- a/source/src/qt/gui/qt_dialogs.cpp +++ b/source/src/qt/gui/qt_dialogs.cpp @@ -41,3 +41,34 @@ void CSP_DiskParams::_open_binary(QString s) { emit sig_open_binary_file(drive, s, play); } + +CSP_CreateDiskDialog::CSP_CreateDiskDialog(bool *masks, QWidget *parent = 0) : QWidget(parent) +{ + __real_media_type = 0x00; + dlg = new QFileDialog(NULL, Qt::Widget); + dlg->setParent(this); + dlg->setOption(QFileDialog::ReadOnly, false); + dlg->setOption(QFileDialog::DontConfirmOverwrite, false); + dlg->setOption(QFileDialog::DontUseNativeDialog, true); + dlg->setAcceptMode(QFileDialog::AcceptSave); + dlg->setFileMode(QFileDialog::AnyFile); + + param = new CSP_FileParams(); + if(masks[0]) media_type.addItem(QString::fromUtf8("2D"), (const quint8)0x00); + if(masks[1]) media_type.addItem(QString::fromUtf8("2DD"), (const quint8)0x10); + if(masks[2]) media_type.addItem(QString::fromUtf8("2HD"), (const quint8)0x20); + if(masks[3]) media_type.addItem(QString::fromUtf8("2HD/1.44M"), (const quint8)0x30); + + type_label.setText(QApplication::translate("MenuMedia", "Virtual FD type:", 0)); + type_label.setToolTip(QApplication::translate("MenuMedia", "Select type of virtual floppy.", 0)); + + layout.addWidget(&type_label, 1, 0); + layout.addWidget(&media_type, 1, 1); + layout.addWidget(dlg, 2, 0, 2, 4); + + this->setLayout(&layout); + connect(&media_type, SIGNAL(activated(int)), this, SLOT(do_set_type(int))); + connect(dlg, SIGNAL(fileSelected(QString)), this, SLOT(do_create_disk(QString))); + +} + diff --git a/source/src/qt/gui/qt_dialogs.h b/source/src/qt/gui/qt_dialogs.h index 5c6e71a42..ba860efab 100644 --- a/source/src/qt/gui/qt_dialogs.h +++ b/source/src/qt/gui/qt_dialogs.h @@ -11,6 +11,11 @@ #define _CSP_QT_DIALOGS_H #include +#include +#include +#include +#include +#include #include "qt_main.h" @@ -66,6 +71,32 @@ public: delete param; } } CSP_DiskDialog; + +class CSP_CreateDiskDialog : public QWidget { + Q_OBJECT + quint8 __real_media_type; + QComboBox media_type; + QLabel type_label; + QGridLayout layout; +public: + QFileDialog* dlg; + CSP_FileParams *param; + CSP_CreateDiskDialog(bool *masks, QWidget *parent = 0); + ~CSP_CreateDiskDialog() { + delete param; + delete dlg; + } +signals: + int sig_create_disk(quint8, QString); +public slots: + void do_set_type(int i) { + __real_media_type = media_type.itemData(i).toUInt(); + } + void do_create_disk(QString s) { + emit sig_create_disk(__real_media_type, s); + } +}; + QT_END_NAMESPACE #endif //End. diff --git a/source/src/qt/gui/util_fd.cpp b/source/src/qt/gui/util_fd.cpp index a3b27e10b..e76776972 100644 --- a/source/src/qt/gui/util_fd.cpp +++ b/source/src/qt/gui/util_fd.cpp @@ -61,6 +61,7 @@ void Object_Menu_Control::do_set_disk_count_immediate(bool flag) emit sig_emu_update_config(); } + int Ui_MainWindowBase::write_protect_fd(int drv, bool flag) { if((drv < 0) || (drv >= using_flags->get_max_drive())) return -1; @@ -87,6 +88,8 @@ void Ui_MainWindowBase::CreateFloppyMenu(int drv, int drv_base) menu_fds[drv]->do_clear_inner_media(); menu_fds[drv]->do_add_media_extension(ext, desc1); + + SETUP_HISTORY(p_config->recent_floppy_disk_path[drv], listFDs[drv]); menu_fds[drv]->do_update_histories(listFDs[drv]); menu_fds[drv]->do_set_initialize_directory(p_config->initial_floppy_disk_dir); -- 2.11.0