From 4d006b6c1ea37f933feec1043e15923d698f402d Mon Sep 17 00:00:00 2001 From: Andreas Schenk <andreas_schenk@hms.harvard.edu> Date: Fri, 17 Apr 2015 10:39:59 -0400 Subject: [PATCH] added flag to allow creation of DataViewer outside the MDI window added export for the button group of the overlay manager to allow attaching slots added support for deleting overlays in the data viewer Author: Jeff Lovelace --- modules/gui/pymod/data_viewer_proxy.cc | 9 +++++ modules/gui/pymod/data_viewer_proxy.hh | 3 +- modules/gui/pymod/export_data_viewer.cc | 2 ++ modules/gui/pymod/export_gosty.cc | 6 +++- modules/gui/src/data_viewer/data_viewer.cc | 10 ++++++ modules/gui/src/data_viewer/data_viewer.hh | 5 +++ .../gui/src/data_viewer/overlay_manager.cc | 23 ++++++++++++ .../gui/src/data_viewer/overlay_manager.hh | 3 ++ .../src/data_viewer/overlay_manager_gui.cc | 5 +++ .../src/data_viewer/overlay_manager_gui.hh | 2 ++ modules/gui/src/gosty_app.cc | 36 ++++++++++++------- modules/gui/src/gosty_app.hh | 2 +- 12 files changed, 90 insertions(+), 16 deletions(-) diff --git a/modules/gui/pymod/data_viewer_proxy.cc b/modules/gui/pymod/data_viewer_proxy.cc index 3ddf8339b..d4d418e1f 100644 --- a/modules/gui/pymod/data_viewer_proxy.cc +++ b/modules/gui/pymod/data_viewer_proxy.cc @@ -154,6 +154,11 @@ void DataViewerProxy::ClearOverlays() viewer()->ClearOverlays(); } +void DataViewerProxy::ClearActiveOverlay() +{ + viewer()->ClearActiveOverlay(); +} + OverlayManagerPtr DataViewerProxy::GetOverlayManager() const { return viewer()->GetOverlayManager(); @@ -185,6 +190,10 @@ void DataViewerProxy::Hide() viewer()->hide(); } +object DataViewerProxy::GetButtonGroup() +{ + return ost::gui::get_py_qobject<QButtonGroup>(viewer()->GetButtonGroup()); +} object DataViewerProxy::GetQObject(){ return ost::gui::get_py_qobject<DataViewer>(viewer()); diff --git a/modules/gui/pymod/data_viewer_proxy.hh b/modules/gui/pymod/data_viewer_proxy.hh index 49e764b65..096485b40 100644 --- a/modules/gui/pymod/data_viewer_proxy.hh +++ b/modules/gui/pymod/data_viewer_proxy.hh @@ -83,6 +83,7 @@ public: int AddOverlay(const OverlayPtr& ov, bool make_active=true); OverlayManagerPtr GetOverlayManager() const; void ClearOverlays(); + void ClearActiveOverlay(); void AddDockWidget(QWidget* w, const QString& name, bool shown=true, int area=2); void RemoveDockWidget(QWidget* w); @@ -96,7 +97,7 @@ public: //Vec3 GetClickedPosition(); void Hide(); - + object GetButtonGroup(); object GetQObject(); protected: QPointer<DataViewer> viewer_ptr_; diff --git a/modules/gui/pymod/export_data_viewer.cc b/modules/gui/pymod/export_data_viewer.cc index e1b047d84..d5e03fe5e 100644 --- a/modules/gui/pymod/export_data_viewer.cc +++ b/modules/gui/pymod/export_data_viewer.cc @@ -66,6 +66,7 @@ void export_data_viewer() .def("Renormalize",&DataViewerProxy::Renormalize) .def("AddOverlay",&DataViewerProxy::AddOverlay,o_AddOverlay()) .def("ClearOverlays",&DataViewerProxy::ClearOverlays) + .def("ClearActiveOverlay",&DataViewerProxy::ClearActiveOverlay) .def("GetSelection",&DataViewerProxy::GetSelection) .def("SetSelection",&DataViewerProxy::SetSelection) .def("UpdateView",&DataViewerProxy::UpdateView) @@ -99,6 +100,7 @@ void export_data_viewer() .def("SetOffset", &DataViewerProxy::SetOffset) .def("GetOffset", &DataViewerProxy::GetOffset) .add_property("offset", &DataViewerProxy::GetOffset, &DataViewerProxy::SetOffset) + .def("GetButtonGroup", &DataViewerProxy::GetButtonGroup) .def("GetQObject",&DataViewerProxy::GetQObject) .add_property("qobject",&DataViewerProxy::GetQObject) diff --git a/modules/gui/pymod/export_gosty.cc b/modules/gui/pymod/export_gosty.cc index adc5594a8..ef7ee6777 100644 --- a/modules/gui/pymod/export_gosty.cc +++ b/modules/gui/pymod/export_gosty.cc @@ -54,8 +54,11 @@ DataViewerProxyPtr app_create_data_viewer2(GostyApp* app, const ost::img::ImageH { return DataViewerProxyPtr(new DataViewerProxy(app->CreateDataViewer(d))); } +DataViewerProxyPtr app_create_data_viewer3(GostyApp* app, const ost::img::ImageHandle& d, const QString& name, int noparent) +{ + return DataViewerProxyPtr(new DataViewerProxy(app->CreateDataViewer(d,name,noparent))); +} #endif - } void app_add_widget_to_app_a(GostyApp* app, const QString& ident, @@ -115,6 +118,7 @@ void export_Gosty() #if OST_IMG_ENABLED .def("CreateDataViewer", &app_create_data_viewer1) .def("CreateDataViewer", &app_create_data_viewer2) + .def("CreateDataViewer", &app_create_data_viewer3) #endif .def("ProcessEvents", &GostyApp::ProcessEvents) .add_property("perspective", diff --git a/modules/gui/src/data_viewer/data_viewer.cc b/modules/gui/src/data_viewer/data_viewer.cc index d64e88df2..0c157df37 100644 --- a/modules/gui/src/data_viewer/data_viewer.cc +++ b/modules/gui/src/data_viewer/data_viewer.cc @@ -205,6 +205,11 @@ geom::Vec2 DataViewer::GetOffset() const return panel_->GetOffset(); } +QButtonGroup* DataViewer::GetButtonGroup(void) +{ + return ov_manager_gui_->GetButtonGroup(); +} + int DataViewer::AddOverlay(const OverlayPtr& ov, bool make_active) { int retval= ov_manager_->AddOverlay(ov,make_active); @@ -217,6 +222,11 @@ void DataViewer::ClearOverlays() ov_manager_->DeleteAllOverlays(); } +void DataViewer::ClearActiveOverlay() +{ + ov_manager_->DeleteActiveOverlay(); +} + OverlayManagerPtr DataViewer::GetOverlayManager() const { return ov_manager_; diff --git a/modules/gui/src/data_viewer/data_viewer.hh b/modules/gui/src/data_viewer/data_viewer.hh index 902466a68..ca6893edc 100644 --- a/modules/gui/src/data_viewer/data_viewer.hh +++ b/modules/gui/src/data_viewer/data_viewer.hh @@ -95,6 +95,9 @@ public: //! remove all overlays void ClearOverlays(); + //! remove the active overlay + void ClearActiveOverlay(); + //! return the overlay manager for this viewer OverlayManagerPtr GetOverlayManager() const; @@ -142,6 +145,8 @@ public: //! get image offset geom::Vec2 GetOffset() const; + QButtonGroup* GetButtonGroup(void); + signals: void released(); diff --git a/modules/gui/src/data_viewer/overlay_manager.cc b/modules/gui/src/data_viewer/overlay_manager.cc index a9bc95028..ac2a709fb 100644 --- a/modules/gui/src/data_viewer/overlay_manager.cc +++ b/modules/gui/src/data_viewer/overlay_manager.cc @@ -103,6 +103,18 @@ void OverlayManager::DeleteAllOverlays() ov_list_.clear(); } +void OverlayManager::DeleteActiveOverlay() +{ + OverlayList::iterator pos=find_ov(active_ov_); + if (pos!=ov_list_.end()) { + for(ObserverList::iterator xit=obs_list_.begin();xit!=obs_list_.end();++xit) { + (*xit)->OnRemoveOverlay(this, pos->id); + } + pos=ov_list_.erase(pos); + active_ov_.reset(); + } + +} void OverlayManager::ActivateOverlay(const String& name) { @@ -351,4 +363,15 @@ OverlayManager::OverlayList::iterator OverlayManager::find_ov(const String& name return ov_list_.end(); } +OverlayManager::OverlayList::iterator OverlayManager::find_ov(OverlayPtr anoverlay) +{ + for(OverlayList::iterator it=ov_list_.begin();it!=ov_list_.end();++it) { + if(anoverlay==it->ov) { + return it; + break; + } + } + return ov_list_.end(); +} + }}} //ns diff --git a/modules/gui/src/data_viewer/overlay_manager.hh b/modules/gui/src/data_viewer/overlay_manager.hh index d1e973609..2a3bb7657 100644 --- a/modules/gui/src/data_viewer/overlay_manager.hh +++ b/modules/gui/src/data_viewer/overlay_manager.hh @@ -110,6 +110,8 @@ public: void DeleteAllOverlays(); + void DeleteActiveOverlay(); + void OnDraw(QPainter& pnt, DataViewerPanel* dvp) const; bool OnMouseEvent(QMouseEvent* e, DataViewerPanel* dvp, const QPoint& lastmouse) const; @@ -138,6 +140,7 @@ private: OverlayList::iterator find_ov(int id); OverlayList::iterator find_ov(const String& name); + OverlayList::iterator find_ov(OverlayPtr anoverlay); }; diff --git a/modules/gui/src/data_viewer/overlay_manager_gui.cc b/modules/gui/src/data_viewer/overlay_manager_gui.cc index ba9d884cb..69bb6a5dd 100644 --- a/modules/gui/src/data_viewer/overlay_manager_gui.cc +++ b/modules/gui/src/data_viewer/overlay_manager_gui.cc @@ -209,6 +209,11 @@ void OverlayManagerGUI::OnEventMenu(QAction* e) { } +QButtonGroup* OverlayManagerGUI::GetButtonGroup(void) +{ + return active_group_; +} + void OverlayManagerGUI::UpdateView() { } diff --git a/modules/gui/src/data_viewer/overlay_manager_gui.hh b/modules/gui/src/data_viewer/overlay_manager_gui.hh index 437b0c3b7..13ba39f87 100644 --- a/modules/gui/src/data_viewer/overlay_manager_gui.hh +++ b/modules/gui/src/data_viewer/overlay_manager_gui.hh @@ -120,6 +120,8 @@ public: void OnEventMenuPopup(QAction* e); void OnEventMenu(QAction* e); + QButtonGroup* GetButtonGroup(void); + public slots: void SetInfoText(const QString& t); diff --git a/modules/gui/src/gosty_app.cc b/modules/gui/src/gosty_app.cc index 66c612e94..949c76491 100644 --- a/modules/gui/src/gosty_app.cc +++ b/modules/gui/src/gosty_app.cc @@ -109,20 +109,30 @@ SequenceViewer* GostyApp::GetSequenceViewer() } #if OST_IMG_ENABLED -ost::img::gui::DataViewer* GostyApp::CreateDataViewer(const ost::img::ImageHandle& d, const QString& name) +ost::img::gui::DataViewer* GostyApp::CreateDataViewer(const ost::img::ImageHandle& d, const QString& name, const int noparent) { - ost::img::gui::DataViewer* viewer=new ost::img::gui::DataViewer(main_,d,name); - QMdiSubWindow* mdi=new QMdiSubWindow(this->GetPerspective()->GetMainArea()); - mdi->setWindowTitle(name); - mdi->setWidget(viewer); - mdi->setFocusProxy(viewer); - viewer->setAttribute(Qt::WA_DeleteOnClose); - mdi->setAttribute(Qt::WA_DeleteOnClose); - viewer->setParent(mdi); - this->GetPerspective()->GetMainArea()->addSubWindow(mdi); - mdi->showMaximized(); - connect(viewer,SIGNAL(released()),mdi,SLOT(close())); - return viewer; + ost::img::gui::DataViewer* viewer=NULL; + if (noparent) + { + viewer=new ost::img::gui::DataViewer(NULL,d,name); + } + else + { + viewer=new ost::img::gui::DataViewer(main_,d,name); + QMdiSubWindow* mdi=new QMdiSubWindow(this->GetPerspective()->GetMainArea()); + mdi->setWindowTitle(name); + mdi->setWidget(viewer); + mdi->setFocusProxy(viewer); + viewer->setAttribute(Qt::WA_DeleteOnClose); + mdi->setAttribute(Qt::WA_DeleteOnClose); + viewer->setParent(mdi); + this->GetPerspective()->GetMainArea()->addSubWindow(mdi); + mdi->showMaximized(); + connect(viewer,SIGNAL(released()),mdi,SLOT(close())); + } + + return viewer; + } #endif diff --git a/modules/gui/src/gosty_app.hh b/modules/gui/src/gosty_app.hh index 1cf803e00..47b0f23fa 100644 --- a/modules/gui/src/gosty_app.hh +++ b/modules/gui/src/gosty_app.hh @@ -124,7 +124,7 @@ public: #if OST_IMG_ENABLED /// \brief create new DataViewer /// - ost::img::gui::DataViewer* CreateDataViewer(const ost::img::ImageHandle& d, const QString& name=""); + ost::img::gui::DataViewer* CreateDataViewer(const ost::img::ImageHandle& d, const QString& name="", const int noparent=0); #endif /// \brief give the application time to run the mainloop and process events -- GitLab