mirror of
https://git.jami.net/savoirfairelinux/jami-client-qt.git
synced 2025-09-07 18:43:34 +02:00
callactionbar: avoid multiple resets
GitLab: #1073 Change-Id: I7dc2ab632170a959b8d29979deacd3fb03ff6671
This commit is contained in:
parent
b611685653
commit
948e2cc837
4 changed files with 104 additions and 80 deletions
|
@ -35,10 +35,11 @@ IndexRangeFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex& s
|
|||
{
|
||||
auto index = sourceModel()->index(sourceRow, 0, sourceParent);
|
||||
bool predicate = true;
|
||||
bool enabled = sourceModel()->data(index, CallControl::Role::Enabled).toBool();
|
||||
if (filterRole() != Qt::DisplayRole) {
|
||||
predicate = sourceModel()->data(index, filterRole()).toInt() != 0;
|
||||
}
|
||||
return sourceRow <= max_ && sourceRow >= min_ && predicate;
|
||||
return sourceRow <= max_ && sourceRow >= min_ && predicate && enabled;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -197,10 +198,12 @@ CallControlListModel::data(const QModelIndex& index, int role) const
|
|||
auto item = data_.at(index.row());
|
||||
|
||||
switch (role) {
|
||||
case Role::ItemAction:
|
||||
case CallControl::Role::ItemAction:
|
||||
return QVariant::fromValue(item.itemAction);
|
||||
case Role::UrgentCount:
|
||||
case CallControl::Role::UrgentCount:
|
||||
return QVariant::fromValue(item.urgentCount);
|
||||
case CallControl::Role::Enabled:
|
||||
return QVariant::fromValue(item.enabled);
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
@ -212,6 +215,7 @@ CallControlListModel::roleNames() const
|
|||
QHash<int, QByteArray> roles;
|
||||
roles[ItemAction] = "ItemAction";
|
||||
roles[UrgentCount] = "UrgentCount";
|
||||
roles[Enabled] = "Enabled";
|
||||
return roles;
|
||||
}
|
||||
|
||||
|
@ -232,6 +236,24 @@ CallControlListModel::setUrgentCount(QVariant item, int count)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
CallControlListModel::setEnabled(QObject* obj, bool enabled)
|
||||
{
|
||||
beginResetModel();
|
||||
auto it = std::find_if(data_.cbegin(), data_.cend(), [obj](const auto& item) {
|
||||
return item.itemAction == obj;
|
||||
});
|
||||
if (it != data_.cend()) {
|
||||
auto row = std::distance(data_.cbegin(), it);
|
||||
if (row >= rowCount())
|
||||
return;
|
||||
data_[row].enabled = enabled;
|
||||
auto idx = index(row, 0);
|
||||
Q_EMIT dataChanged(idx, idx);
|
||||
}
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
void
|
||||
CallControlListModel::addItem(const CallControl::Item& item)
|
||||
{
|
||||
|
@ -264,15 +286,15 @@ CallOverlayModel::CallOverlayModel(LRCInstance* instance, QObject* parent)
|
|||
}
|
||||
|
||||
void
|
||||
CallOverlayModel::addPrimaryControl(const QVariant& action)
|
||||
CallOverlayModel::addPrimaryControl(const QVariant& action, bool enabled)
|
||||
{
|
||||
primaryModel_->addItem(CallControl::Item {action.value<QObject*>()});
|
||||
primaryModel_->addItem(CallControl::Item {action.value<QObject*>(), enabled});
|
||||
}
|
||||
|
||||
void
|
||||
CallOverlayModel::addSecondaryControl(const QVariant& action)
|
||||
CallOverlayModel::addSecondaryControl(const QVariant& action, bool enabled)
|
||||
{
|
||||
secondaryModel_->addItem(CallControl::Item {action.value<QObject*>()});
|
||||
secondaryModel_->addItem(CallControl::Item {action.value<QObject*>(), enabled});
|
||||
setControlRanges();
|
||||
}
|
||||
|
||||
|
@ -282,6 +304,13 @@ CallOverlayModel::setUrgentCount(QVariant row, int count)
|
|||
secondaryModel_->setUrgentCount(row, count);
|
||||
}
|
||||
|
||||
void
|
||||
CallOverlayModel::setEnabled(QObject* obj, bool enabled)
|
||||
{
|
||||
primaryModel_->setEnabled(obj, enabled);
|
||||
secondaryModel_->setEnabled(obj, enabled);
|
||||
}
|
||||
|
||||
QVariant
|
||||
CallOverlayModel::primaryModel()
|
||||
{
|
||||
|
@ -363,7 +392,8 @@ CallOverlayModel::eventFilter(QObject* object, QEvent* event)
|
|||
void
|
||||
CallOverlayModel::setControlRanges()
|
||||
{
|
||||
auto count = secondaryModel_->rowCount();
|
||||
overflowModel_->setRange(0, overflowIndex_);
|
||||
overflowVisibleModel_->setRange(overflowIndex_, secondaryModel_->rowCount());
|
||||
overflowHiddenModel_->setRange(overflowIndex_ + 1, secondaryModel_->rowCount());
|
||||
overflowVisibleModel_->setRange(overflowIndex_, count);
|
||||
overflowHiddenModel_->setRange(overflowIndex_ + 1, count);
|
||||
}
|
||||
|
|
|
@ -36,12 +36,13 @@
|
|||
|
||||
namespace CallControl {
|
||||
Q_NAMESPACE
|
||||
enum Role { ItemAction = Qt::UserRole + 1, UrgentCount };
|
||||
enum Role { ItemAction = Qt::UserRole + 1, UrgentCount, Enabled};
|
||||
Q_ENUM_NS(Role)
|
||||
|
||||
struct Item
|
||||
{
|
||||
QObject* itemAction;
|
||||
bool enabled {true};
|
||||
int urgentCount {0};
|
||||
};
|
||||
} // namespace CallControl
|
||||
|
@ -106,6 +107,7 @@ public:
|
|||
QHash<int, QByteArray> roleNames() const override;
|
||||
|
||||
void setUrgentCount(QVariant item, int count);
|
||||
void setEnabled(QObject* obj, bool enabled);
|
||||
void addItem(const CallControl::Item& item);
|
||||
void clearData();
|
||||
|
||||
|
@ -121,9 +123,10 @@ class CallOverlayModel : public QObject
|
|||
public:
|
||||
CallOverlayModel(LRCInstance* instance, QObject* parent = nullptr);
|
||||
|
||||
Q_INVOKABLE void addPrimaryControl(const QVariant& action);
|
||||
Q_INVOKABLE void addSecondaryControl(const QVariant& action);
|
||||
Q_INVOKABLE void addPrimaryControl(const QVariant& action, bool enabled);
|
||||
Q_INVOKABLE void addSecondaryControl(const QVariant& action, bool enabled);
|
||||
Q_INVOKABLE void setUrgentCount(QVariant item, int count);
|
||||
Q_INVOKABLE void setEnabled(QObject* obj, bool enabled);
|
||||
Q_INVOKABLE void clearControls();
|
||||
|
||||
Q_INVOKABLE QVariant primaryModel();
|
||||
|
|
|
@ -43,6 +43,13 @@ CurrentCall::CurrentCall(LRCInstance* lrcInstance, QObject* parent)
|
|||
this,
|
||||
&CurrentCall::onShowIncomingCallView);
|
||||
|
||||
try {
|
||||
auto& accInfo = lrcInstance_->getCurrentAccountInfo();
|
||||
set_isSIP(accInfo.profileInfo.type == profile::Type::SIP);
|
||||
} catch (const std::exception& e) {
|
||||
qWarning() << "Can't update current call type" << e.what();
|
||||
}
|
||||
|
||||
connectModel();
|
||||
}
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import SortFilterProxyModel 0.2
|
||||
import net.jami.Models 1.1
|
||||
import net.jami.Adapters 1.1
|
||||
import net.jami.Constants 1.1
|
||||
|
@ -299,6 +300,8 @@ Control {
|
|||
text: !checked ? JamiStrings.muteCamera : JamiStrings.unmuteCamera
|
||||
checked: !CurrentCall.isCapturing
|
||||
property var menuAction: videoInputMenuAction
|
||||
enabled: CurrentAccount.videoEnabled_Video
|
||||
onEnabledChanged: CallOverlayModel.setEnabled(this, muteVideoAction.enabled)
|
||||
}
|
||||
]
|
||||
|
||||
|
@ -319,6 +322,8 @@ Control {
|
|||
icon.source: JamiResources.add_people_black_24dp_svg
|
||||
icon.color: "white"
|
||||
text: JamiStrings.addParticipants
|
||||
enabled: CurrentCall.isModerator && !CurrentCall.isSIP
|
||||
onEnabledChanged: CallOverlayModel.setEnabled(this, addPersonAction.enabled)
|
||||
},
|
||||
Action {
|
||||
id: chatAction
|
||||
|
@ -333,6 +338,8 @@ Control {
|
|||
icon.source: CurrentCall.isPaused ? JamiResources.play_circle_outline_24dp_svg : JamiResources.pause_circle_outline_24dp_svg
|
||||
icon.color: "white"
|
||||
text: CurrentCall.isPaused ? JamiStrings.resumeCall : JamiStrings.pauseCall
|
||||
enabled: CurrentCall.isSIP
|
||||
onEnabledChanged: CallOverlayModel.setEnabled(this, resumePauseCallAction.enabled)
|
||||
},
|
||||
Action {
|
||||
id: inputPanelSIPAction
|
||||
|
@ -340,6 +347,8 @@ Control {
|
|||
icon.source: JamiResources.ic_keypad_svg
|
||||
icon.color: "white"
|
||||
text: JamiStrings.sipInputPanel
|
||||
enabled: CurrentCall.isSIP
|
||||
onEnabledChanged: CallOverlayModel.setEnabled(this, inputPanelSIPAction.enabled)
|
||||
},
|
||||
Action {
|
||||
id: callTransferAction
|
||||
|
@ -347,6 +356,8 @@ Control {
|
|||
icon.source: JamiResources.phone_forwarded_24dp_svg
|
||||
icon.color: "white"
|
||||
text: JamiStrings.transferCall
|
||||
enabled: CurrentCall.isSIP
|
||||
onEnabledChanged: CallOverlayModel.setEnabled(this, callTransferAction.enabled)
|
||||
},
|
||||
Action {
|
||||
id: shareAction
|
||||
|
@ -361,6 +372,8 @@ Control {
|
|||
text: CurrentCall.isSharing ? JamiStrings.stopSharing : JamiStrings.shareScreen
|
||||
property real size: 34
|
||||
property var menuAction: shareMenuAction
|
||||
enabled: CurrentAccount.videoEnabled_Video && !CurrentCall.isSIP
|
||||
onEnabledChanged: CallOverlayModel.setEnabled(this, shareAction.enabled)
|
||||
},
|
||||
Action {
|
||||
id: raiseHandAction
|
||||
|
@ -371,6 +384,8 @@ Control {
|
|||
text: checked ? JamiStrings.lowerHand : JamiStrings.raiseHand
|
||||
checked: CurrentCall.isHandRaised
|
||||
property real size: 34
|
||||
enabled: CurrentCall.isConference
|
||||
onEnabledChanged: CallOverlayModel.setEnabled(this, raiseHandAction.enabled)
|
||||
},
|
||||
Action {
|
||||
id: layoutAction
|
||||
|
@ -406,6 +421,7 @@ Control {
|
|||
icon.color: "white"
|
||||
text: JamiStrings.viewPlugin
|
||||
enabled: PluginAdapter.isEnabled && PluginAdapter.callMediaHandlersListCount
|
||||
onEnabledChanged: CallOverlayModel.setEnabled(this, pluginsAction.enabled)
|
||||
},
|
||||
Action {
|
||||
id: swarmDetailsAction
|
||||
|
@ -414,7 +430,7 @@ Control {
|
|||
icon.color: "white"
|
||||
text: JamiStrings.details
|
||||
enabled: {
|
||||
if (LRCInstance.currentAccountType === Profile.Type.SIP)
|
||||
if (CurrentCall.isSIP)
|
||||
return true;
|
||||
if (!CurrentConversation.isTemporary && !CurrentConversation.isSwarm)
|
||||
return false;
|
||||
|
@ -422,81 +438,35 @@ Control {
|
|||
return false;
|
||||
return true;
|
||||
}
|
||||
onEnabledChanged: CallOverlayModel.setEnabled(this, swarmDetailsAction.enabled)
|
||||
}
|
||||
]
|
||||
|
||||
property var overflowItemCount
|
||||
|
||||
Connections {
|
||||
target: CurrentCall
|
||||
|
||||
function onIsActiveChanged() {
|
||||
if (CurrentCall.isActive)
|
||||
reset();
|
||||
}
|
||||
function onIsRecordingLocallyChanged() {
|
||||
Qt.callLater(reset);
|
||||
}
|
||||
function onIsHandRaisedChanged() {
|
||||
Qt.callLater(reset);
|
||||
}
|
||||
function onIsConferenceChanged() {
|
||||
Qt.callLater(reset);
|
||||
}
|
||||
function onIsModeratorChanged() {
|
||||
Qt.callLater(reset);
|
||||
}
|
||||
function onIsSIPChanged() {
|
||||
Qt.callLater(reset);
|
||||
}
|
||||
function onIsAudioOnlyChanged() {
|
||||
Qt.callLater(reset);
|
||||
}
|
||||
function onIsAudioMutedChanged() {
|
||||
Qt.callLater(reset);
|
||||
}
|
||||
function onIsVideoMutedChanged() {
|
||||
Qt.callLater(reset);
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: CurrentAccount
|
||||
function onVideoEnabledVideoChanged() {
|
||||
reset();
|
||||
}
|
||||
}
|
||||
|
||||
function reset() {
|
||||
Component.onCompleted: {
|
||||
CallOverlayModel.clearControls();
|
||||
|
||||
// centered controls
|
||||
CallOverlayModel.addPrimaryControl(muteAudioAction);
|
||||
CallOverlayModel.addPrimaryControl(hangupAction);
|
||||
if (CurrentAccount.videoEnabled_Video)
|
||||
CallOverlayModel.addPrimaryControl(muteVideoAction);
|
||||
CallOverlayModel.addPrimaryControl(muteAudioAction, muteAudioAction.enabled);
|
||||
CallOverlayModel.addPrimaryControl(hangupAction, hangupAction.enabled);
|
||||
CallOverlayModel.addPrimaryControl(muteVideoAction, muteVideoAction.enabled);
|
||||
|
||||
// overflow controls
|
||||
CallOverlayModel.addSecondaryControl(audioOutputAction);
|
||||
if (CurrentCall.isConference) {
|
||||
CallOverlayModel.addSecondaryControl(raiseHandAction);
|
||||
}
|
||||
if (CurrentCall.isModerator && !CurrentCall.isSIP)
|
||||
CallOverlayModel.addSecondaryControl(addPersonAction);
|
||||
if (CurrentCall.isSIP) {
|
||||
CallOverlayModel.addSecondaryControl(resumePauseCallAction);
|
||||
CallOverlayModel.addSecondaryControl(inputPanelSIPAction);
|
||||
CallOverlayModel.addSecondaryControl(callTransferAction);
|
||||
}
|
||||
CallOverlayModel.addSecondaryControl(chatAction);
|
||||
if (CurrentAccount.videoEnabled_Video && !CurrentCall.isSIP)
|
||||
CallOverlayModel.addSecondaryControl(shareAction);
|
||||
CallOverlayModel.addSecondaryControl(layoutAction);
|
||||
CallOverlayModel.addSecondaryControl(recordAction);
|
||||
if (pluginsAction.enabled)
|
||||
CallOverlayModel.addSecondaryControl(pluginsAction);
|
||||
if (swarmDetailsAction.enabled)
|
||||
CallOverlayModel.addSecondaryControl(swarmDetailsAction);
|
||||
CallOverlayModel.addSecondaryControl(audioOutputAction, audioOutputAction.enabled);
|
||||
CallOverlayModel.addSecondaryControl(raiseHandAction, raiseHandAction.enabled);
|
||||
CallOverlayModel.addSecondaryControl(addPersonAction, addPersonAction.enabled);
|
||||
|
||||
CallOverlayModel.addSecondaryControl(resumePauseCallAction, resumePauseCallAction.enabled);
|
||||
CallOverlayModel.addSecondaryControl(inputPanelSIPAction, inputPanelSIPAction.enabled);
|
||||
CallOverlayModel.addSecondaryControl(callTransferAction, callTransferAction.enabled);
|
||||
|
||||
CallOverlayModel.addSecondaryControl(chatAction, chatAction.enabled);
|
||||
CallOverlayModel.addSecondaryControl(shareAction, shareAction.enabled);
|
||||
CallOverlayModel.addSecondaryControl(layoutAction, layoutAction.enabled);
|
||||
CallOverlayModel.addSecondaryControl(recordAction, recordAction.enabled);
|
||||
CallOverlayModel.addSecondaryControl(pluginsAction, pluginsAction.enabled);
|
||||
CallOverlayModel.addSecondaryControl(swarmDetailsAction, swarmDetailsAction.enabled);
|
||||
overflowItemCount = CallOverlayModel.secondaryModel().rowCount();
|
||||
}
|
||||
|
||||
|
@ -519,7 +489,13 @@ Control {
|
|||
implicitHeight: contentHeight
|
||||
interactive: false
|
||||
|
||||
model: CallOverlayModel.primaryModel()
|
||||
model: SortFilterProxyModel {
|
||||
sourceModel: CallOverlayModel.primaryModel()
|
||||
filters: ValueFilter {
|
||||
roleName: "Enabled"
|
||||
value: true
|
||||
}
|
||||
}
|
||||
delegate: buttonDelegate
|
||||
}
|
||||
}
|
||||
|
@ -547,7 +523,15 @@ Control {
|
|||
|
||||
property int overflowIndex: {
|
||||
var maxItems = Math.floor((overflowRect.remainingSpace) / (root.height + itemSpacing)) - 2;
|
||||
return Math.min(overflowItemCount, maxItems);
|
||||
var idx = Math.min(overflowItemCount, maxItems);
|
||||
idx = Math.max(0, idx);
|
||||
if (CallOverlayModel.overflowModel().rowCount() > 0 || CallOverlayModel.overflowHiddenModel().rowCount() > 0) {
|
||||
var visibleIdx = CallOverlayModel.overflowModel().mapToSource(CallOverlayModel.overflowModel().index(idx, 0)).row;
|
||||
var hiddenIdx = CallOverlayModel.overflowHiddenModel().mapToSource(CallOverlayModel.overflowHiddenModel().index(idx - CallOverlayModel.overflowModel().rowCount(), 0)).row;
|
||||
if (visibleIdx >= 0 || hiddenIdx >= 0)
|
||||
idx = Math.max(visibleIdx, hiddenIdx);
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
property int nOverflowItems: overflowItemCount - overflowIndex
|
||||
onNOverflowItemsChanged: {
|
||||
|
|
Loading…
Add table
Reference in a new issue