File:  [Isaki's NoNo m68k/m88k emulator] / nono / wx / wxdipswwindow.cpp
Revision 1.1.1.5 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:05:58 2026 UTC (2 months, 3 weeks ago) by root
Branches: MAIN, Isaki
CVS tags: v027, HEAD
nono 1.7.0

//
// nono
// Copyright (C) 2022 nono project
// Licensed under nono-license.txt
//

//
// DIPSW 設定ウィンドウ
//

#include "wxdipswwindow.h"
#include "wxscrollbar.h"
#include "dipsw.h"
#include "mainapp.h"

// 数字は全部 0 始まりで、表示だけ 1 始まり。
enum {
	ID_DIPSW0	= IDGROUP_DIPSW,
	ID_DIPSW15	= ID_DIPSW0 + 15,

	ID_local_end,	// 最後に置く (チェック用)
};
static_assert(ID_local_end - 1 <= (int)IDGROUP_DIPSW_END, "ID exceeded");

#define ID_DIPSW(id)	(ID_DIPSW0 + id)

// ↓topsizer
//   +----------+
//   |  DIPSW1  |
//   +----------+
//   | (中余白) |
//   +----------+
//   | (DIPSW2) |
//   +----------+
//
// →  DIPSW Box (StaticBoxSizer)
// +--+-----------------------+--+
// |  |  vbox       vbox      |  |
// |  |↓+-------+ +-----+ .. |  |
// |  |  |上余白 | |     |    |  |
// |左|  +-------+ +     +    |右|
// |余|  |  No.  | |     |    |余|
// |白|  +-------+ +     +    |白|
// |  |  |SCR Bar| |     |    |  |
// |  |  +-------+ +     +    |  |
// |  |  |下余白 | |     |    |  |
// |  |  +-------+ +-----+ .. |  |
// +--+-----------------------+--+
//
// (GTK3の?) StaticBoxSizer は枠の中も外もマージンがなさすぎて読みづらいので
// こっちで余白を入れる。どうして…

// コンストラクタ
WXDipswWindow::WXDipswWindow(wxWindow *parent)
	: inherited(parent, wxID_ANY, "DIPSW")
{
	int ndipsw;
	wxString name[2];

	swdev = GetDipswDevice();
	ndipsw = swdev->GetSize();

	if (ndipsw > 8) {
		name[0] = "DIPSW 1";
		name[1] = "DIPSW 2";
	}

	auto *topsizer = new wxBoxSizer(wxVERTICAL);

	// DIPSW 用コントロールを個数分用意する (ここではまだ配置はしない)
	for (int i = 0; i < ndipsw; i++) {
		auto *ctl = new WXScrollBar(this, ID_DIPSW(i), wxSB_VERTICAL);
		ctl->SetScrollParam(0, 1, 2, 1);
		swctl.push_back(ctl);

		// スクロールイベントをこっちに接続
		ctl->Bind(NONO_EVT_SCROLL, &WXDipswWindow::OnScroll, this);
	}

	// DIPSW ボックス
	for (int n = 0; n < ndipsw / 8; n++) {
		if (n > 0) {
			topsizer->AddSpacer(3);
		}

		wxBoxSizer *swbox;
		if (ndipsw > 8) {
			// LUNA では 2組あるので StaticBoxSizer で名前を表示
			swbox = new wxStaticBoxSizer(wxHORIZONTAL, this, name[n]);
		} else {
			// 1組で名前を表示するのは冗長なので枠なし
			swbox = new wxBoxSizer(wxHORIZONTAL);
		}
		// デフォルトの StaticBoxSizer の枠と外のマージンがなさすぎる…
		topsizer->Add(swbox, 1, wxEXPAND | wxALL, 3);

		// デフォルトの StaticBoxSizer の枠と内のマージンがなさすぎる…
		swbox->AddSpacer(3);

		for (int i = 0; i < 8; i++) {
			auto *vbox = new wxBoxSizer(wxVERTICAL);
			vbox->AddSpacer(3);
			vbox->Add(new wxStaticText(this, wxID_ANY,
				string_format("%d", i + 1)), 0, wxALIGN_CENTER_HORIZONTAL);
			vbox->Add(swctl[n * 8 + i], 0, wxALIGN_CENTER_HORIZONTAL);
			vbox->AddSpacer(3);

			swbox->Add(vbox, 1, wxALIGN_CENTER);
		}

		swbox->AddSpacer(3);
	}

	SetSizer(topsizer);
	FontChanged();

	// 現在値を反映
	for (int i = 0; i < ndipsw; i++) {
		uint pos = swdev->GetPosition(i);
		swctl[i]->SetThumbPosition(pos);
	}
}

// デストラクタ
WXDipswWindow::~WXDipswWindow()
{
}

// フォントサイズ変更
void
WXDipswWindow::FontChanged()
{
	// 子コントロールに先に反映させる
	inherited::FontChanged();

	// スクロールバーの幅はフォントサイズで変わるので、
	// 高さをそれに連動させる。
	wxSize size = swctl[0]->GetSize();
	size.y = size.x * 5 / 3;
	for (auto *ctl : swctl) {
		ctl->SetSize(size);
		ctl->SetMinSize(size);
	}

	Fit();
}

// スクロール位置変更通知
void
WXDipswWindow::OnScroll(wxScrollEvent& event)
{
	uint n = event.GetId() - ID_DIPSW0;
	uint pos = event.GetPosition();

	swdev->SetPosition(n, pos);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.