--- nono/wx/wxdumpmonitor.cpp 2026/04/29 17:04:36 1.1.1.4 +++ nono/wx/wxdumpmonitor.cpp 2026/04/29 17:04:39 1.1.1.5 @@ -24,56 +24,74 @@ wxBEGIN_EVENT_TABLE(WXMemdumpWindow, inh EVT_TEXT_ENTER(ID_TEXT, WXMemdumpWindow::OnTextEnter) EVT_BUTTON(ID_PREV, WXMemdumpWindow::OnPrev) EVT_BUTTON(ID_NEXT, WXMemdumpWindow::OnNext) - EVT_TIMER(wxID_ANY, WXMemdumpWindow::OnTimer) wxEND_EVENT_TABLE() // コンストラクタ WXMemdumpWindow::WXMemdumpWindow(wxWindow *parent, wxWindowID id) : inherited(parent, id, _("Memory Dump")) { - col = 76; - row = 16; // 最初に不一致を起こさせて再描画させるため last_addr = 0xffffffff; - wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL); - wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL); - - // 上枠 - wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL); - vbox->Add(hbox); + // → + // +--+----------------------------+--+ + // | |↓+-----------------------+ | | + // | | | 上枠 (アドレス入力欄) | | | + // | | +-----------------------+ | | + // |左| | 上余白 (padding1) | |右| + // |余| +-----------------------+ |余| + // |白| | TextScreen | |白| + // | | +-----------------------+ | | + // | | | 下余白 (padding2) | | | + // | | +-----------------------+ | | + // +--+----------------------------+--+ + + topsizer = new wxBoxSizer(wxHORIZONTAL); + // 左余白 + topsizer->AddSpacer(DefaultPadding); + + // 中列用の縦 sizer + auto *vbox = new wxBoxSizer(wxVERTICAL); + topsizer->Add(vbox, 0, wxEXPAND); + + // 上枠用の横 sizer + ctrlbox = new wxBoxSizer(wxHORIZONTAL); + vbox->Add(ctrlbox); // アドレスコントロール addrctrl = new wxTextCtrl(this, ID_TEXT, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER); - hbox->Add(addrctrl); - hbox->AddSpacer(20); + ctrlbox->Add(addrctrl); + ctrlbox->AddSpacer(10); // △ボタン // XXX とりあえずね prev_btn = new wxButton(this, ID_PREV, wxT("△")); next_btn = new wxButton(this, ID_NEXT, wxT("▽")); - hbox->Add(prev_btn); - hbox->Add(next_btn); + ctrlbox->Add(prev_btn); + ctrlbox->Add(next_btn); - // XXX TODO 初期フォーカスをテキストコントロールに移したい + // パディングパネル(上下) + // ウィンドウを1行ずつ伸縮させるためには、クライアント領域がフォント高さの + // 整数倍になるようにしないといけない。このウィンドウには大きさ不詳の + // コントロール枠があるので、フォントサイズが確定しないとパディングの + // 高さも確定しない。先にサイズ不定のパネルだけ置いといて、フォントサイズ + // 確定後に大きさを確定させる。DoSize() 参照。 + padding1 = new wxPanel(this, wxID_ANY); + padding2 = new wxPanel(this, wxID_ANY); + vbox->Add(padding1); + screen = new WXTextScreen(this, *this); + vbox->Add(screen, 1, wxEXPAND); + vbox->Add(padding2); - // テキストスクリーン - monitor.Init(col, row); - screen = new WXTextScreen(this, col, row, monitor.GetBuf()); - vbox->Add(screen, 0, wxEXPAND); + // 右余白 + topsizer->AddSpacer(DefaultPadding); - topsizer->Add(vbox, BorderFlags); SetSizer(topsizer); - Layout(); - Fit(); - - // メモリが高速で変わるのを目で追う必要もないと思うので - // 30Hz くらいでどうか。 - timer.SetOwner(this); - timer.Start(33); + // ウィンドウサイズを確定させる + DoSize(); } // デストラクタ @@ -81,12 +99,21 @@ WXMemdumpWindow::~WXMemdumpWindow() { } +// フォントサイズが確定したら、それによってウィンドウサイズを再計算する。 +void +WXMemdumpWindow::DoSize() +{ + // コントロールパネルの大きさ + wxSize csize = ctrlbox->ComputeFittingWindowSize(this); + CalcVSize(csize.y); +} + // テキスト入力イベント void WXMemdumpWindow::OnTextEnter(wxCommandEvent& event) { // 入力文字列(16進文字列)を数値に変換 - wxString wstr = event.GetString(); + const wxString& wstr = event.GetString(); const char *cstr = (const char *)wstr.mb_str(); uint32 val = strtoul(cstr, NULL, 16); @@ -100,20 +127,34 @@ WXMemdumpWindow::OnTextEnter(wxCommandEv void WXMemdumpWindow::OnPrev(wxCommandEvent& event) { - input_addr -= 0x100; + // 1ページ戻る (横16バイト固定 × 表示行数分) + const wxSize size = screen->GetSize(); + input_addr -= size.GetHeight() * 16; } // ▽(NEXT) ボタン押下イベント void WXMemdumpWindow::OnNext(wxCommandEvent& event) { - input_addr += 0x100; + // 1ページ進む (横16バイト固定 × 表示行数分) + const wxSize size = screen->GetSize(); + input_addr += size.GetHeight() * 16; } -// タイマーイベント +// モニターサイズ取得 +nnSize +WXMemdumpWindow::GetMonitorSize() +{ + return nnSize(76, 16); +} + +// モニターテキストを更新 void -WXMemdumpWindow::OnTimer(wxTimerEvent& event) +WXMemdumpWindow::MonitorUpdate(TextScreen& monitor) { + uint32 laddr; + uint64 paddr; + if (input_addr != last_addr) { // EVT_TEXT を起こさず変更する addrctrl->ChangeValue(wxString(string_format("%08x", input_addr))); @@ -123,33 +164,11 @@ WXMemdumpWindow::OnTimer(wxTimerEvent& e addrctrl->SetInsertionPointEnd(); } - // テキストスクリーンを更新 - Update(); - screen->Refresh(); -} - -// フォントサイズ変更 -void -WXMemdumpWindow::SetFontSize(fontsize_t fontsize) -{ - screen->SetFontSize(fontsize); - - Layout(); - Fit(); -} - -// テキストスクリーンを更新 -void -WXMemdumpWindow::Update() -{ - uint32 laddr; - uint64 paddr; - monitor.Clear(); laddr = input_addr; paddr = 0; // shut up gcc - for (int y = 0; y < row; y++) { + for (int y = 0; y < monitor.GetRow(); y++) { if (is_logical) { } else { // 物理アドレス