[tekui-devel] tekui: Added List class and list demo; Canvas: now always determ...

Timm S. Mueller tmueller at neoscientists.org
Sat Mar 29 05:06:25 CET 2008


details:   http://hg.teklib.org/tekui/rev/8da9a558a533
changeset: 382:8da9a558a533
user:      Timm S. Mueller <tmueller at neoscientists.org>
date:      Tue Mar 25 01:27:57 2008 +0100
description:
Added List class and list demo; Canvas: now always determines and redraws
background of unused regions; FloatText: local TextCanvas class removed

diffs (truncated from 353 to 100 lines):

diff -r d716e201118d -r 8da9a558a533 tek/app/ui/list.lua
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tek/app/ui/list.lua	Tue Mar 25 01:27:57 2008 +0100
@@ -0,0 +1,14 @@
+#!/usr/bin/env lua
+
+require "tek.lib.debug".level = 4
+local ui = require "tek.lib.ui"
+
+app = ui.Application:new {
+	Children = {
+		ui.Window:new {
+			Children = {
+				ui.List:new { Text = "Hallo" }
+			}
+		}
+	}
+}:run()
diff -r d716e201118d -r 8da9a558a533 tek/class/ui/canvas.lua
--- a/tek/class/ui/canvas.lua	Mon Mar 24 03:37:33 2008 +0100
+++ b/tek/class/ui/canvas.lua	Tue Mar 25 01:27:57 2008 +0100
@@ -16,7 +16,7 @@ local overlap = ui.Region.overlapCoords
 local overlap = ui.Region.overlapCoords
 
 module("tek.class.ui.canvas", tek.class.ui.frame)
-_VERSION = "Canvas 0.7"
+_VERSION = "Canvas 1.0"
 local Canvas = _M
 
 local DEF_CANVASAREA_MARGIN = { 0, 0, 0, 0 }
@@ -102,14 +102,12 @@ end
 
 function Canvas:askMinMax()
 	ui.Group.getMinMax(self.Object)
-
 	local m = self.Object.MinMax
 	local s = self.ScrollGroup
 	local m1 = s.KeepMinWidth and m[1] or 0
 	local m2 = s.KeepMinHeight and m[2] or 0
 	local m3 = s.HMax and ui.HUGE or self.Width
 	local m4 = s.VMax and ui.HUGE or self.Height
-
 	return m1, m2, m3, m4
 end
 
@@ -122,6 +120,7 @@ function Canvas:layout(r1, r2, r3, r4, m
 	local sizechanged = false
 
 	local m = self.MarginAndBorder
+	local r = self.Rect
 
 	if self.ScrollGroup.AutoWidth then
 		local w = r3 - r1 + 1 - m[1] - m[3]
@@ -137,24 +136,31 @@ function Canvas:layout(r1, r2, r3, r4, m
 
 	Frame.layout(self, r1, r2, r3, r4, markdamage)
 
+	-- relayout object until width and height settle in:
+	-- TODO: break out if they don't settle in?
 	local iw, ih
 	repeat
 		iw, ih = self.Width, self.Height
-		self.Object:layout(0, 0, self.Width - 1, self.Height - 1, sizechanged)
+		self.Object:layout(0, 0, iw - 1, ih - 1, sizechanged)
 		sizechanged = true
 	until self.Width == iw and self.Height == ih
 
 	-- propagate intra-area damages calculated in Frame.layout to child object:
 	local dr = self.DamageRegion
 	if dr and markdamage ~= false then
-		local sx = self.Left - self.Rect[1]
-		local sy = self.Top - self.Rect[2]
+		local sx = self.Left - r[1]
+		local sy = self.Top - r[2]
 		for _, r in dr:getRects() do
 			local r1, r2, r3, r4 = dr:getRect(r)
 			-- mark as damage shifted into canvas space:
 			self.Object:markDamage(r1 + sx, r2 + sy, r3 + sx, r4 + sy)
 		end
 	end
+
+	-- determine unused region:
+	self.UnusedRegion = ui.Region.new(r1 + m[1], r2 + m[2], r3 - m[3], r4 - m[4])
+	local o = self.Object.Rect
+	self.UnusedRegion:subRect(o[1] + r[1], o[2] + r[2], o[3] + r[1], o[4] + r[2])
 
 	self.Redraw = true
 
@@ -183,6 +189,13 @@ end
 -------------------------------------------------------------------------------
 
 function Canvas:draw()
+	local d = self.Drawable
+	local f = self.UnusedRegion
+	local p = d.Pens[self.BackPen or ui.PEN_LISTVIEWBACK]
+	for _, r in f:getRects() do
+		local r1, r2, r3, r4 = f:getRect(r)
+		d:fillRect(r1, r2, r3, r4, p)
+	end
 end


More information about the tekui-devel mailing list