summaryrefslogtreecommitdiffstats
path: root/kmid/songlist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmid/songlist.cpp')
-rw-r--r--kmid/songlist.cpp247
1 files changed, 247 insertions, 0 deletions
diff --git a/kmid/songlist.cpp b/kmid/songlist.cpp
new file mode 100644
index 00000000..8d98600c
--- /dev/null
+++ b/kmid/songlist.cpp
@@ -0,0 +1,247 @@
+/**************************************************************************
+
+ songlist.cc - class SongList, which holds a list of songs (collection)
+ Copyright (C) 1997,98 Antonio Larrosa Jimenez
+
+ 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
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Send comments and bug fixes to larrosa@kde.org
+ or to Antonio Larrosa, Rio Arnoya, 10 5B, 29006 Malaga, Spain
+
+***************************************************************************/
+#include "songlist.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+SongList::SongList(void)
+{
+ list=NULL;
+ last=NULL;
+ active=NULL;
+ ntotal=0;
+}
+
+SongList::SongList(SongList &src)
+{
+ list=last=active=NULL;
+ ntotal=0;
+ src.iteratorStart();
+ while (!src.iteratorAtEnd())
+ {
+ AddSong(src.getIteratorName());
+ src.iteratorNext();
+ }
+ if (src.active!=NULL) active=getSongid(src.active->id);
+}
+
+SongList::~SongList()
+{
+ clean();
+ Song *ptr=list;
+ active=last=NULL;
+ ntotal=0;
+
+ while (ptr!=NULL)
+ {
+ list=ptr->next;
+ delete ptr->name;
+ delete ptr;
+ ptr=list;
+ }
+
+}
+
+SongList::Song *SongList::getSongid(int id)
+{
+ Song *ptr=list;
+ while ((ptr!=NULL)&&(ptr->id!=id))
+ ptr=ptr->next;
+
+ return ptr;
+}
+
+int SongList::AddSong(const char *song)
+{
+ if (!song) return 0;
+
+ if (last==NULL)
+ {
+ last=new Song;
+ list=last;
+ }
+ else
+ {
+ last->next=new Song;
+ last=last->next;
+ }
+ last->name=new char[strlen(song)+1];
+ strcpy(last->name,song);
+ last->id= ++ntotal;
+ last->next=NULL;
+ if (active==NULL) active=last;
+ return last->id;
+}
+
+void SongList::DelSong(int id)
+{
+ Song *ptr;
+
+ if (list==NULL) return;
+ if (id==1)
+ {
+ if (last->id==1)
+ {
+ list=last=active=NULL;
+ ntotal=0;
+ }
+ else
+ {
+ ptr=list;
+ if (active->id==1) active=list->next;
+ list=list->next;
+ delete ptr->name;
+ delete ptr;
+ ntotal--;
+
+ regenerateid(list,1);
+ }
+ return;
+ }
+ Song *ptr_prev=getSongid(id-1);
+ ptr=ptr_prev->next;
+ if (last->id==id) last=ptr_prev;
+ if (active->id==id)
+ if (active->next!=NULL) active=active->next;
+ else active=ptr_prev;
+
+ ntotal--;
+ ptr_prev->next=ptr->next;
+ delete ptr->name;
+ delete ptr;
+ regenerateid(ptr_prev->next,id);
+
+}
+
+void SongList::regenerateid(Song *song,int id)
+{
+ Song *tmp=song;
+ int i=id;
+ while (tmp!=NULL)
+ {
+ tmp->id=i++;
+ tmp=tmp->next;
+ }
+ ntotal=i-1;
+}
+
+void SongList::setActiveSong(int id)
+{
+ Song *tmp=getSongid(id);
+ if (tmp!=NULL) active=tmp;
+}
+
+char *SongList::getName(int id)
+{
+ Song *tmp=getSongid(id);
+ if (tmp!=NULL) return tmp->name;
+ return NULL;
+}
+
+/*
+void SongList::saveList(FILE *fh)
+{
+ Song *ptr=list;
+ while (ptr!=NULL)
+ {
+ fputs(fh,ptr->name);
+ ptr=ptr->next;
+ }
+}
+*/
+
+void SongList::iteratorStart(void)
+{
+ it=list;
+}
+
+void SongList::iteratorNext(void)
+{
+ if (it!=NULL) it=it->next;
+}
+
+int SongList::getIteratorID(void)
+{
+ if (it==NULL) return -1;
+ return it->id;
+}
+
+char *SongList::getIteratorName(void)
+{
+ if (it==NULL) return NULL;
+ return it->name;
+}
+
+
+void SongList::clean(void)
+{
+ Song *tmp=list;
+ active=last=NULL;
+ ntotal=0;
+
+ while (tmp!=NULL)
+ {
+ list=tmp->next;
+ delete [] tmp->name;
+ delete tmp;
+ tmp=list;
+ }
+}
+
+void SongList::copy(SongList &src)
+{
+ clean();
+ src.iteratorStart();
+ while (!src.iteratorAtEnd())
+ {
+ AddSong(src.getIteratorName());
+ src.iteratorNext();
+ }
+ if (src.active!=NULL) active=getSongid(src.active->id);
+}
+
+int SongList::next(void)
+{
+ if (list==NULL) {active=NULL;return 0;};
+ if (active!=NULL) active=active->next;
+ if (active==NULL)
+ {
+ Song *tmp=list;
+ while (tmp->next!=NULL) tmp=tmp->next;
+ active=tmp;
+ return 0;
+ }
+ return 1;
+}
+
+
+void SongList::previous(void)
+{
+ if (list==NULL) {active=NULL;return;};
+ Song *tmp=list;
+ while ((tmp->next!=NULL)&&(tmp->next->id!=active->id)) tmp=tmp->next;
+ if (tmp->next==NULL) {active=list;return;};
+ active=tmp;
+}