+#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;
+}
+//=========================================================================