annotate src/widget.cpp @ 16221:4f317dcb219a draft

(svn r20922) -Fix [FS#4071]: accidentally moving the mouse of the scrollbar arrows while pressing it clicks the button next to the arrow
author rubidium <rubidium@openttd.org>
date Fri, 15 Oct 2010 11:16:14 +0000 (2010-10-15)
parents 7585966382b1
children 19dba04d7fc5
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"
10208
39cf8eebfda5 (svn r14422) -Codechange: also reflect the changes of r14421 in the filenames.
rubidium <rubidium@openttd.org>
parents: 10207
diff changeset
13 #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
14 #include "window_gui.h"
12526
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
15 #include "viewport_func.h"
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
16 #include "zoom_func.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
17 #include "strings_func.h"
12897
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
18 #include "transparency.h"
14258
a899d4e5ee1a (svn r18809) -Codechange/Cleanup: remove unneeded headers from some files, if a header require a header make it include that header
rubidium <rubidium@openttd.org>
parents: 14063
diff changeset
19 #include "core/geometry_func.hpp"
15080
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
20 #include "settings_type.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.
15786
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
68 * @param sb Scrollbar
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
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 */
15786
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
74 static void ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, 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;
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
77 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
78
15787
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
79 if (sb->type == NWID_HSCROLLBAR) {
15786
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
80 pos = x;
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
81 rtl = _dynlang.text_dir == TD_RTL;
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
82 } else {
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
83 pos = y;
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
84 }
8969
01cc3ee6ecb1 (svn r12761) -Codechange: lots of minor whitespace coding style fixes around operators.
rubidium <rubidium@openttd.org>
parents: 8857
diff changeset
85 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
86 /* Pressing the upper button? */
15786
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
87 SetBit(sb->disp_flags, NDB_SCROLLBAR_UP);
15894
9a746a18b3d5 (svn r20577) -Fix [FS#4043]: scroll button flickering when pressed
rubidium <rubidium@openttd.org>
parents: 15876
diff changeset
88 if (_scroller_click_timeout <= 1) {
9a746a18b3d5 (svn r20577) -Fix [FS#4043]: scroll button flickering when pressed
rubidium <rubidium@openttd.org>
parents: 15876
diff changeset
89 _scroller_click_timeout = 3;
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
90 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
91 }
16221
4f317dcb219a (svn r20922) -Fix [FS#4071]: accidentally moving the mouse of the scrollbar arrows while pressing it clicks the button next to the arrow
rubidium <rubidium@openttd.org>
parents: 15903
diff changeset
92 w->scrolling_scrollbar = sb->index;
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
93 } 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
94 /* Pressing the lower button? */
15786
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
95 SetBit(sb->disp_flags, NDB_SCROLLBAR_DOWN);
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
96
15894
9a746a18b3d5 (svn r20577) -Fix [FS#4043]: scroll button flickering when pressed
rubidium <rubidium@openttd.org>
parents: 15876
diff changeset
97 if (_scroller_click_timeout <= 1) {
9a746a18b3d5 (svn r20577) -Fix [FS#4043]: scroll button flickering when pressed
rubidium <rubidium@openttd.org>
parents: 15876
diff changeset
98 _scroller_click_timeout = 3;
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
99 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
100 }
16221
4f317dcb219a (svn r20922) -Fix [FS#4071]: accidentally moving the mouse of the scrollbar arrows while pressing it clicks the button next to the arrow
rubidium <rubidium@openttd.org>
parents: 15903
diff changeset
101 w->scrolling_scrollbar = sb->index;
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
102 } else {
15787
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
103 Point pt = HandleScrollbarHittest(sb, mi, ma, sb->type == NWID_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
104
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
105 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
106 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
107 } 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
108 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
109 } else {
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
110 _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
111 _scrollbar_size = ma - mi - 23;
15786
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
112 w->scrolling_scrollbar = sb->index;
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
113 _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
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 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
116
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
117 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
118 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
119
15620
f8e9a3f0c140 (svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents: 15579
diff changeset
120 /**
f8e9a3f0c140 (svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents: 15579
diff changeset
121 * Special handling for the scrollbar widget type.
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
122 * 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
123 * @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
124 * @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
125 * @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
126 * @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
127 */
15783
237bdaf1dc20 (svn r20457) -Codechange: Remove _scrolling_scrollbar and WF_SCROLL_MIDDLE and instead store the widget index of the being scrolled scrollbar in the Window.
frosch <frosch@openttd.org>
parents: 15782
diff changeset
128 void ScrollbarClickHandler(Window *w, NWidgetCore *nw, 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
129 {
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
130 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
131
15787
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
132 if (nw->type == NWID_HSCROLLBAR) {
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
133 mi = nw->pos_x;
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
134 ma = nw->pos_x + nw->current_x;
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
135 } else {
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
136 mi = nw->pos_y;
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
137 ma = nw->pos_y + nw->current_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
138 }
15783
237bdaf1dc20 (svn r20457) -Codechange: Remove _scrolling_scrollbar and WF_SCROLL_MIDDLE and instead store the widget index of the being scrolled scrollbar in the Window.
frosch <frosch@openttd.org>
parents: 15782
diff changeset
139 ScrollbarClickPositioning(w, dynamic_cast<NWidgetScrollbar*>(nw), x, y, mi, ma);
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
140 }
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
141
15620
f8e9a3f0c140 (svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents: 15579
diff changeset
142 /**
f8e9a3f0c140 (svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents: 15579
diff changeset
143 * Returns the index for the widget located at the given position
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
144 * 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
145 * @param *w Window to look inside
6481
85a1a79387a2 (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas <belugas@openttd.org>
parents: 6432
diff changeset
146 * @param x The Window client X coordinate
85a1a79387a2 (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas <belugas@openttd.org>
parents: 6432
diff changeset
147 * @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
148 * @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
149 */
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
150 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
151 {
13570
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
152 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
153 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
154 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
155
9773
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
156 /**
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
157 * Draw frame rectangle.
fcce76c3bb3d (svn r13910) -Document: string drawing related functions and types (Alberth)
rubidium <rubidium@openttd.org>
parents: 9770
diff changeset
158 * @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
159 * @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
160 * @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
161 * @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
162 * @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
163 * @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
164 */
11085
8da1855e9f14 (svn r15428) -Codechange: consistently use colour instead of having both color and colour.
rubidium <rubidium@openttd.org>
parents: 11084
diff changeset
165 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
166 {
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
167 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
168 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
169 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
170 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
171
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
172 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
173 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
174 } else {
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
175 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
176
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
177 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
178 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
179 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
180 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
181 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
182 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
183 } else {
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
184 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
185 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
186 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
187 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
188 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
189 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
190 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
191 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
192 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
193 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
194 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
195
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
196 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
197 * 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
198 * @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
199 * @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
200 * @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
201 * @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
202 * @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
203 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
204 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
205 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
206 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
207 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
208
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
209 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
210 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
211 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
212
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
213 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
214 * 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
215 * @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
216 * @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
217 * @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
218 * @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
219 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
220 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
221 {
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
222 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
223 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
224 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
225 int offset = max(0, ((int)(r.bottom - r.top + 1) - (int)d.height) / 2); // Offset for rendering the text vertically centered
15400
821c26b30fd9 (svn r20043) -Codechange: Introduce vertical alignment for DrawStringMultiLine().
alberth <alberth@openttd.org>
parents: 15302
diff changeset
226 DrawString(r.left + clicked, r.right + clicked, r.top + offset + clicked, str, TC_FROMSTRING, SA_HOR_CENTER);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
227 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
228
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
229 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
230 * Draw text.
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
231 * @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
232 * @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
233 * @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
234 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
235 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
236 {
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
237 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
238 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
239 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
240 }
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 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
243 * 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
244 * @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
245 * @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
246 * @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
247 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
248 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
249 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
250 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
251 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
252 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
253
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
254 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
255 * 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
256 * @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
257 * @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
258 * @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
259 * @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
260 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
261 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
262 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
263 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
264
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
265 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
266 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
267
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
268 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
269 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
270
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
271 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
272
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
273 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
274 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
275 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
276 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
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 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
280 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
281 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
282 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
283 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
284
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
285 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
286
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
287 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
288 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
289 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
290 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
291 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
292
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
293 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
294 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
295 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
296 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
297 }
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
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
300 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
301 * 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
302 * @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
303 * @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
304 * @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
305 * @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
306 * @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
307 * @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
308 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
309 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
310 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
311 /* 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
312 DrawFrameRect(r.left, r.top, r.right, r.top + 9, colour, (up_clicked) ? FR_LOWERED : FR_NONE);
15400
821c26b30fd9 (svn r20043) -Codechange: Introduce vertical alignment for DrawStringMultiLine().
alberth <alberth@openttd.org>
parents: 15302
diff changeset
313 DrawString(r.left + up_clicked, r.right + up_clicked, r.top + up_clicked, UPARROW, TC_BLACK, SA_HOR_CENTER);
11999
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 DrawFrameRect(r.left, r.bottom - 9, r.right, r.bottom, colour, (down_clicked) ? FR_LOWERED : FR_NONE);
15400
821c26b30fd9 (svn r20043) -Codechange: Introduce vertical alignment for DrawStringMultiLine().
alberth <alberth@openttd.org>
parents: 15302
diff changeset
316 DrawString(r.left + down_clicked, r.right + down_clicked, r.bottom - 9 + down_clicked, DOWNARROW, TC_BLACK, SA_HOR_CENTER);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
317
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
318 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
319 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
320
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
321 /* 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
322 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
323 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
324
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
325 /* 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
326 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
327 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
328 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
329 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
330
13626
0fcc5f6fa927 (svn r18150) -Codechange: make the horizontal scrollbar scroll in the opposite direction with RTL
rubidium <rubidium@openttd.org>
parents: 13614
diff changeset
331 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
332 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
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 * 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
337 * @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
338 * @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
339 * @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
340 * @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
341 * @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
342 * @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
343 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
344 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
345 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
346 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
347 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
348
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
349 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
350 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
351
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
352 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
353 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
354
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
355 /* 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
356 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
357 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
358
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
359 /* 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
360 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
361 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
362 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
363 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
364
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
365 /* 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
366 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
367 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
368 }
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 * 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
372 * @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
373 * @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
374 * @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
375 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
376 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
377 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
378 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
379
12195
ee5c5c8f0557 (svn r16609) -Codechange: Introduction of widget sizes and offsets used while drawing.
alberth <alberth@openttd.org>
parents: 12159
diff changeset
380 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
381
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
382 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
383 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
384
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
385 /* 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
386 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
387 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
388 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
389
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
390 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
391 /* 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
392 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
393 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
394
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
395 /* 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
396 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
397 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
398 } else {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
399 /* 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
400 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
401 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
402
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
403 /* 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
404 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
405 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
406 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
407
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
408 /* 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
409 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
410 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
411
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
412 /* 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
413 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
414 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
415
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
416 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
417 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
418 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
419
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
420 /**
14040
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
421 * Draw a shade box.
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
422 * @param r Rectangle of the box.
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
423 * @param colour Colour of the shade box.
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
424 * @param clicked Box is lowered.
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
425 */
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
426 static inline void DrawShadeBox(const Rect &r, Colours colour, bool clicked)
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
427 {
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
428 DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE);
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
429 DrawSprite((clicked) ? SPR_WINDOW_SHADE : SPR_WINDOW_UNSHADE, PAL_NONE, r.left + WD_SHADEBOX_LEFT + clicked, r.top + WD_SHADEBOX_TOP + clicked);
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
430 }
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
431
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
432 /**
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
433 * 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
434 * @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
435 * @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
436 * @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
437 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
438 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
439 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
440 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
441 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
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 /**
15080
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
445 * Draw a NewGRF debug box.
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
446 * @param r Rectangle of the box.
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
447 * @param colour Colour of the debug box.
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
448 * @param clicked Box is lowered.
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
449 */
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
450 static inline void DrawDebugBox(const Rect &r, Colours colour, bool clicked)
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
451 {
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
452 DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE);
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
453 DrawSprite(SPR_WINDOW_DEBUG, PAL_NONE, r.left + WD_DEBUGBOX_LEFT + clicked, r.top + WD_DEBUGBOX_TOP + clicked);
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
454 }
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
455
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
456 /**
11999
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 resize 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 resize 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 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
461 * @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
462 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
463 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
464 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
465 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
466 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
467 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
468 } 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
469 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
470 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
471 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
472
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
473 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
474 * 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
475 * @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
476 * @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
477 * @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
478 */
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
479 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
480 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
481 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
482 DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, FR_NONE);
15400
821c26b30fd9 (svn r20043) -Codechange: Introduce vertical alignment for DrawStringMultiLine().
alberth <alberth@openttd.org>
parents: 15302
diff changeset
483 DrawString(r.left + WD_CLOSEBOX_LEFT, r.right - WD_CLOSEBOX_RIGHT, r.top + WD_CLOSEBOX_TOP, str, TC_FROMSTRING, SA_HOR_CENTER);
11999
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 /**
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
487 * 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
488 * @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
489 * @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
490 * @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
491 * @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
492 */
15302
a17347e65c55 (svn r19943) -Fix [FS#3865]: Disallow moving of vehicle news window.
frosch <frosch@openttd.org>
parents: 15215
diff changeset
493 void DrawCaption(const Rect &r, Colours colour, Owner owner, 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
494 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
495 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
496 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
497
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
498 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
499 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
500 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
501
15400
821c26b30fd9 (svn r20043) -Codechange: Introduce vertical alignment for DrawStringMultiLine().
alberth <alberth@openttd.org>
parents: 15302
diff changeset
502 if (str != STR_NULL) DrawString(r.left + WD_CAPTIONTEXT_LEFT, r.right - WD_CAPTIONTEXT_RIGHT, r.top + WD_CAPTIONTEXT_TOP, str, TC_FROMSTRING, SA_HOR_CENTER);
11999
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
503 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
504
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
505 /**
13664
ce197674184d (svn r18188) -Codechange: s/NWID_BUTTON_DRPDOWN/NWID_BUTTON_DROPDOWN/g
rubidium <rubidium@openttd.org>
parents: 13662
diff changeset
506 * 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
507 * @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
508 * @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
509 * @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
510 * @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
511 * @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
512 *
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
513 * @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
514 */
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
515 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
516 {
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
517 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
518 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
519 DrawFrameRect(r.right - 11, r.top, r.right, r.bottom, colour, clicked_dropdown ? FR_LOWERED : FR_NONE);
15400
821c26b30fd9 (svn r20043) -Codechange: Introduce vertical alignment for DrawStringMultiLine().
alberth <alberth@openttd.org>
parents: 15302
diff changeset
520 DrawString(r.right - (clicked_dropdown ? 10 : 11), r.right, r.top + (clicked_dropdown ? 2 : 1), DOWNARROW, TC_BLACK, SA_HOR_CENTER);
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
521 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
522 } else {
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
523 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
524 DrawFrameRect(r.left, r.top, r.left + 11, r.bottom, colour, clicked_dropdown ? FR_LOWERED : FR_NONE);
15400
821c26b30fd9 (svn r20043) -Codechange: Introduce vertical alignment for DrawStringMultiLine().
alberth <alberth@openttd.org>
parents: 15302
diff changeset
525 DrawString(r.left + clicked_dropdown, r.left + 11, r.top + (clicked_dropdown ? 2 : 1), DOWNARROW, TC_BLACK, SA_HOR_CENTER);
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
526 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
527 }
b8e87660b9fc (svn r16405) -Codechange: Move widget drawing code to functions to allow re-use.
alberth <alberth@openttd.org>
parents: 11966
diff changeset
528 }
5584
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
529
8857
a75a0c683fea (svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium <rubidium@openttd.org>
parents: 8737
diff changeset
530 /**
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
531 * 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
532 * @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
533 * @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
534 * @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
535 * @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
536 */
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
537 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
538 {
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
539 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
540 }
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
541
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
542 /**
8857
a75a0c683fea (svn r12619) -Codechange: lots of documentation about window related stuff. Patch by Alberth.
rubidium <rubidium@openttd.org>
parents: 8737
diff changeset
543 * 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
544 */
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
545 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
546 {
13570
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
547 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
548
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
549 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
550 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
551 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
552 }
4b26bd55bd24 (svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
KUDr <KUDr@openttd.org>
parents:
diff changeset
553
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
554 /**
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
555 * 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
556 * @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
557 * @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
558 */
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
559 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
560 {
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
561 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
562
13570
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
563 assert(this->nested_array != NULL);
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
564 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
565
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
566 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
567 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
568 int top = nwid->pos_y;
4a7574282ac8 (svn r18092) -Codechange: remove support for the unnested widgets
rubidium <rubidium@openttd.org>
parents: 13567
diff changeset
569
15400
821c26b30fd9 (svn r20043) -Codechange: Introduce vertical alignment for DrawStringMultiLine().
alberth <alberth@openttd.org>
parents: 15302
diff changeset
570 DrawString(base, base + WD_SORTBUTTON_ARROW_WIDTH, top + 1 + offset, state == SBS_DOWN ? DOWNARROW : UPARROW, TC_BLACK, SA_HOR_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
571 }
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
572
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
573
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
574 /**
12708
f1e888f0b9e1 (svn r17171) -Doc: Additions and corrections of various doxygen strings.
alberth <alberth@openttd.org>
parents: 12706
diff changeset
575 * @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
576 * 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
577 * 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
578 *
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
579 * \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
580 * 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
581 * <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
582 * <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
583 * <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
584 * </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
585 * 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
586 *
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
587 * 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
588 * <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
589 * <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
590 * 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
591 * <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
592 * 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
593 * <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
594 * <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
595 * <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
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 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
598 *
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
599 * \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
600 * 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
601 * 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
602 *
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 * 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
604 * - 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
605 * - 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
606 *
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 * 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
608 * <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
609 * <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
610 * 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
611 * <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
612 * 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
613 * 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
614 * <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
615 * 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
616 * 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
617 * </ol>
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
618 * 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
619 *
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
620 * 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
621 * 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
622 *
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
623 * @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
624 */
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
625
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
626 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
627 * Base class constructor.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
628 * @param tp Nested widget type.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
629 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
630 NWidgetBase::NWidgetBase(WidgetType tp) : ZeroedMemoryAllocator()
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
631 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
632 this->type = tp;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
633 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
634
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
635 /* ~NWidgetContainer() takes care of #next and #prev data members. */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
636
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
637 /**
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
638 * @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
639 * Compute smallest size needed by the widget.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
640 *
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
641 * 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
642 * display itself properly. In addition, filling and resizing of the widget are computed.
13955
2aacd08c5871 (svn r18491) -Fix (r18482): Update doxy comments of SetupSmallestSize() as well.
alberth <alberth@openttd.org>
parents: 13954
diff changeset
643 * 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
644 * 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
645 *
13955
2aacd08c5871 (svn r18491) -Fix (r18482): Update doxy comments of SetupSmallestSize() as well.
alberth <alberth@openttd.org>
parents: 13954
diff changeset
646 * @param w Window owning the widget.
2aacd08c5871 (svn r18491) -Fix (r18482): Update doxy comments of SetupSmallestSize() as well.
alberth <alberth@openttd.org>
parents: 13954
diff changeset
647 * @param init_array Initialize the \c w->nested_array.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
648 *
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
649 * @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
650 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
651
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
652 /**
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
653 * @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
654 * 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
655 * @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
656 * @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
657 * @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
658 * @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
659 * @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
660 * @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
661 *
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
662 * 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
663 * 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
664 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
665
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
666 /**
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
667 * @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
668 * 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
669 * @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
670 * @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
671 */
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
672
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
673 /**
13956
702099b8c615 (svn r18492) -Doc: A few Doxygen reference fixes (NewsSubtype reported by Eddi), and a typo fix.
alberth <alberth@openttd.org>
parents: 13955
diff changeset
674 * @fn void NWidgetBase::Draw(const Window *w)
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
675 * 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
676 * 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
677 * @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
678 */
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
679
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
680 /**
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
681 * 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
682 * @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
683 */
13034
6eb3f749890a (svn r17532) -Codechange: Rename several Invalidate functions to SetDirty for more consistency and distinguishability.
frosch <frosch@openttd.org>
parents: 13011
diff changeset
684 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
685 {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
686 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
687 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
688 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
689 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
690
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
691 /**
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
692 * @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
693 * 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
694 * @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
695 * @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
696 * @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
697 */
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
698
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
699 /**
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
700 * 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
701 * @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
702 * @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
703 */
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
704 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
705 {
b78b7e2cb29f (svn r16961) -Codechange: Moving some methods up in the class hierarchy to avoid code duplication.
alberth <alberth@openttd.org>
parents: 12516
diff changeset
706 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
707 }
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
708
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
709 /**
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
710 * Constructor for resizable nested widgets.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
711 * @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
712 * @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
713 * @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
714 */
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
715 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
716 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
717 this->fill_x = fill_x;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
718 this->fill_y = fill_y;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
719 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
720
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
721 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
722 * Set minimal size of the widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
723 * @param min_x Horizontal minimal size of the widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
724 * @param min_y Vertical minimal size of the widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
725 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
726 void NWidgetResizeBase::SetMinimalSize(uint min_x, uint min_y)
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
727 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
728 this->min_x = min_x;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
729 this->min_y = min_y;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
730 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
731
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
732 /**
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
733 * 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
734 * @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
735 * @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
736 * @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
737 */
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
738 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
739 {
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
740 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
741 }
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
742
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
743 /**
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
744 * 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
745 * @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
746 * @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
747 */
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
748 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
749 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
750 this->fill_x = fill_x;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
751 this->fill_y = fill_y;
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 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
755 * Set resize step of the widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
756 * @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
757 * @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
758 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
759 void NWidgetResizeBase::SetResize(uint resize_x, uint resize_y)
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
760 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
761 this->resize_x = resize_x;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
762 this->resize_y = resize_y;
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
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
765 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
766 {
15215
c68f3c67204d (svn r19844) -Fix: Move NWidgetBase::StoreSizePosition() to an include file, and use proper inline macro.
alberth <alberth@openttd.org>
parents: 15214
diff changeset
767 this->StoreSizePosition(sizing, x, y, given_width, given_height);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
768 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
769
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
770 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
771 * Initialization of a 'real' widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
772 * @param tp Type of the widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
773 * @param colour Colour of the widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
774 * @param fill_x Default horizontal filling.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
775 * @param fill_y Default vertical filling.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
776 * @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
777 * @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
778 */
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
779 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
780 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
781 this->colour = colour;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
782 this->index = -1;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
783 this->widget_data = widget_data;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
784 this->tool_tip = tool_tip;
15788
0f906a2224dc (svn r20462) -Fix (r20452): Initialise scrollbar_index with -1 to indicate 'no scrollbar associated'.
frosch <frosch@openttd.org>
parents: 15787
diff changeset
785 this->scrollbar_index = -1;
11461
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
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
788 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
789 * 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
790 * @param index Index to use.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
791 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
792 void NWidgetCore::SetIndex(int index)
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
793 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
794 assert(index >= 0);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
795 this->index = index;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
796 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
797
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
798 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
799 * Set data and tool tip of the nested widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
800 * @param widget_data Data to use.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
801 * @param tool_tip Tool tip string to use.
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 void NWidgetCore::SetDataTip(uint16 widget_data, StringID tool_tip)
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
804 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
805 this->widget_data = widget_data;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
806 this->tool_tip = tool_tip;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
807 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
808
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
809 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
810 {
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
811 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
812 }
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
813
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
814 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
815 {
b78b7e2cb29f (svn r16961) -Codechange: Moving some methods up in the class hierarchy to avoid code duplication.
alberth <alberth@openttd.org>
parents: 12516
diff changeset
816 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
817 }
b78b7e2cb29f (svn r16961) -Codechange: Moving some methods up in the class hierarchy to avoid code duplication.
alberth <alberth@openttd.org>
parents: 12516
diff changeset
818
11461
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 * Constructor container baseclass.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
821 * @param tp Type of the container.
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 NWidgetContainer::NWidgetContainer(WidgetType tp) : NWidgetBase(tp)
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 this->head = NULL;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
826 this->tail = NULL;
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 NWidgetContainer::~NWidgetContainer()
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
830 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
831 while (this->head != NULL) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
832 NWidgetBase *wid = this->head->next;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
833 delete this->head;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
834 this->head = wid;
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->tail = NULL;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
837 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
838
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
839 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
840 {
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
841 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
842 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
843 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
844 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
845 }
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
846 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
847 }
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
848
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
849 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
850 * Append widget \a wid to container.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
851 * @param wid Widget to append.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
852 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
853 void NWidgetContainer::Add(NWidgetBase *wid)
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
854 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
855 assert(wid->next == NULL && wid->prev == NULL);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
856
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
857 if (this->head == NULL) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
858 this->head = wid;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
859 this->tail = wid;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
860 } else {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
861 assert(this->tail != NULL);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
862 assert(this->tail->next == NULL);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
863
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
864 this->tail->next = wid;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
865 wid->prev = this->tail;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
866 this->tail = wid;
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 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
869
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
870 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
871 {
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
872 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
873 child_wid->FillNestedArray(array, length);
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
874 }
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
875 }
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
876
11528
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
877 /**
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
878 * Widgets stacked on top of each other.
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
879 */
13565
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
880 NWidgetStacked::NWidgetStacked() : NWidgetContainer(NWID_SELECTION)
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
881 {
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
882 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
883 }
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
884
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
885 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
886 {
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
887 this->index = index;
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
888 }
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
889
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
890 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
891 {
13074
c6408d5b9f99 (svn r17574) -Fix (r17573): Insert NWID_SELECTION in nested_array when appropriate.
alberth <alberth@openttd.org>
parents: 13073
diff changeset
892 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
893 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
894 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
895 }
c6408d5b9f99 (svn r17574) -Fix (r17573): Insert NWID_SELECTION in nested_array when appropriate.
alberth <alberth@openttd.org>
parents: 13073
diff changeset
896
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
897 /* Zero size plane selected */
14063
4eb2be463cc4 (svn r18606) -Codechange: Introduce several forms of zero-size stacked display planes.
alberth <alberth@openttd.org>
parents: 14062
diff changeset
898 if (this->shown_plane >= SZSP_BEGIN) {
4eb2be463cc4 (svn r18606) -Codechange: Introduce several forms of zero-size stacked display planes.
alberth <alberth@openttd.org>
parents: 14062
diff changeset
899 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
900 Dimension padding = {0, 0};
14063
4eb2be463cc4 (svn r18606) -Codechange: Introduce several forms of zero-size stacked display planes.
alberth <alberth@openttd.org>
parents: 14062
diff changeset
901 Dimension fill = {(this->shown_plane == SZSP_HORIZONTAL), (this->shown_plane == SZSP_VERTICAL)};
4eb2be463cc4 (svn r18606) -Codechange: Introduce several forms of zero-size stacked display planes.
alberth <alberth@openttd.org>
parents: 14062
diff changeset
902 Dimension resize = {(this->shown_plane == SZSP_HORIZONTAL), (this->shown_plane == SZSP_VERTICAL)};
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
903 /* Here we're primarily interested in the value of resize */
14062
9103e248263f (svn r18605) -Codechange: Coding style fixes, prevent useless calls to UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 14050
diff changeset
904 if (this->index >= 0) 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
905
78083f48ac84 (svn r17848) -Codechange: allow overriding (some) settings of STACKED_SELECTION_ZERO_SIZE widgets via UpdateWidgetSize
rubidium <rubidium@openttd.org>
parents: 13246
diff changeset
906 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
907 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
908 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
909 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
910 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
911 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
912 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
913 }
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
914
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
915 /* 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
916 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
917 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
918 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
919 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
920 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
921 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
922 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
923 child_wid->SetupSmallestSize(w, init_array);
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
924
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
925 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
926 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
927 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
928 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
929 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
930 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
931 }
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
932 }
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
933
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
934 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
935 {
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
936 assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
15215
c68f3c67204d (svn r19844) -Fix: Move NWidgetBase::StoreSizePosition() to an include file, and use proper inline macro.
alberth <alberth@openttd.org>
parents: 15214
diff changeset
937 this->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
938
14063
4eb2be463cc4 (svn r18606) -Codechange: Introduce several forms of zero-size stacked display planes.
alberth <alberth@openttd.org>
parents: 14062
diff changeset
939 if (this->shown_plane >= SZSP_BEGIN) return;
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
940
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
941 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
942 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
943 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
944 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
945
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
946 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
947 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
948 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
949
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
950 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
951 }
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
952 }
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
953
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
954 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
955 {
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
956 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
957 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
958 }
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
959
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
960 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
961 {
14063
4eb2be463cc4 (svn r18606) -Codechange: Introduce several forms of zero-size stacked display planes.
alberth <alberth@openttd.org>
parents: 14062
diff changeset
962 if (this->shown_plane >= SZSP_BEGIN) return;
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
963
13565
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
964 int plane = 0;
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
965 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
966 if (plane == this->shown_plane) {
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
967 child_wid->Draw(w);
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
968 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
969 }
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
970 }
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
971
13565
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
972 NOT_REACHED();
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
973 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
974
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
975 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
976 {
14063
4eb2be463cc4 (svn r18606) -Codechange: Introduce several forms of zero-size stacked display planes.
alberth <alberth@openttd.org>
parents: 14062
diff changeset
977 if (this->shown_plane >= SZSP_BEGIN) return NULL;
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
978
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
979 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
980 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
981 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
982 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
983 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
984 }
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
985 }
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
986 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
987 }
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
988
15620
f8e9a3f0c140 (svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents: 15579
diff changeset
989 /**
f8e9a3f0c140 (svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents: 15579
diff changeset
990 * Select which plane to show (for #NWID_SELECTION only).
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
991 * @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
992 */
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
993 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
994 {
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
995 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
996 }
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
997
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
998 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
999 {
12255
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1000 this->flags = flags;
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1001 }
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1002
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1003 /**
11528
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1004 * 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
1005 *
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1006 * @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
1007 * 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
1008 * @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
1009 * @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
1010 * 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
1011 */
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
1012 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
1013 {
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1014 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
1015 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
1016 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
1017 }
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
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 NWidgetPIPContainer::Draw(const Window *w)
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1020 {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1021 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
1022 child_wid->Draw(w);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1023 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1024 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1025
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
1026 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
1027 {
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
1028 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
1029
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
1030 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
1031 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
1032 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
1033 }
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 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
1035 }
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
1036
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
1037 /** 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
1038 NWidgetHorizontal::NWidgetHorizontal(NWidContainerFlags flags) : NWidgetPIPContainer(NWID_HORIZONTAL, flags)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1039 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1040 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1041
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1042 void NWidgetHorizontal::SetupSmallestSize(Window *w, bool init_array)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1043 {
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1044 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
1045 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
1046 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
1047 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
1048 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
1049 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
1050
13707
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1051 /* 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
1052 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
1053 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
1054 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
1055 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
1056 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
1057 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
1058 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
1059 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1060 /* 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
1061 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
1062 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
1063 while (true) {
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1064 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
1065 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
1066 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
1067 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
1068 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
1069 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
1070 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
1071 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
1072 /* 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
1073 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1074 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1075 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1076 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
1077 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
1078 }
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1079 /* 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
1080 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
1081 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
1082 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
1083 }
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1084 }
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1085 /* 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
1086 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
1087 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
1088 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
1089 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
1090 } 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
1091 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
1092 }
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1093
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
1094 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
1095 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
1096 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
1097 }
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1098 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
1099
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1100 if (child_wid->resize_x > 0) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1101 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
1102 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1103 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
1104 }
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
1105 /* 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
1106 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
1107 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1108
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1109 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
1110 {
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
1111 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
1112
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
1113 uint additional_length = given_width - this->smallest_x; // Additional width given to us.
15215
c68f3c67204d (svn r19844) -Fix: Move NWidgetBase::StoreSizePosition() to an include file, and use proper inline macro.
alberth <alberth@openttd.org>
parents: 15214
diff changeset
1114 this->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
1115
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1116 /* 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
1117 * 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
1118 * 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
1119 * 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
1120 *
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1121 * 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
1122 * 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
1123 * 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
1124 * 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
1125 */
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1126
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1127 /* 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
1128 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
1129 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
1130 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
1131 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
1132 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
1133 num_changing_childs++;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1134 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
1135 } else {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1136 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
1137 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1138
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
1139 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
1140 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
1141 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1142
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1143 /* 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
1144 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
1145 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
1146 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
1147 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
1148 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
1149 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
1150 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
1151 num_changing_childs--;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1152 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
1153 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
1154 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
1155 continue;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1156 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1157 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
1158 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1159 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
1160 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1161 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
1162
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1163 /* Third loop: Compute position and call the child. */
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1164 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
1165 NWidgetBase *child_wid = rtl ? this->tail : this->head;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1166 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
1167 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
1168 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
1169 uint child_y = y + child_wid->padding_top;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1170
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1171 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
1172 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
1173
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1174 child_wid = rtl ? child_wid->prev : child_wid->next;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1175 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1176 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1177
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
1178 /** 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
1179 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
1180 {
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
1181 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
1182 }
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
1183
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1184 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
1185 {
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1186 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
1187 }
d29f1358f95b (svn r15861) -Codechange: Add NWID_HORIZONTAL_LTR that forces the ordering from left-to-right.
yexo <yexo@openttd.org>
parents: 11495
diff changeset
1188
11799
3a6a820d27e2 (svn r16189) -Doc: Additions and improvement of (mainly) nested widgets/widget-parts doxygen docs.
alberth <alberth@openttd.org>
parents: 11770
diff changeset
1189 /** 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
1190 NWidgetVertical::NWidgetVertical(NWidContainerFlags flags) : NWidgetPIPContainer(NWID_VERTICAL, flags)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1191 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1192 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1193
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1194 void NWidgetVertical::SetupSmallestSize(Window *w, bool init_array)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1195 {
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1196 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
1197 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
1198 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
1199 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
1200 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
1201 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
1202
13707
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1203 /* 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
1204 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
1205 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
1206 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
1207 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
1208 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
1209 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
1210 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
1211 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1212 /* 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
1213 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
1214 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
1215 while (true) {
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1216 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
1217 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
1218 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
1219 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
1220 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
1221 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
1222 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
1223 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
1224 /* 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
1225 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1226 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1227 }
472de6714e9a (svn r18232) -Fix: Extend container widgets to accomadate multiples of filling step size.
alberth <alberth@openttd.org>
parents: 13705
diff changeset
1228 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
1229 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
1230 }
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1231 /* 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
1232 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
1233 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
1234 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
1235 }
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1236 }
bbfb4d4f6bb2 (svn r16670) -Codechange: Containers with equally sized children are useful to have.
alberth <alberth@openttd.org>
parents: 12195
diff changeset
1237 /* 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
1238 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
1239 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
1240 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
1241 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
1242 } 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
1243 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
1244 }
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
1245
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
1246 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
1247 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
1248 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
1249 }
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1250 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
1251
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1252 if (child_wid->resize_y > 0) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1253 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
1254 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1255 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
1256 }
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
1257 /* 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
1258 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
1259 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1260
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1261 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
1262 {
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
1263 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
1264
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
1265 int additional_length = given_height - this->smallest_y; // Additional height given to us.
15215
c68f3c67204d (svn r19844) -Fix: Move NWidgetBase::StoreSizePosition() to an include file, and use proper inline macro.
alberth <alberth@openttd.org>
parents: 15214
diff changeset
1266 this->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
1267
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1268 /* 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
1269 * 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
1270 */
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1271
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1272 /* 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
1273 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
1274 uint biggest_stepsize = 0;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1275 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
1276 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
1277 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
1278 num_changing_childs++;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1279 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
1280 } else {
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1281 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
1282 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1283
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
1284 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
1285 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
1286 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1287
12091
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1288 /* 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
1289 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
1290 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
1291 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
1292 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
1293 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
1294 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
1295 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
1296 num_changing_childs--;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1297 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
1298 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
1299 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
1300 continue;
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1301 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1302 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
1303 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1304 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
1305 }
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1306 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
1307
f1a0762b5788 (svn r16501) -Codechange: Introduced different phases in resizing a nested widget tree.
alberth <alberth@openttd.org>
parents: 12082
diff changeset
1308 /* Third loop: Compute position and call the child. */
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1309 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
1310 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
1311 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
1312 uint child_height = child_wid->current_y;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1313
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1314 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
1315 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
1316 }
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
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1319 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1320 * Generic spacer widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1321 * @param length Horizontal size of the spacer widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1322 * @param height Vertical size of the spacer widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1323 */
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1324 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
1325 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1326 this->SetMinimalSize(length, height);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1327 this->SetResize(0, 0);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1328 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1329
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1330 void NWidgetSpacer::SetupSmallestSize(Window *w, bool init_array)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1331 {
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
1332 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
1333 this->smallest_y = this->min_y;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1334 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1335
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
1336 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
1337 {
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
1338 }
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
1339
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1340 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
1341 {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1342 /* Spacer widget is never visible. */
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1343 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1344
13034
6eb3f749890a (svn r17532) -Codechange: Rename several Invalidate functions to SetDirty for more consistency and distinguishability.
frosch <frosch@openttd.org>
parents: 13011
diff changeset
1345 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
1346 {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1347 /* Spacer widget never need repainting. */
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1348 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1349
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
1350 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
1351 {
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
1352 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
1353 }
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
1354
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1355 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1356 * Constructor parent nested widgets.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1357 * @param tp Type of parent widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1358 * @param colour Colour of the parent widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1359 * @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
1360 * @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
1361 * vertical container will be inserted while adding the first
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1362 * child widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1363 */
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1364 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
1365 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1366 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
1367 if (index >= 0) this->SetIndex(index);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1368 this->child = child;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1369 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1370
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1371 NWidgetBackground::~NWidgetBackground()
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1372 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1373 if (this->child != NULL) delete this->child;
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 * Add a child to the parent.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1378 * @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
1379 *
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1380 * 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
1381 * 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
1382 */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1383 void NWidgetBackground::Add(NWidgetBase *nwid)
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1384 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1385 if (this->child == NULL) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1386 this->child = new NWidgetVertical();
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1387 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1388 this->child->Add(nwid);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1389 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1390
11528
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1391 /**
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1392 * 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
1393 *
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1394 * @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
1395 * 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
1396 * @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
1397 * @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
1398 * 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
1399 * @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
1400 */
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1401 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
1402 {
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1403 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
1404 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
1405 }
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1406 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
1407 }
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
1408
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1409 void NWidgetBackground::SetupSmallestSize(Window *w, bool init_array)
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1410 {
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1411 if (init_array && this->index >= 0) {
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1412 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
1413 w->nested_array[this->index] = this;
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1414 }
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1415 if (this->child != NULL) {
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1416 this->child->SetupSmallestSize(w, init_array);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1417
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
1418 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
1419 this->smallest_y = this->child->smallest_y;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1420 this->fill_x = this->child->fill_x;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1421 this->fill_y = this->child->fill_y;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1422 this->resize_x = this->child->resize_x;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1423 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
1424
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
1425 /* 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
1426 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
1427 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
1428 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
1429 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
1430 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
1431
2e7ff39e2ec6 (svn r18195) -Codechange: move the child padding calculation/handling to WWT_FRAME
rubidium <rubidium@openttd.org>
parents: 13665
diff changeset
1432 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
1433 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
1434
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
1435 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
1436 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
1437 }
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
1438 } 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
1439 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
1440 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
1441 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
1442 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
1443 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
1444 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
1445 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
1446 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
1447 d = maxdim(d, background);
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1448 }
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
1449 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
1450 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
1451 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
1452 }
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
1453 }
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
1454 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
1455 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
1456 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
1457 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
1458 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
1459 this->resize_y = resize.height;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1460 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1461 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1462
13676
e9a201c03e65 (svn r18201) -Codechange (r18092): No need anymore for initializing nested widgets for Widget* arrays.
alberth <alberth@openttd.org>
parents: 13670
diff changeset
1463 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
1464 {
15215
c68f3c67204d (svn r19844) -Fix: Move NWidgetBase::StoreSizePosition() to an include file, and use proper inline macro.
alberth <alberth@openttd.org>
parents: 15214
diff changeset
1465 this->StoreSizePosition(sizing, x, y, given_width, given_height);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1466
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
1467 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
1468 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
1469 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
1470 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
1471 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
1472 }
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1473 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1474
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
1475 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
1476 {
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
1477 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
1478 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
1479 }
1fd1aea7e009 (svn r17023) -Revert (r16839): FillNestedArray() was less obsolete than anticipated.
alberth <alberth@openttd.org>
parents: 12577
diff changeset
1480
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1481 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
1482 {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1483 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
1484
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1485 Rect r;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1486 r.left = this->pos_x;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1487 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
1488 r.top = this->pos_y;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1489 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
1490
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1491 const DrawPixelInfo *dpi = _cur_dpi;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1492 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
1493
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1494 switch (this->type) {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1495 case WWT_PANEL:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1496 assert(this->widget_data == 0);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1497 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
1498 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1499
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1500 case WWT_FRAME:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1501 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
1502 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
1503 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1504
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1505 case WWT_INSET:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1506 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
1507 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
1508 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1509
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1510 default:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1511 NOT_REACHED();
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1512 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1513
12896
04374f6dcdc8 (svn r17388) -Codechange: Paint the background of background widgets before painting its children.
alberth <alberth@openttd.org>
parents: 12884
diff changeset
1514 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
1515 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
1516
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1517 if (this->IsDisabled()) {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1518 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
1519 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1520 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1521
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
1522 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
1523 {
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
1524 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
1525 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
1526 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
1527 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
1528 }
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
1529 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
1530 }
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
1531
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
1532 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
1533 {
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
1534 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
1535 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
1536 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
1537 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
1538 }
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
1539
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1540 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
1541 {
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1542 this->SetIndex(index);
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1543 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1544
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1545 void NWidgetViewport::SetupSmallestSize(Window *w, bool init_array)
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1546 {
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1547 if (init_array && this->index >= 0) {
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1548 assert(w->nested_array_size > (uint)this->index);
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1549 w->nested_array[this->index] = this;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1550 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1551 this->smallest_x = this->min_x;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1552 this->smallest_y = this->min_y;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1553 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1554
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1555 void NWidgetViewport::Draw(const Window *w)
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1556 {
12897
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1557 if (this->disp_flags & ND_NO_TRANSPARENCY) {
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1558 TransparencyOptionBits to_backup = _transparency_opt;
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1559 _transparency_opt = 0; // Disable all transparency
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1560 w->DrawViewport();
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1561 _transparency_opt = to_backup;
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1562 } else {
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1563 w->DrawViewport();
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1564 }
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1565
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1566 /* Optionally shade the viewport. */
323d905aa7b9 (svn r17389) -Codechange: Add support for shaded viewports.
alberth <alberth@openttd.org>
parents: 12896
diff changeset
1567 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
1568 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
1569 (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
1570 }
12526
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1571 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1572
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1573 /**
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1574 * Initialize the viewport of the window.
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1575 * @param w Window owning the viewport.
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1576 * @param follow_flags Type of viewport, see #InitializeViewport().
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1577 * @param zoom Zoom level.
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1578 */
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1579 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
1580 {
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1581 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
1582 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1583
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1584 /**
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1585 * 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
1586 * @param w Window owning the viewport.
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1587 */
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1588 void NWidgetViewport::UpdateViewportCoordinates(Window *w)
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1589 {
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1590 ViewPort *vp = w->viewport;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1591 if (vp != NULL) {
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1592 vp->left = w->left + this->pos_x;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1593 vp->top = w->top + this->pos_y;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1594 vp->width = this->current_x;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1595 vp->height = this->current_y;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1596
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1597 vp->virtual_width = ScaleByZoom(vp->width, vp->zoom);
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1598 vp->virtual_height = ScaleByZoom(vp->height, vp->zoom);
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1599 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1600 }
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
1601
15782
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1602 /**
15784
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1603 * Compute the row of a scrolled widget that a user clicked in.
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1604 * @param clickpos Vertical position of the mouse click (without taking scrolling into account).
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1605 * @param widget Widget number of the widget clicked in.
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1606 * @param padding Amount of empty space between the widget edge and the top of the first row. Default value is \c 0.
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1607 * @param line_height Height of a single row. A negative value means using the vertical resize step of the widget.
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1608 * @return Row number clicked at. If clicked at a wrong position, #INT_MAX is returned.
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1609 */
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1610 int Scrollbar::GetScrolledRowFromWidget(int clickpos, const Window * const w, int widget, int padding, int line_height) const
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1611 {
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1612 uint pos = w->GetRowFromWidget(clickpos, widget, padding, line_height);
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1613 if (pos != INT_MAX) pos += this->GetPosition();
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1614 return (pos >= this->GetCount()) ? INT_MAX : pos;
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1615 }
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1616
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1617 /**
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1618 * Set capacity of visible elements from the size and resize properties of a widget.
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1619 * @param w Window.
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1620 * @param widget Widget with size and resize properties.
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1621 * @param padding Padding to subtract from the size.
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1622 * @note Updates the position if needed.
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1623 */
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1624 void Scrollbar::SetCapacityFromWidget(Window *w, int widget, int padding)
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1625 {
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1626 NWidgetBase *nwid = w->GetWidget<NWidgetBase>(widget);
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1627 if (this->is_vertical) {
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1628 this->SetCapacity(((int)nwid->current_y - padding) / (int)nwid->resize_y);
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1629 } else {
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1630 this->SetCapacity(((int)nwid->current_x - padding) / (int)nwid->resize_x);
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1631 }
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1632 }
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1633
93083c350208 (svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
frosch <frosch@openttd.org>
parents: 15783
diff changeset
1634 /**
15782
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1635 * Scrollbar widget.
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1636 * @param tp Scrollbar type. (horizontal/vertical)
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1637 * @param colour Colour of the scrollbar.
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1638 * @param index Index in the widget array used by the window system.
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1639 */
15787
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
1640 NWidgetScrollbar::NWidgetScrollbar(WidgetType tp, Colours colour, int index) : NWidgetCore(tp, colour, 1, 1, 0x0, STR_NULL), Scrollbar(tp != NWID_HSCROLLBAR)
15782
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1641 {
15787
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
1642 assert(tp == NWID_HSCROLLBAR || tp == NWID_VSCROLLBAR);
15782
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1643 this->SetIndex(index);
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1644
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1645 switch (this->type) {
15787
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
1646 case NWID_HSCROLLBAR:
15903
7585966382b1 (svn r20587) -Codechange (r20456)[FS#4035]: Revert to scrollbars without minimal size to simplify window setup.
frosch <frosch@openttd.org>
parents: 15894
diff changeset
1647 this->SetMinimalSize(0, WD_HSCROLLBAR_HEIGHT);
15782
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1648 this->SetResize(1, 0);
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1649 this->SetFill(1, 0);
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1650 this->SetDataTip(0x0, STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST);
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1651 break;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1652
15787
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
1653 case NWID_VSCROLLBAR:
15903
7585966382b1 (svn r20587) -Codechange (r20456)[FS#4035]: Revert to scrollbars without minimal size to simplify window setup.
frosch <frosch@openttd.org>
parents: 15894
diff changeset
1654 this->SetMinimalSize(WD_VSCROLLBAR_WIDTH, 0);
15782
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1655 this->SetResize(0, 1);
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1656 this->SetFill(0, 1);
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1657 this->SetDataTip(0x0, STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST);
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1658 break;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1659
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1660 default: NOT_REACHED();
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1661 }
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1662 }
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1663
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1664 void NWidgetScrollbar::SetupSmallestSize(Window *w, bool init_array)
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1665 {
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1666 if (init_array && this->index >= 0) {
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1667 assert(w->nested_array_size > (uint)this->index);
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1668 w->nested_array[this->index] = this;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1669 }
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1670 this->smallest_x = this->min_x;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1671 this->smallest_y = this->min_y;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1672 }
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1673
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1674 void NWidgetScrollbar::Draw(const Window *w)
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1675 {
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1676 if (this->current_x == 0 || this->current_y == 0) return;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1677
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1678 Rect r;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1679 r.left = this->pos_x;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1680 r.right = this->pos_x + this->current_x - 1;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1681 r.top = this->pos_y;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1682 r.bottom = this->pos_y + this->current_y - 1;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1683
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1684 const DrawPixelInfo *dpi = _cur_dpi;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1685 if (dpi->left > r.right || dpi->left + dpi->width <= r.left || dpi->top > r.bottom || dpi->top + dpi->height <= r.top) return;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1686
15786
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
1687 bool up_lowered = HasBit(this->disp_flags, NDB_SCROLLBAR_UP);
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
1688 bool down_lowered = HasBit(this->disp_flags, NDB_SCROLLBAR_DOWN);
16221
4f317dcb219a (svn r20922) -Fix [FS#4071]: accidentally moving the mouse of the scrollbar arrows while pressing it clicks the button next to the arrow
rubidium <rubidium@openttd.org>
parents: 15903
diff changeset
1689 bool middle_lowered = !(this->disp_flags & ND_SCROLLBAR_BTN) && w->scrolling_scrollbar == this->index;
15782
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1690
15787
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
1691 if (this->type == NWID_HSCROLLBAR) {
15786
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
1692 DrawHorizontalScrollbar(r, this->colour, up_lowered, middle_lowered, down_lowered, this);
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
1693 } else {
04cd1d957b49 (svn r20460) -Codechange: Remove WF_SCROLL window flags and store the state directly in the scrollbar widget instead.
frosch <frosch@openttd.org>
parents: 15785
diff changeset
1694 DrawVerticalScrollbar(r, this->colour, up_lowered, middle_lowered, down_lowered, this);
15782
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1695 }
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1696
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1697 if (this->IsDisabled()) {
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1698 GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, _colour_gradient[this->colour & 0xF][2], FILLRECT_CHECKER);
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1699 }
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1700 }
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1701
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
1702 /** 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
1703 /* 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
1704 {
14040
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1705 shadebox_dimension.width = shadebox_dimension.height = 0;
15080
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1706 debugbox_dimension.width = debugbox_dimension.height = 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
1707 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
1708 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
1709 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
1710 }
62259c3dc887 (svn r16798) -Fix [FS#3016]: Added several new widget distances for better widget size computations.
alberth <alberth@openttd.org>
parents: 12371
diff changeset
1711
14040
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1712 Dimension NWidgetLeaf::shadebox_dimension = {0, 0};
15080
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1713 Dimension NWidgetLeaf::debugbox_dimension = {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
1714 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
1715 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
1716 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
1717
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1718 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1719 * 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
1720 * @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
1721 * @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
1722 * @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
1723 * @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
1724 * @param tip Tooltip of the widget.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1725 */
13704
af90d4bf0785 (svn r18229) -Codechange: Make fill_x, fill_y a number instead of a bool.
alberth <alberth@openttd.org>
parents: 13698
diff changeset
1726 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
1727 {
15080
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1728 assert(index >= 0 || tp == WWT_LABEL || tp == WWT_TEXT || tp == WWT_CAPTION || tp == WWT_RESIZEBOX || tp == WWT_SHADEBOX || tp == WWT_DEBUGBOX || tp == WWT_STICKYBOX || tp == WWT_CLOSEBOX);
13742
a0aa80f5d2d2 (svn r18267) -Codechange: make the music window big font aware
rubidium <rubidium@openttd.org>
parents: 13707
diff changeset
1729 if (index >= 0) this->SetIndex(index);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1730 this->SetMinimalSize(0, 0);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1731 this->SetResize(0, 0);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1732
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1733 switch (tp) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1734 case WWT_EMPTY:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1735 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1736
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1737 case WWT_PUSHBTN:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1738 case WWT_IMGBTN:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1739 case WWT_PUSHIMGBTN:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1740 case WWT_IMGBTN_2:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1741 case WWT_TEXTBTN:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1742 case WWT_PUSHTXTBTN:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1743 case WWT_TEXTBTN_2:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1744 case WWT_LABEL:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1745 case WWT_TEXT:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1746 case WWT_MATRIX:
13664
ce197674184d (svn r18188) -Codechange: s/NWID_BUTTON_DRPDOWN/NWID_BUTTON_DROPDOWN/g
rubidium <rubidium@openttd.org>
parents: 13662
diff changeset
1747 case NWID_BUTTON_DROPDOWN:
15795
c9cf5fe6d6a1 (svn r20470) -Codechange: Make arrow buttons lower and raise like other buttons when clicked.
frosch <frosch@openttd.org>
parents: 15788
diff changeset
1748 case WWT_ARROWBTN:
c9cf5fe6d6a1 (svn r20470) -Codechange: Make arrow buttons lower and raise like other buttons when clicked.
frosch <frosch@openttd.org>
parents: 15788
diff changeset
1749 case WWT_PUSHARROWBTN:
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);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1751 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1752
15727
e7ce9e72e50f (svn r20394) -Fix [FS#4010]: make the default minimum width for editboxes 10 pixels
yexo <yexo@openttd.org>
parents: 15620
diff changeset
1753 case WWT_EDITBOX:
e7ce9e72e50f (svn r20394) -Fix [FS#4010]: make the default minimum width for editboxes 10 pixels
yexo <yexo@openttd.org>
parents: 15620
diff changeset
1754 this->SetMinimalSize(10, 0);
e7ce9e72e50f (svn r20394) -Fix [FS#4010]: make the default minimum width for editboxes 10 pixels
yexo <yexo@openttd.org>
parents: 15620
diff changeset
1755 this->SetFill(0, 0);
e7ce9e72e50f (svn r20394) -Fix [FS#4010]: make the default minimum width for editboxes 10 pixels
yexo <yexo@openttd.org>
parents: 15620
diff changeset
1756 break;
e7ce9e72e50f (svn r20394) -Fix [FS#4010]: make the default minimum width for editboxes 10 pixels
yexo <yexo@openttd.org>
parents: 15620
diff changeset
1757
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1758 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
1759 this->SetFill(1, 0);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1760 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
1761 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
1762 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
1763 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1764
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1765 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
1766 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
1767 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
1768 this->SetDataTip(STR_NULL, STR_TOOLTIP_STICKY);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1769 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1770
14040
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1771 case WWT_SHADEBOX:
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1772 this->SetFill(0, 0);
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1773 this->SetMinimalSize(WD_SHADEBOX_TOP, 14);
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1774 this->SetDataTip(STR_NULL, STR_TOOLTIP_SHADE);
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1775 break;
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1776
15080
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1777 case WWT_DEBUGBOX:
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1778 this->SetFill(0, 0);
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1779 this->SetMinimalSize(WD_DEBUGBOX_TOP, 14);
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1780 this->SetDataTip(STR_NULL, STR_TOOLTIP_DEBUG);
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1781 break;
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1782
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1783 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
1784 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
1785 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
1786 this->SetDataTip(STR_NULL, STR_TOOLTIP_RESIZE);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1787 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1788
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1789 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
1790 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
1791 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
1792 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
1793 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1794
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1795 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
1796 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
1797 this->min_y = WD_DROPDOWN_HEIGHT;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1798 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1799
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1800 default:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1801 NOT_REACHED();
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1802 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1803 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
1804
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
1805 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
1806 {
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
1807 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
1808 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
1809 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
1810 }
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
1811
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
1812 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
1813 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
1814 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
1815 /* 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
1816 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
1817 switch (this->type) {
15782
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
1818 case WWT_EMPTY: {
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
1819 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
1820 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
1821 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
1822 }
12577
7d27f0e5a0cd (svn r17017) -Fix (r17008): Setup padding for WWT_MATRIX.
alberth <alberth@openttd.org>
parents: 12526
diff changeset
1823 case WWT_MATRIX: {
7d27f0e5a0cd (svn r17017) -Fix (r17008): Setup padding for WWT_MATRIX.
alberth <alberth@openttd.org>
parents: 12526
diff changeset
1824 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
1825 padding = &extra;
7d27f0e5a0cd (svn r17017) -Fix (r17008): Setup padding for WWT_MATRIX.
alberth <alberth@openttd.org>
parents: 12526
diff changeset
1826 break;
7d27f0e5a0cd (svn r17017) -Fix (r17008): Setup padding for WWT_MATRIX.
alberth <alberth@openttd.org>
parents: 12526
diff changeset
1827 }
14040
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1828 case WWT_SHADEBOX: {
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1829 static const Dimension extra = {WD_SHADEBOX_LEFT + WD_SHADEBOX_RIGHT, WD_SHADEBOX_TOP + WD_SHADEBOX_BOTTOM};
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1830 padding = &extra;
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1831 if (NWidgetLeaf::shadebox_dimension.width == 0) {
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1832 NWidgetLeaf::shadebox_dimension = maxdim(GetSpriteSize(SPR_WINDOW_SHADE), GetSpriteSize(SPR_WINDOW_UNSHADE));
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1833 NWidgetLeaf::shadebox_dimension.width += extra.width;
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1834 NWidgetLeaf::shadebox_dimension.height += extra.height;
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1835 }
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1836 size = maxdim(size, NWidgetLeaf::shadebox_dimension);
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1837 break;
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
1838 }
15080
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1839 case WWT_DEBUGBOX:
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1840 if (_settings_client.gui.newgrf_developer_tools && w->IsNewGRFInspectable()) {
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1841 static const Dimension extra = {WD_DEBUGBOX_LEFT + WD_DEBUGBOX_RIGHT, WD_DEBUGBOX_TOP + WD_DEBUGBOX_BOTTOM};
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1842 padding = &extra;
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1843 if (NWidgetLeaf::debugbox_dimension.width == 0) {
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1844 NWidgetLeaf::debugbox_dimension = GetSpriteSize(SPR_WINDOW_DEBUG);
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1845 NWidgetLeaf::debugbox_dimension.width += extra.width;
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1846 NWidgetLeaf::debugbox_dimension.height += extra.height;
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1847 }
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1848 size = maxdim(size, NWidgetLeaf::debugbox_dimension);
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1849 } else {
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1850 /* If the setting is disabled we don't want to see it! */
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1851 size.width = 0;
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1852 fill.width = 0;
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1853 resize.width = 0;
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1854 }
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1855 break;
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
1856
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
1857 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
1858 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
1859 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
1860 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
1861 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
1862 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
1863 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
1864 }
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 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
1866 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
1867 }
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 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
1869 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
1870 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
1871 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
1872 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
1873 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
1874 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
1875 }
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 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
1877 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
1878 }
13576
7d9d6446b83f (svn r18099) -Codechange: scale the edit boxes to the fontsize
rubidium <rubidium@openttd.org>
parents: 13570
diff changeset
1879 case WWT_EDITBOX:
7d9d6446b83f (svn r18099) -Codechange: scale the edit boxes to the fontsize
rubidium <rubidium@openttd.org>
parents: 13570
diff changeset
1880 size.height = max(size.height, GetStringBoundingBox("_").height + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM);
15579
5f128be91f59 (svn r20239) -Doc: Give a common name to all fall throughs (FALL THROUGH).
terkhen <terkhen@openttd.org>
parents: 15400
diff changeset
1881 /* FALL THROUGH */
13576
7d9d6446b83f (svn r18099) -Codechange: scale the edit boxes to the fontsize
rubidium <rubidium@openttd.org>
parents: 13570
diff changeset
1882 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
1883 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
1884 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
1885 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
1886 }
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_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
1888 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
1889 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
1890 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
1891 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
1892 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
1893 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
1894 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
1895 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
1896 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
1897 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
1898 }
15795
c9cf5fe6d6a1 (svn r20470) -Codechange: Make arrow buttons lower and raise like other buttons when clicked.
frosch <frosch@openttd.org>
parents: 15788
diff changeset
1899 case WWT_ARROWBTN:
c9cf5fe6d6a1 (svn r20470) -Codechange: Make arrow buttons lower and raise like other buttons when clicked.
frosch <frosch@openttd.org>
parents: 15788
diff changeset
1900 case WWT_PUSHARROWBTN: {
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
1901 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
1902 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
1903 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
1904 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
1905 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
1906 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
1907 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
1908 }
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
1909
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
1910 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
1911 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
1912 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
1913 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
1914 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
1915 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
1916 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
1917 }
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
1918 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
1919 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
1920 }
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 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
1922 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
1923 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
1924 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
1925 padding = &extra;
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1926 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
1927 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
1928 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
1929 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
1930 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
1931 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
1932 }
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
1933 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
1934 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
1935 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
1936 padding = &extra;
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1937 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
1938 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
1939 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
1940 }
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
1941 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
1942 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
1943 padding = &extra;
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1944 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
1945 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
1946 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
1947 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
1948 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
1949 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
1950 }
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
1951 case WWT_DROPDOWN:
13664
ce197674184d (svn r18188) -Codechange: s/NWID_BUTTON_DRPDOWN/NWID_BUTTON_DROPDOWN/g
rubidium <rubidium@openttd.org>
parents: 13662
diff changeset
1952 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
1953 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
1954 padding = &extra;
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
1955 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
1956 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
1957 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
1958 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
1959 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
1960 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
1961 }
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
1962 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
1963 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
1964 }
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
1965
13705
8dee47e001b2 (svn r18230) -Codechange: Allow fill stepsize to be set from Window::UpdateWidgetSize().
alberth <alberth@openttd.org>
parents: 13704
diff changeset
1966 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
1967
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
1968 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
1969 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
1970 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
1971 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
1972 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
1973 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
1974 }
5ae30511f96c (svn r16740) -Codechange: Self-sizing widgets in intro screen, town directory, and found town windows.
alberth <alberth@openttd.org>
parents: 12310
diff changeset
1975
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1976 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
1977 {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1978 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
1979
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1980 Rect r;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1981 r.left = this->pos_x;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1982 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
1983 r.top = this->pos_y;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1984 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
1985
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1986 const DrawPixelInfo *dpi = _cur_dpi;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1987 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
1988
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1989 bool clicked = this->IsLowered();
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1990 switch (this->type) {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1991 case WWT_EMPTY:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1992 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1993
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1994 case WWT_PUSHBTN:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1995 assert(this->widget_data == 0);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1996 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
1997 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1998
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
1999 case WWT_IMGBTN:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2000 case WWT_PUSHIMGBTN:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2001 case WWT_IMGBTN_2:
12408
a1c0de97cd50 (svn r16842) -Cleanup: add some spaces around a few operators
rubidium <rubidium@openttd.org>
parents: 12405
diff changeset
2002 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
2003 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2004
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2005 case WWT_TEXTBTN:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2006 case WWT_PUSHTXTBTN:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2007 case WWT_TEXTBTN_2:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
2008 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
2009 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
2010 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
2011 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2012
15795
c9cf5fe6d6a1 (svn r20470) -Codechange: Make arrow buttons lower and raise like other buttons when clicked.
frosch <frosch@openttd.org>
parents: 15788
diff changeset
2013 case WWT_ARROWBTN:
c9cf5fe6d6a1 (svn r20470) -Codechange: Make arrow buttons lower and raise like other buttons when clicked.
frosch <frosch@openttd.org>
parents: 15788
diff changeset
2014 case WWT_PUSHARROWBTN: {
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
2015 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
2016 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
2017 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
2018 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
2019 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
2020 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
2021 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
2022 }
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
2023 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
2024 }
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
2025
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2026 case WWT_LABEL:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
2027 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
2028 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
2029 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2030
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2031 case WWT_TEXT:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
2032 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
2033 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
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_MATRIX:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2037 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
2038 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2039
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2040 case WWT_EDITBOX:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2041 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
2042 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2043
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2044 case WWT_CAPTION:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
2045 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
2046 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
2047 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2048
14040
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
2049 case WWT_SHADEBOX:
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
2050 assert(this->widget_data == 0);
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
2051 DrawShadeBox(r, this->colour, w->IsShaded());
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
2052 break;
869eedf8fbc5 (svn r18583) -Codechange: Add WWT_SHADEBOX widget and its functions (heavily based on code by erikjanp).
alberth <alberth@openttd.org>
parents: 13956
diff changeset
2053
15080
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
2054 case WWT_DEBUGBOX:
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
2055 DrawDebugBox(r, this->colour, clicked);
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
2056 break;
5eeefe395a96 (svn r19706) -Add: support for the (NewGRF) debug box
rubidium <rubidium@openttd.org>
parents: 14258
diff changeset
2057
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2058 case WWT_STICKYBOX:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2059 assert(this->widget_data == 0);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2060 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
2061 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2062
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2063 case WWT_RESIZEBOX:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2064 assert(this->widget_data == 0);
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2065 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
2066 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2067
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2068 case WWT_CLOSEBOX:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2069 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
2070 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2071
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2072 case WWT_DROPDOWN:
12516
49534d3a6b57 (svn r16953) -Codechange: Use SetStringParameters() for simple parameterized strings.
alberth <alberth@openttd.org>
parents: 12493
diff changeset
2073 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
2074 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
2075 break;
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2076
13664
ce197674184d (svn r18188) -Codechange: s/NWID_BUTTON_DRPDOWN/NWID_BUTTON_DROPDOWN/g
rubidium <rubidium@openttd.org>
parents: 13662
diff changeset
2077 case NWID_BUTTON_DROPDOWN:
13075
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2078 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
2079 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
2080 break;
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2081
12101
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2082 default:
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2083 NOT_REACHED();
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2084 }
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
2085 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
2086
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2087 if (this->IsDisabled()) {
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2088 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
2089 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2090 }
dc6c0caea002 (svn r16514) -Codechange: Add widget flags, and drawing and invalidating.
alberth <alberth@openttd.org>
parents: 12100
diff changeset
2091
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2092 /**
13664
ce197674184d (svn r18188) -Codechange: s/NWID_BUTTON_DRPDOWN/NWID_BUTTON_DROPDOWN/g
rubidium <rubidium@openttd.org>
parents: 13662
diff changeset
2093 * 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
2094 * @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
2095 * @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
2096 *
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
2097 * @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
2098 */
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2099 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
2100 {
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2101 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
2102 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
2103 return pt.x < button_width;
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2104 } else {
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2105 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
2106 return pt.x >= button_left;
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2107 }
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2108 }
0a2c74e86245 (svn r17575) -Codechange: Adding a new combined button+dropdown widget.
alberth <alberth@openttd.org>
parents: 13074
diff changeset
2109
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2110 /* == Conversion code from NWidgetPart array to NWidgetBase* tree == */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2111
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2112 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2113 * 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
2114 *
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2115 * 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
2116 * settings that follow it, until encountering a #EndContainer, another
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2117 * #NWidget, or the end of the parts array.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2118 *
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2119 * @param parts Array with parts of the nested widget.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2120 * @param count Length of the \a parts array.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2121 * @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
2122 * @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
2123 * @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
2124 * @return Number of widget part elements used to compose the widget.
13954
79b889a3a0cd (svn r18490) -Doc: Fixed syntax of a few doxygen pre and post coditions.
alberth <alberth@openttd.org>
parents: 13946
diff changeset
2125 * @pre \c biggest_index != NULL.
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2126 */
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2127 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
2128 {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2129 int num_used = 0;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2130
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2131 *dest = NULL;
11750
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2132 *fill_dest = false;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2133
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2134 while (count > num_used) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2135 switch (parts->type) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2136 case NWID_SPACER:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2137 if (*dest != NULL) return num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2138 *dest = new NWidgetSpacer(0, 0);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2139 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2140
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2141 case NWID_HORIZONTAL:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2142 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
2143 *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
2144 *fill_dest = true;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2145 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2146
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
2147 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
2148 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
2149 *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
2150 *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
2151 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
2152
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2153 case WWT_PANEL:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2154 case WWT_INSET:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2155 case WWT_FRAME:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2156 if (*dest != NULL) return num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2157 *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
2158 *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
2159 *fill_dest = true;
11461
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 case NWID_VERTICAL:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2163 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
2164 *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
2165 *fill_dest = true;
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2166 break;
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2167
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2168 case WPT_FUNCTION: {
11750
924e26095f16 (svn r16140) -Codechange: Call a function while contructing a widget tree.
alberth <alberth@openttd.org>
parents: 11730
diff changeset
2169 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
2170 /* 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
2171 int biggest = -1;
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2172 *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
2173 *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
2174 *fill_dest = false;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2175 break;
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2176 }
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2177
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2178 case WPT_RESIZE: {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2179 NWidgetResizeBase *nwrb = dynamic_cast<NWidgetResizeBase *>(*dest);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2180 if (nwrb != NULL) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2181 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
2182 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
2183 }
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_MINSIZE: {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2188 NWidgetResizeBase *nwrb = dynamic_cast<NWidgetResizeBase *>(*dest);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2189 if (nwrb != NULL) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2190 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
2191 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
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
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
2196 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
2197 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
2198 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
2199 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
2200 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
2201 }
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
2202 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
2203 }
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
2204
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2205 case WPT_FILL: {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2206 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
2207 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
2208 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2209 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2210
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2211 case WPT_DATATIP: {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2212 NWidgetCore *nwc = dynamic_cast<NWidgetCore *>(*dest);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2213 if (nwc != NULL) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2214 nwc->widget_data = parts->u.data_tip.data;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2215 nwc->tool_tip = parts->u.data_tip.tooltip;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2216 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2217 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2218 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2219
11811
b32bfec54ff8 (svn r16201) -Codechange: Add NWidgetBase::SetPadding method.
alberth <alberth@openttd.org>
parents: 11800
diff changeset
2220 case WPT_PADDING:
b32bfec54ff8 (svn r16201) -Codechange: Add NWidgetBase::SetPadding method.
alberth <alberth@openttd.org>
parents: 11800
diff changeset
2221 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
2222 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
2223
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
2224 case WPT_PIPSPACE: {
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
2225 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
2226 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
2227
2ee677c87220 (svn r15889) -Codechange: Add pre/inter/post space to nested background widgets
alberth <alberth@openttd.org>
parents: 11511
diff changeset
2228 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
2229 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
2230 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
2231 }
bf92950ea00b (svn r15872) -Codechange: add paddings for widgets, this makes writing new widget arrays less cumbersome.
yexo <yexo@openttd.org>
parents: 11500
diff changeset
2232
15778
4f4c3160cca8 (svn r20452) -Codechange: Remove NWidgetCore::FindScrollbar() and associate scrollbar explicitly using a NWidgetPart via SetScrollbar().
frosch <frosch@openttd.org>
parents: 15727
diff changeset
2233 case WPT_SCROLLBAR: {
4f4c3160cca8 (svn r20452) -Codechange: Remove NWidgetCore::FindScrollbar() and associate scrollbar explicitly using a NWidgetPart via SetScrollbar().
frosch <frosch@openttd.org>
parents: 15727
diff changeset
2234 NWidgetCore *nwc = dynamic_cast<NWidgetCore *>(*dest);
4f4c3160cca8 (svn r20452) -Codechange: Remove NWidgetCore::FindScrollbar() and associate scrollbar explicitly using a NWidgetPart via SetScrollbar().
frosch <frosch@openttd.org>
parents: 15727
diff changeset
2235 if (nwc != NULL) {
4f4c3160cca8 (svn r20452) -Codechange: Remove NWidgetCore::FindScrollbar() and associate scrollbar explicitly using a NWidgetPart via SetScrollbar().
frosch <frosch@openttd.org>
parents: 15727
diff changeset
2236 nwc->scrollbar_index = parts->u.widget.index;
4f4c3160cca8 (svn r20452) -Codechange: Remove NWidgetCore::FindScrollbar() and associate scrollbar explicitly using a NWidgetPart via SetScrollbar().
frosch <frosch@openttd.org>
parents: 15727
diff changeset
2237 }
4f4c3160cca8 (svn r20452) -Codechange: Remove NWidgetCore::FindScrollbar() and associate scrollbar explicitly using a NWidgetPart via SetScrollbar().
frosch <frosch@openttd.org>
parents: 15727
diff changeset
2238 break;
4f4c3160cca8 (svn r20452) -Codechange: Remove NWidgetCore::FindScrollbar() and associate scrollbar explicitly using a NWidgetPart via SetScrollbar().
frosch <frosch@openttd.org>
parents: 15727
diff changeset
2239 }
4f4c3160cca8 (svn r20452) -Codechange: Remove NWidgetCore::FindScrollbar() and associate scrollbar explicitly using a NWidgetPart via SetScrollbar().
frosch <frosch@openttd.org>
parents: 15727
diff changeset
2240
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2241 case WPT_ENDCONTAINER:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2242 return num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2243
12526
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
2244 case NWID_VIEWPORT:
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
2245 if (*dest != NULL) return num_used;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
2246 *dest = new NWidgetViewport(parts->u.widget.index);
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
2247 *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
2248 break;
3d39b4181f66 (svn r16963) -Codechange: Added NWidgetViewport widget.
alberth <alberth@openttd.org>
parents: 12524
diff changeset
2249
15787
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
2250 case NWID_HSCROLLBAR:
6c4bec3b8401 (svn r20461) -Codechange: Replace WWT_HSCROLLBAR, WWT_SCROLLBAR and WWT_SCROLL2BAR with NWID_HSCROLLBAR and NWID_VSCROLLBAR.
frosch <frosch@openttd.org>
parents: 15786
diff changeset
2251 case NWID_VSCROLLBAR:
15782
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
2252 if (*dest != NULL) return num_used;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
2253 *dest = new NWidgetScrollbar(parts->type, parts->u.widget.colour, parts->u.widget.index);
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
2254 *biggest_index = max(*biggest_index, (int)parts->u.widget.index);
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
2255 break;
ae6efcfbfe64 (svn r20456) -Codechange: Add separate nested widget class for scrollbars.
frosch <frosch@openttd.org>
parents: 15779
diff changeset
2256
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
2257 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
2258 if (*dest != NULL) return num_used;
13565
40a13e194fd0 (svn r18087) -Codechange: remove NWID_LAYERED
rubidium <rubidium@openttd.org>
parents: 13543
diff changeset
2259 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
2260 *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
2261 *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
2262 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
2263 *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
2264 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
2265 }
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
2266
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2267 default:
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2268 if (*dest != NULL) return num_used;
15795
c9cf5fe6d6a1 (svn r20470) -Codechange: Make arrow buttons lower and raise like other buttons when clicked.
frosch <frosch@openttd.org>
parents: 15788
diff changeset
2269 assert((parts->type & WWT_MASK) < WWT_LAST || parts->type == NWID_BUTTON_DROPDOWN);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2270 *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
2271 *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
2272 break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2273 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2274 num_used++;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2275 parts++;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2276 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2277
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2278 return num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2279 }
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 * 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
2283 * @param parts Array with parts of the nested widgets.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2284 * @param count Length of the \a parts array.
14041
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2285 * @param parent Pointer or container to use for storing the child widgets (*parent == NULL or *parent == container or background widget).
12403
0024ba6bb40e (svn r16837) -Codechange: Collect largest used index while constructing nested widget tree.
alberth <alberth@openttd.org>
parents: 12373
diff changeset
2286 * @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
2287 * @return Number of widget part elements used to fill the container.
13954
79b889a3a0cd (svn r18490) -Doc: Fixed syntax of a few doxygen pre and post coditions.
alberth <alberth@openttd.org>
parents: 13946
diff changeset
2288 * @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
2289 */
14041
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2290 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
2291 {
14041
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2292 /* If *parent == NULL, only the first widget is read and returned. Otherwise, *parent must point to either
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2293 * a #NWidgetContainer or a #NWidgetBackground object, and parts are added as much as possible. */
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2294 NWidgetContainer *nwid_cont = dynamic_cast<NWidgetContainer *>(*parent);
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2295 NWidgetBackground *nwid_parent = dynamic_cast<NWidgetBackground *>(*parent);
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2296 assert(*parent == NULL || (nwid_cont != NULL && nwid_parent == NULL) || (nwid_cont == NULL && nwid_parent != NULL));
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2297
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2298 int total_used = 0;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2299 while (true) {
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2300 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
2301 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
2302 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
2303 parts += num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2304 total_used += num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2305
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2306 /* Break out of loop when end reached */
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2307 if (sub_widget == NULL) break;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2308
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2309 /* 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
2310 WidgetType tp = sub_widget->type;
11800
3ab4d2cd4ea5 (svn r16190) -Codechange: Allow stacking of nested widgets.
alberth <alberth@openttd.org>
parents: 11799
diff changeset
2311 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
2312 || tp == WWT_PANEL || tp == WWT_FRAME || tp == WWT_INSET || tp == NWID_SELECTION)) {
14041
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2313 NWidgetBase *sub_ptr = sub_widget;
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2314 int num_used = MakeWidgetTree(parts, count - total_used, &sub_ptr, biggest_index);
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2315 parts += num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2316 total_used += num_used;
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2317 }
14041
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2318
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2319 /* Add sub_widget to parent container if available, otherwise return the widget to the caller. */
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2320 if (nwid_cont) nwid_cont->Add(sub_widget);
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2321 if (nwid_parent) nwid_parent->Add(sub_widget);
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2322 if (!nwid_cont && !nwid_parent) {
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2323 *parent = sub_widget;
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2324 return total_used;
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2325 }
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2326 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2327
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2328 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
2329
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2330 assert(total_used < count);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2331 assert(parts->type == WPT_ENDCONTAINER);
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2332 return total_used + 1; // *parts is also 'used'
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2333 }
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2334
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2335 /**
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2336 * 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
2337 * @param parts Array with parts of the widgets.
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2338 * @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
2339 * @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
2340 * @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
2341 * @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
2342 * @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
2343 * @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
2344 * @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
2345 */
13469
3783590f0d39 (svn r17984) -Codechange: make it possible to use MakeNWidgets using a custom container widget.
rubidium <rubidium@openttd.org>
parents: 13394
diff changeset
2346 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
2347 {
12404
375cd4fb8ae3 (svn r16838) -Codechange: Fill Window::nested_array in SetupSmallestSize.
alberth <alberth@openttd.org>
parents: 12403
diff changeset
2348 *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
2349 if (container == NULL) container = new NWidgetVertical();
14041
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2350 NWidgetBase *cont_ptr = container;
b231a976136b (svn r18584) -Codechange: Generalize MakeWidgetTree to read only one widget (recursively).
alberth <alberth@openttd.org>
parents: 14040
diff changeset
2351 MakeWidgetTree(parts, count, &cont_ptr, biggest_index);
13469
3783590f0d39 (svn r17984) -Codechange: make it possible to use MakeNWidgets using a custom container widget.
rubidium <rubidium@openttd.org>
parents: 13394
diff changeset
2352 return container;
11461
0ec1833138f7 (svn r15819) -Add: Nested widgets framework
alberth <alberth@openttd.org>
parents: 11454
diff changeset
2353 }
14044
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2354
15620
f8e9a3f0c140 (svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents: 15579
diff changeset
2355 /**
f8e9a3f0c140 (svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents: 15579
diff changeset
2356 * Make a nested widget tree for a window from a parts array. Besides loading, it inserts a shading selection widget
14044
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2357 * between the title bar and the window body if the first widget in the parts array looks like a title bar (it is a horizontal
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2358 * container with a caption widget) and has a shade box widget.
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2359 * @param parts Array with parts of the widgets.
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2360 * @param count Length of the \a parts array.
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2361 * @param biggest_index Pointer to biggest nested widget index collected in the tree.
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2362 * @param [out] shade_select Pointer to the inserted shade selection widget (\c NULL if not unserted).
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2363 * @return Root of the nested widget tree, a vertical container containing the entire GUI.
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2364 * @ingroup NestedWidgetParts
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2365 * @pre \c biggest_index != NULL
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2366 * @post \c *biggest_index contains the largest widget index of the tree and \c -1 if no index is used.
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2367 */
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2368 NWidgetContainer *MakeWindowNWidgetTree(const NWidgetPart *parts, int count, int *biggest_index, NWidgetStacked **shade_select)
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2369 {
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2370 *biggest_index = -1;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2371
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2372 /* Read the first widget recursively from the array. */
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2373 NWidgetBase *nwid = NULL;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2374 int num_used = MakeWidgetTree(parts, count, &nwid, biggest_index);
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2375 assert(nwid != NULL);
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2376 parts += num_used;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2377 count -= num_used;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2378
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2379 NWidgetContainer *root = new NWidgetVertical;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2380 root->Add(nwid);
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2381 if (count == 0) { // There is no body at all.
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2382 *shade_select = NULL;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2383 return root;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2384 }
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2385
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2386 /* If the first widget looks like a titlebar, treat it as such.
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2387 * If it has a shading box, silently add a shade selection widget in the tree. */
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2388 NWidgetHorizontal *hor_cont = dynamic_cast<NWidgetHorizontal *>(nwid);
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2389 NWidgetContainer *body;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2390 if (hor_cont != NULL && hor_cont->GetWidgetOfType(WWT_CAPTION) != NULL && hor_cont->GetWidgetOfType(WWT_SHADEBOX) != NULL) {
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2391 *shade_select = new NWidgetStacked;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2392 root->Add(*shade_select);
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2393 body = new NWidgetVertical;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2394 (*shade_select)->Add(body);
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2395 } else {
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2396 *shade_select = NULL;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2397 body = root;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2398 }
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2399
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2400 /* Load the remaining parts into 'body'. */
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2401 int biggest2 = -1;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2402 MakeNWidgets(parts, count, &biggest2, body);
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2403
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2404 *biggest_index = max(*biggest_index, biggest2);
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2405 return root;
7e5f2232c5d3 (svn r18587) -Codechange: Insert a shade selection widget in the widget tree when the window starts with a title bar with a shade box.
alberth <alberth@openttd.org>
parents: 14041
diff changeset
2406 }
15876
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2407
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2408 /**
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2409 * Make a number of rows with button-like graphics, for enabling/disabling each company.
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2410 * @param biggest_index Storage for collecting the biggest index used in the returned tree.
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2411 * @param widget_first The first widget index to use.
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2412 * @param widget_last The last widget index to use.
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2413 * @param max_length Maximal number of company buttons in one row.
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2414 * @param button_tooltip The tooltip-string of every button.
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2415 * @return Panel with rows of company buttons.
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2416 * @post \c *biggest_index contains the largest used index in the tree.
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2417 */
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2418 NWidgetBase *MakeCompanyButtonRows(int *biggest_index, int widget_first, int widget_last, int max_length, StringID button_tooltip)
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2419 {
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2420 NWidgetVertical *vert = NULL; // Storage for all rows.
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2421 NWidgetHorizontal *hor = NULL; // Storage for buttons in one row.
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2422 int hor_length = 0;
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2423
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2424 Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON);
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2425 sprite_size.width += WD_MATRIX_LEFT + WD_MATRIX_RIGHT;
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2426 sprite_size.height += WD_MATRIX_TOP + WD_MATRIX_BOTTOM + 1; // 1 for the 'offset' of being pressed
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2427
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2428 for (int widnum = widget_first; widnum <= widget_last; widnum++) {
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2429 /* Ensure there is room in 'hor' for another button. */
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2430 if (hor_length == max_length) {
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2431 if (vert == NULL) vert = new NWidgetVertical();
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2432 vert->Add(hor);
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2433 hor = NULL;
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2434 hor_length = 0;
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2435 }
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2436 if (hor == NULL) {
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2437 hor = new NWidgetHorizontal();
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2438 hor_length = 0;
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2439 }
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2440
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2441 NWidgetBackground *panel = new NWidgetBackground(WWT_PANEL, COLOUR_GREY, widnum);
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2442 panel->SetMinimalSize(sprite_size.width, sprite_size.height);
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2443 panel->SetFill(1, 0);
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2444 panel->SetResize(1, 0);
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2445 panel->SetDataTip(0x0, button_tooltip);
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2446 hor->Add(panel);
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2447 hor_length++;
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2448 }
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2449 *biggest_index = widget_last;
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2450 if (vert == NULL) return hor; // All buttons fit in a single row.
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2451
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2452 if (hor_length > 0 && hor_length < max_length) {
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2453 /* Last row is partial, add a spacer at the end to force all buttons to the left. */
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2454 NWidgetSpacer *spc = new NWidgetSpacer(sprite_size.width, sprite_size.height);
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2455 spc->SetFill(1, 0);
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2456 spc->SetResize(1, 0);
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2457 hor->Add(spc);
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2458 }
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2459 if (hor != NULL) vert->Add(hor);
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2460 return vert;
625f70985d01 (svn r20558) -Codechange: use one generic function to create a list of company buttons
yexo <yexo@openttd.org>
parents: 15795
diff changeset
2461 }