diff mde/gui/widget/PopupMenu.d @ 131:9cff74f68b84

Major revisions to popup handling. Buttons can close menus now, plus some smaller impovements. Removed Widget module. Moved Widget.AWidget to AChildWidget.AChildWidget and Widget.AParentWidget to AParentWidget.AParentWidget. Removed ASingleParentWidget to improve code sharing. AChildWidget doesn't implement IParentWidget like AWidget did. New IPopupParentWidget extending IParentWidget for the WM and some widgets to handle popups. Cut old popup management code. New underMouse() function replacing highlight(); called on all widgets. Separate menu-popup and button widgets aren't needed for menus now. Functions returning content widgets have been moved to their own module. Cleaned up jobs.txt. Switched to 80 line length for Ddoc.
author Diggory Hardy <diggory.hardy@gmail.com>
date Wed, 21 Jan 2009 13:01:40 +0000
parents 5b37d0400732
children 9fd705793568
line wrap: on
line diff
--- a/mde/gui/widget/PopupMenu.d	Sat Jan 17 16:11:26 2009 +0000
+++ b/mde/gui/widget/PopupMenu.d	Wed Jan 21 13:01:40 2009 +0000
@@ -13,14 +13,12 @@
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>. */
 
-/*************************************************************************************************
+/******************************************************************************
  * Pop-up menus based on content structures.
- *************************************************************************************************/
+ *****************************************************************************/
 module mde.gui.widget.PopupMenu;
 
-import mde.gui.widget.Widget;
-import mde.gui.widget.TextWidget;
-import mde.gui.widget.layout;
+import mde.gui.widget.AParentWidget;
 
 import mde.content.miscContent;
 import mde.gui.exception;
@@ -33,17 +31,18 @@
     }
 }
 
