summaryrefslogtreecommitdiffstats
path: root/src/shoppingcalculator.cpp
diff options
context:
space:
mode:
authorMichele Calgaro <[email protected]>2024-10-13 11:56:14 +0900
committerMichele Calgaro <[email protected]>2024-10-29 21:58:42 +0900
commit2879ff70be9271550477982a1a6371714db38562 (patch)
treec2054149dba923ab080fe7093432c7663a990111 /src/shoppingcalculator.cpp
parent3eb38d2556f676d1027746f20bf12a1dd74451ef (diff)
downloadkrecipes-2879ff70be9271550477982a1a6371714db38562.tar.gz
krecipes-2879ff70be9271550477982a1a6371714db38562.zip
Rearrange folders structure to remove unnecessary 'krecipes' second level subfolder
Signed-off-by: Michele Calgaro <[email protected]> (cherry picked from commit 0c8ed6c9a4000af8f48581a81c4b5c2f5b9fd502)
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 );
+ }
+ }
+}