├── .gitignore ├── Makefile ├── README.md ├── preferences.png ├── screenshot.png └── time_tracker_jsnjack@gmail.com ├── extension.js ├── locale ├── de │ └── LC_MESSAGES │ │ ├── time-tracker.mo │ │ └── time-tracker.po ├── fr │ └── LC_MESSAGES │ │ ├── time-tracker.mo │ │ └── time-tracker.po └── ru │ └── LC_MESSAGES │ ├── ru.po │ └── time-tracker.mo ├── metadata.json ├── prefs.js ├── schemas ├── gschemas.compiled └── org.gnome.shell.extensions.time-tracker.gschema.xml ├── stylesheet.css └── time-tracker.pot /.gitignore: -------------------------------------------------------------------------------- 1 | #komodo project 2 | *.komodoproject 3 | 4 | #gedit backups 5 | *.*~ 6 | 7 | # Byte-compiled / optimized / DLL files 8 | __pycache__/ 9 | *.py[cod] 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | env/ 17 | bin/ 18 | build/ 19 | develop-eggs/ 20 | dist/ 21 | eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | *.egg-info/ 28 | .installed.cfg 29 | *.egg 30 | 31 | # Installer logs 32 | pip-log.txt 33 | pip-delete-this-directory.txt 34 | 35 | # Unit test / coverage reports 36 | htmlcov/ 37 | .tox/ 38 | .coverage 39 | .cache 40 | nosetests.xml 41 | coverage.xml 42 | 43 | # Mr Developer 44 | .mr.developer.cfg 45 | .project 46 | .pydevproject 47 | 48 | # Rope 49 | .ropeproject 50 | 51 | # Django stuff: 52 | *.log 53 | 54 | # Sphinx documentation 55 | docs/_build/ 56 | 57 | time_tracker_jsnjack@gmail.com.shell-extension.zip 58 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | TT_PO = `find ./time_tracker_jsnjack@gmail.com/locale -name *.po` 2 | DOMAIN = time-tracker 3 | 4 | .DEFAULT_GOAL := all 5 | 6 | .PHONY: update_po 7 | update_po: time_tracker_jsnjack@gmail.com/time-tracker.pot 8 | for item in $(TT_PO); do \ 9 | echo "Processing" $$item; \ 10 | xgettext --from-code=UTF-8 --output=$$item.tmp ./time_tracker_jsnjack@gmail.com/*.js; \ 11 | msgmerge -U $$item $$item.tmp; \ 12 | rm -f $$item.tmp; \ 13 | msgfmt -c $$item -o `dirname $$item`/${DOMAIN}.mo; \ 14 | done; 15 | 16 | time_tracker_jsnjack@gmail.com/time-tracker.pot: time_tracker_jsnjack@gmail.com/*.js 17 | xgettext --from-code=UTF-8 --output=$@.tmp ./time_tracker_jsnjack@gmail.com/*.js 18 | msgmerge -U $@ $@.tmp 19 | rm -f $@.tmp 20 | 21 | time_tracker_jsnjack@gmail.com/schemas/gschemas.compiled: time_tracker_jsnjack@gmail.com/schemas/org.gnome.shell.extensions.time-tracker.gschema.xml 22 | glib-compile-schemas time_tracker_jsnjack@gmail.com/schemas/ 23 | 24 | time_tracker_jsnjack@gmail.com.shell-extension.zip: ./time_tracker_jsnjack@gmail.com/*.* time_tracker_jsnjack@gmail.com/schemas/gschemas.compiled 25 | rm -rf build/ 26 | cp -R time_tracker_jsnjack@gmail.com build 27 | find ./build -type f -name *.po -delete 28 | find ./build -type f -name *.po~ -delete 29 | find ./build -type f -name "*.pot" -delete 30 | find ./build -type f -name "*.pot~" -delete 31 | cd build && zip -qr time_tracker_jsnjack@gmail.com.shell-extension.zip . && mv time_tracker_jsnjack@gmail.com.shell-extension.zip ../ 32 | rm -rf build 33 | 34 | build: update_po time_tracker_jsnjack@gmail.com/schemas/gschemas.compiled 35 | 36 | all: build time_tracker_jsnjack@gmail.com.shell-extension.zip 37 | 38 | install: time_tracker_jsnjack@gmail.com.shell-extension.zip 39 | gnome-extensions install ./time_tracker_jsnjack@gmail.com.shell-extension.zip --force 40 | 41 | launch: 42 | dbus-run-session -- gnome-shell --nested --wayland 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | time-tracker 2 | ============ 3 | ![ScreenShot](https://raw.githubusercontent.com/e-shulitsky/time-tracker/master/screenshot.png) 4 | ![ScreenShot](https://raw.githubusercontent.com/e-shulitsky/time-tracker/master/preferences.png) 5 | 6 | ### About 7 | GNOME Shell extension for time tracking 8 | 9 | ### Install 10 | Turn it On on https://extensions.gnome.org/extension/823/time-tracker/ 11 | 12 | or 13 | 14 | Clone it to `~/.local/share/gnome-shell/extensions/time_tracker_jsnjack@gmail.com` and enable in GNOME Tweak Tool 15 | -------------------------------------------------------------------------------- /preferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsnjack/time-tracker/d7222aabda8e7e327b716150c4735a513ea0f376/preferences.png -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsnjack/time-tracker/d7222aabda8e7e327b716150c4735a513ea0f376/screenshot.png -------------------------------------------------------------------------------- /time_tracker_jsnjack@gmail.com/extension.js: -------------------------------------------------------------------------------- 1 | /* jshint moz:true, unused: false */ 2 | /* exported init, enable, disable */ 3 | import * as Main from 'resource:///org/gnome/shell/ui/main.js'; 4 | import GLib from 'gi://GLib'; 5 | import * as MessageTray from 'resource:///org/gnome/shell/ui/messageTray.js'; 6 | import St from 'gi://St'; 7 | import GObject from 'gi://GObject'; 8 | import { Extension, gettext as _ } from 'resource:///org/gnome/shell/extensions/extension.js'; 9 | 10 | let start_time, indicator, start_time_string, settings, timeout, 11 | self, 12 | preferences_button_name, 13 | restart_button_name, 14 | toggle_button_name; 15 | 16 | const TTNotificationBanner = GObject.registerClass({ 17 | GTypeName: 'MyNSource' 18 | }, class TTNotificationBanner extends MessageTray.NotificationBanner { 19 | addAction(label, callback) { 20 | // Style buttons 21 | let extra_style = ""; 22 | 23 | // Redefining label is required for translation 24 | label = _(label); 25 | if (label === restart_button_name) { 26 | extra_style = " button-restart"; 27 | } else if (label === toggle_button_name) { 28 | if (settings.get_boolean("paused")) { 29 | label = _("Resume"); 30 | extra_style = " button-resume"; 31 | } else { 32 | label = _("Pause"); 33 | extra_style = " button-pause"; 34 | } 35 | } 36 | const button = new St.Button({ 37 | style_class: 'notification-button' + extra_style, 38 | label: label, 39 | x_expand: true, 40 | can_focus: true 41 | }); 42 | 43 | return this.addButton(button, callback); 44 | } 45 | }); 46 | 47 | const TTSource = GObject.registerClass({ 48 | GTypeName: 'MySource' 49 | }, class TTSource extends MessageTray.Source { 50 | createBanner(notification) { 51 | return new TTNotificationBanner(notification); 52 | } 53 | }); 54 | 55 | function _refresh() { 56 | // Get difference between start time and current time 57 | // and show it 58 | let current_time = new Date(), 59 | difference, timer; 60 | // Check if start_time needs update: 61 | if (settings.get_boolean("update-start-time")) { 62 | start_time_string = settings.get_string('start-time'); 63 | start_time = new Date(start_time_string); 64 | settings.set_boolean("update-start-time", false); 65 | } 66 | // Check if indicator style needs update: 67 | if (settings.get_boolean("update-indicator-style")) { 68 | update_indicator_style(); 69 | settings.set_boolean("update-indicator-style", false); 70 | } 71 | // If in pause, than show the difference between start_time and pause-start-time 72 | if (settings.get_boolean("paused")) { 73 | current_time = new Date(settings.get_string("pause-start-time")); 74 | } 75 | // Get difference between two times in secs 76 | difference = Math.round((current_time - start_time - settings.get_int("pause-duration")) / 1000); 77 | const hours = parseInt(difference / 3600, 10); 78 | if (hours !== 0) { 79 | difference = difference - hours * 3600; 80 | } 81 | const mins = parseInt(difference / 60, 10); 82 | if (mins !== 0) { 83 | difference = difference - mins * 60; 84 | } 85 | const secs = difference; 86 | // Prepare timer info 87 | if (settings.get_boolean('show-seconds') === true) { 88 | timer = "%d:%02d:%02d".format(hours, mins, secs); 89 | } else { 90 | timer = "%d:%02d".format(hours, mins); 91 | } 92 | indicator.set_label(timer); 93 | } 94 | 95 | function _restart() { 96 | // Restart timer. Set new value for start_time 97 | const message_body = start_time.toLocaleString(), 98 | message_title = _("Timer was started at"), 99 | source = new TTSource(_("Time tracker"), "preferences-system-time-symbolic"), 100 | notification = new MessageTray.Notification(source, message_title, message_body); 101 | 102 | // Add buttons 103 | notification.addAction(preferences_button_name, on_preferences); 104 | notification.addAction(toggle_button_name, on_toggle); 105 | notification.addAction(restart_button_name, on_reset); 106 | 107 | // Notification disapears from tray after it was showed 108 | notification.setTransient(true); 109 | 110 | Main.messageTray.add(source); 111 | source.showNotification(notification); 112 | } 113 | 114 | function update_indicator_style() { 115 | // Updates style of the indicator 116 | if (!settings.get_boolean("paused")) { 117 | indicator.set_style("color: " + settings.get_string("indicator-color") + ";"); 118 | } else { 119 | indicator.set_style("color: " + settings.get_string("indicator-paused-color") + ";"); 120 | } 121 | } 122 | 123 | function on_preferences() { 124 | // Show GNOME Shell preferences 125 | self.openPreferences(); 126 | return 0; 127 | } 128 | 129 | function on_reset() { 130 | start_time = new Date(); 131 | settings.set_string('start-time', start_time.toString()); 132 | settings.set_int('pause-duration', 0); 133 | settings.set_boolean('paused', false); 134 | update_indicator_style(); 135 | } 136 | 137 | function on_toggle() { 138 | // Handle pause button 139 | let state = settings.get_boolean("paused"), 140 | current_time, pause_start_time; 141 | if (!state) { 142 | // Pause timer 143 | current_time = new Date(); 144 | settings.set_string('pause-start-time', current_time.toString()); 145 | settings.set_boolean("paused", true); 146 | } else { 147 | // Resume timer 148 | current_time = new Date(); 149 | pause_start_time = new Date(settings.get_string('pause-start-time')); 150 | settings.set_int('pause-duration', settings.get_int('pause-duration') + (current_time - pause_start_time)); 151 | settings.set_boolean("paused", false); 152 | } 153 | update_indicator_style(); 154 | } 155 | 156 | export default class TimeTracker extends Extension { 157 | enable() { 158 | preferences_button_name = _("Preferences"); 159 | restart_button_name = _("Restart"); 160 | toggle_button_name = _("Pause/Resume"); 161 | 162 | indicator = new St.Button({ 163 | style_class: 'panel-button', 164 | }); 165 | settings = this.getSettings(); 166 | self = this; 167 | update_indicator_style(); 168 | // Get start_time from settings 169 | start_time_string = settings.get_string('start-time'); 170 | start_time = new Date(start_time_string); 171 | // If creation of Date object failed, create a new one 172 | if (isNaN(start_time.getHours())) { 173 | start_time = new Date(); 174 | settings.set_string('start-time', start_time.toString()); 175 | } 176 | indicator.set_label('Time Tracker'); 177 | timeout = GLib.timeout_add(1000, GLib.PRIORITY_LOW, function () { 178 | _refresh(); 179 | return true; 180 | }); 181 | indicator.connect('button-press-event', _restart); 182 | 183 | Main.panel._rightBox.insert_child_at_index(indicator, 0); 184 | 185 | const paused_by_screen_lock = settings.get_boolean('paused-by-screen-lock'); 186 | const paused = settings.get_boolean("paused"); 187 | if (paused_by_screen_lock && paused) { 188 | on_toggle(); 189 | } 190 | settings.set_boolean('paused-by-screen-lock', false); 191 | } 192 | 193 | disable() { 194 | const pause_during_screen_lock = settings.get_boolean('pause-during-screen-lock'); 195 | const paused = settings.get_boolean("paused"); 196 | if (pause_during_screen_lock && !paused) { 197 | on_toggle(); 198 | settings.set_boolean('paused-by-screen-lock', true); 199 | } 200 | 201 | indicator.destroy(); 202 | GLib.Source.remove(timeout); 203 | indicator = null; 204 | settings = null; 205 | self = null; 206 | } 207 | } 208 | -------------------------------------------------------------------------------- /time_tracker_jsnjack@gmail.com/locale/de/LC_MESSAGES/time-tracker.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsnjack/time-tracker/d7222aabda8e7e327b716150c4735a513ea0f376/time_tracker_jsnjack@gmail.com/locale/de/LC_MESSAGES/time-tracker.mo -------------------------------------------------------------------------------- /time_tracker_jsnjack@gmail.com/locale/de/LC_MESSAGES/time-tracker.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: Gnome Shell Extension Time tracker\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2024-01-21 22:30+0300\n" 11 | "PO-Revision-Date: 2014-06-08 15:19+0100\n" 12 | "Last-Translator: Jonatan Zeidler \n" 13 | "Language-Team: German \n" 14 | "Language: de\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Generator: Poedit 1.5.4\n" 19 | 20 | #: time_tracker_jsnjack@gmail.com/extension.js:29 21 | msgid "Resume" 22 | msgstr "" 23 | 24 | #: time_tracker_jsnjack@gmail.com/extension.js:32 25 | msgid "Pause" 26 | msgstr "" 27 | 28 | #: time_tracker_jsnjack@gmail.com/extension.js:98 29 | msgid "Timer was started at" 30 | msgstr "" 31 | 32 | #: time_tracker_jsnjack@gmail.com/extension.js:99 33 | msgid "Time tracker" 34 | msgstr "" 35 | 36 | #: time_tracker_jsnjack@gmail.com/extension.js:158 37 | msgid "Preferences" 38 | msgstr "" 39 | 40 | #: time_tracker_jsnjack@gmail.com/extension.js:159 41 | msgid "Restart" 42 | msgstr "Neustart" 43 | 44 | #: time_tracker_jsnjack@gmail.com/extension.js:160 45 | msgid "Pause/Resume" 46 | msgstr "" 47 | 48 | #: time_tracker_jsnjack@gmail.com/prefs.js:59 49 | msgid "General" 50 | msgstr "" 51 | 52 | #: time_tracker_jsnjack@gmail.com/prefs.js:71 53 | msgid "Display" 54 | msgstr "" 55 | 56 | #: time_tracker_jsnjack@gmail.com/prefs.js:73 57 | msgid "Show seconds" 58 | msgstr "" 59 | 60 | #: time_tracker_jsnjack@gmail.com/prefs.js:77 61 | #, fuzzy 62 | msgid "Adjust start time" 63 | msgstr "Neue Startzeit:" 64 | 65 | #: time_tracker_jsnjack@gmail.com/prefs.js:79 66 | #, fuzzy 67 | msgid "Start time: " 68 | msgstr "Neue Startzeit:" 69 | 70 | #: time_tracker_jsnjack@gmail.com/prefs.js:82 71 | #: time_tracker_jsnjack@gmail.com/prefs.js:109 72 | msgid "Hours" 73 | msgstr "" 74 | 75 | #: time_tracker_jsnjack@gmail.com/prefs.js:93 76 | #: time_tracker_jsnjack@gmail.com/prefs.js:120 77 | msgid "Minutes" 78 | msgstr "" 79 | 80 | #: time_tracker_jsnjack@gmail.com/prefs.js:105 81 | msgid "Adjust pause duration" 82 | msgstr "" 83 | 84 | #: time_tracker_jsnjack@gmail.com/prefs.js:131 85 | msgid "Pause while screen locked" 86 | msgstr "" 87 | 88 | #: time_tracker_jsnjack@gmail.com/prefs.js:134 89 | msgid "Colours" 90 | msgstr "" 91 | 92 | #: time_tracker_jsnjack@gmail.com/prefs.js:137 93 | #: time_tracker_jsnjack@gmail.com/prefs.js:140 94 | msgid "Normal state" 95 | msgstr "" 96 | 97 | #: time_tracker_jsnjack@gmail.com/prefs.js:143 98 | #: time_tracker_jsnjack@gmail.com/prefs.js:146 99 | msgid "Paused state" 100 | msgstr "" 101 | -------------------------------------------------------------------------------- /time_tracker_jsnjack@gmail.com/locale/fr/LC_MESSAGES/time-tracker.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsnjack/time-tracker/d7222aabda8e7e327b716150c4735a513ea0f376/time_tracker_jsnjack@gmail.com/locale/fr/LC_MESSAGES/time-tracker.mo -------------------------------------------------------------------------------- /time_tracker_jsnjack@gmail.com/locale/fr/LC_MESSAGES/time-tracker.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: Gnome Shell Extension Time tracker\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2024-01-21 22:30+0300\n" 6 | "PO-Revision-Date: 2016-01-05 00:06+0300\n" 7 | "Last-Translator: DAEM Q.\n" 8 | "Language: fr\n" 9 | "Content-Type: text/plain; charset=UTF-8\n" 10 | "Content-Transfer-Encoding: 8bit\n" 11 | "X-Generator: Poedit 1.5.4\n" 12 | "X-Poedit-SourceCharset: UTF-8\n" 13 | "X-Poedit-Basepath: /home/eshulitsky/workspace/time-tracker/" 14 | "time_tracker_jsnjack@gmail.com\n" 15 | 16 | #: time_tracker_jsnjack@gmail.com/extension.js:29 17 | msgid "Resume" 18 | msgstr "Reprendre" 19 | 20 | #: time_tracker_jsnjack@gmail.com/extension.js:32 21 | msgid "Pause" 22 | msgstr "Pause" 23 | 24 | #: time_tracker_jsnjack@gmail.com/extension.js:98 25 | msgid "Timer was started at" 26 | msgstr "Chronomètre démarré le" 27 | 28 | #: time_tracker_jsnjack@gmail.com/extension.js:99 29 | msgid "Time tracker" 30 | msgstr "" 31 | 32 | #: time_tracker_jsnjack@gmail.com/extension.js:158 33 | msgid "Preferences" 34 | msgstr "Préférences" 35 | 36 | #: time_tracker_jsnjack@gmail.com/extension.js:159 37 | msgid "Restart" 38 | msgstr "Redémarrer" 39 | 40 | #: time_tracker_jsnjack@gmail.com/extension.js:160 41 | #, fuzzy 42 | msgid "Pause/Resume" 43 | msgstr "Reprendre" 44 | 45 | #: time_tracker_jsnjack@gmail.com/prefs.js:59 46 | msgid "General" 47 | msgstr "" 48 | 49 | #: time_tracker_jsnjack@gmail.com/prefs.js:71 50 | msgid "Display" 51 | msgstr "Affichage barre supérieure" 52 | 53 | #: time_tracker_jsnjack@gmail.com/prefs.js:73 54 | msgid "Show seconds" 55 | msgstr "Afficher les secondes" 56 | 57 | #: time_tracker_jsnjack@gmail.com/prefs.js:77 58 | msgid "Adjust start time" 59 | msgstr "Ajuster l'heure de départ" 60 | 61 | #: time_tracker_jsnjack@gmail.com/prefs.js:79 62 | msgid "Start time: " 63 | msgstr "Démarré le : " 64 | 65 | #: time_tracker_jsnjack@gmail.com/prefs.js:82 66 | #: time_tracker_jsnjack@gmail.com/prefs.js:109 67 | msgid "Hours" 68 | msgstr "Heures" 69 | 70 | #: time_tracker_jsnjack@gmail.com/prefs.js:93 71 | #: time_tracker_jsnjack@gmail.com/prefs.js:120 72 | msgid "Minutes" 73 | msgstr "Minutes" 74 | 75 | #: time_tracker_jsnjack@gmail.com/prefs.js:105 76 | msgid "Adjust pause duration" 77 | msgstr "Ajuster le temps de la pause" 78 | 79 | #: time_tracker_jsnjack@gmail.com/prefs.js:131 80 | msgid "Pause while screen locked" 81 | msgstr "" 82 | 83 | #: time_tracker_jsnjack@gmail.com/prefs.js:134 84 | msgid "Colours" 85 | msgstr "Couleurs" 86 | 87 | #: time_tracker_jsnjack@gmail.com/prefs.js:137 88 | #: time_tracker_jsnjack@gmail.com/prefs.js:140 89 | msgid "Normal state" 90 | msgstr "En cours" 91 | 92 | #: time_tracker_jsnjack@gmail.com/prefs.js:143 93 | #: time_tracker_jsnjack@gmail.com/prefs.js:146 94 | msgid "Paused state" 95 | msgstr "En pause" 96 | -------------------------------------------------------------------------------- /time_tracker_jsnjack@gmail.com/locale/ru/LC_MESSAGES/ru.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: Gnome Shell Extension Time tracker\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2024-01-21 22:30+0300\n" 11 | "PO-Revision-Date: 2014-10-17 14:14+0300\n" 12 | "Last-Translator: Yauhen Shulitski \n" 13 | "Language-Team: \n" 14 | "Language: Russian\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Generator: Poedit 1.5.4\n" 19 | "X-Poedit-SourceCharset: UTF-8\n" 20 | "X-Poedit-Basepath: /home/eshulitsky/workspace/time-tracker/" 21 | "time_tracker_jsnjack@gmail.com\n" 22 | "X-Poedit-SearchPath-0: .\n" 23 | 24 | #: time_tracker_jsnjack@gmail.com/extension.js:29 25 | msgid "Resume" 26 | msgstr "" 27 | 28 | #: time_tracker_jsnjack@gmail.com/extension.js:32 29 | msgid "Pause" 30 | msgstr "" 31 | 32 | #: time_tracker_jsnjack@gmail.com/extension.js:98 33 | msgid "Timer was started at" 34 | msgstr "" 35 | 36 | #: time_tracker_jsnjack@gmail.com/extension.js:99 37 | msgid "Time tracker" 38 | msgstr "" 39 | 40 | #: time_tracker_jsnjack@gmail.com/extension.js:158 41 | msgid "Preferences" 42 | msgstr "Настройки" 43 | 44 | #: time_tracker_jsnjack@gmail.com/extension.js:159 45 | msgid "Restart" 46 | msgstr "Сброс" 47 | 48 | #: time_tracker_jsnjack@gmail.com/extension.js:160 49 | msgid "Pause/Resume" 50 | msgstr "" 51 | 52 | #: time_tracker_jsnjack@gmail.com/prefs.js:59 53 | msgid "General" 54 | msgstr "" 55 | 56 | #: time_tracker_jsnjack@gmail.com/prefs.js:71 57 | msgid "Display" 58 | msgstr "Внешний вид" 59 | 60 | #: time_tracker_jsnjack@gmail.com/prefs.js:73 61 | msgid "Show seconds" 62 | msgstr "Показывать секунды" 63 | 64 | #: time_tracker_jsnjack@gmail.com/prefs.js:77 65 | msgid "Adjust start time" 66 | msgstr "Изменить начало отсчёта" 67 | 68 | #: time_tracker_jsnjack@gmail.com/prefs.js:79 69 | #, fuzzy 70 | msgid "Start time: " 71 | msgstr "Начало отсчёта:" 72 | 73 | #: time_tracker_jsnjack@gmail.com/prefs.js:82 74 | #: time_tracker_jsnjack@gmail.com/prefs.js:109 75 | msgid "Hours" 76 | msgstr "Часы" 77 | 78 | #: time_tracker_jsnjack@gmail.com/prefs.js:93 79 | #: time_tracker_jsnjack@gmail.com/prefs.js:120 80 | msgid "Minutes" 81 | msgstr "Минуты" 82 | 83 | #: time_tracker_jsnjack@gmail.com/prefs.js:105 84 | msgid "Adjust pause duration" 85 | msgstr "" 86 | 87 | #: time_tracker_jsnjack@gmail.com/prefs.js:131 88 | msgid "Pause while screen locked" 89 | msgstr "" 90 | 91 | #: time_tracker_jsnjack@gmail.com/prefs.js:134 92 | #, fuzzy 93 | msgid "Colours" 94 | msgstr "Часы" 95 | 96 | #: time_tracker_jsnjack@gmail.com/prefs.js:137 97 | #: time_tracker_jsnjack@gmail.com/prefs.js:140 98 | msgid "Normal state" 99 | msgstr "" 100 | 101 | #: time_tracker_jsnjack@gmail.com/prefs.js:143 102 | #: time_tracker_jsnjack@gmail.com/prefs.js:146 103 | msgid "Paused state" 104 | msgstr "" 105 | -------------------------------------------------------------------------------- /time_tracker_jsnjack@gmail.com/locale/ru/LC_MESSAGES/time-tracker.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsnjack/time-tracker/d7222aabda8e7e327b716150c4735a513ea0f376/time_tracker_jsnjack@gmail.com/locale/ru/LC_MESSAGES/time-tracker.mo -------------------------------------------------------------------------------- /time_tracker_jsnjack@gmail.com/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "_generated": "Generated by SweetTooth, do not edit", 3 | "description": "Helps track time", 4 | "name": "Time Tracker", 5 | "settings-schema": "org.gnome.shell.extensions.time-tracker", 6 | "shell-version": [ 7 | "45" 8 | ], 9 | "url": "https://github.com/jsnjack/time-tracker/", 10 | "uuid": "time_tracker_jsnjack@gmail.com", 11 | "version": 24 12 | } 13 | -------------------------------------------------------------------------------- /time_tracker_jsnjack@gmail.com/prefs.js: -------------------------------------------------------------------------------- 1 | /* jshint moz:true, unused: false */ 2 | /* exported init, buildPrefsWidget */ 3 | import Gtk from 'gi://Gtk'; 4 | import Gdk from 'gi://Gdk'; 5 | import Adw from 'gi://Adw'; 6 | 7 | import { ExtensionPreferences, gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; 8 | let settings, start_time, normal_color, paused_color, initial_pause; 9 | 10 | 11 | function adjust_start_time(hours, mins) { 12 | // Replace old start-time date with the new one 13 | const change = hours * 60 * 60 * 1000 + mins * 60 * 1000; 14 | const start_time_obj = new Date(start_time); 15 | const new_start_time_obj = new Date(start_time_obj.getTime() + change); 16 | settings.set_string('start-time', new_start_time_obj.toString()); 17 | // Mark time for update 18 | settings.set_boolean("update-start-time", true); 19 | } 20 | 21 | function adjust_pause(hours, mins) { 22 | // Update pause-duration 23 | const change = hours * 60 * 60 * 1000 + mins * 60 * 1000; 24 | settings.set_int('pause-duration', initial_pause + change); 25 | // Mark time for update 26 | settings.set_boolean("update-start-time", true); 27 | } 28 | 29 | function parse_pause_duration(seconds) { 30 | // Returns amount of hours and minutes 31 | const data = {}; 32 | data.hours = parseInt(seconds / 3600, 10); 33 | seconds = seconds - data.hours * 3600; 34 | data.mins = parseInt(seconds / 60, 10); 35 | return data; 36 | } 37 | 38 | function save_color_change(color, key) { 39 | // Saves changes to the settings 40 | settings.set_string(key, color.to_string()); 41 | settings.set_boolean("update-indicator-style", true); 42 | } 43 | 44 | 45 | export default class TimeTrackerPreferences extends ExtensionPreferences { 46 | fillPreferencesWindow(window) { 47 | window._settings = this.getSettings(); 48 | settings = window._settings; 49 | start_time = settings.get_string('start-time'); 50 | normal_color = new Gdk.RGBA(); 51 | normal_color.parse(settings.get_string('indicator-color')); 52 | paused_color = new Gdk.RGBA(); 53 | paused_color.parse(settings.get_string('indicator-paused-color')); 54 | initial_pause = settings.get_int('pause-duration'); 55 | 56 | const page = new Adw.PreferencesPage(); 57 | 58 | const group = new Adw.PreferencesGroup({ 59 | title: _('General'), 60 | }); 61 | page.add(group); 62 | 63 | const widget = new Gtk.Box({ 64 | orientation: Gtk.Orientation.VERTICAL, 65 | margin_top: 10, 66 | margin_bottom: 10, 67 | margin_start: 10, 68 | margin_end: 10, 69 | }), 70 | data = parse_pause_duration(settings.get_int('pause-duration') / 1000), 71 | display_label = new Gtk.Label({ label: "" + _("Display") + "", use_markup: true, xalign: 0 }), 72 | display_box = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL, margin_start: 20 }), 73 | seconds_label = new Gtk.Label({ label: _("Show seconds"), margin_end: 10 }), 74 | seconds_switch = new Gtk.Switch({ active: settings.get_boolean('show-seconds') }), 75 | 76 | adjust_time_label = new Gtk.Label({ 77 | label: "" + _("Adjust start time") + "", use_markup: true, xalign: 0, margin_top: 20 78 | }), 79 | start_time_label = new Gtk.Label({ label: _("Start time: ") + start_time.toLocaleString() }), 80 | adjust_time_box = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL, margin_start: 20 }), 81 | hours_box = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL }), 82 | hours_label = new Gtk.Label({ label: _("Hours"), margin_end: 10 }), 83 | hours_spin = new Gtk.SpinButton({ 84 | adjustment: new Gtk.Adjustment({ 85 | value: 0, 86 | lower: -999, 87 | upper: 999, 88 | step_increment: 1 89 | }), 90 | value: 0 91 | }), 92 | mins_box = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL }), 93 | mins_label = new Gtk.Label({ label: _("Minutes"), margin_end: 10 }), 94 | mins_spin = new Gtk.SpinButton({ 95 | adjustment: new Gtk.Adjustment({ 96 | value: 0, 97 | lower: -60, 98 | upper: 60, 99 | step_increment: 1 100 | }), 101 | value: 0 102 | }), 103 | 104 | adjust_pause_label = new Gtk.Label({ 105 | label: "" + _("Adjust pause duration") + "", use_markup: true, xalign: 0, margin_top: 20 106 | }), 107 | adjust_pause_box = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL, margin_start: 20 }), 108 | pause_hours_box = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL }), 109 | pause_hours_label = new Gtk.Label({ label: _("Hours"), margin_end: 10 }), 110 | pause_hours_spin = new Gtk.SpinButton({ 111 | adjustment: new Gtk.Adjustment({ 112 | value: data.hours, 113 | lower: -999, 114 | upper: 999, 115 | step_increment: 1 116 | }), 117 | value: 0 118 | }), 119 | pause_mins_box = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL }), 120 | pause_mins_label = new Gtk.Label({ label: _("Minutes"), margin_end: 10 }), 121 | pause_mins_spin = new Gtk.SpinButton({ 122 | adjustment: new Gtk.Adjustment({ 123 | value: data.mins, 124 | lower: -60, 125 | upper: 60, 126 | step_increment: 1 127 | }), 128 | value: 0 129 | }), 130 | pause_on_lock_box = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL }), 131 | pause_on_lock_label = new Gtk.Label({ label: _("Pause while screen locked"), margin_end: 10 }), 132 | pause_on_lock_switch = new Gtk.Switch({ active: settings.get_boolean('pause-during-screen-lock') }), 133 | 134 | color_label = new Gtk.Label({ label: "" + _("Colours") + "", use_markup: true, xalign: 0 }), 135 | color_box = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL, margin_start: 20 }), 136 | indicator_color = new Gtk.ColorButton({ 137 | title: _("Normal state"), 138 | rgba: normal_color 139 | }), 140 | indicator_color_label = new Gtk.Label({ label: _("Normal state"), margin_end: 10 }), 141 | indicator_color_box = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL }), 142 | indicator_paused_color = new Gtk.ColorButton({ 143 | title: _("Paused state"), 144 | rgba: paused_color 145 | }), 146 | indicator_paused_color_label = new Gtk.Label({ label: _("Paused state"), margin_end: 10 }), 147 | indicator_paused_color_box = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL }); 148 | 149 | display_box.append(seconds_label, false, false, 3); 150 | display_box.append(seconds_switch, false, false, 3); 151 | 152 | hours_box.append(hours_label, false, false, 3); 153 | hours_box.append(hours_spin, false, false, 3); 154 | mins_box.append(mins_label, false, false, 3); 155 | mins_box.append(mins_spin, false, false, 3); 156 | adjust_time_box.append(hours_box, false, false, 3); 157 | adjust_time_box.append(mins_box, false, false, 3); 158 | 159 | pause_hours_box.append(pause_hours_label, false, false, 3); 160 | pause_hours_box.append(pause_hours_spin, false, false, 3); 161 | pause_mins_box.append(pause_mins_label, false, false, 3); 162 | pause_mins_box.append(pause_mins_spin, false, false, 3); 163 | pause_on_lock_box.append(pause_on_lock_label, false, false, 3); 164 | pause_on_lock_box.append(pause_on_lock_switch, false, false, 3); 165 | adjust_pause_box.append(pause_hours_box, false, false, 3); 166 | adjust_pause_box.append(pause_mins_box, false, false, 3); 167 | adjust_pause_box.append(pause_on_lock_box, false, false, 3); 168 | 169 | indicator_color_box.append(indicator_color_label, false, false, 3); 170 | indicator_color_box.append(indicator_color, false, false, 3); 171 | indicator_paused_color_box.append(indicator_paused_color_label, false, false, 3); 172 | indicator_paused_color_box.append(indicator_paused_color, false, false, 3); 173 | 174 | color_box.append(indicator_color_box, false, false, 3); 175 | color_box.append(indicator_paused_color_box, false, false, 3); 176 | 177 | widget.append(display_label, false, false, 3); 178 | widget.append(display_box, false, false, 3); 179 | widget.append(adjust_time_label, false, false, 3); 180 | widget.append(start_time_label, false, false, 3); 181 | widget.append(adjust_time_box, false, false, 3); 182 | widget.append(adjust_pause_label, false, false, 3); 183 | widget.append(adjust_pause_box, false, false, 3); 184 | widget.append(color_label, false, false, 3); 185 | widget.append(color_box, false, false, 3); 186 | 187 | pause_hours_spin.set_sensitive(!settings.get_boolean("paused")); 188 | pause_mins_spin.set_sensitive(!settings.get_boolean("paused")); 189 | 190 | //Callbacks 191 | seconds_switch.connect("notify::active", function (state) { 192 | settings.set_boolean('show-seconds', state.active); 193 | }); 194 | hours_spin.connect("value-changed", function () { 195 | adjust_start_time(hours_spin.get_value(), mins_spin.get_value()); 196 | }); 197 | mins_spin.connect("value-changed", function () { 198 | adjust_start_time(hours_spin.get_value(), mins_spin.get_value()); 199 | }); 200 | pause_hours_spin.connect("value-changed", function () { 201 | adjust_pause(pause_hours_spin.get_value(), pause_mins_spin.get_value()); 202 | }); 203 | pause_mins_spin.connect("value-changed", function () { 204 | adjust_pause(pause_hours_spin.get_value(), pause_mins_spin.get_value()); 205 | }); 206 | pause_on_lock_switch.connect("notify::active", function (state) { 207 | settings.set_boolean('pause-during-screen-lock', state.active); 208 | }); 209 | indicator_color.connect("color-set", function () { 210 | save_color_change(indicator_color.get_rgba(), "indicator-color"); 211 | }); 212 | indicator_paused_color.connect("color-set", function () { 213 | save_color_change(indicator_paused_color.get_rgba(), "indicator-paused-color"); 214 | }); 215 | 216 | group.add(widget) 217 | 218 | window.add(page); 219 | } 220 | } 221 | -------------------------------------------------------------------------------- /time_tracker_jsnjack@gmail.com/schemas/gschemas.compiled: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsnjack/time-tracker/d7222aabda8e7e327b716150c4735a513ea0f376/time_tracker_jsnjack@gmail.com/schemas/gschemas.compiled -------------------------------------------------------------------------------- /time_tracker_jsnjack@gmail.com/schemas/org.gnome.shell.extensions.time-tracker.gschema.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 'Time tracker' 6 | Start time 7 | Used to show difference with current time 8 | 9 | 10 | '' 11 | Pause start time 12 | Used to store pause start time 13 | 14 | 15 | 0 16 | Pause duration 17 | Used to store pause duration 18 | 19 | 20 | false 21 | Pause state indicator 22 | Shows if extension is in paused state 23 | 24 | 25 | false 26 | Pause state indicator 27 | Stores if extension was paused by screen lock 28 | 29 | 30 | false 31 | Pause time tracking while screen is locked 32 | Set to true to stop time tracking when screen is locked 33 | 34 | 35 | false 36 | Show seconds 37 | Set to true to show seconds 38 | 39 | 40 | false 41 | Update start time 42 | Shows if start-time needs update 43 | 44 | 45 | false 46 | Update indicator style 47 | Updates indicator style if it was changed in settings 48 | 49 | 50 | 'rgb(192, 192, 192)' 51 | Indicator color 52 | Color of the timer numbers 53 | 54 | 55 | 'rgb(33, 93, 156)' 56 | Paused indicator color 57 | Color of the numbers in paused state 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /time_tracker_jsnjack@gmail.com/stylesheet.css: -------------------------------------------------------------------------------- 1 | .panel-button { 2 | padding: 0 0.65em; 3 | } 4 | 5 | .button-restart:hover { 6 | background-color: #AA4646; 7 | } 8 | 9 | .button-pause:hover { 10 | background-color: #215D9C; 11 | } 12 | 13 | .button-resume:hover { 14 | background-color: #6CAD2B; 15 | } 16 | -------------------------------------------------------------------------------- /time_tracker_jsnjack@gmail.com/time-tracker.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: Gnome Shell Extension Time tracker\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2024-01-21 22:30+0300\n" 11 | "PO-Revision-Date: 2014-10-17 14:14+0300\n" 12 | "Last-Translator: \n" 13 | "Language-Team: \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: time_tracker_jsnjack@gmail.com/extension.js:29 20 | msgid "Resume" 21 | msgstr "" 22 | 23 | #: time_tracker_jsnjack@gmail.com/extension.js:32 24 | msgid "Pause" 25 | msgstr "" 26 | 27 | #: time_tracker_jsnjack@gmail.com/extension.js:98 28 | msgid "Timer was started at" 29 | msgstr "" 30 | 31 | #: time_tracker_jsnjack@gmail.com/extension.js:99 32 | msgid "Time tracker" 33 | msgstr "" 34 | 35 | #: time_tracker_jsnjack@gmail.com/extension.js:158 36 | msgid "Preferences" 37 | msgstr "" 38 | 39 | #: time_tracker_jsnjack@gmail.com/extension.js:159 40 | msgid "Restart" 41 | msgstr "" 42 | 43 | #: time_tracker_jsnjack@gmail.com/extension.js:160 44 | msgid "Pause/Resume" 45 | msgstr "" 46 | 47 | #: time_tracker_jsnjack@gmail.com/prefs.js:59 48 | msgid "General" 49 | msgstr "" 50 | 51 | #: time_tracker_jsnjack@gmail.com/prefs.js:71 52 | msgid "Display" 53 | msgstr "" 54 | 55 | #: time_tracker_jsnjack@gmail.com/prefs.js:73 56 | msgid "Show seconds" 57 | msgstr "" 58 | 59 | #: time_tracker_jsnjack@gmail.com/prefs.js:77 60 | msgid "Adjust start time" 61 | msgstr "" 62 | 63 | #: time_tracker_jsnjack@gmail.com/prefs.js:79 64 | msgid "Start time: " 65 | msgstr "" 66 | 67 | #: time_tracker_jsnjack@gmail.com/prefs.js:82 68 | #: time_tracker_jsnjack@gmail.com/prefs.js:109 69 | msgid "Hours" 70 | msgstr "" 71 | 72 | #: time_tracker_jsnjack@gmail.com/prefs.js:93 73 | #: time_tracker_jsnjack@gmail.com/prefs.js:120 74 | msgid "Minutes" 75 | msgstr "" 76 | 77 | #: time_tracker_jsnjack@gmail.com/prefs.js:105 78 | msgid "Adjust pause duration" 79 | msgstr "" 80 | 81 | #: time_tracker_jsnjack@gmail.com/prefs.js:131 82 | msgid "Pause while screen locked" 83 | msgstr "" 84 | 85 | #: time_tracker_jsnjack@gmail.com/prefs.js:134 86 | msgid "Colours" 87 | msgstr "" 88 | 89 | #: time_tracker_jsnjack@gmail.com/prefs.js:137 90 | #: time_tracker_jsnjack@gmail.com/prefs.js:140 91 | msgid "Normal state" 92 | msgstr "" 93 | 94 | #: time_tracker_jsnjack@gmail.com/prefs.js:143 95 | #: time_tracker_jsnjack@gmail.com/prefs.js:146 96 | msgid "Paused state" 97 | msgstr "" 98 | --------------------------------------------------------------------------------