From 3fcb682f579b67aff09f1146978722f9efbfe8cc Mon Sep 17 00:00:00 2001 From: Thorvald Natvig Date: Thu, 25 Feb 2010 17:56:48 +0100 Subject: [PATCH] Add example users to overlay --- src/mumble/Overlay.cpp | 293 +++++++++++++++++++++++++++-------------- src/mumble/Overlay.h | 12 +- 2 files changed, 202 insertions(+), 103 deletions(-) diff --git a/src/mumble/Overlay.cpp b/src/mumble/Overlay.cpp index f06086325..2a727de2b 100644 --- a/src/mumble/Overlay.cpp +++ b/src/mumble/Overlay.cpp @@ -170,28 +170,44 @@ void OverlayConfig::accept() const { OverlayUser::OverlayUser(ClientUser *cu, unsigned int height) : QGraphicsItemGroup(), cuUser(cu), uiSize(height) { - // Creation + setup(); + updateLayout(); +} + +OverlayUser::OverlayUser(OverlayUser::TextColor tc, unsigned int height) : QGraphicsItemGroup(), cuUser(NULL), uiSize(height), tcColor(tc) { + setup(); + updateLayout(); + + qsChannelName = Overlay::tr("Channel Name"); + + switch(tc) { + case Passive: + qsName = Overlay::tr("Silent"); + break; + case Talking: + qsName = Overlay::tr("Talking"); + break; + case Linked: + qsName = Overlay::tr("Silent (Linked)"); + break; + case WhisperPrivate: + qsName = Overlay::tr("Private Whisper"); + break; + case WhisperChannel: + qsName = Overlay::tr("Channel Whisper"); + break; + } +} + +void OverlayUser::setup() { + setZValue(-4.0f); qgpiMuted = new QGraphicsPixmapItem(); qgpiMuted->hide(); - { - QImageReader qir(QLatin1String("skin:muted_self.svg")); - QSize sz = qir.size(); - sz.scale(uiSize / 2, uiSize / 2, Qt::KeepAspectRatio); - qir.setScaledSize(sz); - qgpiMuted->setPixmap(QPixmap::fromImage(qir.read())); - } addToGroup(qgpiMuted); qgpiDeafened = new QGraphicsPixmapItem(); qgpiDeafened->hide(); - { - QImageReader qir(QLatin1String("skin:deafened_self.svg")); - QSize sz = qir.size(); - sz.scale(uiSize / 2, uiSize / 2, Qt::KeepAspectRatio); - qir.setScaledSize(sz); - qgpiDeafened->setPixmap(QPixmap::fromImage(qir.read())); - } addToGroup(qgpiDeafened); qgpiAvatar = new QGraphicsPixmapItem(); @@ -206,9 +222,33 @@ OverlayUser::OverlayUser(ClientUser *cu, unsigned int height) : QGraphicsItemGro qgpiChannel = new QGraphicsPixmapItem(); qgpiChannel->hide(); addToGroup(qgpiChannel); +} - // Layout +void OverlayUser::updateLayout() { + QPixmap pm; + for(int i=0;i<5;++i) + qgpiName[i]->setPixmap(pm); + + qgpiAvatar->setPixmap(pm); + qgpiChannel->setPixmap(pm); + + { + QImageReader qir(QLatin1String("skin:muted_self.svg")); + QSize sz = qir.size(); + sz.scale(uiSize / 2, uiSize / 2, Qt::KeepAspectRatio); + qir.setScaledSize(sz); + qgpiMuted->setPixmap(QPixmap::fromImage(qir.read())); + } + + { + QImageReader qir(QLatin1String("skin:deafened_self.svg")); + QSize sz = qir.size(); + sz.scale(uiSize / 2, uiSize / 2, Qt::KeepAspectRatio); + qir.setScaledSize(sz); + qgpiDeafened->setPixmap(QPixmap::fromImage(qir.read())); + } + qgpiMuted->setPos(0.0f, 0.0f); qgpiMuted->setZValue(1.0f); qgpiMuted->setOpacity(0.7f); @@ -292,8 +332,9 @@ QPixmap OverlayUser::createPixmap(const QString &string, unsigned int height, un } void OverlayUser::updateUser() { - if (qsName != cuUser->qsName) { - qsName = cuUser->qsName; + if (qgpiName[0]->pixmap().isNull() || (cuUser && (qsName != cuUser->qsName))) { + if (cuUser) + qsName = cuUser->qsName; QPainterPath pp; for (int i=0;iqlColors.size(); ++i) { @@ -303,8 +344,9 @@ void OverlayUser::updateUser() { } } - if (qsChannelName != cuUser->cChannel->qsName) { - qsChannelName = cuUser->cChannel->qsName; + if (qgpiChannel->pixmap().isNull() || (cuUser && (qsChannelName != cuUser->cChannel->qsName))) { + if (cuUser) + qsChannelName = cuUser->cChannel->qsName; QPainterPath pp; const QPixmap &pm = createPixmap(qsChannelName, uiSize / 6, uiSize, g.s.qcOverlayChannel, pp); @@ -312,8 +354,9 @@ void OverlayUser::updateUser() { qgpiChannel->setX(uiSize - pm.width()); } - if (qgpiAvatar->pixmap().isNull() || (qbaAvatar != cuUser->qbaTextureHash)) { - qbaAvatar = cuUser->qbaTextureHash; + if (qgpiAvatar->pixmap().isNull() || (cuUser && (qbaAvatar != cuUser->qbaTextureHash))) { + if (cuUser) + qbaAvatar = cuUser->qbaTextureHash; QImage img; if (qbaAvatar.isNull()) { @@ -336,38 +379,47 @@ void OverlayUser::updateUser() { qgpiAvatar->setPixmap(QPixmap::fromImage(img)); } - ClientUser *self = ClientUser::get(g.uiSession); - qgpiAvatar->show(); + + TextColor tc; - if (cuUser->bDeaf || cuUser->bSelfDeaf) { - qgpiMuted->hide(); - qgpiDeafened->show(); - } else if (cuUser->bMute || cuUser->bSelfMute || cuUser->bLocalMute || cuUser->bSuppress) { + if (cuUser) { + ClientUser *self = ClientUser::get(g.uiSession); + + if (cuUser->bDeaf || cuUser->bSelfDeaf) { + qgpiMuted->hide(); + qgpiDeafened->show(); + } else if (cuUser->bMute || cuUser->bSelfMute || cuUser->bLocalMute || cuUser->bSuppress) { + qgpiMuted->show(); + qgpiDeafened->hide(); + } else { + qgpiMuted->hide(); + qgpiDeafened->hide(); + } + + bool samechannel = self && (self->cChannel == cuUser->cChannel); + qgpiChannel->setVisible(! samechannel); + + tc = samechannel ? Passive : Linked; + switch (cuUser->tsState) { + case ClientUser::Talking: + tc = Talking; + break; + case ClientUser::TalkingWhisper: + tc = WhisperPrivate; + break; + case ClientUser::TalkingWhisperChannel: + tc = WhisperChannel; + break; + default: + break; + } + } else { + tc = tcColor; + qgpiChannel->setVisible((tc != Passive) && (tc != Talking)); qgpiMuted->show(); qgpiDeafened->hide(); - } else { - qgpiMuted->hide(); - qgpiDeafened->hide(); - } - - bool samechannel = self && (self->cChannel == cuUser->cChannel); - qgpiChannel->setVisible(! samechannel); - - TextColor tc = samechannel ? Passive : Linked; - switch (cuUser->tsState) { - case ClientUser::Talking: - tc = Talking; - break; - case ClientUser::TalkingWhisper: - tc = WhisperPrivate; - break; - case ClientUser::TalkingWhisperChannel: - tc = WhisperChannel; - break; - default: - break; - } + } for (int i=0;i<5;++i) qgpiName[i]->setVisible(i == tc); @@ -427,6 +479,10 @@ OverlayClient::OverlayClient(QLocalSocket *socket, QObject *p) : QObject(p) { OverlayClient::~OverlayClient() { qlsSocket->abort(); + foreach(OverlayUser *ou, qlExampleUsers) + delete ou; + qlExampleUsers.clear(); + foreach(OverlayUser *ou, qmUsers) delete ou; qmUsers.clear(); @@ -546,29 +602,8 @@ void OverlayClient::showGui() { qgv.setAttribute(Qt::WA_WState_Hidden, false); qApp->setActiveWindow(&qgv); qgv.setFocus(); - - qgs.setBackgroundBrush(QColor(0,0,0,64)); - - if (! qgpiLogo) { - qgpiLogo = new OverlayMouse(); - qgpiLogo->hide(); - qgpiLogo->setOpacity(0.8f); - qgpiLogo->setZValue(-5.0f); - - - QImageReader qir(QLatin1String("skin:mumble.svg")); - QSize sz = qir.size(); - sz.scale(uiWidth, uiHeight, Qt::KeepAspectRatio); - qir.setScaledSize(sz); - - qgpiLogo->setPixmap(QPixmap::fromImage(qir.read())); - - QRectF qrf = qgpiLogo->boundingRect(); - qgpiLogo->setPos(iroundf((uiWidth - qrf.width()) / 2.0f), iroundf((uiHeight - qrf.height()) / 2.0f)); - - qgs.addItem(qgpiLogo); - } - qgpiLogo->show(); + + setupScene(); #if defined(Q_WS_WIN) || defined(Q_WS_MAC) qt_use_native_dialogs = false; @@ -576,6 +611,7 @@ void OverlayClient::showGui() { } void OverlayClient::hideGui() { + qgpiCursor->hide(); #if defined(QT3_SUPPORT) || defined(Q_WS_WIN) if (QCoreApplication::loopLevel() > 1) { QCoreApplication::exit_loop(); @@ -605,28 +641,23 @@ void OverlayClient::hideGui() { } } - qgpiCursor->hide(); - if (g.ocIntercept == this) g.ocIntercept = NULL; - g.mw->bNoHide = true; foreach(QWidget *w, widgetlist) { if (bWasVisible) w->show(); } g.mw->bNoHide = false; + + setupScene(); qgv.setAttribute(Qt::WA_WState_Hidden, true); #if defined(Q_WS_WIN) || defined(Q_WS_MAC) qt_use_native_dialogs = true; #endif - if (qgpiLogo) - qgpiLogo->hide(); - qgs.setBackgroundBrush(Qt::NoBrush); - if (bDelete) deleteLater(); } @@ -724,11 +755,6 @@ void OverlayClient::readyRead() { void OverlayClient::reset() { if (! uiWidth || ! uiHeight || ! smMem) return; - setupRender(); -} - -void OverlayClient::setupRender() { - iItemHeight = iroundf(uiHeight * g.s.fOverlayHeight + 0.5f); foreach(OverlayUser *ou, qmUsers) delete ou; @@ -738,6 +764,56 @@ void OverlayClient::setupRender() { delete qgpiLogo; qgpiLogo = NULL; } + + foreach(OverlayUser *ou, qlExampleUsers) + delete ou; + qlExampleUsers.clear(); + + setupScene(); +} + +void OverlayClient::setupScene() { + if (qgpiCursor->isVisible()) { + qgs.setBackgroundBrush(QColor(0,0,0,64)); + + if (! qgpiLogo) { + qgpiLogo = new OverlayMouse(); + qgpiLogo->hide(); + qgpiLogo->setOpacity(0.8f); + qgpiLogo->setZValue(-5.0f); + + + QImageReader qir(QLatin1String("skin:mumble.svg")); + QSize sz = qir.size(); + sz.scale(uiWidth, uiHeight, Qt::KeepAspectRatio); + qir.setScaledSize(sz); + + qgpiLogo->setPixmap(QPixmap::fromImage(qir.read())); + + QRectF qrf = qgpiLogo->boundingRect(); + qgpiLogo->setPos(iroundf((uiWidth - qrf.width()) / 2.0f), iroundf((uiHeight - qrf.height()) / 2.0f)); + + qgs.addItem(qgpiLogo); + } + qgpiLogo->show(); + + if (qlExampleUsers.isEmpty()) { + qlExampleUsers << new OverlayUser(OverlayUser::Passive, iItemHeight); + qlExampleUsers << new OverlayUser(OverlayUser::Linked, iItemHeight); + qlExampleUsers << new OverlayUser(OverlayUser::Talking, iItemHeight); + qlExampleUsers << new OverlayUser(OverlayUser::WhisperPrivate, iItemHeight); + qlExampleUsers << new OverlayUser(OverlayUser::WhisperChannel, iItemHeight); + } + } else { + qgs.setBackgroundBrush(Qt::NoBrush); + + if (qgpiLogo) + qgpiLogo->hide(); + } +} + +void OverlayClient::setupRender() { + iItemHeight = iroundf(uiHeight * g.s.fOverlayHeight + 0.5f); qgs.setSceneRect(0, 0, uiWidth, uiHeight); qgv.setScene(NULL); @@ -756,20 +832,26 @@ void OverlayClient::setupRender() { om.omb.w = uiWidth; om.omb.h = uiHeight; qlsSocket->write(om.headerbuffer, sizeof(OverlayMsgHeader) + sizeof(OverlayMsgBlit)); + + reset(); } bool OverlayClient::setTexts(const QList &lines) { if (! uiWidth || ! uiHeight || ! smMem) return true; - int y = 0; - int x = 0; - QList items; foreach(QGraphicsItem *qgi, qgs.items()) if (! qgi->parentItem() && (qgi->type() == 10)) items << qgi; + QList users; + if (qgpiCursor->isVisible()) { + users = qlExampleUsers; + foreach(OverlayUser *ou, users) + items.removeAll(ou); + } + foreach(const OverlayTextLine &e, lines) { if (e.uiSession != 0) { ClientUser *cu = ClientUser::get(e.uiSession); @@ -782,25 +864,32 @@ bool OverlayClient::setTexts(const QList &lines) { } else { items.removeAll(ou); } - - ou->setPos(iroundf(uiWidth * g.s.fOverlayX + x * iItemHeight * 1.05f), iroundf(uiHeight * g.s.fOverlayY + y * iItemHeight * 1.05f)); - ou->updateUser(); - - if (! ou->scene()) - qgs.addItem(ou); - - if (x) { - x = 0; - ++y; - } else { - x = 1; - } + users << ou; } } foreach(QGraphicsItem *qgi, items) qgs.removeItem(qgi); + int y = 0; + int x = 0; + + foreach(OverlayUser *ou, users) { + ou->setPos(iroundf(uiWidth * g.s.fOverlayX + x * iItemHeight * 1.05f), iroundf(uiHeight * g.s.fOverlayY + y * iItemHeight * 1.05f)); + ou->show(); + ou->updateUser(); + + if (! ou->scene()) + qgs.addItem(ou); + + if (x) { + x = 0; + ++y; + } else { + x = 1; + } + } + if (qlsSocket->bytesToWrite() > 1024) { return (t.elapsed() <= 5000000ULL); } else { @@ -990,6 +1079,7 @@ bool Overlay::isActive() const { void Overlay::toggleShow() { if (g.ocIntercept) { g.ocIntercept->hideGui(); + updateOverlay(); } else { foreach(OverlayClient *oc, qlClients) { if (oc->uiPid) { @@ -1001,6 +1091,7 @@ void Overlay::toggleShow() { continue; #endif oc->showGui(); + updateOverlay(); return; } } diff --git a/src/mumble/Overlay.h b/src/mumble/Overlay.h index 7661305fb..7641d8e65 100644 --- a/src/mumble/Overlay.h +++ b/src/mumble/Overlay.h @@ -82,8 +82,9 @@ struct OverlayTextLine { class OverlayUser : public QGraphicsItemGroup { private: Q_DISABLE_COPY(OverlayUser); - protected: + public: enum TextColor { Passive, Talking, Linked, WhisperPrivate, WhisperChannel }; + protected: QGraphicsPixmapItem *qgpiMuted, *qgpiDeafened; QGraphicsPixmapItem *qgpiAvatar; QGraphicsPixmapItem *qgpiName[5]; @@ -91,13 +92,18 @@ class OverlayUser : public QGraphicsItemGroup { unsigned int uiSize; ClientUser *cuUser; + TextColor tcColor; + QString qsName; QString qsChannelName; QByteArray qbaAvatar; - + + void setup(); public: OverlayUser(ClientUser *cu, unsigned int uiSize); + OverlayUser(TextColor tc, unsigned int uiSize); void updateUser(); + void updateLayout(); static QPixmap createPixmap(const QString &str, unsigned int height, unsigned int maxwidth, QColor col, QPainterPath &); }; @@ -131,11 +137,13 @@ class OverlayClient : public QObject { quint64 uiPid; QGraphicsScene qgs; QMap qmUsers; + QList qlExampleUsers; bool bWasVisible; bool bDelete; void setupRender(); + void setupScene(); bool eventFilter(QObject *, QEvent *);