From c794e32023b43e772a0e3f9d1538b0e5041b7646 Mon Sep 17 00:00:00 2001 From: Ysm-04 Date: Mon, 1 Jun 2026 21:01:11 +0800 Subject: [PATCH] feat: add reminder scheduling and sound controls --- CMakeLists.txt | 19 +- README.md | 63 ++- docs/QtDesktopPet_后续功能规划与结构审查.md | 68 ++- docs/Qt_DesktopPet_开发文档.md | 2 +- main.cpp | 3 + .../sounds/reminders/reminder_default.wav | Bin 0 -> 145812 bytes resources/sounds/reminders/reminder_soft.wav | Bin 0 -> 112156 bytes src/assistant/CommandDispatcher.cpp | 5 + src/assistant/CommandDispatcher.h | 1 + src/config/AppConfig.h | 3 + src/config/ConfigManager.cpp | 31 ++ src/notification/NotificationDispatcher.cpp | 16 + src/notification/NotificationDispatcher.h | 17 + src/reminder/ReminderCommandHandler.cpp | 47 ++ src/reminder/ReminderCommandHandler.h | 20 + src/reminder/ReminderManager.cpp | 337 ++++++++++++ src/reminder/ReminderManager.h | 49 ++ src/reminder/ReminderParser.cpp | 484 ++++++++++++++++++ src/reminder/ReminderParser.h | 16 + src/reminder/ReminderSoundPlayer.cpp | 22 + src/reminder/ReminderSoundPlayer.h | 13 + src/reminder/ReminderSoundRepository.cpp | 350 +++++++++++++ src/reminder/ReminderSoundRepository.h | 26 + src/reminder/ReminderStore.cpp | 180 +++++++ src/reminder/ReminderStore.h | 18 + src/reminder/ReminderTypes.cpp | 52 ++ src/reminder/ReminderTypes.h | 46 ++ src/tray/TrayController.cpp | 10 + src/tray/TrayController.h | 1 + src/ui/PetWindow.cpp | 126 ++++- src/ui/PetWindow.h | 14 + src/ui/SettingsDialog.cpp | 446 ++++++++++++++++ src/ui/SettingsDialog.h | 33 ++ src/util/ResourcePaths.cpp | 5 + src/util/ResourcePaths.h | 1 + tools/package_release.ps1 | 5 +- 36 files changed, 2494 insertions(+), 35 deletions(-) create mode 100644 resources/sounds/reminders/reminder_default.wav create mode 100644 resources/sounds/reminders/reminder_soft.wav create mode 100644 src/notification/NotificationDispatcher.cpp create mode 100644 src/notification/NotificationDispatcher.h create mode 100644 src/reminder/ReminderCommandHandler.cpp create mode 100644 src/reminder/ReminderCommandHandler.h create mode 100644 src/reminder/ReminderManager.cpp create mode 100644 src/reminder/ReminderManager.h create mode 100644 src/reminder/ReminderParser.cpp create mode 100644 src/reminder/ReminderParser.h create mode 100644 src/reminder/ReminderSoundPlayer.cpp create mode 100644 src/reminder/ReminderSoundPlayer.h create mode 100644 src/reminder/ReminderSoundRepository.cpp create mode 100644 src/reminder/ReminderSoundRepository.h create mode 100644 src/reminder/ReminderStore.cpp create mode 100644 src/reminder/ReminderStore.h create mode 100644 src/reminder/ReminderTypes.cpp create mode 100644 src/reminder/ReminderTypes.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1738833..64507d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ set(CMAKE_AUTOMOC OFF) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) -find_package(Qt6 REQUIRED COMPONENTS Widgets Network) +find_package(Qt6 REQUIRED COMPONENTS Widgets Network Multimedia) qt_add_executable(QtDesktopPet main.cpp @@ -50,6 +50,22 @@ qt_add_executable(QtDesktopPet src/config/ConfigManager.cpp src/config/SecretStore.h src/config/SecretStore.cpp + src/notification/NotificationDispatcher.h + src/notification/NotificationDispatcher.cpp + src/reminder/ReminderCommandHandler.h + src/reminder/ReminderCommandHandler.cpp + src/reminder/ReminderManager.h + src/reminder/ReminderManager.cpp + src/reminder/ReminderParser.h + src/reminder/ReminderParser.cpp + src/reminder/ReminderSoundPlayer.h + src/reminder/ReminderSoundPlayer.cpp + src/reminder/ReminderSoundRepository.h + src/reminder/ReminderSoundRepository.cpp + src/reminder/ReminderStore.h + src/reminder/ReminderStore.cpp + src/reminder/ReminderTypes.h + src/reminder/ReminderTypes.cpp src/state/PetStateMachine.h src/state/PetStateMachine.cpp src/tray/TrayController.h @@ -79,6 +95,7 @@ target_compile_definitions(QtDesktopPet target_link_libraries(QtDesktopPet PRIVATE + Qt6::Multimedia Qt6::Network Qt6::Widgets ) diff --git a/README.md b/README.md index 7f21818..4fbbdee 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,9 @@ QtDesktopPet 是一个基于 Qt Widgets / C++17 的 Windows 桌面宠物项目 - Google Gemini 原生聊天请求 - 角色文件夹导入和角色切换 - 删除用户导入角色 +- 本地一次性提醒:聊天创建、查询、取消,重启后 pending 提醒不丢 +- 提醒到点气泡提示、拖动后延迟提示和隐藏时托盘通知 +- 提醒音效切换、试听、用户 wav 导入和删除 - Windows 发布打包脚本和 Inno Setup 安装器脚本 - Windows GUI 子系统,Release exe 双击不弹控制台窗口 @@ -50,6 +53,7 @@ QtDesktopPet 是一个基于 Qt Widgets / C++17 的 Windows 桌面宠物项目 - C++17 - Qt 6 Widgets - Qt 6 Network +- Qt 6 Multimedia - CMake - PNG 图片序列帧 - JSON 配置文件 @@ -145,6 +149,62 @@ resources/characters/shiroko/ - 隐藏到托盘时可释放非保护动画缓存 - `enableLazyLoad=false` 时仍保持启动阶段加载全部状态帧的兼容行为 +## 定时提醒和音效 + +当前支持通过聊天输入创建一次性本地提醒,例如: + +```text +10分钟后提醒我喝水 +半小时后提醒我休息 +一个半小时后提醒我喝水 +明天9点提醒我开会 +后天9点提醒我开会 +6月3日9点提醒我提交 +下周一上午10点提醒我周会 +提醒列表 +取消喝水提醒 +``` + +提醒数据保存到: + +```text +QStandardPaths::AppConfigLocation/reminders.json +``` + +提醒文件损坏时会备份为: + +```text +reminders.broken.yyyyMMdd-HHmmss.json +``` + +内置提醒音效位于: + +```text +resources/sounds/reminders/ +``` + +用户导入的提醒音效保存到: + +```text +QStandardPaths::AppDataLocation/sounds/reminders/ +``` + +音效规则: + +- 默认音效为 `reminder_default` +- 提醒触发时使用当前设置页选择的全局音效;修改音效后对所有未触发提醒立即生效 +- 内置音效可切换、可试听,但不能在设置页删除 +- 用户音效只支持导入 PCM wav +- 用户导入音效可切换、可试听、可删除 +- 删除当前用户音效后会回退到 `reminder_default` + +触发规则: + +- 桌宠可见时显示气泡,不发系统通知 +- 桌宠隐藏时发 Windows 托盘通知,不在下次显示时补气泡 +- 用户拖动中不打断 `drag`,拖动结束后显示气泡 +- 重复提醒尚未支持,包含“每天 / 每周 / 每月”等语义时会提示暂不支持 + ## 配置和日志 应用配置保存到 Qt 标准配置目录: @@ -197,6 +257,7 @@ QtDesktopPet.exe Qt runtime resources/characters/ resources/icons/ +resources/sounds/ LICENSE README.md ``` @@ -278,7 +339,7 @@ reports/perf/ docs/performance_stability_check.md ``` -发布包应排除 `tools/`、`docs/`、`reports/`、`build/`、`dist/`、`release_packages/` 和 `.git/`,只保留运行必需文件、`resources/characters/`、`resources/icons/`、`LICENSE` 和必要说明。 +发布包应排除 `tools/`、`docs/`、`reports/`、`build/`、`dist/`、`release_packages/` 和 `.git/`,只保留运行必需文件、`resources/characters/`、`resources/icons/`、`resources/sounds/`、`LICENSE` 和必要说明。 ## AI 配置和聊天 diff --git a/docs/QtDesktopPet_后续功能规划与结构审查.md b/docs/QtDesktopPet_后续功能规划与结构审查.md index 2c96e9f..2e978f4 100644 --- a/docs/QtDesktopPet_后续功能规划与结构审查.md +++ b/docs/QtDesktopPet_后续功能规划与结构审查.md @@ -30,6 +30,8 @@ - AI 请求取消和对话清空 - 角色文件夹导入和角色切换 - 删除用户导入角色 +- 本地一次性提醒、提醒列表、取消提醒和到点通知 +- 内置/用户提醒音效切换、导入、删除和试听 - Windows 打包脚本和 Inno Setup 安装器脚本 - Release exe 双击不弹控制台窗口 @@ -294,12 +296,12 @@ IP 定位隐私说明 阶段 5:语音对话 / 更复杂 Agent 能力 ``` -当前最推荐先做: +当前结构收口和定时提醒已经进入实现阶段。下一步最推荐继续做: ```text -1. IntentRouter / CommandDispatcher -2. 定时提醒 -3. 天气查询 +1. 天气查询 +2. 本地文件操作安全边界 +3. 联网搜索 ``` --- @@ -378,6 +380,20 @@ CommandDispatcher::dispatch(userText) 桌宠创建本地提醒,到点后气泡提示或托盘提示。 +当前实现状态: + +```text +已新增 src/reminder/ 模块 +已支持一次性提醒解析、JSON 持久化、启动后加载、到点触发和状态标记 +已支持聊天创建 / 查询 / 取消提醒 +已支持设置页按状态查看提醒、取消 pending 提醒、清理已触发/已取消历史 +已支持 reminder_default / reminder_soft 内置音效 +已支持用户 wav 音效导入、删除、切换和试听 +提醒触发时使用当前设置页选择的全局音效,ReminderItem.soundId 仅保留为历史兼容字段 +已接入 Qt Multimedia / QSoundEffect 播放提醒音效 +已预留 NotificationDispatcher,当前 Windows 仍由托盘通知承接 +``` + ## 5.2 第一版范围 要做: @@ -408,12 +424,18 @@ CommandDispatcher::dispatch(userText) ```text src/reminder/ ├── ReminderTypes.h + ├── ReminderCommandHandler.h + ├── ReminderCommandHandler.cpp ├── ReminderParser.h ├── ReminderParser.cpp ├── ReminderManager.h ├── ReminderManager.cpp ├── ReminderStore.h - └── ReminderStore.cpp + ├── ReminderStore.cpp + ├── ReminderSoundRepository.h + ├── ReminderSoundRepository.cpp + ├── ReminderSoundPlayer.h + └── ReminderSoundPlayer.cpp ``` ## 5.4 数据结构建议 @@ -425,8 +447,9 @@ struct ReminderItem QString title; QString originalText; QDateTime remindAt; - bool triggered = false; + ReminderStatus status = ReminderStatus::Pending; QDateTime createdAt; + QString soundId; // 历史兼容字段,触发时不再读取 }; ``` @@ -448,8 +471,9 @@ QStandardPaths::AppConfigLocation/reminders.json "title": "提交作业", "originalText": "晚上8点提醒我提交作业", "remindAt": "2026-06-01T20:00:00", - "triggered": false, - "createdAt": "2026-06-01T15:20:00" + "status": "pending", + "createdAt": "2026-06-01T15:20:00", + "soundId": "" } ] } @@ -475,13 +499,21 @@ reminders.broken.yyyyMMdd-HHmmss.json 下午3点 明天9点 明天上午10点 +后天9点 +今天下午3点 +6月3日9点 +6/3 09:00 +下周一上午10点 10分钟后 半小时后 +一个半小时后 +一小时后 1小时后 +两小时后 2小时后 ``` -如果规则解析失败,后续可以再接 AI 解析。 +如果规则解析失败,后续可以再接 AI 解析。包含“每天 / 每周 / 每月 / 工作日 / 重复”等语义时,当前只返回“重复提醒尚未支持”,不创建一次性提醒。 ## 5.7 AI 辅助解析的设计边界 @@ -524,9 +556,9 @@ userText 建议行为: ```text -桌宠可见:显示 ChatBubble + 切 talk 或 happy -桌宠隐藏:系统托盘通知 -用户拖动中:不打断 drag,拖动结束后显示 +桌宠可见:播放当前全局音效,显示 ChatBubble + 切 happy,无 happy 时回退 talk,不发 Windows 通知 +桌宠隐藏:播放当前全局音效,触发 Windows 托盘通知,不在下次显示时补气泡 +用户拖动中:播放当前全局音效,不打断 drag,拖动结束后显示气泡,不发 Windows 通知 ``` 提醒文案: @@ -988,12 +1020,8 @@ CustomSearchProvider ## 9.2 第二步:定时提醒 ```text -1. ReminderTypes -2. ReminderStore -3. ReminderParser -4. ReminderManager -5. 到点气泡和托盘通知 -6. 设置页增加提醒列表,可后置 +当前已落地一次性提醒、提醒列表、取消提醒、到点气泡/托盘通知和提醒音效管理。 +后续可继续补确认/稍后提醒、重复提醒和跨平台通知实现。 ``` ## 9.3 第三步:天气查询 @@ -1066,8 +1094,8 @@ CustomSearchProvider 其中: ```text -定时提醒:最适合第一个落地 -天气:第二个落地 +定时提醒:已作为第一个工具能力落地 +天气:建议第二个落地 本地文件操作:风险较高,第三个落地 联网搜索:通用能力,最后落地 ``` diff --git a/docs/Qt_DesktopPet_开发文档.md b/docs/Qt_DesktopPet_开发文档.md index c8cc519..647e915 100644 --- a/docs/Qt_DesktopPet_开发文档.md +++ b/docs/Qt_DesktopPet_开发文档.md @@ -1408,7 +1408,7 @@ Windows 下不能只拷贝 exe。 1. 用户手动完成 Release 构建 2. 运行 tools/package_release.ps1,传入 QtDesktopPet.exe 路径 3. 脚本调用 windeployqt 收集 Qt 运行库 -4. 脚本复制 resources/characters、resources/icons、LICENSE、README.md +4. 脚本复制 resources/characters、resources/icons、resources/sounds、LICENSE、README.md 5. 脚本生成 dist/QtDesktopPet--windows-x64.zip 6. 需要安装器时,脚本优先查找 D:\Inno Setup 7\ISCC.exe,并调用 ISCC 编译 installer/QtDesktopPet.iss 7. 安装器默认最终输出到项目根目录 diff --git a/main.cpp b/main.cpp index e86c8ec..faee784 100644 --- a/main.cpp +++ b/main.cpp @@ -76,6 +76,9 @@ int main(int argc, char *argv[]) TrayController trayController(&window); window.setSettingsFallbackInContextMenuEnabled(!trayController.isAvailable()); + window.setTrayNotificationCallback([&trayController](const QString &title, const QString &message) { + trayController.showNotification(title, message); + }); trayController.show(); QObject::connect(&singleInstanceServer, &QLocalServer::newConnection, [&singleInstanceServer, &window]() { diff --git a/resources/sounds/reminders/reminder_default.wav b/resources/sounds/reminders/reminder_default.wav new file mode 100644 index 0000000000000000000000000000000000000000..cc0e4130947736e093e223a3c5cfab05ed54ca95 GIT binary patch literal 145812 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 U58n@e{nc=G?8e0ZZhaPc50Wroa{vGU literal 0 HcmV?d00001 diff --git a/resources/sounds/reminders/reminder_soft.wav b/resources/sounds/reminders/reminder_soft.wav new file mode 100644 index 0000000000000000000000000000000000000000..ab643ff25e9e8e4e0420de49a60a297b03e0a6d0 GIT binary patch literal 112156 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�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

)Rk^c6NH3@3AvhRw|qQiOTQXWq>=F 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
_<+N4jVKp} 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 literal 0 HcmV?d00001 diff --git a/src/assistant/CommandDispatcher.cpp b/src/assistant/CommandDispatcher.cpp index 5fd1713..d18a09e 100644 --- a/src/assistant/CommandDispatcher.cpp +++ b/src/assistant/CommandDispatcher.cpp @@ -27,6 +27,11 @@ CommandDispatchResult CommandDispatcher::dispatch(const QString &text) const return {CommandDispatchAction::Chat, intent, intent.text}; } + if (intent.type == UserIntentType::Reminder) + { + return {CommandDispatchAction::Reminder, intent, intent.text}; + } + return {CommandDispatchAction::UnsupportedTool, intent, unsupportedToolMessage(intent.type)}; } diff --git a/src/assistant/CommandDispatcher.h b/src/assistant/CommandDispatcher.h index 51cfea3..8ae4b75 100644 --- a/src/assistant/CommandDispatcher.h +++ b/src/assistant/CommandDispatcher.h @@ -7,6 +7,7 @@ enum class CommandDispatchAction { Chat, + Reminder, UnsupportedTool, }; diff --git a/src/config/AppConfig.h b/src/config/AppConfig.h index 33b413b..b5e1fd3 100644 --- a/src/config/AppConfig.h +++ b/src/config/AppConfig.h @@ -16,6 +16,9 @@ struct AppConfig int animationCacheLimitMb = 180; bool unloadAnimationsWhenHidden = true; QString characterId = QStringLiteral("shiroko"); + QString reminderSoundId = QStringLiteral("reminder_default"); + bool reminderSoundEnabled = true; + double reminderSoundVolume = 0.8; int requestContextMessageLimit = 12; int memoryHistoryMessageLimit = 200; bool saveConversationHistory = false; diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 00c1821..912fc3e 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace { @@ -57,6 +58,15 @@ QJsonObject characterObjectFromConfig(const AppConfig &config) return character; } +QJsonObject reminderObjectFromConfig(const AppConfig &config) +{ + QJsonObject reminder; + reminder.insert(QStringLiteral("soundId"), config.reminderSoundId); + reminder.insert(QStringLiteral("soundEnabled"), config.reminderSoundEnabled); + reminder.insert(QStringLiteral("soundVolume"), qBound(0.0, config.reminderSoundVolume, 1.0)); + return reminder; +} + QString normalizedProviderName(const QString &provider) { const QString normalized = provider.trimmed().toLower(); @@ -258,6 +268,26 @@ AppConfig ConfigManager::loadAppConfig() const config.characterId = character.value(QStringLiteral("id")).toString(config.characterId).trimmed(); } + const QJsonObject reminder = root.value(QStringLiteral("reminder")).toObject(); + if (reminder.contains(QStringLiteral("soundId"))) + { + config.reminderSoundId = reminder.value(QStringLiteral("soundId")).toString(config.reminderSoundId).trimmed(); + if (config.reminderSoundId.isEmpty()) + { + config.reminderSoundId = QStringLiteral("reminder_default"); + } + } + + if (reminder.contains(QStringLiteral("soundEnabled"))) + { + config.reminderSoundEnabled = reminder.value(QStringLiteral("soundEnabled")).toBool(config.reminderSoundEnabled); + } + + if (reminder.contains(QStringLiteral("soundVolume"))) + { + config.reminderSoundVolume = qBound(0.0, reminder.value(QStringLiteral("soundVolume")).toDouble(config.reminderSoundVolume), 1.0); + } + return config; } @@ -346,6 +376,7 @@ bool ConfigManager::saveAppConfig(const AppConfig &config) const root.insert(QStringLiteral("performance"), performanceObjectFromConfig(config)); root.insert(QStringLiteral("chat"), chatObjectFromConfig(config)); root.insert(QStringLiteral("character"), characterObjectFromConfig(config)); + root.insert(QStringLiteral("reminder"), reminderObjectFromConfig(config)); QFile file(appConfigPath()); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) diff --git a/src/notification/NotificationDispatcher.cpp b/src/notification/NotificationDispatcher.cpp new file mode 100644 index 0000000..ee84df3 --- /dev/null +++ b/src/notification/NotificationDispatcher.cpp @@ -0,0 +1,16 @@ +#include "NotificationDispatcher.h" + +#include + +void NotificationDispatcher::setShowCallback(ShowCallback callback) +{ + m_showCallback = std::move(callback); +} + +void NotificationDispatcher::showReminder(const QString &title, const QString &message) const +{ + if (m_showCallback) + { + m_showCallback(title, message); + } +} diff --git a/src/notification/NotificationDispatcher.h b/src/notification/NotificationDispatcher.h new file mode 100644 index 0000000..962b57a --- /dev/null +++ b/src/notification/NotificationDispatcher.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +#include + +class NotificationDispatcher +{ +public: + using ShowCallback = std::function; + + void setShowCallback(ShowCallback callback); + void showReminder(const QString &title, const QString &message) const; + +private: + ShowCallback m_showCallback; +}; diff --git a/src/reminder/ReminderCommandHandler.cpp b/src/reminder/ReminderCommandHandler.cpp new file mode 100644 index 0000000..839101d --- /dev/null +++ b/src/reminder/ReminderCommandHandler.cpp @@ -0,0 +1,47 @@ +#include "ReminderCommandHandler.h" + +#include "ReminderManager.h" + +ReminderCommandResult ReminderCommandHandler::handle(const QString &text, ReminderManager &manager) +{ + const ReminderCommand command = manager.parseCommand(text); + switch (command.type) + { + case ReminderCommandType::Create: + { + ReminderItem item; + QString errorMessage; + if (!manager.createReminder(command.title, command.originalText, command.remindAt, &item, &errorMessage)) + { + return {false, errorMessage.isEmpty() ? QStringLiteral("创建提醒失败。") : errorMessage, {}}; + } + + return { + true, + QStringLiteral("已设置提醒:%1,时间:%2").arg(item.title, reminderDisplayTime(item.remindAt)), + item, + }; + } + case ReminderCommandType::List: + return {true, manager.pendingReminderSummary(), {}}; + case ReminderCommandType::Cancel: + { + ReminderItem item; + QString errorMessage; + if (!manager.cancelReminderByQuery(command.cancelQuery, &item, &errorMessage)) + { + return {false, errorMessage.isEmpty() ? QStringLiteral("取消提醒失败。") : errorMessage, {}}; + } + + return { + true, + QStringLiteral("已取消提醒:%1(%2)").arg(item.title, reminderDisplayTime(item.remindAt)), + item, + }; + } + case ReminderCommandType::Invalid: + return {false, command.errorMessage.isEmpty() ? QStringLiteral("没有识别到有效提醒命令。") : command.errorMessage, {}}; + } + + return {false, QStringLiteral("没有识别到有效提醒命令。"), {}}; +} diff --git a/src/reminder/ReminderCommandHandler.h b/src/reminder/ReminderCommandHandler.h new file mode 100644 index 0000000..d1deb50 --- /dev/null +++ b/src/reminder/ReminderCommandHandler.h @@ -0,0 +1,20 @@ +#pragma once + +#include "ReminderTypes.h" + +#include + +class ReminderManager; + +struct ReminderCommandResult +{ + bool success = false; + QString message; + ReminderItem item; +}; + +class ReminderCommandHandler +{ +public: + static ReminderCommandResult handle(const QString &text, ReminderManager &manager); +}; diff --git a/src/reminder/ReminderManager.cpp b/src/reminder/ReminderManager.cpp new file mode 100644 index 0000000..8f995e0 --- /dev/null +++ b/src/reminder/ReminderManager.cpp @@ -0,0 +1,337 @@ +#include "ReminderManager.h" + +#include "../util/Logger.h" + +#include +#include +#include +#include + +#include + +namespace +{ +constexpr qint64 MinimumTimerIntervalMs = 1000; +constexpr qint64 MaximumTimerIntervalMs = 24 * 60 * 60 * 1000; + +bool isPending(const ReminderItem &item) +{ + return item.status == ReminderStatus::Pending; +} + +bool textMatchesReminder(const ReminderItem &item, const QString &query) +{ + const QString normalizedQuery = query.trimmed(); + if (normalizedQuery.isEmpty()) + { + return false; + } + + return item.id.compare(normalizedQuery, Qt::CaseInsensitive) == 0 + || item.title.contains(normalizedQuery, Qt::CaseInsensitive) + || item.originalText.contains(normalizedQuery, Qt::CaseInsensitive); +} +} + +ReminderManager::ReminderManager() +{ + QObject::connect(&m_timer, &QTimer::timeout, [this]() { + processDueReminders(); + }); + m_timer.setSingleShot(true); + load(); +} + +void ReminderManager::start() +{ + if (m_started) + { + return; + } + + m_started = true; + processDueReminders(); +} + +void ReminderManager::setTriggeredCallback(TriggeredCallback callback) +{ + m_triggeredCallback = std::move(callback); +} + +QVector ReminderManager::allReminders() const +{ + return sortedReminders(m_items); +} + +QVector ReminderManager::pendingReminders() const +{ + QVector result; + for (const ReminderItem &item : m_items) + { + if (isPending(item)) + { + result.append(item); + } + } + return sortedReminders(result); +} + +ReminderCommand ReminderManager::parseCommand(const QString &text) const +{ + return m_parser.parse(text); +} + +bool ReminderManager::createReminder( + const QString &title, + const QString &originalText, + const QDateTime &remindAt, + ReminderItem *createdItem, + QString *errorMessage) +{ + if (!remindAt.isValid() || remindAt <= QDateTime::currentDateTime()) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("提醒时间必须晚于当前时间。"); + } + return false; + } + + ReminderItem item; + item.id = nextReminderId(); + item.title = title.trimmed().isEmpty() ? QStringLiteral("提醒") : title.trimmed(); + item.originalText = originalText; + item.remindAt = remindAt; + item.status = ReminderStatus::Pending; + item.createdAt = QDateTime::currentDateTime(); + item.soundId.clear(); + + m_items.append(item); + if (!save(errorMessage)) + { + m_items.removeLast(); + return false; + } + + if (createdItem != nullptr) + { + *createdItem = item; + } + + scheduleNextReminder(); + return true; +} + +bool ReminderManager::cancelReminder(const QString &id, QString *errorMessage) +{ + const QString normalizedId = id.trimmed(); + for (ReminderItem &item : m_items) + { + if (item.id == normalizedId && isPending(item)) + { + item.status = ReminderStatus::Canceled; + const bool saved = save(errorMessage); + if (!saved) + { + item.status = ReminderStatus::Pending; + } + scheduleNextReminder(); + return saved; + } + } + + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("没有找到可取消的提醒。"); + } + return false; +} + +bool ReminderManager::cancelReminderByQuery(const QString &query, ReminderItem *canceledItem, QString *errorMessage) +{ + QVector matches; + for (int index = 0; index < m_items.size(); ++index) + { + if (isPending(m_items.at(index)) && textMatchesReminder(m_items.at(index), query)) + { + matches.append(index); + } + } + + if (matches.isEmpty()) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("没有找到匹配的待提醒事项。"); + } + return false; + } + + if (matches.size() > 1) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("找到多条匹配提醒,请在设置页中选择具体提醒取消。"); + } + return false; + } + + ReminderItem &item = m_items[matches.first()]; + item.status = ReminderStatus::Canceled; + + const bool saved = save(errorMessage); + if (!saved) + { + item.status = ReminderStatus::Pending; + } + else if (canceledItem != nullptr) + { + *canceledItem = item; + } + scheduleNextReminder(); + return saved; +} + +bool ReminderManager::clearFinishedReminders(QString *errorMessage) +{ + QVector previousItems = m_items; + for (int index = m_items.size() - 1; index >= 0; --index) + { + const ReminderStatus status = m_items.at(index).status; + if (status == ReminderStatus::Triggered || status == ReminderStatus::Canceled) + { + m_items.removeAt(index); + } + } + + if (m_items.size() == previousItems.size()) + { + return true; + } + + if (!save(errorMessage)) + { + m_items = previousItems; + return false; + } + + scheduleNextReminder(); + return true; +} + +QString ReminderManager::pendingReminderSummary() const +{ + const QVector reminders = pendingReminders(); + if (reminders.isEmpty()) + { + return QStringLiteral("当前没有待提醒事项。"); + } + + QStringList lines; + lines.append(QStringLiteral("当前待提醒:")); + for (const ReminderItem &item : reminders) + { + lines.append(QStringLiteral("%1:%2(%3)") + .arg(item.id, item.title, reminderDisplayTime(item.remindAt))); + } + return lines.join(QChar('\n')); +} + +void ReminderManager::load() +{ + QString errorMessage; + m_items = m_store.load(&errorMessage); + if (!errorMessage.isEmpty()) + { + Logger::warning(QStringLiteral("Failed to load reminders: ") + errorMessage); + } +} + +bool ReminderManager::save(QString *errorMessage) const +{ + return m_store.save(m_items, errorMessage); +} + +void ReminderManager::processDueReminders() +{ + const QDateTime now = QDateTime::currentDateTime(); + QVector triggeredItems; + QVector triggeredIndexes; + for (int index = 0; index < m_items.size(); ++index) + { + ReminderItem &item = m_items[index]; + if (isPending(item) && item.remindAt <= now) + { + item.status = ReminderStatus::Triggered; + triggeredItems.append(item); + triggeredIndexes.append(index); + } + } + + if (!triggeredItems.isEmpty()) + { + QString errorMessage; + if (!save(&errorMessage)) + { + Logger::warning(QStringLiteral("Failed to save triggered reminders: ") + errorMessage); + for (const int index : triggeredIndexes) + { + if (index >= 0 && index < m_items.size()) + { + m_items[index].status = ReminderStatus::Pending; + } + } + scheduleNextReminder(); + return; + } + + for (const ReminderItem &item : triggeredItems) + { + if (m_triggeredCallback) + { + m_triggeredCallback(item); + } + } + } + + scheduleNextReminder(); +} + +void ReminderManager::scheduleNextReminder() +{ + m_timer.stop(); + if (!m_started) + { + return; + } + + QDateTime nextReminderTime; + for (const ReminderItem &item : m_items) + { + if (!isPending(item)) + { + continue; + } + + if (!nextReminderTime.isValid() || item.remindAt < nextReminderTime) + { + nextReminderTime = item.remindAt; + } + } + + if (!nextReminderTime.isValid()) + { + return; + } + + const qint64 delayMs = QDateTime::currentDateTime().msecsTo(nextReminderTime); + const int timerInterval = static_cast(qBound(MinimumTimerIntervalMs, delayMs, MaximumTimerIntervalMs)); + m_timer.start(timerInterval); +} + +QString ReminderManager::nextReminderId() const +{ + const QString timestamp = QDateTime::currentDateTime().toString(QStringLiteral("yyyyMMddHHmmsszzz")); + const quint32 randomValue = QRandomGenerator::global()->bounded(10000U); + return QStringLiteral("reminder_%1_%2").arg(timestamp, QString::number(randomValue).rightJustified(4, QLatin1Char('0'))); +} diff --git a/src/reminder/ReminderManager.h b/src/reminder/ReminderManager.h new file mode 100644 index 0000000..f6eaa55 --- /dev/null +++ b/src/reminder/ReminderManager.h @@ -0,0 +1,49 @@ +#pragma once + +#include "ReminderParser.h" +#include "ReminderStore.h" + +#include +#include + +#include + +class ReminderManager +{ +public: + using TriggeredCallback = std::function; + + ReminderManager(); + + void start(); + void setTriggeredCallback(TriggeredCallback callback); + + QVector allReminders() const; + QVector pendingReminders() const; + ReminderCommand parseCommand(const QString &text) const; + + bool createReminder( + const QString &title, + const QString &originalText, + const QDateTime &remindAt, + ReminderItem *createdItem = nullptr, + QString *errorMessage = nullptr); + bool cancelReminder(const QString &id, QString *errorMessage = nullptr); + bool cancelReminderByQuery(const QString &query, ReminderItem *canceledItem = nullptr, QString *errorMessage = nullptr); + bool clearFinishedReminders(QString *errorMessage = nullptr); + QString pendingReminderSummary() const; + +private: + void load(); + bool save(QString *errorMessage = nullptr) const; + void processDueReminders(); + void scheduleNextReminder(); + QString nextReminderId() const; + + ReminderStore m_store; + ReminderParser m_parser; + QVector m_items; + QTimer m_timer; + TriggeredCallback m_triggeredCallback; + bool m_started = false; +}; diff --git a/src/reminder/ReminderParser.cpp b/src/reminder/ReminderParser.cpp new file mode 100644 index 0000000..f505ddb --- /dev/null +++ b/src/reminder/ReminderParser.cpp @@ -0,0 +1,484 @@ +#include "ReminderParser.h" + +#include +#include +#include +#include + +namespace +{ +bool containsAny(const QString &text, const QStringList &keywords) +{ + for (const QString &keyword : keywords) + { + if (text.contains(keyword)) + { + return true; + } + } + + return false; +} + +int chineseDigitValue(QChar value) +{ + if (value == QLatin1Char('0') || value == QChar(0x3007) || value == QStringLiteral("零").at(0)) + { + return 0; + } + if (value == QStringLiteral("一").at(0)) + { + return 1; + } + if (value == QStringLiteral("二").at(0) || value == QStringLiteral("两").at(0)) + { + return 2; + } + if (value == QStringLiteral("三").at(0)) + { + return 3; + } + if (value == QStringLiteral("四").at(0)) + { + return 4; + } + if (value == QStringLiteral("五").at(0)) + { + return 5; + } + if (value == QStringLiteral("六").at(0)) + { + return 6; + } + if (value == QStringLiteral("七").at(0)) + { + return 7; + } + if (value == QStringLiteral("八").at(0)) + { + return 8; + } + if (value == QStringLiteral("九").at(0)) + { + return 9; + } + + return -1; +} + +int parseSmallInteger(QString value) +{ + value = value.trimmed(); + value.remove(QStringLiteral("个")); + if (value.isEmpty()) + { + return -1; + } + + bool ok = false; + const int numericValue = value.toInt(&ok); + if (ok) + { + return numericValue; + } + + const int tenIndex = value.indexOf(QStringLiteral("十")); + if (tenIndex >= 0) + { + const QString left = value.left(tenIndex); + const QString right = value.mid(tenIndex + 1); + const int tens = left.isEmpty() ? 1 : parseSmallInteger(left); + const int ones = right.isEmpty() ? 0 : parseSmallInteger(right); + if (tens < 0 || ones < 0) + { + return -1; + } + return tens * 10 + ones; + } + + if (value.size() == 1) + { + return chineseDigitValue(value.at(0)); + } + + return -1; +} + +QString cleanedText(QString text) +{ + return text + .replace(QChar(0xff0c), QStringLiteral(" ")) + .replace(QChar(0x3002), QStringLiteral(" ")) + .replace(QChar(0xff1a), QStringLiteral(":")) + .replace(QChar(0xff1b), QStringLiteral(" ")) + .trimmed(); +} + +int adjustedHour(const QString &period, int hour) +{ + if (hour < 0) + { + return -1; + } + + if (period == QStringLiteral("下午") || period == QStringLiteral("晚上")) + { + return hour < 12 ? hour + 12 : hour; + } + + if (period == QStringLiteral("中午")) + { + return hour < 11 ? hour + 12 : hour; + } + + if (period == QStringLiteral("凌晨") && hour == 12) + { + return 0; + } + + return hour; +} + +int weekdayFromText(const QString &text) +{ + const QString normalized = text.trimmed(); + if (normalized == QStringLiteral("一") || normalized == QStringLiteral("1")) + { + return 1; + } + if (normalized == QStringLiteral("二") || normalized == QStringLiteral("2")) + { + return 2; + } + if (normalized == QStringLiteral("三") || normalized == QStringLiteral("3")) + { + return 3; + } + if (normalized == QStringLiteral("四") || normalized == QStringLiteral("4")) + { + return 4; + } + if (normalized == QStringLiteral("五") || normalized == QStringLiteral("5")) + { + return 5; + } + if (normalized == QStringLiteral("六") || normalized == QStringLiteral("6")) + { + return 6; + } + if (normalized == QStringLiteral("日") + || normalized == QStringLiteral("天") + || normalized == QStringLiteral("7")) + { + return 7; + } + + return -1; +} + +struct ReminderDateResolution +{ + QDate date; + bool explicitDate = false; +}; + +ReminderDateResolution resolveReminderDate(const QString &text, const QDate ¤tDate) +{ + QRegularExpressionMatch match; + + const QRegularExpression nextWeekExpression(QStringLiteral("下周\\s*([一二三四五六日天1-7])")); + match = nextWeekExpression.match(text); + if (match.hasMatch()) + { + const int targetWeekday = weekdayFromText(match.captured(1)); + if (targetWeekday > 0) + { + const int daysToNextMonday = 8 - currentDate.dayOfWeek(); + return {currentDate.addDays(daysToNextMonday + targetWeekday - 1), true}; + } + } + + const QRegularExpression monthDayExpression(QStringLiteral("(\\d{1,2})\\s*月\\s*(\\d{1,2})\\s*(?:日|号)?")); + match = monthDayExpression.match(text); + if (match.hasMatch()) + { + const int month = match.captured(1).toInt(); + const int day = match.captured(2).toInt(); + QDate date(currentDate.year(), month, day); + if (date.isValid() && date < currentDate) + { + date = date.addYears(1); + } + return {date, true}; + } + + const QRegularExpression slashDateExpression(QStringLiteral("(\\d{1,2})\\s*/\\s*(\\d{1,2})")); + match = slashDateExpression.match(text); + if (match.hasMatch()) + { + const int month = match.captured(1).toInt(); + const int day = match.captured(2).toInt(); + QDate date(currentDate.year(), month, day); + if (date.isValid() && date < currentDate) + { + date = date.addYears(1); + } + return {date, true}; + } + + if (text.contains(QStringLiteral("后天"))) + { + return {currentDate.addDays(2), true}; + } + + if (text.contains(QStringLiteral("明天"))) + { + return {currentDate.addDays(1), true}; + } + + if (text.contains(QStringLiteral("今天"))) + { + return {currentDate, true}; + } + + return {currentDate, false}; +} + +QString removeFirst(const QString &text, const QString &part) +{ + QString result = text; + const int index = result.indexOf(part); + if (index >= 0) + { + result.remove(index, part.size()); + } + return result; +} +} + +ReminderCommand ReminderParser::parse(const QString &text, const QDateTime &now) const +{ + const QString normalized = cleanedText(text); + if (normalized.isEmpty()) + { + return {ReminderCommandType::Invalid, {}, {}, {}, {}, QStringLiteral("提醒内容为空。")}; + } + + if (containsAny(normalized, {QStringLiteral("提醒列表"), QStringLiteral("查看提醒"), QStringLiteral("我的提醒"), QStringLiteral("有哪些提醒")})) + { + return {ReminderCommandType::List, {}, normalized}; + } + + if (normalized.contains(QStringLiteral("取消提醒")) || normalized.startsWith(QStringLiteral("取消"))) + { + QString query = normalized; + query.remove(QStringLiteral("取消提醒")); + if (query == normalized) + { + query.remove(QStringLiteral("取消")); + query.remove(QStringLiteral("提醒")); + } + query = query.trimmed(); + if (query.isEmpty()) + { + return {ReminderCommandType::Invalid, {}, normalized, {}, {}, QStringLiteral("请说明要取消哪条提醒。")}; + } + return {ReminderCommandType::Cancel, {}, normalized, {}, query}; + } + + return parseCreateCommand(normalized, now); +} + +ReminderCommand ReminderParser::parseCreateCommand(const QString &text, const QDateTime &now) const +{ + const QDate currentDate = now.date(); + + if (containsAny(text, { + QStringLiteral("每天"), + QStringLiteral("每日"), + QStringLiteral("每周"), + QStringLiteral("每星期"), + QStringLiteral("每月"), + QStringLiteral("每年"), + QStringLiteral("工作日"), + QStringLiteral("重复"), + })) + { + return {ReminderCommandType::Invalid, {}, text, {}, {}, QStringLiteral("重复提醒尚未支持,目前只能创建一次性提醒。")}; + } + + const QRegularExpression relativeMinutesExpression(QStringLiteral("([0-9]+|[一二两三四五六七八九十]+)\\s*分钟后")); + QRegularExpressionMatch match = relativeMinutesExpression.match(text); + if (match.hasMatch()) + { + const int minutes = parseSmallInteger(match.captured(1)); + if (minutes <= 0) + { + return {ReminderCommandType::Invalid, {}, text, {}, {}, QStringLiteral("提醒时间必须晚于当前时间。")}; + } + + const QString timeExpression = match.captured(0); + return { + ReminderCommandType::Create, + extractTitle(text, timeExpression), + text, + now.addSecs(minutes * 60), + {}, + {}, + }; + } + + const QRegularExpression relativeOneAndHalfHourExpression(QStringLiteral("([0-9]+|[一二两三四五六七八九十]+)\\s*(?:个)?半小时后")); + match = relativeOneAndHalfHourExpression.match(text); + if (match.hasMatch()) + { + const int hours = parseSmallInteger(match.captured(1)); + if (hours < 0) + { + return {ReminderCommandType::Invalid, {}, text, {}, {}, QStringLiteral("没有识别到有效提醒时间。")}; + } + + const QString timeExpression = match.captured(0); + return { + ReminderCommandType::Create, + extractTitle(text, timeExpression), + text, + now.addSecs(hours * 60 * 60 + 30 * 60), + {}, + {}, + }; + } + + if (text.contains(QStringLiteral("半小时后"))) + { + const QString timeExpression = QStringLiteral("半小时后"); + return { + ReminderCommandType::Create, + extractTitle(text, timeExpression), + text, + now.addSecs(30 * 60), + {}, + {}, + }; + } + + const QRegularExpression relativeHoursExpression(QStringLiteral("([0-9]+|[一二两三四五六七八九十]+)\\s*(?:个)?小时后")); + match = relativeHoursExpression.match(text); + if (match.hasMatch()) + { + const int hours = parseSmallInteger(match.captured(1)); + if (hours <= 0) + { + return {ReminderCommandType::Invalid, {}, text, {}, {}, QStringLiteral("提醒时间必须晚于当前时间。")}; + } + + const QString timeExpression = match.captured(0); + return { + ReminderCommandType::Create, + extractTitle(text, timeExpression), + text, + now.addSecs(hours * 60 * 60), + {}, + {}, + }; + } + + const ReminderDateResolution dateResolution = resolveReminderDate(text, currentDate); + if (!dateResolution.date.isValid()) + { + return {ReminderCommandType::Invalid, {}, text, {}, {}, QStringLiteral("没有识别到有效提醒日期。")}; + } + + const QRegularExpression clockExpression(QStringLiteral("(上午|早上|下午|晚上|中午|凌晨)?\\s*([0-9]{1,2}|[一二两三四五六七八九十]+)\\s*点\\s*(?:(\\d{1,2})\\s*分?)?")); + match = clockExpression.match(text); + if (match.hasMatch()) + { + const QString period = match.captured(1); + int hour = adjustedHour(period, parseSmallInteger(match.captured(2))); + const int minute = match.captured(3).isEmpty() ? 0 : match.captured(3).toInt(); + if (hour < 0 || hour > 23 || minute < 0 || minute > 59) + { + return {ReminderCommandType::Invalid, {}, text, {}, {}, QStringLiteral("没有识别到有效提醒时间。")}; + } + + QDateTime remindAt(dateResolution.date, QTime(hour, minute)); + if (remindAt <= now) + { + if (dateResolution.explicitDate) + { + return {ReminderCommandType::Invalid, {}, text, {}, {}, QStringLiteral("提醒时间必须晚于当前时间。")}; + } + remindAt = remindAt.addDays(1); + } + + return { + ReminderCommandType::Create, + extractTitle(text, match.captured(0)), + text, + remindAt, + {}, + {}, + }; + } + + const QRegularExpression colonClockExpression(QStringLiteral("(明天)?\\s*(?:在)?\\s*([01]?\\d|2[0-3])\\s*[::]\\s*([0-5]\\d)")); + match = colonClockExpression.match(text); + if (match.hasMatch()) + { + QDateTime remindAt(dateResolution.date, QTime(match.captured(2).toInt(), match.captured(3).toInt())); + if (remindAt <= now) + { + if (dateResolution.explicitDate) + { + return {ReminderCommandType::Invalid, {}, text, {}, {}, QStringLiteral("提醒时间必须晚于当前时间。")}; + } + remindAt = remindAt.addDays(1); + } + + return { + ReminderCommandType::Create, + extractTitle(text, match.captured(0)), + text, + remindAt, + {}, + {}, + }; + } + + return {ReminderCommandType::Invalid, {}, text, {}, {}, QStringLiteral("没有识别到提醒时间。支持如“10分钟后提醒我喝水”“明天9点提醒我开会”。")}; +} + +QString ReminderParser::extractTitle(QString text, const QString &timeExpression) const +{ + text = removeFirst(text, timeExpression); + const QStringList tokensToRemove = { + QStringLiteral("提醒我"), + QStringLiteral("提醒"), + QStringLiteral("叫我"), + QStringLiteral("到点"), + QStringLiteral("的时候"), + QStringLiteral("请"), + QStringLiteral("帮我"), + QStringLiteral("今天"), + QStringLiteral("明天"), + QStringLiteral("后天"), + }; + + for (const QString &token : tokensToRemove) + { + text.remove(token); + } + + text.remove(QRegularExpression(QStringLiteral("\\d{1,2}\\s*月\\s*\\d{1,2}\\s*(?:日|号)?"))); + text.remove(QRegularExpression(QStringLiteral("\\d{1,2}\\s*/\\s*\\d{1,2}"))); + text.remove(QRegularExpression(QStringLiteral("下周\\s*[一二三四五六日天1-7]"))); + + text = text.trimmed(); + while (text.startsWith(QChar(0x3000)) || text.startsWith(QLatin1Char(' ')) || text.startsWith(QLatin1Char(',')) || text.startsWith(QChar(0xff0c))) + { + text.remove(0, 1); + text = text.trimmed(); + } + + return text.isEmpty() ? QStringLiteral("提醒") : text; +} diff --git a/src/reminder/ReminderParser.h b/src/reminder/ReminderParser.h new file mode 100644 index 0000000..1b586fe --- /dev/null +++ b/src/reminder/ReminderParser.h @@ -0,0 +1,16 @@ +#pragma once + +#include "ReminderTypes.h" + +#include +#include + +class ReminderParser +{ +public: + ReminderCommand parse(const QString &text, const QDateTime &now = QDateTime::currentDateTime()) const; + +private: + ReminderCommand parseCreateCommand(const QString &text, const QDateTime &now) const; + QString extractTitle(QString text, const QString &timeExpression) const; +}; diff --git a/src/reminder/ReminderSoundPlayer.cpp b/src/reminder/ReminderSoundPlayer.cpp new file mode 100644 index 0000000..a228e16 --- /dev/null +++ b/src/reminder/ReminderSoundPlayer.cpp @@ -0,0 +1,22 @@ +#include "ReminderSoundPlayer.h" + +#include "ReminderSoundRepository.h" + +#include +#include +#include + +void ReminderSoundPlayer::play(const QString &soundId, double volume) +{ + const QString path = ReminderSoundRepository::soundPath(soundId); + if (!QFileInfo::exists(path)) + { + return; + } + + m_soundEffect.stop(); + m_soundEffect.setLoopCount(1); + m_soundEffect.setVolume(static_cast(qBound(0.0, volume, 1.0))); + m_soundEffect.setSource(QUrl::fromLocalFile(path)); + m_soundEffect.play(); +} diff --git a/src/reminder/ReminderSoundPlayer.h b/src/reminder/ReminderSoundPlayer.h new file mode 100644 index 0000000..8acf52f --- /dev/null +++ b/src/reminder/ReminderSoundPlayer.h @@ -0,0 +1,13 @@ +#pragma once + +#include +#include + +class ReminderSoundPlayer +{ +public: + void play(const QString &soundId, double volume); + +private: + QSoundEffect m_soundEffect; +}; diff --git a/src/reminder/ReminderSoundRepository.cpp b/src/reminder/ReminderSoundRepository.cpp new file mode 100644 index 0000000..3bdbb18 --- /dev/null +++ b/src/reminder/ReminderSoundRepository.cpp @@ -0,0 +1,350 @@ +#include "ReminderSoundRepository.h" + +#include "../util/ResourcePaths.h" + +#include +#include +#include +#include +#include +#include +#include + +namespace +{ +constexpr qint64 MaxSoundFileBytes = 5 * 1024 * 1024; +constexpr int MaxSoundDurationSeconds = 30; + +QString appDataPath() +{ + const QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + return path.isEmpty() ? QDir::currentPath() : path; +} + +QString sanitizedSoundId(QString value) +{ + value = value.trimmed().toLower(); + value.replace(QRegularExpression(QStringLiteral("[^a-z0-9._-]+")), QStringLiteral("_")); + while (value.startsWith(QLatin1Char('.')) || value.startsWith(QLatin1Char('_')) || value.startsWith(QLatin1Char('-'))) + { + value.remove(0, 1); + } + while (value.endsWith(QLatin1Char('.')) || value.endsWith(QLatin1Char('_')) || value.endsWith(QLatin1Char('-'))) + { + value.chop(1); + } + return value.isEmpty() ? QStringLiteral("reminder_sound") : value; +} + +QString displayNameForBuiltInSound(const QString &id) +{ + if (id == QStringLiteral("reminder_default")) + { + return QStringLiteral("默认提醒"); + } + + if (id == QStringLiteral("reminder_soft")) + { + return QStringLiteral("柔和提醒"); + } + + return id; +} + +ReminderSoundInfo builtInSound(const QString &id) +{ + return { + id, + displayNameForBuiltInSound(id), + ResourcePaths::reminderSoundsRootPath() + QLatin1Char('/') + id + QStringLiteral(".wav"), + true, + }; +} + +bool readChunkHeader(QDataStream &stream, QByteArray *id, quint32 *size) +{ + char chunkId[4] = {}; + if (stream.readRawData(chunkId, 4) != 4) + { + return false; + } + + *id = QByteArray(chunkId, 4); + stream >> *size; + return stream.status() == QDataStream::Ok; +} +} + +QString ReminderSoundRepository::defaultSoundId() +{ + return QStringLiteral("reminder_default"); +} + +QVector ReminderSoundRepository::availableSounds() +{ + QVector sounds; + const QStringList builtInIds = { + QStringLiteral("reminder_default"), + QStringLiteral("reminder_soft"), + }; + + for (const QString &id : builtInIds) + { + const ReminderSoundInfo info = builtInSound(id); + if (QFileInfo::exists(info.path)) + { + sounds.append(info); + } + } + + QDir userRoot(userSoundsRootPath()); + const QFileInfoList userFiles = userRoot.entryInfoList({QStringLiteral("*.wav")}, QDir::Files, QDir::Name); + for (const QFileInfo &fileInfo : userFiles) + { + const QString id = fileInfo.completeBaseName(); + if (isBuiltInSound(id)) + { + continue; + } + + sounds.append({ + id, + id, + QDir::cleanPath(fileInfo.absoluteFilePath()), + false, + }); + } + + return sounds; +} + +ReminderSoundInfo ReminderSoundRepository::soundInfo(const QString &soundId) +{ + const QString normalizedId = soundId.trimmed().isEmpty() ? defaultSoundId() : soundId.trimmed(); + for (const ReminderSoundInfo &info : availableSounds()) + { + if (info.id == normalizedId) + { + return info; + } + } + + return builtInSound(defaultSoundId()); +} + +QString ReminderSoundRepository::soundPath(const QString &soundId) +{ + return soundInfo(soundId).path; +} + +QString ReminderSoundRepository::userSoundsRootPath() +{ + return QDir(appDataPath()).filePath(QStringLiteral("sounds/reminders")); +} + +bool ReminderSoundRepository::isBuiltInSound(const QString &soundId) +{ + return soundId == QStringLiteral("reminder_default") + || soundId == QStringLiteral("reminder_soft"); +} + +bool ReminderSoundRepository::importSoundFile(const QString &sourcePath, QString *importedSoundId, QString *errorMessage) +{ + const QFileInfo sourceInfo(sourcePath); + if (!sourceInfo.exists() || !sourceInfo.isFile()) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("音效文件不存在。"); + } + return false; + } + + if (sourceInfo.suffix().compare(QStringLiteral("wav"), Qt::CaseInsensitive) != 0) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("只支持导入 wav 音效。"); + } + return false; + } + + if (!validateWaveFile(sourceInfo.absoluteFilePath(), errorMessage)) + { + return false; + } + + QDir userRoot(userSoundsRootPath()); + if (!userRoot.exists() && !userRoot.mkpath(QStringLiteral("."))) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("无法创建用户音效目录。"); + } + return false; + } + + QString id = sanitizedSoundId(sourceInfo.completeBaseName()); + if (isBuiltInSound(id)) + { + id.prepend(QStringLiteral("user_")); + } + + QString targetPath = userRoot.filePath(id + QStringLiteral(".wav")); + int suffix = 2; + while (QFileInfo::exists(targetPath)) + { + targetPath = userRoot.filePath(id + QStringLiteral("_") + QString::number(suffix) + QStringLiteral(".wav")); + ++suffix; + } + + const QString finalId = QFileInfo(targetPath).completeBaseName(); + if (!QFile::copy(sourceInfo.absoluteFilePath(), targetPath)) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("复制音效文件失败。"); + } + return false; + } + + if (importedSoundId != nullptr) + { + *importedSoundId = finalId; + } + return true; +} + +bool ReminderSoundRepository::deleteUserSound(const QString &soundId, QString *errorMessage) +{ + const QString id = soundId.trimmed(); + if (id.isEmpty() || isBuiltInSound(id)) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("内置提醒音效不能删除。"); + } + return false; + } + + const QString path = QDir(userSoundsRootPath()).filePath(id + QStringLiteral(".wav")); + QFile file(path); + if (!file.exists()) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("没有找到可删除的用户音效。"); + } + return false; + } + + if (!file.remove()) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("删除用户音效失败。"); + } + return false; + } + + return true; +} + +bool ReminderSoundRepository::validateWaveFile(const QString &path, QString *errorMessage) +{ + QFile file(path); + if (!file.open(QIODevice::ReadOnly)) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("无法读取音效文件。"); + } + return false; + } + + if (file.size() <= 44 || file.size() > MaxSoundFileBytes) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("音效文件大小不符合要求。"); + } + return false; + } + + QDataStream stream(&file); + stream.setByteOrder(QDataStream::LittleEndian); + + char riff[4] = {}; + char wave[4] = {}; + quint32 riffSize = 0; + if (stream.readRawData(riff, 4) != 4) + { + return false; + } + stream >> riffSize; + if (stream.readRawData(wave, 4) != 4 + || QByteArray(riff, 4) != QByteArray("RIFF", 4) + || QByteArray(wave, 4) != QByteArray("WAVE", 4)) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("不是有效的 RIFF/WAVE 文件。"); + } + return false; + } + + quint16 audioFormat = 0; + quint16 channels = 0; + quint32 sampleRate = 0; + quint16 bitsPerSample = 0; + quint32 dataSize = 0; + bool hasFmt = false; + bool hasData = false; + + while (!stream.atEnd()) + { + QByteArray chunkId; + quint32 chunkSize = 0; + if (!readChunkHeader(stream, &chunkId, &chunkSize)) + { + break; + } + + const qint64 chunkStart = file.pos(); + if (chunkId == QByteArray("fmt ", 4)) + { + quint32 byteRate = 0; + quint16 blockAlign = 0; + stream >> audioFormat >> channels >> sampleRate >> byteRate >> blockAlign >> bitsPerSample; + hasFmt = true; + } + else if (chunkId == QByteArray("data", 4)) + { + dataSize = chunkSize; + hasData = true; + } + + file.seek(chunkStart + chunkSize + (chunkSize % 2)); + } + + if (!hasFmt || !hasData || audioFormat != 1 || channels == 0 || sampleRate == 0 || bitsPerSample == 0 || dataSize == 0) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("音效文件格式不受支持。请使用 PCM wav。"); + } + return false; + } + + const double durationSeconds = static_cast(dataSize) / static_cast(sampleRate * channels * (bitsPerSample / 8.0)); + if (durationSeconds <= 0.0 || durationSeconds > MaxSoundDurationSeconds) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("音效时长不符合要求。"); + } + return false; + } + + return true; +} diff --git a/src/reminder/ReminderSoundRepository.h b/src/reminder/ReminderSoundRepository.h new file mode 100644 index 0000000..bb5e400 --- /dev/null +++ b/src/reminder/ReminderSoundRepository.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +struct ReminderSoundInfo +{ + QString id; + QString displayName; + QString path; + bool builtIn = false; +}; + +class ReminderSoundRepository +{ +public: + static QString defaultSoundId(); + static QVector availableSounds(); + static ReminderSoundInfo soundInfo(const QString &soundId); + static QString soundPath(const QString &soundId); + static QString userSoundsRootPath(); + static bool isBuiltInSound(const QString &soundId); + static bool importSoundFile(const QString &sourcePath, QString *importedSoundId = nullptr, QString *errorMessage = nullptr); + static bool deleteUserSound(const QString &soundId, QString *errorMessage = nullptr); + static bool validateWaveFile(const QString &path, QString *errorMessage = nullptr); +}; diff --git a/src/reminder/ReminderStore.cpp b/src/reminder/ReminderStore.cpp new file mode 100644 index 0000000..1a42ee8 --- /dev/null +++ b/src/reminder/ReminderStore.cpp @@ -0,0 +1,180 @@ +#include "ReminderStore.h" + +#include "../util/Logger.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace +{ +const QString ReminderStoreFileName = QStringLiteral("reminders.json"); + +QJsonObject reminderToObject(const ReminderItem &item) +{ + QJsonObject object; + object.insert(QStringLiteral("id"), item.id); + object.insert(QStringLiteral("title"), item.title); + object.insert(QStringLiteral("originalText"), item.originalText); + object.insert(QStringLiteral("remindAt"), item.remindAt.toString(Qt::ISODate)); + object.insert(QStringLiteral("status"), reminderStatusToString(item.status)); + object.insert(QStringLiteral("createdAt"), item.createdAt.toString(Qt::ISODate)); + object.insert(QStringLiteral("soundId"), item.soundId); + return object; +} + +ReminderItem reminderFromObject(const QJsonObject &object) +{ + ReminderItem item; + item.id = object.value(QStringLiteral("id")).toString().trimmed(); + item.title = object.value(QStringLiteral("title")).toString().trimmed(); + item.originalText = object.value(QStringLiteral("originalText")).toString(); + item.remindAt = QDateTime::fromString(object.value(QStringLiteral("remindAt")).toString(), Qt::ISODate); + item.status = reminderStatusFromString(object.value(QStringLiteral("status")).toString()); + item.createdAt = QDateTime::fromString(object.value(QStringLiteral("createdAt")).toString(), Qt::ISODate); + item.soundId = object.value(QStringLiteral("soundId")).toString().trimmed(); + return item; +} +} + +QVector ReminderStore::load(QString *errorMessage) const +{ + QFile file(storePath()); + if (!file.exists()) + { + return {}; + } + + if (!file.open(QIODevice::ReadOnly)) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("无法读取提醒文件。"); + } + return {}; + } + + QJsonParseError parseError; + const QJsonDocument document = QJsonDocument::fromJson(file.readAll(), &parseError); + if (parseError.error != QJsonParseError::NoError || !document.isObject()) + { + file.close(); + backupBrokenStore(storePath()); + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("提醒文件损坏,已备份并使用空提醒列表。"); + } + return {}; + } + + QVector items; + const QJsonArray reminders = document.object().value(QStringLiteral("reminders")).toArray(); + for (const QJsonValue &value : reminders) + { + if (!value.isObject()) + { + continue; + } + + ReminderItem item = reminderFromObject(value.toObject()); + if (item.id.isEmpty() || !item.remindAt.isValid()) + { + continue; + } + + if (item.title.isEmpty()) + { + item.title = QStringLiteral("提醒"); + } + + if (!item.createdAt.isValid()) + { + item.createdAt = item.remindAt; + } + + items.append(item); + } + + return sortedReminders(items); +} + +bool ReminderStore::save(const QVector &items, QString *errorMessage) const +{ + QDir directory(configDirectoryPath()); + if (!directory.exists() && !directory.mkpath(QStringLiteral("."))) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("无法创建提醒配置目录。"); + } + return false; + } + + QJsonArray reminders; + for (const ReminderItem &item : items) + { + reminders.append(reminderToObject(item)); + } + + QJsonObject root; + root.insert(QStringLiteral("reminders"), reminders); + + QFile file(storePath()); + if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + if (errorMessage != nullptr) + { + *errorMessage = QStringLiteral("无法写入提醒文件。"); + } + return false; + } + + const QJsonDocument document(root); + return file.write(document.toJson(QJsonDocument::Indented)) >= 0; +} + +QString ReminderStore::storePath() const +{ + return QDir(configDirectoryPath()).filePath(ReminderStoreFileName); +} + +QString ReminderStore::configDirectoryPath() const +{ + const QString path = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); + return path.isEmpty() ? QDir::currentPath() : path; +} + +void ReminderStore::backupBrokenStore(const QString &filePath) const +{ + QFile file(filePath); + if (!file.exists()) + { + return; + } + + const QFileInfo fileInfo(filePath); + const QString timestamp = QDateTime::currentDateTime().toString(QStringLiteral("yyyyMMdd-HHmmss")); + QString backupPath = fileInfo.dir().filePath(QStringLiteral("reminders.broken.") + timestamp + QStringLiteral(".json")); + int suffix = 1; + while (QFile::exists(backupPath)) + { + backupPath = fileInfo.dir().filePath( + QStringLiteral("reminders.broken.") + + timestamp + + QStringLiteral("-") + + QString::number(suffix) + + QStringLiteral(".json")); + ++suffix; + } + + if (!file.rename(backupPath)) + { + Logger::warning(QStringLiteral("Failed to back up broken reminders file: ") + filePath); + } +} diff --git a/src/reminder/ReminderStore.h b/src/reminder/ReminderStore.h new file mode 100644 index 0000000..a932990 --- /dev/null +++ b/src/reminder/ReminderStore.h @@ -0,0 +1,18 @@ +#pragma once + +#include "ReminderTypes.h" + +#include +#include + +class ReminderStore +{ +public: + QVector load(QString *errorMessage = nullptr) const; + bool save(const QVector &items, QString *errorMessage = nullptr) const; + QString storePath() const; + +private: + QString configDirectoryPath() const; + void backupBrokenStore(const QString &filePath) const; +}; diff --git a/src/reminder/ReminderTypes.cpp b/src/reminder/ReminderTypes.cpp new file mode 100644 index 0000000..b3fd7f3 --- /dev/null +++ b/src/reminder/ReminderTypes.cpp @@ -0,0 +1,52 @@ +#include "ReminderTypes.h" + +#include + +QString reminderStatusToString(ReminderStatus status) +{ + switch (status) + { + case ReminderStatus::Pending: + return QStringLiteral("pending"); + case ReminderStatus::Triggered: + return QStringLiteral("triggered"); + case ReminderStatus::Canceled: + return QStringLiteral("canceled"); + } + + return QStringLiteral("pending"); +} + +ReminderStatus reminderStatusFromString(const QString &status) +{ + const QString normalized = status.trimmed().toLower(); + if (normalized == QStringLiteral("triggered")) + { + return ReminderStatus::Triggered; + } + + if (normalized == QStringLiteral("canceled")) + { + return ReminderStatus::Canceled; + } + + return ReminderStatus::Pending; +} + +QString reminderDisplayTime(const QDateTime &dateTime) +{ + return dateTime.toLocalTime().toString(QStringLiteral("yyyy-MM-dd HH:mm")); +} + +QVector sortedReminders(QVector reminders) +{ + std::sort(reminders.begin(), reminders.end(), [](const ReminderItem &left, const ReminderItem &right) { + if (left.remindAt == right.remindAt) + { + return left.createdAt < right.createdAt; + } + + return left.remindAt < right.remindAt; + }); + return reminders; +} diff --git a/src/reminder/ReminderTypes.h b/src/reminder/ReminderTypes.h new file mode 100644 index 0000000..89df221 --- /dev/null +++ b/src/reminder/ReminderTypes.h @@ -0,0 +1,46 @@ +#pragma once + +#include +#include +#include + +enum class ReminderStatus +{ + Pending, + Triggered, + Canceled, +}; + +enum class ReminderCommandType +{ + Create, + List, + Cancel, + Invalid, +}; + +struct ReminderItem +{ + QString id; + QString title; + QString originalText; + QDateTime remindAt; + ReminderStatus status = ReminderStatus::Pending; + QDateTime createdAt; + QString soundId; +}; + +struct ReminderCommand +{ + ReminderCommandType type = ReminderCommandType::Invalid; + QString title; + QString originalText; + QDateTime remindAt; + QString cancelQuery; + QString errorMessage; +}; + +QString reminderStatusToString(ReminderStatus status); +ReminderStatus reminderStatusFromString(const QString &status); +QString reminderDisplayTime(const QDateTime &dateTime); +QVector sortedReminders(QVector reminders); diff --git a/src/tray/TrayController.cpp b/src/tray/TrayController.cpp index 151e589..03fb3fe 100644 --- a/src/tray/TrayController.cpp +++ b/src/tray/TrayController.cpp @@ -62,6 +62,16 @@ void TrayController::show() m_trayIcon.show(); } +void TrayController::showNotification(const QString &title, const QString &message) +{ + if (!isAvailable() || !m_trayIcon.isVisible()) + { + return; + } + + m_trayIcon.showMessage(title, message, QSystemTrayIcon::Information, 10000); +} + void TrayController::createMenu() { QAction *showAction = m_menu.addAction(QStringLiteral("显示桌宠")); diff --git a/src/tray/TrayController.h b/src/tray/TrayController.h index fa91b7a..0f43d44 100644 --- a/src/tray/TrayController.h +++ b/src/tray/TrayController.h @@ -12,6 +12,7 @@ public: bool isAvailable() const; void show(); + void showNotification(const QString &title, const QString &message); private: void createMenu(); diff --git a/src/ui/PetWindow.cpp b/src/ui/PetWindow.cpp index 007555e..c644c46 100644 --- a/src/ui/PetWindow.cpp +++ b/src/ui/PetWindow.cpp @@ -7,6 +7,11 @@ #include "../character/CharacterPackageLoader.h" #include "../character/CharacterPackageRepository.h" #include "../config/ConfigManager.h" +#include "../notification/NotificationDispatcher.h" +#include "../reminder/ReminderCommandHandler.h" +#include "../reminder/ReminderManager.h" +#include "../reminder/ReminderSoundPlayer.h" +#include "../reminder/ReminderSoundRepository.h" #include "../util/Logger.h" #include "ChatBubble.h" #include "ChatHistoryPanel.h" @@ -37,6 +42,7 @@ #include #include +#include namespace { @@ -88,6 +94,8 @@ AppConfig normalizedAppConfig(AppConfig config) { config.characterId = CharacterPackageRepository::defaultCharacterId(); } + config.reminderSoundId = ReminderSoundRepository::soundInfo(config.reminderSoundId).id; + config.reminderSoundVolume = qBound(0.0, config.reminderSoundVolume, 1.0); return config; } @@ -156,6 +164,9 @@ PetWindow::PetWindow(QWidget *parent) , m_chatInputDialog(std::make_unique(MaxUserMessageLength, this)) , m_conversationManager(std::make_unique()) , m_conversationStore(std::make_unique(ConfigManager().conversationHistoryPath())) + , m_notificationDispatcher(std::make_unique()) + , m_reminderManager(std::make_unique()) + , m_reminderSoundPlayer(std::make_unique()) , m_petView(new PetView(this)) , m_dragging(false) , m_alwaysOnTop(true) @@ -203,6 +214,13 @@ PetWindow::PetWindow(QWidget *parent) return !window.isNull() && window->submitChatMessage(message); }); + m_reminderManager->setTriggeredCallback([window](const ReminderItem &item) { + if (!window.isNull()) + { + window->handleTriggeredReminder(item); + } + }); + loadInitialImage(); } @@ -321,11 +339,29 @@ void PetWindow::showBubbleMessage(const QString &message) void PetWindow::openSettingsDialog() { ConfigManager configManager; - SettingsDialog dialog(configManager.loadAIConfigStore(), currentAppConfig(), [this]() { - return isManualStateSwitchLocked(); - }, [this]() { - clearConversation(); - }, this); + SettingsDialog dialog( + configManager.loadAIConfigStore(), + currentAppConfig(), + m_reminderManager ? m_reminderManager->allReminders() : QVector(), + [this]() { + return isManualStateSwitchLocked(); + }, + [this]() { + clearConversation(); + }, + [this](const QString &reminderId, QString *errorMessage) { + return m_reminderManager && m_reminderManager->cancelReminder(reminderId, errorMessage); + }, + [this](QString *errorMessage) { + return m_reminderManager && m_reminderManager->clearFinishedReminders(errorMessage); + }, + [this](const QString &soundId, double volume) { + if (m_reminderSoundPlayer) + { + m_reminderSoundPlayer->play(soundId, volume); + } + }, + this); centerDialogOnScreen(&dialog, this); if (dialog.exec() != QDialog::Accepted) { @@ -374,6 +410,14 @@ void PetWindow::setSettingsFallbackInContextMenuEnabled(bool enabled) m_settingsFallbackInContextMenuEnabled = enabled; } +void PetWindow::setTrayNotificationCallback(std::function callback) +{ + if (m_notificationDispatcher) + { + m_notificationDispatcher->setShowCallback(std::move(callback)); + } +} + void PetWindow::contextMenuEvent(QContextMenuEvent *event) { resetBubbleAutoHideTimer(); @@ -455,12 +499,6 @@ void PetWindow::startChat() bool PetWindow::submitChatMessage(const QString &message) { - if (!m_conversationManager || m_conversationManager->isBusy()) - { - showBubbleMessage(QStringLiteral("AI 回复正在进行。")); - return false; - } - const QString normalizedMessage = message.trimmed(); if (normalizedMessage.isEmpty()) { @@ -476,6 +514,11 @@ bool PetWindow::submitChatMessage(const QString &message) CommandDispatcher dispatcher; const CommandDispatchResult result = dispatcher.dispatch(normalizedMessage); + if (result.action == CommandDispatchAction::Reminder) + { + return handleReminderChatMessage(result.message); + } + if (result.action == CommandDispatchAction::UnsupportedTool) { playState(QStringLiteral("talk"), false); @@ -486,6 +529,57 @@ bool PetWindow::submitChatMessage(const QString &message) return submitAiChatMessage(result.message); } +bool PetWindow::handleReminderChatMessage(const QString &message) +{ + if (!m_reminderManager) + { + playState(QStringLiteral("error"), false); + showBubbleMessage(QStringLiteral("提醒功能初始化失败。")); + return false; + } + + const ReminderCommandResult result = ReminderCommandHandler::handle( + message, + *m_reminderManager); + playState(result.success ? QStringLiteral("talk") : QStringLiteral("error"), false); + showBubbleMessage(result.message); + return result.success; +} + +void PetWindow::handleTriggeredReminder(const ReminderItem &item) +{ + if (m_appConfig.reminderSoundEnabled && m_reminderSoundPlayer) + { + m_reminderSoundPlayer->play(m_appConfig.reminderSoundId, m_appConfig.reminderSoundVolume); + } + + if (!isVisible()) + { + if (m_notificationDispatcher) + { + m_notificationDispatcher->showReminder(QStringLiteral("定时提醒"), QStringLiteral("到时间啦:%1").arg(item.title)); + } + return; + } + + if (m_dragging) + { + m_deferredTriggeredReminders.append(item); + return; + } + + showTriggeredReminder(item); +} + +void PetWindow::showTriggeredReminder(const ReminderItem &item) +{ + const QString reminderState = m_clips.contains(QStringLiteral("happy")) + ? QStringLiteral("happy") + : QStringLiteral("talk"); + playState(reminderState, false); + showBubbleMessage(QStringLiteral("到时间啦:%1").arg(item.title)); +} + bool PetWindow::submitAiChatMessage(const QString &message) { if (!m_conversationManager || m_conversationManager->isBusy()) @@ -814,6 +908,10 @@ void PetWindow::hideEvent(QHideEvent *event) void PetWindow::showEvent(QShowEvent *event) { QWidget::showEvent(event); + if (m_reminderManager) + { + m_reminderManager->start(); + } scheduleAnimationPrewarm(); } @@ -878,6 +976,12 @@ void PetWindow::mouseReleaseEvent(QMouseEvent *event) m_dragging = false; playResolvedState(m_stateMachine.endDrag(), false); scheduleAnimationPrewarm(); + const QVector deferredReminders = m_deferredTriggeredReminders; + m_deferredTriggeredReminders.clear(); + for (const ReminderItem &item : deferredReminders) + { + showTriggeredReminder(item); + } event->accept(); return; } diff --git a/src/ui/PetWindow.h b/src/ui/PetWindow.h index 0730143..cb144fc 100644 --- a/src/ui/PetWindow.h +++ b/src/ui/PetWindow.h @@ -4,6 +4,7 @@ #include "../character/CharacterPackage.h" #include "../character/FrameAnimator.h" #include "../config/AppConfig.h" +#include "../reminder/ReminderTypes.h" #include "../state/PetStateMachine.h" #include @@ -11,9 +12,11 @@ #include #include #include +#include #include #include +#include #include class QMenu; @@ -26,7 +29,10 @@ class ChatHistoryPanel; class ChatInputDialog; class ConversationManager; class ConversationStore; +class NotificationDispatcher; class PetView; +class ReminderManager; +class ReminderSoundPlayer; class PetWindow : public QWidget { @@ -39,6 +45,7 @@ public: void openSettingsDialog(); void activateFromExternalInstance(); void setSettingsFallbackInContextMenuEnabled(bool enabled); + void setTrayNotificationCallback(std::function callback); void pauseAnimation(); void resumeAnimation(); void showBubbleMessage(const QString &message); @@ -61,6 +68,9 @@ private: void startChat(); bool submitChatMessage(const QString &message); bool submitAiChatMessage(const QString &message); + bool handleReminderChatMessage(const QString &message); + void handleTriggeredReminder(const ReminderItem &item); + void showTriggeredReminder(const ReminderItem &item); void clearConversation(); void cancelActiveAIRequest(); void showConversationHistory(); @@ -108,6 +118,9 @@ private: std::unique_ptr m_chatInputDialog; std::unique_ptr m_conversationManager; std::unique_ptr m_conversationStore; + std::unique_ptr m_notificationDispatcher; + std::unique_ptr m_reminderManager; + std::unique_ptr m_reminderSoundPlayer; PetView *m_petView; QTimer m_idleBehaviorTimer; QTimer m_behaviorReturnTimer; @@ -123,6 +136,7 @@ private: QPoint m_dragOffset; QString m_streamingAssistantText; QStringList m_animationPrewarmQueue; + QVector m_deferredTriggeredReminders; qint64 m_clipAccessSerial = 0; bool m_dragging; bool m_alwaysOnTop; diff --git a/src/ui/SettingsDialog.cpp b/src/ui/SettingsDialog.cpp index 55dd0b8..ddd0d2e 100644 --- a/src/ui/SettingsDialog.cpp +++ b/src/ui/SettingsDialog.cpp @@ -4,7 +4,9 @@ #include "../ai/LLMTypes.h" #include "../character/CharacterPackageRepository.h" #include "../config/SecretStore.h" +#include "../reminder/ReminderSoundRepository.h" +#include #include #include #include @@ -17,11 +19,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -60,13 +64,70 @@ QString userVisibleErrorMessage(const ChatResponse &response) return message; } + +QString reminderStatusDisplayText(ReminderStatus status) +{ + switch (status) + { + case ReminderStatus::Pending: + return QStringLiteral("待提醒"); + case ReminderStatus::Triggered: + return QStringLiteral("已触发"); + case ReminderStatus::Canceled: + return QStringLiteral("已取消"); + } + + return QStringLiteral("待提醒"); +} + +bool reminderMatchesStatusFilter(const ReminderItem &item, const QString &filter) +{ + if (filter == QStringLiteral("all")) + { + return true; + } + + if (filter == QStringLiteral("pending")) + { + return item.status == ReminderStatus::Pending; + } + + if (filter == QStringLiteral("triggered")) + { + return item.status == ReminderStatus::Triggered; + } + + if (filter == QStringLiteral("canceled")) + { + return item.status == ReminderStatus::Canceled; + } + + return item.status == ReminderStatus::Pending; +} + +bool hasFinishedReminders(const QVector &reminders) +{ + for (const ReminderItem &item : reminders) + { + if (item.status == ReminderStatus::Triggered || item.status == ReminderStatus::Canceled) + { + return true; + } + } + + return false; +} } SettingsDialog::SettingsDialog( const AIConfigStore &configStore, const AppConfig &appConfig, + const QVector &reminders, std::function aiTestBlocked, std::function clearConversationHistoryCallback, + std::function cancelReminderCallback, + std::function clearFinishedRemindersCallback, + std::function playReminderSoundCallback, QWidget *parent) : QDialog(parent) , m_providerComboBox(new QComboBox(this)) @@ -95,10 +156,26 @@ SettingsDialog::SettingsDialog( , m_importCharacterButton(new QPushButton(QStringLiteral("导入角色文件夹"), this)) , m_deleteCharacterButton(new QPushButton(QStringLiteral("删除角色"), this)) , m_characterStatusLabel(new QLabel(this)) + , m_reminderStatusFilterComboBox(new QComboBox(this)) + , m_reminderListWidget(new QListWidget(this)) + , m_cancelReminderButton(new QPushButton(QStringLiteral("取消选中提醒"), this)) + , m_clearFinishedRemindersButton(new QPushButton(QStringLiteral("清理历史"), this)) + , m_reminderStatusLabel(new QLabel(this)) + , m_reminderSoundEnabledCheckBox(new QCheckBox(QStringLiteral("启用提醒音效"), this)) + , m_reminderSoundVolumeSpinBox(new QSpinBox(this)) + , m_reminderSoundComboBox(new QComboBox(this)) + , m_importReminderSoundButton(new QPushButton(QStringLiteral("导入音效"), this)) + , m_deleteReminderSoundButton(new QPushButton(QStringLiteral("删除音效"), this)) + , m_testReminderSoundButton(new QPushButton(QStringLiteral("试听"), this)) + , m_reminderSoundStatusLabel(new QLabel(this)) , m_configStore(configStore) , m_appConfig(appConfig) + , m_reminders(reminders) , m_aiTestBlocked(std::move(aiTestBlocked)) , m_clearConversationHistory(std::move(clearConversationHistoryCallback)) + , m_cancelReminder(std::move(cancelReminderCallback)) + , m_clearFinishedReminders(std::move(clearFinishedRemindersCallback)) + , m_playReminderSound(std::move(playReminderSoundCallback)) { setWindowTitle(QStringLiteral("设置")); setModal(true); @@ -278,6 +355,75 @@ SettingsDialog::SettingsDialog( auto *chatPage = new QWidget(this); chatPage->setLayout(chatPageLayout); + m_reminderStatusLabel->setObjectName(QStringLiteral("HintLabel")); + m_reminderStatusLabel->setWordWrap(true); + m_reminderSoundStatusLabel->setObjectName(QStringLiteral("HintLabel")); + m_reminderSoundStatusLabel->setWordWrap(true); + + m_reminderStatusFilterComboBox->addItem(QStringLiteral("待提醒"), QStringLiteral("pending")); + m_reminderStatusFilterComboBox->addItem(QStringLiteral("已触发"), QStringLiteral("triggered")); + m_reminderStatusFilterComboBox->addItem(QStringLiteral("已取消"), QStringLiteral("canceled")); + m_reminderStatusFilterComboBox->addItem(QStringLiteral("全部"), QStringLiteral("all")); + m_reminderListWidget->setObjectName(QStringLiteral("ReminderList")); + m_reminderListWidget->setFrameShape(QFrame::NoFrame); + m_reminderListWidget->setMinimumHeight(150); + m_reminderListWidget->setSelectionMode(QAbstractItemView::SingleSelection); + m_reminderSoundEnabledCheckBox->setChecked(m_appConfig.reminderSoundEnabled); + m_reminderSoundVolumeSpinBox->setRange(0, 100); + m_reminderSoundVolumeSpinBox->setSingleStep(5); + m_reminderSoundVolumeSpinBox->setSuffix(QStringLiteral("%")); + m_reminderSoundVolumeSpinBox->setValue(qRound(qBound(0.0, m_appConfig.reminderSoundVolume, 1.0) * 100.0)); + reloadReminderList(); + reloadReminderSoundList(m_appConfig.reminderSoundId); + + auto *reminderTitleLabel = new QLabel(QStringLiteral("提醒"), this); + reminderTitleLabel->setObjectName(QStringLiteral("PageTitle")); + auto *reminderHintLabel = new QLabel(QStringLiteral("这里显示通过聊天创建的待触发提醒。内置提醒音效不可删除,导入音效仅支持 PCM wav。"), this); + reminderHintLabel->setObjectName(QStringLiteral("HintLabel")); + reminderHintLabel->setWordWrap(true); + + auto *reminderListLayout = new QVBoxLayout(); + reminderListLayout->setSpacing(8); + auto *reminderFilterLayout = new QHBoxLayout(); + reminderFilterLayout->addWidget(new QLabel(QStringLiteral("状态"), this)); + reminderFilterLayout->addWidget(m_reminderStatusFilterComboBox); + reminderFilterLayout->addStretch(); + reminderListLayout->addLayout(reminderFilterLayout); + reminderListLayout->addWidget(m_reminderListWidget); + auto *reminderActionLayout = new QHBoxLayout(); + reminderActionLayout->addWidget(m_cancelReminderButton); + reminderActionLayout->addWidget(m_clearFinishedRemindersButton); + reminderActionLayout->addWidget(m_reminderStatusLabel, 1); + reminderListLayout->addLayout(reminderActionLayout); + + auto *reminderSoundFormLayout = new QFormLayout(); + reminderSoundFormLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); + reminderSoundFormLayout->setLabelAlignment(Qt::AlignRight); + reminderSoundFormLayout->setHorizontalSpacing(18); + reminderSoundFormLayout->setVerticalSpacing(12); + reminderSoundFormLayout->addRow(QString(), m_reminderSoundEnabledCheckBox); + reminderSoundFormLayout->addRow(QStringLiteral("当前音效"), m_reminderSoundComboBox); + reminderSoundFormLayout->addRow(QStringLiteral("音量"), m_reminderSoundVolumeSpinBox); + + auto *reminderSoundActionLayout = new QHBoxLayout(); + reminderSoundActionLayout->addWidget(m_importReminderSoundButton); + reminderSoundActionLayout->addWidget(m_deleteReminderSoundButton); + reminderSoundActionLayout->addWidget(m_testReminderSoundButton); + reminderSoundActionLayout->addWidget(m_reminderSoundStatusLabel, 1); + + auto *reminderPageLayout = new QVBoxLayout(); + reminderPageLayout->setContentsMargins(24, 24, 24, 24); + reminderPageLayout->setSpacing(16); + reminderPageLayout->addWidget(reminderTitleLabel); + reminderPageLayout->addWidget(reminderHintLabel); + reminderPageLayout->addLayout(reminderListLayout); + reminderPageLayout->addLayout(reminderSoundFormLayout); + reminderPageLayout->addLayout(reminderSoundActionLayout); + reminderPageLayout->addStretch(); + + auto *reminderPage = new QWidget(this); + reminderPage->setLayout(reminderPageLayout); + m_characterStatusLabel->setObjectName(QStringLiteral("HintLabel")); m_characterStatusLabel->setWordWrap(true); reloadCharacterList(m_appConfig.characterId); @@ -319,6 +465,7 @@ SettingsDialog::SettingsDialog( navigationList->setSpacing(4); navigationList->addItem(QStringLiteral("AI 配置")); navigationList->addItem(QStringLiteral("聊天")); + navigationList->addItem(QStringLiteral("提醒")); navigationList->addItem(QStringLiteral("应用")); navigationList->addItem(QStringLiteral("角色")); @@ -326,6 +473,7 @@ SettingsDialog::SettingsDialog( pageStack->setObjectName(QStringLiteral("SettingsPages")); pageStack->addWidget(aiPage); pageStack->addWidget(chatPage); + pageStack->addWidget(reminderPage); pageStack->addWidget(appPage); pageStack->addWidget(characterPage); @@ -372,6 +520,16 @@ SettingsDialog::SettingsDialog( "QListWidget#SettingsNavigation::item:selected {" " background: #eaf3ff; color: #175cd3; font-weight: 600;" "}" + "QListWidget#ReminderList {" + " background: #ffffff; border: 1px solid #98a2b3; border-radius: 0px;" + " padding: 0px;" + "}" + "QListWidget#ReminderList::item {" + " min-height: 28px; padding: 5px 8px; color: #344054;" + "}" + "QListWidget#ReminderList::item:selected {" + " background: #eaf3ff; color: #175cd3;" + "}" "QStackedWidget#SettingsPages {" " background: #ffffff; border: 1px solid #eaecf0; border-radius: 8px;" "}" @@ -405,6 +563,32 @@ SettingsDialog::SettingsDialog( connect(m_deleteCharacterButton, &QPushButton::clicked, this, [this]() { deleteSelectedCharacter(); }); + connect(m_reminderStatusFilterComboBox, &QComboBox::currentIndexChanged, this, [this]() { + reloadReminderList(); + }); + connect(m_reminderListWidget, &QListWidget::currentItemChanged, this, [this]() { + updateReminderActionButtons(); + }); + connect(m_cancelReminderButton, &QPushButton::clicked, this, [this]() { + cancelSelectedReminder(); + }); + connect(m_clearFinishedRemindersButton, &QPushButton::clicked, this, [this]() { + clearFinishedReminders(); + }); + connect(m_reminderSoundComboBox, &QComboBox::currentIndexChanged, this, [this]() { + updateReminderSoundButtons(); + }); + connect(m_importReminderSoundButton, &QPushButton::clicked, this, [this]() { + importReminderSound(); + }); + connect(m_deleteReminderSoundButton, &QPushButton::clicked, this, [this]() { + deleteSelectedReminderSound(); + }); + connect(m_testReminderSoundButton, &QPushButton::clicked, this, [this]() { + testSelectedReminderSound(); + }); + updateReminderActionButtons(); + updateReminderSoundButtons(); } SettingsDialog::~SettingsDialog() @@ -455,6 +639,13 @@ AppConfig SettingsDialog::appConfig() const { config.characterId = CharacterPackageRepository::defaultCharacterId(); } + config.reminderSoundId = selectedReminderSoundId(); + if (config.reminderSoundId.isEmpty()) + { + config.reminderSoundId = ReminderSoundRepository::defaultSoundId(); + } + config.reminderSoundEnabled = m_reminderSoundEnabledCheckBox->isChecked(); + config.reminderSoundVolume = qBound(0.0, m_reminderSoundVolumeSpinBox->value() / 100.0, 1.0); return config; } @@ -762,6 +953,261 @@ void SettingsDialog::clearConversationHistory() m_clearConversationStatusLabel->setText(QStringLiteral("聊天记录已清空。")); } +void SettingsDialog::reloadReminderList() +{ + m_reminderListWidget->clear(); + + const QString filter = m_reminderStatusFilterComboBox->currentData().toString(); + const QVector reminders = sortedReminders(m_reminders); + for (const ReminderItem &item : reminders) + { + if (!reminderMatchesStatusFilter(item, filter)) + { + continue; + } + + auto *listItem = new QListWidgetItem( + QStringLiteral("%1 %2 %3 %4") + .arg(reminderDisplayTime(item.remindAt), reminderStatusDisplayText(item.status), item.title, item.originalText), + m_reminderListWidget); + listItem->setData(Qt::UserRole, item.id); + listItem->setData(Qt::UserRole + 1, reminderStatusToString(item.status)); + listItem->setToolTip(item.originalText); + } + + if (m_reminderListWidget->count() == 0) + { + m_reminderStatusLabel->setText(QStringLiteral("当前筛选条件下没有提醒。")); + } + else + { + m_reminderStatusLabel->setText(QStringLiteral("共 %1 条提醒。").arg(m_reminderListWidget->count())); + } + updateReminderActionButtons(); +} + +void SettingsDialog::reloadReminderSoundList(const QString &selectedSoundId) +{ + const QString preferredSoundId = selectedSoundId.trimmed().isEmpty() + ? ReminderSoundRepository::defaultSoundId() + : selectedSoundId.trimmed(); + + { + const QSignalBlocker blocker(m_reminderSoundComboBox); + m_reminderSoundComboBox->clear(); + const QVector sounds = ReminderSoundRepository::availableSounds(); + for (const ReminderSoundInfo &sound : sounds) + { + QString label = sound.displayName.trimmed().isEmpty() ? sound.id : sound.displayName.trimmed(); + if (label != sound.id) + { + label += QStringLiteral(" (") + sound.id + QStringLiteral(")"); + } + label += sound.builtIn ? QStringLiteral(" - 内置") : QStringLiteral(" - 用户"); + m_reminderSoundComboBox->addItem(label, sound.id); + } + + if (m_reminderSoundComboBox->count() == 0) + { + m_reminderSoundComboBox->addItem(ReminderSoundRepository::defaultSoundId(), ReminderSoundRepository::defaultSoundId()); + } + + int selectedIndex = m_reminderSoundComboBox->findData(preferredSoundId); + if (selectedIndex < 0) + { + selectedIndex = m_reminderSoundComboBox->findData(ReminderSoundRepository::defaultSoundId()); + } + m_reminderSoundComboBox->setCurrentIndex(selectedIndex >= 0 ? selectedIndex : 0); + } + + updateReminderSoundButtons(); +} + +QString SettingsDialog::selectedReminderSoundId() const +{ + return m_reminderSoundComboBox->currentData().toString().trimmed(); +} + +void SettingsDialog::updateReminderSoundButtons() +{ + const QString soundId = selectedReminderSoundId(); + const bool hasSound = !soundId.isEmpty(); + m_deleteReminderSoundButton->setEnabled(hasSound && !ReminderSoundRepository::isBuiltInSound(soundId)); + m_testReminderSoundButton->setEnabled(hasSound); +} + +void SettingsDialog::updateReminderActionButtons() +{ + QListWidgetItem *item = m_reminderListWidget->currentItem(); + const bool selectedPending = item != nullptr + && item->data(Qt::UserRole + 1).toString() == QStringLiteral("pending"); + m_cancelReminderButton->setEnabled(selectedPending); + m_clearFinishedRemindersButton->setEnabled(hasFinishedReminders(m_reminders)); +} + +void SettingsDialog::cancelSelectedReminder() +{ + QListWidgetItem *item = m_reminderListWidget->currentItem(); + if (item == nullptr) + { + return; + } + + const QString reminderId = item->data(Qt::UserRole).toString(); + const QMessageBox::StandardButton result = QMessageBox::question( + this, + QStringLiteral("取消提醒"), + QStringLiteral("确定要取消这条提醒吗?记录会保留为 canceled,不会物理删除。")); + if (result != QMessageBox::Yes) + { + return; + } + + QString errorMessage; + if (!m_cancelReminder || !m_cancelReminder(reminderId, &errorMessage)) + { + QMessageBox::warning( + this, + QStringLiteral("取消提醒失败"), + errorMessage.isEmpty() ? QStringLiteral("没有找到可取消的提醒。") : errorMessage); + return; + } + + for (ReminderItem &reminder : m_reminders) + { + if (reminder.id == reminderId) + { + reminder.status = ReminderStatus::Canceled; + break; + } + } + reloadReminderList(); + m_reminderStatusLabel->setText(QStringLiteral("已取消提醒:%1").arg(reminderId)); +} + +void SettingsDialog::clearFinishedReminders() +{ + if (!hasFinishedReminders(m_reminders)) + { + m_reminderStatusLabel->setText(QStringLiteral("没有可清理的历史提醒。")); + return; + } + + const QMessageBox::StandardButton result = QMessageBox::warning( + this, + QStringLiteral("清理提醒历史"), + QStringLiteral("确定要清理所有已触发和已取消的提醒记录吗?\n\n待提醒事项不会被删除。"), + QMessageBox::Yes | QMessageBox::Cancel, + QMessageBox::Cancel); + if (result != QMessageBox::Yes) + { + return; + } + + QString errorMessage; + if (!m_clearFinishedReminders || !m_clearFinishedReminders(&errorMessage)) + { + QMessageBox::warning( + this, + QStringLiteral("清理提醒历史失败"), + errorMessage.isEmpty() ? QStringLiteral("清理提醒历史失败。") : errorMessage); + return; + } + + for (int index = m_reminders.size() - 1; index >= 0; --index) + { + const ReminderStatus status = m_reminders.at(index).status; + if (status == ReminderStatus::Triggered || status == ReminderStatus::Canceled) + { + m_reminders.removeAt(index); + } + } + + reloadReminderList(); + m_reminderStatusLabel->setText(QStringLiteral("已清理提醒历史。")); +} + +void SettingsDialog::importReminderSound() +{ + const QString filePath = QFileDialog::getOpenFileName( + this, + QStringLiteral("导入提醒音效"), + QString(), + QStringLiteral("Wave 音频 (*.wav)")); + if (filePath.isEmpty()) + { + return; + } + + QString importedSoundId; + QString errorMessage; + if (!ReminderSoundRepository::importSoundFile(filePath, &importedSoundId, &errorMessage)) + { + QMessageBox::warning( + this, + QStringLiteral("导入音效失败"), + errorMessage.isEmpty() ? QStringLiteral("导入音效失败。") : errorMessage); + return; + } + + reloadReminderSoundList(importedSoundId); + m_reminderSoundStatusLabel->setText(QStringLiteral("已导入音效:%1").arg(importedSoundId)); +} + +void SettingsDialog::deleteSelectedReminderSound() +{ + const QString soundId = selectedReminderSoundId(); + if (soundId.isEmpty()) + { + return; + } + + if (ReminderSoundRepository::isBuiltInSound(soundId)) + { + QMessageBox::information( + this, + QStringLiteral("不能删除内置音效"), + QStringLiteral("内置提醒音效作为默认资源保留,不能在设置页删除。")); + return; + } + + const QMessageBox::StandardButton result = QMessageBox::warning( + this, + QStringLiteral("删除提醒音效"), + QStringLiteral("确定要删除用户音效 \"%1\" 吗?\n\n这会删除用户音效文件,操作不可恢复。").arg(soundId), + QMessageBox::Yes | QMessageBox::Cancel, + QMessageBox::Cancel); + if (result != QMessageBox::Yes) + { + return; + } + + QString errorMessage; + if (!ReminderSoundRepository::deleteUserSound(soundId, &errorMessage)) + { + QMessageBox::warning( + this, + QStringLiteral("删除音效失败"), + errorMessage.isEmpty() ? QStringLiteral("删除用户音效失败。") : errorMessage); + return; + } + + reloadReminderSoundList(ReminderSoundRepository::defaultSoundId()); + m_reminderSoundStatusLabel->setText(QStringLiteral("已删除音效:%1,当前已回退到默认音效。").arg(soundId)); +} + +void SettingsDialog::testSelectedReminderSound() +{ + const QString soundId = selectedReminderSoundId(); + if (soundId.isEmpty() || !m_playReminderSound) + { + return; + } + + m_playReminderSound(soundId, qBound(0.0, m_reminderSoundVolumeSpinBox->value() / 100.0, 1.0)); + m_reminderSoundStatusLabel->setText(QStringLiteral("正在试听:%1").arg(soundId)); +} + void SettingsDialog::reloadCharacterList(const QString &selectedCharacterId) { const QString currentSelection = selectedCharacterId.trimmed().isEmpty() diff --git a/src/ui/SettingsDialog.h b/src/ui/SettingsDialog.h index 5d3171a..5b4b1f0 100644 --- a/src/ui/SettingsDialog.h +++ b/src/ui/SettingsDialog.h @@ -2,8 +2,10 @@ #include "../config/AIConfig.h" #include "../config/AppConfig.h" +#include "../reminder/ReminderTypes.h" #include +#include #include #include @@ -13,6 +15,7 @@ class QComboBox; class QDoubleSpinBox; class QLabel; class QLineEdit; +class QListWidget; class QPushButton; class QSpinBox; class LLMProvider; @@ -23,8 +26,12 @@ public: explicit SettingsDialog( const AIConfigStore &configStore, const AppConfig &appConfig, + const QVector &reminders, std::function aiTestBlocked, std::function clearConversationHistoryCallback, + std::function cancelReminderCallback, + std::function clearFinishedRemindersCallback, + std::function playReminderSoundCallback, QWidget *parent = nullptr); ~SettingsDialog() override; @@ -48,6 +55,16 @@ private: void reloadCharacterList(const QString &selectedCharacterId = {}); void importCharacterFolder(); void deleteSelectedCharacter(); + void reloadReminderList(); + void reloadReminderSoundList(const QString &selectedSoundId = {}); + QString selectedReminderSoundId() const; + void updateReminderSoundButtons(); + void updateReminderActionButtons(); + void cancelSelectedReminder(); + void clearFinishedReminders(); + void importReminderSound(); + void deleteSelectedReminderSound(); + void testSelectedReminderSound(); QComboBox *m_providerComboBox = nullptr; QLineEdit *m_baseUrlEdit = nullptr; @@ -77,12 +94,28 @@ private: QPushButton *m_importCharacterButton = nullptr; QPushButton *m_deleteCharacterButton = nullptr; QLabel *m_characterStatusLabel = nullptr; + QComboBox *m_reminderStatusFilterComboBox = nullptr; + QListWidget *m_reminderListWidget = nullptr; + QPushButton *m_cancelReminderButton = nullptr; + QPushButton *m_clearFinishedRemindersButton = nullptr; + QLabel *m_reminderStatusLabel = nullptr; + QCheckBox *m_reminderSoundEnabledCheckBox = nullptr; + QSpinBox *m_reminderSoundVolumeSpinBox = nullptr; + QComboBox *m_reminderSoundComboBox = nullptr; + QPushButton *m_importReminderSoundButton = nullptr; + QPushButton *m_deleteReminderSoundButton = nullptr; + QPushButton *m_testReminderSoundButton = nullptr; + QLabel *m_reminderSoundStatusLabel = nullptr; AIConfigStore m_configStore; AIConfigStore m_acceptedConfigStore; AppConfig m_appConfig; + QVector m_reminders; QString m_currentProvider; std::function m_aiTestBlocked; std::function m_clearConversationHistory; + std::function m_cancelReminder; + std::function m_clearFinishedReminders; + std::function m_playReminderSound; std::unique_ptr m_testProvider; bool m_hasAcceptedConfigStore = false; }; diff --git a/src/util/ResourcePaths.cpp b/src/util/ResourcePaths.cpp index 614e316..1abf6c9 100644 --- a/src/util/ResourcePaths.cpp +++ b/src/util/ResourcePaths.cpp @@ -55,6 +55,11 @@ QString ResourcePaths::charactersRootPath() return resourcePath(QStringLiteral("characters")); } +QString ResourcePaths::reminderSoundsRootPath() +{ + return resourcePath(QStringLiteral("sounds/reminders")); +} + QString ResourcePaths::appIconPath() { return resourcePath(QStringLiteral("icons/app_icon.ico")); diff --git a/src/util/ResourcePaths.h b/src/util/ResourcePaths.h index 01e0a63..cbf3c23 100644 --- a/src/util/ResourcePaths.h +++ b/src/util/ResourcePaths.h @@ -8,6 +8,7 @@ public: static QString resourcesRootPath(); static QString resourcePath(const QString &relativePath); static QString charactersRootPath(); + static QString reminderSoundsRootPath(); static QString appIconPath(); static QString appIconSourcePngPath(); }; diff --git a/tools/package_release.ps1 b/tools/package_release.ps1 index b0dcf70..505861d 100644 --- a/tools/package_release.ps1 +++ b/tools/package_release.ps1 @@ -190,6 +190,7 @@ $targetExePath = Join-Path $packageRoot "QtDesktopPet.exe" $resourcesRoot = Join-Path $repoRoot "resources" $charactersRoot = Join-Path $resourcesRoot "characters" $iconsRoot = Join-Path $resourcesRoot "icons" +$soundsRoot = Join-Path $resourcesRoot "sounds" $licensePath = Join-Path $repoRoot "LICENSE" $readmePath = Join-Path $repoRoot "README.md" $installerScriptPath = Join-Path $repoRoot "installer\QtDesktopPet.iss" @@ -197,6 +198,7 @@ $installerScriptPath = Join-Path $repoRoot "installer\QtDesktopPet.iss" Assert-RequiredPath -Path $resolvedExePath -Description "QtDesktopPet.exe" Assert-RequiredPath -Path (Join-Path $charactersRoot "shiroko\character.json") -Description "Default character package" Assert-RequiredPath -Path (Join-Path $iconsRoot "app_icon.ico") -Description "Application icon" +Assert-RequiredPath -Path (Join-Path $soundsRoot "reminders\reminder_default.wav") -Description "Default reminder sound" Assert-RequiredPath -Path $licensePath -Description "LICENSE" Assert-RequiredPath -Path $readmePath -Description "README.md" @@ -211,6 +213,7 @@ New-Item -ItemType Directory -Force -Path $packageRoot | Out-Null Copy-Item -LiteralPath $resolvedExePath -Destination $targetExePath -Force Copy-DirectoryFresh -Source $charactersRoot -Destination (Join-Path $packageRoot "resources\characters") Copy-DirectoryFresh -Source $iconsRoot -Destination (Join-Path $packageRoot "resources\icons") +Copy-DirectoryFresh -Source $soundsRoot -Destination (Join-Path $packageRoot "resources\sounds") Copy-Item -LiteralPath $licensePath -Destination (Join-Path $packageRoot "LICENSE") -Force Copy-Item -LiteralPath $readmePath -Destination (Join-Path $packageRoot "README.md") -Force @@ -223,7 +226,7 @@ $manifestPath = Join-Path $packageRoot "package_manifest.txt" "Version: $Version", "CreatedUtc: $((Get-Date).ToUniversalTime().ToString("o"))", "SourceExe: $resolvedExePath", - "Includes: QtDesktopPet.exe, Qt runtime, resources, LICENSE, README.md", + "Includes: QtDesktopPet.exe, Qt runtime, character/icon/sound resources, LICENSE, README.md", "Excludes: tools, docs, reports, build, dist, .git" ) | Set-Content -LiteralPath $manifestPath -Encoding UTF8