void ThemeChooser::itemChanged(MythUIButtonListItem *item) { ThemeInfo *info = qVariantValue<ThemeInfo*>(item->GetData()); if (!info) return; QFileInfo preview(info->GetPreviewPath()); QHash<QString, QString> infomap; info->ToMap(infomap); SetTextFromMap(infomap); if (m_preview) { if (preview.exists()) { m_preview->SetFilename(info->GetPreviewPath()); m_preview->Load(); } else m_preview->Reset(); } if (m_fullPreviewShowing && m_fullPreviewStateType) { if (m_fullScreenPreview) { if (preview.exists()) { m_fullScreenPreview->SetFilename(info->GetPreviewPath()); m_fullScreenPreview->Load(); } else m_fullScreenPreview->Reset(); } if (m_fullScreenName) m_fullScreenName->SetText(info->GetName()); } MythUIStateType *themeLocation = dynamic_cast<MythUIStateType*>(GetChild("themelocation")); if (themeLocation) { if (info->GetDownloadURL().isEmpty()) themeLocation->DisplayState("local"); else themeLocation->DisplayState("remote"); } MythUIStateType *aspectState = dynamic_cast<MythUIStateType*>(GetChild("aspectstate")); if (aspectState) aspectState->DisplayState(info->GetAspect()); }
void ThemeChooser::removeTheme(void) { MythUIButtonListItem *current = m_themes->GetItemCurrent(); if (!current) { ShowOkPopup(tr("Error, no theme selected.")); return; } ThemeInfo *info = qVariantValue<ThemeInfo *>(current->GetData()); if (!info) { ShowOkPopup(tr("Error, unable to find current theme.")); return; } QString themeDir = GetConfDir() + "/themes/"; if (!info->GetPreviewPath().startsWith(themeDir)) { ShowOkPopup(tr("%1 is not a user-installed theme and can not " "be deleted.").arg(info->GetName())); return; } themeDir.append(info->GetDirectoryName()); removeThemeDir(themeDir); ReloadInBackground(); }
void ThemeChooser::toggleFullscreenPreview(void) { if (m_fullPreviewStateType) { if (m_fullPreviewShowing) { if (m_fullScreenPreview) m_fullScreenPreview->Reset(); if (m_fullScreenName) m_fullScreenName->Reset(); m_fullPreviewStateType->Reset(); m_fullPreviewShowing = false; } else { MythUIButtonListItem *item = m_themes->GetItemCurrent(); ThemeInfo *info = qVariantValue<ThemeInfo*>(item->GetData()); if (info) { if (m_fullScreenPreview) { m_fullScreenPreview->SetFilename(info->GetPreviewPath()); m_fullScreenPreview->Load(); } if (m_fullScreenName) m_fullScreenName->SetText(info->GetName()); m_fullPreviewStateType->DisplayState("fullscreen"); m_fullPreviewShowing = true; } } } }
void ThemeChooser::showPopupMenu(void) { if (m_popupMenu) return; MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); QString label = tr("Theme Chooser Menu"); m_popupMenu = new MythDialogBox(label, popupStack, "themechoosermenupopup"); connect(m_popupMenu, SIGNAL(Closed(QString, int)), SLOT(popupClosed(QString, int))); if (m_popupMenu->Create()) popupStack->AddScreen(m_popupMenu); else { delete m_popupMenu; m_popupMenu = NULL; return; } m_popupMenu->SetReturnEvent(this, "popupmenu"); if (m_fullPreviewStateType) { if (m_fullPreviewShowing) m_popupMenu->AddButton(tr("Hide Fullscreen Preview"), SLOT(toggleFullscreenPreview())); else m_popupMenu->AddButton(tr("Show Fullscreen Preview"), SLOT(toggleFullscreenPreview())); } m_popupMenu->AddButton(tr("Refresh Downloadable Themes"), SLOT(refreshDownloadableThemes())); MythUIButtonListItem *current = m_themes->GetItemCurrent(); if (current) { ThemeInfo *info = qVariantValue<ThemeInfo *>(current->GetData()); if (info) { m_popupMenu->AddButton(tr("Select Theme"), SLOT(saveAndReload())); QString themeDir = GetConfDir() + "/themes/"; if (info->GetPreviewPath().startsWith(themeDir)) m_popupMenu->AddButton(tr("Delete Theme"), SLOT(removeTheme())); } } if (gCoreContext->GetNumSetting("ThemeUpdateNofications", 1)) m_popupMenu->AddButton(tr("Disable Theme Update Notifications"), SLOT(toggleThemeUpdateNotifications())); else m_popupMenu->AddButton(tr("Enable Theme Update Notifications"), SLOT(toggleThemeUpdateNotifications())); }
void ThemeChooser::Init(void) { QString curTheme = gCoreContext->GetSetting("Theme"); ThemeInfo *themeinfo = NULL; ThemeInfo *curThemeInfo = NULL; MythUIButtonListItem *item = NULL; m_themes->Reset(); for( QFileInfoList::iterator it = m_infoList.begin(); it != m_infoList.end(); ++it ) { QFileInfo &theme = *it; if (!m_themeFileNameInfos.contains(theme.filePath())) continue; themeinfo = m_themeFileNameInfos[theme.filePath()]; if (!themeinfo) continue; QString buttonText = QString("%1 %2.%3") .arg(themeinfo->GetName()) .arg(themeinfo->GetMajorVersion()) .arg(themeinfo->GetMinorVersion()); item = new MythUIButtonListItem(m_themes, buttonText); if (item) { if (themeinfo->GetDownloadURL().isEmpty()) item->DisplayState("local", "themelocation"); else item->DisplayState("remote", "themelocation"); item->DisplayState(themeinfo->GetAspect(), "aspectstate"); item->DisplayState(m_themeStatuses[themeinfo->GetName()], "themestatus"); QHash<QString, QString> infomap; themeinfo->ToMap(infomap); item->SetTextFromMap(infomap); item->SetData(qVariantFromValue(themeinfo)); QString thumbnail = themeinfo->GetPreviewPath(); QFileInfo fInfo(thumbnail); // Downloadable themeinfos have thumbnail copies of their preview images if (!themeinfo->GetDownloadURL().isEmpty()) thumbnail = thumbnail.append(".thumb.jpg"); item->SetImage(thumbnail); if (curTheme == themeinfo->GetDirectoryName()) curThemeInfo = themeinfo; } else delete item; } SetFocusWidget(m_themes); if (curThemeInfo) m_themes->SetValueByData(qVariantFromValue(curThemeInfo)); MythUIButtonListItem *current = m_themes->GetItemCurrent(); if (current) itemChanged(current); }
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); }