--- nono/wx/wxstatuspanel.h 2026/04/29 17:04:53 1.1.1.1 +++ nono/wx/wxstatuspanel.h 2026/04/29 17:05:12 1.1.1.5 @@ -4,49 +4,90 @@ // Licensed under nono-license.txt // +// +// ステータスパネル +// + #pragma once -#include "wxheader.h" -#include "wxbmp.h" #include "wxtextpanel.h" +#include "fdd.h" #include "scsibus.h" +#include class Indicator; +class HostNetDevice; class WXStatusPanel; -// インジケータ情報 +// インジケータ情報 (ほぼ構造体) class Indicator { - using dispfunc_t = void (WXStatusPanel::*)(wxDC&, const Indicator&); - using dclickfunc_t = void (WXStatusPanel::*)(const Indicator&); public: - Indicator(const std::string& text_, dispfunc_t draw_, int data_) - : Indicator(text_, draw_) - { - userdata = data_; - } - Indicator(const std::string& text_, dispfunc_t draw_) { - text = text_; + // インジケータの識別子 + enum { + NONE = 0, + PERF, + POWER, + SCSI0, + SCSI1, + SCSI2, + SCSI3, + SCSI4, + SCSI5, + SCSI6, + SCSI7, + LAN, + FDD0, + FDD1, + FDD2, + FDD3, + }; + protected: + using dispfunc_t = void (WXStatusPanel::*)(const Indicator *); + using eventfunc_t = void (WXStatusPanel::*)(const Indicator *); + public: + Indicator() { } + Indicator(int id_, int minlen_, dispfunc_t draw_) { + id = id_; + minlen = minlen_; draw = draw_; } + virtual ~Indicator() = default; + + // インジケータ識別子 + int id {}; + + // 枠内の最小文字列長。 + // 枠の大きさはこの文字列長と text.length() の長いほうで描画される。 + int minlen {}; // 表示する文字列。 - // 描画関数はこの文字列を使っても使わなくてもよいが、InitIndicators() が - // この文字数に応じた大きさの枠を用意するため、使わない場合でも文字数 - // だけは揃えておくこと。 std::string text {}; - // 描画関数 + // 描画関数 (必須) dispfunc_t draw {}; - // ダブルクリックの処理関数 - dclickfunc_t dclick {}; + // ダブルクリックの処理関数 (必要なら) + eventfunc_t dclick {}; + + // コンテキストメニューの処理関数 (必要なら) + eventfunc_t contextmenu {}; - // ユーザデータ (ご自由にお使いください、SCSI ID とか) - int userdata {}; + // 対応するデバイス (必要なら) + Device *dev {}; - // 枠の位置と大きさ (実行時に計算する) - wxRect rect {}; + // ToolTip を表示するためのダミーパネル + wxPanel *panel {}; + + // 枠の位置と大きさは panel.GetRect() で取得できる (実行時に計算する) + Rect rect {}; + + public: + // SCSI なら SCSI ID を返す。そうでなければ -1 を返す。 + int GetSCSIID() const; + + // FDD ならユニット番号を返す。そうでなければ -1 を返す。 + int GetFDUnit() const; }; // ステータスパネル @@ -57,57 +98,70 @@ class WXStatusPanel : public WXTextPanel WXStatusPanel(wxWindow *parent); virtual ~WXStatusPanel() override; - void SetFontSize(FontId) override; + void FontChanged() override; private: - void OnCreate(wxCommandEvent&); void OnClose(wxCloseEvent&); void OnShow(wxShowEvent&); void OnSize(wxSizeEvent&); void OnTimer(wxTimerEvent&); - void OnPaint(wxPaintEvent&); void OnLeftDClick(wxMouseEvent&); + void OnContextMenu(wxContextMenuEvent&); + void OnSCSIMediaChanged(wxCommandEvent&); + void OnFDDMediaChanged(wxCommandEvent&); + void OnLEDChanged(wxCommandEvent&); - void DoSize(); bool UpdateStat(); - void Draw(wxDC&); + void Draw() override; void InitIndicators(); void LayoutIndicators(); - void DrawPerf(wxDC&, const Indicator&); - void DrawSCSI(wxDC&, const Indicator&); - void DrawNet(wxDC&, const Indicator&); - void DrawPower(wxDC&, const Indicator&); - void DrawTextLED(wxDC&, const Indicator&, - const wxColour& fg, const wxColour& bg); - void DClickPerf(const Indicator&); - void UpdateFFMark(); - - // コントロール全域のビットマップ - WXBitmap bitmap {}; - - // 高速モードアイコン - std::unique_ptr ffmark {}; + void DrawPerf(const Indicator *); + void DrawSCSI(const Indicator *); + void DrawNet(const Indicator *); + void DrawFD(const Indicator *); + void DrawPower(const Indicator *); + void DrawTextLED(const Indicator *, Color fg, Color bg); + void DClickPerf(const Indicator *); + void ContextMenuCD(const Indicator *); + void ContextMenuFD(const Indicator *); // インジケータ情報 - std::vector indicators {}; + std::vector indicators {}; // インジケータ表示用 bool ispower {}; - bool last_ispower {}; + bool powerled {}; int perf_mode {}; - int last_perf_mode {}; int perf_rate {}; - int last_perf_rate {}; std::shared_ptr scsibus {}; uint8 scsi_bsy {}; - uint8 last_scsi_bsy {}; - bool net_ok {}; + bool scsi_out {}; + uint8 scsi_loaded {}; + enum { + NOT_AVAILABLE = -1, // 存在しない (Nereid なし X68k とか) + DISABLE = 0, // 存在してホスト側が無効 (driver = none) + ENABLE = 1, // 存在してホスト側が有効 + } net_ok {}; + HostNetDevice *hostnet {}; + uint64 net_tx_pkts {}; + uint64 net_rx_pkts {}; + bool net_tx_active {}; + bool net_rx_active {}; + std::array fd_loaded {}; + std::array fd_access_led {}; + std::array fd_eject_led {}; + + // 背景再描画 + bool refresh_background {}; // タイマー wxTimer timer {}; // イベントテーブル wxDECLARE_EVENT_TABLE(); + + static const uint8 AccessMark12[]; + static const uint8 AccessMark16[]; }; extern WXStatusPanel *gStatusPanel;