Compare with Previous |
Blame |
View Log
ExportWindow = class();
function ExportWindow:Constructor(title, exportData)
local prevContext = L:SetContext("/ExportWindow");
self.uncompressedData = PrettyPrint(exportData, "");
self.compactData = Serialize(exportData);
-- Sanity check:
local f, e = loadstring("return " .. self.compactData);
if (not f) then
Puts(L:GetText("/ImportWindow/ParseError") .. tostring(e));
return self:Close();
end
self.ok = L:GetText("OK");
self.window = Alert(title, "", self.ok);
self.window:SetSize(423, 300);
self.window:SetMinimumSize(423, 300);
CenterWindow(self.window);
self.window:SetZOrder(2147483647);
self.okButton = self.window.buttons[self.ok];
self.okButton:SetEnabled(false);
self.okButton.Click = function()
self.window:Close();
end
-- Workaround for a bug in the Turbine.UI.Label control: It fails to display certain sequences including "<>" even when markup is disabled.
self.window.label.SetText = function(ctl, text)
Turbine.UI.Label.SetText(ctl, "");
local firstPart = "";
repeat
Turbine.UI.Label.AppendText(ctl, firstPart);
text = text:sub(firstPart:len() + 1);
firstPart = text:match("^(.-<)>");
until (not firstPart);
Turbine.UI.Label.AppendText(ctl, text);
end
self.compressed = Turbine.UI.Lotro.CheckBox();
self.compressed:SetParent(self.window);
self.compressed:SetSize(100, 20);
self.compressed:SetFont(Turbine.UI.Lotro.Font.TrajanPro14);
self.compressed:SetText(L:GetText("Compressed"));
self.compressed:SetEnabled(false);
self.compressed.CheckedChanged = function(control)
if (control:IsChecked()) then
self.window.label:SetText(self.compressedData);
else
if (#self.uncompressedData > 65535) then
Puts(L:GetText("/ExportWindow/UncompressedDataTooBig"));
control:SetChecked(true);
else
self.window.label:SetText(self.uncompressedData);
end
end
end
-- Compress the data in the next Update cycle.
self.window:SetWantsUpdates(true);
self.window.updateCount = 0;
self.window.Update = function(w)
w.updateCount = w.updateCount + 1;
if (w.updateCount == 1) then
w.label:SetText(L:GetText("/ExportWindow/Compressing"));
Puts(L:GetText("/ExportWindow/Compressing"));
elseif (w.updateCount == 3) then
w.compressor = Thurallor.Utils.LibCompress();
elseif (w.updateCount == 4) then
-- Apparently the LZW encoding function can produce incorrect results, so we'll only use Huffman.
--self.compressedData = w.compressor:Compress(self.compactData);
self.compressedData = w.compressor:CompressHuffman(self.compactData);
-- Sanity check: Uncompress the compressed data and verify that the result is the same as the original data.
if (w.compressor:Decompress(self.compressedData) ~= self.compactData) then
Puts(L:GetText("/ExportWindow/CompressionFailed"));
w.updateCount = -1; -- error; close window at next frame
end
elseif (w.updateCount == 5) then
w.label:SetText(w.label:GetText() .. "\n" .. L:GetText("/ExportWindow/Encoding"));
Puts(L:GetText("/ExportWindow/Encoding"));
elseif (w.updateCount == 7) then
self.compressedData = Bin2Text(self.compressedData);
--local ratio = (1 - #self.compressedData / #self.uncompressedData) * 100;
--Puts("Compressed " .. tostring(#self.uncompressedData) .. " bytes by " .. string.format("%.0f%%", ratio) .. " to " .. tostring(#self.compressedData) .. " bytes.");
if (#self.compressedData > 65535) then
Puts(L:GetText("/ExportWindow/ExportFailedTooBig"));
w.updateCount = -1; -- error; close window at next frame
return;
end
-- Sanity check: Decode and decompress the data and verify that the result is the same as the original data.
if (w.compressor:Decompress(Text2Bin(self.compressedData)) ~= self.compactData) then
Puts(L:GetText("/ExportWindow/EncodingFailed"));
w.updateCount = -1; -- error; close window at next frame
end
elseif (w.updateCount == 8) then
self.compressed:SetChecked(true); -- trigger CheckedChanged callback
elseif (w.updateCount == 9) then
w.compressor = nil;
self.compressed:SetEnabled(true);
self.okButton:SetEnabled(true);
self.window:Activate();
self.window.label:SelectAll();
self.window.label:Focus();
w:SetWantsUpdates(false);
elseif (w.updateCount == 0) then -- error
w:SetWantsUpdates(false);
w:Close();
end
end
AddCallback(self.window, "Closing", function()
if (self.Closing) then
self:Closing();
end
end);
AddCallback(self.window, "SizeChanged", function()
self:SizeChanged();
end);
self:SizeChanged();
L:SetContext(prevContext);
end
function ExportWindow:SizeChanged()
local left, top = self.window.buttons[self.ok]:GetPosition();
self.compressed:SetPosition(left - 120, top);
end
function ExportWindow:Close()
self.window:Close();
end
Compare with Previous |
Blame
All times are GMT -5. The time now is 04:55 PM.