Текстовый плеер, основанный на технологии RSVP, для быстрого чтения текстов.
$ python player.py
Escape
- Начать/остановить проигрывание слов
Up
, Down
- Увеличить/уменьшить скорость воспроизведния на 10 wpm (words per minute)
Left
, Right
- Показать предыдущее/следующее слово
Shift
- Перезапустить текущий файл
Alt
- Открыть файл, имя которого указано в текстовом поле
- Выделение ключевой буквы цветом.
- Запоминание прогресса. Программа помнит, где она остановилась для каждого файла, который открывала.
- Индикатор прогресса. Программа отбражает при помощи, какая часть файла была прочтена.
- Индикатор вкл/выкл. На маленьких wpm из-за большой паузы не всегда ясно, работает плеер или нет.
- Индикатор ошибки. В данной версии плеера пользователь может ошибиться только в имени файла, но при расширении функционала их может быть больше.
-
Возможность добавлять файл с настройками по умолчанию. Wpm, приветственная фраза, имя файла для чтения по умолчанию и др. параметры могут настраиваться в этом файле.
-
Структура модулей обладает сильной связанностью и слабым зацеплением. Вместо Model.py может быть легко подключена любая БД, а Qt может быть замененена на любую другую GUI библиотеку.
-
Исключения. Продуманная и полная система исключений повышает читаемость кода, облегчает отладку (поиск ошибок) и позволяет реализовать код без излишнего копирования.
-
Валидация значений. Валидатор умеет проверять значения на корректность, в зависимости от типа. Это очень мощный инструмент, который в паре с грамотным использованием исключений позволяет писать красивый код.
Исключения делятся на два вида: вызывающие и не вызывающие экстренное завершение программы. Такая система позволяет соблюсти баланс между отказоустойчивостью кода и легкоизменяемостью.
Никакие действия пользователя не могут породить исключения первого вида, однако они могут быть вызваны непосредственным вмешательством в исходный код программы. Это необходимо, чтобы ошибки обнаруживались ещё на этапе компиляции проекта, если другой программист, который решит использовать этот исходный код, начнет неверно его изменять.
Класс, реализуиющий интерфейс взаимодействия между фронтом (.qml
) и контроллером.
Реализует всю логику и взаимодействие между модулями.
Реализует интерфейс взаимодействия контроллера с данными.
Ну это валидатор. Он... ну... валидирует. Код валидатора легко расширяемый: чтобы добавить новый параметр валидации
(например age
, если мы вдруг захотим, чтобы нашим приложением не могли пользоваться дети) необходимо просто реализовать
функцию __validate_age()
и добавить соответвующую пару age
- __validate_age
в словарь. Никакой копипасты и
дополнительных if-ов, а следовательно и никаких ошибок.
Это парсер для файлов с расширением .rsvpps
(rsvp player settings), устойчивый к некорректному синтаксису. Если в какая-то
из строчек будет некорректного формата, или в ней будет неверное имя параметра, то это не повлияет на работу парсера: все
корректные пары {параметр - значение} из предыдущих и последующих строчек будут учтены. На случай, если для какого-то
параметра задано невалидное значение или не задано вовсе, в коде программы захардкожены дефолные значения.
Сообщение об ошибке логгируется в консоль. Пример:
WARNING:root:Error in line 4. Incorrect value: -239. Speed cannot be less than 0
WARNING:root:Error in line 7. Incorrect value: . Greeting message cannot be empty string
В каждую строчку в любое место может быть добавлено любое число пробелов или их может не быть совсем. Любой ключ или значение может состоять из пробелов, для этого нужно обернуть их в " или '.
Реализована поддержка # комментариев
Класс, реализующий интерфейс взаимодействия с Qt-шным таймером.
Некоторые функции в контроллере требуют взаимодействия с Qt-шным таймером (например нужно остановить таймер при смене ресурса), однако его нельзя просто взять и добавить в контроллер, т.к. он является частью Qt, и мы таким образом увеличим зацепление между фронтом и основной частью программы. Завернув класс QTimer в наш самописный Timer мы сможем инкапсулировать всю Qt-ную часть в отдельном файле, а логику оставить в контроллере.
- Добавить на главный экран значение
ETL
(estimated time left) - время которое потребуется чтобы дочитать книгу, если продолжить читать с такой же скоростью. - Сохранение настроек при перезапуске программы. Я уже подготовил для этого всю необходимую базу: необходимо записать
в соответсвующий файл
.rsvpps
имена файлов и номер слова, на котором в прошлый раз мы остановили чтение, и считывать эту информацию при запуске плеера. - Добавить селектор выбора файлов.