annotate mde/gui/WMScreen.d @ 122:f96e8d18c00a

Missed file from last commit.
author Diggory Hardy <diggory.hardy@gmail.com>
date Fri, 02 Jan 2009 18:10:14 +0000
parents
children c9843fbaac88
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
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
186 if (w < mw || h < mh)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
187 logger.warn ("Minimal dimensions ({},{}) not met: ({},{}), but I cannot resize myself!",mw,mh,w,h);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
188
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
189 if (!child) return; // if not created yet.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
190 child.setWidth (w, -1);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
191 child.setHeight (h, -1);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
192 child.setPosition (0,0);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
193 }
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 protected:
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
196 /* Second stage of widget loading.
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
197 * 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
198 final override void createRootWidget () {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
199 // 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
200 if (rend is null)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
201 rend = createRenderer (rendName);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
202 popups = null;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
203
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
204 debug (mdeWidgets) logger.trace ("Creating root widget...");
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
205 child = makeWidget (this, "root");
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
206 debug (mdeWidgets) logger.trace ("Setting up root widget...");
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
207 child.setup (0, 3);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
208
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
209 mw = child.minWidth;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
210 mh = child.minHeight;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
211 if (w < mw || h < mh)
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
212 logger.warn ("Minimal dimensions ({},{}) not met: ({},{}), but I cannot resize myself!",mw,mh,w,h);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
213
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
214 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
215 child.setWidth (w, -1);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
216 child.setHeight (h, -1);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
217 child.setPosition (0,0);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
218 debug (mdeWidgets) logger.trace ("Done creating root widget.");
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
219 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
220
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
221 final override void preSave () {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
222 if (keyFocus) {
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
223 keyFocus.keyFocusLost;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
224 keyFocus = null;
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
225 imde.input.setLetterCallback (null);
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
226 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
227 }
f96e8d18c00a Missed file from last commit.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
228 }