From 3f6fc38bb5ec2b83088e0c1cbd3449b6e8e23102 Mon Sep 17 00:00:00 2001
From: Andreas Schenk <andreas_schenk@hms.harvard.edu>
Date: Wed, 9 Jan 2013 13:58:07 -0500
Subject: [PATCH] re-added data viewer context menu

---
 .../src/data_viewer/data_viewer_panel_base.cc | 275 ++++++++++--------
 .../src/data_viewer/data_viewer_panel_base.hh |  39 ++-
 2 files changed, 194 insertions(+), 120 deletions(-)

diff --git a/modules/gui/src/data_viewer/data_viewer_panel_base.cc b/modules/gui/src/data_viewer/data_viewer_panel_base.cc
index 6405eb777..8663ab374 100644
--- a/modules/gui/src/data_viewer/data_viewer_panel_base.cc
+++ b/modules/gui/src/data_viewer/data_viewer_panel_base.cc
@@ -78,7 +78,14 @@ DataViewerPanelBase::DataViewerPanelBase(const Data& data,QWidget* parent):
   fast_low_mag_(true),
   fast_high_mag_(true),
   antialiasing_(true),
-  drag_start_()
+  drag_start_(),
+  phase_toggle_action_(),
+  invert_toggle_action_(),
+  show_click_pos_toggle_action_(),
+  fast_low_mag_toggle_action_(),
+  fast_high_mag_toggle_action_(),
+  display_pixel_toggle_action_(),
+  antialiasing_toggle_action_()
 {
   update_min_max();
   UpdateNormalizer(data_min_,data_max_,1.0,false);
@@ -92,32 +99,68 @@ DataViewerPanelBase::DataViewerPanelBase(const Data& data,QWidget* parent):
   setFocusPolicy(Qt::WheelFocus);
   //TODO cursors
   setCursor(cursor_);
-  /*
-  QMenu* m_zoom = new QMenu();
-  m_zoom->Append(ID_ZOOM_PLUS,QT("Zoom In"));
-  m_zoom->Append(ID_ZOOM_MINUS,QT("Zoom Out"));
-  m_zoom->AppendSeparator();
-  m_zoom->Append(ID_ZOOM_1,QT("Original Size"));
-
-  QMenu* m_slab = new QMenu();
-  m_slab->Append(ID_SLAB_PLUS,QT("Next Slab"));
-  m_slab->Append(ID_SLAB_MINUS,QT("Previous Slab"));
-  m_slab->AppendSeparator();
-  m_slab->Append(ID_SLAB_CENTER,QT("Center Slab"));
-  m_slab->Append(ID_SLAB_START,QT("First Slab"));
-  m_slab->Append(ID_SLAB_END,QT("Last Slab"));
-  
-  popupmenu_->Append(ID_NORMALIZE,QT("Normalize"));
-  popupmenu_->Append(ID_CENTER,QT("Center image"));
-  popupmenu_->AppendSeparator();
-  popupmenu_->Append(ID_ZOOM,QT("Zoom"),m_zoom);
-  popupmenu_->Append(ID_SLAB,QT("Slab"),m_slab);
-  popupmenu_->AppendSeparator();
-  popupmenu_->AppendCheckItem(ID_PHASECOLOR,QT("Phase Color Display"));
-  popupmenu_->AppendCheckItem(ID_INVERT,QT("Invert"));
-  popupmenu_->AppendCheckItem(ID_DISP_PIXEL_VAL,QT("Display pixel values"));
-  popupmenu_->AppendCheckItem(ID_SHOW_CLICK_POS,QT("Show last clicked point"));
-  */
+
+  QMenu* m_zoom = new QMenu("Zoom");
+  QAction* action=m_zoom->addAction("Zoom In");
+  connect(action, SIGNAL(triggered()), this, SLOT(zoom_plus()));
+  action=m_zoom->addAction("Zoom Out");
+  connect(action, SIGNAL(triggered()), this, SLOT(zoom_minus()));
+  m_zoom->addSeparator();
+  action=m_zoom->addAction("Original Size");
+  connect(action, SIGNAL(triggered()), this, SLOT(zoom_reset()));
+
+  QMenu* m_slab = new QMenu("Slab");
+  action=m_slab->addAction("Next Slab");
+  connect(action, SIGNAL(triggered()), this, SLOT(slab_plus()));
+  action=m_slab->addAction("Previous Slab");
+  connect(action, SIGNAL(triggered()), this, SLOT(slab_minus()));
+  m_slab->addSeparator();
+  action=m_slab->addAction("Center Slab");
+  connect(action, SIGNAL(triggered()), this, SLOT(slab_center()));
+  action=m_slab->addAction("First Slab");
+  connect(action, SIGNAL(triggered()), this, SLOT(slab_start()));
+  action=m_slab->addAction("Last Slab");
+  connect(action, SIGNAL(triggered()), this, SLOT(slab_end()));
+
+  action=popupmenu_->addAction("Normalize");
+  connect(action, SIGNAL(triggered()), this, SLOT(normalize()));
+  action=popupmenu_->addAction("Center image");
+  connect(action, SIGNAL(triggered()), this, SLOT(center()));
+  popupmenu_->addSeparator();
+  popupmenu_->addMenu(m_zoom);
+  popupmenu_->addMenu(m_slab);
+  popupmenu_->addSeparator();
+
+  phase_toggle_action_=popupmenu_->addAction("Phase Color Display");
+  phase_toggle_action_->setCheckable(true);
+  phase_toggle_action_->setChecked(false);
+  connect(phase_toggle_action_, SIGNAL(triggered()), this, SLOT(toggle_phase_color()));
+  invert_toggle_action_=popupmenu_->addAction("Invert");
+  invert_toggle_action_->setCheckable(true);
+  invert_toggle_action_->setChecked(false);
+  connect(invert_toggle_action_, SIGNAL(triggered()), this, SLOT(toggle_invert()));
+  display_pixel_toggle_action_=popupmenu_->addAction("Display pixel values");
+  display_pixel_toggle_action_->setCheckable(true);
+  display_pixel_toggle_action_->setChecked(true);
+  connect(display_pixel_toggle_action_, SIGNAL(triggered()), this, SLOT(toggle_display_pixels()));
+  show_click_pos_toggle_action_=popupmenu_->addAction("Show last clicked point");
+  show_click_pos_toggle_action_->setCheckable(true);
+  show_click_pos_toggle_action_->setChecked(false);
+  connect(show_click_pos_toggle_action_, SIGNAL(triggered()), this, SLOT(toggle_show_click_pos()));
+  popupmenu_->addSeparator();
+  fast_low_mag_toggle_action_=popupmenu_->addAction("Fast low magnification drawing");
+  fast_low_mag_toggle_action_->setCheckable(true);
+  fast_low_mag_toggle_action_->setChecked(true);
+  connect(fast_low_mag_toggle_action_, SIGNAL(triggered()), this, SLOT(toggle_fast_low_mag()));
+  fast_high_mag_toggle_action_=popupmenu_->addAction("Fast high magnification drawing");
+  fast_high_mag_toggle_action_->setCheckable(true);
+  fast_high_mag_toggle_action_->setChecked(true);
+  connect(fast_high_mag_toggle_action_, SIGNAL(triggered()), this, SLOT(toggle_fast_high_mag()));
+  antialiasing_toggle_action_=popupmenu_->addAction("Antialiasing");
+  antialiasing_toggle_action_->setCheckable(true);
+  antialiasing_toggle_action_->setChecked(false);
+  connect(antialiasing_toggle_action_, SIGNAL(triggered()), this, SLOT(toggle_antialiasing()));
+
   QPixmapCache::setCacheLimit(51200);
 
 }
