Annotation of nono/wx/wxvectormonitor.cpp, revision 1.1.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.