From 5acbe002c762fa54ff555537467f984f3fdb2a50 Mon Sep 17 00:00:00 2001 From: Arduinum628 Date: Tue, 29 Jul 2025 17:40:11 +0300 Subject: [PATCH 1/5] chore: deleted extra imports --- kawai_focus/database/cruds.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/kawai_focus/database/cruds.py b/kawai_focus/database/cruds.py index 6b5746a..c611484 100644 --- a/kawai_focus/database/cruds.py +++ b/kawai_focus/database/cruds.py @@ -1,10 +1,8 @@ from sqlalchemy import select, insert, update, delete -from sqlalchemy.exc import NoResultFound from kawai_focus.schemas import TimerModel, TimerListModel from kawai_focus.database.session import db from kawai_focus.database.models import Timer -from kawai_focus.utils.errors import ErrorMessage from kawai_focus.database.decor_erors import crud_error_guard From 3afd85d942f8470f0a5f7b21e36817d151433b42 Mon Sep 17 00:00:00 2001 From: Arduinum628 Date: Tue, 29 Jul 2025 18:49:33 +0300 Subject: [PATCH 2/5] feat: added func gen_types_timers() --- kawai_focus/utils/utils.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/kawai_focus/utils/utils.py b/kawai_focus/utils/utils.py index bce9aac..24c3e18 100644 --- a/kawai_focus/utils/utils.py +++ b/kawai_focus/utils/utils.py @@ -71,3 +71,12 @@ def calculate_time(mm_user: int) -> str: f"{'0' + str(valid_data.hh) if valid_data.hh <= 9 else valid_data.hh}:" f"{'0' + str(valid_data.mm) if valid_data.mm <= 9 else valid_data.mm}:00" ) + + +def gen_types_timers(count_pomodoro: int) -> list[str]: + """Функция для генерирования списка типов таймеров для очереди""" + + types_timers_list = ['break' if num % 2 == 0 else 'pomodoro' for num in range(1, count_pomodoro * 2)] + types_timers_list.append('long_break') + + return types_timers_list From 4439c9e17bd8d7c26da1a0bebb7d2a2217670f73 Mon Sep 17 00:00:00 2001 From: Arduinum628 Date: Wed, 30 Jul 2025 14:39:37 +0300 Subject: [PATCH 3/5] feat: added queue timers in the timer_constructor_screen and timer_screen --- .../screens/timer_constructor_screen.py | 6 ++-- kawai_focus/screens/timer_screen.py | 29 +++++++++++++++++-- kawai_focus/tests/json/timer.json | 3 +- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/kawai_focus/screens/timer_constructor_screen.py b/kawai_focus/screens/timer_constructor_screen.py index d9cc454..6c02ac1 100644 --- a/kawai_focus/screens/timer_constructor_screen.py +++ b/kawai_focus/screens/timer_constructor_screen.py @@ -3,7 +3,7 @@ from kivy.uix.screenmanager import Screen from kawai_focus.custom_widgets.timer_wigets import TimeTomatoInput from kawai_focus.schemas import TimerModel from kawai_focus.database.cruds import new_timer -from kawai_focus.utils.utils import calculate_time, custom_timer +from kawai_focus.utils.utils import calculate_time, gen_types_timers from kawai_focus.screens.validators_fields import validate_title @@ -38,7 +38,9 @@ class TimerConstructorScreen(Screen): time_culc = calculate_time(mm_user=timer.pomodoro_time) screen_timer.timer_start_time = time_culc screen_timer.ids.time_label.text = time_culc - screen_timer.timer_generator = custom_timer(mm_user=timer.pomodoro_time) + screen_timer.source_timer_names = gen_types_timers(count_pomodoro=timer.count_pomodoro) + + self.manager.state_machine = screen_timer.source_timer_names.copy() self.manager.current = 'timers_screen' diff --git a/kawai_focus/screens/timer_screen.py b/kawai_focus/screens/timer_screen.py index 725f638..9c30360 100644 --- a/kawai_focus/screens/timer_screen.py +++ b/kawai_focus/screens/timer_screen.py @@ -2,7 +2,7 @@ from kivy.uix.screenmanager import Screen from kivy.clock import Clock from kivy.core.audio import SoundLoader -from kawai_focus.utils.utils import data_json +from kawai_focus.utils.utils import data_json, custom_timer, calculate_time class TimerScreen(Screen): @@ -22,6 +22,22 @@ class TimerScreen(Screen): self.sound_stop_event = None self.timer = None self.timer_start_time = None + self.source_timer_names = None + + def check_timer(self) -> None: + """Метод для выбора таймера""" + + current_timer_name = self.manager.state_machine.pop(0) + + if current_timer_name == 'pomodoro': + self.timer_generator = custom_timer(mm_user=self.timer.pomodoro_time) + self.ids.time_label.text = calculate_time(mm_user=self.timer.pomodoro_time) + elif current_timer_name == 'break': + self.timer_generator = custom_timer(mm_user=self.timer.break_time) + self.ids.time_label.text = calculate_time(mm_user=self.timer.break_time) + else: + self.timer_generator = custom_timer(mm_user=self.timer.break_long_time) + self.ids.time_label.text = calculate_time(mm_user=self.timer.break_long_time) def start_timer(self, instance) -> None: """Метод для запуска таймера""" @@ -30,8 +46,11 @@ class TimerScreen(Screen): self.paused = False else: # Инициализация генератора таймера + if len(self.manager.state_machine) and self.timer_generator is None: + self.check_timer() + self.remaining_time = next(self.timer_generator, self.zero_time) - + # Запуск обновления времени каждую секунду Clock.schedule_interval(self.update_time, 1) @@ -57,6 +76,12 @@ class TimerScreen(Screen): Clock.unschedule(self.sound_stop_event) self.sound_stop_event = None + if len(self.manager.state_machine): + self.check_timer() + else: + self.manager.state_machine = self.source_timer_names.copy() + self.check_timer() + def play_sound(self, dt) -> None: """Метод для воспроизведения звука""" diff --git a/kawai_focus/tests/json/timer.json b/kawai_focus/tests/json/timer.json index be37c13..eecf5f6 100644 --- a/kawai_focus/tests/json/timer.json +++ b/kawai_focus/tests/json/timer.json @@ -1,5 +1,4 @@ { "sound_timer": "alarm-beep.mp3", - "zero_time": "00:00:00", - "custom_time": "00:00:12" + "zero_time": "00:00:00" } \ No newline at end of file From fa19a3eb80dfcdb66c373720f5938d9b87b4fd67 Mon Sep 17 00:00:00 2001 From: Arduinum628 Date: Wed, 30 Jul 2025 20:25:21 +0300 Subject: [PATCH 4/5] feat: added hiding and revealing the stop button --- kawai_focus/screens/timer_constructor_screen.py | 1 + kawai_focus/screens/timer_screen.py | 16 ++++++++++++---- kv/timer_screen.kv | 17 ++++++++++++++++- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/kawai_focus/screens/timer_constructor_screen.py b/kawai_focus/screens/timer_constructor_screen.py index 6c02ac1..e86bc4c 100644 --- a/kawai_focus/screens/timer_constructor_screen.py +++ b/kawai_focus/screens/timer_constructor_screen.py @@ -38,6 +38,7 @@ class TimerConstructorScreen(Screen): time_culc = calculate_time(mm_user=timer.pomodoro_time) screen_timer.timer_start_time = time_culc screen_timer.ids.time_label.text = time_culc + screen_timer.ids.title_label.text = timer.title screen_timer.source_timer_names = gen_types_timers(count_pomodoro=timer.count_pomodoro) self.manager.state_machine = screen_timer.source_timer_names.copy() diff --git a/kawai_focus/screens/timer_screen.py b/kawai_focus/screens/timer_screen.py index 9c30360..cb20e5b 100644 --- a/kawai_focus/screens/timer_screen.py +++ b/kawai_focus/screens/timer_screen.py @@ -32,12 +32,18 @@ class TimerScreen(Screen): if current_timer_name == 'pomodoro': self.timer_generator = custom_timer(mm_user=self.timer.pomodoro_time) self.ids.time_label.text = calculate_time(mm_user=self.timer.pomodoro_time) + self.ids.type_timer_label.text = 'Помидор' elif current_timer_name == 'break': self.timer_generator = custom_timer(mm_user=self.timer.break_time) self.ids.time_label.text = calculate_time(mm_user=self.timer.break_time) + self.ids.type_timer_label.text = 'Перерыв' else: self.timer_generator = custom_timer(mm_user=self.timer.break_long_time) self.ids.time_label.text = calculate_time(mm_user=self.timer.break_long_time) + self.ids.type_timer_label.text = 'Перерывище' + + self.ids.stop_button.opacity = 0 + self.ids.stop_button.disabled = True def start_timer(self, instance) -> None: """Метод для запуска таймера""" @@ -49,6 +55,9 @@ class TimerScreen(Screen): if len(self.manager.state_machine) and self.timer_generator is None: self.check_timer() + self.ids.stop_button.opacity = 1 + self.ids.stop_button.disabled = False + self.remaining_time = next(self.timer_generator, self.zero_time) # Запуск обновления времени каждую секунду @@ -76,11 +85,10 @@ class TimerScreen(Screen): Clock.unschedule(self.sound_stop_event) self.sound_stop_event = None - if len(self.manager.state_machine): - self.check_timer() - else: + if not len(self.manager.state_machine): self.manager.state_machine = self.source_timer_names.copy() - self.check_timer() + + self.check_timer() def play_sound(self, dt) -> None: """Метод для воспроизведения звука""" diff --git a/kv/timer_screen.kv b/kv/timer_screen.kv index e95306e..c1cb8cb 100644 --- a/kv/timer_screen.kv +++ b/kv/timer_screen.kv @@ -2,6 +2,19 @@ : FloatLayout: + # Label для названия таймера + Label: + id: title_label + size_hint: None, None + pos_hint: {'center_x': 0.3, 'center_y': 0.7} + + # Label для типа таймера + Label: + id: type_timer_label + text: 'Помидор' + size_hint: None, None + pos_hint: {'center_x': 0.7, 'center_y': 0.7} + # Кнопка "Старт" Button: text: 'Старт' @@ -22,7 +35,10 @@ # Кнопка "Стоп" Button: + id: stop_button text: 'Стоп' + opacity: 0 + disabled: True size_hint: None, None height: 40 width: 100 @@ -32,6 +48,5 @@ # Label для отображения времени Label: id: time_label - # text: root.get_init_time(self) size_hint: None, None pos_hint: {'center_x': 0.5, 'center_y': 0.6} \ No newline at end of file From ca6de5351a44838b05110cf7a9eccde9ea2b891a Mon Sep 17 00:00:00 2001 From: Arduinum628 Date: Wed, 30 Jul 2025 20:33:20 +0300 Subject: [PATCH 5/5] refactor: edited method --- kawai_focus/screens/timer_screen.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kawai_focus/screens/timer_screen.py b/kawai_focus/screens/timer_screen.py index cb20e5b..ac43577 100644 --- a/kawai_focus/screens/timer_screen.py +++ b/kawai_focus/screens/timer_screen.py @@ -24,7 +24,7 @@ class TimerScreen(Screen): self.timer_start_time = None self.source_timer_names = None - def check_timer(self) -> None: + def choice_timer(self) -> None: """Метод для выбора таймера""" current_timer_name = self.manager.state_machine.pop(0) @@ -53,7 +53,7 @@ class TimerScreen(Screen): else: # Инициализация генератора таймера if len(self.manager.state_machine) and self.timer_generator is None: - self.check_timer() + self.choice_timer() self.ids.stop_button.opacity = 1 self.ids.stop_button.disabled = False @@ -88,7 +88,7 @@ class TimerScreen(Screen): if not len(self.manager.state_machine): self.manager.state_machine = self.source_timer_names.copy() - self.check_timer() + self.choice_timer() def play_sound(self, dt) -> None: """Метод для воспроизведения звука"""