Annotation of nono/wx/wxdipswwindow.cpp, revision 1.1.1.3

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2022 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
                      8: // DIPSW 設定ウィンドウ
                      9: //
                     10: 
                     11: #include "wxdipswwindow.h"
                     12: #include "wxscrollbar.h"
                     13: #include "dipsw.h"
                     14: #include "mainapp.h"
                     15: 
                     16: // 数字は全部 0 始まりで、表示だけ 1 始まり。
                     17: enum {
                     18:        ID_DIPSW0       = IDGROUP_DIPSW,
                     19:        ID_DIPSW15      = ID_DIPSW0 + 15,
                     20: 
                     21:        ID_local_end,   // 最後に置く (チェック用)
                     22: };
                     23: static_assert(ID_local_end - 1 <= (int)IDGROUP_DIPSW_END, "ID exceeded");
                     24: 
                     25: #define ID_DIPSW(id)   (ID_DIPSW0 + id)
                     26: 
                     27: // ↓topsizer
                     28: //   +----------+
                     29: //   |  DIPSW1  |
                     30: //   +----------+
                     31: //   | (中余白) |
                     32: //   +----------+
                     33: //   | (DIPSW2) |
                     34: //   +----------+
                     35: //
                     36: // →  DIPSW Box (StaticBoxSizer)
                     37: // +--+-----------------------+--+
                     38: // |  |  vbox       vbox      |  |
                     39: // |  |↓+-------+ +-----+ .. |  |
                     40: // |  |  |上余白 | |     |    |  |
                     41: // |左|  +-------+ +     +    |右|
                     42: // |余|  |  No.  | |     |    |余|
                     43: // |白|  +-------+ +     +    |白|
                     44: // |  |  |SCR Bar| |     |    |  |
                     45: // |  |  +-------+ +     +    |  |
                     46: // |  |  |下余白 | |     |    |  |
                     47: // |  |  +-------+ +-----+ .. |  |
                     48: // +--+-----------------------+--+
                     49: //
                     50: // (GTK3の?) StaticBoxSizer は枠の中も外もマージンがなさすぎて読みづらいので
                     51: // こっちで余白を入れる。どうして…
                     52: 
                     53: // コンストラクタ
                     54: WXDipswWindow::WXDipswWindow(wxWindow *parent)
                     55:        : inherited(parent, wxID_ANY, "DIPSW")
                     56: {
                     57:        int ndipsw;
                     58:        wxString name[2];
                     59: 
                     60:        swdev = GetDipswDevice();
                     61:        ndipsw = swdev->GetSize();
                     62: 
                     63:        if (ndipsw > 8) {
                     64:                name[0] = "DIPSW 1";
                     65:                name[1] = "DIPSW 2";
                     66:        }
                     67: 
                     68:        auto *topsizer = new wxBoxSizer(wxVERTICAL);
                     69: 
                     70:        // DIPSW 用コントロールを個数分用意する (ここではまだ配置はしない)
                     71:        for (int i = 0; i < ndipsw; i++) {
                     72:                auto *ctl = new WXScrollBar(this, ID_DIPSW(i), wxSB_VERTICAL);
                     73:                ctl->SetScrollParam(0, 1, 2, 1);
                     74:                swctl.push_back(ctl);
                     75: 
                     76:                // スクロールイベントをこっちに接続
                     77:                ctl->Connect(NONO_EVT_SCROLL,
                     78:                        wxScrollEventHandler(WXDipswWindow::OnScroll), NULL, this);
                     79:        }
                     80: 
                     81:        // DIPSW ボックス
                     82:        for (int n = 0; n < ndipsw / 8; n++) {
                     83:                if (n > 0) {
                     84:                        topsizer->AddSpacer(3);
                     85:                }
                     86: 
                     87:                wxBoxSizer *swbox;
                     88:                if (ndipsw > 8) {
                     89:                        // LUNA では 2組あるので StaticBoxSizer で名前を表示
                     90:                        swbox = new wxStaticBoxSizer(wxHORIZONTAL, this, name[n]);
                     91:                } else {
                     92:                        // 1組で名前を表示するのは冗長なので枠なし
                     93:                        swbox = new wxBoxSizer(wxHORIZONTAL);
                     94:                }
                     95:                // デフォルトの StaticBoxSizer の枠と外のマージンがなさすぎる…
                     96:                topsizer->Add(swbox, 1, wxEXPAND | wxALL, 3);
                     97: 
                     98:                // デフォルトの StaticBoxSizer の枠と内のマージンがなさすぎる…
                     99:                swbox->AddSpacer(3);
                    100: 
                    101:                for (int i = 0; i < 8; i++) {
                    102:                        auto *vbox = new wxBoxSizer(wxVERTICAL);
                    103:                        vbox->AddSpacer(3);
                    104:                        vbox->Add(new wxStaticText(this, wxID_ANY,
1.1.1.2   root      105:                                string_format("%d", i + 1)), 0, wxALIGN_CENTER_HORIZONTAL);
                    106:                        vbox->Add(swctl[n * 8 + i], 0, wxALIGN_CENTER_HORIZONTAL);
1.1       root      107:                        vbox->AddSpacer(3);
                    108: 
                    109:                        swbox->Add(vbox, 1, wxALIGN_CENTER);
                    110:                }
                    111: 
                    112:                swbox->AddSpacer(3);
                    113:        }
                    114: 
                    115:        SetSizer(topsizer);
1.1.1.2   root      116:        FontChanged();
1.1       root      117:        DoSize();
                    118: 
                    119:        // 現在値を反映
                    120:        for (int i = 0; i < ndipsw; i++) {
1.1.1.3 ! root      121:                uint pos = swdev->GetPosition(i);
1.1       root      122:                swctl[i]->SetThumbPosition(pos);
                    123:        }
                    124: }
                    125: 
                    126: // デストラクタ
                    127: WXDipswWindow::~WXDipswWindow()
                    128: {
                    129: }
                    130: 
1.1.1.2   root      131: // フォントサイズ変更
                    132: void
                    133: WXDipswWindow::FontChanged()
                    134: {
                    135:        // 子コントロールに先に反映させる
                    136:        inherited::FontChanged();
                    137: 
                    138:        // スクロールバーの幅はフォントサイズで変わるので、
                    139:        // 高さをそれに連動させる。
                    140:        wxSize size = swctl[0]->GetClientSize();
                    141:        size.y = size.x * 5 / 3;
                    142:        for (auto *ctl : swctl) {
                    143:                ctl->SetClientSize(size);
                    144:                ctl->SetMinClientSize(size);
                    145:        }
                    146: 
                    147:        DoSize();
                    148: }
                    149: 
1.1       root      150: // スクロール位置変更通知
                    151: void
                    152: WXDipswWindow::OnScroll(wxScrollEvent& event)
                    153: {
1.1.1.3 ! root      154:        uint n = event.GetId() - ID_DIPSW0;
        !           155:        uint pos = event.GetPosition();
1.1       root      156: 
                    157:        swdev->SetPosition(n, pos);
                    158: }

unix.superglobalmegacorp.com

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