[prev in list] [next in list] [prev in thread] [next in thread]
List: koffice-devel
Subject: [PATCH] Syncing karbons layer list view
From: Jaham <jaham () gmx ! net>
Date: 2005-08-15 21:46:26
Message-ID: 200508152346.26775.jaham () gmx ! net
[Download RAW message or body]
Hi...
I have produced a new patch for karbons layer list view. It is now better
synced to the documents object hierarchy when deleting or grouping/ungrouping
objects. The following files are modified:
- karbon/dockers/vdocumentdocker.*
- karbon/commands/vgroupcmd.cc
- karbon/commands/vungroupcmd.cc
I think it greatly improves the layer list view and if you have no objections,
than please commit.
Ciao Jan
["karbon-layerview-syncing.diff" (text/x-diff)]
Index: karbon/dockers/vdocumentdocker.cc
===================================================================
--- karbon/dockers/vdocumentdocker.cc (revision 444314)
+++ karbon/dockers/vdocumentdocker.cc (working copy)
@@ -47,6 +47,8 @@
#include "vlayercmd.h"
#include "vdeletecmd.h"
#include "vzordercmd.h"
+#include "vgroupcmd.h"
+#include "vungroupcmd.h"
#include "vselection.h"
#include "vstroke.h"
#include "vcanvas.h"
@@ -301,12 +303,20 @@
* Layers tab *
*************************************************************************/
-VObjectListViewItem::VObjectListViewItem( QListViewItem* parent, VObject* object, \
VDocument *doc, uint key )
- : QListViewItem( parent, 0L ), m_object( object ), m_document( doc ), m_key( key )
+VObjectListViewItem::VObjectListViewItem( QListViewItem* parent, VObject* object, \
VDocument *doc, uint key, QPtrDict<VObjectListViewItem> *map ) + : QListViewItem( \
parent, 0L ), m_object( object ), m_document( doc ), m_key( key ), m_map( map ) {
update();
+ // add itself to object list item map
+ m_map->insert( object, this );
}
+VObjectListViewItem::~VObjectListViewItem()
+{
+ // remove itself from object list item map
+ m_map->take( m_object );
+}
+
QString
VObjectListViewItem::key( int, bool ) const
{
@@ -353,12 +363,20 @@
}
-VLayerListViewItem::VLayerListViewItem( QListView* parent, VLayer* layer, VDocument \
*doc )
- : QCheckListItem( parent, 0L, CheckBox ), m_layer( layer ), m_document( doc)
+VLayerListViewItem::VLayerListViewItem( QListView* parent, VLayer* layer, VDocument \
*doc, QPtrDict<VLayerListViewItem> *map ) + : QCheckListItem( parent, 0L, CheckBox ), \
m_layer( layer ), m_document( doc), m_map( map ) {
update();
+ // add itself to layer list item map
+ m_map->insert( layer, this );
} // VLayerListViewItem::VLayerListViewItem
+VLayerListViewItem::~VLayerListViewItem()
+{
+ // remove itself from layer list item map
+ m_map->take( m_layer );
+}
+
void
VLayerListViewItem::update()
{
@@ -462,6 +480,7 @@
connect( m_layersListView, SIGNAL( selectionChanged() ), this, SLOT( \
selectionChangedFromList() ) ); connect( m_view, SIGNAL( selectionChange() ), this, \
SLOT( selectionChangedFromTool() ) ); connect( m_buttonGroup, SIGNAL( clicked( int ) \
), this, SLOT( slotButtonClicked( int ) ) ); + connect( \
view->part()->commandHistory(), SIGNAL( commandExecuted( VCommand*) ), this, SLOT( \
slotCommandExecuted( VCommand* ) ) );
layout->activate();
updateLayers();
@@ -505,43 +524,88 @@
VLayersTab::selectionChangedFromTool()
{
resetSelection();
+ removeDeletedObjectsFromList();
// TODO : use some kind of mapping...
VObjectListIterator itr = m_document->selection()->objects();
- for( ; itr.current();++itr )
+ for( ; itr.current(); ++itr )
if( itr.current()->state() != VObject::deleted )
{
- QListViewItemIterator it( m_layersListView );
- bool found = false;
- while( !found && it.current() )
+ VObjectListViewItem *item = m_objects[ itr.current() ];
+ if( ! item )
{
- VObjectListViewItem *objItem = dynamic_cast<VObjectListViewItem *>( it.current() \
);
-
- if( objItem && objItem->object() == itr.current() )
+ VLayerListViewItem *layerItem = m_layers[ itr.current()->parent() ];
+ if( layerItem )
+ updateObjects( layerItem->layer(), layerItem );
+ else
{
- objItem->setSelected( true );
- objItem->update();
- found = true;
- break;
+ VObjectListViewItem *objectItem = m_objects[ itr.current()->parent() ];
+ if( objectItem )
+ updateObjects( objectItem->object(), objectItem );
+ else
+ continue;
}
- ++it;
+ item = m_objects[ itr.current() ];
}
- // not found, insert and select
- if( !found )
- {
- VLayerListViewItem *layerItem = dynamic_cast<VLayerListViewItem *>( m_layers[ \
m_document->activeLayer() ] );
- if( layerItem && !m_objects[ itr.current() ] )
- {
- VObjectListViewItem *newItem = new VObjectListViewItem( layerItem, \
itr.current(), m_document, layerItem->childCount() );
- m_objects.insert( itr.current(), newItem );
- newItem->setSelected( true );
- newItem->update();
- }
- }
+ item->setSelected( true );
+ item->update();
}
}
+void
+VLayersTab::updateChildItems( QListViewItem *item )
+{
+ QListViewItemIterator it( item );
+
+ // iterator points to item, so make the next item current first
+ for( ++it; it.current(); ++it )
+ {
+ VObjectListViewItem *objectItem = dynamic_cast<VObjectListViewItem *>( \
it.current() ); + if( ! objectItem ) continue;
+
+ if( dynamic_cast<VGroup*>( objectItem->object() ) )
+ updateChildItems( objectItem );
+
+ objectItem->update();
+ objectItem->repaint();
+ }
+}
+
+void
+VLayersTab::toggleState( VObject *obj, int col )
+{
+ switch( col )
+ {
+ case 1: // toggle visibility
+ if( obj->state() == VObject::hidden_locked )
+ obj->setState( VObject::hidden );
+ else if( obj->state() == VObject::normal_locked )
+ obj->setState( VObject::selected );
+ else if( obj->state() == VObject::normal || obj->state() >= VObject::selected )
+ obj->setState( VObject::normal_locked );
+ else if( obj->state() == VObject::hidden )
+ obj->setState( VObject::hidden_locked );
+ break;
+ case 2: // toggle locking
+ if( obj->state() == VObject::hidden_locked )
+ obj->setState( VObject::normal_locked );
+ else if( obj->state() == VObject::normal_locked )
+ obj->setState( VObject::hidden_locked );
+ else if( obj->state() == VObject::normal || obj->state() >= VObject::selected )
+ obj->setState( VObject::hidden );
+ else if( obj->state() == VObject::hidden )
+ obj->setState( VObject::selected );
+ break;
+ default: return;
+ }
+
+ if( obj->state() < VObject::selected )
+ m_document->selection()->take( *obj );
+ else
+ m_document->selection()->append( obj );
+}
+
void
VLayersTab::itemClicked( QListViewItem* item, const QPoint &, int col )
{
@@ -550,79 +614,34 @@
VLayerListViewItem *layerItem = dynamic_cast<VLayerListViewItem *>( item );
if( layerItem )
{
- VLayer *obj = layerItem->layer();
m_document->setActiveLayer( layerItem->layer() );
-
+
if( col > 0 )
{
- if( col == 2 ) // set visibility
- {
- if( obj->state() == VObject::hidden_locked )
- obj->setState( VObject::normal_locked );
- else if( obj->state() == VObject::normal_locked )
- obj->setState( VObject::hidden_locked );
- else if( obj->state() == VObject::normal || obj->state() >= VObject::selected)
- obj->setState( VObject::hidden );
- else if( obj->state() == VObject::hidden )
- obj->setState( VObject::selected );
- }
- else // set locking
- {
- if( obj->state() == VObject::hidden_locked )
- obj->setState( VObject::hidden );
- else if( obj->state() == VObject::normal_locked )
- obj->setState( VObject::selected );
- else if( obj->state() == VObject::normal || obj->state() >= VObject::selected )
- obj->setState( VObject::normal_locked );
- else if( obj->state() == VObject::hidden )
- obj->setState( VObject::hidden_locked );
- }
- if( obj->state() < VObject::selected )
- m_document->selection()->take( *obj );
- else
- m_document->selection()->append( obj );
+ toggleState( layerItem->layer(), col );
+
layerItem->update();
layerItem->repaint();
+
+ updateChildItems( layerItem );
+
m_view->part()->repaintAllViews();
}
}
else
{
VObjectListViewItem *objectItem = dynamic_cast< VObjectListViewItem *>( item );
- VObject *obj = objectItem->object();
if( col > 0 )
{
- if( col == 2 ) // set visibility
- {
- if( obj->state() == VObject::hidden_locked )
- obj->setState( VObject::normal_locked );
- else if( obj->state() == VObject::normal_locked )
- obj->setState( VObject::hidden_locked );
- else if( obj->state() == VObject::normal || obj->state() >= VObject::selected )
- obj->setState( VObject::hidden );
- else if( obj->state() == VObject::hidden )
- obj->setState( VObject::selected );
- }
- else // set locking
- {
- if( obj->state() == VObject::hidden_locked )
- obj->setState( VObject::hidden );
- else if( obj->state() == VObject::normal_locked )
- obj->setState( VObject::selected );
- else if( obj->state() == VObject::normal || obj->state() >= VObject::selected )
- obj->setState( VObject::normal_locked );
- else if( obj->state() == VObject::hidden )
- obj->setState( VObject::hidden_locked );
- }
+ toggleState( objectItem->object(), col );
- if( obj->state() < VObject::selected )
- m_document->selection()->take( *obj );
- else
- m_document->selection()->append( obj );
-
objectItem->update();
objectItem->repaint();
+
+ if( dynamic_cast<VGroup*>( objectItem->object() ) )
+ updateChildItems( objectItem );
+
m_view->part()->repaintAllViews();
}
}
@@ -644,6 +663,12 @@
if( ! objectItem ) continue;
VObject::VState state = objectItem->object()->state();
+
+ if( state == VObject::deleted )
+ {
+ delete objectItem;
+ continue;
+ }
if( objectItem->isSelected() && (state != VObject::hidden) && (state != \
VObject::normal_locked ) && (state != VObject::hidden_locked) )
@@ -783,33 +808,61 @@
VCommand *cmd = 0L;
QListViewItemIterator it( m_layersListView );
+ QPtrList<QListViewItem> deleteItems;
+ deleteItems.setAutoDelete( false );
+
+ // collect all selected items because they get deselected
+ // when the first item is removed
for(; it.current(); ++it )
{
if( ! it.current()->isSelected() ) continue;
-
- VLayerListViewItem* layerItem = dynamic_cast< VLayerListViewItem *>( it.current() \
); + deleteItems.append( it.current() );
+ }
+
+ for( ;deleteItems.first(); )
+ {
+ VLayerListViewItem* layerItem = dynamic_cast< VLayerListViewItem *>( \
deleteItems.current() ); if( layerItem )
{
VLayer *layer = layerItem->layer();
if( layer )
{
cmd = new VLayerCmd( m_document, i18n( "Delete Layer" ), layer, \
VLayerCmd::deleteLayer );
- m_view->part()->addCommand( cmd, true );
+
+ VObjectListIterator itr = layer->objects();
+ // iterate over this layers child objects and remove them from the internal
+ // object list and the list of the to be deleted items
+ for( ; itr.current(); ++itr )
+ {
+ VObjectListViewItem *objectItem = m_objects.take( itr.current() );
+ deleteItems.remove( objectItem );
+ }
+
delete layerItem;
+
+ m_view->part()->addCommand( cmd );
}
}
else
{
- VObjectListViewItem* item = dynamic_cast< VObjectListViewItem *>( it.current() );
+ VObjectListViewItem* item = dynamic_cast< VObjectListViewItem *>( \
deleteItems.current() ); if( item )
{
cmd = new VDeleteCmd( m_document, item->object() );
- m_view->part()->addCommand( cmd, true );
+
delete item;
+
+ m_view->part()->addCommand( cmd );
}
}
+ // remove first item, next item becomes current
+ deleteItems.removeFirst();
}
- if( cmd ) updatePreviews();
+ if( cmd )
+ {
+ updatePreviews();
+ m_view->part()->repaintAllViews();
+ }
} // VLayersTab::deleteItem
void
@@ -822,34 +875,24 @@
void
VLayersTab::updateLayers()
{
+ removeDeletedObjectsFromList();
+
QPtrVector<VLayer> vector;
m_document->layers().toVector( &vector );
- VLayerListViewItem* item;
+ VLayerListViewItem* item = 0L;
for( int i = vector.count() - 1; i >= 0; i-- )
{
if ( vector[i]->state() != VObject::deleted )
{
if( !m_layers[ vector[i] ] )
- m_layers.insert( vector[i], new VLayerListViewItem( m_layersListView, vector[i], \
m_document ) );
- item = m_layers[ vector[i] ];
+ item = new VLayerListViewItem( m_layersListView, vector[i], m_document, \
&m_layers ); + else
+ item = m_layers[ vector[i] ];
item->setOpen( true );
item->setKey(i);
- VObjectListIterator itr = vector[i]->objects();
- uint objcount = 1;
- for( ; itr.current();++itr, objcount++ )
- if( itr.current()->state() != VObject::deleted )
- {
- if( !m_objects[ itr.current() ] )
- m_objects.insert( itr.current(), new VObjectListViewItem( item, itr.current(), \
m_document, objcount ) );
- m_objects[ itr.current() ]->setKey( objcount );
-
- //kdDebug(38000) << "obj : " << itr.current() << ", key : " << m_objects[ \
itr.current() ]->key( 0, true ).latin1() << endl;
-
- if( dynamic_cast<VGroup *>( itr.current() ) )
- updateObjects( itr.current(), m_objects[ itr.current() ] );
- }
+ updateObjects( vector[i], item );
}
}
m_layersListView->sort();
@@ -858,21 +901,93 @@
void
VLayersTab::updateObjects( VObject *object, QListViewItem *item )
{
- uint objcount = 1;
VObjectListIterator itr = dynamic_cast<VGroup *>( object )->objects();
- for( ; itr.current();++itr, objcount++ )
+
+ for( uint objcount = 1; itr.current(); ++itr, objcount++ )
if( itr.current()->state() != VObject::deleted )
{
- if( !m_objects[ itr.current() ] )
- m_objects.insert( itr.current(), new VObjectListViewItem( item, itr.current(), \
m_document, objcount ) ); + VObjectListViewItem *objectItem = m_objects[ \
itr.current() ]; + if( ! objectItem )
+ {
+ // object not found -> insert
+ objectItem = new VObjectListViewItem( item, itr.current(), m_document, objcount, \
&m_objects ); + objectItem->update();
+ }
+ else if( objectItem->parent() != item )
+ {
+ // object found, but has false parent -> reparent
+ objectItem->parent()->takeItem( objectItem );
+ item->insertItem( objectItem );
+ }
- m_objects[ itr.current() ]->setKey( objcount );
+ objectItem->setKey( objcount );
if( dynamic_cast<VGroup *>( itr.current() ) )
- updateObjects( itr.current(), m_objects[ itr.current() ] );
+ updateObjects( itr.current(), objectItem );
}
}
+void
+VLayersTab::removeDeletedObjectsFromList()
+{
+ QPtrDictIterator<VObjectListViewItem> it( m_objects );
+
+ // iterate over all object items and delete the following items:
+ // - items representing deleted objects
+ // - items with objects objects that changed parents
+ // BEWARE: when deleting an item, the iterator is automatically incremented
+ for(; it.current(); )
+ {
+ VLayerListViewItem *layerItem = dynamic_cast<VLayerListViewItem*>( \
it.current()->parent() ); + if( layerItem )
+ {
+ VGroup *group = dynamic_cast<VGroup*>( layerItem->layer() );
+ // check if object of item is still child of object of parent item
+ if( group && ! group->objects().contains( it.current()->object() ) )
+ {
+ layerItem->takeItem( it.current() );
+ delete it.current();
+ continue;
+ }
+ }
+ else
+ {
+ VObjectListViewItem *objectItem = dynamic_cast<VObjectListViewItem*>( \
it.current()->parent() ); + if( objectItem )
+ {
+ VGroup *group = dynamic_cast<VGroup*>( objectItem->object() );
+ // check if object of item is still child of object of parent item
+ if( group && ! group->objects().contains( it.current()->object() ) )
+ {
+ objectItem->takeItem( it.current() );
+ delete it.current();
+ continue;
+ }
+ }
+ }
+
+ if( it.current()->object()->state() == VObject::deleted )
+ {
+ delete it.current();
+ continue;
+ }
+
+ ++it;
+ }
+}
+
+
+void
+VLayersTab::slotCommandExecuted( VCommand* command )
+{
+ // sync listview on changing layers or deleting/undeleting or grouping/ungrouping \
objects + if( dynamic_cast<VLayerCmd*>( command )
+ || dynamic_cast<VDeleteCmd*>( command )
+ || dynamic_cast<VGroupCmd*>( command )
+ || dynamic_cast<VUnGroupCmd*>( command ) )
+ updateLayers();
+}
+
/*************************************************************************
* History tab *
*************************************************************************/
Index: karbon/dockers/vdocumentdocker.h
===================================================================
--- karbon/dockers/vdocumentdocker.h (revision 444314)
+++ karbon/dockers/vdocumentdocker.h (working copy)
@@ -94,8 +94,8 @@
class VLayerListViewItem : public QCheckListItem
{
public:
- VLayerListViewItem( QListView* parent, VLayer* layer, VDocument *doc );
- virtual ~VLayerListViewItem() {}
+ VLayerListViewItem( QListView* parent, VLayer* layer, VDocument *doc, \
QPtrDict<VLayerListViewItem> *map ); + virtual ~VLayerListViewItem();
VLayer* layer() { return m_layer; }
int pos();
@@ -110,23 +110,24 @@
VLayer *m_layer;
VDocument *m_document;
uint m_key;
+ QPtrDict<VLayerListViewItem> *m_map;
}; // VLayerListViewItem
class VObjectListViewItem : public QListViewItem
{
public:
- VObjectListViewItem( QListViewItem* parent, VObject* object, VDocument *doc, uint \
key );
- virtual ~VObjectListViewItem() {}
+ VObjectListViewItem( QListViewItem* parent, VObject* object, VDocument *doc, uint \
key, QPtrDict<VObjectListViewItem> *map ); + virtual ~VObjectListViewItem();
VObject* object() { return m_object; }
void update();
virtual QString key( int column, bool ascending ) const;
void setKey( uint key ) { m_key = key; }
-
private:
VObject *m_object;
VDocument *m_document;
uint m_key;
+ QPtrDict<VObjectListViewItem> *m_map;
};
class VLayersTab : public QWidget
@@ -149,9 +150,13 @@
void raiseItem();
void lowerItem();
void deleteItem();
+ void slotCommandExecuted( VCommand* command );
private slots:
void slotButtonClicked( int ID );
+ void removeDeletedObjectsFromList();
+ void updateChildItems( QListViewItem *item );
+ void toggleState( VObject *obj, int col );
protected:
VLayerListViewItem* listItem( int pos );
Index: karbon/commands/vungroupcmd.cc
===================================================================
--- karbon/commands/vungroupcmd.cc (revision 444314)
+++ karbon/commands/vungroupcmd.cc (working copy)
@@ -36,7 +36,6 @@
VUnGroupCmd::~VUnGroupCmd()
{
- //delete( m_group );
}
void
@@ -70,10 +69,9 @@
}
m_group->clear();
+ m_group->setState( VObject::deleted );
}
- //delete m_group;
- //m_group = 0L;
setSuccess( true );
}
@@ -91,6 +89,7 @@
m_group->append( itr.current() );
}
+ m_group->setState( VObject::normal );
document()->append( m_group );
document()->selection()->clear();
document()->selection()->append( m_group );
Index: karbon/commands/vgroupcmd.cc
===================================================================
--- karbon/commands/vgroupcmd.cc (revision 444314)
+++ karbon/commands/vgroupcmd.cc (working copy)
@@ -62,6 +62,9 @@
void
VGroupCmd::unexecute()
{
+ if( ! m_group )
+ return;
+
document()->selection()->clear();
VObjectListIterator itr( m_group->objects() );
@@ -81,14 +84,14 @@
VObjectListIterator itr = m_selection->objects();
for ( ; itr.current() ; ++itr )
+ {
parent->append( itr.current() );
+ }
m_group->clear();
+ m_group->setState( VObject::deleted );
}
- delete m_group;
- m_group = 0L;
-
setSuccess( false );
}
_______________________________________________
koffice-devel mailing list
koffice-devel@kde.org
https://mail.kde.org/mailman/listinfo/koffice-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic