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