Updated UI, added default ingredients.

This commit is contained in:
Andrew Lalis 2018-03-31 15:02:35 +02:00
parent 9e3c59e415
commit c84370be11
10 changed files with 272 additions and 46 deletions

View File

@ -19,19 +19,24 @@ MainWindow::~MainWindow(){
} }
void MainWindow::loadFromRecipe(Recipe recipe){ void MainWindow::loadFromRecipe(Recipe recipe){
setRecipeName(recipe.getName()); if (recipe.isEmpty()){
setInstruction(recipe.getInstruction()); setRecipeName("No recipes found.");
setIngredients(recipe.getIngredients()); setAuthorName("Click 'New' to get started.");
if (recipe.getImage().isNull()){
setImage(QImage(QString(":/images/images/no_image.png")));
} else { } else {
setImage(recipe.getImage()); setRecipeName(recipe.getName());
setInstruction(recipe.getInstruction());
setIngredients(recipe.getIngredients());
if (recipe.getImage().isNull()){
setImage(QImage(QString(":/images/images/no_image.png")));
} else {
setImage(recipe.getImage());
}
setPrepTime(recipe.getPrepTime());
setCookTime(recipe.getCookTime());
setServings(recipe.getServings());
setTags(recipe.getTags());
this->currentRecipe = recipe;
} }
setPrepTime(recipe.getPrepTime());
setCookTime(recipe.getCookTime());
setServings(recipe.getServings());
setTags(recipe.getTags());
this->currentRecipe = recipe;
} }
void MainWindow::setRecipeName(string name){ void MainWindow::setRecipeName(string name){
@ -66,6 +71,10 @@ void MainWindow::setTags(vector<RecipeTag> tags){
this->tagsListModel.setTags(tags); this->tagsListModel.setTags(tags);
} }
void MainWindow::setAuthorName(string name){
ui->authorLabel->setText(QString::fromStdString(name));
}
void MainWindow::on_newButton_clicked(){ void MainWindow::on_newButton_clicked(){
NewRecipeDialog d(this->recipeDB, this); NewRecipeDialog d(this->recipeDB, this);
d.show(); d.show();

View File

@ -54,6 +54,7 @@ public:
void setCookTime(QTime cookTime); void setCookTime(QTime cookTime);
void setServings(float servings); void setServings(float servings);
void setTags(vector<RecipeTag> tags); void setTags(vector<RecipeTag> tags);
void setAuthorName(string name);
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@ -364,7 +364,7 @@ font: &quot;Noto Sans CJK KR&quot;;</string>
<item alignment="Qt::AlignLeft|Qt::AlignBottom"> <item alignment="Qt::AlignLeft|Qt::AlignBottom">
<widget class="QLabel" name="authorLabel"> <widget class="QLabel" name="authorLabel">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum"> <sizepolicy hsizetype="Minimum" vsizetype="Minimum">

View File

@ -23,6 +23,7 @@ NewRecipeDialog::NewRecipeDialog(RecipeDatabase *db, QWidget *parent) : NewRecip
NewRecipeDialog::NewRecipeDialog(RecipeDatabase *db, Recipe recipe, QWidget *parent) : NewRecipeDialog(db, parent){ NewRecipeDialog::NewRecipeDialog(RecipeDatabase *db, Recipe recipe, QWidget *parent) : NewRecipeDialog(db, parent){
ui->recipeNameEdit->setText(QString::fromStdString(recipe.getName())); ui->recipeNameEdit->setText(QString::fromStdString(recipe.getName()));
ui->authorNameEdit->setText(QString::fromStdString(recipe.getAuthor()));
ui->prepTimeEdit->setTime(recipe.getPrepTime()); ui->prepTimeEdit->setTime(recipe.getPrepTime());
ui->cookTimeEdit->setTime(recipe.getCookTime()); ui->cookTimeEdit->setTime(recipe.getCookTime());
ui->servingsSpinBox->setValue((double)recipe.getServings()); ui->servingsSpinBox->setValue((double)recipe.getServings());
@ -38,6 +39,7 @@ NewRecipeDialog::~NewRecipeDialog(){
Recipe NewRecipeDialog::getRecipe(){ Recipe NewRecipeDialog::getRecipe(){
Recipe r(ui->recipeNameEdit->text().toStdString(), Recipe r(ui->recipeNameEdit->text().toStdString(),
ui->authorNameEdit->text().toStdString(),
this->ingredientListModel.getIngredients(), this->ingredientListModel.getIngredients(),
ui->instructionsTextEdit->toHtml().toStdString(), ui->instructionsTextEdit->toHtml().toStdString(),
ui->imageDisplayLabel->pixmap()->toImage(),//Image ui->imageDisplayLabel->pixmap()->toImage(),//Image

View File

@ -96,15 +96,25 @@
<item> <item>
<widget class="QWidget" name="recipeNamePanel" native="true"> <widget class="QWidget" name="recipeNamePanel" native="true">
<layout class="QVBoxLayout" name="verticalLayout_9"> <layout class="QVBoxLayout" name="verticalLayout_9">
<property name="spacing">
<number>0</number>
</property>
<item> <item>
<widget class="QLineEdit" name="recipeNameEdit"> <widget class="QLineEdit" name="recipeNameEdit">
<property name="font"> <property name="font">
<font> <font>
<pointsize>14</pointsize>
<weight>3</weight> <weight>3</weight>
<italic>false</italic> <italic>false</italic>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);</string>
</property>
<property name="frame">
<bool>false</bool>
</property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignCenter</set> <set>Qt::AlignCenter</set>
</property> </property>
@ -113,6 +123,30 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QLineEdit" name="authorNameEdit">
<property name="font">
<font>
<pointsize>12</pointsize>
<weight>3</weight>
<italic>false</italic>
<bold>false</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(245, 245, 255);</string>
</property>
<property name="frame">
<bool>false</bool>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="placeholderText">
<string>Author</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -141,7 +175,7 @@
<second>0</second> <second>0</second>
<year>1999</year> <year>1999</year>
<month>12</month> <month>12</month>
<day>23</day> <day>22</day>
</datetime> </datetime>
</property> </property>
<property name="currentSection"> <property name="currentSection">
@ -252,6 +286,9 @@
<item alignment="Qt::AlignTop"> <item alignment="Qt::AlignTop">
<widget class="QWidget" name="newTagBoxPanel" native="true"> <widget class="QWidget" name="newTagBoxPanel" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_7"> <layout class="QHBoxLayout" name="horizontalLayout_7">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
@ -285,6 +322,9 @@
<property name="toolTip"> <property name="toolTip">
<string>Create a new tag</string> <string>Create a new tag</string>
</property> </property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);</string>
</property>
<property name="icon"> <property name="icon">
<iconset resource="../images.qrc"> <iconset resource="../images.qrc">
<normaloff>:/images/images/plus_icon.png</normaloff>:/images/images/plus_icon.png</iconset> <normaloff>:/images/images/plus_icon.png</normaloff>:/images/images/plus_icon.png</iconset>
@ -296,6 +336,9 @@
<property name="toolTip"> <property name="toolTip">
<string>Permanently delete this tag</string> <string>Permanently delete this tag</string>
</property> </property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);</string>
</property>
<property name="icon"> <property name="icon">
<iconset resource="../images.qrc"> <iconset resource="../images.qrc">
<normaloff>:/images/images/minus_icon.png</normaloff>:/images/images/minus_icon.png</iconset> <normaloff>:/images/images/minus_icon.png</normaloff>:/images/images/minus_icon.png</iconset>
@ -308,6 +351,9 @@
<item> <item>
<widget class="QWidget" name="tagsListControlPanel" native="true"> <widget class="QWidget" name="tagsListControlPanel" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_8"> <layout class="QHBoxLayout" name="horizontalLayout_8">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
@ -322,6 +368,27 @@
</property> </property>
<item> <item>
<widget class="QPushButton" name="addTagButton"> <widget class="QPushButton" name="addTagButton">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="toolTip">
<string>Add the above tag to the recipe</string>
</property>
<property name="styleSheet">
<string notr="true">QPushButton#addTagButton {
background-color: rgb(235, 235, 255);
border: 0px;
}
QPushButton#addTagButton:hover{
background-color: rgb(245, 245, 255);
}
QPushButton#addTagButton:pressed{
background-color: rgb(255, 255, 255);
}</string>
</property>
<property name="text"> <property name="text">
<string>Add</string> <string>Add</string>
</property> </property>
@ -329,8 +396,29 @@
</item> </item>
<item> <item>
<widget class="QPushButton" name="deleteTagButton"> <widget class="QPushButton" name="deleteTagButton">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="toolTip">
<string>Remove this tag from the recipe</string>
</property>
<property name="styleSheet">
<string notr="true">QPushButton#deleteTagButton {
background-color: rgb(225, 225, 255);
border: 0px;
}
QPushButton#deleteTagButton:hover{
background-color: rgb(235, 235, 255);
}
QPushButton#deleteTagButton:pressed{
background-color: rgb(245, 245, 255);
}</string>
</property>
<property name="text"> <property name="text">
<string>Delete</string> <string>Remove</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -434,7 +522,7 @@
<item> <item>
<widget class="QLabel" name="addIngredientLabel"> <widget class="QLabel" name="addIngredientLabel">
<property name="text"> <property name="text">
<string>Add Ingredient</string> <string>Ingredients</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignCenter</set> <set>Qt::AlignCenter</set>
@ -497,6 +585,9 @@
</item> </item>
<item> <item>
<widget class="QPushButton" name="deleteIngredientButton"> <widget class="QPushButton" name="deleteIngredientButton">
<property name="toolTip">
<string>Delete this ingredient</string>
</property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
@ -581,6 +672,9 @@
</item> </item>
<item alignment="Qt::AlignRight"> <item alignment="Qt::AlignRight">
<widget class="QPushButton" name="newUnitButton"> <widget class="QPushButton" name="newUnitButton">
<property name="toolTip">
<string>Create a new unit of measure</string>
</property>
<property name="icon"> <property name="icon">
<iconset resource="../images.qrc"> <iconset resource="../images.qrc">
<normaloff>:/images/images/plus_icon.png</normaloff>:/images/images/plus_icon.png</iconset> <normaloff>:/images/images/plus_icon.png</normaloff>:/images/images/plus_icon.png</iconset>
@ -589,6 +683,9 @@
</item> </item>
<item> <item>
<widget class="QPushButton" name="deleteUnitButton"> <widget class="QPushButton" name="deleteUnitButton">
<property name="toolTip">
<string>Delete this unit of measure</string>
</property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
@ -626,6 +723,9 @@
<item> <item>
<widget class="QWidget" name="ingredientsListControlPanel" native="true"> <widget class="QWidget" name="ingredientsListControlPanel" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_9"> <layout class="QHBoxLayout" name="horizontalLayout_9">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
@ -640,6 +740,27 @@
</property> </property>
<item> <item>
<widget class="QPushButton" name="addIngredientButton"> <widget class="QPushButton" name="addIngredientButton">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="toolTip">
<string>Add the above ingredient to the recipe</string>
</property>
<property name="styleSheet">
<string notr="true">QPushButton#addIngredientButton {
background-color: rgb(235, 235, 255);
border: 0px;
}
QPushButton#addIngredientButton:hover{
background-color: rgb(245, 245, 255);
}
QPushButton#addIngredientButton:pressed{
background-color: rgb(255, 255, 255);
}</string>
</property>
<property name="text"> <property name="text">
<string>Add</string> <string>Add</string>
</property> </property>
@ -647,8 +768,29 @@
</item> </item>
<item> <item>
<widget class="QPushButton" name="removeIngredientButton"> <widget class="QPushButton" name="removeIngredientButton">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="toolTip">
<string>Remove this ingredient from the recipe</string>
</property>
<property name="styleSheet">
<string notr="true">QPushButton#removeIngredientButton {
background-color: rgb(225, 225, 255);
border: 0px;
}
QPushButton#removeIngredientButton:hover{
background-color: rgb(235, 235, 255);
}
QPushButton#removeIngredientButton:pressed{
background-color: rgb(245, 245, 255);
}</string>
</property>
<property name="text"> <property name="text">
<string>Delete</string> <string>Remove</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -8,19 +8,24 @@
void test(RecipeDatabase *recipeDB); void test(RecipeDatabase *recipeDB);
Recipe checkForFirstRun(RecipeDatabase *recipeDB){
Recipe r = recipeDB->retrieveRandomRecipe();
if (r.isEmpty()){//There are no recipes in the database.
//Add some basic units to the units, and some basic ingredients.
recipeDB->addBasicUnits();
recipeDB->addBasicIngredients();
}
return r;
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
RecipeDatabase recipeDB(QString(FileUtils::appDataPath+"recipes.db").toStdString()); RecipeDatabase recipeDB(QString(FileUtils::appDataPath+"recipes.db").toStdString());
QApplication a(argc, argv);
QApplication a(argc, argv);
MainWindow w(&recipeDB); MainWindow w(&recipeDB);
w.show(); w.loadFromRecipe(checkForFirstRun(&recipeDB));
w.show();
//TESTING CODE
//test(&recipeDB);
//END TESTING CODE.
w.loadFromRecipe(recipeDB.retrieveRandomRecipe());
a.exec(); a.exec();
recipeDB.closeConnection(); recipeDB.closeConnection();
@ -34,6 +39,7 @@ void test(RecipeDatabase *recipeDB){
ri.push_back(RecipeIngredient("baking powder", "additives", 1.0f, UnitOfMeasure("teaspoon", "teaspoons", "tsp", UnitOfMeasure::VOLUME, 1.0), "")); ri.push_back(RecipeIngredient("baking powder", "additives", 1.0f, UnitOfMeasure("teaspoon", "teaspoons", "tsp", UnitOfMeasure::VOLUME, 1.0), ""));
Recipe rec("Example", Recipe rec("Example",
"Andrew Lalis",
ri, ri,
Instruction("Placeholder Text"), Instruction("Placeholder Text"),
QImage(), QImage(),

View File

@ -12,7 +12,7 @@ bool RecipeDatabase::storeRecipe(Recipe recipe){
return false; return false;
} }
//Store a recipe, if it doesn't already exist. This first tries to create the recipe entry, then all subsequent supporting table entries. //Store a recipe, if it doesn't already exist. This first tries to create the recipe entry, then all subsequent supporting table entries.
this->executeSQL("BEGIN;"); this->beginTransaction();
ResultTable t = this->selectFrom("recipe", "*", "WHERE name="+surroundString(recipe.getName(), "'")); ResultTable t = this->selectFrom("recipe", "*", "WHERE name="+surroundString(recipe.getName(), "'"));
if (!t.isEmpty()){ if (!t.isEmpty()){
fprintf(stderr, "Error storing recipe: Recipe with name %s already exists.\n", recipe.getName().c_str()); fprintf(stderr, "Error storing recipe: Recipe with name %s already exists.\n", recipe.getName().c_str());
@ -20,6 +20,7 @@ bool RecipeDatabase::storeRecipe(Recipe recipe){
bool success = this->insertInto("recipe", bool success = this->insertInto("recipe",
vector<string>({ vector<string>({
"name", "name",
"authorName",
"createdDate", "createdDate",
"cookTime", "cookTime",
"prepTime", "prepTime",
@ -27,6 +28,7 @@ bool RecipeDatabase::storeRecipe(Recipe recipe){
}), }),
vector<string>({ vector<string>({
recipe.getName(), recipe.getName(),
recipe.getAuthor(),
recipe.getCreatedDate().toString().toStdString(), recipe.getCreatedDate().toString().toStdString(),
recipe.getCookTime().toString().toStdString(), recipe.getCookTime().toString().toStdString(),
recipe.getPrepTime().toString().toStdString(), recipe.getPrepTime().toString().toStdString(),
@ -46,12 +48,12 @@ bool RecipeDatabase::storeRecipe(Recipe recipe){
this->storeInstruction(recipe.getInstruction(), recipeId) && this->storeInstruction(recipe.getInstruction(), recipeId) &&
this->storeImage(recipe.getImage(), recipeId) && this->storeImage(recipe.getImage(), recipeId) &&
this->storeTags(recipe.getTags(), recipeId)){ this->storeTags(recipe.getTags(), recipeId)){
this->executeSQL("COMMIT;"); this->commitTransaction();
return true; return true;
} }
} }
} }
this->executeSQL("ROLLBACK;"); this->rollbackTransaction();
return false; return false;
} }
@ -158,7 +160,7 @@ Recipe RecipeDatabase::retrieveRandomRecipe(){
} }
return this->readFromResultTable(t); return this->readFromResultTable(t);
} }
//TODO: Change this to be more efficient! One query per recipe is not good!
vector<Recipe> RecipeDatabase::retrieveAllRecipes(){ vector<Recipe> RecipeDatabase::retrieveAllRecipes(){
ResultTable t = this->executeSQL("SELECT * FROM recipe ORDER BY name;"); ResultTable t = this->executeSQL("SELECT * FROM recipe ORDER BY name;");
return this->readRecipesFromTable(t); return this->readRecipesFromTable(t);
@ -326,7 +328,7 @@ bool RecipeDatabase::deleteRecipe(int recipeId){
printf("Cannot delete. No recipe with ID %d exists.\n", recipeId); printf("Cannot delete. No recipe with ID %d exists.\n", recipeId);
return false; return false;
} }
this->executeSQL("BEGIN;"); this->beginTransaction();
bool tagsDeleted = this->deleteFrom("recipeTag", "WHERE recipeId="+idString); bool tagsDeleted = this->deleteFrom("recipeTag", "WHERE recipeId="+idString);
bool recipeIngredientDeleted = this->deleteFrom("recipeIngredient", "WHERE recipeId="+idString); bool recipeIngredientDeleted = this->deleteFrom("recipeIngredient", "WHERE recipeId="+idString);
bool recipeDeleted = this->deleteFrom("recipe", "WHERE recipeId="+idString); bool recipeDeleted = this->deleteFrom("recipe", "WHERE recipeId="+idString);
@ -335,10 +337,10 @@ bool RecipeDatabase::deleteRecipe(int recipeId){
Q_UNUSED(instructionDeleted); Q_UNUSED(instructionDeleted);
Q_UNUSED(imageDeleted); Q_UNUSED(imageDeleted);
if (tagsDeleted && recipeIngredientDeleted && recipeDeleted){ if (tagsDeleted && recipeIngredientDeleted && recipeDeleted){
this->executeSQL("COMMIT;"); this->commitTransaction();
return true; return true;
} else { } else {
this->executeSQL("ROLLBACK;"); this->rollbackTransaction();
return false; return false;
} }
} }
@ -374,6 +376,7 @@ bool RecipeDatabase::updateRecipe(Recipe recipe, string originalName) {
this->beginTransaction(); this->beginTransaction();
ResultTable t = this->executeSQL("UPDATE recipe " ResultTable t = this->executeSQL("UPDATE recipe "
"SET name = '"+recipe.getName()+"', " "SET name = '"+recipe.getName()+"', "
"authorName = '"+recipe.getAuthor()+"', "
"createdDate = '"+recipe.getCreatedDate().toString().toStdString()+"', " "createdDate = '"+recipe.getCreatedDate().toString().toStdString()+"', "
"prepTime = '"+recipe.getPrepTime().toString().toStdString()+"', " "prepTime = '"+recipe.getPrepTime().toString().toStdString()+"', "
"cookTime = '"+recipe.getCookTime().toString().toStdString()+"', " "cookTime = '"+recipe.getCookTime().toString().toStdString()+"', "
@ -435,11 +438,55 @@ bool RecipeDatabase::updateRecipe(Recipe recipe, string originalName) {
} }
} }
bool RecipeDatabase::addBasicUnits(){
this->beginTransaction();
//Volume
this->storeUnitOfMeasure(UnitOfMeasure("Teaspoon", "Teaspoons", "tsp", UnitOfMeasure::VOLUME, 5.0));
this->storeUnitOfMeasure(UnitOfMeasure("Tablespoon", "Tablespoons", "tbsp", UnitOfMeasure::VOLUME, 15.0));
this->storeUnitOfMeasure(UnitOfMeasure("Fluid Ounce", "Fluid Ounces", "fl oz", UnitOfMeasure::VOLUME, 30.0));
this->storeUnitOfMeasure(UnitOfMeasure("Cup", "Cups", "c", UnitOfMeasure::VOLUME, 250.0));
this->storeUnitOfMeasure(UnitOfMeasure("Milliliter", "Milliliters", "mL", UnitOfMeasure::VOLUME, 1.0));
this->storeUnitOfMeasure(UnitOfMeasure("Liter", "Liters", "L", UnitOfMeasure::VOLUME, 1000.0));
this->storeUnitOfMeasure(UnitOfMeasure("Gallon", "Gallons", "gal", UnitOfMeasure::VOLUME, 3800.0));
//Mass/Weight
this->storeUnitOfMeasure(UnitOfMeasure("Ounce", "Ounces", "oz", UnitOfMeasure::MASS, 28.0));
this->storeUnitOfMeasure(UnitOfMeasure("Pound", "Pounds", "lb", UnitOfMeasure::MASS, 454.0));
this->storeUnitOfMeasure(UnitOfMeasure("Gram", "Grams", "g", UnitOfMeasure::MASS, 1.0));
this->storeUnitOfMeasure(UnitOfMeasure("Milligram", "Milligrams", "mg", UnitOfMeasure::MASS, 0.001));
this->storeUnitOfMeasure(UnitOfMeasure("Kilogram", "Kilograms", "kg", UnitOfMeasure::MASS, 1000.0));
//Length
this->storeUnitOfMeasure(UnitOfMeasure("Inch", "Inches", "in", UnitOfMeasure::LENGTH, 2.54));
this->storeUnitOfMeasure(UnitOfMeasure("Centimeter", "Centimeters", "cm", UnitOfMeasure::LENGTH, 1.0));
//MISC
this->storeUnitOfMeasure(UnitOfMeasure("Piece", "Pieces", "pc", UnitOfMeasure::MISC, 1.0));
this->storeUnitOfMeasure(UnitOfMeasure("Item", "Items", "", UnitOfMeasure::MISC, 1.0));
this->commitTransaction();
return true;
}
bool RecipeDatabase::addBasicIngredients(){
this->beginTransaction();
this->storeIngredient(Ingredient("Flour", "grains"));
this->storeIngredient(Ingredient("Eggs", "eggs"));
this->storeIngredient(Ingredient("Milk", "dairy"));
this->storeIngredient(Ingredient("Cheese", "dairy"));
this->storeIngredient(Ingredient("Salt", "spices"));
this->storeIngredient(Ingredient("Sugar", "sugars"));
this->storeIngredient(Ingredient("Vegetable Oil", "oils"));
this->storeIngredient(Ingredient("Olive Oil", "oils"));
this->storeIngredient(Ingredient("Water", "water"));
this->storeIngredient(Ingredient("Bell Pepper", "vegetables"));
this->storeIngredient(Ingredient("Onion", "vegetables"));
this->storeIngredient(Ingredient("Garlic", "spices"));
this->commitTransaction();
return true;
}
void RecipeDatabase::ensureTablesExist(){ void RecipeDatabase::ensureTablesExist(){
//Make sure that foreign keys are enabled. //Make sure that foreign keys are enabled.
this->executeSQL("PRAGMA foreign_keys = ON;"); this->executeSQL("PRAGMA foreign_keys = ON;");
this->executeSQL("BEGIN;"); this->beginTransaction();
//Ingredients table. //Ingredients table.
this->executeSQL("CREATE TABLE IF NOT EXISTS ingredient(" this->executeSQL("CREATE TABLE IF NOT EXISTS ingredient("
"ingredientId INTEGER PRIMARY KEY," "ingredientId INTEGER PRIMARY KEY,"
@ -456,6 +503,7 @@ void RecipeDatabase::ensureTablesExist(){
this->executeSQL("CREATE TABLE IF NOT EXISTS recipe(" this->executeSQL("CREATE TABLE IF NOT EXISTS recipe("
"recipeId INTEGER PRIMARY KEY," "recipeId INTEGER PRIMARY KEY,"
"name varchar UNIQUE," "name varchar UNIQUE,"
"authorName varchar,"
"createdDate date," "createdDate date,"
"prepTime time," "prepTime time,"
"cookTime time," "cookTime time,"
@ -475,18 +523,19 @@ void RecipeDatabase::ensureTablesExist(){
"FOREIGN KEY (ingredientId) REFERENCES ingredient(ingredientId)," "FOREIGN KEY (ingredientId) REFERENCES ingredient(ingredientId),"
"FOREIGN KEY (recipeId) REFERENCES recipe(recipeId)," "FOREIGN KEY (recipeId) REFERENCES recipe(recipeId),"
"FOREIGN KEY (unitName) REFERENCES unitOfMeasure(name));"); "FOREIGN KEY (unitName) REFERENCES unitOfMeasure(name));");
this->executeSQL("COMMIT;"); this->commitTransaction();
} }
Recipe RecipeDatabase::readFromResultTable(ResultTable t, int tRow){ Recipe RecipeDatabase::readFromResultTable(ResultTable t, int tRow){
Recipe r; Recipe r;
TableRow row = t.rows().at(tRow); TableRow row = t.rows().at(tRow);
int id = std::stoi(row.at(0)); int id = std::stoi(row.at(0)); //id
r.setName(row.at(1)); r.setName(row.at(1)); //Name
r.setCreatedDate(QDate::fromString(QString::fromStdString(row.at(2)))); r.setAuthor(row.at(2)); //author
r.setPrepTime(QTime::fromString(QString::fromStdString(row.at(3)))); r.setCreatedDate(QDate::fromString(QString::fromStdString(row.at(3)))); //createdDate
r.setCookTime(QTime::fromString(QString::fromStdString(row.at(4)))); r.setPrepTime(QTime::fromString(QString::fromStdString(row.at(4)))); //prepTime
r.setServings(std::stof(row.at(5))); r.setCookTime(QTime::fromString(QString::fromStdString(row.at(5)))); //cookTime
r.setServings(std::stof(row.at(6))); //servings
r.setInstruction(FileUtils::loadInstruction(id)); r.setInstruction(FileUtils::loadInstruction(id));
r.setImage(FileUtils::loadImage(id)); r.setImage(FileUtils::loadImage(id));
r.setIngredients(this->retrieveRecipeIngredients(id)); r.setIngredients(this->retrieveRecipeIngredients(id));

View File

@ -49,6 +49,10 @@ class RecipeDatabase : public Database
//Updating. //Updating.
bool updateRecipe(Recipe recipe, string originalName); bool updateRecipe(Recipe recipe, string originalName);
//Adding basic information at start.
bool addBasicUnits();
bool addBasicIngredients();
private: private:
//Utility methods. //Utility methods.

View File

@ -1,7 +1,8 @@
#include "model/recipe/recipe.h" #include "model/recipe/recipe.h"
Recipe::Recipe(string name, vector<RecipeIngredient> ingredients, Instruction instruction, QImage image, vector<RecipeTag> tags, QDate createdDate, QTime prepTime, QTime cookTime, float servings){ Recipe::Recipe(string name, string author, vector<RecipeIngredient> ingredients, Instruction instruction, QImage image, vector<RecipeTag> tags, QDate createdDate, QTime prepTime, QTime cookTime, float servings){
setName(name); setName(name);
setAuthor(author);
setIngredients(ingredients); setIngredients(ingredients);
setInstruction(instruction); setInstruction(instruction);
setImage(image); setImage(image);
@ -12,12 +13,16 @@ Recipe::Recipe(string name, vector<RecipeIngredient> ingredients, Instruction in
setServings(servings); setServings(servings);
} }
Recipe::Recipe() : Recipe::Recipe("", vector<RecipeIngredient>(), Instruction(), QImage(), vector<RecipeTag>(), QDate::currentDate(), QTime(), QTime(), 1.0f){ Recipe::Recipe() : Recipe::Recipe("", "", vector<RecipeIngredient>(), Instruction(), QImage(), vector<RecipeTag>(), QDate::currentDate(), QTime(), QTime(), 1.0f){
//Set default values when none are specified. //Set default values when none are specified.
} }
string Recipe::getName() const{ string Recipe::getName() const{
return this->name; return this->name;
}
string Recipe::getAuthor() const{
return this->authorName;
} }
vector<RecipeIngredient> Recipe::getIngredients() const{ vector<RecipeIngredient> Recipe::getIngredients() const{
@ -71,7 +76,11 @@ bool Recipe::isEmpty() const{
} }
void Recipe::setName(string newName){ void Recipe::setName(string newName){
this->name = newName; this->name = newName;
}
void Recipe::setAuthor(string newName){
this->authorName = newName;
} }
void Recipe::setIngredients(vector<RecipeIngredient> ingredients){ void Recipe::setIngredients(vector<RecipeIngredient> ingredients){
@ -111,8 +120,9 @@ void Recipe::setServings(float newServingsCount){
} }
void Recipe::print(){ void Recipe::print(){
printf("Recipe: %s, Created on: %s, Prep time: %s, Cook time: %s, Serves: %f\n", printf("Recipe: %s, Created on: %s, by %s, Prep time: %s, Cook time: %s, Serves: %f\n",
this->name.c_str(), this->name.c_str(),
this->authorName.c_str(),
this->createdDate.toString().toStdString().c_str(), this->createdDate.toString().toStdString().c_str(),
this->prepTime.toString().toStdString().c_str(), this->prepTime.toString().toStdString().c_str(),
this->cookTime.toString().toStdString().c_str(), this->cookTime.toString().toStdString().c_str(),

View File

@ -32,12 +32,13 @@ class Recipe
{ {
public: public:
//Full constructor //Full constructor
Recipe(string name, vector<RecipeIngredient> ingredients, Instruction instruction, QImage image, vector<RecipeTag> tags, QDate createdDate, QTime prepTime, QTime cookTime, float servings); Recipe(string name, string author, vector<RecipeIngredient> ingredients, Instruction instruction, QImage image, vector<RecipeTag> tags, QDate createdDate, QTime prepTime, QTime cookTime, float servings);
//Constructor with default values. //Constructor with default values.
Recipe(); Recipe();
//Getters //Getters
string getName() const; string getName() const;
string getAuthor() const;
vector<RecipeIngredient> getIngredients() const; vector<RecipeIngredient> getIngredients() const;
vector<string> getFoodGroups() const; vector<string> getFoodGroups() const;
Instruction getInstruction() const; Instruction getInstruction() const;
@ -52,6 +53,7 @@ public:
//Setters //Setters
void setName(string newName); void setName(string newName);
void setAuthor(string newName);
void setIngredients(vector<RecipeIngredient> ingredients); void setIngredients(vector<RecipeIngredient> ingredients);
void setTags(vector<RecipeTag> tags); void setTags(vector<RecipeTag> tags);
void addIngredient(RecipeIngredient newIngredient); void addIngredient(RecipeIngredient newIngredient);
@ -66,6 +68,7 @@ public:
private: private:
//Main information. //Main information.
string name; //The name of the recipe. string name; //The name of the recipe.
string authorName; //The name of the author of this recipe.
vector<RecipeIngredient> ingredients; //The list of ingredients in the recipe. vector<RecipeIngredient> ingredients; //The list of ingredients in the recipe.
Instruction instruction; //The instruction HTML document. Instruction instruction; //The instruction HTML document.
QImage image; //An image displayed alongside the recipe. QImage image; //An image displayed alongside the recipe.