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