#include <QApplication>
#include <QDebug>
#include <QDir>
+#include <QFileDialog>
#include <QFileInfo>
#include <QIcon>
#include <QMessageBox>
}
if (dbPath.isEmpty()) {
- // If not found, default to XDG AppData location for error message/setup
- // But we can't create it here.
- dbPath = QDir::homePath() + "/.nutra/usda.sqlite3"; // Fallback default
qWarning() << "Database not found in standard locations.";
+ QMessageBox::StandardButton resBtn = QMessageBox::question(
+ nullptr, "Database Not Found",
+ "The Nutrient database (usda.sqlite3) was not found.\nWould you like "
+ "to browse for it manually?",
+ QMessageBox::No | QMessageBox::Yes, QMessageBox::Yes);
+
+ if (resBtn == QMessageBox::Yes) {
+ dbPath = QFileDialog::getOpenFileName(
+ nullptr, "Find usda.sqlite3", QDir::homePath(),
+ "SQLite Databases (*.sqlite3 *.db)");
+ }
+
+ if (dbPath.isEmpty()) {
+ return 1; // User cancelled or still not found
+ }
}
if (!DatabaseManager::instance().connect(dbPath)) {
QString errorMsg =
QString("Failed to connect to database at:\n%1\n\nPlease ensure the "
- "database file exists or reinstall the application.")
+ "database file exists or browse for a valid SQLite file.")
.arg(dbPath);
qCritical() << errorMsg;
QMessageBox::critical(nullptr, "Database Error", errorMsg);
+ // Let's try to let the user browse one more time before giving up
return 1;
}
qDebug() << "Connected to database at:" << dbPath;
#include "mainwindow.h"
+#include "db/databasemanager.h"
+#include <QAction>
+#include <QDebug>
+#include <QFileDialog>
#include <QMenu>
#include <QMenuBar>
#include <QMessageBox>
+#include <QSettings>
+#include <QStringList>
#include <QVBoxLayout>
-
-#include <QDebug>
-#include <QLabel>
#include <QWidget>
-MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setupUi(); }
+MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
+ for (int i = 0; i < MaxRecentFiles; ++i) {
+ recentFileActions[i] = new QAction(this);
+ recentFileActions[i]->setVisible(false);
+ connect(recentFileActions[i], &QAction::triggered, this,
+ &MainWindow::onRecentFileClick);
+ }
+ setupUi();
+ updateRecentFileActions();
+}
MainWindow::~MainWindow() = default;
setWindowIcon(QIcon(":/resources/nutrition_icon-no_bg.png"));
resize(1000, 700);
- // Menu Bar
+ // File Menu
+ auto *fileMenu = menuBar()->addMenu("&File");
+ auto *openDbAction = fileMenu->addAction("&Open Database...");
+ recentFilesMenu = fileMenu->addMenu("Recent Databases");
+ fileMenu->addSeparator();
+ auto *exitAction = fileMenu->addAction("E&xit");
+ connect(openDbAction, &QAction::triggered, this, &MainWindow::onOpenDatabase);
+ connect(exitAction, &QAction::triggered, this, &QWidget::close);
+
+ for (int i = 0; i < MaxRecentFiles; ++i)
+ recentFilesMenu->addAction(recentFileActions[i]);
+
+ // Edit Menu
+ auto *editMenu = menuBar()->addMenu("&Edit");
+ auto *settingsAction = editMenu->addAction("&Settings");
+ connect(settingsAction, &QAction::triggered, this, &MainWindow::onSettings);
+
+ // Help Menu
auto *helpMenu = menuBar()->addMenu("&Help");
auto *aboutAction = helpMenu->addAction("&About");
connect(aboutAction, &QAction::triggered, this, &MainWindow::onAbout);
});
}
+void MainWindow::onOpenDatabase() {
+ QString fileName = QFileDialog::getOpenFileName(
+ this, "Open USDA Database", "", "SQLite Databases (*.sqlite3 *.db)");
+
+ if (!fileName.isEmpty()) {
+ if (DatabaseManager::instance().connect(fileName)) {
+ qDebug() << "Switched to database:" << fileName;
+ addToRecentFiles(fileName);
+ // In a real app, we'd emit a signal or refresh all widgets
+ // For now, let's just log and show success
+ QMessageBox::information(this, "Database Opened",
+ "Successfully connected to: " + fileName);
+ } else {
+ QMessageBox::critical(this, "Database Error",
+ "Failed to connect to the database.");
+ }
+ }
+}
+
+void MainWindow::onRecentFileClick() {
+ auto *action = qobject_cast<QAction *>(sender());
+ if (action != nullptr) {
+ QString fileName = action->data().toString();
+ if (DatabaseManager::instance().connect(fileName)) {
+ qDebug() << "Switched to database (recent):" << fileName;
+ addToRecentFiles(fileName);
+ QMessageBox::information(this, "Database Opened",
+ "Successfully connected to: " + fileName);
+ } else {
+ QMessageBox::critical(this, "Database Error",
+ "Failed to connect to: " + fileName);
+ }
+ }
+}
+
+void MainWindow::updateRecentFileActions() {
+ QSettings settings("NutraTech", "Nutra");
+ QStringList files = settings.value("recentFiles").toStringList();
+
+ int numRecentFiles = qMin(files.size(), MaxRecentFiles);
+
+ for (int i = 0; i < numRecentFiles; ++i) {
+ QString text =
+ QString("&%1 %2").arg(i + 1).arg(QFileInfo(files[i]).fileName());
+ recentFileActions[i]->setText(text);
+ recentFileActions[i]->setData(files[i]);
+ recentFileActions[i]->setVisible(true);
+ }
+ for (int i = numRecentFiles; i < MaxRecentFiles; ++i)
+ recentFileActions[i]->setVisible(false);
+
+ recentFilesMenu->setEnabled(numRecentFiles > 0);
+}
+
+void MainWindow::addToRecentFiles(const QString &path) {
+ QSettings settings("NutraTech", "Nutra");
+ QStringList files = settings.value("recentFiles").toStringList();
+ files.removeAll(path);
+ files.prepend(path);
+ while (files.size() > MaxRecentFiles)
+ files.removeLast();
+
+ settings.setValue("recentFiles", files);
+ updateRecentFileActions();
+}
+
+void MainWindow::onSettings() {
+ QMessageBox::information(this, "Settings", "Settings dialog coming soon!");
+}
+
void MainWindow::onAbout() {
QMessageBox::about(
this, "About Nutrient Coach",