--- nono/wx/wxsoftkey.h 2026/04/29 17:04:28 1.1.1.1 +++ nono/wx/wxsoftkey.h 2026/04/29 17:05:44 1.1.1.15 @@ -1,6 +1,11 @@ // // nono -// Copyright (C) 2019 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + +// +// ソフトウェアキーボード // #pragma once @@ -8,9 +13,13 @@ #include "wxsubwindow.h" #include "wxtextpanel.h" #include "keyboard.h" +#include "mainapp.h" #include +#include #include +class Keyboard; + // キー描画用のデータ構造体 struct keydata_t { @@ -21,8 +30,15 @@ struct keydata_t int y; // このキー枠の左上点 int w; // このキー枠の幅 int h; // このキー枠の高さ - int coltype; // キートップの色(1:濃, 0:薄) + + // 色種別 + // LUNA の場合はキートップ色の区別に使う。1=濃い, 0=通常。 + // X68k では使用しない。 + int coltype; + + int led; // -1ならLEDなし、0以上なら LED 番号 uint keycode; // キーコード (keyboard.h の KC_*) + // 刻印 // [0]: 通常 // [1]: SHIFT時 (NULL なら通常のまま) @@ -32,76 +48,103 @@ struct keydata_t int bottom() const { return y + h; } // このキー枠の下 }; -class WXLunaSoftKeyPanel : public WXTextPanel +// ソフトウェアキーボード (パネル) 共通部分 +class WXSoftKeyPanel : public WXTextPanel { - typedef WXTextPanel inherited; + using inherited = WXTextPanel; + protected: + // 色の集合(パレット) + struct ColorPalette { + 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: - WXLunaSoftKeyPanel(wxWindow *parent); - ~WXLunaSoftKeyPanel(); + ~WXSoftKeyPanel() override; // フォントサイズ変更 - void SetFontSize(fontsize_t fontsize); + void FontChanged() override; - private: - 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); - const wxColour GetTopColor(const keydata_t& key) const; + protected: + 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(uint code); void OnLeftUp(wxMouseEvent& event); - void DoLeftUp(uint code); void OnLeftDClick(wxMouseEvent& event); void OnRightDown(wxMouseEvent& event); void KeyDown(uint code); void KeyUp(uint code); - uint GetKeycodeFromPoint(const wxPoint& pt) const; - // XXX どうするかね - bool black_keyboard = false; + const keydata_t *GetKeydataFromPoint(const wxPoint& pt) const; - // LED キーなら true を返す - bool IsLEDKey(uint code) const { - return (code == KC_CAPS || code == KC_kana); - } - - // 押されていれば true (左クリック、右クリック区別なく両方)。 - // 共通キーコードによる配列。 - std::array hit {}; - - // 左クリック押下時の keycode - uint leftdown_keycode = 0; - - // LED - bool led_cap = false; - bool led_kana = false; + // 左クリック押下時のキー + uint leftdown_key {}; + + // トグル動作にするキーの集合。 + // first はキーコード、 + // second は押下ならキーコード、開放なら 0。 + std::map toggle {}; // 修飾キーの状態 (刻印を変更するため) - enum { - ModNormal = 0, - ModShift, - } modifier {}; + Modifier modifier {}; // フォントサイズに相対的な描画単位 - int unit = 0; + int unit {}; + + // コントロールのサイズ [基準単位] + int u_width {}; + int u_height {}; + + // 初期タイトル + wxString title {}; + + // キーボードの接続状態 + bool connected {}; + + // エンターキーの矩形 + Rect enter_top {}; + Rect enter_btm {}; - // コントロールのサイズ - int view_width = 0; - int view_height = 0; - - uint8 *bmpbuf = NULL; - wxImage *image = NULL; - wxBitmap *bitmap = NULL; - - // エンター記号の周囲の点集合 - std::vector enter_points; - wxRegion enter_region; + // アイコン + std::unique_ptr enter_icon /*{}*/; + + // 色 + ColorPalette color {}; + + // 残光処理 + // 10 : 減光しない点灯を示す (ただし色コードは 9) + // 9..1 : 減光中 (9 がもっとも明るい) + // 0 : 消灯中 + std::vector persistence {}; + + wxTimer timer {}; // UTF-8 -> CP932 変換 // Unicode の "\\" は Shift_JIS に対応する文字がないため、これを @@ -112,25 +155,50 @@ class WXLunaSoftKeyPanel : public WXText // こちらで決める。 wxCSConv conv { "CP932" }; + // キー描画データ (派生クラス側から渡される) + const std::vector& keydata; + + Keyboard *keyboard {}; + // イベントテーブル wxDECLARE_EVENT_TABLE(); +}; + +// LUNA ソフトウェアキーボード (パネル) +class WXLunaSoftKeyPanel : public WXSoftKeyPanel +{ + using inherited = WXSoftKeyPanel; + public: + explicit WXLunaSoftKeyPanel(wxWindow *parent); + ~WXLunaSoftKeyPanel() override; + + private: + int DrawLED(const keydata_t& key) override; // キー描画データ static std::vector keydata; }; -// -// LUNA ソフトウェアキーボード (ウィンドウ) -// -class WXLunaSoftKeyWindow : public WXSubWindow +// X68k ソフトウェアキーボード (パネル) +class WXX68kSoftKeyPanel : public WXSoftKeyPanel { - typedef WXSubWindow inherited; + using inherited = WXSoftKeyPanel; public: - WXLunaSoftKeyWindow(wxWindow *parent, wxWindowID id); - virtual ~WXLunaSoftKeyWindow(); + explicit WXX68kSoftKeyPanel(wxWindow *parent); + ~WXX68kSoftKeyPanel() override; - virtual void SetFontSize(fontsize_t fontsize); private: - // キーボードパネル - WXLunaSoftKeyPanel *panel = NULL; + int DrawLED(const keydata_t& key) override; + + // キー描画データ + static std::vector keydata; +}; + +// ソフトウェアキーボード (ウィンドウ) +class WXSoftKeyWindow : public WXSubWindow +{ + using inherited = WXSubWindow; + public: + WXSoftKeyWindow(wxWindow *parent, VMType vmtype); + ~WXSoftKeyWindow() override; };