-/*************************************************************************************************
+/******************************************************************************
  * Widget which pops up a menu based on a content.
- *************************************************************************************************/
-class PopupMenuWidget : AParentSingleWidget
+ *****************************************************************************/
+class PopupMenuWidget : APopupParentWidget
 {
     this (IWidgetManager mgr, IParentWidget parent, widgetID id, WidgetData data, IContent c) {
 	content = c;
 	WDCMinCheck (data, 1,1, content);
         super (mgr, parent, id);
         
-        subWidget = mgr.makeWidget (this, data.strings[0], content);
+        popup = mgr.makeWidget (this, data.strings[0], content);
+        subWidgets = [popup];
 	
 	adapter = mgr.renderer.getAdapter;
 	adapter.text = content.toString (1);
@@ -54,22 +53,33 @@
     
     override int clickEvent (wdabs, wdabs, ubyte b, bool state) {
 	if (b == 1 && state == true) {
-	    // If active, the popup is closed by WidgetManager since the click isn't on the popup.
 	    if (!pushed) {
-		pushed = true;
-		mgr.addPopup (this, subWidget);	// causes redraw
-		mgr.addClickCallback (&openMenuCallback);	// prevents first up-click from closing menu, if on self.
-	    }
+                parentIPPW.addChildIPPW (this);
+                parentIPPW.menuActive = true;
+                mgr.positionPopup (this, popup);
+                pushed = true;
+            } else {
+                // NOTE: perhaps shouldn't do anything when
+                // parentIPPW.parentIPPW.menuActive
+                // (this causes funny behaviour when clicking a submenu):
+                parentIPPW.removeChildIPPW (this);
+            }
 	}
 	return 0;
     }
     
-    override void popupClose () {
+    override void removedIPPW () {
+        super.removedIPPW;
 	pushed = false;
     }
-    override bool popupParentClick () {
-        pushed = false;
-        return true;
+    
+    override void underMouse (bool state) {
+        if (state && !pushed && parentIPPW.menuActive) {
+            parentIPPW.addChildIPPW (this);
+            menuActive = true;
+            mgr.positionPopup (this, popup, 1);	// causes redraw
+            pushed = true;
+        }
     }
     
     override void draw () {
@@ -78,103 +88,7 @@
     }
     
 protected:
-    bool openMenuCallback (wdabs cx, wdabs cy, ubyte b, bool state) {
-	if (b == 1 && state == false) {	// receive first up-click
-	    mgr.removeCallbacks (cast(void*) this);
-	    if (cx >= x && cx < x+w && cy >= y && cy < y+h)
-		return true;		// up-click is on self; don't close the menu
-	}
-	return false;
-    }
     bool pushed = false;
     IRenderer.TextAdapter adapter;
     IContent content;
 }
-
-/*************************************************************************************************
- * Widget which pops up a sub-menu based on a content on mouse-over.
- *************************************************************************************************/
-class SubMenuWidget : PopupMenuWidget
-{
-    this (IWidgetManager mgr, IParentWidget parent, widgetID id, WidgetData data, IContent c) {
-        super (mgr, parent, id, data, c);
-    }
-    
-    override int clickEvent (wdabs, wdabs, ubyte b, bool state) {
-        return 0;
-    }
-    
-    override void highlight (bool state) {
-        if (state && !pushed) {
-            pushed = true;
-            mgr.addPopup (this, subWidget, 1);	// causes redraw
-        }
-    }
-}
-
-/*************************************************************************************************
- * A function which returns a ContentListWidget or MenuButtonContentWidget.
- *************************************************************************************************/
-IChildWidget flatMenuContent (IWidgetManager mgr, IParentWidget parent, widgetID id, WidgetData data, IContent c) {
-    if (c is null) throw new ContentException;
-    if (cast(IContentList) c)
-        return new ContentListWidget(mgr,parent,id,data,c);
-    if (cast(EventContent) c)
-        return new MenuButtonContentWidget(mgr,parent,id,data,c);
-    // generic uneditable option
-    return new DisplayContentWidget(mgr,parent,id,data,c);
-}
-
-/*************************************************************************************************
- * A function which returns a SubMenuWidget or MenuButtonContentWidget.
- *************************************************************************************************/
-IChildWidget subMenuContent (IWidgetManager mgr, IParentWidget parent, widgetID id, WidgetData data, IContent c) {
-    if (c is null) throw new ContentException;
-    if (cast(IContentList) c)
-        return new SubMenuWidget(mgr,parent,id,data,c);
-    if (cast(EventContent) c)
-        return new MenuButtonContentWidget(mgr,parent,id,data,c);
-    // generic uneditable option
-    return new DisplayContentWidget(mgr,parent,id,data,c);
-}
-
-/*************************************************************************************************
- * A menu content-button, like ButtonContentWidget, but which can be activated with the up-click.
- *************************************************************************************************/
-class MenuButtonContentWidget : ATextWidget
-{
-    this (IWidgetManager mgr, IParentWidget parent, widgetID id, WidgetData, IContent c) {
-        content = cast(EventContent) c;
-        if (content is null) throw new ContentException (this);
-        adapter = mgr.renderer.getAdapter ();
-        super (mgr, parent, id);
-    }
-    
-    override bool setup (uint n, uint flags) {
-	if (!(flags & 3)) return false;	// string or renderer (and possibly font) changed
-	adapter.text = content.toString(1);
-	return super.setup (n, 3);	// force redimensioning
-    }
-    
-    override int clickEvent (wdabs, wdabs, ubyte b, bool state) {
-	if (b == 1) {	// on up or down click
-	    pushed = false;
-	    mgr.requestRedraw;
-	    content.endEvent;
-	}
-	return 0;
-    }
-    
-    override void highlight (bool state) {
-	pushed = state;
-    }
-    
-    override void draw () {
-	mgr.renderer.drawButton (x,y, w,h, pushed);
-	adapter.draw (x,y);
-    }
-    
-protected:
-    EventContent content;
-    bool pushed;
-}