From 0aea37b94cf6860d806bda800c1ac2b0f53c9044 Mon Sep 17 00:00:00 2001 From: Chris Hocking Date: Tue, 18 Aug 2020 03:36:26 +1000 Subject: [PATCH] Added and action to control Timeline Zoom - Fixed some documentation bugs as well. - Closes #2395 --- .../cp/apple/finalcutpro/prefs/Panel.lua | 10 +++- .../apple/finalcutpro/timeline/Timeline.lua | 2 +- src/extensions/cp/ui/List.lua | 9 +++ src/extensions/languages/English.json | 4 ++ src/plugins/core/midi/manager/init.lua | 12 ++-- src/plugins/core/tangent/manager/action.lua | 2 +- src/plugins/core/tangent/manager/controls.lua | 8 +-- src/plugins/core/tangent/manager/group.lua | 4 +- src/plugins/core/tangent/manager/named.lua | 16 ++--- src/plugins/finalcutpro/timeline/zoom.lua | 58 +++++++++++++++++++ 10 files changed, 100 insertions(+), 25 deletions(-) create mode 100644 src/plugins/finalcutpro/timeline/zoom.lua diff --git a/src/extensions/cp/apple/finalcutpro/prefs/Panel.lua b/src/extensions/cp/apple/finalcutpro/prefs/Panel.lua index bf96e345b..2c67057e1 100644 --- a/src/extensions/cp/apple/finalcutpro/prefs/Panel.lua +++ b/src/extensions/cp/apple/finalcutpro/prefs/Panel.lua @@ -1,4 +1,8 @@ -local require = require +--- === cp.apple.finalcutpro.prefs.Panel === +--- +--- Preferences Panel. + +local require = require local strings = require "cp.apple.finalcutpro.strings" @@ -8,8 +12,8 @@ local Group = require "cp.ui.Group" local If = require "cp.rx.go".If -local childMatching = axutils.childMatching -local childWith = axutils.childWith +local childMatching = axutils.childMatching +local childWith = axutils.childWith local Panel = Group:subclass("cp.apple.finalcutpro.prefs.Panel") diff --git a/src/extensions/cp/apple/finalcutpro/timeline/Timeline.lua b/src/extensions/cp/apple/finalcutpro/timeline/Timeline.lua index 14d9afc41..73b01f154 100644 --- a/src/extensions/cp/apple/finalcutpro/timeline/Timeline.lua +++ b/src/extensions/cp/apple/finalcutpro/timeline/Timeline.lua @@ -437,7 +437,7 @@ function Timeline.lazy.value:transitions() end --- cp.apple.finalcutpro.timeline.Timeline.playhead ---- Value +--- Field --- The Timeline Playhead. function Timeline.lazy.value:playhead() return self.contents.playhead diff --git a/src/extensions/cp/ui/List.lua b/src/extensions/cp/ui/List.lua index bc4f85455..56b0649a7 100644 --- a/src/extensions/cp/ui/List.lua +++ b/src/extensions/cp/ui/List.lua @@ -25,6 +25,15 @@ function List.static.matches(element) end --- cp.ui.List(parent, uiFinder, itemAdaptorFn) +--- Constructor +--- Creates a new List. +--- +--- Parameters: +--- * parent - The parent table. Should have a `isShowing` property. +--- * uiFinder - The `function` or `cp.prop` that provides the current `hs._asm.axuielement`. +--- +--- Returns: +--- * The new `List` instance. function List:initialize(parent, uiFinder, itemAdaptorFn) if type(itemAdaptorFn) ~= "function" then error("The itemAdaptor must be a function") diff --git a/src/extensions/languages/English.json b/src/extensions/languages/English.json index 39c8ff38a..5abf80af1 100644 --- a/src/extensions/languages/English.json +++ b/src/extensions/languages/English.json @@ -281,6 +281,7 @@ "controlFCPUIElementAbsolute": "Control Final Cut Pro User Interface Element (Absolute)", "controlFCPUIElementRelative": "Control Final Cut Pro User Interface Element (Relative)", "controlFCPUIElementRelativeNote": "Hover mouse over a UI Element, hold CONTROL, then adjust MIDI Knob/Fader to register.", + "controlsTimelineZoomViaTheAppearancePopup": "Controls Timeline Zoom via the Appearance Popup", "controlSurfaces": "Control Surfaces", "copy": "Copy", "copyActiveApplicationTo": "Copy Active Application To", @@ -298,6 +299,7 @@ "core_accessibility_screenrecording_label": "Screen Recording Permissions", "core_action_manager_label": "Manager: Actions", "core_application_manager_label": "Application Manager", + "core_audioswift_prefs_label": "Preferences: AudioSwift", "core_commands_actions_label": "Commands Actions", "core_commands_global_label": "Global Commands", "core_console_applications_label": "Console: Applications", @@ -316,6 +318,7 @@ "core_helpandsupport_userguide_label": "Help & Support: User Guide", "core_language_label": "Language Module", "core_loupedeck_prefs_label": "Preferences: Loupedeck", + "core_loupedeckct_changeapplications_label": "Loupedeck CT Applications", "core_loupedeckct_manager_label": "Loupedeck CT Manager", "core_loupedeckct_prefs_label": "Preferences: Loupedeck CT", "core_loupedeckplus_banks_label": "Loupedeck+: Banks", @@ -931,6 +934,7 @@ "finalcutpro_timeline_transcode_label": "Timeline: Transcode", "finalcutpro_timeline_transitions_label": "Timeline: Transitions", "finalcutpro_timeline_videoeffects_label": "Timeline: Video Effects", + "finalcutpro_timeline_zoom_label": "Timeline: Zoom", "finalcutpro_timeline_zoomtoselection_label": "Timeline: Zoom to Selection", "finalcutpro_toolbox_fcpxmltitles_label": "Toolbox: FCPXML Titles", "finalcutpro_touchbar_manager_label": "Manager: Touch Bar", diff --git a/src/plugins/core/midi/manager/init.lua b/src/plugins/core/midi/manager/init.lua index 56fa0a7c0..b5cf0ef10 100644 --- a/src/plugins/core/midi/manager/init.lua +++ b/src/plugins/core/midi/manager/init.lua @@ -87,14 +87,14 @@ mod.controls = controls -- A table of all the MIDI actions. local midiActions = {} ---- deviceNames -> table ---- Variable ---- MIDI Device Names. +-- deviceNames -> table +-- Variable +-- MIDI Device Names. local deviceNames = {} ---- virtualDevices -> table ---- Variable ---- MIDI Virtual Devices. +-- virtualDevices -> table +-- Variable +-- MIDI Virtual Devices. local virtualDevices = {} -- loupedeckFnPressed -> boolean diff --git a/src/plugins/core/tangent/manager/action.lua b/src/plugins/core/tangent/manager/action.lua index 3afa4c3af..29676889d 100644 --- a/src/plugins/core/tangent/manager/action.lua +++ b/src/plugins/core/tangent/manager/action.lua @@ -38,7 +38,7 @@ function action.lazy.prop:localActive() return prop.THIS(self._localActive == true) end ---- plugin.core.tangent.manager.action.active +--- plugins.core.tangent.manager.action.active --- Field --- Indicates if the action is active. It will only be active if --- the current action is `enabled` and if the parent group (if present) is `active`. diff --git a/src/plugins/core/tangent/manager/controls.lua b/src/plugins/core/tangent/manager/controls.lua index 8c621648e..1c6913770 100644 --- a/src/plugins/core/tangent/manager/controls.lua +++ b/src/plugins/core/tangent/manager/controls.lua @@ -29,14 +29,14 @@ function controls:initialize() self.ids = {} end - --- plugins.core.tangent.controls.enabled - --- Field - --- Indicates if the controls are enabled. +--- plugins.core.tangent.manager.controls.enabled +--- Field +--- Indicates if the controls are enabled. function controls.lazy.prop.enabled() return prop.TRUE() end ---- plugins.core.tangent.controls.active +--- plugins.core.tangent.manager.controls.active --- Field --- Indicates if the controls are active. They will be active if `enabled` is `true`. function controls.lazy.prop:active() diff --git a/src/plugins/core/tangent/manager/group.lua b/src/plugins/core/tangent/manager/group.lua index f4ebeb26c..84afc00e7 100644 --- a/src/plugins/core/tangent/manager/group.lua +++ b/src/plugins/core/tangent/manager/group.lua @@ -57,7 +57,7 @@ function group.lazy.prop:localActive() return prop.THIS(self._localActive == true) end ---- plugin.core.tangent.manager.group.active +--- plugins.core.tangent.manager.group.active --- Field --- Indicates if the group is active. It will only be active if --- the current group is `enabled` and if the parent group (if present) is `active`. @@ -79,7 +79,7 @@ function group.static.is(thing) return type(thing) == "table" and thing.isInstanceOf ~= nil and thing:isInstanceOf(group) end ---- plugin.core.tangent.manager.group:name() -> string +--- plugins.core.tangent.manager.group:name() -> string --- Method --- Returns the `name` given to the group. --- diff --git a/src/plugins/core/tangent/manager/named.lua b/src/plugins/core/tangent/manager/named.lua index 77c6de425..a08d98969 100644 --- a/src/plugins/core/tangent/manager/named.lua +++ b/src/plugins/core/tangent/manager/named.lua @@ -21,7 +21,7 @@ local named = class "core.tangent.manager.named" :include(lazy) local NAMES_KEY = {} ---- hub.named(id, name[, parent]) -> named +--- plugins.core.tangent.manager.named(id, name[, parent]) -> named --- Constructor --- Creates a new `named` instance, with the specified base name. --- @@ -34,17 +34,17 @@ function named:initialize(id, name, parent) self._name = name end --- --- plugins.core.tangent.manager.parameter.enabled --- --- Field --- --- Indicates if the parameter is enabled. +--- plugins.core.tangent.manager.named.enabled +--- Field +--- Indicates if the parameter is enabled. function named.lazy.prop.enabled() return prop.TRUE() end --- --- plugin.core.tangent.manager.parameter.active --- --- Field --- --- Indicates if the parameter is active. It will only be active if --- --- the current parameter is `enabled` and if the parent group (if present) is `active`. +--- plugins.core.tangent.manager.named.active +--- Field +--- Indicates if the parameter is active. It will only be active if +--- the current parameter is `enabled` and if the parent group (if present) is `active`. function named.lazy.prop:active() local parent = self:parent() return parent and parent.active:AND(self.enabled) or self.enabled:IMMUTABLE() diff --git a/src/plugins/finalcutpro/timeline/zoom.lua b/src/plugins/finalcutpro/timeline/zoom.lua new file mode 100644 index 000000000..82dc90989 --- /dev/null +++ b/src/plugins/finalcutpro/timeline/zoom.lua @@ -0,0 +1,58 @@ +--- === plugins.finalcutpro.timeline.zoom === +--- +--- Action for changing Final Cut Pro's Timeline Zoom Level + +local require = require + +local timer = require "hs.timer" + +local deferred = require "cp.deferred" +local fcp = require "cp.apple.finalcutpro" +local i18n = require "cp.i18n" + +local delayed = timer.delayed + +local plugin = { + id = "finalcutpro.timeline.zoom", + group = "finalcutpro", + dependencies = { + ["finalcutpro.commands"] = "fcpxCmds", + } +} + +function plugin.init(deps) + local fcpxCmds = deps.fcpxCmds + local appearance = fcp.timeline.toolbar.appearance + + local appearancePopUpCloser = delayed.new(1, function() + appearance:hide() + end) + + local zoomShift = 0 + local updateZoom = deferred.new(0.0000001):action(function() + appearance:show() + appearance.zoomAmount:shiftValue(zoomShift) + zoomShift = 0 + appearancePopUpCloser:start() + end) + + fcpxCmds + :add("timelineZoomIncrease") + :whenActivated(function() + zoomShift = zoomShift + 0.2 + updateZoom() + end) + :titled(i18n("timelineZoom") .. " " .. i18n("increase")) + :subtitled(i18n("controlsTimelineZoomViaTheAppearancePopup")) + + fcpxCmds + :add("timelineZoomDecrease") + :whenActivated(function() + zoomShift = zoomShift - 0.2 + updateZoom() + end) + :titled(i18n("timelineZoom") .. " " .. i18n("decrease")) + :subtitled(i18n("controlsTimelineZoomViaTheAppearancePopup")) +end + +return plugin