--- nono/wx/wxsoftkey.h 2026/04/29 17:04:37 1.1.1.2 +++ nono/wx/wxsoftkey.h 2026/04/29 17:05:44 1.1.1.15 @@ -4,14 +4,22 @@ // Licensed under nono-license.txt // +// +// ソフトウェアキーボード +// + #pragma once #include "wxsubwindow.h" #include "wxtextpanel.h" #include "keyboard.h" +#include "mainapp.h" #include +#include #include +class Keyboard; + // キー描画用のデータ構造体 struct keydata_t { @@ -47,80 +55,97 @@ class WXSoftKeyPanel : public WXTextPane protected: // 色の集合(パレット) struct ColorPalette { - wxColour Background; // 背景というかガワの部分の色 - wxColour Text; // 文字色 - wxColour Keytop[2]; // キートップ色。0:通常色、1:(あれば)濃色 - wxColour KeyPressed; // キーが押された時のキートップ色 - wxColour Border; // LED 枠の薄い輪郭色 - wxColour LED[2]; // LED。色は各機種定義 (今のところ0:赤 1:緑) + Color Background; // 背景というかガワの部分の色 + Color Text; // 文字色 + Color Keytop[2][10]; // キートップ色。 + // [2]=0:通常色、1:(あれば)濃色 + // [10]=押され具合。0は押されていないとき + Color Border; // LED 点灯時の枠の色 + Color 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(); + ~WXSoftKeyPanel() override; // フォントサイズ変更 - void SetFontSize(fontsize_t fontsize); + void FontChanged() override; protected: - void InitLED(); - void DoSize(); - void OnSize(wxSizeEvent& event); - void OnPaint(wxPaintEvent& event); - - void Draw(wxDC& dc); - void DrawKey(wxDC& dc, const keydata_t& key); - void DrawEnterKey(wxDC& dc); - void DrawEnterMark(wxDC& dc, const wxPoint& basep); - virtual int DrawLED(wxDC& dc, const keydata_t& key) = 0; + void UpdateTitle(); + + void InitColorKeytop(int num); + void InitIcon(); + void OnKeyChanged(wxCommandEvent& event); + void OnTimer(wxTimerEvent& event); + + void Draw() override; + void DrawKey(const keydata_t& key); + void DrawEnterKey(); + void DrawBuzzer(const keydata_t& key); + virtual int DrawLED(const keydata_t& key) = 0; const keydata_t& FindKeydata(uint) const; void OnLeftDown(wxMouseEvent& event); - void DoLeftDown(const keydata_t *key); + void DoLeftDown(uint code); 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(uint code); + void KeyUp(uint code); const keydata_t *GetKeydataFromPoint(const wxPoint& pt) const; - // 押されていれば true (左クリック、右クリック区別なく両方)。 - // 共通キーコードによる配列。 - std::array hit {}; - // 左クリック押下時のキー - const keydata_t *leftdown_key = NULL; + uint leftdown_key {}; + + // トグル動作にするキーの集合。 + // first はキーコード、 + // second は押下ならキーコード、開放なら 0。 + std::map toggle {}; // 修飾キーの状態 (刻印を変更するため) - 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 {}; + + // 初期タイトル + wxString title {}; - // コントロールのサイズ [px] - int view_width = 0; - int view_height = 0; - - std::unique_ptr bmpbuf {}; - std::unique_ptr image {}; - std::unique_ptr bitmap {}; - - // エンター記号の周囲の点集合 - std::vector enter_points; - wxRegion enter_region; + // キーボードの接続状態 + bool connected {}; + + // エンターキーの矩形 + Rect enter_top {}; + Rect enter_btm {}; + + // アイコン + std::unique_ptr enter_icon /*{}*/; // 色 ColorPalette color {}; + // 残光処理 + // 10 : 減光しない点灯を示す (ただし色コードは 9) + // 9..1 : 減光中 (9 がもっとも明るい) + // 0 : 消灯中 + std::vector persistence {}; + + wxTimer timer {}; + // UTF-8 -> CP932 変換 // Unicode の "\\" は Shift_JIS に対応する文字がないため、これを // Unicode から Shift_JIS に変換すると "" になり、これではキートップが @@ -130,8 +155,10 @@ class WXSoftKeyPanel : public WXTextPane // こちらで決める。 wxCSConv conv { "CP932" }; - // キー描画データ - virtual const std::vector& GetKeydata() const = 0; + // キー描画データ (派生クラス側から渡される) + const std::vector& keydata; + + Keyboard *keyboard {}; // イベントテーブル wxDECLARE_EVENT_TABLE(); @@ -142,16 +169,13 @@ class WXLunaSoftKeyPanel : public WXSoft { using inherited = WXSoftKeyPanel; public: - WXLunaSoftKeyPanel(wxWindow *parent); - virtual ~WXLunaSoftKeyPanel(); + explicit WXLunaSoftKeyPanel(wxWindow *parent); + ~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(const keydata_t& key) override; // キー描画データ - virtual const std::vector& GetKeydata() const { return keydata; } static std::vector keydata; }; @@ -160,43 +184,21 @@ class WXX68kSoftKeyPanel : public WXSoft { using inherited = WXSoftKeyPanel; public: - WXX68kSoftKeyPanel(wxWindow *parent); - virtual ~WXX68kSoftKeyPanel(); + explicit WXX68kSoftKeyPanel(wxWindow *parent); + ~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(const keydata_t& key) override; // キー描画データ - virtual const std::vector& GetKeydata() const { return keydata; } static std::vector keydata; }; -// LUNA ソフトウェアキーボード (ウィンドウ) -class WXLunaSoftKeyWindow : public WXSubWindow +// ソフトウェアキーボード (ウィンドウ) +class WXSoftKeyWindow : 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 -{ - using inherited = WXSubWindow; - public: - WXX68kSoftKeyWindow(wxWindow *parent, wxWindowID id); - virtual ~WXX68kSoftKeyWindow(); - - virtual void SetFontSize(fontsize_t fontsize); - private: - // キーボードパネル - WXX68kSoftKeyPanel *panel = NULL; + WXSoftKeyWindow(wxWindow *parent, VMType vmtype); + ~WXSoftKeyWindow() override; };