forked from mirror/nheko
commit
5cce5b9999
@ -0,0 +1,111 @@ |
||||
import QtQuick 2.9 |
||||
import QtQuick.Controls 2.3 |
||||
import QtQuick.Layouts 1.2 |
||||
|
||||
import im.nheko 1.0 |
||||
|
||||
Rectangle { |
||||
id: activeCallBar |
||||
visible: timelineManager.callState != WebRTCState.DISCONNECTED |
||||
color: "#2ECC71" |
||||
implicitHeight: rowLayout.height + 8 |
||||
|
||||
RowLayout { |
||||
id: rowLayout |
||||
anchors.left: parent.left |
||||
anchors.right: parent.right |
||||
anchors.verticalCenter: parent.verticalCenter |
||||
anchors.leftMargin: 8 |
||||
|
||||
Avatar { |
||||
width: avatarSize |
||||
height: avatarSize |
||||
|
||||
url: timelineManager.callPartyAvatarUrl.replace("mxc://", "image://MxcImage/") |
||||
displayName: timelineManager.callPartyName |
||||
} |
||||
|
||||
Label { |
||||
font.pointSize: fontMetrics.font.pointSize * 1.1 |
||||
text: " " + timelineManager.callPartyName + " " |
||||
} |
||||
|
||||
Image { |
||||
Layout.preferredWidth: 24 |
||||
Layout.preferredHeight: 24 |
||||
source: "qrc:/icons/icons/ui/place-call.png" |
||||
} |
||||
|
||||
Label { |
||||
id: callStateLabel |
||||
font.pointSize: fontMetrics.font.pointSize * 1.1 |
||||
} |
||||
|
||||
Connections { |
||||
target: timelineManager |
||||
function onCallStateChanged(state) { |
||||
switch (state) { |
||||
case WebRTCState.INITIATING: |
||||
callStateLabel.text = qsTr("Initiating...") |
||||
break; |
||||
case WebRTCState.OFFERSENT: |
||||
callStateLabel.text = qsTr("Calling...") |
||||
break; |
||||
case WebRTCState.CONNECTING: |
||||
callStateLabel.text = qsTr("Connecting...") |
||||
break; |
||||
case WebRTCState.CONNECTED: |
||||
callStateLabel.text = "00:00" |
||||
var d = new Date() |
||||
callTimer.startTime = Math.floor(d.getTime() / 1000) |
||||
break; |
||||
case WebRTCState.DISCONNECTED: |
||||
callStateLabel.text = "" |
||||
} |
||||
} |
||||
} |
||||
|
||||
Timer { |
||||
id: callTimer |
||||
property int startTime |
||||
interval: 1000 |
||||
running: timelineManager.callState == WebRTCState.CONNECTED |
||||
repeat: true |
||||
onTriggered: { |
||||
var d = new Date() |
||||
let seconds = Math.floor(d.getTime() / 1000 - startTime) |
||||
let s = Math.floor(seconds % 60) |
||||
let m = Math.floor(seconds / 60) % 60 |
||||
let h = Math.floor(seconds / 3600) |
||||
callStateLabel.text = (h ? (pad(h) + ":") : "") + pad(m) + ":" + pad(s) |
||||
} |
||||
|
||||
function pad(n) { |
||||
return (n < 10) ? ("0" + n) : n |
||||
} |
||||
} |
||||
|
||||
Item { |
||||
Layout.fillWidth: true |
||||
} |
||||
|
||||
ImageButton { |
||||
width: 24 |
||||
height: 24 |
||||
buttonTextColor: "#000000" |
||||
image: timelineManager.isMicMuted ? |
||||
":/icons/icons/ui/microphone-unmute.png" : |
||||
":/icons/icons/ui/microphone-mute.png" |
||||
|
||||
hoverEnabled: true |
||||
ToolTip.visible: hovered |
||||
ToolTip.text: timelineManager.isMicMuted ? qsTr("Unmute Mic") : qsTr("Mute Mic") |
||||
|
||||
onClicked: timelineManager.toggleMicMute() |
||||
} |
||||
|
||||
Item { |
||||
implicitWidth: 16 |
||||
} |
||||
} |
||||
} |
@ -1,160 +0,0 @@ |
||||
#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; |
||||
} |
||||
} |
@ -1,40 +0,0 @@ |
||||
#pragma once |
||||
|
||||
#include <QWidget> |
||||
|
||||
#include "WebRTCSession.h" |
||||
|
||||
class QHBoxLayout; |
||||
class QLabel; |
||||
class QTimer; |
||||
class Avatar; |
||||
class FlatButton; |
||||
|
||||
class ActiveCallBar : public QWidget |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
public: |
||||
ActiveCallBar(QWidget *parent = nullptr); |
||||
|
||||
public slots: |
||||
void update(WebRTCSession::State); |
||||
void setCallParty(const QString &userid, |
||||
const QString &displayName, |
||||
const QString &roomName, |
||||
const QString &avatarUrl); |
||||
|
||||
private: |
||||
QHBoxLayout *layout_ = nullptr; |
||||
Avatar *avatar_ = nullptr; |
||||
QLabel *callPartyLabel_ = nullptr; |
||||
QLabel *stateLabel_ = nullptr; |
||||
QLabel *durationLabel_ = nullptr; |
||||
FlatButton *muteBtn_ = nullptr; |
||||
int buttonSize_ = 22; |
||||
bool muted_ = false; |
||||
qint64 callStartTime_ = 0; |
||||
QTimer *timer_ = nullptr; |
||||
|
||||
void setMuteIcon(bool muted); |
||||
}; |
Loading…
Reference in new issue