You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
7.2 KiB
207 lines
7.2 KiB
/***************************************************************************
|
|
* Copyright (C) 2004 by 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 "refineshoppinglistdialog.h"
|
|
|
|
#include <ntqvariant.h>
|
|
#include <ntqpushbutton.h>
|
|
#include <ntqlabel.h>
|
|
#include <ntqheader.h>
|
|
#include <ntqlayout.h>
|
|
#include <ntqtooltip.h>
|
|
#include <ntqwhatsthis.h>
|
|
|
|
#include <tdelocale.h>
|
|
#include <kiconloader.h>
|
|
#include <tdeapplication.h>
|
|
#include <kcursor.h>
|
|
#include <tdeconfig.h>
|
|
|
|
#include "backends/recipedb.h"
|
|
#include "widgets/krelistview.h"
|
|
#include "widgets/ingredientlistview.h"
|
|
#include "shoppinglistviewdialog.h"
|
|
#include "shoppingcalculator.h"
|
|
#include "datablocks/mixednumber.h"
|
|
|
|
RefineShoppingListDialog::RefineShoppingListDialog( TQWidget* parent, RecipeDB *db, const ElementList &recipeList )
|
|
: KDialogBase( parent, "refinedialog", true, TQString::null,
|
|
KDialogBase::Ok, KDialogBase::Ok ),
|
|
database( db )
|
|
{
|
|
setButtonText( KDialogBase::Ok, i18n( "&Done" ) );
|
|
|
|
TQVBox *page = makeVBoxMainWidget();
|
|
|
|
helpLabel = new TQLabel( page, "helpLabel" );
|
|
helpLabel->setTextFormat( TQLabel::RichText );
|
|
|
|
TQWidget *layout2Widget = new TQWidget(page);
|
|
|
|
TQHBoxLayout *layout2 = new TQHBoxLayout( layout2Widget, 0, 6, "layout2" );
|
|
|
|
allIngListView = new KreListView( layout2Widget, TQString::null, true, 0 );
|
|
StdIngredientListView *list_view = new StdIngredientListView(allIngListView,database);
|
|
list_view->reload();
|
|
allIngListView->setListView(list_view);
|
|
layout2->addWidget( allIngListView );
|
|
|
|
layout1 = new TQVBoxLayout( 0, 0, 6, "layout1" );
|
|
|
|
TDEIconLoader il;
|
|
|
|
addButton = new TQPushButton( layout2Widget, "addButton" );
|
|
addButton->setIconSet( il.loadIconSet( "forward", TDEIcon::Small ) );
|
|
addButton->setFixedSize( TQSize( 32, 32 ) );
|
|
layout1->addWidget( addButton );
|
|
|
|
removeButton = new TQPushButton( layout2Widget, "removeButton" );
|
|
removeButton->setIconSet( il.loadIconSet( "back", TDEIcon::Small ) );
|
|
removeButton->setFixedSize( TQSize( 32, 32 ) );
|
|
layout1->addWidget( removeButton );
|
|
spacer1 = new TQSpacerItem( 51, 191, TQSizePolicy::Minimum, TQSizePolicy::Expanding );
|
|
layout1->addItem( spacer1 );
|
|
layout2->addLayout( layout1 );
|
|
|
|
ingListView = new KreListView( layout2Widget, TQString::null, true );
|
|
ingListView->listView() ->addColumn( i18n( "Ingredients in Shopping List" ) );
|
|
ingListView->listView() ->addColumn( i18n( "Amount" ) );
|
|
ingListView->listView() ->addColumn( i18n( "Unit" ) );
|
|
ingListView->listView() ->setItemsRenameable( true );
|
|
ingListView->listView() ->setRenameable( 0, false );
|
|
ingListView->listView() ->setRenameable( 1, true );
|
|
ingListView->listView() ->setRenameable( 2, true );
|
|
layout2->addWidget( ingListView );
|
|
|
|
languageChange();
|
|
|
|
clearWState( WState_Polished );
|
|
|
|
connect( addButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( addIngredient() ) );
|
|
connect( removeButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( removeIngredient() ) );
|
|
connect( ingListView->listView(), TQ_SIGNAL( itemRenamed( TQListViewItem*, const TQString &, int ) ), TQ_SLOT( itemRenamed( TQListViewItem*, const TQString &, int ) ) );
|
|
|
|
TDEApplication::setOverrideCursor( KCursor::waitCursor() );
|
|
calculateShopping( recipeList, &ingredientList, database );
|
|
TDEApplication::restoreOverrideCursor();
|
|
|
|
loadData();
|
|
}
|
|
|
|
RefineShoppingListDialog::~RefineShoppingListDialog()
|
|
{}
|
|
|
|
void RefineShoppingListDialog::languageChange()
|
|
{
|
|
helpLabel->setText( i18n( "On the right are the ingredients needed for the recipes you selected. You may now add additional ingredients, remove ingredients you do not need, or modify the amounts of existing ingredients." ) );
|
|
allIngListView->listView() ->header() ->setLabel( 0, i18n( "Ingredients" ) );
|
|
ingListView->listView() ->header() ->setLabel( 0, i18n( "Ingredients in Shopping List" ) );
|
|
ingListView->listView() ->header() ->setLabel( 1, i18n( "Amount" ) );
|
|
ingListView->listView() ->header() ->setLabel( 2, i18n( "Unit" ) );
|
|
}
|
|
|
|
void RefineShoppingListDialog::accept()
|
|
{
|
|
hide();
|
|
|
|
ShoppingListViewDialog view( this, ingredientList );
|
|
view.exec();
|
|
|
|
TQDialog::accept();
|
|
}
|
|
|
|
void RefineShoppingListDialog::loadData()
|
|
{
|
|
for ( IngredientList::iterator it = ingredientList.begin(); it != ingredientList.end(); ++it ) {
|
|
//from here on, the shopping list will work with the upper value of the range (if exists)
|
|
(*it).amount = (*it).amount+(*it).amount_offset;
|
|
(*it).amount_offset = 0;
|
|
|
|
TQString amount_str;
|
|
if ( ( *it ).amount > 0 ) {
|
|
TDEConfig * config = kapp->config();
|
|
config->setGroup( "Formatting" );
|
|
|
|
if ( config->readBoolEntry( "Fraction" ) )
|
|
amount_str = MixedNumber( ( *it ).amount ).toString();
|
|
else
|
|
amount_str = beautify( TDEGlobal::locale() ->formatNumber( ( *it ).amount, 5 ) );
|
|
}
|
|
|
|
TQListViewItem *new_item = new TQListViewItem( ingListView->listView(), ( *it ).name, amount_str, ( *it ).amount > 1 ? ( *it ).units.plural : ( *it ).units.name );
|
|
item_ing_map.insert( new_item, it );
|
|
}
|
|
}
|
|
|
|
void RefineShoppingListDialog::addIngredient()
|
|
{
|
|
TQListViewItem * item = allIngListView->listView() ->selectedItem();
|
|
if ( item ) {
|
|
TQListViewItem * new_item = new TQListViewItem( ingListView->listView(), item->text( 0 ) );
|
|
ingListView->listView() ->setSelected( new_item, true );
|
|
ingListView->listView() ->ensureItemVisible( new_item );
|
|
allIngListView->listView() ->setSelected( item, false );
|
|
|
|
item_ing_map.insert( new_item, ingredientList.append( Ingredient( item->text( 0 ), 0, Unit() ) ) );
|
|
}
|
|
}
|
|
|
|
void RefineShoppingListDialog::removeIngredient()
|
|
{
|
|
TQListViewItem * item = ingListView->listView() ->selectedItem();
|
|
if ( item ) {
|
|
for ( IngredientList::iterator it = ingredientList.begin(); it != ingredientList.end(); ++it ) {
|
|
if ( *item_ing_map.find( item ) == it ) {
|
|
ingredientList.remove( it );
|
|
item_ing_map.remove( item );
|
|
break;
|
|
}
|
|
}
|
|
delete item;
|
|
}
|
|
}
|
|
|
|
void RefineShoppingListDialog::itemRenamed( TQListViewItem* item, const TQString &new_text, int col )
|
|
{
|
|
if ( col == 1 ) {
|
|
IngredientList::iterator found_it = *item_ing_map.find( item );
|
|
|
|
bool ok;
|
|
MixedNumber amount = MixedNumber::fromString( new_text, &ok );
|
|
if ( ok ) {
|
|
( *found_it ).amount = amount.toDouble();
|
|
}
|
|
else { //revert back to the valid amount string
|
|
TQString amount_str;
|
|
if ( ( *found_it ).amount > 0 ) {
|
|
TDEConfig * config = kapp->config();
|
|
config->setGroup( "Formatting" );
|
|
|
|
if ( config->readBoolEntry( "Fraction" ) )
|
|
amount_str = MixedNumber( ( *found_it ).amount ).toString();
|
|
else
|
|
amount_str = beautify( TDEGlobal::locale() ->formatNumber( ( *found_it ).amount, 5 ) );
|
|
}
|
|
|
|
item->setText( 1, amount_str );
|
|
}
|
|
}
|
|
else if ( col == 2 ) {
|
|
IngredientList::iterator found_it = *item_ing_map.find( item );
|
|
|
|
if ( ( *found_it ).amount > 1 )
|
|
( *found_it ).units.plural = new_text;
|
|
else
|
|
( *found_it ).units.name = new_text;
|
|
}
|
|
}
|
|
|
|
#include "refineshoppinglistdialog.moc"
|