diff --git a/resources/qml/Root.qml b/resources/qml/Root.qml
index 01fde18e..cb000040 100644
--- a/resources/qml/Root.qml
+++ b/resources/qml/Root.qml
@@ -20,19 +20,14 @@ import im.nheko.EmojiModel 1.0
Pane {
id: timelineRoot
- background: null
- padding: 0
-
- FontMetrics {
- id: fontMetrics
- }
-
- RoomDirectoryModel {
- id: publicRooms
+ function destroyOnClose(obj) {
+ if (obj.closing != undefined)
+ obj.closing.connect(() => obj.destroy(1000));
+ else if (obj.aboutToHide != undefined)
+ obj.aboutToHide.connect(() => obj.destroy(1000));
}
-
- UserDirectoryModel {
- id: userDirectory
+ function destroyOnClosed(obj) {
+ obj.aboutToHide.connect(() => obj.destroy(1000));
}
//Timer {
@@ -41,54 +36,49 @@ Pane {
// running: true
// repeat: true
//}
-
function showAliasEditor(settings) {
- var component = Qt.createComponent("qrc:/qml/dialogs/AliasEditor.qml")
+ var component = Qt.createComponent("qrc:/qml/dialogs/AliasEditor.qml");
if (component.status == Component.Ready) {
var dialog = component.createObject(timelineRoot, {
- "roomSettings": settings
- });
+ "roomSettings": settings
+ });
dialog.show();
destroyOnClose(dialog);
} else {
console.error("Failed to create component: " + component.errorString());
}
-
}
-
- function showPLEditor(settings) {
- var component = Qt.createComponent("qrc:/qml/dialogs/PowerLevelEditor.qml")
+ function showAllowedRoomsEditor(settings) {
+ var component = Qt.createComponent("qrc:/qml/dialogs/AllowedRoomsSettingsDialog.qml");
if (component.status == Component.Ready) {
var dialog = component.createObject(timelineRoot, {
- "roomSettings": settings
- });
+ "roomSettings": settings
+ });
dialog.show();
destroyOnClose(dialog);
} else {
console.error("Failed to create component: " + component.errorString());
}
}
-
- function showSpacePLApplyPrompt(settings, editingModel) {
- var component = Qt.createComponent("qrc:/qml/dialogs/PowerLevelSpacesApplyDialog.qml")
+ function showPLEditor(settings) {
+ var component = Qt.createComponent("qrc:/qml/dialogs/PowerLevelEditor.qml");
if (component.status == Component.Ready) {
var dialog = component.createObject(timelineRoot, {
- "roomSettings": settings,
- "editingModel": editingModel
- });
+ "roomSettings": settings
+ });
dialog.show();
destroyOnClose(dialog);
} else {
console.error("Failed to create component: " + component.errorString());
}
}
-
- function showAllowedRoomsEditor(settings) {
- var component = Qt.createComponent("qrc:/qml/dialogs/AllowedRoomsSettingsDialog.qml")
+ function showSpacePLApplyPrompt(settings, editingModel) {
+ var component = Qt.createComponent("qrc:/qml/dialogs/PowerLevelSpacesApplyDialog.qml");
if (component.status == Component.Ready) {
var dialog = component.createObject(timelineRoot, {
- "roomSettings": settings
- });
+ "roomSettings": settings,
+ "editingModel": editingModel
+ });
dialog.show();
destroyOnClose(dialog);
} else {
@@ -96,23 +86,37 @@ Pane {
}
}
+ background: null
+ padding: 0
+
+ FontMetrics {
+ id: fontMetrics
+
+ }
+ RoomDirectoryModel {
+ id: publicRooms
+
+ }
+ UserDirectoryModel {
+ id: userDirectory
+
+ }
Component {
id: readReceiptsDialog
ReadReceipts {
}
-
}
-
Shortcut {
sequence: StandardKey.Quit
+
onActivated: Qt.quit()
}
-
Shortcut {
sequence: "Ctrl+K"
+
onActivated: {
- var component = Qt.createComponent("qrc:/qml/QuickSwitcher.qml")
+ var component = Qt.createComponent("qrc:/qml/QuickSwitcher.qml");
if (component.status == Component.Ready) {
var quickSwitch = component.createObject(timelineRoot);
quickSwitch.open();
@@ -122,50 +126,49 @@ Pane {
}
}
}
-
Shortcut {
// Add alternative shortcut, because sometimes Alt+A is stolen by the TextEdit
sequences: ["Alt+A", "Ctrl+Shift+A"]
+
onActivated: Rooms.nextRoomWithActivity()
}
-
Shortcut {
sequence: "Ctrl+Down"
+
onActivated: Rooms.nextRoom()
}
-
Shortcut {
sequence: "Ctrl+Up"
+
onActivated: Rooms.previousRoom()
}
-
Connections {
- function onOpenLogoutDialog() {
- var component = Qt.createComponent("qrc:/qml/dialogs/LogoutDialog.qml")
+ function onOpenJoinRoomDialog() {
+ var component = Qt.createComponent("qrc:/qml/dialogs/JoinRoomDialog.qml");
if (component.status == Component.Ready) {
var dialog = component.createObject(timelineRoot);
- dialog.open();
+ dialog.show();
destroyOnClose(dialog);
} else {
console.error("Failed to create component: " + component.errorString());
}
}
-
- function onOpenJoinRoomDialog() {
- var component = Qt.createComponent("qrc:/qml/dialogs/JoinRoomDialog.qml")
+ function onOpenLogoutDialog() {
+ var component = Qt.createComponent("qrc:/qml/dialogs/LogoutDialog.qml");
if (component.status == Component.Ready) {
var dialog = component.createObject(timelineRoot);
- dialog.show();
+ dialog.open();
destroyOnClose(dialog);
} else {
console.error("Failed to create component: " + component.errorString());
}
}
-
function onShowRoomJoinPrompt(summary) {
- var component = Qt.createComponent("qrc:/qml/dialogs/ConfirmJoinRoomDialog.qml")
+ var component = Qt.createComponent("qrc:/qml/dialogs/ConfirmJoinRoomDialog.qml");
if (component.status == Component.Ready) {
- var dialog = component.createObject(timelineRoot, {"summary": summary});
+ var dialog = component.createObject(timelineRoot, {
+ "summary": summary
+ });
dialog.show();
destroyOnClose(dialog);
} else {
@@ -175,12 +178,13 @@ Pane {
target: Nheko
}
-
Connections {
function onNewDeviceVerificationRequest(flow) {
- var component = Qt.createComponent("qrc:/qml/device-verification/DeviceVerification.qml")
+ var component = Qt.createComponent("qrc:/qml/device-verification/DeviceVerification.qml");
if (component.status == Component.Ready) {
- var dialog = component.createObject(timelineRoot, {"flow": flow});
+ var dialog = component.createObject(timelineRoot, {
+ "flow": flow
+ });
dialog.show();
destroyOnClose(dialog);
} else {
@@ -190,101 +194,71 @@ Pane {
target: VerificationManager
}
-
- function destroyOnClose(obj) {
- if (obj.closing != undefined) obj.closing.connect(() => obj.destroy(1000));
- else if (obj.aboutToHide != undefined) obj.aboutToHide.connect(() => obj.destroy(1000));
- }
-
- function destroyOnClosed(obj) {
- obj.aboutToHide.connect(() => obj.destroy(1000));
- }
-
Connections {
- function onOpenProfile(profile) {
- var component = Qt.createComponent("qrc:/qml/dialogs/UserProfile.qml")
+ function onOpenInviteUsersDialog(invitees) {
+ var component = Qt.createComponent("qrc:/qml/dialogs/InviteDialog.qml");
if (component.status == Component.Ready) {
- var userProfile = component.createObject(timelineRoot, {"profile": profile});
- userProfile.show();
- destroyOnClose(userProfile);
+ var dialog = component.createObject(timelineRoot, {
+ "invitees": invitees
+ });
+ dialog.show();
+ destroyOnClose(dialog);
} else {
console.error("Failed to create component: " + component.errorString());
}
}
-
- function onShowImagePackSettings(room, packlist) {
- var component = Qt.createComponent("qrc:/qml/dialogs/ImagePackSettingsDialog.qml")
-
+ function onOpenLeaveRoomDialog(roomid, reason) {
+ var component = Qt.createComponent("qrc:/qml/dialogs/LeaveRoomDialog.qml");
if (component.status == Component.Ready) {
- var packSet = component.createObject(timelineRoot, {
- "room": room,
- "packlist": packlist
- });
- packSet.show();
- destroyOnClose(packSet);
+ var dialog = component.createObject(timelineRoot, {
+ "roomId": roomid,
+ "reason": reason
+ });
+ dialog.open();
+ destroyOnClose(dialog);
+ } else {
+ console.error("Failed to create component: " + component.errorString());
+ }
+ }
+ function onOpenProfile(profile) {
+ var component = Qt.createComponent("qrc:/qml/dialogs/UserProfile.qml");
+ if (component.status == Component.Ready) {
+ var userProfile = component.createObject(timelineRoot, {
+ "profile": profile
+ });
+ userProfile.show();
+ destroyOnClose(userProfile);
} else {
console.error("Failed to create component: " + component.errorString());
}
}
-
function onOpenRoomMembersDialog(members, room) {
- var component = Qt.createComponent("qrc:/qml/dialogs/RoomMembers.qml")
+ var component = Qt.createComponent("qrc:/qml/dialogs/RoomMembers.qml");
if (component.status == Component.Ready) {
var membersDialog = component.createObject(timelineRoot, {
- "members": members,
- "room": room
- });
+ "members": members,
+ "room": room
+ });
membersDialog.show();
destroyOnClose(membersDialog);
} else {
console.error("Failed to create component: " + component.errorString());
}
-
}
-
function onOpenRoomSettingsDialog(settings) {
- var component = Qt.createComponent("qrc:/qml/dialogs/RoomSettings.qml")
+ var component = Qt.createComponent("qrc:/qml/dialogs/RoomSettings.qml");
if (component.status == Component.Ready) {
var roomSettings = component.createObject(timelineRoot, {
- "roomSettings": settings
- });
+ "roomSettings": settings
+ });
roomSettings.show();
destroyOnClose(roomSettings);
} else {
console.error("Failed to create component: " + component.errorString());
}
-
- }
-
- function onOpenInviteUsersDialog(invitees) {
- var component = Qt.createComponent("qrc:/qml/dialogs/InviteDialog.qml")
- if (component.status == Component.Ready) {
- var dialog = component.createObject(timelineRoot, {
- "invitees": invitees
- });
- dialog.show();
- destroyOnClose(dialog);
- } else {
- console.error("Failed to create component: " + component.errorString());
- }
}
-
- function onOpenLeaveRoomDialog(roomid, reason) {
- var component = Qt.createComponent("qrc:/qml/dialogs/LeaveRoomDialog.qml")
- if (component.status == Component.Ready) {
- var dialog = component.createObject(timelineRoot, {
- "roomId": roomid,
- "reason": reason
- });
- dialog.open();
- destroyOnClose(dialog);
- } else {
- console.error("Failed to create component: " + component.errorString());
- }
- }
-
function onShowImageOverlay(room, eventId, url, originalWidth, proportionalHeight) {
- var component = Qt.createComponent("qrc:/qml/dialogs/ImageOverlay.qml")
+ var component = Qt.createComponent("qrc:/qml/dialogs/ImageOverlay.qml");
if (component.status == Component.Ready) {
var dialog = component.createObject(timelineRoot, {
"room": room,
@@ -292,22 +266,33 @@ Pane {
"url": url,
"originalWidth": originalWidth ?? 0,
"proportionalHeight": proportionalHeight ?? 0
- }
- );
+ });
dialog.showFullScreen();
destroyOnClose(dialog);
} else {
console.error("Failed to create component: " + component.errorString());
}
}
+ function onShowImagePackSettings(room, packlist) {
+ var component = Qt.createComponent("qrc:/qml/dialogs/ImagePackSettingsDialog.qml");
+ if (component.status == Component.Ready) {
+ var packSet = component.createObject(timelineRoot, {
+ "room": room,
+ "packlist": packlist
+ });
+ packSet.show();
+ destroyOnClose(packSet);
+ } else {
+ console.error("Failed to create component: " + component.errorString());
+ }
+ }
target: TimelineManager
}
-
Connections {
function onNewInviteState() {
if (CallManager.haveCallInvite && Settings.mobileMode) {
- var component = Qt.createComponent("qrc:/qml/voip/CallInvite.qml")
+ var component = Qt.createComponent("qrc:/qml/voip/CallInvite.qml");
if (component.status == Component.Ready) {
var dialog = component.createObject(timelineRoot);
dialog.open();
@@ -320,131 +305,110 @@ Pane {
target: CallManager
}
-
SelfVerificationCheck {
}
-
InputDialog {
id: uiaPassPrompt
echoMode: TextInput.Password
- title: UIA.title
prompt: qsTr("Please enter your login password to continue:")
- onAccepted: (t) => {
+ title: UIA.title
+
+ onAccepted: t => {
return UIA.continuePassword(t);
}
}
-
InputDialog {
id: uiaEmailPrompt
- title: UIA.title
prompt: qsTr("Please enter a valid email address to continue:")
- onAccepted: (t) => {
+ title: UIA.title
+
+ onAccepted: t => {
return UIA.continueEmail(t);
}
}
-
PhoneNumberInputDialog {
id: uiaPhoneNumberPrompt
- title: UIA.title
prompt: qsTr("Please enter a valid phone number to continue:")
+ title: UIA.title
+
onAccepted: (p, t) => {
return UIA.continuePhoneNumber(p, t);
}
}
-
InputDialog {
id: uiaTokenPrompt
- title: UIA.title
prompt: qsTr("Please enter the token which has been sent to you:")
- onAccepted: (t) => {
+ title: UIA.title
+
+ onAccepted: t => {
return UIA.submit3pidToken(t);
}
}
-
Platform.MessageDialog {
id: uiaErrorDialog
buttons: Platform.MessageDialog.Ok
}
-
Platform.MessageDialog {
id: uiaConfirmationLinkDialog
buttons: Platform.MessageDialog.Ok
text: qsTr("Wait for the confirmation link to arrive, then continue.")
+
onAccepted: UIA.continue3pidReceived()
}
-
Connections {
- function onPassword() {
- console.log("UIA: password needed");
- uiaPassPrompt.show();
+ function onConfirm3pidToken() {
+ uiaConfirmationLinkDialog.open();
}
-
function onEmail() {
uiaEmailPrompt.show();
}
-
+ function onError(msg) {
+ uiaErrorDialog.text = msg;
+ uiaErrorDialog.open();
+ }
+ function onPassword() {
+ console.log("UIA: password needed");
+ uiaPassPrompt.show();
+ }
function onPhoneNumber() {
uiaPhoneNumberPrompt.show();
}
-
function onPrompt3pidToken() {
uiaTokenPrompt.show();
}
- function onConfirm3pidToken() {
- uiaConfirmationLinkDialog.open();
- }
-
- function onError(msg) {
- uiaErrorDialog.text = msg;
- uiaErrorDialog.open();
- }
-
target: UIA
}
-
StackView {
id: mainWindow
- anchors.fill: parent
- initialItem: welcomePage
-
- Transition {
- id: reducedMotionTransitionExit
- PropertyAnimation {
- property: "opacity"
- from: 1
- to:0
- duration: 200
- }
- }
- Transition {
- id: reducedMotionTransitionEnter
- SequentialAnimation {
- PropertyAction { property: "opacity"; value: 0 }
- PauseAnimation { duration: 200 }
- PropertyAnimation {
- property: "opacity"
- from: 0
- to:1
- duration: 200
- }
- }
- }
+ property Transition popEnterOrg
+ property Transition popExitOrg
// for some reason direct bindings to a hidden StackView don't work, so manually store and restore here.
property Transition pushEnterOrg
property Transition pushExitOrg
- property Transition popEnterOrg
- property Transition popExitOrg
property Transition replaceEnterOrg
property Transition replaceExitOrg
+
+ function updateTrans() {
+ pushEnter = Settings.reducedMotion ? reducedMotionTransitionEnter : pushEnterOrg;
+ pushExit = Settings.reducedMotion ? reducedMotionTransitionExit : pushExitOrg;
+ popEnter = Settings.reducedMotion ? reducedMotionTransitionEnter : popEnterOrg;
+ popExit = Settings.reducedMotion ? reducedMotionTransitionExit : popExitOrg;
+ replaceEnter = Settings.reducedMotion ? reducedMotionTransitionEnter : replaceEnterOrg;
+ replaceExit = Settings.reducedMotion ? reducedMotionTransitionExit : replaceExitOrg;
+ }
+
+ anchors.fill: parent
+ initialItem: welcomePage
+
Component.onCompleted: {
pushEnterOrg = pushEnter;
popEnterOrg = popEnter;
@@ -452,78 +416,94 @@ Pane {
pushExitOrg = pushExit;
popExitOrg = popExit;
replaceExitOrg = replaceExit;
-
- updateTrans()
+ updateTrans();
}
- function updateTrans() {
- pushEnter = Settings.reducedMotion ? reducedMotionTransitionEnter : pushEnterOrg;
- pushExit = Settings.reducedMotion ? reducedMotionTransitionExit : pushExitOrg;
- popEnter = Settings.reducedMotion ? reducedMotionTransitionEnter : popEnterOrg;
- popExit = Settings.reducedMotion ? reducedMotionTransitionExit : popExitOrg;
- replaceEnter = Settings.reducedMotion ? reducedMotionTransitionEnter : replaceEnterOrg;
- replaceExit = Settings.reducedMotion ? reducedMotionTransitionExit : replaceExitOrg;
+ Transition {
+ id: reducedMotionTransitionExit
+
+ PropertyAnimation {
+ duration: 200
+ from: 1
+ property: "opacity"
+ to: 0
+ }
}
+ Transition {
+ id: reducedMotionTransitionEnter
+ SequentialAnimation {
+ PropertyAction {
+ property: "opacity"
+ value: 0
+ }
+ PauseAnimation {
+ duration: 200
+ }
+ PropertyAnimation {
+ duration: 200
+ from: 0
+ property: "opacity"
+ to: 1
+ }
+ }
+ }
Connections {
- target: Settings
function onReducedMotionChanged() {
mainWindow.updateTrans();
}
+
+ target: Settings
}
}
-
Component {
id: welcomePage
WelcomePage {
}
}
-
Component {
id: chatPage
ChatPage {
}
}
-
Component {
id: loginPage
LoginPage {
}
}
-
Component {
id: registerPage
RegisterPage {
}
}
-
Component {
id: userSettingsPage
UserSettingsPage {
}
-
}
+ Snackbar {
+ id: snackbar
-
- Snackbar { id: snackbar }
-
+ }
Connections {
+ function onShowNotification(msg) {
+ snackbar.showNotification(msg);
+ console.log("New snack: " + msg);
+ }
function onSwitchToChatPage() {
mainWindow.replace(null, chatPage);
}
function onSwitchToLoginPage(error) {
- mainWindow.replace(welcomePage, {}, loginPage, {"error": error}, StackView.PopTransition);
- }
- function onShowNotification(msg) {
- snackbar.showNotification(msg);
- console.log("New snack: " + msg);
+ mainWindow.replace(welcomePage, {}, loginPage, {
+ "error": error
+ }, StackView.PopTransition);
}
+
target: MainWindow
}
-
}
|