]> Creatis software - bbtk.git/blob - samples/SampleOutputObserver/bbtkSampleOutputObserver.cxx
no message
[bbtk.git] / samples / SampleOutputObserver / bbtkSampleOutputObserver.cxx
1 #include <bbwxSlider.h>
2 #include <bbwxLayoutLine.h>
3
4 //=========================================================================
5 // Illustrates the Output Observer mechanism
6 //=========================================================================
7
8 //=========================================================================
9 // FIRST EXAMPLE USING A FUNCTION AS CALLBACK
10 void CallbackFunction ( bbtk::BlackBox::Pointer p,  // The black box which changed 
11                         const std::string& o, // The output which changed
12                         bbtk::IOStatus s) // The new status of the output
13 {
14   std::cout << "== Callback function called with p="<<p->bbGetName()
15             <<" o="<<o<<" s="<<s/*bbtk::GetIOStatusString(s)*/<<std::endl;
16
17   // Cast the black box pointer into Slider pointer
18   bbwx::Slider::Pointer slider = boost::dynamic_pointer_cast<bbwx::Slider>(p);
19   if (slider)
20     {
21       std::cout << "* Current slider value = "<<slider->bbGetOutputOut()
22                 <<std::endl;
23     }
24 }
25 //=========================================================================
26
27 //=========================================================================
28 void SliderCallback()
29 {
30   std::cout << "============== Callback function called when slider is released" 
31             << std::endl;
32    try
33     {
34       bbwx::Slider::Pointer slider = bbwx::Slider::New("slider");
35       slider->bbSetInputWinDialog(true);  // mandatory
36       // Add the observer 
37       slider->bbAddOutputObserver( "Out", &CallbackFunction );
38       slider->bbExecute();
39     }
40   catch (bbtk::Exception e)
41     {
42       e.Print();
43     } 
44 }
45 //=========================================================================
46
47
48 //=========================================================================
49 // SECOND EXAMPLE : MEMBER METHOD CALLED WHEN SLIDER IS RELEASED
50 class ClassWithTwoSliders
51 {
52 public:
53   // Ctor
54   ClassWithTwoSliders();
55   // Callback
56   void OnSlider( bbtk::BlackBox::Pointer p, 
57                  const std::string& o, 
58                  bbtk::IOStatus s );
59 private:
60   bbwx::Slider::Pointer mSlider1;
61   bbwx::Slider::Pointer mSlider2;
62 bbwx::LayoutLine::Pointer mLayout;
63 };
64 //=========================================================================
65
66 //=========================================================================
67 ClassWithTwoSliders::ClassWithTwoSliders()
68 {
69   std::cout << "============== Callback member called when first slider is released or second slider moves" 
70             << std::endl;
71   try
72     {
73       mSlider1 = bbwx::Slider::New("slider1");
74       // Add the observer method
75       // As it is not a FREEHAND function we must use the macro 
76       // BBTK_MAKE_OUTPUT_OBSERVER which takes the object and the method to call
77       mSlider1->bbAddOutputObserver("Out", 
78                                     BBTK_MAKE_OUTPUT_OBSERVER
79                                     (this,
80                                      &ClassWithTwoSliders::OnSlider ));
81       
82       mSlider2 = bbwx::Slider::New("slider2");
83       mSlider2->bbSetInputReactiveOnTrack(true);
84       mSlider2->bbAddOutputObserver("Out", 
85                                     BBTK_MAKE_OUTPUT_OBSERVER
86                                     (this,
87                                      &ClassWithTwoSliders::OnSlider ));
88       
89       mLayout = bbwx::LayoutLine::New("layout");
90       mLayout->bbSetInputWinDialog(true);  // mandatory
91       
92       bbtk::Connection::Pointer c1 = bbtk::Connection::New( mSlider1, 
93                                                             "Widget", 
94                                                             mLayout, 
95                                                             "Widget1");
96       bbtk::Connection::Pointer c2 = bbtk::Connection::New( mSlider2, 
97                                                             "Widget", 
98                                                             mLayout, 
99                                                             "Widget2");
100       
101       mLayout->bbExecute();
102     }
103   catch (bbtk::Exception e)
104     {
105       e.Print();
106     }   
107 }
108 //=========================================================================
109
110 //=========================================================================
111 void ClassWithTwoSliders::OnSlider( bbtk::BlackBox::Pointer p, 
112                                     const std::string& o, 
113                                     bbtk::IOStatus s )
114 {
115   std::cout << "== 'OnSlider' called with p="<<p->bbGetName()
116             <<" o="<<o<<" s="<<s/*bbtk::GetIOStatusString(s)*/<<std::endl;
117   
118   if ((p==mSlider1) && (o=="Out"))
119     {
120       std::cout << "* First slider released. New value = "
121                 <<mSlider1->bbGetOutputOut()<<std::endl;
122     }                                                  
123   else if ((p==mSlider2) && (o=="Out"))
124     {
125       std::cout << "* Second slider moved. New value = "
126                 <<mSlider2->bbGetOutputOut()<<std::endl;
127     }
128 }
129 //=========================================================================
130
131 //=========================================================================
132 int main(int argv, char* argc[])
133 {
134  // To track all ...
135         bbtk::MessageManager::SetMessageLevel("all",9);
136   SliderCallback();
137   ClassWithTwoSliders C;
138 }
139 //=========================================================================