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