Ticket #482: tree-sorting.patch

File tree-sorting.patch, 5.7 KB (added by eskil <myth@…>, 14 years ago)

Patch to switch from bubblesort to QPtrList::sort

  • mythplugins/mythmusic/mythmusic/metadata.cpp

     
    809809{
    810810    root_node->sort();
    811811
    812     bool something_changed;
    813     QString Title1;
    814     QString Title2;
    815    
    816812    //  sort top level nodes
    817813   
    818     something_changed = false;
    819     if(top_nodes.count() > 1)
    820     {
    821         something_changed = true;
    822     }
    823     while(something_changed)
    824     {
    825         something_changed = false;
    826         for(uint i = 0; i < top_nodes.count() - 1;)
    827         {
    828             Title1 = top_nodes.at(i)->getTitle().lower();
    829             Title2 = top_nodes.at(i+1)->getTitle().lower();
    830 
    831             if (Title1.left(4) == thePrefix)
    832                 Title1 = Title1.mid(4);
    833             if (Title2.left(4) == thePrefix)
    834                 Title2 = Title2.mid(4);
    835            
    836             if(qstrcmp(Title1, Title2) > 0)
    837             {
    838                 something_changed = true;
    839                 MusicNode *temp = top_nodes.take(i + 1);
    840                 top_nodes.insert(i, temp);
    841             }
    842             else
    843             {
    844                 ++i;
    845             }
    846         }
    847     }
     814    top_nodes.sort ();
    848815   
    849816    //  tell top level nodes to sort from themselves
    850817    //  downwards
     
    14001367
    14011368void MusicNode::sort()
    14021369{
    1403     bool something_changed;
    1404     QString Title1, Title2;
    1405 
    14061370    //  Sort any tracks
    14071371   
    1408     something_changed = false;
    1409     if(my_tracks.count() > 1)
    1410     {
    1411         something_changed = true;
    1412     }
    1413     while(something_changed)
    1414     {
    1415         something_changed = false;
    1416         for(uint i = 0; i < my_tracks.count() - 1;)
    1417         {
    1418             if(my_tracks.at(i)->Track() > my_tracks.at(i+1)->Track())
    1419             {
    1420                 something_changed = true;
    1421                 Metadata *temp = my_tracks.take(i + 1);
    1422                 my_tracks.insert(i, temp);
    1423             }
    1424             else
    1425             {
    1426                 ++i;
    1427             }
    1428         }
    1429     }
     1372    my_tracks.sort ();
    14301373
    14311374    //  Sort any subnodes
    1432    
    1433     something_changed = false;
    1434     if(my_subnodes.count() > 1)
    1435     {
    1436         something_changed = true;
    1437     }
    1438     while(something_changed)
    1439     {
    1440         something_changed = false;
    1441         for(uint i = 0; i < my_subnodes.count() - 1;)
    1442         {
    1443             Title1 = my_subnodes.at(i)->getTitle().lower();
    1444             Title2 = my_subnodes.at(i+1)->getTitle().lower();
    14451375
    1446             if (Title1.left(4) == thePrefix)
    1447                 Title1 = Title1.mid(4);
    1448             if (Title2.left(4) == thePrefix)
    1449                 Title2 = Title2.mid(4);
    1450 
    1451             if(qstrcmp(Title1, Title2) > 0)
    1452             {
    1453                 something_changed = true;
    1454                 MusicNode *temp = my_subnodes.take(i + 1);
    1455                 my_subnodes.insert(i, temp);
    1456             }
    1457             else
    1458             {
    1459                 ++i;
    1460             }
    1461         }
    1462     }
     1376    my_subnodes.sort ();
    14631377   
    14641378    //  Tell any subnodes to sort themselves
    14651379
     
    15031417    }
    15041418}
    15051419
     1420/*********************************************************************************/
     1421
     1422MetadataPtrList::MetadataPtrList () {
     1423}
     1424
     1425MetadataPtrList::~MetadataPtrList () {
     1426}
     1427
     1428int MetadataPtrList::compareItems (QPtrCollection::Item item1,
     1429                                   QPtrCollection::Item item2) {
     1430    Metadata *itemA = (Metadata*)item1;
     1431    Metadata *itemB = (Metadata*)item2;
     1432
     1433    int trackA = itemA->Track ();
     1434    int trackB = itemB->Track ();
     1435
     1436    if (trackA > trackB)
     1437        return 1;
     1438
     1439    if (trackA < trackB)
     1440        return -1;
     1441
     1442    return 0;
     1443}
     1444
     1445/*********************************************************************************/
     1446
     1447MusicNodePtrList::MusicNodePtrList () {
     1448}
     1449
     1450MusicNodePtrList::~MusicNodePtrList () {
     1451}
     1452
     1453int MusicNodePtrList::compareItems (QPtrCollection::Item item1,
     1454                                    QPtrCollection::Item item2) {
     1455    MusicNode *itemA = (MusicNode*)item1;
     1456    MusicNode *itemB = (MusicNode*)item2;
     1457
     1458    QString title1 = itemA->getTitle().lower();
     1459    QString title2 = itemB->getTitle().lower();
     1460   
     1461    if (title1.left(4) == thePrefix)
     1462        title1 = title1.mid(4);
     1463    if (title2.left(4) == thePrefix)
     1464        title2 = title2.mid(4);
     1465
     1466    return qstrcmp(title1, title2);
     1467}
  • mythplugins/mythmusic/mythmusic/metadata.h

     
    170170bool operator==(const Metadata& a, const Metadata& b);
    171171bool operator!=(const Metadata& a, const Metadata& b);
    172172
     173class MetadataPtrList : public QPtrList<Metadata> {
     174  public:
     175    MetadataPtrList ();
     176    virtual ~MetadataPtrList ();
     177  protected:
     178    virtual int compareItems (QPtrCollection::Item item1, QPtrCollection::Item item2);
     179};
     180
     181class MusicNode;
     182class MusicNodePtrList : public QPtrList<MusicNode> {
     183  public:
     184    MusicNodePtrList ();
     185    virtual ~MusicNodePtrList ();
     186  protected:
     187    virtual int compareItems (QPtrCollection::Item item1, QPtrCollection::Item item2);
     188};
     189
    173190class MusicNode
    174191{
    175192    //  Not a root of the music tree, and
     
    199216 
    200217  private:
    201218 
    202     QPtrList<Metadata>  my_tracks;
    203     QPtrList<MusicNode> my_subnodes;
     219    MetadataPtrList     my_tracks;
     220    MusicNodePtrList    my_subnodes;
    204221    QString             my_title;
    205222    QString             my_level;
    206223
     
    267284   
    268285  private:
    269286 
    270     QPtrList<Metadata>  all_music;
    271     QPtrList<MusicNode> top_nodes;
     287    MetadataPtrList     all_music;
     288    MusicNodePtrList    top_nodes;
    272289    MusicNode           *root_node;
    273290   
    274291