comparison mde/gui/WidgetManager.d @ 168:da8d3091fdaf

More work on the context menu: now roughly usable like an ordinary context menu.
author Diggory Hardy <diggory.hardy@gmail.com>
date Mon, 29 Jun 2009 18:45:58 +0200
parents 620d4ea30228
children bc1cf73dc835
comparison
equal deleted inserted replaced
167:620d4ea30228 168:da8d3091fdaf
29 29
30 import imde = mde.imde; 30 import imde = mde.imde;
31 import mde.content.Content; 31 import mde.content.Content;
32 import mde.content.ServiceContent; 32 import mde.content.ServiceContent;
33 debug import mde.content.miscContent; // Debug menu 33 debug import mde.content.miscContent; // Debug menu
34 debug import mde.content.Debug;
34 35
35 // Widgets to create: 36 // Widgets to create:
36 import mde.gui.widget.layout; 37 import mde.gui.widget.layout;
37 import mde.gui.widget.miscWidgets; 38 import mde.gui.widget.miscWidgets;
38 import mde.gui.widget.TextWidget; 39 import mde.gui.widget.TextWidget;
155 override void menuDone () {} 156 override void menuDone () {}
156 157
157 override IChildWidget getPopupWidget (wdabs cx, wdabs cy, bool closePopup) { 158 override IChildWidget getPopupWidget (wdabs cx, wdabs cy, bool closePopup) {
158 if (popupContext) { 159 if (popupContext) {
159 if (popupContext.onSelf (cx, cy)) 160 if (popupContext.onSelf (cx, cy))
160 return popupContext; 161 return popupContext.getWidget (cx, cy);
161 if (closePopup) { 162 if (closePopup) {
162 if (childIPPW is null) 163 if (childIPPW is null)
163 menuActive = MenuPosition.INACTIVE; 164 menuActive = MenuPosition.INACTIVE;
164 popupContext = null; 165 popupContext = null;
165 requestRedraw; 166 requestRedraw;
332 // NOTE: Creates new widgets every time; not optimal 333 // NOTE: Creates new widgets every time; not optimal
333 serviceContent.setContent (contextContent); 334 serviceContent.setContent (contextContent);
334 popupContext = makeWidget (this, "context", contextContent); 335 popupContext = makeWidget (this, "context", contextContent);
335 popupContext.setup (0, 3); 336 popupContext.setup (0, 3);
336 positionPopup (underMouse, popupContext); 337 positionPopup (underMouse, popupContext);
338 menuActive = MenuPosition.ACTIVE;
337 requestRedraw; 339 requestRedraw;
338 } else { // post other button presses to clickEvent 340 } else { // post other button presses to clickEvent
339 int ret = underMouse.clickEvent (cast(wdabs)cx,cast(wdabs)cy,b,state); 341 int ret = underMouse.clickEvent (cast(wdabs)cx,cast(wdabs)cy,b,state);
340 if (ret & 1) { // keyboard input requested 342 if (ret & 1) { // keyboard input requested
341 keyFocus = underMouse; 343 keyFocus = underMouse;
382 if (child is null) return; 384 if (child is null) return;
383 child.setup (++setupN, 2); 385 child.setup (++setupN, 2);
384 child.setWidth (w, -1); 386 child.setWidth (w, -1);
385 child.setHeight (h, -1); 387 child.setHeight (h, -1);
386 child.setPosition (0,0); 388 child.setPosition (0,0);
389 popupContext.setup (setupN, 2);
390 //NOTE: does popupContext need to be re-scaled?
387 requestRedraw; 391 requestRedraw;
388 } 392 }
389 } 393 }
390 // for internal use 394 // for internal use
391 void updateUnderMouse (wdabs cx, wdabs cy, bool closePopup) { 395 void updateUnderMouse (wdabs cx, wdabs cy, bool closePopup) {
397 } 401 }
398 if (underMouse !is oUM) { 402 if (underMouse !is oUM) {
399 debug assert (oUM && underMouse, "no widget under mouse: error"); 403 debug assert (oUM && underMouse, "no widget under mouse: error");
400 oUM.underMouse (false); 404 oUM.underMouse (false);
401 underMouse.underMouse (true); 405 underMouse.underMouse (true);
406 debug if (Debug.logUnderMouse())
407 logger.trace ("Widget under mouse: {}", underMouse);
402 } 408 }
403 } 409 }
404 410
405 /// This should be overloaded to set a callback receiving keyboard input. 411 /// This should be overloaded to set a callback receiving keyboard input.
406 abstract void setLetterCallback(void delegate(ushort, char[])); 412 abstract void setLetterCallback(void delegate(ushort, char[]));