From 0dea7c3dad15f397600458ae9a81af29e95752fa Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 30 Apr 2022 21:12:44 +0200 Subject: Make 'super' database, encapsulating both the krecipes one and the gourmet one. Add small vignettes to the recipe list images to indicate from which soucre each item is coming from. --- src/database.cc | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ src/database.h | 9 ++++---- src/database_gourmet.cc | 4 +++- src/database_gourmet.h | 4 ++-- src/database_krecipes.cc | 4 +++- src/database_krecipes.h | 4 ++-- src/mainwindow.cc | 34 ++++++++++++++++++++++++++++- src/qookie.cc | 6 ++---- src/recipe.h | 10 +++++++++ 9 files changed, 116 insertions(+), 15 deletions(-) diff --git a/src/database.cc b/src/database.cc index 207a114..e55cd2a 100644 --- a/src/database.cc +++ b/src/database.cc @@ -25,3 +25,59 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "database.h" + +#include "database_gourmet.h" +#include "database_krecipes.h" + +#include + +DatabaseGourmet db1("/mnt/atuin/docs/tine/Fritid/Mad/recipes.db"); +DatabaseKrecipes db2("/mnt/atuin/docs/tine/Fritid/Mad/krecipes.krecdb"); + +Database::Database() +{ +} + +Database::~Database() +{ +} + +int Database::id() const +{ + return {}; +} + +std::deque Database::getRecipes() +{ + auto res1 = db1.getRecipes(); + auto res2 = db2.getRecipes(); + + for(auto& res : res1) + { + res.id |= db1.id(); + } + + for(auto& res : res2) + { + res.id |= db2.id(); + res1.push_back(res); + } + + return res1; +} + +Recipe Database::getRecipe(int id) +{ + if((id & db1.id()) == db1.id()) + { + return db1.getRecipe(id & (~db1.id())); + } + + if((id & db2.id()) == db2.id()) + { + return db2.getRecipe(id & (~db2.id())); + } + + assert(false); // we looked up an id, but it wasn't in any of the databases? this shouldn't happen... + return {}; +} diff --git a/src/database.h b/src/database.h index 8291334..c05e55c 100644 --- a/src/database.h +++ b/src/database.h @@ -34,10 +34,11 @@ class Database { public: - virtual ~Database() = default; + Database(); + virtual ~Database();; - virtual std::uint64_t id() const = 0; + virtual int id() const; - virtual std::deque getRecipes() = 0; - virtual Recipe getRecipe(std::uint64_t id) = 0; + virtual std::deque getRecipes(); + virtual Recipe getRecipe(int id); }; diff --git a/src/database_gourmet.cc b/src/database_gourmet.cc index e556440..c68e2a3 100644 --- a/src/database_gourmet.cc +++ b/src/database_gourmet.cc @@ -81,6 +81,7 @@ std::deque DatabaseGourmet::getRecipes() if(result == SQLITE_ROW) { + item.db = DatabaseSource::Gourmet; item.id = sqlite3_column_int(statement, 0); item.title = getString(statement, 1); @@ -96,7 +97,7 @@ std::deque DatabaseGourmet::getRecipes() return items; } -Recipe DatabaseGourmet::getRecipe(std::uint64_t id) +Recipe DatabaseGourmet::getRecipe(int id) { bool found{false}; Recipe recipe; @@ -119,6 +120,7 @@ Recipe DatabaseGourmet::getRecipe(std::uint64_t id) if(result == SQLITE_ROW) { + recipe.db = DatabaseSource::Gourmet; recipe.id = sqlite3_column_int(statement, 0); recipe.title = getString(statement, 1); recipe.description = getString(statement, 2); diff --git a/src/database_gourmet.h b/src/database_gourmet.h index 70ee04d..0d21990 100644 --- a/src/database_gourmet.h +++ b/src/database_gourmet.h @@ -37,10 +37,10 @@ public: DatabaseGourmet(const std::string& file); ~DatabaseGourmet(); - std::uint64_t id() const override { return 1UL << 63; } + int id() const override { return 1UL << 30; } std::deque getRecipes() override; - Recipe getRecipe(std::uint64_t id) override; + Recipe getRecipe(int id) override; private: sqlite3 *db{nullptr}; diff --git a/src/database_krecipes.cc b/src/database_krecipes.cc index fceb59c..bf764b2 100644 --- a/src/database_krecipes.cc +++ b/src/database_krecipes.cc @@ -81,6 +81,7 @@ std::deque DatabaseKrecipes::getRecipes() if(result == SQLITE_ROW) { + item.db = DatabaseSource::KRecipes; item.id = sqlite3_column_int(statement, 0); item.title = getString(statement, 1); @@ -96,7 +97,7 @@ std::deque DatabaseKrecipes::getRecipes() return items; } -Recipe DatabaseKrecipes::getRecipe(std::uint64_t id) +Recipe DatabaseKrecipes::getRecipe(int id) { bool found{false}; Recipe recipe; @@ -119,6 +120,7 @@ Recipe DatabaseKrecipes::getRecipe(std::uint64_t id) if(result == SQLITE_ROW) { + recipe.db = DatabaseSource::KRecipes; recipe.id = sqlite3_column_int(statement, 0); recipe.title = getString(statement, 1); recipe.description = {}; // not used by krecipes diff --git a/src/database_krecipes.h b/src/database_krecipes.h index 5f15a47..7e5f602 100644 --- a/src/database_krecipes.h +++ b/src/database_krecipes.h @@ -37,10 +37,10 @@ public: DatabaseKrecipes(const std::string& file); ~DatabaseKrecipes(); - std::uint64_t id() const override { return 1UL << 63; } + int id() const override { return 1UL << 29; } std::deque getRecipes() override; - Recipe getRecipe(std::uint64_t id) override; + Recipe getRecipe(int id) override; private: sqlite3 *db{nullptr}; diff --git a/src/mainwindow.cc b/src/mainwindow.cc index cb68039..711370f 100644 --- a/src/mainwindow.cc +++ b/src/mainwindow.cc @@ -125,10 +125,42 @@ void MainWindow::readDatabase() image = QImage(QSize({64,64}), QImage::Format_RGBA8888); image.fill(0); } - listItem->setData(Qt::UserRole, item.id); + image = image.scaled({64,64}); + QString mark; + QColor mark_color; + switch(item.db) + { + case DatabaseSource::KRecipes: + mark_color = QColor(0,0,200); + mark = "K"; + break; + case DatabaseSource::Gourmet: + mark_color = QColor(100,100,25); + mark = "G"; + break; + case DatabaseSource::Qookie: + mark_color = QColor(200,0,0); + mark = "Q"; + break; + } + + QPainter painter(&image); + auto font = painter.font(); + font.setBold(true); + font.setPixelSize(12); + painter.setFont(font); + painter.setPen(Qt::transparent); + painter.setBrush(QColor(255, 255, 255, 180)); + painter.drawEllipse(QRect{-7,-6,20,20}); + painter.setPen(mark_color); + painter.drawText(0, 10, mark); + + QIcon icon; icon.addPixmap(QPixmap::fromImage(image)); listItem->setIcon(icon); + + listItem->setData(Qt::UserRole, (double)item.id); listWidget->addItem(listItem); } } diff --git a/src/qookie.cc b/src/qookie.cc index 1f6f9d8..b818fa1 100644 --- a/src/qookie.cc +++ b/src/qookie.cc @@ -29,15 +29,13 @@ #include #include "mainwindow.h" -#include "database_gourmet.h" -#include "database_krecipes.h" +#include "database.h" int main(int argc, char *argv[]) { QApplication qapp(argc, argv); - //DatabaseGourmet db("/mnt/atuin/docs/tine/Fritid/Mad/recipes.db"); - DatabaseKrecipes db("/mnt/atuin/docs/tine/Fritid/Mad/krecipes.krecdb"); + Database db; MainWindow mainwindow(db); mainwindow.resize(1280, 768); diff --git a/src/recipe.h b/src/recipe.h index f33c07c..631030f 100644 --- a/src/recipe.h +++ b/src/recipe.h @@ -28,9 +28,18 @@ #include #include +#include + +enum class DatabaseSource +{ + KRecipes, + Gourmet, + Qookie, +}; struct RecipeItem { + DatabaseSource db; int id; std::string title; std::string image; @@ -45,6 +54,7 @@ struct Ingredient struct Recipe { + DatabaseSource db; int id; std::string title; std::string description; -- cgit v1.2.3