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