--- nono/wx/wxdumpmonitor.cpp 2026/04/29 17:04:56 1.1.1.9 +++ nono/wx/wxdumpmonitor.cpp 2026/04/29 17:05:12 1.1.1.12 @@ -4,21 +4,23 @@ // Licensed under nono-license.txt // -#include "wxdumpmonitor.h" -#include "wxtextscreen.h" -#include "bus.h" -#include "debugger.h" -#include - // // メモリダンプウィンドウ // +#include "wxdumpmonitor.h" +#include "wxmonitor.h" +#include "bus.h" +#include "debugger.h" + enum { - ID_TEXT, + ID_TEXT = IDGROUP_MEMDUMP, ID_PREV, ID_NEXT, + + ID_local_end, // 最後に置く (チェック用) }; +static_assert(ID_local_end - 1 <= (int)IDGROUP_MEMDUMP_END, "ID exceeded"); // イベントテーブル wxBEGIN_EVENT_TABLE(WXMemdumpWindow, inherited) @@ -30,34 +32,22 @@ wxEND_EVENT_TABLE() // コンストラクタ // (タイトルは UpdateAddr() でセットする) WXMemdumpWindow::WXMemdumpWindow(wxWindow *parent, int idx_) - : inherited(parent, wxID_ANY, wxEmptyString) + : inherited(parent, wxID_ANY, wxEmptyString, + DEFAULT_STYLE | wxRESIZE_BORDER) { idx = idx_; - // → - // +--+----------------------------+--+ - // | |↓+-----------------------+ | | - // | | | 上枠 (アドレス入力欄) | | | - // | | +-----------------------+ | | - // |左| | 上余白 (padding1) | |右| - // |余| +-----------------------+ |余| - // |白| | TextScreen | |白| - // | | +-----------------------+ | | - // | | | 下余白 (padding2) | | | - // | | +-----------------------+ | | - // +--+----------------------------+--+ - - topsizer = new wxBoxSizer(wxHORIZONTAL); - // 左余白 - topsizer->Add(new WXPaddingPanel(this), 0, wxEXPAND); - - // 中列用の縦 sizer - auto *vbox = new wxBoxSizer(wxVERTICAL); - topsizer->Add(vbox, 0, wxEXPAND); + // ↓+-------------------------+ + // | 上枠 (アドレス、△、▽) | + // +-------------------------+ + // | TextScreen | + // +-------------------------+ + + auto *topsizer = new wxBoxSizer(wxVERTICAL); // 上枠用の下敷きパネル - WXPaddingPanel *ctrlpanel = new WXPaddingPanel(this); - vbox->Add(ctrlpanel, 0, wxEXPAND); + auto *ctrlpanel = new WXBitmapPanel(this); + topsizer->Add(ctrlpanel, 0, wxEXPAND); // 上枠用の横 sizer ctrlbox = new wxBoxSizer(wxHORIZONTAL); @@ -80,30 +70,18 @@ WXMemdumpWindow::WXMemdumpWindow(wxWindo ctrlpanel->SetSizer(ctrlbox); ctrlbox->SetSizeHints(ctrlpanel); - // パディングパネル(上下) - // ウィンドウを1行ずつ伸縮させるためには、クライアント領域がフォント高さの - // 整数倍になるようにしないといけない。このウィンドウには大きさ不詳の - // コントロール枠があるので、フォントサイズが確定しないとパディングの - // 高さも確定しない。先にサイズ不定のパネルだけ置いといて、フォントサイズ - // 確定後に大きさを確定させる。DoSize() 参照。 - padding1 = new WXPaddingPanel(this); - padding2 = new WXPaddingPanel(this); - screen = new WXTextScreen(this, debugger_memdump_monitor(idx)); - vbox->Add(padding1, 0, wxEXPAND); - vbox->Add(screen, 1, wxEXPAND); - vbox->Add(padding2, 0, wxEXPAND); - - // 右余白 - topsizer->Add(new WXPaddingPanel(this), 0, wxEXPAND); + screen = new WXMonitorPanel(this, debugger_memdump_monitor(idx)); + topsizer->Add(screen, 1, wxEXPAND); SetSizer(topsizer); + // ウィンドウサイズを確定させる + fixed_height = ctrlbox->GetSize().y; + DoSize(); + // 表示を初期化する screen->SetUserData(sticky_addr[idx]); UpdateAddr(); - - // ウィンドウサイズを確定させる - DoSize(); } // デストラクタ @@ -111,13 +89,11 @@ WXMemdumpWindow::~WXMemdumpWindow() { } -// フォントサイズが確定したら、それによってウィンドウサイズを再計算する。 -void -WXMemdumpWindow::DoSize() +bool +WXMemdumpWindow::Layout() { - // コントロールパネルの大きさ - wxSize csize = ctrlbox->ComputeFittingWindowSize(this); - CalcVSize(csize.y); + // 縦リサイズ可能レイアウト + return LayoutTextVResize(screen, fixed_height); } // テキスト入力イベント