OSDN Git Service

[UI][Qt] Implement new feature of upstream 2018-12-28.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sat, 12 Jan 2019 13:41:19 +0000 (22:41 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sat, 12 Jan 2019 13:41:19 +0000 (22:41 +0900)
source/src/common.cpp
source/src/qt/common/util_fd2.cpp
source/src/qt/gui/menu_disk.cpp
source/src/qt/gui/menu_disk.h
source/src/qt/gui/qt_dialogs.cpp
source/src/qt/gui/qt_dialogs.h
source/src/qt/gui/util_fd.cpp

index a6ccfda..79da4e0 100644 (file)
@@ -399,6 +399,7 @@ DWORD DLL_PREFIX MyGetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName,
                lpp[0] = '\0';
        }
        FILEIO* fio = new FILEIO();
                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;
        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;
                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);
 }
 
        return strlen(lpp);
 }
 
index 881b8e1..133560d 100644 (file)
@@ -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);
        //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)) {
        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);
                }
        }
                        menu_fds[drive]->do_set_write_protect(false);
                }
        }
-#endif         
        return 0;
 }
 
        return 0;
 }
 
index 31a9536..b014856 100644 (file)
@@ -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");
        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()
 {
 }
 
 }
 
 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;
 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_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);
        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();
 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);
        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_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)));    
        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_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));
 }
        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));
 }
index 3240df4..c2730b3 100644 (file)
@@ -16,16 +16,23 @@ QT_BEGIN_NAMESPACE
 class DLL_PREFIX Menu_FDClass: public Menu_MetaClass {
        Q_OBJECT
 protected:
 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;
        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:
        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
 };
 
 QT_END_NAMESPACE
index 4546485..8f91571 100644 (file)
@@ -41,3 +41,34 @@ void CSP_DiskParams::_open_binary(QString s) {
        emit sig_open_binary_file(drive, s, play);
 }
 
        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)));
+
+}
+
index 5c6e71a..ba860ef 100644 (file)
 #define _CSP_QT_DIALOGS_H
 
 #include <QFileDialog>
 #define _CSP_QT_DIALOGS_H
 
 #include <QFileDialog>
+#include <QComboBox>
+#include <QGridLayout>
+#include <QLabel>
+#include <QApplication>
+#include <QWindow>
 
 #include "qt_main.h"
 
 
 #include "qt_main.h"
 
@@ -66,6 +71,32 @@ public:
                delete param;
        }
 } CSP_DiskDialog;
                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.
 QT_END_NAMESPACE
 
 #endif //End.
index a3b27e1..e767769 100644 (file)
@@ -61,6 +61,7 @@ void Object_Menu_Control::do_set_disk_count_immediate(bool flag)
        emit sig_emu_update_config();
 }
 
        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;
 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);
                
                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);
                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);