diff options
Diffstat (limited to 'src/dialogs/ingredientsdialog.cpp')
-rw-r--r-- | src/dialogs/ingredientsdialog.cpp | 702 |
1 files changed, 702 insertions, 0 deletions
diff --git a/src/dialogs/ingredientsdialog.cpp b/src/dialogs/ingredientsdialog.cpp new file mode 100644 index 0000000..358e01f --- /dev/null +++ b/src/dialogs/ingredientsdialog.cpp @@ -0,0 +1,702 @@ +/*************************************************************************** +* Copyright (C) 2003 by * +* Unai Garro (ugarro@users.sourceforge.net) * +* Cyril Bosselut (bosselut@b1project.com) * +* Jason Kivlighn (jkivlighn@gmail.com) * +* * +* 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 "ingredientsdialog.h" +#include "backends/recipedb.h" +#include "createelementdialog.h" +#include "datablocks/ingredientpropertylist.h" +#include "datablocks/mixednumber.h" +#include "datablocks/weight.h" +#include "unitsdialog.h" +#include "usdadatadialog.h" +#include "selectpropertydialog.h" +#include "selectunitdialog.h" +#include "dependanciesdialog.h" +#include "widgets/ingredientlistview.h" +#include "widgets/weightinput.h" +#include "dialogs/ingredientgroupsdialog.h" +#include "dialogs/createingredientweightdialog.h" + +#include <tdeapplication.h> +#include <kcursor.h> +#include <kdebug.h> +#include <tdelocale.h> +#include <tdemessagebox.h> +#include <tdeglobal.h> +#include <tdeconfig.h> + +#include <tqheader.h> +#include <tqmessagebox.h> +#include <tqtabwidget.h> + +class WeightListItem : public TQListViewItem +{ +public: + WeightListItem( TQListView *listview, TQListViewItem *item, const Weight &w ) : TQListViewItem(listview,item), m_weight(w){} + + void setWeight( const Weight &w ) { m_weight = w; } + Weight weight() const { return m_weight; } + + void setAmountUnit( double amount, const Unit &unit, const Element &prepMethod ) + { + m_weight.perAmount = amount; + m_weight.perAmountUnitID = unit.id; + m_weight.perAmountUnit = (m_weight.perAmount>1)?unit.plural:unit.name; + m_weight.prepMethodID = prepMethod.id; + m_weight.prepMethod = prepMethod.name; + } + + void setWeightUnit( double weight, const Unit &unit ) + { + m_weight.weight = weight; + m_weight.weightUnitID = unit.id; + m_weight.weightUnit = (m_weight.weight>1)?unit.plural:unit.name; + } + + virtual TQString text( int c ) const + { + if ( c == 0 ) + return TQString::number(m_weight.weight)+" "+m_weight.weightUnit; + else if ( c == 1 ) + return TQString::number(m_weight.perAmount)+" " + +m_weight.perAmountUnit + +((m_weight.prepMethodID!=-1)?", "+m_weight.prepMethod:TQString::null); + else + return TQString::null; + } + +private: + Weight m_weight; +}; + +IngredientsDialog::IngredientsDialog( TQWidget* parent, RecipeDB *db ) : TQWidget( parent ) +{ + + // Store pointer to database + database = db; + + // Initialize internal variables + propertiesList = new IngredientPropertyList; + perUnitListBack = new ElementList; + + // Design dialog + + TQHBoxLayout* page_layout = new TQHBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() ); + + TQTabWidget *tabWidget = new TQTabWidget( this ); + + TQWidget *ingredientTab = new TQWidget( tabWidget ); + + layout = new TQGridLayout( ingredientTab, 1, 1, 0, 0 ); + TQSpacerItem* spacer_left = new TQSpacerItem( 10, 10, TQSizePolicy::Fixed, TQSizePolicy::Minimum ); + layout->addItem( spacer_left, 1, 0 ); + TQSpacerItem* spacer_top = new TQSpacerItem( 10, 10, TQSizePolicy::Minimum, TQSizePolicy::Fixed ); + layout->addItem( spacer_top, 0, 1 ); + + ingredientListView = new KreListView ( ingredientTab, i18n( "Ingredient list" ), true, 0 ); + StdIngredientListView *list_view = new StdIngredientListView( ingredientListView, database, true ); + ingredientListView->setListView( list_view ); + layout->addMultiCellWidget ( ingredientListView, 1, 5, 1, 1 ); + ingredientListView->setSizePolicy( TQSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding ) ); + + TQSpacerItem* spacer_rightIngredients = new TQSpacerItem( 10, 10, TQSizePolicy::Fixed, TQSizePolicy::Minimum ); + layout->addItem( spacer_rightIngredients, 1, 2 ); + + + addIngredientButton = new TQPushButton( ingredientTab ); + addIngredientButton->setText( "+" ); + layout->addWidget( addIngredientButton, 1, 3 ); + addIngredientButton->setMinimumSize( TQSize( 30, 30 ) ); + addIngredientButton->setMaximumSize( TQSize( 30, 30 ) ); + addIngredientButton->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) ); + addIngredientButton->setFlat( true ); + + removeIngredientButton = new TQPushButton( ingredientTab ); + removeIngredientButton->setText( "-" ); + layout->addWidget( removeIngredientButton, 3, 3 ); + removeIngredientButton->setMinimumSize( TQSize( 30, 30 ) ); + removeIngredientButton->setMaximumSize( TQSize( 30, 30 ) ); + removeIngredientButton->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) ); + removeIngredientButton->setFlat( true ); + + TQSpacerItem* spacer_Ing_Buttons = new TQSpacerItem( 10, 10, TQSizePolicy::Minimum, TQSizePolicy::Fixed ); + layout->addItem( spacer_Ing_Buttons, 2, 3 ); + + + TQSpacerItem* spacer_Ing_Units = new TQSpacerItem( 30, 5, TQSizePolicy::Fixed, TQSizePolicy::Minimum ); + layout->addItem( spacer_Ing_Units, 1, 4 ); + + + TDEConfig *config = TDEGlobal::config(); + config->setGroup( "Advanced" ); + bool show_id = config->readBoolEntry( "ShowID", false ); + + TQScrollView *scrollView1 = new TQScrollView( ingredientTab, "scrollView1" ); + scrollView1->enableClipper(true); + TQWidget *rightWidget = new TQWidget(scrollView1); + TQGridLayout *rightLayout = new TQGridLayout( rightWidget, 1, 1, 0, 0 ); + + unitsListView = new KreListView ( rightWidget, i18n( "Unit list" ) ); + unitsListView->listView() ->addColumn( i18n( "Units" ) ); + unitsListView->listView() ->addColumn( i18n( "Id" ), show_id ? -1 : 0 ); + unitsListView->listView() ->setSorting( 0 ); + unitsListView->listView() ->setAllColumnsShowFocus( true ); + rightLayout->addMultiCellWidget ( unitsListView, 1, 4, 0, 0 ); + unitsListView->listView() ->setMinimumWidth( 150 ); + unitsListView->setSizePolicy( TQSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding ) ); + + TQSpacerItem* spacer_rightUnits = new TQSpacerItem( 5, 5, TQSizePolicy::Fixed, TQSizePolicy::Minimum ); + rightLayout->addItem( spacer_rightUnits, 1, 1 ); + + addUnitButton = new TQPushButton( rightWidget ); + addUnitButton->setText( "+" ); + rightLayout->addWidget( addUnitButton, 1, 2 ); + addUnitButton->resize( TQSize( 30, 30 ) ); + addUnitButton->setMinimumSize( TQSize( 30, 30 ) ); + addUnitButton->setMaximumSize( TQSize( 30, 30 ) ); + addUnitButton->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) ); + addUnitButton->setFlat( true ); + + removeUnitButton = new TQPushButton( rightWidget ); + removeUnitButton->setText( "-" ); + rightLayout->addWidget( removeUnitButton, 3, 2 ); + removeUnitButton->resize( TQSize( 30, 30 ) ); + removeUnitButton->setMinimumSize( TQSize( 30, 30 ) ); + removeUnitButton->setMaximumSize( TQSize( 30, 30 ) ); + removeUnitButton->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) ); + removeUnitButton->setFlat( true ); + TQSpacerItem* spacer_Units_Properties = new TQSpacerItem( 10, 10, TQSizePolicy::Minimum, TQSizePolicy::Fixed ); + rightLayout->addItem( spacer_Units_Properties, 2, 2 ); + + + propertiesListView = new KreListView ( rightWidget, i18n( "Ingredient Properties" ) ); + rightLayout->addMultiCellWidget ( propertiesListView, 6, 9, 0, 0 ); + + propertiesListView->listView() ->addColumn( i18n( "Property" ) ); + propertiesListView->listView() ->addColumn( i18n( "Amount" ) ); + propertiesListView->listView() ->addColumn( i18n( "Units" ) ); + propertiesListView->listView() ->addColumn( i18n( "Id" ), show_id ? -1 : 0 ); + propertiesListView->listView() ->setAllColumnsShowFocus( true ); + propertiesListView->listView() ->setSizePolicy( TQSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding ) ); + propertiesListView->listView() ->setSorting( -1 ); // Disable sorting. For the moment, the order is important to identify the per_units ID corresponding to this row. So the user shouldn't change this order. + + addPropertyButton = new TQPushButton( rightWidget ); + addPropertyButton->setText( "+" ); + rightLayout->addWidget( addPropertyButton, 6, 2 ); + addPropertyButton->resize( TQSize( 30, 30 ) ); + addPropertyButton->setMinimumSize( TQSize( 30, 30 ) ); + addPropertyButton->setMaximumSize( TQSize( 30, 30 ) ); + addPropertyButton->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) ); + addPropertyButton->setFlat( true ); + + removePropertyButton = new TQPushButton( rightWidget ); + removePropertyButton->setText( "-" ); + rightLayout->addWidget( removePropertyButton, 8, 2 ); + removePropertyButton->resize( TQSize( 30, 30 ) ); + removePropertyButton->setMinimumSize( TQSize( 30, 30 ) ); + removePropertyButton->setMaximumSize( TQSize( 30, 30 ) ); + removePropertyButton->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) ); + removePropertyButton->setFlat( true ); + + TQSpacerItem* spacer_Prop_Buttons = new TQSpacerItem( 9, 10, TQSizePolicy::Minimum, TQSizePolicy::Fixed ); + rightLayout->addItem( spacer_Prop_Buttons, 7, 2 ); + + weightsListView = new KreListView ( rightWidget, i18n( "Ingredient Weights" ) ); + weightsListView->listView() ->addColumn( i18n( "Weight" ) ); + weightsListView->listView() ->addColumn( i18n( "Per Amount" ) ); + weightsListView->listView() ->setAllColumnsShowFocus( true ); + rightLayout->addMultiCellWidget ( weightsListView, 10, 14, 0, 0 ); + weightsListView->listView() ->setMinimumWidth( 150 ); + weightsListView->setSizePolicy( TQSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding ) ); + + //TQSpacerItem* spacer_rightWeights = new TQSpacerItem( 5, 5, TQSizePolicy::Fixed, TQSizePolicy::Minimum ); + //layout->addItem( spacer_rightWeights, 1, 6 ); + + addWeightButton = new TQPushButton( rightWidget ); + addWeightButton->setText( "+" ); + rightLayout->addWidget( addWeightButton, 10, 2 ); + addWeightButton->resize( TQSize( 30, 30 ) ); + addWeightButton->setMinimumSize( TQSize( 30, 30 ) ); + addWeightButton->setMaximumSize( TQSize( 30, 30 ) ); + addWeightButton->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) ); + addWeightButton->setFlat( true ); + + removeWeightButton = new TQPushButton( rightWidget ); + removeWeightButton->setText( "-" ); + rightLayout->addWidget( removeWeightButton, 12, 2 ); + removeWeightButton->resize( TQSize( 30, 30 ) ); + removeWeightButton->setMinimumSize( TQSize( 30, 30 ) ); + removeWeightButton->setMaximumSize( TQSize( 30, 30 ) ); + removeWeightButton->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) ); + removeWeightButton->setFlat( true ); + + TQSpacerItem* spacer_Weight_Properties = new TQSpacerItem( 10, 10, TQSizePolicy::Minimum, TQSizePolicy::Fixed ); + rightLayout->addItem( spacer_Weight_Properties, 11, 2 ); + + TQSpacerItem* spacerBottom = new TQSpacerItem( 10, 10, TQSizePolicy::Fixed, TQSizePolicy::Expanding ); + rightLayout->addItem( spacerBottom, 13, 2 ); + + scrollView1->setResizePolicy( TQScrollView::AutoOneFit ); + layout->addMultiCellWidget(scrollView1,1,4,5,5); + + TQPushButton *loadUsdaButton = new TQPushButton( ingredientTab ); + loadUsdaButton->setText( i18n( "Load USDA data" ) ); + loadUsdaButton->setFlat( true ); + layout->addWidget(loadUsdaButton,5,5); + + scrollView1->addChild(rightWidget); + scrollView1->setSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::Ignored ); + + + inputBox = new KDoubleNumInput( propertiesListView->listView() ->viewport() ); + propertiesListView->listView() ->addChild( inputBox ); + inputBox->hide(); + + tabWidget->insertTab( ingredientTab, i18n( "Ingredients" ) ); + + groupsDialog = new IngredientGroupsDialog(database,tabWidget,"groupsDialog"); + tabWidget->insertTab( groupsDialog, i18n( "Headers" ) ); + + page_layout->addWidget( tabWidget ); + + // Initialize + unitList = new UnitList; + + // Signals & Slots + connect( ingredientListView->listView(), TQ_SIGNAL( selectionChanged() ), this, TQ_SLOT( updateLists() ) ); + connect( addIngredientButton, TQ_SIGNAL( clicked() ), list_view, TQ_SLOT( createNew() ) ); + connect( addUnitButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( addUnitToIngredient() ) ); + connect( removeUnitButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( removeUnitFromIngredient() ) ); + connect( addWeightButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( addWeight() ) ); + connect( removeWeightButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( removeWeight() ) ); + connect( removeIngredientButton, TQ_SIGNAL( clicked() ), list_view, TQ_SLOT( remove + () ) ); + connect( addPropertyButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( addPropertyToIngredient() ) ); + connect( removePropertyButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( removePropertyFromIngredient() ) ); + connect( propertiesListView->listView(), TQ_SIGNAL( executed( TQListViewItem* ) ), this, TQ_SLOT( insertPropertyEditBox( TQListViewItem* ) ) ); + connect( propertiesListView->listView(), TQ_SIGNAL( selectionChanged() ), inputBox, TQ_SLOT( hide() ) ); + connect( inputBox, TQ_SIGNAL( valueChanged( double ) ), this, TQ_SLOT( setPropertyAmount( double ) ) ); + + connect( weightsListView->listView(), TQ_SIGNAL( doubleClicked( TQListViewItem*, const TQPoint &, int ) ), TQ_SLOT( itemRenamed( TQListViewItem*, const TQPoint &, int ) ) ); + + connect( loadUsdaButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( openUSDADialog() ) ); +} + + +IngredientsDialog::~IngredientsDialog() +{ + delete unitList; + delete perUnitListBack; + delete propertiesList; +} + +void IngredientsDialog::reloadIngredientList( ReloadFlags flag ) +{ + ( ( StdIngredientListView* ) ingredientListView->listView() ) ->reload(flag); + + // Reload Unit List + updateLists(); + +} + +void IngredientsDialog::reloadUnitList() +{ + + int ingredientID = -1; + // Find selected ingredient + TQListViewItem *it; + it = ingredientListView->listView() ->selectedItem(); + + if ( it ) { // Check if an ingredient is selected first + ingredientID = it->text( 1 ).toInt(); + } + + + unitList->clear(); + unitsListView->listView() ->clear(); + + if ( ingredientID >= 0 ) { + database->loadPossibleUnits( ingredientID, unitList ); + + //Populate this data into the TDEListView + + for ( UnitList::const_iterator unit_it = unitList->begin(); unit_it != unitList->end(); ++unit_it ) { + if ( !( *unit_it ).name.isEmpty() ) { + ( void ) new TQListViewItem( unitsListView->listView(), ( *unit_it ).name, TQString::number( ( *unit_it ).id ) ); + } + } + + // Select the first unit + unitsListView->listView() ->setSelected( unitsListView->listView() ->firstChild(), true ); + + } +} + +void IngredientsDialog::addWeight() +{ + TQListViewItem *it = ingredientListView->listView()->selectedItem(); + if ( it ) { + CreateIngredientWeightDialog weightDialog( this, database ); + if ( weightDialog.exec() == TQDialog::Accepted ) { + Weight w = weightDialog.weight(); + w.ingredientID = it->text( 1 ).toInt(); + database->addIngredientWeight( w ); + + TQListViewItem * lastElement = weightsListView->listView()->lastItem(); + + WeightListItem *weight_it = new WeightListItem( weightsListView->listView(), lastElement, w ); + weight_it->setAmountUnit( w.perAmount, database->unitName(w.perAmountUnitID), + Element(w.prepMethod,w.prepMethodID) + ); + weight_it->setWeightUnit( w.weight, database->unitName(w.weightUnitID) ); + } + } +} + +void IngredientsDialog::removeWeight() +{ + TQListViewItem *it = weightsListView->listView() ->selectedItem(); + if ( it ) { + switch ( KMessageBox::warningContinueCancel(this, i18n("Recipes may require this information for nutrient analysis. Are you sure you want to delete this entry?"), TQString::null, KStdGuiItem::cont(), "DeleteIngredientWeight") ) { + case KMessageBox::Continue: + database->removeIngredientWeight( ((WeightListItem*)it)->weight().id ); + delete it; + break; + default: break; + } + } +} + +void IngredientsDialog::itemRenamed( TQListViewItem* item, const TQPoint &, int col ) +{ + WeightListItem *weight_it = (WeightListItem*)item; + Weight w = weight_it->weight(); + + if ( col == 0 ) { + KDialogBase amountEditDialog(this,"WeightAmountEdit", + false, i18n("Enter amount"), KDialogBase::Cancel | KDialogBase::Ok, KDialogBase::Ok); + + TQGroupBox *box = new TQGroupBox( 1, Horizontal, i18n("Amount"), &amountEditDialog ); + AmountUnitInput *amountEdit = new AmountUnitInput( box, database, Unit::Mass, MixedNumber::DecimalFormat ); + + WeightListItem *it = (WeightListItem*)item; + Weight w = it->weight(); + + amountEdit->setAmount( w.weight ); + amountEdit->setUnit( Unit(w.weightUnit,w.weightUnit,w.weightUnitID) ); + + amountEditDialog.setMainWidget(box); + + if ( amountEditDialog.exec() == TQDialog::Accepted ) { + MixedNumber amount = amountEdit->amount(); + Unit unit = amountEdit->unit(); + + it->setWeightUnit( amount.toDouble(), unit ); + database->addIngredientWeight( it->weight() ); + } + } + else if ( col == 1 ) { + KDialogBase amountEditDialog(this,"PerAmountEdit", + false, i18n("Enter amount"), KDialogBase::Cancel | KDialogBase::Ok, KDialogBase::Ok); + + TQGroupBox *box = new TQGroupBox( 1, Horizontal, i18n("Amount"), &amountEditDialog ); + WeightInput *amountEdit = new WeightInput( box, database, Unit::All, MixedNumber::DecimalFormat ); + + WeightListItem *it = (WeightListItem*)item; + Weight w = it->weight(); + + amountEdit->setAmount( w.perAmount ); + amountEdit->setUnit( Unit(w.perAmountUnit,w.perAmountUnit,w.perAmountUnitID) ); + amountEdit->setPrepMethod( Element(w.prepMethod,w.prepMethodID) ); + + amountEditDialog.setMainWidget(box); + + if ( amountEditDialog.exec() == TQDialog::Accepted ) { + MixedNumber amount = amountEdit->amount(); + Unit unit = amountEdit->unit(); + + it->setAmountUnit( amount.toDouble(), unit, amountEdit->prepMethod() ); + database->addIngredientWeight( it->weight() ); + } + } +} + +void IngredientsDialog::addUnitToIngredient( void ) +{ + + // Find selected ingredient item + TQListViewItem * it; + int ingredientID = -1; + if ( ( it = ingredientListView->listView() ->selectedItem() ) ) { + ingredientID = it->text( 1 ).toInt(); + } + if ( ingredientID >= 0 ) // an ingredient was selected previously + { + UnitList allUnits; + database->loadUnits( &allUnits ); + + SelectUnitDialog unitsDialog( this, allUnits, SelectUnitDialog::HideEmptyUnit ); + + if ( unitsDialog.exec() == TQDialog::Accepted ) + { + int unitID = unitsDialog.unitID(); + + if ( !( database->ingredientContainsUnit( ingredientID, unitID ) ) ) + database->addUnitToIngredient( ingredientID, unitID ); // Add chosen unit to ingredient in database + else { + TQMessageBox::information( this, i18n( "Unit Exists" ), i18n( "The ingredient contains already the unit that you have chosen." ) ); + } + reloadUnitList(); // Reload the list from database + } + } +} + +void IngredientsDialog::removeUnitFromIngredient( void ) +{ + + // Find selected ingredient/unit item combination + TQListViewItem * it; + int ingredientID = -1, unitID = -1; + if ( ( it = ingredientListView->listView() ->selectedItem() ) ) + ingredientID = it->text( 1 ).toInt(); + if ( ( it = unitsListView->listView() ->selectedItem() ) ) + unitID = it->text( 1 ).toInt(); + + if ( ( ingredientID >= 0 ) && ( unitID >= 0 ) ) // an ingredient/unit combination was selected previously + { + ElementList dependingRecipes, dependingPropertiesInfo; + + database->findIngredientUnitDependancies( ingredientID, unitID, &dependingRecipes, &dependingPropertiesInfo ); + + TQValueList<ListInfo> lists; + if ( !dependingRecipes.isEmpty() ) { + ListInfo info; + info.list = dependingRecipes; + info.name = i18n("Recipes"); + lists << info; + } + if ( !dependingPropertiesInfo.isEmpty() ) { + ListInfo info; + info.list = dependingPropertiesInfo; + info.name = i18n("Properties"); + lists << info; + } + + if ( lists.isEmpty() ) + database->removeUnitFromIngredient( ingredientID, unitID ); + else + { // must warn! + DependanciesDialog warnDialog( this, lists ); + if ( !dependingRecipes.isEmpty() ) + warnDialog.setCustomWarning( i18n("You are about to permanantly delete recipes from your database.") ); + if ( warnDialog.exec() == TQDialog::Accepted ) + database->removeUnitFromIngredient( ingredientID, unitID ); + } + reloadUnitList(); // Reload the list from database + reloadPropertyList(); // Properties could have been removed if a unit is removed, so we need to reload. + } +} + +void IngredientsDialog:: reloadPropertyList( void ) +{ + propertiesList->clear(); + propertiesListView->listView() ->clear(); + perUnitListBack->clear(); + + inputBox->hide(); + + + //If none is selected, select first item + TQListViewItem *it; + it = ingredientListView->listView() ->selectedItem(); + + //Populate this data into the TDEListView + if ( it ) { // make sure that the ingredient list is not empty + + database->loadProperties( propertiesList, it->text( 1 ).toInt() ); // load the list for this ingredient + for ( IngredientPropertyList::const_iterator prop_it = propertiesList->begin(); prop_it != propertiesList->end(); ++prop_it ) { + TQListViewItem * lastElement = propertiesListView->listView() ->lastItem(); + //Insert property after the last one (it's important to keep the order in the case of the properties to be able to identify the per_units ID later on). + ( void ) new TQListViewItem( propertiesListView->listView(), lastElement, (*prop_it).name, TQString::number( (*prop_it).amount ), (*prop_it).units + TQString( "/" ) + (*prop_it).perUnit.name, TQString::number( (*prop_it).id ) ); + // Store the perUnits with the ID for using later + Element perUnitEl; + perUnitEl.id = (*prop_it).perUnit.id; + perUnitEl.name = (*prop_it).perUnit.name; + perUnitListBack->append( perUnitEl ); + + } + } +} + +void IngredientsDialog::reloadWeightList( void ) +{ + weightsListView->listView() ->clear(); + + //If none is selected, select first item + TQListViewItem *it = ingredientListView->listView() ->selectedItem(); + + //Populate this data into the TDEListView + if ( it ) { // make sure that the ingredient list is not empty + WeightList list = database->ingredientWeightUnits( it->text( 1 ).toInt() ); // load the list for this ingredient + for ( WeightList::const_iterator weight_it = list.begin(); weight_it != list.end(); ++weight_it ) { + TQListViewItem * lastElement = weightsListView->listView() ->lastItem(); + + Weight w = *weight_it; + WeightListItem *weight_it1 = new WeightListItem( weightsListView->listView(), lastElement, w ); + weight_it1->setAmountUnit( w.perAmount, + database->unitName(w.perAmountUnitID), + Element((w.prepMethodID==-1)?TQString::null:database->prepMethodName(w.prepMethodID),w.prepMethodID) + ); + weight_it1->setWeightUnit( w.weight, database->unitName(w.weightUnitID) ); + } + } +} + +void IngredientsDialog:: updateLists( void ) +{ + reloadUnitList(); + reloadPropertyList(); + reloadWeightList(); +} + +void IngredientsDialog::addPropertyToIngredient( void ) +{ + + // Find selected ingredient item + TQListViewItem * it; + int ingredientID = -1; + if ( ( it = ingredientListView->listView() ->selectedItem() ) ) { + ingredientID = it->text( 1 ).toInt(); + } + if ( ingredientID >= 0 ) // an ingredient was selected previously + { + IngredientPropertyList allProperties; + database->loadProperties( &allProperties ); + UnitList unitList; + database->loadPossibleUnits( ingredientID, &unitList ); + SelectPropertyDialog propertyDialog( this, &allProperties, &unitList, SelectPropertyDialog::HideEmptyUnit ); + + if ( propertyDialog.exec() == TQDialog::Accepted ) + { + + int propertyID = propertyDialog.propertyID(); + int perUnitsID = propertyDialog.perUnitsID(); + if ( !( database->ingredientContainsProperty( ingredientID, propertyID, perUnitsID ) ) ) { + if ( ( propertyID >= 0 ) && ( perUnitsID >= 0 ) ) // check if the property is not -1 ... (not selected) + database->addPropertyToIngredient( ingredientID, propertyID, 0, perUnitsID ); // Add result chosen property to ingredient in database, with amount 0 by default + } + else { + TQMessageBox::information( this, i18n( "Property Exists" ), i18n( "The property you tried to add already exists in the ingredient with the same per units." ) ); + } + reloadPropertyList(); // Reload the list from database + } + } +} + +void IngredientsDialog::removePropertyFromIngredient( void ) +{ + + // Find selected ingredient/property item combination + TQListViewItem * it; + int ingredientID = -1, propertyID = -1; + int perUnitsID = -1; + if ( ( it = ingredientListView->listView() ->selectedItem() ) ) + ingredientID = it->text( 1 ).toInt(); + if ( ( it = propertiesListView->listView() ->selectedItem() ) ) + propertyID = it->text( 3 ).toInt(); + if ( propertyID >= 0 ) + perUnitsID = perUnitListBack->getElement( findPropertyNo( it ) ).id ; + + if ( ( ingredientID >= 0 ) && ( propertyID >= 0 ) && ( perUnitsID >= 0 ) ) // an ingredient/property combination was selected previously + { + ElementList results; + database->removePropertyFromIngredient( ingredientID, propertyID, perUnitsID ); + + reloadPropertyList(); // Reload the list from database + + } +} + +void IngredientsDialog::insertPropertyEditBox( TQListViewItem* it ) +{ + TQRect r = propertiesListView->listView() ->header() ->sectionRect( 1 ); + + r.moveBy( 0, propertiesListView->listView() ->itemRect( it ).y() ); //Move down to the item, note that its height is same as header's right now. + + r.setHeight( it->height() ); // Set the item's height + + inputBox->setGeometry( r ); + + inputBox->setValue( it->text( 1 ).toDouble() ); + inputBox->show(); +} + +void IngredientsDialog::setPropertyAmount( double amount ) +{ + TQListViewItem *ing_it = ingredientListView->listView() ->selectedItem(); // Find selected ingredient + TQListViewItem *prop_it = propertiesListView->listView() ->selectedItem(); + + if ( ing_it && prop_it ) // Appart from property, Check if an ingredient is selected first, just in case + { + prop_it->setText( 1, TQString::number( amount ) ); + int propertyID = prop_it->text( 3 ).toInt(); + int ingredientID = ing_it->text( 1 ).toInt(); + int per_units = perUnitListBack->getElement( findPropertyNo( prop_it ) ).id ; + database->changePropertyAmountToIngredient( ingredientID, propertyID, amount, per_units ); + } +} + +int IngredientsDialog::findPropertyNo( TQListViewItem * /*it*/ ) +{ + bool found = false; + int i = 0; + TQListViewItem* item = propertiesListView->listView() ->firstChild(); + while ( i < propertiesListView->listView() ->childCount() && !found ) { + if ( item == propertiesListView->listView() ->currentItem() ) + found = true; + else { + item = item->nextSibling(); + ++i; + } + } + if ( found ) { + return ( i ); + } + else { + return ( -1 ); + } +} + +void IngredientsDialog::reload( ReloadFlags flag ) +{ + reloadIngredientList( flag ); + groupsDialog->reload( flag ); +} + +void IngredientsDialog::openUSDADialog( void ) +{ + TQListViewItem * ing_it = ingredientListView->listView() ->selectedItem(); // Find selected ingredient + if ( ing_it ) { + TDEApplication::setOverrideCursor( KCursor::waitCursor() ); + USDADataDialog usda_dialog( Element( ing_it->text( 0 ), ing_it->text( 1 ).toInt() ), database, this ); + TDEApplication::restoreOverrideCursor(); + + if ( usda_dialog.exec() == TQDialog::Accepted ) { + reloadPropertyList(); //update property list upon success + reloadWeightList(); + } + } + else + TQMessageBox::information( this, TQString::null, i18n( "No ingredient selected." ) ); +} + +#include "ingredientsdialog.moc" |