--- nono/wx/wxlogmonitor.h 2026/04/29 17:04:28 1.1 +++ nono/wx/wxlogmonitor.h 2026/04/29 17:04:39 1.1.1.3 @@ -1,6 +1,7 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once @@ -8,42 +9,69 @@ #include "wxsubwindow.h" #include "wxtextscreen.h" -class WXLogMonitor : public WXSubWindow +class WXLogMonitor : public WXVResizeSubWindow, public IMonitor { - typedef WXSubWindow inherited; + using inherited = WXVResizeSubWindow; public: WXLogMonitor(wxWindow *, wxWindowID); - virtual ~WXLogMonitor(); + virtual ~WXLogMonitor() override; - virtual void SetFontSize(fontsize_t fontsize); + nnSize GetMonitorSize() override; + void MonitorUpdate(TextScreen& ts) override; private: - void OnTimer(wxTimerEvent& event); + // サイズ変更イベント + void OnSize(wxSizeEvent&); + // マウスホイールイベント + void OnMouseWheel(wxMouseEvent&); + + // スクロールイベント + void OnScroll(wxScrollEvent&); + + // スクロールバー再設定 + void SetScroll(); + + // スクロール処理 + void DoScroll(int pos); + + // ウィンドウサイズ再計算 + void DoSize() override; + + // バックログに追加 void Append(const char *); - // テキストスクリーンコントロール - WXTextScreen *screen = NULL; + // 1行追加された時の下請け処理 + void IncLines(); - // テキストスクリーン - TextScreen text; + // スクロールバー + wxScrollBar *vscroll = NULL; int col = 0; int row = 0; + // 表示開始位置 + // パネル最下行に表示する行を、最新行からのオフセットで表す。 + // 0 ならパネル最下行は最新行、1 なら一つ手前の行…となる。 + int vpos = 0; + + // 現在のログ行数 + int lines = 0; + + // ログ全体の行数(上限) + const int backlog = 10000; + // ログバッファ // ここは属性フィールドを持たないテキストによる循環バッファ - uint8 *logbuf = NULL; + std::vector logbuf {}; - // 書き込み位置 - int target = 0; + // 今から書き込む行の先頭 (logbuf からのオフセット) + int cursor {}; // UTF-8 -> CP932 変換 wxCSConv conv { "CP932" }; - wxTimer timer; - // イベントテーブル wxDECLARE_EVENT_TABLE(); };