diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-02-12 16:00:29 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-02-12 16:00:29 +0000 |
| commit | 76567654b8759325bfd3b1b4d32ff25ef5974a41 (patch) | |
| tree | 7c0a3639804ddf6c2efd3ab71441ab6a2ec9a606 /src/ui | |
| parent | a9fe5096a37a5f67ca017ea25481066544d5f749 (diff) | |
| download | qmmp-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/ui')
| -rw-r--r-- | src/ui/configdialog.cpp | 65 | ||||
| -rw-r--r-- | src/ui/configdialog.h | 2 | ||||
| -rw-r--r-- | src/ui/forms/configdialog.ui | 17 | ||||
| -rw-r--r-- | src/ui/skinreader.cpp | 137 | ||||
| -rw-r--r-- | src/ui/skinreader.h | 12 |
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 |
