Image
-- **************************************************
-- Provide Moho with the name of this script object
-- **************************************************

ScriptName = "SZ_TimelineNavigator"

-- **************************************************
-- General information about this script
-- **************************************************

SZ_TimelineNavigator = {}

function SZ_TimelineNavigator:Name()
    return self:Localize('UILabel')
end

function SZ_TimelineNavigator:Version()
    return '1.0'
end

function SZ_TimelineNavigator:UILabel()
    return self:Localize('UILabel')
end

function SZ_TimelineNavigator:Creator()
    return 'Stan from 2danimator.ru'
end

function SZ_TimelineNavigator:Description()
    return self:Localize('Description')
end

-- **************************************************
-- Is Relevant / Is Enabled
-- **************************************************

function SZ_TimelineNavigator:IsRelevant(moho)
    return true
end

function SZ_TimelineNavigator:IsEnabled(moho)
    return true
end

-- **************************************************
-- Keyboard/Mouse Control
-- **************************************************

function SZ_TimelineNavigator:OnMouseDown(moho, mouseEvent)
    
end

function SZ_TimelineNavigator:OnMouseMoved(moho, mouseEvent)
    
end

function SZ_TimelineNavigator:OnMouseUp(moho, mouseEvent)
    
end

function SZ_TimelineNavigator:OnKeyDown(moho, keyEvent)
    
end

-- **************************************************
-- Recurring Values
-- **************************************************

SZ_TimelineNavigator.frames = 1
SZ_TimelineNavigator.seconds = 1
SZ_TimelineNavigator.timeMinutes = 0
SZ_TimelineNavigator.timeSeconds = 0
SZ_TimelineNavigator.timeFrames = 0


-- **************************************************
-- Tool options - create and respond to tool's UI
-- **************************************************

SZ_TimelineNavigator.FRAMES_BACK = MOHO.MSG_BASE
SZ_TimelineNavigator.FRAMES_INPUT = MOHO.MSG_BASE + 1
SZ_TimelineNavigator.FRAMES_FORWARD = MOHO.MSG_BASE + 2
SZ_TimelineNavigator.SECONDS_BACK = MOHO.MSG_BASE + 3
SZ_TimelineNavigator.SECONDS_INPUT = MOHO.MSG_BASE + 4
SZ_TimelineNavigator.SECONDS_FORWARD = MOHO.MSG_BASE + 5
SZ_TimelineNavigator.TIME_MINUTES_INPUT = MOHO.MSG_BASE + 6
SZ_TimelineNavigator.TIME_SECONDS_INPUT = MOHO.MSG_BASE + 7
SZ_TimelineNavigator.TIME_FRAMES_INPUT = MOHO.MSG_BASE + 8
SZ_TimelineNavigator.TIME_GO = MOHO.MSG_BASE + 9

-- **************************************************
-- Tool Panel Layout
-- **************************************************

function SZ_TimelineNavigator:DoLayout(moho, layout)
    self.framesTxt = LM.GUI.DynamicText(self:Localize('Frames:'), 0)
    layout:AddChild(self.framesTxt, LM.GUI.ALIGN_LEFT, 2)

    self.framesBackBtn = LM.GUI.Button(self:Localize('Back'), self.FRAMES_BACK)
    layout:AddChild(self.framesBackBtn, LM.GUI.ALIGN_LEFT, 0)

    self.framesInput = LM.GUI.TextControl(48, '1', self.FRAMES_INPUT, LM.GUI.FIELD_UINT)
    layout:AddChild(self.framesInput, LM.GUI.ALIGN_LEFT, 3)

    self.framesForwardBtn = LM.GUI.Button(self:Localize('Forward'), self.FRAMES_FORWARD)
    layout:AddChild(self.framesForwardBtn, LM.GUI.ALIGN_LEFT, 0)

    layout:AddPadding(20)

    layout:AddChild(LM.GUI.Divider(true), LM.GUI.ALIGN_FILL)

    layout:AddPadding(20)

    self.secondsTxt = LM.GUI.DynamicText(self:Localize('Seconds:'), 0)
    layout:AddChild(self.secondsTxt, LM.GUI.ALIGN_LEFT, 2)

    self.BackBtn = LM.GUI.Button(self:Localize('Back'), self.SECONDS_BACK)
    layout:AddChild(self.BackBtn, LM.GUI.ALIGN_LEFT, 0)

    self.secondsInput = LM.GUI.TextControl(48, '1', self.SECONDS_INPUT, LM.GUI.FIELD_UFLOAT)
    layout:AddChild(self.secondsInput, LM.GUI.ALIGN_LEFT, 3)

    self.secondsForwardBtn = LM.GUI.Button(self:Localize('Forward'), self.SECONDS_FORWARD)
    layout:AddChild(self.secondsForwardBtn, LM.GUI.ALIGN_LEFT, 0)

    layout:AddPadding(20)

    layout:AddChild(LM.GUI.Divider(true), LM.GUI.ALIGN_FILL)

    layout:AddPadding(20)
    
    self.timeText = LM.GUI.DynamicText(self:Localize('MM:SS:FF:'), 0)
    layout:AddChild(self.timeText, LM.GUI.ALIGN_LEFT, 2)
    
    self.timeMinutesInput = LM.GUI.TextControl(28, '0', self.TIME_MINUTES_INPUT, LM.GUI.FIELD_UINT)
    layout:AddChild(self.timeMinutesInput, LM.GUI.ALIGN_LEFT, 3)
    
    layout:AddPadding(-15)
    layout:AddChild(LM.GUI.StaticText(':'), LM.GUI.ALIGN_LEFT, 3)
    layout:AddPadding(-19)
    
    self.timeSecondsInput = LM.GUI.TextControl(28, '0', self.TIME_SECONDS_INPUT, LM.GUI.FIELD_UINT)
    layout:AddChild(self.timeSecondsInput, LM.GUI.ALIGN_LEFT, 3)
    
    layout:AddPadding(-15)
    layout:AddChild(LM.GUI.StaticText(':'), LM.GUI.ALIGN_LEFT, 3)
    layout:AddPadding(-19)
    
    self.timeFramesInput = LM.GUI.TextControl(28, '0', self.TIME_FRAMES_INPUT, LM.GUI.FIELD_UINT)
    layout:AddChild(self.timeFramesInput, LM.GUI.ALIGN_LEFT, 3)

    self.goBtn = LM.GUI.Button(self:Localize('Go'), self.TIME_GO)
    layout:AddChild(self.goBtn, LM.GUI.ALIGN_LEFT, 0)
