--- nono/wx/wxmainframe.h 2026/04/29 17:04:45 1.1.1.7 +++ nono/wx/wxmainframe.h 2026/04/29 17:05:57 1.1.1.21 @@ -4,131 +4,103 @@ // Licensed under nono-license.txt // +// +// メインウィンドウ +// + #pragma once -#include "wxheader.h" -#include "vm.h" +#include "wxnono.h" +#include "monitor.h" #include -enum { - // ID は 0 から (wxID_LOWEST = 5000 未満まで) 使えるっぽい。 - // メニュー ID はメニュー ID 内で一意という制約があるだけ。 - // メニュー ID のうちウィンドウのオープン状態を維持する必要がある - // ものはリスト(なり配列なり)で管理したいが、ID が 0 から使えるのなら - // 0 から割り当てて配列で管理してしまうのが手っ取り早い。 - // ウィンドウに割り当てるウィンドウ ID とメニューイベントで飛んでくる - // メニュー ID は互いに干渉しないはずなので、同じ値を使ってメニューと - // ウィンドウの紐付けをする。 - - // ウィンドウ ID (メニュー ID としても使う) - // wxmainframe.cpp 末尾の monitor_info[] と一致させること - WinID_Start = 0, - WinID_MONITOR_LOG = WinID_Start, - WinID_MONITOR_SCHEDULER, - WinID_MONITOR_MPUREG, - WinID_MONITOR_MPUATC, - WinID_MONITOR_BPOINT, - WinID_MONITOR_BRHIST68K, - WinID_MONITOR_BRHIST88K, - WinID_MONITOR_EXHIST68K, - WinID_MONITOR_EXHIST88K, - WinID_MONITOR_CMMU7, - WinID_MONITOR_CMMU6, - WinID_MONITOR_ATC7, - WinID_MONITOR_ATC6, - WinID_MONITOR_CACHE7, - WinID_MONITOR_CACHE6, - WinID_MONITOR_MEMDUMP, - WinID_MONITOR_INTERRUPT, - WinID_MONITOR_SPC, - WinID_MONITOR_RTC, - WinID_MONITOR_DMAC, - WinID_MONITOR_MFP, - WinID_MONITOR_SCC, - WinID_MONITOR_SIO, - WinID_MONITOR_PIO0, - WinID_MONITOR_LUNAKEYBOARD, - WinID_MONITOR_LCD, - WinID_MONITOR_LANCE, - WinID_MONITOR_BITMAP, - WinID_MONITOR_BITMAP0, - WinID_MONITOR_HOSTINFO, - WinID_MONITOR_NETDRIVER, - WinID_SOFTKEY, - WinID_LCD, - - // ウィンドウ ID ここまで。 - WinID_MAX, - - // ここからそれ以外の ID - ID_FULL_SPEED = WinID_MAX, - ID_RESET_VM, - ID_SCALE_START, - ID_SCALE_1_00, - ID_SCALE_0_75, - ID_SCALE_0_50, - ID_SCALE_END, - - ID_FONTSIZE_START, // START 以降は fontsize_t と同じ順に並べること - ID_FONTSIZE_12, - ID_FONTSIZE_16, - ID_FONTSIZE_END, - - ID_MONRATE_START, - ID_MONRATE_20, - ID_MONRATE_5, - ID_MONRATE_1, - ID_MONRATE_END, - - ID_MOUSEMODE, -}; +class FDDDevice; +class Keyboard; +class HostCOMDevice; +class HostNetDevice; +class HostSoundDevice; +class PowerDevice; +class SCSITarget; +class Syncer; +class WXBitmapPanel; +class WXMainView; +class WXStatusPanel; -class WXMainFrame - : public wxFrame +class WXMainFrame : public wxFrame { using inherited = wxFrame; - public: - // モニタウィンドウ識別名情報 - struct monitor_info { - const char * const name; // モニタ名 - vmf_t feature; // 機種 - }; + explicit WXMainFrame(wxWindow *); + ~WXMainFrame() override; - public: - WXMainFrame(wxWindow *); - virtual ~WXMainFrame() override; + // (設定反映などの) 初期化 + bool Init(); + + void Fit() override; + bool Layout() override; // ウィンドウをリストから削除する。 // ウィンドウをクローズする際に呼び出すこと。 - void DeleteWindow(wxWindowID id); + void DeleteWindow(wxWindow *); - // VM からの電源オフコールバック - void PowerOffCallback(); + // 起動時にオープンするサブウィンドウの一覧 + static std::array subwindow_start; - // VM からのダブルバスフォールト・コールバック - void HaltCallback(); + // モニタウィンドウの更新頻度取得・設定 + static int GetMonitorRate() { return monitor_rate; } + static void SetMonitorRate(int val) { monitor_rate = val; } + + // メンバの取得 + WXMainView *GetMainView() { return mainview; } + + // ホストドライバ用のメニューを作成して返す + void CreateHostNetMenu(wxMenu *, uint unit); + void CreateHostComMenu(wxMenu *, int n); + void CreateHostSoundMenu(wxMenu *); + + // SCSI リムーバブルデバイス、FD 用のメニューを作成して返す + wxMenu *CreateSCSIRemovableMenu(uint id) const; + wxMenu *CreateFDMenu(int unit) const; + + // FD を挿入する + void InsertFD(int unit, const std::string& path); + // FD をイジェクトする + void EjectFD(int unit, bool force); + + // CD を挿入する + void InsertCD(int id, const std::string& path); + // CD をイジェクトする + void EjectCD(int id, bool force); - // モニタウィンドウ識別名一覧 - // (引数 -M で指定されるやつ) - static struct monitor_info monitor_info[WinID_MAX]; - - // 起動時にオープンするモニタウィンドウの一覧 - static std::array monitor_start; - - // モニタウィンドウの更新頻度取得 - int GetMonitorRate() const { return monitor_rate; } + // ウィンドウタイトルを設定。 + void SetMyTitle(bool mousemode); private: - void OnCreate(wxCommandEvent& event); + void OnIdle(wxIdleEvent& event); void OnClose(wxCloseEvent& event); - void OnActivate(wxActivateEvent& event); + + void OnPowerButton(wxCommandEvent& event); + void OnPowerButtonUI(wxUpdateUIEvent& event); + void OnSoftReset(wxCommandEvent& event); + void OnResetButton(wxCommandEvent& event); + void OnNMIButton(wxCommandEvent& event); + void OnRestartVM(wxCommandEvent& event); + void OnExit(wxCommandEvent&); void OnFullSpeed(wxCommandEvent& event); void OnFullSpeedUI(wxUpdateUIEvent& event); - void OnResetVM(wxCommandEvent& event); - - void OnExit(wxCommandEvent&); + void OnMenuInput(wxCommandEvent& event); + void OnMenuInputUI(wxUpdateUIEvent& event); + void OnMenuHostNet(wxCommandEvent& event); + void OnMenuHostNetUI(wxUpdateUIEvent& event); + void OnMenuHostCom(wxCommandEvent& event); + void OnMenuHostComUI(wxUpdateUIEvent& event); + void OnMenuHostSound(wxCommandEvent& event); + void OnMenuHostSoundUI(wxUpdateUIEvent& event); + void OnHostNetFailed(wxCommandEvent& event); + void OnHostComFailed(wxCommandEvent& event); + void OnHostSoundFailed(wxCommandEvent& event); + void HostDriverFailed(const wxString& hostdev, const wxString& errmsg); void OnMenuScale(wxCommandEvent& event); void OnMenuScaleUI(wxUpdateUIEvent& event); @@ -136,9 +108,25 @@ class WXMainFrame void OnMenuFontSizeUI(wxUpdateUIEvent& event); void OnMenuMonRate(wxCommandEvent& event); void OnMenuMonRateUI(wxUpdateUIEvent& event); + void OnShowStatusPanel(wxCommandEvent& event); + void OnShowStatusPanelUI(wxUpdateUIEvent& event); + void OnFDInsert(wxCommandEvent& event); + void OnFDInsertUI(wxUpdateUIEvent& event); + void OnFDEject(wxCommandEvent& event); + void OnFDEjectUI(wxUpdateUIEvent& event); + void OnFDForce(wxCommandEvent& event); + void OnFDForceUI(wxUpdateUIEvent& event); + void OnCDInsert(wxCommandEvent& event); + void OnCDInsertUI(wxUpdateUIEvent& event); + void OnCDEject(wxCommandEvent& event); + void OnCDEjectUI(wxUpdateUIEvent& event); + void OnCDForce(wxCommandEvent& event); + void OnCDForceUI(wxUpdateUIEvent& event); void OnMouseMode(wxCommandEvent& event); void OnMouseModeUI(wxUpdateUIEvent& event); + void OnKeyboardConnect(wxCommandEvent& event); + void OnKeyboardConnectUI(wxUpdateUIEvent& event); void OnWindow(wxCommandEvent&); void DoWindow(int id, bool enable); @@ -146,24 +134,73 @@ class WXMainFrame void OnAbout(wxCommandEvent&); + // 指定のモニタ/サブウィンドウがあればメニューに追加する + void AppendIf(wxMenu *, int id, const wxString& label); + + int CreateMainviewScaleTable(); + void CreateMonRateTable(); + + // リムーバブルデバイス用のメニューを作成して追加する + void CreateRemovableMenu(wxMenu *); + // ウィンドウをリストに追加する。 void AddWindow(int id, wxWindow *); // 指定 ID のサブウィンドウがリストにあれば true を返す bool IsExistWindow(int id); + // UI 表示用テキストを返す。 + wxString GetHostNetLabel(uint n) const; + wxString GetHostComLabel(uint n) const; + + // メイン MPU 名を返す + wxString MPUName() const { return mpuname; } + // サブウィンドウリスト - std::unique_ptr windows[WinID_MAX] {}; + std::unique_ptr windows[ID_SUBWIN_MAX] {}; - // モニタの更新頻度(これが実行中の一次情報) - int monitor_rate {}; - // モニタ更新頻度 ID -> 数値変換 - static const int IDtoMonRate[]; + // メニュー操作用の SCSI デバイス + // (ホストアダプタが増えた時のことは考えていない) + std::array scsidev {}; + + // メニュー操作用の FDD デバイス + // (6台構成のことは考えていない) + std::array fdd_array {}; + + // ウィンドウタイトル + wxString frame_title {}; + + // ファイルダイアログを表示する際のカレントディレクトリ + std::string current_dir {}; + + // MPU 名 + std::string mpuname {}; // ダブルバスフォールト・イベント void OnHaltNotify(wxCommandEvent& event); + // メディア挿入失敗通知 + void OnInsertFailed(wxCommandEvent& event); + + WXMainView *mainview {}; + WXStatusPanel *statuspanel {}; + WXBitmapPanel *spaceL {}; + WXBitmapPanel *spaceR {}; + + Keyboard *keyboard {}; + std::array hostnet {}; + std::array hostcom {}; + HostCOMDevice *hostcom_dbg {}; + HostSoundDevice *hostsound {}; + PowerDevice *power {}; + Syncer *syncer {}; + + // 表示スケールの選択肢 + static std::vector view_scales; + + // モニタの更新頻度(これが実行中の一次情報) + static int monitor_rate; + // モニタ更新頻度の選択肢 + static std::vector monrates; wxDECLARE_EVENT_TABLE(); }; - -extern WXMainFrame *gMainFrame;