diff options
author | Michele Calgaro <[email protected]> | 2024-10-13 11:56:14 +0900 |
---|---|---|
committer | Michele Calgaro <[email protected]> | 2024-10-29 21:58:42 +0900 |
commit | 2879ff70be9271550477982a1a6371714db38562 (patch) | |
tree | c2054149dba923ab080fe7093432c7663a990111 /src/shoppingcalculator.cpp | |
parent | 3eb38d2556f676d1027746f20bf12a1dd74451ef (diff) | |
download | krecipes-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.cpp | 78 |
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 * +* [email protected] * +* * +* 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 ); + } + } +} |