|
|
1.1 root 1: //
2: // nono
1.1.1.2 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
1.1.1.11 root 7: //
8: // ソフトウェアキーボード
9: //
10:
1.1 root 11: #pragma once
12:
13: #include "wxsubwindow.h"
14: #include "wxtextpanel.h"
15: #include "keyboard.h"
1.1.1.12 root 16: #include "mainapp.h"
1.1 root 17: #include <array>
1.1.1.10 root 18: #include <map>
1.1 root 19: #include <vector>
20:
1.1.1.13 root 21: class Keyboard;
22:
1.1 root 23: // キー描画用のデータ構造体
24: struct keydata_t
25: {
26: // フォントサイズの切り替えに対応するため、座標系の単位はピクセルでは
27: // ない点に注意。フォントサイズ(高さ)の 1/4 を 1 と表現する。つまり
28: // どのフォントサイズでも半角1文字は 2 x 4。
29: int x; // このキー枠の左上点
30: int y; // このキー枠の左上点
31: int w; // このキー枠の幅
32: int h; // このキー枠の高さ
1.1.1.2 root 33:
34: // 色種別
35: // LUNA の場合はキートップ色の区別に使う。1=濃い, 0=通常。
36: // X68k では使用しない。
37: int coltype;
38:
39: int led; // -1ならLEDなし、0以上なら LED 番号
1.1 root 40: uint keycode; // キーコード (keyboard.h の KC_*)
1.1.1.2 root 41:
1.1 root 42: // 刻印
43: // [0]: 通常
44: // [1]: SHIFT時 (NULL なら通常のまま)
45: const char *disp[2];
46:
47: int right() const { return x + w; } // このキー枠の右
48: int bottom() const { return y + h; } // このキー枠の下
49: };
50:
1.1.1.2 root 51: // ソフトウェアキーボード (パネル) 共通部分
52: class WXSoftKeyPanel : public WXTextPanel
1.1 root 53: {
1.1.1.2 root 54: using inherited = WXTextPanel;
55: protected:
56: // 色の集合(パレット)
57: struct ColorPalette {
1.1.1.11 root 58: Color Background; // 背景というかガワの部分の色
59: Color Text; // 文字色
60: Color Keytop[2][10]; // キートップ色。
61: // [2]=0:通常色、1:(あれば)濃色
62: // [10]=押され具合。0は押されていないとき
63: Color Border; // LED 点灯時の枠の色
64: Color LED[2]; // LED。色は各機種定義 (今のところ0:赤 1:緑)
1.1.1.2 root 65: };
66:
1.1.1.6 root 67: // 修飾キーの状態
68: enum Modifier {
69: ModNormal = 0,
70: ModShift,
71: };
72:
73: protected:
74: WXSoftKeyPanel(wxWindow *parent, const std::vector<keydata_t>& keydata_,
75: int u_width_, int u_height_);
1.1 root 76: public:
1.1.1.14! root 77: ~WXSoftKeyPanel() override;
1.1 root 78:
79: // フォントサイズ変更
1.1.1.11 root 80: void FontChanged() override;
1.1 root 81:
1.1.1.2 root 82: protected:
1.1.1.11 root 83: void UpdateTitle();
84:
1.1.1.9 root 85: void InitColorKeytop(int num);
1.1.1.13 root 86: void InitIcon();
1.1.1.8 root 87: void OnKeyChanged(wxCommandEvent& event);
1.1.1.9 root 88: void OnTimer(wxTimerEvent& event);
1.1.1.2 root 89:
1.1.1.11 root 90: void Draw() override;
91: void DrawKey(const keydata_t& key);
92: void DrawEnterKey();
1.1.1.13 root 93: void DrawBuzzer(const keydata_t& key);
1.1.1.11 root 94: virtual int DrawLED(const keydata_t& key) = 0;
1.1 root 95: const keydata_t& FindKeydata(uint) const;
96:
97: void OnLeftDown(wxMouseEvent& event);
1.1.1.10 root 98: void DoLeftDown(uint code);
1.1 root 99: void OnLeftUp(wxMouseEvent& event);
100: void OnLeftDClick(wxMouseEvent& event);
101: void OnRightDown(wxMouseEvent& event);
1.1.1.10 root 102: void KeyDown(uint code);
103: void KeyUp(uint code);
1.1.1.2 root 104:
105: const keydata_t *GetKeydataFromPoint(const wxPoint& pt) const;
1.1 root 106:
1.1.1.2 root 107: // 左クリック押下時のキー
1.1.1.10 root 108: uint leftdown_key {};
1.1 root 109:
1.1.1.10 root 110: // トグル動作にするキーの集合。
111: // first はキーコード、
112: // second は押下ならキーコード、開放なら 0。
113: std::map<uint, uint> toggle {};
1.1.1.9 root 114:
1.1 root 115: // 修飾キーの状態 (刻印を変更するため)
1.1.1.6 root 116: Modifier modifier {};
117:
1.1 root 118: // フォントサイズに相対的な描画単位
1.1.1.4 root 119: int unit {};
1.1 root 120:
1.1.1.2 root 121: // コントロールのサイズ [基準単位]
1.1.1.4 root 122: int u_width {};
123: int u_height {};
1.1.1.2 root 124:
1.1.1.11 root 125: // 初期タイトル
126: wxString title {};
127:
128: // キーボードの接続状態
129: bool connected {};
1.1 root 130:
1.1.1.11 root 131: // エンターキーの矩形
132: Rect enter_top {};
133: Rect enter_btm {};
1.1 root 134:
1.1.1.13 root 135: // アイコン
136: std::unique_ptr<BitmapI1> enter_icon /*{}*/;
137:
1.1.1.2 root 138: // 色
139: ColorPalette color {};
140:
1.1.1.9 root 141: // 残光処理
142: // 10 : 減光しない点灯を示す (ただし色コードは 9)
143: // 9..1 : 減光中 (9 がもっとも明るい)
144: // 0 : 消灯中
145: std::vector<uint8> persistence {};
146:
147: wxTimer timer {};
148:
1.1 root 149: // UTF-8 -> CP932 変換
150: // Unicode の "\\" は Shift_JIS に対応する文字がないため、これを
151: // Unicode から Shift_JIS に変換すると "" になり、これではキートップが
152: // 刻印できなくて困る。
153: // CP932 なら "\\" を変換しても "\\" ('\x5c') になってくれるので、
154: // これを使う。この \x5c をバックスラッシュだと思うか円記号だと思うかは
155: // こちらで決める。
156: wxCSConv conv { "CP932" };
157:
1.1.1.6 root 158: // キー描画データ (派生クラス側から渡される)
159: const std::vector<keydata_t>& keydata;
160:
1.1.1.13 root 161: Keyboard *keyboard {};
162:
1.1 root 163: // イベントテーブル
164: wxDECLARE_EVENT_TABLE();
1.1.1.2 root 165: };
166:
167: // LUNA ソフトウェアキーボード (パネル)
168: class WXLunaSoftKeyPanel : public WXSoftKeyPanel
169: {
170: using inherited = WXSoftKeyPanel;
171: public:
1.1.1.14! root 172: explicit WXLunaSoftKeyPanel(wxWindow *parent);
! 173: ~WXLunaSoftKeyPanel() override;
1.1.1.2 root 174:
175: private:
1.1.1.11 root 176: int DrawLED(const keydata_t& key) override;
1.1 root 177:
178: // キー描画データ
1.1.1.2 root 179: static std::vector<keydata_t> keydata;
180: };
181:
182: // X68k ソフトウェアキーボード (パネル)
183: class WXX68kSoftKeyPanel : public WXSoftKeyPanel
184: {
185: using inherited = WXSoftKeyPanel;
186: public:
1.1.1.14! root 187: explicit WXX68kSoftKeyPanel(wxWindow *parent);
! 188: ~WXX68kSoftKeyPanel() override;
1.1.1.2 root 189:
190: private:
1.1.1.11 root 191: int DrawLED(const keydata_t& key) override;
1.1.1.2 root 192:
193: // キー描画データ
1.1 root 194: static std::vector<keydata_t> keydata;
195: };
196:
1.1.1.6 root 197: // ソフトウェアキーボード (ウィンドウ)
198: class WXSoftKeyWindow : public WXSubWindow
1.1.1.2 root 199: {
200: using inherited = WXSubWindow;
201: public:
1.1.1.12 root 202: WXSoftKeyWindow(wxWindow *parent, VMType vmtype);
1.1.1.14! root 203: ~WXSoftKeyWindow() override;
1.1.1.2 root 204:
205: private:
206: // キーボードパネル
1.1.1.6 root 207: WXSoftKeyPanel *panel {};
1.1.1.2 root 208: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.