Profile
- Name
- Scoremod Pre-Alpha
- ID
- 108613
- Shared with
- Public
- Parent
- None
- Children
- Created on
- March 23, 2024 at 22:27 PM UTC
- Updated on
- March 23, 2024 at 22:28 PM UTC
- Description
Easily change/reset score importances and enable/disable filters
Best for
Code
--[[
Scoremod Pre-Alpha release
TODO: Add the ability to save/load at least two different sets of parameter values
RESET... button should give the option to reset sliders to current values vs default values (currently just reverts all to default)
Type & signature annotations
Version-aware reuse of code between recipes
--]]
if not _scoremod_data then
_scoremod_data = {
origParams = {},
paramNames = { "Clash", "BackboneHBond", "SidechainHBond", "Packing", "Hiding", "Pairwise", "Density",
"!FiltersDisabled", "!WigglePower" },
---@param str string # parameter name (with optional "!" prefix to disable "Importance" suffixing)
---@param prefix string
---|"'Get'" # Get function (takes no arguments)
---|"'Set'" # Set function (takes a single argument)
---@return string paramFcn
paramFcn = function(str, prefix)
return prefix ..
(string.byte(str) == 33 and string.sub(str, 2) or (str .. "Importance"))
end,
wiggleLetterToNum = function(str) return str == "l" and 1 or str == "m" and 2 or str == "h" and 3 or 0 end,
wiggleNumToLetter = function(num) return select(num + 1, "a", "l", "m", "h") end
}
for _, str in ipairs(_scoremod_data.paramNames) do
_scoremod_data.origParams[str] = behavior[_scoremod_data.paramFcn(str, "Get")]()
end
_scoremod_data.CreateDialog = function(paramNames, params, show)
paramNames = paramNames and paramNames or _scoremod_data.paramNames
params = params and params or {}
local dia = dialog.CreateDialog("Scoremod")
dia.ImportanceLabel = dialog.AddLabel("Importance Parameters")
for _, str in ipairs(paramNames) do
--[[if str == "!SetFiltersDisabledbled" then
dia[str] = dialog.AddCheckbox("Disable filters", params[str] and params[str] or behavior.GetFiltersDisabled())
elseif str == "!WigglePower" then
dia[str] = dialog.AddSlider("Wiggle power (0=auto)", 0, behavior.HighPowerAllowed() and 3 or 2, 0,
_scoremod_data.wiggleLetterToNum(params[str] and params[str] or behavior.GetWigglePower()))
else
--]]
if string.byte(str) ~= 33 then
dia[str] = dialog.AddSlider(str,
params[str] and params[str] or behavior[_scoremod_data.paramFcn(str, "Get")](), 0,
str == "Clash" and 1 or 3, 2)
end
end
dia.OtherLabel = dialog.AddLabel("Other parameters")
dia["!FiltersDisabled"] = dialog.AddCheckbox("Disable filters",
params["!FiltersDisabled"] and params["!FiltersDisabled"] or behavior.GetFiltersDisabled())
dia["!WigglePower"] = dialog.AddSlider("Wig pwr (0=auto)",
_scoremod_data.wiggleLetterToNum(params["!WigglePower"] and params["!WigglePower"] or behavior.GetWigglePower()),
0, behavior.HighPowerAllowed() and 3 or 2, 0)
dia.Apply = dialog.AddButton("Apply", 3)
dia.Set = dialog.AddButton("Set", 2)
dia.Reset = dialog.AddButton("Reset...", 1)
dia.Cancel = dialog.AddButton("Cancel", 0)
if show then
return dialog.Show(dia)
else
return dia
end
end
---@param resp integer
_scoremod_data.HandleDialogResponse = function(resp, params, dia)
if resp == 1 then -- Reset; TODO
for _, str in ipairs(_scoremod_data.paramNames) do
if string.byte(str) ~= 33 then
-- behavior[_scoremod_data.paramFcn(str, "Set")](1.00)
params[str] = 1.00
elseif str == "!WigglePower" then
-- behavior.SetWigglePower("a")
params[str] = "a"
else
-- behavior.SetFiltersDisabled(false) -- TODO
params[str] = false
end
-- if scoremod_data.origParams[str] then
-- behavior[_scoremod_data.paramFcn(str, "Set")](_scoremod_data.origParams[str])
-- end
end
return true, params
elseif resp == 2 or resp == 3 then -- Set/Apply
if not dia then
for str, val in pairs(params) do
if string.byte(str) ~= 95 then
-- print(_scoremod_data.paramFcn(str, "Set"))
behavior[_scoremod_data.paramFcn(str, "Set")](val)
end
end
else
for _, str in ipairs(_scoremod_data.paramNames) do
if dia[str] then
local val = str == "!WigglePower" and _scoremod_data.wiggleNumToLetter(dia[str].value) or dia[str].value
behavior[_scoremod_data.paramFcn(str, "Set")](val)
end
end
end
return resp==3, params
else -- Cancel
return nil, params
end
end
_scoremod_data.GatherDialogValues = function(dia)
local ret = {}
for _, str in ipairs(_scoremod_data.paramNames) do
if dia[str] then
ret[str] = str == "!WigglePower" and _scoremod_data.wiggleNumToLetter(dia[str].value) or dia[str].value
end -- TODO: else?
end
return ret
end
end
-- TODO: Presets?
do
local params, dontExit
repeat
local dia = _scoremod_data.CreateDialog(nil, params)
local resp = dialog.Show(dia)
params = _scoremod_data.GatherDialogValues(dia)
for k,v in pairs(params) do print(k,v) end
dontExit, params = _scoremod_data.HandleDialogResponse(resp, params)
until not dontExit
end