diff options
| -rw-r--r-- | src/database_gourmet.cc | 16 | ||||
| -rw-r--r-- | src/database_krecipes.cc | 41 | ||||
| -rw-r--r-- | src/mainwindow.cc | 2 | ||||
| -rw-r--r-- | src/recipe.h | 8 | ||||
| -rw-r--r-- | 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 <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); | 
