summaryrefslogtreecommitdiff
path: root/list.c
diff options
context:
space:
mode:
Diffstat (limited to 'list.c')
-rw-r--r--list.c221
1 files changed, 221 insertions, 0 deletions
diff --git a/list.c b/list.c
new file mode 100644
index 0000000..a96b70b
--- /dev/null
+++ b/list.c
@@ -0,0 +1,221 @@
+/*
+ * Image plugin to VDR (C++)
+ *
+ * (C) 2004 A. Brachold <vdr04-at-deltab.de>
+ *
+ * This code 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 code 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.
+ * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <string.h>
+
+#include "list.h"
+#include "data-image.h"
+#include "setup-image.h"
+
+#include <vdr/tools.h>
+
+cActivSlideShow theSlideShow;
+
+cActivSlideShow::cActivSlideShow()
+: m_pCurSlideShow(NULL)
+, m_nCurrentImage(0)
+, m_nTotalImages(0)
+, m_pCurImage(NULL)
+{
+
+}
+
+void cActivSlideShow::Remove(cFileSource* src){
+
+ if(m_pCurSlideShow) {
+ cImage* p = m_pCurSlideShow->cList < cImage >::First();
+ while (p) {
+ if(p->CompareBaseDir(src)) {
+ bool bRemoveCurrent = (m_pCurImage == p);
+ m_pCurSlideShow->cList < cImage >::Del(p);
+ p = m_pCurSlideShow->cList < cImage >::First();
+ if(bRemoveCurrent) {
+ m_nCurrentImage = 1;
+ m_pCurImage = p;
+ }
+ } else {
+ p = m_pCurSlideShow->cList < cImage >::Next(p);
+ }
+ }
+ m_nTotalImages = m_pCurSlideShow->cList < cImage >::Count();
+ }
+}
+
+void cActivSlideShow::Assign(cSlideShow *pCurSlideShow)
+{
+ Shutdown();
+ m_nCurrentImage = 0;
+ m_nTotalImages = 0;
+ m_pCurSlideShow = pCurSlideShow;
+ if(m_pCurSlideShow) {
+
+ m_nTotalImages = m_pCurSlideShow->Count();
+ // get real Index of FirstImage
+ unsigned int i = 0;
+ bool bFound = false;
+ if(m_pCurSlideShow->FirstImage()) {
+
+ cImage* p = m_pCurSlideShow->cList < cImage >::First();
+
+ for (;p && i < m_nTotalImages; ++i) {
+ // find out first image
+ if(0 == strcmp(::basename(p->Name()),m_pCurSlideShow->FirstImage())) {
+ m_pCurImage = p;
+ bFound = true;
+ break;
+ }
+ p = m_pCurSlideShow->cList < cImage >::Next(p);
+ }
+ }
+ if(bFound) {
+ m_nCurrentImage = i+1;
+ }
+ else {
+ m_pCurImage = m_pCurSlideShow->cList < cImage >::First();
+ m_nCurrentImage = 1;
+ }
+ }
+}
+
+void cActivSlideShow::Shutdown(void)
+{
+ if(m_pCurSlideShow) {
+ delete m_pCurSlideShow;
+ m_pCurSlideShow = 0;
+ m_pCurImage = 0;
+ m_nCurrentImage = 0;
+ m_nTotalImages = 0;
+ }
+}
+
+cSlideShow *cActivSlideShow::SlideShow(void)
+{
+ return m_pCurSlideShow;
+}
+
+
+cImage* cActivSlideShow::GetImage()
+{
+ return m_pCurSlideShow?m_pCurImage:NULL;
+}
+
+
+bool cActivSlideShow::NextImage(int nOffset)
+{
+ if(m_pCurImage && m_nCurrentImage < m_nTotalImages) {
+ cImage *pNewActiv;
+ for (int i = 0; (i < nOffset) && (m_nCurrentImage < m_nTotalImages); ++i) {
+ pNewActiv = m_pCurSlideShow->cList < cImage >::Next(m_pCurImage);
+ m_pCurImage = pNewActiv;
+ ++m_nCurrentImage;
+ }
+ return m_pCurImage != NULL;
+ }
+ else if(ImageSetup.AutoRepeat) {
+ cImage *pNewActiv;
+
+ pNewActiv = m_pCurSlideShow->cList < cImage >::First();
+ m_pCurImage = pNewActiv;
+ m_nCurrentImage = 1;
+
+ return m_pCurImage != NULL;
+ }
+ return false;
+}
+
+
+
+bool cActivSlideShow::PrevImage(int nOffset)
+{
+ if(m_pCurImage && m_nCurrentImage > 1) {
+ cImage *pNewActiv;
+
+ for (int i = 0; (i < nOffset) && (m_nCurrentImage > 1); ++i) {
+ pNewActiv = m_pCurSlideShow->cList < cImage >::Prev(m_pCurImage);
+ m_pCurImage = pNewActiv;
+ --m_nCurrentImage;
+ }
+ return m_pCurImage != NULL;
+ }
+ else if(ImageSetup.AutoRepeat) {
+ cImage *pNewActiv;
+
+ pNewActiv = m_pCurSlideShow->cList < cImage >::Last();
+ m_pCurImage = pNewActiv;
+ m_nCurrentImage = m_nTotalImages;
+ return m_pCurImage != NULL;
+ }
+ return false;
+}
+
+
+bool cActivSlideShow::GotoImage(unsigned int nNewPictureIndex)
+{
+ if(m_pCurImage && nNewPictureIndex > 0 && nNewPictureIndex < m_nTotalImages) {
+ cImage *pNewActiv;
+ pNewActiv = m_pCurSlideShow->cList < cImage >::First();
+ m_pCurImage = pNewActiv;
+ m_nCurrentImage = 0;
+ for (unsigned int i = 0; i < nNewPictureIndex; ++i) {
+ pNewActiv = m_pCurSlideShow->cList < cImage >::Next(m_pCurImage);
+ m_pCurImage = pNewActiv;
+ ++m_nCurrentImage;
+ }
+ return m_pCurImage != NULL;
+ }
+ return false;
+}
+
+int cActivSlideShow::GetJumpNames(int nOffset,cImage* pImage[],const unsigned int nMAX_BILDER)
+{
+ unsigned int i;
+ cImage *pNewActiv;
+ int nBilder = 0;
+
+ if(m_pCurImage && m_nCurrentImage > 0) {
+
+ int nJumpFirst = m_nCurrentImage + nOffset;
+
+ if(nJumpFirst > ((int)(m_nTotalImages - nMAX_BILDER + 1)))
+ nJumpFirst = ((int)(m_nTotalImages - nMAX_BILDER + 1));
+ if(nJumpFirst < 1)
+ nJumpFirst = 1;
+
+ m_nCurrentImage = nJumpFirst;
+ if(m_nCurrentImage > m_nTotalImages)
+ m_nCurrentImage = m_nTotalImages;
+ if(m_nCurrentImage < 1)
+ m_nCurrentImage = 1;
+
+ pNewActiv = m_pCurSlideShow->cList < cImage >::First();
+ for (int n = 1; n < nJumpFirst && pNewActiv; ++n)
+ pNewActiv = m_pCurSlideShow->cList < cImage >::Next(pNewActiv);
+ for (i = 0; (i < nMAX_BILDER) && ((nJumpFirst + i) <= m_nTotalImages) && pNewActiv; ++i,++nBilder) {
+
+ pImage[i] = pNewActiv;
+ dsyslog("imageplugin: File%d: %s", i, pNewActiv->Name());
+ if((nJumpFirst + i) == m_nCurrentImage)
+ m_pCurImage = pNewActiv;
+ pNewActiv = m_pCurSlideShow->cList < cImage >::Next(pNewActiv);
+ }
+ }
+ return nBilder;
+}