@@ -150,83 +193,83 @@ ViewerNormalizerPtr DataViewerPanelBase::GetNormalizer() const
   return normalizer_;
 }
 
-#if 0
-void DataViewerPanelBase::OnMenu(QCommandEvent& e)
-{
-  switch(e.GetId()){
-  case ID_PHASECOLOR:
-    if(e.IsChecked()){
-      SetColorMode(RasterImage::PHASECOLOR);
-    }else{
-      SetColorMode(RasterImage::GREY);
-    }
-    break;
-  case ID_NORMALIZE:
-    Renormalize();
-    break;
-  case ID_CENTER:
-    Recenter();
-    break;
-  case ID_INVERT:
-    SetInvert(!GetInvert());
-    break;
-  case ID_DISP_PIXEL_VAL:
-    SetDisplayPixelValues(!display_pixel_values_);
-    break;
-  case ID_SHOW_CLICK_POS:
-    ShowClickedPosition(!show_clicked_position_);
-    break;
-  case ID_ZOOM_PLUS:
-    SetZoomScale(2.0*GetZoomScale());
-    break;
-  case ID_ZOOM_MINUS:
-    SetZoomScale(0.5*GetZoomScale());
-    break;
-  case ID_ZOOM_1:
-    SetZoomScale(1.0);
-    break;
-  case ID_SLAB_PLUS:
-    SetSlab(GetSlab()+1);
-    break;
-  case ID_SLAB_MINUS:
-    SetSlab(GetSlab()-1);
-    break;
-  case ID_SLAB_START:
-    SetSlab(GetObservedData().GetExtent().GetStart()[2]);
-    break;
-  case ID_SLAB_END:
-    SetSlab(GetObservedData().GetExtent().GetEnd()[2]);
-    break;
-  case ID_SLAB_CENTER:
-    SetSlab(static_cast<int>((GetObservedData().GetExtent().GetEnd()[2]
-                             -GetObservedData().GetExtent().GetStart()[2])/2.0));
-    break;
-  default:
-    e.Skip();
-    break;
+void DataViewerPanelBase::toggle_phase_color(){
+  if(GetColorMode()!=RasterImage::PHASECOLOR){
+    SetColorMode(RasterImage::PHASECOLOR);
+  }else{
+    SetColorMode(RasterImage::GREY);
   }
 }
-void DataViewerPanelBase::OnUpdateMenu(QUpdateUIEvent& e)
+void DataViewerPanelBase::normalize(){
+  Renormalize();
+}
+void DataViewerPanelBase::center(){
+  Recenter();
+}
+void DataViewerPanelBase::toggle_invert(){
+  SetInvert(!GetInvert());
+}
+void DataViewerPanelBase::toggle_display_pixels(){
+  SetDisplayPixelValues(!display_pixel_values_);
+}
+void DataViewerPanelBase::toggle_show_click_pos(){
+  ShowClickedPosition(!show_clicked_position_);
+}
+void DataViewerPanelBase::zoom_plus(){
+  SetZoomScale(2.0*GetZoomScale());
+}
+void DataViewerPanelBase::zoom_minus(){
+  SetZoomScale(0.5*GetZoomScale());
+}
+void DataViewerPanelBase::zoom_reset(){
+  SetZoomScale(1.0);
+}
+void DataViewerPanelBase::slab_plus(){
+  SetSlab(GetSlab()+1);
+}
+void DataViewerPanelBase::slab_minus(){
+  SetSlab(GetSlab()-1);
+}
+void DataViewerPanelBase::slab_start(){
+  SetSlab(GetObservedData().GetExtent().GetStart()[2]);
+}
+void DataViewerPanelBase::slab_end(){
+  SetSlab(GetObservedData().GetExtent().GetEnd()[2]);
+}
+void DataViewerPanelBase::slab_center(){
+  SetSlab(static_cast<int>((GetObservedData().GetExtent().GetEnd()[2]
+                           -GetObservedData().GetExtent().GetStart()[2])/2.0));
+}
+void DataViewerPanelBase::toggle_fast_low_mag(){
+  SetFastLowMagnificationDrawing(!GetFastLowMagnificationDrawing());
+}
+void DataViewerPanelBase::toggle_fast_high_mag(){
+  SetFastHighMagnificationDrawing(!GetFastHighMagnificationDrawing());
+}
+void DataViewerPanelBase::toggle_antialiasing(){
+  SetAntialiasing(!GetAntialiasing());
+}
+
+void DataViewerPanelBase::SetFastLowMagnificationDrawing(bool flag)
 {
-  switch(e.GetId()){
-  case ID_PHASECOLOR:
-    e.Check(GetColorMode()==RasterImage::PHASECOLOR);
-    break;
-  case ID_INVERT:
-    e.Check(GetInvert());
-    break;
-  case ID_DISP_PIXEL_VAL:
-    e.Check(display_pixel_values_);
-    break;
-  case ID_SHOW_CLICK_POS:
-    e.Check(show_clicked_position_);
-    break;
-  default:
-    e.Skip();
-    break;
-  }
+  fast_low_mag_=flag;
+  fast_low_mag_toggle_action_->setChecked(flag);
+  UpdateView();
+}
+bool DataViewerPanelBase::GetFastLowMagnificationDrawing()
+{
+  return fast_low_mag_;
+}
+void DataViewerPanelBase::SetFastHighMagnificationDrawing(bool flag)
+{
+  fast_high_mag_=flag;
+  fast_high_mag_toggle_action_->setChecked(flag);
+  UpdateView();
+}
+bool DataViewerPanelBase::GetFastHighMagnificationDrawing()
+{
+  return fast_high_mag_;
 }
-#endif
 
 void DataViewerPanelBase::Renormalize() 
 {
@@ -252,12 +295,6 @@ void DataViewerPanelBase::ObserverUpdate()
   update_min_max();
   UpdateNormalizer(data_min_,data_max_,normalizer_->GetGamma(),normalizer_->GetInvert());
   UpdateView(true);
-
-  /*
-  QCommandEvent ev=QCommandEvent(QEVT_VIEWER_DATA_CHANGE,GetId());
-  ev.SetEventObject(this);
-  AddPendingEvent(ev);
-  */
 }
 
 void DataViewerPanelBase::ObserverUpdate(const Extent& e)
@@ -347,11 +384,6 @@ void DataViewerPanelBase::ObserverUpdate(const Point& p)
 void DataViewerPanelBase::ObserverRelease()
 {
   emit released();
-  /*
-  QCommandEvent ev=QCommandEvent(QEVT_VIEWER_RELEASE,GetId());
-  ev.SetEventObject(this);
-  AddPendingEvent(ev);
-  */
 }
 
 void DataViewerPanelBase::resizeEvent(QResizeEvent* event)
@@ -433,6 +465,12 @@ void DataViewerPanelBase::paintEvent(QPaintEvent* event)
   if(zoom_level_<7) {
     draw_extent(painter);
   }
+  if(show_clicked_position_){
+    painter.setPen(QPen(QColor(0,255,0),1));
+    painter.setBrush(QBrush(Qt::NoBrush));
+    painter.drawLine(FracPointToWin(geom::Vec2(clicked_position_))-QPoint(4,0),FracPointToWin(geom::Vec2(clicked_position_))+QPoint(4,0));
+    painter.drawLine(FracPointToWin(geom::Vec2(clicked_position_))-QPoint(0,4),FracPointToWin(geom::Vec2(clicked_position_))+QPoint(0,4));
+  }
 }
 
 void DataViewerPanelBase::keyPressEvent(QKeyEvent * event)
@@ -479,7 +517,12 @@ void DataViewerPanelBase::mousePressEvent(QMouseEvent* event)
     rubberband_->hide();
     last_x_=event->x();
     last_y_=event->y();
+    geom::Vec3 old_position=clicked_position_;
     clicked_position_ = geom::Vec3(WinToFracPoint(QPoint(event->x(),event->y())));
+    if(show_clicked_position_){
+      update(QRect(FracPointToWin(geom::Vec2(old_position))-QPoint(4,4),FracPointToWin(geom::Vec2(old_position))+QPoint(4,4)));
+      update(QRect(FracPointToWin(geom::Vec2(clicked_position_))-QPoint(4,4),FracPointToWin(geom::Vec2(clicked_position_))+QPoint(4,4)));
+    }
     clicked_position_[2]=slab_;
     emit clicked(clicked_position_);
 
@@ -696,6 +739,7 @@ void DataViewerPanelBase::SetCursor(const QCursor& cursor)
 void DataViewerPanelBase::SetDisplayPixelValues(bool show)
 {
   display_pixel_values_ = show;
+  display_pixel_toggle_action_->setChecked(show);
   UpdateView(false);
 }
 
@@ -855,6 +899,7 @@ void DataViewerPanelBase::slab(int dz)
 void DataViewerPanelBase::SetColorMode(RasterImage::Mode m) 
 {
   cmode_=m;
+  phase_toggle_action_->setChecked(m==RasterImage::PHASECOLOR);
   UpdateView(true);
 }
 
@@ -872,7 +917,8 @@ ImageHandle DataViewerPanelBase::Extract(const Extent& e)
 void DataViewerPanelBase::ShowClickedPosition(bool show = true)
 {
   show_clicked_position_ = show;
-  UpdateView(false);
+  show_click_pos_toggle_action_->setChecked(show);
+  update(QRect(FracPointToWin(geom::Vec2(clicked_position_))-QPoint(4,4),FracPointToWin(geom::Vec2(clicked_position_))+QPoint(4,4)));
 }
 
 void DataViewerPanelBase::HideClickedPosition()
@@ -935,6 +981,7 @@ void DataViewerPanelBase::SetInvert(bool invert)
   UpdateNormalizer(normalizer_->GetMinimum(),
                    normalizer_->GetMaximum(),
                    normalizer_->GetGamma(),invert);
+  invert_toggle_action_->setChecked(invert);
   UpdateView(true);
 }
 
