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.
krecipes/src/recipefilter.cpp

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"