diff --git a/game/engines/default/engine/UserChat.lua b/game/engines/default/engine/UserChat.lua index 00c7fefe10ebaacf0441e4c7c0f8f61e70433966..f16d257729b97a6ad2b75e49d6ca35d6c7d44eac 100644 --- a/game/engines/default/engine/UserChat.lua +++ b/game/engines/default/engine/UserChat.lua @@ -83,7 +83,7 @@ function _M:event(e) e.msg = e.msg:removeColorCodes() self.channels[self.cur_channel] = self.channels[self.cur_channel] or {users={}, log={}} - self:addMessage(self.cur_channel, e.login, e.name, "#GOLD#<whisper>#LAST#"..e.msg) + self:addMessage(self.cur_channel, e.login, e.name, "#GOLD#<whisper> #LAST#"..e.msg) if type(game) == "table" and game.logChat then game.logChat("#GOLD#<Whisper from %s> %s", e.name, e.msg) @@ -151,7 +151,7 @@ function _M:join(channel) self:updateChanList(true) end -function _M:selectChannel(channel) +function _M:selectChannel(channel, no_recurs) if not self.channels[channel] then return end self.channels[channel].changed = false self.cur_channel = channel @@ -159,6 +159,7 @@ function _M:selectChannel(channel) self.changed = true self.scroll = 0 self:updateChanList(true) + if not no_recurs then self:setCurrentTarget(true, channel, true) end end function _M:talk(msg) @@ -173,6 +174,9 @@ function _M:whisper(to, msg) if not to or not msg or msg == "" then return end msg = msg:removeColorCodes() core.profile.pushOrder(string.format("o='ChatWhisper' target=%q msg=%q", to, msg)) + + self:addMessage(self.cur_channel, to, to, "#GOLD#<whisper to "..to.."> #LAST#"..msg) + if type(game) == "table" and game.logChat then game.logChat("#GOLD#<Whisper to %s> %s", to, msg) end end function _M:achievement(name) @@ -191,10 +195,10 @@ function _M:talkBox() end --- Sets the current talk target, channel or whisper -function _M:setCurrentTarget(channel, name) +function _M:setCurrentTarget(channel, name, no_switch) if channel and not self.channels[name] then return end self.cur_target = {channel and "channel" or "whisper", name} - if channel then self:selectChannel(name) end + if channel and not no_switch then self:selectChannel(name) end end --- Gets the current talk target, channel or whisper diff --git a/game/engines/default/engine/dialogs/Talkbox.lua b/game/engines/default/engine/dialogs/Talkbox.lua index f102dbe8e20ea9ff19c025934e8ac41ff24d7837..804bfa58a77ab1a18f8c8f810bf75cbfeacfdbe9 100644 --- a/game/engines/default/engine/dialogs/Talkbox.lua +++ b/game/engines/default/engine/dialogs/Talkbox.lua @@ -22,6 +22,8 @@ local Module = require "engine.Module" local Dialog = require "engine.ui.Dialog" local Button = require "engine.ui.Button" local Textbox = require "engine.ui.Textbox" +local Dropdown = require "engine.ui.Dropdown" +local Textzone = require "engine.ui.Textzone" module(..., package.seeall, class.inherit(Dialog)) @@ -33,22 +35,32 @@ function _M:init(chat) Dialog.init(self, self:getTitle(), 320, 110) - local c_box = Textbox.new{title="Say: ", text="", chars=30, max_len=max, + local c_box = Textbox.new{title="Say: ", text="", chars=60, max_len=max, fct=function(text) self:okclick() end, on_change = function(text) self:checkTarget(text) end, } self.c_box = c_box - local ok = require("engine.ui.Button").new{text="Accept", fct=function() self:okclick() end} - local cancel = require("engine.ui.Button").new{text="Cancel", fct=function() self:cancelclick() end} + local ok = Button.new{text="Accept", fct=function() self:okclick() end} + local cancel = Button.new{text="Cancel", fct=function() self:cancelclick() end} + + local list = self:getTargets() + self.c_list_text = Textzone.new{auto_width=true, auto_height=true, text="Target: "} + self.c_list = Dropdown.new{width=250, fct=function(item) self:checkTarget(item.id..":") self:setFocus(c_box) end, list=list, nb_items=math.min(#list, 10), scrollbar=true} self:loadUI{ - {left=0, top=0, padding_h=10, ui=c_box}, + {left=0, top=0, ui=self.c_box}, + + {left=self.c_box.w - self.c_list.w - self.c_list_text.w - 6, top=self.c_box.h + 10, ui=self.c_list_text}, + {left=self.c_box.w - self.c_list.w, top=self.c_box.h + 10, ui=self.c_list}, + {left=0, bottom=0, ui=ok}, - {right=0, bottom=0, ui=cancel}, + {left=self.c_box.w - ok.w, bottom=0, ui=cancel}, } self:setFocus(c_box) self:setupUI(true, true) + self:getTitle() + self.key:addBinds{ EXIT = function() game:unregisterDialog(self) end, } @@ -58,8 +70,20 @@ function _M:init(chat) -- end) end +function _M:getTargets() + local list = {} + for name, _ in pairs(self.chat.channels) do list[#list+1] = {name="Channel: "..name, id=name} end + if self.chat.channels[self.chat.cur_channel] then + for login, data in pairs(self.chat.channels[self.chat.cur_channel].users) do list[#list+1] = {name="User: "..data.name, id=data.name} end + end + return list +end + function _M:getTitle() local type, name = self.chat:getCurrentTarget() + if self.c_list then for i = 1, #self.c_list.c_list.list do + if self.c_list.c_list.list[i].id == name then self.c_list.c_list.sel = i break end + end end if type == "channel" then return "Talk on channel: "..name elseif type == "whisper" then