@@ -988,6 +1035,7 @@ void DataViewerPanelBase::SetOffset(const geom::Vec2& offset)
 void DataViewerPanelBase::SetAntialiasing(bool f)
 {
   antialiasing_=f;
+  antialiasing_toggle_action_->setChecked(f);
   update();
 }
 
@@ -1014,8 +1062,7 @@ void DataViewerPanelBase::draw_pixel_values(QPainter& painter)
   if(GetObservedData().GetType()==REAL){
     for(int i = 0; i <= (b[0] - a[0]); ++i) {
       for(int j = 0; j <= (b[1] - a[1]); ++j) {
-        Real pixel_value = GetObservedData().GetReal(Point(a[0]+i,
-                                                                 a[1]+j,slab_));
+        Real pixel_value = GetObservedData().GetReal(Point(a[0]+i,a[1]+j,slab_));
         QString value_string = QString("%1").arg(pixel_value,0,'g',5);
         Real rv = GetNormalizer()->Convert(pixel_value);
         QPoint p = FracPointToWinCenter(geom::Vec2(static_cast<Real>(a[0]+i),
diff --git a/modules/gui/src/data_viewer/data_viewer_panel_base.hh b/modules/gui/src/data_viewer/data_viewer_panel_base.hh
index 1727ea9a3..d6d125e46 100644
--- a/modules/gui/src/data_viewer/data_viewer_panel_base.hh
+++ b/modules/gui/src/data_viewer/data_viewer_panel_base.hh
@@ -71,8 +71,6 @@ public:
   virtual void mouseMoveEvent(QMouseEvent* event);
   virtual void keyPressEvent(QKeyEvent * event);
 
-  //void OnMenu(wxCommandEvent& e);
-  //void OnUpdateMenu(wxUpdateUIEvent& e);
 
   //////////////////////
   // observer interface
@@ -160,10 +158,10 @@ public:
   RasterImage::Mode GetColorMode(){return cmode_;};
 
   //! set/get fast drawing modes for low and high magnification
-  void SetFastLowMagnificationDrawing(bool flag){fast_low_mag_=flag;UpdateView();}  
-  bool GetFastLowMagnificationDrawing(){return fast_low_mag_;}
-  void SetFastHighMagnificationDrawing(bool flag){fast_high_mag_=flag;UpdateView();}  
-  bool GetFastHighMagnificationDrawing(){return fast_high_mag_;}
+  void SetFastLowMagnificationDrawing(bool flag);
+  bool GetFastLowMagnificationDrawing();
+  void SetFastHighMagnificationDrawing(bool flag);
+  bool GetFastHighMagnificationDrawing();
 
   geom::Vec2 GetMousePosition(){return mouseposition_;};
   void MoveTo(const geom::Vec2& p);
@@ -206,6 +204,27 @@ signals:
 protected:
   QMenu* popupmenu_;
 
+protected slots:
+  // slots for popup menu
+  void toggle_phase_color();
+  void normalize();
+  void center();
+  void toggle_invert();
+  void toggle_display_pixels();
+  void toggle_show_click_pos();
+  void zoom_plus();
+  void zoom_minus();
+  void zoom_reset();
+  void slab_plus();
+  void slab_minus();
+  void slab_start();
+  void slab_end();
+  void slab_center();
+  void toggle_fast_low_mag();
+  void toggle_fast_high_mag();
+  void toggle_antialiasing();
+
+
 private:
   Real data_min_;
   Real data_max_;
@@ -246,6 +265,14 @@ private:
 
   bool antialiasing_;
   Point drag_start_;
+  QAction* phase_toggle_action_;
+  QAction* invert_toggle_action_;
+  QAction* show_click_pos_toggle_action_;
+  QAction* fast_low_mag_toggle_action_;
+  QAction* fast_high_mag_toggle_action_;
+  QAction* display_pixel_toggle_action_;
+  QAction* antialiasing_toggle_action_;
+
 
   void move(int dx, int dy);
   void slab(int dz);
-- 
GitLab