Welcome / Login pages ui

This commit is contained in:
Gaëlle Braud 2023-10-23 11:12:27 +00:00 committed by Julien Wadel
parent bc2c51badd
commit 86d776a62b
44 changed files with 1657 additions and 88 deletions

5
.gitignore vendored
View file

@ -47,4 +47,7 @@ linphone.spec
!.clang-format
!.gitignore
!.gitlab-ci*
!.gitmodules
!.gitmodules
# VSCode
linphone60*.log

View file

@ -1,6 +1,6 @@
################################################################################
#
# Copyright (c) 2010-2023 Belledonne Communications SARL.
# Copyright (c) 2010-2024 Belledonne Communications SARL.
#
# This file is part of linphone-desktop
# (see https://www.linphone.org).

View file

@ -21,7 +21,7 @@ set(APP_TARGETS ${LinphoneCxx_TARGET})
set(QT_DEFAULT_MAJOR_VERSION 6)
set(QT_PACKAGES Core Quick Qml Widgets)# Search Core at first for initialize Qt scripts for next find_packages.
set(QT_PACKAGES Core Quick Qml Widgets Svg Multimedia)# Search Core at first for initialize Qt scripts for next find_packages.
if (UNIX AND NOT APPLE)
list(APPEND QT_PACKAGES DBus)
endif()
@ -68,6 +68,7 @@ endif()
set(_LINPHONEAPP_SOURCES main.cpp)
set(_LINPHONEAPP_QML_FILES)
set(_LINPHONEAPP_RC_FILES)
set(_LINPHONEAPP_QML_SINGLETONS)
add_subdirectory(data)
add_subdirectory(tool)
@ -79,17 +80,17 @@ qt6_add_executable(Linphone
${_LINPHONEAPP_SOURCES}
)
set_source_files_properties(${_LINPHONEAPP_QML_SINGLETONS} PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
qt6_add_qml_module(Linphone
URI Linphone
RESOURCE_PREFIX ""
VERSION 1.0
QML_FILES ${_LINPHONEAPP_QML_FILES}
QML_FILES ${_LINPHONEAPP_QML_FILES} ${_LINPHONEAPP_QML_SINGLETONS}
)
qt_add_resources(Linphone
PREFIX "/"
FILES ${_LINPHONEAPP_RC_FILES}
)
qt6_add_resources(Linphone "resources" PREFIX "/" FILES ${_LINPHONEAPP_RC_FILES})
################################################################
# TARGETS LINKS
################################################################
@ -101,10 +102,10 @@ set_target_properties(${TARGET_NAME} PROPERTIES
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
OUTPUT_NAME "${EXECUTABLE_NAME}"
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}
# Added for Qt to set the correct path on run configurations.
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}"
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}"
)
if(MSVC)
set_target_properties(${TARGET_NAME} PROPERTIES PDB_NAME "${EXECUTABLE_NAME}_app")

View file

