Annotation of nono/wx/wxdipswwindow.cpp, revision 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.