summaryrefslogtreecommitdiffstats
path: root/src/dialogs/shoppinglistdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/dialogs/shoppinglistdialog.cpp')
-rw-r--r--src/dialogs/shoppinglistdialog.cpp267
1 files changed, 267 insertions, 0 deletions
diff --git a/src/dialogs/shoppinglistdialog.cpp b/src/dialogs/shoppinglistdialog.cpp
new file mode 100644
index 0000000..a0ac00f
--- /dev/null
+++ b/src/dialogs/shoppinglistdialog.cpp
@@ -0,0 +1,267 @@
+/***************************************************************************
+* Copyright (C) 2003 by *
+* Unai Garro ([email protected]) *
+* Cyril Bosselut ([email protected]) *
+* Jason Kivlighn ([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 "shoppinglistdialog.h"
+
+#include <tdelocale.h>
+#include <tdeconfig.h>
+#include <kcursor.h>
+#include <kdialog.h>
+#include <tdeglobal.h>
+#include <tdeapplication.h>
+
+#include "backends/recipedb.h"
+#include "refineshoppinglistdialog.h"
+#include "datablocks/recipelist.h"
+#include "widgets/recipelistview.h"
+#include "recipefilter.h"
+#include "recipeactionshandler.h"
+
+/** A simple listview to accept dropping a RecipeItemDrag */
+class ShoppingListView : public TDEListView
+{
+public:
+ ShoppingListView( TQWidget *parent ) : TDEListView( parent )
+ {}
+
+protected:
+ bool acceptDrag( TQDropEvent *event ) const
+ {
+ return RecipeItemDrag::canDecode( event );
+ }
+
+ TQDragObject *dragObject()
+ {
+ RecipeListItem * item = dynamic_cast<RecipeListItem*>( selectedItem() );
+ if ( item != 0 ) {
+
+ RecipeItemDrag * obj = new RecipeItemDrag( item, this, "Recipe drag item" );
+ /*const TQPixmap *pm = item->pixmap(0);
+ if( pm )
+ obj->setPixmap( *pm );*/
+ return obj;
+ }
+ return 0;
+ }
+};
+
+
+ShoppingListDialog::ShoppingListDialog( TQWidget *parent, RecipeDB *db ) : TQWidget( parent )
+{
+ // Store pointer to database
+ database = db;
+
+ // Design dialog
+ layout = new TQGridLayout( this, 2, 2, KDialog::marginHint(), KDialog::spacingHint() );
+
+ recipeListView = new KreListView ( this, i18n( "Full recipe list" ), true, 1 );
+ layout->addWidget( recipeListView, 0, 0 );
+ listview = new RecipeListView( recipeListView, database );
+ listview->setSizePolicy( TQSizePolicy::Ignored, TQSizePolicy::MinimumExpanding );
+ listview->setDragEnabled( true );
+ listview->setAcceptDrops( true );
+ listview->setDropVisualizer( false );
+ connect( recipeListView, TQ_SIGNAL( textChanged(const TQString&) ), TQ_SLOT( ensurePopulated() ) );
+ connect( listview, TQ_SIGNAL( dropped( TDEListView*, TQDropEvent*, TQListViewItem* ) ),
+ this, TQ_SLOT( slotDropped( TDEListView*, TQDropEvent*, TQListViewItem* ) ) );
+ recipeListView->setListView( listview );
+ recipeListView->setCustomFilter( new RecipeFilter( recipeListView->listView() ), TQ_SLOT( filter( const TQString & ) ) );
+ recipeListView->setSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::MinimumExpanding );
+
+ TQBoxLayout* vboxl = new TQVBoxLayout( KDialog::spacingHint() );
+ TDEIconLoader il;
+ addRecipeButton = new TQPushButton( this );
+ addRecipeButton->setIconSet( il.loadIconSet( "forward", TDEIcon::Small ) );
+ addRecipeButton->setFixedSize( TQSize( 32, 32 ) );
+ addRecipeButton->setFlat( true );
+ vboxl->addWidget( addRecipeButton );
+
+ removeRecipeButton = new TQPushButton( this );
+ removeRecipeButton->setIconSet( il.loadIconSet( "back", TDEIcon::Small ) );
+ removeRecipeButton->setFixedSize( TQSize( 32, 32 ) );
+ removeRecipeButton->setFlat( true );
+ vboxl->addWidget( removeRecipeButton );
+ vboxl->addStretch();
+
+ layout->addItem( vboxl, 0, 1 );
+
+ shopRecipeListView = new KreListView ( this, i18n("Shopping List") );
+ ShoppingListView *slistview = new ShoppingListView( shopRecipeListView );
+ slistview->setSizePolicy( TQSizePolicy::Ignored, TQSizePolicy::MinimumExpanding );
+ slistview->setDragEnabled( true );
+ slistview->setAcceptDrops( true );
+ slistview->setDropVisualizer( false );
+ connect( slistview, TQ_SIGNAL( dropped( TDEListView*, TQDropEvent*, TQListViewItem* ) ),
+ this, TQ_SLOT( slotDropped( TDEListView*, TQDropEvent*, TQListViewItem* ) ) );
+ shopRecipeListView->setListView( slistview );
+ layout->addWidget( shopRecipeListView, 0, 2 );
+
+ shopRecipeListView->listView() ->addColumn( i18n( "Recipe Title" ) );
+
+ TDEConfig *config = TDEGlobal::config();
+ config->setGroup( "Advanced" );
+ bool show_id = config->readBoolEntry( "ShowID", false );
+ shopRecipeListView->listView() ->addColumn( i18n( "Id" ), show_id ? -1 : 0 );
+
+ shopRecipeListView->listView() ->setSorting( -1 );
+ shopRecipeListView->setSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::MinimumExpanding );
+ shopRecipeListView->listView() ->setAllColumnsShowFocus( true );
+
+ buttonBar = new TQHBox( this, "buttonBar" );
+ layout->addMultiCellWidget( buttonBar, 1, 1, 0, 2 );
+
+ layout->setColStretch( 0, 1 );
+ layout->setColStretch( 1, 0 );
+ layout->setColStretch( 2, 1 );
+
+ okButton = new TQPushButton( buttonBar, "okButton" );
+ okButton->setText( i18n( "&OK" ) );
+ TQPixmap pm = il.loadIcon( "ok", TDEIcon::NoGroup, 16 );
+ okButton->setIconSet( pm );
+
+ //buttonBar->layout()->addItem( new TQSpacerItem( 10,10, TQSizePolicy::MinimumExpanding, TQSizePolicy::Fixed ) );
+
+ clearButton = new TQPushButton( buttonBar, "clearButton" );
+ clearButton->setText( i18n( "Clear" ) );
+ pm = il.loadIcon( "edit-clear", TDEIcon::NoGroup, 16 );
+ clearButton->setIconSet( pm );
+
+ //Takes care of all recipe actions and provides a popup menu to 'recipeListView'
+ actionHandler = new RecipeActionsHandler( recipeListView->listView(), database, RecipeActionsHandler::ExpandAll | RecipeActionsHandler::CollapseAll );
+
+ // Connect signals & slots
+ connect( addRecipeButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( addRecipe() ) );
+ connect( removeRecipeButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( removeRecipe() ) );
+ connect( okButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( showShoppingList() ) );
+ connect( clearButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( clear() ) );
+}
+
+ShoppingListDialog::~ShoppingListDialog()
+{}
+
+void ShoppingListDialog::ensurePopulated()
+{
+ listview->populateAll();
+}
+
+void ShoppingListDialog::createShopping( const RecipeList &rlist )
+{
+ clear();
+ RecipeList::const_iterator it;
+ for ( it = rlist.begin(); it != rlist.end(); ++it ) {
+ new RecipeListItem( shopRecipeListView->listView(), shopRecipeListView->listView() ->lastItem(), *it );
+ }
+}
+
+void ShoppingListDialog::reloadRecipeList( ReloadFlags flag )
+{
+ ( ( RecipeListView* ) recipeListView->listView() ) ->reload( flag );
+}
+
+void ShoppingListDialog::reload( ReloadFlags flag )
+{
+ reloadRecipeList ( flag ); // Missing: check if there's non-existing recipes in the list now, and if so, delete.
+}
+
+void ShoppingListDialog::addRecipe( void )
+{
+ TQPtrList<TQListViewItem> items = recipeListView->listView()->selectedItems();
+
+ TQPtrListIterator<TQListViewItem> it(items);
+ TQListViewItem *item;
+ while ( (item = it.current()) != 0 ) {
+ addRecipe( item );
+ ++it;
+ }
+}
+
+void ShoppingListDialog::addRecipe( TQListViewItem *item )
+{
+ if ( item ) {
+ if ( item->rtti() == 1000 ) {
+ RecipeListItem * recipe_it = ( RecipeListItem* ) item;
+
+ Recipe r;
+ r.title = recipe_it->title();
+ r.recipeID = recipe_it->recipeID();
+ ( void ) new RecipeListItem( shopRecipeListView->listView(), r );
+ }
+ }
+}
+
+void ShoppingListDialog::removeRecipe( void )
+{
+ TQListViewItem * it;
+ it = shopRecipeListView->listView() ->selectedItem();
+ if ( it )
+ delete it;
+}
+
+void ShoppingListDialog::showShoppingList( void )
+{
+ // Store the recipe list in ElementList object first
+ ElementList recipeList;
+ RecipeListItem *it;
+ for ( it = ( RecipeListItem* ) shopRecipeListView->listView() ->firstChild();it;it = ( RecipeListItem* ) it->nextSibling() ) {
+ Element newEl;
+ newEl.id = it->recipeID();
+ newEl.name = it->title(); // Storing the title is not necessary, but do it just in case it's used later on
+ recipeList.append( newEl );
+ }
+
+ RefineShoppingListDialog refineDialog( this, database, recipeList );
+ refineDialog.exec();
+}
+
+void ShoppingListDialog::addRecipeToShoppingList( int recipeID )
+{
+ Recipe r;
+ r.title = database->recipeTitle( recipeID );
+ r.recipeID = recipeID;
+
+ new RecipeListItem( shopRecipeListView->listView(), r );
+}
+
+void ShoppingListDialog::clear()
+{
+ shopRecipeListView->listView() ->clear();
+}
+
+void ShoppingListDialog::slotDropped( TDEListView *list, TQDropEvent *e, TQListViewItem * /*after*/ )
+{
+ Recipe r;
+ RecipeListItem *item = new RecipeListItem( recipeListView->listView(), r ); // needs parent, use this temporarily
+ if ( !RecipeItemDrag::decode( e, *item ) ) {
+ delete item;
+ return ;
+ }
+
+ if ( list == shopRecipeListView->listView() ) {
+ addRecipe( item );
+ }
+ //find and delete the item if we just dropped onto the recipe list from the shopping list
+ else if ( list == recipeListView->listView() && e->source() == shopRecipeListView->listView() ) {
+ TQListViewItemIterator list_it = TQListViewItemIterator( shopRecipeListView->listView() );
+ while ( list_it.current() ) {
+ if ( ( ( RecipeListItem* ) list_it.current() ) ->recipeID() == item->recipeID() ) {
+ delete list_it.current();
+ break;
+ }
+ list_it++;
+ }
+ }
+
+ delete item;
+ item = 0; // not needed anymore
+}
+
+#include "shoppinglistdialog.moc"