summaryrefslogtreecommitdiffstats
path: root/src/shoppingcalculator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shoppingcalculator.cpp')
-rw-r--r--src/shoppingcalculator.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/shoppingcalculator.cpp b/src/shoppingcalculator.cpp
new file mode 100644
index 0000000..e95624a
--- /dev/null
+++ b/src/shoppingcalculator.cpp
@@ -0,0 +1,78 @@
+/***************************************************************************
+* Copyright (C) 2003 by Unai Garro *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+***************************************************************************/
+#include "shoppingcalculator.h"
+
+#include <kdebug.h>
+
+#include "propertycalculator.h"
+#include "datablocks/elementlist.h"
+#include "datablocks/ingredientlist.h"
+
+#include "backends/recipedb.h"
+
+//NOTE: The code as-is uses the lower value if an ingredient range exists
+// However, the shopping list is calculated using the upper value
+// because the values are already adjusted prior to being passed
+// to these functions
+
+void calculateShopping( const ElementList &recipeList, IngredientList *ingredientList, RecipeDB *db )
+{
+ for ( ElementList::const_iterator recipe_it = recipeList.begin(); recipe_it != recipeList.end(); ++recipe_it ) {
+ Recipe rec;
+ db->loadRecipe( &rec, RecipeDB::Ingredients, ( *recipe_it ).id );
+ sum( ingredientList, &( rec.ingList ), db );
+ }
+}
+
+void sum( IngredientList *totalIngredientList, IngredientList *newIngredientList, RecipeDB *db )
+{
+ for ( IngredientList::const_iterator ing_it = newIngredientList->begin(); ing_it != newIngredientList->end(); ++ing_it ) {
+ IngredientList::iterator pos_it;
+
+ // Find out if ingredient exists in list already
+ int pos = totalIngredientList->find( ( *ing_it ).ingredientID );
+
+ if ( pos >= 0 ) // the ingredient is already listed
+ {
+ pos_it = totalIngredientList->at( pos );
+
+ // Variables to store the new total
+ Ingredient result;
+ bool converted;
+
+ // Do the conversion
+ // try to with this and next in the list until conversion rate is
+ // found or end of list is reached
+ IngredientList::iterator lastpos_it; // for 'backup'
+ do
+ {
+ lastpos_it = pos_it;
+
+ // Try to convert
+ converted = autoConvert( db, *ing_it, *pos_it, result );
+ }
+ while ( ( !converted ) && ( ( ( pos_it = totalIngredientList->find( ++pos_it, ( *ing_it ).ingredientID ) ) ) != totalIngredientList->end() ) );
+
+ // If the conversion was succesful, Set the New Values
+ if ( converted ) {
+ *lastpos_it = result;
+ }
+ else // Otherwise append this ingredient at the end of the list
+ {
+ // Insert ingredient ID in the list
+ totalIngredientList->append( *ing_it );
+ }
+ }
+ else // The ingredient is not in the list, just append
+ {
+ totalIngredientList->append( *ing_it );
+ }
+ }
+}