From 536f545eda5d8055e6566eeb8c9c59be1d7ef4da Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Wed, 25 Nov 2009 10:23:50 +0000
Subject: [PATCH] nice dialogs, special keyhandlers for dialogs

git-svn-id: http://svn.net-core.org/repos/t-engine4@39 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/data/gfx/border_1.png         | Bin 0 -> 246 bytes
 game/data/gfx/border_2.png         | Bin 0 -> 170 bytes
 game/data/gfx/border_3.png         | Bin 0 -> 227 bytes
 game/data/gfx/border_4.png         | Bin 0 -> 169 bytes
 game/data/gfx/border_6.png         | Bin 0 -> 168 bytes
 game/data/gfx/border_7.png         | Bin 0 -> 206 bytes
 game/data/gfx/border_8.png         | Bin 0 -> 171 bytes
 game/data/gfx/border_9.png         | Bin 0 -> 253 bytes
 game/engine/Dialog.lua             |  41 ++++++++++++++++++++++++++---
 game/engine/Game.lua               |   1 +
 game/engine/Key.lua                |   2 ++
 game/engine/KeyCommand.lua         |   8 +++---
 game/engine/utils.lua              |  10 +++++++
 game/modules/tome/dialogs/Quit.lua |  14 +++++++---
 14 files changed, 66 insertions(+), 10 deletions(-)
 create mode 100644 game/data/gfx/border_1.png
 create mode 100644 game/data/gfx/border_2.png
 create mode 100644 game/data/gfx/border_3.png
 create mode 100644 game/data/gfx/border_4.png
 create mode 100644 game/data/gfx/border_6.png
 create mode 100644 game/data/gfx/border_7.png
 create mode 100644 game/data/gfx/border_8.png
 create mode 100644 game/data/gfx/border_9.png

diff --git a/game/data/gfx/border_1.png b/game/data/gfx/border_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..d78094cb84a22e1fcbf7f2019bc15545db9acd2f
GIT binary patch
literal 246
zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|I14-?iy0WW
zg+Z8+Vb&Z8pdfpRr>`sfO>Rj}ON*}J122F=k|nMYCC>S|xv6<249-QVi6yBi3gww4
z84B*6z5(HleBwYw$(}BbArhC9@9Zu<^j|yty|Ij4(Zs~FyO?=iG;}sHDEK;hOkmDq
z-DdWSXXZ;rp6YTxhrk0n%AdFV=K+H7b@$Q}fZ)Q#FqhB+2M&CYPusG#*RD;p2PpZ!
f@aB1-7z2ajHc9h5ueUKk>li#;{an^LB{Ts54DnCD

literal 0
HcmV?d00001

diff --git a/game/data/gfx/border_2.png b/game/data/gfx/border_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..08acdb6b556a549a6902d0e9b88393b2985b91dd
GIT binary patch
literal 170
zcmeAS@N?(olHy`uVBq!ia0vp^j6lrH!3HFQ?xr?@1d4;)ofy`glX(f`a29w(7Bet#
z3xhBt!>l<HKtc8rPhVH|o7|F|7OEfe<`w{jBuiW)N}Tg^b5rw57@Uhz6H8K46v{J8
zG8EiBeFMT9`NV;W#64XcLpZJ{b8r^@IG>We`22w-i`SlDV31wP%=K2FV;)cmgQu&X
J%Q~loCIEp|EY1J`

literal 0
HcmV?d00001

diff --git a/game/data/gfx/border_3.png b/game/data/gfx/border_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..e917cb161cbadb1709b6d257c00ed09063c6920a
GIT binary patch
literal 227
zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|I14-?iy0WW
zg+Z8+Vb&Z8pdfpRr>`sfO>Rj}E0wMB=Tm?}k|nMYCC>S|xv6<249-QVi6yBi3gww4
z84B*6z5(HleBwYw0iG_7ArhC9QxXz>oNr+J_HNFBf~T))+YY<y85tM~Ff7r&vAdWl
zkJaF$cKG|lM<Xtj9#G+z-^mf!utth4VN&)r*@T3~!V3pym9k5K07GAg!b9t6N27se
OGkCiCxvX<aXaWEo+C@nK

