summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2022-05-01 17:31:28 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2022-05-26 18:41:21 +0200
commit8b65d0eb2815576780c57df428c1faf23fe75068 (patch)
tree2f82d0a218fed524e13451b01411f620ef152890
parentfc10974343701fd446bb174e991589de3a75d5e4 (diff)
Add ingredient group support for both krecipes and gourmet databases and show them in the viewer.
-rw-r--r--src/database_gourmet.cc16
-rw-r--r--src/database_krecipes.cc41
-rw-r--r--src/mainwindow.cc2
-rw-r--r--src/recipe.h8
-rw-r--r--src/viewer.cc55
5 files changed, 102 insertions, 20 deletions
diff --git a/src/database_gourmet.cc b/src/database_gourmet.cc
index c68e2a3..a9edb58 100644
--- a/src/database_gourmet.cc
+++ b/src/database_gourmet.cc
@@ -28,6 +28,7 @@
#include <sqlite3.h>
#include <iostream>
+#include <cassert>
// https://www.tutorialspoint.com/sqlite/sqlite_c_cpp.htm
@@ -155,7 +156,7 @@ Recipe DatabaseGourmet::getRecipe(int id)
{
std::string sql =
- "select amount, unit, item from ingredients where recipe_id=" +
+ "select amount, unit, item, inggroup from ingredients where recipe_id=" +
std::to_string(id) + " order by position asc";
sqlite3_stmt *statement;
if(sqlite3_prepare_v2(db, sql.data(), sql.length(), &statement, 0) != SQLITE_OK)
@@ -164,6 +165,8 @@ Recipe DatabaseGourmet::getRecipe(int id)
return {};
}
+ recipe.ingredient_groups.push_back({}); // first group is the empty-titled one.
+
int result = 0;
while(true)
{
@@ -175,7 +178,16 @@ Recipe DatabaseGourmet::getRecipe(int id)
ingredient.amount = sqlite3_column_double(statement, 0);
ingredient.unit = getString(statement, 1);
ingredient.item = getString(statement, 2);
- recipe.ingredients.push_back(ingredient);
+ auto group_title = getString(statement, 3);
+ auto* group = &recipe.ingredient_groups.back();
+ assert(recipe.ingredient_groups.size() > 0);
+ if(group->title != group_title)
+ {
+ recipe.ingredient_groups.push_back({group_title, {}});
+ group = &recipe.ingredient_groups.back();
+ }
+
+ group->ingredients.push_back(ingredient);
}
else
{
diff --git a/src/database_krecipes.cc b/src/database_krecipes.cc
index bf764b2..fa817bd 100644
--- a/src/database_krecipes.cc
+++ b/src/database_krecipes.cc
@@ -265,7 +265,9 @@ Recipe DatabaseKrecipes::getRecipe(int id)
return {};
}
+ int last_group_id{-1}; // -1 is actually a valid id in the database
int result = 0;
+ recipe.ingredient_groups.push_back({});
while(true)
{
Ingredient ingredient;
@@ -276,6 +278,43 @@ Recipe DatabaseKrecipes::getRecipe(int id)
ingredient.item = getString(statement, 0);
ingredient.amount = sqlite3_column_double(statement, 1);
ingredient.unit = getString(statement, 2);
+ int group_id = sqlite3_column_int(statement, 3);
+ if(last_group_id != group_id)
+ {
+ // Look up group id name and append
+ recipe.ingredient_groups.push_back({/*"Group-" + std::to_string(group_id), {}*/});
+ last_group_id = group_id;
+
+ //
+ // Get ingredient group name
+ //
+ {
+ std::string sql =
+ "select name from ingredient_groups where id=" + std::to_string(group_id);
+ sqlite3_stmt *statement;
+ if(sqlite3_prepare_v2(db, sql.data(), sql.length(), &statement, 0) != SQLITE_OK)
+ {
+ std::cerr << "sqlite3_prepare_v2 failed: " << sqlite3_errmsg(db) << '\n';
+ return {};
+ }
+
+ int result = 0;
+ while(true)
+ {
+ result = sqlite3_step(statement);
+
+ if(result == SQLITE_ROW)
+ {
+ recipe.ingredient_groups.back().title = getString(statement, 0);
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+
+ }
//
// Get ingredient name
@@ -335,7 +374,7 @@ Recipe DatabaseKrecipes::getRecipe(int id)
}
}
- recipe.ingredients.push_back(ingredient);
+ recipe.ingredient_groups.back().ingredients.push_back(ingredient);
}
else
{
diff --git a/src/mainwindow.cc b/src/mainwindow.cc
index b91ae43..30680de 100644
--- a/src/mainwindow.cc
+++ b/src/mainwindow.cc
@@ -46,6 +46,8 @@ MainWindow::MainWindow(Database& db)
//connect(document, SIGNAL(documentStatusChanged(bool)), this, SLOT(updateDocumentStatus(bool)));
//updateDocumentStatus(document->hasChanged());
+ setWindowTitle("Qookie");
+
//
// Create the toolbar
//
diff --git a/src/recipe.h b/src/recipe.h
index 631030f..0082d58 100644
--- a/src/recipe.h
+++ b/src/recipe.h
@@ -52,6 +52,12 @@ struct Ingredient
std::string item;
};
+struct IngredientGroup
+{
+ std::string title;
+ std::vector<Ingredient> ingredients;
+};
+
struct Recipe
{
DatabaseSource db;
@@ -60,7 +66,7 @@ struct Recipe
std::string description;
std::string image;
std::string instructions;
- std::vector<Ingredient> ingredients;
+ std::vector<IngredientGroup> ingredient_groups;
std::string source;
std::string cuisine;
diff --git a/src/viewer.cc b/src/viewer.cc
index e3c25be..b0b6f35 100644
--- a/src/viewer.cc
+++ b/src/viewer.cc
@@ -50,24 +50,33 @@ void Viewer::show(const Recipe& recipe)
instructions.replace("\n", "<br/>");
QString ingredients;
- for(const auto& ingredient : recipe.ingredients)
+ for(const auto& ingredient_group : recipe.ingredient_groups)
{
- if(ingredient.amount > 0)
+ if(ingredient_group.title != "")
{
- ingredients +=
- "<li>" +
- QString::number(ingredient.amount) + " " +
- QString::fromUtf8(ingredient.unit.data()) + " " +
- QString::fromUtf8(ingredient.item.data()) +
- "</li>";
+ ingredients += "<h3>" + QString::fromUtf8(ingredient_group.title.data()) + "</h3>";
}
- else
+ ingredients += "<ul>";
+ for(const auto& ingredient : ingredient_group.ingredients)
{
- ingredients +=
- "<li>" +
- QString::fromUtf8(ingredient.item.data()) +
- "</li>";
+ if(ingredient.amount > 0)
+ {
+ ingredients +=
+ "<li>" +
+ QString::number(ingredient.amount) + " " +
+ QString::fromUtf8(ingredient.unit.data()) + " " +
+ QString::fromUtf8(ingredient.item.data()) +
+ "</li>";
+ }
+ else
+ {
+ ingredients +=
+ "<li>" +
+ QString::fromUtf8(ingredient.item.data()) +
+ "</li>";
+ }
}
+ ingredients += "</ul>";
}
QByteArray image(recipe.image.data(), recipe.image.size());
@@ -76,6 +85,20 @@ void Viewer::show(const Recipe& recipe)
image = QByteArray::fromBase64(image);
}
+ QString db;
+ switch(recipe.db)
+ {
+ case DatabaseSource::KRecipes:
+ db = "KRecipes";
+ break;
+ case DatabaseSource::Gourmet:
+ db = "Gourmet";
+ break;
+ case DatabaseSource::Qookie:
+ db = "Qookie";
+ break;
+ }
+
QString html =
"<center><strong style=\"font-size:28px;\">" + QString::fromUtf8(recipe.title.data()) + "</strong></center><br/>"
"<table>"
@@ -83,6 +106,7 @@ void Viewer::show(const Recipe& recipe)
"<td>"
"<p>" + QString::fromUtf8(recipe.description.data()) + "</p>"
"<p>"
+ "Database: " + db + " (id:" + QString::number(recipe.id) + ")<br/>"
"Source: " + QString::fromUtf8(recipe.source.data()) + "<br/>"
"Cuisine: " + QString::fromUtf8(recipe.cuisine.data()) + "<br/>"
"Cooktime: " + QString::number(recipe.cooktime / 60) + "min<br/>"
@@ -90,15 +114,14 @@ void Viewer::show(const Recipe& recipe)
"Yields: " + QString::number(recipe.yields) + " " + QString::fromUtf8(recipe.yield_unit.data()) + "<br/>"
"Tags: " + QString::fromUtf8(recipe.tags[0].data()) + ""
"</p>"
- "<h2>Ingredients</h2>"
- "<ul>" + ingredients + "</ul>"
+ "<h2>Ingredienser</h2>" + ingredients +
"</td>"
"<td>"
"<img height=\"300\" src=\"data:image/png;base64," + image.toBase64() + "\"/>"
"</td>"
"</tr>"
"</table>"
- "<h2>Instructions</h2>"
+ "<h2>Instruktioner</h2>"
"<p>" + instructions + "</p>"
;
textEdit->setHtml(html);