diff --git a/README.md b/README.md index 268e0f2..874e242 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ This is a Lua script for OBS Studio that sets a text source as a timer with adva - Streaming timer (starts timer when streaming starts) - Recording timer (starts timer when recording start) - With the countdown modes, there is an option to countup when the countdown is finished +- With Countdown and Countup modes there is an option to add or remove a fixed amount of seconds from the current timer, amount set in Increment Amount **Formatting** The default format is: %0H:%0m:%0s (00:00:00) @@ -39,4 +40,4 @@ The default format is: %0H:%0m:%0s (00:00:00) **Hotkeys** -Hotkeys can be set for starting/stopping and to the reset timer. +Hotkeys can be set for starting/stopping, adding or removing time from the timer, and to the reset timer. diff --git a/advanced-timer.lua b/advanced-timer.lua index e1d4731..03c611c 100644 --- a/advanced-timer.lua +++ b/advanced-timer.lua @@ -12,6 +12,7 @@ settings_ = nil orig_time = 0 cur_time = 0 cur_ns = 0 +increment_amount = 0 up_when_finished = false up = false paused = false @@ -20,6 +21,8 @@ next_scene = "" hotkey_id_reset = obs.OBS_INVALID_HOTKEY_ID hotkey_id_pause = obs.OBS_INVALID_HOTKEY_ID +hotkey_id_plus = obs.OBS_INVALID_HOTKEY_ID +hotkey_id_minus = obs.OBS_INVALID_HOTKEY_ID function delta_time(year, month, day, hour, minute, second) local now = os.time() @@ -292,6 +295,45 @@ function on_pause(pressed) end end +function plus_or_minus(pressed, addition) + if not pressed then + return + end + + if mode == "Streaming timer" or mode == "Recording timer" then + return + else + if cur_ns == 0 then + -- Initial value, need to initialize cur_ns to effect first run of timer + cur_ns = cur_time + end + local delta = increment_amount * 1000000000 + if not addition then + delta = delta * -1 + end + cur_time = cur_time + delta + if not timer_active then + set_time_text(cur_time, format) + end + end +end + +function plus(pressed) + if not pressed then + return + end + plus_or_minus(true, true) + return true +end + +function minus(pressed) + if not pressed then + return + end + plus_or_minus(true, false) + return true +end + function pause_button_clicked(props, p) on_pause(true) return true @@ -302,9 +344,20 @@ function reset_button_clicked(props, p) return true end +function plus_button_clicked(props, p) + plus_or_minus(true, true) + return true +end + +function minus_button_clicked(props, p) + plus_or_minus(true, false) + return true +end + function settings_modified(props, prop, settings) local mode_setting = obs.obs_data_get_string(settings, "mode") local p_duration = obs.obs_properties_get(props, "duration") + local p_increment_amount = obs.obs_properties_get(props, "increment_amount") local p_offset = obs.obs_properties_get(props, "offset") local p_year = obs.obs_properties_get(props, "year") local p_month = obs.obs_properties_get(props, "month") @@ -316,6 +369,8 @@ function settings_modified(props, prop, settings) local p_a_mode = obs.obs_properties_get(props, "a_mode") local button_pause = obs.obs_properties_get(props, "pause_button") local button_reset = obs.obs_properties_get(props, "reset_button") + local button_plus = obs.obs_properties_get(props, "plus_button") + local button_minus = obs.obs_properties_get(props, "minus_button") local up_finished = obs.obs_properties_get(props, "countup_countdown_finished") local switch_to = obs.obs_properties_get(props, "switch_to_scene") local next_scene = obs.obs_properties_get(props, "next_scene") @@ -325,6 +380,7 @@ function settings_modified(props, prop, settings) if (mode_setting == "Countdown") then obs.obs_property_set_visible(p_duration, true) + obs.obs_property_set_visible(p_increment_amount, true) obs.obs_property_set_visible(p_offset, false) obs.obs_property_set_visible(p_year, false) obs.obs_property_set_visible(p_month, false) @@ -335,12 +391,15 @@ function settings_modified(props, prop, settings) obs.obs_property_set_visible(p_stop_text, true) obs.obs_property_set_visible(button_pause, true) obs.obs_property_set_visible(button_reset, true) + obs.obs_property_set_visible(button_plus, true) + obs.obs_property_set_visible(button_minus, true) obs.obs_property_set_visible(p_a_mode, true) obs.obs_property_set_visible(up_finished, true) obs.obs_property_set_visible(switch_to, true) obs.obs_property_set_visible(next_scene, true) elseif (mode_setting == "Countup") then obs.obs_property_set_visible(p_duration, false) + obs.obs_property_set_visible(p_increment_amount, false) obs.obs_property_set_visible(p_offset, true) obs.obs_property_set_visible(p_year, false) obs.obs_property_set_visible(p_month, false) @@ -351,12 +410,15 @@ function settings_modified(props, prop, settings) obs.obs_property_set_visible(p_stop_text, false) obs.obs_property_set_visible(button_pause, true) obs.obs_property_set_visible(button_reset, true) + obs.obs_property_set_visible(button_plus, true) + obs.obs_property_set_visible(button_minus, true) obs.obs_property_set_visible(p_a_mode, true) obs.obs_property_set_visible(up_finished, false) obs.obs_property_set_visible(switch_to, false) obs.obs_property_set_visible(next_scene, false) elseif (mode_setting == "Specific time") then obs.obs_property_set_visible(p_duration, false) + obs.obs_property_set_visible(p_increment_amount, false) obs.obs_property_set_visible(p_offset, false) obs.obs_property_set_visible(p_year, false) obs.obs_property_set_visible(p_month, false) @@ -367,12 +429,15 @@ function settings_modified(props, prop, settings) obs.obs_property_set_visible(p_stop_text, true) obs.obs_property_set_visible(button_pause, true) obs.obs_property_set_visible(button_reset, true) + obs.obs_property_set_visible(button_plus, false) + obs.obs_property_set_visible(button_minus, false) obs.obs_property_set_visible(p_a_mode, true) obs.obs_property_set_visible(up_finished, true) obs.obs_property_set_visible(switch_to, true) obs.obs_property_set_visible(next_scene, true) elseif (mode_setting == "Specific date and time") then obs.obs_property_set_visible(p_duration, false) + obs.obs_property_set_visible(p_increment_amount, false) obs.obs_property_set_visible(p_offset, false) obs.obs_property_set_visible(p_year, true) obs.obs_property_set_visible(p_month, true) @@ -383,12 +448,15 @@ function settings_modified(props, prop, settings) obs.obs_property_set_visible(p_stop_text, true) obs.obs_property_set_visible(button_pause, true) obs.obs_property_set_visible(button_reset, true) + obs.obs_property_set_visible(button_plus, false) + obs.obs_property_set_visible(button_minus, false) obs.obs_property_set_visible(p_a_mode, true) obs.obs_property_set_visible(up_finished, true) obs.obs_property_set_visible(switch_to, true) obs.obs_property_set_visible(next_scene, true) elseif (mode_setting == "Streaming timer") then obs.obs_property_set_visible(p_duration, false) + obs.obs_property_set_visible(p_increment_amount, false) obs.obs_property_set_visible(p_offset, false) obs.obs_property_set_visible(p_year, false) obs.obs_property_set_visible(p_month, false) @@ -399,12 +467,15 @@ function settings_modified(props, prop, settings) obs.obs_property_set_visible(p_stop_text, false) obs.obs_property_set_visible(button_pause, false) obs.obs_property_set_visible(button_reset, false) + obs.obs_property_set_visible(button_plus, false) + obs.obs_property_set_visible(button_minus, false) obs.obs_property_set_visible(p_a_mode, false) obs.obs_property_set_visible(up_finished, false) obs.obs_property_set_visible(switch_to, false) obs.obs_property_set_visible(next_scene, false) elseif (mode_setting == "Recording timer") then obs.obs_property_set_visible(p_duration, false) + obs.obs_property_set_visible(p_increment_amount, false) obs.obs_property_set_visible(p_offset, false) obs.obs_property_set_visible(p_year, false) obs.obs_property_set_visible(p_month, false) @@ -415,6 +486,8 @@ function settings_modified(props, prop, settings) obs.obs_property_set_visible(p_stop_text, false) obs.obs_property_set_visible(button_pause, false) obs.obs_property_set_visible(button_reset, false) + obs.obs_property_set_visible(button_plus, false) + obs.obs_property_set_visible(button_minus, false) obs.obs_property_set_visible(p_a_mode, false) obs.obs_property_set_visible(up_finished, false) obs.obs_property_set_visible(switch_to, false) @@ -437,6 +510,7 @@ function script_properties() obs.obs_property_set_modified_callback(p_mode, settings_modified) obs.obs_properties_add_int(props, "duration", "Countdown duration (seconds)", 1, 100000000, 1) + obs.obs_properties_add_int(props, "increment_amount", "Plus/Minus increment amount (seconds)", 1, 100000000, 1) obs.obs_properties_add_int(props, "offset", "Countup from (seconds)", 0, 100000000, 1) obs.obs_properties_add_int(props, "year", "Year", 1971, 100000000, 1) obs.obs_properties_add_int(props, "month", "Month (1-12)", 1, 12, 1) @@ -481,6 +555,8 @@ function script_properties() obs.obs_properties_add_button(props, "pause_button", "Start/Stop", pause_button_clicked) obs.obs_properties_add_button(props, "reset_button", "Reset", reset_button_clicked) + obs.obs_properties_add_button(props, "plus_button", "Plus", plus_button_clicked) + obs.obs_properties_add_button(props, "minus_button", "Minus", minus_button_clicked) settings_modified(props, nil, settings_) @@ -509,6 +585,7 @@ function script_update(settings) up_when_finished = obs.obs_data_get_bool(settings, "countup_countdown_finished") switch_to_scene = obs.obs_data_get_bool(settings, "switch_to_scene") next_scene = obs.obs_data_get_string(settings, "next_scene") + increment_amount = obs.obs_data_get_int(settings, "increment_amount") if mode == "Countdown" then cur_time = obs.obs_data_get_int(settings, "duration") * 1000000000 @@ -537,6 +614,7 @@ end function script_defaults(settings) obs.obs_data_set_default_int(settings, "duration", 5) + obs.obs_data_set_default_int(settings, "increment_amount", 10) obs.obs_data_set_default_int(settings, "offset", 0) obs.obs_data_set_default_int(settings, "year", os.date("%Y", os.time())) obs.obs_data_set_default_int(settings, "month", os.date("%m", os.time())) @@ -550,10 +628,16 @@ end function script_save(settings) local hotkey_save_array_reset = obs.obs_hotkey_save(hotkey_id_reset) local hotkey_save_array_pause = obs.obs_hotkey_save(hotkey_id_pause) + local hotkey_save_array_plus = obs.obs_hotkey_save(hotkey_id_plus) + local hotkey_save_array_minus = obs.obs_hotkey_save(hotkey_id_minus) obs.obs_data_set_array(settings, "reset_hotkey", hotkey_save_array_reset) obs.obs_data_set_array(settings, "pause_hotkey", hotkey_save_array_pause) - obs.obs_data_array_release(hotkey_save_array_pause) + obs.obs_data_set_array(settings, "plus_hotkey", hotkey_save_array_plus) + obs.obs_data_set_array(settings, "minus_hotkey", hotkey_save_array_minus) obs.obs_data_array_release(hotkey_save_array_reset) + obs.obs_data_array_release(hotkey_save_array_pause) + obs.obs_data_array_release(hotkey_save_array_plus) + obs.obs_data_array_release(hotkey_save_array_minus) end function script_load(settings) @@ -561,14 +645,22 @@ function script_load(settings) obs.signal_handler_connect(sh, "source_activate", source_activated) obs.signal_handler_connect(sh, "source_deactivate", source_deactivated) - hotkey_id_reset = obs.obs_hotkey_register_frontend("reset_timer_thingy", "Reset Timer", reset) - hotkey_id_pause = obs.obs_hotkey_register_frontend("pause_timer", "Start/Stop Timer", on_pause) + hotkey_id_reset = obs.obs_hotkey_register_frontend("advanced_timer_reset_timer", "Reset Timer", reset) + hotkey_id_pause = obs.obs_hotkey_register_frontend("advanced_timer_pause_timer", "Start/Stop Timer", on_pause) + hotkey_id_plus = obs.obs_hotkey_register_frontend("advanced_timer_add_time_to_timer", "Add Time to Timer", plus) + hotkey_id_minus = obs.obs_hotkey_register_frontend("advanced_timer_minus_time_to_timer", "Remove Time from Timer", minus) local hotkey_save_array_reset = obs.obs_data_get_array(settings, "reset_hotkey") local hotkey_save_array_pause = obs.obs_data_get_array(settings, "pause_hotkey") + local hotkey_save_array_plus = obs.obs_data_get_array(settings, "plus_hotkey") + local hotkey_save_array_minus = obs.obs_data_get_array(settings, "minus_hotkey") obs.obs_hotkey_load(hotkey_id_reset, hotkey_save_array_reset) obs.obs_hotkey_load(hotkey_id_pause, hotkey_save_array_pause) + obs.obs_hotkey_load(hotkey_id_plus, hotkey_save_array_plus) + obs.obs_hotkey_load(hotkey_id_minus, hotkey_save_array_minus) obs.obs_data_array_release(hotkey_save_array_reset) obs.obs_data_array_release(hotkey_save_array_pause) + obs.obs_data_array_release(hotkey_save_array_plus) + obs.obs_data_array_release(hotkey_save_array_minus) obs.obs_frontend_add_event_callback(on_event)