feat: add timer to bar clock#1498
Draft
FoxlikeCreature wants to merge 10 commits into
Draft
Conversation
Adds a timer accessible from the bar. Hovering over the clock slides out a popout where you can set hours, minutes, seconds and start the countdown. While running, a small indicator appears under the clock showing the time left. When the timer finishes, the popout reopens automatically with a bongo cat animation and a dismiss button. An optional sound plays on finish - configurable via bar.clock.timer.soundFile in shell.json, defaults to the included timer-done.wav. The timer persists across shell reloads (uses PersistentProperties). Also adds an optional "Timer" status icon (bar.status.showTimer) - when enabled, a dedicated icon appears in the status icons column instead of the clock interaction. Shows the timer icon when idle and remaining time when running. Toggled from the Taskbar settings pane. New config options: - bar.clock.timer.enabled (bool, default true) - enable/disable the feature - bar.clock.timer.soundFile (string) - path to sound file played on finish - bar.status.showTimer (bool, default false) - show as status icon instead
26e53f0 to
81f71ac
Compare
a465a0d to
319ece5
Compare
Contributor
Author
|
There is a bug found with timer dedicated button isn't turning off. I'll mark PR as a draft till I fix it. |
added 9 commits
May 26, 2026 17:58
- Replaced StackLayout with animated Items using y-offset bindings - Each tab uses y: (n - timerPanelTab) * parent.height with Anim.DefaultSpatial - Moved back button into each tab as BackBtn component so it slides with content - Removed static back button from DateTime.qml
Reminder functionality was already implemented in a separate commit by another contributor. Removed all reminder-specific code: - deleted ReminderService.qml - removed Reminder tab from DashTimerPanel (now 2 tabs: Timer + Alarm) - stripped reminder properties and views from Calendar.qml - removed reminderPickedDate from DashboardState - cleaned up FiringOverlay, Wrapper, Bar references to ReminderService
LockState singleton propagates WlSessionLock state. Wrapper.qml checks LockState.locked before opening fire overlay - defers until session unlocks.
SpinGroup was breaking its value binding via internal assignment (spinGroup.value = v). When the timer started, the binding to TimerService.remainingSeconds was already broken from previous user input. Now SpinGroup only emits valueModified - value is always controlled by the external binding, which ticks correctly.
root._store is not a valid property reference - _store is a child object accessible by ID directly, not as a property of root.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds a countdown timer to the bar.
How it works
Hover over the clock - a popout slides out with hour/minute/second inputs. You can type values directly or use the arrow buttons. Hit Start. While the timer runs a small indicator shows up under the clock with the remaining time. When it finishes, the popout reopens automatically with a bongo cat and a Dismiss button. An optional sound plays on finish.
The timer survives shell reloads - if you restart Quickshell mid-timer it picks back up where it left off.
Config (
shell.jsonunderbar.clock.timer):enabled(bool, defaulttrue) - enable or disable the whole featuresoundFile(string) - path to a wav/ogg file to play on finish, defaults to the includedassets/timer-done.wavOptional: timer as a status icon
There's also
bar.status.showTimer(defaultfalse), togglable from the Taskbar settings pane (Status Icons row, after Capslock). When on, a dedicated timer icon appears in the status icons column instead of the clock being interactive - the icon shows remaining time while running, and hovering it opens the same popout.Files changed
services/TimerService.qml- new singleton, handles state + persistencemodules/bar/popouts/TimerPopout.qml- new popout UImodules/bar/popouts/PopoutState.qml- addedlockedproperty to prevent hover from closing the done notificationmodules/bar/popouts/Wrapper.qml- keyboard focus + locked aliasmodules/bar/popouts/Content.qml- register TimerPopoutmodules/bar/Bar.qml- wire up clock hover + timer finish handlermodules/bar/components/Clock.qml- running indicator under clockmodules/bar/components/StatusIcons.qml- optional timer status iconmodules/drawers/Interactions.qml- respect locked when mouse leaves barmodules/controlcenter/taskbar/TaskbarPane.qml- Timer toggle in settingsplugin/src/Caelestia/Config/barconfig.hpp- new config propertiesassets/timer-done.wav- default sound (three beeps)