Fix compilation errors and implement Phase 6 & 7: NotificationManager and SyncScheduler with real synchronizer integration
This commit is contained in:
+10
-8
@@ -5,7 +5,7 @@ set(CMAKE_CXX_STANDARD 17)
|
|||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
# Find Qt components
|
# Find Qt components
|
||||||
find_package(Qt6 COMPONENTS Core Gui Widgets Network Sql WebEngineWidgets Qml REQUIRED)
|
find_package(Qt6 COMPONENTS Core Gui Widgets Network Sql WebEngineWidgets Qml Multimedia REQUIRED)
|
||||||
|
|
||||||
# Find optional libraries (example: libetpan, gmime)
|
# Find optional libraries (example: libetpan, gmime)
|
||||||
# find_package(PkgConfig REQUIRED)
|
# find_package(PkgConfig REQUIRED)
|
||||||
@@ -15,12 +15,10 @@ find_package(Qt6 COMPONENTS Core Gui Widgets Network Sql WebEngineWidgets Qml RE
|
|||||||
# Include directories
|
# Include directories
|
||||||
include_directories(${PROJECT_SOURCE_DIR}/src)
|
include_directories(${PROJECT_SOURCE_DIR}/src)
|
||||||
|
|
||||||
# Resources
|
# Enable automatic moc, uic, rcc
|
||||||
qt6_add_resources(WinoMailQtResources
|
set(CMAKE_AUTOMOC ON)
|
||||||
FILES
|
set(CMAKE_AUTOUIC ON)
|
||||||
resources/qml/main.qml
|
set(CMAKE_AUTORCC ON)
|
||||||
resources/qml/Shell.qml
|
|
||||||
)
|
|
||||||
|
|
||||||
# Source files
|
# Source files
|
||||||
set(SRC_FILES
|
set(SRC_FILES
|
||||||
@@ -43,13 +41,17 @@ set(SRC_FILES
|
|||||||
src/db/dao/folderdao.cpp
|
src/db/dao/folderdao.cpp
|
||||||
src/db/dao/mailitemdao.cpp
|
src/db/dao/mailitemdao.cpp
|
||||||
src/db/dbchangeprocessor.cpp
|
src/db/dbchangeprocessor.cpp
|
||||||
|
src/core/eventbus.cpp
|
||||||
|
src/utils/notificationmanager.cpp
|
||||||
|
src/core/emailmanager.cpp
|
||||||
|
src/syncscheduler.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
# Executable
|
# Executable
|
||||||
add_executable(wino-mail-qt ${SRC_FILES})
|
add_executable(wino-mail-qt ${SRC_FILES})
|
||||||
|
|
||||||
# Link Qt
|
# Link Qt
|
||||||
target_link_libraries(wino-mail-qt PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Network Qt6::Sql Qt6::WebEngineWidgets Qt6::Qml ${WinoMailQtResources})
|
target_link_libraries(wino-mail-qt PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Network Qt6::Sql Qt6::WebEngineWidgets Qt6::Qml Qt6::Multimedia)
|
||||||
|
|
||||||
# If using external libs
|
# If using external libs
|
||||||
# target_link_libraries(wino-mail-qt PRIVATE ${LIBETPAN_LIBRARIES} ${GMIME_LIBRARIES})
|
# target_link_libraries(wino-mail-qt PRIVATE ${LIBETPAN_LIBRARIES} ${GMIME_LIBRARIES})
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include <QStandardPaths>
|
#include <QStandardPaths>
|
||||||
#include "../db/dao/mailitemdao.h"
|
#include "../db/dao/mailitemdao.h"
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
EmailManager::EmailManager(QObject *parent)
|
EmailManager::EmailManager(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
@@ -32,6 +33,24 @@ QString EmailManager::getStorageDirectory() const
|
|||||||
return storagePath;
|
return storagePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString EmailManager::getEmailHtmlById(qint64 id) const
|
||||||
|
{
|
||||||
|
// Get the MailItem by id
|
||||||
|
MailItem item = getMailItemById(id);
|
||||||
|
if (item.id() == 0) {
|
||||||
|
return "<html><body><h2>Error: Email not found</h2></body></html>";
|
||||||
|
}
|
||||||
|
// Construct the file path: storage directory + fileId + .eml
|
||||||
|
QString storageDir = getStorageDirectory();
|
||||||
|
QString fileName = item.fileId();
|
||||||
|
if (fileName.isEmpty()) {
|
||||||
|
return "<html><body><h2>Error: Email file ID is empty</h2></body></html>";
|
||||||
|
}
|
||||||
|
QString filePath = storageDir + QDir::separator() + fileName + ".eml";
|
||||||
|
// Convert the .eml file to HTML
|
||||||
|
return convertEmlToHtml(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
QString EmailManager::convertEmlToHtml(const QString& emlFilePath) const
|
QString EmailManager::convertEmlToHtml(const QString& emlFilePath) const
|
||||||
{
|
{
|
||||||
// TODO: Implement actual MIME to HTML conversion using gmime or similar
|
// TODO: Implement actual MIME to HTML conversion using gmime or similar
|
||||||
@@ -51,3 +70,12 @@ QString EmailManager::convertEmlToHtml(const QString& emlFilePath) const
|
|||||||
return QString("<html><body style='font-family: monospace;'><h2>Email Content (raw)</h2><pre>%1</pre></body></html>")
|
return QString("<html><body style='font-family: monospace;'><h2>Email Content (raw)</h2><pre>%1</pre></body></html>")
|
||||||
.arg(content);
|
.arg(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EmailManager::sendEmail(const QString& to, const QString& subject, const QString& body)
|
||||||
|
{
|
||||||
|
// TODO: Implement actual email sending
|
||||||
|
// For now, just show a message and return true
|
||||||
|
QMessageBox::information(nullptr, "Send Email",
|
||||||
|
QString("To: %1\nSubject: %2\nBody: %3").arg(to, subject, body));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
@@ -22,6 +22,9 @@ public:
|
|||||||
// Returns the HTML content of an email by its ID
|
// Returns the HTML content of an email by its ID
|
||||||
Q_INVOKABLE QString getEmailHtmlById(qint64 id) const;
|
Q_INVOKABLE QString getEmailHtmlById(qint64 id) const;
|
||||||
|
|
||||||
|
// Converts an .eml file to HTML string
|
||||||
|
QString convertEmlToHtml(const QString& emlFilePath) const;
|
||||||
|
|
||||||
// Sends an email with the given parameters
|
// Sends an email with the given parameters
|
||||||
// Returns true if the email was successfully queued for sending
|
// Returns true if the email was successfully queued for sending
|
||||||
Q_INVOKABLE bool sendEmail(const QString& to, const QString& subject, const QString& body);
|
Q_INVOKABLE bool sendEmail(const QString& to, const QString& subject, const QString& body);
|
||||||
|
|||||||
+8
-2
@@ -1,14 +1,15 @@
|
|||||||
#include <QGuiApplication>
|
#include <QApplication>
|
||||||
#include <QQmlApplicationEngine>
|
#include <QQmlApplicationEngine>
|
||||||
#include <QQmlContext>
|
#include <QQmlContext>
|
||||||
#include "core/translator.h"
|
#include "core/translator.h"
|
||||||
#include "db/dbchangeprocessor.h"
|
#include "db/dbchangeprocessor.h"
|
||||||
#include "core/emailmanager.h"
|
#include "core/emailmanager.h"
|
||||||
#include "syncscheduler.h"
|
#include "syncscheduler.h"
|
||||||
|
#include "utils/notificationmanager.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QGuiApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
|
|
||||||
// Load English translation
|
// Load English translation
|
||||||
Translator& translator = Translator::instance();
|
Translator& translator = Translator::instance();
|
||||||
@@ -26,10 +27,15 @@ int main(int argc, char *argv[])
|
|||||||
SyncScheduler syncScheduler(&app);
|
SyncScheduler syncScheduler(&app);
|
||||||
syncScheduler.start();
|
syncScheduler.start();
|
||||||
|
|
||||||
|
// Create NotificationManager (system tray and notifications)
|
||||||
|
NotificationManager notificationManager(&app);
|
||||||
|
notificationManager.initialize(); // Initialize Qt components after QApplication is ready
|
||||||
|
|
||||||
QQmlApplicationEngine engine;
|
QQmlApplicationEngine engine;
|
||||||
engine.rootContext()->setContextProperty("translator", static_cast<QObject*>(&translator));
|
engine.rootContext()->setContextProperty("translator", static_cast<QObject*>(&translator));
|
||||||
engine.rootContext()->setContextProperty("emailManager", &emailManager);
|
engine.rootContext()->setContextProperty("emailManager", &emailManager);
|
||||||
engine.rootContext()->setContextProperty("syncScheduler", &syncScheduler);
|
engine.rootContext()->setContextProperty("syncScheduler", &syncScheduler);
|
||||||
|
engine.rootContext()->setContextProperty("notificationManager", ¬ificationManager);
|
||||||
|
|
||||||
const QUrl url(QStringLiteral("qrc:/main.qml"));
|
const QUrl url(QStringLiteral("qrc:/main.qml"));
|
||||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
|
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
|
||||||
|
|||||||
@@ -4,27 +4,53 @@
|
|||||||
|
|
||||||
NotificationManager::NotificationManager(QObject *parent)
|
NotificationManager::NotificationManager(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
|
, m_trayIcon(nullptr)
|
||||||
|
, m_trayMenu(nullptr)
|
||||||
|
, m_showHideAction(nullptr)
|
||||||
|
, m_quitAction(nullptr)
|
||||||
|
, m_newMailSound(nullptr)
|
||||||
{
|
{
|
||||||
|
// Defer initialization to after QApplication is fully ready
|
||||||
|
// We'll initialize in a separate method called from main after the event loop starts?
|
||||||
|
// For now, we do nothing and log.
|
||||||
|
qDebug() << "NotificationManager: constructor (deferred initialization)";
|
||||||
|
}
|
||||||
|
|
||||||
|
NotificationManager::~NotificationManager()
|
||||||
|
{
|
||||||
|
// Cleanup if we ever initialize
|
||||||
|
if (m_trayMenu) {
|
||||||
|
delete m_trayMenu;
|
||||||
|
}
|
||||||
|
// Note: m_trayIcon, m_showHideAction, m_quitAction, m_newMailSound are children of this or m_trayMenu?
|
||||||
|
// Actually, m_trayIcon and m_newMailSound have 'this' as parent, so they will be deleted automatically.
|
||||||
|
// m_showHideAction and m_quitAction have m_trayMenu as parent, so they will be deleted when m_trayMenu is deleted.
|
||||||
|
}
|
||||||
|
|
||||||
|
void NotificationManager::initialize()
|
||||||
|
{
|
||||||
|
// Initialize the tray icon and related objects
|
||||||
|
m_trayIcon = new QSystemTrayIcon(this);
|
||||||
|
m_trayMenu = new QMenu(this); // parent to NotificationManager so it gets deleted with us
|
||||||
|
m_showHideAction = new QAction("Show/Hide", m_trayMenu);
|
||||||
|
m_quitAction = new QAction("Quit", m_trayMenu);
|
||||||
|
m_newMailSound = new QSoundEffect(this);
|
||||||
|
|
||||||
setupTrayIcon();
|
setupTrayIcon();
|
||||||
setupConnections();
|
setupConnections();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NotificationManager::setupTrayIcon()
|
void NotificationManager::setupTrayIcon()
|
||||||
{
|
{
|
||||||
m_trayIcon = new QSystemTrayIcon(this);
|
|
||||||
// Set an icon (you may want to load from resources)
|
// Set an icon (you may want to load from resources)
|
||||||
m_trayIcon->setIcon(QIcon::fromTheme("mail-unread"));
|
m_trayIcon->setIcon(QIcon::fromTheme("mail-unread"));
|
||||||
m_trayIcon->setToolTip("Wino Mail");
|
m_trayIcon->setToolTip("Wino Mail");
|
||||||
|
|
||||||
m_trayMenu = new QMenu(this);
|
|
||||||
m_showHideAction = new QAction("Show/Hide", this);
|
|
||||||
m_quitAction = new QAction("Quit", this);
|
|
||||||
m_trayMenu->addAction(m_showHideAction);
|
m_trayMenu->addAction(m_showHideAction);
|
||||||
m_trayMenu->addSeparator();
|
m_trayMenu->addSeparator();
|
||||||
m_trayMenu->addAction(m_quitAction);
|
m_trayMenu->addAction(m_quitAction);
|
||||||
m_trayIcon->setContextMenu(m_trayMenu);
|
m_trayIcon->setContextMenu(m_trayMenu);
|
||||||
|
|
||||||
m_newMailSound = new QSoundEffect(this);
|
|
||||||
m_newMailSound->setSource(QUrl::fromLocalFile("/usr/share/sounds/freedesktop/stereo/message-new-instant.oga"));
|
m_newMailSound->setSource(QUrl::fromLocalFile("/usr/share/sounds/freedesktop/stereo/message-new-instant.oga"));
|
||||||
m_newMailSound->setVolume(0.5);
|
m_newMailSound->setVolume(0.5);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QAction>
|
#include <QAction>
|
||||||
#include <QSoundEffect>
|
#include <QSoundEffect>
|
||||||
|
#include <QIcon>
|
||||||
#include "core/eventbus.h"
|
#include "core/eventbus.h"
|
||||||
#include "../core/events.h"
|
#include "../core/events.h"
|
||||||
|
|
||||||
@@ -14,7 +15,8 @@ class NotificationManager : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit NotificationManager(QObject *parent = nullptr);
|
explicit NotificationManager(QObject *parent = nullptr);
|
||||||
~NotificationManager() override = default;
|
~NotificationManager() override;
|
||||||
|
void initialize(); // Initialize Qt components after QApplication is ready
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onMailItemAdded(const WinoMail::Events::MailItemAddedEvent& event);
|
void onMailItemAdded(const WinoMail::Events::MailItemAddedEvent& event);
|
||||||
|
|||||||
Reference in New Issue
Block a user