feat(ui): add stop time to scheduler and unit picker to speed limiter

This commit overhauls the UI of the Scheduler and Speed Limiter tools using modern GroupBox designs. It also adds a highly-requested Stop Time feature to the scheduler to pause queues, and introduces a dynamic unit selection (KB/s, MB/s) to the Speed Limiter.
This commit is contained in:
NimBold
2026-06-10 12:40:31 +03:30
parent a5828ec586
commit 3b695169d6
3 changed files with 217 additions and 102 deletions
+28 -9
View File
@@ -32,6 +32,8 @@ enum SchedulerDay: Int, Codable, CaseIterable, Identifiable {
struct SchedulerSettings: Codable, Equatable {
var isEnabled: Bool = false
var startTime: Date = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: Date()) ?? Date()
var stopTimeEnabled: Bool = false
var stopTime: Date = Calendar.current.date(bySettingHour: 8, minute: 0, second: 0, of: Date()) ?? Date()
var isEveryday: Bool = true
var selectedDays: Set<SchedulerDay> = Set(SchedulerDay.allCases)
var postQueueAction: PostQueueAction = .doNothing
@@ -117,19 +119,36 @@ final class SchedulerController: ObservableObject {
let currentMinute = calendar.component(.minute, from: now)
let currentWeekday = calendar.component(.weekday, from: now)
if startHour == currentHour && startMinute == currentMinute {
let shouldRun: Bool
if settings.isEveryday {
shouldRun = true
} else {
let day = SchedulerDay(rawValue: currentWeekday)
shouldRun = day.map { settings.selectedDays.contains($0) } ?? false
}
let shouldRunToday: Bool
if settings.isEveryday {
shouldRunToday = true
} else {
let day = SchedulerDay(rawValue: currentWeekday)
shouldRunToday = day.map { settings.selectedDays.contains($0) } ?? false
}
if shouldRun {
if shouldRunToday {
if startHour == currentHour && startMinute == currentMinute {
lastTriggeredMinute = now
triggerQueues()
}
if settings.stopTimeEnabled {
let stopHour = calendar.component(.hour, from: settings.stopTime)
let stopMinute = calendar.component(.minute, from: settings.stopTime)
if stopHour == currentHour && stopMinute == currentMinute {
lastTriggeredMinute = now
pauseQueues()
}
}
}
}
private func pauseQueues() {
let targetQueueIDs = effectiveTargetQueueIDs()
for queueID in targetQueueIDs {
downloadController.pauseActiveDownloads(queueID: queueID)
}
}