diff --git a/app/assets/sound/alarm-retro.wav b/app/assets/sound/alarm-retro.wav new file mode 100644 index 0000000..147fad4 Binary files /dev/null and b/app/assets/sound/alarm-retro.wav differ diff --git a/app/config.h b/app/config.h index 40a5ffc..bc98f1d 100644 --- a/app/config.h +++ b/app/config.h @@ -2,17 +2,17 @@ #define CONFIG_H // App version -#define QBREAK_VERSION_MAJOR 0 -#define QBREAK_VERSION_MINOR 0 -#define QBREAK_VERSION_SUFFIX 8 +#define QBREAK_VERSION_MAJOR 0 +#define QBREAK_VERSION_MINOR 0 +#define QBREAK_VERSION_SUFFIX 9 // How often UI is updated - interval in seconds -#define INTERVAL_UPDATE_UI (60) +#define INTERVAL_UPDATE_UI (60) // How often progress bar is updated - interval in milliseconds -#define INTERVAL_UPDATE_PROGRESS (1000) +#define INTERVAL_UPDATE_PROGRESS (1000) // How long notification is shown - in milliseconds -#define INTERVAL_NOTIFICATION (30000) +#define INTERVAL_NOTIFICATION (30000) #endif // CONFIG_H diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 94dece6..6371ebb 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -16,6 +16,7 @@ #include #include #include +#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) @@ -170,7 +171,7 @@ void MainWindow::test_2() // 60 seconds test break mAppConfig.longbreak_length = 60; mAppConfig.longbreak_postpone_interval = 60; - mAppConfig.longbreak_interval = 240; + mAppConfig.longbreak_interval = 60; mAppConfig.window_on_top = true; mAppConfig.verbose = true; @@ -316,6 +317,23 @@ void MainWindow::onLongBreakEnd() // Refresh UI onUpdateUI(); + + // Play audio + if (mAppConfig.play_audio != Empty_Play_Audio) + { + if (mAppConfig.play_audio == Embedded_Play_Audio) + QSound::play(":/assets/sound/alarm-retro.wav"); + else + QSound::play(mAppConfig.play_audio); + } + + // Run script + if (!mAppConfig.script_on_break_finish.isEmpty()) + { + int retcode = system(mAppConfig.script_on_break_finish.toStdString().c_str()); + if (retcode != 0) + qDebug() << "User script exited with error code " << retcode; + } } void MainWindow::onLongBreakPostpone() diff --git a/app/qbreak.pro b/app/qbreak.pro index 43f2fde..dcfda55 100644 --- a/app/qbreak.pro +++ b/app/qbreak.pro @@ -1,4 +1,4 @@ -QT += core gui svg +QT += core gui svg multimedia greaterThan(QT_MAJOR_VERSION, 4): QT += widgets diff --git a/app/qbreak.qrc b/app/qbreak.qrc index 64262ec..a3c7d68 100644 --- a/app/qbreak.qrc +++ b/app/qbreak.qrc @@ -12,5 +12,6 @@ assets/images/coffee_cup/icon_96x96.png assets/images/coffee_cup/icon_128x128.png assets/images/coffee_cup/icon_512x512.png + assets/sound/alarm-retro.wav diff --git a/app/settings.cpp b/app/settings.cpp index e47a808..96b4afb 100644 --- a/app/settings.cpp +++ b/app/settings.cpp @@ -10,6 +10,8 @@ const QString Key_Window_On_Top = "Window_On_Top"; const QString Key_Verbose = "Verbose"; const QString Key_Autostart = "Autostart"; const QString Key_PreferredMonitor = "Preferred_Monitor"; +const QString Key_Audio_On_Break_Finish = "Audio_On_Break_Finish"; +const QString Key_Script_On_Break_Finish = "Script_On_Break_Finish"; void app_settings::save(const config &cfg) { @@ -22,6 +24,8 @@ void app_settings::save(const config &cfg) s.setValue(Key_Verbose, cfg.verbose); s.setValue(Key_Autostart, cfg.autostart); s.setValue(Key_PreferredMonitor, cfg.preferred_monitor); + s.setValue(Key_Audio_On_Break_Finish, cfg.play_audio); + s.setValue(Key_Script_On_Break_Finish, cfg.script_on_break_finish); } app_settings::config app_settings::load() @@ -36,5 +40,8 @@ app_settings::config app_settings::load() r.verbose = s.value(Key_Verbose, Default_Verbose).toBool(); r.autostart = s.value(Key_Autostart, Default_Autostart).toBool(); r.preferred_monitor = s.value(Key_PreferredMonitor, Default_Monitor).toString(); + r.play_audio = s.value(Key_Audio_On_Break_Finish, Empty_Play_Audio).toString(); + r.script_on_break_finish = s.value(Key_Script_On_Break_Finish, QString()).toString(); + return r; } diff --git a/app/settings.h b/app/settings.h index 08e9db3..a6372b8 100644 --- a/app/settings.h +++ b/app/settings.h @@ -21,10 +21,14 @@ const bool Default_Autostart = true; const QString Default_Monitor = ""; const QString Primary_Monitor = "[Primary]"; +// Default behavior is not play any audio on break end. +const QString Empty_Play_Audio = "[None]"; +const QString Embedded_Play_Audio = "[Embedded]"; // Used app name const QString AppName = "QBreak"; + class app_settings { public: @@ -38,6 +42,10 @@ public: bool verbose = Default_Verbose; bool autostart = Default_Autostart; QString preferred_monitor = Default_Monitor; + + // This value can be path to audio file or empty or [embedded] string + QString play_audio = Empty_Play_Audio; + QString script_on_break_finish; }; static void save(const config& cfg); diff --git a/app/settingsdialog.cpp b/app/settingsdialog.cpp index 6149ea2..d5a24a1 100644 --- a/app/settingsdialog.cpp +++ b/app/settingsdialog.cpp @@ -48,17 +48,31 @@ void SettingsDialog::init() } ui->mPreferredMonitorCombobox->setCurrentIndex(found_idx); + + ui->mAudioComboBox->addItem(Empty_Play_Audio); + ui->mAudioComboBox->addItem(Embedded_Play_Audio); + if (c.play_audio != Empty_Play_Audio && c.play_audio != Embedded_Play_Audio) + ui->mAudioComboBox->addItem(c.play_audio); + for (int i = 0; i < ui->mAudioComboBox->count(); i++) + if (ui->mAudioComboBox->itemText(i) == c.play_audio) + ui->mAudioComboBox->setCurrentIndex(i); + + ui->mScriptEdit->setText(c.script_on_break_finish); } void SettingsDialog::accept() { auto c = app_settings::load(); + c.autostart = ui->mAutostartCheckbox->isChecked(); c.window_on_top = ui->mWindowOnTopCheckbox->isChecked(); c.longbreak_interval = ui->mBreakIntervalEdit->text().toInt() * 60; c.longbreak_length = ui->mBreakDurationEdit->text().toInt() * 60; c.longbreak_postpone_interval = ui->mPostponeTimeEdit->text().toInt() * 60; c.preferred_monitor = ui->mPreferredMonitorCombobox->currentData().toString(); + c.script_on_break_finish = ui->mScriptEdit->text(); + c.play_audio = ui->mAudioComboBox->currentText(); + app_settings::save(c); emit accepted(); diff --git a/app/settingsdialog.ui b/app/settingsdialog.ui index d9046c3..fa98af5 100644 --- a/app/settingsdialog.ui +++ b/app/settingsdialog.ui @@ -6,14 +6,14 @@ 0 0 - 746 - 217 + 800 + 359 746 - 167 + 220 @@ -114,6 +114,30 @@ + + + + Audio to play when break finish + + + + + + + true + + + + + + + Script to run when break finish + + + + + +