@@ -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"
53295330end
53305331local configuration = require (" library.configuration" )
@@ -5334,8 +5335,6 @@ local layer_lib = require("library.layer")
53345335local library = require (" library.general_library" )
53355336local script_name = library .calc_script_name ()
53365337local name = plugindef ():gsub (" %.%.%." , " " )
5337- local selection
5338- local saved_bounds = {}
53395338local config = {
53405339 dummy = " dummy" ,
53415340 last_selected = 0 ,
@@ -5349,24 +5348,25 @@ local config = {
53495348local 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}
53695368for _ , v in ipairs (dialog_options ) do config [v [1 ]] = v [2 ] end
5369+ local ss_3state = { ON = 0 , OFF = 1 , AUTO = 2 }
53705370local 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
53915391end
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
54145406end
54155407local 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 )
54795471end
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
54805479local 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
55035499end
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\n before 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 ()
56325606end
56335607local function change_slurs ()
5608+ if finenv .Region ():IsEmpty () then
5609+ finenv .UI ():AlertError (" Please select some music\n before 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
56415618end
0 commit comments