diff options
| author | Bent Bisballe Nyeng <deva@aasimon.org> | 2022-04-30 21:12:44 +0200 | 
|---|---|---|
| committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2022-05-26 18:41:21 +0200 | 
| commit | 0dea7c3dad15f397600458ae9a81af29e95752fa (patch) | |
| tree | b6b17f93f907e139274b967c02ac356b56422b20 | |
| parent | 0ae26aded59f09b969592c2e600dba176954c619 (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.cc | 56 | ||||
| -rw-r--r-- | src/database.h | 9 | ||||
| -rw-r--r-- | src/database_gourmet.cc | 4 | ||||
| -rw-r--r-- | src/database_gourmet.h | 4 | ||||
| -rw-r--r-- | src/database_krecipes.cc | 4 | ||||
| -rw-r--r-- | src/database_krecipes.h | 4 | ||||
| -rw-r--r-- | src/mainwindow.cc | 34 | ||||
| -rw-r--r-- | src/qookie.cc | 6 | ||||
| -rw-r--r-- | 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 <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; | 
