--- nono/wx/wxsoftkey.h 2026/04/29 17:04:56 1.1.1.7 +++ nono/wx/wxsoftkey.h 2026/04/29 17:05:08 1.1.1.11 @@ -4,14 +4,18 @@ // Licensed under nono-license.txt // +// +// ソフトウェアキーボード +// + #pragma once -#include "wxbitmapbuf.h" #include "wxsubwindow.h" #include "wxtextpanel.h" #include "keyboard.h" #include "vm.h" #include +#include #include // キー描画用のデータ構造体 @@ -49,12 +53,13 @@ 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:緑) }; // 修飾キーの状態 @@ -70,44 +75,43 @@ class WXSoftKeyPanel : public WXTextPane virtual ~WXSoftKeyPanel() override; // フォントサイズ変更 - void SetFontSize(FontId fontid) override; + void FontChanged() override; protected: - void InitLED(); - void DoSize(); - void OnPaint(wxPaintEvent& event); + void UpdateTitle(); + + void InitColorKeytop(int num); + void OnKeyChanged(wxCommandEvent& event); void OnTimer(wxTimerEvent& 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 Draw() override; + void DrawKey(const keydata_t& key); + void DrawEnterKey(); + void DrawEnterMark(int x, int y); + 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); - bool IsModifier(uint code) const; - void UpdateModifier(); - void KeyDown(const keydata_t& key); - void KeyUp(const keydata_t& key); + void KeyDown(uint code); + void KeyUp(uint code); const keydata_t *GetKeydataFromPoint(const wxPoint& pt) const; // 左クリック押下時のキー - const keydata_t *leftdown_key {}; + uint leftdown_key {}; + + // トグル動作にするキーの集合。 + // first はキーコード、 + // second は押下ならキーコード、開放なら 0。 + std::map toggle {}; // 修飾キーの状態 (刻印を変更するため) Modifier modifier {}; - // 前回の状態 - std::vector last_pressed {}; - Modifier last_modifier {}; - // フォントサイズに相対的な描画単位 int unit {}; @@ -115,16 +119,27 @@ class WXSoftKeyPanel : public WXTextPane int u_width {}; int u_height {}; - // コントロール全域のビットマップ - WXBitmapBuf bitmap {}; + // 初期タイトル + wxString title {}; - // エンター記号の周囲の点集合 - std::vector enter_points {}; - wxRegion enter_region {}; + // キーボードの接続状態 + bool connected {}; + + // エンターキーの矩形 + Rect enter_top {}; + Rect enter_btm {}; // 色 ColorPalette color {}; + // 残光処理 + // 10 : 減光しない点灯を示す (ただし色コードは 9) + // 9..1 : 減光中 (9 がもっとも明るい) + // 0 : 消灯中 + std::vector persistence {}; + + wxTimer timer {}; + // UTF-8 -> CP932 変換 // Unicode の "\\" は Shift_JIS に対応する文字がないため、これを // Unicode から Shift_JIS に変換すると "" になり、これではキートップが @@ -137,9 +152,6 @@ class WXSoftKeyPanel : public WXTextPane // キー描画データ (派生クラス側から渡される) const std::vector& keydata; - // タイマー - wxTimer timer {}; - // イベントテーブル wxDECLARE_EVENT_TABLE(); }; @@ -153,7 +165,7 @@ class WXLunaSoftKeyPanel : public WXSoft virtual ~WXLunaSoftKeyPanel() override; private: - int DrawLED(wxDC& dc, const keydata_t& key) override; + int DrawLED(const keydata_t& key) override; // キー描画データ static std::vector keydata; @@ -168,7 +180,7 @@ class WXX68kSoftKeyPanel : public WXSoft virtual ~WXX68kSoftKeyPanel() override; private: - int DrawLED(wxDC& dc, const keydata_t& key) override; + int DrawLED(const keydata_t& key) override; // キー描画データ static std::vector keydata;