@ -21,11 +21,14 @@
#include "App.hpp"
#include <QCoreApplication>
#include <QGuiApplication>
#include <QQmlContext>
#include "core/logger/QtLogger.hpp"
#include "core/login/LoginPage.hpp"
#include "core/singleapplication/singleapplication.h"
#include "tool/Constants.hpp"
#include "tool/providers/ImageProvider.hpp"
App::App(int &argc, char *argv[])
: SingleApplication(argc, argv, true, Mode::User | Mode::ExcludeAppPath | Mode::ExcludeAppVersion) {
@ -64,8 +67,9 @@ void App::init() {
// QML
mEngine = new QQmlApplicationEngine(this);
mEngine->addImportPath(":/");
mEngine->rootContext()->setContextProperty("applicationDirPath", QGuiApplication::applicationDirPath());
initCppInterfaces();
mEngine->addImageProvider(ImageProvider::ProviderId, new ImageProvider());
const QUrl url(u"qrc:/Linphone/view/App/Main.qml"_qs);
QObject::connect(
@ -84,6 +88,9 @@ void App::initCppInterfaces() {
qmlRegisterSingletonType<LoginPage>(
Constants::MainQmlUri, 1, 0, "LoginPageCpp",
[](QQmlEngine *engine, QJSEngine *) -> QObject * { return new LoginPage(engine); });
qmlRegisterSingletonType<Constants>(
"ConstantsCpp", 1, 0, "ConstantsCpp",
[](QQmlEngine *engine, QJSEngine *) -> QObject * { return new Constants(engine); });
}
//------------------------------------------------------------

View file

@ -18,33 +18,35 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QQmlApplicationEngine>
#include <QCommandLineParser>
#include <QQmlApplicationEngine>
#include <QSharedPointer>
#include "core/thread/Thread.hpp"
#include "core/singleapplication/singleapplication.h"
#include "core/thread/Thread.hpp"
#include "model/core/CoreModel.hpp"
class App : public SingleApplication {
public:
App(int &argc, char *argv[]);
static App* getInstance();
// App::postModelAsync(<lambda>) => run lambda in model thread and continue.
// App::postModelSync(<lambda>) => run lambda in current thread and block connection.
template<typename Func, typename... Args>
static auto postModelAsync(Func&& callable, Args&& ...args) {
static App *getInstance();
// App::postModelAsync(<lambda>) => run lambda in model thread and continue.
// App::postModelSync(<lambda>) => run lambda in current thread and block connection.
template <typename Func, typename... Args>
static auto postModelAsync(Func &&callable, Args &&...args) {
QMetaObject::invokeMethod(CoreModel::getInstance().get(), callable, args...);
}
template<typename Func>
static auto postModelAsync(Func&& callable) {
template <typename Func>
static auto postModelAsync(Func &&callable) {
QMetaObject::invokeMethod(CoreModel::getInstance().get(), callable);
}
template<typename Func>
static auto postModelSync(Func&& callable) {
QMetaObject::invokeMethod(CoreModel::getInstance().get(), callable
, QThread::currentThread() != CoreModel::getInstance()->thread() ? Qt::BlockingQueuedConnection : Qt::DirectConnection);
template <typename Func>
static auto postModelSync(Func &&callable) {
QMetaObject::invokeMethod(CoreModel::getInstance().get(), callable,
QThread::currentThread() != CoreModel::getInstance()->thread()
? Qt::BlockingQueuedConnection
: Qt::DirectConnection);
}
void clean();
@ -54,10 +56,10 @@ public:
void onLoggerInitialized();
QQmlApplicationEngine *mEngine = nullptr;
private:
private:
void createCommandParser();
QCommandLineParser *mParser = nullptr;
Thread *mLinphoneThread = nullptr;
};

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2020 Belledonne Communications SARL.
* Copyright (c) 2010-2024 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2020 Belledonne Communications SARL.
* Copyright (c) 2010-2024 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).

View file

@ -0,0 +1,171 @@
/*
* Copyright (c) 2024 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QString>
#include "LinphoneEnums.hpp"
// =============================================================================
void LinphoneEnums::registerMetaTypes() {
qRegisterMetaType<LinphoneEnums::CallStatus>();
qRegisterMetaType<LinphoneEnums::ChatMessageState>();
qRegisterMetaType<LinphoneEnums::ChatRoomState>();
qRegisterMetaType<LinphoneEnums::ConferenceLayout>();
qRegisterMetaType<LinphoneEnums::ConferenceInfoState>();
qRegisterMetaType<LinphoneEnums::ConferenceSchedulerState>();
qRegisterMetaType<LinphoneEnums::EventLogType>();
qRegisterMetaType<LinphoneEnums::FriendCapability>();
qRegisterMetaType<LinphoneEnums::MediaEncryption>();
qRegisterMetaType<LinphoneEnums::ParticipantDeviceState>();
qRegisterMetaType<LinphoneEnums::RecorderState>();
qRegisterMetaType<LinphoneEnums::TunnelMode>();
qRegisterMetaType<LinphoneEnums::TransportType>();
qRegisterMetaType<std::shared_ptr<linphone::Call>>();
qRegisterMetaType<linphone::Call::State>();
qRegisterMetaType<std::shared_ptr<linphone::Core>>();
qRegisterMetaType<linphone::Config::ConfiguringState>();
qRegisterMetaType<std::string>();
qRegisterMetaType<linphone::GlobalState>();
qRegisterMetaType<std::shared_ptr<linphone::ChatRoom>>();
qRegisterMetaType<linphone::ChatRoom::State>();
qRegisterMetaType<linphone::RegistrationState>();
qRegisterMetaType<linphone::VersionUpdateCheckResult>();
qRegisterMetaType<std::shared_ptr<linphone::CallLog>>();
qRegisterMetaType<std::shared_ptr<const linphone::CallStats>>();
qRegisterMetaType<std::shared_ptr<linphone::EventLog>>();
qRegisterMetaType<std::shared_ptr<linphone::ChatMessage>>();
}
linphone::MediaEncryption LinphoneEnums::toLinphone(const LinphoneEnums::MediaEncryption &data) {
return static_cast<linphone::MediaEncryption>(data);
}
LinphoneEnums::MediaEncryption LinphoneEnums::fromLinphone(const linphone::MediaEncryption &data) {
return static_cast<LinphoneEnums::MediaEncryption>(data);
}
linphone::Friend::Capability LinphoneEnums::toLinphone(const LinphoneEnums::FriendCapability &data) {
return static_cast<linphone::Friend::Capability>(data);
}
LinphoneEnums::FriendCapability LinphoneEnums::fromLinphone(const linphone::Friend::Capability &data) {
return static_cast<LinphoneEnums::FriendCapability>(data);
}
linphone::EventLog::Type LinphoneEnums::toLinphone(const LinphoneEnums::EventLogType &data) {
return static_cast<linphone::EventLog::Type>(data);
}
LinphoneEnums::EventLogType LinphoneEnums::fromLinphone(const linphone::EventLog::Type &data) {
return static_cast<LinphoneEnums::EventLogType>(data);
}
linphone::ChatMessage::State LinphoneEnums::toLinphone(const LinphoneEnums::ChatMessageState &data) {
return static_cast<linphone::ChatMessage::State>(data);
}
LinphoneEnums::ChatMessageState LinphoneEnums::fromLinphone(const linphone::ChatMessage::State &data) {
return static_cast<LinphoneEnums::ChatMessageState>(data);
}
linphone::ChatRoom::State LinphoneEnums::toLinphone(const LinphoneEnums::ChatRoomState &data) {
return static_cast<linphone::ChatRoom::State>(data);
}
LinphoneEnums::ChatRoomState LinphoneEnums::fromLinphone(const linphone::ChatRoom::State &data) {
return static_cast<LinphoneEnums::ChatRoomState>(data);
}
linphone::Call::Status LinphoneEnums::toLinphone(const LinphoneEnums::CallStatus &data) {
return static_cast<linphone::Call::Status>(data);
}
LinphoneEnums::CallStatus LinphoneEnums::fromLinphone(const linphone::Call::Status &data) {
return static_cast<LinphoneEnums::CallStatus>(data);
}
linphone::Conference::Layout LinphoneEnums::toLinphone(const LinphoneEnums::ConferenceLayout &layout) {
if (layout != LinphoneEnums::ConferenceLayoutAudioOnly) return static_cast<linphone::Conference::Layout>(layout);
else return linphone::Conference::Layout::Grid; // Audio Only mode
}
LinphoneEnums::ConferenceLayout LinphoneEnums::fromLinphone(const linphone::Conference::Layout &layout) {
return static_cast<LinphoneEnums::ConferenceLayout>(layout);
}
linphone::ConferenceInfo::State LinphoneEnums::toLinphone(const LinphoneEnums::ConferenceInfoState &state) {
return static_cast<linphone::ConferenceInfo::State>(state);
}
LinphoneEnums::ConferenceInfoState LinphoneEnums::fromLinphone(const linphone::ConferenceInfo::State &state) {
return static_cast<LinphoneEnums::ConferenceInfoState>(state);
}
linphone::ConferenceScheduler::State LinphoneEnums::toLinphone(const LinphoneEnums::ConferenceSchedulerState &state) {
return static_cast<linphone::ConferenceScheduler::State>(state);
}
LinphoneEnums::ConferenceSchedulerState LinphoneEnums::fromLinphone(const linphone::ConferenceScheduler::State &state) {
return static_cast<LinphoneEnums::ConferenceSchedulerState>(state);
}
linphone::ParticipantDevice::State LinphoneEnums::toLinphone(const LinphoneEnums::ParticipantDeviceState &state) {
return static_cast<linphone::ParticipantDevice::State>(state);
}
LinphoneEnums::ParticipantDeviceState LinphoneEnums::fromLinphone(const linphone::ParticipantDevice::State &state) {
return static_cast<LinphoneEnums::ParticipantDeviceState>(state);
}
linphone::Tunnel::Mode LinphoneEnums::toLinphone(const LinphoneEnums::TunnelMode &data) {
return static_cast<linphone::Tunnel::Mode>(data);
}
LinphoneEnums::TunnelMode LinphoneEnums::fromLinphone(const linphone::Tunnel::Mode &data) {
return static_cast<LinphoneEnums::TunnelMode>(data);
}
linphone::Recorder::State LinphoneEnums::toLinphone(const LinphoneEnums::RecorderState &data) {
return static_cast<linphone::Recorder::State>(data);
}
LinphoneEnums::RecorderState LinphoneEnums::fromLinphone(const linphone::Recorder::State &data) {
return static_cast<LinphoneEnums::RecorderState>(data);
}
linphone::TransportType LinphoneEnums::toLinphone(const LinphoneEnums::TransportType &type) {
return static_cast<linphone::TransportType>(type);
}
LinphoneEnums::TransportType LinphoneEnums::fromLinphone(const linphone::TransportType &type) {
return static_cast<LinphoneEnums::TransportType>(type);
}
QString LinphoneEnums::toString(const LinphoneEnums::TransportType &type) {
switch (type) {
case TransportTypeTcp:
return "TCP";
case TransportTypeUdp:
return "UDP";
case TransportTypeTls:
return "TLS";
case TransportTypeDtls:
return "DTLS";
}
}
void LinphoneEnums::fromString(const QString &transportType, LinphoneEnums::TransportType *transport) {
if (transportType.toUpper() == QLatin1String("TCP")) *transport = TransportTypeTcp;
else if (transportType.toUpper() == QLatin1String("UDP")) *transport = TransportTypeUdp;
else if (transportType.toUpper() == QLatin1String("TLS")) *transport = TransportTypeTls;
else *transport = TransportTypeDtls;
}

View file

@ -0,0 +1,244 @@
/*
* Copyright (c) 2021 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef LINPHONE_ENUMS_H_
#define LINPHONE_ENUMS_H_
#include <QObject>
#include <linphone++/linphone.hh>
// This namespace is used to pass Linphone enumerators to QML
// =============================================================================
namespace LinphoneEnums {
Q_NAMESPACE
void registerMetaTypes();
enum MediaEncryption {
MediaEncryptionNone = int(linphone::MediaEncryption::None),
MediaEncryptionDtls = int(linphone::MediaEncryption::DTLS),
MediaEncryptionSrtp = int(linphone::MediaEncryption::SRTP),
MediaEncryptionZrtp = int(linphone::MediaEncryption::ZRTP)
};
Q_ENUM_NS(MediaEncryption)
linphone::MediaEncryption toLinphone(const LinphoneEnums::MediaEncryption &encryption);
LinphoneEnums::MediaEncryption fromLinphone(const linphone::MediaEncryption &encryption);
enum FriendCapability {
FriendCapabilityNone = int(linphone::Friend::Capability::None),
FriendCapabilityGroupChat = int(linphone::Friend::Capability::GroupChat),
FriendCapabilityLimeX3Dh = int(linphone::Friend::Capability::LimeX3Dh),
FriendCapabilityEphemeralMessages = int(linphone::Friend::Capability::EphemeralMessages)
};
Q_ENUM_NS(FriendCapability)
linphone::Friend::Capability toLinphone(const LinphoneEnums::FriendCapability &capability);
LinphoneEnums::FriendCapability fromLinphone(const linphone::Friend::Capability &capability);
enum EventLogType {
EventLogTypeNone = int(linphone::EventLog::Type::None),
EventLogTypeConferenceCreated = int(linphone::EventLog::Type::ConferenceCreated),
EventLogTypeConferenceTerminated = int(linphone::EventLog::Type::ConferenceTerminated),
EventLogTypeConferenceCallStarted = int(linphone::EventLog::Type::ConferenceCallStarted),
EventLogTypeConferenceCallEnded = int(linphone::EventLog::Type::ConferenceCallEnded),
EventLogTypeConferenceChatMessage = int(linphone::EventLog::Type::ConferenceChatMessage),
EventLogTypeConferenceParticipantAdded = int(linphone::EventLog::Type::ConferenceParticipantAdded),
EventLogTypeConferenceParticipantRemoved = int(linphone::EventLog::Type::ConferenceParticipantRemoved),
EventLogTypeConferenceParticipantSetAdmin = int(linphone::EventLog::Type::ConferenceParticipantSetAdmin),
EventLogTypeConferenceParticipantUnsetAdmin = int(linphone::EventLog::Type::ConferenceParticipantUnsetAdmin),
EventLogTypeConferenceParticipantDeviceAdded = int(linphone::EventLog::Type::ConferenceParticipantDeviceAdded),
EventLogTypeConferenceParticipantDeviceRemoved = int(linphone::EventLog::Type::ConferenceParticipantDeviceRemoved),
EventLogTypeConferenceParticipantDeviceMediaAvailabilityChanged =
int(linphone::EventLog::Type::ConferenceParticipantDeviceMediaAvailabilityChanged),
EventLogTypeConferenceSubjectChanged = int(linphone::EventLog::Type::ConferenceSubjectChanged),
EventLogTypeConferenceAvailableMediaChanged = int(linphone::EventLog::Type::ConferenceAvailableMediaChanged),
EventLogTypeConferenceSecurityEvent = int(linphone::EventLog::Type::ConferenceSecurityEvent),
EventLogTypeConferenceEphemeralMessageLifetimeChanged =
int(linphone::EventLog::Type::ConferenceEphemeralMessageLifetimeChanged),
EventLogTypeConferenceEphemeralMessageEnabled = int(linphone::EventLog::Type::ConferenceEphemeralMessageEnabled),
EventLogTypeConferenceEphemeralMessageDisabled = int(linphone::EventLog::Type::ConferenceEphemeralMessageDisabled)
};
Q_ENUM_NS(EventLogType)
linphone::EventLog::Type toLinphone(const LinphoneEnums::EventLogType &capability);
LinphoneEnums::EventLogType fromLinphone(const linphone::EventLog::Type &data);
enum ChatMessageState {
ChatMessageStateIdle = int(linphone::ChatMessage::State::Idle),
ChatMessageStateInProgress = int(linphone::ChatMessage::State::InProgress),
ChatMessageStateDelivered = int(linphone::ChatMessage::State::Delivered),
ChatMessageStateNotDelivered = int(linphone::ChatMessage::State::NotDelivered),
ChatMessageStateFileTransferError = int(linphone::ChatMessage::State::FileTransferError),
ChatMessageStateFileTransferDone = int(linphone::ChatMessage::State::FileTransferDone),
ChatMessageStateDeliveredToUser = int(linphone::ChatMessage::State::DeliveredToUser),
ChatMessageStateDisplayed = int(linphone::ChatMessage::State::Displayed),
ChatMessageStateFileTransferInProgress = int(linphone::ChatMessage::State::FileTransferInProgress)
};
Q_ENUM_NS(ChatMessageState)
linphone::ChatMessage::State toLinphone(const LinphoneEnums::ChatMessageState &data);
LinphoneEnums::ChatMessageState fromLinphone(const linphone::ChatMessage::State &data);
enum ChatRoomState {
ChatRoomStateNone = int(linphone::ChatRoom::State::None),
ChatRoomStateInstantiated = int(linphone::ChatRoom::State::Instantiated),
ChatRoomStateCreationPending = int(linphone::ChatRoom::State::CreationPending),
ChatRoomStateCreated = int(linphone::ChatRoom::State::Created),
ChatRoomStateCreationFailed = int(linphone::ChatRoom::State::CreationFailed),
ChatRoomStateTerminationPending = int(linphone::ChatRoom::State::TerminationPending),
ChatRoomStateTerminated = int(linphone::ChatRoom::State::Terminated),
ChatRoomStateTerminationFailed = int(linphone::ChatRoom::State::TerminationFailed),
ChatRoomStateDeleted = int(linphone::ChatRoom::State::Deleted),
};
Q_ENUM_NS(ChatRoomState)
linphone::ChatRoom::State toLinphone(const LinphoneEnums::ChatRoomState &data);
LinphoneEnums::ChatRoomState fromLinphone(const linphone::ChatRoom::State &data);
enum CallStatus {
CallStatusDeclined = int(linphone::Call::Status::Declined),
CallStatusMissed = int(linphone::Call::Status::Missed),
CallStatusSuccess = int(linphone::Call::Status::Success),
CallStatusAborted = int(linphone::Call::Status::Aborted),
CallStatusEarlyAborted = int(linphone::Call::Status::EarlyAborted),
CallStatusAcceptedElsewhere = int(linphone::Call::Status::AcceptedElsewhere),
CallStatusDeclinedElsewhere = int(linphone::Call::Status::DeclinedElsewhere)
};
Q_ENUM_NS(CallStatus)
linphone::Call::Status toLinphone(const LinphoneEnums::CallStatus &capability);
LinphoneEnums::CallStatus fromLinphone(const linphone::Call::Status &capability);
enum ConferenceLayout {
ConferenceLayoutGrid = int(linphone::Conference::Layout::Grid),
ConferenceLayoutActiveSpeaker = int(linphone::Conference::Layout::ActiveSpeaker),
ConferenceLayoutAudioOnly = ConferenceLayoutGrid + ConferenceLayoutActiveSpeaker + 1,
};
Q_ENUM_NS(ConferenceLayout)
linphone::Conference::Layout toLinphone(const LinphoneEnums::ConferenceLayout &layout);
LinphoneEnums::ConferenceLayout fromLinphone(const linphone::Conference::Layout &layout);
enum ConferenceInfoState {
ConferenceInfoStateNew = int(linphone::ConferenceInfo::State::New),
ConferenceInfoStateUpdated = int(linphone::ConferenceInfo::State::Updated),
ConferenceInfoStateCancelled = int(linphone::ConferenceInfo::State::Cancelled)
};
Q_ENUM_NS(ConferenceInfoState)
linphone::ConferenceInfo::State toLinphone(const LinphoneEnums::ConferenceInfoState &state);
LinphoneEnums::ConferenceInfoState fromLinphone(const linphone::ConferenceInfo::State &state);
enum ConferenceSchedulerState {
ConferenceSchedulerStateAllocationPending = int(linphone::ConferenceScheduler::State::AllocationPending),
ConferenceSchedulerStateError = int(linphone::ConferenceScheduler::State::Error),
ConferenceSchedulerStateIdle = int(linphone::ConferenceScheduler::State::Idle),
ConferenceSchedulerStateReady = int(linphone::ConferenceScheduler::State::Ready),
ConferenceSchedulerStateUpdating = int(linphone::ConferenceScheduler::State::Updating)
};
Q_ENUM_NS(ConferenceSchedulerState)
linphone::ConferenceScheduler::State toLinphone(const LinphoneEnums::ConferenceSchedulerState &state);
LinphoneEnums::ConferenceSchedulerState fromLinphone(const linphone::ConferenceScheduler::State &state);
enum ParticipantDeviceState {
ParticipantDeviceStateJoining = int(linphone::ParticipantDevice::State::Joining),
ParticipantDeviceStatePresent = int(linphone::ParticipantDevice::State::Present),
ParticipantDeviceStateLeaving = int(linphone::ParticipantDevice::State::Leaving),
ParticipantDeviceStateLeft = int(linphone::ParticipantDevice::State::Left),
ParticipantDeviceStateScheduledForJoining = int(linphone::ParticipantDevice::State::ScheduledForJoining),
ParticipantDeviceStateScheduledForLeaving = int(linphone::ParticipantDevice::State::ScheduledForLeaving),
ParticipantDeviceStateOnHold = int(linphone::ParticipantDevice::State::OnHold),
ParticipantDeviceStateAlerting = int(linphone::ParticipantDevice::State::Alerting),
ParticipantDeviceStateMutedByFocus = int(linphone::ParticipantDevice::State::MutedByFocus),
};
Q_ENUM_NS(ParticipantDeviceState)
linphone::ParticipantDevice::State toLinphone(const LinphoneEnums::ParticipantDeviceState &state);
LinphoneEnums::ParticipantDeviceState fromLinphone(const linphone::ParticipantDevice::State &state);
enum TunnelMode {
TunnelModeDisable = int(linphone::Tunnel::Mode::Disable),
TunnelModeEnable = int(linphone::Tunnel::Mode::Enable),
TunnelModeAuto = int(linphone::Tunnel::Mode::Auto)
};
Q_ENUM_NS(TunnelMode)
linphone::Tunnel::Mode toLinphone(const LinphoneEnums::TunnelMode &mode);
LinphoneEnums::TunnelMode fromLinphone(const linphone::Tunnel::Mode &mode);
enum RecorderState {
RecorderStateClosed = int(linphone::Recorder::State::Closed),
RecorderStatePaused = int(linphone::Recorder::State::Paused),
RecorderStateRunning = int(linphone::Recorder::State::Running)
};
Q_ENUM_NS(RecorderState)
linphone::Recorder::State toLinphone(const LinphoneEnums::RecorderState &state);
LinphoneEnums::RecorderState fromLinphone(const linphone::Recorder::State &state);
enum TransportType {
TransportTypeDtls = int(linphone::TransportType::Dtls),
TransportTypeTcp = int(linphone::TransportType::Tcp),
TransportTypeTls = int(linphone::TransportType::Tls),
TransportTypeUdp = int(linphone::TransportType::Udp)
};
Q_ENUM_NS(TransportType)
linphone::TransportType toLinphone(const LinphoneEnums::TransportType &type);
LinphoneEnums::TransportType fromLinphone(const linphone::TransportType &type);
QString toString(const LinphoneEnums::TransportType &type);
void fromString(const QString &transportType, LinphoneEnums::TransportType *transport);
} // namespace LinphoneEnums
Q_DECLARE_METATYPE(LinphoneEnums::CallStatus)
Q_DECLARE_METATYPE(LinphoneEnums::ChatMessageState)
Q_DECLARE_METATYPE(LinphoneEnums::ChatRoomState)
Q_DECLARE_METATYPE(LinphoneEnums::ConferenceLayout)
Q_DECLARE_METATYPE(LinphoneEnums::ConferenceInfoState)
Q_DECLARE_METATYPE(LinphoneEnums::ConferenceSchedulerState)
Q_DECLARE_METATYPE(LinphoneEnums::EventLogType)
Q_DECLARE_METATYPE(LinphoneEnums::FriendCapability)
Q_DECLARE_METATYPE(LinphoneEnums::MediaEncryption)
Q_DECLARE_METATYPE(LinphoneEnums::ParticipantDeviceState)
Q_DECLARE_METATYPE(LinphoneEnums::RecorderState)
Q_DECLARE_METATYPE(LinphoneEnums::TunnelMode)
Q_DECLARE_METATYPE(LinphoneEnums::TransportType)
Q_DECLARE_METATYPE(std::shared_ptr<linphone::Call>)
Q_DECLARE_METATYPE(linphone::Call::State)
Q_DECLARE_METATYPE(std::shared_ptr<linphone::Core>)
Q_DECLARE_METATYPE(linphone::Config::ConfiguringState)
Q_DECLARE_METATYPE(std::string)
Q_DECLARE_METATYPE(linphone::GlobalState)
Q_DECLARE_METATYPE(std::shared_ptr<linphone::ChatRoom>)
Q_DECLARE_METATYPE(linphone::ChatRoom::State)
Q_DECLARE_METATYPE(linphone::RegistrationState)
Q_DECLARE_METATYPE(linphone::VersionUpdateCheckResult)
Q_DECLARE_METATYPE(std::shared_ptr<linphone::CallLog>)
Q_DECLARE_METATYPE(std::shared_ptr<const linphone::CallStats>)
Q_DECLARE_METATYPE(std::shared_ptr<linphone::EventLog>)
Q_DECLARE_METATYPE(std::shared_ptr<linphone::ChatMessage>)
#endif

View file

@ -1,6 +1,18 @@
list(APPEND _LINPHONEAPP_RC_FILES data/assistant/use-app-sip-account.rc
data/assistant/create-app-sip-account.rc
data/assistant/use-other-sip-account.rc
"data/image/info-logo.svg"
"data/image/belledonne.svg"
"data/image/profil.svg"
"data/image/logo.svg"
"data/image/login-image.svg"
"data/image/show.svg"
"data/image/welcome-linphone-logo.svg"
"data/image/welcome-lock.svg"
"data/image/welcome-opensource.svg"
"data/image/hide.svg"
"data/image/down-arrow.svg"
"data/image/return-arrow.svg"
)
set(_LINPHONEAPP_RC_FILES ${_LINPHONEAPP_RC_FILES} PARENT_SCOPE)
set(_LINPHONEAPP_RC_FILES ${_LINPHONEAPP_RC_FILES} PARENT_SCOPE)

View file

@ -0,0 +1,5 @@
<svg width="1512" height="108" viewBox="0 0 1512 108" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0.29875L380.282 54.6952L577.111 36.1953L660.188 0L835.288 48.2605L1126.7 0.804341L1381.42 36.2792L1512 0.862443L1512 108H0V0.29875Z" fill="#FFB9A0"/>
<path d="M0 38.069L343.217 8.6521L450.578 30.1425L546.436 27.9563L651.241 50.4778L819.416 22.0956L1015.14 60.013L1140.76 31.1736L1348.75 75.0722L1473.64 25.1305L1512 38.069L1512 107H0V38.069Z" fill="#FF9E79"/>
<path d="M0 108V101.901L184.732 59.5213L402.005 71.6998L500.424 64.3474L580.945 82.8472L830.176 98.1297L1015.14 61.0131L1174.52 68.3655L1292.51 39.0691L1430.15 67.1323L1512 101.901L1512 108H0Z" fill="#FF723B"/>
</svg>

After

Width:  |  Height:  |  Size: 692 B

View file

@ -0,0 +1,3 @@
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.354 6.35403L8.35403 11.354C8.30759 11.4005 8.25245 11.4374 8.19175 11.4626C8.13105 11.4877 8.06599 11.5007 8.00028 11.5007C7.93457 11.5007 7.86951 11.4877 7.80881 11.4626C7.74811 11.4374 7.69296 11.4005 7.64653 11.354L2.64653 6.35403C2.55271 6.26021 2.5 6.13296 2.5 6.00028C2.5 5.8676 2.55271 5.74035 2.64653 5.64653C2.74035 5.55271 2.8676 5.5 3.00028 5.5C3.13296 5.5 3.26021 5.55271 3.35403 5.64653L8.00028 10.2934L12.6465 5.64653C12.693 5.60007 12.7481 5.56322 12.8088 5.53808C12.8695 5.51294 12.9346 5.5 13.0003 5.5C13.066 5.5 13.131 5.51294 13.1917 5.53808C13.2524 5.56322 13.3076 5.60007 13.354 5.64653C13.4005 5.69298 13.4373 5.74813 13.4625 5.80883C13.4876 5.86953 13.5006 5.93458 13.5006 6.00028C13.5006 6.06598 13.4876 6.13103 13.4625 6.19173C13.4373 6.25242 13.4005 6.30757 13.354 6.35403Z" fill="#6C7A87"/>
</svg>

After

Width:  |  Height:  |  Size: 934 B

View file

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.82666 4.22425C5.76812 4.15825 5.69705 4.10454 5.61759 4.06621C5.53814 4.02788 5.45186 4.0057 5.36377 4.00096C5.27567 3.99622 5.18751 4.00902 5.1044 4.0386C5.02129 4.06818 4.94487 4.11397 4.87959 4.1733C4.8143 4.23263 4.76144 4.30433 4.72406 4.38424C4.68669 4.46416 4.66555 4.55069 4.66187 4.63884C4.65818 4.72698 4.67203 4.81498 4.70261 4.89773C4.73319 4.98048 4.77988 5.05634 4.83999 5.12092L6.44333 6.88508C3.41666 8.74259 2.11499 11.6059 2.05749 11.7359C2.01959 11.8212 2 11.9134 2 12.0068C2 12.1001 2.01959 12.1923 2.05749 12.2776C2.08666 12.3434 2.79249 13.9084 4.36166 15.4776C6.4525 17.5676 9.09333 18.6726 12 18.6726C13.4938 18.6811 14.9726 18.3735 16.3392 17.7701L18.1725 19.7876C18.2311 19.8536 18.3021 19.9073 18.3816 19.9456C18.461 19.984 18.5473 20.0061 18.6354 20.0109C18.7235 20.0156 18.8117 20.0028 18.8948 19.9732C18.9779 19.9437 19.0543 19.8979 19.1196 19.8385C19.1849 19.7792 19.2377 19.7075 19.2751 19.6276C19.3125 19.5477 19.3336 19.4611 19.3373 19.373C19.341 19.2849 19.3271 19.1969 19.2966 19.1141C19.266 19.0314 19.2193 18.9555 19.1592 18.8909L5.82666 4.22425ZM9.77083 10.5443L13.2433 14.3651C12.7204 14.6402 12.1209 14.7338 11.539 14.6313C10.9571 14.5288 10.4257 14.2359 10.0283 13.7986C9.63095 13.3613 9.39003 12.8045 9.34342 12.2154C9.29681 11.6264 9.44715 11.0386 9.77083 10.5443ZM12 17.3393C9.435 17.3393 7.19416 16.4068 5.33916 14.5684C4.57776 13.8117 3.93018 12.9486 3.41666 12.0059C3.80749 11.2734 5.05499 9.22342 7.3625 7.89092L8.8625 9.53675C8.28178 10.2805 7.98269 11.2056 8.01811 12.1486C8.05352 13.0915 8.42115 13.9916 9.05603 14.6897C9.6909 15.3878 10.5521 15.839 11.4875 15.9635C12.4229 16.088 13.3721 15.8778 14.1675 15.3701L15.395 16.7201C14.3117 17.1357 13.1603 17.3457 12 17.3393ZM12.5 9.38675C12.3263 9.3536 12.1729 9.2528 12.0735 9.10652C11.9741 8.96024 11.9368 8.78047 11.97 8.60675C12.0032 8.43303 12.104 8.2796 12.2502 8.18021C12.3965 8.08081 12.5763 8.0436 12.75 8.07675C13.5997 8.24148 14.3733 8.67646 14.9556 9.31683C15.5378 9.95719 15.8975 10.7686 15.9808 11.6301C15.9973 11.8061 15.9432 11.9815 15.8303 12.1176C15.7175 12.2537 15.5552 12.3395 15.3792 12.3559C15.3584 12.3571 15.3375 12.3571 15.3167 12.3559C15.15 12.3566 14.9892 12.2949 14.8658 12.1829C14.7424 12.071 14.6654 11.9168 14.65 11.7509C14.5939 11.1779 14.3543 10.6383 13.967 10.2124C13.5796 9.78642 13.0651 9.49686 12.5 9.38675ZM21.94 12.2776C21.905 12.3559 21.0608 14.2251 19.16 15.9276C19.0951 15.9876 19.0188 16.0341 18.9357 16.0644C18.8526 16.0947 18.7643 16.1081 18.676 16.1039C18.5876 16.0997 18.501 16.078 18.4212 16.04C18.3413 16.002 18.2698 15.9485 18.2108 15.8826C18.1518 15.8167 18.1065 15.7398 18.0776 15.6562C18.0486 15.5726 18.0366 15.4841 18.0422 15.3959C18.0478 15.3076 18.0709 15.2213 18.1101 15.1421C18.1494 15.0628 18.204 14.9922 18.2708 14.9343C19.2034 14.0964 19.9868 13.1062 20.5875 12.0059C20.0729 11.0624 19.4239 10.1987 18.6608 9.44175C16.8058 7.60508 14.565 6.67258 12 6.67258C11.4595 6.67192 10.92 6.71568 10.3867 6.80342C10.2999 6.81875 10.211 6.81676 10.1251 6.79754C10.0391 6.77832 9.95786 6.74226 9.88593 6.69145C9.814 6.64064 9.75285 6.57608 9.70601 6.5015C9.65917 6.42692 9.62757 6.3438 9.61304 6.25694C9.59851 6.17008 9.60133 6.0812 9.62135 5.99544C9.64136 5.90967 9.67817 5.82872 9.72964 5.75727C9.78112 5.68581 9.84624 5.62526 9.92125 5.57911C9.99626 5.53297 10.0797 5.50214 10.1667 5.48842C10.7726 5.38836 11.3858 5.33847 12 5.33925C14.9067 5.33925 17.5475 6.44425 19.6383 8.53509C21.2075 10.1043 21.9133 11.6701 21.9425 11.7359C21.9804 11.8212 22 11.9134 22 12.0068C22 12.1001 21.9804 12.1923 21.9425 12.2776H21.94Z" fill="#343330"/>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View file

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10 0C8.02219 0 6.08879 0.58649 4.4443 1.6853C2.79981 2.78412 1.51809 4.3459 0.761209 6.17316C0.00433284 8.00042 -0.1937 10.0111 0.192152 11.9509C0.578004 13.8907 1.53041 15.6725 2.92894 17.0711C4.32746 18.4696 6.10929 19.422 8.0491 19.8078C9.98891 20.1937 11.9996 19.9957 13.8268 19.2388C15.6541 18.4819 17.2159 17.2002 18.3147 15.5557C19.4135 13.9112 20 11.9778 20 10C19.9972 7.34869 18.9427 4.80678 17.068 2.93202C15.1932 1.05727 12.6513 0.00279983 10 0ZM10 18.4615C8.32647 18.4615 6.69052 17.9653 5.29902 17.0355C3.90753 16.1057 2.823 14.7842 2.18256 13.2381C1.54213 11.6919 1.37456 9.99061 1.70105 8.34923C2.02754 6.70786 2.83343 5.20016 4.01679 4.01679C5.20016 2.83342 6.70786 2.02754 8.34924 1.70105C9.99062 1.37456 11.6919 1.54212 13.2381 2.18256C14.7842 2.82299 16.1057 3.90753 17.0355 5.29902C17.9653 6.69051 18.4615 8.32646 18.4615 10C18.459 12.2434 17.5667 14.3941 15.9804 15.9804C14.3941 17.5667 12.2434 18.459 10 18.4615ZM11.5385 14.6154C11.5385 14.8194 11.4574 15.0151 11.3132 15.1593C11.1689 15.3036 10.9732 15.3846 10.7692 15.3846C10.3612 15.3846 9.96989 15.2225 9.68138 14.934C9.39286 14.6455 9.23077 14.2542 9.23077 13.8462V10C9.02676 10 8.8311 9.91895 8.68684 9.7747C8.54259 9.63044 8.46154 9.43478 8.46154 9.23077C8.46154 9.02675 8.54259 8.8311 8.68684 8.68684C8.8311 8.54258 9.02676 8.46154 9.23077 8.46154C9.6388 8.46154 10.0301 8.62362 10.3186 8.91214C10.6071 9.20066 10.7692 9.59197 10.7692 10V13.8462C10.9732 13.8462 11.1689 13.9272 11.3132 14.0715C11.4574 14.2157 11.5385 14.4114 11.5385 14.6154ZM8.46154 5.76923C8.46154 5.54102 8.52921 5.31794 8.656 5.12819C8.78279 4.93844 8.96299 4.79055 9.17383 4.70321C9.38467 4.61588 9.61667 4.59303 9.84049 4.63755C10.0643 4.68208 10.2699 4.79197 10.4313 4.95334C10.5926 5.11471 10.7025 5.3203 10.7471 5.54413C10.7916 5.76795 10.7687 5.99995 10.6814 6.21079C10.5941 6.42163 10.4462 6.60183 10.2564 6.72862C10.0667 6.8554 9.8436 6.92308 9.61539 6.92308C9.30937 6.92308 9.01588 6.80151 8.79949 6.58512C8.58311 6.36873 8.46154 6.07525 8.46154 5.76923Z" fill="#6C7A87"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -0,0 +1,68 @@
<svg width="395" height="350" viewBox="0 0 395 350" fill="none" xmlns="http://www.w3.org/2000/svg">
<g opacity="0.8" clip-path="url(#clip0_1348_6698)">
<path d="M57.8475 320.372C134.977 359.882 260.023 359.882 337.152 320.372C414.282 280.862 414.282 216.808 337.152 177.298C260.023 137.789 134.977 137.789 57.8475 177.298C-19.2825 216.808 -19.2825 280.862 57.8475 320.372Z" fill="#F9F9F9"/>
<path d="M310.093 257.25C314.316 259.696 322.623 258.852 328.645 255.369L363.352 235.179C369.374 231.696 370.817 226.89 366.585 224.435C362.353 221.989 354.037 222.824 348.015 226.307L313.343 246.506C307.321 249.989 305.87 254.803 310.101 257.241L310.093 257.25Z" fill="#EDEDED"/>
<path d="M101.175 275.873L65.8682 255.457L101.166 235.031L101.175 275.873Z" fill="#EDEDED"/>
<path d="M200.932 288.088L144.041 255.16L200.95 222.293L200.932 288.088Z" fill="#EDEDED"/>
<path d="M50.3136 263.649C49.3316 263.649 48.7407 262.831 48.7407 261.464V115.012L227.74 11.4751V157.335C227.74 159.572 226.167 162.306 224.23 163.42L51.7387 263.205C51.2347 263.501 50.7394 263.649 50.3136 263.649Z" fill="#FAFAFA"/>
<path d="M227.228 12.3543V157.334C227.228 159.372 225.742 161.958 223.978 162.985L51.4867 262.77C51.0609 263.014 50.6525 263.144 50.3136 263.144C49.349 263.144 49.2447 261.977 49.2447 261.472V115.317L227.228 12.3543ZM228.244 10.5869L48.228 114.725V261.472C48.228 263.179 49.0796 264.163 50.3136 264.163C50.8176 264.163 51.3911 263.997 51.9907 263.649L224.482 163.864C226.558 162.663 228.244 159.737 228.244 157.334V10.5869Z" fill="#E0E0E0"/>
<path d="M48.228 114.725V139.225L228.244 35.0956V10.5869L48.228 114.725Z" fill="#FE5E00"/>
<path d="M62.3486 116.031V119.549C62.3486 120.263 62.8613 120.559 63.4783 120.202L118.823 88.1879V82.0586L63.4783 114.072C62.8613 114.429 62.3486 115.317 62.3486 116.031Z" fill="#FAFAFA"/>
<path d="M124.75 78.6282C125.375 78.2712 125.879 78.5586 125.879 79.2812V82.7986C125.879 83.5212 125.375 84.4006 124.75 84.7576L118.814 88.1879V82.0586L124.75 78.6282Z" fill="#22334D"/>
<path d="M48.228 106.829C48.228 104.426 49.9138 101.5 51.9907 100.299L224.482 0.513913C226.558 -0.68758 228.244 0.287545 228.244 2.69053V10.5873L48.228 114.725V106.829Z" fill="#22334D"/>
<path d="M208.241 14.0088C207.267 14.5747 206.477 15.9416 206.477 17.0734C206.477 18.2053 207.267 18.658 208.241 18.0921C209.214 17.5262 210.005 16.1593 210.005 15.0274C210.005 13.8956 209.214 13.4429 208.241 14.0088Z" fill="#4FAE80"/>
<path d="M213.828 10.77C212.855 11.3359 212.064 12.7028 212.064 13.8347C212.064 14.9665 212.855 15.4193 213.828 14.8533C214.801 14.2874 215.592 12.9205 215.592 11.7887C215.592 10.6568 214.801 10.2041 213.828 10.77Z" fill="#FFDC2E"/>
<path d="M219.424 7.53123C218.451 8.09715 217.66 9.46407 217.66 10.5959C217.66 11.7278 218.451 12.1805 219.424 11.6146C220.397 11.0486 221.188 9.68173 221.188 8.54989C221.188 7.41805 220.397 6.96531 219.424 7.53123Z" fill="#DD5F5F"/>
<g opacity="0.1">
<path d="M171.77 51.0461C169.641 52.2824 167.912 55.2774 167.912 57.7414C167.912 60.2053 169.641 61.2065 171.77 59.9702C173.899 58.7339 175.628 55.7389 175.628 53.2749C175.628 50.811 173.899 49.8098 171.77 51.0461Z" fill="black"/>
<path d="M154.121 61.259C151.992 62.4953 150.263 65.4903 150.263 67.9542C150.263 70.4182 151.992 71.4194 154.121 70.1831C156.25 68.9468 157.979 65.9518 157.979 63.4878C157.979 61.0239 156.25 60.0226 154.121 61.259Z" fill="black"/>
<path d="M189.419 40.842C187.29 42.0783 185.56 45.0733 185.56 47.5372C185.56 50.0012 187.29 51.0024 189.419 49.7661C191.548 48.5298 193.277 45.5348 193.277 43.0708C193.277 40.6069 191.548 39.6057 189.419 40.842Z" fill="black"/>
<path d="M207.067 30.612C204.938 31.8483 203.209 34.8433 203.209 37.3073C203.209 39.7712 204.938 40.7724 207.067 39.5361C209.196 38.2998 210.926 35.3048 210.926 32.8409C210.926 30.3769 209.196 29.3757 207.067 30.612Z" fill="black"/>
</g>
<path d="M66.1113 141.132L108.004 116.902C110.081 115.7 111.767 116.675 111.767 119.078V159.38C111.767 161.783 110.081 164.709 108.004 165.91L66.1113 190.14C64.0344 191.342 62.3486 190.367 62.3486 187.964V147.662C62.3486 145.259 64.0344 142.333 66.1113 141.132Z" fill="#C0D1D9"/>
<path d="M126.114 106.428L213.889 55.6516C215.966 54.4501 217.651 55.4252 217.651 57.8282V98.1305C217.651 100.533 215.966 103.459 213.889 104.66L126.114 155.436C124.037 156.638 122.351 155.663 122.351 153.26V112.958C122.351 110.555 124.037 107.629 126.114 106.428Z" fill="#C0D1D9"/>
<path d="M66.1113 202.39L132.709 163.864C134.786 162.663 136.472 163.516 136.472 165.771C136.472 168.026 134.786 170.829 132.709 172.031L66.1113 210.557C64.0344 211.759 62.3486 210.905 62.3486 208.65C62.3486 206.395 64.0344 203.592 66.1113 202.39Z" fill="#C0D1D9"/>
<path d="M66.1113 216.686L132.709 178.16C134.786 176.959 136.472 177.812 136.472 180.067C136.472 182.322 134.786 185.125 132.709 186.327L66.1113 224.853C64.0344 226.055 62.3486 225.201 62.3486 222.946C62.3486 220.691 64.0344 217.888 66.1113 216.686Z" fill="#C0D1D9"/>
<path d="M97.6465 182.514C97.6465 181.068 98.6545 179.318 99.9058 178.596L215.401 111.782C216.644 111.06 218.668 111.06 219.92 111.782L222.466 113.254C223.708 113.976 224.725 115.726 224.725 117.172V205.873C224.725 207.31 223.708 209.068 222.466 209.791L106.971 276.604C105.728 277.318 103.695 277.318 102.452 276.604L99.9058 275.133C98.6632 274.419 97.6465 272.652 97.6465 271.215V182.514Z" fill="#FE5E00"/>
<path opacity="0.4" d="M98.2981 180.284L104.702 183.985L224.047 114.942C223.639 114.237 223.074 113.619 222.457 113.253L219.902 111.791C218.659 111.059 216.635 111.059 215.392 111.791L99.897 178.595C99.2627 178.961 98.6978 179.579 98.2981 180.284Z" fill="white"/>
<path opacity="0.1" d="M97.6377 182.514V271.215C97.6377 272.66 98.6544 274.41 99.9057 275.133L102.452 276.613C102.643 276.718 102.843 276.813 103.069 276.892C103.356 276.988 103.668 277.066 103.999 277.109C104.589 277.188 105.206 277.162 105.78 277.049C105.928 277.014 106.075 276.97 106.214 276.927C106.31 276.892 106.397 276.866 106.484 276.822C106.067 276.97 105.702 276.953 105.406 276.805C104.981 276.578 104.711 276.065 104.711 275.316V186.614C104.711 185.683 105.18 184.978 105.884 184.69L104.711 184.002L98.3068 180.302C97.8984 181.007 97.6464 181.808 97.6464 182.531L97.6377 182.514Z" fill="black"/>
<path opacity="0.2" d="M104.711 183.985L158.196 204.01C162.011 205.429 166.295 204.018 168.511 200.605L177.097 187.424L224.473 114.699L178.808 187.92L224.708 205.916C224.699 206.648 224.429 207.457 224.004 208.171L178.687 188.12L168.702 204.123C166.408 207.797 161.768 209.225 157.823 207.475L150.715 204.332L105.406 276.787C104.981 276.561 104.711 276.047 104.711 275.298V273.818L150.497 204.236L104.711 183.985Z" fill="black"/>
<path d="M200.011 82.1541V285.798C200.011 288.201 201.697 289.176 203.774 287.975L295.085 235.153C297.162 233.951 298.848 231.026 298.848 228.623V24.9874C298.848 22.5844 297.162 21.6093 295.085 22.8108L203.774 75.6329C201.697 76.8344 200.011 79.7598 200.011 82.1628V82.1541Z" fill="#FAFAFA" stroke="#E0E0E0" stroke-width="1.17" stroke-miterlimit="10"/>
<path d="M205.303 85.95C205.303 85.3841 205.738 84.6789 206.285 84.3654L216.687 78.3493C217.226 78.0358 217.669 78.2448 217.669 78.802C217.669 79.3592 217.234 80.0731 216.687 80.3866L206.285 86.4027C205.747 86.7162 205.303 86.5072 205.303 85.95Z" fill="#22334D"/>
<path d="M205.303 90.0076C205.303 89.4417 205.738 88.7365 206.285 88.423L216.687 82.4069C217.226 82.0934 217.669 82.3024 217.669 82.8596C217.669 83.4168 217.234 84.1308 216.687 84.4442L206.285 90.4604C205.747 90.7738 205.303 90.5648 205.303 90.0076Z" fill="#22334D"/>
<path d="M205.303 94.0648C205.303 93.4988 205.738 92.7936 206.285 92.4802L216.687 86.464C217.226 86.1506 217.669 86.3595 217.669 86.9167C217.669 87.474 217.234 88.1879 216.687 88.5013L206.285 94.5175C205.747 94.8309 205.303 94.622 205.303 94.0648Z" fill="#22334D"/>
<path d="M291.784 41.8431V40.215C291.784 40.1193 291.714 40.0757 291.627 40.1105L290.376 40.6765C290.289 40.72 290.193 40.6765 290.167 40.5807C290.098 40.3543 290.002 40.1454 289.889 39.9625C289.837 39.8755 289.828 39.7449 289.872 39.6578L290.706 37.9688C290.75 37.8817 290.715 37.7685 290.628 37.725L289.724 37.2026C289.637 37.1503 289.533 37.1765 289.472 37.2635L288.429 38.8307C288.377 38.9091 288.256 38.97 288.16 38.97C287.943 38.97 287.717 38.9874 287.482 39.0396C287.387 39.0571 287.308 39.0048 287.291 38.9091L287.152 37.5421C287.143 37.4464 287.065 37.4028 286.987 37.4551L285.579 38.2648C285.492 38.317 285.423 38.4302 285.414 38.526L285.275 40.0931C285.266 40.1889 285.197 40.3195 285.127 40.3892C284.858 40.6416 284.588 40.9202 284.345 41.2163C284.284 41.2946 284.163 41.3295 284.067 41.2946L283.163 40.9812C283.068 40.9464 282.955 40.9899 282.911 41.077L281.877 42.8705C281.825 42.9576 281.851 43.0707 281.921 43.1404L282.642 43.7673C282.712 43.8282 282.746 43.9588 282.711 44.0459C282.581 44.4115 282.468 44.7772 282.39 45.1342C282.373 45.2299 282.286 45.3518 282.208 45.4041L280.921 46.3095C280.843 46.3618 280.774 46.4924 280.774 46.5882V48.2163C280.774 48.312 280.843 48.3556 280.93 48.3207L282.181 47.7548C282.268 47.7113 282.364 47.7548 282.39 47.8506C282.46 48.077 282.555 48.2859 282.668 48.4688C282.72 48.5558 282.729 48.6864 282.685 48.7735L281.851 50.4538C281.808 50.5409 281.843 50.6541 281.929 50.6976L282.833 51.22C282.92 51.2722 283.024 51.2461 283.085 51.1591L284.128 49.5919C284.18 49.5135 284.302 49.4526 284.397 49.4526C284.615 49.4526 284.84 49.4352 285.075 49.3829C285.171 49.3655 285.249 49.4178 285.266 49.5135L285.405 50.8804C285.414 50.9762 285.492 51.0197 285.57 50.9675L286.978 50.1578C287.065 50.1056 287.135 49.9924 287.143 49.8966L287.282 48.3294C287.291 48.2337 287.36 48.1031 287.43 48.0334C287.699 47.7809 287.969 47.5023 288.212 47.2063C288.273 47.128 288.395 47.0931 288.49 47.128L289.394 47.4414C289.489 47.4762 289.602 47.4327 289.646 47.3456L290.68 45.5521C290.732 45.465 290.706 45.3518 290.637 45.2822L289.915 44.6553C289.846 44.5944 289.811 44.4638 289.846 44.3767C289.976 44.011 290.089 43.6454 290.167 43.2884C290.185 43.1926 290.272 43.0707 290.35 43.0185L291.636 42.113C291.714 42.0608 291.784 41.9302 291.784 41.8344V41.8431ZM286.283 46.9538C284.971 47.7113 283.911 47.0931 283.911 45.5782C283.911 44.0633 284.971 42.2175 286.283 41.46C287.595 40.7026 288.655 41.3207 288.655 42.8357C288.655 44.3506 287.595 46.1964 286.283 46.9538Z" fill="#22334D"/>
<path d="M249.43 81.9802C260.101 75.8073 268.747 80.8135 268.747 93.1506C268.747 105.488 260.101 120.506 249.43 126.671C238.759 132.843 230.113 127.837 230.113 115.491C230.113 103.146 238.759 88.1357 249.43 81.9715V81.9802Z" fill="#EDEDED"/>
<path d="M249.291 91.6964C252.749 89.6939 255.556 91.3133 255.556 95.3183C255.556 99.3233 252.749 104.19 249.291 106.193C245.832 108.195 243.025 106.576 243.025 102.571C243.025 98.5658 245.832 93.6989 249.291 91.6964Z" fill="#FE5E00"/>
<path d="M261.639 113.045C261.639 106.463 257.024 103.799 251.341 107.09L247.787 109.144C242.104 112.435 237.49 120.437 237.49 127.01V128.804C238.515 129.143 239.628 129.317 240.809 129.317C243.399 129.317 246.327 128.464 249.421 126.67C254.053 123.989 258.311 119.636 261.639 114.56V113.036V113.045Z" fill="#FE5E00"/>
<path d="M231.989 145.041L266.861 124.868C267.904 124.268 268.747 124.694 268.747 125.826C268.747 126.958 267.904 128.351 266.861 128.96L231.989 149.133C230.947 149.734 230.104 149.307 230.104 148.176C230.104 147.044 230.947 145.651 231.989 145.041Z" fill="#FE5E00"/>
<path d="M228.244 159.468L270.598 134.942C271.641 134.341 272.484 134.767 272.484 135.899C272.484 137.031 271.641 138.424 270.598 139.034L228.244 163.56C227.202 164.16 226.359 163.734 226.359 162.602C226.359 161.47 227.202 160.077 228.244 159.468Z" fill="#22334D"/>
<path d="M214.358 196.74L284.484 156.177C286.561 154.975 288.247 155.829 288.247 158.084C288.247 160.339 286.561 163.142 284.484 164.343L214.358 204.907C212.281 206.108 210.595 205.255 210.595 203C210.595 200.745 212.281 197.942 214.358 196.74Z" fill="#C0D1D9"/>
<path d="M214.358 213.073L284.484 172.51C286.561 171.308 288.247 172.162 288.247 174.417C288.247 176.672 286.561 179.475 284.484 180.677L214.358 221.24C212.281 222.441 210.595 221.588 210.595 219.333C210.595 217.078 212.281 214.275 214.358 213.073Z" fill="#C0D1D9"/>
<path d="M237.186 220.291L261.665 206.134C262.708 205.533 263.551 206.021 263.551 207.222V215.119C263.551 216.321 262.708 217.783 261.665 218.384L237.186 232.541C236.143 233.142 235.3 232.654 235.3 231.453V223.556C235.3 222.354 236.143 220.892 237.177 220.291H237.186Z" fill="#FE5E00"/>
<path d="M215.896 197.941C214.923 198.507 214.132 199.874 214.132 201.006C214.132 202.138 214.923 202.591 215.896 202.025C216.869 201.459 217.66 200.092 217.66 198.96C217.66 197.828 216.869 197.375 215.896 197.941Z" fill="#FAFAFA"/>
<path d="M221.484 194.703C220.51 195.269 219.72 196.635 219.72 197.767C219.72 198.899 220.51 199.352 221.484 198.786C222.457 198.22 223.248 196.853 223.248 195.721C223.248 194.589 222.457 194.137 221.484 194.703Z" fill="#FAFAFA"/>
<path d="M227.071 191.464C226.098 192.03 225.307 193.397 225.307 194.529C225.307 195.66 226.098 196.113 227.071 195.547C228.044 194.981 228.835 193.614 228.835 192.483C228.835 191.351 228.044 190.898 227.071 191.464Z" fill="#FAFAFA"/>
<path d="M232.667 188.225C231.694 188.791 230.903 190.158 230.903 191.29C230.903 192.422 231.694 192.874 232.667 192.308C233.641 191.742 234.431 190.376 234.431 189.244C234.431 188.112 233.641 187.659 232.667 188.225Z" fill="#FAFAFA"/>
<path d="M238.255 184.986C237.281 185.552 236.491 186.919 236.491 188.051C236.491 189.183 237.281 189.636 238.255 189.07C239.228 188.504 240.019 187.137 240.019 186.005C240.019 184.873 239.228 184.42 238.255 184.986Z" fill="#FAFAFA"/>
<path d="M243.851 181.748C242.878 182.313 242.087 183.68 242.087 184.812C242.087 185.944 242.878 186.397 243.851 185.831C244.824 185.265 245.615 183.898 245.615 182.766C245.615 181.634 244.824 181.182 243.851 181.748Z" fill="#FAFAFA"/>
<path d="M249.439 178.509C248.465 179.075 247.675 180.442 247.675 181.573C247.675 182.705 248.465 183.158 249.439 182.592C250.412 182.026 251.203 180.659 251.203 179.527C251.203 178.396 250.412 177.943 249.439 178.509Z" fill="#FAFAFA"/>
<path d="M215.896 214.292C214.923 214.858 214.132 216.225 214.132 217.357C214.132 218.489 214.923 218.942 215.896 218.376C216.869 217.81 217.66 216.443 217.66 215.311C217.66 214.179 216.869 213.727 215.896 214.292Z" fill="#FAFAFA"/>
<path d="M221.484 211.054C220.51 211.62 219.72 212.987 219.72 214.118C219.72 215.25 220.51 215.703 221.484 215.137C222.457 214.571 223.248 213.204 223.248 212.072C223.248 210.941 222.457 210.488 221.484 211.054Z" fill="#FAFAFA"/>
<path d="M227.071 207.815C226.098 208.381 225.307 209.748 225.307 210.88C225.307 212.011 226.098 212.464 227.071 211.898C228.044 211.332 228.835 209.965 228.835 208.834C228.835 207.702 228.044 207.249 227.071 207.815Z" fill="#FAFAFA"/>
<path d="M232.667 204.576C231.694 205.142 230.903 206.509 230.903 207.64C230.903 208.772 231.694 209.225 232.667 208.659C233.641 208.093 234.431 206.726 234.431 205.594C234.431 204.462 233.641 204.01 232.667 204.576Z" fill="#FAFAFA"/>
<path d="M238.255 201.337C237.281 201.903 236.491 203.27 236.491 204.402C236.491 205.533 237.281 205.986 238.255 205.42C239.228 204.854 240.019 203.487 240.019 202.356C240.019 201.224 239.228 200.771 238.255 201.337Z" fill="#FAFAFA"/>
<path d="M243.851 198.098C242.878 198.664 242.087 200.031 242.087 201.163C242.087 202.295 242.878 202.747 243.851 202.181C244.824 201.616 245.615 200.249 245.615 199.117C245.615 197.985 244.824 197.532 243.851 198.098Z" fill="#FAFAFA"/>
<path d="M249.439 194.859C248.465 195.425 247.675 196.792 247.675 197.924C247.675 199.056 248.465 199.509 249.439 198.943C250.412 198.377 251.203 197.01 251.203 195.878C251.203 194.746 250.412 194.293 249.439 194.859Z" fill="#FAFAFA"/>
<path d="M327.863 247.342C324.813 247.342 321.928 246.593 319.304 245.078C313.039 241.456 309.45 233.873 309.45 224.279C309.45 207.405 320.155 187.99 333.824 180.085C341.185 175.827 348.493 175.366 354.402 178.787C360.667 182.409 364.256 189.993 364.256 199.587C364.256 216.46 353.55 235.876 339.881 243.781C335.78 246.149 331.695 247.342 327.863 247.342ZM345.816 188.678C343.626 188.678 341.306 189.784 339.881 190.602C329.957 196.34 321.572 211.767 321.572 224.279C321.572 229.346 322.988 233.185 325.361 234.561C328.063 236.128 331.817 234.422 333.816 233.264C343.739 227.526 352.125 212.098 352.125 199.587C352.125 194.52 350.709 190.68 348.336 189.305C347.563 188.852 346.694 188.678 345.816 188.678Z" fill="#364860"/>
<path d="M354.297 202.286C354.297 192.805 348.336 189.305 348.336 189.305C350.708 190.68 352.125 194.52 352.125 199.587C352.125 212.098 343.739 227.517 333.816 233.264C331.817 234.422 328.063 236.128 325.361 234.561C325.361 234.561 330.392 237.687 337.335 233.891C347.398 228.388 354.289 214.806 354.289 202.295L354.297 202.286Z" fill="#22334D"/>
<path d="M344.739 83.7998C344.739 80.3346 341.932 77.5225 338.473 77.5225C335.015 77.5225 332.208 80.3346 332.208 83.7998C332.208 83.7998 332.208 83.8085 332.208 83.8172V183.689C332.208 184.621 332.816 185.544 334.042 186.249C336.492 187.668 340.455 187.668 342.905 186.249C344.13 185.544 344.739 184.612 344.739 183.689V83.8172C344.739 83.8172 344.739 83.8085 344.739 83.7998Z" fill="#22334D"/>
<path d="M339.733 106.114C339.733 103.799 338.117 100.986 336.11 99.8371C335.093 99.245 334.181 99.2102 333.52 99.6107L318.053 108.535L317.679 108.761C317.627 108.787 317.575 108.813 317.531 108.848C317.262 109.031 317.018 109.231 316.793 109.458C315.854 110.389 315.281 111.678 315.281 113.097C315.281 115.047 316.358 116.736 317.948 117.616C318.678 118.007 319.504 118.234 320.399 118.234C321.294 118.234 322.119 118.007 322.841 117.616C322.936 117.563 323.04 117.502 323.136 117.45L338.699 108.465C339.342 108.082 339.742 107.272 339.742 106.123L339.733 106.114Z" fill="#364860"/>
<path d="M339.733 131.128C339.733 128.812 338.117 126 336.11 124.851C335.093 124.259 334.181 124.224 333.52 124.624L315.394 135.046L315.02 135.272C314.968 135.299 314.916 135.325 314.872 135.359C314.603 135.534 314.36 135.743 314.134 135.969C313.195 136.901 312.622 138.189 312.622 139.608C312.622 141.558 313.699 143.248 315.289 144.127C316.019 144.519 316.845 144.745 317.74 144.745C318.635 144.745 319.46 144.519 320.182 144.127C320.277 144.075 320.381 144.014 320.477 143.961L338.699 133.479C339.342 133.096 339.742 132.286 339.742 131.137L339.733 131.128Z" fill="#364860"/>
</g>
<defs>
<clipPath id="clip0_1348_6698">
<rect width="395" height="350" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -0,0 +1,3 @@
<svg width="34" height="35" viewBox="0 0 34 35" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17 3.6875C14.2682 3.6875 11.5976 4.49759 9.32619 6.01533C7.05474 7.53306 5.28436 9.69028 4.23892 12.2142C3.19348 14.7381 2.91995 17.5153 3.45291 20.1947C3.98587 22.874 5.30138 25.3352 7.23309 27.2669C9.16481 29.1986 11.626 30.5141 14.3053 31.0471C16.9847 31.5801 19.7619 31.3065 22.2858 30.2611C24.8097 29.2157 26.9669 27.4453 28.4847 25.1738C30.0024 22.9024 30.8125 20.2319 30.8125 17.5C30.8086 13.8379 29.3522 10.3269 26.7626 7.73736C24.1731 5.14785 20.6621 3.69137 17 3.6875ZM9.83876 26.7305C10.6074 25.5284 11.6663 24.5391 12.9178 23.8538C14.1693 23.1686 15.5732 22.8094 17 22.8094C18.4268 22.8094 19.8307 23.1686 21.0822 23.8538C22.3337 24.5391 23.3926 25.5284 24.1613 26.7305C22.1137 28.3229 19.5939 29.1874 17 29.1874C14.4061 29.1874 11.8863 28.3229 9.83876 26.7305ZM12.75 16.4375C12.75 15.5969 12.9993 14.7752 13.4663 14.0763C13.9333 13.3774 14.597 12.8327 15.3736 12.511C16.1502 12.1893 17.0047 12.1052 17.8291 12.2692C18.6536 12.4331 19.4108 12.8379 20.0052 13.4323C20.5996 14.0267 21.0044 14.7839 21.1683 15.6084C21.3323 16.4328 21.2482 17.2873 20.9265 18.0639C20.6048 18.8405 20.0601 19.5042 19.3612 19.9712C18.6623 20.4382 17.8406 20.6875 17 20.6875C15.8728 20.6875 14.7918 20.2397 13.9948 19.4427C13.1978 18.6457 12.75 17.5647 12.75 16.4375ZM25.7338 25.2576C24.5488 23.5404 22.8825 22.2119 20.9445 21.4392C21.9855 20.6193 22.7452 19.4954 23.1178 18.2237C23.4904 16.952 23.4575 15.5959 23.0236 14.3438C22.5897 13.0917 21.7765 12.0059 20.6969 11.2375C19.6173 10.469 18.3251 10.0561 17 10.0561C15.6749 10.0561 14.3827 10.469 13.3031 11.2375C12.2236 12.0059 11.4103 13.0917 10.9764 14.3438C10.5425 15.5959 10.5096 16.952 10.8822 18.2237C11.2548 19.4954 12.0145 20.6193 13.0555 21.4392C11.1175 22.2119 9.45125 23.5404 8.26626 25.2576C6.76889 23.5737 5.79019 21.4929 5.44803 19.2657C5.10587 17.0386 5.41483 14.7599 6.33771 12.7043C7.26058 10.6486 8.75802 8.90355 10.6497 7.67923C12.5414 6.45491 14.7467 5.80353 17 5.80353C19.2533 5.80353 21.4586 6.45491 23.3503 7.67923C25.242 8.90355 26.7394 10.6486 27.6623 12.7043C28.5852 14.7599 28.8941 17.0386 28.552 19.2657C28.2098 21.4929 27.2311 23.5737 25.7338 25.2576Z" fill="#4E6074"/>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -0,0 +1,3 @@
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.2812 19.4698C16.3509 19.5395 16.4062 19.6222 16.4439 19.7132C16.4816 19.8043 16.501 19.9019 16.501 20.0004C16.501 20.099 16.4816 20.1965 16.4439 20.2876C16.4062 20.3786 16.3509 20.4614 16.2812 20.531C16.2115 20.6007 16.1288 20.656 16.0378 20.6937C15.9467 20.7314 15.8491 20.7508 15.7506 20.7508C15.652 20.7508 15.5545 20.7314 15.4634 20.6937C15.3724 20.656 15.2896 20.6007 15.22 20.531L7.71996 13.031C7.65023 12.9614 7.59491 12.8787 7.55717 12.7876C7.51943 12.6966 7.5 12.599 7.5 12.5004C7.5 12.4019 7.51943 12.3043 7.55717 12.2132C7.59491 12.1222 7.65023 12.0394 7.71996 11.9698L15.22 4.46979C15.3607 4.32906 15.5516 4.25 15.7506 4.25C15.9496 4.25 16.1405 4.32906 16.2812 4.46979C16.4219 4.61052 16.501 4.80139 16.501 5.00042C16.501 5.19944 16.4219 5.39031 16.2812 5.53104L9.3109 12.5004L16.2812 19.4698Z" fill="#4E6074"/>
</svg>

After

Width:  |  Height:  |  Size: 940 B

View file

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.9425 11.7267C21.9133 11.6609 21.2075 10.0951 19.6383 8.52591C17.5475 6.43508 14.9067 5.33008 12 5.33008C9.09333 5.33008 6.4525 6.43508 4.36166 8.52591C2.79249 10.0951 2.08333 11.6634 2.05749 11.7267C2.01959 11.812 2 11.9043 2 11.9976C2 12.0909 2.01959 12.1832 2.05749 12.2684C2.08666 12.3342 2.79249 13.8993 4.36166 15.4684C6.4525 17.5584 9.09333 18.6634 12 18.6634C14.9067 18.6634 17.5475 17.5584 19.6383 15.4684C21.2075 13.8993 21.9133 12.3342 21.9425 12.2684C21.9804 12.1832 22 12.0909 22 11.9976C22 11.9043 21.9804 11.812 21.9425 11.7267ZM12 17.3301C9.435 17.3301 7.19416 16.3976 5.33916 14.5593C4.57803 13.8023 3.93048 12.9392 3.41666 11.9967C3.93034 11.0542 4.57791 10.1911 5.33916 9.43425C7.19416 7.59591 9.435 6.66341 12 6.66341C14.565 6.66341 16.8058 7.59591 18.6608 9.43425C19.4235 10.1909 20.0724 11.054 20.5875 11.9967C19.9867 13.1184 17.3692 17.3301 12 17.3301ZM12 7.99675C11.2089 7.99675 10.4355 8.23134 9.77772 8.67087C9.11992 9.1104 8.60723 9.73511 8.30448 10.466C8.00173 11.1969 7.92251 12.0012 8.07686 12.7771C8.2312 13.553 8.61216 14.2658 9.17157 14.8252C9.73098 15.3846 10.4437 15.7656 11.2196 15.9199C11.9956 16.0742 12.7998 15.995 13.5307 15.6923C14.2616 15.3895 14.8864 14.8768 15.3259 14.219C15.7654 13.5612 16 12.7879 16 11.9967C15.9989 10.9362 15.5771 9.91945 14.8272 9.16954C14.0773 8.41963 13.0605 7.99785 12 7.99675ZM12 14.6634C11.4726 14.6634 10.957 14.507 10.5185 14.214C10.0799 13.921 9.73815 13.5045 9.53632 13.0172C9.33449 12.53 9.28168 11.9938 9.38457 11.4765C9.48746 10.9592 9.74144 10.4841 10.1144 10.1111C10.4873 9.73819 10.9625 9.48421 11.4798 9.38132C11.997 9.27843 12.5332 9.33123 13.0205 9.53307C13.5078 9.7349 13.9242 10.0767 14.2173 10.5152C14.5103 10.9538 14.6667 11.4693 14.6667 11.9967C14.6667 12.704 14.3857 13.3823 13.8856 13.8824C13.3855 14.3825 12.7072 14.6634 12 14.6634Z" fill="#343330"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -0,0 +1,4 @@
<svg width="154" height="156" viewBox="0 0 154 156" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.3113 30.6898C13.3113 30.6898 -2.14567 52.0097 0.25282 61.6037C0.169915 61.2321 10.3798 50.4107 10.3798 50.4107C10.9128 53.3422 35.6972 60.5377 35.6972 60.5377C38.9876 62.6354 40.1219 64.1415 40.7607 67.4667V80.2587C49.3221 85.5855 57.1863 87.3532 76.2051 88.5201C96.4126 87.6588 104.759 85.8693 112.182 80.2587C112.182 80.2587 111.383 70.3981 112.182 66.9337C112.982 63.4692 114.756 61.4877 117.512 60.5377C127.795 58.1853 132.871 55.6117 142.563 50.6772L153.223 61.6037C151.604 49.5902 148.82 42.9404 140.431 31.2228C133.772 23.6131 129.502 19.6216 120.71 13.1009C111.152 7.45367 105.849 5.29726 96.459 2.70738C80.1596 -0.630016 71.1746 -0.619794 55.4182 2.70738C45.7636 5.61813 40.9519 7.81443 33.8317 13.1009C33.8317 13.1009 6.9153 -2.35612 3.45081 0.308867C-0.013679 2.97386 13.3113 30.6898 13.3113 30.6898Z" fill="#FF5E00"/>
<path d="M31.7136 113.262C19.3329 107.842 12.625 103.748 1.06616 94.6071C3.84546 106.113 6.43658 112.171 12.7921 122.323C19.5642 131.488 23.7253 135.578 31.7136 141.244C40.3522 147.174 45.5331 149.765 55.432 152.97C64.3245 155.108 69.2831 155.789 78.0844 155.902C87.0585 155.452 91.7154 154.474 99.4044 152.704C107.885 149.324 112.206 147.193 119.392 143.11C131.307 149.836 146.042 157.501 148.174 154.303C150.306 151.105 138.58 125.255 138.58 125.255C146.4 114.053 149.6 106.51 152.704 93.8076C141.998 102.206 135.043 107.107 121.79 113.262C105.396 119.729 95.8482 121.805 78.0844 122.323C57.3899 121.962 47.2902 119.914 31.7136 113.262Z" fill="#FF5E00"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,6 @@
<svg width="109" height="156" viewBox="0 0 109 156" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="5" y="67.0022" width="98.3365" height="83.9979" rx="5" stroke="#FF5E00" stroke-width="10"/>
<path d="M17.8032 30C17.8032 16.1929 28.9961 5 42.8032 5H65.6488C79.4559 5 90.6488 16.1929 90.6488 30V66.6933H17.8032V30Z" stroke="#FF5E00" stroke-width="10"/>
<circle cx="54.5668" cy="100.637" r="9.9574" fill="#FF5E00"/>
<path d="M54.1684 99.4419L65.3207 127.323H43.0161L54.1684 99.4419Z" fill="#FF5E00"/>
</svg>

After

Width:  |  Height:  |  Size: 515 B

View file

@ -0,0 +1,3 @@
<svg width="172" height="166" viewBox="0 0 172 166" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M95.6898 112.739C107.278 108.428 113.328 100.127 113.328 85.8405C113.328 71.5538 101.307 58.9649 86.2877 58.9396C70.4374 58.9143 58.4813 71.5018 58.6721 85.8405C58.863 100.179 65.6914 109.718 76.6189 113.167L57.2604 160.866C31.3512 154.148 5 123.535 5 85.8405C5 41.194 40.8179 5 85.7123 5C130.607 5 167 41.1939 167 85.8405C167 124.122 140.899 154.309 114.437 161L95.6898 112.739Z" stroke="#FF5E00" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 581 B

View file

@ -1,6 +1,8 @@
list(APPEND _LINPHONEAPP_SOURCES
tool/Constants.cpp
tool/Utils.cpp
tool/providers/ImageProvider.cpp
)
set(_LINPHONEAPP_SOURCES ${_LINPHONEAPP_SOURCES} PARENT_SCOPE)

View file

@ -40,6 +40,7 @@ public:
static constexpr char DefaultLocale[] = "en";
static constexpr char DefaultFont[] = "Noto Sans";
static constexpr int DefaultFontPointSize = 10;
#ifdef __APPLE__
static constexpr char DefaultEmojiFont[] = "Apple Color Emoji";
#else
@ -94,6 +95,7 @@ public:
Q_PROPERTY(QString PrivatePolicyUrl MEMBER PrivatePolicyUrl CONSTANT)
Q_PROPERTY(QString ContactUrl MEMBER ContactUrl CONSTANT)
Q_PROPERTY(QString TranslationUrl MEMBER TranslationUrl CONSTANT)
Q_PROPERTY(QString DefaultFont MEMBER DefaultFont CONSTANT)
Q_PROPERTY(int maxMosaicParticipants MEMBER MaxMosaicParticipants CONSTANT)
Q_PROPERTY(QStringList reactionsList READ getReactionsList CONSTANT)

View file

@ -0,0 +1,42 @@
/*
* Copyright (c) 2010-2024 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "core/path/Paths.hpp"
#include "core/utils/Constants.hpp"
// #include "tool/Utils.hpp"
#include "AvatarProvider.hpp"
// =============================================================================
const QString AvatarProvider::ProviderId = "avatar";
AvatarProvider::AvatarProvider()
: QQuickImageProvider(QQmlImageProviderBase::Image, QQmlImageProviderBase::ForceAsynchronousImageLoading) {
const auto &str = Paths::getAvatarsDirPath().toStdString();
if (Constants::LinphoneLocaleEncoding == QString("UTF-8")) mAvatarsPath = QString::fromStdString(str);
else mAvatarsPath = QString::fromLocal8Bit(str.c_str(), int(str.size()));
}
QImage AvatarProvider::requestImage(const QString &id, QSize *size, const QSize &) {
QImage image(mAvatarsPath + id);
*size = image.size();
return image;
}

View file

@ -0,0 +1,40 @@
/*
* Copyright (c) 2010-2024 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef AVATAR_PROVIDER_H_
#define AVATAR_PROVIDER_H_
#include <QQuickImageProvider>
// =============================================================================
class AvatarProvider : public QQuickImageProvider {
public:
AvatarProvider();
QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override;
static const QString ProviderId;
private:
QString mAvatarsPath;
};
#endif // AVATAR_PROVIDER_H_

View file

@ -0,0 +1,85 @@
/*
* Copyright (c) 2010-2024 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QElapsedTimer>
#include <QFileInfo>
#include <QPainter>
#include <QQmlPropertyMap>
#include <QRegularExpression>
#include <QScreen>
#include <QSvgRenderer>
#include "core/App.hpp"
#include "ImageProvider.hpp"
#include "tool/Constants.hpp"
// =============================================================================
using namespace std;
// -----------------------------------------------------------------------------
const QString ImageProvider::ProviderId = "internal";
ImageAsyncImageResponse::ImageAsyncImageResponse(const QString &id, const QSize &requestedSize) {
QString path = ":/data/image/";
QStringList filters;
filters << "*.svg";
QDir imageDir(path);
if (!imageDir.exists()) {
qDebug() << QStringLiteral("[ImageProvider] Dir doesn't exist: `%1`.").arg(path);
return;
}
QFileInfoList files = QDir(path).entryInfoList(filters, QDir::Files, QDir::Name);
for (QFileInfo file : files) {
if (file.fileName() == id) {
mPath = file.absoluteFilePath();
break;
}
}
QFile file(mPath);
if (!file.exists()) {
qDebug() << QStringLiteral("[ImageProvider] File doesn't exist: `%1`.").arg(mPath);
return;
}
QImage originalImage(mPath);
if (!originalImage.isNull()) {
emit imageGrabbed(originalImage);
}
}
void ImageAsyncImageResponse::imageGrabbed(QImage image) {
mImage = image;
emit finished();
}
QQuickTextureFactory *ImageAsyncImageResponse::textureFactory() const {
return QQuickTextureFactory::textureFactoryForImage(mImage);
}
QQuickImageResponse *ImageProvider::requestImageResponse(const QString &id, const QSize &requestedSize) {
ImageAsyncImageResponse *response = new ImageAsyncImageResponse(id, requestedSize);
return response;
}

View file

@ -0,0 +1,48 @@
/*
* Copyright (c) 2010-2024 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef IMAGE_PROVIDER_H_
#define IMAGE_PROVIDER_H_
#include <QQuickAsyncImageProvider>
// =============================================================================
class ImageAsyncImageResponse : public QQuickImageResponse {
public:
ImageAsyncImageResponse(const QString &id, const QSize &requestedSize);
QQuickTextureFactory *textureFactory() const override; // Convert QImage into texture.
// If Image is null, then sourceSize will be egal to 0.
// So there will be no errors.
void imageGrabbed(QImage image);
QImage mImage;
QString mPath;
};
class ImageProvider : public QQuickAsyncImageProvider {
public:
virtual QQuickImageResponse *requestImageResponse(const QString &id, const QSize &requestedSize) override;
static const QString ProviderId;
};
#endif // IMAGE_PROVIDER_H_

View file

@ -0,0 +1,70 @@
/**
* Qml template used for welcome and login/register pages
**/
import QtQuick 2.15
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.2 as Control
import Linphone
Item {
id: mainItem
property alias titleContent : titleLayout.children
property alias centerContent : centerLayout.children
ColumnLayout {
anchors.fill: parent
Layout.fillHeight: true
ColumnLayout {
Layout.rightMargin: 25
RowLayout {
Layout.fillWidth: true
Layout.preferredHeight: 50
Layout.topMargin: 20
Layout.bottomMargin: 20
Layout.alignment: Qt.AlignRight | Qt.AlignTop
Control.Button {
background: Rectangle {
color: "transparent"
}
contentItem: Image {
fillMode: Image.PreserveAspectFit
source: AppIcons.info
}
onClicked: console.debug("[LoginLayout] open about popup")
}
Text {
Layout.alignment: Qt.AlignRight |Qt.AlignVCenter
text: "About"
font.pixelSize: 12
color: DefaultStyle.grayColor
}
}
RowLayout {
id: titleLayout
Layout.leftMargin: 40
Layout.bottomMargin: 20
}
ColumnLayout {
id: centerLayout
Layout.leftMargin: 40
Layout.fillHeight: true
Layout.topMargin: 20
}
}
RowLayout {
Layout.alignment: Qt.AlignBottom
Image {
Layout.minimumHeight: 80
Layout.fillWidth: true
source: AppIcons.belledonne
fillMode: Image.Stretch
}
}
}
}

View file

@ -1,21 +1,41 @@
import QtQuick 2.15
import QtQuick.Layouts 1.0
import QtQuick.Layouts 1.3
import QtQuick.Controls
import Linphone
//import UI 1.0
Window {
width: 640
height: 480
id: mainWindow
width: 960
height: 600
visible: true
title: qsTr("Linphone")
ColumnLayout{
StackView {
id: mainWindowStackView
anchors.fill: parent
LoginPage{
height: 100
width: 640
initialItem: welcomePage
}
Component {
id: welcomePage
WelcomePage {
onStartButtonPressed: {
mainWindowStackView.pop(welcomePage)
mainWindowStackView.push(loginPage)
}
}
}
}
Component {
id: loginPage
LoginPage {
onUseSIPButtonClicked: mainWindowStackView.push(sipLoginPage)
}
}
Component {
id: sipLoginPage
SIPLoginPage {
onReturnToLogin: mainWindowStackView.pop()
}
}
}

View file

@ -1,10 +1,27 @@
list(APPEND _LINPHONEAPP_QML_FILES
view/App/Main.qml
view/App/Layout/LoginLayout.qml
view/Item/Button.qml
view/Page/LoginPage.qml
view/Item/Carousel.qml
view/Item/ComboBox.qml
view/Item/RectangleTest.qml
view/Item/Text.qml
view/Item/TextInput.qml
view/Item/Form/LoginForm.qml
view/Page/Login/LoginPage.qml
view/Page/Login/SIPLoginPage.qml
view/Page/Login/WelcomePage.qml
)
list(APPEND _LINPHONEAPP_QML_SINGLETONS
view/Style/AppIcons.qml
view/Style/DefaultStyle.qml
)
set(_LINPHONEAPP_QML_FILES ${_LINPHONEAPP_QML_FILES} PARENT_SCOPE)
set(_LINPHONEAPP_QML_SINGLETONS ${_LINPHONEAPP_QML_SINGLETONS} PARENT_SCOPE)

View file

@ -1,36 +1,36 @@
import QtQuick 2.7
import QtQuick.Controls 2.2 as Control
import Linphone
Control.Button {
id: mainItem
property int capitalization
property bool inversedColors: false
property int textSize: DefaultStyle.buttonTextSize
background: Rectangle {
color: '#F50000'
radius: 10
border.color: 'white'
color: inversedColors ? DefaultStyle.buttonInversedBackground : DefaultStyle.buttonBackground
radius: 24
border.color: inversedColors ? DefaultStyle.buttonBackground : DefaultStyle.buttonInversedBackground
}
contentItem: Text {
color: 'white'
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
leftPadding: 11
rightPadding: 11
topPadding: 6
bottomPadding: 6
wrapMode: Text.WordWrap
text: mainItem.text
color: inversedColors ? DefaultStyle.buttonInversedTextColor : DefaultStyle.buttonTextColor
font {
bold: true
pointSize: 10
pointSize: mainItem.textSize
capitalization: mainItem.capitalization
}
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
text: mainItem.text
verticalAlignment: Text.AlignVCenter
}
hoverEnabled: true
/*
MouseArea {
id: mouseArea
anchors.fill: parent
onPressed: mouse.accepted = false
}*/
}
}

View file

@ -0,0 +1,105 @@
import QtQuick 2.15
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.2 as Control
import Linphone
ColumnLayout {
id: carouselRoot
property list<Component> itemsList
property int currentIndex: carouselStackLayout.currentIndex
property bool prevButtonVisible: true
property bool nextButtonVisible: true
function goToSlide(index) {
carouselStackLayout.goToSlideAtIndex(index)
}
StackLayout {
id: carouselStackLayout
property var items: children
property int previousIndex: currentIndex
function goToSlideAtIndex(index) {
carouselStackLayout.previousIndex = carouselStackLayout.currentIndex;
carouselStackLayout.currentIndex = index;
}
Component.onCompleted: {
// The animation is not working until the slide
// has been displayed once
for (var i = 0; i < carouselRoot.itemsList.length; ++i) {
// const newObject = Qt.createQmlObject(carouselRoot.itemsList[i], carouselStackLayout);
carouselRoot.itemsList[i].createObject(carouselStackLayout)
var button = carouselButton.createObject(carouselButtonsLayout, {slideIndex: i, stackLayout: carouselStackLayout})
button.buttonClicked.connect(goToSlideAtIndex)
currentIndex = i
}
currentIndex = 0
previousIndex = currentIndex
items = children
}
Component {
id: crossFader
ParallelAnimation {
id: anim
property bool mirrored: false
property Item fadeOutTarget
property Item fadeInTarget
NumberAnimation {
target: fadeInTarget
property: "opacity"
from: 0
to: 1
duration: 300
}
XAnimator {
target: fadeInTarget
from: (mirrored ? -1 : 1) * fadeInTarget.width/3.
to: 0
duration: 300
easing.type: Easing.OutCubic
}
}
}
onCurrentIndexChanged: {
var currentItem = items[currentIndex]
var crossFaderAnim = crossFader.createObject(parent, {fadeInTarget: currentItem, mirrored: (previousIndex > currentIndex)})
crossFaderAnim.restart()
carouselRoot.currentIndex = currentIndex
}
}
RowLayout {
id: carouselButtonsLayout
Layout.topMargin: 20
Layout.bottomMargin: 20
Component {
id: carouselButton
Control.Button {
property int slideIndex
property var stackLayout
signal buttonClicked(int index)
background: Rectangle {
color: stackLayout.currentIndex == slideIndex ? DefaultStyle.buttonBackground : DefaultStyle.carouselLightGrayColor
radius: 15
width: stackLayout.currentIndex == slideIndex ? 11 : 8
height: 8
Behavior on width { NumberAnimation {duration: 100}}
}
onClicked: {
buttonClicked(slideIndex)
}
}
}
}
}

View file

@ -0,0 +1,77 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts 1.0
import Linphone
ColumnLayout {
id: cellLayout
property string label: ""
property int backgroundWidth: 200
property variant modelList: []
Layout.bottomMargin: 8
Text {
verticalAlignment: Text.AlignVCenter
text: cellLayout.label
color: DefaultStyle.formItemLabelColor
font {
pointSize: DefaultStyle.formItemLabelSize
bold: true
}
}
ComboBox {
id: combobox
model: cellLayout.modelList
background: Loader {
sourceComponent: backgroundRectangle
}
contentItem: Text {
leftPadding: 10
text: combobox.displayText
font.family: DefaultStyle.defaultFont
font.pointSize: DefaultStyle.formItemLabelSize
color: DefaultStyle.formItemLabelColor
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
}
indicator: Image {
x: combobox.width - width - combobox.rightPadding
y: combobox.topPadding + (combobox.availableHeight - height) / 2
source: AppIcons.downArrow
// width: 12
// height: 8
}
popup: Popup {
y: combobox.height - 1
width: combobox.width
implicitHeight: contentItem.implicitHeight
padding: 1
contentItem: ListView {
clip: true
implicitHeight: contentHeight
model: combobox.popup.visible ? combobox.delegateModel : null
currentIndex: combobox.highlightedIndex
ScrollIndicator.vertical: ScrollIndicator { }
}
background: Loader {
sourceComponent: backgroundRectangle
}
}
Component {
id: backgroundRectangle
Rectangle {
implicitWidth: cellLayout.backgroundWidth
implicitHeight: 30
radius: 20
color: DefaultStyle.formItemBackgroundColor
opacity: 0.7
}
}
}
}

View file

@ -0,0 +1,56 @@
import QtQuick 2.15
import QtQuick.Layouts 1.0
import QtQuick.Controls as Control
import Linphone
RowLayout {
Layout.alignment: Qt.AlignBottom
ColumnLayout {
TextInput {
id: username
label: "Username"
mandatory: true
textInputWidth: 250
}
TextInput {
id: password
label: "Password"
mandatory: true
hidden: true
textInputWidth: 250
}
RowLayout {
id: lastFormLineLayout
Button {
text: 'Log in'
Layout.rightMargin: 20
onClicked: {
LoginPageCpp.login(username.inputText, password.inputText);
}
}
Text {
color: DefaultStyle.grayColor
text: "Forgotten password?"
font.underline: true
font.pointSize: DefaultStyle.defaultTextSize
}
}
Button {
Layout.topMargin: 40
inversedColors: true
text: "Use SIP Account"
onClicked: {root.useSIPButtonClicked()}
}
}
Item {
Layout.fillWidth: true
}
Image {
Layout.rightMargin: 40
Layout.preferredWidth: 300
fillMode: Image.PreserveAspectFit
source: AppIcons.loginImage
}
}

View file

@ -0,0 +1,8 @@
import QtQuick 2.7
Rectangle {
anchors.fill: parent
color: "red"
opacity: 0.2
border.color: "green"
}

View file

@ -0,0 +1,10 @@
import QtQuick 2.7
import QtQuick.Controls 2.2 as Control
import Linphone
Text {
property double scaleLettersFactor: 1.
font.family: DefaultStyle.defaultFont
font.pointSize: DefaultStyle.defaultFontPointSize
transform: Scale { yScale: scaleLettersFactor}
}

View file

@ -0,0 +1,62 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts 1.0
import Linphone
ColumnLayout {
id: cellLayout
Layout.bottomMargin: 8
property string label: ""
property string defaultText : ""
property bool mandatory: false
property bool hidden: false
property int textInputWidth: 200
readonly property string inputText: textField.text
Text {
verticalAlignment: Text.AlignVCenter
text: cellLayout.label + (cellLayout.mandatory ? "*" : "")
color: DefaultStyle.formItemLabelColor
font {
pointSize: DefaultStyle.formItemLabelSize
bold: true
}
}
Rectangle {
implicitWidth: cellLayout.textInputWidth
implicitHeight: 30
// anchors.fill: parent
radius: 20
color: DefaultStyle.formItemBackgroundColor
opacity: 0.7
TextField {
id: textField
anchors.left: parent.left
anchors.right: eyeButton.visible ? eyeButton.left : parent.right
anchors.verticalCenter: parent.verticalCenter
placeholderText: cellLayout.defaultText
echoMode: (cellLayout.hidden && !eyeButton.checked) ? TextInput.Password : TextInput.Normal
font.family: DefaultStyle.defaultFont
font.pointSize: DefaultStyle.formTextInputSize
color: DefaultStyle.formItemLabelColor
background: Item {
opacity: 0.
}
}
Button {
id: eyeButton
visible: cellLayout.hidden
checkable: true
background: Rectangle {
color: "transparent"
}
anchors.right: parent.right
contentItem: Image {
fillMode: Image.PreserveAspectFit
source: eyeButton.checked ? AppIcons.eyeHide : AppIcons.eyeShow
}
}
}
}

View file

@ -0,0 +1,40 @@
import QtQuick 2.15
import QtQuick.Layouts 1.0
import QtQuick.Controls as Control
import Linphone
LoginLayout {
id: root
signal useSIPButtonClicked()
titleContent: RowLayout {
Image {
fillMode: Image.PreserveAspectFit
source: AppIcons.profile
}
Text {
text: "Login"
color: DefaultStyle.titleColor
font.pointSize: DefaultStyle.title2FontPointSize
font.bold: true
scaleLettersFactor: 1.1
}
Item {
Layout.fillWidth: true
}
Text {
Layout.rightMargin: 15
text: "No account yet ?"
color: DefaultStyle.defaultTextColor
font.pointSize: DefaultStyle.defaultTextSize
}
Button {
Layout.alignment: Qt.AlignRight
inversedColors: true
text: "Register"
}
}
centerContent: LoginForm {}
}

View file

@ -0,0 +1,172 @@
import QtQuick 2.15
import QtQuick.Layouts 1.3
import QtQuick.Controls as Control
import Linphone
import ConstantsCpp 1.0
LoginLayout {
id: sipLoginPage
signal returnToLogin()
titleContent: RowLayout {
Control.Button {
background: Rectangle {
color: "transparent"
}
contentItem: Image {
source: AppIcons.returnArrow
fillMode: Image.PreserveAspectFit
}
onClicked: sipLoginPage.returnToLogin()
}
Image {
fillMode: Image.PreserveAspectFit
source: AppIcons.profile
}
Text {
text: "Use a SIP Account"
color: DefaultStyle.titleColor
font.pointSize: DefaultStyle.title2FontPointSize
font.bold: true
scaleLettersFactor: 1.1
}
Item {
Layout.fillWidth: true
}
Text {
Layout.rightMargin: 15
text: "No account yet ?"
color: DefaultStyle.defaultTextColor
font.pointSize: DefaultStyle.defaultTextSize
}
Button {
Layout.alignment: Qt.AlignRight
inversedColors: true
text: "Register"
}
}
centerContent: RowLayout {
Layout.alignment: Qt.AlignBottom
ColumnLayout {
Layout.fillHeight: true
Layout.fillWidth: true
clip: true
Control.StackView {
id: rootStackView
initialItem: firstItem
Layout.fillWidth: true
Layout.fillHeight: true
Component {
id: firstItem
ColumnLayout {
// Layout.fillWidth: true
// Layout.fillHeight: true
Text {
Layout.preferredWidth: 361
Layout.fillWidth: true
wrapMode: Text.WordWrap
color: DefaultStyle.darkGrayColor
font.pointSize: DefaultStyle.defaultTextSize
text: "<p>Some features require a Linphone account, such as group messaging, video conferences...</p>
<p>These features are hidden when you register with a third party SIP account.</p>
<p>To enable it in a commercial projet, please contact us. </p>"
}
Button {
text: 'linphone.org/contact'
textSize: 8
inversedColors: true
onClicked: {
Qt.openUrlExternally(ConstantsCpp.ContactUrl)
}
}
Item {
Layout.fillHeight: true
}
Button {
Layout.fillWidth: true
text: 'I prefere create an account'
inversedColors: true
onClicked: {
}
}
Button {
Layout.fillWidth: true
Layout.bottomMargin: 40
text: 'I understand'
onClicked: {
rootStackView.replace(secondItem)
}
}
}
}
Component {
id: secondItem
ColumnLayout {
// Layout.fillWidth: true
// Layout.fillHeight: true
TextInput {
id: username
label: "Username"
mandatory: true
textInputWidth: 250
}
TextInput {
id: password
label: "Password"
mandatory: true
hidden: true
textInputWidth: 250
}
TextInput {
id: domain
label: "Domain"
mandatory: true
textInputWidth: 250
}
TextInput {
id: displayName
label: "Display Name"
textInputWidth: 250
}
ComboBox {
label: "Transport"
backgroundWidth: 250
modelList: ["TCP", "UDP", "TLS"]
}
Button {
Layout.bottomMargin: 20
text: 'Log in'
onClicked: {
LoginPageCpp.login(username.inputText, password.inputText);
}
}
Item {
Layout.fillHeight: true
}
}
}
}
}
Item {
Layout.fillWidth: true
}
Image {
Layout.rightMargin: 40
Layout.preferredWidth: 300
fillMode: Image.PreserveAspectFit
source: AppIcons.loginImage
}
}
}

View file

@ -0,0 +1,150 @@
import QtQuick 2.15
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.2 as Control
import Linphone
LoginLayout {
id: welcomePage
signal startButtonPressed()
titleContent: RowLayout {
Text {
id: welcome
text: "Welcome"
color: DefaultStyle.titleColor
font.pointSize: DefaultStyle.title1FontPointSize
font.bold: true
scaleLettersFactor: 1.1
}
Text {
Layout.alignment: Qt.AlignBottom
Layout.leftMargin: 10
Layout.bottomMargin: 5
color: DefaultStyle.titleColor
text: "in Linphone"
font.pointSize: 18
font.bold: true
scaleLettersFactor: 1.1
}
Item {
Layout.fillWidth: true
}
Control.Button {
leftPadding: 13
rightPadding: 13
topPadding: 20
bottomPadding: 20
flat: true
checkable: false
background: Rectangle {
color: "transparent"
radius: 48
}
contentItem: Text {
text: "Skip"
font.underline: true
color: DefaultStyle.defaultTextColor
}
onClicked: welcomePage.startButtonPressed();
}
}
centerContent: ColumnLayout {
Layout.bottomMargin: 20
RowLayout {
Layout.leftMargin: 100
Image {
Layout.rightMargin: 40
Layout.topMargin: 20
Layout.preferredWidth: 100
Layout.maximumWidth: 100
fillMode: Image.PreserveAspectFit
source: carousel.currentIndex == 0 ? AppIcons.welcomeLinphoneLogo : carousel.currentIndex == 1 ? AppIcons.welcomeLock : AppIcons.welcomeOpenSource
}
Carousel {
id: carousel
itemsList: [carousel0, carousel1, carousel2]
Component {
id: carousel0
Item {
ColumnLayout {
anchors.verticalCenter: parent.verticalCenter
Text {
text: "Linphone"
font.bold: true
font.pixelSize: 20
color: DefaultStyle.defaultTextColor
scaleLettersFactor: 1.1
}
Text {
Layout.maximumWidth: 361
wrapMode: Text.WordWrap
font.pixelSize: 11
color: DefaultStyle.defaultTextColor
text: "Une application de communication <b>sécurisée</b>,<br> <b>open source</b> et <b>française</b>. "
}
}
}
}
Component {
id: carousel1
Item {
ColumnLayout {
anchors.verticalCenter: parent.verticalCenter
Text {
text: "Sécurisé"
font.bold: true
font.pixelSize: 20
color: DefaultStyle.defaultTextColor
}
Text {
Layout.maximumWidth: 361
wrapMode: Text.WordWrap
font.pixelSize: 11
color: DefaultStyle.defaultTextColor
text: "Vos communications sont en sécurité grâce aux <br><b>Chiffrement de bout en bout</b>."
}
}
}
}
Component {
id: carousel2
Item {
ColumnLayout {
anchors.verticalCenter: parent.verticalCenter
Text {
text: "Open Source"
font.bold: true
font.pixelSize: 20
color: DefaultStyle.defaultTextColor
}
Text {
Layout.maximumWidth: 361
wrapMode: Text.WordWrap
font.pixelSize: 11
color: DefaultStyle.defaultTextColor
text: "Une application open source et un <b>service gratuit</b> depuis <b>2001</b>"
}
}
}
}
}
}
Button {
Layout.topMargin: 20
Layout.bottomMargin: 20
Layout.leftMargin: 361 - width
Layout.alignment: Qt.AlignBottom
text: carousel.currentIndex < (carousel.itemsList.length - 1) ? "Next" : "Start"
onClicked: {
if (carousel.currentIndex < 2) carousel.goToSlide(carousel.currentIndex + 1);
else welcomePage.startButtonPressed();
}
}
Item {
Layout.fillHeight: true
}
}
}

View file

@ -1,25 +0,0 @@
import QtQuick 2.15
import QtQuick.Layouts 1.0
import Linphone
Item{
id: mainItem
ColumnLayout{
anchors.fill: parent
Text{
Layout.fillWidth: true
text: LoginPageCpp.isLogged ? "Online" : "Offline"
}
RowLayout{
Button{
text: 'Sign In'
onClicked: LoginPageCpp.login("myusername", "passy")
}
Button{
text: 'Sign Out'
onClicked: console.log("Click!")
}
}
}
}

View file

@ -0,0 +1,16 @@
pragma Singleton
import QtQuick 2.15
QtObject {
property string welcomeLinphoneLogo: "image://internal/welcome-linphone-logo.svg"
property string welcomeLock: "image://internal/welcome-lock.svg"
property string welcomeOpenSource: "image://internal/welcome-opensource.svg"
property string eyeHide: "image://internal/hide.svg"
property string eyeShow: "image://internal/show.svg"
property string downArrow: "image://internal/down-arrow.svg"
property string returnArrow: "image://internal/return-arrow.svg"
property string info: "image://internal/info-logo.svg"
property string loginImage: "image://internal/login-image.svg"
property string belledonne: "image://internal/belledonne.svg"
property string profile: "image://internal/profil.svg"
}

View file

@ -0,0 +1,28 @@
pragma Singleton
import QtQuick 2.15
QtObject {
property string defaultFont: "Noto Sans"
property color orangeColor: "#FE5E00"
property color buttonBackground: "#FE5E00"
property color buttonInversedBackground: "white"
property color buttonTextColor: "white"
property color buttonInversedTextColor: "#FE5E00"
property int buttonTextSize: 10
property color darkBlueColor: "#22334D"
property color titleColor: "#22334D"
property color darkGrayColor: "#4E6074"
property color defaultTextColor: "#4E6074"
property int defaultTextSize: 8
property color formItemLabelColor: "#4E6074"
property int formItemLabelSize: 8
property int formTextInputSize: 10
property color grayColor: "#6C7A87"
property color lightGrayColor: "#EDEDED"
property color carouselLightGrayColor: "#DFECF2"
property color formItemBackgroundColor: "#EDEDED"
property int defaultFontPointSize: 10
property int title1FontPointSize: 40
property int title2FontPointSize: 20
}

View file

@ -1,6 +1,6 @@
############################################################################
# TasksMacos.cmake
# Copyright (C) 2010-2023 Belledonne Communications, Grenoble France
# Copyright (C) 2010-2024 Belledonne Communications, Grenoble France
#
############################################################################
#