--- nono/wx/wxsoftkey.h 2026/04/29 17:04:37 1.1.1.2 +++ nono/wx/wxsoftkey.h 2026/04/29 17:05:00 1.1.1.8 @@ -6,9 +6,11 @@ #pragma once +#include "wxbitmapbuf.h" #include "wxsubwindow.h" #include "wxtextpanel.h" #include "keyboard.h" +#include "vm.h" #include #include @@ -51,22 +53,30 @@ class WXSoftKeyPanel : public WXTextPane wxColour Text; // 文字色 wxColour Keytop[2]; // キートップ色。0:通常色、1:(あれば)濃色 wxColour KeyPressed; // キーが押された時のキートップ色 - wxColour Border; // LED 枠の薄い輪郭色 + wxColour Border; // LED 点灯時の枠の色 wxColour LED[2]; // LED。色は各機種定義 (今のところ0:赤 1:緑) }; + // 修飾キーの状態 + enum Modifier { + ModNormal = 0, + ModShift, + }; + + protected: + WXSoftKeyPanel(wxWindow *parent, const std::vector& keydata_, + int u_width_, int u_height_); public: - WXSoftKeyPanel(wxWindow *parent, int u_width_, int u_height_); - virtual ~WXSoftKeyPanel(); + virtual ~WXSoftKeyPanel() override; // フォントサイズ変更 - void SetFontSize(fontsize_t fontsize); + void SetFontSize(FontId fontid) override; protected: void InitLED(); void DoSize(); - void OnSize(wxSizeEvent& event); void OnPaint(wxPaintEvent& event); + void OnKeyChanged(wxCommandEvent& event); void Draw(wxDC& dc); void DrawKey(wxDC& dc, const keydata_t& key); @@ -81,42 +91,36 @@ class WXSoftKeyPanel : public WXTextPane void DoLeftUp(const keydata_t *key); void OnLeftDClick(wxMouseEvent& event); void OnRightDown(wxMouseEvent& event); - virtual void KeyDown(const keydata_t& key) = 0; - virtual void KeyUp(const keydata_t& key) = 0; + bool IsModifier(uint code) const; + void UpdateModifier(); + void KeyDown(const keydata_t& key); + void KeyUp(const keydata_t& key); const keydata_t *GetKeydataFromPoint(const wxPoint& pt) const; - // 押されていれば true (左クリック、右クリック区別なく両方)。 - // 共通キーコードによる配列。 - std::array hit {}; - // 左クリック押下時のキー - const keydata_t *leftdown_key = NULL; + const keydata_t *leftdown_key {}; // 修飾キーの状態 (刻印を変更するため) - enum { - ModNormal = 0, - ModShift, - } modifier {}; + Modifier modifier {}; + + // 前回の状態 + std::vector last_pressed {}; + Modifier last_modifier {}; // フォントサイズに相対的な描画単位 - int unit = 0; + int unit {}; // コントロールのサイズ [基準単位] - int u_width = 0; - int u_height = 0; + int u_width {}; + int u_height {}; - // コントロールのサイズ [px] - int view_width = 0; - int view_height = 0; - - std::unique_ptr bmpbuf {}; - std::unique_ptr image {}; - std::unique_ptr bitmap {}; + // コントロール全域のビットマップ + WXBitmapBuf bitmap {}; // エンター記号の周囲の点集合 - std::vector enter_points; - wxRegion enter_region; + std::vector enter_points {}; + wxRegion enter_region {}; // 色 ColorPalette color {}; @@ -130,8 +134,8 @@ class WXSoftKeyPanel : public WXTextPane // こちらで決める。 wxCSConv conv { "CP932" }; - // キー描画データ - virtual const std::vector& GetKeydata() const = 0; + // キー描画データ (派生クラス側から渡される) + const std::vector& keydata; // イベントテーブル wxDECLARE_EVENT_TABLE(); @@ -143,15 +147,12 @@ class WXLunaSoftKeyPanel : public WXSoft using inherited = WXSoftKeyPanel; public: WXLunaSoftKeyPanel(wxWindow *parent); - virtual ~WXLunaSoftKeyPanel(); + virtual ~WXLunaSoftKeyPanel() override; private: - virtual int DrawLED(wxDC& dc, const keydata_t& key); - virtual void KeyDown(const keydata_t& key); - virtual void KeyUp(const keydata_t& key); + int DrawLED(wxDC& dc, const keydata_t& key) override; // キー描画データ - virtual const std::vector& GetKeydata() const { return keydata; } static std::vector keydata; }; @@ -161,42 +162,24 @@ class WXX68kSoftKeyPanel : public WXSoft using inherited = WXSoftKeyPanel; public: WXX68kSoftKeyPanel(wxWindow *parent); - virtual ~WXX68kSoftKeyPanel(); + virtual ~WXX68kSoftKeyPanel() override; private: - virtual int DrawLED(wxDC& dc, const keydata_t& key); - virtual void KeyDown(const keydata_t& key); - virtual void KeyUp(const keydata_t& key); + int DrawLED(wxDC& dc, const keydata_t& key) override; // キー描画データ - virtual const std::vector& GetKeydata() const { return keydata; } static std::vector keydata; }; -// LUNA ソフトウェアキーボード (ウィンドウ) -class WXLunaSoftKeyWindow : public WXSubWindow -{ - using inherited = WXSubWindow; - public: - WXLunaSoftKeyWindow(wxWindow *parent, wxWindowID id); - virtual ~WXLunaSoftKeyWindow(); - - virtual void SetFontSize(fontsize_t fontsize); - private: - // キーボードパネル - WXLunaSoftKeyPanel *panel = NULL; -}; - -// X68k ソフトウェアキーボード (ウィンドウ) -class WXX68kSoftKeyWindow : public WXSubWindow +// ソフトウェアキーボード (ウィンドウ) +class WXSoftKeyWindow : public WXSubWindow { using inherited = WXSubWindow; public: - WXX68kSoftKeyWindow(wxWindow *parent, wxWindowID id); - virtual ~WXX68kSoftKeyWindow(); + WXSoftKeyWindow(wxWindow *parent, vmtype_t vmtype); + virtual ~WXSoftKeyWindow() override; - virtual void SetFontSize(fontsize_t fontsize); private: // キーボードパネル - WXX68kSoftKeyPanel *panel = NULL; + WXSoftKeyPanel *panel {}; };