annotate mde/gui/WMScreen.d @ 126:c9843fbaac88

Dynamic minimal size changing improved; works over layouts sharing alignment. EnumContent sub-contents use EnumValueContent instead of BoolContent; fixes a few small bugs. EnumContent substrings get translated (bug fixed). The widget manager no longer attempts to set widget sizes smaller than their minimals, even though some will not be shown. SwitchWidget: has fixed sizableness now.
author Diggory Hardy <diggory.hardy@gmail.com>
date Thu, 08 Jan 2009 13:05:44 +0000
parents f96e8d18c00a
children 41582439a42b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
122
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
1 /* LICENSE BLOCK
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
2 Part of mde: a Modular D game-oriented Engine
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
3 Copyright © 2007-2008 Diggory Hardy
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
4
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
5 This program is free software: you can redistribute it and/or modify it under the terms
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
6 of the GNU General Public License as published by the Free Software Foundation, either
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
7 version 2 of the License, or (at your option) any later version.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
8
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
10 without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
11 See the GNU General Public License for more details.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
12
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
13 You should have received a copy of the GNU General Public License
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
14 along with this program. If not, see <http://www.gnu.org/licenses/>. */
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
15
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
16 /*************************************************************************************************
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
17 * A gui manager class using mde.setup.Screen and mde.input.Input.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
18 *
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
19 * This is the module to use externally to create a graphical user interface (likely also with
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
20 * content modules).
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
21 *************************************************************************************************/
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
22 module mde.gui.WMScreen;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
23
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
24 import mde.gui.WidgetManager;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
25 import mde.gui.widget.Ifaces;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
26 import mde.gui.renderer.createRenderer;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
27
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
28 import mde.setup.Screen;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
29 import Items = mde.content.Items; // loadTranslation
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
30 import mde.lookup.Options; // miscOpts.L10n callback
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
31
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
32 import tango.util.log.Log : Log, Logger;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
33
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
34 private Logger logger;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
35 static this () {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
36 logger = Log.getLogger ("mde.gui.WMScreen");
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
37 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
38
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
39 /*************************************************************************************************
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
40 * The widget manager.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
41 *
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
42 * This provides a layer on top of WidgetLoader, handling input and rendering. Other functionality
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
43 * is contained in the super class, to simplify supporting new input/graphics libraries.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
44 *
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
45 * Currently mouse coordinates are passed to widgets untranslated. It may make sense to translate
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
46 * them and possibly drop events for some uses, such as if the gui is drawn to a texture.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
47 *
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
48 * Aside from the IWidgetManager methods, this class should be thread-safe.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
49 *************************************************************************************************/
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
50 scope class WMScreen : AWidgetManager, Screen.IDrawable {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
51 /** Construct a new widget manager.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
52 *
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
53 * params:
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
54 * fileName = Name of file specifying the gui, excluding path and extension.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
55 */
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
56 this (char[] file) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
57 super(file);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
58
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
59 Screen.addDrawable (this);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
60 clickCallbacks = new typeof(clickCallbacks);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
61 motionCallbacks = new typeof(motionCallbacks);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
62 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
63
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
64 // this() runs during static this(), when imde.input doesn't exist. init() runs later.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
65 void init () {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
66 // Doesn't need a lock - cannot conflict with other class functions.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
67 // Events we want to know about:
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
68 imde.input.addMouseClickCallback(&clickEvent);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
69 imde.input.addMouseMotionCallback(&motionEvent);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
70
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
71 Items.loadTranslation ();
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
72 miscOpts.L10n.addCallback (&reloadStrings);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
73 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
74
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
75
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
76 /** Draw the gui. */
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
77 void draw() {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
78 synchronized(mutex) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
79 if (child)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
80 child.draw;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
81 foreach (popup; popups)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
82 popup.widget.draw();
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
83 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
84 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
85
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
86 /** For mouse click events.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
87 *
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
88 * Sends the event on to the relevant windows and all click callbacks. */
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
89 void clickEvent (ushort usx, ushort usy, ubyte b, bool state) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
90 debug scope (failure)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
91 logger.warn ("clickEvent: failed!");
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
92 mutex.lock;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
93 scope(exit) mutex.unlock;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
94 if (child is null) return;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
95
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
96 wdabs cx = cast(wdabs) usx, cy = cast(wdabs) usy;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
97
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
98 // 1. Callbacks have the highest priority recieving events (e.g. a button release)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
99 foreach (dg; clickCallbacks)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
100 if (dg (cx, cy, b, state)) return;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
101
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
102 // 2. Then pop-ups: close from top, depending on click pos
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
103 // Note: assumes each evaluated popup's parent is not under another still open popup.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
104 // Also assumes popup's parent doesn't have other children in its box.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
105 size_t removeTo = popups.length;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
106 bool eventDone; // don't pass clickEvent
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
107 IChildWidget widg; // widget clicked on
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
108 foreach_reverse (i,popup; popups) with (popup) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
109 if (cx < x || cx >= x + w ||
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
110 cy < y || cy >= y + h) { // on popup
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
111 if (parent.onSelf (cx, cy)) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
112 if (parent.popupParentClick()) removeTo = i;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
113 eventDone = true;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
114 break;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
115 } else {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
116 removeTo = i;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
117 parent.popupClose;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
118 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
119 } else {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
120 widg = widget.getWidget (cast(wdabs)cx,cast(wdabs)cy);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
121 break;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
122 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
123 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
124 if (removeTo < popups.length) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
125 requestRedraw;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
126 popups = popups[0..removeTo];
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
127 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
128 if (eventDone)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
129 return;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
130
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
131 // 3. Then the main widget tree
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
132 debug assert (cx < child.width && cy < child.height, "WidgetManager: child doesn't cover whole area (code error)");
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
133 if (widg is null)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
134 widg = child.getWidget (cast(wdabs)cx,cast(wdabs)cy);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
135 if (keyFocus && keyFocus !is widg) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
136 keyFocus.keyFocusLost;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
137 keyFocus = null;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
138 imde.input.setLetterCallback (null);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
139 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
140 if (widg !is null) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
141 if (widg.clickEvent (cast(wdabs)cx,cast(wdabs)cy,b,state) & 1) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
142 keyFocus = widg;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
143 imde.input.setLetterCallback (&widg.keyEvent);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
144 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
145 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
146 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
147
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
148 /** For mouse motion events.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
149 *
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
150 * Sends the event on to all motion callbacks. */
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
151 void motionEvent (ushort scx, ushort scy) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
152 debug scope (failure)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
153 logger.warn ("motionEvent: failed!");
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
154 mutex.lock;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
155 scope(exit) mutex.unlock;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
156 wdabs cx = cast(wdabs) scx, cy = cast(wdabs) scy;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
157 foreach (dg; motionCallbacks)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
158 dg (cx, cy);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
159
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
160 IChildWidget ohighlighted = highlighted;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
161 foreach_reverse (popup; popups) with (popup) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
162 if (cx >= x && cx < x+w && cy >= y && cy < y+h) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
163 highlighted = widget.getWidget (cx,cy);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
164 goto foundPopup;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
165 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
166 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
167 highlighted = null; // not over a popup
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
168 foundPopup:
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
169 if (ohighlighted != highlighted) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
170 if (ohighlighted)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
171 ohighlighted.highlight (false);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
172 if (highlighted)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
173 highlighted.highlight (true);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
174 requestRedraw;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
175 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
176 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
177
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
178
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
179 void sizeEvent (int nw, int nh) { // IDrawable function
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
180 mutex.lock;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
181 scope(exit) mutex.unlock;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
182
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
183 w = cast(wdim) nw;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
184 h = cast(wdim) nh;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
185
126
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
186 if (w < mw) {
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
187 logger.warn ("Min width for gui, {}, not met: {}", mw, w);
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
188 w = mw;
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
189 }
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
190 if (h < mh) {
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
191 logger.warn ("Min height for gui, {}, not met: {}", mh, h);
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
192 h = mh;
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
193 }
122
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
194
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
195 if (!child) return; // if not created yet.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
196 child.setWidth (w, -1);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
197 child.setHeight (h, -1);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
198 child.setPosition (0,0);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
199 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
200
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
201 protected:
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
202 /* Second stage of widget loading.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
203 * Note: sizeEvent should be called with window size before this. */
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
204 final override void createRootWidget () {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
205 // The renderer needs to be created on the first load, but not after this.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
206 if (rend is null)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
207 rend = createRenderer (rendName);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
208 popups = null;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
209
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
210 debug (mdeWidgets) logger.trace ("Creating root widget...");
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
211 child = makeWidget (this, "root");
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
212 debug (mdeWidgets) logger.trace ("Setting up root widget...");
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
213 child.setup (0, 3);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
214
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
215 mw = child.minWidth;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
216 mh = child.minHeight;
126
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
217 if (w < mw) {
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
218 logger.warn ("Min width for gui, {}, not met: {}", mw, w);
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
219 w = mw;
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
220 }
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
221 if (h < mh) {
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
222 logger.warn ("Min height for gui, {}, not met: {}", mh, h);
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
223 h = mh;
c9843fbaac88 Dynamic minimal size changing improved; works over layouts sharing alignment.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 122
diff changeset
224 }
122
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
225
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
226 debug (mdeWidgets) logger.trace ("Setting size and position of root widget...");
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
227 child.setWidth (w, -1);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
228 child.setHeight (h, -1);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
229 child.setPosition (0,0);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
230 debug (mdeWidgets) logger.trace ("Done creating root widget.");
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
231 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
232
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
233 final override void preSave () {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
234 if (keyFocus) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
235 keyFocus.keyFocusLost;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
236 keyFocus = null;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
237 imde.input.setLetterCallback (null);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
238 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
239 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
240 }