[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/multimedia/amarok/src
From:       Ian Monroe <ian.monroe () gmail ! com>
Date:       2009-02-21 14:52:00
Message-ID: 1235227920.290879.5960.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 929528 by ianmonroe:

*enable foreach for the SmartPointerList
*use templates so you don't need casting

 M  +1 -1      CMakeLists.txt  
 M  +3 -3      GlobalCurrentTrackActions.cpp  
 M  +1 -1      GlobalCurrentTrackActions.h  
 M  +100 -16   SmartPointerList.cpp  
 M  +45 -8     SmartPointerList.h  
 M  +6 -6      Systray.cpp  
 M  +1 -1      Systray.h  
 M  +5 -13     widgets/MainToolbar.cpp  
 M  +1 -1      widgets/MainToolbar.h  


--- trunk/extragear/multimedia/amarok/src/CMakeLists.txt #929527:929528
@@ -515,7 +515,7 @@
     MountPointManager.cpp
     PaletteHandler.cpp
     PopupDropperFactory.cpp
-    SmartPointerList.cpp
+    #SmartPointerList.cpp don't include this file, its a template!
     Systray.cpp
     widgets/hintlineedit.cpp
     widgets/kdatecombo.cpp
--- trunk/extragear/multimedia/amarok/src/GlobalCurrentTrackActions.cpp \
#929527:929528 @@ -43,7 +43,7 @@
 
 void GlobalCurrentTrackActions::addAction( QAction * action )
 {
-    m_actions.addPointer( action );
+    m_actions.append( action );
 }
 
 QList< QAction * > GlobalCurrentTrackActions::actions()
@@ -52,8 +52,8 @@
 
     QList<QAction*> validActions;
 
-    for( int i = 0; i < m_actions.size(); i++ )
-        validActions.append( (QAction*) m_actions[i] );
+    foreach( QObject* action, m_actions )
+        validActions.append( (QAction*) action );
 
     return validActions;
 }
--- trunk/extragear/multimedia/amarok/src/GlobalCurrentTrackActions.h #929527:929528
@@ -50,7 +50,7 @@
     GlobalCurrentTrackActions();
     ~GlobalCurrentTrackActions();
     
-    SmartPointerList m_actions;
+    SmartPointerList<QAction*> m_actions;
 };
 
 #endif
--- trunk/extragear/multimedia/amarok/src/SmartPointerList.cpp #929527:929528
@@ -1,5 +1,6 @@
 /***************************************************************************
  *   Copyright (c) 2009 Mark Kretschmann <kretschmann@kde.org>             *
+ *             (c) 2009 Ian Monroe <ian@monroe.nu>                         *
  *                                                                         *
  *   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  *
@@ -17,45 +18,128 @@
  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
  ***************************************************************************/
 
-#include "SmartPointerList.h"
+//!!! this file is included into SmartPointerList.h !!!
 
 #include "Debug.h"
 
+template<typename T>
+SmartPointerList<T>::SmartPointerList()
+    : QList<T>()
+    , m_remover( new SmartPointerListRemover<T>( this ) )
+    , m_ownsRemover( true )
+{
+}
 
-SmartPointerList::SmartPointerList( QObject* parent )
-    : QObject( parent )
+template<typename T>
+SmartPointerList<T>::SmartPointerList( const SmartPointerList<T>& that )
+    : QList<T>( that )
+    , m_remover( that.m_remover )
+    , m_ownsRemover( false )
 {
-    DEBUG_BLOCK
 }
 
-SmartPointerList::~SmartPointerList()
+template<typename T> 
+SmartPointerList<T>::~SmartPointerList()
 {
-    DEBUG_BLOCK
+    if( m_remover && m_ownsRemover )
+    {
+        m_remover->deleteLater();
+    }
 }
 
-
+template<typename T> 
 void
-SmartPointerList::addPointer( QObject* pointer )
+SmartPointerList<T>::append( const T& pointer )
 {
     DEBUG_BLOCK
 
     debug() << "Adding Pointer: " << pointer;
     debug() << "Current size of list: " << size();
-    
-    connect( pointer, SIGNAL( destroyed( QObject* ) ), SLOT( removePointer( QObject* \
                ) ) );
-    append( pointer );
+    if( m_remover )
+        QObject::connect( pointer, SIGNAL( destroyed( QObject* ) ), m_remover, \
SLOT(removePointer(QObject*)) ); +    else
+        warning() << "The remover has been deleted.";
+    QList<T>::append( pointer );
 }
 
