Almost at full release. #9
			
				
			
		
		
		
	| 
						 | 
				
			
			@ -15,12 +15,17 @@ OpenRecipeDialog::OpenRecipeDialog(QWidget *parent) :
 | 
			
		|||
			SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
 | 
			
		||||
			this,
 | 
			
		||||
			SLOT(onIngredientsListViewSelectionChanged(QItemSelection)));
 | 
			
		||||
	QObject::connect(ui->tagsListView->selectionModel(),
 | 
			
		||||
			SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
 | 
			
		||||
			this,
 | 
			
		||||
			SLOT(onTagsListViewSelectionChanged(QItemSelection)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
OpenRecipeDialog::OpenRecipeDialog(RecipeDatabase *recipeDB, QWidget *parent) : OpenRecipeDialog(parent){
 | 
			
		||||
	this->recipeDB = recipeDB;
 | 
			
		||||
	this->populateIngredientsList();
 | 
			
		||||
	this->populateTagsList();
 | 
			
		||||
	this->populateFoodGroupsList();
 | 
			
		||||
	this->populateRecipesTable(this->recipeDB->retrieveAllRecipes());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -48,6 +53,13 @@ void OpenRecipeDialog::populateTagsList(){
 | 
			
		|||
	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(){
 | 
			
		||||
	QItemSelectionModel *selectModel = ui->recipeTableView->selectionModel();
 | 
			
		||||
	if (!selectModel->hasSelection()){
 | 
			
		||||
| 
						 | 
				
			
			@ -81,6 +93,7 @@ void OpenRecipeDialog::on_recipeTableView_doubleClicked(const QModelIndex &index
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void OpenRecipeDialog::onIngredientsListViewSelectionChanged(const QItemSelection &selection){
 | 
			
		||||
	Q_UNUSED(selection);
 | 
			
		||||
	vector<Ingredient> ingredients;
 | 
			
		||||
	QModelIndexList indexes = ui->ingredientsListView->selectionModel()->selectedRows();
 | 
			
		||||
	for (QModelIndex index : indexes){
 | 
			
		||||
| 
						 | 
				
			
			@ -89,3 +102,28 @@ void OpenRecipeDialog::onIngredientsListViewSelectionChanged(const QItemSelectio
 | 
			
		|||
	}
 | 
			
		||||
	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));
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,12 @@ class OpenRecipeDialog : public QDialog
 | 
			
		|||
 | 
			
		||||
		void onIngredientsListViewSelectionChanged(const QItemSelection &selection);
 | 
			
		||||
 | 
			
		||||
		void onTagsListViewSelectionChanged(const QItemSelection &selection);
 | 
			
		||||
 | 
			
		||||
		void on_nameEdit_textChanged(const QString &arg1);
 | 
			
		||||
 | 
			
		||||
		void on_foodGroupsListWidget_itemSelectionChanged();
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		Ui::OpenRecipeDialog *ui;
 | 
			
		||||
		RecipeDatabase *recipeDB;
 | 
			
		||||
| 
						 | 
				
			
			@ -44,6 +50,7 @@ class OpenRecipeDialog : public QDialog
 | 
			
		|||
		void populateRecipesTable(vector<Recipe> recipes);
 | 
			
		||||
		void populateIngredientsList();
 | 
			
		||||
		void populateTagsList();
 | 
			
		||||
		void populateFoodGroupsList();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // OPENRECIPEDIALOG_H
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,7 @@
 | 
			
		|||
   <rect>
 | 
			
		||||
    <x>0</x>
 | 
			
		||||
    <y>0</y>
 | 
			
		||||
    <width>1000</width>
 | 
			
		||||
    <width>1064</width>
 | 
			
		||||
    <height>480</height>
 | 
			
		||||
   </rect>
 | 
			
		||||
  </property>
 | 
			
		||||
| 
						 | 
				
			
			@ -25,73 +25,109 @@
 | 
			
		|||
    <widget class="QWidget" name="searchPanel" native="true">
 | 
			
		||||
     <layout class="QVBoxLayout" name="verticalLayout">
 | 
			
		||||
      <item alignment="Qt::AlignLeft">
 | 
			
		||||
       <widget class="QWidget" name="tagsSearchpanel" native="true">
 | 
			
		||||
        <layout class="QVBoxLayout" name="verticalLayout_3">
 | 
			
		||||
         <item>
 | 
			
		||||
          <widget class="QLabel" name="tagLabel">
 | 
			
		||||
           <property name="text">
 | 
			
		||||
            <string>Tag</string>
 | 
			
		||||
           </property>
 | 
			
		||||
          </widget>
 | 
			
		||||
         </item>
 | 
			
		||||
         <item>
 | 
			
		||||
          <widget class="QListView" name="tagsListView">
 | 
			
		||||
           <property name="sizePolicy">
 | 
			
		||||
            <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
 | 
			
		||||
             <horstretch>0</horstretch>
 | 
			
		||||
             <verstretch>0</verstretch>
 | 
			
		||||
            </sizepolicy>
 | 
			
		||||
           </property>
 | 
			
		||||
           <property name="frameShape">
 | 
			
		||||
            <enum>QFrame::NoFrame</enum>
 | 
			
		||||
           </property>
 | 
			
		||||
           <property name="selectionMode">
 | 
			
		||||
            <enum>QAbstractItemView::ExtendedSelection</enum>
 | 
			
		||||
           </property>
 | 
			
		||||
           <property name="isWrapping" stdset="0">
 | 
			
		||||
            <bool>false</bool>
 | 
			
		||||
           </property>
 | 
			
		||||
           <property name="wordWrap">
 | 
			
		||||
            <bool>false</bool>
 | 
			
		||||
           </property>
 | 
			
		||||
          </widget>
 | 
			
		||||
         </item>
 | 
			
		||||
        </layout>
 | 
			
		||||
       </widget>
 | 
			
		||||
      </item>
 | 
			
		||||
      <item alignment="Qt::AlignLeft">
 | 
			
		||||
       <widget class="QWidget" name="ingredientSearchPanel" native="true">
 | 
			
		||||
        <layout class="QVBoxLayout" name="verticalLayout_4">
 | 
			
		||||
         <item>
 | 
			
		||||
          <widget class="QLabel" name="ingredientLabel">
 | 
			
		||||
           <property name="text">
 | 
			
		||||
            <string>Ingredient</string>
 | 
			
		||||
           </property>
 | 
			
		||||
          </widget>
 | 
			
		||||
         </item>
 | 
			
		||||
         <item>
 | 
			
		||||
          <widget class="QListView" name="ingredientsListView">
 | 
			
		||||
           <property name="sizePolicy">
 | 
			
		||||
            <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
 | 
			
		||||
             <horstretch>0</horstretch>
 | 
			
		||||
             <verstretch>0</verstretch>
 | 
			
		||||
            </sizepolicy>
 | 
			
		||||
           </property>
 | 
			
		||||
           <property name="frameShape">
 | 
			
		||||
            <enum>QFrame::NoFrame</enum>
 | 
			
		||||
           </property>
 | 
			
		||||
           <property name="selectionMode">
 | 
			
		||||
            <enum>QAbstractItemView::ExtendedSelection</enum>
 | 
			
		||||
           </property>
 | 
			
		||||
           <property name="isWrapping" stdset="0">
 | 
			
		||||
            <bool>false</bool>
 | 
			
		||||
           </property>
 | 
			
		||||
           <property name="wordWrap">
 | 
			
		||||
            <bool>true</bool>
 | 
			
		||||
           </property>
 | 
			
		||||
          </widget>
 | 
			
		||||
         </item>
 | 
			
		||||
        </layout>
 | 
			
		||||
       <widget class="QTabWidget" name="tabWidget">
 | 
			
		||||
        <property name="minimumSize">
 | 
			
		||||
         <size>
 | 
			
		||||
          <width>290</width>
 | 
			
		||||
          <height>0</height>
 | 
			
		||||
         </size>
 | 
			
		||||
        </property>
 | 
			
		||||
        <property name="tabPosition">
 | 
			
		||||
         <enum>QTabWidget::South</enum>
 | 
			
		||||
        </property>
 | 
			
		||||
        <property name="tabShape">
 | 
			
		||||
         <enum>QTabWidget::Rounded</enum>
 | 
			
		||||
        </property>
 | 
			
		||||
        <property name="currentIndex">
 | 
			
		||||
         <number>2</number>
 | 
			
		||||
        </property>
 | 
			
		||||
        <widget class="QWidget" name="tagsTab">
 | 
			
		||||
         <attribute name="title">
 | 
			
		||||
          <string>Tags</string>
 | 
			
		||||
         </attribute>
 | 
			
		||||
         <layout class="QVBoxLayout" name="verticalLayout_5">
 | 
			
		||||
          <item>
 | 
			
		||||
           <widget class="QListView" name="tagsListView">
 | 
			
		||||
            <property name="sizePolicy">
 | 
			
		||||
             <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
 | 
			
		||||
              <horstretch>0</horstretch>
 | 
			
		||||
              <verstretch>0</verstretch>
 | 
			
		||||
             </sizepolicy>
 | 
			
		||||
            </property>
 | 
			
		||||
            <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="isWrapping" stdset="0">
 | 
			
		||||
             <bool>false</bool>
 | 
			
		||||
            </property>
 | 
			
		||||
            <property name="wordWrap">
 | 
			
		||||
             <bool>true</bool>
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
         </layout>
 | 
			
		||||
        </widget>
 | 
			
		||||
        <widget class="QWidget" name="ingredientsTab">
 | 
			
		||||
         <attribute name="title">
 | 
			
		||||
          <string>Ingredients</string>
 | 
			
		||||
         </attribute>
 | 
			
		||||
         <layout class="QVBoxLayout" name="verticalLayout_6">
 | 
			
		||||
          <item>
 | 
			
		||||
           <widget class="QListView" name="ingredientsListView">
 | 
			
		||||
            <property name="sizePolicy">
 | 
			
		||||
             <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
 | 
			
		||||
              <horstretch>0</horstretch>
 | 
			
		||||
              <verstretch>0</verstretch>
 | 
			
		||||
             </sizepolicy>
 | 
			
		||||
            </property>
 | 
			
		||||
            <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="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>
 | 
			
		||||
      </item>
 | 
			
		||||
      <item>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -189,6 +189,39 @@ vector<Recipe> RecipeDatabase::retrieveRecipesWithIngredients(vector<Ingredient>
 | 
			
		|||
	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(){
 | 
			
		||||
	ResultTable t = this->executeSQL("SELECT DISTINCT foodGroup FROM ingredient ORDER BY foodGroup;");
 | 
			
		||||
	vector<string> foodGroups;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,6 +35,9 @@ class RecipeDatabase : public Database
 | 
			
		|||
		Recipe retrieveRandomRecipe();
 | 
			
		||||
		vector<Recipe> retrieveAllRecipes();
 | 
			
		||||
		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<RecipeIngredient> retrieveRecipeIngredients(int recipeId);
 | 
			
		||||
		vector<Ingredient> retrieveAllIngredients();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue