Changed indicator bg color.
[platform/framework/native/uifw.git] / src / ui / controls / FUiCtrl_ProgressPresenter.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0/
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 /**
19  * @file                FUiCtrl_ProgressPresenter.cpp
20  * @brief               This is the implementation file for the _ProgressPresenter class.
21  */
22
23 #include <FBaseErrorDefine.h>
24 #include <FBaseSysLog.h>
25 #include <FGrp_BitmapImpl.h>
26 #include "FUi_ResourceManager.h"
27 #include "FUiCtrl_ProgressPresenter.h"
28 #include "FUiCtrl_ProgressModel.h"
29 #include "FUiCtrl_Progress.h"
30
31 using namespace Tizen::Graphics;
32
33 namespace Tizen { namespace Ui { namespace Controls
34 {
35
36 _ProgressPresenter::_ProgressPresenter(void)
37         : __pProgress(null)
38         , __pProgressModel(null)
39         , __pResourceBitmap(null)
40         , __pResourceBarBgBitmap(null)
41         , __pBarResourceEffectBitmap(null)
42         , __pBarBgResourceEffectBitmap(null)
43         , __pBarColorReplacementBitmap(null)
44         , __pBarBgColorReplacementBitmap(null)
45 {
46 }
47
48 _ProgressPresenter::~_ProgressPresenter(void)
49 {
50         delete __pProgressModel;
51         __pProgressModel = null;
52
53         delete __pResourceBitmap;
54         __pResourceBitmap = null;
55
56         delete __pResourceBarBgBitmap;
57         __pResourceBarBgBitmap = null;
58
59         delete __pBarResourceEffectBitmap;
60         __pBarResourceEffectBitmap = null;
61
62         delete __pBarBgResourceEffectBitmap;
63         __pBarBgResourceEffectBitmap = null;
64
65         delete __pBarColorReplacementBitmap;
66         __pBarColorReplacementBitmap = null;
67
68         delete __pBarBgColorReplacementBitmap;
69         __pBarBgColorReplacementBitmap = null;
70 }
71
72 _ProgressPresenter*
73 _ProgressPresenter::CreateInstanceN(const _Progress& progress)
74 {
75         result r = E_SUCCESS;
76         _ProgressPresenter* pProgressPresenter = new (std::nothrow) _ProgressPresenter;
77         SysTryReturn(NID_UI_CTRL, pProgressPresenter != null, null, E_OUT_OF_MEMORY,
78                                 "[E_OUT_OF_MEMORY] Memory allocation failed.");
79
80         pProgressPresenter->__pProgress = const_cast <_Progress*>(&progress);
81         SysTryCatch(NID_UI_CTRL, pProgressPresenter->__pProgress != null, , E_SYSTEM,
82                                 "[E_SYSTEM] A system error has occurred. The Progress control core is null");
83
84         pProgressPresenter->__pProgressModel = new (std::nothrow) _ProgressModel;
85         SysTryCatch(NID_UI_CTRL, pProgressPresenter->__pProgressModel != null, , E_OUT_OF_MEMORY,
86                                 "[E_OUT_OF_MEMORY] Memory allocation failed.");
87
88         r = pProgressPresenter->LoadResource();
89         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] A system error has occurred. The loading of resource failed");
90
91         return pProgressPresenter;
92
93 CATCH:
94         delete pProgressPresenter;
95         pProgressPresenter = null;
96
97         return null;
98 }
99
100 void
101 _ProgressPresenter::SetValue(int value)
102 {
103         int maxValue = __pProgressModel->GetMaxValue();
104         int minValue = __pProgressModel->GetMinValue();
105
106         if (value > maxValue)
107         {
108                 value = maxValue;
109         }
110         else if (value < minValue)
111         {
112                 value = minValue;
113         }
114
115         __pProgressModel->SetValue(value);
116
117         return;
118 }
119
120 void
121 _ProgressPresenter::SetMinValue(int minValue)
122 {
123         __pProgressModel->SetMinValue(minValue);
124
125         if (__pProgressModel->GetValue() < minValue)
126         {
127                 __pProgressModel->SetValue(minValue);
128         }
129
130         return;
131 }
132
133 void
134 _ProgressPresenter::SetMaxValue(int maxValue)
135 {
136         __pProgressModel->SetMaxValue(maxValue);
137
138         if (__pProgressModel->GetValue() > maxValue)
139         {
140                 __pProgressModel->SetValue(maxValue);
141         }
142         return;
143 }
144
145 int
146 _ProgressPresenter::GetValue(void) const
147 {
148         return __pProgressModel->GetValue();
149 }
150
151 int
152 _ProgressPresenter::GetMinValue(void) const
153 {
154         return __pProgressModel->GetMinValue();
155 }
156
157 int
158 _ProgressPresenter::GetMaxValue(void) const
159 {
160         return __pProgressModel->GetMaxValue();
161 }
162
163 int
164 _ProgressPresenter::GetPercentComplete(void) const
165 {
166         int percentValue = 0;
167         int span = __pProgressModel->GetMaxValue() - __pProgressModel->GetMinValue();
168
169         if (span != 0)
170         {
171                 percentValue = (int) ((((double) __pProgressModel->GetValue() - __pProgressModel->GetMinValue()) / span) * 100);
172         }
173
174         return percentValue;
175 }
176
177 result
178 _ProgressPresenter::LoadResource(void)
179 {
180         result r = E_SUCCESS;
181
182         int opacity = 0;
183
184         Color bgColor;
185         Color barColor;
186
187         r = GET_COLOR_CONFIG(PROGRESS::BAR_BG_NORMAL, bgColor);
188         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
189
190         r = GET_COLOR_CONFIG(PROGRESS::BAR_NORMAL, barColor);
191         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
192
193         r = GET_BITMAP_CONFIG_N(PROGRESS::BAR_BG_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, __pResourceBarBgBitmap);
194         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
195
196         __pBarBgColorReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*__pResourceBarBgBitmap,Color::GetColor(COLOR_ID_MAGENTA), bgColor);
197         r = GetLastResult();
198         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
199
200         r = GET_BITMAP_CONFIG_N(PROGRESS::BAR_NORMAL, BITMAP_PIXEL_FORMAT_ARGB8888, __pResourceBitmap);
201         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
202
203         __pBarColorReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*__pResourceBitmap,Color::GetColor(COLOR_ID_MAGENTA), barColor);
204         r = GetLastResult();
205         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
206
207         r = GET_BITMAP_CONFIG_N(PROGRESS::BAR_BG_EFFECT, BITMAP_PIXEL_FORMAT_ARGB8888, __pBarBgResourceEffectBitmap);
208         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
209
210         r = GET_BITMAP_CONFIG_N(PROGRESS::BAR_EFFECT, BITMAP_PIXEL_FORMAT_ARGB8888, __pBarResourceEffectBitmap);
211         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , r, "[%s] Propagating.", GetErrorMessage(r));
212
213         opacity = barColor.GetAlpha();
214         __pBarColorReplacementBitmap->SetAlphaConstant(opacity);
215
216         __currentBarColor = barColor;
217         __currentBarBgColor = bgColor;
218
219         return r;
220
221 CATCH:
222
223         delete __pResourceBitmap;
224         __pResourceBitmap = null;
225
226         delete __pResourceBarBgBitmap;
227         __pResourceBarBgBitmap = null;
228
229         delete __pBarResourceEffectBitmap;
230         __pBarResourceEffectBitmap = null;
231
232         delete __pBarBgResourceEffectBitmap;
233         __pBarBgResourceEffectBitmap = null;
234
235         delete __pBarColorReplacementBitmap;
236         __pBarColorReplacementBitmap = null;
237
238         delete __pBarBgColorReplacementBitmap;
239         __pBarBgColorReplacementBitmap = null;
240
241         return r;
242 }
243
244 result
245 _ProgressPresenter::DrawBitmap(Canvas& canvas, const FloatRectangle& bounds, Bitmap* pBitmap)
246 {
247         result r = E_SUCCESS;
248
249         if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBitmap))
250         {
251                 r = canvas.DrawNinePatchedBitmap(bounds, *pBitmap);
252                 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
253         }
254         else
255         {
256                 r = canvas.DrawBitmap(bounds, *pBitmap);
257                 SysTryReturn(NID_UI_CTRL, (r == E_SUCCESS), r, r, "[%s] Propagating.", GetErrorMessage(r));
258         }
259         return r;
260 }
261
262 result
263 _ProgressPresenter::Draw(void)
264 {
265         result r = E_SUCCESS;
266
267         FloatRectangle bounds = __pProgress->GetBoundsF();
268         Canvas* pCanvas = __pProgress->GetCanvasN();
269         SysTryReturn(NID_UI_CTRL, pCanvas != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to get a canvas.");
270
271         int minValue = __pProgressModel->GetMinValue();
272         int maxValue = __pProgressModel->GetMaxValue();
273         float width = 0.0f;
274         float height = 0.0f;
275         int opacity = 0;
276         float leftMargin = 0.0f;
277         float minimumWidth = 0.0f;
278         float minimumHeight = 0.0f;
279         float offset = 0.0f;
280         Bitmap* pReplacementBitmap = null;
281         bool isCustomBarBitmap = false;
282         Color bgColor;
283
284         r = GET_COLOR_CONFIG(PROGRESS::BAR_BG_NORMAL, bgColor);
285         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
286
287         r = GET_SHAPE_CONFIG(PROGRESS::BAR_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, height);
288         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
289
290         r = GET_SHAPE_CONFIG(PROGRESS::BAR_LEFT_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, leftMargin);
291         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
292
293         r = GET_SHAPE_CONFIG(PROGRESS::MINIMUM_WIDTH, _CONTROL_ORIENTATION_PORTRAIT, minimumWidth);
294         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
295
296         r = GET_SHAPE_CONFIG(PROGRESS::BAR_OFFSET, _CONTROL_ORIENTATION_PORTRAIT, offset);
297         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
298
299         r = GET_SHAPE_CONFIG(PROGRESS::MINIMUM_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, minimumHeight);
300         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
301
302         if (bounds.width < minimumWidth)
303         {
304                 bounds.width = minimumWidth;
305         }
306
307         if (bounds.height < minimumHeight)
308         {
309                 bounds.height = minimumHeight;
310         }
311
312         pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
313         pCanvas->Clear();
314
315         width = bounds.width - (2.0f * leftMargin) - (2.0f * offset);
316         if (maxValue == __pProgressModel->GetValue())
317         {
318                 width = bounds.width - (2.0f * leftMargin) - (2.0f * offset);
319         }
320         else
321         {
322                 width = (width) * ((__pProgressModel->GetValue() - minValue) * 100.0f / (maxValue - minValue)) / 100.0f;
323         }
324
325         if (__pProgress->IsEnabled() == false)  // disabled
326         {
327                 __pBarBgColorReplacementBitmap->SetAlphaConstant(0xFF);
328
329                 r = DrawBitmap(*pCanvas, FloatRectangle(leftMargin, (bounds.height - height) / 2.0f, (bounds.width - (2.0f * leftMargin)), height), __pBarBgColorReplacementBitmap);
330                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
331         }
332
333         opacity = bgColor.GetAlpha();
334         __pBarBgColorReplacementBitmap->SetAlphaConstant(opacity);
335
336         isCustomBarBitmap = IS_CUSTOM_BITMAP(PROGRESS::BAR_BG_NORMAL);
337
338         if (__pProgress->GetBarBackgroundColor() != __currentBarBgColor)
339         {
340                 pReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*__pResourceBarBgBitmap, Color::GetColor(COLOR_ID_MAGENTA), __pProgress->GetBarBackgroundColor());
341                 r = GetLastResult();
342                 SysTryCatch(NID_UI_CTRL, pReplacementBitmap != null, , r, "[%s] Failed to get replacement color.", GetErrorMessage(r));
343                 delete __pBarBgColorReplacementBitmap;
344                 __pBarBgColorReplacementBitmap = null;
345
346                 __pBarBgColorReplacementBitmap = pReplacementBitmap;
347                 __currentBarBgColor = __pProgress->GetBarBackgroundColor();
348         }
349
350         r = DrawBitmap(*pCanvas, FloatRectangle(leftMargin, (bounds.height - height) / 2.0f, (bounds.width - (2.0f * leftMargin)), height), __pBarBgColorReplacementBitmap);
351         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
352
353         if (isCustomBarBitmap == false)
354         {
355                 r = DrawBitmap(*pCanvas, FloatRectangle(leftMargin, (bounds.height - height) / 2.0f, (bounds.width - (2.0f * leftMargin)), height), __pBarBgResourceEffectBitmap);
356                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
357         }
358
359         if (width > 0)
360         {
361                 if (__pProgress->GetBarColor() != __currentBarColor)
362                 {
363                         pReplacementBitmap = _BitmapImpl::GetColorReplacedBitmapN(*__pResourceBitmap, Color::GetColor(COLOR_ID_MAGENTA), __pProgress->GetBarColor());
364                         r = GetLastResult();
365                         SysTryCatch(NID_UI_CTRL, pReplacementBitmap != null, , r, "[%s] Failed to get replacement color.", GetErrorMessage(r));
366                         delete __pBarColorReplacementBitmap;
367                         __pBarColorReplacementBitmap = null;
368
369                         __pBarColorReplacementBitmap = pReplacementBitmap;
370                         __currentBarColor = __pProgress->GetBarColor();
371                 }
372                 if (__pProgress->IsEnabled() == false)  // disabled
373                 {
374                         __pBarColorReplacementBitmap->SetAlphaConstant(0x4C);
375                 }
376                 else
377                 {
378                         opacity = __pProgress->GetBarColor().GetAlpha();
379                         __pBarColorReplacementBitmap->SetAlphaConstant(opacity);
380                 }
381
382                 isCustomBarBitmap = IS_CUSTOM_BITMAP(PROGRESS::BAR_NORMAL);
383
384                 r = DrawBitmap(*pCanvas, FloatRectangle((leftMargin + offset), (bounds.height - height) / 2.0f, width, height), __pBarColorReplacementBitmap);
385                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
386
387                 if (isCustomBarBitmap == false)
388                 {
389                         r = DrawBitmap(*pCanvas, FloatRectangle((leftMargin + offset), (bounds.height - height) / 2.0f, width, height), __pBarResourceEffectBitmap);
390                         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
391                 }
392
393         }
394
395         delete pCanvas;
396         pCanvas = null;
397
398         return r;
399
400 CATCH:
401
402         delete pCanvas;
403         pCanvas = null;
404
405         return r;
406 }
407
408 }}} // Tizen::Ui::Controls