+template<typename T>
+SmartPointerListRemover<T>::SmartPointerListRemover( QList<T>* list )
+    : QObject( 0 )
+    , m_list( list )
+{ 
+}
+
+template<typename T>
+SmartPointerListRemover<T>::~SmartPointerListRemover()
+{
+}
+
+template<typename T>
 void
-SmartPointerList::removePointer( QObject* pointer ) // SLOT
+SmartPointerListRemover<T>::removePointer( QObject* pointer ) // SLOT
 {
     DEBUG_BLOCK
+    m_list->removeAll( qobject_cast<T>( pointer ) );
+}
 
-    debug() << "Current size of list: " << size();
+//moc doesn't like templates
+//the following is just a copy-and-paste out of a Qt 4.5 moc, 
+//adapted to templates
 
-    removeAll( pointer );
-}
+QT_BEGIN_MOC_NAMESPACE
+static const uint qt_meta_data_SmartPointerListRemover[] = {
 
+ // content:
+       2,       // revision
+       0,       // classname
+       0,    0, // classinfo
+       1,   12, // methods  
+       0,    0, // properties
+       0,    0, // enums/sets
+       0,    0, // constructors
 
-#include "SmartPointerList.moc"
+ // slots: signature, parameters, type, tag, flags
+      33,   25,   24,   24, 0x0a,                 
 
+       0        // eod
+};                    
+
+static const char qt_meta_stringdata_SmartPointerListRemover[] = {
+    "SmartPointerListRemover\0\0pointer\0"
+    "removePointer(QObject*)\0"
+};
+template<typename T>
+const QMetaObject SmartPointerListRemover<T>::staticMetaObject = {
+    { &QObject::staticMetaObject, qt_meta_stringdata_SmartPointerListRemover,
+      qt_meta_data_SmartPointerListRemover, 0 }
+};
+template<typename T>
+const QMetaObject *SmartPointerListRemover<T>::metaObject() const
+{
+    return &staticMetaObject;
+}
+template<typename T>
+void *SmartPointerListRemover<T>::qt_metacast(const char *_clname)
+{
+    if (!_clname) return 0;
+    if (!strcmp(_clname, qt_meta_stringdata_SmartPointerListRemover))
+        return static_cast<void*>(const_cast< SmartPointerListRemover*>(this));
+    return QObject::qt_metacast(_clname);
+}
+template<typename T>
+int SmartPointerListRemover<T>::qt_metacall(QMetaObject::Call _c, int _id, void \
**_a) +{
+    _id = QObject::qt_metacall(_c, _id, _a);
+    if (_id < 0)
+        return _id;
+    if (_c == QMetaObject::InvokeMetaMethod) {
+        switch (_id) {
+        case 0: removePointer((*reinterpret_cast< QObject*(*)>(_a[1]))); break;
+        default: ;
+        }
+        _id -= 1;
+    }
+    return _id;
+}
+QT_END_MOC_NAMESPACE
+
--- trunk/extragear/multimedia/amarok/src/SmartPointerList.h #929527:929528
@@ -1,5 +1,6 @@
 /***************************************************************************
  *   Copyright (c) 2009 Mark Kretschmann <kretschmann@kde.org>             *
+ *             (c) 2009 Ian Monroe <ian@monroe.nu>                         *
  *                                                                         *
  *   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  *
@@ -22,25 +23,61 @@
 
 #include <QList>    // baseclass
 #include <QObject>  // baseclass
+#include <QPointer>
 
+#include "amarok_export.h"
+
+template<typename T>
+class SmartPointerListRemover;
+
+
 /**
     A QList for storing pointers to QObjects, that automatically removes the \
pointers when objects are deleted.  @author Mark Kretschmann <kretschmann@kde.org> 
 */
 
-class SmartPointerList : public QObject, public QList<QObject*>
+template<typename T>
+class AMAROK_EXPORT SmartPointerList : private QList<T>
 {
-    Q_OBJECT
+    public:
+        SmartPointerList();
+        SmartPointerList( const SmartPointerList<T>& ); //only use for temp vars
+        ~SmartPointerList();
+        void append( const T& pointer );
 
-public:
-    SmartPointerList( QObject* parent = 0 );
-    ~SmartPointerList();
+        using QList<T>::count;
+        using QList<T>::size;
+        using QList<T>::const_iterator;
+        using QList<T>::begin;
+        using QList<T>::end;
+        using QList<T>::at;
+        using QList<T>::value;
+        
+        using QList<T>::clear; //no reason to bother disconnecting
+    private:
+        QPointer<SmartPointerListRemover<T> > m_remover;
+        bool m_ownsRemover; //under the theory that copy constructors are used in
+                            //'foreach' constructs and are quite temporary
+};
 
