--- nono/wx/wxsoftkey.h 2026/04/29 17:04:37 1.1.1.2 +++ nono/wx/wxsoftkey.h 2026/04/29 17:05:04 1.1.1.9 @@ -6,9 +6,11 @@ #pragma once +#include "wxbitmapbuf.h" #include "wxsubwindow.h" #include "wxtextpanel.h" #include "keyboard.h" +#include "vm.h" #include #include @@ -49,24 +51,34 @@ class WXSoftKeyPanel : public WXTextPane struct ColorPalette { wxColour Background; // 背景というかガワの部分の色 wxColour Text; // 文字色 - wxColour Keytop[2]; // キートップ色。0:通常色、1:(あれば)濃色 - wxColour KeyPressed; // キーが押された時のキートップ色 - wxColour Border; // LED 枠の薄い輪郭色 + wxColour Keytop[2][10]; // キートップ色。 + // [2]=0:通常色、1:(あれば)濃色 + // [10]=押され具合。0は押されていないとき + 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 InitColorKeytop(int num); void DoSize(); - void OnSize(wxSizeEvent& event); void OnPaint(wxPaintEvent& event); + void OnKeyChanged(wxCommandEvent& event); + void OnTimer(wxTimerEvent& event); void Draw(wxDC& dc); void DrawKey(wxDC& dc, const keydata_t& key); @@ -74,53 +86,53 @@ class WXSoftKeyPanel : public WXTextPane void DrawEnterMark(wxDC& dc, const wxPoint& basep); virtual int DrawLED(wxDC& dc, const keydata_t& key) = 0; const keydata_t& FindKeydata(uint) const; + static bool IsShiftKey(uint keycode); void OnLeftDown(wxMouseEvent& event); void DoLeftDown(const keydata_t *key); void OnLeftUp(wxMouseEvent& event); - 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; + 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 {}; + + // SHIFT キー長押し中なら true。 + // SHIFT 状態でのみ意味を持つので事前に gKeyboard->IsShift() 確認すること。 + bool shift_hold {}; // 修飾キーの状態 (刻印を変更するため) - enum { - ModNormal = 0, - ModShift, - } modifier {}; + Modifier 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 {}; + // 残光処理 + // 10 : 減光しない点灯を示す (ただし色コードは 9) + // 9..1 : 減光中 (9 がもっとも明るい) + // 0 : 消灯中 + std::vector persistence {}; + + wxTimer timer {}; + // UTF-8 -> CP932 変換 // Unicode の "\\" は Shift_JIS に対応する文字がないため、これを // Unicode から Shift_JIS に変換すると "" になり、これではキートップが @@ -130,8 +142,8 @@ class WXSoftKeyPanel : public WXTextPane // こちらで決める。 wxCSConv conv { "CP932" }; - // キー描画データ - virtual const std::vector& GetKeydata() const = 0; + // キー描画データ (派生クラス側から渡される) + const std::vector& keydata; // イベントテーブル wxDECLARE_EVENT_TABLE(); @@ -143,15 +155,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 +170,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 {}; };