--- nono/wx/wxsubwindow.h 2026/04/29 17:04:28 1.1 +++ nono/wx/wxsubwindow.h 2026/04/29 17:04:53 1.1.1.6 @@ -1,20 +1,25 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once +#include "wxheader.h" +#include "wxfitframe.h" + +class WXPaddingPanel; + // // サブウィンドウ // // メインウィンドウのメニューから表示されて、表示されてる間チェック状態を // 維持するタイプのウィンドウ。クローズ処理が共通に必要なだけで、中身に // ついては関与していない。 - -class WXSubWindow : public wxFrame +class WXSubWindow : public WXFitFrame { - typedef wxFrame inherited; + using inherited = WXFitFrame; public: static const int DEFAULT_STYLE = (wxDEFAULT_FRAME_STYLE | wxFRAME_FLOAT_ON_PARENT) @@ -25,13 +30,77 @@ class WXSubWindow : public wxFrame WXSubWindow(wxWindow *parent, wxWindowID id, const wxString& name, int style); WXSubWindow(wxWindow *parent, wxWindowID id, const wxString& name); - virtual ~WXSubWindow(); + virtual ~WXSubWindow() override; - // フォントサイズ変更 (継承クラスによる) - virtual void SetFontSize(fontsize_t fontsize) { } + // テキスト系パネルのフォントサイズ変更 + virtual void SetFontSize(FontId fontid); private: void OnClose(wxCloseEvent& event); wxDECLARE_EVENT_TABLE(); }; + + +// +// 縦リサイズ可能なサブウィンドウ +// +class WXVResizeSubWindow : public WXSubWindow +{ + using inherited = WXSubWindow; + public: + WXVResizeSubWindow(wxWindow *parent, wxWindowID id, const wxString& name); + virtual ~WXVResizeSubWindow() override; + + // テキスト系パネルのフォントサイズ変更 + void SetFontSize(FontId fontid) override; + + // ウィンドウサイズ再計算 (継承先による) + virtual void DoSize() = 0; + + protected: + // ウィンドウサイズを再計算の共通部分 (継承先 DoSize() から呼ばれる) + void CalcVSize(int fixed); + + // 全体を収納する sizer + wxBoxSizer *topsizer {}; + + // テキストパネル + WXTextScreen *screen {}; + + // 上下パディング + WXPaddingPanel *padding1 {}; + WXPaddingPanel *padding2 {}; +}; + +// +// パディングパネル +// +// モニタウィンドウ系で使うテキストパネルは単純なキャラクタビットマップ構造 +// のため、クライアント領域の端の1ピクセルまでふんだんに使用している。 +// モニタウィンドウは本来このテキストパネルを一つ持つだけの単純なウィンドウ +// でよいはずだった。しかし、ウィンドウマネージャ側でこのウィンドウに余白なり +// 枠なりをつけてくれる場合はそれで問題ないが、余白(ふち)を一切つけないタイプ +// のウィンドウマネージャでこのウィンドウを表示するとウィンドウ境界に接する +// 文字の視認性が(文字とウィンドウ外の背景によっては)すこぶる悪い。 +// そのため、こちらで余白パネルを用意する。なお wxSizer にも似たような +// パディング機能はあるが、このパディング領域の背景色はテキストパネルの背景色 +// と異なっているため悪目立ちしてしまう。そのため、テキストパネルと背景色を +// 揃えたパネルをわざわざ用意する。 +// サブウィンドウ系の人は、このパネルを四辺に貼り付けること。 +class WXPaddingPanel : public wxPanel +{ + using inherited = wxPanel; + + // デフォルトの余白幅もしくは高さ [px] + // 余白は、リサイズ可能なテキストウィンドウのリサイズ方向では1行の高さや + // 1文字の幅の整数倍にしなければならない(したい)ので都度計算する必要が + // あるが、そうでない固定方向については現在のフォントから計算とかも面倒 + // なのでとりあえず固定値としておく。単位は px。 + static const int DefaultPadding = 3; + + public: + WXPaddingPanel(wxWindow *parent); + WXPaddingPanel(wxWindow *parent_, const wxSize& size_); + virtual ~WXPaddingPanel(); +};