end


function SZ_TimelineNavigator:UpdateWidgets(moho)
    self.framesInput:SetValue(self.frames)
    self.secondsInput:SetValue(self.seconds)
    self.timeMinutesInput:SetValue(self.timeMinutes)
    self.timeSecondsInput:SetValue(self.timeSeconds)
    self.timeFramesInput:SetValue(self.timeFrames)
end


function SZ_TimelineNavigator:HandleMessage(moho, view, msg)
    local curFrame = moho.frame
    local fps = moho.document:Fps()
    
    self.frames = self.framesInput:IntValue()
    self.seconds = self.secondsInput:FloatValue()
    self.timeMinutes = self.timeMinutesInput:IntValue()
    self.timeSeconds = LM.Clamp(self.timeSecondsInput:IntValue(), 0, 59)
    self.timeFrames = self.timeFramesInput:IntValue()
        
    if msg == self.FRAMES_BACK then
        local newFrame = curFrame - self.frames
        if newFrame < 0 then newFrame = 0 end
        moho:SetCurFrame(newFrame)
    elseif msg == self.FRAMES_FORWARD then
        moho:SetCurFrame(curFrame + self.frames)
    elseif msg == self.SECONDS_BACK then
        local frames = self.seconds * fps
        local newFrame = curFrame - math.floor(frames)
        if newFrame < 0 then newFrame = 0 end
        moho:SetCurFrame(newFrame)
    elseif msg == self.SECONDS_FORWARD then
        local frames = self.seconds * fps
        moho:SetCurFrame(curFrame + math.floor(frames))
    elseif msg == self.TIME_GO then
        local newFrame = (self.timeMinutes * 60 * fps) + (self.timeSeconds * fps) + self.timeFrames
        moho:SetCurFrame(newFrame)
    elseif msg == self.TIME_SECONDS_INPUT then
        self.timeSecondsInput:SetValue(LM.Clamp(self.timeSecondsInput:IntValue(), 0, 59))
    end
end

-- **************************************************
-- Localization
-- **************************************************

function SZ_TimelineNavigator:Localize(text)
    local phrase = {}

    phrase['Description'] = 'Navigates the timeline by frame or time intervals'
    phrase['UILabel'] = 'Timeline Navigator'

    phrase['Frames:'] = 'Frames:'
    phrase['Back'] = ' < Back    '
    phrase['Forward'] = 'Forward >'
    phrase['Seconds:'] = 'Seconds:'
    phrase['MM:SS:FF:'] = 'MM:SS:FF:'
    phrase['Go'] = '    Go    '

    local fileWord = MOHO.Localize("/Menus/File/File=File")
    if fileWord == "Файл" then
        phrase['Description'] = 'Навигация по таймлайну, используя интервалы в кадрах или секундах'
        phrase['UILabel'] = 'Навигация по таймлайну'

        phrase['Frames:'] = 'Кадры:'
        phrase['Back'] = ' < Назад  '
        phrase['Forward'] = 'Вперед >'
        phrase['Seconds:'] = 'Секунды:'
        phrase['MM:SS:FF:'] = 'ММ:СС:КК:'
        phrase['Go'] = '   Перейти   '
    end

    return phrase[text]
end

Icon
Timeline Navigator
Listed

Author: Stan View Script
Script type: Tool

Uploaded: Jul 12 2020, 23:34

Navigate the timeline by a number of frames or seconds, or jump to a particular timestamp.
Image

A tool that allows you to navigate the timeline by a number of frames or seconds, or to jump to a particular timestamp.
This script, and all other scripts on this site are distributed as free software under the GNU General Public License 3.0 or later.
Downloads count: 380