--- nono/wx/wxstatuspanel.h 2026/04/29 17:04:56 1.1.1.2 +++ nono/wx/wxstatuspanel.h 2026/04/29 17:05:27 1.1.1.9 @@ -4,110 +4,91 @@ // Licensed under nono-license.txt // +// +// ステータスパネル +// + #pragma once -#include "wxnono.h" -#include "wxbitmapbuf.h" #include "wxtextpanel.h" -#include "scsibus.h" +#include "fdd.h" +#include class Indicator; +class PowerDevice; +class Syncer; +class Status; 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_; - draw = draw_; - } - - // 表示する文字列。 - // 描画関数はこの文字列を使っても使わなくてもよいが、InitIndicators() が - // この文字数に応じた大きさの枠を用意するため、使わない場合でも文字数 - // だけは揃えておくこと。 - std::string text {}; - - // 描画関数 - dispfunc_t draw {}; - - // ダブルクリックの処理関数 - dclickfunc_t dclick {}; - - // ユーザデータ (ご自由にお使いください、SCSI ID とか) - int userdata {}; - - // 枠の位置と大きさ (実行時に計算する) - wxRect rect {}; -}; - // ステータスパネル class WXStatusPanel : public WXTextPanel { using inherited = WXTextPanel; + public: - WXStatusPanel(wxWindow *parent); - virtual ~WXStatusPanel() override; + explicit WXStatusPanel(wxWindow *parent); + ~WXStatusPanel() override; - void SetFontSize(FontId) override; + void FontChanged() override; private: 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 DrawPerf(const Indicator *); + void DrawSCSI(const Indicator *); + void DrawVBlk(const Indicator *); + void DrawNet(const Indicator *); + void DrawFD(const Indicator *); + void DrawNewsLED1(const Indicator *); + void DrawNewsLED2(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 *); - // コントロール全域のビットマップ - WXBitmapBuf bitmap {}; + // 状態 + std::vector stats {}; // インジケータ情報 - std::vector indicators {}; + std::vector indicators {}; // インジケータ表示用 bool ispower {}; - int perf_mode {}; - int perf_rate {}; - std::shared_ptr scsibus {}; - uint8 scsi_bsy {}; - bool scsi_out {}; - enum { - NOT_AVAILABLE = -1, // 存在しない (Nereid なし X68k とか) - DISABLE = 0, // 存在してホスト側が無効 (driver = none) - ENABLE = 1, // 存在してホスト側が有効 - } net_ok {}; - uint64 net_tx_pkts {}; - uint64 net_rx_pkts {}; - bool net_tx_active {}; - bool net_rx_active {}; + bool powerled {}; + uint perf_mode {}; + uint perf_rate {}; + std::array scsi_loaded {}; + std::array fd_loaded {}; + + // 丸いアクセスマーク (X68k FD 用) + std::unique_ptr accmark /*{}*/; + + // 背景再描画 + bool refresh_background {}; + + PowerDevice *power {}; + Syncer *syncer {}; // タイマー wxTimer timer {}; // イベントテーブル wxDECLARE_EVENT_TABLE(); -}; -extern WXStatusPanel *gStatusPanel; + static const uint8 AccessMark12[]; + static const uint8 AccessMark16[]; + static const uint8 AccessMark24[]; +};