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

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:                // スクロールイベントをこっちに接続
1.1.1.5 ! root       77:                ctl->Bind(NONO_EVT_SCROLL, &WXDipswWindow::OnScroll, this);
1.1       root       78:        }
                     79: 
                     80:        // DIPSW ボックス
                     81:        for (int n = 0; n < ndipsw / 8; n++) {
                     82:                if (n > 0) {
                     83:                        topsizer->AddSpacer(3);
                     84:                }
                     85: 
                     86:                wxBoxSizer *swbox;
                     87:                if (ndipsw > 8) {
                     88:                        // LUNA では 2組あるので StaticBoxSizer で名前を表示
                     89:                        swbox = new wxStaticBoxSizer(wxHORIZONTAL, this, name[n]);
                     90:                } else {
                     91:                        // 1組で名前を表示するのは冗長なので枠なし
                     92:                        swbox = new wxBoxSizer(wxHORIZONTAL);
                     93:                }
                     94:                // デフォルトの StaticBoxSizer の枠と外のマージンがなさすぎる…
                     95:                topsizer->Add(swbox, 1, wxEXPAND | wxALL, 3);
                     96: 
                     97:                // デフォルトの StaticBoxSizer の枠と内のマージンがなさすぎる…
                     98:                swbox->AddSpacer(3);
                     99: 
                    100:                for (int i = 0; i < 8; i++) {
                    101:                        auto *vbox = new wxBoxSizer(wxVERTICAL);
                    102:                        vbox->AddSpacer(3);
                    103:                        vbox->Add(new wxStaticText(this, wxID_ANY,
1.1.1.2   root      104:                                string_format("%d", i + 1)), 0, wxALIGN_CENTER_HORIZONTAL);
                    105:                        vbox->Add(swctl[n * 8 + i], 0, wxALIGN_CENTER_HORIZONTAL);
1.1       root      106:                        vbox->AddSpacer(3);
                    107: 
                    108:                        swbox->Add(vbox, 1, wxALIGN_CENTER);
                    109:                }
                    110: 
                    111:                swbox->AddSpacer(3);
                    112:        }
                    113: 
                    114:        SetSizer(topsizer);
1.1.1.2   root      115:        FontChanged();
1.1       root      116: 
                    117:        // 現在値を反映
                    118:        for (int i = 0; i < ndipsw; i++) {
1.1.1.3   root      119:                uint pos = swdev->GetPosition(i);
1.1       root      120:                swctl[i]->SetThumbPosition(pos);
                    121:        }
                    122: }
                    123: 
                    124: // デストラクタ
                    125: WXDipswWindow::~WXDipswWindow()
                    126: {
                    127: }
                    128: 
1.1.1.2   root      129: // フォントサイズ変更
                    130: void
                    131: WXDipswWindow::FontChanged()
                    132: {
                    133:        // 子コントロールに先に反映させる
                    134:        inherited::FontChanged();
                    135: 
                    136:        // スクロールバーの幅はフォントサイズで変わるので、
                    137:        // 高さをそれに連動させる。
1.1.1.4   root      138:        wxSize size = swctl[0]->GetSize();
1.1.1.2   root      139:        size.y = size.x * 5 / 3;
                    140:        for (auto *ctl : swctl) {
1.1.1.4   root      141:                ctl->SetSize(size);
                    142:                ctl->SetMinSize(size);
1.1.1.2   root      143:        }
                    144: 
1.1.1.4   root      145:        Fit();
1.1.1.2   root      146: }
                    147: 
1.1       root      148: // スクロール位置変更通知
                    149: void
                    150: WXDipswWindow::OnScroll(wxScrollEvent& event)
                    151: {
1.1.1.3   root      152:        uint n = event.GetId() - ID_DIPSW0;
                    153:        uint pos = event.GetPosition();
1.1       root      154: 
                    155:        swdev->SetPosition(n, pos);
                    156: }

unix.superglobalmegacorp.com

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