diff options
Diffstat (limited to 'src/widgets/ingredientlistview.cpp')
-rw-r--r-- | src/widgets/ingredientlistview.cpp | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/src/widgets/ingredientlistview.cpp b/src/widgets/ingredientlistview.cpp new file mode 100644 index 0000000..1343530 --- /dev/null +++ b/src/widgets/ingredientlistview.cpp @@ -0,0 +1,287 @@ +/*************************************************************************** +* Copyright (C) 2004 by * +* 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 "ingredientlistview.h" + +#include <tdemessagebox.h> +#include <tdeconfig.h> +#include <tdelocale.h> +#include <tdeglobal.h> +#include <kiconloader.h> +#include <tdepopupmenu.h> + +#include "backends/recipedb.h" +#include "dialogs/createelementdialog.h" +#include "dialogs/dependanciesdialog.h" + +IngredientCheckListItem::IngredientCheckListItem( IngredientCheckListView* qlv, const Element &ing ) : TQCheckListItem( qlv, TQString::null, TQCheckListItem::CheckBox ), + m_listview(qlv) +{ + // Initialize the ingredient data with the the property data + ingStored = new Element(); + ingStored->id = ing.id; + ingStored->name = ing.name; +} + +IngredientCheckListItem::IngredientCheckListItem( IngredientCheckListView* qlv, TQListViewItem *after, const Element &ing ) : TQCheckListItem( qlv, after, TQString::null, TQCheckListItem::CheckBox ), + m_listview(qlv) +{ + // Initialize the ingredient data with the the property data + ingStored = new Element(); + ingStored->id = ing.id; + ingStored->name = ing.name; +} + +IngredientCheckListItem::~IngredientCheckListItem( void ) +{ + delete ingStored; +} +int IngredientCheckListItem::id( void ) const +{ + return ingStored->id; +} +TQString IngredientCheckListItem::name( void ) const +{ + return ingStored->name; +} +Element IngredientCheckListItem::ingredient() const +{ + return *ingStored; +} + +TQString IngredientCheckListItem::text( int column ) const +{ + switch ( column ) { + case 0: + return ( ingStored->name ); + case 1: + return ( TQString::number( ingStored->id ) ); + default: + return TQString::null; + } +} + +void IngredientCheckListItem::stateChange( bool on ) +{ + m_listview->stateChange(this,on); +} + +IngredientListView::IngredientListView( TQWidget *parent, RecipeDB *db ) : DBListViewBase( parent,db, db->ingredientCount() ) +{ + setAllColumnsShowFocus( true ); + setDefaultRenameAction( TQListView::Reject ); +} + +void IngredientListView::init() +{ + connect( database, TQ_SIGNAL( ingredientCreated( const Element & ) ), TQ_SLOT( checkCreateIngredient( const Element & ) ) ); + connect( database, TQ_SIGNAL( ingredientRemoved( int ) ), TQ_SLOT( removeIngredient( int ) ) ); +} + +void IngredientListView::load( int limit, int offset ) +{ + ElementList ingredientList; + database->loadIngredients( &ingredientList, limit, offset ); + + setTotalItems(ingredientList.count()); + + for ( ElementList::const_iterator ing_it = ingredientList.begin(); ing_it != ingredientList.end(); ++ing_it ) + createIngredient( *ing_it ); +} + +void IngredientListView::checkCreateIngredient( const Element &el ) +{ + if ( handleElement(el.name) ) { //only create this ingredient if the base class okays it + createIngredient(el); + } +} + + +StdIngredientListView::StdIngredientListView( TQWidget *parent, RecipeDB *db, bool editable ) : IngredientListView( parent, db ) +{ + addColumn( i18n( "Ingredient" ) ); + + TDEConfig * config = TDEGlobal::config(); + config->setGroup( "Advanced" ); + bool show_id = config->readBoolEntry( "ShowID", false ); + addColumn( i18n( "Id" ), show_id ? -1 : 0 ); + + if ( editable ) { + setRenameable( 0, true ); + + TDEIconLoader *il = new TDEIconLoader; + + kpop = new TDEPopupMenu( this ); + kpop->insertItem( il->loadIcon( "document-new", TDEIcon::NoGroup, 16 ), i18n( "&Create" ), this, TQ_SLOT( createNew() ), CTRL + Key_C ); + kpop->insertItem( il->loadIcon( "edit-delete", TDEIcon::NoGroup, 16 ), i18n( "&Delete" ), this, TQ_SLOT( remove + () ), Key_Delete ); + kpop->insertItem( il->loadIcon( "edit", TDEIcon::NoGroup, 16 ), i18n( "&Rename" ), this, TQ_SLOT( rename() ), CTRL + Key_R ); + kpop->polish(); + + delete il; + + connect( this, TQ_SIGNAL( contextMenu( TDEListView *, TQListViewItem *, const TQPoint & ) ), TQ_SLOT( showPopup( TDEListView *, TQListViewItem *, const TQPoint & ) ) ); + connect( this, TQ_SIGNAL( doubleClicked( TQListViewItem* ) ), this, TQ_SLOT( modIngredient( TQListViewItem* ) ) ); + connect( this, TQ_SIGNAL( itemRenamed( TQListViewItem* ) ), this, TQ_SLOT( saveIngredient( TQListViewItem* ) ) ); + } +} + +void StdIngredientListView::showPopup( TDEListView * /*l*/, TQListViewItem *i, const TQPoint &p ) +{ + if ( i ) + kpop->exec( p ); +} + +void StdIngredientListView::createNew() +{ + CreateElementDialog * elementDialog = new CreateElementDialog( this, i18n( "New Ingredient" ) ); + + if ( elementDialog->exec() == TQDialog::Accepted ) { + TQString result = elementDialog->newElementName(); + + if ( checkBounds( result ) ) + database->createNewIngredient( result ); // Create the new author in the database + } +} + +void StdIngredientListView::remove + () +{ + TQListViewItem * it = currentItem(); + + if ( it ) { + int ingredientID = it->text( 1 ).toInt(); + + ElementList dependingRecipes; + database->findIngredientDependancies( ingredientID, &dependingRecipes ); + + if ( dependingRecipes.isEmpty() ) + database->removeIngredient( ingredientID ); + else { // Need Warning! + ListInfo list; + list.list = dependingRecipes; + list.name = i18n( "Recipes" ); + + DependanciesDialog warnDialog( this, list ); + warnDialog.setCustomWarning( i18n("You are about to permanantly delete recipes from your database.") ); + if ( warnDialog.exec() == TQDialog::Accepted ) + database->removeIngredient( ingredientID ); + } + } +} + +void StdIngredientListView::rename() +{ + TQListViewItem * item = currentItem(); + + if ( item ) + IngredientListView::rename( item, 0 ); +} + +void StdIngredientListView::createIngredient( const Element &ing ) +{ + createElement(new TQListViewItem( this, ing.name, TQString::number( ing.id ) )); +} + +void StdIngredientListView::removeIngredient( int id ) +{ + TQListViewItem * item = findItem( TQString::number( id ), 1 ); + removeElement(item); +} + +void StdIngredientListView::modIngredient( TQListViewItem* i ) +{ + if ( i ) + IngredientListView::rename( i, 0); +} + +void StdIngredientListView::saveIngredient( TQListViewItem* i ) +{ + if ( !checkBounds( i->text( 0 ) ) ) { + reload(ForceReload); //reset the changed text + return ; + } + + int existing_id = database->findExistingIngredientByName( i->text( 0 ) ); + int ing_id = i->text( 1 ).toInt(); + if ( existing_id != -1 && existing_id != ing_id ) //category already exists with this label... merge the two + { + switch ( KMessageBox::warningContinueCancel( this, i18n( "This ingredient already exists. Continuing will merge these two ingredients into one. Are you sure?" ) ) ) + { + case KMessageBox::Continue: { + database->mergeIngredients( existing_id, ing_id ); + break; + } + default: + reload(ForceReload); + break; //we have to reload because the ingredient was renamed, and we need to reset it + } + } + else { + database->modIngredient( ( i->text( 1 ) ).toInt(), i->text( 0 ) ); + } +} + +bool StdIngredientListView::checkBounds( const TQString &name ) +{ + if ( name.length() > uint(database->maxIngredientNameLength()) ) { + KMessageBox::error( this, TQString( i18n( "Ingredient name cannot be longer than %1 characters." ) ).arg( database->maxIngredientNameLength() ) ); + return false; + } + + return true; +} + + + +IngredientCheckListView::IngredientCheckListView( TQWidget *parent, RecipeDB *db ) : IngredientListView( parent, db ) +{ + addColumn( i18n( "Ingredient" ) ); + + TDEConfig *config = TDEGlobal::config(); + config->setGroup( "Advanced" ); + bool show_id = config->readBoolEntry( "ShowID", false ); + addColumn( i18n( "Id" ), show_id ? -1 : 0 ); +} + +void IngredientCheckListView::createIngredient( const Element &ing ) +{ + createElement(new IngredientCheckListItem( this, ing )); +} + +void IngredientCheckListView::removeIngredient( int id ) +{ + TQListViewItem * item = findItem( TQString::number( id ), 1 ); + removeElement(item); +} + +void IngredientCheckListView::load( int limit, int offset ) +{ + IngredientListView::load(limit,offset); + + for ( TQValueList<Element>::const_iterator ing_it = m_selections.begin(); ing_it != m_selections.end(); ++ing_it ) { + TQCheckListItem * item = ( TQCheckListItem* ) findItem( TQString::number( (*ing_it).id ), 1 ); + if ( item ) { + item->setOn(true); + } + } +} + +void IngredientCheckListView::stateChange(IngredientCheckListItem *it,bool on) +{ + if ( !reloading() ) { + if ( on ) + m_selections.append(it->ingredient()); + else + m_selections.remove(it->ingredient()); + } +} + +#include "ingredientlistview.moc" |