|
|
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.