Merge "Adding GridLayout" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / layouting / grid-locations.cpp
1 /*
2  * Copyright (c) 2018 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 //CLASS HEADER
18 #include <dali-toolkit/internal/layouting/grid-locations.h>
19
20 // EXTERNAL HEADERS
21 #include <dali/integration-api/debug.h>
22
23 // INTERNAL HEADERS
24 #include <dali-toolkit/devel-api/layouting/layout-item.h>
25
26 namespace
27 {
28
29 #if defined(DEBUG_ENABLED)
30 static Debug::Filter* gLogFilter = Debug::Filter::New( Debug::Concise, false, "LOG_AXIS" );
31 #endif
32
33 }
34
35 namespace Dali
36 {
37 namespace Toolkit
38 {
39 namespace Internal
40 {
41
42 GridLocationsPtr GridLocations::New()
43 {
44   GridLocationsPtr gridAxis( new GridLocations() );
45   return gridAxis;
46 }
47
48 GridLocations::GridLocations()
49 : mLocations()
50 {
51 }
52
53 GridLocations::~GridLocations(){}
54
55 void GridLocations::CalculateLocations( int numberOfColumns,
56                                         unsigned int availableWidth,
57                                         unsigned int availableHeight,
58                                         unsigned int numberOfCells,
59                                         unsigned int columnWidth,
60                                         unsigned int rowHeight )
61 {
62   mLocations.clear();
63
64   // Calculate width and height of columns and rows.
65
66   // Calculate numbers of rows, round down result as later check for remainder.
67   unsigned int numberOfRows = numberOfCells/numberOfColumns;
68   // If number of cells not cleanly dividable by colums, add another row to house remainder cells.
69   numberOfRows += (numberOfCells%numberOfColumns)?1:0;
70
71   unsigned int maxColumnWidth = availableWidth / numberOfColumns;
72
73   if( columnWidth > 0 )
74   {
75     // Column width supplied so use this unless exceeds available width.
76     columnWidth = std::min( columnWidth, maxColumnWidth );
77   }
78   else
79   {
80     // Column width not supplied so use calculated value
81     columnWidth = maxColumnWidth;
82   }
83
84   unsigned int maxRowHeight = availableHeight / numberOfRows;
85
86   if( rowHeight > 0 )
87   {
88     // Column height supplied so use this unless exceeds available height.
89     rowHeight = std::min( rowHeight, maxRowHeight );
90   }
91   else
92   {
93     // Column height not supplied so use calculated value
94     rowHeight = maxRowHeight;
95   }
96
97   DALI_LOG_INFO( gLogFilter, Debug::Verbose, "ColumWidth[%d] RowHeight[%d] NumberOfRows[%d] NumberOfColumns[%d]\n",
98                                               columnWidth, rowHeight, numberOfRows, numberOfColumns );
99   DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Remainder[%d]\n", numberOfCells%numberOfColumns );
100
101   int  y1 = 0;
102   int  y2 = y1 + rowHeight;
103
104   // Calculate start, end, top and bottom coordinate of each cell.
105
106   // Iterate rows
107   for( auto i = 0u; i < numberOfRows; i++ )
108   {
109     int x1 = 0;
110     int x2 = x1 + columnWidth;
111
112     // Iterate columns
113     for( auto j = 0; j < numberOfColumns; j++ )
114     {
115       GridLocations::Cell cell( x1, x2, y1, y2 );
116       mLocations.push_back( cell );
117       // Calculate starting x and ending x position of each column
118       x1 = x2;
119       x2 = x2 + columnWidth;
120     }
121
122     // Calculate top y and bottom y position of each row.
123     y1 = y2;
124     y2 = y2 + rowHeight;
125   }
126
127 #if defined(DEBUG_ENABLED)
128   std::ostringstream oss;
129   DALI_LOG_INFO( gLogFilter, Debug::Verbose, "GridLocations::CalculateLocations (%d)\n", numberOfCells );
130   for( auto i = 0u; i < numberOfCells; i++ )
131   {
132     DALI_LOG_STREAM( gLogFilter, Debug::Verbose,"x1:"<<mLocations[i].xStart<<" x2:"<<mLocations[i].xEnd<<" y1:"<<mLocations[i].yTop<<" y2:"<<mLocations[i].yBottom);
133   }
134 #endif
135 }
136
137 GridLocations::LocationVector GridLocations::GetLocations()
138 {
139 #if defined(DEBUG_ENABLED)
140   std::ostringstream oss;
141   auto itemCount = mLocations.size(); // mVerticalLocations mirrors this so same size.
142   DALI_LOG_INFO( gLogFilter, Debug::Verbose, "GridLocations::GetLocations for %u cells\n", itemCount );
143   for( auto i = 0u; i < itemCount; i++ )
144   {
145     DALI_LOG_STREAM( gLogFilter, Debug::Verbose,"x1:"<<mLocations[i].xStart<<" x2:"<<mLocations[i].xEnd<<" y1:"<<mLocations[i].yTop<<" y2:"<<mLocations[i].yBottom);
146   }
147 #endif
148
149   return mLocations;
150 }
151
152 } // namespace Internal
153
154 } // namespace Toolkit
155 } // namespace Dali