Added filtering by ingredient to search window.
This commit is contained in:
parent
e0dda64412
commit
4170df7fc8
|
@ -11,17 +11,17 @@ OpenRecipeDialog::OpenRecipeDialog(QWidget *parent) :
|
||||||
ui->ingredientsListView->setModel(&this->ingredientsModel);
|
ui->ingredientsListView->setModel(&this->ingredientsModel);
|
||||||
ui->tagsListView->setModel(&this->tagsModel);
|
ui->tagsListView->setModel(&this->tagsModel);
|
||||||
|
|
||||||
connect(ui->ingredientsListView->selectionModel(),
|
QObject::connect(ui->ingredientsListView->selectionModel(),
|
||||||
SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
|
SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
|
||||||
this,
|
this,
|
||||||
SLOT(on_ingredientsListView_selectionChanged(QItemSelection)));
|
SLOT(onIngredientsListViewSelectionChanged(QItemSelection)));
|
||||||
}
|
}
|
||||||
|
|
||||||
OpenRecipeDialog::OpenRecipeDialog(RecipeDatabase *recipeDB, QWidget *parent) : OpenRecipeDialog(parent){
|
OpenRecipeDialog::OpenRecipeDialog(RecipeDatabase *recipeDB, QWidget *parent) : OpenRecipeDialog(parent){
|
||||||
this->recipeDB = recipeDB;
|
this->recipeDB = recipeDB;
|
||||||
this->populateIngredientsList();
|
this->populateIngredientsList();
|
||||||
this->populateTagsList();
|
this->populateTagsList();
|
||||||
this->populateRecipesTable();
|
this->populateRecipesTable(this->recipeDB->retrieveAllRecipes());
|
||||||
}
|
}
|
||||||
|
|
||||||
OpenRecipeDialog::~OpenRecipeDialog()
|
OpenRecipeDialog::~OpenRecipeDialog()
|
||||||
|
@ -33,9 +33,8 @@ Recipe OpenRecipeDialog::getSelectedRecipe(){
|
||||||
return this->selectedRecipe;
|
return this->selectedRecipe;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenRecipeDialog::populateRecipesTable(){
|
void OpenRecipeDialog::populateRecipesTable(vector<Recipe> recipes){
|
||||||
this->recipeTableModel.clear();
|
this->recipeTableModel.clear();
|
||||||
vector<Recipe> recipes = this->recipeDB->retrieveAllRecipes();
|
|
||||||
this->recipeTableModel.setRecipes(recipes);
|
this->recipeTableModel.setRecipes(recipes);
|
||||||
ui->recipeTableView->resizeColumnsToContents();
|
ui->recipeTableView->resizeColumnsToContents();
|
||||||
ui->recipeTableView->show();
|
ui->recipeTableView->show();
|
||||||
|
@ -69,9 +68,10 @@ void OpenRecipeDialog::on_deleteRecipeButton_clicked(){
|
||||||
bool success = this->recipeDB->deleteRecipe(r.getName());
|
bool success = this->recipeDB->deleteRecipe(r.getName());
|
||||||
if (!success){
|
if (!success){
|
||||||
QMessageBox::critical(this, QString::fromStdString("Unable to Delete"), QString::fromStdString("Could not delete recipe "+r.getName()));
|
QMessageBox::critical(this, QString::fromStdString("Unable to Delete"), QString::fromStdString("Could not delete recipe "+r.getName()));
|
||||||
|
} else {
|
||||||
|
this->populateRecipesTable(this->recipeDB->retrieveAllRecipes());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this->populateRecipesTable();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,13 +80,12 @@ void OpenRecipeDialog::on_recipeTableView_doubleClicked(const QModelIndex &index
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenRecipeDialog::on_ingredientsListView_selectionChanged(const QItemSelection &selection){
|
void OpenRecipeDialog::onIngredientsListViewSelectionChanged(const QItemSelection &selection){
|
||||||
printf("Selection changed!\n");
|
|
||||||
vector<Ingredient> ingredients;
|
vector<Ingredient> ingredients;
|
||||||
for (QModelIndex index : selection.indexes()){
|
QModelIndexList indexes = ui->ingredientsListView->selectionModel()->selectedRows();
|
||||||
|
for (QModelIndex index : indexes){
|
||||||
Ingredient i = this->ingredientsModel.getIngredients().at(index.row());
|
Ingredient i = this->ingredientsModel.getIngredients().at(index.row());
|
||||||
ingredients.push_back(i);
|
ingredients.push_back(i);
|
||||||
printf("Selected: %s\n", i.getName().c_str());
|
|
||||||
}
|
}
|
||||||
|
this->populateRecipesTable(this->recipeDB->retrieveRecipesWithIngredients(ingredients));
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ class OpenRecipeDialog : public QDialog
|
||||||
|
|
||||||
void on_recipeTableView_doubleClicked(const QModelIndex &index);
|
void on_recipeTableView_doubleClicked(const QModelIndex &index);
|
||||||
|
|
||||||
void on_ingredientsListView_selectionChanged(const QItemSelection &selection);
|
void onIngredientsListViewSelectionChanged(const QItemSelection &selection);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::OpenRecipeDialog *ui;
|
Ui::OpenRecipeDialog *ui;
|
||||||
|
@ -41,7 +41,7 @@ class OpenRecipeDialog : public QDialog
|
||||||
IngredientListModel ingredientsModel;
|
IngredientListModel ingredientsModel;
|
||||||
TagListModel tagsModel;
|
TagListModel tagsModel;
|
||||||
|
|
||||||
void populateRecipesTable();
|
void populateRecipesTable(vector<Recipe> recipes);
|
||||||
void populateIngredientsList();
|
void populateIngredientsList();
|
||||||
void populateTagsList();
|
void populateTagsList();
|
||||||
};
|
};
|
||||||
|
|
|
@ -158,15 +158,36 @@ 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->selectFrom("recipe", "name", "ORDER BY name");
|
ResultTable t = this->executeSQL("SELECT * FROM recipe ORDER BY name;");
|
||||||
vector<Recipe> recipes;
|
return this->readRecipesFromTable(t);
|
||||||
for (TableRow row : t.rows()){
|
|
||||||
recipes.push_back(this->retrieveRecipe(row.at(0)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<Recipe> RecipeDatabase::retrieveRecipesWithIngredients(vector<Ingredient> ingredients){
|
||||||
|
vector<Recipe> recipes;
|
||||||
|
if (ingredients.empty()){
|
||||||
return recipes;
|
return recipes;
|
||||||
}
|
}
|
||||||
|
string filterList = surroundString(ingredients.at(0).getName(), "'");
|
||||||
|
for (unsigned int i = 1; i < ingredients.size(); i++){
|
||||||
|
filterList += ", " + surroundString(ingredients[i].getName(), "'");
|
||||||
|
}
|
||||||
|
filterList = '(' + filterList + ')';
|
||||||
|
ResultTable t = this->executeSQL("SELECT * "
|
||||||
|
"FROM recipe "
|
||||||
|
"WHERE recipeId IN ("
|
||||||
|
" SELECT recipeIngredient.recipeId "
|
||||||
|
" FROM recipeIngredient "
|
||||||
|
" INNER JOIN ("
|
||||||
|
" SELECT ingredientId "
|
||||||
|
" FROM ingredient "
|
||||||
|
" WHERE name IN "+filterList+""
|
||||||
|
" ) filteredIngredients "
|
||||||
|
" ON recipeIngredient.ingredientId = filteredIngredients.ingredientId"
|
||||||
|
") ORDER BY name;");
|
||||||
|
return this->readRecipesFromTable(t);
|
||||||
|
}
|
||||||
|
|
||||||
vector<string> RecipeDatabase::retrieveAllFoodGroups(){
|
vector<string> RecipeDatabase::retrieveAllFoodGroups(){
|
||||||
ResultTable t = this->executeSQL("SELECT DISTINCT foodGroup FROM ingredient ORDER BY foodGroup;");
|
ResultTable t = this->executeSQL("SELECT DISTINCT foodGroup FROM ingredient ORDER BY foodGroup;");
|
||||||
|
@ -360,3 +381,13 @@ Recipe RecipeDatabase::readFromResultTable(ResultTable t, int tRow){
|
||||||
r.setTags(this->retrieveTags(id));
|
r.setTags(this->retrieveTags(id));
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Retrieves recipes from a table with the following format:
|
||||||
|
// id, name, createdDate, prepTime, cookTime, servings
|
||||||
|
vector<Recipe> RecipeDatabase::readRecipesFromTable(ResultTable t){
|
||||||
|
vector<Recipe> recipes;
|
||||||
|
for (unsigned int row = 0; row < t.rowCount(); row++){
|
||||||
|
recipes.push_back(readFromResultTable(t, row));
|
||||||
|
}
|
||||||
|
return recipes;
|
||||||
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ class RecipeDatabase : public Database
|
||||||
Recipe retrieveRecipe(string name);
|
Recipe retrieveRecipe(string name);
|
||||||
Recipe retrieveRandomRecipe();
|
Recipe retrieveRandomRecipe();
|
||||||
vector<Recipe> retrieveAllRecipes();
|
vector<Recipe> retrieveAllRecipes();
|
||||||
|
vector<Recipe> retrieveRecipesWithIngredients(vector<Ingredient> ingredients);
|
||||||
vector<string> retrieveAllFoodGroups();
|
vector<string> retrieveAllFoodGroups();
|
||||||
vector<RecipeIngredient> retrieveRecipeIngredients(int recipeId);
|
vector<RecipeIngredient> retrieveRecipeIngredients(int recipeId);
|
||||||
vector<Ingredient> retrieveAllIngredients();
|
vector<Ingredient> retrieveAllIngredients();
|
||||||
|
@ -53,6 +54,7 @@ class RecipeDatabase : public Database
|
||||||
void ensureTablesExist();
|
void ensureTablesExist();
|
||||||
//Read a recipe from a row of a result table.
|
//Read a recipe from a row of a result table.
|
||||||
Recipe readFromResultTable(ResultTable t, int row=0);
|
Recipe readFromResultTable(ResultTable t, int row=0);
|
||||||
|
vector<Recipe> readRecipesFromTable(ResultTable t);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RECIPEDATABASE_H
|
#endif // RECIPEDATABASE_H
|
||||||
|
|
Loading…
Reference in New Issue