From 8b65d0eb2815576780c57df428c1faf23fe75068 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sun, 1 May 2022 17:31:28 +0200 Subject: Add ingredient group support for both krecipes and gourmet databases and show them in the viewer. --- src/database_gourmet.cc | 16 ++++++++++++-- src/database_krecipes.cc | 41 +++++++++++++++++++++++++++++++++++- src/mainwindow.cc | 2 ++ src/recipe.h | 8 ++++++- src/viewer.cc | 55 ++++++++++++++++++++++++++++++++++-------------- 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 #include +#include // 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 ingredients; +}; + struct Recipe { DatabaseSource db; @@ -60,7 +66,7 @@ struct Recipe std::string description; std::string image; std::string instructions; - std::vector ingredients; + std::vector 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", "
"); 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 += - "
  • " + - QString::number(ingredient.amount) + " " + - QString::fromUtf8(ingredient.unit.data()) + " " + - QString::fromUtf8(ingredient.item.data()) + - "
  • "; + ingredients += "

    " + QString::fromUtf8(ingredient_group.title.data()) + "

    "; } - else + ingredients += "
      "; + for(const auto& ingredient : ingredient_group.ingredients) { - ingredients += - "
    • " + - QString::fromUtf8(ingredient.item.data()) + - "
    • "; + if(ingredient.amount > 0) + { + ingredients += + "
    • " + + QString::number(ingredient.amount) + " " + + QString::fromUtf8(ingredient.unit.data()) + " " + + QString::fromUtf8(ingredient.item.data()) + + "
    • "; + } + else + { + ingredients += + "
    • " + + QString::fromUtf8(ingredient.item.data()) + + "
    • "; + } } + ingredients += "
    "; } 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 = "
    " + QString::fromUtf8(recipe.title.data()) + "

    " "" @@ -83,6 +106,7 @@ void Viewer::show(const Recipe& recipe) "" "" "" "
    " "

    " + QString::fromUtf8(recipe.description.data()) + "

    " "

    " + "Database: " + db + " (id:" + QString::number(recipe.id) + ")
    " "Source: " + QString::fromUtf8(recipe.source.data()) + "
    " "Cuisine: " + QString::fromUtf8(recipe.cuisine.data()) + "
    " "Cooktime: " + QString::number(recipe.cooktime / 60) + "min
    " @@ -90,15 +114,14 @@ void Viewer::show(const Recipe& recipe) "Yields: " + QString::number(recipe.yields) + " " + QString::fromUtf8(recipe.yield_unit.data()) + "
    " "Tags: " + QString::fromUtf8(recipe.tags[0].data()) + "" "

    " - "

    Ingredients

    " - "
      " + ingredients + "
    " + "

    Ingredienser

    " + ingredients + "
    " "" "
    " - "

    Instructions

    " + "

    Instruktioner

    " "

    " + instructions + "

    " ; textEdit->setHtml(html); -- cgit v1.2.3