--- nono/wx/wxsubwindow.cpp 2026/04/29 17:05:08 1.1.1.7 +++ nono/wx/wxsubwindow.cpp 2026/04/29 17:05:44 1.1.1.10 @@ -39,7 +39,8 @@ void WXSubWindow::OnClose(wxCloseEvent& event) { // ウィンドウリストから自身を削除 - gMainFrame->DeleteWindow(this); + auto mainframe = dynamic_cast(GetParent()); + mainframe->DeleteWindow(this); } // フォントサイズ変更 @@ -54,88 +55,31 @@ WXSubWindow::FontChanged() } } - DoSize(); + Fit(); } -// 中身に応じてこのウィンドウの大きさを変更 +// 中身に応じてこのウィンドウの大きさを変更。 +// このウィンドウを sizer が支配しているか、 +// このウィンドウにコントロールが1つしかない時に使える。 +// +// コントロールが複数ある場合、どう配置するかの情報がないのでここでは処理 +// 出来ない。これを継承したウィンドウが Fit() をオーバーライドし、適切に +// ウィンドウサイズを計算して SetClientSize() すること。 void -WXSubWindow::DoSize() +WXSubWindow::Fit() { wxSize csize; auto *topsizer = GetSizer(); if (topsizer) { // Sizer があればそれがサイズを知っている - csize = topsizer->GetMinSize(); + csize = topsizer->ComputeFittingClientSize(this); } else { // Sizer を使ってなければ子コントロールは1人のはず auto& children = GetChildren(); assert(children.GetCount() == 1); auto child = children[0]; - csize = child->GetMinSize(); + csize = child->GetSize(); } SetClientSize(csize); } - - -// -// 縦リサイズ可能なサブウィンドウ -// - -// コンストラクタ -WXVResizeSubWindow::WXVResizeSubWindow(wxWindow *parent, wxWindowID id, - const wxString& name) - : inherited(parent, id, name, DEFAULT_STYLE | wxRESIZE_BORDER) -{ -} - -// デストラクタ -WXVResizeSubWindow::~WXVResizeSubWindow() -{ -} - -void -WXVResizeSubWindow::FontChanged() -{ - screen->FontChanged(); - Layout(); - DoSize(); -} - -void -WXVResizeSubWindow::DoSize() -{ - wxSize tsize = GetSizer()->ComputeFittingClientSize(this); - SetClientSize(tsize); -} - -bool -WXVResizeSubWindow::Layout() -{ - if (inherited::Layout() == false) { - return false; - } - - wxSize tsize = GetSizer()->ComputeFittingClientSize(this); - - // 高さ計算。 - // 高さの最小は fixed と TextScreen 2行分にしておく。 - int h = fixed_height; - h += screen->GetPaddingTop(); - h += screen->GetFontHeight() * 2; - h += screen->GetPaddingBottom(); - - // サイズを変える時は、大きくする時は Max を先に、小さくする時は Min を - // 先に変えないと、サイズ制約の不整合の GTK ワーニングが出てしまう。 - // うーんこの API…。 - wxSize csize = GetClientSize(); - if (tsize.x > csize.x) { - SetMaxClientSize(wxSize(tsize.x, wxDefaultCoord)); - SetMinClientSize(wxSize(tsize.x, h)); - } else { - SetMinClientSize(wxSize(tsize.x, h)); - SetMaxClientSize(wxSize(tsize.x, wxDefaultCoord)); - } - - return true; -}