|
|
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:
118: // 現在値を反映
119: for (int i = 0; i < ndipsw; i++) {
1.1.1.3 root 120: uint pos = swdev->GetPosition(i);
1.1 root 121: swctl[i]->SetThumbPosition(pos);
122: }
123: }
124:
125: // デストラクタ
126: WXDipswWindow::~WXDipswWindow()
127: {
128: }
129:
1.1.1.2 root 130: // フォントサイズ変更
131: void
132: WXDipswWindow::FontChanged()
133: {
134: // 子コントロールに先に反映させる
135: inherited::FontChanged();
136:
137: // スクロールバーの幅はフォントサイズで変わるので、
138: // 高さをそれに連動させる。
1.1.1.4 ! root 139: wxSize size = swctl[0]->GetSize();
1.1.1.2 root 140: size.y = size.x * 5 / 3;
141: for (auto *ctl : swctl) {
1.1.1.4 ! root 142: ctl->SetSize(size);
! 143: ctl->SetMinSize(size);
1.1.1.2 root 144: }
145:
1.1.1.4 ! root 146: Fit();
1.1.1.2 root 147: }
148:
1.1 root 149: // スクロール位置変更通知
150: void
151: WXDipswWindow::OnScroll(wxScrollEvent& event)
152: {
1.1.1.3 root 153: uint n = event.GetId() - ID_DIPSW0;
154: uint pos = event.GetPosition();
1.1 root 155:
156: swdev->SetPosition(n, pos);
157: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.