Annotation of nono/wx/wxvectormonitor.cpp, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2022 nono project
        !             4: // Licensed under nono-license.txt
        !             5: //
        !             6: 
        !             7: //
        !             8: // ベクタテーブルモニタ
        !             9: //
        !            10: 
        !            11: #include "wxvectormonitor.h"
        !            12: #include "wxtextscreen.h"
        !            13: #include "vectortable.h"
        !            14: 
        !            15: // イベントテーブル
        !            16: wxBEGIN_EVENT_TABLE(WXVectorMonitor, inherited)
        !            17:        EVT_SIZE(WXVectorMonitor::OnSize)
        !            18: wxEND_EVENT_TABLE()
        !            19: 
        !            20: // コンストラクタ
        !            21: WXVectorMonitor::WXVectorMonitor(wxWindow *parent)
        !            22:        : inherited(parent, wxID_ANY, _("Vector Table"))
        !            23: {
        !            24:        // →
        !            25:        // +------------+---------+
        !            26:        // | TextScreen | VScroll |
        !            27:        // +------------+---------+
        !            28: 
        !            29:        wxBoxSizer *topsizer = new wxBoxSizer(wxHORIZONTAL);
        !            30: 
        !            31:        // テキストスクリーン
        !            32:        screen = new WXTextScreen(this, gMonitorManager->Get(ID_SUBWIN_VECTOR));
        !            33:        topsizer->Add(screen, 1, wxEXPAND);
        !            34: 
        !            35:        // スクロールバー
        !            36:        vscroll = new WXScrollBar(this, wxID_ANY, wxSB_VERTICAL);
        !            37:        topsizer->Add(vscroll, 0, wxEXPAND);
        !            38: 
        !            39:        SetSizer(topsizer);
        !            40: 
        !            41:        // ウィンドウサイズを確定させる
        !            42:        DoSize();
        !            43: 
        !            44:        // スクロールのために (パネル領域での) MouseWheel イベントもここで
        !            45:        // 受け取りたい。スクロールバー上のマウスホイール操作はスクロールバーが
        !            46:        // 処理しているので問題ないが、パネル領域でのマウスホイール操作はここ
        !            47:        // (wxFrame)ではなくパネルに対して飛んでくる。
        !            48:        // ここで一緒に処理したほうが楽なので、こちらに回す。
        !            49:        screen->Connect(wxEVT_MOUSEWHEEL,
        !            50:                wxMouseEventHandler(WXVectorMonitor::OnMouseWheel), NULL, this);
        !            51: 
        !            52:        // スクロールバーからの位置変更通知
        !            53:        vscroll->Connect(NONO_EVT_SCROLL,
        !            54:                wxScrollEventHandler(WXVectorMonitor::OnScroll), NULL, this);
        !            55: }
        !            56: 
        !            57: // デストラクタ
        !            58: WXVectorMonitor::~WXVectorMonitor()
        !            59: {
        !            60: }
        !            61: 
        !            62: // サイズ変更イベント
        !            63: void
        !            64: WXVectorMonitor::OnSize(wxSizeEvent& event)
        !            65: {
        !            66:        inherited::OnSize(event);
        !            67: 
        !            68:        // スクロールバーを再設定
        !            69:        int pos = (int)screen->GetUserData();
        !            70:        int thumbsize = screen->GetRow() - 1; // 常にヘッダ1行表示している
        !            71:        int range = gVectorTable->Size();
        !            72:        int pagesize = thumbsize - 1;
        !            73:        if (pos > range - thumbsize) {
        !            74:                pos = range - thumbsize;
        !            75:        }
        !            76:        vscroll->SetScrollParam(pos, thumbsize, range, pagesize);
        !            77: }
        !            78: 
        !            79: // マウスホイールイベント (WXTextScreen 上で起きたやつをこっちに回してある)
        !            80: void
        !            81: WXVectorMonitor::OnMouseWheel(wxMouseEvent& event)
        !            82: {
        !            83:        // GetWheelRotation() は上(奥)向きに回すと +120、下(手前)に回すと -120。
        !            84:        // どこの決まりか知らんけど、スクロールバーのほうはホイール1段階で3行
        !            85:        // スクロールするのでそれに合わせる。
        !            86:        int pos = (int)screen->GetUserData();
        !            87:        pos = pos - event.GetWheelRotation() / 40;
        !            88: 
        !            89:        int maxpos = vscroll->GetRange() - vscroll->GetThumbSize();
        !            90:        if (pos < 0)
        !            91:                pos = 0;
        !            92:        if (pos > maxpos)
        !            93:                pos = maxpos;
        !            94: 
        !            95:        DoScroll(pos);
        !            96:        // スクロールバーの位置を追従
        !            97:        vscroll->SetThumbPosition(pos);
        !            98: }
        !            99: 
        !           100: // スクロールバーからの通知イベント
        !           101: void
        !           102: WXVectorMonitor::OnScroll(wxScrollEvent& event)
        !           103: {
        !           104:        DoScroll(event.GetPosition());
        !           105: }
        !           106: 
        !           107: // スクロール処理 (OnScroll() と OnMouseWheel() から呼ばれる)
        !           108: void
        !           109: WXVectorMonitor::DoScroll(int pos)
        !           110: {
        !           111:        // Vector モニタは userdata が表示開始位置になっている
        !           112:        screen->SetUserData(pos);
        !           113: }

unix.superglobalmegacorp.com

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