summary refs log tree commit diff
path: root/src/ActiveCallBar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ActiveCallBar.cpp')
-rw-r--r--src/ActiveCallBar.cpp160
1 files changed, 160 insertions, 0 deletions
diff --git a/src/ActiveCallBar.cpp b/src/ActiveCallBar.cpp
new file mode 100644
index 00000000..c0d2c13a
--- /dev/null
+++ b/src/ActiveCallBar.cpp
@@ -0,0 +1,160 @@
+#include <cstdio>
+
+#include <QDateTime>
+#include <QHBoxLayout>
+#include <QIcon>
+#include <QLabel>
+#include <QString>
+#include <QTimer>
+
+#include "ActiveCallBar.h"
+#include "ChatPage.h"
+#include "Utils.h"
+#include "WebRTCSession.h"
+#include "ui/Avatar.h"
+#include "ui/FlatButton.h"
+
+ActiveCallBar::ActiveCallBar(QWidget *parent)
+  : QWidget(parent)
+{
+        setAutoFillBackground(true);
+        auto p = palette();
+        p.setColor(backgroundRole(), QColor(46, 204, 113));
+        setPalette(p);
+
+        QFont f;
+        f.setPointSizeF(f.pointSizeF());
+
+        const int fontHeight    = QFontMetrics(f).height();
+        const int widgetMargin  = fontHeight / 3;
+        const int contentHeight = fontHeight * 3;
+
+        setFixedHeight(contentHeight + widgetMargin);
+
+        layout_ = new QHBoxLayout(this);
+        layout_->setSpacing(widgetMargin);
+        layout_->setContentsMargins(2 * widgetMargin, widgetMargin, 2 * widgetMargin, widgetMargin);
+
+        QFont labelFont;
+        labelFont.setPointSizeF(labelFont.pointSizeF() * 1.1);
+        labelFont.setWeight(QFont::Medium);
+
+        avatar_ = new Avatar(this, QFontMetrics(f).height() * 2.5);
+
+        callPartyLabel_ = new QLabel(this);
+        callPartyLabel_->setFont(labelFont);
+
+        stateLabel_ = new QLabel(this);
+        stateLabel_->setFont(labelFont);
+
+        durationLabel_ = new QLabel(this);
+        durationLabel_->setFont(labelFont);
+        durationLabel_->hide();
+
+        muteBtn_ = new FlatButton(this);
+        setMuteIcon(false);
+        muteBtn_->setFixedSize(buttonSize_, buttonSize_);
+        muteBtn_->setCornerRadius(buttonSize_ / 2);
+        connect(muteBtn_, &FlatButton::clicked, this, [this]() {
+                if (WebRTCSession::instance().toggleMuteAudioSrc(muted_))
+                        setMuteIcon(muted_);
+        });
+
+        layout_->addWidget(avatar_, 0, Qt::AlignLeft);
+        layout_->addWidget(callPartyLabel_, 0, Qt::AlignLeft);
+        layout_->addWidget(stateLabel_, 0, Qt::AlignLeft);
+        layout_->addWidget(durationLabel_, 0, Qt::AlignLeft);
+        layout_->addStretch();
+        layout_->addWidget(muteBtn_, 0, Qt::AlignCenter);
+        layout_->addSpacing(18);
+
+        timer_ = new QTimer(this);
+        connect(timer_, &QTimer::timeout, this, [this]() {
+                auto seconds = QDateTime::currentSecsSinceEpoch() - callStartTime_;
+                int s        = seconds % 60;
+                int m        = (seconds / 60) % 60;
+                int h        = seconds / 3600;
+                char buf[12];
+                if (h)
+                        snprintf(buf, sizeof(buf), "%.2d:%.2d:%.2d", h, m, s);
+                else
+                        snprintf(buf, sizeof(buf), "%.2d:%.2d", m, s);
+                durationLabel_->setText(buf);
+        });
+
+        connect(
+          &WebRTCSession::instance(), &WebRTCSession::stateChanged, this, &ActiveCallBar::update);
+}
+
+void
+ActiveCallBar::setMuteIcon(bool muted)
+{
+        QIcon icon;
+        if (muted) {
+                muteBtn_->setToolTip("Unmute Mic");
+                icon.addFile(":/icons/icons/ui/microphone-unmute.png");
+        } else {
+                muteBtn_->setToolTip("Mute Mic");
+                icon.addFile(":/icons/icons/ui/microphone-mute.png");
+        }
+        muteBtn_->setIcon(icon);
+        muteBtn_->setIconSize(QSize(buttonSize_, buttonSize_));
+}
+
+void
+ActiveCallBar::setCallParty(const QString &userid,
+                            const QString &displayName,
+                            const QString &roomName,
+                            const QString &avatarUrl)
+{
+        callPartyLabel_->setText("  " + (displayName.isEmpty() ? userid : displayName) + " ");
+
+        if (!avatarUrl.isEmpty())
+                avatar_->setImage(avatarUrl);
+        else
+                avatar_->setLetter(utils::firstChar(roomName));
+}
+
+void
+ActiveCallBar::update(WebRTCSession::State state)
+{
+        switch (state) {
+        case WebRTCSession::State::INITIATING:
+                show();
+                stateLabel_->setText("Initiating call...");
+                break;
+        case WebRTCSession::State::INITIATED:
+                show();
+                stateLabel_->setText("Call initiated...");
+                break;
+        case WebRTCSession::State::OFFERSENT:
+                show();
+                stateLabel_->setText("Calling...");
+                break;
+        case WebRTCSession::State::CONNECTING:
+                show();
+                stateLabel_->setText("Connecting...");
+                break;
+        case WebRTCSession::State::CONNECTED:
+                show();
+                callStartTime_ = QDateTime::currentSecsSinceEpoch();
+                timer_->start(1000);
+                stateLabel_->setPixmap(
+                  QIcon(":/icons/icons/ui/place-call.png").pixmap(QSize(buttonSize_, buttonSize_)));
+                durationLabel_->setText("00:00");
+                durationLabel_->show();
+                break;
+        case WebRTCSession::State::ICEFAILED:
+        case WebRTCSession::State::DISCONNECTED:
+                hide();
+                timer_->stop();
+                callPartyLabel_->setText(QString());
+                stateLabel_->setText(QString());
+                durationLabel_->setText(QString());
+                durationLabel_->hide();
+                setMuteIcon(false);
+                break;
+        default:
+                break;
+        }
+}