aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2008-02-12 16:00:29 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2008-02-12 16:00:29 +0000
commit76567654b8759325bfd3b1b4d32ff25ef5974a41 (patch)
tree7c0a3639804ddf6c2efd3ab71441ab6a2ec9a606 /src
parenta9fe5096a37a5f67ca017ea25481066544d5f749 (diff)
downloadqmmp-76567654b8759325bfd3b1b4d32ff25ef5974a41.tar.gz
qmmp-76567654b8759325bfd3b1b4d32ff25ef5974a41.tar.bz2
qmmp-76567654b8759325bfd3b1b4d32ff25ef5974a41.zip
improved skin reading
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@239 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
-rw-r--r--src/ui/configdialog.cpp65
-rw-r--r--src/ui/configdialog.h2
-rw-r--r--src/ui/forms/configdialog.ui17
-rw-r--r--src/ui/skinreader.cpp137
-rw-r--r--src/ui/skinreader.h12
5 files changed, 160 insertions, 73 deletions
diff --git a/src/ui/configdialog.cpp b/src/ui/configdialog.cpp
index 2614fe025..ff232dfc8 100644
--- a/src/ui/configdialog.cpp
+++ b/src/ui/configdialog.cpp
@@ -68,8 +68,8 @@ ConfigDialog::ConfigDialog ( QWidget *parent )
m_skin = Skin::getPointer();
ui.fileDialogComboBox->insertItems(0,FileDialog::registeredFactories());
readSettings();
- SkinReader reader;
- reader.updateCache();
+ m_reader = new SkinReader(this);
+ m_reader->generateThumbs();
loadSkins();
loadPluginsInfo();
loadFonts();
@@ -133,8 +133,17 @@ void ConfigDialog::changePage (QListWidgetItem *current, QListWidgetItem *previo
void ConfigDialog::changeSkin()
{
int row = ui.listWidget->currentRow();
- QString path = m_skinList.at ( row ).canonicalFilePath();
- m_skin->setSkin ( path );
+ QString path;
+ if (m_skinList.at (row).isDir())
+ {
+ path = m_skinList.at (row).canonicalFilePath();
+ m_skin->setSkin (path);
+ }
+ else if (m_skinList.at (row).isFile())
+ {
+ m_reader->unpackSkin(m_skinList.at (row).canonicalFilePath());
+ m_skin->setSkin(QDir::homePath() +"/.qmmp/cache/skin");
+ }
}
void ConfigDialog::loadSkins()
@@ -143,15 +152,22 @@ void ConfigDialog::loadSkins()
QFileInfo fileInfo (":/default");
QPixmap preview = Skin::getPixmap ("main", QDir (fileInfo.filePath()));
QListWidgetItem *item = new QListWidgetItem (fileInfo.fileName ());
- item->setIcon ( preview );
- ui.listWidget->addItem ( item );
+ item->setIcon (preview);
+ ui.listWidget->addItem (item);
m_skinList << fileInfo;
findSkins(QDir::homePath() +"/.qmmp/skins");
- findSkins(QDir::homePath() +"/.qmmp/cache/skins");
findSkins(qApp->applicationDirPath()+"/../share/qmmp/skins");
- connect ( ui.listWidget, SIGNAL ( itemClicked ( QListWidgetItem* ) ),
- this, SLOT ( changeSkin() ) );
+ foreach(QString path, m_reader->skins())
+ {
+ QListWidgetItem *item = new QListWidgetItem (path.section('/', -1));
+ item->setIcon (m_reader->getPreview(path));
+ item->setToolTip(tr("Archived skin") + " " + path);
+ ui.listWidget->addItem (item);
+ m_skinList << QFileInfo(path);
+ }
+ connect (ui.listWidget, SIGNAL (itemClicked (QListWidgetItem *)),
+ this, SLOT (changeSkin()));
}
void ConfigDialog::findSkins(const QString &path)
@@ -163,12 +179,13 @@ void ConfigDialog::findSkins(const QString &path)
return;
foreach (QFileInfo fileInfo, fileList)
{
- QPixmap preview = Skin::getPixmap ( "main", QDir ( fileInfo.filePath() ) );
- if ( !preview.isNull() )
+ QPixmap preview = Skin::getPixmap ("main", QDir(fileInfo.filePath ()));
+ if (!preview.isNull())
{
- QListWidgetItem *item = new QListWidgetItem ( fileInfo.fileName () );
- item->setIcon ( preview );
- ui.listWidget->addItem ( item );
+ QListWidgetItem *item = new QListWidgetItem (fileInfo.fileName ());
+ item->setIcon (preview);
+ item->setToolTip(tr("Unarchived skin") + " " + fileInfo.filePath ());
+ ui.listWidget->addItem (item);
m_skinList << fileInfo;
}
}
@@ -336,16 +353,16 @@ void ConfigDialog::loadPluginsInfo()
void ConfigDialog::loadFonts()
{
- QSettings settings ( QDir::homePath() +"/.qmmp/qmmprc", QSettings::IniFormat );
+ QSettings settings (QDir::homePath() +"/.qmmp/qmmprc", QSettings::IniFormat);
QString fontname = settings.value ( "PlayList/Font","" ).toString();
- if ( fontname.isEmpty () )
- fontname = QFont ( "Helvetica [Cronyx]", 10 ).toString();
- ui.plFontLabel -> setText ( fontname );
-
- fontname = settings.value ( "MainWindow/Font","" ).toString();
- if ( fontname.isEmpty () )
- fontname = QFont ( "Helvetica [Cronyx]", 9 ).toString();
- ui.mainFontLabel -> setText ( fontname );
+ if (fontname.isEmpty ())
+ fontname = QFont ("Helvetica [Cronyx]", 10).toString();
+ ui.plFontLabel->setText (fontname);
+
+ fontname = settings.value ("MainWindow/Font","").toString();
+ if (fontname.isEmpty ())
+ fontname = QFont ("Helvetica [Cronyx]", 9).toString();
+ ui.mainFontLabel->setText (fontname);
}
void ConfigDialog::setPlFont()
@@ -378,7 +395,7 @@ void ConfigDialog::setMainFont()
void ConfigDialog::showPluginSettings()
{
- switch ( ( int ) ui.pluginsTab -> currentIndex () )
+ switch ((int) ui.pluginsTab -> currentIndex ())
{
case 0:
{
diff --git a/src/ui/configdialog.h b/src/ui/configdialog.h
index 968eea48d..c30fe9648 100644
--- a/src/ui/configdialog.h
+++ b/src/ui/configdialog.h
@@ -37,6 +37,7 @@ class OutputPluginItem;
class VisualPluginItem;
class EffectPluginItem;
class GeneralPluginItem;
+class SkinReader;
class ConfigDialog : public QDialog
{
@@ -70,6 +71,7 @@ private:
Ui::ConfigDialog ui;
Skin *m_skin;
QPixmap pixmap;
+ SkinReader *m_reader;
QList <InputPluginItem*> m_inputPluginItems;
QList <OutputPluginItem*> m_outputPluginItems;
diff --git a/src/ui/forms/configdialog.ui b/src/ui/forms/configdialog.ui
index 530786ab4..1825c60f6 100644
--- a/src/ui/forms/configdialog.ui
+++ b/src/ui/forms/configdialog.ui
@@ -93,14 +93,14 @@
<bool>false</bool>
</property>
<property name="currentRow" >
- <number>-1</number>
+ <number>0</number>
</property>
<item>
<property name="text" >
<string>Appearance</string>
</property>
<property name="icon" >
- <iconset resource="images/images.qrc" >:/interface.png</iconset>
+ <iconset resource="../images/images.qrc" >:/interface.png</iconset>
</property>
</item>
<item>
@@ -108,7 +108,7 @@
<string>Playlist</string>
</property>
<property name="icon" >
- <iconset resource="images/images.qrc" >:/playlist.png</iconset>
+ <iconset resource="../images/images.qrc" >:/playlist.png</iconset>
</property>
</item>
<item>
@@ -116,7 +116,7 @@
<string>Plugins</string>
</property>
<property name="icon" >
- <iconset resource="images/images.qrc" >:/plugins.png</iconset>
+ <iconset resource="../images/images.qrc" >:/plugins.png</iconset>
</property>
</item>
<item>
@@ -124,7 +124,7 @@
<string>Advanced</string>
</property>
<property name="icon" >
- <iconset resource="images/images.qrc" >:/advanced.png</iconset>
+ <iconset resource="../images/images.qrc" >:/advanced.png</iconset>
</property>
</item>
<item>
@@ -132,7 +132,7 @@
<string>Connectivity</string>
</property>
<property name="icon" >
- <iconset resource="images/images.qrc" >:/network.png</iconset>
+ <iconset resource="../images/images.qrc" >:/plugins.png</iconset>
</property>
</item>
</widget>
@@ -191,6 +191,9 @@
</property>
<item>
<widget class="QListWidget" name="listWidget" >
+ <property name="alternatingRowColors" >
+ <bool>true</bool>
+ </property>
<property name="movement" >
<enum>QListView::Static</enum>
</property>
@@ -857,7 +860,7 @@
</layout>
</widget>
<resources>
- <include location="images/images.qrc" />
+ <include location="../images/images.qrc" />
</resources>
<connections>
<connection>
diff --git a/src/ui/skinreader.cpp b/src/ui/skinreader.cpp
index c29246d8d..f7e7bab81 100644
--- a/src/ui/skinreader.cpp
+++ b/src/ui/skinreader.cpp
@@ -36,32 +36,32 @@ SkinReader::SkinReader(QObject *parent)
QDir dir(QDir::homePath() +"/.qmmp/");
dir.mkdir("cache");
dir.cd("cache");
- dir.mkdir("skins");
+ dir.mkdir("thumbs");
}
SkinReader::~SkinReader()
{}
-void SkinReader::updateCache()
+void SkinReader::generateThumbs()
{
+ m_previewMap.clear();
QDir dir(QDir::homePath() +"/.qmmp/skins");
dir.setFilter( QDir::Files | QDir::Hidden | QDir::NoSymLinks);
QFileInfoList f = dir.entryInfoList();
dir.setPath(qApp->applicationDirPath()+"/../share/qmmp/skins");
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
f << dir.entryInfoList();
- //clear removed skins from cache
- QDir cache_dir(QDir::homePath() +"/.qmmp/cache/skins");
- cache_dir.setFilter(QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot);
+ QDir cache_dir(QDir::homePath() +"/.qmmp/cache/thumbs");
+ cache_dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
QFileInfoList d = cache_dir.entryInfoList();
-
- foreach(QFileInfo dirInfo, d)
+ //clear removed skins from cache
+ foreach(QFileInfo thumbFile, d)
{
bool del = TRUE;
foreach(QFileInfo fileInfo, f)
{
- if (fileInfo.baseName () == dirInfo.fileName ())
+ if (fileInfo.baseName () == thumbFile.baseName ())
{
del = FALSE;
break;
@@ -70,24 +70,18 @@ void SkinReader::updateCache()
if (del)
{
qDebug("SkinReader: deleting %s from cache",
- qPrintable(dirInfo.fileName ()));
-
- cache_dir.cd(dirInfo.fileName ());
- cache_dir.setFilter(QDir::Files | QDir::Hidden);
- QFileInfoList removeList = cache_dir.entryInfoList();
- foreach(QFileInfo to_remove, removeList)
- cache_dir.remove(to_remove.fileName ());
- cache_dir.cdUp();
- cache_dir.rmdir(dirInfo.fileName ());
+ qPrintable(thumbFile.fileName ()));
+
+ cache_dir.remove(thumbFile.fileName ());
}
}
//add new skins to cache
foreach(QFileInfo fileInfo, f)
{
bool create = TRUE;
- foreach(QFileInfo dirInfo, d)
+ foreach(QFileInfo thumbInfo, d)
{
- if (fileInfo.baseName () == dirInfo.fileName ())
+ if (fileInfo.baseName () == thumbInfo.baseName ())
{
create = FALSE;
break;
@@ -97,20 +91,56 @@ void SkinReader::updateCache()
{
qDebug("SkinReader: adding %s to cache",
qPrintable(fileInfo.fileName ()));
- cache_dir.mkdir(fileInfo.baseName ());
QString name = fileInfo.fileName ().toLower();
if (name.endsWith(".tgz") || name.endsWith(".tar.gz"))
- untar(fileInfo.filePath (), cache_dir.absolutePath ()+"/"+
- fileInfo.baseName ());
+ untar(fileInfo.filePath (), cache_dir.absolutePath (), TRUE);
if (name.endsWith(".zip") || name.endsWith(".wsz"))
- unzip(fileInfo.filePath (), cache_dir.absolutePath ()+"/"+
- fileInfo.baseName ());
+ unzip(fileInfo.filePath (), cache_dir.absolutePath (), TRUE);
}
}
+ //add thumbs to map
+ d = cache_dir.entryInfoList();
+ foreach(QFileInfo fileInfo, f)
+ {
+ foreach(QFileInfo thumbInfo, d)
+ {
+ if (fileInfo.baseName () == thumbInfo.baseName ())
+ {
+ m_previewMap.insert(fileInfo.absoluteFilePath (),
+ thumbInfo.absoluteFilePath ());
+ break;
+ }
+ }
+ }
+}
+
+void SkinReader::unpackSkin(const QString &path)
+{
+ //remove old skin
+ QDir dir(QDir::homePath() +"/.qmmp/cache/skin");
+ dir.setFilter( QDir::Files | QDir::Hidden | QDir::NoSymLinks);
+ QFileInfoList f = dir.entryInfoList();
+ foreach(QFileInfo file, f)
+ dir.remove(file.fileName());
+ //unpack
+ if (path.endsWith(".tgz") || path.endsWith(".tar.gz"))
+ untar(path, QDir::homePath() +"/.qmmp/cache/skin", FALSE);
+ if (path.endsWith(".zip") || path.endsWith(".wsz"))
+ unzip(path, QDir::homePath() +"/.qmmp/cache/skin", FALSE);
+}
+
+const QStringList SkinReader::skins()
+{
+ return m_previewMap.keys();
}
-void SkinReader::untar(const QString &from, const QString &to)
+const QPixmap SkinReader::getPreview(const QString &skinPath)
+{
+ return QPixmap(m_previewMap.value(skinPath));
+}
+
+void SkinReader::untar(const QString &from, const QString &to, bool preview)
{
QByteArray array;
QStringList args;
@@ -120,29 +150,58 @@ void SkinReader::untar(const QString &from, const QString &to)
m_process->waitForFinished();
array = m_process->readAllStandardOutput ();
QString str = QString(array);
- QStringList outputList = str.split("\n",QString::SkipEmptyParts);
+ QStringList outputList = str.split("\n", QString::SkipEmptyParts);
foreach(QString str, outputList)
{
str = str.trimmed();
args.clear();
- args << "xvfk" << from << "-O" << str;
- m_process->start("tar", args);
- m_process->waitForFinished();
- array = m_process->readAllStandardOutput ();
- QString name = str.right(str.size() - str.indexOf("/",Qt::CaseInsensitive) - 1).trimmed().toLower();
+ if (!preview || (str.contains("/main.", Qt::CaseInsensitive)
+ || str.startsWith("main.", Qt::CaseInsensitive)))
+ {
+ args << "xvfk" << from << "-O" << str;
+ m_process->start("tar", args);
+ m_process->waitForFinished();
+ array = m_process->readAllStandardOutput ();
- QFile file(to+"/"+name);
- file.open(QIODevice::WriteOnly);
- file.write(array);
- file.close();
+ QString name;
+ if (preview)
+ name = from.section('/',-1) + (".") + str.section('.', -1);
+ else
+ name = str.right(str.size() - str.indexOf("/",Qt::CaseInsensitive) - 1).trimmed().toLower();
+
+ QFile file(to+"/"+name);
+ file.open(QIODevice::WriteOnly);
+ file.write(array);
+ file.close();
+ }
}
}
-void SkinReader::unzip(const QString &from, const QString &to)
+void SkinReader::unzip(const QString &from, const QString &to, bool preview)
{
QStringList args;
- args << "-j" << "-o" << "-d" << to << from;
- m_process->start("unzip", args);
- m_process->waitForFinished();
+ if (preview)
+ {
+ args << "-C" << "-j" << "-o" << "-d" << to << from << "main.*" << "*/main.*";
+ m_process->start("unzip", args);
+ m_process->waitForFinished();
+ QDir dir(to);
+ dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
+ QFileInfoList fileList = dir.entryInfoList();
+ foreach(QFileInfo thumbInfo, fileList)
+ {
+ if (thumbInfo.fileName().startsWith("main.", Qt::CaseInsensitive))
+ {
+ dir.rename(thumbInfo.fileName(), from.section('/', -1) +
+ "." + thumbInfo.suffix ());
+ }
+ }
+ }
+ else
+ {
+ args << "-j" << "-o" << "-d" << to << from;
+ m_process->start("unzip", args);
+ m_process->waitForFinished();
+ }
}
diff --git a/src/ui/skinreader.h b/src/ui/skinreader.h
index 321a5fbbf..e12e604a1 100644
--- a/src/ui/skinreader.h
+++ b/src/ui/skinreader.h
@@ -21,6 +21,8 @@
#define SKINREADER_H
#include <QObject>
+#include <QMap>
+#include <QPixmap>
/**
@author Ilya Kotov <forkotov02@hotmail.ru>
@@ -35,12 +37,16 @@ public:
~SkinReader();
- void updateCache();
+ void generateThumbs();
+ void unpackSkin(const QString &path);
+ const QStringList skins();
+ const QPixmap getPreview(const QString &skinPath);
private:
QProcess *m_process;
- void untar(const QString &from, const QString &to);
- void unzip(const QString &from, const QString &to);
+ void untar(const QString &from, const QString &to, bool preview);
+ void unzip(const QString &from, const QString &to, bool preview);
+ QMap <QString, QString> m_previewMap;
};
#endif