Add debug feedback on missing colors.

Add contact URL.
Change unread message count design in chat.
Add page text about missing features when using third party SIP account.
Add Translation link for contribution in about.
Fix history view.
Add delay of 500ms on message search.
Fix unresponsive check update button in settings.
Fix wrong characters in record name.

# Conflicts:
#	linphone-app/cmake_builder/linphone_package/CMakeLists.txt
This commit is contained in:
Julien Wadel 2022-02-24 13:13:50 +01:00
parent 479369bab0
commit 92e483c855
23 changed files with 386 additions and 163 deletions

View file

@ -7,6 +7,11 @@
<source>ok</source>
<translation>OK</translation>
</message>
<message>
<source>aboutTranslation</source>
<extracomment>&apos;Help us translate %1&apos; : %1 is the application name</extracomment>
<translation>Help us translate %1</translation>
</message>
</context>
<context>
<name>ActivateAppSipAccountWithEmail</name>
@ -2879,6 +2884,7 @@ Click here: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<name>UseOtherSipAccount</name>
<message>
<source>confirmAction</source>
<extracomment>&apos;Use&apos; : Popup confirmation for a form</extracomment>
<translation>USE</translation>
</message>
<message>
@ -2909,6 +2915,26 @@ Click here: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>addOtherSipAccountError</source>
<translation>Unable to add this account.</translation>
</message>
<message>
<source>understandAction</source>
<extracomment>&apos;I understand&apos; : Popup confirmation for a warning</extracomment>
<translation>I understand</translation>
</message>
<message>
<source>warningFeatures</source>
<extracomment>&apos;Some features require a Linphone account, such as group messaging or ephemeral messaging.&apos; : Warning text about features.</extracomment>
<translation>Some features require a Linphone account, such as group messaging or ephemeral messaging.</translation>
</message>
<message>
<source>warningThirdParty</source>
<extracomment>&apos;These features are hidden when you register with a third party SIP account.&apos; : Warning text for using third party account.</extracomment>
<translation>These features are hidden when you register with a third party SIP account.</translation>
</message>
<message>
<source>warningContact</source>
<extracomment>&apos;To enable it in a commercial project, please contact us.&apos; : Warning text for contacting about enabling features.</extracomment>
<translation>To enable it in a commercial project, please contact us.</translation>
</message>
</context>
<context>
<name>ZrtpTokenAuthentication</name>

View file

