November 28, 2020, 02:40:43 AM

Author Topic: [bmx] WindowEx by JoshK [ 1+ years ago ]  (Read 548 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] WindowEx by JoshK [ 1+ years ago ]
« on: June 29, 2017, 12:28:39 AM »
Title : WindowEx
Author : JoshK
Posted : 1+ years ago

Description : 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.


Code :
Code: BlitzMax
  1. SuperStrict
  2.  
  3. Import maxgui.proxygadgets
  4. Import maxgui.drivers
  5.  
  6. Private
  7.  
  8. Type TIntWrapper
  9.        
  10.         Field i:Int
  11.        
  12.         Method Compare:Int(o:Object)
  13.                 Local intwrapper:TIntWrapper=TIntWrapper(o)
  14.                 If i>intwrapper.i Return 1
  15.                 If i<intwrapper.i Return -1
  16.                 Return 0
  17.         EndMethod
  18.        
  19.         Function Create:TIntWrapper(i:Int)
  20.                 Local intwrapper:TIntWrapper=New TIntWrapper
  21.                 intwrapper.i=i
  22.                 Return intwrapper
  23.         EndFunction
  24.        
  25. EndType
  26.  
  27. Function CopyRect(x0:Int,y0:Int,w:Int,h:Int,x1:Int,y1:Int,src:TPixmap,dst:TPixmap)
  28.         Local x:Int,y:Int,c:Int'=RGBA(0,0,0,0)
  29.         For x=0 To w-1
  30.                 For y=0 To h-1
  31.                         If src c=ReadPixelSafe(src,x0+x,y0+y)
  32.                         WritePixelSafe(dst,x1+x,y1+y,c)
  33.                 Next
  34.         Next
  35. EndFunction
  36.  
  37. Function ReadPixelSafe:Int(pixmap:TPixmap,x:Int,y:Int)
  38.         If PixelIsValid(pixmap,x,y) Return pixmap.ReadPixel(x,y)
  39. EndFunction
  40.  
  41. Function WritePixelSafe:Int(pixmap:TPixmap,x:Int,y:Int,color:Int)
  42.         If PixelIsValid(pixmap,x,y) pixmap.WritePixel(x,y,color)
  43. EndFunction
  44.  
  45. Function PixelIsValid:Int(pixmap:TPixmap,x:Int,y:Int)
  46.         If x<0 Return False
  47.         If x>pixmap.width-1 Return False
  48.         If y<0 Return False
  49.         If y>pixmap.height-1 Return False
  50.         Return True
  51. EndFunction
  52.  
  53. Local x:Int,y:Int
  54. Local red:Int
  55. MemCopy Varptr red,[0:Byte,0:Byte,255:Byte,255:Byte],4
  56.  
  57. For x=0 To TWindowEx.MissingIcon.width-1
  58.         For y=0 To TWindowEx.MissingIcon.height-1
  59.                 TWindowEx.MissingIcon.WritePixel x,y,red
  60.                 If x=0 And y=0 TWindowEx.MissingIcon.WritePixel x,y,0
  61.         Next
  62. Next
  63.  
  64. For x=0 To TWindowEx.BlankIcon.width-1
  65.         For y=0 To TWindowEx.BlankIcon.height-1
  66.                 TWindowEx.BlankIcon.WritePixel x,y,0
  67.         Next
  68. Next
  69.  
  70. Public
  71.  
  72. Type TWindowEx Extends TProxyGadget
  73.        
  74.         Const LoadPixmapPath:String=""
  75.         Const ToolbarIconSize:Int=16
  76.        
  77.         Global menuiditerator:Int=0
  78.         Global menuidmap:TMap=New TMap
  79.         Global actionicon:TPixmap[]
  80.         Global actionmenuicon:TPixmap[]
  81.         Global MissingIcon:TPixmap=CreatePixmap(ToolbarIconSize,ToolbarIconSize,PF_RGBA8888)
  82.         Global BlankIcon:TPixmap=CreatePixmap(ToolbarIconSize,ToolbarIconSize,PF_RGBA8888)
  83.        
  84.         Field window:TGadget
  85.         Field toolbar:TGadget
  86.         Field menuroot:TGadget
  87.         Field currentmenu:TGadget
  88.         Field toolbaritemid:Int[]
  89.         Field menumap:TMap=New TMap
  90.         Field toolbaritemmap:TMap=New TMap
  91.         Field toolbartips:String[]
  92.         Field existingtips:String[]
  93.         Field existingtoolbarenablestate:Int[]
  94.        
  95.         Method Cleanup()
  96.                 RemoveHook EmitEventHook,EventHook,Self
  97.                 FreeGadget window
  98.         EndMethod
  99.        
  100.         Method ToggleItem(action:Int)
  101.                 If ItemChecked(action)
  102.                         UncheckItem action
  103.                 Else
  104.                         CheckItem action
  105.                 EndIf
  106.         EndMethod
  107.        
  108.         Method EnableItem(action:Int)
  109.                 Local intwrapper:TIntWrapper=TIntWrapper.Create(action)
  110.                 Local menu:TGadget
  111.                 menu=TGadget(menumap.ValueForKey(intwrapper))
  112.                 If menu EnableGadget menu
  113.                 intwrapper = TIntWrapper(toolbaritemmap.valueforkey(intwrapper))
  114.                 If intwrapper
  115.                         EnableGadgetItem toolbar,intwrapper.i
  116.                         existingtoolbarenablestate[intwrapper.i]=True
  117.                 EndIf
  118.         EndMethod
  119.        
  120.         Method DisableItem(action:Int)
  121.                 Local intwrapper:TIntWrapper=TIntWrapper.Create(action)
  122.                 Local menu:TGadget
  123.                 menu=TGadget(menumap.ValueForKey(intwrapper))
  124.                 If menu DisableGadget menu
  125.                 intwrapper = TIntWrapper(toolbaritemmap.valueforkey(intwrapper))       
  126.                 If intwrapper
  127.                         DisableGadgetItem toolbar,intwrapper.i
  128.                         existingtoolbarenablestate[intwrapper.i]=False
  129.                 EndIf
  130.         EndMethod
  131.        
  132.         Method CheckItem(action:Int)
  133.                 Local intwrapper:TIntWrapper=TIntWrapper.Create(action)
  134.                 Local menu:TGadget
  135.                 menu=TGadget(menumap.ValueForKey(intwrapper))
  136.                 If menu CheckMenu menu
  137.                 intwrapper = TIntWrapper(toolbaritemmap.valueforkey(intwrapper))       
  138.                 If intwrapper SelectGadgetItem toolbar,intwrapper.i
  139.         EndMethod
  140.        
  141.         Method UncheckItem(action:Int)
  142.                 Local intwrapper:TIntWrapper=TIntWrapper.Create(action)
  143.                 Local menu:TGadget
  144.                 menu=TGadget(menumap.ValueForKey(intwrapper))
  145.                 If menu UncheckMenu menu
  146.                 intwrapper = TIntWrapper(toolbaritemmap.valueforkey(intwrapper))       
  147.                 If intwrapper DeselectGadgetItem toolbar,intwrapper.i
  148.         EndMethod
  149.        
  150.         Method ItemEnabled:Int(action:Int)
  151.                 Local intwrapper:TIntWrapper=TIntWrapper.Create(action)
  152.                 Local menu:TGadget
  153.                 menu=TGadget(menumap.ValueForKey(intwrapper))
  154.                 If menu Return Not GadgetDisabled(menu)
  155.                 intwrapper = TIntWrapper(toolbaritemmap.valueforkey(intwrapper))       
  156.                 If intwrapper Return existingtoolbarenablestate[intwrapper.i]
  157.                 Return False
  158.         EndMethod
  159.        
  160.         Method ItemChecked:Int(action:Int)
  161.                 Local intwrapper:TIntWrapper=TIntWrapper.Create(action)
  162.                 Local menu:TGadget
  163.                 menu=TGadget(menumap.ValueForKey(intwrapper))
  164.                 If menu Return MenuChecked(menu)
  165.                 intwrapper = TIntWrapper(toolbaritemmap.valueforkey(intwrapper))       
  166.                 If intwrapper Return GadgetItemSelected(toolbar,intwrapper.i)
  167.                 Return False
  168.         EndMethod
  169.        
  170.         Function GadgetItemSelected:Int(gadget:TGadget,i:Int)
  171.                 Local n:Int
  172.                 Local items:Int[]=SelectedGadgetItems(gadget)
  173.                 For n=0 To items.length-1
  174.                         If items[n]=i Return True
  175.                 Next
  176.                 Return False
  177.         EndFunction
  178.        
  179.         Method ProcessEvent:Int(event:TEvent)  
  180.                 Local parent:TGadget
  181.                
  182.                 Select event.id
  183.                
  184.                 Case EVENT_MENUACTION
  185.                         If Not TWindowEx(event.source)
  186.                                 parent=TGadget(event.source)
  187.                                 While parent
  188.                                         If parent=WindowMenu(window)
  189.                                                 event.source=Self
  190.                                         EndIf
  191.                                         parent=parent.parent
  192.                                 Wend
  193.                         EndIf
  194.                        
  195.                 Case EVENT_GADGETACTION
  196.                         Select event.source
  197.                        
  198.                         Case toolbar
  199.                        
  200.                                 If toolbar
  201.                                         EmitEvent CreateEvent(EVENT_MENUACTION,Self,toolbaritemid[event.data])
  202.                                         Return False
  203.                                 EndIf
  204.                                
  205.                         EndSelect
  206.                        
  207.                 EndSelect
  208.                
  209.                 Return True
  210.         EndMethod
  211.        
  212.         Method AddMenuItem:TGadget(name:String,group:TGadget=Null,action:Int=0)
  213.                 Local menu:TGadget
  214.                 Local pixmap:TPixmap
  215.                 If Not group group=WindowMenu(window)
  216.                 menu = CreateMenu("  "+name,action,group)
  217.                 menumap.Insert TIntWrapper.Create(action),menu
  218.                 If action
  219.                         ?win32
  220.                         If actionmenuicon[action]
  221.                                 SetGadgetPixmap menu,actionmenuicon[action]
  222.                         EndIf
  223.                         ?
  224.                 EndIf
  225.                 Return menu
  226.         EndMethod
  227.        
  228.         Method AddMenuSeparator(group:TGadget)
  229.                 CreateMenu("",0,group)
  230.         EndMethod
  231.        
  232.         Method AddToolbarSeparator()
  233.                 toolbaritemid = toolbaritemid[..toolbaritemid.length+1]
  234.                 toolbaritemid[toolbaritemid.length-1]=-1
  235.                 toolbartips=toolbartips[..toolbartips.length+1]
  236.         EndMethod
  237.        
  238.         Method AddToolbarItem(tip:String,action:Int)
  239.                 toolbaritemid = toolbaritemid[..toolbaritemid.length+1]
  240.                 toolbaritemid[toolbaritemid.length-1]=action
  241.                 toolbaritemmap.Insert TIntWrapper.Create(action),TIntWrapper.Create(toolbaritemid.length-1)
  242.                 toolbartips=toolbartips[..toolbartips.length+1]
  243.                 toolbartips[toolbartips.length-1]=tip
  244.         EndMethod
  245.        
  246.         Method Clear()
  247.                 Local menu:TGadget
  248.                 For menu=EachIn WindowMenu(window).kids
  249.                         FreeGadget menu
  250.                 Next
  251.                 If toolbar
  252.                         FreeGadget toolbar
  253.                         toolbar=Null
  254.                 EndIf
  255.                 menumap.Clear()
  256.                 toolbaritemmap.Clear()
  257.                 toolbartips=Null
  258.                 toolbaritemid=Null
  259.                 existingtips=Null
  260.                 existingtoolbarenablestate=Null
  261.         EndMethod
  262.        
  263.         Method UpdateMenu()
  264.                 UpdateWindowMenu window
  265.         EndMethod
  266.        
  267.         Method Build()
  268.                 Local pixmap:TPixmap
  269.                 Local icon:TPixmap
  270.                 Local i:Int
  271.                 Local action:Int
  272.                
  273.                 UpdateWindowMenu window
  274.                
  275.                 If toolbar
  276.                         FreeGadget toolbar
  277.                         toolbar=Null
  278.                 EndIf
  279.                
  280.                 If toolbaritemid
  281.                         pixmap=CreatePixmap(ToolbarIconSize*toolbaritemid.length,ToolbarIconSize,PF_RGBA8888)
  282.                         For i=0 To toolbaritemid.length-1
  283.                                 action=toolbaritemid[i]
  284.                                 If action=-1
  285.                                         icon=BlankIcon
  286.                                 Else
  287.                                         icon=actionicon[action]
  288.                                 EndIf
  289.                                 If Not icon
  290.                                         icon=MissingIcon
  291.                                 EndIf
  292.                                 CopyRect 0,0,ToolbarIconSize,ToolbarIconSize,i*ToolbarIconSize,0,icon,pixmap
  293.                         Next
  294.                         toolbar = CreateToolbar(pixmap,0,0,0,0,window)
  295.                         SetToolbarTips toolbar,toolbartips
  296.                         existingtips = toolbartips
  297.                         existingtoolbarenablestate=existingtoolbarenablestate[..toolbaritemid.length]
  298.                         For i=0 To existingtoolbarenablestate.length-1
  299.                                 existingtoolbarenablestate[i]=True
  300.                         Next
  301.                 EndIf
  302.         EndMethod
  303.        
  304.         Function Create:TWindowEx(title:String,x:Int,y:Int,width:Int,height:Int,group:TGadget,style:Int=WINDOW_DEFAULT)
  305.                 Local windowex:TWindowEx=New TWindowEx
  306.                 windowex.window=CreateWindow(title,x,y,width,height,group,style)
  307.                 windowex.SetProxy windowex.window
  308.                 AddHook EmitEventHook,EventHook,windowex
  309.                 Return windowex
  310.         EndFunction
  311.        
  312.         Function EventHook:Object(id:Int,data:Object,context:Object)
  313.                 Local event:TEvent
  314.                 Local windowex:TWindowEx
  315.                
  316.                 windowex=TWindowEx(context)
  317.                 If windowex
  318.                         event=TEvent(data)
  319.                         If event
  320.                                 If Not windowex.ProcessEvent(event) Return Null
  321.                         EndIf
  322.                 EndIf
  323.                 Return data
  324.         EndFunction
  325.        
  326.         Function AllocMenuID:Int()
  327.                 menuiditerator:+1
  328.                 actionicon=actionicon[..menuiditerator+1]
  329.                 actionmenuicon=actionmenuicon[..menuiditerator+1]
  330.                 Return menuiditerator
  331.         EndFunction
  332.                
  333. EndType
  334.  
  335. Function GetActionID:Int(action:String)
  336.         Local intwrapper:TIntWrapper
  337.         action = action.ToLower()              
  338.         intwrapper = TIntWrapper(TWindowEx.menuidmap.valueforkey(action))
  339.         If Not intwrapper
  340.                 intwrapper=New TIntWrapper
  341.                 intwrapper.i = TWindowEx.AllocMenuID()
  342.                 TWindowEx.menuidmap.Insert action,intwrapper
  343.         EndIf
  344.         TWindowEx.actionicon[intwrapper.i]=LoadPixmap(TWindowEx.LoadPixmapPath+action+".png")
  345.         If TWindowEx.actionicon[intwrapper.i]
  346.                 If TWindowEx.actionicon[intwrapper.i].width<>TWindowEx.ToolbarIconSize Or TWindowEx.actionicon[intwrapper.i].height<>TWindowEx.ToolbarIconSize
  347.                         TWindowEx.actionicon[intwrapper.i] = ResizePixmap(TWindowEx.actionicon[intwrapper.i],TWindowEx.ToolbarIconSize,TWindowEx.ToolbarIconSize)
  348.                 EndIf
  349.                 TWindowEx.actionmenuicon[intwrapper.i] = ResizePixmap(TWindowEx.actionicon[intwrapper.i],13,13)
  350.         EndIf
  351.         Return intwrapper.i
  352. EndFunction
  353.  
  354. Function CreateWindowEx:TWindowEx(title:String,x:Int,y:Int,width:Int,height:Int,group:TGadget,style:Int=WINDOW_DEFAULT)
  355.         Return TWindowEx.Create(title,x,y,width,height,group,style)
  356. EndFunction
  357.  
  358. '=========================================
  359. 'Example
  360. '=========================================
  361.  
  362. AppTitle = "WindowEx Example"
  363.  
  364. Local window:TWindowEx = CreateWindowEx( AppTitle, 100, 100, 320, 240, Null)
  365. Local menu:TGadget
  366.  
  367. Global action_file_new:Int = GetActionID("File_New")
  368. Global action_file_open:Int = GetActionID("File_Open")
  369. Global action_file_save:Int = GetActionID("File_Save")
  370. Global action_app_exit:Int = GetActionID("App_Exit")
  371. Global action_option_toggle:Int = GetActionID("Options_Toggle")
  372. Global action_option_disable:Int = GetActionID("Options_Disable")
  373. Global action_option_enable:Int = GetActionID("Options_Enable")
  374.  
  375. menu=window.AddMenuItem("File")
  376. window.AddMenuItem "New",menu,action_file_new
  377. window.AddMenuSeparator menu
  378. window.AddMenuItem "Open",menu,action_file_open
  379. window.AddMenuItem "Save",menu,action_file_save
  380. window.AddMenuSeparator menu
  381. window.AddMenuItem "Exit",menu,action_app_exit
  382.  
  383. menu=window.AddMenuItem("Options")
  384. window.AddMenuItem "Toggle",menu,action_option_toggle
  385. window.AddMenuItem "Disable",menu,action_option_disable
  386. window.AddMenuItem "Enable",menu,action_option_enable
  387.  
  388. window.AddToolbarItem "New File",action_file_new
  389. window.AddToolbarSeparator
  390. window.AddToolbarItem "Open File",action_file_open
  391. window.AddToolbarItem "Save File",action_file_save
  392. window.AddToolbarSeparator
  393. window.AddToolbarItem "Toggle",action_option_toggle
  394. window.AddToolbarItem "Enable",action_option_enable
  395. window.AddToolbarItem "Disable",action_option_disable
  396.  
  397. window.Build()
  398.  
  399. Repeat
  400.         WaitEvent()
  401.         Select EventID()
  402.                
  403.                 Case EVENT_MENUACTION
  404.                         Select EventSource()
  405.                        
  406.                         Case window
  407.                                
  408.                                 Select EventData()
  409.                                
  410.                                 Case action_file_new
  411.                                         Print "File_New"
  412.                                
  413.                                 Case action_file_open
  414.                                         Print "File_Open"
  415.                                
  416.                                 Case action_file_save
  417.                                         Print "File_Save"                              
  418.                                
  419.                                 Case action_app_exit
  420.                                         Print "App_Exit"
  421.                                         End
  422.                                
  423.                                 Case action_option_toggle
  424.                                         Print "Option_Toggle"
  425.                                         If window.ItemChecked(action_option_toggle)
  426.                                                 window.UncheckItem action_option_toggle
  427.                                         Else
  428.                                                 window.CheckItem action_option_toggle
  429.                                         EndIf
  430.                                         UpdateWindowMenu window
  431.        
  432.                                 Case action_option_disable
  433.                                         Print "Option_Disable"
  434.                                         If window.ItemEnabled(action_option_disable)
  435.                                                 window.DisableItem action_option_disable
  436.                                         Else
  437.                                                 window.EnableItem action_option_disable
  438.                                         EndIf
  439.                                         UpdateWindowMenu window
  440.                                
  441.                                 Case action_option_enable
  442.                                         Print "Option_Enable"
  443.                                         window.EnableItem action_option_disable
  444.                                         UpdateWindowMenu window
  445.                                        
  446.                                 EndSelect
  447.                                
  448.                         EndSelect
  449.                        
  450.                 Case EVENT_APPTERMINATE, EVENT_WINDOWCLOSE
  451.                         End
  452.                        
  453.         End Select
  454. Forever


Comments :


AdamRedwoods(Posted 1+ years ago)

 i like it


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal