Skip to content

Commit 6b123af

Browse files
chore: autopublish 2024-08-12T12:50:14Z
1 parent ea60f70 commit 6b123af

File tree

2 files changed

+69
-92
lines changed

2 files changed

+69
-92
lines changed

dist/slur_changer.lua

Lines changed: 68 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -5300,8 +5300,8 @@ function plugindef()
53005300
finaleplugin.Author = "Carl Vine"
53015301
finaleplugin.AuthorURL = "https://carlvine.com/lua"
53025302
finaleplugin.Copyright = "https://creativecommons.org/licenses/by/4.0/"
5303-
finaleplugin.Version = "0.05"
5304-
finaleplugin.Date = "2024/07/09"
5303+
finaleplugin.Version = "0.09"
5304+
finaleplugin.Date = "2024/07/26"
53055305
finaleplugin.MinJWLuaVersion = 0.70
53065306
finaleplugin.Notes = [[
53075307
Change the characteristics of every slur in the current selection.
@@ -5324,7 +5324,8 @@ function plugindef()
53245324
}
53255325
]]
53265326
finaleplugin.HashURL = "https://raw.githubusercontent.com/finale-lua/lua-scripts/master/hash/slur_changer.hash"
5327-
return "Slur Changer...", "Slur Changer",
5327+
return "Slur Changer...",
5328+
"Slur Changer",
53285329
"Change the characteristics of slurs in the current selection"
53295330
end
53305331
local configuration = require("library.configuration")
@@ -5334,8 +5335,6 @@ local layer_lib = require("library.layer")
53345335
local library = require("library.general_library")
53355336
local script_name = library.calc_script_name()
53365337
local name = plugindef():gsub("%.%.%.", "")
5337-
local selection
5338-
local saved_bounds = {}
53395338
local config = {
53405339
dummy = "dummy",
53415340
last_selected = 0,
@@ -5349,24 +5348,25 @@ local config = {
53495348
local dialog_options = {
53505349
{ "visible_yes", "V", "Visible" },
53515350
{ "visible_no", "I", "Invisible" },
5352-
{ "flip", "X", "Flip" },
5353-
{ "SMARTSHAPE_SLURUP", "O", "Slur: Over" },
5354-
{ "SMARTSHAPE_SLURDOWN", "U", "Slur: Under" },
5355-
{ "SMARTSHAPE_SLURAUTO", "A", "Slur: Auto" },
5356-
{ "SMARTSHAPE_DASHEDSLURUP", "D", "Dashed: Over" },
5357-
{ "SMARTSHAPE_DASHEDSLURDOWN", "F", "Dashed: Under" },
5358-
{ "SMARTSHAPE_DASHEDSLURAUTO", "G", "Dashed: Auto" },
5359-
{ "ENG_SS_OFFSTATE", "B", "Engraver: ON" },
5360-
{ "ENG_SS_ONSTATE", "N", "Engraver: OFF" },
5361-
{ "ENG_SS_AUTOSTATE", "M", "Engraver: AUTO" },
5362-
{ "ACC_SS_OFFSTATE", "J", "Accidental Avoid: ON" },
5363-
{ "ACC_SS_ONSTATE", "K", "Accidental Avoid: OFF" },
5364-
{ "ACC_SS_AUTOSTATE", "L", "Accidental Avoid: AUTO" },
5351+
{ "flip", "X", "Flip Direction" },
5352+
{ "SMARTSHAPE_SLURAUTO", "A", "Slur Direction Auto" },
5353+
{ "SMARTSHAPE_SLURUP", "O", "Slur Direction Over" },
5354+
{ "SMARTSHAPE_SLURDOWN", "U", "Slur Direction Under" },
5355+
{ "SMARTSHAPE_DASHEDSLURAUTO", "D", "Dashed Auto" },
5356+
{ "SMARTSHAPE_DASHEDSLURUP", "F", "Dashed Over" },
5357+
{ "SMARTSHAPE_DASHEDSLURDOWN", "G", "Dashed Under" },
5358+
{ "ENGRAV_AUTO", "B", "Engraver Slur Auto" },
5359+
{ "ENGRAV_ON", "N", "Engraver Slur On" },
5360+
{ "ENGRAV_OFF" , "M", "Engraver Slur Off" },
5361+
{ "AVACCI_AUTO", "J", "Avoid Accidentals Auto" },
5362+
{ "AVACCI_ON", "K", "Avoid Accidentals On" },
5363+
{ "AVACCI_OFF", "L", "Avoid Accidentals Off" },
53655364
{ "remove", "R", "Remove Manual Adj." },
53665365
{ "erase", "E", "Erase All" },
53675366
{ "default", "Z", "Default Values" }
53685367
}
53695368
for _, v in ipairs(dialog_options) do config[v[1]] = v[2] end
5369+
local ss_3state = { ON = 0, OFF = 1, AUTO = 2 }
53705370
local function dialog_set_position(dialog)
53715371
if config.window_pos_x and config.window_pos_y then
53725372
dialog:StorePosition()
@@ -5389,27 +5389,19 @@ local function get_staff_name(staff_num)
53895389
end
53905390
return str
53915391
end
5392-
local function track_selection()
5393-
local bounds = {
5394-
"StartStaff", "StartMeasure", "StartMeasurePos",
5395-
"EndStaff", "EndMeasure", "EndMeasurePos",
5396-
}
5397-
5392+
local function update_selection()
53985393
local rgn = finenv.Region()
5399-
if rgn:IsEmpty() then
5400-
selection = "no staff, no selection"
5394+
if rgn:IsEmpty() then return nil
54015395
else
5402-
for _, property in ipairs(bounds) do
5403-
saved_bounds[property] = rgn[property]
5404-
end
5405-
selection = get_staff_name(rgn.StartStaff)
5396+
local s = get_staff_name(rgn.StartStaff)
54065397
if rgn.EndStaff ~= rgn.StartStaff then
5407-
selection = selection .. "-" .. get_staff_name(rgn.EndStaff)
5398+
s = s .. "-" .. get_staff_name(rgn.EndStaff)
54085399
end
5409-
selection = selection .. " m." .. rgn.StartMeasure
5400+
s = s .. " m." .. rgn.StartMeasure
54105401
if rgn.StartMeasure ~= rgn.EndMeasure then
5411-
selection = selection .. "-" .. rgn.EndMeasure
5402+
s = s .. "-" .. rgn.EndMeasure
54125403
end
5404+
return s
54135405
end
54145406
end
54155407
local function reassign_keystrokes(parent, index)
@@ -5477,11 +5469,15 @@ local function slur_match_layer(slur)
54775469
local entry = cell:FindEntryNumber(left_seg.EntryNumber)
54785470
return (entry.LayerNumber == config.layer)
54795471
end
5472+
local function slur_defaults(slur)
5473+
slur.EngraverSlur = ss_3state.AUTO
5474+
slur.PresetShape = true
5475+
slur.ShapeType = finale.SMARTSHAPE_SLURAUTO
5476+
slur.Visible = true
5477+
slur:GetCtrlPointAdjust():SetDefaultSlurShape()
5478+
end
54805479
local function slur_manual_clear(slur)
5481-
slur.PresetShape = true
5482-
slur:IsAutoSlur(true)
5483-
slur:SetSlurFlags(true)
5484-
slur:SetEngraverSlur(finale.SS_AUTOSTATE)
5480+
slur_defaults(slur)
54855481
local ctrl_points = {
54865482
"ControlPoint1OffsetX", "ControlPoint1OffsetY",
54875483
"ControlPoint2OffsetX", "ControlPoint2OffsetY"
@@ -5501,45 +5497,36 @@ local function slur_manual_clear(slur)
55015497
end
55025498
end
55035499
end
5504-
local function change_the_slurs(dialog)
5505-
if finenv.Region():IsEmpty() then
5506-
local ui = dialog and dialog:CreateChildUI() or finenv.UI()
5507-
ui:AlertError("Please select some music\nbefore running this script", name)
5508-
return
5509-
end
5500+
local function change_the_slurs()
55105501
local selected = dialog_options[config.last_selected + 1]
55115502
local state = selected[1]
5512-
local checked = {}
5513-
local undo = string.format("Slur %s %s", selected[3]:gsub(" ", ""), selection)
5503+
local s = update_selection()
5504+
if not s then return end
5505+
local undo = string.format("Slur %s %s", selected[3]:gsub(" ", ""), s)
55145506
if config.layer > 0 then undo = undo .. " L" .. config.layer end
55155507
finenv.StartNewUndoBlock(undo)
55165508

5517-
local ss_state = state:sub(5)
5518-
for mark in loadallforregion(finale.FCSmartShapeMeasureMarks(), finenv.Region()) do
5509+
local ss_state = state:sub(8)
5510+
local marks = finale.FCSmartShapeMeasureMarks()
5511+
marks:LoadAllForRegion(finenv.Region(), true)
5512+
for mark in each(marks) do
55195513
local slur = mark:CreateSmartShape()
5520-
if not checked[slur.ItemNo] then
5521-
checked[slur.ItemNo] = true
5522-
if slur and slur:IsSlur() and
5523-
(not slur:IsEntryBased() or slur_match_layer(slur))
5524-
then
5525-
if state == "default" then
5526-
slur.EngraverSlur = finale.SS_AUTOSTATE
5527-
slur.ShapeType = finale.SMARTSHAPE_SLURAUTO
5528-
slur.Visible = true
5529-
slur:GetCtrlPointAdjust():SetDefaultSlurShape()
5530-
elseif state:find("visible") then slur.Visible = state:find("yes")
5531-
elseif state == "erase" then slur:DeleteData()
5532-
elseif state == "remove" then slur_manual_clear(slur)
5533-
elseif state == "flip" then
5534-
local a = slur:IsDashedSlur() and "DASHEDSLUR" or "SLUR"
5535-
local b = (slur:IsOverSlur() or slur:IsAutoSlur()) and "DOWN" or "UP"
5536-
slur.ShapeType = finale["SMARTSHAPE_" .. a .. b]
5537-
elseif state:find("ENG_") then slur.EngraverSlur = finale[ss_state]
5538-
elseif state:find("ACC_") then slur.AvoidAccidentals = finale[ss_state]
5539-
else slur.ShapeType = finale[state]
5540-
end
5541-
slur:Save()
5542-
end
5514+
if slur and slur:IsSlur() and
5515+
(not slur:IsEntryBased() or slur_match_layer(slur))
5516+
then
5517+
if state == "default" then slur_defaults(slur)
5518+
elseif state:find("visible") then slur.Visible = state:find("yes")
5519+
elseif state == "erase" then slur:DeleteData()
5520+
elseif state == "remove" then slur_manual_clear(slur)
5521+
elseif state == "flip" then
5522+
local a = slur:IsDashedSlur() and "DASHEDSLUR" or "SLUR"
5523+
local b = (slur:IsOverSlur() or slur:IsAutoSlur()) and "DOWN" or "UP"
5524+
slur.ShapeType = finale["SMARTSHAPE_" .. a .. b]
5525+
elseif state:find("ENGRAV") then slur.EngraverSlur = ss_3state[ss_state]
5526+
elseif state:find("AVACCI") then slur.AvoidAccidentals = ss_3state[ss_state]
5527+
else slur.ShapeType = finale[state]
5528+
end
5529+
slur:Save()
55435530
end
55445531
end
55455532
finenv.EndUndoBlock(true)
@@ -5556,7 +5543,7 @@ local function run_the_dialog()
55565543
local key_list = dialog:CreateListBox(0, 22):SetWidth(box_wide):SetHeight(box_high)
55575544

55585545
local function show_info()
5559-
utils.show_notes_dialog(dialog, "About " .. name, 400, 140)
5546+
utils.show_notes_dialog(dialog, "About " .. name, 400, 125)
55605547
end
55615548
local function fill_key_list()
55625549
local join = finenv.UI():IsOnMac() and "\t" or ": "
@@ -5576,14 +5563,6 @@ local function run_the_dialog()
55765563
end
55775564
key_list:SetKeyboardFocus()
55785565
end
5579-
local function on_timer()
5580-
for k, v in pairs(saved_bounds) do
5581-
if finenv.Region()[k] ~= v then
5582-
track_selection()
5583-
break
5584-
end
5585-
end
5586-
end
55875566
fill_key_list()
55885567
dialog:CreateButton(box_wide - 20, 0, "q"):SetText("?"):SetWidth(20)
55895568
:AddHandleCommand(function() show_info() end)
@@ -5600,42 +5579,40 @@ local function run_the_dialog()
56005579
:AddHandleCommand(function(self)
56015580
local s = self:GetText():lower()
56025581
if s:find("[^0-" .. max .. "]") then
5603-
if s:find("[?q]") then show_info()
5582+
if s:find("[?q]") then show_info()
56045583
elseif s:find("r") then change_keys()
56055584
end
56065585
else
5607-
save_layer = (s == "") and 0 or tonumber(s)
5586+
save_layer = (s ~= "") and tonumber(s) or 0
56085587
end
56095588
self:SetInteger(save_layer):SetKeyboardFocus()
56105589
end)
56115590
dialog:CreateStatic(x_off + 83, y):SetWidth(50):SetText("(0 = all)")
56125591
dialog:CreateOkButton():SetText("Apply")
56135592
dialog:CreateCancelButton():SetText("Close")
56145593
dialog_set_position(dialog)
5615-
dialog:RegisterHandleTimer(on_timer)
5616-
dialog:RegisterInitWindow(function(self)
5617-
self:SetTimer(config.timer_id, 125)
5594+
dialog:RegisterInitWindow(function()
56185595
key_list:SetKeyboardFocus()
56195596
local q = dialog:GetControl("q")
56205597
q:SetFont(q:CreateFontInfo():SetBold(true))
56215598
end)
56225599
dialog:RegisterHandleOkButtonPressed(function()
56235600
config.last_selected = key_list:GetSelectedItem()
56245601
config.layer = layer:GetInteger()
5625-
change_the_slurs(dialog)
5626-
end)
5627-
dialog:RegisterCloseWindow(function(self)
5628-
self:StopTimer(config.timer_id)
5629-
dialog_save_position(self)
5602+
change_the_slurs()
56305603
end)
5604+
dialog:RegisterCloseWindow(function(self) dialog_save_position(self) end)
56315605
dialog:RunModeless()
56325606
end
56335607
local function change_slurs()
5608+
if finenv.Region():IsEmpty() then
5609+
finenv.UI():AlertError("Please select some music\nbefore running this script", name)
5610+
return
5611+
end
56345612
configuration.get_user_settings(script_name, config, true)
56355613
local qim = finenv.QueryInvokedModifierKeys
56365614
local mod_key = qim and (qim(finale.CMDMODKEY_ALT) or qim(finale.CMDMODKEY_SHIFT))
5637-
track_selection()
5638-
if mod_key then change_the_slurs(nil)
5615+
if mod_key then change_the_slurs()
56395616
else run_the_dialog()
56405617
end
56415618
end

hash/slur_changer.hash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
acd5ad82d8b7185b792764621d5939f09874f0c4bab4195af82bfb1a5b550225d8bb8029ddfde8df308ce4f9db36185101da52e296f60140accb512098ffae90 slur_changer.lua
1+
3a8be003cb1ad52300ff67ef4b54c900cc18057269b626333cd7785977e1646bfefee8fd09686f0275548b0dd9332867ef222fdd9c613362bf932b266abb6d8f slur_changer.lua

0 commit comments

Comments
 (0)