├── .gitignore ├── Icons ├── timeglass.icns ├── timeglass.png ├── timeglass1.png ├── timeglass10.png ├── timeglass11.png ├── timeglass12.png ├── timeglass13.png ├── timeglass14.png ├── timeglass15.png ├── timeglass16.png ├── timeglass17.png ├── timeglass18.png ├── timeglass19.png ├── timeglass2.png ├── timeglass20.png ├── timeglass21.png ├── timeglass22.png ├── timeglass23.png ├── timeglass24.png ├── timeglass25.png ├── timeglass26.png ├── timeglass27.png ├── timeglass28.png ├── timeglass29.png ├── timeglass3.png ├── timeglass30.png ├── timeglass31.png ├── timeglass32.png ├── timeglass33.png ├── timeglass34.png ├── timeglass35.png ├── timeglass36.png ├── timeglass37.png ├── timeglass38.png ├── timeglass39.png ├── timeglass4.png ├── timeglass40.png ├── timeglass41.png ├── timeglass42.png ├── timeglass43.png ├── timeglass44.png ├── timeglass45.png ├── timeglass46.png ├── timeglass47.png ├── timeglass48.png ├── timeglass49.png ├── timeglass5.png ├── timeglass50.png ├── timeglass51.png ├── timeglass52.png ├── timeglass53.png ├── timeglass54.png ├── timeglass55.png ├── timeglass56.png ├── timeglass57.png ├── timeglass58.png ├── timeglass59.png ├── timeglass6.png ├── timeglass60.png ├── timeglass61.png ├── timeglass62.png ├── timeglass63.png ├── timeglass64.png ├── timeglass65.png ├── timeglass66.png ├── timeglass67.png ├── timeglass68.png ├── timeglass69.png ├── timeglass7.png ├── timeglass70.png ├── timeglass71.png ├── timeglass72.png ├── timeglass73.png ├── timeglass74.png ├── timeglass75.png ├── timeglass76.png ├── timeglass77.png ├── timeglass78.png ├── timeglass79.png ├── timeglass8.png ├── timeglass80.png ├── timeglass81.png ├── timeglass82.png ├── timeglass83.png ├── timeglass84.png ├── timeglass85.png ├── timeglass86.png ├── timeglass87.png ├── timeglass88.png ├── timeglass89.png ├── timeglass9.png └── timeglass_inverted.png ├── Images ├── menu_bar.png └── menu_bar2.png ├── LICENSE ├── README.md ├── icon_manager.py ├── requirements.txt ├── timeglass.py ├── timeglass.spec ├── timeglass_old_mac.spec └── timekeeper.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.DS_Store 2 | build 3 | dist 4 | __* 5 | 6 | -------------------------------------------------------------------------------- /Icons/timeglass.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass.icns -------------------------------------------------------------------------------- /Icons/timeglass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass.png -------------------------------------------------------------------------------- /Icons/timeglass1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass1.png -------------------------------------------------------------------------------- /Icons/timeglass10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass10.png -------------------------------------------------------------------------------- /Icons/timeglass11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass11.png -------------------------------------------------------------------------------- /Icons/timeglass12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass12.png -------------------------------------------------------------------------------- /Icons/timeglass13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass13.png -------------------------------------------------------------------------------- /Icons/timeglass14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass14.png -------------------------------------------------------------------------------- /Icons/timeglass15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass15.png -------------------------------------------------------------------------------- /Icons/timeglass16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass16.png -------------------------------------------------------------------------------- /Icons/timeglass17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass17.png -------------------------------------------------------------------------------- /Icons/timeglass18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass18.png -------------------------------------------------------------------------------- /Icons/timeglass19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass19.png -------------------------------------------------------------------------------- /Icons/timeglass2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass2.png -------------------------------------------------------------------------------- /Icons/timeglass20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass20.png -------------------------------------------------------------------------------- /Icons/timeglass21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass21.png -------------------------------------------------------------------------------- /Icons/timeglass22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass22.png -------------------------------------------------------------------------------- /Icons/timeglass23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass23.png -------------------------------------------------------------------------------- /Icons/timeglass24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass24.png -------------------------------------------------------------------------------- /Icons/timeglass25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass25.png -------------------------------------------------------------------------------- /Icons/timeglass26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass26.png -------------------------------------------------------------------------------- /Icons/timeglass27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass27.png -------------------------------------------------------------------------------- /Icons/timeglass28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass28.png -------------------------------------------------------------------------------- /Icons/timeglass29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass29.png -------------------------------------------------------------------------------- /Icons/timeglass3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass3.png -------------------------------------------------------------------------------- /Icons/timeglass30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass30.png -------------------------------------------------------------------------------- /Icons/timeglass31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass31.png -------------------------------------------------------------------------------- /Icons/timeglass32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass32.png -------------------------------------------------------------------------------- /Icons/timeglass33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass33.png -------------------------------------------------------------------------------- /Icons/timeglass34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass34.png -------------------------------------------------------------------------------- /Icons/timeglass35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass35.png -------------------------------------------------------------------------------- /Icons/timeglass36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass36.png -------------------------------------------------------------------------------- /Icons/timeglass37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass37.png -------------------------------------------------------------------------------- /Icons/timeglass38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass38.png -------------------------------------------------------------------------------- /Icons/timeglass39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass39.png -------------------------------------------------------------------------------- /Icons/timeglass4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass4.png -------------------------------------------------------------------------------- /Icons/timeglass40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass40.png -------------------------------------------------------------------------------- /Icons/timeglass41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass41.png -------------------------------------------------------------------------------- /Icons/timeglass42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass42.png -------------------------------------------------------------------------------- /Icons/timeglass43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass43.png -------------------------------------------------------------------------------- /Icons/timeglass44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass44.png -------------------------------------------------------------------------------- /Icons/timeglass45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass45.png -------------------------------------------------------------------------------- /Icons/timeglass46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass46.png -------------------------------------------------------------------------------- /Icons/timeglass47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass47.png -------------------------------------------------------------------------------- /Icons/timeglass48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass48.png -------------------------------------------------------------------------------- /Icons/timeglass49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass49.png -------------------------------------------------------------------------------- /Icons/timeglass5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass5.png -------------------------------------------------------------------------------- /Icons/timeglass50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass50.png -------------------------------------------------------------------------------- /Icons/timeglass51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass51.png -------------------------------------------------------------------------------- /Icons/timeglass52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass52.png -------------------------------------------------------------------------------- /Icons/timeglass53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass53.png -------------------------------------------------------------------------------- /Icons/timeglass54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass54.png -------------------------------------------------------------------------------- /Icons/timeglass55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass55.png -------------------------------------------------------------------------------- /Icons/timeglass56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass56.png -------------------------------------------------------------------------------- /Icons/timeglass57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass57.png -------------------------------------------------------------------------------- /Icons/timeglass58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass58.png -------------------------------------------------------------------------------- /Icons/timeglass59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass59.png -------------------------------------------------------------------------------- /Icons/timeglass6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass6.png -------------------------------------------------------------------------------- /Icons/timeglass60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass60.png -------------------------------------------------------------------------------- /Icons/timeglass61.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass61.png -------------------------------------------------------------------------------- /Icons/timeglass62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass62.png -------------------------------------------------------------------------------- /Icons/timeglass63.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass63.png -------------------------------------------------------------------------------- /Icons/timeglass64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass64.png -------------------------------------------------------------------------------- /Icons/timeglass65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass65.png -------------------------------------------------------------------------------- /Icons/timeglass66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass66.png -------------------------------------------------------------------------------- /Icons/timeglass67.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass67.png -------------------------------------------------------------------------------- /Icons/timeglass68.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass68.png -------------------------------------------------------------------------------- /Icons/timeglass69.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass69.png -------------------------------------------------------------------------------- /Icons/timeglass7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass7.png -------------------------------------------------------------------------------- /Icons/timeglass70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass70.png -------------------------------------------------------------------------------- /Icons/timeglass71.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass71.png -------------------------------------------------------------------------------- /Icons/timeglass72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass72.png -------------------------------------------------------------------------------- /Icons/timeglass73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass73.png -------------------------------------------------------------------------------- /Icons/timeglass74.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass74.png -------------------------------------------------------------------------------- /Icons/timeglass75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass75.png -------------------------------------------------------------------------------- /Icons/timeglass76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass76.png -------------------------------------------------------------------------------- /Icons/timeglass77.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass77.png -------------------------------------------------------------------------------- /Icons/timeglass78.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass78.png -------------------------------------------------------------------------------- /Icons/timeglass79.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass79.png -------------------------------------------------------------------------------- /Icons/timeglass8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass8.png -------------------------------------------------------------------------------- /Icons/timeglass80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass80.png -------------------------------------------------------------------------------- /Icons/timeglass81.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass81.png -------------------------------------------------------------------------------- /Icons/timeglass82.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass82.png -------------------------------------------------------------------------------- /Icons/timeglass83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass83.png -------------------------------------------------------------------------------- /Icons/timeglass84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass84.png -------------------------------------------------------------------------------- /Icons/timeglass85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass85.png -------------------------------------------------------------------------------- /Icons/timeglass86.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass86.png -------------------------------------------------------------------------------- /Icons/timeglass87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass87.png -------------------------------------------------------------------------------- /Icons/timeglass88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass88.png -------------------------------------------------------------------------------- /Icons/timeglass89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass89.png -------------------------------------------------------------------------------- /Icons/timeglass9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass9.png -------------------------------------------------------------------------------- /Icons/timeglass_inverted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Icons/timeglass_inverted.png -------------------------------------------------------------------------------- /Images/menu_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Images/menu_bar.png -------------------------------------------------------------------------------- /Images/menu_bar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mountwebs/timeglass/2f527e190cb90199cdd3a29ea7625e1f561fe01c/Images/menu_bar2.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 mountwebs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Timeglass 2 | Timeglass is a simple, unobtrusive menu bar timer for macOS. Rather than showing exact time in minutes and seconds, it visually represents time with a minimalistic hour glass icon in the menu bar. 3 | 4 | ![](Images/menu_bar2.png) 5 | 6 | ## Installation 7 | Download last version [here](https://github.com/mountwebs/timeglass/releases) and open it. 8 | 9 | You might have to right click/control-click and select open if you get a warning that the app is from an unidentified developer. Move it to Applications if you want. 10 | 11 | You can also build it yourself if you have pyinstaller installed. ("pyinstaller --onefile -w --add-data "Icons/:Icons" timeglass.spec".) 12 | 13 | ## Features 14 | - Represents time with a simple icon. 15 | - Set whatever time you want. 16 | - Shows a simple alert with sound when time is up. 17 | - Supports dark mode. 18 | 19 | ## Roadmap 20 | - Adding a simple preference pane. 21 | - Add ability to remove alert and/or sound. 22 | - Add timeglass icon in alert. 23 | - Simplify and prettify the animation. 24 | 25 | Possible improvements: 26 | - Add some time presets (and maybe let the user choose presets from preferences). 27 | - Add global hotkeys (as a possibility) 28 | - Add pomodoro support (with auto breaks etc.). 29 | 30 | ## Contributions 31 | Pull requests and suggestions are welcome! Write me a mail at mountwebs[at]gmail.com or open an issue if you have a suggestion for imrovement. 32 | 33 | ## About 34 | Timeglass is made with [rumps](https://github.com/jaredks/rumps) and the app is built with [pyinstaller](https://github.com/pyinstaller/pyinstaller). 35 | 36 | Read some feedback, praise and suggestions at [reddit](https://www.reddit.com/r/Python/comments/gf4boc/i_created_my_first_app_timeglass_a_simple/). 37 | 38 | This is my first python "app". Feedback is appreaciated: mountwebs[at]gmail.com. 39 | 40 | ## License 41 | [MIT](LICENSE) 42 | -------------------------------------------------------------------------------- /icon_manager.py: -------------------------------------------------------------------------------- 1 | import os, sys 2 | 3 | class Icon_manager(): 4 | def __init__(self, initial_seconds): 5 | self.cli = False 6 | self.icon_steps = 88 # 1-89 7 | self.icon_counter = 1 8 | self.active = False 9 | self.icon_interval = initial_seconds / self.icon_steps 10 | self.path = "Icons/" 11 | self.icon_path = self.get_icon_path() 12 | self.inverted = False 13 | 14 | def set_icon_interval(self,seconds): 15 | self.icon_interval = seconds / self.icon_steps 16 | 17 | def reset(self): 18 | self.active = False 19 | self.icon_counter = 1 20 | 21 | def resource_path(self,relative_path): 22 | """ Get absolute path to resource, works for dev and for PyInstaller """ 23 | base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) 24 | return os.path.join(base_path, relative_path) 25 | 26 | def invert(self): 27 | if self.inverted: 28 | filename = os.path.join(self.path,"timeglass.png") 29 | self.inverted = False 30 | else: 31 | filename = os.path.join(self.path,"timeglass_inverted.png") 32 | self.inverted = True 33 | 34 | if not self.cli: 35 | return os.path.join(self.resource_path(filename)) 36 | else: 37 | return filename 38 | 39 | def get_icon_path(self): 40 | if self.active: 41 | filename = os.path.join(self.path,f"timeglass{self.icon_counter}.png") 42 | else: 43 | filename = os.path.join(self.path,"timeglass.png") 44 | if not self.cli: 45 | icon_path = os.path.join(self.resource_path(filename)) 46 | else: 47 | icon_path = filename 48 | return icon_path 49 | 50 | 51 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | appdirs==1.4.3 2 | distlib==0.3.0 3 | filelock==3.0.12 4 | importlib-metadata==1.6.0 5 | pbr==5.4.5 6 | pyobjc-core==6.2 7 | pyobjc-framework-Cocoa==6.2 8 | rumps==0.3.0 9 | six==1.14.0 10 | stevedore==1.32.0 11 | virtualenv==20.0.20 12 | virtualenv-clone==0.5.4 13 | virtualenvwrapper==4.8.4 14 | zipp==3.1.0 15 | -------------------------------------------------------------------------------- /timeglass.py: -------------------------------------------------------------------------------- 1 | import rumps 2 | import sys 3 | import icon_manager 4 | from datetime import timedelta 5 | import timekeeper 6 | import os 7 | 8 | # pyinstaller --onefile -w --add-data "Icons/:Icons" --icon="Icons/timeglass.png" --clean timeglass.spec 9 | 10 | # rumps.debug_mode(True) 11 | 12 | class TimerApp(rumps.App): 13 | def __init__(self, initial_seconds): 14 | super(TimerApp, self).__init__("") 15 | self.mode = "hourglass" 16 | self.timekeeper = timekeeper.Timer(initial_seconds) 17 | self.template = True 18 | self.im = icon_manager.Icon_manager(initial_seconds) 19 | self.change_icon() 20 | self.remaining_sec = rumps.MenuItem(self.timekeeper.get_remaining_string()) 21 | self.menu = [self.remaining_sec] 22 | self.next_icon_change = self.im.icon_interval 23 | self.rumps_timer = rumps.Timer(self.tick,0.5) 24 | self.rumps_timer.callback(self.tick) 25 | self.invert_counter = 0 26 | self.notified = False 27 | self.sound = True 28 | 29 | def change_icon(self): 30 | print("frame:", self.im.icon_counter) 31 | self.icon = self.im.get_icon_path() 32 | 33 | def change_remaining(self): 34 | self.remaining_sec.title = self.timekeeper.get_remaining_string() 35 | 36 | def tick(self, _): 37 | if self.timekeeper.tick(): 38 | self.notDone = True 39 | self.invert_counter = 0 40 | self.change_remaining() 41 | if self.timekeeper.elapsed >= self.next_icon_change: 42 | self.im.icon_counter = int(self.timekeeper.elapsed/self.im.icon_interval) + 1 #1-89 43 | self.change_icon() 44 | self.next_icon_change += self.im.icon_interval 45 | 46 | if self.timekeeper.done: 47 | self.im.active = False 48 | self.change_icon() 49 | if not self.notified: 50 | self.notify() 51 | self.notified = True 52 | if self.notDone: 53 | self.icon = self.im.invert() 54 | self.invert_counter += 1 55 | if self.invert_counter > 5: 56 | self.notDone = False 57 | self.rumps_timer.stop() 58 | self.reset() 59 | 60 | def notify(self): 61 | title = "Time is up!" 62 | text = "" 63 | sound = "Glass" 64 | try: 65 | if self.sound: 66 | os.system("""osascript -e 'display notification "{}" with title "{}" sound name "{}"'""".format(text, title, sound)) 67 | else: 68 | os.system("""osascript -e 'display notification "{}" with title "{}"'""".format(text, title, sound)) 69 | except: 70 | print("Could not send notification") 71 | 72 | @rumps.clicked("Start", key="s") 73 | def pause(self, sender): 74 | if sender.title == "Pause": 75 | self.timekeeper.pause_timer() 76 | self.rumps_timer.stop() 77 | sender.title = "Start" 78 | elif sender.title == "Start": 79 | self.timekeeper.start() 80 | self.im.active = True 81 | self.change_icon() 82 | self.rumps_timer.start() 83 | sender.title = "Pause" 84 | 85 | @rumps.clicked("Reset", key="r") 86 | def reset_button(self, sender): 87 | self.reset() 88 | self.menu["Start"].title = "Start" 89 | 90 | def reset(self): 91 | self.timekeeper.reset() 92 | self.rumps_timer.stop() 93 | self.im.active = False 94 | self.im.reset() 95 | self.change_icon() 96 | self.change_remaining() 97 | self.next_icon_change = self.im.icon_interval 98 | self.menu["Start"].title = "Start" 99 | self.notified = False 100 | 101 | def string_to_sec(self, text): 102 | nums = text.split(":") 103 | nums.reverse() 104 | seconds = 0 105 | for i,n in enumerate(nums): 106 | if i == 0: 107 | seconds += int(n) 108 | else: 109 | seconds += (60**i) * int(n) 110 | print((i * 60) * int(n)) 111 | return seconds 112 | 113 | def validate_input(self, text): 114 | texts = text.split(":") 115 | if len(texts)>3: return False 116 | for s in texts: 117 | try: 118 | int(s) 119 | except: 120 | return False 121 | return True 122 | 123 | @rumps.clicked("Set time", key="t") 124 | def set_time(self, _): 125 | self.timekeeper.pause_timer() 126 | response = rumps.Window("Enter time: (hours:minutes:seconds)").run() 127 | if response.clicked: 128 | if not self.validate_input(response.text): 129 | skip = True 130 | rumps.alert("Does not compute! Please try again.") 131 | 132 | else: 133 | seconds = self.string_to_sec(response.text) 134 | print(seconds) 135 | skip = False 136 | 137 | if not skip: 138 | self.rumps_timer.stop() 139 | self.timekeeper.set_time(seconds) 140 | self.im.set_icon_interval(seconds) 141 | self.im.reset() 142 | self.im.active = False 143 | self.next_icon_change = self.im.icon_interval 144 | self.change_icon() 145 | self.change_remaining() 146 | self.menu["Start"].title = "Start" 147 | 148 | if __name__ == "__main__": 149 | default_secounds = 60 * 60 150 | TimerApp(default_secounds).run() 151 | -------------------------------------------------------------------------------- /timeglass.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python ; coding: utf-8 -*- 2 | 3 | block_cipher = None 4 | 5 | 6 | a = Analysis(['timeglass.py'], 7 | binaries=[], 8 | datas=[('Icons/', 'Icons')], 9 | hiddenimports=[], 10 | hookspath=[], 11 | runtime_hooks=[], 12 | excludes=[], 13 | win_no_prefer_redirects=False, 14 | win_private_assemblies=False, 15 | cipher=block_cipher, 16 | noarchive=False) 17 | pyz = PYZ(a.pure, a.zipped_data, 18 | cipher=block_cipher) 19 | exe = EXE(pyz, 20 | a.scripts, 21 | a.binaries, 22 | a.zipfiles, 23 | a.datas, 24 | [], 25 | name='timeglass', 26 | debug=False, 27 | bootloader_ignore_signals=False, 28 | strip=False, 29 | upx=True, 30 | upx_exclude=[], 31 | runtime_tmpdir=None, 32 | console=False , icon='Icons/timeglass.png') 33 | 34 | app = BUNDLE(exe, 35 | name='timeglass.app', 36 | icon='Icons/timeglass.icns', 37 | bundle_identifier=None, 38 | info_plist={ 39 | 'LSUIElement': 'True' 40 | }) 41 | -------------------------------------------------------------------------------- /timeglass_old_mac.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python ; coding: utf-8 -*- 2 | 3 | block_cipher = None 4 | 5 | 6 | a = Analysis(['timeglass.py'], 7 | binaries=[('/System/Library/Frameworks/Tk.framework/Tk','tk'), ('/System/Library/Frameworks/Tcl.framework/Tcl','tcl')], 8 | datas=[('Icons/', 'Icons')], 9 | hiddenimports=[], 10 | hookspath=[], 11 | runtime_hooks=[], 12 | excludes=[], 13 | win_no_prefer_redirects=False, 14 | win_private_assemblies=False, 15 | cipher=block_cipher, 16 | noarchive=False) 17 | pyz = PYZ(a.pure, a.zipped_data, 18 | cipher=block_cipher) 19 | exe = EXE(pyz, 20 | a.scripts, 21 | a.binaries, 22 | a.zipfiles, 23 | a.datas, 24 | [], 25 | name='timeglass', 26 | debug=False, 27 | bootloader_ignore_signals=False, 28 | strip=False, 29 | upx=True, 30 | upx_exclude=[], 31 | runtime_tmpdir=None, 32 | console=False , icon='Icons/timeglass.png') 33 | 34 | app = BUNDLE(exe, 35 | name='timeglass.app', 36 | icon='Icons/timeglass.icns', 37 | bundle_identifier=None, 38 | info_plist={ 39 | 'LSUIElement': 'True' 40 | }) -------------------------------------------------------------------------------- /timekeeper.py: -------------------------------------------------------------------------------- 1 | import time 2 | from datetime import timedelta 3 | 4 | class Timer(): 5 | def __init__(self,seconds): 6 | self.initial = seconds 7 | self.remaining = seconds 8 | self.elapsed = 0 9 | self.pause = False 10 | self.done = False 11 | self.active = False 12 | self.last_tick = time.time() 13 | self.start_time = None 14 | self.elapsed_at_pause = 0 15 | 16 | def get_remaining_string(self): 17 | conversion = timedelta(seconds=int(self.remaining)) 18 | return str(conversion) 19 | 20 | def start(self): 21 | self.active = True 22 | self.pause = False 23 | self.done = False 24 | self.last_tick = time.time() 25 | self.start_time = time.time() 26 | 27 | def pause_timer(self): 28 | self.active = False 29 | self.pause = True 30 | self.elapsed_at_pause = self.elapsed 31 | 32 | def tick(self): 33 | if self.remaining <= 0 and self.active: 34 | self.remaining = 0 35 | self.done = True 36 | self.active = False 37 | elif self.active and not self.done: 38 | now = time.time() 39 | self.elapsed = now - self.start_time + self.elapsed_at_pause 40 | self.remaining = self.initial - self.elapsed 41 | return True 42 | return False 43 | 44 | def set_time(self, seconds): 45 | self.initial = seconds 46 | self.reset() 47 | 48 | def reset(self): 49 | self.done = False 50 | self.active = False 51 | self.elapsed = 0 52 | self.remaining = self.initial 53 | self.elapsed_at_pause = 0 54 | 55 | def __str__(self): 56 | return(f"remaining: {self.remaining}, elapsed: {self.elapsed}") 57 | 58 | --------------------------------------------------------------------------------