summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2022-04-30 21:12:44 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2022-05-26 18:41:21 +0200
commit0dea7c3dad15f397600458ae9a81af29e95752fa (patch)
treeb6b17f93f907e139274b967c02ac356b56422b20
parent0ae26aded59f09b969592c2e600dba176954c619 (diff)
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.
-rw-r--r--src/database.cc56
-rw-r--r--src/database.h9
-rw-r--r--src/database_gourmet.cc4
-rw-r--r--src/database_gourmet.h4
-rw-r--r--src/database_krecipes.cc4
-rw-r--r--src/database_krecipes.h4
-rw-r--r--src/mainwindow.cc34
-rw-r--r--src/qookie.cc6
-rw-r--r--src/recipe.h10
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 <cassert>
+
+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<RecipeItem> 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<RecipeItem> getRecipes() = 0;
- virtual Recipe getRecipe(std::uint64_t id) = 0;
+ virtual std::deque<RecipeItem> 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<RecipeItem> 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<RecipeItem> 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<RecipeItem> 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<RecipeItem> 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<RecipeItem> 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<RecipeItem> 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 <iostream>
#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 <string>
#include <vector>
+#include <cstdint>
+
+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;