[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