diff --git a/include/DataManager.hh b/include/DataManager.hh index c42f295..6764162 100644 --- a/include/DataManager.hh +++ b/include/DataManager.hh @@ -20,6 +20,8 @@ public: bool NextEvent(); /// Move to the previous event. bool PrevEvent(); + /// Jump directly to a specific event number. + bool GoToEvent(int evtNum); /// Load selected event. bool LoadEvent(); diff --git a/include/GUIDisplay.hh b/include/GUIDisplay.hh index 83670a9..5151dbe 100644 --- a/include/GUIDisplay.hh +++ b/include/GUIDisplay.hh @@ -33,6 +33,9 @@ public: void OnNextEvent(); void OnPrevEvent(); + /// Called when "Go To" button fires + void OnGoToEvent(); + /// Called when "Save" button fires void OnSave(); @@ -43,6 +46,7 @@ private: DataManager dataMgr_; MultiView *mv_; TGLabel* summaryView_; + TGTextEntry* goToEntry_; TGTextEntry* filenameEntry_; int imageScale_ = 0; // for saving diff --git a/numu_display.png b/numu_display.png index b765568..261a9bb 100644 Binary files a/numu_display.png and b/numu_display.png differ diff --git a/src/DataManager.cpp b/src/DataManager.cpp index 69a4bb8..78611cf 100644 --- a/src/DataManager.cpp +++ b/src/DataManager.cpp @@ -87,12 +87,25 @@ bool DataManager::PrevEvent() std::cout << "[DataManager] Already at first event." << std::endl; return false; } - + --currentIndex_; currentEvent_ = eventList_.at(currentIndex_); return true; } +bool DataManager::GoToEvent(int evtNum) +{ + if(!rootFile_) return false; + auto it = std::find(eventList_.begin(), eventList_.end(), evtNum); + if (it == eventList_.end()) { + std::cerr << "[DataManager] Event " << evtNum << " not found." << std::endl; + return false; + } + currentIndex_ = std::distance(eventList_.begin(), it); + currentEvent_ = evtNum; + return true; +} + bool DataManager::LoadEvent() { if(!rootFile_){ diff --git a/src/GUIDisplay.cpp b/src/GUIDisplay.cpp index 733d22c..99055d6 100644 --- a/src/GUIDisplay.cpp +++ b/src/GUIDisplay.cpp @@ -103,6 +103,17 @@ void GUIDisplay::OnPrevEvent() } } +void GUIDisplay::OnGoToEvent() +{ + TString txt = goToEntry_->GetText(); + if (txt.IsNull()) return; + int evtNum = txt.Atoi(); + if (dataMgr_.GoToEvent(evtNum)) { + LoadEvent(); + UpdateSummary(); + } +} + void GUIDisplay::OnSave() { std::string filename = filenameEntry_->GetText(); @@ -154,6 +165,18 @@ void GUIDisplay::MakeControlTab() frm->AddFrame(hf, new TGLayoutHints(kLHintsTop | kLHintsCenterX)); + // go-to event row + TGHorizontalFrame* gotoFrame = new TGHorizontalFrame(frm); + TGLabel* gotoLabel = new TGLabel(gotoFrame, "Go to event:"); + gotoFrame->AddFrame(gotoLabel, new TGLayoutHints(kLHintsCenterY, 5, 2, 2, 2)); + goToEntry_ = new TGTextEntry(gotoFrame, ""); + goToEntry_->SetWidth(60); + gotoFrame->AddFrame(goToEntry_, new TGLayoutHints(kLHintsCenterY, 2, 2, 2, 2)); + TGTextButton* gotoBtn = new TGTextButton(gotoFrame, "Go"); + gotoFrame->AddFrame(gotoBtn, new TGLayoutHints(kLHintsCenterY, 2, 5, 2, 2)); + gotoBtn->Connect("Clicked()", "GUIDisplay", this, "OnGoToEvent()"); + frm->AddFrame(gotoFrame, new TGLayoutHints(kLHintsTop | kLHintsCenterX)); + // event summary summaryView_ = new TGLabel(frm, ""); frm->AddFrame(summaryView_, new TGLayoutHints(kLHintsExpandX | kLHintsTop, 5, 5, 10, 5));