/** * \brief Returns the full path to the theme denoted by themename * * If the theme cannot be found falls back to the DEFAULT_UI_THEME. * If the DEFAULT_UI_THEME doesn't exist then returns an empty string. * \param themename The theme name. * \return Path to theme or empty string. */ QString MythUIHelper::FindThemeDir(const QString &themename) { QString testdir; QDir dir; if (!themename.isEmpty()) { testdir = d->m_userThemeDir + themename; dir.setPath(testdir); if (dir.exists()) return testdir; testdir = GetThemesParentDir() + themename; dir.setPath(testdir); if (dir.exists()) return testdir; LOG(VB_GENERAL, LOG_WARNING, LOC + QString("No theme dir: '%1'") .arg(dir.absolutePath())); } testdir = GetThemesParentDir() + DEFAULT_UI_THEME; dir.setPath(testdir); if (dir.exists()) { LOG(VB_GENERAL, LOG_ERR, LOC + QString("Could not find theme: %1 - Switching to %2") .arg(themename).arg(DEFAULT_UI_THEME)); GetMythDB()->OverrideSettingForSession("Theme", DEFAULT_UI_THEME); return testdir; } LOG(VB_GENERAL, LOG_WARNING, LOC + QString("No default theme dir: '%1'") .arg(dir.absolutePath())); testdir = GetThemesParentDir() + FALLBACK_UI_THEME; dir.setPath(testdir); if (dir.exists()) { LOG(VB_GENERAL, LOG_ERR, LOC + QString("Could not find theme: %1 - Switching to %2") .arg(themename).arg(FALLBACK_UI_THEME)); GetMythDB()->OverrideSettingForSession("Theme", FALLBACK_UI_THEME); return testdir; } LOG(VB_GENERAL, LOG_ERR, LOC + QString("No fallback GUI theme dir: '%1'") .arg(dir.absolutePath())); return QString(); }
QStringList MythUIHelper::GetThemeSearchPath(void) { QStringList searchpath; searchpath.append(GetThemeDir()); if (d->m_isWide) searchpath.append(GetThemesParentDir() + "default-wide/"); searchpath.append(GetThemesParentDir() + "default/"); searchpath.append("/tmp/"); return searchpath; }
QList<ThemeInfo> MythUIHelper::GetThemes(ThemeType type) { QFileInfoList fileList; QList<ThemeInfo> themeList; QDir themeDirs(GetThemesParentDir()); themeDirs.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); themeDirs.setSorting(QDir::Name | QDir::IgnoreCase); fileList.append(themeDirs.entryInfoList()); themeDirs.setPath(d->m_userThemeDir); fileList.append(themeDirs.entryInfoList()); for (QFileInfoList::iterator it = fileList.begin(); it != fileList.end(); ++it) { QFileInfo &theme = *it; if (theme.baseName() == "default" || theme.baseName() == "default-wide" || theme.baseName() == "Slave") continue; ThemeInfo themeInfo(theme.absoluteFilePath()); if (themeInfo.GetType() & type) themeList.append(themeInfo); } return themeList; }
/** * \brief Returns the full path to the menu theme denoted by menuname * * If the theme cannot be found falls back to the default menu. * If the default menu theme doesn't exist then returns an empty string. * \param menuname The menutheme name. * \return Path to theme or empty string. */ QString MythUIHelper::FindMenuThemeDir(const QString &menuname) { QString testdir; QDir dir; testdir = d->m_userThemeDir + menuname; dir.setPath(testdir); if (dir.exists()) return testdir; testdir = GetThemesParentDir() + menuname; dir.setPath(testdir); if (dir.exists()) return testdir; testdir = GetShareDir(); dir.setPath(testdir); if (dir.exists()) { LOG(VB_GENERAL, LOG_ERR, LOC + QString("Could not find menu theme: %1 - Switching to default") .arg(menuname)); GetMythDB()->SaveSetting("MenuTheme", "default"); return testdir; } LOG(VB_GENERAL, LOG_ERR, LOC + QString("Could not find menu theme: %1 - Fallback to default failed.") .arg(menuname)); return QString(); }
void ThemeChooser::Load(void) { SetBusyPopupMessage(tr("Loading Installed Themes")); QString MythVersion = MYTH_SOURCE_PATH; QStringList themesSeen; QDir themes(GetConfDir() + "/themes"); themes.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); themes.setSorting(QDir::Name | QDir::IgnoreCase); // FIXME: For now, treat git master the same as svn trunk if (MythVersion == "master") MythVersion = "trunk"; if (MythVersion != "trunk") { MythVersion = MYTH_BINARY_VERSION; // Example: 0.25.20101017-1 MythVersion.replace(QRegExp("\\.[0-9]{8,}.*"), ""); } m_infoList = themes.entryInfoList(); for( QFileInfoList::iterator it = m_infoList.begin(); it != m_infoList.end(); ++it ) { if (loadThemeInfo(*it)) { themesSeen << (*it).fileName(); m_themeStatuses[(*it).fileName()] = "default"; } } themes.setPath(GetThemesParentDir()); QFileInfoList sharedThemes = themes.entryInfoList(); for( QFileInfoList::iterator it = sharedThemes.begin(); it != sharedThemes.end(); ++it ) { if ((!themesSeen.contains((*it).fileName())) && (loadThemeInfo(*it))) { m_infoList << *it; themesSeen << (*it).fileName(); m_themeStatuses[(*it).fileName()] = "default"; } } QString remoteThemesFile = GetConfDir(); remoteThemesFile.append("/tmp/themes.zip"); QString themeSite = QString("%1/%2") .arg(gCoreContext->GetSetting("ThemeRepositoryURL", "http://themes.mythtv.org/themes/repository")).arg(MythVersion); int downloadFailures = gCoreContext->GetNumSetting("ThemeInfoDownloadFailures", 0); if (QFile::exists(remoteThemesFile)) { QFileInfo finfo(remoteThemesFile); if (finfo.lastModified() < mythCurrentDateTime().addSecs(-600)) { LOG(VB_GUI, LOG_INFO, LOC + QString("%1 is over 10 minutes old, forcing " "remote theme list download").arg(remoteThemesFile)); m_refreshDownloadableThemes = true; } } else if (downloadFailures < 2) // (and themes.zip does not exist) { LOG(VB_GUI, LOG_INFO, LOC + QString("%1 does not exist, forcing remote theme " "list download").arg(remoteThemesFile)); m_refreshDownloadableThemes = true; } if (m_refreshDownloadableThemes) { SetBusyPopupMessage(tr("Refreshing Downloadable Themes Information")); QString url = themeSite; url.append("/themes.zip"); QString destdir = GetMythUI()->GetThemeCacheDir(); destdir.append("/themechooser"); QString versiondir = QString("%1/%2").arg(destdir).arg(MythVersion); removeThemeDir(versiondir); QDir dir; dir.mkpath(destdir); bool result = GetMythDownloadManager()->download(url, remoteThemesFile); SetBusyPopupMessage(tr("Extracting Downloadable Themes Information")); if (!result || !extractZIP(remoteThemesFile, destdir)) { QFile::remove(remoteThemesFile); downloadFailures++; gCoreContext->SaveSetting("ThemeInfoDownloadFailures", downloadFailures); } } QDir remoteThemesDir(GetMythUI()->GetThemeCacheDir() .append("/themechooser/").append(MythVersion)); if ((QFile::exists(remoteThemesFile)) && (remoteThemesDir.exists())) { SetBusyPopupMessage(tr("Loading Downloadable Themes")); LOG(VB_GUI, LOG_INFO, LOC + QString("%1 and %2 exist, using cached remote themes list") .arg(remoteThemesFile).arg(remoteThemesDir.absolutePath())); QString themesPath = remoteThemesDir.absolutePath(); themes.setPath(themesPath); QFileInfoList downloadableThemes = themes.entryInfoList(); for( QFileInfoList::iterator it = downloadableThemes.begin(); it != downloadableThemes.end(); ++it ) { QString dirName = (*it).fileName(); QString themeName = dirName; QString remoteDir = themeSite; remoteDir.append("/").append(dirName); QString localDir = themes.absolutePath(); localDir.append("/").append(dirName); if (themesSeen.contains(dirName)) { ThemeInfo remoteTheme((*it).absoluteFilePath()); ThemeInfo *localTheme = m_themeNameInfos[dirName]; themeName = remoteTheme.GetName(); int rmtMaj = remoteTheme.GetMajorVersion(); int rmtMin = remoteTheme.GetMinorVersion(); int locMaj = localTheme->GetMajorVersion(); int locMin = localTheme->GetMinorVersion(); if ((rmtMaj > locMaj) || ((rmtMaj == locMaj) && (rmtMin > locMin))) { if (loadThemeInfo(*it)) { m_infoList << *it; m_themeStatuses[themeName] = "updateavailable"; QFileInfo finfo(remoteTheme.GetPreviewPath()); GetMythDownloadManager()->queueDownload( remoteDir.append("/").append(finfo.fileName()), localDir.append("/").append(finfo.fileName()), NULL); } } else if ((rmtMaj == locMaj) && (rmtMin == locMin)) { m_themeStatuses[themeName] = "uptodate"; } } else { ThemeInfo *remoteTheme = loadThemeInfo(*it); if (remoteTheme) { themeName = remoteTheme->GetName(); themesSeen << dirName; m_infoList << *it; m_themeStatuses[themeName] = "updateavailable"; QFileInfo finfo(remoteTheme->GetPreviewPath()); GetMythDownloadManager()->queueDownload( remoteDir.append("/").append(finfo.fileName()), localDir.append("/").append(finfo.fileName()), NULL); } } } } ResetBusyPopup(); qSort(m_infoList.begin(), m_infoList.end(), sortThemeNames); }