diff --git a/aegisub/src/audio_timing.h b/aegisub/src/audio_timing.h index 68e1eca00..334271180 100644 --- a/aegisub/src/audio_timing.h +++ b/aegisub/src/audio_timing.h @@ -125,6 +125,15 @@ public: /// Add lead-out time to the current timing unit virtual void AddLeadOut() = 0; + /// Modify the length of the current and possibly following timing units + /// @param delta Amount to add in centiseconds + /// @param shift_following Should the following things be shifted by delta? + virtual void ModifyLength(int delta, bool shift_following) = 0; + + /// Modify the start time of the current timing unit + /// @param delta Amount to add in centiseconds + virtual void ModifyStart(int delta) = 0; + /// @brief Determine if a position is close to a draggable marker /// @param ms The time in milliseconds to test /// @param sensitivity Distance in milliseconds to consider markers as nearby diff --git a/aegisub/src/audio_timing_dialogue.cpp b/aegisub/src/audio_timing_dialogue.cpp index 37f133b2c..d5d4d45db 100644 --- a/aegisub/src/audio_timing_dialogue.cpp +++ b/aegisub/src/audio_timing_dialogue.cpp @@ -398,6 +398,8 @@ public: void Revert(); void AddLeadIn(); void AddLeadOut(); + void ModifyLength(int delta, bool shift_following); + void ModifyStart(int delta); bool IsNearbyMarker(int ms, int sensitivity) const; std::vector OnLeftClick(int ms, bool ctrl_down, int sensitivity, int snap_range); std::vector OnRightClick(int ms, bool, int sensitivity, int snap_range); @@ -600,6 +602,18 @@ void AudioTimingControllerDialogue::AddLeadOut() SetMarkers(std::vector(1, m), *m + OPT_GET("Audio/Lead/OUT")->GetInt()); } +void AudioTimingControllerDialogue::ModifyLength(int delta, bool) { + DialogueTimingMarker *m = active_line.GetRightMarker(); + SetMarkers(std::vector(1, m), + std::max(*m + delta * 10, *active_line.GetLeftMarker())); +} + +void AudioTimingControllerDialogue::ModifyStart(int delta) { + DialogueTimingMarker *m = active_line.GetLeftMarker(); + SetMarkers(std::vector(1, m), + std::min(*m + delta * 10, *active_line.GetRightMarker())); +} + bool AudioTimingControllerDialogue::IsNearbyMarker(int ms, int sensitivity) const { assert(sensitivity >= 0); diff --git a/aegisub/src/audio_timing_karaoke.cpp b/aegisub/src/audio_timing_karaoke.cpp index 05713b7c5..43bd1d12a 100644 --- a/aegisub/src/audio_timing_karaoke.cpp +++ b/aegisub/src/audio_timing_karaoke.cpp @@ -114,6 +114,8 @@ class AudioTimingControllerKaraoke : public AudioTimingController { void DoCommit(); void ApplyLead(bool announce_primary); + int MoveMarker(KaraokeMarker *marker, int new_position); + void AnnounceChanges(int syl); public: // AudioTimingController implementation @@ -129,6 +131,8 @@ public: void Revert(); void AddLeadIn(); void AddLeadOut(); + void ModifyLength(int delta, bool shift_following); + void ModifyStart(int delta); bool IsNearbyMarker(int ms, int sensitivity) const; std::vector OnLeftClick(int ms, bool, int sensitivity, int); std::vector OnRightClick(int, bool, int, int) { return std::vector(); } @@ -292,16 +296,36 @@ void AudioTimingControllerKaraoke::AddLeadOut() { void AudioTimingControllerKaraoke::ApplyLead(bool announce_primary) { kara->SetLineTimes(start_marker, end_marker); + if (!announce_primary) + AnnounceUpdatedStyleRanges(); + AnnounceChanges(announce_primary ? cur_syl : cur_syl + 2); +} - AnnounceUpdatedStyleRanges(); - AnnounceMarkerMoved(); - if (announce_primary) - AnnounceUpdatedPrimaryRange(); +void AudioTimingControllerKaraoke::ModifyLength(int delta, bool shift_following) { + if (cur_syl == markers.size()) return; - if (auto_commit) - DoCommit(); - else - commit_id = -1; + int cur, end, step; + if (delta < 0) { + cur = cur_syl; + end = shift_following ? markers.size() : cur_syl + 1; + step = 1; + } + else { + cur = shift_following ? markers.size() - 1 : cur_syl; + end = cur_syl - 1; + step = -1; + } + + for (; cur != end; cur += step) { + MoveMarker(&markers[cur], markers[cur] + delta * 10); + } + AnnounceChanges(cur_syl); +} + +void AudioTimingControllerKaraoke::ModifyStart(int delta) { + if (cur_syl == 0) return; + MoveMarker(&markers[cur_syl - 1], markers[cur_syl - 1] + delta * 10); + AnnounceChanges(cur_syl); } bool AudioTimingControllerKaraoke::IsNearbyMarker(int ms, int sensitivity) const { @@ -331,29 +355,35 @@ std::vector AudioTimingControllerKaraoke::OnLeftClick(int ms, bool return std::vector(); } -void AudioTimingControllerKaraoke::OnMarkerDrag(std::vector const& m, int new_position, int) { - assert(m.size() == 1); - KaraokeMarker *marker = static_cast(m[0]); +int AudioTimingControllerKaraoke::MoveMarker(KaraokeMarker *marker, int new_position) { // No rearranging of syllables allowed new_position = mid( marker == &markers.front() ? start_marker.GetPosition() : (marker - 1)->GetPosition(), new_position, marker == &markers.back() ? end_marker.GetPosition() : (marker + 1)->GetPosition()); + if (new_position == marker->GetPosition()) + return -1; + marker->Move(new_position); size_t syl = marker - &markers.front() + 1; kara->SetStartTime(syl, new_position); + labels[syl - 1].range = TimeRange(labels[syl - 1].range.begin(), new_position); + labels[syl].range = TimeRange(new_position, labels[syl].range.end()); + + return syl; +} + +void AudioTimingControllerKaraoke::AnnounceChanges(int syl) { + if (syl < 0) return; + if (syl == cur_syl || syl == cur_syl + 1) { AnnounceUpdatedPrimaryRange(); AnnounceUpdatedStyleRanges(); } - AnnounceMarkerMoved(); - - labels[syl - 1].range = TimeRange(labels[syl - 1].range.begin(), new_position); - labels[syl].range = TimeRange(new_position, labels[syl].range.end()); AnnounceLabelChanged(); if (auto_commit) @@ -362,6 +392,11 @@ void AudioTimingControllerKaraoke::OnMarkerDrag(std::vector const& commit_id = -1; } +void AudioTimingControllerKaraoke::OnMarkerDrag(std::vector const& m, int new_position, int) { + assert(m.size() == 1); + AnnounceChanges(MoveMarker(static_cast(m[0]), new_position)); +} + void AudioTimingControllerKaraoke::GetLabels(TimeRange const& range, std::vector &out) const { for (size_t i = 0; i < labels.size(); ++i) { if (range.overlaps(labels[i].range)) diff --git a/aegisub/src/command/time.cpp b/aegisub/src/command/time.cpp index 691e18c51..a8ad283cf 100644 --- a/aegisub/src/command/time.cpp +++ b/aegisub/src/command/time.cpp @@ -279,6 +279,71 @@ struct time_add_lead_out : public Command { } }; +struct time_length_increase : public Command { + CMD_NAME("time/length/increase") + STR_MENU("Increase length") + STR_DISP("Increase length") + STR_HELP("Increase the length of the current timing unit") + void operator()(agi::Context *c) { + if (c->audioController->GetTimingController()) + c->audioController->GetTimingController()->ModifyLength(1, false); + } +}; + +struct time_length_increase_shift : public Command { + CMD_NAME("time/length/increase/shift") + STR_MENU("Increase length and shift") + STR_DISP("Increase length and shift") + STR_HELP("Increase the length of the current timing unit and shift the following items") + void operator()(agi::Context *c) { + if (c->audioController->GetTimingController()) + c->audioController->GetTimingController()->ModifyLength(1, true); + } +}; + +struct time_length_decrease : public Command { + CMD_NAME("time/length/decrease") + STR_MENU("Decrease length") + STR_DISP("Decrease length") + STR_HELP("Decrease the length of the current timing unit") + void operator()(agi::Context *c) { + if (c->audioController->GetTimingController()) + c->audioController->GetTimingController()->ModifyLength(-1, false); + } +}; + +struct time_length_decrease_shift : public Command { + CMD_NAME("time/length/decrease/shift") + STR_MENU("Decrease length and shift") + STR_DISP("Decrease length and shift") + STR_HELP("Decrease the length of the current timing unit and shift the following items") + void operator()(agi::Context *c) { + if (c->audioController->GetTimingController()) + c->audioController->GetTimingController()->ModifyLength(-1, true); + } +}; + +struct time_start_increase : public Command { + CMD_NAME("time/start/increase") + STR_MENU("Shift start time forward") + STR_DISP("Shift start time forward") + STR_HELP("Shift the start time of the current timing unit forward") + void operator()(agi::Context *c) { + if (c->audioController->GetTimingController()) + c->audioController->GetTimingController()->ModifyStart(1); + } +}; + +struct time_start_decrease : public Command { + CMD_NAME("time/start/decrease") + STR_MENU("Shift start time backward") + STR_DISP("Shift start time backward") + STR_HELP("Shift the start time of the current timing unit backward") + void operator()(agi::Context *c) { + if (c->audioController->GetTimingController()) + c->audioController->GetTimingController()->ModifyStart(-1); + } +}; /// Set start of selected subtitles to current video frame. struct time_snap_start_video : public validate_video_loaded { @@ -327,11 +392,17 @@ namespace cmd { reg(new time_continuous_end); reg(new time_continuous_start); reg(new time_frame_current); + reg(new time_length_decrease); + reg(new time_length_decrease_shift); + reg(new time_length_increase); + reg(new time_length_increase_shift); reg(new time_next); reg(new time_prev); reg(new time_shift); reg(new time_snap_end_video); reg(new time_snap_scene); reg(new time_snap_start_video); + reg(new time_start_decrease); + reg(new time_start_increase); } } diff --git a/aegisub/src/hotkey.cpp b/aegisub/src/hotkey.cpp index f55115d59..06e5a0a51 100644 --- a/aegisub/src/hotkey.cpp +++ b/aegisub/src/hotkey.cpp @@ -68,6 +68,42 @@ namespace { hotkey::inst->SetHotkeyMap(hk_map); } + + const char *renamed_commands[][2] = { + { "timing shift start backward", "time/start/decrease" }, + { "timing shift start forward", "time/start/increase" }, + { "timing shift end backward", "time/length/decrease" }, + { "timing shift end forward", "time/length/increase" }, + + { "timing karaoke decrease length" , "time/length/decrease" }, + { "timing karaoke increase length" , "time/length/increase" }, + { "timing karaoke decrease length and shift following" , "time/length/decrease/shift" }, + { "timing karaoke increase length and shift following" , "time/length/increase/shift" }, + { 0, 0} + }; + + void rename_commands() { + std::map name_map; + for (size_t i = 0; renamed_commands[i][0]; ++i) + name_map[renamed_commands[i][0]] = renamed_commands[i][1]; + + bool renamed_any = false; + agi::hotkey::Hotkey::HotkeyMap hk_map = hotkey::inst->GetHotkeyMap(); + for (agi::hotkey::Hotkey::HotkeyMap::iterator it = hk_map.begin(); it != hk_map.end(); ) { + std::map::iterator ren = name_map.find(it->first); + if (ren != name_map.end()) { + hk_map.insert(make_pair(std::string(ren->second), + agi::hotkey::Combo(it->second.Context(), ren->second, it->second.Get()))); + hk_map.erase(it++); + renamed_any = true; + } + else + ++it; + } + + if (renamed_any) + hotkey::inst->SetHotkeyMap(hk_map); + } } namespace hotkey { @@ -79,9 +115,10 @@ void init() { GET_DEFAULT_CONFIG(default_hotkey)); int last_version = OPT_GET("Version/Last Version")->GetInt(); - if (last_version < 6294) { + if (last_version < 6294) migrate_hotkeys(removed_commands_6294, added_hotkeys_6294); - } + if (last_version < 6933) + rename_commands(); } void clear() { diff --git a/aegisub/src/libresrc/default_hotkey.json b/aegisub/src/libresrc/default_hotkey.json index dfea1c960..ff7c6371a 100644 --- a/aegisub/src/libresrc/default_hotkey.json +++ b/aegisub/src/libresrc/default_hotkey.json @@ -12,25 +12,25 @@ "key" : "KP_8" } ], - "timing shift start backward" : [ + "time/start/decrease" : [ { "modifiers" : [], "key" : "KP_4" } ], - "timing shift start forward" : [ + "time/start/increase" : [ { "modifiers" : [], "key" : "KP_6" } ], - "timing shift end backward" : [ + "time/length/decrease" : [ { "modifiers" : [], "key" : "KP_7" } ], - "timing shift end forward" : [ + "time/length/increase" : [ { "modifiers" : [], "key" : "KP_9" @@ -385,25 +385,25 @@ "key" : "V" } ], - "timing karaoke decrease length" : [ + "time/length/decrease" : [ { "modifiers" : [], "key" : "KP_Subtract" } ], - "timing karaoke decrease length and shift following" : [ + "time/length/decrease/shift" : [ { "modifiers" : [ "Shift" ], "key" : "KP_Subtract" } ], - "timing karaoke increase length" : [ + "time/length/increase" : [ { "modifiers" : [], "key" : "KP_Add" } ], - "timing karaoke increase length and shift following" : [ + "time/length/increase/shift" : [ { "modifiers" : [ "Shift" ], "key" : "KP_Add" diff --git a/aegisub/src/libresrc/osx/default_hotkey.json b/aegisub/src/libresrc/osx/default_hotkey.json index 6c1838772..ea0dc0df2 100644 --- a/aegisub/src/libresrc/osx/default_hotkey.json +++ b/aegisub/src/libresrc/osx/default_hotkey.json @@ -12,25 +12,25 @@ "key" : "KP_8" } ], - "timing shift start backward" : [ + "time/start/decrease" : [ { "modifiers" : [], "key" : "KP_4" } ], - "timing shift start forward" : [ + "time/start/increase" : [ { "modifiers" : [], "key" : "KP_6" } ], - "timing shift end backward" : [ + "time/length/decrease" : [ { "modifiers" : [], "key" : "KP_7" } ], - "timing shift end forward" : [ + "time/length/increase" : [ { "modifiers" : [], "key" : "KP_9" @@ -395,25 +395,25 @@ "key" : "V" } ], - "timing karaoke decrease length" : [ + "time/length/decrease" : [ { "modifiers" : [], "key" : "KP_Subtract" } ], - "timing karaoke decrease length and shift following" : [ + "time/length/decrease/shift" : [ { "modifiers" : [ "Shift" ], "key" : "KP_Subtract" } ], - "timing karaoke increase length" : [ + "time/length/increase" : [ { "modifiers" : [], "key" : "KP_Add" } ], - "timing karaoke increase length and shift following" : [ + "time/length/increase/shift" : [ { "modifiers" : [ "Shift" ], "key" : "KP_Add"