Refactor and expand Translation and Quest management.

This commit is contained in:
Roman Jaroš 2025-03-01 21:46:55 +01:00
parent 4660216504
commit 5f21775771
20 changed files with 2546 additions and 9969 deletions

View file

@ -9,21 +9,20 @@ function GetFontOptions()
end
function CzechQuestsAddon:InitializeSettings()
CzechQuestsAddon.optionsFrame = {};
CzechQuestsAddon.optionsFrame, layout = Settings.RegisterVerticalLayoutCategory("CzechQuests")
local category, layout = Settings.RegisterVerticalLayoutCategory("CzechQuests")
-- Add options for quests
layout:AddInitializer(CreateSettingsListSectionHeaderInitializer("Questy"))
CzechQuestsAddon:AddQuestOptions(CzechQuestsAddon.optionsFrame)
CzechQuestsAddon:AddQuestOptions(category, layout)
-- Add options for speech
layout:AddInitializer(CreateSettingsListSectionHeaderInitializer("Projevy"))
CzechQuestsAddon:AddSpeechOptions(CzechQuestsAddon.optionsFrame)
layout:AddInitializer(CreateSettingsListSectionHeaderInitializer("Projevy (zatím ve vývoji)"))
CzechQuestsAddon:AddSpeechOptions(category, layout)
-- Add options for speech
layout:AddInitializer(CreateSettingsListSectionHeaderInitializer("Ostatní"))
CzechQuestsAddon:AddOthersOptions(CzechQuestsAddon.optionsFrame)
CzechQuestsAddon:AddOthersOptions(category, layout)
-- Store it into Addon options
Settings.RegisterAddOnCategory(CzechQuestsAddon.optionsFrame)
Settings.RegisterAddOnCategory(category)
end

View file

