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

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:                auto sz = ctl->GetClientSize();
                     75:                sz.y = sz.x * 5 / 3;            // ちょっと伸ばす
                     76:                ctl->SetClientSize(sz.x, sz.y);
                     77:                ctl->SetMinClientSize(sz);
                     78:                swctl.push_back(ctl);
                     79: 
                     80:                // スクロールイベントをこっちに接続
                     81:                ctl->Connect(NONO_EVT_SCROLL,
                     82:                        wxScrollEventHandler(WXDipswWindow::OnScroll), NULL, this);
                     83:        }
                     84: 
                     85: 
                     86:        // DIPSW ボックス
                     87:        for (int n = 0; n < ndipsw / 8; n++) {
                     88:                if (n > 0) {
                     89:                        topsizer->AddSpacer(3);
                     90:                }
                     91: 
                     92:                wxBoxSizer *swbox;
                     93:                if (ndipsw > 8) {
                     94:                        // LUNA では 2組あるので StaticBoxSizer で名前を表示
                     95:                        swbox = new wxStaticBoxSizer(wxHORIZONTAL, this, name[n]);
                     96:                } else {
                     97:                        // 1組で名前を表示するのは冗長なので枠なし
                     98:                        swbox = new wxBoxSizer(wxHORIZONTAL);
                     99:                }
                    100:                // デフォルトの StaticBoxSizer の枠と外のマージンがなさすぎる…
                    101:                topsizer->Add(swbox, 1, wxEXPAND | wxALL, 3);
                    102: 
                    103:                // デフォルトの StaticBoxSizer の枠と内のマージンがなさすぎる…
                    104:                swbox->AddSpacer(3);
                    105: 
                    106:                for (int i = 0; i < 8; i++) {
                    107:                        auto *vbox = new wxBoxSizer(wxVERTICAL);
                    108:                        vbox->AddSpacer(3);
                    109:                        vbox->Add(new wxStaticText(this, wxID_ANY,
                    110:                                string_format("%d", i + 1)));
                    111:                        vbox->Add(swctl[n * 8 + i]);
                    112:                        vbox->AddSpacer(3);
                    113: 
                    114:                        swbox->Add(vbox, 1, wxALIGN_CENTER);
                    115:                }
                    116: 
                    117:                swbox->AddSpacer(3);
                    118:        }
                    119: 
                    120:        SetSizer(topsizer);
                    121:        DoSize();
                    122: 
                    123:        // 現在値を反映
                    124:        for (int i = 0; i < ndipsw; i++) {
                    125:                int pos = swdev->GetPosition(i);
                    126:                swctl[i]->SetThumbPosition(pos);
                    127:        }
                    128: }
                    129: 
                    130: // デストラクタ
                    131: WXDipswWindow::~WXDipswWindow()
                    132: {
                    133: }
                    134: 
                    135: // スクロール位置変更通知
                    136: void
                    137: WXDipswWindow::OnScroll(wxScrollEvent& event)
                    138: {
                    139:        int n = event.GetId() - ID_DIPSW0;
                    140:        int pos = event.GetPosition();
                    141: 
                    142:        swdev->SetPosition(n, pos);
                    143: }

unix.superglobalmegacorp.com

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