Lua: work-in-progress library (made in Lua) for object-oriented GUI. Already implements windows, buttons, and dynamic labels.
git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@2055 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
		
							parent
							
								
									e499aa4767
								
							
						
					
					
						commit
						ea72bfe13f
					
				
							
								
								
									
										33
									
								
								share/grafx2/scripts/_tst_dialog2.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								share/grafx2/scripts/_tst_dialog2.lua
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
			
		||||
--
 | 
			
		||||
-- test of GUI library
 | 
			
		||||
--
 | 
			
		||||
run("libs/gui.lua")
 | 
			
		||||
 | 
			
		||||
local counter = gui.label{x=10, y=54, value=0, format="% .3d"}
 | 
			
		||||
local form = gui.dialog{
 | 
			
		||||
    title="Dialogtest",
 | 
			
		||||
    w=100,
 | 
			
		||||
    h=150,
 | 
			
		||||
    counter,
 | 
			
		||||
    gui.button{ label="+",
 | 
			
		||||
      x=6, y=38, w=14, h=14, repeatable=true, click=function() 
 | 
			
		||||
      counter.value=counter.value+1;
 | 
			
		||||
      counter:render();
 | 
			
		||||
    end},
 | 
			
		||||
    gui.button{ label="-",
 | 
			
		||||
      x=26, y=38, w=14, h=14, repeatable=true, click=function()
 | 
			
		||||
      counter.value=counter.value-1;
 | 
			
		||||
      counter:render();
 | 
			
		||||
    end},
 | 
			
		||||
    gui.button{ label="Help",
 | 
			
		||||
      x=6, y=70, w=54, h=14, click=function()
 | 
			
		||||
      messagebox("Help screen");
 | 
			
		||||
    end},
 | 
			
		||||
    gui.button{ label="Close",
 | 
			
		||||
      x=6, y=18, w=54, h=14, key=27, click=function()
 | 
			
		||||
      return true; -- causes closing
 | 
			
		||||
    end},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
form:run()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										111
									
								
								share/grafx2/scripts/libs/gui.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								share/grafx2/scripts/libs/gui.lua
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,111 @@
 | 
			
		||||
--
 | 
			
		||||
-- Event-driven GUI library
 | 
			
		||||
--
 | 
			
		||||
--
 | 
			
		||||
 | 
			
		||||
gui = {
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
-- dialog() --
 | 
			
		||||
--
 | 
			
		||||
dialog = function(args)
 | 
			
		||||
  local dia = {
 | 
			
		||||
    title = args.title,
 | 
			
		||||
    w = args.w,
 | 
			
		||||
    h = args.h,
 | 
			
		||||
    -- 
 | 
			
		||||
    widgets = {},
 | 
			
		||||
    -- an indexed array, starting at 1. Used for calling the relevant
 | 
			
		||||
    -- callback when a numbered control is clicked.  
 | 
			
		||||
    callbacks = {},
 | 
			
		||||
    
 | 
			
		||||
    --
 | 
			
		||||
    -- dialog.run() --
 | 
			
		||||
    --
 | 
			
		||||
    run = function(this)
 | 
			
		||||
      windowopen(this.w,this.h, this.title or "");
 | 
			
		||||
      -- examine all elements
 | 
			
		||||
      for _,widget in ipairs(this.widgets) do
 | 
			
		||||
        widget:render()
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
      repeat
 | 
			
		||||
       local button, button2, key = windowdodialog();
 | 
			
		||||
      
 | 
			
		||||
        if button > 0 then
 | 
			
		||||
          local c = this.callbacks[button]
 | 
			
		||||
          -- run the callback and stop the form if it returns true
 | 
			
		||||
          if c ~= nil and c(this) then
 | 
			
		||||
              break;
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
      until key == 27;
 | 
			
		||||
      windowclose();
 | 
			
		||||
    end
 | 
			
		||||
  }
 | 
			
		||||
  local id = 1;
 | 
			
		||||
  -- examine all elements
 | 
			
		||||
  for _,value in ipairs(args) do
 | 
			
		||||
    -- all arguments that are tables are assumed to be widgets
 | 
			
		||||
    if type(value)=="table" then
 | 
			
		||||
      table.insert(dia.widgets, value)
 | 
			
		||||
      -- clickable widgets take up an auto-numbered id
 | 
			
		||||
      if (value.click) then
 | 
			
		||||
        dia.callbacks[id] = value.click
 | 
			
		||||
        id=id+1
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
  return dia;
 | 
			
		||||
end,
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
-- button() --
 | 
			
		||||
--
 | 
			
		||||
button = function(args)
 | 
			
		||||
  local but = {
 | 
			
		||||
    x = args.x,
 | 
			
		||||
    y = args.y,
 | 
			
		||||
    w = args.w,
 | 
			
		||||
    h = args.h,
 | 
			
		||||
    key = args.key,
 | 
			
		||||
    label = args.label,
 | 
			
		||||
    click = args.click or donothing,
 | 
			
		||||
    render = args.repeatable and function(this)
 | 
			
		||||
      windowrepeatbutton(this.x, this.y, this.w, this.h, this.label, this.key or -1);
 | 
			
		||||
    end
 | 
			
		||||
    or function(this)
 | 
			
		||||
      windowbutton(this.x, this.y, this.w, this.h, this.label, this.key or -1);
 | 
			
		||||
    end
 | 
			
		||||
  }
 | 
			
		||||
  return but;
 | 
			
		||||
end,
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
-- label() --
 | 
			
		||||
--
 | 
			
		||||
label = function(args)
 | 
			
		||||
  local fld = {
 | 
			
		||||
    x = args.x,
 | 
			
		||||
    y = args.y,
 | 
			
		||||
    value = args.value,
 | 
			
		||||
    format = args.format,
 | 
			
		||||
    fg = args.fg or 0,
 | 
			
		||||
    bg = args.bg or 2,
 | 
			
		||||
    render = function(this)
 | 
			
		||||
      if type(this.format) then
 | 
			
		||||
        windowprint(this.x, this.y, string.format(this.format, this.value), this.fg, this.bg);
 | 
			
		||||
      else
 | 
			
		||||
        windowprint(this.x, this.y, this.value, this.fg, this.bg);
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  }
 | 
			
		||||
  return fld;
 | 
			
		||||
end,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- "do nothing" function. Used as default callback
 | 
			
		||||
donothing = function(this)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user