literal 0
HcmV?d00001

diff --git a/game/data/gfx/border_4.png b/game/data/gfx/border_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a8591342fd58477c3fdbfc23525084dae112f8a
GIT binary patch
literal 169
zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y@!3HFyABb!Laf*Z7ofy`glX(f`a29w(7Bet#
z3xhBt!>l<HKtc8rPhVH|o7|F|=H@N_AHD;HBuiW)N}Tg^b5rw57@Uhz6H8K46v{J8
zG8EiBeFMT9`NV;W#5`RbLpZJ{-`QP!=)ZROdt({9qKS+Q7V7NJ`_35t2dZH3boFyt
I=akR{07zaeg#Z8m

literal 0
HcmV?d00001

diff --git a/game/data/gfx/border_6.png b/game/data/gfx/border_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..18d4c24bee37a54a014cf2d33bc5c9b099386abc
GIT binary patch
literal 168
zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y@!3HFyABb!Laf*Z7ofy`glX(f`a29w(7Bet#
z3xhBt!>l<HKtc8rPhVH|o7|F|7VN5gccuV^BuiW)N}Tg^b5rw57@Uhz6H8K46v{J8
zG8EiBeFMT9`NV;WL_J*`LpZJ{^KcgZ$j@GUe!=3kCxBWNnAr`#CT;~PVDNPHb6Mw<
G&;$UCr74^M

literal 0
HcmV?d00001

diff --git a/game/data/gfx/border_7.png b/game/data/gfx/border_7.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8061a78e7ea5faa7ccf27740c352169ce9b6852
GIT binary patch
literal 206
zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^#^NA%Cx&(BWL^R}oCO|{#S9GG
z!XV7ZFl&wkP>{XE)7O>#CbuM~nE|swh$v7<vcxr_#5q4VH#M(>!MP|ku_QG`p**uB
zL&4qCHz2%`PaLSo+SA1`gyVX0N&*Pn*j>!Ttd-Ex9k;Ve-jylx%ZG{G1)O3g7foOD
rIjGD~5SgXn#N;dD%EbF%3IjuHhqS;8)xCN^V;DSL{an^LB{Ts5eF`;e

literal 0
HcmV?d00001

diff --git a/game/data/gfx/border_8.png b/game/data/gfx/border_8.png
new file mode 100644
index 0000000000000000000000000000000000000000..1bf00062ae37fbbdcb8aaa238a0058e6a8d7ea18
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^j6lrH!3HFQ?xr?@1d4;)ofy`glX(f`a29w(7Bet#
z3xhBt!>l<HKtc8rPhVH|o7|F|7Wx9aOY(q1k|nMYCC>S|xv6<249-QVi6yBi3gww4
z84B*6z5(HleBwYw5}q!OAsp9}Z|p8URKH9+{JpWk=YnE01_rBLY{nL1_sf847(8A5
KT-G@yGywo?&nv$G

literal 0
HcmV?d00001

diff --git a/game/data/gfx/border_9.png b/game/data/gfx/border_9.png
new file mode 100644
index 0000000000000000000000000000000000000000..31eb00d4b44439baa6e8d2b4526e3b18e731f9d2
GIT binary patch
literal 253
zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|I14-?iy0WW
zg+Z8+Vb&Z8pdfpRr>`sfO>Rj}YqR*j{kcFP$r9Iy66gHf+|;}h2Ir#G#FEq$h4Rdj
z3<Y;j-+=H&K5?L;EKe855Q)plcXk&as%O(VaC2`%BM3Y_b@jKzB&%CpJc^EdJlWS|
z6B2khiyRCOUUQodl7IMNVmA*6^Z;=ID@f7ImyA3H!Tj<&PaJ4jQ+;+9bAfh31LyR|
g1zHa5ETRkyr6p3SEH77C0BvRPboFyt=akR{0FgONvj6}9

literal 0
HcmV?d00001

diff --git a/game/engine/Dialog.lua b/game/engine/Dialog.lua
index c19c13db8d..567ab7e838 100644
--- a/game/engine/Dialog.lua
+++ b/game/engine/Dialog.lua
@@ -1,8 +1,12 @@
 require "engine.class"
+require "engine.Tiles"
+require "engine.KeyCommand"
 
 --- Handles dialog windows
 module(..., package.seeall, class.make)
 
+tiles = engine.Tiles.new(16, 16)
+
 --- Create a calendar
 -- @param definition the file to load that returns a table containing calendar months
 -- @param datestring a string to format the date when requested, in the format "%s %s %s %d %d", standing for, day, month, year, hour, minute
@@ -12,9 +16,10 @@ function _M:init(title, w, h, x, y, alpha, font)
 	self.x = x or (game.w - self.w) / 2
 	self.y = y or (game.h - self.h) / 2
 	self.font = font
-	if not font then self.font = core.display.newFont("/data/font/VeraMono.ttf", 12) end
+	if not font then self.font = core.display.newFont("/data/font/Vera.ttf", 12) end
 	self.surface = core.display.newSurface(w, h)
-	self.internal_surface = core.display.newSurface(w, h - 5 - self.font:height())
+	self.iw, self.ih = w - 2 * 5, h - 8 - 16 - 3
+	self.internal_surface = core.display.newSurface(self.iw, self.ih)
 	self.surface:alpha(alpha or 220)
 	self.changed = true
 end
@@ -24,14 +29,42 @@ function _M:display()
 
 	local s = self.surface
 	s:erase()
-	s:drawColorString(self.font, self.title, 2, 0, 255,255,255)
+
+	s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_7.png"), 0, 0)
+	s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_9.png"), self.w - 9, 0)
+	s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_1.png"), 0, self.h - 9)
+	s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_3.png"), self.w - 9, self.h - 9)
+	for i = 8, self.w - 9 do
+		s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_8.png"), i, 0)
+		s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_8.png"), i, 20)
+		s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_8.png"), i, self.h - 3)
+	end
+	for i = 8, self.h - 9 do
+		s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_4.png"), 0, i)
+		s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_4.png"), self.w - 3, i)
+	end
+
+	local tw, th = self.font:size(self.title)
+	s:drawColorString(self.font, self.title, (self.w - tw) / 2, 4, 255,255,255)
 
 	self.internal_surface:erase()
 	self:drawDialog(self.internal_surface)
-	s:merge(self.internal_surface, 0, 5 + self.font:height())
+	s:merge(self.internal_surface, 5, 20 + 3)
 
 	return self.surface
 end
 
 function _M:drawDialog(s)
 end
+
+function _M:keyCommands(t)
+	self.old_key = game.key
+	game.key = engine.KeyCommand.new()
+	game.key:addCommands(t)
+	game.key:setCurrent()
+end
+
+function _M:unload()
+	game.key = self.old_key
+	game.key:setCurrent()
+end
diff --git a/game/engine/Game.lua b/game/engine/Game.lua
index 75b40cfaa3..f2aa9a1a9c 100644
--- a/game/engine/Game.lua
+++ b/game/engine/Game.lua
@@ -54,4 +54,5 @@ function _M:unregisterDialog(d)
 	if not self.dialogs[d] then return end
 	table.remove(self.dialogs, self.dialogs[d])
 	self.dialogs[d] = nil
+	d:unload()
 end
diff --git a/game/engine/Key.lua b/game/engine/Key.lua
index 90c05dfd79..817c74fbd5 100644
--- a/game/engine/Key.lua
+++ b/game/engine/Key.lua
@@ -271,3 +271,5 @@ _MENU		= 319
 _POWER		= 320		-- Power Macintosh power key
 _EURO		= 321		-- Some european keyboards
 _UNDO		= 322		-- Atari keyboard has Undo
+
+__DEFAULT 	= -10000
diff --git a/game/engine/KeyCommand.lua b/game/engine/KeyCommand.lua
index 565fcdfc8a..a6f1308ca2 100644
--- a/game/engine/KeyCommand.lua
+++ b/game/engine/KeyCommand.lua
@@ -10,8 +10,8 @@ function _M:init()
 end
 
 function _M:receiveKey(sym, ctrl, shift, alt, meta, unicode)
-	if not self.commands[sym] then return end
-	if (ctrl or shift or alt or meta) and not self.commands[sym].anymod then
+	if not self.commands[sym] and not self.commands[self.__DEFAULT] then return end
+	if self.commands[sym] and (ctrl or shift or alt or meta) and not self.commands[sym].anymod then
 		local mods = {}
 		if alt then mods[#mods+1] = "alt" end
 		if ctrl then mods[#mods+1] = "ctrl" end
@@ -21,8 +21,10 @@ function _M:receiveKey(sym, ctrl, shift, alt, meta, unicode)
 		if self.commands[sym][mods] then
 			self.commands[sym][mods](sym, ctrl, shift, alt, meta, unicode)
 		end
-	elseif self.commands[sym].plain then
+	elseif self.commands[sym] and self.commands[sym].plain then
 		self.commands[sym].plain(sym, ctrl, shift, alt, meta, unicode)
+	elseif self.commands[self.__DEFAULT] and self.commands[self.__DEFAULT].plain then
+		self.commands[self.__DEFAULT].plain(sym, ctrl, shift, alt, meta, unicode)
 	end
 end
 
diff --git a/game/engine/utils.lua b/game/engine/utils.lua
index 6ed5608137..aed5486ffd 100644
--- a/game/engine/utils.lua
+++ b/game/engine/utils.lua
@@ -141,6 +141,9 @@ do
 local tmps = core.display.newSurface(1, 1)
 getmetatable(tmps).__index.drawColorString = function(s, font, str, x, y, r, g, b)
 	local list = str:split("#%x%x%x%x%x%x#", true)
+	r = r or 255
+	g = g or 255
+	b = b or 255
 	for i, v in ipairs(list) do
 		local _, _, nr, ng, nb = v:find("^#(%x%x)(%x%x)(%x%x)#")
 		if nr and ng and nb then
@@ -152,4 +155,11 @@ getmetatable(tmps).__index.drawColorString = function(s, font, str, x, y, r, g,
 		end
 	end
 end
+
+getmetatable(tmps).__index.drawColorStringCentered = function(s, font, str, dx, dy, dw, dh, r, g, b)
+	local w, h = font:size(str)
+	local x, y = dx + (dw - w) / 2, dy + (dh - h) / 2
+	s:drawColorString(font, str, x, y, r, g, b)
+end
+
 end
diff --git a/game/modules/tome/dialogs/Quit.lua b/game/modules/tome/dialogs/Quit.lua
index 1863c764ac..a45540fa80 100644
--- a/game/modules/tome/dialogs/Quit.lua
+++ b/game/modules/tome/dialogs/Quit.lua
@@ -4,9 +4,17 @@ require "engine.Dialog"
 module(..., package.seeall, class.inherit(engine.Dialog))
 
 function _M:init()
-	engine.Dialog.init(self, "Realy exit ToME?", 200, 150)
+	engine.Dialog.init(self, "Realy exit ToME?", 300, 100)
+	self:keyCommands{
+		_y = function()
+			os.exit()
+		end,
+		__DEFAULT = function()
+			game:unregisterDialog(self)
+		end,
+	}
 end
 
-function _M:drawDialog(s)
-	s:drawString(self.font, "Press Y to quit, any other keys to stay", 2, 2, 255,255,255)
+function _M:drawDialog(s, w, h)
+	s:drawColorStringCentered(self.font, "Press Y to quit, any other keys to stay", 2, 2, self.iw - 2, self.ih - 2)
 end
-- 
GitLab