--- nono/wx/wxhistmonitor.cpp 2026/04/29 17:04:59 1.1.1.4 +++ nono/wx/wxhistmonitor.cpp 2026/04/29 17:05:09 1.1.1.5 @@ -4,7 +4,12 @@ // Licensed under nono-license.txt // +// +// 履歴モニタ +// + #include "wxhistmonitor.h" +#include "wxtextscreen.h" // // 履歴モニタ (共通部分) @@ -13,7 +18,6 @@ // イベントテーブル wxBEGIN_EVENT_TABLE(WXHistoryMonitor, inherited) EVT_SIZE(WXHistoryMonitor::OnSize) - EVT_SCROLL(WXHistoryMonitor::OnScroll) wxEND_EVENT_TABLE() // コンストラクタ @@ -22,42 +26,18 @@ WXHistoryMonitor::WXHistoryMonitor(wxWin : inherited(parent, wxID_ANY, name) { // → - // +--+-----------------------+--+--+ - // | |↓+------------------+ | | | - // | | | 上余白(padding1) | | | | - // |左| +------------------+ |右| | - // |余| | TextScreen | |余| <- VScroll - // |白| +------------------+ |白| | - // | | | 下余白(padding2) | | | | - // | | +------------------+ | | | - // +--+-----------------------+--+--+ + // +------------+---------+ + // | TextScreen | VScroll | + // +------------+---------+ wxBoxSizer *topsizer = new wxBoxSizer(wxHORIZONTAL); - // 左余白 - topsizer->Add(new WXPaddingPanel(this), 0, wxEXPAND); - // 中列の縦 sizer - auto *vbox = new wxBoxSizer(wxVERTICAL); - topsizer->Add(vbox, 0, wxEXPAND); - - // パディングパネル(上下) - // ウィンドウを1行ずつ伸縮させるためには、クライアント領域がフォント高さの - // 整数倍になってないといけない。TextScreen はそれ自身が行の整数倍の大きさ - // だが、上下の余白はその時点のフォントサイズによって変更する必要がある。 - // 先にサイズ不定のパネルだけ置いといて、フォントサイズ確定後に大きさを - // 確定させる。DoSize() 参照。 - padding1 = new WXPaddingPanel(this); - padding2 = new WXPaddingPanel(this); - screen = new WXTextScreen(this, monitor_); - vbox->Add(padding1, 0, wxEXPAND); - vbox->Add(screen, 1, wxEXPAND); - vbox->Add(padding2, 0, wxEXPAND); - // 右余白 - topsizer->Add(new WXPaddingPanel(this), 0, wxEXPAND); + // テキストスクリーン + screen = new WXTextScreen(this, monitor_); + topsizer->Add(screen, 1, wxEXPAND); // スクロールバー - vscroll = new wxScrollBar(this, wxID_ANY, wxDefaultPosition, - wxDefaultSize, wxSB_VERTICAL); + vscroll = new WXScrollBar(this, wxID_ANY, wxSB_VERTICAL); topsizer->Add(vscroll, 0, wxEXPAND); SetSizer(topsizer); @@ -66,12 +46,16 @@ WXHistoryMonitor::WXHistoryMonitor(wxWin DoSize(); // スクロールのために (パネル領域での) MouseWheel イベントもここで - // 受け取りたい。スクロールバー上のマウスホイール操作は最初から Scroll - // イベントとして処理されているので問題ないが、パネル領域でのマウス - // ホイール操作はここ(wxFrame)ではなくパネルに対して飛んでくる。 + // 受け取りたい。スクロールバー上のマウスホイール操作はスクロールバーが + // 処理しているので問題ないが、パネル領域でのマウスホイール操作はここ + // (wxFrame)ではなくパネルに対して飛んでくる。 // ここで一緒に処理したほうが楽なので、こちらに回す。 screen->Connect(wxEVT_MOUSEWHEEL, wxMouseEventHandler(WXHistoryMonitor::OnMouseWheel), NULL, this); + + // スクロールバーからの位置変更通知 + vscroll->Connect(NONO_EVT_SCROLL, + wxScrollEventHandler(WXHistoryMonitor::OnScroll), NULL, this); } // デストラクタ @@ -79,13 +63,6 @@ WXHistoryMonitor::~WXHistoryMonitor() { } -// フォントサイズが確定したら、それによってウィンドウサイズを再計算する。 -void -WXHistoryMonitor::DoSize() -{ - CalcVSize(0); -} - // サイズ変更イベント void WXHistoryMonitor::OnSize(wxSizeEvent& event) @@ -100,7 +77,7 @@ WXHistoryMonitor::OnSize(wxSizeEvent& ev if (pos > range - thumbsize) { pos = range - thumbsize; } - vscroll->SetScrollbar(pos, thumbsize, range, pagesize); + vscroll->SetScrollParam(pos, thumbsize, range, pagesize); } // マウスホイールイベント (WXTextScreen 上で起きたやつをこっちに回してある) @@ -120,9 +97,11 @@ WXHistoryMonitor::OnMouseWheel(wxMouseEv pos = maxpos; DoScroll(pos); + // スクロールバーの位置を追従 + vscroll->SetThumbPosition(pos); } -// スクロールイベント (全部入り) +// スクロールバーからの通知イベント void WXHistoryMonitor::OnScroll(wxScrollEvent& event) { @@ -134,10 +113,10 @@ void WXHistoryMonitor::DoScroll(int pos) { // BranchHistory モニタは userdata が表示開始位置になっている - screen->SetUserData(exflag | pos); - vscroll->SetThumbPosition(pos); + screen->SetUserData(pos); } + // // ブランチ履歴モニタ // @@ -147,8 +126,6 @@ WXBranchHistoryMonitor::WXBranchHistoryM Monitor& monitor) : inherited(parent, _("Branch History"), monitor) { - exflag = 0; - screen->SetUserData(exflag); } // デストラクタ @@ -156,6 +133,7 @@ WXBranchHistoryMonitor::~WXBranchHistory { } + // // 例外履歴モニタ // @@ -165,8 +143,6 @@ WXExceptionHistoryMonitor::WXExceptionHi Monitor& monitor) : inherited(parent, _("Exception History"), monitor) { - exflag = 1ULL << 63; - screen->SetUserData(exflag); } // デストラクタ