[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: playground
From: Peter Rockai <me () mornfall ! net>
Date: 2005-09-07 12:49:50
Message-ID: 1126097390.268188.20431.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 458173 by mornfall:
- fix segfault with extender pointers being left around for deleted extenders
- fix extenders being messed up after hide()/show()
_M trunk/playground (directory)
M +29 -9 sysadmin/ept/libept/extendablelist.cpp
M +6 -2 sysadmin/ept/libept/extendablelist.h
** trunk/playground #property changes
Name: svk:merge
- 09763588-d2fa-0310-af60-90ae7c5eb620:/kde/trunk/playground:752
89340390-c2e4-0310-9406-c4e30e908d35:/kde/trunk/playground:2604
e5ad508d-cdfc-0310-88ec-f8945a0f1aa7:/local/playground/ept-branch:2142
e5ad508d-cdfc-0310-88ec-f8945a0f1aa7:/trunk/playground:7421
+ 09763588-d2fa-0310-af60-90ae7c5eb620:/kde/trunk/playground:762
89340390-c2e4-0310-9406-c4e30e908d35:/kde/trunk/playground:2604
e5ad508d-cdfc-0310-88ec-f8945a0f1aa7:/local/playground/ept-branch:2142
e5ad508d-cdfc-0310-88ec-f8945a0f1aa7:/trunk/playground:7469
--- trunk/playground/sysadmin/ept/libept/extendablelist.cpp #458172:458173
@@ -5,8 +5,8 @@
using namespace ept;
ExtendableList::ExtendableList( QWidget *p, const char *n )
- : KListView( p, n ), m_extenders( ExtendableItem::s_less ),
- m_toggleColumn( 0 )
+ : KListView( p, n ),
+ m_toggleColumn( 0 ), m_inDtor( false )
{
kdDebug() << "connecting processClick har har" << endl;
connect( this, SIGNAL( clicked( QListViewItem *,
@@ -26,6 +26,12 @@
QTimer::singleShot( 0, this, SLOT( triggerUpdate() ) );
}
+void ExtendableList::show()
+{
+ KListView::show();
+ updateExtenders();
+}
+
void ExtendableList::resizeEvent( QResizeEvent *e )
{
KListView::resizeEvent( e );
@@ -34,23 +40,27 @@
void ExtendableList::updateExtenders()
{
- std::set< ExtendableItem * >::iterator i;
- for (i = m_extenders.begin(); i != m_extenders.end(); ++i) {
- updateExtender( *i );
- }
+ std::for_each( m_extenders.begin(), m_extenders.end(),
+ std::bind1st( std::mem_fun( &ExtendableList::updateExtender ),
+ this ) );
}
void ExtendableList::addExtender( ExtendableItem *item )
{
m_extenders.insert( m_extenders.begin(), item );
+ std::sort( m_extenders.begin(), m_extenders.end(), ExtendableItem::s_less );
updateExtender( item );
QTimer::singleShot( 0, this, SLOT( updateExtenders() ) );
}
void ExtendableList::removeExtender( ExtendableItem *i )
{
- m_extenders.erase( i );
- QTimer::singleShot( 0, this, SLOT( updateExtenders() ) );
+ m_extenders.erase( std::remove( m_extenders.begin(),
+ m_extenders.end(), i ),
+ m_extenders.end() );
+ // the above retains ordering so no need to re-sort
+ if (!m_inDtor)
+ QTimer::singleShot( 0, this, SLOT( updateExtenders() ) );
}
void ExtendableList::processClick( QListViewItem *it,
@@ -65,6 +75,9 @@
item->toggleExtender();
}
+ExtendableList::~ExtendableList() {
+}
+
ExtendableList *ExtendableItem::list()
{
return dynamic_cast< ExtendableList * >( listView() );
@@ -76,6 +89,12 @@
return a->less( b );
}
+int ExtendableItem::compare( QListViewItem *i, int c, bool asc ) const
+{
+ ExtendableItem *o = dynamic_cast< ExtendableItem * >( i );
+ return int( o->less( this ) ) - int( less( o ) );
+}
+
void ExtendableItem::toggleExtender()
{
if (m_extender) {
@@ -97,7 +116,8 @@
ExtendableItem::~ExtendableItem()
{
+ if( extender() && list() ) // this could as well be 0... bah
+ list()->removeExtender( this );
if (extender())
delete extender();
}
-
--- trunk/playground/sysadmin/ept/libept/extendablelist.h #458172:458173
@@ -5,7 +5,7 @@
#include <qobjectlist.h>
#include <qlayout.h>
#include <kglobalsettings.h>
-#include <set>
+#include <vector>
#include <typeinfo>
#ifndef EPT_EXTENDABLELIST_H
@@ -22,6 +22,7 @@
typedef bool(*ItemCompare)( const ExtendableItem *,
const ExtendableItem * );
ExtendableList( QWidget *p = 0, const char *n = 0 );
+ virtual ~ExtendableList();
QPixmap extendedIcon() { return m_extendedIcon; }
QPixmap baseIcon() { return m_baseIcon; }
public slots:
@@ -32,15 +33,17 @@
void setToggleColumn( unsigned c ) {
m_toggleColumn = c;
}
+ virtual void show();
protected slots:
void processClick( QListViewItem *, const QPoint &, int );
protected:
virtual void resizeEvent( QResizeEvent * );
protected:
- std::set< ExtendableItem *, ItemCompare > m_extenders;
+ std::vector< ExtendableItem * > m_extenders;
QPixmap m_extendedIcon;
QPixmap m_baseIcon;
unsigned m_toggleColumn;
+ bool m_inDtor:1;
};
class ExtendableItem : public KListViewItem {
@@ -80,6 +83,7 @@
virtual ItemExtender *createExtender() = 0;
virtual bool less( const ExtendableItem * ) const = 0;
+ virtual int compare( QListViewItem *other, int col, bool ascending ) const;
virtual ~ExtendableItem();
virtual void setHeight( int h ) { KListViewItem::setHeight( h ); }
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic