Ticket #482: tree-sorting.patch

File tree-sorting.patch, 5.7 KB (added by eskil <myth@…>, 7 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