|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.