Stable first release #10
|
@ -19,6 +19,10 @@ MainWindow::~MainWindow(){
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::loadFromRecipe(Recipe recipe){
|
void MainWindow::loadFromRecipe(Recipe recipe){
|
||||||
|
if (recipe.isEmpty()){
|
||||||
|
setRecipeName("No recipes found.");
|
||||||
|
setAuthorName("Click 'New' to get started.");
|
||||||
|
} else {
|
||||||
setRecipeName(recipe.getName());
|
setRecipeName(recipe.getName());
|
||||||
setInstruction(recipe.getInstruction());
|
setInstruction(recipe.getInstruction());
|
||||||
setIngredients(recipe.getIngredients());
|
setIngredients(recipe.getIngredients());
|
||||||
|
@ -32,6 +36,7 @@ void MainWindow::loadFromRecipe(Recipe recipe){
|
||||||
setServings(recipe.getServings());
|
setServings(recipe.getServings());
|
||||||
setTags(recipe.getTags());
|
setTags(recipe.getTags());
|
||||||
this->currentRecipe = recipe;
|
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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -364,7 +364,7 @@ font: "Noto Sans CJK KR";</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">
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
20
main.cpp
20
main.cpp
|
@ -8,20 +8,25 @@
|
||||||
|
|
||||||
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.loadFromRecipe(checkForFirstRun(&recipeDB));
|
||||||
w.show();
|
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(),
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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,7 +13,7 @@ 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.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,6 +21,10 @@ 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{
|
||||||
return this->ingredients;
|
return this->ingredients;
|
||||||
}
|
}
|
||||||
|
@ -74,6 +79,10 @@ 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){
|
||||||
this->ingredients = ingredients;
|
this->ingredients = 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(),
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue