Mercurial > projects > mde
view mde/gui/widget/PopupMenu.d @ 133:9fd705793568
Fixed menu popup bug, improved recursion detection.
Menu popups can now determine whether or not they are sub-menus.
Recursion detection can now also check content (if not the same, there's not a risk of infinite recursion).
author | Diggory Hardy <diggory.hardy@gmail.com> |
---|---|
date | Fri, 23 Jan 2009 16:05:05 +0000 |
parents | 9cff74f68b84 |
children | 9f035cd139c6 |
line wrap: on
line source
/* LICENSE BLOCK Part of mde: a Modular D game-oriented Engine Copyright © 2007-2008 Diggory Hardy This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 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.AParentWidget; import mde.content.miscContent; import mde.gui.exception; debug { import tango.util.log.Log : Log, Logger; private Logger logger; static this () { logger = Log.getLogger ("mde.gui.widget.PopupMenu"); } } /****************************************************************************** * Widget which pops up a menu based on a content. *****************************************************************************/ 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); popup = mgr.makeWidget (this, data.strings[0], content); subWidgets = [popup]; adapter = mgr.renderer.getAdapter; adapter.text = content.toString (1); adapter.getDimensions (mw, mh); w = mw; h = mh; } override void recursionCheck (widgetID wID, IContent c) { if (wID is id && c is content) throw new WidgetRecursionException (wID); parent.recursionCheck (wID, c); } override int clickEvent (wdabs, wdabs, ubyte b, bool state) { if (b == 1 && state == true) { if (!pushed) { parentIPPW.addChildIPPW (this); parentIPPW.menuActive = true; mgr.positionPopup (this, popup); pushed = true; } else if (!parentIPPW.parentMenuActive) { // if not a submenu parentIPPW.removeChildIPPW (this); } } return 0; } override void removedIPPW () { super.removedIPPW; pushed = false; } override void underMouse (bool state) { if (state && !pushed && parentIPPW.menuActive) { parentIPPW.addChildIPPW (this); menuActive = true; mgr.positionPopup (this, popup, parentIPPW.parentMenuActive ? 1 : 0); pushed = true; } } override void draw () { mgr.renderer.drawButton (x,y, w,h, pushed); adapter.draw (x,y); } protected: bool pushed = false; IRenderer.TextAdapter adapter; IContent content; }