Remove Unnecessary OnButton methods in the button implementations
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / buttons / radio-button-impl.cpp
1 /*
2  * Copyright (c) 2014 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
19 // CLASS HEADER
20 #include "radio-button-impl.h"
21
22 // EXTERNAL INCLUDES
23 #include <dali/public-api/object/type-registry.h>
24 #include <dali/public-api/images/resource-image.h>
25
26 namespace Dali
27 {
28
29 namespace Toolkit
30 {
31
32 namespace Internal
33 {
34
35 namespace
36 {
37
38 BaseHandle Create()
39 {
40   return Toolkit::RadioButton::New();
41 }
42
43 TypeRegistration typeRegistration( typeid( Toolkit::RadioButton ), typeid( Toolkit::Button ), Create);
44
45 const char* const UNSELECTED_BUTTON_IMAGE_DIR = DALI_IMAGE_DIR "radio-button-unselected.png";
46 const char* const SELECTED_BUTTON_IMAGE_DIR = DALI_IMAGE_DIR "radio-button-selected.png";
47 const char* const DISABLED_UNSELECTED_BUTTON_IMAGE_DIR = DALI_IMAGE_DIR "radio-button-unselected-disabled.png";
48 const char* const DISABLED_SELECTED_BUTTON_IMAGE_DIR = DALI_IMAGE_DIR "radio-button-selected-disabled.png";
49
50 const float DISTANCE_BETWEEN_IMAGE_AND_LABEL( 5.0f );
51 }
52
53 Dali::Toolkit::RadioButton RadioButton::New()
54 {
55   // Create the implementation, temporarily owned on stack
56   IntrusivePtr< RadioButton > internalRadioButton = new RadioButton();
57
58   // Pass ownership to CustomActor
59   Dali::Toolkit::RadioButton radioButton(*internalRadioButton);
60
61   // Second-phase init of the implementation
62   // This can only be done after the CustomActor connection has been made...
63   internalRadioButton->Initialize();
64
65   return radioButton;
66 }
67
68 RadioButton::RadioButton()
69 {
70   SetTogglableButton(true);
71 }
72
73 RadioButton::~RadioButton()
74 {
75 }
76
77 void RadioButton::OnInitialize()
78 {
79   Button::OnInitialize();
80
81   Actor self = Self();
82
83   // Wrap size of radio button around all its children
84   self.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
85
86   SetUnselectedImage( UNSELECTED_BUTTON_IMAGE_DIR );
87   SetSelectedImage( SELECTED_BUTTON_IMAGE_DIR );
88   SetDisabledImage( DISABLED_UNSELECTED_BUTTON_IMAGE_DIR );
89   SetDisabledSelectedImage( DISABLED_SELECTED_BUTTON_IMAGE_DIR );
90
91   RelayoutRequest();
92 }
93
94 void RadioButton::OnButtonUp()
95 {
96   if( ButtonDown == GetState() )
97   {
98     // Don't allow selection on an already selected radio button
99     if( !IsSelected() )
100     {
101       SetSelected( !IsSelected() );
102     }
103   }
104 }
105
106 void RadioButton::OnLabelSet( bool noPadding )
107 {
108   Actor& label = GetLabelActor();
109
110   if( label )
111   {
112     label.SetParentOrigin( ParentOrigin::CENTER_LEFT );
113     label.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
114
115     // Radio button width is FIT_TO_CHILDREN, so the label must have a sensible policy to fill out the space
116     if( label.GetResizePolicy( Dimension::WIDTH ) == ResizePolicy::FILL_TO_PARENT )
117     {
118       label.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::WIDTH );
119     }
120
121     if( IsSelected() && GetSelectedImage() )
122     {
123       label.SetX( GetSelectedImage().GetNaturalSize().width + DISTANCE_BETWEEN_IMAGE_AND_LABEL );
124     }
125     else if( GetUnselectedImage() )
126     {
127       label.SetX( GetUnselectedImage().GetNaturalSize().width + DISTANCE_BETWEEN_IMAGE_AND_LABEL );
128     }
129     else
130     {
131       label.SetX( DISTANCE_BETWEEN_IMAGE_AND_LABEL );
132     }
133   }
134 }
135
136 void RadioButton::OnSelected()
137 {
138   Actor& label = GetLabelActor();
139
140   PaintState paintState = GetPaintState();
141   switch( paintState )
142   {
143     case UnselectedState:
144     {
145       Actor parent = Self().GetParent();
146       if( parent )
147       {
148         for( unsigned int i = 0; i < parent.GetChildCount(); ++i )
149         {
150           Dali::Toolkit::RadioButton radioButtonChild = Dali::Toolkit::RadioButton::DownCast( parent.GetChildAt( i ) );
151           if( radioButtonChild && radioButtonChild != Self() )
152           {
153             radioButtonChild.SetSelected( false );
154           }
155         }
156       }
157
158       Actor& selectedImage = GetSelectedImage();
159       if( label && selectedImage )
160       {
161         label.SetX( selectedImage.GetNaturalSize().width + DISTANCE_BETWEEN_IMAGE_AND_LABEL );
162       }
163       break;
164     }
165     case SelectedState:
166     {
167       Actor& buttonImage = GetUnselectedImage();
168       if( label && buttonImage )
169       {
170         label.SetX( buttonImage.GetNaturalSize().width + DISTANCE_BETWEEN_IMAGE_AND_LABEL );
171       }
172       break;
173     }
174     default:
175     {
176       break;
177     }
178   }
179 }
180
181 } // namespace Internal
182
183 } // namespace Toolkit
184
185 } // namespace Dali