@ -7,6 +7,11 @@
<source>ok</source>
<translation>OK</translation>
</message>
<message>
<source>aboutTranslation</source>
<extracomment>&apos;Help us translate %1&apos; : %1 is the application name</extracomment>
<translation>Contribuer aux traductions</translation>
</message>
</context>
<context>
<name>ActivateAppSipAccountWithEmail</name>
@ -521,7 +526,7 @@ URL du serveur non configurée.</translation>
<message>
<source>Forwarded</source>
<extracomment>&apos;Forwarded&apos; : Header on a message that contains a forward.</extracomment>
<translation type="unfinished"></translation>
<translation>Transféré</translation>
</message>
</context>
<context>
@ -1579,9 +1584,9 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<message numerus="yes">
<source>unreadMessageNotice</source>
<extracomment>&apos;%1 unread messages&apos; : Little message to show on an event where unread messages begin.</extracomment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<translation>
<numerusform>%1 message non lu</numerusform>
<numerusform>%1 messages non lus</numerusform>
</translation>
</message>
</context>
@ -1639,7 +1644,7 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<message>
<source>conversationDevicesTitle</source>
<extracomment>&apos;Conversation&apos;s devices&apos; : Title of window that show all devices</extracomment>
<translation type="unfinished"></translation>
<translation>Liste des appareils</translation>
</message>
</context>
<context>
@ -1939,7 +1944,7 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<message>
<source>chatNotificationsEnabledLabel</source>
<extracomment>&apos;Enable notifications&apos;: settings label for enabling notifications.</extracomment>
<translation type="unfinished"></translation>
<translation>Activer les notifications</translation>
</message>
</context>
<context>
@ -2296,7 +2301,7 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<message>
<source>defaultDeviceNameLabel</source>
<extracomment>&apos;Device Name&apos; : Label for setting the device name.</extracomment>
<translation type="unfinished"></translation>
<translation>Nom de l&apos;appareil</translation>
</message>
</context>
<context>
@ -2856,6 +2861,7 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<name>UseOtherSipAccount</name>
<message>
<source>confirmAction</source>
<extracomment>&apos;Use&apos; : Popup confirmation for a form</extracomment>
<translation>UTILISER</translation>
</message>
<message>
@ -2886,6 +2892,26 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>addOtherSipAccountError</source>
<translation>Impossible d&apos;ajouter ce compte.</translation>
</message>
<message>
<source>understandAction</source>
<extracomment>&apos;I understand&apos; : Popup confirmation for a warning</extracomment>
<translation>J&apos;ai compris</translation>
</message>
<message>
<source>warningFeatures</source>
<extracomment>&apos;Some features require a Linphone account, such as group messaging or ephemeral messaging.&apos; : Warning text about features.</extracomment>
<translation>Certaines fonctionnalités avancées comme les messages de groupe ou les messages éphémères nécessitent un compte Linphone.</translation>
</message>
<message>
<source>warningThirdParty</source>
<extracomment>&apos;These features are hidden when you register with a third party SIP account.&apos; : Warning text for using third party account.</extracomment>
<translation>Elles seront masquées dans l&apos;application si vous configurez un compte SIP tiers.</translation>
</message>
<message>
<source>warningContact</source>
<extracomment>&apos;To enable it in a commercial project, please contact us.&apos; : Warning text for contacting about enabling features.</extracomment>
<translation>Si vous souhaitez les activer pour un projet professionnel, contactez-nous.</translation>
</message>
</context>
<context>
<name>ZrtpTokenAuthentication</name>

View file

