X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=base%2Fdali-toolkit%2Finternal%2Fcontrols%2Ftable-view%2Ftable-view-impl.cpp;h=85099f53f959187e55ec2f8f84280a54169426ae;hb=65d4d378d08c6225ebf1e5bc024f8ef1adbb5dc2;hp=9afaeed05ea073c5d89e70375bfa8b8d6916d39c;hpb=30f6ca1e541089b19f2b349a8a12d8a5bcaf2f9e;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/base/dali-toolkit/internal/controls/table-view/table-view-impl.cpp b/base/dali-toolkit/internal/controls/table-view/table-view-impl.cpp index 9afaeed..85099f5 100644 --- a/base/dali-toolkit/internal/controls/table-view/table-view-impl.cpp +++ b/base/dali-toolkit/internal/controls/table-view/table-view-impl.cpp @@ -1,39 +1,36 @@ -// -// Copyright (c) 2014 Samsung Electronics Co., Ltd. -// -// Licensed under the Flora License, Version 1.0 (the License); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://floralicense.org/license/ -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an AS IS BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ // CLASS HEADER #include -#include // EXTERNAL INCLUDES +#include +#include +#include #include -#include +#include +#include +#include using namespace Dali; -using namespace std; namespace { -// Type registration -BaseHandle Create() -{ - return Toolkit::TableView::New(0, 0); -} -TypeRegistration mType( typeid(Toolkit::TableView), typeid(Toolkit::Control), Create ); - const float DEFAULT_CONSTRAINT_DURATION = 0.0f; /** @@ -75,8 +72,8 @@ struct RelativeToWidthOrHeight // debugging support, very useful when new features are added or bugs are hunted down // currently not called from code so compiler will optimize these away, kept here for future debugging -#define TABLEVIEW_TAG "DALI Toolkit::TableView" -#define TV_LOG(fmt, args...) LOG(LOG_INFO, TABLEVIEW_TAG, fmt, ## args) +#define TABLEVIEW_TAG "DALI Toolkit::TableView " +#define TV_LOG(fmt, args...) Debug::LogMessage(Debug::DebugInfo, TABLEVIEW_TAG fmt, ## args) void PrintArray( Array2d& array ) { @@ -117,7 +114,7 @@ void PrintArray( Array2d& array ) } // debugging support, very useful when new features are added or bugs are hunted down // currently not called from code so compiler will optimize these away, kept here for future debugging -void PrintVector( vector& array ) +void PrintVector( std::vector& array ) { TV_LOG( "vector, size [%d]\n", array.size() ); // print values @@ -137,9 +134,44 @@ namespace Dali namespace Toolkit { +const Property::Index TableView::PROPERTY_ROWS( Internal::TableView::TABLEVIEW_PROPERTY_START_INDEX ); +const Property::Index TableView::PROPERTY_COLUMNS( Internal::TableView::TABLEVIEW_PROPERTY_START_INDEX + 1 ); +const Property::Index TableView::PROPERTY_CELL_PADDING( Internal::TableView::TABLEVIEW_PROPERTY_START_INDEX + 2 ); +const Property::Index TableView::PROPERTY_LAYOUT_ANIMATION_DURATION( Internal::TableView::TABLEVIEW_PROPERTY_START_INDEX + 3 ); +const Property::Index TableView::PROPERTY_LAYOUT_ROWS( Internal::TableView::TABLEVIEW_PROPERTY_START_INDEX + 4 ); +const Property::Index TableView::PROPERTY_LAYOUT_COLUMNS( Internal::TableView::TABLEVIEW_PROPERTY_START_INDEX + 5 ); + namespace Internal { +namespace +{ + +const Scripting::StringEnum< Toolkit::TableView::LayoutPolicy > LAYOUT_POLICY_STRING_TABLE[] = +{ + { "fixed", Toolkit::TableView::Fixed }, + { "relative", Toolkit::TableView::Relative }, + { "fill", Toolkit::TableView::Fill } +}; + +const unsigned int LAYOUT_POLICY_STRING_TABLE_COUNT = sizeof(LAYOUT_POLICY_STRING_TABLE) / sizeof( LAYOUT_POLICY_STRING_TABLE[0] ); + +// Type registration +BaseHandle Create() +{ + return Toolkit::TableView::New(0, 0); +} +TypeRegistration mType( typeid(Toolkit::TableView), typeid(Toolkit::Control), Create ); + +PropertyRegistration property1( mType, "rows", Toolkit::TableView::PROPERTY_ROWS, Property::UNSIGNED_INTEGER, &TableView::SetProperty, &TableView::GetProperty ); +PropertyRegistration property2( mType, "columns", Toolkit::TableView::PROPERTY_COLUMNS, Property::UNSIGNED_INTEGER, &TableView::SetProperty, &TableView::GetProperty ); +PropertyRegistration property3( mType, "cell-padding", Toolkit::TableView::PROPERTY_CELL_PADDING, Property::VECTOR2, &TableView::SetProperty, &TableView::GetProperty ); +PropertyRegistration property4( mType, "layout-animation-duration", Toolkit::TableView::PROPERTY_LAYOUT_ANIMATION_DURATION, Property::FLOAT, &TableView::SetProperty, &TableView::GetProperty ); +PropertyRegistration property5( mType, "layout-rows", Toolkit::TableView::PROPERTY_LAYOUT_ROWS, Property::MAP, &TableView::SetProperty, &TableView::GetProperty ); +PropertyRegistration property6( mType, "layout-columns", Toolkit::TableView::PROPERTY_LAYOUT_COLUMNS, Property::MAP, &TableView::SetProperty, &TableView::GetProperty ); + +} // namespace + Toolkit::TableView TableView::New( unsigned int initialRows, unsigned int initialColumns ) { // Create the implementation, temporarily owned by this handle on stack @@ -327,14 +359,14 @@ void TableView::InsertRow( unsigned int rowIndex ) void TableView::DeleteRow( unsigned int rowIndex ) { - vector< Actor > ignored; + std::vector< Actor > ignored; DeleteRow( rowIndex, ignored ); } -void TableView::DeleteRow( unsigned int rowIndex, vector& removed ) +void TableView::DeleteRow( unsigned int rowIndex, std::vector& removed ) { RelayoutingLock lock( *this ); - vector< CellData > lost; + std::vector< CellData > lost; mCellData.DeleteRow( rowIndex, lost ); // need to update the cellinfos for the items that moved const unsigned int rowCount = mCellData.GetRows(); @@ -414,14 +446,14 @@ void TableView::InsertColumn( unsigned int columnIndex ) void TableView::DeleteColumn( unsigned int columnIndex ) { - vector< Actor > ignored; + std::vector< Actor > ignored; DeleteColumn( columnIndex, ignored ); } -void TableView::DeleteColumn( unsigned int columnIndex, vector& removed ) +void TableView::DeleteColumn( unsigned int columnIndex, std::vector& removed ) { RelayoutingLock lock( *this ); - vector< CellData > lost; + std::vector< CellData > lost; mCellData.DeleteColumn( columnIndex, lost ); // need to update the cellinfos for the items that moved const unsigned int rowCount = mCellData.GetRows(); @@ -465,17 +497,17 @@ void TableView::DeleteColumn( unsigned int columnIndex, vector& removed ) void TableView::Resize( unsigned int rows, unsigned int columns ) { - vector< Actor > ignored; + std::vector< Actor > ignored; Resize( rows, columns, ignored ); } -void TableView::Resize( unsigned int rows, unsigned int columns, vector& removed ) +void TableView::Resize( unsigned int rows, unsigned int columns, std::vector& removed ) { RelayoutingLock lock( *this ); unsigned int oldRows = GetRows(); unsigned int oldColumns = GetColumns(); // resize data array - vector< CellData > lost; + std::vector< CellData > lost; ResizeContainers( rows, columns, lost ); // calculate if we lost rows or columns unsigned int rowsRemoved = 0; @@ -516,6 +548,8 @@ void TableView::SetFixedHeight( unsigned int rowIndex, float height ) DALI_ASSERT_ALWAYS( rowIndex < mFixedHeights.size() ); // add the fixed height to the array of fixed heights mFixedHeights[ rowIndex ] = height; + // remove the relative height of the same row + mRelativeHeights[ rowIndex ] = 0.f; // relayout all cells, no lock needed as nothing added or removed RelayoutRequest(); } @@ -532,6 +566,8 @@ void TableView::SetRelativeHeight( unsigned int rowIndex, float heightPercentage DALI_ASSERT_ALWAYS( rowIndex < mRelativeHeights.size() ); // add the relative height to the array of relative heights mRelativeHeights[ rowIndex ] = heightPercentage; + // remove the fixed height of the same row + mFixedHeights[ rowIndex ] = 0.f; // relayout all cells, no lock needed as nothing added or removed RelayoutRequest(); } @@ -548,6 +584,8 @@ void TableView::SetFixedWidth( unsigned int columnIndex, float width ) DALI_ASSERT_ALWAYS( columnIndex < mFixedWidths.size() ); // add the fixed width to the array of fixed column widths mFixedWidths[ columnIndex ] = width; + // remove the relative width of the same column + mRelativeWidths[ columnIndex ] = 0.f; // relayout all cells, no lock needed as nothing added or removed RelayoutRequest(); } @@ -564,6 +602,8 @@ void TableView::SetRelativeWidth( unsigned int columnIndex, float widthPercentag DALI_ASSERT_ALWAYS( columnIndex < mRelativeWidths.size() ); // add the relative widths to the array of relative widths mRelativeWidths[ columnIndex ] = widthPercentage; + // remove the fixed width of the same column + mFixedWidths[ columnIndex ] = 0.f; // relayout all cells, no lock needed as nothing added or removed RelayoutRequest(); } @@ -737,6 +777,102 @@ unsigned int TableView::GetColumns() return mCellData.GetColumns(); } +void TableView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value ) +{ + Toolkit::TableView tableView = Toolkit::TableView::DownCast( Dali::BaseHandle( object ) ); + + if( tableView ) + { + TableView& tableViewImpl( GetImpl( tableView ) ); + switch( index ) + { + case Toolkit::TableView::PROPERTY_ROWS: + { + if( value.Get() != tableViewImpl.GetRows() ) + { + tableViewImpl.Resize( value.Get(), tableViewImpl.GetColumns() ); + } + break; + } + case Toolkit::TableView::PROPERTY_COLUMNS: + { + if( value.Get() != tableViewImpl.GetColumns() ) + { + tableViewImpl.Resize( tableViewImpl.GetRows(), value.Get() ); + } + break; + } + case Toolkit::TableView::PROPERTY_CELL_PADDING: + { + tableViewImpl.SetCellPadding( value.Get() ); + break; + } + case Toolkit::TableView::PROPERTY_LAYOUT_ANIMATION_DURATION: + { + tableViewImpl.SetLayoutAnimationDuration( value.Get() ); + break; + } + case Toolkit::TableView::PROPERTY_LAYOUT_ROWS: + { + SetHeightOrWidthProperty( tableViewImpl, &TableView::SetFixedHeight, &TableView::SetRelativeHeight, value ); + break; + } + case Toolkit::TableView::PROPERTY_LAYOUT_COLUMNS: + { + SetHeightOrWidthProperty( tableViewImpl, &TableView::SetFixedWidth, &TableView::SetRelativeWidth, value ); + break; + } + } + } +} + +Property::Value TableView::GetProperty( BaseObject* object, Property::Index index ) +{ + Property::Value value; + + Toolkit::TableView tableView = Toolkit::TableView::DownCast( Dali::BaseHandle( object ) ); + + if( tableView ) + { + TableView& tableViewImpl( GetImpl( tableView ) ); + switch( index ) + { + case Toolkit::TableView::PROPERTY_ROWS: + { + value = tableViewImpl.GetRows(); + break; + } + case Toolkit::TableView::PROPERTY_COLUMNS: + { + value = tableViewImpl.GetColumns(); + break; + } + case Toolkit::TableView::PROPERTY_CELL_PADDING: + { + value = tableViewImpl.GetCellPadding(); + break; + } + case Toolkit::TableView::PROPERTY_LAYOUT_ANIMATION_DURATION: + { + value = tableViewImpl.GetLayoutAnimationDuration(); + break; + } + case Toolkit::TableView::PROPERTY_LAYOUT_ROWS: + { + value = tableViewImpl.GetRowHeightsPropertyValue(); + break; + } + case Toolkit::TableView::PROPERTY_LAYOUT_COLUMNS: + { + value = tableViewImpl.GetColumnWidthsPropertyValue(); + break; + } + } + } + + return value; +} + void TableView::OnControlChildAdd( Actor& child ) { if( mLayoutingChild ) @@ -744,6 +880,27 @@ void TableView::OnControlChildAdd( Actor& child ) // we're in the middle of laying out children so no point doing anything here return; } + + Toolkit::TableView::CellPosition cellPosition; + if( child.GetPropertyIndex(Toolkit::TableView::ROW_SPAN_PROPERTY_NAME) != Property::INVALID_INDEX ) + { + cellPosition.rowSpan = static_cast( child.GetProperty( child.GetPropertyIndex(Toolkit::TableView::ROW_SPAN_PROPERTY_NAME) ).Get() ); + } + if( child.GetPropertyIndex(Toolkit::TableView::COLUMN_SPAN_PROPERTY_NAME) != Property::INVALID_INDEX ) + { + cellPosition.columnSpan = static_cast( child.GetProperty( child.GetPropertyIndex(Toolkit::TableView::COLUMN_SPAN_PROPERTY_NAME) ).Get() ); + } + if( child.GetPropertyIndex(Toolkit::TableView::CELL_INDICES_PROPERTY_NAME) != Property::INVALID_INDEX ) + { + Vector2 indices = child.GetProperty( child.GetPropertyIndex(Toolkit::TableView::CELL_INDICES_PROPERTY_NAME) ).Get(); + cellPosition.rowIndex = static_cast( indices.x ); + cellPosition.columnIndex = static_cast( indices.y ); + + AddChild( child, cellPosition ); + // donot continue + return; + } + // check if we're already laying out this child somewhere on the table // walk through the layout data const unsigned int rowCount = mCellData.GetRows(); @@ -794,7 +951,7 @@ void TableView::OnControlChildRemove( Actor& child ) } TableView::TableView( unsigned int initialRows, unsigned int initialColumns ) -: ControlImpl( true ), // requires touch +: Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS | REQUIRES_STYLE_CHANGE_SIGNALS ) ), mCellData( initialRows, initialColumns ), mLayoutingChild( false ), mConstraintDuration( DEFAULT_CONSTRAINT_DURATION ) @@ -813,11 +970,11 @@ void TableView::OnInitialize() void TableView::ResizeContainers( unsigned int rows, unsigned int columns ) { - vector ignored; + std::vector ignored; ResizeContainers( rows, columns, ignored ); } -void TableView::ResizeContainers( unsigned int rows, unsigned int columns, vector& removed ) +void TableView::ResizeContainers( unsigned int rows, unsigned int columns, std::vector& removed ) { mCellData.Resize( rows, columns, removed ); // we dont care if these go smaller, data will be regenerated or is not needed anymore @@ -828,11 +985,11 @@ void TableView::ResizeContainers( unsigned int rows, unsigned int columns, vecto mRelativeWidths.resize( columns ); } -void TableView::RemoveAndGetLostActors( const vector& lost, vector& removed, +void TableView::RemoveAndGetLostActors( const std::vector& lost, std::vector& removed, unsigned int rowsRemoved, unsigned int columnsRemoved ) { // iterate through all lost cells - vector< CellData >::const_iterator iter = lost.begin(); + std::vector< CellData >::const_iterator iter = lost.begin(); for( ; iter != lost.end(); ++iter ) { // if it is a valid actor @@ -995,12 +1152,86 @@ void TableView::UpdateRelativeSizes( float& fixedHeightsTotal, float& fixedWidth } } +void TableView::SetHeightOrWidthProperty(TableView& tableViewImpl, + void(TableView::*funcFixed)(unsigned int, float), + void(TableView::*funcRelative)(unsigned int, float), + const Property::Value& value ) +{ + if( Property::MAP == value.GetType() ) + { + Property::Map map = value.Get(); + unsigned int rowIndex(0); + for ( unsigned int i = 0, count = map.Count(); i < count; ++i ) + { + Property::Value& item = map.GetValue(i); + + if( std::istringstream(map.GetKey(i)) >> rowIndex // the key is a number + && Property::MAP == item.GetType()) + { + if( item.HasKey( "policy" ) && item.HasKey( "value" ) ) + { + Toolkit::TableView::LayoutPolicy policy = Scripting::GetEnumeration< Toolkit::TableView::LayoutPolicy >( item.GetValue("policy").Get(), LAYOUT_POLICY_STRING_TABLE, LAYOUT_POLICY_STRING_TABLE_COUNT ); + if( policy == Toolkit::TableView::Fixed ) + { + (tableViewImpl.*funcFixed)( rowIndex, item.GetValue("value").Get() ); + } + else if( policy == Toolkit::TableView::Relative ) + { + (tableViewImpl.*funcRelative)( rowIndex, item.GetValue("value").Get() ); + } + } + } + } + } +} + +Property::Value TableView::GetRowHeightsPropertyValue() +{ + Property::Map map; + GetMapPropertyValue( mFixedHeights, mRelativeHeights, map); + return Property::Value(map); +} + +Property::Value TableView::GetColumnWidthsPropertyValue() +{ + Property::Map map; + GetMapPropertyValue( mFixedWidths, mRelativeWidths, map); + return Property::Value(map); +} + +void TableView::GetMapPropertyValue( const std::vector& fixedSize, const std::vector& relativeSize, Property::Map& map ) +{ + std::string fixedPolicy( Scripting::GetEnumerationName< Toolkit::TableView::LayoutPolicy >( Toolkit::TableView::Fixed, LAYOUT_POLICY_STRING_TABLE, LAYOUT_POLICY_STRING_TABLE_COUNT ) ); + std::string relativePolicy( Scripting::GetEnumerationName< Toolkit::TableView::LayoutPolicy >( Toolkit::TableView::Relative, LAYOUT_POLICY_STRING_TABLE, LAYOUT_POLICY_STRING_TABLE_COUNT ) ); + + size_t count = fixedSize.size(); + for( size_t index = 0; index < count; index++ ) + { + if( ! EqualsZero( fixedSize[index] ) ) + { + Property::Map item; + item[ "policy" ] = fixedPolicy; + item[ "value" ] = fixedSize[index]; + + map[ static_cast( &(std::ostringstream() << index ) )->str() ] = item; + } + else if( ! EqualsZero( relativeSize[index] ) ) + { + Property::Map item; + item[ "policy" ] = relativePolicy; + item[ "value" ] = relativeSize[index]; + + map[ static_cast( &(std::ostringstream() << index ) )->str() ] = item; + } + } +} + TableView::~TableView() { // nothing to do } -Actor TableView::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Control::KeyboardFocusNavigationDirection direction, bool loopEnabled) +Actor TableView::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Toolkit::Control::KeyboardFocusNavigationDirection direction, bool loopEnabled) { Actor nextFocusableActor; @@ -1023,7 +1254,7 @@ Actor TableView::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Contro switch ( direction ) { - case Control::Left: + case Toolkit::Control::Left: { if(--currentColumn < 0) { @@ -1036,7 +1267,7 @@ Actor TableView::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Contro } break; } - case Control::Right: + case Toolkit::Control::Right: { if(++currentColumn > numberOfColumns - 1) { @@ -1049,7 +1280,7 @@ Actor TableView::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Contro } break; } - case Control::Up: + case Toolkit::Control::Up: { if(--currentRow < 0) { @@ -1058,7 +1289,7 @@ Actor TableView::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Contro } break; } - case Control::Down: + case Toolkit::Control::Down: { if(++currentRow > numberOfRows - 1) {