Annotation of nono/wx/wxsoftkey.h, revision 1.1.1.9

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: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.