]> Creatis software - bbtk.git/blobdiff - samples/SampleOutputObserver/bbtkSampleOutputObserver.cxx
*** empty log message ***
[bbtk.git] / samples / SampleOutputObserver / bbtkSampleOutputObserver.cxx
diff --git a/samples/SampleOutputObserver/bbtkSampleOutputObserver.cxx b/samples/SampleOutputObserver/bbtkSampleOutputObserver.cxx
new file mode 100644 (file)
index 0000000..67c4075
--- /dev/null
@@ -0,0 +1,131 @@
+#include <bbwxSlider.h>
+#include <bbwxLayoutLine.h>
+
+//=========================================================================
+// Illustrates the Output Observer mechanism
+//=========================================================================
+
+//=========================================================================
+void CallbackFunction ( bbtk::BlackBox::Pointer p, 
+                       const std::string& o, 
+                       bbtk::IOStatus s)
+{
+  std::cout << "== Callback function called with p="<<p->bbGetName()
+           <<" o="<<o<<" s="<<bbtk::GetIOStatusString(s)<<std::endl;
+  bbwx::Slider::Pointer slider = boost::dynamic_pointer_cast<bbwx::Slider>(p);
+  if (slider)
+    {
+      std::cout << "* Current slider value = "<<slider->bbGetOutputOut()
+               <<std::endl;
+    }
+}
+//=========================================================================
+
+//=========================================================================
+void SliderCallback()
+{
+  std::cout << "============== Callback function called when slider is released" 
+           << std::endl;
+   try
+    {
+      bbwx::Slider::Pointer slider = bbwx::Slider::New("slider");
+      slider->bbSetInputWinDialog(true);  // mandatory
+      slider->bbAddOutputObserver( "Out", &CallbackFunction );
+      slider->bbExecute();
+    }
+  catch (bbtk::Exception e)
+    {
+      e.Print();
+    } 
+}
+//=========================================================================
+
+
+//=========================================================================
+class ClassWithTwoSliders
+{
+public:
+  // Ctor
+  ClassWithTwoSliders();
+  // Callback
+  void OnSlider( bbtk::BlackBox::Pointer p, 
+                const std::string& o, 
+                bbtk::IOStatus s );
+private:
+  bbwx::Slider::Pointer mSlider1;
+  bbwx::Slider::Pointer mSlider2;
+bbwx::LayoutLine::Pointer mLayout;
+};
+//=========================================================================
+
+//=========================================================================
+ClassWithTwoSliders::ClassWithTwoSliders()
+{
+  std::cout << "============== Callback member called when first slider is released or second slider moves" 
+           << std::endl;
+  try
+    {
+      mSlider1 = bbwx::Slider::New("slider1");
+      mSlider1->bbAddOutputObserver("Out", 
+                                   BBTK_MAKE_OUTPUT_OBSERVER
+                                   (this,
+                                    &ClassWithTwoSliders::OnSlider ));
+      
+      mSlider2 = bbwx::Slider::New("slider2");
+      mSlider2->bbSetInputReactiveOnTrack(true);
+      mSlider2->bbAddOutputObserver("Out", 
+                                   BBTK_MAKE_OUTPUT_OBSERVER
+                                   (this,
+                                    &ClassWithTwoSliders::OnSlider ));
+      
+      mLayout = bbwx::LayoutLine::New("layout");
+      mLayout->bbSetInputWinDialog(true);  // mandatory
+      
+      bbtk::Connection::Pointer c1 = bbtk::Connection::New( mSlider1, 
+                                                           "Widget", 
+                                                           mLayout, 
+                                                           "Widget1");
+      bbtk::Connection::Pointer c2 = bbtk::Connection::New( mSlider2, 
+                                                           "Widget", 
+                                                           mLayout, 
+                                                           "Widget2");
+      
+      mLayout->bbExecute();
+    }
+  catch (bbtk::Exception e)
+    {
+      e.Print();
+    }   
+}
+//=========================================================================
+
+//=========================================================================
+void ClassWithTwoSliders::OnSlider( bbtk::BlackBox::Pointer p, 
+                                   const std::string& o, 
+                                   bbtk::IOStatus s )
+{
+  std::cout << "== 'OnSlider' called with p="<<p->bbGetName()
+           <<" o="<<o<<" s="<<bbtk::GetIOStatusString(s)<<std::endl;
+  
+  if ((p==mSlider1) && (o=="Out"))
+    {
+      std::cout << "* First slider released. New value = "
+               <<mSlider1->bbGetOutputOut()<<std::endl;
+    }                                                 
+  else if ((p==mSlider2) && (o=="Out"))
+    {
+      std::cout << "* Second slider moved. New value = "
+               <<mSlider2->bbGetOutputOut()<<std::endl;
+    }
+}
+//=========================================================================
+
+//=========================================================================
+int main(int argv, char* argc[])
+{
+ // To track all ...
+  //  bbtk::MessageManager::SetMessageLevel("all",9);
+  SliderCallback();
+  ClassWithTwoSliders C;
+}
+//=========================================================================