Meeting UI

Change meeting time set so a it can spread over two days without being an all day conf
This commit is contained in:
Gaelle Braud 2024-03-14 16:38:11 +01:00 committed by Julien Wadel
parent 6176f1971c
commit e415033943
15 changed files with 776 additions and 480 deletions

View file

@ -85,6 +85,8 @@ ConferenceInfoCore::ConferenceInfoCore(std::shared_ptr<linphone::ConferenceInfo>
}
mConferenceInfoState = LinphoneEnums::fromLinphone(conferenceInfo->getState());
} else {
mDateTime = QDateTime::currentDateTime();
mEndDateTime = QDateTime::currentDateTime().addSecs(3600);
App::postModelSync([this]() {
auto defaultAccount = CoreModel::getInstance()->getCore()->getDefaultAccount();
if (defaultAccount) {
@ -166,21 +168,16 @@ void ConferenceInfoCore::setSelf(QSharedPointer<ConferenceInfoCore> me) {
setIsEnded(computeIsEnded());
});
});
mConfInfoModelConnection->makeConnectToModel(
&ConferenceInfoModel::stateChanged, [this](linphone::ConferenceScheduler::State state) {
qDebug() << "conf state changed" << LinphoneEnums::fromLinphone(state);
mConfInfoModelConnection->invokeToCore([this] {});
});
mConfInfoModelConnection->makeConnectToCore(&ConferenceInfoCore::lDeleteConferenceInfo,
[this]() { mConferenceInfoModel->deleteConferenceInfo(); });
mConfInfoModelConnection->makeConnectToModel(&ConferenceInfoModel::conferenceInfoDeleted,
&ConferenceInfoCore::removed);
mConfInfoModelConnection->makeConnectToModel(&ConferenceInfoModel::stateChanged,
[this](linphone::ConferenceScheduler::State state) {
qDebug() << "conf state changed:" << (int)state;
});
mConfInfoModelConnection->makeConnectToModel(
&ConferenceInfoModel::schedulerStateChanged, [this](linphone::ConferenceScheduler::State state) {
mConfInfoModelConnection->invokeToCore(
[this, state = LinphoneEnums::fromLinphone(state)] { setConferenceSchedulerState(state); });
});
mConfInfoModelConnection->makeConnectToModel(
&ConferenceInfoModel::invitationsSent,
[this](const std::list<std::shared_ptr<linphone::Address>> &failedInvitations) {
@ -410,9 +407,9 @@ LinphoneEnums::ConferenceInfoState ConferenceInfoCore::getConferenceInfoState()
return mConferenceInfoState;
}
// LinphoneEnums::ConferenceSchedulerState ConferenceInfoCore::getConferenceSchedulerState() const {
// return LinphoneEnums::fromLinphone(mLastConferenceSchedulerState);
// }
LinphoneEnums::ConferenceSchedulerState ConferenceInfoCore::getConferenceSchedulerState() const {
return mConferenceSchedulerState;
}
//------------------------------------------------------------------------------------------------
// Datetime is in Custom (Locale/UTC/System). Convert into UTC for conference info
@ -447,6 +444,13 @@ void ConferenceInfoCore::setConferenceInfoState(LinphoneEnums::ConferenceInfoSta
}
}
void ConferenceInfoCore::setConferenceSchedulerState(LinphoneEnums::ConferenceSchedulerState state) {
if (state != mConferenceSchedulerState) {
mConferenceSchedulerState = state;
emit conferenceSchedulerStateChanged();
}
}
void ConferenceInfoCore::writeFromModel(const std::shared_ptr<ConferenceInfoModel> &model) {
mustBeInLinphoneThread(getClassName() + "::writeFromModel()");
setDateTime(model->getDateTime());
@ -580,3 +584,8 @@ void ConferenceInfoCore::onInvitationsSent(const std::list<std::shared_ptr<linph
qDebug() << "ConferenceInfoCore::onInvitationsSent";
emit invitationsSent();
}
bool ConferenceInfoCore::isAllDayConf() const {
return mDateTime.time().hour() == 0 && mDateTime.time().minute() == 0 && mEndDateTime.time().hour() == 23 &&
mEndDateTime.time().minute() == 59;
}

View file

@ -57,6 +57,8 @@ public:
Q_PROPERTY(int participantCount READ getParticipantCount NOTIFY participantsChanged)
Q_PROPERTY(QVariantList participants READ getParticipants NOTIFY participantsChanged)
Q_PROPERTY(LinphoneEnums::ConferenceInfoState state READ getConferenceInfoState NOTIFY conferenceInfoStateChanged)
Q_PROPERTY(LinphoneEnums::ConferenceSchedulerState schedulerState READ getConferenceSchedulerState NOTIFY
conferenceSchedulerStateChanged)
// Q_PROPERTY(LinphoneEnums::ConferenceSchedulerState conferenceSchedulerState READ getConferenceSchedulerState
// NOTIFY
// conferenceSchedulerStateChanged)
@ -92,6 +94,7 @@ public:
TimeZoneModel *getTimeZoneModel() const;
// QString getIcalendarString() const;
LinphoneEnums::ConferenceInfoState getConferenceInfoState() const;
LinphoneEnums::ConferenceSchedulerState getConferenceSchedulerState() const;
// LinphoneEnums::ConferenceSchedulerState getConferenceSchedulerState() const;
void setDateTime(const QDateTime &date);
@ -105,6 +108,7 @@ public:
void setDescription(const QString &description);
void setInviteMode(const int &mode);
void setConferenceInfoState(LinphoneEnums::ConferenceInfoState state);
void setConferenceSchedulerState(LinphoneEnums::ConferenceSchedulerState state);
Q_INVOKABLE void addParticipant(const QString &address);
Q_INVOKABLE void removeParticipant(const QString &address);
@ -130,6 +134,8 @@ public:
// virtual void onConferenceSchedulerStateChanged(linphone::ConferenceScheduler::State state);
virtual void onInvitationsSent(const std::list<std::shared_ptr<linphone::Address>> &failedInvitations);
Q_INVOKABLE bool isAllDayConf() const;
signals:
void dateTimeChanged();
void endDateTimeChanged();
@ -144,6 +150,7 @@ signals:
void isEndedChanged();
void inviteModeChanged();
void conferenceInfoStateChanged();
void conferenceSchedulerStateChanged();
void timeZoneModelChanged();
// void conferenceSchedulerStateChanged();
@ -170,6 +177,7 @@ private:
QString mUri;
QVariantList mParticipants;
QSharedPointer<TimeZoneModel> mTimeZoneModel;
LinphoneEnums::ConferenceSchedulerState mConferenceSchedulerState;
LinphoneEnums::ConferenceInfoState mConferenceInfoState =
LinphoneEnums::ConferenceInfoState::ConferenceInfoStateNew;
bool mIsScheduled = true;

View file

@ -157,6 +157,7 @@ void CallModel::setSpeakerVolumeGain(float gain) {
}
float CallModel::getSpeakerVolumeGain() const {
mustBeInLinphoneThread(log().arg(Q_FUNC_INFO));
auto gain = mMonitor->getSpeakerVolumeGain();
if (gain < 0) gain = CoreModel::getInstance()->getCore()->getPlaybackGainDb();
return gain;

View file

@ -58,7 +58,7 @@ void ConferenceInfoModel::setConferenceScheduler(const std::shared_ptr<Conferenc
}
mConferenceSchedulerModel = model;
connect(mConferenceSchedulerModel.get(), &ConferenceSchedulerModel::stateChanged, this,
&ConferenceInfoModel::stateChanged);
&ConferenceInfoModel::schedulerStateChanged);
connect(mConferenceSchedulerModel.get(), &ConferenceSchedulerModel::invitationsSent, this,
&ConferenceInfoModel::invitationsSent);
mConferenceSchedulerModel->setSelf(mConferenceSchedulerModel);

View file

@ -64,7 +64,8 @@ signals:
void descriptionChanged(const QString &description);
void participantsChanged();
void conferenceInfoDeleted();
void stateChanged(linphone::ConferenceScheduler::State state);
void schedulerStateChanged(linphone::ConferenceScheduler::State state);
void infoStateChanged(linphone::ConferenceInfo::State state);
void invitationsSent(const std::list<std::shared_ptr<linphone::Address>> &failedInvitations);
private:

View file

@ -31,7 +31,7 @@ list(APPEND _LINPHONEAPP_QML_FILES
view/Item/Contact/Sticker.qml
view/Item/Meeting/MeetingList.qml
view/Item/Meeting/NewMeeting.qml
view/Item/Meeting/MeetingSetUp.qml
view/Item/BusyIndicator.qml
view/Item/Button.qml

View file

@ -20,7 +20,7 @@ ListView {
Layout.fillHeight: true
highlightMoveDuration: 100
property var selectedDate: new Date()
property var selectedDate
model: Control.CalendarModel {
id: calendarModel
@ -84,7 +84,7 @@ ListView {
month: model.month
// locale: Qt.locale("en_US")
delegate: Item {
property bool isSelectedDay: UtilsCpp.datesAreEqual(mainItem.selectedDate, model.date)
property bool isSelectedDay: mainItem.selectedDate ? UtilsCpp.datesAreEqual(mainItem.selectedDate, model.date) : false
Rectangle {
anchors.centerIn: parent
width: 30 * DefaultStyle.dp

View file

@ -5,9 +5,11 @@ import Linphone
ComboBox {
id: mainItem
property var selectedDate: calendar.selectedDate
readonly property var selectedDate: calendar.selectedDate
property alias calendar: calendar
property alias contentText: contentText
contentItem: Text {
id: contentText
text: Qt.formatDate(calendar.selectedDate, "ddd d, MMMM")
anchors.fill: parent
anchors.leftMargin: 15 * DefaultStyle.dp

View file

@ -31,7 +31,6 @@ Control.ComboBox {
: item.img
? item.img
: ""
console.log("const", constantImageSource, item.img)
}
background: Rectangle {
@ -41,6 +40,9 @@ Control.ComboBox {
border.color: mainItem.enabled ? DefaultStyle.grey_200 : DefaultStyle.grey_400
}
contentItem: Item {
anchors.fill: parent
anchors.leftMargin: 10 * DefaultStyle.dp
anchors.rightMargin: indicImage.width + 10 * DefaultStyle.dp
Image {
id: selectedItemImg
source: mainItem.constantImageSource ? mainItem.constantImageSource : ""
@ -92,6 +94,8 @@ Control.ComboBox {
anchors.rightMargin: 10 * DefaultStyle.dp
anchors.verticalCenter: parent.verticalCenter
source: AppIcons.downArrow
width: 14 * DefaultStyle.dp
fillMode: Image.PreserveAspectFit
}
popup: Control.Popup {

View file

@ -0,0 +1,496 @@
import QtQuick 2.15
import QtQuick.Effects
import QtQuick.Layouts
import QtQuick.Controls as Control
import Linphone
import UtilsCpp 1.0
ColumnLayout {
id: mainItem
spacing: 8 * DefaultStyle.dp
property bool isCreation
property ConferenceInfoGui conferenceInfoGui
signal addParticipantsRequested()
signal returnRequested()
signal creationSucceed()
Connections {
target: mainItem.conferenceInfoGui.core
onSchedulerStateChanged: {
if (isCreation && mainItem.conferenceInfoGui.core.schedulerState == LinphoneEnums.ConferenceSchedulerState.Ready) mainItem.creationSucceed()
console.log("scheduler state changed", mainItem.conferenceInfoGui.core.schedulerState)
}
}
Component.onCompleted: {
endHour.selectedDateTime = mainItem.conferenceInfoGui.core.endDateTime
startHour.selectedDateTime = mainItem.conferenceInfoGui.core.dateTime
endDate.calendar.selectedDate = mainItem.conferenceInfoGui.core.endDateTime
startDate.calendar.selectedDate = mainItem.conferenceInfoGui.core.dateTime
}
RowLayout {
Button {
background: Item{}
icon.source: AppIcons.leftArrow
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
onClicked: mainItem.returnRequested()
}
TextInput {
visible: !mainItem.isCreation
Component.onCompleted: text = conferenceInfoGui.core.subject
color: DefaultStyle.main2_600
font {
pixelSize: 20 * DefaultStyle.dp
weight: 800 * DefaultStyle.dp
}
Layout.fillWidth: true
onActiveFocusChanged: if(activeFocus==true) selectAll()
onEditingFinished: mainItem.conferenceInfoGui.core.subject = text
}
Text {
visible: mainItem.isCreation
text: qsTr("Nouvelle réunion")
color: DefaultStyle.main2_700
font {
pixelSize: 22 * DefaultStyle.dp
weight: 800 * DefaultStyle.dp
}
Layout.fillWidth: true
}
Button {
topPadding: 6 * DefaultStyle.dp
bottomPadding: 6 * DefaultStyle.dp
leftPadding: 12 * DefaultStyle.dp
rightPadding: 12 * DefaultStyle.dp
text: mainItem.isCreation ? qsTr("Créer") : qsTr("Save")
textSize: 13 * DefaultStyle.dp
onClicked: {
if (mainItem.conferenceInfoGui.core.subject.length === 0) {
UtilsCpp.showInformationPopup(qsTr("Erreur"), qsTr("La conférence doit contenir un sujet"), false)
} else if (mainItem.conferenceInfoGui.core.duration <= 0) {
UtilsCpp.showInformationPopup(qsTr("Erreur"), qsTr("La fin de la conférence doit être plus récente que son début"), false)
} else if (mainItem.conferenceInfoGui.core.participantCount === 0) {
UtilsCpp.showInformationPopup(qsTr("Erreur"), qsTr("La conférence doit contenir au moins un participant"), false)
} else {
mainItem.conferenceInfoGui.core.save()
}
}
}
}
component CheckableButton: Button {
id: checkableButton
checkable: true
autoExclusive: true
contentImageColor: checked ? DefaultStyle.grey_0 : DefaultStyle.main1_500_main
inversedColors: !checked
topPadding: 10 * DefaultStyle.dp
bottomPadding: 10 * DefaultStyle.dp
leftPadding: 16 * DefaultStyle.dp
rightPadding: 16 * DefaultStyle.dp
contentItem: RowLayout {
EffectImage {
imageSource: checkableButton.icon.source
colorizationColor: checkableButton.checked ? DefaultStyle.grey_0 : DefaultStyle.main1_500_main
width: 24 * DefaultStyle.dp
height: 24 * DefaultStyle.dp
}
Text {
text: checkableButton.text
color: checkableButton.checked ? DefaultStyle.grey_0 : DefaultStyle.main1_500_main
font {
pixelSize: 16 * DefaultStyle.dp
weight: 400 * DefaultStyle.dp
}
}
}
}
RowLayout {
visible: mainItem.isCreation
Layout.fillWidth: true
Layout.topMargin: 20 * DefaultStyle.dp
Layout.bottomMargin: 20 * DefaultStyle.dp
Layout.alignment: Qt.AlignHCenter
spacing: 20 * DefaultStyle.dp
CheckableButton {
Layout.preferredWidth: 151 * DefaultStyle.dp
icon.source: AppIcons.usersThree
enabled: false
text: qsTr("Réunion")
checked: true
}
CheckableButton {
Layout.preferredWidth: 151 * DefaultStyle.dp
enabled: false
icon.source: AppIcons.slide
text: qsTr("Broadcast")
}
}
Section {
visible: mainItem.isCreation
content: RowLayout {
EffectImage {
imageSource: AppIcons.usersThree
colorizationColor: DefaultStyle.main2_600
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
}
TextInput {
id: confTitle
text: qsTr("Ajouter un titre")
color: DefaultStyle.main2_600
font {
pixelSize: 20 * DefaultStyle.dp
weight: 800 * DefaultStyle.dp
}
onActiveFocusChanged: if(activeFocus==true) selectAll()
onEditingFinished: mainItem.conferenceInfoGui.core.subject = text
}
}
}
Section {
Layout.topMargin: 10 * DefaultStyle.dp
content: [
RowLayout {
EffectImage {
imageSource: AppIcons.clock
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
colorizationColor: DefaultStyle.main2_600
}
Text {
text: qsTr("Toute la journée")
font {
pixelSize: 14 * DefaultStyle.dp
weight: 700 * DefaultStyle.dp
}
}
Item{Layout.fillWidth: true}
Switch {
id: allDaySwitch
readonly property bool isAllDay: position === 1
Component.onCompleted: if (mainItem.conferenceInfoGui.core.isAllDayConf()) toggle
onPositionChanged: if (position === 1) {
mainItem.conferenceInfoGui.core.dateTime = UtilsCpp.createDateTime(startDate.selectedDate, 0, 0)
mainItem.conferenceInfoGui.core.endDateTime = UtilsCpp.createDateTime(endDate.selectedDate, 23, 59)
}
}
},
RowLayout {
CalendarComboBox {
id: startDate
background.visible: mainItem.isCreation
contentText.font.weight: (isCreation ? 700 : 400) * DefaultStyle.dp
Layout.preferredWidth: 200 * DefaultStyle.dp
Layout.preferredHeight: 30 * DefaultStyle.dp
onSelectedDateChanged: {
if (!selectedDate || selectedDate == mainItem.conferenceInfoGui.core.dateTime) return
mainItem.conferenceInfoGui.core.dateTime = UtilsCpp.createDateTime(selectedDate, allDaySwitch.isAllDay ? 0 : startHour.selectedHour, allDaySwitch.isAllDay ? 0 : startHour.selectedMin)
if (isCreation) {
if (allDaySwitch.position === 0) endDate.calendar.selectedDate = UtilsCpp.addSecs(selectedDate, 3600)
else endDate.calendar.selectedDate = UtilsCpp.createDateTime(selectedDate, 23, 59)
}
}
}
Item{Layout.fillWidth: true}
TimeComboBox {
id: startHour
visible: allDaySwitch.position === 0
// Layout.fillWidth: true
Layout.preferredWidth: 94 * DefaultStyle.dp
Layout.preferredHeight: 30 * DefaultStyle.dp
background.visible: mainItem.isCreation
contentText.font.weight: (isCreation ? 700 : 400) * DefaultStyle.dp
onSelectedHourChanged: {
mainItem.conferenceInfoGui.core.dateTime = selectedDateTime//UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
endHour.selectedDateTime = UtilsCpp.addSecs(selectedDateTime, 3600)//Qt.formatDateTime(UtilsCpp.createDateTime(new Date(), selectedHour == 23 ? 23 : selectedHour + 1, selectedHour == 23 ? 59 : selectedMin), "hh:mm")
}
onSelectedMinChanged: {
mainItem.conferenceInfoGui.core.dateTime = selectedDateTime//UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
endHour.selectedDateTime = UtilsCpp.addSecs(selectedDateTime, 3600)//UtilsCpp.createDateTime(selectedDateTime, selectedHour == 23 ? 23 : selectedHour + 1, selectedHour == 23 ? 59 : selectedMin)
}
// onSelectedHourChanged: mainItem.conferenceInfoGui.core.dateTime = UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
// onSelectedMinChanged: mainItem.conferenceInfoGui.core.dateTime = UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
}
},
RowLayout {
CalendarComboBox {
id: endDate
background.visible: mainItem.isCreation
// Layout.fillWidth: true
Layout.preferredWidth: 200 * DefaultStyle.dp
Layout.preferredHeight: 30 * DefaultStyle.dp
contentText.font.weight: (isCreation ? 700 : 400) * DefaultStyle.dp
onSelectedDateChanged: if (selectedDate) mainItem.conferenceInfoGui.core.endDateTime = UtilsCpp.createDateTime(selectedDate, endHour.selectedHour, endHour.selectedMin)
}
Item{Layout.fillWidth: true}
TimeComboBox {
id: endHour
visible: allDaySwitch.position === 0
Layout.preferredWidth: 94 * DefaultStyle.dp
Layout.preferredHeight: 30 * DefaultStyle.dp
background.visible: mainItem.isCreation
contentText.font.weight: (isCreation ? 700 : 400) * DefaultStyle.dp
onSelectedHourChanged: mainItem.conferenceInfoGui.core.endDateTime = selectedDateTime//UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
onSelectedMinChanged: mainItem.conferenceInfoGui.core.endDateTime = selectedDateTime//UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
}
},
// RowLayout {
// EffectImage {
// imageSource: AppIcons.clock
// colorizationColor: DefaultStyle.main2_600
// Layout.preferredWidth: 24 * DefaultStyle.dp
// Layout.preferredHeight: 24 * DefaultStyle.dp
// }
// CalendarComboBox {
// id: startDate
// Layout.fillWidth: true
// Layout.preferredHeight: 30 * DefaultStyle.dp
// background.visible: mainItem.isCreation
// contentText.font.weight: (mainItem.isCreation ? 700 : 400) * DefaultStyle.dp
// onSelectedDateChanged: {
// mainItem.conferenceInfoGui.core.dateTime = UtilsCpp.createDateTime(selectedDate, allDaySwitch.position === 1 ? 0 : startHour.selectedHour, allDaySwitch.position === 1 ? 0 : startHour.selectedMin)
// if (allDaySwitch.position === 0) endDate.calendar.selectedDate = UtilsCpp.addSecs(selectedDate, 3600)
// }
// }
// },
// RowLayout {
// Item {
// Layout.preferredWidth: 24 * DefaultStyle.dp
// Layout.preferredHeight: 24 * DefaultStyle.dp
// }
// RowLayout {
// visible: allDaySwitch.position === 0
// TimeComboBox {
// id: startHour
// onSelectedHourChanged: {
// mainItem.conferenceInfoGui.core.dateTime = UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
// endHour.selectedTimeString = Qt.formatDateTime(UtilsCpp.createDateTime(new Date(), selectedHour == 23 ? 23 : selectedHour + 1, selectedHour == 23 ? 59 : selectedMin), "hh:mm")
// }
// onSelectedMinChanged: {
// mainItem.conferenceInfoGui.core.dateTime = UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
// endHour.selectedTimeString = Qt.formatDateTime(UtilsCpp.createDateTime(new Date(), selectedHour == 23 ? 23 : selectedHour + 1, selectedHour == 23 ? 59 : selectedMin), "hh:mm")
// }
// Layout.preferredWidth: 94 * DefaultStyle.dp
// Layout.preferredHeight: 30 * DefaultStyle.dp
// }
// TimeComboBox {
// id: endHour
// // property date startTime: new Date()
// onSelectedHourChanged: mainItem.conferenceInfoGui.core.endDateTime = UtilsCpp.createDateTime(endDate.selectedDate, selectedHour, selectedMin)
// onSelectedMinChanged: mainItem.conferenceInfoGui.core.endDateTime = UtilsCpp.createDateTime(endDate.selectedDate, selectedHour, selectedMin)
// Layout.preferredWidth: 94 * DefaultStyle.dp
// Layout.preferredHeight: 30 * DefaultStyle.dp
// }
// Item {
// Layout.fillWidth: true
// }
// Text {
// property int durationSec: UtilsCpp.secsTo(startHour.selectedTime, endHour.selectedTime)
// property int hour: durationSec/3600
// property int min: (durationSec - hour*3600)/60
// text: (hour > 0 ? hour + "h" : "") + (min > 0 ? min + "mn" : "")
// font {
// pixelSize: 14 * DefaultStyle.dp
// weight: 700 * DefaultStyle.dp
// }
// }
// }
// CalendarComboBox {
// id: endDate
// visible: allDaySwitch.position === 1
// Layout.fillWidth: true
// // Layout.fillHeight: false
// contentText.font.weight: (mainItem.isCreation ? 700 : 400) * DefaultStyle.dp
// Layout.preferredHeight: 30 * DefaultStyle.dp
// onSelectedDateChanged: mainItem.conferenceInfoGui.core.endDateTime = UtilsCpp.createDateTime(selectedDate, allDaySwitch.position === 1 ? 23 : endHour.selectedHour, allDaySwitch.position === 1 ? 59 : endHour.selectedMin)
// }
// },
// RowLayout {
// Item {
// Layout.preferredWidth: 24 * DefaultStyle.dp
// Layout.preferredHeight: 24 * DefaultStyle.dp
// }
// RowLayout {
// Switch {
// id: allDaySwitch
// text: qsTr("Toute la journée")
// onPositionChanged: {
// if (position == 1) {
// mainItem.conferenceInfoGui.core.dateTime = UtilsCpp.createDateTime(startDate.selectedDate, 0, 0)
// mainItem.conferenceInfoGui.core.endDateTime = UtilsCpp.createDateTime(endDate.selectedDate, 23, 59)
// } else {
// mainItem.conferenceInfoGui.core.dateTime = UtilsCpp.createDateTime(startDate.selectedDate, startHour.selectedHour, startHour.selectedMin)
// mainItem.conferenceInfoGui.core.endDateTime = UtilsCpp.createDateTime(endDate.selectedDate, endHour.selectedHour, endHour.selectedMin)
// }
// }
// }
// }
// },
ComboBox {
id: timeZoneCbox
Layout.fillWidth: true
Layout.preferredHeight: 30 * DefaultStyle.dp
hoverEnabled: true
listView.implicitHeight: 152 * DefaultStyle.dp
constantImageSource: AppIcons.globe
weight: 700 * DefaultStyle.dp
leftMargin: 0
currentIndex: mainItem.conferenceInfoGui ? model.getIndex(mainItem.conferenceInfoGui.core.timeZoneModel) : -1
background: Rectangle {
visible: parent.hovered || parent.down
anchors.fill: parent
color: DefaultStyle.grey_100
}
model: TimeZoneProxy{
}
onCurrentIndexChanged: {
var modelIndex = timeZoneCbox.model.index(currentIndex, 0)
mainItem.conferenceInfoGui.core.timeZoneModel = timeZoneCbox.model.data(modelIndex, Qt.DisplayRole + 1)
}
},
ComboBox {
id: repeaterCbox
enabled: false
Component.onCompleted: console.log("TODO : handle conf repetition")
constantImageSource: AppIcons.reloadArrow
Layout.fillWidth: true
Layout.preferredHeight: height
height: 30 * DefaultStyle.dp
width: 307 * DefaultStyle.dp
weight: 700 * DefaultStyle.dp
leftMargin: 0
currentIndex: 0
background: Rectangle {
visible: parent.hovered || parent.down
anchors.fill: parent
color: DefaultStyle.grey_100
}
model: [
{text: qsTr("Une fois")},
{text: qsTr("Tous les jours")},
{text: qsTr("Tous les jours de la semaine (Lun-Ven)")},
{text: qsTr("Toutes les semaines")},
{text: qsTr("Tous les mois")}
]
}
]
}
Section {
content: RowLayout {
EffectImage {
imageSource: AppIcons.note
colorizationColor: DefaultStyle.main2_600
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
}
TextArea {
id: descriptionEdit
Layout.fillWidth: true
Layout.preferredWidth: 275 * DefaultStyle.dp
leftPadding: 8 * DefaultStyle.dp
rightPadding: 8 * DefaultStyle.dp
hoverEnabled: true
placeholderText: qsTr("Ajouter une description")
placeholderTextColor: DefaultStyle.main2_600
placeholderWeight: 700 * DefaultStyle.dp
color: DefaultStyle.main2_600
font {
pixelSize: 14 * DefaultStyle.dp
weight: 400 * DefaultStyle.dp
}
background: Rectangle {
anchors.fill: parent
color: descriptionEdit.hovered || descriptionEdit.activeFocus ? DefaultStyle.grey_100 : "transparent"
radius: 4 * DefaultStyle.dp
}
onEditingFinished: mainItem.conferenceInfoGui.core.description = text
}
}
}
Section {
content: [
Button {
id: addParticipantsButton
Layout.fillWidth: true
Layout.preferredHeight: 30 * DefaultStyle.dp
background: Rectangle {
anchors.fill: parent
color: addParticipantsButton.hovered ? DefaultStyle.grey_100 : "transparent"
radius: 4 * DefaultStyle.dp
}
contentItem: RowLayout {
EffectImage {
imageSource: AppIcons.usersThree
colorizationColor: DefaultStyle.main2_600
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
}
Text {
Layout.fillWidth: true
text: qsTr("Ajouter des participants")
font {
pixelSize: 14 * DefaultStyle.dp
weight: 700 * DefaultStyle.dp
}
}
}
onClicked: mainItem.addParticipantsRequested()
},
ListView {
id: participantList
Layout.fillWidth: true
Layout.preferredHeight: contentHeight
Layout.maximumHeight: 250 * DefaultStyle.dp
clip: true
model: mainItem.conferenceInfoGui.core.participants
delegate: Item {
height: 56 * DefaultStyle.dp
width: participantList.width
RowLayout {
anchors.fill: parent
Avatar {
Layout.preferredWidth: 45 * DefaultStyle.dp
Layout.preferredHeight: 45 * DefaultStyle.dp
address: modelData.address
}
Text {
text: modelData.displayName
font.pixelSize: 14 * DefaultStyle.dp
font.capitalization: Font.Capitalize
}
Item {
Layout.fillWidth: true
}
Button {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
Layout.rightMargin: 10 * DefaultStyle.dp
background: Item{}
icon.source: AppIcons.closeX
contentImageColor: DefaultStyle.main1_500_main
onClicked: mainItem.conferenceInfoGui.core.removeParticipant(index)
}
}
}
}
]
}
Switch {
text: qsTr("Send invitation to participants")
Component.onCompleted: {
console.log("TODO : handle send invitation to participants")
toggle()
}
}
Item {
Layout.fillHeight: true
Layout.minimumHeight: 1 * DefaultStyle.dp
}
}

View file

@ -1,377 +0,0 @@
import QtQuick 2.15
import QtQuick.Effects
import QtQuick.Layouts
import QtQuick.Controls as Control
import Linphone
import UtilsCpp 1.0
ColumnLayout {
id: mainItem
spacing: 8 * DefaultStyle.dp
property ConferenceInfoGui conferenceInfoGui
signal addParticipantsRequested()
signal returnRequested()
RowLayout {
Button {
background: Item{}
icon.source: AppIcons.leftArrow
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
onClicked: mainItem.returnRequested()
}
Text {
text: qsTr("Nouvelle réunion")
color: DefaultStyle.main2_700
font {
pixelSize: 22 * DefaultStyle.dp
weight: 800 * DefaultStyle.dp
}
Layout.fillWidth: true
}
Button {
topPadding: 6 * DefaultStyle.dp
bottomPadding: 6 * DefaultStyle.dp
leftPadding: 12 * DefaultStyle.dp
rightPadding: 12 * DefaultStyle.dp
text: qsTr("Créer")
textSize: 13 * DefaultStyle.dp
onClicked: {
if (mainItem.conferenceInfoGui.core.subject.length === 0) {
UtilsCpp.showInformationPopup(qsTr("Erreur lors de la création"), qsTr("La conférence doit contenir un sujet"), false)
} else if (mainItem.conferenceInfoGui.core.duration <= 0) {
UtilsCpp.showInformationPopup(qsTr("Erreur lors de la création"), qsTr("La fin de la conférence doit être plus récente que son début"), false)
} else if (mainItem.conferenceInfoGui.core.participantCount === 0) {
UtilsCpp.showInformationPopup(qsTr("Erreur lors de la création"), qsTr("La conférence doit contenir au moins un participant"), false)
} else {
mainItem.conferenceInfoGui.core.save()
mainItem.returnRequested()
}
}
}
}
component CheckableButton: Button {
id: checkableButton
checkable: true
autoExclusive: true
contentImageColor: checked ? DefaultStyle.grey_0 : DefaultStyle.main1_500_main
inversedColors: !checked
topPadding: 10 * DefaultStyle.dp
bottomPadding: 10 * DefaultStyle.dp
leftPadding: 16 * DefaultStyle.dp
rightPadding: 16 * DefaultStyle.dp
contentItem: RowLayout {
EffectImage {
imageSource: checkableButton.icon.source
colorizationColor: checkableButton.checked ? DefaultStyle.grey_0 : DefaultStyle.main1_500_main
width: 24 * DefaultStyle.dp
height: 24 * DefaultStyle.dp
}
Text {
text: checkableButton.text
color: checkableButton.checked ? DefaultStyle.grey_0 : DefaultStyle.main1_500_main
font {
pixelSize: 16 * DefaultStyle.dp
weight: 400 * DefaultStyle.dp
}
}
}
}
RowLayout {
Layout.fillWidth: true
Layout.topMargin: 20 * DefaultStyle.dp
Layout.bottomMargin: 20 * DefaultStyle.dp
Layout.alignment: Qt.AlignHCenter
spacing: 20 * DefaultStyle.dp
CheckableButton {
Layout.preferredWidth: 151 * DefaultStyle.dp
icon.source: AppIcons.usersThree
text: qsTr("Réunion")
checked: true
}
CheckableButton {
Layout.preferredWidth: 151 * DefaultStyle.dp
icon.source: AppIcons.slide
text: qsTr("Broadcast")
}
}
Section {
content: RowLayout {
EffectImage {
imageSource: AppIcons.usersThree
colorizationColor: DefaultStyle.main2_600
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
}
TextInput {
id: confTitle
text: qsTr("Ajouter un titre")
color: DefaultStyle.main2_600
font {
pixelSize: 20 * DefaultStyle.dp
weight: 800 * DefaultStyle.dp
}
onActiveFocusChanged: if(activeFocus==true) selectAll()
onEditingFinished: mainItem.conferenceInfoGui.core.subject = text
}
}
}
Section {
Layout.topMargin: 10 * DefaultStyle.dp
content: ColumnLayout {
spacing: 15 * DefaultStyle.dp
anchors.left: parent.left
anchors.right: parent.right
RowLayout {
Layout.fillWidth: true
EffectImage {
imageSource: AppIcons.clock
colorizationColor: DefaultStyle.main2_600
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
}
CalendarComboBox {
id: startDate
Layout.fillWidth: true
Layout.preferredHeight: 30 * DefaultStyle.dp
onSelectedDateChanged: {
mainItem.conferenceInfoGui.core.dateTime = UtilsCpp.createDateTime(selectedDate, startHour.selectedHour, startHour.selectedMin)
endDate.calendar.selectedDate = selectedDate
}
}
}
RowLayout {
Item {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
}
StackLayout {
currentIndex: allDaySwitch.position
RowLayout {
TimeComboBox {
id: startHour
onSelectedHourChanged: {
mainItem.conferenceInfoGui.core.dateTime = UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
console.log("selected hour", selectedHour, selectedMin)
endHour.selectedTimeString = Qt.formatDateTime(UtilsCpp.createDateTime(new Date(), selectedHour == 23 ? 0 : selectedHour + 1, selectedMin), "hh:mm")
}
onSelectedMinChanged: {
mainItem.conferenceInfoGui.core.dateTime = UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
console.log("selected min", selectedHour, selectedMin)
endHour.selectedTimeString = Qt.formatDateTime(UtilsCpp.createDateTime(new Date(), selectedHour == 23 ? 0 : selectedHour + 1, selectedMin), "hh:mm")
}
Layout.preferredWidth: 94 * DefaultStyle.dp
Layout.preferredHeight: 30 * DefaultStyle.dp
}
TimeComboBox {
id: endHour
property date startTime: new Date()
onSelectedHourChanged: mainItem.conferenceInfoGui.core.endDateTime = UtilsCpp.createDateTime(endDate.selectedDate, selectedHour, selectedMin)
onSelectedMinChanged: mainItem.conferenceInfoGui.core.endDateTime = UtilsCpp.createDateTime(endDate.selectedDate, selectedHour, selectedMin)
Layout.preferredWidth: 94 * DefaultStyle.dp
Layout.preferredHeight: 30 * DefaultStyle.dp
Component.onCompleted: selectedTimeString = Qt.formatDateTime(UtilsCpp.addSecs(startTime, 3600), "hh:mm")
}
Item {
Layout.fillWidth: true
}
Text {
property int durationSec: UtilsCpp.secsTo(startHour.selectedTime, endHour.selectedTime)
property int hour: durationSec/3600
property int min: (durationSec - hour*3600)/60
text: (hour > 0 ? hour + "h" : "") + (min > 0 ? min + "mn" : "")
font {
pixelSize: 14 * DefaultStyle.dp
weight: 700 * DefaultStyle.dp
}
}
}
CalendarComboBox {
id: endDate
Layout.fillWidth: true
Layout.preferredHeight: 30 * DefaultStyle.dp
onSelectedDateChanged: mainItem.conferenceInfoGui.core.endDateTime = UtilsCpp.createDateTime(selectedDate, 23, 59)
}
}
}
RowLayout {
Item {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
}
RowLayout {
Switch {
id: allDaySwitch
text: qsTr("Toute la journée")
}
}
}
ComboBox {
id: timeZoneCbox
Layout.fillWidth: true
Layout.preferredHeight: 30 * DefaultStyle.dp
hoverEnabled: true
listView.implicitHeight: 152 * DefaultStyle.dp
constantImageSource: AppIcons.globe
weight: 700 * DefaultStyle.dp
leftMargin: 0
currentIndex: mainItem.conferenceInfoGui ? model.getIndex(mainItem.conferenceInfoGui.core.timeZoneModel) : -1
background: Rectangle {
visible: parent.hovered || parent.down
anchors.fill: parent
color: DefaultStyle.grey_100
}
model: TimeZoneProxy{
}
onCurrentIndexChanged: {
var modelIndex = timeZoneCbox.model.index(currentIndex, 0)
mainItem.conferenceInfoGui.core.timeZoneModel = timeZoneCbox.model.data(modelIndex, Qt.DisplayRole + 1)
}
}
ComboBox {
id: repeaterCbox
enabled: false
Component.onCompleted: console.log("TODO : handle conf repetition")
constantImageSource: AppIcons.reloadArrow
Layout.fillWidth: true
Layout.preferredHeight: height
height: 30 * DefaultStyle.dp
width: 307 * DefaultStyle.dp
weight: 700 * DefaultStyle.dp
leftMargin: 0
currentIndex: 0
background: Rectangle {
visible: parent.hovered || parent.down
anchors.fill: parent
color: DefaultStyle.grey_100
}
model: [
{text: qsTr("Une fois")},
{text: qsTr("Tous les jours")},
{text: qsTr("Tous les jours de la semaine (Lun-Ven)")},
{text: qsTr("Toutes les semaines")},
{text: qsTr("Tous les mois")}
]
}
}
}
Section {
content: RowLayout {
anchors.left: parent.left
anchors.right: parent.right
EffectImage {
imageSource: AppIcons.note
colorizationColor: DefaultStyle.main2_600
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
}
TextArea {
id: descriptionEdit
Layout.fillWidth: true
Layout.preferredWidth: 275 * DefaultStyle.dp
leftPadding: 8 * DefaultStyle.dp
rightPadding: 8 * DefaultStyle.dp
hoverEnabled: true
placeholderText: qsTr("Ajouter une description")
placeholderTextColor: DefaultStyle.main2_600
placeholderWeight: 700 * DefaultStyle.dp
color: DefaultStyle.main2_600
font {
pixelSize: 14 * DefaultStyle.dp
weight: 400 * DefaultStyle.dp
}
background: Rectangle {
anchors.fill: parent
color: descriptionEdit.hovered || descriptionEdit.activeFocus ? DefaultStyle.grey_100 : "transparent"
radius: 4 * DefaultStyle.dp
}
onEditingFinished: mainItem.conferenceInfoGui.core.description = text
}
}
}
Section {
content: ColumnLayout {
anchors.left: parent.left
anchors.right: parent.right
Button {
id: addParticipantsButton
Layout.fillWidth: true
Layout.preferredHeight: 30 * DefaultStyle.dp
background: Rectangle {
anchors.fill: parent
color: addParticipantsButton.hovered ? DefaultStyle.grey_100 : "transparent"
radius: 4 * DefaultStyle.dp
}
contentItem: RowLayout {
EffectImage {
imageSource: AppIcons.usersThree
colorizationColor: DefaultStyle.main2_600
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
}
Text {
Layout.fillWidth: true
text: qsTr("Ajouter des participants")
font {
pixelSize: 14 * DefaultStyle.dp
weight: 700 * DefaultStyle.dp
}
}
}
onClicked: mainItem.addParticipantsRequested()
}
ListView {
id: participantList
Layout.fillWidth: true
Layout.fillHeight: true
Layout.preferredHeight: contentHeight
Layout.maximumHeight: 250 * DefaultStyle.dp
clip: true
model: mainItem.conferenceInfoGui.core.participants
delegate: Item {
height: 56 * DefaultStyle.dp
width: participantList.width
RowLayout {
anchors.fill: parent
Avatar {
Layout.preferredWidth: 45 * DefaultStyle.dp
Layout.preferredHeight: 45 * DefaultStyle.dp
address: modelData.address
}
Text {
text: modelData.displayName
font.pixelSize: 14 * DefaultStyle.dp
font.capitalization: Font.Capitalize
}
Item {
Layout.fillWidth: true
}
Button {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
Layout.rightMargin: 10 * DefaultStyle.dp
background: Item{}
icon.source: AppIcons.closeX
contentImageColor: DefaultStyle.main1_500_main
onClicked: mainItem.conferenceInfoGui.core.removeParticipant(index)
}
}
}
}
}
}
Switch {
text: qsTr("Send invitation to participants")
Component.onCompleted: {
console.log("TODO : handle send invitation to participants")
toggle()
}
}
Item {
Layout.fillHeight: true
}
}

View file

@ -4,9 +4,11 @@ import UtilsCpp 1.0
ComboBox {
id: mainItem
property string selectedTimeString: Qt.formatDateTime(new Date(), "hh:mm")
property var selectedDateTime
readonly property string selectedTimeString: Qt.formatDateTime(selectedDateTime, "hh:mm")
property int selectedHour: input.hour*1
property int selectedMin: input.min*1
property alias contentText: input
popup.width: 73 * DefaultStyle.dp
listView.model: 48
listView.implicitHeight: 204 * DefaultStyle.dp
@ -33,7 +35,7 @@ ComboBox {
mainItem.popup.open()
} else {
listView.currentIndex = -1
mainItem.selectedTimeString = Qt.formatDateTime(UtilsCpp.createDateTime(new Date(), hour, min), "hh:mm")
mainItem.selectedDateTime = UtilsCpp.createDateTime(mainItem.selectedDateTime, hour, min)
}
}
font {
@ -48,7 +50,7 @@ ComboBox {
}
onEditingFinished: {
console.log("set time", hour, min)
mainItem.selectedTimeString = Qt.formatDateTime(UtilsCpp.createDateTime(new Date(), hour, min), "hh:mm")
mainItem.selectedDateTime = UtilsCpp.createDateTime(mainItem.selectedDateTime, hour, min)
}
}
listView.delegate: Text {
@ -71,7 +73,7 @@ ComboBox {
onClicked: {
// mainItem.text = parent.text
mainItem.listView.currentIndex = index
mainItem.selectedTimeString = hourDelegate.text
mainItem.selectedDateTime = UtilsCpp.createDateTime(mainItem.selectedDateTime, hour, min)
mainItem.popup.close()
}
Rectangle {

View file

@ -8,13 +8,16 @@ Layout with line separator used in several views
ColumnLayout {
spacing: 15 * DefaultStyle.dp
property alias content: contentItem.data
implicitHeight: contentItem.implicitHeight + 1 * DefaultStyle.dp + spacing
Item {
id: contentItem
Layout.fillWidth: true
Layout.preferredHeight: childrenRect.height
Layout.preferredWidth: childrenRect.width
property alias content: contentLayout.data
property alias contentLayout: contentLayout
implicitHeight: contentLayout.implicitHeight + 1 * DefaultStyle.dp + spacing
ColumnLayout {
id: contentLayout
spacing: 8 * DefaultStyle.dp
// width: parent.width
// Layout.fillWidth: true
// Layout.preferredHeight: childrenRect.height
// Layout.preferredWidth: parent.width
// Layout.leftMargin: 8 * DefaultStyle.dp
}
Rectangle {

View file

@ -231,6 +231,7 @@ Item {
id: rightPanelStackView
Layout.fillWidth: true
Layout.fillHeight: true
Layout.leftMargin: 39 * DefaultStyle.dp
}
// We need this component here as it is used in multiple subPages (Call and Contact pages)
Component {

View file

@ -33,11 +33,16 @@ AbstractMainPage {
}
onMeetingListCountChanged: showDefaultItem = leftPanelStackView.currentItem.objectName == "listLayout" && meetingListCount === 0
function createConference(name, address) {
var confInfoGui = Qt.createQmlObject('import Linphone
function setUpConference(confInfoGui = null) {
var isCreation = !confInfoGui
if (isCreation) {
confInfoGui = Qt.createQmlObject('import Linphone
ConferenceInfoGui{
}', mainItem)
leftPanelStackView.push(createConference, {"conferenceInfoGui": confInfoGui})
leftPanelStackView.push(createConf, {"conferenceInfoGui": confInfoGui, "isCreation": isCreation})
} else {
rightPanelStackView.push(editConf, {"conferenceInfoGui": confInfoGui, "isCreation": isCreation})
}
}
leftPanelContent: ColumnLayout {
@ -53,14 +58,28 @@ AbstractMainPage {
Item {
Layout.fillWidth: true
Layout.fillHeight: true
Control.ScrollBar {
id: meetingsScrollbar
visible: leftPanelStackView.currentItem.objectName == "listLayout"
active: true
interactive: true
policy: Control.ScrollBar.AsNeeded
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.right: parent.right
}
Control.StackView {
id: leftPanelStackView
initialItem: listLayout
anchors.fill: parent
anchors.rightMargin: leftPanel.sideMargin
}
Component {
id: listLayout
ColumnLayout {
property string objectName: "listLayout"
spacing: 19 * DefaultStyle.dp
RowLayout {
Layout.fillWidth: true
@ -84,7 +103,7 @@ AbstractMainPage {
width: 30 * DefaultStyle.dp
height: 30 * DefaultStyle.dp
onClicked: {
mainItem.createConference()
mainItem.setUpConference()
}
}
}
@ -121,35 +140,7 @@ AbstractMainPage {
onCountChanged: {
mainItem.meetingListCount = count
}
Control.ScrollBar.vertical: Control.ScrollBar {
id: meetingsScrollbar
active: true
interactive: true
policy: Control.ScrollBar.AsNeeded
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.right: parent.right
}
}
}
}
Component {
id: createConference
NewMeeting {
onReturnRequested: leftPanelStackView.pop()
onAddParticipantsRequested: {
onClicked: leftPanelStackView.push(addParticipants, {"conferenceInfoGui": conferenceInfoGui})
}
}
}
Component {
id: addParticipants
AddParticipantsLayout {
title: qsTr("Ajouter des participants")
validateButtonText: qsTr("Ajouter")
titleColor: DefaultStyle.main1_500_main
onReturnRequested: {
leftPanelStackView.pop()
Control.ScrollBar.vertical: meetingsScrollbar
}
}
}
@ -157,6 +148,54 @@ AbstractMainPage {
}
}
Component {
id: createConf
MeetingSetUp {
Layout.rightMargin: leftPanel.sideMargin
onCreationSucceed: {
leftPanelStackView.pop()
UtilsCpp.showInformationPopup(qsTr("Nouvelle réunion"), qsTr("Réunion planifiée avec succès"), true)
}
onAddParticipantsRequested: {
leftPanelStackView.push(addParticipants, {"conferenceInfoGui": conferenceInfoGui, "container": leftPanelStackView})
}
}
}
Component {
id: editConf
RowLayout {
property bool isCreation
property ConferenceInfoGui conferenceInfoGui
MeetingSetUp {
Layout.alignment: Qt.AlignTop
Layout.preferredWidth: 393 * DefaultStyle.dp
Layout.fillWidth: false
Layout.fillHeight: true
Layout.leftMargin: 39 * DefaultStyle.dp
Layout.topMargin: 39 * DefaultStyle.dp
isCreation: parent.isCreation
conferenceInfoGui: parent.conferenceInfoGui
onReturnRequested: {
mainItem.rightPanelStackView.pop()
}
onAddParticipantsRequested: {
mainItem.rightPanelStackView.push(addParticipants, {"conferenceInfoGui": conferenceInfoGui, "container": mainItem.rightPanelStackView})
}
}
}
}
Component {
id: addParticipants
AddParticipantsLayout {
title: qsTr("Ajouter des participants")
validateButtonText: qsTr("Ajouter")
titleColor: DefaultStyle.main1_500_main
property Control.StackView container
onReturnRequested: {
container.pop()
}
}
}
Component {
id: meetingDetail
RowLayout {
@ -192,7 +231,7 @@ AbstractMainPage {
icon.source: AppIcons.pencil
contentImageColor: DefaultStyle.main1_500_main
background: Item{}
onClicked: mainItem.rightPanelStackView.replace()
onClicked: mainItem.setUpConference(mainItem.selectedConference) //mainItem.rightPanelStackView.push(meetingEdition)
}
PopupButton {
id: deletePopup
@ -402,42 +441,149 @@ AbstractMainPage {
}
}
}
Component {
id: meetingEdition
Section {
content: RowLayout {
spacing: 8 * DefaultStyle.dp
Button {
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
icon.source: AppIcons.leftArrow
contentImageColor: DefaultStyle.main1_500_main
background: Item{}
onClicked: mainItem.rightPanelStackView.pop()
}
Image {
source: AppIcons.usersThree
Layout.preferredWidth: 24 * DefaultStyle.dp
Layout.preferredHeight: 24 * DefaultStyle.dp
}
Text {
text: mainItem.selectedConference.core.subject
font {
pixelSize: 20 * DefaultStyle.dp
weight: 800 * DefaultStyle.dp
}
}
Item {
Layout.fillWidth: true
}
Button {
text: qsTr("Save")
onClicked: {
console.log("TODO : save meeting infos")
mainItem.rightPanelStackView.pop(meetingDetail, Control.StackView.Immediate)
}
}
}
}
}
// Component {
// id: meetingEdition
// RowLayout {
// ColumnLayout {
// Layout.alignment: Qt.AlignTop
// Layout.preferredWidth: 393 * DefaultStyle.dp
// Layout.fillWidth: false
// Layout.fillHeight: true
// Layout.leftMargin: 39 * DefaultStyle.dp
// Layout.topMargin: 39 * DefaultStyle.dp
// spacing: 25 * DefaultStyle.dp
// Section {
// content: RowLayout {
// spacing: 8 * DefaultStyle.dp
// Button {
// Layout.preferredWidth: 24 * DefaultStyle.dp
// Layout.preferredHeight: 24 * DefaultStyle.dp
// icon.source: AppIcons.leftArrow
// contentImageColor: DefaultStyle.main1_500_main
// background: Item{}
// onClicked: mainItem.rightPanelStackView.pop()
// }
// EffectImage {
// imageSource: AppIcons.usersThree
// Layout.preferredWidth: 24 * DefaultStyle.dp
// Layout.preferredHeight: 24 * DefaultStyle.dp
// colorizationColor: DefaultStyle.main2_600
// }
// TextInput {
// Component.onCompleted: text = mainItem.selectedConference.core.subject
// color: DefaultStyle.main2_600
// font {
// pixelSize: 20 * DefaultStyle.dp
// weight: 800 * DefaultStyle.dp
// }
// onEditingFinished: mainItem.selectedConference.core.subject = text
// }
// Item {
// Layout.fillWidth: true
// }
// Button {
// text: qsTr("Save")
// topPadding: 6 * DefaultStyle.dp
// bottomPadding: 6 * DefaultStyle.dp
// leftPadding: 12 * DefaultStyle.dp
// rightPadding: 12 * DefaultStyle.dp
// onClicked: {
// console.log("TODO : save meeting infos")
// mainItem.selectedConference.core.save()
// mainItem.rightPanelStackView.pop(meetingDetail, Control.StackView.Immediate)
// }
// }
// }
// }
// Section {
// content: [
// RowLayout {
// EffectImage {
// imageSource: AppIcons.clock
// Layout.preferredWidth: 24 * DefaultStyle.dp
// Layout.preferredHeight: 24 * DefaultStyle.dp
// colorizationColor: DefaultStyle.main2_600
// }
// Text {
// text: "All the day"
// font {
// pixelSize: 14 * DefaultStyle.dp
// weighgt: 700 * DefaultStyle.dp
// }
// }
// Item{Layout.fillWidth: true}
// Switch {
// id: isAllDaySwitch
// Component.onCompleted: if (mainItem.selectedConference.core.isAllDayConf()) toggle
// onPositionChanged: if (position === 1) {
// mainItem.selectedConference.core.dateTime = UtilsCpp.createDateTime(startDate.selectedDate, 0, 0)
// mainItem.selectedConference.core.endDateTime = UtilsCpp.createDateTime(endDate.selectedDate, 23, 59)
// }
// }
// },
// RowLayout {
// CalendarComboBox {
// id: startDate
// background: Item{}
// contentText.font.weight: 400 * DefaultStyle.dp
// Component.onCompleted: calendar.selectedDate = mainItem.selectedConference.core.dateTime
// onSelectedDateChanged: mainItem.selectedConference.core.dateTime = UtilsCpp.createDateTime(selectedDate, startHour.selectedHour, startHour.selectedMin)
// }
// Item{Layout.fillWidth: true}
// TimeComboBox {
// id: startHour
// visible: isAllDaySwitch.position === 0
// background: Item{}
// contentText.font.weight: 400 * DefaultStyle.dp
// onSelectedHourChanged: mainItem.selectedConference.core.dateTime = UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
// onSelectedMinChanged: mainItem.selectedConference.core.dateTime = UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
// }
// },
// RowLayout {
// CalendarComboBox {
// id: endDate
// background: Item{}
// contentText.font.weight: 400 * DefaultStyle.dp
// Component.onCompleted: calendar.selectedDate = mainItem.selectedConference.core.endDateTime
// onSelectedDateChanged: mainItem.selectedConference.core.endDateTime = UtilsCpp.createDateTime(selectedDate, endHour.selectedHour, endHour.selectedMin)
// }
// Item{Layout.fillWidth: true}
// TimeComboBox {
// id: endHour
// visible: isAllDaySwitch.position === 0
// background: Item{}
// contentText.font.weight: 400 * DefaultStyle.dp
// onSelectedHourChanged: mainItem.selectedConference.core.endDateTime = UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
// onSelectedMinChanged: mainItem.selectedConference.core.endDateTime = UtilsCpp.createDateTime(startDate.selectedDate, selectedHour, selectedMin)
// }
// },
// ComboBox {
// id: timeZoneCbox
// Layout.fillWidth: true
// Layout.preferredHeight: 30 * DefaultStyle.dp
// hoverEnabled: true
// listView.implicitHeight: 152 * DefaultStyle.dp
// constantImageSource: AppIcons.globe
// weight: 700 * DefaultStyle.dp
// leftMargin: 0
// currentIndex: mainItem.conferenceInfoGui ? model.getIndex(mainItem.conferenceInfoGui.core.timeZoneModel) : -1
// background: Rectangle {
// visible: parent.hovered || parent.down
// anchors.fill: parent
// color: DefaultStyle.grey_100
// }
// model: TimeZoneProxy{
// }
// onCurrentIndexChanged: {
// var modelIndex = timeZoneCbox.model.index(currentIndex, 0)
// mainItem.conferenceInfoGui.core.timeZoneModel = timeZoneCbox.model.data(modelIndex, Qt.DisplayRole + 1)
// }
// },
// ]
// }
// // Item{Layout.fillHeight: true}
// }
// }
// }
}