Add a "do not show again" option to prerelease-warning

develop
lethosor 2016-04-08 17:40:29 -04:00
parent 49863a9f32
commit 6a2ace49e5
1 changed files with 99 additions and 17 deletions

@ -5,27 +5,81 @@ gui/prerelease-warning
====================== ======================
Shows a warning on world load for pre-release builds. Shows a warning on world load for pre-release builds.
With no arguments passed, the warning is shown unless the "do not show again"
option has been selected. With the ``force`` argument, the warning is always
shown.
=end]] =end]]
shown = shown or false local gui = require 'gui'
if shown then return end local dlg = require 'gui.dialogs'
if not dfhack.isPrerelease() then qerror('not a prerelease build') end local json = require 'json'
local utils = require 'utils'
local force = ({...})[1] == 'force'
local config = json.open('dfhack-config/prerelease-warning.json')
if config.data.hide and not force then
return
end
if not dfhack.isPrerelease() and not force then
qerror('not a prerelease build')
end
-- Don't fire during worldgen -- Don't fire during worldgen
if dfhack.internal.getAddress('gametype') and df.global.gametype == df.game_type.NONE then if dfhack.internal.getAddress('gametype') and df.global.gametype == df.game_type.NONE and not force then
return return
end end
local gui = require 'gui' local state = dfhack.getDFHackRelease():lower():match('[a-z]+')
local dlg = require 'gui.dialogs' if not utils.invert{'alpha', 'beta', 'rc', 'r'}[state] then
local utils = require 'utils' dfhack.printerr('warning: unknown release state: ' .. state)
state = 'unknown'
end
message = ({
alpha = {
'Warning',
COLOR_YELLOW,
'This is an alpha build of DFHack. Some structures are likely', NEWLINE,
'to be incorrect, resulting in crashes or save corruption', NEWLINE,
{pen=COLOR_LIGHTRED, text='Make backups of your saves often!'}
},
beta = {
'Warning',
COLOR_YELLOW,
'This is a beta release of DFHack. It is more stable than an', NEWLINE,
'alpha release, but bugs are still possible, possibly including', NEWLINE,
'crashes and save corruption.', NEWLINE,
'Make backups of your saves beforehand to be safe.'
},
rc = {
'Notice',
COLOR_YELLOW,
'This is a DFHack release candidate. It is fairly stable but', NEWLINE,
'likely contains newer features that are not fully-tested.', NEWLINE,
'Crashes are unlikely, but always make backups of your saves', NEWLINE,
'to be safe.'
},
r = {
'Error',
COLOR_LIGHTRED,
'This release is flagged as a prerelease but named as a', NEWLINE,
'stable release.', NEWLINE,
{pen=COLOR_LIGHTMAGENTA, text='Please report this to the DFHack team or a pack maintainer.'}
},
unknown = {
'Error',
COLOR_LIGHTMAGENTA,
'Unknown prerelease DFHack build. This should never happen!', NEWLINE,
'Please report this to the DFHack team or a pack maintainer.'
}
})[state]
message = { title = table.remove(message, 1)
'This is a prerelease build of DFHack. Some structures are likely', NEWLINE, color = table.remove(message, 1)
'to be incorrect, resulting in crashes or save corruption', NEWLINE,
{pen=COLOR_LIGHTRED, text='Make backups of your saves often!'},
}
pack_message = pack_message or [[ pack_message = [[
This should not be enabled by default in a pack. This should not be enabled by default in a pack.
If you are seeing this message and did not enable/install DFHack If you are seeing this message and did not enable/install DFHack
@ -37,7 +91,6 @@ if #pack_message > 0 and (path:find('lnp') or path:find('starter') or path:find(
table.insert(message, NEWLINE) table.insert(message, NEWLINE)
table.insert(message, {text=v, pen=COLOR_LIGHTMAGENTA}) table.insert(message, {text=v, pen=COLOR_LIGHTMAGENTA})
end end
pack_message = ''
end end
dfhack.print('\n') dfhack.print('\n')
@ -47,7 +100,7 @@ for k,v in ipairs(message) do
dfhack.color(v.pen) dfhack.color(v.pen)
dfhack.print(v.text) dfhack.print(v.text)
else else
dfhack.color(COLOR_YELLOW) dfhack.color(color)
dfhack.print(v) dfhack.print(v)
end end
end end
@ -55,5 +108,34 @@ end
dfhack.color(COLOR_RESET) dfhack.color(COLOR_RESET)
dfhack.print('\n\n') dfhack.print('\n\n')
dlg.showMessage('Warning', message, COLOR_YELLOW) WarningBox = defclass(nil, dlg.MessageBox)
shown = true
function WarningBox:getWantedFrameSize()
local w, h = WarningBox.super.getWantedFrameSize(self)
return w, h + 2
end
function WarningBox:onRenderFrame(dc,rect)
WarningBox.super.onRenderFrame(self,dc,rect)
dc:pen(COLOR_WHITE):key_pen(COLOR_LIGHTRED)
:seek(rect.x1 + 2, rect.y2 - 2)
:key('CUSTOM_D'):string(': Do not show again')
:advance(10)
:key('LEAVESCREEN'):string('/')
:key('SELECT'):string(': Dismiss')
end
function WarningBox:onInput(keys)
if keys.CUSTOM_D then
config.data.hide = true
config:write()
keys.LEAVESCREEN = true
end
WarningBox.super.onInput(self, keys)
end
WarningBox{
frame_title = title,
text = message,
text_pen = color
}:show()