Fix security level synchronization in chat rooms.

Fix hidden admin status on first group chat creation.
Fix Magic search that could retrieve addresses with Gruu.
Fix debug outputs on missing colors.
Fix click area in call list.
Fix some missing items in qml.
This commit is contained in:
Julien Wadel 2023-08-02 18:09:45 +02:00
parent b8a6339e69
commit dbf63b0c3e
10 changed files with 93 additions and 36 deletions

View file

@ -63,6 +63,7 @@ CallModel::CallModel (shared_ptr<linphone::Call> call){
connect(this, &CallModel::callIdChanged, this, &CallModel::chatRoomModelChanged);// When the call Id change, the chat room change.
connect(this, &CallModel::encryptionChanged, this, &CallModel::securityUpdated);
connect(this, &CallModel::isPQZrtpChanged, this, &CallModel::securityUpdated);
connect(this, &CallModel::securityUpdated, this, &CallModel::onSecurityUpdated);
mCall = call;
if(mCall)
@ -1024,6 +1025,12 @@ void CallModel::onParticipantAdminStatusChanged(const std::shared_ptr<const linp
}
}
void CallModel::onSecurityUpdated(){
ChatRoomModel * model = getChatRoomModel();
if(model)
model->updateSecurityLevel();
}
void CallModel::setRemoteDisplayName(const std::string& name){
mRemoteAddress->setDisplayName(name);
if(mCall) {

View file

@ -209,6 +209,7 @@ public slots:
void onRemoteRecording(const std::shared_ptr<linphone::Call> & call, bool recording);
void onChatRoomInitialized(int state);
void onParticipantAdminStatusChanged(const std::shared_ptr<const linphone::Participant> & participant);
void onSecurityUpdated();
signals:
void meAdminChanged();

View file

@ -33,86 +33,114 @@ ChatRoomListener::~ChatRoomListener(){
//---------------------------------------------------------------------------------------------------
void ChatRoomListener::onIsComposingReceived(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::Address> & remoteAddress, bool isComposing){
//qDebug() << "ChatRoomListener::onIsComposingReceived";
emit isComposingReceived(chatRoom, remoteAddress, isComposing);
}
void ChatRoomListener::onMessageReceived(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<linphone::ChatMessage> & message){
//qDebug() << "ChatRoomListener::onMessageReceived";
emit messageReceived(chatRoom, message);
}
void ChatRoomListener::onMessagesReceived(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::list<std::shared_ptr<linphone::ChatMessage>> & messages){
//qDebug() << "ChatRoomListener::onMessagesReceived";
emit messagesReceived(chatRoom, messages);
}
void ChatRoomListener::onNewEvent(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onNewEvent";
emit newEvent(chatRoom, eventLog);
}
void ChatRoomListener::onNewEvents(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::list<std::shared_ptr<linphone::EventLog>> & eventLogs){
//qDebug() << "ChatRoomListener::onNewEvents";
emit newEvents(chatRoom, eventLogs);
}
void ChatRoomListener::onChatMessageReceived(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onChatMessageReceived";
emit chatMessageReceived(chatRoom, eventLog);
}
void ChatRoomListener::onChatMessagesReceived(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::list<std::shared_ptr<linphone::EventLog>> & eventLogs){
//qDebug() << "ChatRoomListener::onChatMessagesReceived";
emit chatMessagesReceived(chatRoom, eventLogs);
}
void ChatRoomListener::onChatMessageSending(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onChatMessageSending";
emit chatMessageSending(chatRoom, eventLog);
}
void ChatRoomListener::onChatMessageSent(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onChatMessageSent";
emit chatMessageSent(chatRoom, eventLog);
}
void ChatRoomListener::onParticipantAdded(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onParticipantAdded";
emit participantAdded(chatRoom, eventLog);
}
void ChatRoomListener::onParticipantRemoved(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onParticipantRemoved";
emit participantRemoved(chatRoom, eventLog);
}
void ChatRoomListener::onParticipantAdminStatusChanged(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onParticipantAdminStatusChanged";
emit participantAdminStatusChanged(chatRoom, eventLog);
}
void ChatRoomListener::onStateChanged(const std::shared_ptr<linphone::ChatRoom> & chatRoom, linphone::ChatRoom::State newState){
//qDebug() << "ChatRoomListener::onStateChanged";
emit stateChanged(chatRoom, newState);
}
void ChatRoomListener::onSecurityEvent(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onSecurityEvent";
emit securityEvent(chatRoom, eventLog);
}
void ChatRoomListener::onSubjectChanged(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onSubjectChanged";
emit subjectChanged(chatRoom, eventLog);
}
void ChatRoomListener::onUndecryptableMessageReceived(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<linphone::ChatMessage> & message){
//qDebug() << "ChatRoomListener::onUndecryptableMessageReceived";
emit undecryptableMessageReceived(chatRoom, message);
}
void ChatRoomListener::onParticipantDeviceAdded(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onParticipantDeviceAdded";
emit participantDeviceAdded(chatRoom, eventLog);
}
void ChatRoomListener::onParticipantDeviceRemoved(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onParticipantDeviceRemoved";
emit participantDeviceRemoved(chatRoom, eventLog);
}
void ChatRoomListener::onConferenceJoined(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onConferenceJoined";
emit conferenceJoined(chatRoom, eventLog);
}
void ChatRoomListener::onConferenceLeft(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onConferenceLeft";
emit conferenceLeft(chatRoom, eventLog);
}
void ChatRoomListener::onEphemeralEvent(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onEphemeralEvent";
emit ephemeralEvent(chatRoom, eventLog);
}
void ChatRoomListener::onEphemeralMessageTimerStarted(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onEphemeralMessageTimerStarted";
emit ephemeralMessageTimerStarted(chatRoom, eventLog);
}
void ChatRoomListener::onEphemeralMessageDeleted(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
//qDebug() << "ChatRoomListener::onEphemeralMessageDeleted";
emit ephemeralMessageDeleted(chatRoom, eventLog);
}
void ChatRoomListener::onConferenceAddressGeneration(const std::shared_ptr<linphone::ChatRoom> & chatRoom){
//qDebug() << "ChatRoomListener::onConferenceAddressGeneration";
emit conferenceAddressGeneration(chatRoom);
}
void ChatRoomListener::onParticipantRegistrationSubscriptionRequested(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::Address> & participantAddress){
//qDebug() << "ChatRoomListener::onParticipantRegistrationSubscriptionRequested";
emit participantRegistrationSubscriptionRequested(chatRoom, participantAddress);
}
void ChatRoomListener::onParticipantRegistrationUnsubscriptionRequested(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::Address> & participantAddress){
//qDebug() << "ChatRoomListener::onParticipantRegistrationUnsubscriptionRequested";
emit participantRegistrationUnsubscriptionRequested(chatRoom, participantAddress);
}
void ChatRoomListener::onChatMessageShouldBeStored(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<linphone::ChatMessage> & message){
//qDebug() << "ChatRoomListener::onChatMessageShouldBeStored";
emit chatMessageShouldBeStored(chatRoom, message);
}
void ChatRoomListener::onChatMessageParticipantImdnStateChanged(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<linphone::ChatMessage> & message, const std::shared_ptr<const linphone::ParticipantImdnState> & state){
//qDebug() << "ChatRoomListener::onChatMessageParticipantImdnStateChanged";
emit chatMessageParticipantImdnStateChanged(chatRoom, message, state);
}

View file

@ -172,7 +172,7 @@ ChatRoomModel::ChatRoomModel (const std::shared_ptr<linphone::ChatRoom>& chatRoo
}
}
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(std::max(mChatRoom->getLastUpdateTime(), callDate )*1000));
mSecurityLevel = (int)mChatRoom->getSecurityLevel();
}else
mParticipantListModel = nullptr;
}
@ -444,8 +444,20 @@ bool ChatRoomModel::isSecure() const{
|| mChatRoom->getSecurityLevel() == linphone::ChatRoom::SecurityLevel::Safe);
}
int ChatRoomModel::getSecurityLevel() const{
return mChatRoom ? (int)mChatRoom->getSecurityLevel() : 0;
int ChatRoomModel::getSecurityLevel() const {
return mSecurityLevel;
}
void ChatRoomModel::updateSecurityLevel(){
if(mChatRoom ) {
setSecurityLevel((int)mChatRoom->getSecurityLevel());
}
}
void ChatRoomModel::setSecurityLevel(int level){
if( mSecurityLevel != level){
mSecurityLevel = level;
emit securityLevelChanged(mSecurityLevel);
}
}
bool ChatRoomModel::isGroupEnabled() const{
@ -1276,7 +1288,7 @@ void ChatRoomModel::onSecurityEvent(const std::shared_ptr<linphone::ChatRoom> &
if( e != events.end() )
insertNotice(*e);
updateLastUpdateTime();
emit securityLevelChanged((int)chatRoom->getSecurityLevel());
updateSecurityLevel();
}
void ChatRoomModel::onSubjectChanged(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog) {
auto events = chatRoom->getHistoryEvents(0);
@ -1318,6 +1330,7 @@ void ChatRoomModel::onConferenceJoined(const std::shared_ptr<linphone::ChatRoom>
emit usernameChanged();
emit conferenceJoined(eventLog);
emit isReadOnlyChanged();
emit isMeAdminChanged();
}
void ChatRoomModel::onConferenceLeft(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){

View file

@ -63,7 +63,7 @@ public:
Q_PROPERTY(QDateTime lastUpdateTime MEMBER mLastUpdateTime WRITE setLastUpdateTime NOTIFY lastUpdateTimeChanged)
Q_PROPERTY(int unreadMessagesCount READ getUnreadMessagesCount NOTIFY unreadMessagesCountChanged)
Q_PROPERTY(int securityLevel READ getSecurityLevel NOTIFY securityLevelChanged)
Q_PROPERTY(int securityLevel READ getSecurityLevel WRITE setSecurityLevel NOTIFY securityLevelChanged)
Q_PROPERTY(bool groupEnabled READ isGroupEnabled NOTIFY groupEnabledChanged)
Q_PROPERTY(bool isConference READ isConference CONSTANT)
Q_PROPERTY(bool isOneToOne READ isOneToOne CONSTANT)
@ -133,6 +133,8 @@ public:
bool markAsReadEnabled() const;
Q_INVOKABLE bool isSecure() const;
int getSecurityLevel() const;
void updateSecurityLevel();
void setSecurityLevel(int level);
bool isGroupEnabled() const;
bool isConference() const;
bool isOneToOne() const;
@ -318,6 +320,7 @@ private:
QSharedPointer<ChatNoticeModel> mUnreadMessageNotice;
int mBindingCalls = 0;
bool mPostModelChangedEvents = true;
int mSecurityLevel = 0;
QWeakPointer<ChatRoomModel> mSelf;
};

View file

@ -33,6 +33,7 @@ SearchResultModel::SearchResultModel(std::shared_ptr<const linphone::Friend> lin
mAddress = address->clone();
else if(linphoneFriend && linphoneFriend->getAddress())
mAddress = linphoneFriend->getAddress()->clone();
mAddress->clean();
}
QString SearchResultModel::getAddressString() const{

View file

@ -115,9 +115,9 @@ Item {
// }
// return wrappedButton.icon;
}
function getColor(color, defaultColor, debugVar){
if(color)
return color
function getColor(colorModel, defaultColor, debugVar){
if(colorModel && colorModel.color)
return colorModel.color
else{
console.warn("No color defined for :"+debugVar+ " on "+_getIcon())
return defaultColor
@ -129,14 +129,14 @@ Item {
//if(wrappedButton.icon == '')
//return getColor(wrappedButton.colorSet.backgroundNormalColor, defaultColor, 'backgroundNormalColor')
if (wrappedButton.updating || wrappedButton.toggled)
return getColor(wrappedButton.colorSet.backgroundUpdatingColor.color, defaultColor, 'backgroundUpdatingColor')
return getColor(wrappedButton.colorSet.backgroundUpdatingColor, defaultColor, 'backgroundUpdatingColor')
if (!useStates)
return getColor(wrappedButton.colorSet.backgroundNormalColor.color, defaultColor, 'backgroundNormalColor')
return getColor(wrappedButton.colorSet.backgroundNormalColor, defaultColor, 'backgroundNormalColor')
if (!wrappedButton.enabled)
return getColor(wrappedButton.colorSet.backgroundDisabledColor.color, defaultColor, 'backgroundDisabledColor')
return button.down ? getColor(wrappedButton.colorSet.backgroundPressedColor.color, defaultColor, 'backgroundPressedColor')
: (button.hovered ? getColor(wrappedButton.colorSet.backgroundHoveredColor.color, defaultColor, 'backgroundHoveredColor')
: getColor(wrappedButton.colorSet.backgroundNormalColor.color, defaultColor, 'backgroundNormalColor'))
return getColor(wrappedButton.colorSet.backgroundDisabledColor, defaultColor, 'backgroundDisabledColor')
return button.down ? getColor(wrappedButton.colorSet.backgroundPressedColor, defaultColor, 'backgroundPressedColor')
: (button.hovered ? getColor(wrappedButton.colorSet.backgroundHoveredColor, defaultColor, 'backgroundHoveredColor')
: getColor(wrappedButton.colorSet.backgroundNormalColor, defaultColor, 'backgroundNormalColor'))
}else
return defaultColor
}
@ -144,16 +144,17 @@ Item {
var defaultColor = 'black'
if(isCustom){
//if(wrappedButton.icon == '')
//return getColor(wrappedButton.colorSet.foregroundNormalColor.color, defaultColor, 'foregroundNormalColor')
//return getColor(wrappedButton.colorSet.foregroundNormalColor, defaultColor, 'foregroundNormalColor')
if (wrappedButton.updating || wrappedButton.toggled)
return getColor(wrappedButton.colorSet.foregroundUpdatingColor.color, defaultColor, 'foregroundUpdatingColor')
return getColor(wrappedButton.colorSet.foregroundUpdatingColor, defaultColor, 'foregroundUpdatingColor')
if (!useStates)
return getColor(wrappedButton.colorSet.foregroundNormalColor.color, defaultColor, 'foregroundNormalColor')
if (!wrappedButton.enabled)
return getColor(wrappedButton.colorSet.foregroundDisabledColor.color, defaultColor, 'foregroundDisabledColor')
return button.down ? getColor(wrappedButton.colorSet.foregroundPressedColor.color, defaultColor, 'foregroundPressedColor')
: (button.hovered ? getColor(wrappedButton.colorSet.foregroundHoveredColor.color, defaultColor, 'foregroundHoveredColor')
: getColor(wrappedButton.colorSet.foregroundNormalColor.color, defaultColor, 'foregroundNormalColor'))
return getColor(wrappedButton.colorSet.foregroundNormalColor, defaultColor, 'foregroundNormalColor')
if (!wrappedButton.enabled){
return getColor(wrappedButton.colorSet.foregroundDisabledColor, defaultColor, 'foregroundDisabledColor')
}
return button.down ? getColor(wrappedButton.colorSet.foregroundPressedColor, defaultColor, 'foregroundPressedColor')
: (button.hovered ? getColor(wrappedButton.colorSet.foregroundHoveredColor, defaultColor, 'foregroundHoveredColor')
: getColor(wrappedButton.colorSet.foregroundNormalColor, defaultColor, 'foregroundNormalColor'))
}else
return defaultColor
}
@ -163,14 +164,14 @@ Item {
//if(wrappedButton.icon == '')
//return getColor(wrappedButton.colorSet.backgroundHiddenPartNormalColor, defaultColor, 'backgroundHiddenPartNormalColor')
if (wrappedButton.updating || wrappedButton.toggled)
return getColor(wrappedButton.colorSet.backgroundHiddenPartUpdatingColor.color, defaultColor, 'backgroundHiddenPartUpdatingColor')
return getColor(wrappedButton.colorSet.backgroundHiddenPartUpdatingColor, defaultColor, 'backgroundHiddenPartUpdatingColor')
if (!useStates)
return getColor(wrappedButton.colorSet.backgroundHiddenPartNormalColor.color, defaultColor, 'backgroundHiddenPartNormalColor')
return getColor(wrappedButton.colorSet.backgroundHiddenPartNormalColor, defaultColor, 'backgroundHiddenPartNormalColor')
if (!wrappedButton.enabled)
return getColor(wrappedButton.colorSet.backgroundHiddenPartDisabledColor.color, defaultColor, 'backgroundHiddenPartDisabledColor')
return button.down ? getColor(wrappedButton.colorSet.backgroundHiddenPartPressedColor.color, defaultColor, 'backgroundHiddenPartPressedColor')
: (button.hovered ? getColor(wrappedButton.colorSet.backgroundHiddenPartHoveredColor.color, defaultColor, 'backgroundHiddenPartHoveredColor')
: getColor(wrappedButton.colorSet.backgroundHiddenPartNormalColor.color, defaultColor, 'backgroundHiddenPartNormalColor'))
return getColor(wrappedButton.colorSet.backgroundHiddenPartDisabledColor, defaultColor, 'backgroundHiddenPartDisabledColor')
return button.down ? getColor(wrappedButton.colorSet.backgroundHiddenPartPressedColor, defaultColor, 'backgroundHiddenPartPressedColor')
: (button.hovered ? getColor(wrappedButton.colorSet.backgroundHiddenPartHoveredColor, defaultColor, 'backgroundHiddenPartHoveredColor')
: getColor(wrappedButton.colorSet.backgroundHiddenPartNormalColor, defaultColor, 'backgroundHiddenPartNormalColor'))
}else
return defaultColor
}
@ -180,14 +181,14 @@ Item {
//if(wrappedButton.icon == '')
//return getColor(wrappedButton.colorSet.foregroundHiddenPartNormalColor, defaultColor, 'foregroundHiddenPartNormalColor')
if (wrappedButton.updating || wrappedButton.toggled)
return getColor(wrappedButton.colorSet.foregroundHiddenPartUpdatingColor.color, defaultColor, 'foregroundHiddenPartUpdatingColor')
return getColor(wrappedButton.colorSet.foregroundHiddenPartUpdatingColor, defaultColor, 'foregroundHiddenPartUpdatingColor')
if (!useStates)
return getColor(wrappedButton.colorSet.foregroundHiddenPartNormalColor.color, defaultColor, 'foregroundHiddenPartNormalColor')
return getColor(wrappedButton.colorSet.foregroundHiddenPartNormalColor, defaultColor, 'foregroundHiddenPartNormalColor')
if (!wrappedButton.enabled)
return getColor(wrappedButton.colorSet.foregroundHiddenPartDisabledColor.color, defaultColor, 'foregroundHiddenPartDisabledColor')
return button.down ? getColor(wrappedButton.colorSet.foregroundHiddenPartPressedColor.color, defaultColor, 'foregroundHiddenPartPressedColor')
: (button.hovered ? getColor(wrappedButton.colorSet.foregroundHiddenPartHoveredColor.color, defaultColor, 'foregroundHiddenPartHoveredColor')
: getColor(wrappedButton.colorSet.foregroundHiddenPartNormalColor.color, defaultColor, 'foregroundHiddenPartNormalColor'))
return getColor(wrappedButton.colorSet.foregroundHiddenPartDisabledColor, defaultColor, 'foregroundHiddenPartDisabledColor')
return button.down ? getColor(wrappedButton.colorSet.foregroundHiddenPartPressedColor, defaultColor, 'foregroundHiddenPartPressedColor')
: (button.hovered ? getColor(wrappedButton.colorSet.foregroundHiddenPartHoveredColor, defaultColor, 'foregroundHiddenPartHoveredColor')
: getColor(wrappedButton.colorSet.foregroundHiddenPartNormalColor, defaultColor, 'foregroundHiddenPartNormalColor'))
}else
return defaultColor
}

View file

@ -70,6 +70,7 @@ Rectangle {
displayUnreadMessageCount: true
entry: callControls.entry
onAvatarClicked: callControls.clicked()
}
Item {

View file

@ -225,8 +225,8 @@ Window {
Connections {
target: SettingsModel
onStandardChatEnabledChanged: if(!chatRoomModel.haveEncryption) proxyModel.setEntryTypeFilter(status ? ChatRoomModel.GenericEntry : ChatRoomModel.CallEntry | ChatRoomModel.NoticeEntry)
onSecureChatEnabledChanged: if(chatRoomModel.haveEncryption) proxyModel.setEntryTypeFilter(SettingsModel.secureChatEnabled ? ChatRoomModel.GenericEntry : ChatRoomModel.CallEntry | ChatRoomModel.NoticeEntry)
onStandardChatEnabledChanged: if(chatRoomModel && !chatRoomModel.haveEncryption) proxyModel.setEntryTypeFilter(status ? ChatRoomModel.GenericEntry : ChatRoomModel.CallEntry | ChatRoomModel.NoticeEntry)
onSecureChatEnabledChanged: if(chatRoomModel && chatRoomModel.haveEncryption) proxyModel.setEntryTypeFilter(SettingsModel.secureChatEnabled ? ChatRoomModel.GenericEntry : ChatRoomModel.CallEntry | ChatRoomModel.NoticeEntry)
}
}
}

View file

@ -57,10 +57,12 @@ QtObject {
property string icon : 'play_custom'
property string name : 'paused_play'
property var backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 's_p_b_bg')
property var backgroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_d', icon, 's_p_b_bg')
property var backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 's_h_b_bg')
property var backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 's_n_b_bg')
property var backgroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_u', icon, 's_p_b_bg')
property var foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 's_p_b_fg')
property var foregroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_d', icon, 's_p_b_fg')
property var foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 's_h_b_fg')
property var foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 's_n_b_fg')
property var foregroundUpdatingColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_u', icon, 's_p_b_fg')