diff --git a/dir_iterator/diriterator.cpp b/dir_iterator/diriterator.cpp new file mode 100644 index 0000000..2931929 --- /dev/null +++ b/dir_iterator/diriterator.cpp @@ -0,0 +1,109 @@ +/** + * This file is a part of Promoe, an XMMS2 Client. + * + * Copyright (C) 2010 XMMS2 Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + */ + +#include "diriterator.h" + +#include + +#include + +DirIterator::DirIterator (const QDir & dir) +{ + m_dir = dir; + finish_init (); +} + +DirIterator::DirIterator (const QString & path) +{ + m_dir = QDir (path); +} + +DirIterator::~DirIterator () +{ + if (m_device != 0) + delete m_device; +} + +void +DirIterator::finish_init () +{ + if (!m_dir.exists ()) { + m_exists = false; + return; + } + + m_exists = true; + m_current = -1; + entryList = m_dir.entryList (); + m_device = 0; +} + +QString +DirIterator::next () +{ + if (!m_exists || (m_current +1) >= entryList.size ()) + return QString(); + + m_current++; + + if (m_device != 0) { + m_device->close (); + delete m_device; + m_device = 0; + } + + return entryList.at (m_current); +} + +bool +DirIterator::hasNext () +{ + return (m_exists && ((m_current +1) < entryList.size ())); +} + +QString +DirIterator::pathName () +{ + if (!m_exists || m_current >= entryList.size ()) + return QString (); + + return entryList.at (m_current); +} + +QPointer +DirIterator::entry () +{ + if (!m_exists || m_current >= entryList.size ()) + return 0; + + if (m_device != 0) { + if (m_device->isOpen ()) { + return m_device; + } else { + return 0; + } + } + + m_device = new QFile (m_dir.absoluteFilePath (entryList.at (m_current))); + if (!m_device->open (QIODevice::ReadOnly)) { + qDebug() << entryList.at (m_current); + return 0; + } + + return m_device; +} + +#include "diriterator.moc" diff --git a/dir_iterator/diriterator.h b/dir_iterator/diriterator.h new file mode 100644 index 0000000..740dc75 --- /dev/null +++ b/dir_iterator/diriterator.h @@ -0,0 +1,53 @@ +/** + * This file is a part of Promoe, an XMMS2 Client. + * + * Copyright (C) 2010 XMMS2 Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + */ + +#ifndef __DIRITERATOR_H__ +#define __DIRITERATOR_H__ + +#include "diriteratorbase.h" + +#include +#include +#include + + +class DirIterator : public QObject, public virtual DirIteratorBase +{ + Q_OBJECT + +public: + DirIterator (const QDir & dir); + DirIterator (const QString & path); + virtual ~DirIterator (); + + virtual QString next (); + virtual QString pathName (); + virtual bool hasNext (); + + virtual QPointer entry (); + +private: + void finish_init (); + + bool m_exists; + int m_current; + QDir m_dir; + QStringList entryList; + QIODevice * m_device; + +}; + +#endif diff --git a/dir_iterator/diriteratorbase.cpp b/dir_iterator/diriteratorbase.cpp new file mode 100644 index 0000000..4d8114b --- /dev/null +++ b/dir_iterator/diriteratorbase.cpp @@ -0,0 +1,37 @@ +/** + * This file is a part of Promoe, an XMMS2 Client. + * + * Copyright (C) 2010 XMMS2 Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + */ + +#include "diriteratorbase.h" +#include + +#include + +QPixmap +DirIteratorBase::pixmapEntry () +{ + QPointer d = entry (); + if (d == 0) { + return QPixmap (); + } + + QByteArray a = d->readAll (); + + QPixmap p; + p.loadFromData(a); + + return p; +} + diff --git a/dir_iterator/diriteratorbase.h b/dir_iterator/diriteratorbase.h new file mode 100644 index 0000000..34c20da --- /dev/null +++ b/dir_iterator/diriteratorbase.h @@ -0,0 +1,43 @@ +/** + * This file is a part of Promoe, an XMMS2 Client. + * + * Copyright (C) 2010 XMMS2 Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + */ + +#ifndef __DIRITERATORBASE_H__ +#define __DIRITERATIRBASE_H__ + +#include +#include +#include +#include + +class DirIteratorBase +{ +public: + virtual ~DirIteratorBase () {} + + virtual QString next () = 0; + virtual QString pathName () = 0; + virtual bool hasNext () = 0; + + virtual QPointer entry () = 0; + + // Included because I'm lazy, returns a QPixmap for the current entry. + // If no pixmap can be createt for the current entry, an empty pixmap is + // returned + QPixmap pixmapEntry (); + +}; + +#endif diff --git a/dir_iterator/wscript b/dir_iterator/wscript new file mode 100644 index 0000000..a1ee7cb --- /dev/null +++ b/dir_iterator/wscript @@ -0,0 +1,55 @@ +# encoding: utf-8 +# vim:set syntax=python expandtab : + +""" +This file is a part of Promoe, an XMMS2 Client + +Copyright (C) 2009-2010 XMMS2 Team + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +""" + +lib_source = """ + diriteratorbase.cpp + diriterator.cpp + """ + + +def set_options(opt): + pass +def configure(conf): + pass +def build(bld): + obj = bld.new_task_gen(features='qt4 cstaticlib cxx') + obj.target = 'dir_iterator' + obj.install_path = 0 # Don't install + obj.includes = '.' + obj.source = lib_source + obj.uselib = 'QTCORE QTGUI' + obj.export_incdirs = '.' + pass + diff --git a/src/skin/skin.cpp b/src/skin/skin.cpp index 19fa433..fd99558 100644 --- a/src/skin/skin.cpp +++ b/src/skin/skin.cpp @@ -15,10 +15,14 @@ #include "skin.h" +#include "diriterator.h" + #include #include #include +#include + Skin::Skin (const QString &url) { setSizes (); @@ -657,65 +661,62 @@ Skin::setSkin (const QString& path) QPixmap p_numbers; QPixmap p_volume; - dir.setFilter (QDir::Files|QDir::NoDotAndDotDot); - QStringList entries = dir.entryList (); - for (int i = 0; i < entries.size (); i++) { - QString filename = entries.at (i); - QString entry = filename.toLower (); + DirIterator *iter = new DirIterator(dir); + + while (iter->hasNext ()) { + QString entry = iter->next ().toLower (); if (entry.endsWith (".txt")) { - QFile f (dir.absoluteFilePath (filename)); - if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) + QPointer d = iter->entry (); + if (d == 0) continue; + d->setTextModeEnabled (true); if ( entry == "pledit.txt") { - b_pledit_txt = handle_pledit_txt (&f); + b_pledit_txt = handle_pledit_txt (d); } continue; } else if (entry.endsWith (".cur")) { // Cursor files are not supported yet continue; } else { - QPixmap img = QPixmap (dir.absoluteFilePath (filename)); - if (img.isNull ()) { - continue; - } - entry = entry.section(".", 0, 0); if (entry == "main") { - b_main = handle_main (img); + b_main = handle_main (iter->pixmapEntry ()); } else if (entry == "titlebar") { - b_titlebar = handle_titlebar (img); + b_titlebar = handle_titlebar (iter->pixmapEntry ()); } else if (entry == "posbar" ) { - b_posbar = handle_posbar (img); + b_posbar = handle_posbar (iter->pixmapEntry ()); } else if (entry == "volume") { - p_volume = img; - b_volume = handle_volume (img); + p_volume = iter->pixmapEntry (); + b_volume = handle_volume (p_volume); } else if (entry == "balance") { - b_balance = handle_balance (img); + b_balance = handle_balance (iter->pixmapEntry ()); } else if (entry == "cbuttons") { - b_cbuttons = handle_cbuttons (img); + b_cbuttons = handle_cbuttons (iter->pixmapEntry ()); } else if (entry == "monoster") { - b_monoster = handle_monoster (img); + b_monoster = handle_monoster (iter->pixmapEntry ()); } else if (entry == "playpaus") { - b_playpaus = handle_playpaus (img); + b_playpaus = handle_playpaus (iter->pixmapEntry ()); } else if (entry == "shufrep") { - b_shufrep = handle_shufrep (img); + b_shufrep = handle_shufrep (iter->pixmapEntry ()); } else if (entry == "text") { - b_text = handle_text (img); + b_text = handle_text (iter->pixmapEntry ()); } else if (entry == "nums_ex") { - b_numbers = handle_numbers (img); + b_numbers = handle_numbers (iter->pixmapEntry ()); } else if (entry == "numbers") { - p_numbers = img; + p_numbers = iter->pixmapEntry (); } else if (entry == "eqmain") { - b_eqmain = handle_eqmain (img); + b_eqmain = handle_eqmain (iter->pixmapEntry ()); } else if (entry == "eq_ex") { - p_eq_ex = img; + p_eq_ex = iter->pixmapEntry (); } else if (entry == "pledit") { - b_pledit = handle_pledit (img); + b_pledit = handle_pledit (iter->pixmapEntry ()); } continue; } } + delete iter; + if (!b_balance) { // Fallback, use volume image if skin has no balance image handle_balance (p_volume); diff --git a/src/wscript b/src/wscript index 0e7a3cd..a0b3329 100644 --- a/src/wscript +++ b/src/wscript @@ -4,7 +4,7 @@ """ This file is a part of Promoe, an XMMS2 Client -Copyright (C) 2009 XMMS2 Team +Copyright (C) 2009-2010 XMMS2 Team Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -97,7 +97,7 @@ def build(bld): obj.target = 'promoe' obj.includes = incdirs obj.source = sources - obj.uselib_local = 'backend_lib' + obj.uselib_local = 'backend_lib dir_iterator' obj.add_objects = 'promoe_data' obj.uselib = 'QTCORE QTGUI AVAHI-CLIENT AVAHI-QT4' pass diff --git a/wscript b/wscript index 604aab4..2370ec7 100644 --- a/wscript +++ b/wscript @@ -4,7 +4,7 @@ """ This file is a part of Promoe, an XMMS2 Client -Copyright (C) 2009 XMMS2 Team +Copyright (C) 2009-2010 XMMS2 Team Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -46,6 +46,7 @@ def set_options(opt): opt.tool_options('qt4') opt.sub_options('backend_xmmsclient++') + opt.sub_options('dir_iterator') opt.sub_options('data') opt.sub_options('src') @@ -67,6 +68,7 @@ def configure(conf): conf.sub_config('backend_xmmsclient++') + conf.sub_config('dir_iterator') conf.sub_config('data') conf.sub_config('src') @@ -77,6 +79,7 @@ def configure(conf): def build(bld): bld.add_subdirs('backend_xmmsclient++') + bld.add_subdirs('dir_iterator') bld.add_subdirs('data') bld.add_subdirs('src')