Mercurial > projects > mde
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 |
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 } |