Almost at full release. #9

Merged
andrewlalis merged 4 commits from development into master 2018-03-30 21:30:20 +00:00
5 changed files with 185 additions and 68 deletions
Showing only changes of commit f13432a2fe - Show all commits

View File

@ -15,12 +15,17 @@ OpenRecipeDialog::OpenRecipeDialog(QWidget *parent) :
SIGNAL(selectionChanged(QItemSelection, QItemSelection)), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
this, this,
SLOT(onIngredientsListViewSelectionChanged(QItemSelection))); SLOT(onIngredientsListViewSelectionChanged(QItemSelection)));
QObject::connect(ui->tagsListView->selectionModel(),
SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
this,
SLOT(onTagsListViewSelectionChanged(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->populateFoodGroupsList();
this->populateRecipesTable(this->recipeDB->retrieveAllRecipes()); this->populateRecipesTable(this->recipeDB->retrieveAllRecipes());
} }
@ -48,6 +53,13 @@ void OpenRecipeDialog::populateTagsList(){
this->tagsModel.setTags(this->recipeDB->retrieveAllTags()); this->tagsModel.setTags(this->recipeDB->retrieveAllTags());
} }
void OpenRecipeDialog::populateFoodGroupsList(){
for (string s : this->recipeDB->retrieveAllFoodGroups()){
ui->foodGroupsListWidget->addItem(QString::fromStdString(s));
}
//ui->foodGroupsListWidget->show();
}
void OpenRecipeDialog::on_deleteRecipeButton_clicked(){ void OpenRecipeDialog::on_deleteRecipeButton_clicked(){
QItemSelectionModel *selectModel = ui->recipeTableView->selectionModel(); QItemSelectionModel *selectModel = ui->recipeTableView->selectionModel();
if (!selectModel->hasSelection()){ if (!selectModel->hasSelection()){
@ -81,6 +93,7 @@ void OpenRecipeDialog::on_recipeTableView_doubleClicked(const QModelIndex &index
} }
void OpenRecipeDialog::onIngredientsListViewSelectionChanged(const QItemSelection &selection){ void OpenRecipeDialog::onIngredientsListViewSelectionChanged(const QItemSelection &selection){
Q_UNUSED(selection);
vector<Ingredient> ingredients; vector<Ingredient> ingredients;
QModelIndexList indexes = ui->ingredientsListView->selectionModel()->selectedRows(); QModelIndexList indexes = ui->ingredientsListView->selectionModel()->selectedRows();
for (QModelIndex index : indexes){ for (QModelIndex index : indexes){
@ -89,3 +102,28 @@ void OpenRecipeDialog::onIngredientsListViewSelectionChanged(const QItemSelectio
} }
this->populateRecipesTable(this->recipeDB->retrieveRecipesWithIngredients(ingredients)); this->populateRecipesTable(this->recipeDB->retrieveRecipesWithIngredients(ingredients));
} }
void OpenRecipeDialog::onTagsListViewSelectionChanged(const QItemSelection &selection){
Q_UNUSED(selection);
vector<RecipeTag> tags;
QModelIndexList indexes = ui->tagsListView->selectionModel()->selectedRows();
for (QModelIndex index : indexes){
RecipeTag t = this->tagsModel.getTags().at(index.row());
tags.push_back(t);
}
this->populateRecipesTable(this->recipeDB->retrieveRecipesWithTags(tags));
}
void OpenRecipeDialog::on_nameEdit_textChanged(const QString &arg1){
Q_UNUSED(arg1);
this->populateRecipesTable(this->recipeDB->retrieveRecipesWithSubstring(ui->nameEdit->text().toStdString()));
}
void OpenRecipeDialog::on_foodGroupsListWidget_itemSelectionChanged(){
vector<string> groups;
for (QModelIndex index : ui->foodGroupsListWidget->selectionModel()->selectedRows()){
QListWidgetItem *item = ui->foodGroupsListWidget->item(index.row());
groups.push_back(item->text().toStdString());
}
this->populateRecipesTable(this->recipeDB->retrieveRecipesWithFoodGroups(groups));
}

View File

@ -32,6 +32,12 @@ class OpenRecipeDialog : public QDialog
void onIngredientsListViewSelectionChanged(const QItemSelection &selection); void onIngredientsListViewSelectionChanged(const QItemSelection &selection);
void onTagsListViewSelectionChanged(const QItemSelection &selection);
void on_nameEdit_textChanged(const QString &arg1);
void on_foodGroupsListWidget_itemSelectionChanged();
private: private:
Ui::OpenRecipeDialog *ui; Ui::OpenRecipeDialog *ui;
RecipeDatabase *recipeDB; RecipeDatabase *recipeDB;
@ -44,6 +50,7 @@ class OpenRecipeDialog : public QDialog
void populateRecipesTable(vector<Recipe> recipes); void populateRecipesTable(vector<Recipe> recipes);
void populateIngredientsList(); void populateIngredientsList();
void populateTagsList(); void populateTagsList();
void populateFoodGroupsList();
}; };
#endif // OPENRECIPEDIALOG_H #endif // OPENRECIPEDIALOG_H

View File

@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1000</width> <width>1064</width>
<height>480</height> <height>480</height>
</rect> </rect>
</property> </property>
@ -25,73 +25,109 @@
<widget class="QWidget" name="searchPanel" native="true"> <widget class="QWidget" name="searchPanel" native="true">
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item alignment="Qt::AlignLeft"> <item alignment="Qt::AlignLeft">
<widget class="QWidget" name="tagsSearchpanel" native="true"> <widget class="QTabWidget" name="tabWidget">
<layout class="QVBoxLayout" name="verticalLayout_3"> <property name="minimumSize">
<item> <size>
<widget class="QLabel" name="tagLabel"> <width>290</width>
<property name="text"> <height>0</height>
<string>Tag</string> </size>
</property> </property>
</widget> <property name="tabPosition">
</item> <enum>QTabWidget::South</enum>
<item> </property>
<widget class="QListView" name="tagsListView"> <property name="tabShape">
<property name="sizePolicy"> <enum>QTabWidget::Rounded</enum>
<sizepolicy hsizetype="Minimum" vsizetype="Expanding"> </property>
<horstretch>0</horstretch> <property name="currentIndex">
<verstretch>0</verstretch> <number>2</number>
</sizepolicy> </property>
</property> <widget class="QWidget" name="tagsTab">
<property name="frameShape"> <attribute name="title">
<enum>QFrame::NoFrame</enum> <string>Tags</string>
</property> </attribute>
<property name="selectionMode"> <layout class="QVBoxLayout" name="verticalLayout_5">
<enum>QAbstractItemView::ExtendedSelection</enum> <item>
</property> <widget class="QListView" name="tagsListView">
<property name="isWrapping" stdset="0"> <property name="sizePolicy">
<bool>false</bool> <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
</property> <horstretch>0</horstretch>
<property name="wordWrap"> <verstretch>0</verstretch>
<bool>false</bool> </sizepolicy>
</property> </property>
</widget> <property name="frameShape">
</item> <enum>QFrame::NoFrame</enum>
</layout> </property>
</widget> <property name="selectionMode">
</item> <enum>QAbstractItemView::ExtendedSelection</enum>
<item alignment="Qt::AlignLeft"> </property>
<widget class="QWidget" name="ingredientSearchPanel" native="true"> <property name="verticalScrollMode">
<layout class="QVBoxLayout" name="verticalLayout_4"> <enum>QAbstractItemView::ScrollPerPixel</enum>
<item> </property>
<widget class="QLabel" name="ingredientLabel"> <property name="isWrapping" stdset="0">
<property name="text"> <bool>false</bool>
<string>Ingredient</string> </property>
</property> <property name="wordWrap">
</widget> <bool>true</bool>
</item> </property>
<item> </widget>
<widget class="QListView" name="ingredientsListView"> </item>
<property name="sizePolicy"> </layout>
<sizepolicy hsizetype="Minimum" vsizetype="Expanding"> </widget>
<horstretch>0</horstretch> <widget class="QWidget" name="ingredientsTab">
<verstretch>0</verstretch> <attribute name="title">
</sizepolicy> <string>Ingredients</string>
</property> </attribute>
<property name="frameShape"> <layout class="QVBoxLayout" name="verticalLayout_6">
<enum>QFrame::NoFrame</enum> <item>
</property> <widget class="QListView" name="ingredientsListView">
<property name="selectionMode"> <property name="sizePolicy">
<enum>QAbstractItemView::ExtendedSelection</enum> <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
</property> <horstretch>0</horstretch>
<property name="isWrapping" stdset="0"> <verstretch>0</verstretch>
<bool>false</bool> </sizepolicy>
</property> </property>
<property name="wordWrap"> <property name="frameShape">
<bool>true</bool> <enum>QFrame::NoFrame</enum>
</property> </property>
</widget> <property name="selectionMode">
</item> <enum>QAbstractItemView::ExtendedSelection</enum>
</layout> </property>
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="isWrapping" stdset="0">
<bool>false</bool>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Food Groups</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QListWidget" name="foodGroupsListWidget">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget> </widget>
</item> </item>
<item> <item>

View File

@ -189,6 +189,39 @@ vector<Recipe> RecipeDatabase::retrieveRecipesWithIngredients(vector<Ingredient>
return this->readRecipesFromTable(t); return this->readRecipesFromTable(t);
} }
vector<Recipe> RecipeDatabase::retrieveRecipesWithTags(vector<RecipeTag> tags){
vector<Recipe> recipes;
if (tags.empty()){
return recipes;
}
string filterList = surroundString(tags.at(0).getValue(), "'");
for (unsigned int i = 1; i < tags.size(); i++){
filterList += ", " + surroundString(tags[i].getValue(), "'");
}
filterList = '(' + filterList + ')';
ResultTable t = this->executeSQL("SELECT * FROM recipe WHERE recipeId IN (SELECT recipeId FROM recipeTag WHERE tagName IN "+filterList+" );");
return this->readRecipesFromTable(t);
}
vector<Recipe> RecipeDatabase::retrieveRecipesWithSubstring(string s){
ResultTable t = this->executeSQL("SELECT * FROM recipe WHERE name LIKE '%"+s+"%' COLLATE NOCASE;");
return this->readRecipesFromTable(t);
}
vector<Recipe> RecipeDatabase::retrieveRecipesWithFoodGroups(vector<string> groups){
vector<Recipe> recipes;
if (groups.empty()){
return recipes;
}
string filterList = surroundString(groups.at(0), "'");
for (unsigned int i = 1; i < groups.size(); i++){
filterList += ", " + surroundString(groups.at(i), "'");
}
filterList = '(' + filterList + ')';
ResultTable t = this->executeSQL("SELECT * FROM recipe WHERE recipeId IN (SELECT recipeId FROM recipeIngredient WHERE ingredientId IN (SELECT ingredientId FROM ingredient WHERE foodGroup IN "+filterList+" ) ) 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;");
vector<string> foodGroups; vector<string> foodGroups;

View File

@ -35,6 +35,9 @@ class RecipeDatabase : public Database
Recipe retrieveRandomRecipe(); Recipe retrieveRandomRecipe();
vector<Recipe> retrieveAllRecipes(); vector<Recipe> retrieveAllRecipes();
vector<Recipe> retrieveRecipesWithIngredients(vector<Ingredient> ingredients); vector<Recipe> retrieveRecipesWithIngredients(vector<Ingredient> ingredients);
vector<Recipe> retrieveRecipesWithTags(vector<RecipeTag> tags);
vector<Recipe> retrieveRecipesWithSubstring(string s);
vector<Recipe> retrieveRecipesWithFoodGroups(vector<string> groups);
vector<string> retrieveAllFoodGroups(); vector<string> retrieveAllFoodGroups();
vector<RecipeIngredient> retrieveRecipeIngredients(int recipeId); vector<RecipeIngredient> retrieveRecipeIngredients(int recipeId);
vector<Ingredient> retrieveAllIngredients(); vector<Ingredient> retrieveAllIngredients();