|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2020 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: #include "wxhistmonitor.h" ! 8: ! 9: // ! 10: // 履歴モニタ (共通部分) ! 11: // ! 12: ! 13: // イベントテーブル ! 14: wxBEGIN_EVENT_TABLE(WXHistoryMonitor, inherited) ! 15: EVT_SIZE(WXHistoryMonitor::OnSize) ! 16: EVT_SCROLL(WXHistoryMonitor::OnScroll) ! 17: wxEND_EVENT_TABLE() ! 18: ! 19: // コンストラクタ ! 20: WXHistoryMonitor::WXHistoryMonitor(wxWindow *parent, wxWindowID id, ! 21: const wxString& name, IMonitor& monitor_) ! 22: : inherited(parent, id, name) ! 23: { ! 24: // → ! 25: // +--+-----------------------+--+--+ ! 26: // | |↓+------------------+ | | | ! 27: // | | | 上余白(padding1) | | | | ! 28: // |左| +------------------+ |右| | ! 29: // |余| | TextScreen | |余| <- VScroll ! 30: // |白| +------------------+ |白| | ! 31: // | | | 下余白(padding2) | | | | ! 32: // | | +------------------+ | | | ! 33: // +--+-----------------------+--+--+ ! 34: ! 35: topsizer = new wxBoxSizer(wxHORIZONTAL); ! 36: // 左余白 ! 37: topsizer->AddSpacer(DefaultPadding); ! 38: // 中列の縦 sizer ! 39: auto *vbox = new wxBoxSizer(wxVERTICAL); ! 40: topsizer->Add(vbox, 0, wxEXPAND); ! 41: ! 42: // パディングパネル(上下) ! 43: // ウィンドウを1行ずつ伸縮させるためには、クライアント領域がフォント高さの ! 44: // 整数倍になってないといけない。TextScreen はそれ自身が行の整数倍の大きさ ! 45: // だが、上下の余白はその時点のフォントサイズによって変更する必要がある。 ! 46: // 先にサイズ不定のパネルだけ置いといて、フォントサイズ確定後に大きさを ! 47: // 確定させる。DoSize() 参照。 ! 48: padding1 = new wxPanel(this, wxID_ANY); ! 49: padding2 = new wxPanel(this, wxID_ANY); ! 50: vbox->Add(padding1); ! 51: screen = new WXTextScreen(this, monitor_); ! 52: vbox->Add(screen, 1, wxEXPAND); ! 53: vbox->Add(padding2); ! 54: ! 55: // 右余白 ! 56: topsizer->AddSpacer(DefaultPadding); ! 57: ! 58: // スクロールバー ! 59: vscroll = new wxScrollBar(this, wxID_ANY, wxDefaultPosition, ! 60: wxDefaultSize, wxSB_VERTICAL); ! 61: topsizer->Add(vscroll, 0, wxEXPAND); ! 62: ! 63: SetSizer(topsizer); ! 64: ! 65: // ウィンドウサイズを確定させる ! 66: DoSize(); ! 67: ! 68: // スクロールのために (パネル領域での) MouseWheel イベントもここで ! 69: // 受け取りたい。スクロールバー上のマウスホイール操作は最初から Scroll ! 70: // イベントとして処理されているので問題ないが、パネル領域でのマウス ! 71: // ホイール操作はここ(wxFrame)ではなくパネルに対して飛んでくる。 ! 72: // ここで一緒に処理したほうが楽なので、こちらに回す。 ! 73: screen->Connect(wxEVT_MOUSEWHEEL, ! 74: wxMouseEventHandler(WXHistoryMonitor::OnMouseWheel), NULL, this); ! 75: } ! 76: ! 77: // デストラクタ ! 78: WXHistoryMonitor::~WXHistoryMonitor() ! 79: { ! 80: } ! 81: ! 82: // フォントサイズが確定したら、それによってウィンドウサイズを再計算する。 ! 83: void ! 84: WXHistoryMonitor::DoSize() ! 85: { ! 86: CalcVSize(0); ! 87: } ! 88: ! 89: // サイズ変更イベント ! 90: void ! 91: WXHistoryMonitor::OnSize(wxSizeEvent& event) ! 92: { ! 93: inherited::OnSize(event); ! 94: ! 95: // スクロールバーを再設定 ! 96: int pos = (int)screen->GetUserData(); ! 97: const wxSize& size = screen->GetSize(); ! 98: int thumbsize = size.GetHeight() - 1; // 常にヘッダ1行表示している ! 99: int range = 256; // XXX 拾ってくるべき ! 100: int pagesize = thumbsize - 1; ! 101: if (pos > range - thumbsize) { ! 102: pos = range - thumbsize; ! 103: } ! 104: vscroll->SetScrollbar(pos, thumbsize, range, pagesize); ! 105: } ! 106: ! 107: // マウスホイールイベント (WXTextScreen 上で起きたやつをこっちに回してある) ! 108: void ! 109: WXHistoryMonitor::OnMouseWheel(wxMouseEvent& event) ! 110: { ! 111: // GetWheelRotation() は上(奥)向きに回すと +120、下(手前)に回すと -120。 ! 112: // どこの決まりか知らんけど、スクロールバーのほうはホイール1段階で3行 ! 113: // スクロールするのでそれに合わせる。 ! 114: int pos = (int)screen->GetUserData(); ! 115: pos = pos - event.GetWheelRotation() / 40; ! 116: ! 117: int maxpos = vscroll->GetRange() - vscroll->GetThumbSize(); ! 118: if (pos < 0) ! 119: pos = 0; ! 120: if (pos > maxpos) ! 121: pos = maxpos; ! 122: ! 123: DoScroll(pos); ! 124: } ! 125: ! 126: // スクロールイベント (全部入り) ! 127: void ! 128: WXHistoryMonitor::OnScroll(wxScrollEvent& event) ! 129: { ! 130: DoScroll(event.GetPosition()); ! 131: } ! 132: ! 133: // スクロール処理 (OnScroll() と OnMouseWheel() から呼ばれる) ! 134: void ! 135: WXHistoryMonitor::DoScroll(int pos) ! 136: { ! 137: // BranchHistory モニタは userdata が表示開始位置になっている ! 138: screen->SetUserData(exflag | pos); ! 139: vscroll->SetThumbPosition(pos); ! 140: } ! 141: ! 142: // ! 143: // ブランチ履歴モニタ ! 144: // ! 145: ! 146: // コンストラクタ ! 147: WXBranchHistoryMonitor::WXBranchHistoryMonitor(wxWindow *parent, wxWindowID id, ! 148: IMonitor& monitor) ! 149: : inherited(parent, id, _("Branch History"), monitor) ! 150: { ! 151: exflag = 0; ! 152: screen->SetUserData(exflag); ! 153: } ! 154: ! 155: // デストラクタ ! 156: WXBranchHistoryMonitor::~WXBranchHistoryMonitor() ! 157: { ! 158: } ! 159: ! 160: // ! 161: // 例外履歴モニタ ! 162: // ! 163: ! 164: // コンストラクタ ! 165: WXExceptionHistoryMonitor::WXExceptionHistoryMonitor(wxWindow *parent, ! 166: wxWindowID id, IMonitor& monitor) ! 167: : inherited(parent, id, _("Exception History"), monitor) ! 168: { ! 169: exflag = 1ULL << 63; ! 170: screen->SetUserData(exflag); ! 171: } ! 172: ! 173: // デストラクタ ! 174: WXExceptionHistoryMonitor::~WXExceptionHistoryMonitor() ! 175: { ! 176: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.