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