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";
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";
50 const float DISTANCE_BETWEEN_IMAGE_AND_LABEL( 5.0f );
53 Dali::Toolkit::RadioButton RadioButton::New()
55 // Create the implementation, temporarily owned on stack
56 IntrusivePtr< RadioButton > internalRadioButton = new RadioButton();
58 // Pass ownership to CustomActor
59 Dali::Toolkit::RadioButton radioButton(*internalRadioButton);
61 // Second-phase init of the implementation
62 // This can only be done after the CustomActor connection has been made...
63 internalRadioButton->Initialize();
68 RadioButton::RadioButton()
70 SetTogglableButton(true);
73 RadioButton::~RadioButton()
77 void RadioButton::OnButtonInitialize()
81 // Wrap size of radio button around all its children
82 self.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
84 Image buttonImage = Dali::ResourceImage::New( UNSELECTED_BUTTON_IMAGE_DIR, ResourceImage::ON_DEMAND, ResourceImage::NEVER );
85 Image selectedImage = Dali::ResourceImage::New( SELECTED_BUTTON_IMAGE_DIR, ResourceImage::ON_DEMAND, ResourceImage::NEVER );
86 Image disabledImage = Dali::ResourceImage::New( DISABLED_UNSELECTED_BUTTON_IMAGE_DIR, ResourceImage::ON_DEMAND, ResourceImage::NEVER );
87 Image disabledSelectedImage = Dali::ResourceImage::New( DISABLED_SELECTED_BUTTON_IMAGE_DIR, ResourceImage::ON_DEMAND, ResourceImage::NEVER );
89 SetButtonImage( ImageActor::New( buttonImage ) );
90 SetSelectedImage( ImageActor::New( selectedImage ) );
91 SetDisabledImage( ImageActor::New( disabledImage ) );
92 SetDisabledSelectedImage( ImageActor::New( disabledSelectedImage ) );
97 void RadioButton::OnButtonUp()
99 if( ButtonDown == GetState() )
101 // Don't allow selection on an already selected radio button
104 SetSelected( !IsSelected() );
109 void RadioButton::OnLabelSet()
111 Actor& label = GetLabel();
115 label.SetParentOrigin( ParentOrigin::CENTER_LEFT );
116 label.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
118 // Radio button width is FIT_TO_CHILDREN, so the label must have a sensible policy to fill out the space
119 if( label.GetResizePolicy( Dimension::WIDTH ) == ResizePolicy::FILL_TO_PARENT )
121 label.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::WIDTH );
124 if( IsSelected() && GetSelectedImage() )
126 label.SetX( GetSelectedImage().GetNaturalSize().width + DISTANCE_BETWEEN_IMAGE_AND_LABEL );
128 else if( GetButtonImage() )
130 label.SetX( GetButtonImage().GetNaturalSize().width + DISTANCE_BETWEEN_IMAGE_AND_LABEL );
134 label.SetX( DISTANCE_BETWEEN_IMAGE_AND_LABEL );
139 void RadioButton::OnSelected()
141 Actor& label = GetLabel();
143 PaintState paintState = GetPaintState();
146 case UnselectedState:
148 Actor parent = Self().GetParent();
151 for( unsigned int i = 0; i < parent.GetChildCount(); ++i )
153 Dali::Toolkit::RadioButton radioButtonChild = Dali::Toolkit::RadioButton::DownCast( parent.GetChildAt( i ) );
154 if( radioButtonChild && radioButtonChild != Self() )
156 radioButtonChild.SetSelected( false );
161 Actor& selectedImage = GetSelectedImage();
162 if( label && selectedImage )
164 label.SetX( selectedImage.GetNaturalSize().width + DISTANCE_BETWEEN_IMAGE_AND_LABEL );
170 Actor& buttonImage = GetButtonImage();
171 if( label && buttonImage )
173 label.SetX( buttonImage.GetNaturalSize().width + DISTANCE_BETWEEN_IMAGE_AND_LABEL );
184 } // namespace Internal
186 } // namespace Toolkit