2 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
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"
24 using namespace Dali::Toolkit;
25 using Dali::Toolkit::ProgressBar;
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";
34 const Vector4 BACKGROUND_COLOUR(1.0f, 1.0f, 1.0f, 0.15f);
37 const int MARGIN_SIZE = 10;
38 const int TOP_MARGIN = 85;
39 const int CIRCULAR_PROGRESS_BAR_SIZE = 64;
41 const unsigned int TIMER_TIMEOUT_TIME = 50;
42 const float PROGRESS_INCREMENT_VALUE = 0.01f;
47 * @brief Shows how to create a default progress bar and custom styled progress bars.
49 class ProgressBarExample : public ConnectionTracker
52 ProgressBarExample(Application& application)
53 : mApplication(application)
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);
63 void Create(Application& application)
65 // The Init signal is received once (only) during the Application lifetime
67 // Respond to key events
68 application.GetWindow().KeyEventSignal().Connect(this, &ProgressBarExample::OnKeyEvent);
70 // Creates a default view with a default tool bar.
71 // The view is added to the window.
73 mContentLayer = DemoHelper::CreateView(application,
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);
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));
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));
100 for(unsigned int i = 0; i < contentTable.GetRows(); ++i)
102 contentTable.SetFitHeight(i);
105 contentTable.SetProperty(Actor::Property::POSITION, Vector2(0.0f, TOP_MARGIN));
106 mContentLayer.Add(contentTable);
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);
116 for(unsigned int i = 0; i < progressBackground.GetRows(); ++i)
118 progressBackground.SetFitHeight(i);
121 contentTable.Add(progressBackground);
122 progressBackground.Add(mProgressBarDefault);
123 progressBackground.Add(mProgressBarCircular);
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));
132 for(unsigned int i = 0; i < buttonBackground.GetRows(); ++i)
134 buttonBackground.SetFitHeight(i);
137 contentTable.Add(buttonBackground);
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);
145 buttonBackground.Add(mResetProgressButton);
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);
153 buttonBackground.Add(mSetIndeterminateButton);
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);
161 buttonBackground.Add(mChangeThemeButton);
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);
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);
178 return (mProgressValue < 1.0f); // Only call again if progress has NOT got to the end
181 bool OnResetProgressButtonSelected(Toolkit::Button button)
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);
193 void OnValueChanged(ProgressBar progressBar, float value, float secondaryValue)
195 std::stringstream newLabel;
196 newLabel.precision(2);
197 newLabel << std::fixed << "current : " << value << " / loaded : " << secondaryValue;
199 mProgressBarDefault.SetProperty(ProgressBar::Property::LABEL_VISUAL, newLabel.str());
202 bool OnSetIndeterminateButtonSelected(Toolkit::Button button)
204 if(mProgressBarDefault.GetProperty<bool>(ProgressBar::Property::INDETERMINATE))
206 mProgressBarDefault.SetProperty(ProgressBar::Property::INDETERMINATE, false);
207 mProgressBarCircular.SetProperty(ProgressBar::Property::INDETERMINATE, false);
211 mProgressBarDefault.SetProperty(ProgressBar::Property::INDETERMINATE, true);
212 mProgressBarCircular.SetProperty(ProgressBar::Property::INDETERMINATE, true);
217 bool OnChangeThemeButtonSelected(Toolkit::Button button)
219 StyleManager styleManager = StyleManager::Get();
223 styleManager.ApplyTheme(THEME_PATH);
224 isDefaultTheme = false;
228 styleManager.ApplyDefaultTheme();
229 isDefaultTheme = true;
233 void OnKeyEvent(const KeyEvent& event)
235 if(event.GetState() == KeyEvent::DOWN)
237 if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK))
239 // Exit application when click back or escape.
247 Application& mApplication;
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;
262 int DALI_EXPORT_API main(int argc, char** argv)
264 Application application = Application::New(&argc, &argv);
265 ProgressBarExample test(application);
266 application.MainLoop();