7140614d2dcc6d566d8ecccfa6044cd9d6d266f7
[platform/core/uifw/dali-demo.git] / examples / text-overlap / text-overlap-example.cpp
1
2 #include <dali-toolkit/dali-toolkit.h>
3 #include <dali/devel-api/actors/actor-devel.h>
4 #include "text-overlap-example.h"
5
6 #include <iostream>
7
8 using namespace Dali;
9 using namespace Dali::Toolkit;
10
11 static const int NUMBER_OF_LABELS(2);
12
13
14
15 namespace Demo
16 {
17
18 TextOverlapController::TextOverlapController( Application& app )
19 : mApplication( app ),
20   mTopmostLabel( 1 )
21 {
22   app.InitSignal().Connect( this, &TextOverlapController::Create );
23   app.TerminateSignal().Connect( this, &TextOverlapController::Destroy );
24 }
25
26 void TextOverlapController::Create( Application& app )
27 {
28   Stage stage = Stage::GetCurrent();
29   stage.KeyEventSignal().Connect( this, &TextOverlapController::OnKeyEvent );
30
31   Vector2 stageSize = stage.GetSize();
32
33   mLabels[0] = TextLabel::New("Text Label 1");
34   mLabels[1] = TextLabel::New("Text Label 2");
35
36   mLabels[0].SetProperty( Dali::Actor::Property::NAME,"Label1");
37   mLabels[1].SetProperty( Dali::Actor::Property::NAME,"Label2");
38
39   mLabels[0].SetProperty( DevelActor::Property::SIBLING_ORDER, 1 );
40   mLabels[1].SetProperty( DevelActor::Property::SIBLING_ORDER, 2 );
41
42   mLabels[0].SetProperty( Control::Property::BACKGROUND, Color::RED );
43   mLabels[1].SetProperty( Control::Property::BACKGROUND, Color::YELLOW );
44
45   for(int i=0; i<NUMBER_OF_LABELS; ++i )
46   {
47     mLabels[i].SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
48     mLabels[i].SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
49     mLabels[i].SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
50     mLabels[i].SetPosition( 0, (i*2+1) * stageSize.height * 0.25f );
51   }
52
53   stage.Add( mLabels[0] );
54   stage.Add( mLabels[1] );
55
56   mSwapButton = PushButton::New();
57   mSwapButton.SetProperty( Button::Property::LABEL, "Swap depth order");
58   mSwapButton.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::BOTTOM_CENTER );
59   mSwapButton.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_CENTER );
60   mSwapButton.ClickedSignal().Connect( this, &TextOverlapController::OnClicked );
61   mSwapButton.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH );
62   mSwapButton.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT );
63   stage.Add( mSwapButton );
64
65
66   Layer rootLayer = stage.GetRootLayer();
67   rootLayer.SetProperty( Dali::Actor::Property::NAME,"RootLayer");
68
69   mPanDetector = PanGestureDetector::New();
70   mPanDetector.Attach( rootLayer );
71   mPanDetector.AddAngle( Radian(-0.5f * Math::PI ));
72   mPanDetector.AddAngle( Radian( 0.5f * Math::PI ));
73   mPanDetector.DetectedSignal().Connect( this, &TextOverlapController::OnPan );
74 }
75
76 void TextOverlapController::OnPan( Actor actor, const PanGesture& gesture )
77 {
78   if( ! mGrabbedActor || gesture.state == PanGesture::Started )
79   {
80     for( int i=0; i<NUMBER_OF_LABELS; ++i )
81     {
82       Vector3 position = mLabels[i].GetCurrentProperty< Vector3 >( Actor::Property::POSITION );
83       Vector3 size = mLabels[i].GetCurrentProperty< Vector3 >( Actor::Property::SIZE );
84       if( gesture.position.y > position.y - size.y * 0.5f &&
85           gesture.position.y <= position.y + size.y * 0.5f )
86       {
87         mGrabbedActor = mLabels[i];
88         break;
89       }
90     }
91   }
92   else if( mGrabbedActor && gesture.state == PanGesture::Continuing )
93   {
94     Vector2 stageSize = Stage::GetCurrent().GetSize();
95     Vector3 size = mGrabbedActor.GetCurrentProperty< Vector3 >( Actor::Property::SIZE );
96     float y = Clamp( gesture.position.y, size.y * 0.5f, stageSize.y - size.y*0.5f );
97     mGrabbedActor.SetPosition( 0, y );
98   }
99   else
100   {
101     mGrabbedActor.Reset();
102   }
103 }
104
105 void TextOverlapController::Destroy( Application& app )
106 {
107   mPanDetector.DetachAll();
108   UnparentAndReset(mLabels[0]);
109   UnparentAndReset(mLabels[1]);
110   mGrabbedActor.Reset();
111 }
112
113 bool TextOverlapController::OnClicked( Button button )
114 {
115   mTopmostLabel = 1-mTopmostLabel; // toggles between 0 and 1
116   mLabels[mTopmostLabel].RaiseToTop();
117   return false;
118 }
119
120
121 void TextOverlapController::OnKeyEvent( const KeyEvent& keyEvent )
122 {
123   if( keyEvent.state == KeyEvent::Down &&
124       ( IsKey( keyEvent, DALI_KEY_BACK ) ||
125         IsKey( keyEvent, DALI_KEY_ESCAPE ) ) )
126   {
127     mApplication.Quit();
128   }
129   else
130   {
131     Dali::Layer l = Dali::Stage::GetCurrent().GetRootLayer();
132     int so = l.GetProperty<int>(Dali::DevelActor::Property::SIBLING_ORDER);
133     l.SetProperty(Dali::DevelActor::Property::SIBLING_ORDER, so+1);
134   }
135 }
136
137
138 } // namespace Demo
139
140 int DALI_EXPORT_API main( int argc, char** argv )
141 {
142   {
143     Application app = Application::New( &argc, &argv );
144     Demo::TextOverlapController controller( app );
145     app.MainLoop();
146   }
147   exit( 0 );
148 }