@ -133,7 +133,7 @@ if (WIN32)
file(GLOB GRAMMAR_FILES "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/Belr/grammars/*")
install(FILES ${GRAMMAR_FILES} DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/belr/grammars/" )
install(DIRECTORY "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/images" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}" USE_SOURCE_PERMISSIONS OPTIONAL)
install(DIRECTORY "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/sounds/linphone/" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/${EXECUTABLE_NAME}" USE_SOURCE_PERMISSIONS)
install(DIRECTORY "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/sounds/linphone/" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/sounds/${EXECUTABLE_NAME}" USE_SOURCE_PERMISSIONS)
install(FILES "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/Linphone/rootca.pem" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/${EXECUTABLE_NAME}/")
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../../assets/linphonerc-factory" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/${EXECUTABLE_NAME}")
@ -192,7 +192,7 @@ elseif (APPLE)
file(GLOB GRAMMAR_FILES "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/Belr/grammars/*")
install(FILES ${GRAMMAR_FILES} DESTINATION "${APPLICATION_NAME}.app/Contents/Resources/${CMAKE_INSTALL_DATAROOTDIR}/belr/grammars/")
install(DIRECTORY "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/images" DESTINATION "${APPLICATION_NAME}.app/Contents/Resources/${CMAKE_INSTALL_DATAROOTDIR}" USE_SOURCE_PERMISSIONS OPTIONAL)
install(DIRECTORY "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/sounds/linphone/" DESTINATION "${APPLICATION_NAME}.app/Contents/Resources/${CMAKE_INSTALL_DATAROOTDIR}/${EXECUTABLE_NAME}" USE_SOURCE_PERMISSIONS)
install(DIRECTORY "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/sounds/linphone/" DESTINATION "${APPLICATION_NAME}.app/Contents/Resources/${CMAKE_INSTALL_DATAROOTDIR}/sounds/${EXECUTABLE_NAME}" USE_SOURCE_PERMISSIONS)
install(FILES "${LINPHONE_OUTPUT_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/Linphone/rootca.pem" DESTINATION "${APPLICATION_NAME}.app/Contents/Resources/${CMAKE_INSTALL_DATAROOTDIR}/${EXECUTABLE_NAME}")
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../../assets/linphonerc-factory" DESTINATION "${APPLICATION_NAME}.app/Contents/Resources/${CMAKE_INSTALL_DATAROOTDIR}/${EXECUTABLE_NAME}")

View file

@ -941,11 +941,10 @@ QString CallModel::generateSavedFilename () const {
QString CallModel::generateSavedFilename (const QString &from, const QString &to) {
auto escape = [](const QString &str) {
constexpr char ReservedCharacters[] = "<>:\"/\\|\\?\\*";
constexpr char ReservedCharacters[] = "[<|>|:|\"|/|\\\\|\\?|\\*|\\+|\\|]+";
static QRegularExpression regexp(ReservedCharacters);
return QString(str).replace(regexp, "");
};
return QStringLiteral("%1_%2_%3")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd_hh-mm-ss"))
.arg(escape(from))

View file

@ -134,8 +134,6 @@ void LdapModel::unset(){
mSipDomain = QString::fromStdString(mLdapParams->getSipDomain());
mDebug = (int)mLdapParams->getDebugLevel();
mVerifyServerCertificates = (int)mLdapParams->getServerCertificatesVerificationMode();
int c = (int) mLdapParams->getAuthMethod();
qWarning() << c;
testServerField();
testMaxResultsField();
testTimeoutField();

View file

@ -109,6 +109,8 @@ constexpr char Constants::VersionCheckUrl[];
constexpr char Constants::PasswordRecoveryUrl[];
constexpr char Constants::CguUrl[];
constexpr char Constants::PrivatePolicyUrl[];
constexpr char Constants::ContactUrl[];
constexpr char Constants::TranslationUrl[];
constexpr char Constants::LinphoneBZip2_exe[];

View file

@ -59,6 +59,10 @@ public:
static constexpr char PasswordRecoveryUrl[] = "https://subscribe.linphone.org/login";
static constexpr char CguUrl[] = "https://www.linphone.org/general-terms";
static constexpr char PrivatePolicyUrl[] = "https://www.linphone.org/privacy-policy";
static constexpr char ContactUrl[] = "https://www.linphone.org/contact";
static constexpr char TranslationUrl[] = "https://weblate.linphone.org/projects/linphone-desktop/";
static constexpr char LinphoneBZip2_exe[] = "http://www.linphone.org/releases/windows/tools/bzip2/bzip2.exe";
static constexpr char LinphoneBZip2_dll[] = "http://www.linphone.org/releases/windows/tools/bzip2/bzip2.dll";
@ -71,6 +75,9 @@ public:
Q_PROPERTY(QString PasswordRecoveryUrl MEMBER PasswordRecoveryUrl CONSTANT)
Q_PROPERTY(QString CguUrl MEMBER CguUrl CONSTANT)
Q_PROPERTY(QString PrivatePolicyUrl MEMBER PrivatePolicyUrl CONSTANT)
Q_PROPERTY(QString ContactUrl MEMBER ContactUrl CONSTANT)
Q_PROPERTY(QString TranslationUrl MEMBER TranslationUrl CONSTANT)
static constexpr char DefaultAssistantRegistrationUrl[] = "https://subscribe.linphone.org/register";
static constexpr char DefaultAssistantLoginUrl[] = "https://subscribe.linphone.org/login";
static constexpr char DefaultAssistantLogoutUrl[] = "https://subscribe.linphone.org/logout";

View file

@ -106,65 +106,81 @@ Item {
// }
// return wrappedButton.icon;
}
function getColor(color, defaultColor, debugVar){
if(color)
return color
else{
console.warn("No color defined for :"+debugVar)
return defaultColor
}
}
function getBackgroundColor(){
var defaultColor = 'transparent'
if(isCustom){
if(wrappedButton.icon == '')
return wrappedButton.colorSet.backgroundNormalColor
return getColor(wrappedButton.colorSet.backgroundNormalColor, defaultColor, 'backgroundNormalColor')
if (wrappedButton.updating || wrappedButton.toggled)
return wrappedButton.colorSet.backgroundUpdatingColor
return getColor(wrappedButton.colorSet.backgroundUpdatingColor, defaultColor, 'backgroundUpdatingColor')
if (!useStates)
return wrappedButton.colorSet.backgroundNormalColor
return getColor(wrappedButton.colorSet.backgroundNormalColor, defaultColor, 'backgroundNormalColor')
if (!wrappedButton.enabled)
return wrappedButton.colorSet.backgroundDisabledColor
return button.down ? wrappedButton.colorSet.backgroundPressedColor
: (button.hovered ? wrappedButton.colorSet.backgroundHoveredColor: wrappedButton.colorSet.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 'transparent'
return defaultColor
}
function getForegroundColor(){
var defaultColor = 'black'
if(isCustom){
if(wrappedButton.icon == '')
return wrappedButton.colorSet.foregroundNormalColor
return getColor(wrappedButton.colorSet.foregroundNormalColor, defaultColor, 'foregroundNormalColor')
if (wrappedButton.updating || wrappedButton.toggled)
return wrappedButton.colorSet.foregroundUpdatingColor
return getColor(wrappedButton.colorSet.foregroundUpdatingColor, defaultColor, 'foregroundUpdatingColor')
if (!useStates)
return wrappedButton.colorSet.foregroundNormalColor
return getColor(wrappedButton.colorSet.foregroundNormalColor, defaultColor, 'foregroundNormalColor')
if (!wrappedButton.enabled)
return wrappedButton.colorSet.foregroundDisabledColor
return button.down ? wrappedButton.colorSet.foregroundPressedColor
: (button.hovered ? wrappedButton.colorSet.foregroundHoveredColor: wrappedButton.colorSet.foregroundNormalColor)
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 "black"
return defaultColor
}
function getBackgroundHiddenPartColor(){
var defaultColor = 'transparent'
if(isCustom){
if(wrappedButton.icon == '')
return wrappedButton.backgroundHiddenPartNormalColor
return getColor(wrappedButton.colorSet.backgroundHiddenPartNormalColor, defaultColor, 'backgroundHiddenPartNormalColor')
if (wrappedButton.updating || wrappedButton.toggled)
return wrappedButton.backgroundHiddenPartUpdatingColor
return getColor(wrappedButton.colorSet.backgroundHiddenPartUpdatingColor, defaultColor, 'backgroundHiddenPartUpdatingColor')
if (!useStates)
return wrappedButton.backgroundHiddenPartNormalColor
return getColor(wrappedButton.colorSet.backgroundHiddenPartNormalColor, defaultColor, 'backgroundHiddenPartNormalColor')
if (!wrappedButton.enabled)
return wrappedButton.backgroundHiddenPartDisabledColor
return button.down ? wrappedButton.backgroundHiddenPartPressedColor
: (button.hovered ? wrappedButton.backgroundHiddenPartHoveredColor: wrappedButton.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 'transparent'
return defaultColor
}
function getForegroundHiddenPartColor(){
var defaultColor = '#80FFFFFF'
if(isCustom){
if(wrappedButton.icon == '')
return wrappedButton.foregroundHiddenPartNormalColor
return getColor(wrappedButton.colorSet.foregroundHiddenPartNormalColor, defaultColor, 'foregroundHiddenPartNormalColor')
if (wrappedButton.updating || wrappedButton.toggled)
return wrappedButton.foregroundHiddenPartUpdatingColor
return getColor(wrappedButton.colorSet.foregroundHiddenPartUpdatingColor, defaultColor, 'foregroundHiddenPartUpdatingColor')
if (!useStates)
return wrappedButton.foregroundHiddenPartNormalColor
return getColor(wrappedButton.colorSet.foregroundHiddenPartNormalColor, defaultColor, 'foregroundHiddenPartNormalColor')
if (!wrappedButton.enabled)
return wrappedButton.foregroundHiddenPartDisabledColor
return button.down ? wrappedButton.foregroundHiddenPartPressedColor
: (button.hovered ? wrappedButton.foregroundHiddenPartHoveredColor: wrappedButton.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 "#80FFFFFF"
return defaultColor
}
// ---------------------------------------------------------------------------
@ -187,7 +203,7 @@ Item {
height: parent.height
width: parent.width * ( 1 - wrappedButton.percentageDisplayed / 100 )
id: backgroundHiddenPartColor
color: getBackgroundHiddenPartColor()
color: width > 0 ? getBackgroundHiddenPartColor() : 'transparent'
}
}
hoverEnabled: !wrappedButton.updating//|| wrappedButton.autoIcon
@ -199,7 +215,7 @@ Item {
color: 'transparent'
Rectangle{
anchors.fill:parent
color: getForegroundColor()
color: getForegroundColor()
anchors.rightMargin: parent.width * ( 1 - wrappedButton.percentageDisplayed / 100 )
}
}
@ -210,7 +226,7 @@ Item {
color: 'transparent'
Rectangle{
anchors.fill:parent
color: getForegroundHiddenPartColor()
color: percentageDisplayed != 100 ? getForegroundHiddenPartColor() : 'transparent'
anchors.leftMargin: parent.width * wrappedButton.percentageDisplayed / 100
}
}

View file

@ -336,7 +336,7 @@ Rectangle {
anchors.bottom: parent.bottom
anchors.bottomMargin: 10
anchors.right: parent.right
anchors.rightMargin: 40
anchors.rightMargin: 35
visible: chat.isIndexAfter(chat.count-1)
onVisibleChanged: updateMarkAsRead()
Component.onCompleted: updateMarkAsRead()
@ -360,9 +360,12 @@ Rectangle {
MessageCounter{
anchors.left: parent.right
anchors.bottom: parent.top
anchors.bottomMargin: -5
anchors.leftMargin: -5
anchors.bottomMargin: 0
anchors.leftMargin: -14
count: container.proxyModel.chatRoomModel ? container.proxyModel.chatRoomModel.unreadMessagesCount : 0
showOnlyNumber: true
iconSize: 15
pointSize: Units.dp * 7
}
}

View file

@ -26,7 +26,7 @@ Loader{
property ContentModel contentModel
property int maxWidth : parent.width
property int fitWidth: active ? Math.max(maxWidth - ChatAudioMessageStyle.emptySpace, ChatAudioMessageStyle.minWidth) : 0
property int fitHeight: active ? 50 : 0
property int fitHeight: active ? 40 : 0
property font customFont : SettingsModel.textMessageFont
property bool isOutgoing : contentModel && (contentModel.chatMessageModel.isOutgoing || contentModel.chatMessageModel.state == LinphoneEnums.ChatMessageStateIdle);
@ -63,6 +63,7 @@ Loader{
anchors.fill: parent
spacing: 5
ActionButton{
id: playButton
Layout.preferredHeight: iconSize
Layout.preferredWidth: iconSize
Layout.rightMargin: 5
@ -83,8 +84,6 @@ Loader{
Layout.fillHeight: true
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
Layout.topMargin: 5
Layout.bottomMargin: 5
Layout.rightMargin: 15
MediaProgressBar{
id: mediaProgressBar

View file

@ -23,7 +23,7 @@ TextEdit {
property ContentModel contentModel
property string lastTextSelected : ''
property font customFont : SettingsModel.textMessageFont
property int fitHeight: visible ? contentHeight + padding : 0
property int fitHeight: visible ? contentHeight + padding + 6 : 0
property int fitWidth: visible ? implicitWidth + 2: 0 // add 2 because there is a bug on border that lead to not fit text exactly
signal rightClicked()

View file

@ -38,7 +38,7 @@ Item {
// ---------------------------------------------------------------------------
property string lastTextSelected
implicitHeight: (deliveryLayout.visible? deliveryLayout.height : 0) +(ephemeralTimerRow.visible? 16 : 0) + messageData.height +5
implicitHeight: (deliveryLayout.visible? deliveryLayout.height : 0) +(ephemeralTimerRow.visible? 16 : 0) + messageData.height
Rectangle {
id: rectangle

View file

@ -38,7 +38,7 @@ function loadMoreEntries () {
if (history.atYBeginning && !history.tryToLoadMoreEntries) {
history.tryToLoadMoreEntries = true
history.positionViewAtBeginning()
container.proxyModel.loadMoreEntriesAsync()
container.proxyModel.loadMoreEntries()
}
}

View file

@ -49,7 +49,7 @@ Rectangle {
Component.onCompleted: Logic.initView()
onContentYChanged: Logic.loadMoreEntriesAsync()
onContentYChanged: Logic.loadMoreEntries()
onMovementEnded: Logic.handleMovementEnded()
onMovementStarted: Logic.handleMovementStarted()

View file

@ -5,30 +5,41 @@ import Linphone.Styles 1.0
// =============================================================================
Icon {
id: messageCounter
property int count: 0
icon: 'chat_count'
iconSize: MessageCounterStyle.iconSize.message
visible: messageCounter.count > 0
Icon {
anchors {
horizontalCenter: parent.right
verticalCenter: parent.bottom
}
icon: 'chat_amount'
iconSize: MessageCounterStyle.iconSize.amount
visible: messageCounter.count > 0
Text {
anchors.centerIn: parent
color: MessageCounterStyle.text.color
font.pointSize: MessageCounterStyle.text.pointSize
text: (messageCounter.count>99 ? '+' : messageCounter.count)
}
}
Item{
id: messageCounter
property bool showOnlyNumber: false
property int count: 0
property alias icon: backgroundIcon.icon
property alias iconSize: amountIcon.iconSize
property int pointSize: MessageCounterStyle.text.pointSize
visible: messageCounter.count > 0
height: showOnlyNumber ? amountIcon.height : backgroundIcon.height
width: showOnlyNumber ? amountIcon.width : backgroundIcon.width
Icon {
id: backgroundIcon
icon: 'chat_count'
iconSize: MessageCounterStyle.iconSize.message
visible: !messageCounter.showOnlyNumber
}
Icon {
id: amountIcon
anchors {
horizontalCenter: parent.right
verticalCenter: parent.bottom
}
icon: 'chat_amount'
iconSize: MessageCounterStyle.iconSize.amount
visible: messageCounter.count > 0
Text {
anchors.centerIn: parent
color: MessageCounterStyle.text.color
font.pointSize: messageCounter.pointSize
text: (messageCounter.count>99 ? '+' : messageCounter.count)
}
}
}

View file

@ -1,7 +1,9 @@
import QtQuick 2.7
import QtQuick.Controls 2.5
import Common 1.0
import Linphone 1.0
import ConstantsCpp 1.0
import App.Styles 1.0
@ -9,88 +11,173 @@ import App.Styles 1.0
Item{
AssistantAbstractView {
id: mainItem
mainAction: requestBlock.execute
mainActionEnabled: username.text.length &&
sipDomain.text.length &&
password.text.length
mainActionLabel: qsTr('confirmAction')
//: 'I understand' : Popup confirmation for a warning
mainActionLabel: showWarning ? qsTr('understandAction').toUpperCase()
//: 'Use' : Popup confirmation for a form
: qsTr('confirmAction').toUpperCase()
title: qsTr('useOtherSipAccountTitle')
width: AssistantAbstractViewStyle.content.width
height: AssistantAbstractViewStyle.content.height
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
property bool showWarning : true
// ---------------------------------------------------------------------------
//anchors.centerIn: parent
//anchors.horizontalCenter:parent.horizontalCenter
Column {
StackView {
id: mainStack
anchors.fill: parent.contentItem
width: AssistantAbstractViewStyle.content.width
height: AssistantAbstractViewStyle.content.height
Form {
orientation: Qt.Vertical
width: parent.width
FormLine {
FormGroup {
label: qsTr('usernameLabel')
TextField {
id: username
}
}
FormGroup {
label: qsTr('displayNameLabel')
TextField {
id: displayName
}
}
initialItem: warningComponent
}
Component{
id: warningComponent
Column{
spacing: UseAppSipAccountStyle.warningBlock.spacing
anchors.fill: parent.contentItem
Text {
elide: Text.ElideRight
font.pointSize: UseAppSipAccountStyle.warningBlock.pointSize
width: parent.width
horizontalAlignment: Text.AlignLeft
color: UseAppSipAccountStyle.warningBlock.color
wrapMode: Text.WordWrap
//: 'Some features require a Linphone account, such as group messaging or ephemeral messaging.' : Warning text about features.
text: qsTr('warningFeatures')
}
FormLine {
FormGroup {
label: qsTr('sipDomainLabel')
TextField {
id: sipDomain
Text{
elide: Text.ElideRight
font.pointSize: UseAppSipAccountStyle.warningBlock.pointSize
width: parent.width
horizontalAlignment: Text.AlignLeft
color: UseAppSipAccountStyle.warningBlock.color
wrapMode: Text.WordWrap
//: 'These features are hidden when you register with a third party SIP account.' : Warning text for using third party account.
text: qsTr('warningThirdParty')
}
Text {
elide: Text.ElideRight
font.pointSize: UseAppSipAccountStyle.warningBlock.pointSize
width: parent.width
horizontalAlignment: Text.AlignLeft
color: UseAppSipAccountStyle.warningBlock.color
wrapMode: Text.WordWrap
//: 'To enable it in a commercial project, please contact us.' : Warning text for contacting about enabling features.
text: qsTr('warningContact')
}
Text {
elide: Text.ElideRight
font.pointSize: UseAppSipAccountStyle.warningBlock.contactUrl.pointSize
width: parent.width
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.WordWrap
color: UseAppSipAccountStyle.warningBlock.color
linkColor: UseAppSipAccountStyle.warningBlock.contactUrl.color
text: '<a href="'+ConstantsCpp.ContactUrl+'">'+ConstantsCpp.ContactUrl+'</a>'
visible: ConstantsCpp.ContactUrl != ''
onLinkActivated: Qt.openUrlExternally(link)
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.NoButton
cursorShape: parent.hoveredLink
? Qt.PointingHandCursor
: Qt.IBeamCursor
}
}
}
}
Component {
id: formComponent
Column {
anchors.fill: parent.contentItem
width: AssistantAbstractViewStyle.content.width
height: AssistantAbstractViewStyle.content.height
Form {
orientation: Qt.Vertical
width: parent.width
FormLine {
FormGroup {
label: qsTr('usernameLabel')
TextField {
id: username
}
}
FormGroup {
label: qsTr('displayNameLabel')
TextField {
id: displayName
}
}
}
}
FormLine {
FormGroup {
label: qsTr('passwordLabel')
PasswordField {
id: password
FormLine {
FormGroup {
label: qsTr('sipDomainLabel')
TextField {
id: sipDomain
}
}
}
}
FormLine {
FormGroup {
label: qsTr('transportLabel')
ComboBox {
id: transport
model: [ 'UDP', 'TCP', 'TLS']
FormLine {
FormGroup {
label: qsTr('passwordLabel')
PasswordField {
id: password
}
}
}
FormLine {
FormGroup {
label: qsTr('transportLabel')
ComboBox {
id: transport
model: [ 'UDP', 'TCP', 'TLS']
}
}
}
}
}
RequestBlock {
id: requestBlock
width: parent.width
action: (function () {
}
RequestBlock {
id: requestBlock
width: parent.width
action: (function () {
if(mainItem.showWarning) {
mainItem.showWarning = false
mainStack.replace(formComponent);
requestBlock.stop('')
}else{
if (!assistantModel.addOtherSipAccount({
username: username.text,
displayName: displayName.text,
@ -103,8 +190,8 @@ Item{
requestBlock.stop('')
window.setView('Home')
}
})
}
}
})
}
AssistantModel {
id: assistantModel

View file

@ -507,12 +507,21 @@ ColumnLayout {
//: 'Search in messages' : this is a placeholder when searching something in the timeline list
placeholderText: qsTr('searchMessagesPlaceholder')
onTextChanged: chatRoomProxyModel.filterText = text
onTextChanged: searchDelay.restart()
onIconClicked: {
searchView.visible = false
chatRoomProxyModel.filterText = ''
}
font.pointSize: ConversationStyle.filters.pointSize
Timer{
id: searchDelay
interval: 500
running: false
onTriggered: if( searchView.visible){
chatRoomProxyModel.filterText = searchBar.text
}
}
}
}

View file

@ -3,6 +3,7 @@ import QtQuick.Layouts 1.3
import Common 1.0
import Linphone 1.0
import ConstantsCpp 1.0
import App.Styles 1.0
@ -100,6 +101,29 @@ DialogPlus {
horizontalAlignment: Text.AlignHCenter
}
Text {
elide: Text.ElideRight
font.pointSize: AboutStyle.copyrightBlock.url.pointSize
color: AboutStyle.copyrightBlock.url.color
linkColor: AboutStyle.copyrightBlock.url.color
//: 'Help us translate %1' : %1 is the application name
text: '<a href="'+ConstantsCpp.TranslationUrl+'" style="text-decoration:none;color:'+AboutStyle.copyrightBlock.url.color+'">'+qsTr('aboutTranslation').arg(applicationName)+'</a>'
textFormat: Text.RichText
width: parent.width
visible: ConstantsCpp.TranslationUrl != ''
horizontalAlignment: Text.AlignHCenter
onLinkActivated: Qt.openUrlExternally(link)
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.NoButton
cursorShape: parent.hoveredLink
? Qt.PointingHandCursor
: Qt.IBeamCursor
}
}
}
}

View file

@ -50,7 +50,11 @@ ColumnLayout {
Layout.preferredHeight: HistoryViewStyle.bar.avatarSize
Layout.preferredWidth: HistoryViewStyle.bar.avatarSize
image: peerAddress?Logic.getAvatar():null
image: peerAddress ?
(historyView._sipAddressObserver.contact
? historyView._sipAddressObserver.contact
: null)
:null
presenceLevel: historyView._sipAddressObserver?Presence.getPresenceLevel(
historyView._sipAddressObserver.presenceStatus

View file

@ -224,24 +224,23 @@ TabContainer {
}
}
FormLine {
maxItemWidth: parent.width
FormGroup {
//: 'Check for updates' : Label switch for enabling check for updates
label: qsTr('checkForUpdateLabel')
maxWidth: 150
width: 150
Switch {
checked: SettingsModel.checkForUpdateEnabled
onClicked: SettingsModel.checkForUpdateEnabled = !checked
}
}
FormGroup {
maxWidth: parent.width - 200
width: parent.width - 200
TextField {
text: SettingsModel.versionCheckUrl
onEditingFinished: SettingsModel.versionCheckUrl = text
RowLayout{
Switch {
checked: SettingsModel.checkForUpdateEnabled
onClicked: SettingsModel.checkForUpdateEnabled = !checked
}
TextField {
Layout.fillWidth: true
text: SettingsModel.versionCheckUrl
onEditingFinished: SettingsModel.versionCheckUrl = text
}
}
}
}

View file

@ -1,10 +1,23 @@
pragma Singleton
import QtQml 2.2
import ColorsList 1.0
import Units 1.0
// =============================================================================
QtObject {
property QtObject checkBox: QtObject {
property int width: 300
}
property string sectionName: 'UseAppSipAccount'
property QtObject checkBox: QtObject {
property int width: 300
}
property QtObject warningBlock: QtObject {
property int spacing: 10
property int pointSize: Units.dp * 10
property color color: ColorsList.add(sectionName+'_description', 'g').color
property QtObject contactUrl: QtObject {
property color color: ColorsList.add(sectionName+'_url', 'i').color
property int pointSize: Units.dp * 9
}
}
}

View file

@ -8,7 +8,7 @@ import Units 1.0
QtObject {
property string sectionName: 'About'
property int height: 225
property int height: 255
property int spacing: 20
property int width: 400

@ -1 +1 @@
Subproject commit e9ce4178eb91013d23f9aef6c080a8c9b2c978c9
Subproject commit b9c4a6d464bcead4ad40aa652933d84c29a4194b