void EditMetadataDialog::OnArtworkSearchDone(MetadataLookup *lookup) { if (!lookup) return; if (m_busyPopup) { m_busyPopup->Close(); m_busyPopup = NULL; } VideoArtworkType type = lookup->GetData().value<VideoArtworkType>(); ArtworkList list = lookup->GetArtwork(type); if (list.isEmpty()) { MythWarningNotification n(tr("No image found"), tr("Metadata Editor")); GetNotificationCenter()->Queue(n); return; } MythScreenStack *m_popupStack = GetMythMainWindow()->GetStack("popup stack"); ImageSearchResultsDialog *resultsdialog = new ImageSearchResultsDialog(m_popupStack, list, type); connect(resultsdialog, SIGNAL(haveResult(ArtworkInfo, VideoArtworkType)), SLOT(OnSearchListSelection(ArtworkInfo, VideoArtworkType))); if (resultsdialog->Create()) m_popupStack->AddScreen(resultsdialog); }
bool Frontend::SendNotification(bool Error, const QString &Type, const QString &Message, const QString &Origin, const QString &Description, const QString &Image, const QString &Extra, const QString &ProgressText, float Progress, int Timeout, bool Fullscreen, uint Visibility, uint Priority) { if (Message.isEmpty()) return false; if (!GetNotificationCenter()) return false; ShowNotification(Error ? MythNotification::Error : MythNotification::TypeFromString(Type), Message, Origin.isNull() ? tr("FrontendServices") : Origin, Description, Image, Extra, ProgressText, Progress, Timeout, Fullscreen, Visibility, (MythNotification::Priority)Priority); return true; }
void MythRAOPDevice::newConnection(QTcpSocket *client) { QMutexLocker locker(m_lock); LOG(VB_GENERAL, LOG_INFO, LOC + QString("New connection from %1:%2") .arg(client->peerAddress().toString()).arg(client->peerPort())); MythNotification n(tr("New Connection"), tr("AirTunes"), tr("from %1:%2").arg(client->peerAddress().toString()).arg(client->peerPort())); // Don't show it during playback n.SetVisibility(n.GetVisibility() & ~MythNotification::kPlayback); GetNotificationCenter()->Queue(n); MythRAOPConnection *obj = new MythRAOPConnection(this, client, m_hardwareId, 6000); if (obj->Init()) { m_clients.append(obj); connect(client, SIGNAL(disconnected()), this, SLOT(deleteClient())); gCoreContext->RegisterForPlayback(this, SLOT(TVPlaybackStarting())); return; } LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to initialise client connection - closing."); delete obj; client->disconnectFromHost(); delete client; }
bool OSD::IsVisible(void) { if (GetNotificationCenter()->DisplayedNotifications() > 0) return true; foreach(MythScreenType* child, m_Children) { if (child->IsVisible() && child->objectName() != OSD_WIN_SUBTITLE && child->objectName() != OSD_WIN_TELETEXT && child->objectName() != OSD_WIN_BDOVERLAY && child->objectName() != OSD_WIN_INTERACT) return true; } return false; }
void OSD::HideAll(bool keepsubs, MythScreenType* except, bool dropnotification) { if (dropnotification) { if (GetNotificationCenter()->RemoveFirst()) return; // we've removed the top window, don't process any further } QMutableMapIterator<QString, MythScreenType*> it(m_Children); while (it.hasNext()) { it.next(); bool match1 = keepsubs && (it.key() == OSD_WIN_SUBTITLE || it.key() == OSD_WIN_TELETEXT); bool match2 = it.key() == OSD_WIN_BDOVERLAY || it.key() == OSD_WIN_INTERACT || it.value() == except; if (!(match1 || match2)) HideWindow(it.key()); } }
void MythRAOPDevice::deleteClient(void) { LOG(VB_GENERAL, LOG_DEBUG, LOC + "Entering DeleteClient."); QMutexLocker locker(m_lock); QList<MythRAOPConnection *>::iterator it = m_clients.begin(); MythNotification n(tr("Client disconnected"), tr("AirTunes")); // Don't show it during playback n.SetVisibility(n.GetVisibility() & ~MythNotification::kPlayback); GetNotificationCenter()->Queue(n); while (it != m_clients.end()) { if ((*it)->GetSocket()->state() == QTcpSocket::UnconnectedState) { LOG(VB_GENERAL, LOG_INFO, LOC + "Removing client connection."); delete *it; m_clients.erase(it); break; } ++it; } LOG(VB_GENERAL, LOG_DEBUG, LOC + "Exiting DeleteClient."); }
void EditMetadataDialog::customEvent(QEvent *levent) { if (levent->type() == DialogCompletionEvent::kEventType) { DialogCompletionEvent *dce = (DialogCompletionEvent*)(levent); const QString resultid = dce->GetId(); if (resultid == CEID_COVERARTFILE) SetCoverArt(dce->GetResultText()); else if (resultid == CEID_BANNERFILE) SetBanner(dce->GetResultText()); else if (resultid == CEID_FANARTFILE) SetFanart(dce->GetResultText()); else if (resultid == CEID_SCREENSHOTFILE) SetScreenshot(dce->GetResultText()); else if (resultid == CEID_TRAILERFILE) SetTrailer(dce->GetResultText()); else if (resultid == CEID_NEWCATEGORY) AddCategory(dce->GetResultText()); } else if (levent->type() == MetadataLookupEvent::kEventType) { MetadataLookupEvent *lue = (MetadataLookupEvent *)levent; MetadataLookupList lul = lue->lookupList; if (lul.isEmpty()) return; // There should really only be one result here. // If not, USER ERROR! if (lul.count() == 1) { OnArtworkSearchDone(lul[0]); } else { if (m_busyPopup) { m_busyPopup->Close(); m_busyPopup = NULL; } } } else if (levent->type() == MetadataLookupFailure::kEventType) { MetadataLookupFailure *luf = (MetadataLookupFailure *)levent; MetadataLookupList lul = luf->lookupList; if (m_busyPopup) { m_busyPopup->Close(); m_busyPopup = NULL; } if (lul.size()) { MetadataLookup *lookup = lul[0]; LOG(VB_GENERAL, LOG_INFO, QString("No results found for %1 %2 %3").arg(lookup->GetTitle()) .arg(lookup->GetSeason()).arg(lookup->GetEpisode())); } } else if (levent->type() == ImageDLEvent::kEventType) { ImageDLEvent *ide = (ImageDLEvent *)levent; MetadataLookup *lookup = ide->item; if (!lookup) return; handleDownloadedImages(lookup); } else if (levent->type() == ImageDLFailureEvent::kEventType) { MythErrorNotification n(tr("Failed to retrieve image"), tr("Metadata Editor"), tr("Check logs")); GetNotificationCenter()->Queue(n); } }
QRegion OSD::Draw(MythPainter* painter, QPaintDevice *device, QSize size, QRegion &changed, int alignx, int aligny) { bool redraw = m_Refresh; QRegion visible = QRegion(); QRegion dirty = m_Refresh ? QRegion(QRect(QPoint(0,0), m_Rect.size())) : QRegion(); m_Refresh = false; if (!painter || !device) return visible; QTime now = MythDate::current().time(); CheckExpiry(); // first update for alpha pulse and fade QMap<QString,MythScreenType*>::const_iterator it; for (it = m_Children.begin(); it != m_Children.end(); ++it) { if ((*it)->IsVisible()) { QRect vis = (*it)->GetArea().toQRect(); if (visible.isEmpty()) visible = QRegion(vis); else visible = visible.united(vis); (*it)->Pulse(); if (m_Effects && m_ExpireTimes.contains((*it))) { QTime expires = m_ExpireTimes.value((*it)).time(); int left = now.msecsTo(expires); if (left < m_FadeTime) (*it)->SetAlpha((255 * left) / m_FadeTime); } } if ((*it)->NeedsRedraw()) { QRegion area = (*it)->GetDirtyArea(); dirty = dirty.united(area); redraw = true; } } MythNotificationCenter *nc = GetNotificationCenter(); QList<MythScreenType*> notifications; nc->GetNotificationScreens(notifications); QList<MythScreenType*>::iterator it2 = notifications.begin(); while (it2 != notifications.end()) { if (!GetNotificationCenter()->ScreenCreated(*it2)) { if (!m_UIScaleOverride) { OverrideUIScale(false); } (*it2)->SetPainter(m_CurrentPainter); if (!(*it2)->Create()) { it2 = notifications.erase(it2); continue; } } if ((*it2)->IsVisible()) { if (!m_UIScaleOverride) { OverrideUIScale(false); } nc->UpdateScreen(*it2); QRect vis = (*it2)->GetArea().toQRect(); if (visible.isEmpty()) visible = QRegion(vis); else visible = visible.united(vis); (*it2)->Pulse(); if (m_Effects) { QTime expires = nc->ScreenExpiryTime(*it2).time(); int left = now.msecsTo(expires); if (expires.isValid() && left < m_FadeTime) (*it2)->SetAlpha((255 * left) / m_FadeTime); } } if ((*it2)->NeedsRedraw()) { QRegion area = (*it2)->GetDirtyArea(); dirty = dirty.united(area); redraw = true; } ++it2; } RevertUIScale(); if (redraw) { // clear the dirty area painter->Clear(device, dirty); // set redraw for any widgets that may now need a partial repaint for (it = m_Children.begin(); it != m_Children.end(); ++it) { if ((*it)->IsVisible() && !(*it)->NeedsRedraw() && dirty.intersects((*it)->GetArea().toQRect())) { (*it)->SetRedraw(); } } for (it2 = notifications.begin(); it2 != notifications.end(); ++it2) { if ((*it2)->IsVisible() && !(*it2)->NeedsRedraw() && dirty.intersects((*it2)->GetArea().toQRect())) { (*it2)->SetRedraw(); } } // and finally draw QRect cliprect = dirty.boundingRect(); painter->Begin(device); painter->SetClipRegion(dirty); // TODO painting in reverse may be more efficient... for (it = m_Children.begin(); it != m_Children.end(); ++it) { if ((*it)->NeedsRedraw()) { if ((*it)->IsVisible()) (*it)->Draw(painter, 0, 0, 255, cliprect); (*it)->SetAlpha(255); (*it)->ResetNeedsRedraw(); } } for (it2 = notifications.begin(); it2 != notifications.end(); ++it2) { if ((*it2)->NeedsRedraw()) { if ((*it2)->IsVisible()) (*it2)->Draw(painter, 0, 0, 255, cliprect); (*it2)->SetAlpha(255); (*it2)->ResetNeedsRedraw(); } } painter->End(); } changed = dirty; if (visible.isEmpty() || (!alignx && !aligny)) return visible; // assist yuv blending with some friendly alignments QRegion aligned; QVector<QRect> rects = visible.rects(); for (int i = 0; i < rects.size(); i++) { QRect r = rects[i]; int left = r.left() & ~(alignx - 1); int top = r.top() & ~(aligny - 1); int right = (r.left() + r.width()); int bot = (r.top() + r.height()); if (right & (alignx - 1)) right += alignx - (right & (alignx - 1)); if (bot % aligny) bot += aligny - (bot % aligny); aligned = aligned.united(QRegion(left, top, right - left, bot - top)); } return aligned.intersected(QRect(QPoint(0,0), size)); }
bool OSD::DrawDirect(MythPainter* painter, QSize size, bool repaint) { if (!painter) return false; bool visible = false; bool redraw = m_Refresh; m_Refresh = false; QTime now = MythDate::current().time(); CheckExpiry(); QMap<QString,MythScreenType*>::const_iterator it; for (it = m_Children.begin(); it != m_Children.end(); ++it) { if ((*it)->IsVisible()) { visible = true; (*it)->Pulse(); if (m_Effects && m_ExpireTimes.contains((*it))) { QTime expires = m_ExpireTimes.value((*it)).time(); int left = now.msecsTo(expires); if (left < m_FadeTime) (*it)->SetAlpha((255 * left) / m_FadeTime); } if ((*it)->NeedsRedraw()) redraw = true; } } MythNotificationCenter *nc = GetNotificationCenter(); QList<MythScreenType*> notifications; nc->GetNotificationScreens(notifications); QList<MythScreenType*>::iterator it2 = notifications.begin(); while (it2 != notifications.end()) { if (!nc->ScreenCreated(*it2)) { LOG(VB_GUI, LOG_DEBUG, LOC + "Creating OSD Notification"); if (!m_UIScaleOverride) { OverrideUIScale(false); } (*it2)->SetPainter(m_CurrentPainter); if (!(*it2)->Create()) { it2 = notifications.erase(it2); continue; } } if ((*it2)->IsVisible()) { if (!m_UIScaleOverride) { OverrideUIScale(false); } nc->UpdateScreen(*it2); visible = true; (*it2)->Pulse(); if (m_Effects) { QTime expires = nc->ScreenExpiryTime(*it2).time(); int left = now.msecsTo(expires); if (expires.isValid() && left < m_FadeTime) (*it2)->SetAlpha((255 * left) / m_FadeTime); } if ((*it2)->NeedsRedraw()) redraw = true; } ++it2; } RevertUIScale(); redraw |= repaint; if (redraw && visible) { QRect cliprect = QRect(QPoint(0, 0), size); painter->Begin(NULL); for (it = m_Children.begin(); it != m_Children.end(); ++it) { if ((*it)->IsVisible()) { (*it)->Draw(painter, 0, 0, 255, cliprect); (*it)->SetAlpha(255); (*it)->ResetNeedsRedraw(); } } for (it2 = notifications.begin(); it2 != notifications.end(); ++it2) { if ((*it2)->IsVisible()) { (*it2)->Draw(painter, 0, 0, 255, cliprect); (*it2)->SetAlpha(255); (*it2)->ResetNeedsRedraw(); } } painter->End(); } return visible; }