Annotation of nono/wx/wxmonitor.cpp, revision 1.1.1.7

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.