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.
155 lines
4.1 KiB
155 lines
4.1 KiB
/***************************************************************************
|
|
* Copyright (C) 2004 by *
|
|
* Jason Kivlighn (jkivlighn@gmail.com) *
|
|
* Unai Garro (ugarro@users.sourceforge.net) *
|
|
* *
|
|
* 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 "recipefilter.h"
|
|
|
|
#include <kdebug.h>
|
|
|
|
#include "widgets/recipelistview.h"
|
|
|
|
RecipeFilter::RecipeFilter( TDEListView *klv ) : TQObject( klv ),
|
|
listview( klv ),
|
|
currentCategory( 0 )
|
|
{}
|
|
|
|
void RecipeFilter::filter( const TQString &s )
|
|
{
|
|
//do this to only iterate over children of 'currentCategory'
|
|
TQListViewItem * pEndItem = NULL;
|
|
if ( currentCategory ) {
|
|
TQListViewItem * pStartItem = currentCategory;
|
|
do {
|
|
if ( pStartItem->nextSibling() )
|
|
pEndItem = pStartItem->nextSibling();
|
|
else
|
|
pStartItem = pStartItem->parent();
|
|
}
|
|
while ( pStartItem && !pEndItem );
|
|
}
|
|
|
|
//Re-show everything
|
|
TQListViewItemIterator list_it;
|
|
if ( currentCategory )
|
|
list_it = TQListViewItemIterator( currentCategory );
|
|
else
|
|
list_it = TQListViewItemIterator( listview );
|
|
while ( list_it.current() != pEndItem ) {
|
|
list_it.current() ->setVisible( true );
|
|
list_it++;
|
|
}
|
|
|
|
// Only filter if the filter text isn't empty
|
|
if ( !s.isEmpty() ) {
|
|
TQListViewItemIterator list_it( listview );
|
|
while ( TQListViewItem * it = list_it.current() ) {
|
|
if ( it->rtti() == 1000 ) // Its a recipe
|
|
{
|
|
RecipeListItem * recipe_it = ( RecipeListItem* ) it;
|
|
|
|
if ( recipe_it->title().contains( s, false ) )
|
|
{
|
|
if ( currentCategory ) {
|
|
if ( isParentOf( currentCategory, recipe_it ) )
|
|
recipe_it->setVisible( true );
|
|
else
|
|
recipe_it->setVisible( false );
|
|
}
|
|
else
|
|
recipe_it->setVisible( true );
|
|
}
|
|
else
|
|
recipe_it->setVisible( false );
|
|
}
|
|
|
|
++list_it;
|
|
}
|
|
hideIfEmpty();
|
|
}
|
|
}
|
|
|
|
void RecipeFilter::filterCategory( int categoryID )
|
|
{
|
|
kdDebug() << "I got category :" << categoryID << "\n";
|
|
|
|
if ( categoryID == -1 )
|
|
currentCategory = 0;
|
|
else {
|
|
TQListViewItemIterator list_it( listview );
|
|
while ( TQListViewItem * it = list_it.current() ) {
|
|
if ( it->rtti() == 1001 ) {
|
|
CategoryListItem * cat_it = ( CategoryListItem* ) it;
|
|
if ( cat_it->categoryId() == categoryID ) {
|
|
currentCategory = cat_it;
|
|
break;
|
|
}
|
|
}
|
|
|
|
++list_it;
|
|
}
|
|
}
|
|
|
|
TQListViewItemIterator list_it( listview );
|
|
while ( TQListViewItem * it = list_it.current() ) {
|
|
if ( categoryID == -1 )
|
|
it->setVisible( true ); // We're not filtering categories
|
|
else if ( it == currentCategory || isParentOf( it, currentCategory ) || isParentOf( currentCategory, it ) )
|
|
it->setVisible( true );
|
|
else
|
|
it->setVisible( false );
|
|
|
|
++list_it;
|
|
}
|
|
|
|
if ( currentCategory )
|
|
currentCategory->setOpen( true );
|
|
}
|
|
|
|
bool RecipeFilter::hideIfEmpty( TQListViewItem *parent )
|
|
{
|
|
TQListViewItem * it;
|
|
if ( parent == 0 )
|
|
it = listview->firstChild();
|
|
else
|
|
it = parent->firstChild();
|
|
|
|
bool parent_should_show = false;
|
|
for ( ; it; it = it->nextSibling() ) {
|
|
if ( (it->rtti() == 1000 && it->isVisible()) || (it->rtti() == NEXTLISTITEM_RTTI || it->rtti() == PREVLISTITEM_RTTI) ) {
|
|
parent_should_show = true;
|
|
}
|
|
else {
|
|
bool result = hideIfEmpty( it );
|
|
if ( parent_should_show == false )
|
|
parent_should_show = result;
|
|
}
|
|
}
|
|
|
|
if ( parent && parent->rtti() != 1000 ) {
|
|
if ( parent_should_show )
|
|
parent->setOpen( true );
|
|
parent->setVisible( parent_should_show );
|
|
}
|
|
return parent_should_show;
|
|
}
|
|
|
|
bool RecipeFilter::isParentOf( TQListViewItem *parent, TQListViewItem *to_check )
|
|
{
|
|
for ( TQListViewItem * it = to_check->parent(); it; it = it->parent() ) {
|
|
if ( it == parent )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
#include "recipefilter.moc"
|
|
|