|
|
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: // スクロールイベントをこっちに接続
77: ctl->Connect(NONO_EVT_SCROLL,
78: wxScrollEventHandler(WXDipswWindow::OnScroll), NULL, this);
79: }
80:
81: // DIPSW ボックス
82: for (int n = 0; n < ndipsw / 8; n++) {
83: if (n > 0) {
84: topsizer->AddSpacer(3);
85: }
86:
87: wxBoxSizer *swbox;
88: if (ndipsw > 8) {
89: // LUNA では 2組あるので StaticBoxSizer で名前を表示
90: swbox = new wxStaticBoxSizer(wxHORIZONTAL, this, name[n]);
91: } else {
92: // 1組で名前を表示するのは冗長なので枠なし
93: swbox = new wxBoxSizer(wxHORIZONTAL);
94: }
95: // デフォルトの StaticBoxSizer の枠と外のマージンがなさすぎる…
96: topsizer->Add(swbox, 1, wxEXPAND | wxALL, 3);
97:
98: // デフォルトの StaticBoxSizer の枠と内のマージンがなさすぎる…
99: swbox->AddSpacer(3);
100:
101: for (int i = 0; i < 8; i++) {
102: auto *vbox = new wxBoxSizer(wxVERTICAL);
103: vbox->AddSpacer(3);
104: vbox->Add(new wxStaticText(this, wxID_ANY,
1.1.1.2 root 105: string_format("%d", i + 1)), 0, wxALIGN_CENTER_HORIZONTAL);
106: vbox->Add(swctl[n * 8 + i], 0, wxALIGN_CENTER_HORIZONTAL);
1.1 root 107: vbox->AddSpacer(3);
108:
109: swbox->Add(vbox, 1, wxALIGN_CENTER);
110: }
111:
112: swbox->AddSpacer(3);
113: }
114:
115: SetSizer(topsizer);
1.1.1.2 root 116: FontChanged();
1.1 root 117: DoSize();
118:
119: // 現在値を反映
120: for (int i = 0; i < ndipsw; i++) {
1.1.1.3 ! root 121: uint pos = swdev->GetPosition(i);
1.1 root 122: swctl[i]->SetThumbPosition(pos);
123: }
124: }
125:
126: // デストラクタ
127: WXDipswWindow::~WXDipswWindow()
128: {
129: }
130:
1.1.1.2 root 131: // フォントサイズ変更
132: void
133: WXDipswWindow::FontChanged()
134: {
135: // 子コントロールに先に反映させる
136: inherited::FontChanged();
137:
138: // スクロールバーの幅はフォントサイズで変わるので、
139: // 高さをそれに連動させる。
140: wxSize size = swctl[0]->GetClientSize();
141: size.y = size.x * 5 / 3;
142: for (auto *ctl : swctl) {
143: ctl->SetClientSize(size);
144: ctl->SetMinClientSize(size);
145: }
146:
147: DoSize();
148: }
149:
1.1 root 150: // スクロール位置変更通知
151: void
152: WXDipswWindow::OnScroll(wxScrollEvent& event)
153: {
1.1.1.3 ! root 154: uint n = event.GetId() - ID_DIPSW0;
! 155: uint pos = event.GetPosition();
1.1 root 156:
157: swdev->SetPosition(n, pos);
158: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.