112 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
--
 | 
						|
-- 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
 | 
						|
 | 
						|
}
 |