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

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: 
                    118:        // 現在値を反映
                    119:        for (int i = 0; i < ndipsw; i++) {
1.1.1.3   root      120:                uint pos = swdev->GetPosition(i);
1.1       root      121:                swctl[i]->SetThumbPosition(pos);
                    122:        }
                    123: }
                    124: 
                    125: // デストラクタ
                    126: WXDipswWindow::~WXDipswWindow()
                    127: {
                    128: }
                    129: 
1.1.1.2   root      130: // フォントサイズ変更
                    131: void
                    132: WXDipswWindow::FontChanged()
                    133: {
                    134:        // 子コントロールに先に反映させる
                    135:        inherited::FontChanged();
                    136: 
                    137:        // スクロールバーの幅はフォントサイズで変わるので、
                    138:        // 高さをそれに連動させる。
1.1.1.4 ! root      139:        wxSize size = swctl[0]->GetSize();
1.1.1.2   root      140:        size.y = size.x * 5 / 3;
                    141:        for (auto *ctl : swctl) {
1.1.1.4 ! root      142:                ctl->SetSize(size);
        !           143:                ctl->SetMinSize(size);
1.1.1.2   root      144:        }
                    145: 
1.1.1.4 ! root      146:        Fit();
1.1.1.2   root      147: }
                    148: 
1.1       root      149: // スクロール位置変更通知
                    150: void
                    151: WXDipswWindow::OnScroll(wxScrollEvent& event)
                    152: {
1.1.1.3   root      153:        uint n = event.GetId() - ID_DIPSW0;
                    154:        uint pos = event.GetPosition();
1.1       root      155: 
                    156:        swdev->SetPosition(n, pos);
                    157: }

unix.superglobalmegacorp.com

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