Mercurial > fife-parpg
comparison ext/guichan-0.8.2/src/contrib/widgets/adjustingcontainer.cpp @ 378:64738befdf3b
bringing in the changes from the build_system_rework branch in preparation for the 0.3.0 release. This commit will require the Jan2010 devkit. Clients will also need to be modified to the new way to import fife.
author | vtchill@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Mon, 11 Jan 2010 23:34:52 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
377:fe6fb0e0ed23 | 378:64738befdf3b |
---|---|
1 /* _______ __ __ __ ______ __ __ _______ __ __ | |
2 * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ | |
3 * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / | |
4 * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / | |
5 * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / | |
6 * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / | |
7 * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ | |
8 * | |
9 * Copyright (c) 2007 - 2008 Josh Matthews and Olof Naessén | |
10 * | |
11 * | |
12 * Per Larsson a.k.a finalman | |
13 * Olof Naessén a.k.a jansem/yakslem | |
14 * | |
15 * Visit: http://guichan.sourceforge.net | |
16 * | |
17 * License: (BSD) | |
18 * Redistribution and use in source and binary forms, with or without | |
19 * modification, are permitted provided that the following conditions | |
20 * are met: | |
21 * 1. Redistributions of source code must retain the above copyright | |
22 * notice, this list of conditions and the following disclaimer. | |
23 * 2. Redistributions in binary form must reproduce the above copyright | |
24 * notice, this list of conditions and the following disclaimer in | |
25 * the documentation and/or other materials provided with the | |
26 * distribution. | |
27 * 3. Neither the name of Guichan nor the names of its contributors may | |
28 * be used to endorse or promote products derived from this software | |
29 * without specific prior written permission. | |
30 * | |
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
35 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
36 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED | |
37 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
38 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
39 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
40 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
41 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
42 */ | |
43 | |
44 /* | |
45 * For comments regarding functions please see the header file. | |
46 */ | |
47 | |
48 #include "guichan/contrib/widgets/adjustingcontainer.hpp" | |
49 | |
50 #include <guichan.hpp> | |
51 | |
52 namespace gcn | |
53 { | |
54 namespace contrib | |
55 { | |
56 AdjustingContainer::AdjustingContainer() | |
57 : mWidth(0), | |
58 mHeight(0), | |
59 mNumberOfColumns(1), | |
60 mNumberOfRows(1), | |
61 mPaddingLeft(0), | |
62 mPaddingRight(0), | |
63 mPaddingTop(0), | |
64 mPaddingBottom(0), | |
65 mVerticalSpacing(0), | |
66 mHorizontalSpacing(0) | |
67 | |
68 | |
69 { | |
70 mColumnWidths.push_back(0); | |
71 mRowHeights.push_back(0); | |
72 } | |
73 | |
74 AdjustingContainer::~AdjustingContainer() | |
75 { | |
76 | |
77 } | |
78 | |
79 void AdjustingContainer::setNumberOfColumns(unsigned int numberOfColumns) | |
80 { | |
81 mNumberOfColumns = numberOfColumns; | |
82 | |
83 if (mColumnAlignment.size() < numberOfColumns) | |
84 { | |
85 while (mColumnAlignment.size() < numberOfColumns) | |
86 { | |
87 mColumnAlignment.push_back(LEFT); | |
88 } | |
89 } | |
90 else | |
91 { | |
92 while (mColumnAlignment.size() > numberOfColumns) | |
93 { | |
94 mColumnAlignment.pop_back(); | |
95 } | |
96 } | |
97 } | |
98 | |
99 void AdjustingContainer::setColumnAlignment(unsigned int column, | |
100 unsigned int alignment) | |
101 { | |
102 if (column < mColumnAlignment.size()) | |
103 { | |
104 mColumnAlignment[column] = alignment; | |
105 } | |
106 } | |
107 | |
108 void AdjustingContainer::setPadding(unsigned int paddingLeft, | |
109 unsigned int paddingRight, | |
110 unsigned int paddingTop, | |
111 unsigned int paddingBottom) | |
112 { | |
113 mPaddingLeft = paddingLeft; | |
114 mPaddingRight = paddingRight; | |
115 mPaddingTop = paddingTop; | |
116 mPaddingBottom = paddingBottom; | |
117 } | |
118 | |
119 void AdjustingContainer::setVerticalSpacing(unsigned int verticalSpacing) | |
120 { | |
121 mVerticalSpacing = verticalSpacing; | |
122 } | |
123 | |
124 void AdjustingContainer::setHorizontalSpacing(unsigned int horizontalSpacing) | |
125 { | |
126 mHorizontalSpacing = horizontalSpacing; | |
127 } | |
128 | |
129 void AdjustingContainer::logic() | |
130 { | |
131 Container::logic(); | |
132 adjustContent(); | |
133 } | |
134 | |
135 void AdjustingContainer::add(Widget *widget) | |
136 { | |
137 Container::add(widget); | |
138 mContainedWidgets.push_back(widget); | |
139 } | |
140 | |
141 void AdjustingContainer::add(Widget *widget, int x, int y) | |
142 { | |
143 add(widget); | |
144 } | |
145 | |
146 void AdjustingContainer::clear() | |
147 { | |
148 Container::clear(); | |
149 mContainedWidgets.clear(); | |
150 } | |
151 | |
152 void AdjustingContainer::remove(Widget *widget) | |
153 { | |
154 Container::remove(widget); | |
155 std::vector<gcn::Widget *>::iterator it; | |
156 for(it = mContainedWidgets.begin(); it != mContainedWidgets.end(); it++) | |
157 { | |
158 if(*it == widget) | |
159 { | |
160 mContainedWidgets.erase(it); | |
161 break; | |
162 } | |
163 } | |
164 } | |
165 | |
166 void AdjustingContainer::adjustSize() | |
167 { | |
168 mNumberOfRows = mContainedWidgets.size() | |
169 / mNumberOfColumns + mContainedWidgets.size() % mNumberOfColumns; | |
170 | |
171 mColumnWidths.clear(); | |
172 | |
173 unsigned int i; | |
174 for (i = 0; i < mNumberOfColumns; i++) | |
175 { | |
176 mColumnWidths.push_back(0); | |
177 } | |
178 | |
179 mRowHeights.clear(); | |
180 | |
181 for (i = 0; i < mNumberOfRows; i++) | |
182 { | |
183 mRowHeights.push_back(0); | |
184 } | |
185 | |
186 for (i = 0; i < mNumberOfColumns; i++) | |
187 { | |
188 unsigned int j; | |
189 for (j = 0; j < mNumberOfRows && mNumberOfColumns * j + i < mContainedWidgets.size(); j++) | |
190 { | |
191 if ((unsigned int)mContainedWidgets[mNumberOfColumns * j + i]->getWidth() > mColumnWidths[i]) | |
192 { | |
193 mColumnWidths[i] = mContainedWidgets[mNumberOfColumns * j + i]->getWidth(); | |
194 } | |
195 if ((unsigned int)mContainedWidgets[mNumberOfColumns * j + i]->getHeight() > mRowHeights[j]) | |
196 { | |
197 mRowHeights[j] = mContainedWidgets[mNumberOfColumns * j + i]->getHeight(); | |
198 } | |
199 } | |
200 } | |
201 | |
202 mWidth = mPaddingLeft; | |
203 | |
204 for (i = 0; i < mColumnWidths.size(); i++) | |
205 { | |
206 mWidth += mColumnWidths[i] + mHorizontalSpacing; | |
207 } | |
208 | |
209 mWidth -= mHorizontalSpacing; | |
210 mWidth += mPaddingRight; | |
211 | |
212 mHeight = mPaddingTop; | |
213 | |
214 for (i = 0; i < mRowHeights.size(); i++) | |
215 { | |
216 mHeight += mRowHeights[i] + mVerticalSpacing; | |
217 } | |
218 | |
219 mHeight -= mVerticalSpacing; | |
220 mHeight += mPaddingBottom; | |
221 | |
222 setHeight(mHeight); | |
223 setWidth(mWidth); | |
224 } | |
225 | |
226 void AdjustingContainer::adjustContent() | |
227 { | |
228 adjustSize(); | |
229 | |
230 unsigned int columnCount = 0; | |
231 unsigned int rowCount = 0; | |
232 unsigned int y = mPaddingTop; | |
233 | |
234 for (unsigned int i = 0; i < mContainedWidgets.size(); i++) | |
235 { | |
236 unsigned basex; | |
237 if (columnCount % mNumberOfColumns) | |
238 { | |
239 basex = mPaddingLeft; | |
240 unsigned int j; | |
241 | |
242 for (j = 0; j < columnCount; j++) | |
243 { | |
244 basex += mColumnWidths[j] + mHorizontalSpacing; | |
245 } | |
246 } | |
247 else | |
248 { | |
249 basex = mPaddingLeft; | |
250 } | |
251 | |
252 switch (mColumnAlignment[columnCount]) | |
253 { | |
254 case LEFT: | |
255 mContainedWidgets[i]->setX(basex); | |
256 break; | |
257 case CENTER: | |
258 mContainedWidgets[i]->setX(basex + (mColumnWidths[columnCount] - mContainedWidgets[i]->getWidth()) / 2); | |
259 break; | |
260 case RIGHT: | |
261 mContainedWidgets[i]->setX(basex + mColumnWidths[columnCount] - mContainedWidgets[i]->getWidth()); | |
262 break; | |
263 default: | |
264 throw GCN_EXCEPTION("Unknown alignment."); | |
265 } | |
266 | |
267 mContainedWidgets[i]->setY(y); | |
268 columnCount++; | |
269 | |
270 if (columnCount == mNumberOfColumns) | |
271 { | |
272 columnCount = 0; | |
273 y += mRowHeights[rowCount] + mVerticalSpacing; | |
274 rowCount++; | |
275 } | |
276 } | |
277 } | |
278 } | |
279 } |