annotate src/widget.cpp @ 13747:1bc53910de7f draft

(svn r18272) -Codechange: make FindScrollbar a const function
author rubidium <rubidium@openttd.org>
date Tue, 24 Nov 2009 16:54:52 +0000
parents a0aa80f5d2d2
children 4f41c01242a8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
1 /* $Id$ */
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
2
12778
bc7926153e19 (svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents: 12710
diff changeset
3 /*
bc7926153e19 (svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents: 12710
diff changeset
4 * This file is part of OpenTTD.
bc7926153e19 (svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents: 12710
diff changeset
5 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
bc7926153e19 (svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents: 12710
diff changeset
6 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
bc7926153e19 (svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents: 12710
diff changeset
7 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
bc7926153e19 (svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents: 12710
diff changeset
8 */
bc7926153e19 (svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents: 12710
diff changeset
9
9111
d48433370037 (svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium <rubidium@openttd.org>
parents: 8969
diff changeset
10 /** @file widget.cpp Handling of the default/simple widgets. */
6432
fc703c6dc92c (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas <belugas@openttd.org>
parents: 6278
diff changeset
11
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
12 #include "stdafx.h"
12897
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
13 #include "openttd.h"
10208
39cf8eebfda5 (svn r14422) -Codechange: also reflect the changes of r14421 in the filenames.
rubidium <rubidium@openttd.org>
parents: 10207
diff changeset
14 #include "company_func.h"
8106
47b1794a7eca (svn r11667) -Codechange: split window.h into a header that defines some 'global' window related types, on that defined 'global' window functions and one that defines functions and types only used by *_gui.cpps.
rubidium <rubidium@openttd.org>
parents: 8082
diff changeset
15 #include "window_gui.h"
12526
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
16 #include "viewport_func.h"
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
17 #include "zoom_func.h"
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
18 #include "debug.h"
11465
4fc1be7900f4 (svn r15823) -Codechange: prepare the WWT_FRAME and WWT_DROPDOWN(IN) widget types for rtl languages.
yexo <yexo@openttd.org>
parents: 11461
diff changeset
19 #include "strings_func.h"
12897
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
20 #include "transparency.h"
8131
e300ac8001ae (svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium <rubidium@openttd.org>
parents: 8121
diff changeset
21
8264
2495310e220f (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium <rubidium@openttd.org>
parents: 8254
diff changeset
22 #include "table/sprites.h"
2495310e220f (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium <rubidium@openttd.org>
parents: 8254
diff changeset
23 #include "table/strings.h"
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
24
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
25 static const char *UPARROW = "\xEE\x8A\xA0"; ///< String containing an upwards pointing arrow.
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
26 static const char *DOWNARROW = "\xEE\x8A\xAA"; ///< String containing a downwards pointing arrow.
8349
cbb2e614bcfa (svn r11915) -Codechange: Add a function to draw a sort button's up/down arrow. Arrows are now drawn in a consistent position based on the widget, instead of randomly positioned by pixel.
peter1138 <peter1138@openttd.org>
parents: 8335
diff changeset
27
9773
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
28 /**
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
29 * Compute the vertical position of the draggable part of scrollbar
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
30 * @param sb Scrollbar list data
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
31 * @param top Top position of the scrollbar (top position of the up-button)
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
32 * @param bottom Bottom position of the scrollbar (bottom position of the down-button)
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
33 * @param horizontal Whether the scrollbar is horizontal or not
9773
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
34 * @return A Point, with x containing the top coordinate of the draggable part, and
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
35 * y containing the bottom coordinate of the draggable part
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
36 */
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
37 static Point HandleScrollbarHittest(const Scrollbar *sb, int top, int bottom, bool horizontal)
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
38 {
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
39 /* Base for reversion */
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
40 int rev_base = top + bottom;
9773
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
41 top += 10; // top points to just below the up-button
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
42 bottom -= 9; // bottom points to top of the down-button
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
43
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
44 int height = (bottom - top);
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
45 int pos = sb->GetPosition();
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
46 int count = sb->GetCount();
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
47 int cap = sb->GetCapacity();
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
48
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
49 if (count != 0) top += height * pos / count;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
50
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
51 if (cap > count) cap = count;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
52 if (count != 0) bottom -= (count - pos - cap) * height / count;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
53
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
54 Point pt;
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
55 if (horizontal && _dynlang.text_dir == TD_RTL) {
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
56 pt.x = rev_base - (bottom - 1);
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
57 pt.y = rev_base - top;
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
58 } else {
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
59 pt.x = top;
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
60 pt.y = bottom - 1;
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
61 }
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
62 return pt;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
63 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
64
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
65 /**
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
66 * Compute new position of the scrollbar after a click and updates the window flags.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
67 * @param w Window on which a scroll was performed.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
68 * @param wtp Scrollbar widget type.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
69 * @param mi Minimum coordinate of the scroll bar.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
70 * @param ma Maximum coordinate of the scroll bar.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
71 * @param x The X coordinate of the mouse click.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
72 * @param y The Y coordinate of the mouse click.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
73 */
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
74 static void ScrollbarClickPositioning(Window *w, WidgetType wtp, int x, int y, int mi, int ma)
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
75 {
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
76 int pos;
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
77 Scrollbar *sb;
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
78 bool rtl = false;
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
79
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
80 switch (wtp) {
8729
ce8dc35932c3 (svn r12405) -Codechange: some coding style and 'untodoifying' some comments that were certainly not todos.
rubidium <rubidium@openttd.org>
parents: 8418
diff changeset
81 case WWT_SCROLLBAR:
6432
fc703c6dc92c (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas <belugas@openttd.org>
parents: 6278
diff changeset
82 /* vertical scroller */
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
83 w->flags4 &= ~WF_HSCROLL;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
84 w->flags4 &= ~WF_SCROLL2;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
85 pos = y;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
86 sb = &w->vscroll;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
87 break;
8729
ce8dc35932c3 (svn r12405) -Codechange: some coding style and 'untodoifying' some comments that were certainly not todos.
rubidium <rubidium@openttd.org>
parents: 8418
diff changeset
88
ce8dc35932c3 (svn r12405) -Codechange: some coding style and 'untodoifying' some comments that were certainly not todos.
rubidium <rubidium@openttd.org>
parents: 8418
diff changeset
89 case WWT_SCROLL2BAR:
6432
fc703c6dc92c (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas <belugas@openttd.org>
parents: 6278
diff changeset
90 /* 2nd vertical scroller */
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
91 w->flags4 &= ~WF_HSCROLL;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
92 w->flags4 |= WF_SCROLL2;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
93 pos = y;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
94 sb = &w->vscroll2;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
95 break;
8729
ce8dc35932c3 (svn r12405) -Codechange: some coding style and 'untodoifying' some comments that were certainly not todos.
rubidium <rubidium@openttd.org>
parents: 8418
diff changeset
96
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
97 case WWT_HSCROLLBAR:
6432
fc703c6dc92c (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas <belugas@openttd.org>
parents: 6278
diff changeset
98 /* horizontal scroller */
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
99 w->flags4 &= ~WF_SCROLL2;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
100 w->flags4 |= WF_HSCROLL;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
101 pos = x;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
102 sb = &w->hscroll;
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
103 rtl = _dynlang.text_dir == TD_RTL;
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
104 break;
8729
ce8dc35932c3 (svn r12405) -Codechange: some coding style and 'untodoifying' some comments that were certainly not todos.
rubidium <rubidium@openttd.org>
parents: 8418
diff changeset
105
ce8dc35932c3 (svn r12405) -Codechange: some coding style and 'untodoifying' some comments that were certainly not todos.
rubidium <rubidium@openttd.org>
parents: 8418
diff changeset
106 default: NOT_REACHED();
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
107 }
8969
01cc3ee6ecb1 (svn r12761) -Codechange: lots of minor whitespace coding style fixes around operators.
rubidium <rubidium@openttd.org>
parents: 8857
diff changeset
108 if (pos <= mi + 9) {
6432
fc703c6dc92c (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas <belugas@openttd.org>
parents: 6278
diff changeset
109 /* Pressing the upper button? */
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
110 w->flags4 |= WF_SCROLL_UP;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
111 if (_scroller_click_timeout == 0) {
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
112 _scroller_click_timeout = 6;
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
113 sb->UpdatePosition(rtl ? 1 : -1);
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
114 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
115 _left_button_clicked = false;
8729
ce8dc35932c3 (svn r12405) -Codechange: some coding style and 'untodoifying' some comments that were certainly not todos.
rubidium <rubidium@openttd.org>
parents: 8418
diff changeset
116 } else if (pos >= ma - 10) {
6432
fc703c6dc92c (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas <belugas@openttd.org>
parents: 6278
diff changeset
117 /* Pressing the lower button? */
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
118 w->flags4 |= WF_SCROLL_DOWN;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
119
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
120 if (_scroller_click_timeout == 0) {
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
121 _scroller_click_timeout = 6;
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
122 sb->UpdatePosition(rtl ? -1 : 1);
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
123 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
124 _left_button_clicked = false;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
125 } else {
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
126 Point pt = HandleScrollbarHittest(sb, mi, ma, wtp == WWT_HSCROLLBAR);
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
127
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
128 if (pos < pt.x) {
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
129 sb->UpdatePosition(rtl ? sb->GetCapacity() : -sb->GetCapacity());
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
130 } else if (pos > pt.y) {
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
131 sb->UpdatePosition(rtl ? -sb->GetCapacity() : sb->GetCapacity());
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
132 } else {
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
133 _scrollbar_start_pos = pt.x - mi - 9;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
134 _scrollbar_size = ma - mi - 23;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
135 w->flags4 |= WF_SCROLL_MIDDLE;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
136 _scrolling_scrollbar = true;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
137 _cursorpos_drag_start = _cursor.pos;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
138 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
139 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
140
9116
44beb31166aa (svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium <rubidium@openttd.org>
parents: 9111
diff changeset
141 w->SetDirty();
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
142 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
143
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
144 /** Special handling for the scrollbar widget type.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
145 * Handles the special scrolling buttons and other scrolling.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
146 * @param w Window on which a scroll was performed.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
147 * @param nw Pointer to the scrollbar widget.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
148 * @param x The X coordinate of the mouse click.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
149 * @param y The Y coordinate of the mouse click.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
150 */
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
151 void ScrollbarClickHandler(Window *w, const NWidgetCore *nw, int x, int y)
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
152 {
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
153 int mi, ma;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
154
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
155 switch (nw->type) {
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
156 case WWT_SCROLLBAR:
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
157 /* vertical scroller */
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
158 mi = nw->pos_y;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
159 ma = nw->pos_y + nw->current_y;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
160 break;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
161
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
162 case WWT_SCROLL2BAR:
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
163 /* 2nd vertical scroller */
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
164 mi = nw->pos_y;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
165 ma = nw->pos_y + nw->current_y;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
166 break;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
167
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
168 case WWT_HSCROLLBAR:
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
169 /* horizontal scroller */
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
170 mi = nw->pos_x;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
171 ma = nw->pos_x + nw->current_x;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
172 break;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
173
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
174 default: NOT_REACHED();
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
175 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
176 ScrollbarClickPositioning(w, nw->type, x, y, mi, ma);
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
177 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
178
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
179 /** Returns the index for the widget located at the given position
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
180 * relative to the window. It includes all widget-corner pixels as well.
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
181 * @param *w Window to look inside
6481
85a1a79387a2 (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas <belugas@openttd.org>
parents: 6432
diff changeset
182 * @param x The Window client X coordinate
85a1a79387a2 (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas <belugas@openttd.org>
parents: 6432
diff changeset
183 * @param y The Window client y coordinate
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
184 * @return A widget index, or -1 if no widget was found.
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
185 */
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
186 int GetWidgetFromPos(const Window *w, int x, int y)
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
187 {
13570
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
188 NWidgetCore *nw = w->nested_root->GetWidgetFromPos(x, y);
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
189 return (nw != NULL) ? nw->index : -1;
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
190 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
191
9773
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
192 /**
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
193 * Draw frame rectangle.
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
194 * @param left Left edge of the frame
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
195 * @param top Top edge of the frame
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
196 * @param right Right edge of the frame
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
197 * @param bottom Bottom edge of the frame
11080
02d314ea4f63 (svn r15423) -Codechange: split widget related types to their own header and add a bit of type strictness.
rubidium <rubidium@openttd.org>
parents: 10960
diff changeset
198 * @param colour Colour table to use. @see _colour_gradient
9773
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
199 * @param flags Flags controlling how to draw the frame. @see FrameFlags
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
200 */
11085
8da1855e9f14 (svn r15428) -Codechange: consistently use colour instead of having both color and colour.
rubidium <rubidium@openttd.org>
parents: 11084
diff changeset
201 void DrawFrameRect(int left, int top, int right, int bottom, Colours colour, FrameFlags flags)
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
202 {
11080
02d314ea4f63 (svn r15423) -Codechange: split widget related types to their own header and add a bit of type strictness.
rubidium <rubidium@openttd.org>
parents: 10960
diff changeset
203 uint dark = _colour_gradient[colour][3];
02d314ea4f63 (svn r15423) -Codechange: split widget related types to their own header and add a bit of type strictness.
rubidium <rubidium@openttd.org>
parents: 10960
diff changeset
204 uint medium_dark = _colour_gradient[colour][5];
02d314ea4f63 (svn r15423) -Codechange: split widget related types to their own header and add a bit of type strictness.
rubidium <rubidium@openttd.org>
parents: 10960
diff changeset
205 uint medium_light = _colour_gradient[colour][6];
02d314ea4f63 (svn r15423) -Codechange: split widget related types to their own header and add a bit of type strictness.
rubidium <rubidium@openttd.org>
parents: 10960
diff changeset
206 uint light = _colour_gradient[colour][7];
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
207
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
208 if (flags & FR_TRANSPARENT) {
11085
8da1855e9f14 (svn r15428) -Codechange: consistently use colour instead of having both color and colour.
rubidium <rubidium@openttd.org>
parents: 11084
diff changeset
209 GfxFillRect(left, top, right, bottom, PALETTE_TO_TRANSPARENT, FILLRECT_RECOLOUR);
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
210 } else {
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
211 uint interior;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
212
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
213 if (flags & FR_LOWERED) {
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
214 GfxFillRect(left, top, left, bottom, dark);
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
215 GfxFillRect(left + 1, top, right, top, dark);
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
216 GfxFillRect(right, top + 1, right, bottom - 1, light);
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
217 GfxFillRect(left + 1, bottom, right, bottom, light);
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
218 interior = (flags & FR_DARKENED ? medium_dark : medium_light);
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
219 } else {
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
220 GfxFillRect(left, top, left, bottom - 1, light);
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
221 GfxFillRect(left + 1, top, right - 1, top, light);
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
222 GfxFillRect(right, top, right, bottom - 1, dark);
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
223 GfxFillRect(left, bottom, right, bottom, dark);
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
224 interior = medium_dark;
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
225 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
226 if (!(flags & FR_BORDERONLY)) {
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
227 GfxFillRect(left + 1, top + 1, right - 1, bottom - 1, interior);
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
228 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
229 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
230 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
231
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
232 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
233 * Draw an image button.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
234 * @param r Rectangle of the button.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
235 * @param type Widget type (#WWT_IMGBTN or #WWT_IMGBTN_2).
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
236 * @param colour Colour of the button.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
237 * @param clicked Button is lowered.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
238 * @param img Sprite to draw.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
239 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
240 static inline void DrawImageButtons(const Rect &r, WidgetType type, Colours colour, bool clicked, SpriteID img)
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
241 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
242 assert(img != 0);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
243 DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
244
13514
b70924cfd627 (svn r18033) -Codechange: make the padding for IMGBTN_2 the same as for IMGBTN; the image doesn't move, so the extra space at the right and bottom aren't needed
rubidium <rubidium@openttd.org>
parents: 13509
diff changeset
245 if ((type & WWT_MASK) == WWT_IMGBTN_2 && clicked) img++; // Show different image when clicked for #WWT_IMGBTN_2.
b70924cfd627 (svn r18033) -Codechange: make the padding for IMGBTN_2 the same as for IMGBTN; the image doesn't move, so the extra space at the right and bottom aren't needed
rubidium <rubidium@openttd.org>
parents: 13509
diff changeset
246 DrawSprite(img, PAL_NONE, r.left + WD_IMGBTN_LEFT + clicked, r.top + WD_IMGBTN_TOP + clicked);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
247 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
248
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
249 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
250 * Draw the label-part of a widget.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
251 * @param r Rectangle of the label background.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
252 * @param type Widget type (#WWT_TEXTBTN, #WWT_TEXTBTN_2, or #WWT_LABEL).
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
253 * @param clicked Label is rendered lowered.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
254 * @param str Text to draw.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
255 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
256 static inline void DrawLabel(const Rect &r, WidgetType type, bool clicked, StringID str)
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
257 {
12274
ab8191734216 (svn r16689) -Codechange: Allow for rendering of parameterized text of nested widgets in Window::DrawWidget, adapt intro and town directory windows.
alberth <alberth@openttd.org>
parents: 12255
diff changeset
258 if (str == STR_NULL) return;
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
259 if ((type & WWT_MASK) == WWT_TEXTBTN_2 && clicked) str++;
12710
b9e16dc0471d (svn r17173) -Codechange: Vertically align WWT_TEXT widget, generalize vertical alignment of label and text buttons.
alberth <alberth@openttd.org>
parents: 12708
diff changeset
260 Dimension d = GetStringBoundingBox(str);
b9e16dc0471d (svn r17173) -Codechange: Vertically align WWT_TEXT widget, generalize vertical alignment of label and text buttons.
alberth <alberth@openttd.org>
parents: 12708
diff changeset
261 int offset = max(0, ((int)(r.bottom - r.top + 1) - (int)d.height) / 2); // Offset for rendering the text vertically centered
b9e16dc0471d (svn r17173) -Codechange: Vertically align WWT_TEXT widget, generalize vertical alignment of label and text buttons.
alberth <alberth@openttd.org>
parents: 12708
diff changeset
262 DrawString(r.left + clicked, r.right + clicked, r.top + offset + clicked, str, TC_FROMSTRING, SA_CENTER);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
263 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
264
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
265 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
266 * Draw text.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
267 * @param r Rectangle of the background.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
268 * @param colour Colour of the text.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
269 * @param str Text to draw.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
270 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
271 static inline void DrawText(const Rect &r, TextColour colour, StringID str)
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
272 {
12710
b9e16dc0471d (svn r17173) -Codechange: Vertically align WWT_TEXT widget, generalize vertical alignment of label and text buttons.
alberth <alberth@openttd.org>
parents: 12708
diff changeset
273 Dimension d = GetStringBoundingBox(str);
b9e16dc0471d (svn r17173) -Codechange: Vertically align WWT_TEXT widget, generalize vertical alignment of label and text buttons.
alberth <alberth@openttd.org>
parents: 12708
diff changeset
274 int offset = max(0, ((int)(r.bottom - r.top + 1) - (int)d.height) / 2); // Offset for rendering the text vertically centered
b9e16dc0471d (svn r17173) -Codechange: Vertically align WWT_TEXT widget, generalize vertical alignment of label and text buttons.
alberth <alberth@openttd.org>
parents: 12708
diff changeset
275 if (str != STR_NULL) DrawString(r.left, r.right, r.top + offset, str, colour);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
276 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
277
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
278 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
279 * Draw an inset widget.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
280 * @param r Rectangle of the background.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
281 * @param colour Colour of the inset.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
282 * @param str Text to draw.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
283 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
284 static inline void DrawInset(const Rect &r, Colours colour, StringID str)
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
285 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
286 DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, FR_LOWERED | FR_DARKENED);
12195
ee5c5c8f0557 (svn r16609) -Codechange: Introduction of widget sizes and offsets used while drawing.
alberth <alberth@openttd.org>
parents: 12159
diff changeset
287 if (str != STR_NULL) DrawString(r.left + WD_INSET_LEFT, r.right - WD_INSET_RIGHT, r.top + WD_INSET_TOP, str);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
288 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
289
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
290 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
291 * Draw a matrix widget.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
292 * @param r Rectangle of the matrix background.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
293 * @param colour Colour of the background.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
294 * @param clicked Matrix is rendered lowered.
12409
7243e41fdc5e (svn r16843) -Codechange: More documentation for the WWT_MATRIX widget, and better variable names in matrix rendering function.
alberth <alberth@openttd.org>
parents: 12408
diff changeset
295 * @param data Data of the widget, number of rows and columns of the widget.
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
296 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
297 static inline void DrawMatrix(const Rect &r, Colours colour, bool clicked, uint16 data)
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
298 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
299 DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
300
12411
9fdbb4594b82 (svn r16845) -Codechange: Introduction of constants for describing the bits in a WWT_MATRIX data field.
alberth <alberth@openttd.org>
parents: 12409
diff changeset
301 int num_columns = GB(data, MAT_COL_START, MAT_COL_BITS); // Lower 8 bits of the widget data: Number of columns in the matrix.
12409
7243e41fdc5e (svn r16843) -Codechange: More documentation for the WWT_MATRIX widget, and better variable names in matrix rendering function.
alberth <alberth@openttd.org>
parents: 12408
diff changeset
302 int column_width = (r.right - r.left + 1) / num_columns; // Width of a single column in the matrix.
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
303
12411
9fdbb4594b82 (svn r16845) -Codechange: Introduction of constants for describing the bits in a WWT_MATRIX data field.
alberth <alberth@openttd.org>
parents: 12409
diff changeset
304 int num_rows = GB(data, MAT_ROW_START, MAT_ROW_BITS); // Upper 8 bits of the widget data: Number of rows in the matrix.
12409
7243e41fdc5e (svn r16843) -Codechange: More documentation for the WWT_MATRIX widget, and better variable names in matrix rendering function.
alberth <alberth@openttd.org>
parents: 12408
diff changeset
305 int row_height = (r.bottom - r.top + 1) / num_rows; // Height of a single row in the matrix.
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
306
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
307 int col = _colour_gradient[colour & 0xF][6];
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
308
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
309 int x = r.left;
12409
7243e41fdc5e (svn r16843) -Codechange: More documentation for the WWT_MATRIX widget, and better variable names in matrix rendering function.
alberth <alberth@openttd.org>
parents: 12408
diff changeset
310 for (int ctr = num_columns; ctr > 1; ctr--) {
7243e41fdc5e (svn r16843) -Codechange: More documentation for the WWT_MATRIX widget, and better variable names in matrix rendering function.
alberth <alberth@openttd.org>
parents: 12408
diff changeset
311 x += column_width;
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
312 GfxFillRect(x, r.top + 1, x, r.bottom - 1, col);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
313 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
314
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
315 x = r.top;
12409
7243e41fdc5e (svn r16843) -Codechange: More documentation for the WWT_MATRIX widget, and better variable names in matrix rendering function.
alberth <alberth@openttd.org>
parents: 12408
diff changeset
316 for (int ctr = num_rows; ctr > 1; ctr--) {
7243e41fdc5e (svn r16843) -Codechange: More documentation for the WWT_MATRIX widget, and better variable names in matrix rendering function.
alberth <alberth@openttd.org>
parents: 12408
diff changeset
317 x += row_height;
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
318 GfxFillRect(r.left + 1, x, r.right - 1, x, col);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
319 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
320
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
321 col = _colour_gradient[colour & 0xF][4];
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
322
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
323 x = r.left - 1;
12409
7243e41fdc5e (svn r16843) -Codechange: More documentation for the WWT_MATRIX widget, and better variable names in matrix rendering function.
alberth <alberth@openttd.org>
parents: 12408
diff changeset
324 for (int ctr = num_columns; ctr > 1; ctr--) {
7243e41fdc5e (svn r16843) -Codechange: More documentation for the WWT_MATRIX widget, and better variable names in matrix rendering function.
alberth <alberth@openttd.org>
parents: 12408
diff changeset
325 x += column_width;
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
326 GfxFillRect(x, r.top + 1, x, r.bottom - 1, col);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
327 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
328
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
329 x = r.top - 1;
12409
7243e41fdc5e (svn r16843) -Codechange: More documentation for the WWT_MATRIX widget, and better variable names in matrix rendering function.
alberth <alberth@openttd.org>
parents: 12408
diff changeset
330 for (int ctr = num_rows; ctr > 1; ctr--) {
7243e41fdc5e (svn r16843) -Codechange: More documentation for the WWT_MATRIX widget, and better variable names in matrix rendering function.
alberth <alberth@openttd.org>
parents: 12408
diff changeset
331 x += row_height;
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
332 GfxFillRect(r.left + 1, x, r.right - 1, x, col);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
333 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
334 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
335
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
336 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
337 * Draw a vertical scrollbar.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
338 * @param r Rectangle of the scrollbar widget.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
339 * @param colour Colour of the scrollbar widget.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
340 * @param up_clicked Up-arrow is clicked.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
341 * @param bar_dragged Bar is dragged.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
342 * @param down_clicked Down-arrow is clicked.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
343 * @param scrollbar Scrollbar size, offset, and capacity information.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
344 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
345 static inline void DrawVerticalScrollbar(const Rect &r, Colours colour, bool up_clicked, bool bar_dragged, bool down_clicked, const Scrollbar *scrollbar)
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
346 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
347 /* draw up/down buttons */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
348 DrawFrameRect(r.left, r.top, r.right, r.top + 9, colour, (up_clicked) ? FR_LOWERED : FR_NONE);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
349 DrawString(r.left + up_clicked, r.right + up_clicked, r.top + up_clicked, UPARROW, TC_BLACK, SA_CENTER);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
350
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
351 DrawFrameRect(r.left, r.bottom - 9, r.right, r.bottom, colour, (down_clicked) ? FR_LOWERED : FR_NONE);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
352 DrawString(r.left + down_clicked, r.right + down_clicked, r.bottom - 9 + down_clicked, DOWNARROW, TC_BLACK, SA_CENTER);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
353
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
354 int c1 = _colour_gradient[colour & 0xF][3];
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
355 int c2 = _colour_gradient[colour & 0xF][7];
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
356
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
357 /* draw "shaded" background */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
358 GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
359 GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c1, FILLRECT_CHECKER);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
360
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
361 /* draw shaded lines */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
362 GfxFillRect(r.left + 2, r.top + 10, r.left + 2, r.bottom - 10, c1);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
363 GfxFillRect(r.left + 3, r.top + 10, r.left + 3, r.bottom - 10, c2);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
364 GfxFillRect(r.left + 7, r.top + 10, r.left + 7, r.bottom - 10, c1);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
365 GfxFillRect(r.left + 8, r.top + 10, r.left + 8, r.bottom - 10, c2);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
366
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
367 Point pt = HandleScrollbarHittest(scrollbar, r.top, r.bottom, false);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
368 DrawFrameRect(r.left, pt.x, r.right, pt.y, colour, bar_dragged ? FR_LOWERED : FR_NONE);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
369 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
370
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
371 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
372 * Draw a horizontal scrollbar.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
373 * @param r Rectangle of the scrollbar widget.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
374 * @param colour Colour of the scrollbar widget.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
375 * @param left_clicked Left-arrow is clicked.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
376 * @param bar_dragged Bar is dragged.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
377 * @param right_clicked Right-arrow is clicked.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
378 * @param scrollbar Scrollbar size, offset, and capacity information.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
379 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
380 static inline void DrawHorizontalScrollbar(const Rect &r, Colours colour, bool left_clicked, bool bar_dragged, bool right_clicked, const Scrollbar *scrollbar)
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
381 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
382 DrawFrameRect(r.left, r.top, r.left + 9, r.bottom, colour, left_clicked ? FR_LOWERED : FR_NONE);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
383 DrawSprite(SPR_ARROW_LEFT, PAL_NONE, r.left + 1 + left_clicked, r.top + 1 + left_clicked);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
384
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
385 DrawFrameRect(r.right - 9, r.top, r.right, r.bottom, colour, right_clicked ? FR_LOWERED : FR_NONE);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
386 DrawSprite(SPR_ARROW_RIGHT, PAL_NONE, r.right - 8 + right_clicked, r.top + 1 + right_clicked);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
387
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
388 int c1 = _colour_gradient[colour & 0xF][3];
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
389 int c2 = _colour_gradient[colour & 0xF][7];
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
390
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
391 /* draw "shaded" background */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
392 GfxFillRect(r.left + 10, r.top, r.right - 10, r.bottom, c2);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
393 GfxFillRect(r.left + 10, r.top, r.right - 10, r.bottom, c1, FILLRECT_CHECKER);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
394
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
395 /* draw shaded lines */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
396 GfxFillRect(r.left + 10, r.top + 2, r.right - 10, r.top + 2, c1);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
397 GfxFillRect(r.left + 10, r.top + 3, r.right - 10, r.top + 3, c2);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
398 GfxFillRect(r.left + 10, r.top + 7, r.right - 10, r.top + 7, c1);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
399 GfxFillRect(r.left + 10, r.top + 8, r.right - 10, r.top + 8, c2);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
400
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
401 /* draw actual scrollbar */
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
402 Point pt = HandleScrollbarHittest(scrollbar, r.left, r.right, true);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
403 DrawFrameRect(pt.x, r.top, pt.y, r.bottom, colour, bar_dragged ? FR_LOWERED : FR_NONE);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
404 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
405
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
406 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
407 * Draw a frame widget.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
408 * @param r Rectangle of the frame.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
409 * @param colour Colour of the frame.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
410 * @param str Text of the frame.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
411 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
412 static inline void DrawFrame(const Rect &r, Colours colour, StringID str)
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
413 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
414 int x2 = r.left; // by default the left side is the left side of the widget
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
415
12195
ee5c5c8f0557 (svn r16609) -Codechange: Introduction of widget sizes and offsets used while drawing.
alberth <alberth@openttd.org>
parents: 12159
diff changeset
416 if (str != STR_NULL) x2 = DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top, str);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
417
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
418 int c1 = _colour_gradient[colour][3];
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
419 int c2 = _colour_gradient[colour][7];
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
420
13644
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
421 /* If the frame has text, adjust the top bar to fit half-way through */
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
422 int dy1 = 4;
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
423 if (str != STR_NULL) dy1 = FONT_HEIGHT_NORMAL / 2 - 1;
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
424 int dy2 = dy1 + 1;
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
425
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
426 if (_dynlang.text_dir == TD_LTR) {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
427 /* Line from upper left corner to start of text */
13644
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
428 GfxFillRect(r.left, r.top + dy1, r.left + 4, r.top + dy1, c1);
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
429 GfxFillRect(r.left + 1, r.top + dy2, r.left + 4, r.top + dy2, c2);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
430
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
431 /* Line from end of text to upper right corner */
13644
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
432 GfxFillRect(x2, r.top + dy1, r.right - 1, r.top + dy1, c1);
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
433 GfxFillRect(x2, r.top + dy2, r.right - 2, r.top + dy2, c2);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
434 } else {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
435 /* Line from upper left corner to start of text */
13644
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
436 GfxFillRect(r.left, r.top + dy1, x2 - 2, r.top + dy1, c1);
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
437 GfxFillRect(r.left + 1, r.top + dy2, x2 - 2, r.top + dy2, c2);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
438
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
439 /* Line from end of text to upper right corner */
13644
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
440 GfxFillRect(r.right - 5, r.top + dy1, r.right - 1, r.top + dy1, c1);
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
441 GfxFillRect(r.right - 5, r.top + dy2, r.right - 2, r.top + dy2, c2);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
442 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
443
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
444 /* Line from upper left corner to bottom left corner */
13644
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
445 GfxFillRect(r.left, r.top + dy2, r.left, r.bottom - 1, c1);
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
446 GfxFillRect(r.left + 1, r.top + dy2 + 1, r.left + 1, r.bottom - 2, c2);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
447
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
448 /* Line from upper right corner to bottom right corner */
13644
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
449 GfxFillRect(r.right - 1, r.top + dy2, r.right - 1, r.bottom - 2, c1);
05b6dd4a2a90 (svn r18168) -Codechange: Adjust a frame's child's padding to account for text height, and draw the top bar appropriately.
peter1138 <peter1138@openttd.org>
parents: 13626
diff changeset
450 GfxFillRect(r.right, r.top + dy1, r.right, r.bottom - 1, c2);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
451
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
452 GfxFillRect(r.left + 1, r.bottom - 1, r.right - 1, r.bottom - 1, c1);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
453 GfxFillRect(r.left, r.bottom, r.right, r.bottom, c2);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
454 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
455
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
456 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
457 * Draw a sticky box.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
458 * @param r Rectangle of the box.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
459 * @param colour Colour of the sticky box.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
460 * @param clicked Box is lowered.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
461 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
462 static inline void DrawStickyBox(const Rect &r, Colours colour, bool clicked)
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
463 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
464 DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE);
12373
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
465 DrawSprite((clicked) ? SPR_PIN_UP : SPR_PIN_DOWN, PAL_NONE, r.left + WD_STICKYBOX_LEFT + clicked, r.top + WD_STICKYBOX_TOP + clicked);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
466 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
467
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
468 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
469 * Draw a resize box.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
470 * @param r Rectangle of the box.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
471 * @param colour Colour of the resize box.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
472 * @param at_left Resize box is at left-side of the window,
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
473 * @param clicked Box is lowered.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
474 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
475 static inline void DrawResizeBox(const Rect &r, Colours colour, bool at_left, bool clicked)
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
476 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
477 DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
478 if (at_left) {
12373
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
479 DrawSprite(SPR_WINDOW_RESIZE_LEFT, PAL_NONE, r.left + WD_RESIZEBOX_RIGHT + clicked, r.top + WD_RESIZEBOX_TOP + clicked);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
480 } else {
12373
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
481 DrawSprite(SPR_WINDOW_RESIZE_RIGHT, PAL_NONE, r.left + WD_RESIZEBOX_LEFT + clicked, r.top + WD_RESIZEBOX_TOP + clicked);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
482 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
483 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
484
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
485 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
486 * Draw a close box.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
487 * @param r Rectangle of the box.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
488 * @param colour Colour of the close box.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
489 * @param str Cross to draw (#STR_BLACK_CROSS or #STR_SILVER_CROSS).
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
490 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
491 static inline void DrawCloseBox(const Rect &r, Colours colour, StringID str)
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
492 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
493 assert(str == STR_BLACK_CROSS || str == STR_SILVER_CROSS); // black or silver cross
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
494 DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, FR_NONE);
12373
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
495 DrawString(r.left + WD_CLOSEBOX_LEFT, r.right - WD_CLOSEBOX_RIGHT, r.top + WD_CLOSEBOX_TOP, str, TC_FROMSTRING, SA_CENTER);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
496 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
497
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
498 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
499 * Draw a caption bar.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
500 * @param r Rectangle of the bar.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
501 * @param colour Colour of the window.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
502 * @param owner 'Owner' of the window.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
503 * @param str Text to draw in the bar.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
504 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
505 static inline void DrawCaption(const Rect &r, Colours colour, Owner owner, StringID str)
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
506 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
507 DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, FR_BORDERONLY);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
508 DrawFrameRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, colour, (owner == INVALID_OWNER) ? FR_LOWERED | FR_DARKENED : FR_LOWERED | FR_DARKENED | FR_BORDERONLY);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
509
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
510 if (owner != INVALID_OWNER) {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
511 GfxFillRect(r.left + 2, r.top + 2, r.right - 2, r.bottom - 2, _colour_gradient[_company_colours[owner]][4]);
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
512 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
513
12274
ab8191734216 (svn r16689) -Codechange: Allow for rendering of parameterized text of nested widgets in Window::DrawWidget, adapt intro and town directory windows.
alberth <alberth@openttd.org>
parents: 12255
diff changeset
514 if (str != STR_NULL) DrawString(r.left + WD_CAPTIONTEXT_LEFT, r.right - WD_CAPTIONTEXT_RIGHT, r.top + WD_CAPTIONTEXT_TOP, str, TC_FROMSTRING, SA_CENTER);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
515 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
516
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
517 /**
13664
ce197674184d (svn r18188) -Codechange: s/NWID_BUTTON_DRPDOWN/NWID_BUTTON_DROPDOWN/g
rubidium <rubidium@openttd.org>
parents: 13662
diff changeset
518 * Draw a button with a dropdown (#WWT_DROPDOWN and #NWID_BUTTON_DROPDOWN).
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
519 * @param r Rectangle containing the widget.
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
520 * @param colour Background colour of the widget.
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
521 * @param clicked_button The button-part is lowered.
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
522 * @param clicked_dropdown The drop-down part is lowered.
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
523 * @param str Text of the button.
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
524 *
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
525 * @note Magic constants are also used in #NWidgetLeaf::ButtonHit.
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
526 */
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
527 static inline void DrawButtonDropdown(const Rect &r, Colours colour, bool clicked_button, bool clicked_dropdown, StringID str)
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
528 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
529 if (_dynlang.text_dir == TD_LTR) {
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
530 DrawFrameRect(r.left, r.top, r.right - 12, r.bottom, colour, clicked_button ? FR_LOWERED : FR_NONE);
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
531 DrawFrameRect(r.right - 11, r.top, r.right, r.bottom, colour, clicked_dropdown ? FR_LOWERED : FR_NONE);
13665
d9309c7b84bf (svn r18189) -Codechange: remove some now unneeded strings
rubidium <rubidium@openttd.org>
parents: 13664
diff changeset
532 DrawString(r.right - (clicked_dropdown ? 10 : 11), r.right, r.top + (clicked_dropdown ? 2 : 1), DOWNARROW, TC_BLACK, SA_CENTER);
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
533 if (str != STR_NULL) DrawString(r.left + WD_DROPDOWNTEXT_LEFT + clicked_button, r.right - WD_DROPDOWNTEXT_RIGHT + clicked_button, r.top + WD_DROPDOWNTEXT_TOP + clicked_button, str, TC_BLACK);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
534 } else {
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
535 DrawFrameRect(r.left + 12, r.top, r.right, r.bottom, colour, clicked_button ? FR_LOWERED : FR_NONE);
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
536 DrawFrameRect(r.left, r.top, r.left + 11, r.bottom, colour, clicked_dropdown ? FR_LOWERED : FR_NONE);
13665
d9309c7b84bf (svn r18189) -Codechange: remove some now unneeded strings
rubidium <rubidium@openttd.org>
parents: 13664
diff changeset
537 DrawString(r.left + clicked_dropdown, r.left + 11, r.top + (clicked_dropdown ? 2 : 1), DOWNARROW, TC_BLACK, SA_CENTER);
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
538 if (str != STR_NULL) DrawString(r.left + WD_DROPDOWNTEXT_RIGHT + clicked_button, r.right - WD_DROPDOWNTEXT_LEFT + clicked_button, r.top + WD_DROPDOWNTEXT_TOP + clicked_button, str, TC_BLACK);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
539 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
540 }
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
541
8857
a75a0c683fea (svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium <rubidium@openttd.org>
parents: 8737
diff changeset
542 /**
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
543 * Draw a dropdown #WWT_DROPDOWN widget.
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
544 * @param r Rectangle containing the widget.
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
545 * @param colour Background colour of the widget.
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
546 * @param clicked The widget is lowered.
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
547 * @param str Text of the button.
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
548 */
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
549 static inline void DrawDropdown(const Rect &r, Colours colour, bool clicked, StringID str)
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
550 {
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
551 DrawButtonDropdown(r, colour, false, clicked, str);
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
552 }
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
553
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
554 /**
8857
a75a0c683fea (svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium <rubidium@openttd.org>
parents: 8737
diff changeset
555 * Paint all widgets of a window.
a75a0c683fea (svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium <rubidium@openttd.org>
parents: 8737
diff changeset
556 */
9273
72a6d2e60834 (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium <rubidium@openttd.org>
parents: 9116
diff changeset
557 void Window::DrawWidgets() const
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
558 {
13570
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
559 this->nested_root->Draw(this);
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
560
9273
72a6d2e60834 (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium <rubidium@openttd.org>
parents: 9116
diff changeset
561 if (this->flags4 & WF_WHITE_BORDER_MASK) {
9770
9f72f4a2aee0 (svn r13907) -Codechange: Replace a number with Colours enum on DrawFrameRect usage
belugas <belugas@openttd.org>
parents: 9607
diff changeset
562 DrawFrameRect(0, 0, this->width - 1, this->height - 1, COLOUR_WHITE, FR_BORDERONLY);
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
563 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
564 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
565
10238
12805d675e85 (svn r14466) -Doc: remove some obsolete parameters, fix a few parameter names in comments and add a little more doxygen documentation.
rubidium <rubidium@openttd.org>
parents: 10208
diff changeset
566 /**
12805d675e85 (svn r14466) -Doc: remove some obsolete parameters, fix a few parameter names in comments and add a little more doxygen documentation.
rubidium <rubidium@openttd.org>
parents: 10208
diff changeset
567 * Draw a sort button's up or down arrow symbol.
8349
cbb2e614bcfa (svn r11915) -Codechange: Add a function to draw a sort button's up/down arrow. Arrows are now drawn in a consistent position based on the widget, instead of randomly positioned by pixel.
peter1138 <peter1138@openttd.org>
parents: 8335
diff changeset
568 * @param widget Sort button widget
cbb2e614bcfa (svn r11915) -Codechange: Add a function to draw a sort button's up/down arrow. Arrows are now drawn in a consistent position based on the widget, instead of randomly positioned by pixel.
peter1138 <peter1138@openttd.org>
parents: 8335
diff changeset
569 * @param state State of sort button
cbb2e614bcfa (svn r11915) -Codechange: Add a function to draw a sort button's up/down arrow. Arrows are now drawn in a consistent position based on the widget, instead of randomly positioned by pixel.
peter1138 <peter1138@openttd.org>
parents: 8335
diff changeset
570 */
9273
72a6d2e60834 (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium <rubidium@openttd.org>
parents: 9116
diff changeset
571 void Window::DrawSortButtonState(int widget, SortButtonState state) const
8349
cbb2e614bcfa (svn r11915) -Codechange: Add a function to draw a sort button's up/down arrow. Arrows are now drawn in a consistent position based on the widget, instead of randomly positioned by pixel.
peter1138 <peter1138@openttd.org>
parents: 8335
diff changeset
572 {
cbb2e614bcfa (svn r11915) -Codechange: Add a function to draw a sort button's up/down arrow. Arrows are now drawn in a consistent position based on the widget, instead of randomly positioned by pixel.
peter1138 <peter1138@openttd.org>
parents: 8335
diff changeset
573 if (state == SBS_OFF) return;
cbb2e614bcfa (svn r11915) -Codechange: Add a function to draw a sort button's up/down arrow. Arrows are now drawn in a consistent position based on the widget, instead of randomly positioned by pixel.
peter1138 <peter1138@openttd.org>
parents: 8335
diff changeset
574
13570
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
575 assert(this->nested_array != NULL);
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
576 const NWidgetBase *nwid = this->GetWidget<NWidgetBase>(widget);
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
577
9273
72a6d2e60834 (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium <rubidium@openttd.org>
parents: 9116
diff changeset
578 int offset = this->IsWidgetLowered(widget) ? 1 : 0;
13570
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
579 int base = offset + nwid->pos_x + (_dynlang.text_dir == TD_LTR ? nwid->current_x - WD_SORTBUTTON_ARROW_WIDTH : 0);
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
580 int top = nwid->pos_y;
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
581
12310
a0c352de6782 (svn r16727) -Codechange: Introducing WD_SORTBUTTON_ARROW_WIDTH constant.
alberth <alberth@openttd.org>
parents: 12274
diff changeset
582 DrawString(base, base + WD_SORTBUTTON_ARROW_WIDTH, top + 1 + offset, state == SBS_DOWN ? DOWNARROW : UPARROW, TC_BLACK, SA_CENTER);
8349
cbb2e614bcfa (svn r11915) -Codechange: Add a function to draw a sort button's up/down arrow. Arrows are now drawn in a consistent position based on the widget, instead of randomly positioned by pixel.
peter1138 <peter1138@openttd.org>
parents: 8335
diff changeset
583 }
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
584
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
585
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
586 /**
12708
f1e888f0b9e1 (svn r17171) -Doc: Additions and corrections of various doxygen strings.
alberth <alberth@openttd.org>
parents: 12706
diff changeset
587 * @defgroup NestedWidgets Hierarchical widgets
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
588 * Hierarchical widgets, also known as nested widgets, are widgets stored in a tree. At the leafs of the tree are (mostly) the 'real' widgets
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
589 * visible to the user. At higher levels, widgets get organized in container widgets, until all widgets of the window are merged.
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
590 *
11964
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
591 * \section nestedwidgetkinds Hierarchical widget kinds
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
592 * A leaf widget is one of
11964
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
593 * <ul>
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
594 * <li> #NWidgetLeaf for widgets visible for the user, or
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
595 * <li> #NWidgetSpacer for creating (flexible) empty space between widgets.
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
596 * </ul>
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
597 * The purpose of a leaf widget is to provide interaction with the user by displaying settings, and/or allowing changing the settings.
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
598 *
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
599 * A container widget is one of
11964
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
600 * <ul>
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
601 * <li> #NWidgetHorizontal for organizing child widgets in a (horizontal) row. The row switches order depending on the language setting (thus supporting
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
602 * right-to-left languages),
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
603 * <li> #NWidgetHorizontalLTR for organizing child widgets in a (horizontal) row, always in the same order. All childs below this container will also
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
604 * never swap order.
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
605 * <li> #NWidgetVertical for organizing child widgets underneath each other.
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
606 * <li> #NWidgetBackground for adding a background behind its child widget.
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
607 * <li> #NWidgetStacked for stacking child widgets on top of each other.
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
608 * </ul>
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
609 * The purpose of a container widget is to structure its leafs and sub-containers to allow proper resizing.
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
610 *
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
611 * \section nestedwidgetscomputations Hierarchical widget computations
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
612 * The first 'computation' is the creation of the nested widgets tree by calling the constructors of the widgets listed above and calling \c Add() for every child,
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
613 * or by means of specifying the tree as a collection of nested widgets parts and instantiating the tree from the array.
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
614 *
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
615 * After the creation step,
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
616 * - The leafs have their own minimal size (\e min_x, \e min_y), filling (\e fill_x, \e fill_y), and resize steps (\e resize_x, \e resize_y).
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
617 * - Containers only know what their children are, \e fill_x, \e fill_y, \e resize_x, and \e resize_y are not initialized.
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
618 *
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
619 * Computations in the nested widgets take place as follows:
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
620 * <ol>
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
621 * <li> A bottom-up sweep by recursively calling NWidgetBase::SetupSmallestSize() to initialize the smallest size (\e smallest_x, \e smallest_y) and
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
622 * to propagate filling and resize steps upwards to the root of the tree.
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
623 * <li> A top-down sweep by recursively calling NWidgetBase::AssignSizePosition() with #ST_SMALLEST to make the smallest sizes consistent over
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
624 * the entire tree, and to assign the top-left (\e pos_x, \e pos_y) position of each widget in the tree. This step uses \e fill_x and \e fill_y at each
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
625 * node in the tree to decide how to fill each widget towards consistent sizes. Also the current size (\e current_x and \e current_y) is set.
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
626 * <li> After initializing the smallest size in the widget tree with #ST_SMALLEST, the tree can be resized (the current size modified) by calling
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
627 * NWidgetBase::AssignSizePosition() at the root with #ST_RESIZE and the new size of the window. For proper functioning, the new size should be the smallest
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
628 * size + a whole number of resize steps in both directions (ie you can only resize in steps of length resize_{x,y} from smallest_{x,y}).
11964
9bbab6c40225 (svn r16370) -Doc: Improvements to the nested widgets documentation, added explanation about computations, fixed typo in param description.
alberth <alberth@openttd.org>
parents: 11963
diff changeset
629 * </ol>
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
630 * After the second step, the current size of the widgets are set to the smallest size.
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
631 *
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
632 * To resize, perform the last step with the new window size. This can be done as often as desired.
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
633 * When the smallest size of at least one widget changes, the whole procedure has to be redone from the start.
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
634 *
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
635 * @see NestedWidgetParts
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
636 */
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
637
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
638 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
639 * Base class constructor.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
640 * @param tp Nested widget type.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
641 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
642 NWidgetBase::NWidgetBase(WidgetType tp) : ZeroedMemoryAllocator()
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
643 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
644 this->type = tp;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
645 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
646
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
647 /* ~NWidgetContainer() takes care of #next and #prev data members. */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
648
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
649 /**
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
650 * @fn void NWidgetBase::SetupSmallestSize(Window *w, bool init_array)
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
651 * Compute smallest size needed by the widget.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
652 *
11961
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
653 * The smallest size of a widget is the smallest size that a widget needs to
12323
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
654 * display itself properly. In addition, filling and resizing of the widget are computed.
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
655 * If \a w is not \c NULL, the function calls #Window::UpdateWidgetSize for each leaf widget and
12323
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
656 * background widget without child with a non-negative index.
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
657 *
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
658 * @param w Optional window owning the widget.
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
659 * @param init_array Initialize the \c w->nested_array as well. Should only be set if \a w != NULL.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
660 *
12323
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
661 * @note After the computation, the results can be queried by accessing the #smallest_x and #smallest_y data members of the widget.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
662 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
663
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
664 /**
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
665 * @fn void NWidgetBase::AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl)
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
666 * Assign size and position to the widget.
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
667 * @param sizing Type of resizing to perform.
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
668 * @param x Horizontal offset of the widget relative to the left edge of the window.
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
669 * @param y Vertical offset of the widget relative to the top edge of the window.
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
670 * @param given_width Width allocated to the widget.
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
671 * @param given_height Height allocated to the widget.
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
672 * @param rtl Adapt for right-to-left languages (position contents of horizontal containers backwards).
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
673 *
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
674 * Afterwards, \e pos_x and \e pos_y contain the top-left position of the widget, \e smallest_x and \e smallest_y contain
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
675 * the smallest size such that all widgets of the window are consistent, and \e current_x and \e current_y contain the current size.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
676 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
677
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
678 /**
13072
75bd67594af2 (svn r17572) -Codechange: Use the Window::GetWidget() function to access nested widgets through the nested_array.
alberth <alberth@openttd.org>
parents: 13034
diff changeset
679 * @fn void FillNestedArray(NWidgetBase **array, uint length)
12583
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
680 * Fill the Window::nested_array array with pointers to nested widgets in the tree.
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
681 * @param array Base pointer of the array.
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
682 * @param length Length of the array.
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
683 */
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
684
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
685 /**
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
686 * Store size and position.
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
687 * @param sizing Type of resizing to perform.
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
688 * @param x Horizontal offset of the widget relative to the left edge of the window.
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
689 * @param y Vertical offset of the widget relative to the top edge of the window.
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
690 * @param given_width Width allocated to the widget.
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
691 * @param given_height Height allocated to the widget.
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
692 */
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
693 inline void NWidgetBase::StoreSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height)
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
694 {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
695 this->pos_x = x;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
696 this->pos_y = y;
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
697 if (sizing == ST_SMALLEST) {
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
698 this->smallest_x = given_width;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
699 this->smallest_y = given_height;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
700 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
701 this->current_x = given_width;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
702 this->current_y = given_height;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
703 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
704
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
705 /**
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
706 * @fn void Draw(const Window *w)
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
707 * Draw the widgets of the tree.
12274
ab8191734216 (svn r16689) -Codechange: Allow for rendering of parameterized text of nested widgets in Window::DrawWidget, adapt intro and town directory windows.
alberth <alberth@openttd.org>
parents: 12255
diff changeset
708 * The function calls #Window::DrawWidget for each widget with a non-negative index, after the widget itself is painted.
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
709 * @param w Window that owns the tree.
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
710 */
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
711
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
712 /**
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
713 * Mark the widget as 'dirty' (in need of repaint).
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
714 * @param w Window owning the widget.
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
715 */
13034
6eb3f749890a (svn r17532) -Codechange: Rename several Invalidate functions to SetDirty for more consistency and distinguishability.
frosch <frosch@openttd.org>
parents: 13011
diff changeset
716 void NWidgetBase::SetDirty(const Window *w) const
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
717 {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
718 int abs_left = w->left + this->pos_x;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
719 int abs_top = w->top + this->pos_y;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
720 SetDirtyBlocks(abs_left, abs_top, abs_left + this->current_x, abs_top + this->current_y);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
721 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
722
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
723 /**
12524
b78b7e2cb29f (svn r16961) -Codechange: Moving some methods up in the class hierarchy to avoid code duplication.
alberth <alberth@openttd.org>
parents: 12516
diff changeset
724 * @fn NWidgetCore *NWidgetBase::GetWidgetFromPos(int x, int y)
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
725 * Retrieve a widget by its position.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
726 * @param x Horizontal position relative to the left edge of the window.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
727 * @param y Vertical position relative to the top edge of the window.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
728 * @return Returns the deepest nested widget that covers the given position, or \c NULL if no widget can be found.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
729 */
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
730
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
731 /**
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
732 * Retrieve a widget by its type.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
733 * @param tp Widget type to search for.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
734 * @return Returns the first widget of the specified type, or \c NULL if no widget can be found.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
735 */
12524
b78b7e2cb29f (svn r16961) -Codechange: Moving some methods up in the class hierarchy to avoid code duplication.
alberth <alberth@openttd.org>
parents: 12516
diff changeset
736 NWidgetBase *NWidgetBase::GetWidgetOfType(WidgetType tp)
b78b7e2cb29f (svn r16961) -Codechange: Moving some methods up in the class hierarchy to avoid code duplication.
alberth <alberth@openttd.org>
parents: 12516
diff changeset
737 {
b78b7e2cb29f (svn r16961) -Codechange: Moving some methods up in the class hierarchy to avoid code duplication.
alberth <alberth@openttd.org>
parents: 12516
diff changeset
738 return (this->type == tp) ? this : NULL;
b78b7e2cb29f (svn r16961) -Codechange: Moving some methods up in the class hierarchy to avoid code duplication.
alberth <alberth@openttd.org>
parents: 12516
diff changeset
739 }
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
740
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
741 /**
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
742 * Constructor for resizable nested widgets.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
743 * @param tp Nested widget type.
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
744 * @param fill_x Horizontal fill step size, \c 0 means no filling is allowed.
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
745 * @param fill_y Vertical fill step size, \c 0 means no filling is allowed.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
746 */
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
747 NWidgetResizeBase::NWidgetResizeBase(WidgetType tp, uint fill_x, uint fill_y) : NWidgetBase(tp)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
748 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
749 this->fill_x = fill_x;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
750 this->fill_y = fill_y;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
751 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
752
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
753 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
754 * Set minimal size of the widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
755 * @param min_x Horizontal minimal size of the widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
756 * @param min_y Vertical minimal size of the widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
757 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
758 void NWidgetResizeBase::SetMinimalSize(uint min_x, uint min_y)
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
759 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
760 this->min_x = min_x;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
761 this->min_y = min_y;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
762 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
763
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
764 /**
13614
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
765 * Set minimal text lines for the widget.
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
766 * @param min_lines Number of text lines of the widget.
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
767 * @param spacing Extra spacing (eg WD_FRAMERECT_TOP + _BOTTOM) of the widget.
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
768 * @param size Font size of text.
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
769 */
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
770 void NWidgetResizeBase::SetMinimalTextLines(uint8 min_lines, uint8 spacing, FontSize size)
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
771 {
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
772 this->min_y = min_lines * GetCharacterHeight(size) + spacing;
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
773 }
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
774
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
775 /**
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
776 * Set the filling of the widget from initial size.
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
777 * @param fill_x Horizontal fill step size, \c 0 means no filling is allowed.
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
778 * @param fill_y Vertical fill step size, \c 0 means no filling is allowed.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
779 */
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
780 void NWidgetResizeBase::SetFill(uint fill_x, uint fill_y)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
781 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
782 this->fill_x = fill_x;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
783 this->fill_y = fill_y;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
784 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
785
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
786 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
787 * Set resize step of the widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
788 * @param resize_x Resize step in horizontal direction, value \c 0 means no resize, otherwise the step size in pixels.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
789 * @param resize_y Resize step in vertical direction, value \c 0 means no resize, otherwise the step size in pixels.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
790 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
791 void NWidgetResizeBase::SetResize(uint resize_x, uint resize_y)
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
792 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
793 this->resize_x = resize_x;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
794 this->resize_y = resize_y;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
795 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
796
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
797 void NWidgetResizeBase::AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
798 {
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
799 StoreSizePosition(sizing, x, y, given_width, given_height);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
800 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
801
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
802 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
803 * Initialization of a 'real' widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
804 * @param tp Type of the widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
805 * @param colour Colour of the widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
806 * @param fill_x Default horizontal filling.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
807 * @param fill_y Default vertical filling.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
808 * @param widget_data Data component of the widget. @see Widget::data
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
809 * @param tool_tip Tool tip of the widget. @see Widget::tootips
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
810 */
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
811 NWidgetCore::NWidgetCore(WidgetType tp, Colours colour, uint fill_x, uint fill_y, uint16 widget_data, StringID tool_tip) : NWidgetResizeBase(tp, fill_x, fill_y)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
812 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
813 this->colour = colour;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
814 this->index = -1;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
815 this->widget_data = widget_data;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
816 this->tool_tip = tool_tip;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
817 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
818
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
819 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
820 * Set index of the nested widget in the widget array.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
821 * @param index Index to use.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
822 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
823 void NWidgetCore::SetIndex(int index)
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
824 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
825 assert(index >= 0);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
826 this->index = index;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
827 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
828
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
829 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
830 * Set data and tool tip of the nested widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
831 * @param widget_data Data to use.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
832 * @param tool_tip Tool tip string to use.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
833 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
834 void NWidgetCore::SetDataTip(uint16 widget_data, StringID tool_tip)
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
835 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
836 this->widget_data = widget_data;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
837 this->tool_tip = tool_tip;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
838 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
839
13072
75bd67594af2 (svn r17572) -Codechange: Use the Window::GetWidget() function to access nested widgets through the nested_array.
alberth <alberth@openttd.org>
parents: 13034
diff changeset
840 void NWidgetCore::FillNestedArray(NWidgetBase **array, uint length)
12583
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
841 {
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
842 if (this->index >= 0 && (uint)(this->index) < length) array[this->index] = this;
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
843 }
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
844
12524
b78b7e2cb29f (svn r16961) -Codechange: Moving some methods up in the class hierarchy to avoid code duplication.
alberth <alberth@openttd.org>
parents: 12516
diff changeset
845 NWidgetCore *NWidgetCore::GetWidgetFromPos(int x, int y)
b78b7e2cb29f (svn r16961) -Codechange: Moving some methods up in the class hierarchy to avoid code duplication.
alberth <alberth@openttd.org>
parents: 12516
diff changeset
846 {
b78b7e2cb29f (svn r16961) -Codechange: Moving some methods up in the class hierarchy to avoid code duplication.
alberth <alberth@openttd.org>
parents: 12516
diff changeset
847 return (IsInsideBS(x, this->pos_x, this->current_x) && IsInsideBS(y, this->pos_y, this->current_y)) ? this : NULL;
b78b7e2cb29f (svn r16961) -Codechange: Moving some methods up in the class hierarchy to avoid code duplication.
alberth <alberth@openttd.org>
parents: 12516
diff changeset
848 }
b78b7e2cb29f (svn r16961) -Codechange: Moving some methods up in the class hierarchy to avoid code duplication.
alberth <alberth@openttd.org>
parents: 12516
diff changeset
849
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
850 /**
13747
1bc53910de7f (svn r18272) -Codechange: make FindScrollbar a const function
rubidium <rubidium@openttd.org>
parents: 13742
diff changeset
851 * @fn Scrollbar *NWidgetCore::FindScrollbar(Window *w, bool allow_next = true) const
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
852 * Find the scrollbar of the widget through the Window::nested_array.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
853 * @param w Window containing the widgets and the scrollbar,
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
854 * @param allow_next Search may be extended to the next widget.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
855 *
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
856 * @todo This implementation uses the constraint that a scrollbar must be the next item in the #Window::nested_array, and the scrollbar
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
857 * data is stored in the #Window structure (#Window::vscroll, #Window::vscroll2, and #Window::hscroll).
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
858 * Alternative light-weight implementations may be considered, eg by sub-classing a canvas-like widget, and/or by having
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
859 * an explicit link between the scrollbar and the widget being scrolled.
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
860 */
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
861
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
862 /**
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
863 * Constructor container baseclass.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
864 * @param tp Type of the container.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
865 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
866 NWidgetContainer::NWidgetContainer(WidgetType tp) : NWidgetBase(tp)
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
867 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
868 this->head = NULL;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
869 this->tail = NULL;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
870 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
871
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
872 NWidgetContainer::~NWidgetContainer()
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
873 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
874 while (this->head != NULL) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
875 NWidgetBase *wid = this->head->next;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
876 delete this->head;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
877 this->head = wid;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
878 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
879 this->tail = NULL;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
880 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
881
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
882 NWidgetBase *NWidgetContainer::GetWidgetOfType(WidgetType tp)
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
883 {
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
884 if (this->type == tp) return this;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
885 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
886 NWidgetBase *nwid = child_wid->GetWidgetOfType(tp);
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
887 if (nwid != NULL) return nwid;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
888 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
889 return NULL;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
890 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
891
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
892 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
893 * Append widget \a wid to container.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
894 * @param wid Widget to append.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
895 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
896 void NWidgetContainer::Add(NWidgetBase *wid)
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
897 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
898 assert(wid->next == NULL && wid->prev == NULL);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
899
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
900 if (this->head == NULL) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
901 this->head = wid;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
902 this->tail = wid;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
903 } else {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
904 assert(this->tail != NULL);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
905 assert(this->tail->next == NULL);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
906
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
907 this->tail->next = wid;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
908 wid->prev = this->tail;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
909 this->tail = wid;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
910 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
911 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
912
13072
75bd67594af2 (svn r17572) -Codechange: Use the Window::GetWidget() function to access nested widgets through the nested_array.
alberth <alberth@openttd.org>
parents: 13034
diff changeset
913 void NWidgetContainer::FillNestedArray(NWidgetBase **array, uint length)
12583
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
914 {
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
915 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
916 child_wid->FillNestedArray(array, length);
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
917 }
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
918 }
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
919
11528
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
920 /**
11966
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
921 * Return the biggest possible size of a nested widget.
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
922 * @param base Base size of the widget.
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
923 * @param max_space Available space for the widget.
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
924 * @param step Stepsize of the widget.
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
925 * @return Biggest possible size of the widget, assuming that \a base may only be incremented by \a step size steps.
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
926 */
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
927 static inline uint ComputeMaxSize(uint base, uint max_space, uint step)
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
928 {
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
929 if (base >= max_space || step == 0) return base;
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
930 if (step == 1) return max_space;
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
931 int increment = max_space - base;
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
932 increment -= increment % step;
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
933 return base + increment;
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
934 }
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
935
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
936 /**
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
937 * Widgets stacked on top of each other.
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
938 */
13565
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
939 NWidgetStacked::NWidgetStacked() : NWidgetContainer(NWID_SELECTION)
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
940 {
13073
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
941 this->index = -1;
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
942 }
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
943
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
944 void NWidgetStacked::SetIndex(int index)
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
945 {
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
946 this->index = index;
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
947 }
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
948
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
949 void NWidgetStacked::SetupSmallestSize(Window *w, bool init_array)
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
950 {
13074
c6408d5b9f99 (svn r17574) -Fix (r17573): Insert NWID_SELECTION in nested_array when appropriate.
alberth <alberth@openttd.org>
parents: 13073
diff changeset
951 if (this->index >= 0 && init_array) { // Fill w->nested_array[]
c6408d5b9f99 (svn r17574) -Fix (r17573): Insert NWID_SELECTION in nested_array when appropriate.
alberth <alberth@openttd.org>
parents: 13073
diff changeset
952 assert(w->nested_array_size > (uint)this->index);
c6408d5b9f99 (svn r17574) -Fix (r17573): Insert NWID_SELECTION in nested_array when appropriate.
alberth <alberth@openttd.org>
parents: 13073
diff changeset
953 w->nested_array[this->index] = this;
c6408d5b9f99 (svn r17574) -Fix (r17573): Insert NWID_SELECTION in nested_array when appropriate.
alberth <alberth@openttd.org>
parents: 13073
diff changeset
954 }
c6408d5b9f99 (svn r17574) -Fix (r17573): Insert NWID_SELECTION in nested_array when appropriate.
alberth <alberth@openttd.org>
parents: 13073
diff changeset
955
13246
6ed0d462f914 (svn r17755) -Codechange: Allow for a zero-size display plane in a NWidgetStacked widget to hide its child widgets.
alberth <alberth@openttd.org>
parents: 13186
diff changeset
956 /* Zero size plane selected */
6ed0d462f914 (svn r17755) -Codechange: Allow for a zero-size display plane in a NWidgetStacked widget to hide its child widgets.
alberth <alberth@openttd.org>
parents: 13186
diff changeset
957 if (this->shown_plane == STACKED_SELECTION_ZERO_SIZE) {
13339
78083f48ac84 (svn r17848) -Codechange: allow overriding (some) settings of STACKED_SELECTION_ZERO_SIZE widgets via UpdateWidgetSize
rubidium <rubidium@openttd.org>
parents: 13246
diff changeset
958 Dimension size = {0, 0};
13705
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
959 Dimension padding = {0, 0};
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
960 Dimension fill = {0, 0};
13339
78083f48ac84 (svn r17848) -Codechange: allow overriding (some) settings of STACKED_SELECTION_ZERO_SIZE widgets via UpdateWidgetSize
rubidium <rubidium@openttd.org>
parents: 13246
diff changeset
961 Dimension resize = {0, 0};
78083f48ac84 (svn r17848) -Codechange: allow overriding (some) settings of STACKED_SELECTION_ZERO_SIZE widgets via UpdateWidgetSize
rubidium <rubidium@openttd.org>
parents: 13246
diff changeset
962 /* Here we're primarily interested in the value of resize */
13705
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
963 w->UpdateWidgetSize(this->index, &size, padding, &fill, &resize);
13339
78083f48ac84 (svn r17848) -Codechange: allow overriding (some) settings of STACKED_SELECTION_ZERO_SIZE widgets via UpdateWidgetSize
rubidium <rubidium@openttd.org>
parents: 13246
diff changeset
964
78083f48ac84 (svn r17848) -Codechange: allow overriding (some) settings of STACKED_SELECTION_ZERO_SIZE widgets via UpdateWidgetSize
rubidium <rubidium@openttd.org>
parents: 13246
diff changeset
965 this->smallest_x = size.width;
78083f48ac84 (svn r17848) -Codechange: allow overriding (some) settings of STACKED_SELECTION_ZERO_SIZE widgets via UpdateWidgetSize
rubidium <rubidium@openttd.org>
parents: 13246
diff changeset
966 this->smallest_y = size.height;
13705
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
967 this->fill_x = fill.width;
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
968 this->fill_y = fill.height;
13339
78083f48ac84 (svn r17848) -Codechange: allow overriding (some) settings of STACKED_SELECTION_ZERO_SIZE widgets via UpdateWidgetSize
rubidium <rubidium@openttd.org>
parents: 13246
diff changeset
969 this->resize_x = resize.width;
78083f48ac84 (svn r17848) -Codechange: allow overriding (some) settings of STACKED_SELECTION_ZERO_SIZE widgets via UpdateWidgetSize
rubidium <rubidium@openttd.org>
parents: 13246
diff changeset
970 this->resize_y = resize.height;
13246
6ed0d462f914 (svn r17755) -Codechange: Allow for a zero-size display plane in a NWidgetStacked widget to hide its child widgets.
alberth <alberth@openttd.org>
parents: 13186
diff changeset
971 return;
6ed0d462f914 (svn r17755) -Codechange: Allow for a zero-size display plane in a NWidgetStacked widget to hide its child widgets.
alberth <alberth@openttd.org>
parents: 13186
diff changeset
972 }
6ed0d462f914 (svn r17755) -Codechange: Allow for a zero-size display plane in a NWidgetStacked widget to hide its child widgets.
alberth <alberth@openttd.org>
parents: 13186
diff changeset
973
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
974 /* First sweep, recurse down and compute minimal size and filling. */
11961
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
975 this->smallest_x = 0;
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
976 this->smallest_y = 0;
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
977 this->fill_x = (this->head != NULL) ? 1 : 0;
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
978 this->fill_y = (this->head != NULL) ? 1 : 0;
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
979 this->resize_x = (this->head != NULL) ? 1 : 0;
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
980 this->resize_y = (this->head != NULL) ? 1 : 0;
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
981 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
982 child_wid->SetupSmallestSize(w, init_array);
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
983
11961
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
984 this->smallest_x = max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right);
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
985 this->smallest_y = max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom);
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
986 this->fill_x = LeastCommonMultiple(this->fill_x, child_wid->fill_x);
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
987 this->fill_y = LeastCommonMultiple(this->fill_y, child_wid->fill_y);
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
988 this->resize_x = LeastCommonMultiple(this->resize_x, child_wid->resize_x);
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
989 this->resize_y = LeastCommonMultiple(this->resize_y, child_wid->resize_y);
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
990 }
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
991 }
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
992
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
993 void NWidgetStacked::AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl)
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
994 {
11961
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
995 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
996 StoreSizePosition(sizing, x, y, given_width, given_height);
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
997
13246
6ed0d462f914 (svn r17755) -Codechange: Allow for a zero-size display plane in a NWidgetStacked widget to hide its child widgets.
alberth <alberth@openttd.org>
parents: 13186
diff changeset
998 if (this->shown_plane == STACKED_SELECTION_ZERO_SIZE) return;
6ed0d462f914 (svn r17755) -Codechange: Allow for a zero-size display plane in a NWidgetStacked widget to hide its child widgets.
alberth <alberth@openttd.org>
parents: 13186
diff changeset
999
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1000 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
13685
ac56dd84488d (svn r18210) -Codechange: Child widgets always get the entire space in perpendicular direction of the container.
alberth <alberth@openttd.org>
parents: 13676
diff changeset
1001 uint hor_step = (sizing == ST_SMALLEST) ? 1 : child_wid->GetHorizontalStepSize(sizing);
11966
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
1002 uint child_width = ComputeMaxSize(child_wid->smallest_x, given_width - child_wid->padding_left - child_wid->padding_right, hor_step);
13685
ac56dd84488d (svn r18210) -Codechange: Child widgets always get the entire space in perpendicular direction of the container.
alberth <alberth@openttd.org>
parents: 13676
diff changeset
1003 uint child_pos_x = (rtl ? child_wid->padding_right : child_wid->padding_left);
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1004
13685
ac56dd84488d (svn r18210) -Codechange: Child widgets always get the entire space in perpendicular direction of the container.
alberth <alberth@openttd.org>
parents: 13676
diff changeset
1005 uint vert_step = (sizing == ST_SMALLEST) ? 1 : child_wid->GetVerticalStepSize(sizing);
11966
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
1006 uint child_height = ComputeMaxSize(child_wid->smallest_y, given_height - child_wid->padding_top - child_wid->padding_bottom, vert_step);
13685
ac56dd84488d (svn r18210) -Codechange: Child widgets always get the entire space in perpendicular direction of the container.
alberth <alberth@openttd.org>
parents: 13676
diff changeset
1007 uint child_pos_y = child_wid->padding_top;
11966
de771cbe234d (svn r16372) -Codechange: Simplify size calculations with a few helper functions.
alberth <alberth@openttd.org>
parents: 11965
diff changeset
1008
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1009 child_wid->AssignSizePosition(sizing, x + child_pos_x, y + child_pos_y, child_width, child_height, rtl);
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1010 }
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1011 }
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1012
13073
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1013 void NWidgetStacked::FillNestedArray(NWidgetBase **array, uint length)
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1014 {
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1015 if (this->index >= 0 && (uint)(this->index) < length) array[this->index] = this;
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1016 NWidgetContainer::FillNestedArray(array, length);
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1017 }
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1018
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1019 void NWidgetStacked::Draw(const Window *w)
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1020 {
13246
6ed0d462f914 (svn r17755) -Codechange: Allow for a zero-size display plane in a NWidgetStacked widget to hide its child widgets.
alberth <alberth@openttd.org>
parents: 13186
diff changeset
1021 if (this->shown_plane == STACKED_SELECTION_ZERO_SIZE) return;
6ed0d462f914 (svn r17755) -Codechange: Allow for a zero-size display plane in a NWidgetStacked widget to hide its child widgets.
alberth <alberth@openttd.org>
parents: 13186
diff changeset
1022
13565
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
1023 int plane = 0;
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
1024 for (NWidgetBase *child_wid = this->head; child_wid != NULL; plane++, child_wid = child_wid->next) {
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
1025 if (plane == this->shown_plane) {
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
1026 child_wid->Draw(w);
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
1027 return;
13073
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1028 }
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1029 }
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1030
13565
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
1031 NOT_REACHED();
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1032 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1033
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1034 NWidgetCore *NWidgetStacked::GetWidgetFromPos(int x, int y)
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1035 {
13246
6ed0d462f914 (svn r17755) -Codechange: Allow for a zero-size display plane in a NWidgetStacked widget to hide its child widgets.
alberth <alberth@openttd.org>
parents: 13186
diff changeset
1036 if (this->shown_plane == STACKED_SELECTION_ZERO_SIZE) return NULL;
6ed0d462f914 (svn r17755) -Codechange: Allow for a zero-size display plane in a NWidgetStacked widget to hide its child widgets.
alberth <alberth@openttd.org>
parents: 13186
diff changeset
1037
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1038 if (!IsInsideBS(x, this->pos_x, this->current_x) || !IsInsideBS(y, this->pos_y, this->current_y)) return NULL;
13073
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1039 int plane = 0;
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1040 for (NWidgetBase *child_wid = this->head; child_wid != NULL; plane++, child_wid = child_wid->next) {
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1041 if (plane == this->shown_plane) {
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1042 return child_wid->GetWidgetFromPos(x, y);
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1043 }
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1044 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1045 return NULL;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1046 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1047
13073
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1048 /** Select which plane to show (for #NWID_SELECTION only).
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1049 * @param plane Plane number to display.
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1050 */
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1051 void NWidgetStacked::SetDisplayedPlane(int plane)
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1052 {
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1053 this->shown_plane = plane;
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1054 }
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
1055
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1056 NWidgetPIPContainer::NWidgetPIPContainer(WidgetType tp, NWidContainerFlags flags) : NWidgetContainer(tp)
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1057 {
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1058 this->flags = flags;
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1059 }
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1060
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1061 /**
11528
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1062 * Set additional pre/inter/post space for the container.
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1063 *
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1064 * @param pip_pre Additional space in front of the first child widget (above
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1065 * for the vertical container, at the left for the horizontal container).
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1066 * @param pip_inter Additional space between two child widgets.
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1067 * @param pip_post Additional space after the last child widget (below for the
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1068 * vertical container, at the right for the horizontal container).
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1069 */
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1070 void NWidgetPIPContainer::SetPIP(uint8 pip_pre, uint8 pip_inter, uint8 pip_post)
11528
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1071 {
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1072 this->pip_pre = pip_pre;
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1073 this->pip_inter = pip_inter;
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1074 this->pip_post = pip_post;
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1075 }
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1076
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1077 void NWidgetPIPContainer::Draw(const Window *w)
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1078 {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1079 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1080 child_wid->Draw(w);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1081 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1082 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1083
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1084 NWidgetCore *NWidgetPIPContainer::GetWidgetFromPos(int x, int y)
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1085 {
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1086 if (!IsInsideBS(x, this->pos_x, this->current_x) || !IsInsideBS(y, this->pos_y, this->current_y)) return NULL;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1087
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1088 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1089 NWidgetCore *nwid = child_wid->GetWidgetFromPos(x, y);
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1090 if (nwid != NULL) return nwid;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1091 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1092 return NULL;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1093 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1094
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
1095 /** Horizontal container widget. */
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1096 NWidgetHorizontal::NWidgetHorizontal(NWidContainerFlags flags) : NWidgetPIPContainer(NWID_HORIZONTAL, flags)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1097 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1098 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1099
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1100 void NWidgetHorizontal::SetupSmallestSize(Window *w, bool init_array)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1101 {
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1102 this->smallest_x = 0; // Sum of minimal size of all childs.
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1103 this->smallest_y = 0; // Biggest child.
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1104 this->fill_x = 0; // smallest non-zero child widget fill step.
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1105 this->fill_y = 1; // smallest common child fill step.
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1106 this->resize_x = 0; // smallest non-zero child widget resize step.
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1107 this->resize_y = 1; // smallest common child resize step.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1108
13707
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1109 /* 1a. Forward call, collect biggest nested array index, and longest/widest child length. */
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1110 uint longest = 0; // Longest child found.
13707
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1111 uint max_vert_fill = 0; // Biggest vertical fill step.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1112 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1113 child_wid->SetupSmallestSize(w, init_array);
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1114 longest = max(longest, child_wid->smallest_x);
13707
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1115 max_vert_fill = max(max_vert_fill, child_wid->GetVerticalStepSize(ST_SMALLEST));
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1116 this->smallest_y = max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom);
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1117 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1118 /* 1b. Make the container higher if needed to accomadate all childs nicely. */
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1119 uint max_smallest = this->smallest_y + 3 * max_vert_fill; // Upper limit to computing smallest height.
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1120 uint cur_height = this->smallest_y;
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1121 while (true) {
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1122 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1123 uint step_size = child_wid->GetVerticalStepSize(ST_SMALLEST);
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1124 uint child_height = child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom;
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1125 if (step_size > 1 && child_height < cur_height) { // Small step sizes or already fitting childs are not interesting.
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1126 uint remainder = (cur_height - child_height) % step_size;
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1127 if (remainder > 0) { // Child did not fit entirely, widen the container.
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1128 cur_height += step_size - remainder;
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1129 assert(cur_height < max_smallest); // Safeguard against infinite height expansion.
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1130 /* Remaining childs will adapt to the new cur_height, thus speeding up the computation. */
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1131 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1132 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1133 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1134 if (this->smallest_y == cur_height) break;
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1135 this->smallest_y = cur_height; // Smallest height got changed, try again.
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1136 }
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1137 /* 2. For containers that must maintain equal width, extend child minimal size. */
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1138 if (this->flags & NC_EQUALSIZE) {
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1139 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1140 if (child_wid->fill_x == 1) child_wid->smallest_x = longest;
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1141 }
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1142 }
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1143 /* 3. Move PIP space to the childs, compute smallest, fill, and resize values of the container. */
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1144 if (this->head != NULL) this->head->padding_left += this->pip_pre;
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1145 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
11511
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1146 if (child_wid->next != NULL) {
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1147 child_wid->padding_right += this->pip_inter;
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1148 } else {
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1149 child_wid->padding_right += this->pip_post;
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1150 }
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1151
11961
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
1152 this->smallest_x += child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right;
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1153 if (child_wid->fill_x > 0) {
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1154 if (this->fill_x == 0 || this->fill_x > child_wid->fill_x) this->fill_x = child_wid->fill_x;
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1155 }
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1156 this->fill_y = LeastCommonMultiple(this->fill_y, child_wid->fill_y);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1157
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1158 if (child_wid->resize_x > 0) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1159 if (this->resize_x == 0 || this->resize_x > child_wid->resize_x) this->resize_x = child_wid->resize_x;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1160 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1161 this->resize_y = LeastCommonMultiple(this->resize_y, child_wid->resize_y);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1162 }
11511
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1163 /* We need to zero the PIP settings so we can re-initialize the tree. */
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1164 this->pip_pre = this->pip_inter = this->pip_post = 0;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1165 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1166
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1167 void NWidgetHorizontal::AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1168 {
11961
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
1169 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1170
11961
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
1171 uint additional_length = given_width - this->smallest_x; // Additional width given to us.
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1172 StoreSizePosition(sizing, x, y, given_width, given_height);
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1173
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1174 /* In principle, the additional horizontal space is distributed evenly over the available resizable childs. Due to step sizes, this may not always be feasible.
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1175 * To make resizing work as good as possible, first childs with biggest step sizes are done. These may get less due to rounding down.
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1176 * This additional space is then given to childs with smaller step sizes. This will give a good result when resize steps of each child is a multiple
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1177 * of the child with the smallest non-zero stepsize.
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1178 *
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1179 * Since child sizes are computed out of order, positions cannot be calculated until all sizes are known. That means it is not possible to compute the child
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1180 * size and position, and directly call child->AssignSizePosition() with the computed values.
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1181 * Instead, computed child widths and heights are stored in child->current_x and child->current_y values. That is allowed, since this method overwrites those values
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1182 * then we call the child.
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1183 */
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1184
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1185 /* First loop: Find biggest stepsize, find number of childs that want a piece of the pie, handle vertical size for all childs, handle horizontal size for non-resizing childs. */
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1186 int num_changing_childs = 0; // Number of childs that can change size.
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1187 uint biggest_stepsize = 0;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1188 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1189 uint hor_step = child_wid->GetHorizontalStepSize(sizing);
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1190 if (hor_step > 0) {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1191 num_changing_childs++;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1192 biggest_stepsize = max(biggest_stepsize, hor_step);
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1193 } else {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1194 child_wid->current_x = child_wid->smallest_x;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1195 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1196
13685
ac56dd84488d (svn r18210) -Codechange: Child widgets always get the entire space in perpendicular direction of the container.
alberth <alberth@openttd.org>
parents: 13676
diff changeset
1197 uint vert_step = (sizing == ST_SMALLEST) ? 1 : child_wid->GetVerticalStepSize(sizing);
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1198 child_wid->current_y = ComputeMaxSize(child_wid->smallest_y, given_height - child_wid->padding_top - child_wid->padding_bottom, vert_step);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1199 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1200
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1201 /* Second loop: Allocate the additional horizontal space over the resizing childs, starting with the biggest resize steps. */
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1202 while (biggest_stepsize > 0) {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1203 uint next_biggest_stepsize = 0;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1204 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1205 uint hor_step = child_wid->GetHorizontalStepSize(sizing);
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1206 if (hor_step > biggest_stepsize) continue; // Already done
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1207 if (hor_step == biggest_stepsize) {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1208 uint increment = additional_length / num_changing_childs;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1209 num_changing_childs--;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1210 if (hor_step > 1) increment -= increment % hor_step;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1211 child_wid->current_x = child_wid->smallest_x + increment;
12117
aecfa01ba5fb (svn r16530) -Fix [FS#2964], (r16501): Deduct additional widget length given away to a child from the total (Hirundo).
alberth <alberth@openttd.org>
parents: 12102
diff changeset
1212 additional_length -= increment;
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1213 continue;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1214 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1215 next_biggest_stepsize = max(next_biggest_stepsize, hor_step);
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1216 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1217 biggest_stepsize = next_biggest_stepsize;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1218 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1219 assert(num_changing_childs == 0);
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1220
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1221 /* Third loop: Compute position and call the child. */
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1222 uint position = 0; // Place to put next child relative to origin of the container.
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1223 NWidgetBase *child_wid = rtl ? this->tail : this->head;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1224 while (child_wid != NULL) {
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1225 uint child_width = child_wid->current_x;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1226 uint child_x = x + position + (rtl ? child_wid->padding_right : child_wid->padding_left);
13685
ac56dd84488d (svn r18210) -Codechange: Child widgets always get the entire space in perpendicular direction of the container.
alberth <alberth@openttd.org>
parents: 13676
diff changeset
1227 uint child_y = y + child_wid->padding_top;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1228
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1229 child_wid->AssignSizePosition(sizing, child_x, child_y, child_width, child_wid->current_y, rtl);
11511
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1230 position += child_width + child_wid->padding_right + child_wid->padding_left;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1231
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1232 child_wid = rtl ? child_wid->prev : child_wid->next;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1233 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1234 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1235
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
1236 /** Horizontal left-to-right container widget. */
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1237 NWidgetHorizontalLTR::NWidgetHorizontalLTR(NWidContainerFlags flags) : NWidgetHorizontal(flags)
11500
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
1238 {
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
1239 this->type = NWID_HORIZONTAL_LTR;
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
1240 }
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
1241
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1242 void NWidgetHorizontalLTR::AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl)
11500
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
1243 {
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1244 NWidgetHorizontal::AssignSizePosition(sizing, x, y, given_width, given_height, false);
11500
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
1245 }
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
1246
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
1247 /** Vertical container widget. */
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1248 NWidgetVertical::NWidgetVertical(NWidContainerFlags flags) : NWidgetPIPContainer(NWID_VERTICAL, flags)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1249 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1250 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1251
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1252 void NWidgetVertical::SetupSmallestSize(Window *w, bool init_array)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1253 {
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1254 this->smallest_x = 0; // Biggest child.
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1255 this->smallest_y = 0; // Sum of minimal size of all childs.
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1256 this->fill_x = 1; // smallest common child fill step.
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1257 this->fill_y = 0; // smallest non-zero child widget fill step.
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1258 this->resize_x = 1; // smallest common child resize step.
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1259 this->resize_y = 0; // smallest non-zero child widget resize step.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1260
13707
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1261 /* 1a. Forward call, collect biggest nested array index, and longest/widest child length. */
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1262 uint highest = 0; // Highest child found.
13707
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1263 uint max_hor_fill = 0; // Biggest horizontal fill step.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1264 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1265 child_wid->SetupSmallestSize(w, init_array);
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1266 highest = max(highest, child_wid->smallest_y);
13707
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1267 max_hor_fill = max(max_hor_fill, child_wid->GetHorizontalStepSize(ST_SMALLEST));
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1268 this->smallest_x = max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right);
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1269 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1270 /* 1b. Make the container wider if needed to accomadate all childs nicely. */
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1271 uint max_smallest = this->smallest_x + 3 * max_hor_fill; // Upper limit to computing smallest height.
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1272 uint cur_width = this->smallest_x;
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1273 while (true) {
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1274 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1275 uint step_size = child_wid->GetHorizontalStepSize(ST_SMALLEST);
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1276 uint child_width = child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right;
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1277 if (step_size > 1 && child_width < cur_width) { // Small step sizes or already fitting childs are not interesting.
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1278 uint remainder = (cur_width - child_width) % step_size;
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1279 if (remainder > 0) { // Child did not fit entirely, widen the container.
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1280 cur_width += step_size - remainder;
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1281 assert(cur_width < max_smallest); // Safeguard against infinite width expansion.
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1282 /* Remaining childs will adapt to the new cur_width, thus speeding up the computation. */
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1283 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1284 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1285 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1286 if (this->smallest_x == cur_width) break;
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1287 this->smallest_x = cur_width; // Smallest width got changed, try again.
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1288 }
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1289 /* 2. For containers that must maintain equal width, extend child minimal size. */
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1290 if (this->flags & NC_EQUALSIZE) {
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1291 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1292 if (child_wid->fill_y == 1) child_wid->smallest_y = highest;
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1293 }
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1294 }
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1295 /* 3. Move PIP space to the childs, compute smallest, fill, and resize values of the container. */
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1296 if (this->head != NULL) this->head->padding_top += this->pip_pre;
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1297 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
11511
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1298 if (child_wid->next != NULL) {
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1299 child_wid->padding_bottom += this->pip_inter;
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1300 } else {
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1301 child_wid->padding_bottom += this->pip_post;
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1302 }
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1303
11961
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
1304 this->smallest_y += child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom;
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1305 if (child_wid->fill_y > 0) {
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1306 if (this->fill_y == 0 || this->fill_y > child_wid->fill_y) this->fill_y = child_wid->fill_y;
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1307 }
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1308 this->fill_x = LeastCommonMultiple(this->fill_x, child_wid->fill_x);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1309
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1310 if (child_wid->resize_y > 0) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1311 if (this->resize_y == 0 || this->resize_y > child_wid->resize_y) this->resize_y = child_wid->resize_y;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1312 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1313 this->resize_x = LeastCommonMultiple(this->resize_x, child_wid->resize_x);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1314 }
11511
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1315 /* We need to zero the PIP settings so we can re-initialize the tree. */
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1316 this->pip_pre = this->pip_inter = this->pip_post = 0;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1317 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1318
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1319 void NWidgetVertical::AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1320 {
11961
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
1321 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1322
11961
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
1323 int additional_length = given_height - this->smallest_y; // Additional height given to us.
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1324 StoreSizePosition(sizing, x, y, given_width, given_height);
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1325
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1326 /* Like the horizontal container, the vertical container also distributes additional height evenly, starting with the childs with the biggest resize steps.
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1327 * It also stores computed widths and heights into current_x and current_y values of the child.
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1328 */
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1329
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1330 /* First loop: Find biggest stepsize, find number of childs that want a piece of the pie, handle horizontal size for all childs, handle vertical size for non-resizing childs. */
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1331 int num_changing_childs = 0; // Number of childs that can change size.
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1332 uint biggest_stepsize = 0;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1333 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1334 uint vert_step = child_wid->GetVerticalStepSize(sizing);
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1335 if (vert_step > 0) {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1336 num_changing_childs++;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1337 biggest_stepsize = max(biggest_stepsize, vert_step);
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1338 } else {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1339 child_wid->current_y = child_wid->smallest_y;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1340 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1341
13685
ac56dd84488d (svn r18210) -Codechange: Child widgets always get the entire space in perpendicular direction of the container.
alberth <alberth@openttd.org>
parents: 13676
diff changeset
1342 uint hor_step = (sizing == ST_SMALLEST) ? 1 : child_wid->GetHorizontalStepSize(sizing);
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1343 child_wid->current_x = ComputeMaxSize(child_wid->smallest_x, given_width - child_wid->padding_left - child_wid->padding_right, hor_step);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1344 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1345
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1346 /* Second loop: Allocate the additional vertical space over the resizing childs, starting with the biggest resize steps. */
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1347 while (biggest_stepsize > 0) {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1348 uint next_biggest_stepsize = 0;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1349 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1350 uint vert_step = child_wid->GetVerticalStepSize(sizing);
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1351 if (vert_step > biggest_stepsize) continue; // Already done
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1352 if (vert_step == biggest_stepsize) {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1353 uint increment = additional_length / num_changing_childs;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1354 num_changing_childs--;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1355 if (vert_step > 1) increment -= increment % vert_step;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1356 child_wid->current_y = child_wid->smallest_y + increment;
12117
aecfa01ba5fb (svn r16530) -Fix [FS#2964], (r16501): Deduct additional widget length given away to a child from the total (Hirundo).
alberth <alberth@openttd.org>
parents: 12102
diff changeset
1357 additional_length -= increment;
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1358 continue;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1359 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1360 next_biggest_stepsize = max(next_biggest_stepsize, vert_step);
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1361 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1362 biggest_stepsize = next_biggest_stepsize;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1363 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1364 assert(num_changing_childs == 0);
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1365
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1366 /* Third loop: Compute position and call the child. */
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1367 uint position = 0; // Place to put next child relative to origin of the container.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1368 for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
13685
ac56dd84488d (svn r18210) -Codechange: Child widgets always get the entire space in perpendicular direction of the container.
alberth <alberth@openttd.org>
parents: 13676
diff changeset
1369 uint child_x = x + (rtl ? child_wid->padding_right : child_wid->padding_left);
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1370 uint child_height = child_wid->current_y;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1371
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1372 child_wid->AssignSizePosition(sizing, child_x, y + position + child_wid->padding_top, child_wid->current_x, child_height, rtl);
11511
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1373 position += child_height + child_wid->padding_top + child_wid->padding_bottom;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1374 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1375 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1376
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1377 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1378 * Generic spacer widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1379 * @param length Horizontal size of the spacer widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1380 * @param height Vertical size of the spacer widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1381 */
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1382 NWidgetSpacer::NWidgetSpacer(int length, int height) : NWidgetResizeBase(NWID_SPACER, 0, 0)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1383 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1384 this->SetMinimalSize(length, height);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1385 this->SetResize(0, 0);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1386 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1387
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1388 void NWidgetSpacer::SetupSmallestSize(Window *w, bool init_array)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1389 {
11961
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
1390 this->smallest_x = this->min_x;
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
1391 this->smallest_y = this->min_y;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1392 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1393
13072
75bd67594af2 (svn r17572) -Codechange: Use the Window::GetWidget() function to access nested widgets through the nested_array.
alberth <alberth@openttd.org>
parents: 13034
diff changeset
1394 void NWidgetSpacer::FillNestedArray(NWidgetBase **array, uint length)
12583
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
1395 {
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
1396 }
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
1397
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1398 void NWidgetSpacer::Draw(const Window *w)
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1399 {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1400 /* Spacer widget is never visible. */
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1401 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1402
13034
6eb3f749890a (svn r17532) -Codechange: Rename several Invalidate functions to SetDirty for more consistency and distinguishability.
frosch <frosch@openttd.org>
parents: 13011
diff changeset
1403 void NWidgetSpacer::SetDirty(const Window *w) const
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1404 {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1405 /* Spacer widget never need repainting. */
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1406 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1407
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1408 NWidgetCore *NWidgetSpacer::GetWidgetFromPos(int x, int y)
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1409 {
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1410 return NULL;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1411 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1412
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1413 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1414 * Constructor parent nested widgets.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1415 * @param tp Type of parent widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1416 * @param colour Colour of the parent widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1417 * @param index Index in the widget array used by the window system.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1418 * @param child Child container widget (if supplied). If not supplied, a
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1419 * vertical container will be inserted while adding the first
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1420 * child widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1421 */
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1422 NWidgetBackground::NWidgetBackground(WidgetType tp, Colours colour, int index, NWidgetPIPContainer *child) : NWidgetCore(tp, colour, 1, 1, 0x0, STR_NULL)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1423 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1424 assert(tp == WWT_PANEL || tp == WWT_INSET || tp == WWT_FRAME);
13698
3e426534b3bf (svn r18223) -Codechange: remove the requirement of having an index for background widgets
rubidium <rubidium@openttd.org>
parents: 13687
diff changeset
1425 if (index >= 0) this->SetIndex(index);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1426 this->child = child;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1427 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1428
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1429 NWidgetBackground::~NWidgetBackground()
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1430 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1431 if (this->child != NULL) delete this->child;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1432 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1433
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1434 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1435 * Add a child to the parent.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1436 * @param nwid Nested widget to add to the background widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1437 *
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1438 * Unless a child container has been given in the constructor, a parent behaves as a vertical container.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1439 * You can add several childs to it, and they are put underneath each other.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1440 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1441 void NWidgetBackground::Add(NWidgetBase *nwid)
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1442 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1443 if (this->child == NULL) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1444 this->child = new NWidgetVertical();
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1445 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1446 this->child->Add(nwid);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1447 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1448
11528
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1449 /**
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1450 * Set additional pre/inter/post space for the background widget.
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1451 *
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1452 * @param pip_pre Additional space in front of the first child widget (above
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1453 * for the vertical container, at the left for the horizontal container).
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1454 * @param pip_inter Additional space between two child widgets.
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1455 * @param pip_post Additional space after the last child widget (below for the
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1456 * vertical container, at the right for the horizontal container).
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1457 * @note Using this function implies that the widget has (or will have) child widgets.
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1458 */
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1459 void NWidgetBackground::SetPIP(uint8 pip_pre, uint8 pip_inter, uint8 pip_post)
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1460 {
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1461 if (this->child == NULL) {
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1462 this->child = new NWidgetVertical();
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1463 }
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1464 this->child->SetPIP(pip_pre, pip_inter, pip_post);
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1465 }
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1466
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1467 void NWidgetBackground::SetupSmallestSize(Window *w, bool init_array)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1468 {
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1469 if (init_array && this->index >= 0) {
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1470 assert(w->nested_array_size > (uint)this->index);
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1471 w->nested_array[this->index] = this;
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1472 }
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1473 if (this->child != NULL) {
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1474 this->child->SetupSmallestSize(w, init_array);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1475
11961
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
1476 this->smallest_x = this->child->smallest_x;
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
1477 this->smallest_y = this->child->smallest_y;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1478 this->fill_x = this->child->fill_x;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1479 this->fill_y = this->child->fill_y;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1480 this->resize_x = this->child->resize_x;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1481 this->resize_y = this->child->resize_y;
13543
2896c84f76d7 (svn r18065) -Codechange/Fix: account for the text in WWT_FRAMEs when determining the minimum width
rubidium <rubidium@openttd.org>
parents: 13542
diff changeset
1482
2896c84f76d7 (svn r18065) -Codechange/Fix: account for the text in WWT_FRAMEs when determining the minimum width
rubidium <rubidium@openttd.org>
parents: 13542
diff changeset
1483 /* Account for the size of the frame's text if that exists */
2896c84f76d7 (svn r18065) -Codechange/Fix: account for the text in WWT_FRAMEs when determining the minimum width
rubidium <rubidium@openttd.org>
parents: 13542
diff changeset
1484 if (w != NULL && this->type == WWT_FRAME) {
13670
2e7ff39e2ec6 (svn r18195) -Codechange: move the child padding calculation/handling to WWT_FRAME
rubidium <rubidium@openttd.org>
parents: 13665
diff changeset
1485 this->child->padding_left = WD_FRAMETEXT_LEFT;
2e7ff39e2ec6 (svn r18195) -Codechange: move the child padding calculation/handling to WWT_FRAME
rubidium <rubidium@openttd.org>
parents: 13665
diff changeset
1486 this->child->padding_right = WD_FRAMETEXT_RIGHT;
2e7ff39e2ec6 (svn r18195) -Codechange: move the child padding calculation/handling to WWT_FRAME
rubidium <rubidium@openttd.org>
parents: 13665
diff changeset
1487 this->child->padding_top = max((int)WD_FRAMETEXT_TOP, this->widget_data != STR_NULL ? FONT_HEIGHT_NORMAL + WD_FRAMETEXT_TOP / 2 : 0);
2e7ff39e2ec6 (svn r18195) -Codechange: move the child padding calculation/handling to WWT_FRAME
rubidium <rubidium@openttd.org>
parents: 13665
diff changeset
1488 this->child->padding_bottom = WD_FRAMETEXT_BOTTOM;
2e7ff39e2ec6 (svn r18195) -Codechange: move the child padding calculation/handling to WWT_FRAME
rubidium <rubidium@openttd.org>
parents: 13665
diff changeset
1489
2e7ff39e2ec6 (svn r18195) -Codechange: move the child padding calculation/handling to WWT_FRAME
rubidium <rubidium@openttd.org>
parents: 13665
diff changeset
1490 this->smallest_x += this->child->padding_left + this->child->padding_right;
2e7ff39e2ec6 (svn r18195) -Codechange: move the child padding calculation/handling to WWT_FRAME
rubidium <rubidium@openttd.org>
parents: 13665
diff changeset
1491 this->smallest_y += this->child->padding_top + this->child->padding_bottom;
2e7ff39e2ec6 (svn r18195) -Codechange: move the child padding calculation/handling to WWT_FRAME
rubidium <rubidium@openttd.org>
parents: 13665
diff changeset
1492
13543
2896c84f76d7 (svn r18065) -Codechange/Fix: account for the text in WWT_FRAMEs when determining the minimum width
rubidium <rubidium@openttd.org>
parents: 13542
diff changeset
1493 if (this->index >= 0) w->SetStringParameters(this->index);
2896c84f76d7 (svn r18065) -Codechange/Fix: account for the text in WWT_FRAMEs when determining the minimum width
rubidium <rubidium@openttd.org>
parents: 13542
diff changeset
1494 this->smallest_x = max(this->smallest_x, GetStringBoundingBox(this->widget_data).width + WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT);
2896c84f76d7 (svn r18065) -Codechange/Fix: account for the text in WWT_FRAMEs when determining the minimum width
rubidium <rubidium@openttd.org>
parents: 13542
diff changeset
1495 }
11961
69a41fde01e1 (svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.
alberth <alberth@openttd.org>
parents: 11836
diff changeset
1496 } else {
12323
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
1497 Dimension d = {this->min_x, this->min_y};
13705
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
1498 Dimension fill = {this->fill_x, this->fill_y};
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1499 Dimension resize = {this->resize_x, this->resize_y};
12323
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
1500 if (w != NULL) { // A non-NULL window pointer acts as switch to turn dynamic widget size on.
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1501 if (this->type == WWT_FRAME || this->type == WWT_INSET) {
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1502 if (this->index >= 0) w->SetStringParameters(this->index);
13543
2896c84f76d7 (svn r18065) -Codechange/Fix: account for the text in WWT_FRAMEs when determining the minimum width
rubidium <rubidium@openttd.org>
parents: 13542
diff changeset
1503 Dimension background = GetStringBoundingBox(this->widget_data);
2896c84f76d7 (svn r18065) -Codechange/Fix: account for the text in WWT_FRAMEs when determining the minimum width
rubidium <rubidium@openttd.org>
parents: 13542
diff changeset
1504 background.width += (this->type == WWT_FRAME) ? (WD_FRAMETEXT_LEFT + WD_FRAMERECT_RIGHT) : (WD_INSET_LEFT + WD_INSET_RIGHT);
2896c84f76d7 (svn r18065) -Codechange/Fix: account for the text in WWT_FRAMEs when determining the minimum width
rubidium <rubidium@openttd.org>
parents: 13542
diff changeset
1505 d = maxdim(d, background);
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1506 }
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1507 if (this->index >= 0) {
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1508 static const Dimension padding = {0, 0};
13705
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
1509 w->UpdateWidgetSize(this->index, &d, padding, &fill, &resize);
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1510 }
12323
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
1511 }
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
1512 this->smallest_x = d.width;
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
1513 this->smallest_y = d.height;
13705
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
1514 this->fill_x = fill.width;
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
1515 this->fill_y = fill.height;
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1516 this->resize_x = resize.width;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1517 this->resize_y = resize.height;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1518 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1519 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1520
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1521 void NWidgetBackground::AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1522 {
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1523 StoreSizePosition(sizing, x, y, given_width, given_height);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1524
11511
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1525 if (this->child != NULL) {
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1526 uint x_offset = (rtl ? this->child->padding_right : this->child->padding_left);
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1527 uint width = given_width - this->child->padding_right - this->child->padding_left;
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1528 uint height = given_height - this->child->padding_top - this->child->padding_bottom;
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1529 this->child->AssignSizePosition(sizing, x + x_offset, y + this->child->padding_top, width, height, rtl);
11511
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1530 }
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1531 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1532
13072
75bd67594af2 (svn r17572) -Codechange: Use the Window::GetWidget() function to access nested widgets through the nested_array.
alberth <alberth@openttd.org>
parents: 13034
diff changeset
1533 void NWidgetBackground::FillNestedArray(NWidgetBase **array, uint length)
12583
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
1534 {
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
1535 if (this->index >= 0 && (uint)(this->index) < length) array[this->index] = this;
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
1536 if (this->child != NULL) this->child->FillNestedArray(array, length);
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
1537 }
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
1538
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1539 void NWidgetBackground::Draw(const Window *w)
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1540 {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1541 if (this->current_x == 0 || this->current_y == 0) return;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1542
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1543 Rect r;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1544 r.left = this->pos_x;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1545 r.right = this->pos_x + this->current_x - 1;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1546 r.top = this->pos_y;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1547 r.bottom = this->pos_y + this->current_y - 1;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1548
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1549 const DrawPixelInfo *dpi = _cur_dpi;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1550 if (dpi->left > r.right || dpi->left + dpi->width <= r.left || dpi->top > r.bottom || dpi->top + dpi->height <= r.top) return;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1551
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1552 switch (this->type) {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1553 case WWT_PANEL:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1554 assert(this->widget_data == 0);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1555 DrawFrameRect(r.left, r.top, r.right, r.bottom, this->colour, this->IsLowered() ? FR_LOWERED : FR_NONE);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1556 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1557
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1558 case WWT_FRAME:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1559 if (this->index >= 0) w->SetStringParameters(this->index);
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1560 DrawFrame(r, this->colour, this->widget_data);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1561 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1562
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1563 case WWT_INSET:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1564 if (this->index >= 0) w->SetStringParameters(this->index);
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1565 DrawInset(r, this->colour, this->widget_data);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1566 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1567
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1568 default:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1569 NOT_REACHED();
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1570 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1571
12896
04374f6dcdc8 (svn r17388) -Codechange: Paint the background of background widgets before painting its children.
alberth <alberth@openttd.org>
parents: 12884
diff changeset
1572 if (this->index >= 0) w->DrawWidget(r, this->index);
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1573 if (this->child != NULL) this->child->Draw(w);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1574
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1575 if (this->IsDisabled()) {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1576 GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, _colour_gradient[this->colour & 0xF][2], FILLRECT_CHECKER);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1577 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1578 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1579
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1580 NWidgetCore *NWidgetBackground::GetWidgetFromPos(int x, int y)
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1581 {
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1582 NWidgetCore *nwid = NULL;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1583 if (IsInsideBS(x, this->pos_x, this->current_x) && IsInsideBS(y, this->pos_y, this->current_y)) {
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1584 if (this->child != NULL) nwid = this->child->GetWidgetFromPos(x, y);
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1585 if (nwid == NULL) nwid = this;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1586 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1587 return nwid;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1588 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1589
13747
1bc53910de7f (svn r18272) -Codechange: make FindScrollbar a const function
rubidium <rubidium@openttd.org>
parents: 13742
diff changeset
1590 Scrollbar *NWidgetBackground::FindScrollbar(Window *w, bool allow_next) const
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1591 {
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1592 if (this->index > 0 && allow_next && this->child == NULL && (uint)(this->index) + 1 < w->nested_array_size) {
13747
1bc53910de7f (svn r18272) -Codechange: make FindScrollbar a const function
rubidium <rubidium@openttd.org>
parents: 13742
diff changeset
1593 const NWidgetCore *next_wid = w->GetWidget<NWidgetCore>(this->index + 1);
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1594 if (next_wid != NULL) return next_wid->FindScrollbar(w, false);
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1595 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1596 return NULL;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1597 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1598
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1599 NWidgetBase *NWidgetBackground::GetWidgetOfType(WidgetType tp)
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1600 {
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1601 NWidgetBase *nwid = NULL;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1602 if (this->child != NULL) nwid = this->child->GetWidgetOfType(tp);
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1603 if (nwid == NULL && this->type == tp) nwid = this;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1604 return nwid;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1605 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
1606
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1607 NWidgetViewport::NWidgetViewport(int index) : NWidgetCore(NWID_VIEWPORT, INVALID_COLOUR, 1, 1, 0x0, STR_NULL)
12526
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1608 {
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1609 this->SetIndex(index);
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1610 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1611
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1612 void NWidgetViewport::SetupSmallestSize(Window *w, bool init_array)
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1613 {
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1614 if (init_array && this->index >= 0) {
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1615 assert(w->nested_array_size > (uint)this->index);
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1616 w->nested_array[this->index] = this;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1617 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1618 this->smallest_x = this->min_x;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1619 this->smallest_y = this->min_y;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1620 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1621
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1622 void NWidgetViewport::Draw(const Window *w)
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1623 {
12897
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1624 if (this->disp_flags & ND_NO_TRANSPARENCY) {
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1625 TransparencyOptionBits to_backup = _transparency_opt;
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1626 _transparency_opt = 0; // Disable all transparency
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1627 w->DrawViewport();
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1628 _transparency_opt = to_backup;
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1629 } else {
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1630 w->DrawViewport();
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1631 }
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1632
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1633 /* Optionally shade the viewport. */
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1634 if (this->disp_flags & (ND_SHADE_GREY | ND_SHADE_DIMMED)) {
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1635 GfxFillRect(this->pos_x, this->pos_y, this->pos_x + this->current_x - 1, this->pos_y + this->current_y - 1,
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1636 (this->disp_flags & ND_SHADE_DIMMED) ? PALETTE_TO_TRANSPARENT : PALETTE_TO_STRUCT_GREY, FILLRECT_RECOLOUR);
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1637 }
12526
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1638 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1639
13747
1bc53910de7f (svn r18272) -Codechange: make FindScrollbar a const function
rubidium <rubidium@openttd.org>
parents: 13742
diff changeset
1640 Scrollbar *NWidgetViewport::FindScrollbar(Window *w, bool allow_next) const
12526
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1641 {
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1642 return NULL;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1643 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1644
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1645 /**
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1646 * Initialize the viewport of the window.
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1647 * @param w Window owning the viewport.
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1648 * @param follow_flags Type of viewport, see #InitializeViewport().
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1649 * @param zoom Zoom level.
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1650 */
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1651 void NWidgetViewport::InitializeViewport(Window *w, uint32 follow_flags, ZoomLevel zoom)
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1652 {
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1653 InitializeWindowViewport(w, this->pos_x, this->pos_y, this->current_x, this->current_y, follow_flags, zoom);
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1654 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1655
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1656 /**
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1657 * Update the position and size of the viewport (after eg a resize).
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1658 * @param w Window owning the viewport.
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1659 */
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1660 void NWidgetViewport::UpdateViewportCoordinates(Window *w)
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1661 {
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1662 ViewPort *vp = w->viewport;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1663 if (vp != NULL) {
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1664 vp->left = w->left + this->pos_x;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1665 vp->top = w->top + this->pos_y;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1666 vp->width = this->current_x;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1667 vp->height = this->current_y;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1668
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1669 vp->virtual_width = ScaleByZoom(vp->width, vp->zoom);
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1670 vp->virtual_height = ScaleByZoom(vp->height, vp->zoom);
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1671 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1672 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1673
12373
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1674 /** Reset the cached dimensions. */
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1675 /* static */ void NWidgetLeaf::InvalidateDimensionCache()
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1676 {
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1677 stickybox_dimension.width = stickybox_dimension.height = 0;
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1678 resizebox_dimension.width = resizebox_dimension.height = 0;
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1679 closebox_dimension.width = closebox_dimension.height = 0;
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1680 }
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1681
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1682 Dimension NWidgetLeaf::stickybox_dimension = {0, 0};
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1683 Dimension NWidgetLeaf::resizebox_dimension = {0, 0};
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1684 Dimension NWidgetLeaf::closebox_dimension = {0, 0};
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1685
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1686 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1687 * Nested leaf widget.
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
1688 * @param tp Type of leaf widget.
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
1689 * @param colour Colour of the leaf widget.
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
1690 * @param index Index in the widget array used by the window system.
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
1691 * @param data Data of the widget.
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
1692 * @param tip Tooltip of the widget.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1693 */
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1694 NWidgetLeaf::NWidgetLeaf(WidgetType tp, Colours colour, int index, uint16 data, StringID tip) : NWidgetCore(tp, colour, 1, 1, data, tip)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1695 {
13742
a0aa80f5d2d2 (svn r18267) -Codechange: make the music window big font aware
rubidium <rubidium@openttd.org>
parents: 13707
diff changeset
1696 assert(index >= 0 || tp == WWT_LABEL || tp == WWT_TEXT);
a0aa80f5d2d2 (svn r18267) -Codechange: make the music window big font aware
rubidium <rubidium@openttd.org>
parents: 13707
diff changeset
1697 if (index >= 0) this->SetIndex(index);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1698 this->SetMinimalSize(0, 0);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1699 this->SetResize(0, 0);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1700
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1701 switch (tp) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1702 case WWT_EMPTY:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1703 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1704
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1705 case WWT_PUSHBTN:
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1706 this->SetFill(0, 0);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1707 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1708
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1709 case WWT_IMGBTN:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1710 case WWT_PUSHIMGBTN:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1711 case WWT_IMGBTN_2:
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1712 this->SetFill(0, 0);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1713 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1714
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1715 case WWT_TEXTBTN:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1716 case WWT_PUSHTXTBTN:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1717 case WWT_TEXTBTN_2:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1718 case WWT_LABEL:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1719 case WWT_TEXT:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1720 case WWT_MATRIX:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1721 case WWT_EDITBOX:
13664
ce197674184d (svn r18188) -Codechange: s/NWID_BUTTON_DRPDOWN/NWID_BUTTON_DROPDOWN/g
rubidium <rubidium@openttd.org>
parents: 13662
diff changeset
1722 case NWID_BUTTON_DROPDOWN:
13662
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1723 case NWID_BUTTON_ARROW:
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1724 this->SetFill(0, 0);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1725 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1726
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1727 case WWT_SCROLLBAR:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1728 case WWT_SCROLL2BAR:
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1729 this->SetFill(0, 1);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1730 this->SetResize(0, 1);
12195
ee5c5c8f0557 (svn r16609) -Codechange: Introduction of widget sizes and offsets used while drawing.
alberth <alberth@openttd.org>
parents: 12159
diff changeset
1731 this->min_x = WD_VSCROLLBAR_WIDTH;
11730
a39da1e4c1f5 (svn r16118) -Change/cleanup: remove the hexadecimal 'in TTD the string had this ID' from 'some' strings and replace the string name with something more sensible.
rubidium <rubidium@openttd.org>
parents: 11528
diff changeset
1732 this->SetDataTip(0x0, STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1733 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1734
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1735 case WWT_CAPTION:
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1736 this->SetFill(1, 0);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1737 this->SetResize(1, 0);
12195
ee5c5c8f0557 (svn r16609) -Codechange: Introduction of widget sizes and offsets used while drawing.
alberth <alberth@openttd.org>
parents: 12159
diff changeset
1738 this->min_y = WD_CAPTION_HEIGHT;
11730
a39da1e4c1f5 (svn r16118) -Change/cleanup: remove the hexadecimal 'in TTD the string had this ID' from 'some' strings and replace the string name with something more sensible.
rubidium <rubidium@openttd.org>
parents: 11528
diff changeset
1739 this->SetDataTip(data, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1740 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1741
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1742 case WWT_HSCROLLBAR:
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1743 this->SetFill(1, 0);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1744 this->SetResize(1, 0);
12195
ee5c5c8f0557 (svn r16609) -Codechange: Introduction of widget sizes and offsets used while drawing.
alberth <alberth@openttd.org>
parents: 12159
diff changeset
1745 this->min_y = WD_HSCROLLBAR_HEIGHT;
11730
a39da1e4c1f5 (svn r16118) -Change/cleanup: remove the hexadecimal 'in TTD the string had this ID' from 'some' strings and replace the string name with something more sensible.
rubidium <rubidium@openttd.org>
parents: 11528
diff changeset
1746 this->SetDataTip(0x0, STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1747 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1748
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1749 case WWT_STICKYBOX:
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1750 this->SetFill(0, 0);
12373
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1751 this->SetMinimalSize(WD_STICKYBOX_WIDTH, 14);
12632
e41943276802 (svn r17075) -Codechange: rename ~750 strings to be more uniform with their relatives
rubidium <rubidium@openttd.org>
parents: 12583
diff changeset
1752 this->SetDataTip(STR_NULL, STR_TOOLTIP_STICKY);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1753 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1754
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1755 case WWT_RESIZEBOX:
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1756 this->SetFill(0, 0);
12373
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1757 this->SetMinimalSize(WD_RESIZEBOX_WIDTH, 12);
12632
e41943276802 (svn r17075) -Codechange: rename ~750 strings to be more uniform with their relatives
rubidium <rubidium@openttd.org>
parents: 12583
diff changeset
1758 this->SetDataTip(STR_NULL, STR_TOOLTIP_RESIZE);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1759 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1760
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1761 case WWT_CLOSEBOX:
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1762 this->SetFill(0, 0);
12195
ee5c5c8f0557 (svn r16609) -Codechange: Introduction of widget sizes and offsets used while drawing.
alberth <alberth@openttd.org>
parents: 12159
diff changeset
1763 this->SetMinimalSize(WD_CLOSEBOX_WIDTH, 14);
11730
a39da1e4c1f5 (svn r16118) -Change/cleanup: remove the hexadecimal 'in TTD the string had this ID' from 'some' strings and replace the string name with something more sensible.
rubidium <rubidium@openttd.org>
parents: 11528
diff changeset
1764 this->SetDataTip(STR_BLACK_CROSS, STR_TOOLTIP_CLOSE_WINDOW);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1765 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1766
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1767 case WWT_DROPDOWN:
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1768 this->SetFill(0, 0);
12195
ee5c5c8f0557 (svn r16609) -Codechange: Introduction of widget sizes and offsets used while drawing.
alberth <alberth@openttd.org>
parents: 12159
diff changeset
1769 this->min_y = WD_DROPDOWN_HEIGHT;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1770 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1771
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1772 default:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1773 NOT_REACHED();
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1774 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1775 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1776
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1777 void NWidgetLeaf::SetupSmallestSize(Window *w, bool init_array)
12323
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
1778 {
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1779 if (w == NULL) { // Conversion to widget array.
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1780 this->smallest_x = this->min_x;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1781 this->smallest_y = this->min_y;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1782 /* All other data is already at the right place. */
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1783 return;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1784 }
12373
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1785
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1786 if (this->index >= 0 && init_array) { // Fill w->nested_array[]
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1787 assert(w->nested_array_size > (uint)this->index);
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1788 w->nested_array[this->index] = this;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1789 }
12323
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
1790
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1791 /* A non-NULL window pointer acts as switch to turn dynamic widget sizing on. */
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1792 Dimension size = {this->min_x, this->min_y};
13705
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
1793 Dimension fill = {this->fill_x, this->fill_y};
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1794 Dimension resize = {this->resize_x, this->resize_y};
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1795 /* Get padding, and update size with the real content size if appropriate. */
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1796 const Dimension *padding = NULL;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1797 switch (this->type) {
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1798 case WWT_EMPTY:
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1799 case WWT_SCROLLBAR:
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1800 case WWT_SCROLL2BAR:
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1801 case WWT_HSCROLLBAR: {
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1802 static const Dimension extra = {0, 0};
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1803 padding = &extra;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1804 break;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1805 }
12577
7d27f0e5a0cd (svn r17017) -Fix (r17008): Setup padding for WWT_MATRIX.
alberth <alberth@openttd.org>
parents: 12526
diff changeset
1806 case WWT_MATRIX: {
7d27f0e5a0cd (svn r17017) -Fix (r17008): Setup padding for WWT_MATRIX.
alberth <alberth@openttd.org>
parents: 12526
diff changeset
1807 static const Dimension extra = {WD_MATRIX_LEFT + WD_MATRIX_RIGHT, WD_MATRIX_TOP + WD_MATRIX_BOTTOM};
7d27f0e5a0cd (svn r17017) -Fix (r17008): Setup padding for WWT_MATRIX.
alberth <alberth@openttd.org>
parents: 12526
diff changeset
1808 padding = &extra;
7d27f0e5a0cd (svn r17017) -Fix (r17008): Setup padding for WWT_MATRIX.
alberth <alberth@openttd.org>
parents: 12526
diff changeset
1809 break;
7d27f0e5a0cd (svn r17017) -Fix (r17008): Setup padding for WWT_MATRIX.
alberth <alberth@openttd.org>
parents: 12526
diff changeset
1810 }
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1811 case WWT_STICKYBOX: {
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1812 static const Dimension extra = {WD_STICKYBOX_LEFT + WD_STICKYBOX_RIGHT, WD_STICKYBOX_TOP + WD_STICKYBOX_BOTTOM};
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1813 padding = &extra;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1814 if (NWidgetLeaf::stickybox_dimension.width == 0) {
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1815 NWidgetLeaf::stickybox_dimension = maxdim(GetSpriteSize(SPR_PIN_UP), GetSpriteSize(SPR_PIN_DOWN));
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1816 NWidgetLeaf::stickybox_dimension.width += extra.width;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1817 NWidgetLeaf::stickybox_dimension.height += extra.height;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1818 }
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1819 size = maxdim(size, NWidgetLeaf::stickybox_dimension);
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1820 break;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1821 }
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1822 case WWT_RESIZEBOX: {
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1823 static const Dimension extra = {WD_RESIZEBOX_LEFT + WD_RESIZEBOX_RIGHT, WD_RESIZEBOX_TOP + WD_RESIZEBOX_BOTTOM};
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1824 padding = &extra;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1825 if (NWidgetLeaf::resizebox_dimension.width == 0) {
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1826 NWidgetLeaf::resizebox_dimension = maxdim(GetSpriteSize(SPR_WINDOW_RESIZE_LEFT), GetSpriteSize(SPR_WINDOW_RESIZE_RIGHT));
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1827 NWidgetLeaf::resizebox_dimension.width += extra.width;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1828 NWidgetLeaf::resizebox_dimension.height += extra.height;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1829 }
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1830 size = maxdim(size, NWidgetLeaf::resizebox_dimension);
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1831 break;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1832 }
13576
7d9d6446b83f (svn r18099) -Codechange: scale the edit boxes to the fontsize
rubidium <rubidium@openttd.org>
parents: 13570
diff changeset
1833 case WWT_EDITBOX:
7d9d6446b83f (svn r18099) -Codechange: scale the edit boxes to the fontsize
rubidium <rubidium@openttd.org>
parents: 13570
diff changeset
1834 size.height = max(size.height, GetStringBoundingBox("_").height + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM);
7d9d6446b83f (svn r18099) -Codechange: scale the edit boxes to the fontsize
rubidium <rubidium@openttd.org>
parents: 13570
diff changeset
1835 /* fall through */
7d9d6446b83f (svn r18099) -Codechange: scale the edit boxes to the fontsize
rubidium <rubidium@openttd.org>
parents: 13570
diff changeset
1836 case WWT_PUSHBTN: {
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1837 static const Dimension extra = {WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM};
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1838 padding = &extra;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1839 break;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1840 }
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1841 case WWT_IMGBTN:
13514
b70924cfd627 (svn r18033) -Codechange: make the padding for IMGBTN_2 the same as for IMGBTN; the image doesn't move, so the extra space at the right and bottom aren't needed
rubidium <rubidium@openttd.org>
parents: 13509
diff changeset
1842 case WWT_IMGBTN_2:
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1843 case WWT_PUSHIMGBTN: {
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1844 static const Dimension extra = {WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT, WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM};
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1845 padding = &extra;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1846 Dimension d2 = GetSpriteSize(this->widget_data);
13514
b70924cfd627 (svn r18033) -Codechange: make the padding for IMGBTN_2 the same as for IMGBTN; the image doesn't move, so the extra space at the right and bottom aren't needed
rubidium <rubidium@openttd.org>
parents: 13509
diff changeset
1847 if (this->type == WWT_IMGBTN_2) d2 = maxdim(d2, GetSpriteSize(this->widget_data + 1));
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1848 d2.width += extra.width;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1849 d2.height += extra.height;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1850 size = maxdim(size, d2);
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1851 break;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1852 }
13662
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1853 case NWID_BUTTON_ARROW: {
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1854 static const Dimension extra = {WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT, WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM};
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1855 padding = &extra;
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1856 Dimension d2 = maxdim(GetSpriteSize(SPR_ARROW_LEFT), GetSpriteSize(SPR_ARROW_RIGHT));
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1857 d2.width += extra.width;
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1858 d2.height += extra.height;
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1859 size = maxdim(size, d2);
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1860 break;
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1861 }
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1862
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1863 case WWT_CLOSEBOX: {
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1864 static const Dimension extra = {WD_CLOSEBOX_LEFT + WD_CLOSEBOX_RIGHT, WD_CLOSEBOX_TOP + WD_CLOSEBOX_BOTTOM};
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1865 padding = &extra;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1866 if (NWidgetLeaf::closebox_dimension.width == 0) {
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1867 NWidgetLeaf::closebox_dimension = maxdim(GetStringBoundingBox(STR_BLACK_CROSS), GetStringBoundingBox(STR_SILVER_CROSS));
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1868 NWidgetLeaf::closebox_dimension.width += extra.width;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1869 NWidgetLeaf::closebox_dimension.height += extra.height;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1870 }
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1871 size = maxdim(size, NWidgetLeaf::closebox_dimension);
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1872 break;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1873 }
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1874 case WWT_TEXTBTN:
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1875 case WWT_PUSHTXTBTN:
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1876 case WWT_TEXTBTN_2: {
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1877 static const Dimension extra = {WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM};
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1878 padding = &extra;
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1879 if (this->index >= 0) w->SetStringParameters(this->index);
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1880 Dimension d2 = GetStringBoundingBox(this->widget_data);
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1881 d2.width += extra.width;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1882 d2.height += extra.height;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1883 size = maxdim(size, d2);
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1884 break;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1885 }
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1886 case WWT_LABEL:
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1887 case WWT_TEXT: {
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1888 static const Dimension extra = {0, 0};
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1889 padding = &extra;
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1890 if (this->index >= 0) w->SetStringParameters(this->index);
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1891 size = maxdim(size, GetStringBoundingBox(this->widget_data));
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1892 break;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1893 }
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1894 case WWT_CAPTION: {
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1895 static const Dimension extra = {WD_CAPTIONTEXT_LEFT + WD_CAPTIONTEXT_RIGHT, WD_CAPTIONTEXT_TOP + WD_CAPTIONTEXT_BOTTOM};
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1896 padding = &extra;
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1897 if (this->index >= 0) w->SetStringParameters(this->index);
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1898 Dimension d2 = GetStringBoundingBox(this->widget_data);
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1899 d2.width += extra.width;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1900 d2.height += extra.height;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1901 size = maxdim(size, d2);
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1902 break;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1903 }
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
1904 case WWT_DROPDOWN:
13664
ce197674184d (svn r18188) -Codechange: s/NWID_BUTTON_DRPDOWN/NWID_BUTTON_DROPDOWN/g
rubidium <rubidium@openttd.org>
parents: 13662
diff changeset
1905 case NWID_BUTTON_DROPDOWN: {
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1906 static const Dimension extra = {WD_DROPDOWNTEXT_LEFT + WD_DROPDOWNTEXT_RIGHT, WD_DROPDOWNTEXT_TOP + WD_DROPDOWNTEXT_BOTTOM};
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1907 padding = &extra;
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1908 if (this->index >= 0) w->SetStringParameters(this->index);
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1909 Dimension d2 = GetStringBoundingBox(this->widget_data);
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1910 d2.width += extra.width;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1911 d2.height += extra.height;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1912 size = maxdim(size, d2);
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1913 break;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1914 }
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1915 default:
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1916 NOT_REACHED();
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1917 }
12323
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
1918
13705
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
1919 if (this->index >= 0) w->UpdateWidgetSize(this->index, &size, *padding, &fill, &resize);
12323
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
1920
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1921 this->smallest_x = size.width;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1922 this->smallest_y = size.height;
13705
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
1923 this->fill_x = fill.width;
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
1924 this->fill_y = fill.height;
12437
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1925 this->resize_x = resize.width;
971748cbbe8f (svn r16871) -Codechange: Generalize GetWidgetContentSize to UpdateWidgetSize for better control over widget size and resize steps.
alberth <alberth@openttd.org>
parents: 12411
diff changeset
1926 this->resize_y = resize.height;
12323
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
1927 }
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
1928
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1929 void NWidgetLeaf::Draw(const Window *w)
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1930 {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1931 if (this->current_x == 0 || this->current_y == 0) return;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1932
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1933 Rect r;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1934 r.left = this->pos_x;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1935 r.right = this->pos_x + this->current_x - 1;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1936 r.top = this->pos_y;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1937 r.bottom = this->pos_y + this->current_y - 1;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1938
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1939 const DrawPixelInfo *dpi = _cur_dpi;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1940 if (dpi->left > r.right || dpi->left + dpi->width <= r.left || dpi->top > r.bottom || dpi->top + dpi->height <= r.top) return;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1941
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1942 bool clicked = this->IsLowered();
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1943 switch (this->type) {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1944 case WWT_EMPTY:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1945 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1946
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1947 case WWT_PUSHBTN:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1948 assert(this->widget_data == 0);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1949 DrawFrameRect(r.left, r.top, r.right, r.bottom, this->colour, (clicked) ? FR_LOWERED : FR_NONE);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1950 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1951
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1952 case WWT_IMGBTN:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1953 case WWT_PUSHIMGBTN:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1954 case WWT_IMGBTN_2:
12408
a1c0de97cd50 (svn r16842) -Cleanup: add some spaces around a few operators
rubidium <rubidium@openttd.org>
parents: 12405
diff changeset
1955 DrawImageButtons(r, this->type, this->colour, clicked, this->widget_data);
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1956 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1957
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1958 case WWT_TEXTBTN:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1959 case WWT_PUSHTXTBTN:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1960 case WWT_TEXTBTN_2:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1961 if (this->index >= 0) w->SetStringParameters(this->index);
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1962 DrawFrameRect(r.left, r.top, r.right, r.bottom, this->colour, (clicked) ? FR_LOWERED : FR_NONE);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1963 DrawLabel(r, this->type, clicked, this->widget_data);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1964 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1965
13662
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1966 case NWID_BUTTON_ARROW: {
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1967 SpriteID sprite;
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1968 switch (this->widget_data) {
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1969 case AWV_DECREASE: sprite = _dynlang.text_dir != TD_RTL ? SPR_ARROW_LEFT : SPR_ARROW_RIGHT; break;
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1970 case AWV_INCREASE: sprite = _dynlang.text_dir == TD_RTL ? SPR_ARROW_LEFT : SPR_ARROW_RIGHT; break;
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1971 case AWV_LEFT: sprite = SPR_ARROW_LEFT; break;
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1972 case AWV_RIGHT: sprite = SPR_ARROW_RIGHT; break;
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1973 default: NOT_REACHED();
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1974 }
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1975 DrawImageButtons(r, WWT_PUSHIMGBTN, this->colour, clicked, sprite);
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1976 }
6182cd79cc26 (svn r18186) -Add: a widgets for left/right arrows with the ability to turn themselves around when a RTL language is loaded
rubidium <rubidium@openttd.org>
parents: 13644
diff changeset
1977
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1978 case WWT_LABEL:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1979 if (this->index >= 0) w->SetStringParameters(this->index);
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1980 DrawLabel(r, this->type, clicked, this->widget_data);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1981 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1982
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1983 case WWT_TEXT:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1984 if (this->index >= 0) w->SetStringParameters(this->index);
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1985 DrawText(r, (TextColour)this->colour, this->widget_data);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1986 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1987
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1988 case WWT_MATRIX:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1989 DrawMatrix(r, this->colour, clicked, this->widget_data);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1990 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1991
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1992 case WWT_EDITBOX:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1993 DrawFrameRect(r.left, r.top, r.right, r.bottom, this->colour, FR_LOWERED | FR_DARKENED);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1994 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1995
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1996 case WWT_SCROLLBAR:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1997 assert(this->widget_data == 0);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1998 DrawVerticalScrollbar(r, this->colour, (w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_UP,
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1999 (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_MIDDLE,
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2000 (w->flags4 & (WF_SCROLL_DOWN | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_DOWN, &w->vscroll);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2001 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2002
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2003 case WWT_SCROLL2BAR:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2004 assert(this->widget_data == 0);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2005 DrawVerticalScrollbar(r, this->colour, (w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_UP | WF_SCROLL2),
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2006 (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_MIDDLE | WF_SCROLL2),
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2007 (w->flags4 & (WF_SCROLL_DOWN | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_DOWN | WF_SCROLL2), &w->vscroll2);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2008 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2009
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2010 case WWT_CAPTION:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
2011 if (this->index >= 0) w->SetStringParameters(this->index);
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2012 DrawCaption(r, this->colour, w->owner, this->widget_data);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2013 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2014
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2015 case WWT_HSCROLLBAR:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2016 assert(this->widget_data == 0);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2017 DrawHorizontalScrollbar(r, this->colour, (w->flags4 & (WF_SCROLL_UP | WF_HSCROLL)) == (WF_SCROLL_UP | WF_HSCROLL),
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2018 (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL)) == (WF_SCROLL_MIDDLE | WF_HSCROLL),
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2019 (w->flags4 & (WF_SCROLL_DOWN | WF_HSCROLL)) == (WF_SCROLL_DOWN | WF_HSCROLL), &w->hscroll);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2020 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2021
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2022 case WWT_STICKYBOX:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2023 assert(this->widget_data == 0);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2024 DrawStickyBox(r, this->colour, !!(w->flags4 & WF_STICKY));
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2025 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2026
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2027 case WWT_RESIZEBOX:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2028 assert(this->widget_data == 0);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2029 DrawResizeBox(r, this->colour, this->pos_x < (uint)(w->width / 2), !!(w->flags4 & WF_SIZING));
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2030 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2031
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2032 case WWT_CLOSEBOX:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2033 DrawCloseBox(r, this->colour, this->widget_data);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2034 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2035
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2036 case WWT_DROPDOWN:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
2037 if (this->index >= 0) w->SetStringParameters(this->index);
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2038 DrawDropdown(r, this->colour, clicked, this->widget_data);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2039 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2040
13664
ce197674184d (svn r18188) -Codechange: s/NWID_BUTTON_DRPDOWN/NWID_BUTTON_DROPDOWN/g
rubidium <rubidium@openttd.org>
parents: 13662
diff changeset
2041 case NWID_BUTTON_DROPDOWN:
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2042 if (this->index >= 0) w->SetStringParameters(this->index);
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2043 DrawButtonDropdown(r, this->colour, clicked, (this->disp_flags & ND_DROPDOWN_ACTIVE) != 0, this->widget_data);
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2044 break;
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2045
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2046 default:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2047 NOT_REACHED();
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2048 }
12274
ab8191734216 (svn r16689) -Codechange: Allow for rendering of parameterized text of nested widgets in Window::DrawWidget, adapt intro and town directory windows.
alberth <alberth@openttd.org>
parents: 12255
diff changeset
2049 if (this->index >= 0) w->DrawWidget(r, this->index);
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2050
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2051 if (this->IsDisabled()) {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2052 GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, _colour_gradient[this->colour & 0xF][2], FILLRECT_CHECKER);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2053 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2054 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2055
13747
1bc53910de7f (svn r18272) -Codechange: make FindScrollbar a const function
rubidium <rubidium@openttd.org>
parents: 13742
diff changeset
2056 Scrollbar *NWidgetLeaf::FindScrollbar(Window *w, bool allow_next) const
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
2057 {
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
2058 if (this->type == WWT_SCROLLBAR) return &w->vscroll;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
2059 if (this->type == WWT_SCROLL2BAR) return &w->vscroll2;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
2060
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
2061 if (this->index > 0 && allow_next && (uint)(this->index) + 1 < w->nested_array_size) {
13747
1bc53910de7f (svn r18272) -Codechange: make FindScrollbar a const function
rubidium <rubidium@openttd.org>
parents: 13742
diff changeset
2062 const NWidgetCore *next_wid = w->GetWidget<NWidgetCore>(this->index + 1);
12102
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
2063 if (next_wid != NULL) return next_wid->FindScrollbar(w, false);
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
2064 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
2065 return NULL;
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
2066 }
a381834fd694 (svn r16515) -Codechange: Added scrollbar handling for nested widgets, and finding widgets by type or position in the tree.
alberth <alberth@openttd.org>
parents: 12101
diff changeset
2067
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2068 /**
13664
ce197674184d (svn r18188) -Codechange: s/NWID_BUTTON_DRPDOWN/NWID_BUTTON_DROPDOWN/g
rubidium <rubidium@openttd.org>
parents: 13662
diff changeset
2069 * For a #NWID_BUTTON_DROPDOWN, test whether \a pt refers to the button or to the drop-down.
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2070 * @param pt Point in the widget.
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2071 * @return The point refers to the button.
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2072 *
13079
090bac35e7e4 (svn r17579) -Fix: remove doxygen docs for removed parameters, or change @param to @tparam if necessary
rubidium <rubidium@openttd.org>
parents: 13075
diff changeset
2073 * @note The magic constants are also used at #DrawButtonDropdown.
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2074 */
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2075 bool NWidgetLeaf::ButtonHit(const Point &pt)
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2076 {
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2077 if (_dynlang.text_dir == TD_LTR) {
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2078 int button_width = this->pos_x + this->current_x - 12;
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2079 return pt.x < button_width;
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2080 } else {
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2081 int button_left = this->pos_x + 12;
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2082 return pt.x >= button_left;
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2083 }
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2084 }
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2085
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2086 /* == Conversion code from NWidgetPart array to NWidgetBase* tree == */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2087
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2088 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2089 * Construct a single nested widget in \a *dest from its parts.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2090 *
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2091 * Construct a NWidgetBase object from a #NWidget function, and apply all
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2092 * settings that follow it, until encountering a #EndContainer, another
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2093 * #NWidget, or the end of the parts array.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2094 *
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2095 * @param parts Array with parts of the nested widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2096 * @param count Length of the \a parts array.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2097 * @param dest Address of pointer to use for returning the composed widget.
11750
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2098 * @param fill_dest Fill the composed widget with child widgets.
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2099 * @param biggest_index Pointer to biggest nested widget index in the tree encountered so far.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2100 * @return Number of widget part elements used to compose the widget.
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2101 * @precond \c biggest_index != NULL.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2102 */
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2103 static int MakeNWidget(const NWidgetPart *parts, int count, NWidgetBase **dest, bool *fill_dest, int *biggest_index)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2104 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2105 int num_used = 0;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2106
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2107 *dest = NULL;
11750
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2108 *fill_dest = false;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2109
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2110 while (count > num_used) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2111 switch (parts->type) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2112 case NWID_SPACER:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2113 if (*dest != NULL) return num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2114 *dest = new NWidgetSpacer(0, 0);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2115 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2116
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2117 case NWID_HORIZONTAL:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2118 if (*dest != NULL) return num_used;
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
2119 *dest = new NWidgetHorizontal(parts->u.cont_flags);
11750
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2120 *fill_dest = true;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2121 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2122
11500
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
2123 case NWID_HORIZONTAL_LTR:
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
2124 if (*dest != NULL) return num_used;
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
2125 *dest = new NWidgetHorizontalLTR(parts->u.cont_flags);
11750
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2126 *fill_dest = true;
11500
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
2127 break;
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
2128
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2129 case WWT_PANEL:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2130 case WWT_INSET:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2131 case WWT_FRAME:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2132 if (*dest != NULL) return num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2133 *dest = new NWidgetBackground(parts->type, parts->u.widget.colour, parts->u.widget.index);
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2134 *biggest_index = max(*biggest_index, (int)parts->u.widget.index);
11750
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2135 *fill_dest = true;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2136 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2137
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2138 case NWID_VERTICAL:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2139 if (*dest != NULL) return num_used;
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
2140 *dest = new NWidgetVertical(parts->u.cont_flags);
11750
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2141 *fill_dest = true;
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2142 break;
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2143
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2144 case WPT_FUNCTION: {
11750
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2145 if (*dest != NULL) return num_used;
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2146 /* Ensure proper functioning even when the called code simply writes its largest index. */
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2147 int biggest = -1;
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2148 *dest = parts->u.func_ptr(&biggest);
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2149 *biggest_index = max(*biggest_index, biggest);
11750
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2150 *fill_dest = false;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2151 break;
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2152 }
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2153
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2154 case WPT_RESIZE: {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2155 NWidgetResizeBase *nwrb = dynamic_cast<NWidgetResizeBase *>(*dest);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2156 if (nwrb != NULL) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2157 assert(parts->u.xy.x >= 0 && parts->u.xy.y >= 0);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2158 nwrb->SetResize(parts->u.xy.x, parts->u.xy.y);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2159 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2160 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2161 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2162
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2163 case WPT_MINSIZE: {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2164 NWidgetResizeBase *nwrb = dynamic_cast<NWidgetResizeBase *>(*dest);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2165 if (nwrb != NULL) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2166 assert(parts->u.xy.x >= 0 && parts->u.xy.y >= 0);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2167 nwrb->SetMinimalSize(parts->u.xy.x, parts->u.xy.y);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2168 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2169 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2170 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2171
13614
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
2172 case WPT_MINTEXTLINES: {
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
2173 NWidgetResizeBase *nwrb = dynamic_cast<NWidgetResizeBase *>(*dest);
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
2174 if (nwrb != NULL) {
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
2175 assert(parts->u.text_lines.size >= FS_BEGIN && parts->u.text_lines.size < FS_END);
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
2176 nwrb->SetMinimalTextLines(parts->u.text_lines.lines, parts->u.text_lines.spacing, parts->u.text_lines.size);
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
2177 }
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
2178 break;
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
2179 }
01ef0374674c (svn r18138) -Codechange: Add a new widgetpart to specify the height of a widget in text lines.
peter1138 <peter1138@openttd.org>
parents: 13576
diff changeset
2180
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2181 case WPT_FILL: {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2182 NWidgetResizeBase *nwrb = dynamic_cast<NWidgetResizeBase *>(*dest);
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
2183 if (nwrb != NULL) nwrb->SetFill(parts->u.xy.x, parts->u.xy.y);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2184 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2185 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2186
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2187 case WPT_DATATIP: {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2188 NWidgetCore *nwc = dynamic_cast<NWidgetCore *>(*dest);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2189 if (nwc != NULL) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2190 nwc->widget_data = parts->u.data_tip.data;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2191 nwc->tool_tip = parts->u.data_tip.tooltip;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2192 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2193 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2194 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2195
11811
b32bfec54ff8 (svn r16201) -Codechange: Add NWidgetBase::SetPadding method.
alberth <alberth@openttd.org>
parents: 11800
diff changeset
2196 case WPT_PADDING:
b32bfec54ff8 (svn r16201) -Codechange: Add NWidgetBase::SetPadding method.
alberth <alberth@openttd.org>
parents: 11800
diff changeset
2197 if (*dest != NULL) (*dest)->SetPadding(parts->u.padding.top, parts->u.padding.right, parts->u.padding.bottom, parts->u.padding.left);
11511
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
2198 break;
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
2199
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
2200 case WPT_PIPSPACE: {
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
2201 NWidgetPIPContainer *nwc = dynamic_cast<NWidgetPIPContainer *>(*dest);
11528
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
2202 if (nwc != NULL) nwc->SetPIP(parts->u.pip.pre, parts->u.pip.inter, parts->u.pip.post);
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
2203
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
2204 NWidgetBackground *nwb = dynamic_cast<NWidgetBackground *>(*dest);
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
2205 if (nwb != NULL) nwb->SetPIP(parts->u.pip.pre, parts->u.pip.inter, parts->u.pip.post);
11511
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
2206 break;
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
2207 }
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
2208
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2209 case WPT_ENDCONTAINER:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2210 return num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2211
12526
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
2212 case NWID_VIEWPORT:
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
2213 if (*dest != NULL) return num_used;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
2214 *dest = new NWidgetViewport(parts->u.widget.index);
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
2215 *biggest_index = max(*biggest_index, (int)parts->u.widget.index);
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
2216 break;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
2217
13073
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
2218 case NWID_SELECTION: {
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
2219 if (*dest != NULL) return num_used;
13565
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
2220 NWidgetStacked *nws = new NWidgetStacked();
13073
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
2221 *dest = nws;
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
2222 *fill_dest = true;
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
2223 nws->SetIndex(parts->u.widget.index);
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
2224 *biggest_index = max(*biggest_index, (int)parts->u.widget.index);
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
2225 break;
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
2226 }
013c3a75e449 (svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
alberth <alberth@openttd.org>
parents: 13072
diff changeset
2227
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2228 default:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2229 if (*dest != NULL) return num_used;
13664
ce197674184d (svn r18188) -Codechange: s/NWID_BUTTON_DRPDOWN/NWID_BUTTON_DROPDOWN/g
rubidium <rubidium@openttd.org>
parents: 13662
diff changeset
2230 assert((parts->type & WWT_MASK) < WWT_LAST || parts->type == NWID_BUTTON_DROPDOWN || parts->type == NWID_BUTTON_ARROW);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2231 *dest = new NWidgetLeaf(parts->type, parts->u.widget.colour, parts->u.widget.index, 0x0, STR_NULL);
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2232 *biggest_index = max(*biggest_index, (int)parts->u.widget.index);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2233 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2234 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2235 num_used++;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2236 parts++;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2237 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2238
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2239 return num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2240 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2241
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2242 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2243 * Build a nested widget tree by recursively filling containers with nested widgets read from their parts.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2244 * @param parts Array with parts of the nested widgets.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2245 * @param count Length of the \a parts array.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2246 * @param parent Container to use for storing the child widgets.
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2247 * @param biggest_index Pointer to biggest nested widget index in the tree.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2248 * @return Number of widget part elements used to fill the container.
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2249 * @postcond \c *biggest_index contains the largest widget index of the tree and \c -1 if no index is used.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2250 */
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2251 static int MakeWidgetTree(const NWidgetPart *parts, int count, NWidgetBase *parent, int *biggest_index)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2252 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2253 /* Given parent must be either a #NWidgetContainer or a #NWidgetBackground object. */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2254 NWidgetContainer *nwid_cont = dynamic_cast<NWidgetContainer *>(parent);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2255 NWidgetBackground *nwid_parent = dynamic_cast<NWidgetBackground *>(parent);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2256 assert((nwid_cont != NULL && nwid_parent == NULL) || (nwid_cont == NULL && nwid_parent != NULL));
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2257
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2258 int total_used = 0;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2259 while (true) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2260 NWidgetBase *sub_widget = NULL;
11750
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2261 bool fill_sub = false;
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2262 int num_used = MakeNWidget(parts, count - total_used, &sub_widget, &fill_sub, biggest_index);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2263 parts += num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2264 total_used += num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2265
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2266 /* Break out of loop when end reached */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2267 if (sub_widget == NULL) break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2268
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2269 /* Add sub_widget to parent container. */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2270 if (nwid_cont) nwid_cont->Add(sub_widget);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2271 if (nwid_parent) nwid_parent->Add(sub_widget);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2272
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2273 /* If sub-widget is a container, recursively fill that container. */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2274 WidgetType tp = sub_widget->type;
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
2275 if (fill_sub && (tp == NWID_HORIZONTAL || tp == NWID_HORIZONTAL_LTR || tp == NWID_VERTICAL
13565
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
2276 || tp == WWT_PANEL || tp == WWT_FRAME || tp == WWT_INSET || tp == NWID_SELECTION)) {
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2277 int num_used = MakeWidgetTree(parts, count - total_used, sub_widget, biggest_index);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2278 parts += num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2279 total_used += num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2280 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2281 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2282
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2283 if (count == total_used) return total_used; // Reached the end of the array of parts?
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2284
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2285 assert(total_used < count);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2286 assert(parts->type == WPT_ENDCONTAINER);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2287 return total_used + 1; // *parts is also 'used'
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2288 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2289
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2290 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2291 * Construct a nested widget tree from an array of parts.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2292 * @param parts Array with parts of the widgets.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2293 * @param count Length of the \a parts array.
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
2294 * @param biggest_index Pointer to biggest nested widget index collected in the tree.
13469
3783590f0d39 (svn r17984) -Codechange: make it possible to use MakeNWidgets using a custom container widget.
rubidium <rubidium@openttd.org>
parents: 13394
diff changeset
2295 * @param container Container to add the nested widgets to. In case it is NULL a vertical container is used.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2296 * @return Root of the nested widget tree, a vertical container containing the entire GUI.
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
2297 * @ingroup NestedWidgetParts
13469
3783590f0d39 (svn r17984) -Codechange: make it possible to use MakeNWidgets using a custom container widget.
rubidium <rubidium@openttd.org>
parents: 13394
diff changeset
2298 * @pre \c biggest_index != NULL
3783590f0d39 (svn r17984) -Codechange: make it possible to use MakeNWidgets using a custom container widget.
rubidium <rubidium@openttd.org>
parents: 13394
diff changeset
2299 * @post \c *biggest_index contains the largest widget index of the tree and \c -1 if no index is used.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2300 */
13469
3783590f0d39 (svn r17984) -Codechange: make it possible to use MakeNWidgets using a custom container widget.
rubidium <rubidium@openttd.org>
parents: 13394
diff changeset
2301 NWidgetContainer *MakeNWidgets(const NWidgetPart *parts, int count, int *biggest_index, NWidgetContainer *container)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2302 {
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
2303 *biggest_index = -1;
13469
3783590f0d39 (svn r17984) -Codechange: make it possible to use MakeNWidgets using a custom container widget.
rubidium <rubidium@openttd.org>
parents: 13394
diff changeset
2304 if (container == NULL) container = new NWidgetVertical();
3783590f0d39 (svn r17984) -Codechange: make it possible to use MakeNWidgets using a custom container widget.
rubidium <rubidium@openttd.org>
parents: 13394
diff changeset
2305 MakeWidgetTree(parts, count, container, biggest_index);
3783590f0d39 (svn r17984) -Codechange: make it possible to use MakeNWidgets using a custom container widget.
rubidium <rubidium@openttd.org>
parents: 13394
diff changeset
2306 return container;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2307 }