1cc24f87f01e51268f78220417ebe33f7a317553
[platform/core/uifw/dali-demo.git] / examples / canvas-view / canvas-view-example.cpp
1 /*
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include <dali-toolkit/dali-toolkit.h>
19 #include <dali-toolkit/devel-api/controls/canvas-view/canvas-view.h>
20 #include <dali/devel-api/adaptor-framework/canvas-renderer-drawable-group.h>
21 #include <dali/devel-api/adaptor-framework/canvas-renderer-shape.h>
22
23 using namespace Dali;
24
25 /**
26  * @brief This demonstrates how to display and control vector primitives using CanvasView.
27  *
28  * - It displays various types of shapes. Rectangle, circle, path, etc.
29  * - Each shape can be set to fill color, stroke color, width, etc
30  *   and can change the transfomation(rotate, scale, translate)
31  */
32 class CanvasViewController : public ConnectionTracker
33 {
34 public:
35   /**
36    * @brief Constructor.
37    * @param[in]  application  A reference to the Application class
38    */
39   CanvasViewController(Application& application)
40   : mApplication(application),
41     mRoundedRect(),
42     mArc(),
43     mStar(),
44     mTimer(),
45     mCount(0)
46   {
47     // Connect to the Application's Init signal
48     mApplication.InitSignal().Connect(this, &CanvasViewController::Create);
49   }
50
51   ~CanvasViewController() = default;
52
53   void Create(Application& application)
54   {
55     // The Init signal is received once (only) during the Application lifetime
56     Window  window     = application.GetWindow();
57     Vector2 windowSize = window.GetSize();
58     window.KeyEventSignal().Connect(this, &CanvasViewController::OnKeyEvent);
59
60     Toolkit::CanvasView mCanvasView = Toolkit::CanvasView::New(windowSize);
61     mCanvasView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
62     mCanvasView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
63     mCanvasView.SetProperty(Actor::Property::SIZE, windowSize);
64
65     Dali::CanvasRenderer::Shape canvasBackground = Dali::CanvasRenderer::Shape::New();
66     canvasBackground.AddRect(Rect<float>(0.0f, 0.0f, windowSize.width, windowSize.height), Vector2::ZERO);
67     canvasBackground.SetFillColor(Vector4(1.0f, 1.0f, 1.0f, 1.0f));
68     mCanvasView.AddDrawable(canvasBackground);
69
70     Dali::CanvasRenderer::Shape shape1 = Dali::CanvasRenderer::Shape::New();
71     shape1.AddRect(Rect<float>(-50.0f, -50.0f, 100.0f, 100.0f), Vector2::ZERO);
72     shape1.SetFillColor(Vector4(0.0f, 0.5f, 0.0f, 0.5f));
73     shape1.SetStrokeColor(Vector4(0.5f, 0.0f, 0.0f, 0.5f));
74     shape1.SetStrokeWidth(10.0f);
75     shape1.Scale(1.2f);
76     shape1.Rotate(Degree(45.0f));
77     shape1.Translate(Vector2(100.0f, 100.0f));
78
79     mRoundedRect = Dali::CanvasRenderer::Shape::New();
80     mRoundedRect.AddRect(Rect<float>(10.0f, 350.0f, 200.0f, 140.0f), Vector2(40.0f, 40.0f));
81     mRoundedRect.SetFillColor(Vector4(0.0f, 0.0f, 1.0f, 1.0f));
82     mRoundedRect.SetOpacity(0.5f);
83     mRoundedRect.SetStrokeColor(Vector4(1.0f, 1.0f, 0.0f, 1.0f));
84     mRoundedRect.SetStrokeWidth(10.0f);
85     mRoundedRect.SetStrokeJoin(Dali::CanvasRenderer::Shape::StrokeJoin::MITER);
86     Dali::Vector<float> dashPattern;
87     dashPattern.PushBack(15.0f);
88     dashPattern.PushBack(30.0f);
89     mRoundedRect.SetStrokeDash(dashPattern);
90
91     Dali::CanvasRenderer::Shape shape2 = Dali::CanvasRenderer::Shape::New();
92     shape2.AddMoveTo(Vector2(535.0f, 135.0f));
93     shape2.AddLineTo(Vector2(660.0f, 455.0f));
94     shape2.AddLineTo(Vector2(355.0f, 250.0f));
95     shape2.AddLineTo(Vector2(715.0f, 250.0f));
96     shape2.AddLineTo(Vector2(410.0f, 455.0f));
97     shape2.Close();
98     shape2.SetFillRule(Dali::CanvasRenderer::Shape::FillRule::EVEN_ODD);
99     shape2.SetFillColor(Vector4(1.0f, 0.0f, 0.0f, 1.0f));
100     shape2.SetOpacity(0.5f);
101     shape2.SetStrokeColor(Vector4(1.0f, 0.0f, 1.0f, 1.0f));
102     shape2.SetStrokeWidth(20.0f);
103     shape2.SetStrokeJoin(Dali::CanvasRenderer::Shape::StrokeJoin::ROUND);
104     shape2.Transform(Matrix3(0.6f, 0.0f, 20.0f, 0.0f, 0.6f, -50.0f, 0.0f, 0.0f, 1.0f));
105
106     mArc = Dali::CanvasRenderer::Shape::New();
107     mArc.AddArc(Vector2(100.0f, 650.0f), 80.0f, 10.0f, 0.0f, true);
108     mArc.AddArc(Vector2(100.0f, 650.0f), 80.0f, 10.0f, 0.0f, true);
109     mArc.SetOpacity(0.5f);
110     mArc.SetStrokeColor(Vector4(0.0f, 1.0f, 0.0f, 1.0f));
111     mArc.SetStrokeWidth(10.0f);
112     mArc.SetStrokeCap(Dali::CanvasRenderer::Shape::StrokeCap::ROUND);
113     mCanvasView.AddDrawable(mArc);
114
115     mStar = Dali::CanvasRenderer::Shape::New();
116     mStar.AddMoveTo(Vector2(-1.0f, -165.0f));
117     mStar.AddLineTo(Vector2(53.0f, -56.0f));
118     mStar.AddLineTo(Vector2(174.0f, -39.0f));
119     mStar.AddLineTo(Vector2(87.0f, 45.0f));
120     mStar.AddLineTo(Vector2(107.0f, 166.0f));
121     mStar.AddLineTo(Vector2(-1.0f, 110.0f));
122     mStar.AddLineTo(Vector2(-103.0f, 166.0f));
123     mStar.AddLineTo(Vector2(-88.0f, 46.0f));
124     mStar.AddLineTo(Vector2(-174.0f, -38.0f));
125     mStar.AddLineTo(Vector2(-54.0f, -56.0f));
126
127     mStar.Close();
128
129     mStar.SetFillColor(Vector4(0.0f, 1.0f, 1.0f, 1.0f));
130     mStar.SetStrokeColor(Vector4(0.5f, 1.0f, 0.5f, 1.0f));
131     mStar.SetStrokeWidth(30.0f);
132     mStar.SetStrokeCap(Dali::CanvasRenderer::Shape::StrokeCap::ROUND);
133     mStar.Scale(0.6f);
134     mStar.Translate(Vector2(350.0f, 450.0f));
135     mStar.SetOpacity(0.5f);
136
137     mCanvasView.AddDrawable(mStar);
138
139     mGroup1 = Dali::CanvasRenderer::DrawableGroup::New();
140
141     mGroup1.AddDrawable(mRoundedRect);
142     mGroup1.AddDrawable(shape1);
143
144     mGroup2 = Dali::CanvasRenderer::DrawableGroup::New();
145
146     mGroup2.AddDrawable(mGroup1);
147     mGroup2.AddDrawable(shape2);
148
149     mCanvasView.AddDrawable(mGroup2);
150
151     mTimer = Timer::New(1000.0f / 32.0f);
152     mTimer.TickSignal().Connect(this, &CanvasViewController::tick);
153     mTimer.Start();
154
155     window.Add(mCanvasView);
156   }
157
158   /**
159    * @brief Called when set time.
160    *
161    * Change transformation every call to make it look like vector animation.
162    */
163   bool tick()
164   {
165     mRoundedRect.ResetPath();
166     mRoundedRect.AddRect(Rect<float>(10.0f, 350.0f, 200.0f, 140.0f), Vector2(float(mCount % 80), float(mCount % 80)));
167
168     mArc.ResetPath();
169     mArc.AddArc(Vector2(100.0f, 650.0f), 80.0f, 10.0f, float(mCount % 180), true);
170     mArc.AddArc(Vector2(100.0f, 650.0f), 80.0f, 10.0f + float(mCount % 180), float(mCount % 180) / 2.0f, true);
171
172     mStar.Rotate(Degree(mCount * 2.0f));
173     mStar.Scale(float(mCount % 100) * 0.01f + 0.6f);
174
175     mGroup1.Scale(float(mCount % 50) * 0.005f + 0.8f);
176
177     mGroup2.SetOpacity(1.0f - float(mCount % 50) * 0.015f);
178
179     mCount++;
180     return true;
181   }
182
183   /**
184    * @brief Called when any key event is received.
185    *
186    * Will use this to quit the application if Back or the Escape key is received
187    * @param[in] event The key event information
188    */
189   void OnKeyEvent(const KeyEvent& event)
190   {
191     if(event.GetState() == KeyEvent::DOWN)
192     {
193       if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK))
194       {
195         mApplication.Quit();
196       }
197     }
198   }
199
200 private:
201   Application&                        mApplication;
202   Dali::CanvasRenderer::Shape         mRoundedRect;
203   Dali::CanvasRenderer::Shape         mArc;
204   Dali::CanvasRenderer::Shape         mStar;
205   Dali::CanvasRenderer::DrawableGroup mGroup1;
206   Dali::CanvasRenderer::DrawableGroup mGroup2;
207   Timer                               mTimer;
208   int                                 mCount;
209 };
210
211 int DALI_EXPORT_API main(int argc, char** argv)
212 {
213   Application          application = Application::New(&argc, &argv);
214   CanvasViewController test(application);
215   application.MainLoop();
216   return 0;
217 }