@ -1,9 +1,21 @@
function CzechQuestsAddon:AddQuestOptions(optionsFrame)
function CzechQuestsAddon:AddQuestOptions(category)
-- Enable translations
local enableCheckbox = Settings.RegisterAddOnSetting(
category,
"CzechQuestsAddon__TRANSLATION_QUEST_FRAME_ENABLED",
"TRANSLATION_QUEST_FRAME_ENABLED",
CzechQuestsAddon_Store.config,
type(CzechQuestsAddon_Store.config.TRANSLATION_QUEST_FRAME_ENABLED),
"Zapnout *",
CzechQuestsAddon_Store.config.TRANSLATION_QUEST_FRAME_ENABLED
)
Settings.CreateCheckbox(category, enableCheckbox)
if (WOW_PROJECT_ID == WOW_PROJECT_CLASSIC) then
-- Add DARK mode checkbox
local darkModeCheckbox = Settings.RegisterAddOnSetting(
optionsFrame,
category,
"CzechQuestsAddon__TRANSLATION_QUEST_FRAME_DARK_MODE",
"TRANSLATION_QUEST_FRAME_DARK_MODE",
CzechQuestsAddon_Store.config,
@ -11,7 +23,7 @@ function CzechQuestsAddon:AddQuestOptions(optionsFrame)
"Použít tmavý režim",
CzechQuestsAddon_Store.config.TRANSLATION_QUEST_FRAME_DARK_MODE
)
Settings.CreateCheckbox(optionsFrame, darkModeCheckbox)
Settings.CreateCheckbox(category, darkModeCheckbox)
end
-- define FontOptions
@ -26,7 +38,7 @@ function CzechQuestsAddon:AddQuestOptions(optionsFrame)
-- Add header font dropdown menu
local headerFontFamilyDropdown = Settings.RegisterProxySetting(
optionsFrame,
category,
"CzechQuestsAddon__TRANSLATION_QUEST_FRAME_HEADER_FONT_FAMILY",
type(CzechQuestsAddon_Store.config.TRANSLATION_QUEST_FRAME_HEADER_FONT_FAMILY),
"Písmo nadpisu",
@ -39,11 +51,11 @@ function CzechQuestsAddon:AddQuestOptions(optionsFrame)
CzechQuestsAddon:UpdateTranslationQuestFrameFontSettings()
end
)
Settings.CreateDropdown(optionsFrame, headerFontFamilyDropdown, GetFontOptions)
Settings.CreateDropdown(category, headerFontFamilyDropdown, GetFontOptions)
-- Add text font dropdown menu
local textFontFamilyDropdown = Settings.RegisterProxySetting(
optionsFrame,
category,
"CzechQuestsAddon__TRANSLATION_QUEST_FRAME_TEXT_FONT_FAMILY",
type(CzechQuestsAddon_Store.config.TRANSLATION_QUEST_FRAME_TEXT_FONT_FAMILY),
"Písmo textu",
@ -56,11 +68,11 @@ function CzechQuestsAddon:AddQuestOptions(optionsFrame)
CzechQuestsAddon:UpdateTranslationQuestFrameFontSettings()
end
)
Settings.CreateDropdown(optionsFrame, textFontFamilyDropdown, GetFontOptions)
Settings.CreateDropdown(category, textFontFamilyDropdown, GetFontOptions)
-- Add slider for change primary header font size
local primaryHeaderFontSizeSlider = Settings.RegisterProxySetting(
optionsFrame,
category,
"CzechQuestsAddon__TRANSLATION_QUEST_FRAME_PRIMARY_HEADER_FONT_SIZE",
type(CzechQuestsAddon_Store.config.TRANSLATION_QUEST_FRAME_PRIMARY_HEADER_FONT_SIZE),
"Velikost názvu",
@ -75,11 +87,11 @@ function CzechQuestsAddon:AddQuestOptions(optionsFrame)
)
local primaryHeaderFontSizeSliderOptions = Settings.CreateSliderOptions(10, 30, 1)
primaryHeaderFontSizeSliderOptions:SetLabelFormatter(MinimalSliderWithSteppersMixin.Label.Right);
Settings.CreateSlider(optionsFrame, primaryHeaderFontSizeSlider, primaryHeaderFontSizeSliderOptions)
Settings.CreateSlider(category, primaryHeaderFontSizeSlider, primaryHeaderFontSizeSliderOptions)
-- Add slider for change secondary header font size
local secondaryHeaderFontSizeSlider = Settings.RegisterProxySetting(
optionsFrame,
category,
"CzechQuestsAddon__TRANSLATION_QUEST_FRAME_SECONDARY_HEADER_FONT_SIZE",
type(CzechQuestsAddon_Store.config.TRANSLATION_QUEST_FRAME_SECONDARY_HEADER_FONT_SIZE),
"Velikost nadpisu",
@ -94,12 +106,12 @@ function CzechQuestsAddon:AddQuestOptions(optionsFrame)
)
local secondaryHeaderFontSizeSliderOptions = Settings.CreateSliderOptions(10, 30, 1)
secondaryHeaderFontSizeSliderOptions:SetLabelFormatter(MinimalSliderWithSteppersMixin.Label.Right);
Settings.CreateSlider(optionsFrame, secondaryHeaderFontSizeSlider, secondaryHeaderFontSizeSliderOptions)
Settings.CreateSlider(category, secondaryHeaderFontSizeSlider, secondaryHeaderFontSizeSliderOptions)
-- Add slider for change secondary header font size
local textFontSizeSlider = Settings.RegisterProxySetting(
optionsFrame,
category,
"CzechQuestsAddon__TRANSLATION_QUEST_FRAME_TEXT_FONT_SIZE",
type(CzechQuestsAddon_Store.config.TRANSLATION_QUEST_FRAME_TEXT_FONT_SIZE),
"Velikost textu",
@ -114,11 +126,23 @@ function CzechQuestsAddon:AddQuestOptions(optionsFrame)
)
local textFontSizeSliderOptions = Settings.CreateSliderOptions(10, 30, 1)
textFontSizeSliderOptions:SetLabelFormatter(MinimalSliderWithSteppersMixin.Label.Right);
Settings.CreateSlider(optionsFrame, textFontSizeSlider, textFontSizeSliderOptions)
Settings.CreateSlider(category, textFontSizeSlider, textFontSizeSliderOptions)
-- Add DARK mode checkbox
local darkModeCheckbox = Settings.RegisterAddOnSetting(
category,
"CzechQuestsAddon__TRANSLATION_QUEST_FRAME_TEXTURE_ALPHA_ONLY_MOVING",
"TRANSLATION_QUEST_FRAME_TEXTURE_ALPHA_ONLY_MOVING",
CzechQuestsAddon_Store.config,
type(CzechQuestsAddon_Store.config.TRANSLATION_QUEST_FRAME_TEXTURE_ALPHA_ONLY_MOVING),
"Pruhlednost pouze pri chuzi *",
CzechQuestsAddon_Store.config.TRANSLATION_QUEST_FRAME_TEXTURE_ALPHA_ONLY_MOVING
)
Settings.CreateCheckbox(category, darkModeCheckbox)
-- Add slider for change secondary header font size
local textureAlphaSlider = Settings.RegisterProxySetting(
optionsFrame,
category,
"CzechQuestsAddon__TRANSLATION_QUEST_FRAME_TEXTURE_ALPHA",
type(CzechQuestsAddon_Store.config.TRANSLATION_QUEST_FRAME_TEXTURE_ALPHA),
"Pruhlednost pozadí",
@ -132,6 +156,6 @@ function CzechQuestsAddon:AddQuestOptions(optionsFrame)
)
local textureAlphaSliderOptions = Settings.CreateSliderOptions(10, 100, 10)
textureAlphaSliderOptions:SetLabelFormatter(MinimalSliderWithSteppersMixin.Label.Right);
Settings.CreateSlider(optionsFrame, textureAlphaSlider, textureAlphaSliderOptions)
Settings.CreateSlider(category, textureAlphaSlider, textureAlphaSliderOptions)
end

