diff --git a/imports/Spectral/Panel/RoomListPanel.qml b/imports/Spectral/Panel/RoomListPanel.qml index 342c59c..83a1d72 100644 --- a/imports/Spectral/Panel/RoomListPanel.qml +++ b/imports/Spectral/Panel/RoomListPanel.qml @@ -472,7 +472,7 @@ Rectangle { color: "#273338" } - ItemDelegate { + RippleEffect { anchors.fill: parent onClicked: errorControl.visible = false diff --git a/imports/Spectral/Panel/RoomPanelForm.ui.qml b/imports/Spectral/Panel/RoomPanelForm.ui.qml index d7236a4..3d37a87 100644 --- a/imports/Spectral/Panel/RoomPanelForm.ui.qml +++ b/imports/Spectral/Panel/RoomPanelForm.ui.qml @@ -298,9 +298,6 @@ Item { Layout.alignment: Qt.AlignHCenter id: roomPanelInput - - width: parent.width - height: 48 } } } diff --git a/imports/Spectral/Panel/RoomPanelInput.qml b/imports/Spectral/Panel/RoomPanelInput.qml index 01dd2dc..0af6030 100644 --- a/imports/Spectral/Panel/RoomPanelInput.qml +++ b/imports/Spectral/Panel/RoomPanelInput.qml @@ -12,7 +12,7 @@ import Spectral 0.1 import "qrc:/js/md.js" as Markdown -Rectangle { +Control { property bool isReply property string replyUserID property string replyEventID @@ -23,13 +23,16 @@ Rectangle { property int autoCompleteBeginPosition property int autoCompleteEndPosition - color: MSettings.darkTheme ? "#303030" : "#fafafa" + padding: 0 - radius: height / 2 + background: Rectangle { + color: MSettings.darkTheme ? "#303030" : "#fafafa" + radius: 24 - layer.enabled: true - layer.effect: ElevationEffect { - elevation: 1 + layer.enabled: true + layer.effect: ElevationEffect { + elevation: 2 + } } Popup { @@ -102,12 +105,12 @@ Rectangle { } } - RowLayout { - anchors.fill: parent - + contentItem: RowLayout { spacing: 0 ToolButton { + Layout.alignment: Qt.AlignTop + id: uploadButton visible: !isReply @@ -135,172 +138,166 @@ Rectangle { onClicked: clearReply() } - ScrollView { + TextArea { + property real progress: 0 + Layout.fillWidth: true - Layout.preferredHeight: 48 - ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + id: inputField - clip: true + wrapMode: Text.Wrap + placeholderText: isReply ? "Reply to " + replyUserID : "Send a Message" + topPadding: 0 + bottomPadding: 0 + selectByMouse: true + verticalAlignment: TextEdit.AlignVCenter - TextArea { - property real progress: 0 + text: currentRoom ? currentRoom.cachedInput : "" - id: inputField + background: Item { + } - wrapMode: Text.Wrap - placeholderText: isReply ? "Reply to " + replyUserID : "Send a Message" - leftPadding: 16 - topPadding: 0 - bottomPadding: 0 - selectByMouse: true - verticalAlignment: TextEdit.AlignVCenter + Rectangle { + width: currentRoom && currentRoom.hasFileUploading ? parent.width * currentRoom.fileUploadingProgress / 100 : 0 + height: parent.height - text: currentRoom ? currentRoom.cachedInput : "" + opacity: 0.2 + color: Material.accent + } - background: Item { + Timer { + id: timeoutTimer + + repeat: false + interval: 2000 + onTriggered: { + repeatTimer.stop() + currentRoom.sendTypingNotification(false) } + } - Rectangle { - width: currentRoom && currentRoom.hasFileUploading ? parent.width * currentRoom.fileUploadingProgress / 100 : 0 - height: parent.height + Timer { + id: repeatTimer - opacity: 0.2 - color: Material.accent + repeat: true + interval: 5000 + triggeredOnStart: true + onTriggered: currentRoom.sendTypingNotification(true) + } + + ToolTip.visible: currentRoom + && currentRoom.hasUsersTyping + ToolTip.text: currentRoom ? currentRoom.usersTyping : "" + + Keys.onReturnPressed: { + if (event.modifiers & Qt.ShiftModifier) { + insert(cursorPosition, "\n") + } else { + postMessage(text) + text = "" } + } - Timer { - id: timeoutTimer + Keys.onBacktabPressed: if (isAutoCompleting) autoCompleteListView.decrementCurrentIndex() - repeat: false - interval: 2000 - onTriggered: { - repeatTimer.stop() - currentRoom.sendTypingNotification(false) - } - } - - Timer { - id: repeatTimer - - repeat: true - interval: 5000 - triggeredOnStart: true - onTriggered: currentRoom.sendTypingNotification(true) - } - - ToolTip.visible: currentRoom - && currentRoom.hasUsersTyping - ToolTip.text: currentRoom ? currentRoom.usersTyping : "" - - Keys.onReturnPressed: { - if (event.modifiers & Qt.ShiftModifier) { - insert(cursorPosition, "\n") - } else { - postMessage(text) - text = "" - } - } - - Keys.onBacktabPressed: if (isAutoCompleting) autoCompleteListView.decrementCurrentIndex() - - Keys.onTabPressed: { - if (isAutoCompleting) { - autoCompleteListView.incrementCurrentIndex() - } else { + Keys.onTabPressed: { + if (isAutoCompleting) { + autoCompleteListView.incrementCurrentIndex() + } else { + autoCompleteBeginPosition = text.substring(0, cursorPosition).lastIndexOf(" ") + 1 + var autoCompletePrefix = text.substring(0, cursorPosition).split(" ").pop() + if (!autoCompletePrefix) return + if (autoCompletePrefix.startsWith(":")) { autoCompleteBeginPosition = text.substring(0, cursorPosition).lastIndexOf(" ") + 1 - var autoCompletePrefix = text.substring(0, cursorPosition).split(" ").pop() - if (!autoCompletePrefix) return - if (autoCompletePrefix.startsWith(":")) { - autoCompleteBeginPosition = text.substring(0, cursorPosition).lastIndexOf(" ") + 1 - autoCompleteModel = emojiModel.filterModel(autoCompletePrefix) - if (autoCompleteModel.length === 0) return - isAutoCompleting = true - autoCompleteEndPosition = cursorPosition - } else { - autoCompleteModel = currentRoom.getUsers(autoCompletePrefix) - if (autoCompleteModel.length === 0) return - isAutoCompleting = true - autoCompleteEndPosition = cursorPosition - } - } - replaceAutoComplete(autoCompleteListView.currentItem.autoCompleteText) - } - - onTextChanged: { - timeoutTimer.restart() - repeatTimer.start() - currentRoom.cachedInput = text - - if (cursorPosition !== autoCompleteBeginPosition && cursorPosition !== autoCompleteEndPosition) { - isAutoCompleting = false - autoCompleteListView.currentIndex = 0 + autoCompleteModel = emojiModel.filterModel(autoCompletePrefix) + if (autoCompleteModel.length === 0) return + isAutoCompleting = true + autoCompleteEndPosition = cursorPosition + } else { + autoCompleteModel = currentRoom.getUsers(autoCompletePrefix) + if (autoCompleteModel.length === 0) return + isAutoCompleting = true + autoCompleteEndPosition = cursorPosition } } + replaceAutoComplete(autoCompleteListView.currentItem.autoCompleteText) + } - function replaceAutoComplete(word) { - remove(autoCompleteBeginPosition, autoCompleteEndPosition) - autoCompleteEndPosition = autoCompleteBeginPosition + word.length - insert(cursorPosition, word) + onTextChanged: { + timeoutTimer.restart() + repeatTimer.start() + currentRoom.cachedInput = text + + if (cursorPosition !== autoCompleteBeginPosition && cursorPosition !== autoCompleteEndPosition) { + isAutoCompleting = false + autoCompleteListView.currentIndex = 0 + } + } + + function replaceAutoComplete(word) { + remove(autoCompleteBeginPosition, autoCompleteEndPosition) + autoCompleteEndPosition = autoCompleteBeginPosition + word.length + insert(cursorPosition, word) + } + + function postMessage(text) { + if (text.trim().length === 0) { return } + if(!currentRoom) { return } + + var PREFIX_ME = '/me ' + var PREFIX_NOTICE = '/notice ' + var PREFIX_RAINBOW = '/rainbow ' + var PREFIX_HTML = '/html ' + var PREFIX_MARKDOWN = '/md ' + + if (isReply) { + currentRoom.sendReply(replyUserID, replyEventID, replyContent, text) + clearReply() + return } - function postMessage(text) { - if (text.trim().length === 0) { return } - if(!currentRoom) { return } - - var PREFIX_ME = '/me ' - var PREFIX_NOTICE = '/notice ' - var PREFIX_RAINBOW = '/rainbow ' - var PREFIX_HTML = '/html ' - var PREFIX_MARKDOWN = '/md ' - - if (isReply) { - currentRoom.sendReply(replyUserID, replyEventID, replyContent, text) - clearReply() - return - } - - if (text.indexOf(PREFIX_ME) === 0) { - text = text.substr(PREFIX_ME.length) - currentRoom.postMessage(text, RoomMessageEvent.Emote) - return - } - if (text.indexOf(PREFIX_NOTICE) === 0) { - text = text.substr(PREFIX_NOTICE.length) - currentRoom.postMessage(text, RoomMessageEvent.Notice) - return - } - if (text.indexOf(PREFIX_RAINBOW) === 0) { - text = text.substr(PREFIX_RAINBOW.length) - - var parsedText = "" - var rainbowColor = ["#ff2b00", "#ff5500", "#ff8000", "#ffaa00", "#ffd500", "#ffff00", "#d4ff00", "#aaff00", "#80ff00", "#55ff00", "#2bff00", "#00ff00", "#00ff2b", "#00ff55", "#00ff80", "#00ffaa", "#00ffd5", "#00ffff", "#00d4ff", "#00aaff", "#007fff", "#0055ff", "#002bff", "#0000ff", "#2a00ff", "#5500ff", "#7f00ff", "#aa00ff", "#d400ff", "#ff00ff", "#ff00d4", "#ff00aa", "#ff0080", "#ff0055", "#ff002b", "#ff0000"] - for (var i = 0; i < text.length; i++) { - parsedText = parsedText + "" + text.charAt(i) + "" - } - currentRoom.postHtmlMessage(text, parsedText, RoomMessageEvent.Text) - return - } - if (text.indexOf(PREFIX_HTML) === 0) { - text = text.substr(PREFIX_HTML.length) - var re = new RegExp("<.*?>") - var plainText = text.replace(re, "") - currentRoom.postHtmlMessage(plainText, text, RoomMessageEvent.Text) - return - } - if (text.indexOf(PREFIX_MARKDOWN) === 0) { - text = text.substr(PREFIX_MARKDOWN.length) - var parsedText = Markdown.markdown_parser(text) - currentRoom.postHtmlMessage(text, parsedText, RoomMessageEvent.Text) - return - } - - currentRoom.postPlainText(text) + if (text.indexOf(PREFIX_ME) === 0) { + text = text.substr(PREFIX_ME.length) + currentRoom.postMessage(text, RoomMessageEvent.Emote) + return } + if (text.indexOf(PREFIX_NOTICE) === 0) { + text = text.substr(PREFIX_NOTICE.length) + currentRoom.postMessage(text, RoomMessageEvent.Notice) + return + } + if (text.indexOf(PREFIX_RAINBOW) === 0) { + text = text.substr(PREFIX_RAINBOW.length) + + var parsedText = "" + var rainbowColor = ["#ff2b00", "#ff5500", "#ff8000", "#ffaa00", "#ffd500", "#ffff00", "#d4ff00", "#aaff00", "#80ff00", "#55ff00", "#2bff00", "#00ff00", "#00ff2b", "#00ff55", "#00ff80", "#00ffaa", "#00ffd5", "#00ffff", "#00d4ff", "#00aaff", "#007fff", "#0055ff", "#002bff", "#0000ff", "#2a00ff", "#5500ff", "#7f00ff", "#aa00ff", "#d400ff", "#ff00ff", "#ff00d4", "#ff00aa", "#ff0080", "#ff0055", "#ff002b", "#ff0000"] + for (var i = 0; i < text.length; i++) { + parsedText = parsedText + "" + text.charAt(i) + "" + } + currentRoom.postHtmlMessage(text, parsedText, RoomMessageEvent.Text) + return + } + if (text.indexOf(PREFIX_HTML) === 0) { + text = text.substr(PREFIX_HTML.length) + var re = new RegExp("<.*?>") + var plainText = text.replace(re, "") + currentRoom.postHtmlMessage(plainText, text, RoomMessageEvent.Text) + return + } + if (text.indexOf(PREFIX_MARKDOWN) === 0) { + text = text.substr(PREFIX_MARKDOWN.length) + var parsedText = Markdown.markdown_parser(text) + currentRoom.postHtmlMessage(text, parsedText, RoomMessageEvent.Text) + return + } + + currentRoom.postPlainText(text) } } ToolButton { + Layout.alignment: Qt.AlignTop + id: emojiButton contentItem: MaterialIcon { diff --git a/qml/main.qml b/qml/main.qml index 5644add..487ae71 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -55,7 +55,7 @@ ApplicationWindow { quitOnLastWindowClosed: !MSettings.showTray onNotificationClicked: { - roomForm.enteredRoom = spectralController.connection.room(roomId) + roomListForm.enteredRoom = spectralController.connection.room(roomId) roomForm.goToEvent(eventId) showWindow() } @@ -131,12 +131,15 @@ ApplicationWindow { } } - Component.onCompleted: { - spectralController.onErrorOccured.connect(function(error, detail) { - loginDialog.busy = false - loginButtonTooltip.text = error + ": " + detail - loginButtonTooltip.open() - }) + onVisibleChanged: { + if (visible) spectralController.onErrorOccured.connect(showError) + else spectralController.onErrorOccured.disconnect(showError) + } + + function showError(error, detail) { + loginDialog.busy = false + loginButtonTooltip.text = error + ": " + detail + loginButtonTooltip.open() } function doLogin() {