2 * Copyright (c) 2014 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.
20 #include "radio-button-impl.h"
23 #include <dali/public-api/object/type-registry.h>
24 #include <dali/public-api/images/resource-image.h>
40 return Toolkit::RadioButton::New();
43 TypeRegistration typeRegistration( typeid( Toolkit::RadioButton ), typeid( Toolkit::Button ), Create);
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";
48 const Vector3 DISTANCE_BETWEEN_IMAGE_AND_LABEL(5.0f, 0.0f, 0.0f);
51 Dali::Toolkit::RadioButton RadioButton::New()
53 // Create the implementation, temporarily owned on stack
54 IntrusivePtr< RadioButton > internalRadioButton = new RadioButton();
56 // Pass ownership to CustomActor
57 Dali::Toolkit::RadioButton radioButton(*internalRadioButton);
59 // Second-phase init of the implementation
60 // This can only be done after the CustomActor connection has been made...
61 internalRadioButton->Initialize();
66 RadioButton::RadioButton()
68 SetTogglableButton(true);
71 RadioButton::~RadioButton()
75 void RadioButton::SetButtonImage( Actor image )
77 Actor& buttonImage = GetButtonImage();
81 if( buttonImage && buttonImage.GetParent() )
83 buttonImage.GetParent().Remove( buttonImage );
89 Actor& label = GetLabel();
93 buttonImage.Remove( label );
100 buttonImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
101 buttonImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
104 void RadioButton::SetSelectedImage( Actor image )
106 Actor& selectedImage = GetSelectedImage();
110 if( selectedImage && selectedImage.GetParent() )
112 selectedImage.GetParent().Remove( selectedImage );
113 selectedImage.Reset();
118 Actor& label = GetLabel();
122 selectedImage.Remove( label );
127 selectedImage = image;
129 selectedImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
130 selectedImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
133 void RadioButton::OnButtonInitialize()
135 Image buttonImage = Dali::ResourceImage::New( UNSELECTED_BUTTON_IMAGE_DIR );
136 Image selectedImage = Dali::ResourceImage::New( SELECTED_BUTTON_IMAGE_DIR );
138 SetButtonImage( ImageActor::New( buttonImage ) );
139 SetSelectedImage( ImageActor::New( selectedImage ) );
144 void RadioButton::OnButtonUp()
146 if( ButtonDown == GetState() )
148 // Don't allow selection on an already selected radio button
151 SetSelected(!IsSelected());
156 void RadioButton::OnLabelSet()
158 Actor& label = GetLabel();
162 label.SetParentOrigin( ParentOrigin::CENTER_RIGHT );
163 label.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
164 label.TranslateBy( DISTANCE_BETWEEN_IMAGE_AND_LABEL );
168 GetSelectedImage().Add( label );
172 GetButtonImage().Add( label );
177 void RadioButton::OnSelected( bool selected )
179 Actor& buttonImage = GetButtonImage();
180 Actor& selectedImage = GetSelectedImage();
181 Actor& label = GetLabel();
185 Actor parent = Self().GetParent();
188 for( unsigned int i = 0; i < parent.GetChildCount(); ++i )
190 Dali::Toolkit::RadioButton rbChild = Dali::Toolkit::RadioButton::DownCast(parent.GetChildAt(i));
194 rbChild.SetSelected(false);
199 buttonImage.GetParent().Remove( buttonImage );
200 Self().Add( selectedImage );
204 label.GetParent().Remove( label );
205 selectedImage.Add( label );
210 selectedImage.GetParent().Remove( selectedImage );
211 Self().Add( buttonImage );
215 label.GetParent().Remove( label );
216 buttonImage.Add( label );
221 void RadioButton::OnRelayout( const Vector2& /*size*/, ActorSizeContainer& container )
227 newSize = GetSelectedImage().GetNaturalSize();
231 newSize = GetButtonImage().GetNaturalSize();
234 Actor& label = GetLabel();
238 // Offset the label from the radio button image
239 newSize.width += DISTANCE_BETWEEN_IMAGE_AND_LABEL.width;
241 // Find the size of the control using size negotiation
242 Vector3 actorNaturalSize( label.GetNaturalSize() );
243 Control::Relayout( label, Vector2( actorNaturalSize.width, actorNaturalSize.height ), container );
245 Vector3 actorSize( label.GetSize() );
246 newSize.width += actorSize.width;
247 newSize.height = std::max( newSize.height, actorSize.height );
250 Self().SetSize( newSize );
253 } // namespace Internal
255 } // namespace Toolkit