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.
adept/adept/libadept/tagchooser.cpp

145 lines
3.6 KiB

#include <tdelocale.h>
#include <tqdragobject.h>
#include <apt-front/cache/component/tags.h>
#include <apt-front/cache/component/packagetags.h>
#include <adept/tagchooser.h>
#include <adept/taglist.h>
#include <adept/utils.h>
using namespace adept;
FacetItem::FacetItem( TagChooser *t )
: TDEListViewItem( t )
{
}
void FacetItem::removeTag( TagItem::Tag t ) {
// kdDebug() << "removing tag " << t.fullname() << endl;
for ( TQListViewItem *n, *i = firstChild(); i != 0; i = n ) {
n = i->nextSibling();
if ( dynamic_cast< TagItem * >( i )->tag() == t )
delete i;
}
}
TagItem::TagItem( FacetItem *p )
: TDEListViewItem( p ), m_toplevel( false )
{
}
TagItem::TagItem( TagChooser *l )
: TDEListViewItem( l ), m_toplevel( true )
{
}
TQString TagItem::text( int c ) const
{
if (c != 0) return u8( "" );
return TQString( "[" ) + m_tag.name() + "] " + m_tag.shortDescription("");
}
TagChooser::TagChooser( TQWidget *p, const char *n )
: TDEListView( p, n )
{
observeComponent< cache::component::PackageTags >();
// addColumn( " ", 20 );
setRootIsDecorated( true );
addColumn( i18n( "Available Tags" ) );
setResizeMode( LastColumn );
setDragEnabled( true );
setAcceptDrops( true );
viewport()->setAcceptDrops( false );
// kdDebug() << "TagChooser: tags set" << endl;
}
void TagChooser::openToplevel() {
TQListViewItem *i;
for ( i = firstChild(); i != 0; i = i->nextSibling() ) {
i->setOpen( true );
}
}
TQDragObject *TagChooser::dragObject()
{
TagItem *sel = dynamic_cast< TagItem * >( selectedItem() );
if (sel)
return new TQTextDrag( sel->tag().fullname(), this );
return 0;
}
void TagChooser::dragEnterEvent( TQDragEnterEvent *e )
{
// hmmmmm :-)
kdDebug() << "TagChooser::dragEnterEvent" << endl;
e->accept( dynamic_cast< TagList * >( e->source() )
&& TQTextDrag::canDecode( e ) );
kdDebug() << dynamic_cast< TagList * >( e->source() )
<< "; can decode " << TQTextDrag::canDecode( e ) << endl;
}
void TagChooser::dropEvent( TQDropEvent* e )
{
TagList *tl = dynamic_cast< TagList * >( e->source() );
TQString tag;
TQTextDrag::decode( e, tag );
tl->setTags( tl->tags() - cache::Global::get().tags().tagByName(
static_cast< const char * >( tag.local8Bit() ) ) );
}
TQString FacetItem::text( int column ) const
{
if ( column == 0 )
return TQString( "[" ) + m_facet.name() + "] " + m_facet.shortDescription( "" );
return u8( "" );
}
static bool drop( TagChooser::Tag t ) {
if ( t.facet().name() == "special" )
return true;
if ( t.name() == "TODO" )
return true;
return false;
}
void TagChooser::setTags( Tag::Set s )
{
Tag::Set remove = m_tags - s;
Tag::Set add = s - m_tags;
m_tags = s;
Tag::Set::iterator i;
for ( i = add.begin(); i != add.end(); ++i ) {
if ( drop( *i ) )
continue;
FacetItem *fi = m_facets[ i->facet() ];
if ( fi == 0 ) {
fi = m_facets[ i->facet() ] = new FacetItem( this );
fi->setFacet( i->facet() );
}
TagItem *ti = new TagItem( fi );
ti->setTag( *i );
}
for ( i = remove.begin(); i != remove.end(); ++i ) {
if ( drop( *i ) )
continue;
FacetItem *fi = m_facets[ i->facet() ];
fi->removeTag( *i );
if ( fi->childCount() == 0 ) {
m_facets[ i->facet() ] = 0;
delete fi;
}
}
}
void TagChooser::notifyPreRebuild( cache::component::Base *b ) {
setTags( Tag::Set() );
}