Code archives/BlitzPlus Gui/WindowEx
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
This class is designed to handle windows, toolbars, and menus, with toggling, enable/disable, and automatic icon loading. It makes working with complex programs much easier, and it handles multiple windows. All MenuAction events will have an event source of the window from where the toolbar button or menu was pressed. Instead of enabling and toggling individual menus, you check and enable items. An item may have a menu, a toolbar, both, or neither, and it will work just fine. | |||||
SuperStrict Import maxgui.proxygadgets Import maxgui.drivers Private Type TIntWrapper Field i:Int Method Compare:Int(o:Object) Local intwrapper:TIntWrapper=TIntWrapper(o) If i>intwrapper.i Return 1 If i<intwrapper.i Return -1 Return 0 EndMethod Function Create:TIntWrapper(i:Int) Local intwrapper:TIntWrapper=New TIntWrapper intwrapper.i=i Return intwrapper EndFunction EndType Function CopyRect(x0:Int,y0:Int,w:Int,h:Int,x1:Int,y1:Int,src:TPixmap,dst:TPixmap) Local x:Int,y:Int,c:Int'=RGBA(0,0,0,0) For x=0 To w-1 For y=0 To h-1 If src c=ReadPixelSafe(src,x0+x,y0+y) WritePixelSafe(dst,x1+x,y1+y,c) Next Next EndFunction Function ReadPixelSafe:Int(pixmap:TPixmap,x:Int,y:Int) If PixelIsValid(pixmap,x,y) Return pixmap.ReadPixel(x,y) EndFunction Function WritePixelSafe:Int(pixmap:TPixmap,x:Int,y:Int,color:Int) If PixelIsValid(pixmap,x,y) pixmap.WritePixel(x,y,color) EndFunction Function PixelIsValid:Int(pixmap:TPixmap,x:Int,y:Int) If x<0 Return False If x>pixmap.width-1 Return False If y<0 Return False If y>pixmap.height-1 Return False Return True EndFunction Local x:Int,y:Int Local red:Int MemCopy Varptr red,[0:Byte,0:Byte,255:Byte,255:Byte],4 For x=0 To TWindowEx.MissingIcon.width-1 For y=0 To TWindowEx.MissingIcon.height-1 TWindowEx.MissingIcon.WritePixel x,y,red If x=0 And y=0 TWindowEx.MissingIcon.WritePixel x,y,0 Next Next For x=0 To TWindowEx.BlankIcon.width-1 For y=0 To TWindowEx.BlankIcon.height-1 TWindowEx.BlankIcon.WritePixel x,y,0 Next Next Public Type TWindowEx Extends TProxyGadget Const LoadPixmapPath:String="" Const ToolbarIconSize:Int=16 Global menuiditerator:Int=0 Global menuidmap:TMap=New TMap Global actionicon:TPixmap[] Global actionmenuicon:TPixmap[] Global MissingIcon:TPixmap=CreatePixmap(ToolbarIconSize,ToolbarIconSize,PF_RGBA8888) Global BlankIcon:TPixmap=CreatePixmap(ToolbarIconSize,ToolbarIconSize,PF_RGBA8888) Field window:TGadget Field toolbar:TGadget Field menuroot:TGadget Field currentmenu:TGadget Field toolbaritemid:Int[] Field menumap:TMap=New TMap Field toolbaritemmap:TMap=New TMap Field toolbartips:String[] Field existingtips:String[] Field existingtoolbarenablestate:Int[] Method Cleanup() RemoveHook EmitEventHook,EventHook,Self FreeGadget window EndMethod Method ToggleItem(action:Int) If ItemChecked(action) UncheckItem action Else CheckItem action EndIf EndMethod Method EnableItem(action:Int) Local intwrapper:TIntWrapper=TIntWrapper.Create(action) Local menu:TGadget menu=TGadget(menumap.ValueForKey(intwrapper)) If menu EnableGadget menu intwrapper = TIntWrapper(toolbaritemmap.valueforkey(intwrapper)) If intwrapper EnableGadgetItem toolbar,intwrapper.i existingtoolbarenablestate[intwrapper.i]=True EndIf EndMethod Method DisableItem(action:Int) Local intwrapper:TIntWrapper=TIntWrapper.Create(action) Local menu:TGadget menu=TGadget(menumap.ValueForKey(intwrapper)) If menu DisableGadget menu intwrapper = TIntWrapper(toolbaritemmap.valueforkey(intwrapper)) If intwrapper DisableGadgetItem toolbar,intwrapper.i existingtoolbarenablestate[intwrapper.i]=False EndIf EndMethod Method CheckItem(action:Int) Local intwrapper:TIntWrapper=TIntWrapper.Create(action) Local menu:TGadget menu=TGadget(menumap.ValueForKey(intwrapper)) If menu CheckMenu menu intwrapper = TIntWrapper(toolbaritemmap.valueforkey(intwrapper)) If intwrapper SelectGadgetItem toolbar,intwrapper.i EndMethod Method UncheckItem(action:Int) Local intwrapper:TIntWrapper=TIntWrapper.Create(action) Local menu:TGadget menu=TGadget(menumap.ValueForKey(intwrapper)) If menu UncheckMenu menu intwrapper = TIntWrapper(toolbaritemmap.valueforkey(intwrapper)) If intwrapper DeselectGadgetItem toolbar,intwrapper.i EndMethod Method ItemEnabled:Int(action:Int) Local intwrapper:TIntWrapper=TIntWrapper.Create(action) Local menu:TGadget menu=TGadget(menumap.ValueForKey(intwrapper)) If menu Return Not GadgetDisabled(menu) intwrapper = TIntWrapper(toolbaritemmap.valueforkey(intwrapper)) If intwrapper Return existingtoolbarenablestate[intwrapper.i] Return False EndMethod Method ItemChecked:Int(action:Int) Local intwrapper:TIntWrapper=TIntWrapper.Create(action) Local menu:TGadget menu=TGadget(menumap.ValueForKey(intwrapper)) If menu Return MenuChecked(menu) intwrapper = TIntWrapper(toolbaritemmap.valueforkey(intwrapper)) If intwrapper Return GadgetItemSelected(toolbar,intwrapper.i) Return False EndMethod Function GadgetItemSelected:Int(gadget:TGadget,i:Int) Local n:Int Local items:Int[]=SelectedGadgetItems(gadget) For n=0 To items.length-1 If items[n]=i Return True Next Return False EndFunction Method ProcessEvent:Int(event:TEvent) Local parent:TGadget Select event.id Case EVENT_MENUACTION If Not TWindowEx(event.source) parent=TGadget(event.source) While parent If parent=WindowMenu(window) event.source=Self EndIf parent=parent.parent Wend EndIf Case EVENT_GADGETACTION Select event.source Case toolbar If toolbar EmitEvent CreateEvent(EVENT_MENUACTION,Self,toolbaritemid[event.data]) Return False EndIf EndSelect EndSelect Return True EndMethod Method AddMenuItem:TGadget(name:String,group:TGadget=Null,action:Int=0) Local menu:TGadget Local pixmap:TPixmap If Not group group=WindowMenu(window) menu = CreateMenu(" "+name,action,group) menumap.Insert TIntWrapper.Create(action),menu If action ?win32 If actionmenuicon[action] SetGadgetPixmap menu,actionmenuicon[action] EndIf ? EndIf Return menu EndMethod Method AddMenuSeparator(group:TGadget) CreateMenu("",0,group) EndMethod Method AddToolbarSeparator() toolbaritemid = toolbaritemid[..toolbaritemid.length+1] toolbaritemid[toolbaritemid.length-1]=-1 toolbartips=toolbartips[..toolbartips.length+1] EndMethod Method AddToolbarItem(tip:String,action:Int) toolbaritemid = toolbaritemid[..toolbaritemid.length+1] toolbaritemid[toolbaritemid.length-1]=action toolbaritemmap.Insert TIntWrapper.Create(action),TIntWrapper.Create(toolbaritemid.length-1) toolbartips=toolbartips[..toolbartips.length+1] toolbartips[toolbartips.length-1]=tip EndMethod Method Clear() Local menu:TGadget For menu=EachIn WindowMenu(window).kids FreeGadget menu Next If toolbar FreeGadget toolbar toolbar=Null EndIf menumap.Clear() toolbaritemmap.Clear() toolbartips=Null toolbaritemid=Null existingtips=Null existingtoolbarenablestate=Null EndMethod Method UpdateMenu() UpdateWindowMenu window EndMethod Method Build() Local pixmap:TPixmap Local icon:TPixmap Local i:Int Local action:Int UpdateWindowMenu window If toolbar FreeGadget toolbar toolbar=Null EndIf If toolbaritemid pixmap=CreatePixmap(ToolbarIconSize*toolbaritemid.length,ToolbarIconSize,PF_RGBA8888) For i=0 To toolbaritemid.length-1 action=toolbaritemid[i] If action=-1 icon=BlankIcon Else icon=actionicon[action] EndIf If Not icon icon=MissingIcon EndIf CopyRect 0,0,ToolbarIconSize,ToolbarIconSize,i*ToolbarIconSize,0,icon,pixmap Next toolbar = CreateToolbar(pixmap,0,0,0,0,window) SetToolbarTips toolbar,toolbartips existingtips = toolbartips existingtoolbarenablestate=existingtoolbarenablestate[..toolbaritemid.length] For i=0 To existingtoolbarenablestate.length-1 existingtoolbarenablestate[i]=True Next EndIf EndMethod Function Create:TWindowEx(title:String,x:Int,y:Int,width:Int,height:Int,group:TGadget,style:Int=WINDOW_DEFAULT) Local windowex:TWindowEx=New TWindowEx windowex.window=CreateWindow(title,x,y,width,height,group,style) windowex.SetProxy windowex.window AddHook EmitEventHook,EventHook,windowex Return windowex EndFunction Function EventHook:Object(id:Int,data:Object,context:Object) Local event:TEvent Local windowex:TWindowEx windowex=TWindowEx(context) If windowex event=TEvent(data) If event If Not windowex.ProcessEvent(event) Return Null EndIf EndIf Return data EndFunction Function AllocMenuID:Int() menuiditerator:+1 actionicon=actionicon[..menuiditerator+1] actionmenuicon=actionmenuicon[..menuiditerator+1] Return menuiditerator EndFunction EndType Function GetActionID:Int(action:String) Local intwrapper:TIntWrapper action = action.ToLower() intwrapper = TIntWrapper(TWindowEx.menuidmap.valueforkey(action)) If Not intwrapper intwrapper=New TIntWrapper intwrapper.i = TWindowEx.AllocMenuID() TWindowEx.menuidmap.Insert action,intwrapper EndIf TWindowEx.actionicon[intwrapper.i]=LoadPixmap(TWindowEx.LoadPixmapPath+action+".png") If TWindowEx.actionicon[intwrapper.i] If TWindowEx.actionicon[intwrapper.i].width<>TWindowEx.ToolbarIconSize Or TWindowEx.actionicon[intwrapper.i].height<>TWindowEx.ToolbarIconSize TWindowEx.actionicon[intwrapper.i] = ResizePixmap(TWindowEx.actionicon[intwrapper.i],TWindowEx.ToolbarIconSize,TWindowEx.ToolbarIconSize) EndIf TWindowEx.actionmenuicon[intwrapper.i] = ResizePixmap(TWindowEx.actionicon[intwrapper.i],13,13) EndIf Return intwrapper.i EndFunction Function CreateWindowEx:TWindowEx(title:String,x:Int,y:Int,width:Int,height:Int,group:TGadget,style:Int=WINDOW_DEFAULT) Return TWindowEx.Create(title,x,y,width,height,group,style) EndFunction '========================================= 'Example '========================================= AppTitle = "WindowEx Example" Local window:TWindowEx = CreateWindowEx( AppTitle, 100, 100, 320, 240, Null) Local menu:TGadget Global action_file_new:Int = GetActionID("File_New") Global action_file_open:Int = GetActionID("File_Open") Global action_file_save:Int = GetActionID("File_Save") Global action_app_exit:Int = GetActionID("App_Exit") Global action_option_toggle:Int = GetActionID("Options_Toggle") Global action_option_disable:Int = GetActionID("Options_Disable") Global action_option_enable:Int = GetActionID("Options_Enable") menu=window.AddMenuItem("File") window.AddMenuItem "New",menu,action_file_new window.AddMenuSeparator menu window.AddMenuItem "Open",menu,action_file_open window.AddMenuItem "Save",menu,action_file_save window.AddMenuSeparator menu window.AddMenuItem "Exit",menu,action_app_exit menu=window.AddMenuItem("Options") window.AddMenuItem "Toggle",menu,action_option_toggle window.AddMenuItem "Disable",menu,action_option_disable window.AddMenuItem "Enable",menu,action_option_enable window.AddToolbarItem "New File",action_file_new window.AddToolbarSeparator window.AddToolbarItem "Open File",action_file_open window.AddToolbarItem "Save File",action_file_save window.AddToolbarSeparator window.AddToolbarItem "Toggle",action_option_toggle window.AddToolbarItem "Enable",action_option_enable window.AddToolbarItem "Disable",action_option_disable window.Build() Repeat WaitEvent() Select EventID() Case EVENT_MENUACTION Select EventSource() Case window Select EventData() Case action_file_new Print "File_New" Case action_file_open Print "File_Open" Case action_file_save Print "File_Save" Case action_app_exit Print "App_Exit" End Case action_option_toggle Print "Option_Toggle" If window.ItemChecked(action_option_toggle) window.UncheckItem action_option_toggle Else window.CheckItem action_option_toggle EndIf UpdateWindowMenu window Case action_option_disable Print "Option_Disable" If window.ItemEnabled(action_option_disable) window.DisableItem action_option_disable Else window.EnableItem action_option_disable EndIf UpdateWindowMenu window Case action_option_enable Print "Option_Enable" window.EnableItem action_option_disable UpdateWindowMenu window EndSelect EndSelect Case EVENT_APPTERMINATE, EVENT_WINDOWCLOSE End End Select Forever |
Comments
| ||
i like it |
Code Archives Forum