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