View file

@ -1,94 +1,90 @@
function CzechQuestsAddon:AddSpeechOptions(optionsFrame)
function CzechQuestsAddon:AddSpeechOptions(category, layout)
-- Add header font dropdown menu
local npcFontFamilyDropdown = Settings.RegisterProxySetting(
optionsFrame,
"CzechQuestsAddon__TRANSLATION_SPEECH_FRAME_NPC_FONT_FAMILY",
type(CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_NPC_FONT_FAMILY),
"Písmo jména",
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_NPC_FONT_FAMILY,
function()
return CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_NPC_FONT_FAMILY
end,
function(value)
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_NPC_FONT_FAMILY = value
CzechQuestsAddon:UpdateTranslationSpeechFrameSettings()
end
-- Enable translations
local enableCheckbox = Settings.RegisterAddOnSetting(
category,
"CzechQuestsAddon__TRANSLATION_SPEECH_FRAME_ENABLED",
"TRANSLATION_SPEECH_FRAME_ENABLED",
CzechQuestsAddon_Store.config,
type(CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_ENABLED),
"Zapnout *",
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_ENABLED
)
Settings.CreateDropdown(optionsFrame, npcFontFamilyDropdown, GetFontOptions)
Settings.CreateCheckbox(category, enableCheckbox)
-- Add text font dropdown menu
local textFontFamilyDropdown = Settings.RegisterProxySetting(
optionsFrame,
category,
"CzechQuestsAddon__TRANSLATION_SPEECH_FRAME_TEXT_FONT_FAMILY",
type(CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_TEXT_FONT_FAMILY),
"Písmo textu",
"Písmo textu *",
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_TEXT_FONT_FAMILY,
function()
return CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_TEXT_FONT_FAMILY
end,
function(value)
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_TEXT_FONT_FAMILY = value
CzechQuestsAddon:UpdateTranslationSpeechFrameSettings()
end
)
Settings.CreateDropdown(optionsFrame, textFontFamilyDropdown, GetFontOptions)
-- Add slider for change primary header font size
local npcFontSizeSlider = Settings.RegisterProxySetting(
optionsFrame,
"CzechQuestsAddon__TRANSLATION_SPEECH_FRAME_NPC_FONT_SIZE",
type(CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_NPC_FONT_SIZE),
"Velikost jméma",
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_NPC_FONT_SIZE,
function()
return CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_NPC_FONT_SIZE
end,
function(value)
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_NPC_FONT_SIZE = value
CzechQuestsAddon:UpdateTranslationSpeechFrameSettings()
end
)
local npcFontSizeOption = Settings.CreateSliderOptions(8, 30, 1)
npcFontSizeOption:SetLabelFormatter(MinimalSliderWithSteppersMixin.Label.Right);
Settings.CreateSlider(optionsFrame, npcFontSizeSlider, npcFontSizeOption)
Settings.CreateDropdown(category, textFontFamilyDropdown, GetFontOptions)
-- Add slider for change secondary header font size
local textFontSizeSlider = Settings.RegisterProxySetting(
optionsFrame,
category,
"CzechQuestsAddon__TRANSLATION_SPEECH_FRAME_TEXT_FONT_SIZE",
type(CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_TEXT_FONT_SIZE),
"Velikost textu",
"Velikost textu *",
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_TEXT_FONT_SIZE,
function()
return CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_TEXT_FONT_SIZE
end,
function(value)
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_TEXT_FONT_SIZE = value
CzechQuestsAddon:UpdateTranslationSpeechFrameSettings()
end
)
local textFontSizeSliderOptions = Settings.CreateSliderOptions(8, 30, 1)
textFontSizeSliderOptions:SetLabelFormatter(MinimalSliderWithSteppersMixin.Label.Right);
Settings.CreateSlider(optionsFrame, textFontSizeSlider, textFontSizeSliderOptions)
Settings.CreateSlider(category, textFontSizeSlider, textFontSizeSliderOptions)
-- Add slider for change secondary header font size
-- Add slider for change frame width
local windowWidthSizeSlider = Settings.RegisterProxySetting(
optionsFrame,
category,
"CzechQuestsAddon__TRANSLATION_SPEECH_FRAME_WIDTH",
type(CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_WIDTH),
"Šírka zpráva",
"Šírka zprávy",
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_WIDTH,
function()
return CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_WIDTH
end,
function(value)
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_WIDTH = value
CzechQuestsAddon:UpdateTranslationSpeechFrameSettings()
CzechQuestsAddon.translationSpeechFrame:SetWidth(
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_WIDTH
)
CzechQuestsAddon.translationSpeechFrame.content:SetWidth(
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_WIDTH
)
end
)
local windowWidthSizeSliderOption = Settings.CreateSliderOptions(200, 800, 10)
windowWidthSizeSliderOption:SetLabelFormatter(MinimalSliderWithSteppersMixin.Label.Right);
Settings.CreateSlider(optionsFrame, windowWidthSizeSlider, windowWidthSizeSliderOption)
Settings.CreateSlider(category, windowWidthSizeSlider, windowWidthSizeSliderOption)
local initializer= CreateSettingsButtonInitializer(
'Resetovat pozici okna',
'RESET',
function()
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_POSITION = { x = 0, y = 0}
CzechQuestsAddon.translationSpeechFrame:ClearAllPoints()
CzechQuestsAddon.translationSpeechFrame:SetPoint(
"CENTER", UIParent, "CENTER",
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_POSITION.x,
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_POSITION.y
)
end,
nil,
"Resetovat pozici okna"
)
layout:AddInitializer(initializer)
end

View file

@ -100,6 +100,10 @@ function CzechQuestsAddon:SetTranslationQuestFrameTextureFromSettings(frame)
frame.secondaryText:SetTextColor(255, 255, 255, 1)
end
end
if not CzechQuestsAddon_Store.config.TRANSLATION_QUEST_FRAME_TEXTURE_ALPHA_ONLY_MOVING then
frame.texture:SetAlpha(CzechQuestsAddon_Store.config.TRANSLATION_FRAME_TEXTURE_ALPHA / 100)
end
end
function CzechQuestsAddon:UpdateTranslationQuestFrameFontSettings()
@ -129,10 +133,6 @@ function CzechQuestsAddon:UpdateTranslationQuestFrameFontSettings()
end
function CzechQuestsAddon:ShowTranslationQuestFrame(primaryHeader, primaryText, secondaryHeader, secondaryText, parentFrame, yOffset, xOffset)
-- replace placeholders with current values
primaryText = CzechQuestsAddon:replacePlaceholders(primaryText);
secondaryText = CzechQuestsAddon:replacePlaceholders(secondaryText);
-- when user change own setting, does not require reload, just apply it
CzechQuestsAddon:SetTranslationQuestFrameTextureFromSettings(CzechQuestsAddon.translationQuestFrame)

View file

@ -1,59 +1,96 @@
function CzechQuestsAddon:CreateTranslationSpeechFrame()
local frame = {};
local scroll = {};
-- Speech Translation Frame
frame = CreateFrame("Frame", "CzechQuestsTranslationSpeechFrame", UIParant, "BackdropTemplate")
frame:SetSize(CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_WIDTH, 50)
frame:SetPoint("CENTER", UIParent, "CENTER")
scroll = CreateFrame("ScrollFrame", "CzechQuestsTranslationSpeechFrame", UIParent, "MinimalScrollFrameTemplate")
scroll:SetSize(CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_WIDTH, 120)
-- Make draggable
frame:EnableMouse(true)
frame:SetMovable(true)
frame:RegisterForDrag("LeftButton")
frame:SetScript("OnDragStart", function(self) self:StartMoving() end)
frame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
-- Make movable
scroll:SetMovable(true)
scroll:EnableMouse(true)
scroll:RegisterForDrag("LeftButton")
frame:Hide()
scroll:SetScript("OnDragStart", function()
scroll:StartMoving()
end)
frame.npcName = frame:CreateFontString("CzechQuestsTranslationSpeechNpcName", "OVERLAY")
frame.npcName:SetTextColor(1, 1, 0)
frame.npcName:SetFont(
CzechQuestsAddon.fontPath .. CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_NPC_FONT_FAMILY,
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_NPC_FONT_SIZE,
"OUTLINE"
scroll:SetScript("OnDragStop", function(self)
scroll:StopMovingOrSizing()
local finalLeft, finalTop = self:GetLeft(), self:GetTop()
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_POSITION = {
x = finalLeft,
y = finalTop
}
end)
-- Hide sidebar
scroll.ScrollBar:Hide()
scroll.ScrollBar.Show = function() end
-- Speech Translation Content Frame
scroll.content = CreateFrame("Frame", nil, scroll)
scroll.content:SetSize(scroll:GetWidth(), 1)
scroll:SetScrollChild(scroll.content)
-- Texture for control color and alpha
scroll.content.texture = scroll.content:CreateTexture(nil, "ARTWORK")
scroll.content.texture:SetTexture("Interface\\Buttons\\WHITE8x8")
scroll.content.texture:SetVertexColor(0, 0, 0, 0.2)
-- Set points to edges
scroll.content.texture:SetPoint("TOPLEFT", scroll.content ,"TOPLEFT", 0, 0)
scroll.content.texture:SetPoint("BOTTOMRIGHT", scroll.content ,"BOTTOMRIGHT", 0, 0)
scroll:SetScript("OnEnter", function()
scroll.content.texture:SetAlpha(0.8)
end)
scroll:SetScript("OnLeave", function()
scroll.content.texture:SetAlpha(0.2)
end)
-- Set position
scroll:ClearAllPoints()
scroll:SetPoint(
"TOPLEFT", UIParent, "TOPLEFT",
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_POSITION.x,
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_POSITION.y
)
frame.npcName:SetPoint("LEFT", frame, "LEFT", 0, 5)
frame.text = frame:CreateFontString("CzechQuestsTranslationSpeechText", "OVERLAY")
frame.text:SetTextColor(1, 1, 1)
frame.text:SetWordWrap(true)
frame.text:SetFont(
CzechQuestsAddon.fontPath .. CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_TEXT_FONT_FAMILY,
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_TEXT_FONT_SIZE,
"OUTLINE"
)
frame.text:SetTextColor(1, 1, 1)
frame.text:SetWidth(CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_WIDTH)
frame.text:SetJustifyH("LEFT")
frame.text:SetJustifyV("TOP")
scroll:Hide()
return frame;
scroll.content:SetPoint("BOTTOMLEFT", scroll, "BOTTOMLEFT", 0, 0)
return scroll;
end
function CzechQuestsAddon:UpdateTranslationSpeechFrameSettings()
-- Font
CzechQuestsAddon.translationSpeechFrame.npcName:SetFont(
CzechQuestsAddon.fontPath .. CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_NPC_FONT_FAMILY,
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_NPC_FONT_SIZE,
"OUTLINE"
)
CzechQuestsAddon.translationSpeechFrame.text:SetFont(
function CzechQuestsAddon:CreateTranslationSpeechFrameMessage(message)
local frame = {};
-- Create content for messages
frame = CreateFrame("Frame", nil, CzechQuestsAddon.translationSpeechFrame.content)
frame:SetSize(CzechQuestsAddon.translationSpeechFrame.content:GetWidth() - 20, 1)
-- Message
frame.string = frame:CreateFontString(nil, "OVERLAY")
frame.string:SetWidth(frame:GetWidth())
frame.string:SetTextColor(1, 1, 1)
frame.string:SetWordWrap(true)
frame.string:SetPoint("TOPLEFT", frame, "TOPLEFT", 5, -5)
frame.string:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -5, 5)
frame.string:SetJustifyH("LEFT")
frame.string:SetFont(
CzechQuestsAddon.fontPath .. CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_TEXT_FONT_FAMILY,
CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_TEXT_FONT_SIZE,
"OUTLINE"
)
-- Width
CzechQuestsAddon.translationSpeechFrame.text:SetWidth(CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_WIDTH)
CzechQuestsAddon.translationSpeechFrame:SetWidth(CzechQuestsAddon_Store.config.TRANSLATION_SPEECH_FRAME_WIDTH)
frame.string:SetText(message)
frame:SetHeight(frame.string:GetHeight() + 10)
return frame;
end