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() {