--- nono/wx/wxmpumonitor.cpp 2026/04/29 17:04:53 1.1.1.3 +++ nono/wx/wxmpumonitor.cpp 2026/04/29 17:04:56 1.1.1.4 @@ -9,125 +9,49 @@ #include "m88200.h" // -// CMMU キャッシュウィンドウ用のパネル -// (マウスイベントを受け取るため) +// CMMU キャッシュウィンドウ // -// イベントテーブル -wxBEGIN_EVENT_TABLE(WXCacheTextScreen, inherited) - EVT_LEFT_DOWN(WXCacheTextScreen::OnLeftDown) -wxEND_EVENT_TABLE() - // コンストラクタ -WXCacheTextScreen::WXCacheTextScreen(wxWindow *parent, IMonitor& monitor_) - : inherited(parent, monitor_) -{ - parentwindow = dynamic_cast(parent); +WXCacheWindow::WXCacheWindow(wxWindow *parent, const wxString& name, + Monitor& monitor_) + : inherited(parent, name, monitor_) +{ + // テキストスクリーンパネルに送られるマウスイベントをこちらで処理する + screen->Connect(wxEVT_LEFT_DOWN, + wxMouseEventHandler(WXCacheWindow::OnLeftDown), NULL, this); } // デストラクタ -WXCacheTextScreen::~WXCacheTextScreen() +WXCacheWindow::~WXCacheWindow() { } // マウス左クリックイベント void -WXCacheTextScreen::OnLeftDown(wxMouseEvent& event) +WXCacheWindow::OnLeftDown(wxMouseEvent& event) { const wxPoint& pos = event.GetPosition(); // テキストの桁数、行数 - int tx = pos.x / font_width; - int ty = pos.y / font_height; - - // 親で処理 - parentwindow->DoLeftDown(tx, ty); - - event.Skip(); -} - - -// -// CMMU キャッシュウィンドウ -// - -// コンストラクタ -WXCacheWindow::WXCacheWindow(wxWindow *parent, wxWindowID id, - const wxString& name, m88200 *cmmu_) - : inherited(parent, id, name) -{ - cmmu = cmmu_; - - // top - // | +----------------------------+ - // v | 上余白 | - // |+------+------------+------+| - // ||左余白| TextScreen |右余白|| - // |+------+------------+------+| - // | 下余白 | - // +----------------------------+ - wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL); - - // 上余白 - topsizer->Add(new WXPaddingPanel(this), 0, wxEXPAND); - - // 中段(横sizer) - wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(hbox, 0, wxEXPAND); - - // 左余白 - hbox->Add(new WXPaddingPanel(this), 0, wxEXPAND); - - // テキストスクリーン - screen = new WXCacheTextScreen(this, *this); - hbox->Add(screen, 0, wxEXPAND); - - // 右余白 - hbox->Add(new WXPaddingPanel(this), 0, wxEXPAND); - - // 下余白 - topsizer->Add(new WXPaddingPanel(this), 0, wxEXPAND); - - SetSizer(topsizer); + const wxSize& font = screen->GetFontSize(); + int x = pos.x / font.GetWidth(); + int y = pos.y / font.GetHeight(); - // 大きさを固定 - Fit(); -} - -// デストラクタ -WXCacheWindow::~WXCacheWindow() -{ -} - -// モニターサイズ取得 -nnSize -WXCacheWindow::GetMonitorSize() -{ - return nnSize(82, 23); -} - -// モニターテキストを更新 -void -WXCacheWindow::MonitorUpdate(TextScreen& monitor) -{ - // 上半分(セット詳細) - cmmu->MonitorCacheSet(monitor, 0, setidx); - // 下半分(概要) - cmmu->MonitorCacheOverview(monitor, 6, setidx, true); -} - -// 右クリック処理 (WXCacheTextScreen::OnLeftDown から呼ばれる) -void -WXCacheWindow::DoLeftDown(int x, int y) -{ // クリックされた場所のセット番号に更新 - // (再描画は次のタイマーイベントで行われる) x -= 3; - y -= 7; - if (x >= 0 && y >= 0) { + y -= 1; + if (x >= 0 && y >= 0 && y < 16) { // セットとセットの間の空白には反応しないようにしたい if (x % 5 < 4) { - setidx = y * 16 + (x / 5); + // このモニタは userdata を現在のセット番号として使っている + int setidx = y * 16 + (x / 5); + screen->SetUserData(setidx); } } + + // 画面更新 + screen->DoRefresh(); + + event.Skip(); }