Updated demos to use DALi clang-format
[platform/core/uifw/dali-demo.git] / examples / progress-bar / progress-bar-example.cpp
1 /*
2  * Copyright (c) 2020 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/progress-bar/progress-bar-devel.h>
20 #include <dali-toolkit/devel-api/controls/table-view/table-view.h>
21 #include "shared/view.h"
22
23 using namespace Dali;
24 using namespace Dali::Toolkit;
25 using Dali::Toolkit::ProgressBar;
26
27 namespace
28 {
29 const char* const THEME_PATH(DEMO_STYLE_DIR "progress-bar-example-theme.json"); ///< The theme used for this example
30 const char* const BACKGROUND_IMAGE = DEMO_IMAGE_DIR "background-gradient.jpg";
31 const char* const TOOLBAR_IMAGE    = DEMO_IMAGE_DIR "top-bar.png";
32 const char* const TOOLBAR_TITLE    = "Progress Bar";
33
34 const Vector4 BACKGROUND_COLOUR(1.0f, 1.0f, 1.0f, 0.15f);
35
36 // Layout sizes
37 const int MARGIN_SIZE                = 10;
38 const int TOP_MARGIN                 = 85;
39 const int CIRCULAR_PROGRESS_BAR_SIZE = 64;
40
41 const unsigned int TIMER_TIMEOUT_TIME       = 50;
42 const float        PROGRESS_INCREMENT_VALUE = 0.01f;
43
44 } // namespace
45
46 /**
47  * @brief Shows how to create a default progress bar and custom styled progress bars.
48  */
49 class ProgressBarExample : public ConnectionTracker
50 {
51 public:
52   ProgressBarExample(Application& application)
53   : mApplication(application)
54   {
55     // Connect to the Application's Init signal
56     mProgressValue          = 0.0f;
57     mSecondaryProgressValue = 0.1f;
58     isDefaultTheme          = true;
59     mApplication.InitSignal().Connect(this, &ProgressBarExample::Create);
60   }
61
62 private:
63   void Create(Application& application)
64   {
65     // The Init signal is received once (only) during the Application lifetime
66
67     // Respond to key events
68     application.GetWindow().KeyEventSignal().Connect(this, &ProgressBarExample::OnKeyEvent);
69
70     // Creates a default view with a default tool bar.
71     // The view is added to the window.
72
73     mContentLayer = DemoHelper::CreateView(application,
74                                            mView,
75                                            mToolBar,
76                                            BACKGROUND_IMAGE,
77                                            TOOLBAR_IMAGE,
78                                            TOOLBAR_TITLE);
79
80     mProgressBarDefault = ProgressBar::New();
81     mProgressBarDefault.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER);
82     mProgressBarDefault.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER);
83     mProgressBarDefault.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
84     mProgressBarDefault.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT);
85     mProgressBarDefault.ValueChangedSignal().Connect(this, &ProgressBarExample::OnValueChanged);
86
87     // Creates a progress bar in circular style
88     mProgressBarCircular = DevelProgressBar::New(DevelProgressBar::Style::CIRCULAR);
89     mProgressBarCircular.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER);
90     mProgressBarCircular.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER);
91     mProgressBarCircular.SetProperty(Actor::Property::SIZE, Vector2(CIRCULAR_PROGRESS_BAR_SIZE, CIRCULAR_PROGRESS_BAR_SIZE));
92
93     Toolkit::TableView contentTable = Toolkit::TableView::New(2, 1);
94     contentTable.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
95     contentTable.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT);
96     contentTable.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
97     contentTable.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
98     contentTable.SetCellPadding(Size(MARGIN_SIZE, MARGIN_SIZE * 0.5f));
99
100     for(unsigned int i = 0; i < contentTable.GetRows(); ++i)
101     {
102       contentTable.SetFitHeight(i);
103     }
104
105     contentTable.SetProperty(Actor::Property::POSITION, Vector2(0.0f, TOP_MARGIN));
106     mContentLayer.Add(contentTable);
107
108     // Image selector for progress bar
109     Toolkit::TableView progressBackground = Toolkit::TableView::New(2, 1);
110     progressBackground.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
111     progressBackground.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT);
112     progressBackground.SetBackgroundColor(BACKGROUND_COLOUR);
113     progressBackground.SetCellPadding(Size(MARGIN_SIZE, MARGIN_SIZE));
114     progressBackground.SetRelativeWidth(0, 1.0f);
115
116     for(unsigned int i = 0; i < progressBackground.GetRows(); ++i)
117     {
118       progressBackground.SetFitHeight(i);
119     }
120
121     contentTable.Add(progressBackground);
122     progressBackground.Add(mProgressBarDefault);
123     progressBackground.Add(mProgressBarCircular);
124
125     // Create buttons
126     Toolkit::TableView buttonBackground = Toolkit::TableView::New(3, 1);
127     buttonBackground.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
128     buttonBackground.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT);
129     buttonBackground.SetBackgroundColor(BACKGROUND_COLOUR);
130     buttonBackground.SetCellPadding(Size(MARGIN_SIZE, MARGIN_SIZE));
131
132     for(unsigned int i = 0; i < buttonBackground.GetRows(); ++i)
133     {
134       buttonBackground.SetFitHeight(i);
135     }
136
137     contentTable.Add(buttonBackground);
138
139     mResetProgressButton = Toolkit::PushButton::New();
140     mResetProgressButton.SetProperty(Toolkit::Button::Property::LABEL, "Reset");
141     mResetProgressButton.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
142     mResetProgressButton.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT);
143     mResetProgressButton.ClickedSignal().Connect(this, &ProgressBarExample::OnResetProgressButtonSelected);
144
145     buttonBackground.Add(mResetProgressButton);
146
147     mSetIndeterminateButton = Toolkit::PushButton::New();
148     mSetIndeterminateButton.SetProperty(Toolkit::Button::Property::LABEL, "Toggle Indeterminate");
149     mSetIndeterminateButton.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
150     mSetIndeterminateButton.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT);
151     mSetIndeterminateButton.ClickedSignal().Connect(this, &ProgressBarExample::OnSetIndeterminateButtonSelected);
152
153     buttonBackground.Add(mSetIndeterminateButton);
154
155     mChangeThemeButton = Toolkit::PushButton::New();
156     mChangeThemeButton.SetProperty(Toolkit::Button::Property::LABEL, "Change Theme");
157     mChangeThemeButton.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
158     mChangeThemeButton.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT);
159     mChangeThemeButton.ClickedSignal().Connect(this, &ProgressBarExample::OnChangeThemeButtonSelected);
160
161     buttonBackground.Add(mChangeThemeButton);
162
163     // Create a timer to update the progress of all progress bars
164     mTimer = Timer::New(TIMER_TIMEOUT_TIME);
165     mTimer.TickSignal().Connect(this, &ProgressBarExample::OnTimerTick);
166     mTimer.Start();
167   }
168
169   bool OnTimerTick()
170   {
171     mProgressValue += PROGRESS_INCREMENT_VALUE;
172     mSecondaryProgressValue = mProgressValue + 0.1f;
173     mProgressBarDefault.SetProperty(ProgressBar::Property::PROGRESS_VALUE, mProgressValue);
174     mProgressBarDefault.SetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VALUE, mSecondaryProgressValue);
175     mProgressBarCircular.SetProperty(ProgressBar::Property::PROGRESS_VALUE, mProgressValue);
176     mProgressBarCircular.SetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VALUE, mSecondaryProgressValue);
177
178     return (mProgressValue < 1.0f); // Only call again if progress has NOT got to the end
179   }
180
181   bool OnResetProgressButtonSelected(Toolkit::Button button)
182   {
183     mProgressValue          = 0.0f;
184     mSecondaryProgressValue = 0.1f;
185     mProgressBarDefault.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 0.0f);
186     mProgressBarDefault.SetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VALUE, 0.1f);
187     mProgressBarCircular.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 0.0f);
188     mProgressBarCircular.SetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VALUE, 0.1f);
189     mTimer.Start();
190     return true;
191   }
192
193   void OnValueChanged(ProgressBar progressBar, float value, float secondaryValue)
194   {
195     std::stringstream newLabel;
196     newLabel.precision(2);
197     newLabel << std::fixed << "current : " << value << " / loaded : " << secondaryValue;
198
199     mProgressBarDefault.SetProperty(ProgressBar::Property::LABEL_VISUAL, newLabel.str());
200   }
201
202   bool OnSetIndeterminateButtonSelected(Toolkit::Button button)
203   {
204     if(mProgressBarDefault.GetProperty<bool>(ProgressBar::Property::INDETERMINATE))
205     {
206       mProgressBarDefault.SetProperty(ProgressBar::Property::INDETERMINATE, false);
207       mProgressBarCircular.SetProperty(ProgressBar::Property::INDETERMINATE, false);
208     }
209     else
210     {
211       mProgressBarDefault.SetProperty(ProgressBar::Property::INDETERMINATE, true);
212       mProgressBarCircular.SetProperty(ProgressBar::Property::INDETERMINATE, true);
213     }
214     return true;
215   }
216
217   bool OnChangeThemeButtonSelected(Toolkit::Button button)
218   {
219     StyleManager styleManager = StyleManager::Get();
220
221     if(isDefaultTheme)
222     {
223       styleManager.ApplyTheme(THEME_PATH);
224       isDefaultTheme = false;
225     }
226     else
227     {
228       styleManager.ApplyDefaultTheme();
229       isDefaultTheme = true;
230     }
231     return true;
232   }
233   void OnKeyEvent(const KeyEvent& event)
234   {
235     if(event.GetState() == KeyEvent::DOWN)
236     {
237       if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK))
238       {
239         // Exit application when click back or escape.
240         mApplication.Quit();
241       }
242     }
243   }
244
245   // Data
246
247   Application&        mApplication;
248   Timer               mTimer;
249   Toolkit::Control    mView;         ///< The View instance.
250   Toolkit::ToolBar    mToolBar;      ///< The View's Toolbar.
251   Layer               mContentLayer; ///< Content layer.
252   ProgressBar         mProgressBarDefault;
253   ProgressBar         mProgressBarCircular;
254   Toolkit::PushButton mResetProgressButton;
255   Toolkit::PushButton mSetIndeterminateButton;
256   Toolkit::PushButton mChangeThemeButton;
257   float               mProgressValue;
258   float               mSecondaryProgressValue;
259   bool                isDefaultTheme;
260 };
261
262 int DALI_EXPORT_API main(int argc, char** argv)
263 {
264   Application        application = Application::New(&argc, &argv);
265   ProgressBarExample test(application);
266   application.MainLoop();
267   return 0;
268 }