--- nono/wx/wxdumpmonitor.h 2026/04/29 17:05:12 1.1.1.7 +++ nono/wx/wxdumpmonitor.h 2026/04/29 17:05:44 1.1.1.9 @@ -11,59 +11,104 @@ #pragma once #include "wxsubwindow.h" +#include "wxbutton.h" #include "wxmonitor.h" +#include "memdump.h" #include class WXMemdumpWindow : public WXSubWindow { using inherited = WXSubWindow; public: - WXMemdumpWindow(wxWindow *parent, int idx_); + WXMemdumpWindow(wxWindow *parent, int monid); virtual ~WXMemdumpWindow() override; - // ウィンドウID(モニタID) に対応する sticky address を取得する - static uint32 GetStickyAddr(int id); - // ウィンドウID(モニタID) に対応する sitcky address を設定する - static void SetStickyAddr(int id, uint32 addr); - + void FontChanged() override; + void Fit() override; bool Layout() override; private: + wxSize DoSizeHints(); + // テキスト入力イベント void OnTextEnter(wxCommandEvent& event); - // ページアップダウンイベント - void OnPrev(wxCommandEvent& event); - void OnNext(wxCommandEvent& event); + // ボタンイベント + void OnPrevLine(wxCommandEvent& event); + void OnPrevPage(wxCommandEvent& event); + void OnNextLine(wxCommandEvent& event); + void OnNextPage(wxCommandEvent& event); + + // 表示フォーマット変更イベント + void OnFormat(wxCommandEvent& event); + void DoFormat(Memdump::Format fmt_); + + // マウスイベント + void OnMouseWheel(wxMouseEvent& event); + void OnDClick(wxMouseEvent& event); + + uint64 GetAddrAtHexdump(int x, int y, int len); + uint64 GetAddrAtPageShort(int x, int y); + uint64 GetAddrAtDisasm(int x, int y, int instlen); // アドレス欄を更新 void UpdateAddr(); + // フォーマット番号とセレクション番号の相互変換 + Memdump::Format Selection2Format(int idx); + int Format2Selection(Memdump::Format fmt_); + wxString Format2String(Memdump::Format fmt_); + // コントロール wxTextCtrl *addrctrl {}; - wxButton *prev_btn {}; - wxButton *next_btn {}; + std::array buttons {}; + wxChoice *fmtctrl {}; + + // 表示フォーマットの選択肢 + std::vector> fmts {}; // コントロールパネルを格納する sizer wxBoxSizer *ctrlbox {}; - // コントロールパネル部分の長さ - int fixed_height {}; - WXMonitorPanel *screen {}; - // 識別子、または sticky_addr[] の添字。 + // モニタ ID + int monid {}; + // メモリダンプウィンドウは複数枚あるので自分がそのうちの何番目か。 - int idx {}; + int myidx {}; + + // メモリダンプ + MemdumpMonitor *memdump {}; + + // 前回のウィンドウマージン (クライアント領域の外側) + wxSize oldmargin {}; + + // 謎のリサイズ対策 + bool layout_pass2 {}; // イベントテーブル wxDECLARE_EVENT_TABLE(); +}; - // 開始番地の二次記憶域。 - // サブウィンドウは今のところ開いてる時だけオブジェクトが存在している - // タイプだが、メモリダンプウィンドウを閉じてまた開くとさっきのアドレスが - // 見えていてほしいので、ここでその状況を真似する。 - // こっちはあくまで補助用の領域で、現在表示中のアドレスの一次情報は - // screen.userdata のほう。 - static std::array sticky_addr; +// 編集ダイアログ +class MemEditDialog : public wxDialog +{ + using inherited = wxDialog; + public: + MemEditDialog(wxWindow *parent, uint32 addr, uint32 data, int len, + const std::string& sizestr); + ~MemEditDialog() override; + + // テキストコントロールの値を返す + uint64 GetData() const; + + private: + void OnTextEnter(wxCommandEvent& event); + + // 値入力欄 + wxTextCtrl *datactrl {}; + + // イベントテーブル + wxDECLARE_EVENT_TABLE(); };