-    void addPointer( QObject* pointer );
+template<typename T>
+class SmartPointerListRemover : public QObject
+{
+    public: //Q_OBJECT
+        static const QMetaObject staticMetaObject;
+        virtual const QMetaObject *metaObject() const;
+        virtual void *qt_metacast(const char *);
+        virtual int qt_metacall(QMetaObject::Call, int, void **);
 
-protected Q_SLOTS:
-    void removePointer( QObject* pointer ); 
+    public:
+        SmartPointerListRemover( QList<T>* list );
+        ~SmartPointerListRemover();
+    public Q_SLOTS:
+        void removePointer( QObject* pointer ); 
+    private:
+        QList<T>* m_list;
 };
 
+#include "SmartPointerList.cpp"
 
 #endif
--- trunk/extragear/multimedia/amarok/src/Systray.cpp #929527:929528
@@ -398,15 +398,15 @@
 void
 Amarok::TrayIcon::setupMenu()
 {
-    for( int i = 0; i < m_extraActions.size(); i ++ )
-        contextMenu()->removeAction( (QAction*) m_extraActions[i] );
+    foreach( QAction* action, m_extraActions )
+        contextMenu()->removeAction( action );
 
     if( !m_track )
         return;
 
     m_extraActions.clear();
     foreach( QAction *action, The::globalCurrentTrackActions()->actions() )
-        m_extraActions.addPointer( action );
+        m_extraActions.append( action );
 
     if ( m_track->hasCapabilityInterface( Meta::Capability::CurrentTrackActions ) )
     {
@@ -415,7 +415,7 @@
         {
             QList<PopupDropperAction *> currentTrackActions = cac->customActions();
             foreach( PopupDropperAction *action, currentTrackActions )
-                m_extraActions.addPointer( action );
+                m_extraActions.append( action );
         }
     }
 
@@ -425,8 +425,8 @@
         contextMenu()->removeAction( actionCollection()->action( "file_quit" ) );
         contextMenu()->removeAction( actionCollection()->action( "minimizeRestore" ) \
);  
-        for( int i = 0; i < m_extraActions.size(); i ++ )
-            contextMenu()->addAction( (QAction*) m_extraActions[i] );
+    foreach( QAction* action, m_extraActions )
+            contextMenu()->addAction( action );
 
         contextMenu()->addSeparator();
 
--- trunk/extragear/multimedia/amarok/src/Systray.h #929527:929528
@@ -68,7 +68,7 @@
 
     QPixmap m_baseIcon, m_grayedIcon, m_icon;
     QPixmap m_playOverlay, m_pauseOverlay;
-    SmartPointerList m_extraActions;
+    SmartPointerList<QAction*> m_extraActions;
 };
 
 }
--- trunk/extragear/multimedia/amarok/src/widgets/MainToolbar.cpp #929527:929528
@@ -125,12 +125,8 @@
 
 void MainToolbar::handleAddActions()
 {
-#if 0
-    foreach( QObject* action, m_additionalActions )
-        m_addControlsToolbar->removeAction( (QAction*) action );
-#endif
-    for( int i = 0; i < m_additionalActions.size(); i++ )
-        m_addControlsToolbar->removeAction( (QAction*) m_additionalActions[i] );
+    foreach( QAction* action, m_additionalActions )
+        m_addControlsToolbar->removeAction( action );
 
     m_additionalActions.clear();
 
@@ -147,7 +143,7 @@
         {
             QList<PopupDropperAction *> currentTrackActions = cac->customActions();
             foreach( PopupDropperAction *action, currentTrackActions )
-                m_additionalActions.addPointer( action );
+                m_additionalActions.append( action );
 
             m_addControlsToolbar->adjustSize();
 
@@ -156,12 +152,8 @@
         }
     }
 
-    for( int i = 0; i < m_additionalActions.size(); i++ )
-        m_addControlsToolbar->addAction( (QAction*) m_additionalActions[i] );
-#if 0
-    foreach( QObject* action, m_additionalActions )
-        m_addControlsToolbar->addAction( (QAction*) action );
-#endif
+    foreach( QAction* action, m_additionalActions )
+        m_addControlsToolbar->addAction( action );
 
     repaint ( 0, 0, -1, -1 ); // make sure that the add info area is shown or hidden \
at once.  }
--- trunk/extragear/multimedia/amarok/src/widgets/MainToolbar.h #929527:929528
@@ -64,7 +64,7 @@
     int m_addActionsOffsetX;
     bool m_ignoreCache;
 
-    SmartPointerList m_additionalActions;
+    SmartPointerList<QAction*> m_additionalActions;
 };
 
 #endif


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic