|
|
1.1 root 1: //
2: // nono
1.1.1.2 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
7: //
1.1.1.7 ! root 8: // モニター
1.1 root 9: //
10:
1.1.1.6 root 11: #include "wxmonitor.h"
1.1.1.7 ! root 12: #include "wxmainframe.h"
! 13:
! 14: //
! 15: // モニターパネル
! 16: //
! 17:
! 18: // イベントテーブル
! 19: wxBEGIN_EVENT_TABLE(WXMonitorPanel, inherited)
! 20: EVT_TIMER(wxID_ANY, WXMonitorPanel::OnTimer)
! 21: wxEND_EVENT_TABLE()
! 22:
! 23: // コンストラクタ
! 24: WXMonitorPanel::WXMonitorPanel(wxWindow *parent, Monitor& monitor_)
! 25: : inherited(parent, monitor_.GetSize())
! 26: , monitor(monitor_)
! 27: {
! 28: timer.SetOwner(this);
! 29:
! 30: // 現在の設定値を適用
! 31: SetRate(gMainFrame->GetMonitorRate());
! 32:
! 33: // 最初に一回描画を起こす
! 34: wxTimerEvent dummy(timer);
! 35: AddPendingEvent(dummy);
! 36: }
! 37:
! 38: // デストラクタ
! 39: WXMonitorPanel::~WXMonitorPanel()
! 40: {
! 41: }
! 42:
! 43: // タイマーイベント
! 44: void
! 45: WXMonitorPanel::OnTimer(wxTimerEvent& event)
! 46: {
! 47: DoRefresh();
! 48: }
! 49:
! 50: // 画面を更新して再描画する。
! 51: //
! 52: // 通常はタイマーイベントにより更新間隔ごとに呼ばれるが、
! 53: // ユーザ操作により画面の更新が必要ならその都度直接これを呼ぶ。
! 54: void
! 55: WXMonitorPanel::DoRefresh()
! 56: {
! 57: // モニタースクリーンを更新して
! 58: MONITOR_UPDATE(monitor, screen);
! 59:
! 60: // 必要なら再描画
! 61: if (screen.GetBuf() != prevbuf) {
! 62: Refresh();
! 63: }
! 64: }
! 65:
! 66: // 画面更新頻度を Hz で設定する。
! 67: void
! 68: WXMonitorPanel::SetRate(int hz)
! 69: {
! 70: timer.Start(1000 / hz);
! 71: }
! 72:
! 73:
! 74: //
! 75: // モニターウィンドウ
! 76: //
1.1.1.6 root 77:
1.1 root 78: // コンストラクタ
1.1.1.5 root 79: WXMonitorWindow::WXMonitorWindow(wxWindow *parent, const wxString& name,
80: Monitor& monitor_)
81: : inherited(parent, wxID_ANY, name)
1.1 root 82: {
1.1.1.7 ! root 83: // モニタパネル
! 84: monpanel = new WXMonitorPanel(this, monitor_);
1.1.1.6 root 85: DoSize();
1.1 root 86: }
87:
88: // デストラクタ
89: WXMonitorWindow::~WXMonitorWindow()
90: {
91: }
1.1.1.7 ! root 92:
! 93:
! 94: //
! 95: // 縦スクロールバー付きモニタウィンドウ
! 96: //
! 97:
! 98: // イベントテーブル
! 99: wxBEGIN_EVENT_TABLE(WXScrollMonitorWindow, inherited)
! 100: EVT_SIZE(WXScrollMonitorWindow::OnSize)
! 101: wxEND_EVENT_TABLE()
! 102:
! 103: // コンストラクタ
! 104: WXScrollMonitorWindow::WXScrollMonitorWindow(wxWindow *parent,
! 105: const wxString& name, Monitor& monitor_)
! 106: : inherited(parent, wxID_ANY, name, DEFAULT_STYLE | wxRESIZE_BORDER)
! 107: {
! 108: // →
! 109: // +--------------+---------+
! 110: // | MonitorPanel | VScroll |
! 111: // +--------------+---------+
! 112:
! 113: wxBoxSizer *topsizer = new wxBoxSizer(wxHORIZONTAL);
! 114:
! 115: // モニタパネル
! 116: monpanel = new WXMonitorPanel(this, monitor_);
! 117: topsizer->Add(monpanel, 1, wxEXPAND);
! 118:
! 119: // スクロールバー
! 120: vscroll = new WXScrollBar(this, wxID_ANY, wxSB_VERTICAL);
! 121: topsizer->Add(vscroll, 0, wxEXPAND);
! 122:
! 123: SetSizer(topsizer);
! 124:
! 125: // ウィンドウサイズを確定させる
! 126: DoSize();
! 127:
! 128: // スクロールのために (パネル領域での) MouseWheel イベントもここで
! 129: // 受け取りたい。スクロールバー上のマウスホイール操作はスクロールバーが
! 130: // 処理しているので問題ないが、パネル領域でのマウスホイール操作はここ
! 131: // (wxFrame)ではなくパネルに対して飛んでくる。
! 132: // ここで一緒に処理したほうが楽なので、こちらに回す。
! 133: monpanel->Connect(wxEVT_MOUSEWHEEL,
! 134: wxMouseEventHandler(WXScrollMonitorWindow::OnMouseWheel), NULL, this);
! 135:
! 136: // スクロールバーからの位置変更通知
! 137: vscroll->Connect(NONO_EVT_SCROLL,
! 138: wxScrollEventHandler(WXScrollMonitorWindow::OnScroll), NULL, this);
! 139: }
! 140:
! 141: // デストラクタ
! 142: WXScrollMonitorWindow::~WXScrollMonitorWindow()
! 143: {
! 144: }
! 145:
! 146: bool
! 147: WXScrollMonitorWindow::Layout()
! 148: {
! 149: // 縦リサイズ可能レイアウト
! 150: return LayoutTextVResize(monpanel);
! 151: }
! 152:
! 153: // サイズ変更イベント
! 154: void
! 155: WXScrollMonitorWindow::OnSize(wxSizeEvent& event)
! 156: {
! 157: inherited::OnSize(event);
! 158:
! 159: // 今の所ヘッダが常に1行ある
! 160: static int HEADLINES = 1;
! 161:
! 162: // スクロールバーを再設定
! 163: int pos = (int)monpanel->GetUserData();
! 164: int thumbsize = monpanel->GetRow() - HEADLINES;
! 165: int range = monpanel->GetMonitor().GetMaxHeight() - HEADLINES;
! 166: int pagesize = thumbsize - 1;
! 167: if (pos > range - thumbsize) {
! 168: pos = range - thumbsize;
! 169: DoScroll(pos);
! 170: }
! 171: vscroll->SetScrollParam(pos, thumbsize, range, pagesize);
! 172: }
! 173:
! 174: // マウスホイールイベント (WXTextScreen 上で起きたやつをこっちに回してある)
! 175: void
! 176: WXScrollMonitorWindow::OnMouseWheel(wxMouseEvent& event)
! 177: {
! 178: // GetWheelRotation() は上(奥)向きに回すと +120、下(手前)に回すと -120。
! 179: // どこの決まりか知らんけど、スクロールバーのほうはホイール1段階で3行
! 180: // スクロールするのでそれに合わせる。
! 181: int pos = (int)monpanel->GetUserData();
! 182: pos = pos - event.GetWheelRotation() / 40;
! 183:
! 184: int maxpos = vscroll->GetRange() - vscroll->GetThumbSize();
! 185: if (pos < 0)
! 186: pos = 0;
! 187: if (pos > maxpos)
! 188: pos = maxpos;
! 189:
! 190: DoScroll(pos);
! 191: // スクロールバーの位置を追従
! 192: vscroll->SetThumbPosition(pos);
! 193: }
! 194:
! 195: // スクロールバーからの通知イベント
! 196: void
! 197: WXScrollMonitorWindow::OnScroll(wxScrollEvent& event)
! 198: {
! 199: DoScroll(event.GetPosition());
! 200: }
! 201:
! 202: // スクロール処理 (OnScroll() と OnMouseWheel() から呼ばれる)
! 203: void
! 204: WXScrollMonitorWindow::DoScroll(int pos)
! 205: {
! 206: // userdata が表示開始位置になっている
! 207: monpanel->SetUserData(pos);
! 208: monpanel->DoRefresh();
! 209: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.