diff --git a/imports/Spectral/Component/AutoListView.qml b/imports/NeoChat/Component/AutoListView.qml
similarity index 100%
rename from imports/Spectral/Component/AutoListView.qml
rename to imports/NeoChat/Component/AutoListView.qml
diff --git a/imports/Spectral/Component/AutoMouseArea.qml b/imports/NeoChat/Component/AutoMouseArea.qml
similarity index 90%
rename from imports/Spectral/Component/AutoMouseArea.qml
rename to imports/NeoChat/Component/AutoMouseArea.qml
index ac5e63eb3..80fb1c5b6 100644
--- a/imports/Spectral/Component/AutoMouseArea.qml
+++ b/imports/NeoChat/Component/AutoMouseArea.qml
@@ -1,6 +1,6 @@
import QtQuick 2.12
-import Spectral.Setting 0.1
+import NeoChat.Setting 0.1
MouseArea {
signal primaryClicked()
diff --git a/imports/Spectral/Component/AutoRectangle.qml b/imports/NeoChat/Component/AutoRectangle.qml
similarity index 100%
rename from imports/Spectral/Component/AutoRectangle.qml
rename to imports/NeoChat/Component/AutoRectangle.qml
diff --git a/imports/Spectral/Component/AutoTextField.qml b/imports/NeoChat/Component/AutoTextField.qml
similarity index 100%
rename from imports/Spectral/Component/AutoTextField.qml
rename to imports/NeoChat/Component/AutoTextField.qml
diff --git a/imports/NeoChat/Component/ChatTextInput.qml b/imports/NeoChat/Component/ChatTextInput.qml
new file mode 100644
index 000000000..62b3be9cf
--- /dev/null
+++ b/imports/NeoChat/Component/ChatTextInput.qml
@@ -0,0 +1,468 @@
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Layouts 1.12
+import org.kde.kirigami 2.13 as Kirigami
+
+import NeoChat.Component 2.0
+import NeoChat.Component.Emoji 2.0
+import NeoChat.Dialog 2.0
+import NeoChat.Effect 2.0
+import NeoChat.Setting 0.1
+
+import org.kde.neochat 0.1
+
+Control {
+ id: root
+
+ property alias isReply: replyItem.visible
+ property bool isReaction: false
+ property var replyUser
+ property string replyEventID
+ property string replyContent
+
+ property alias isAutoCompleting: autoCompleteListView.visible
+ property var autoCompleteModel
+ property int autoCompleteBeginPosition
+ property int autoCompleteEndPosition
+
+ property bool hasAttachment: false
+ property url attachmentPath
+
+ padding: 0
+
+ background: Rectangle {
+ color: Kirigami.Theme.backgroundColor
+ Kirigami.Separator {
+ Rectangle {
+ anchors.fill: parent
+ color: Kirigami.Theme.focusColor
+ }
+ anchors {
+ left: parent.left
+ right: parent.right
+ top: parent.top
+ }
+ }
+ }
+
+ contentItem: ColumnLayout {
+ spacing: 0
+
+ RowLayout {
+ Layout.fillWidth: true
+ Layout.margins: 8
+
+ id: replyItem
+
+ visible: false
+
+ spacing: 8
+
+ Control {
+ Layout.alignment: Qt.AlignTop
+
+ padding: 4
+
+ contentItem: RowLayout {
+ Kirigami.Avatar {
+ Layout.preferredWidth: 24
+ Layout.preferredHeight: 24
+
+ source: replyUser ? "image://mxc/" + replyUser.avatarMediaId: ""
+ name: replyUser ? replyUser.displayName : "No name"
+ }
+
+ Label {
+ Layout.alignment: Qt.AlignVCenter
+ text: replyUser ? replyUser.displayName : "No name"
+ rightPadding: 8
+ }
+ }
+ }
+
+ TextEdit {
+ Layout.fillWidth: true
+
+ text: "" + replyContent
+
+ selectByMouse: true
+ readOnly: true
+ wrapMode: Label.Wrap
+ selectedTextColor: "white"
+ textFormat: Text.RichText
+ }
+ }
+
+ EmojiPicker {
+ Layout.fillWidth: true
+
+ id: emojiPicker
+
+ visible: false
+
+ textArea: inputField
+ emojiModel: EmojiModel { id: emojiModel }
+ }
+
+ ListView {
+ Layout.fillWidth: true
+ Layout.preferredHeight: 36
+ Layout.margins: 8
+
+ id: autoCompleteListView
+
+ visible: false
+
+ model: autoCompleteModel
+
+ clip: true
+ spacing: 4
+ orientation: ListView.Horizontal
+ highlightFollowsCurrentItem: true
+ keyNavigationWraps: true
+
+ delegate: Control {
+ property string autoCompleteText: modelData.displayName ?? modelData.unicode
+ property bool isEmoji: modelData.unicode != null
+ readonly property bool highlighted: autoCompleteListView.currentIndex == index
+
+ height: 36
+ padding: 6
+
+ background: Rectangle {
+ visible: !isEmoji
+ color: highlighted ? border.color : "transparent"
+ border.color: isEmoji ? MPalette.accent : modelData.color
+ border.width: 2
+ radius: height / 2
+ }
+
+ contentItem: RowLayout {
+ spacing: 6
+
+ Text {
+ width: 24
+ height: 24
+ visible: isEmoji
+ text: autoCompleteText
+ font.pixelSize: 24
+ font.family: "Emoji"
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ }
+
+ Kirigami.Avatar {
+ Layout.preferredWidth: 24
+ Layout.preferredHeight: 24
+
+ source: modelData.avatarMediaId ? "image://mxc/" + modelData.avatarMediaId : ""
+ color: modelData.color ? Qt.darker(modelData.color, 1.1) : null
+ }
+ Label {
+ Layout.fillHeight: true
+
+ visible: !isEmoji
+ text: autoCompleteText
+ color: highlighted ? Kirigami.Theme.highlightTextColor : Kirigami.Theme.textColor
+ verticalAlignment: Text.AlignVCenter
+ rightPadding: 8
+ }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ autoCompleteListView.currentIndex = index
+ inputField.replaceAutoComplete(autoCompleteText)
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ Layout.fillWidth: true
+ Layout.preferredHeight: 1
+ Layout.leftMargin: 12
+ Layout.rightMargin: 12
+
+ visible: emojiPicker.visible || replyItem.visible || autoCompleteListView.visible
+ }
+
+ RowLayout {
+ Layout.fillWidth: true
+
+ spacing: 0
+
+ ToolButton {
+ id: uploadButton
+
+ Layout.preferredWidth: 48
+ Layout.preferredHeight: 48
+ Layout.alignment: Qt.AlignBottom
+
+ visible: !isReply && !hasAttachment
+
+ icon.name: "mail-attachment"
+
+ onClicked: {
+ if (Clipboard.hasImage) {
+ attachDialog.open()
+ } else {
+ var fileDialog = openFileDialog.createObject(ApplicationWindow.overlay)
+
+ fileDialog.chosen.connect(function(path) {
+ if (!path) return
+
+ root.attach(path)
+ })
+
+ fileDialog.open()
+ }
+ }
+
+ BusyIndicator {
+ anchors.fill: parent
+
+ running: currentRoom && currentRoom.hasFileUploading
+ }
+ }
+
+ ToolButton {
+ Layout.preferredWidth: 48
+ Layout.preferredHeight: 48
+ Layout.alignment: Qt.AlignBottom
+
+ id: cancelReplyButton
+
+ visible: isReply
+
+ icon.name: "dialog-cancel"
+
+ onClicked: clearReply()
+ }
+
+ Control {
+ Layout.margins: 6
+ Layout.preferredHeight: 36
+ Layout.alignment: Qt.AlignVCenter
+
+ visible: hasAttachment
+
+ rightPadding: 8
+
+ contentItem: RowLayout {
+ spacing: 0
+
+ ToolButton {
+ Layout.preferredWidth: height
+ Layout.fillHeight: true
+
+ id: cancelAttachmentButton
+
+ icon.name: "dialog-cancel"
+
+ onClicked: {
+ hasAttachment = false;
+ attachmentPath = "";
+ }
+ }
+
+ Label {
+ Layout.alignment: Qt.AlignVCenter
+
+ text: attachmentPath !== "" ? attachmentPath.toString().substring(attachmentPath.toString().lastIndexOf('/') + 1, attachmentPath.length) : ""
+ }
+ }
+ }
+
+ TextArea {
+ property real progress: 0
+
+ Layout.fillWidth: true
+ Layout.minimumHeight: 48
+
+ id: inputField
+
+ wrapMode: Text.Wrap
+ placeholderText: "Send a Message"
+ topPadding: 0
+ bottomPadding: 0
+ selectByMouse: true
+ verticalAlignment: TextEdit.AlignVCenter
+
+ text: currentRoom != null ? currentRoom.cachedInput : ""
+
+ background: Item {}
+
+ Rectangle {
+ width: currentRoom && currentRoom.hasFileUploading ? parent.width * currentRoom.fileUploadingProgress / 100 : 0
+ height: parent.height
+
+ opacity: 0.2
+ }
+
+ Timer {
+ id: timeoutTimer
+
+ repeat: false
+ interval: 2000
+ onTriggered: {
+ repeatTimer.stop()
+ currentRoom.sendTypingNotification(false)
+ }
+ }
+
+ Timer {
+ id: repeatTimer
+
+ repeat: true
+ interval: 5000
+ triggeredOnStart: true
+ onTriggered: currentRoom.sendTypingNotification(true)
+ }
+
+ Keys.onReturnPressed: {
+ if (event.modifiers & Qt.ShiftModifier) {
+ insert(cursorPosition, "\n")
+ } else {
+ postMessage(text)
+ text = ""
+ clearReply()
+ closeAll()
+ }
+ }
+
+ Keys.onEscapePressed: closeAll()
+
+ Keys.onBacktabPressed: if (isAutoCompleting) autoCompleteListView.decrementCurrentIndex()
+
+ 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
+ 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
+ }
+ }
+
+ function replaceAutoComplete(word) {
+ remove(autoCompleteBeginPosition, autoCompleteEndPosition)
+ autoCompleteEndPosition = autoCompleteBeginPosition + word.length
+ insert(cursorPosition, word)
+ }
+
+ function postMessage(text) {
+ if(!currentRoom) { return }
+
+ if (hasAttachment) {
+ currentRoom.uploadFile(attachmentPath, text)
+ clearAttachment()
+ return
+ }
+
+ if (text.trim().length === 0) { return }
+
+ var PREFIX_ME = '/me '
+ var PREFIX_NOTICE = '/notice '
+ var PREFIX_RAINBOW = '/rainbow '
+
+ var messageEventType = RoomMessageEvent.Text
+
+ 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, replyEventID)
+ return
+ }
+
+ if (text.indexOf(PREFIX_ME) === 0) {
+ text = text.substr(PREFIX_ME.length)
+ messageEventType = RoomMessageEvent.Emote
+ } else if (text.indexOf(PREFIX_NOTICE) === 0) {
+ text = text.substr(PREFIX_NOTICE.length)
+ messageEventType = RoomMessageEvent.Notice
+ }
+
+ console.log(replyContent, replyUser, replyEventID, messageEventType);
+ currentRoom.postArbitaryMessage(text, messageEventType, replyEventID)
+ }
+ }
+
+ ToolButton {
+ Layout.preferredWidth: 48
+ Layout.preferredHeight: 48
+ Layout.alignment: Qt.AlignBottom
+
+ id: emojiButton
+ icon.name: "preferences-desktop-emoticons"
+
+ onClicked: emojiPicker.visible = !emojiPicker.visible
+ }
+ }
+ }
+
+ function insert(str) {
+ inputField.insert(inputField.cursorPosition, str)
+ }
+
+ function clear() {
+ inputField.clear()
+ }
+
+ function clearReply() {
+ isReply = false
+ replyUser = null;
+ replyContent = "";
+ replyEventID = ""
+ }
+
+ function focus() {
+ inputField.forceActiveFocus()
+ }
+
+ function closeAll() {
+ replyItem.visible = false
+ autoCompleteListView.visible = false
+ emojiPicker.visible = false
+ }
+
+ function attach(localPath) {
+ hasAttachment = true
+ attachmentPath = localPath
+ }
+
+ function clearAttachment() {
+ hasAttachment = false
+ attachmentPath = ""
+ }
+}
diff --git a/imports/Spectral/Component/Emoji/EmojiPicker.qml b/imports/NeoChat/Component/Emoji/EmojiPicker.qml
similarity index 97%
rename from imports/Spectral/Component/Emoji/EmojiPicker.qml
rename to imports/NeoChat/Component/Emoji/EmojiPicker.qml
index f82f821cf..5fdc76f0b 100644
--- a/imports/Spectral/Component/Emoji/EmojiPicker.qml
+++ b/imports/NeoChat/Component/Emoji/EmojiPicker.qml
@@ -3,10 +3,10 @@ import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtQuick.Controls.Material 2.12
-import Spectral.Component 2.0
+import NeoChat.Component 2.0
-import Spectral 0.1
-import Spectral.Setting 0.1
+import org.kde.neochat 0.1
+import NeoChat.Setting 0.1
ColumnLayout {
property string emojiCategory: "history"
diff --git a/imports/Spectral/Component/Emoji/qmldir b/imports/NeoChat/Component/Emoji/qmldir
similarity index 50%
rename from imports/Spectral/Component/Emoji/qmldir
rename to imports/NeoChat/Component/Emoji/qmldir
index d16a01e2f..7ae231ee9 100644
--- a/imports/Spectral/Component/Emoji/qmldir
+++ b/imports/NeoChat/Component/Emoji/qmldir
@@ -1,2 +1,2 @@
-module Spectral.Component.Emoji
+module NeoChat.Component.Emoji
EmojiPicker 2.0 EmojiPicker.qml
diff --git a/imports/Spectral/Component/FullScreenImage.qml b/imports/NeoChat/Component/FullScreenImage.qml
similarity index 100%
rename from imports/Spectral/Component/FullScreenImage.qml
rename to imports/NeoChat/Component/FullScreenImage.qml
diff --git a/imports/Spectral/Component/ScrollHelper.qml b/imports/NeoChat/Component/ScrollHelper.qml
similarity index 100%
rename from imports/Spectral/Component/ScrollHelper.qml
rename to imports/NeoChat/Component/ScrollHelper.qml
diff --git a/imports/Spectral/Component/Timeline/AudioDelegate.qml b/imports/NeoChat/Component/Timeline/AudioDelegate.qml
similarity index 97%
rename from imports/Spectral/Component/Timeline/AudioDelegate.qml
rename to imports/NeoChat/Component/Timeline/AudioDelegate.qml
index f868d1c61..3dc0cce90 100644
--- a/imports/Spectral/Component/Timeline/AudioDelegate.qml
+++ b/imports/NeoChat/Component/Timeline/AudioDelegate.qml
@@ -6,13 +6,13 @@ import Qt.labs.platform 1.0 as Platform
import QtMultimedia 5.12
import org.kde.kirigami 2.13 as Kirigami
-import Spectral 0.1
-import Spectral.Setting 0.1
+import org.kde.neochat 0.1
+import NeoChat.Setting 0.1
-import Spectral.Component 2.0
-import Spectral.Dialog 2.0
-import Spectral.Menu.Timeline 2.0
-import Spectral.Effect 2.0
+import NeoChat.Component 2.0
+import NeoChat.Dialog 2.0
+import NeoChat.Menu.Timeline 2.0
+import NeoChat.Effect 2.0
RowLayout {
readonly property bool avatarVisible: !sentByMe && showAuthor
diff --git a/imports/Spectral/Component/Timeline/FileDelegate.qml b/imports/NeoChat/Component/Timeline/FileDelegate.qml
similarity index 97%
rename from imports/Spectral/Component/Timeline/FileDelegate.qml
rename to imports/NeoChat/Component/Timeline/FileDelegate.qml
index 73c8ce94e..bbc07b460 100644
--- a/imports/Spectral/Component/Timeline/FileDelegate.qml
+++ b/imports/NeoChat/Component/Timeline/FileDelegate.qml
@@ -6,13 +6,13 @@ import QtGraphicalEffects 1.0
import Qt.labs.platform 1.0 as Platform
import org.kde.kirigami 2.13 as Kirigami
-import Spectral 0.1
-import Spectral.Setting 0.1
+import org.kde.neochat 0.1
+import NeoChat.Setting 0.1
-import Spectral.Component 2.0
-import Spectral.Dialog 2.0
-import Spectral.Menu.Timeline 2.0
-import Spectral.Effect 2.0
+import NeoChat.Component 2.0
+import NeoChat.Dialog 2.0
+import NeoChat.Menu.Timeline 2.0
+import NeoChat.Effect 2.0
RowLayout {
readonly property bool avatarVisible: !sentByMe && showAuthor
diff --git a/imports/Spectral/Component/Timeline/ImageDelegate.qml b/imports/NeoChat/Component/Timeline/ImageDelegate.qml
similarity index 96%
rename from imports/Spectral/Component/Timeline/ImageDelegate.qml
rename to imports/NeoChat/Component/Timeline/ImageDelegate.qml
index eaef076ce..c9a697643 100644
--- a/imports/Spectral/Component/Timeline/ImageDelegate.qml
+++ b/imports/NeoChat/Component/Timeline/ImageDelegate.qml
@@ -4,13 +4,13 @@ import QtQuick.Layouts 1.12
import QtGraphicalEffects 1.0
import Qt.labs.platform 1.0 as Platform
-import Spectral 0.1
-import Spectral.Setting 0.1
+import org.kde.neochat 0.1
+import NeoChat.Setting 0.1
-import Spectral.Component 2.0
-import Spectral.Dialog 2.0
-import Spectral.Menu.Timeline 2.0
-import Spectral.Effect 2.0
+import NeoChat.Component 2.0
+import NeoChat.Dialog 2.0
+import NeoChat.Menu.Timeline 2.0
+import NeoChat.Effect 2.0
Image {
readonly property bool isAnimated: contentType === "image/gif"
diff --git a/imports/Spectral/Component/Timeline/MessageDelegate.qml b/imports/NeoChat/Component/Timeline/MessageDelegate.qml
similarity index 97%
rename from imports/Spectral/Component/Timeline/MessageDelegate.qml
rename to imports/NeoChat/Component/Timeline/MessageDelegate.qml
index 29e67b0b1..0ccae8577 100644
--- a/imports/Spectral/Component/Timeline/MessageDelegate.qml
+++ b/imports/NeoChat/Component/Timeline/MessageDelegate.qml
@@ -11,9 +11,9 @@ import QtGraphicalEffects 1.12
import org.kde.kirigami 2.13 as Kirigami
-import Spectral 0.1
-import Spectral.Setting 0.1
-import Spectral.Component 2.0
+import org.kde.neochat 0.1
+import NeoChat.Setting 0.1
+import NeoChat.Component 2.0
RowLayout {
default property alias innerObject : column.children
diff --git a/imports/Spectral/Component/Timeline/ReactionDelegate.qml b/imports/NeoChat/Component/Timeline/ReactionDelegate.qml
similarity index 100%
rename from imports/Spectral/Component/Timeline/ReactionDelegate.qml
rename to imports/NeoChat/Component/Timeline/ReactionDelegate.qml
diff --git a/imports/Spectral/Component/Timeline/SectionDelegate.qml b/imports/NeoChat/Component/Timeline/SectionDelegate.qml
similarity index 100%
rename from imports/Spectral/Component/Timeline/SectionDelegate.qml
rename to imports/NeoChat/Component/Timeline/SectionDelegate.qml
diff --git a/imports/Spectral/Component/Timeline/StateDelegate.qml b/imports/NeoChat/Component/Timeline/StateDelegate.qml
similarity index 92%
rename from imports/Spectral/Component/Timeline/StateDelegate.qml
rename to imports/NeoChat/Component/Timeline/StateDelegate.qml
index 4cb7f4ded..98be63fe4 100644
--- a/imports/Spectral/Component/Timeline/StateDelegate.qml
+++ b/imports/NeoChat/Component/Timeline/StateDelegate.qml
@@ -4,10 +4,10 @@ import QtQuick.Layouts 1.12
import QtQuick.Controls.Material 2.12
import org.kde.kirigami 2.13 as Kirigami
-import Spectral.Component 2.0
-import Spectral.Dialog 2.0
-import Spectral.Effect 2.0
-import Spectral.Setting 0.1
+import NeoChat.Component 2.0
+import NeoChat.Dialog 2.0
+import NeoChat.Effect 2.0
+import NeoChat.Setting 0.1
RowLayout {
id: row
diff --git a/imports/Spectral/Component/Timeline/TextDelegate.qml b/imports/NeoChat/Component/Timeline/TextDelegate.qml
similarity index 100%
rename from imports/Spectral/Component/Timeline/TextDelegate.qml
rename to imports/NeoChat/Component/Timeline/TextDelegate.qml
diff --git a/imports/Spectral/Component/Timeline/TimelineContainer.qml b/imports/NeoChat/Component/Timeline/TimelineContainer.qml
similarity index 100%
rename from imports/Spectral/Component/Timeline/TimelineContainer.qml
rename to imports/NeoChat/Component/Timeline/TimelineContainer.qml
diff --git a/imports/Spectral/Component/Timeline/VideoDelegate.qml b/imports/NeoChat/Component/Timeline/VideoDelegate.qml
similarity index 97%
rename from imports/Spectral/Component/Timeline/VideoDelegate.qml
rename to imports/NeoChat/Component/Timeline/VideoDelegate.qml
index 3967d875e..3b5c3a986 100644
--- a/imports/Spectral/Component/Timeline/VideoDelegate.qml
+++ b/imports/NeoChat/Component/Timeline/VideoDelegate.qml
@@ -7,14 +7,14 @@ import QtMultimedia 5.12
import Qt.labs.platform 1.0 as Platform
import org.kde.kirigami 2.13 as Kirigami
-import Spectral 0.1
-import Spectral.Setting 0.1
+import org.kde.neochat 0.1
+import NeoChat.Setting 0.1
-import Spectral.Component 2.0
-import Spectral.Dialog 2.0
-import Spectral.Menu.Timeline 2.0
-import Spectral.Effect 2.0
-import Spectral.Font 0.1
+import NeoChat.Component 2.0
+import NeoChat.Dialog 2.0
+import NeoChat.Menu.Timeline 2.0
+import NeoChat.Effect 2.0
+import NeoChat.Font 0.1
RowLayout {
readonly property bool avatarVisible: showAuthor && !sentByMe
diff --git a/imports/Spectral/Component/Timeline/qmldir b/imports/NeoChat/Component/Timeline/qmldir
similarity index 91%
rename from imports/Spectral/Component/Timeline/qmldir
rename to imports/NeoChat/Component/Timeline/qmldir
index 95d71ccec..a7143fbf4 100644
--- a/imports/Spectral/Component/Timeline/qmldir
+++ b/imports/NeoChat/Component/Timeline/qmldir
@@ -1,4 +1,4 @@
-module Spectral.Component.Timeline
+module NeoChat.Component.Timeline
TimelineContainer 2.0 TimelineContainer.qml
MessageDelegate 2.0 MessageDelegate.qml
TextDelegate 2.0 TextDelegate.qml
diff --git a/imports/Spectral/Component/qmldir b/imports/NeoChat/Component/qmldir
similarity index 82%
rename from imports/Spectral/Component/qmldir
rename to imports/NeoChat/Component/qmldir
index 4ec3b1ecd..8234dc66b 100644
--- a/imports/Spectral/Component/qmldir
+++ b/imports/NeoChat/Component/qmldir
@@ -1,4 +1,4 @@
-module Spectral.Component
+module NeoChat.Component
AutoMouseArea 2.0 AutoMouseArea.qml
MaterialIcon 2.0 MaterialIcon.qml
SideNavButton 2.0 SideNavButton.qml
@@ -7,3 +7,4 @@ AutoListView 2.0 AutoListView.qml
AutoTextField 2.0 AutoTextField.qml
FullScreenImage 2.0 FullScreenImage.qml
AutoRectangle 2.0 AutoRectangle.qml
+ChatTextInput 2.0 ChatTextInput.qml
diff --git a/imports/Spectral/Dialog/AcceptInvitationDialog.qml b/imports/NeoChat/Dialog/AcceptInvitationDialog.qml
similarity index 100%
rename from imports/Spectral/Dialog/AcceptInvitationDialog.qml
rename to imports/NeoChat/Dialog/AcceptInvitationDialog.qml
diff --git a/imports/Spectral/Dialog/AccountDetailDialog.qml b/imports/NeoChat/Dialog/AccountDetailDialog.qml
similarity index 98%
rename from imports/Spectral/Dialog/AccountDetailDialog.qml
rename to imports/NeoChat/Dialog/AccountDetailDialog.qml
index f7d1bccd5..bdbd685ab 100644
--- a/imports/Spectral/Dialog/AccountDetailDialog.qml
+++ b/imports/NeoChat/Dialog/AccountDetailDialog.qml
@@ -3,11 +3,11 @@ import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import org.kde.kirigami 2.13 as Kirigami
-import Spectral.Component 2.0
-import Spectral.Effect 2.0
+import NeoChat.Component 2.0
+import NeoChat.Effect 2.0
-import Spectral 0.1
-import Spectral.Setting 0.1
+import org.kde.neochat 0.1
+import NeoChat.Setting 0.1
Dialog {
anchors.centerIn: parent
diff --git a/imports/Spectral/Dialog/CreateRoomDialog.qml b/imports/NeoChat/Dialog/CreateRoomDialog.qml
similarity index 92%
rename from imports/Spectral/Dialog/CreateRoomDialog.qml
rename to imports/NeoChat/Dialog/CreateRoomDialog.qml
index 6c29f8a2f..5bf70ed2f 100644
--- a/imports/Spectral/Dialog/CreateRoomDialog.qml
+++ b/imports/NeoChat/Dialog/CreateRoomDialog.qml
@@ -2,9 +2,9 @@ import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
-import Spectral.Component 2.0
+import NeoChat.Component 2.0
-import Spectral 0.1
+import org.kde.neochat 0.1
Dialog {
anchors.centerIn: parent
diff --git a/imports/Spectral/Dialog/FontFamilyDialog.qml b/imports/NeoChat/Dialog/FontFamilyDialog.qml
similarity index 89%
rename from imports/Spectral/Dialog/FontFamilyDialog.qml
rename to imports/NeoChat/Dialog/FontFamilyDialog.qml
index 7fda066ea..e56a40724 100644
--- a/imports/Spectral/Dialog/FontFamilyDialog.qml
+++ b/imports/NeoChat/Dialog/FontFamilyDialog.qml
@@ -2,8 +2,8 @@ import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
-import Spectral.Component 2.0
-import Spectral.Setting 0.1
+import NeoChat.Component 2.0
+import NeoChat.Setting 0.1
Dialog {
anchors.centerIn: parent
diff --git a/imports/Spectral/Dialog/InviteUserDialog.qml b/imports/NeoChat/Dialog/InviteUserDialog.qml
similarity index 97%
rename from imports/Spectral/Dialog/InviteUserDialog.qml
rename to imports/NeoChat/Dialog/InviteUserDialog.qml
index 708ab84eb..f9556936b 100644
--- a/imports/Spectral/Dialog/InviteUserDialog.qml
+++ b/imports/NeoChat/Dialog/InviteUserDialog.qml
@@ -3,11 +3,11 @@ import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import org.kde.kirigami 2.13 as Kirigami
-import Spectral.Component 2.0
-import Spectral.Effect 2.0
-import Spectral.Setting 0.1
+import NeoChat.Component 2.0
+import NeoChat.Effect 2.0
+import NeoChat.Setting 0.1
-import Spectral 0.1
+import org.kde.neochat 0.1
Dialog {
property var room
diff --git a/imports/Spectral/Dialog/JoinRoomDialog.qml b/imports/NeoChat/Dialog/JoinRoomDialog.qml
similarity index 98%
rename from imports/Spectral/Dialog/JoinRoomDialog.qml
rename to imports/NeoChat/Dialog/JoinRoomDialog.qml
index e642d0920..3f7feae02 100644
--- a/imports/Spectral/Dialog/JoinRoomDialog.qml
+++ b/imports/NeoChat/Dialog/JoinRoomDialog.qml
@@ -3,11 +3,11 @@ import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import org.kde.kirigami 2.13 as Kirigami
-import Spectral.Component 2.0
-import Spectral.Effect 2.0
-import Spectral.Setting 0.1
+import NeoChat.Component 2.0
+import NeoChat.Effect 2.0
+import NeoChat.Setting 0.1
-import Spectral 0.1
+import org.kde.neochat 0.1
Dialog {
property var connection
diff --git a/imports/Spectral/Dialog/MessageSourceDialog.qml b/imports/NeoChat/Dialog/MessageSourceDialog.qml
similarity index 100%
rename from imports/Spectral/Dialog/MessageSourceDialog.qml
rename to imports/NeoChat/Dialog/MessageSourceDialog.qml
diff --git a/imports/Spectral/Dialog/OpenFileDialog.qml b/imports/NeoChat/Dialog/OpenFileDialog.qml
similarity index 100%
rename from imports/Spectral/Dialog/OpenFileDialog.qml
rename to imports/NeoChat/Dialog/OpenFileDialog.qml
diff --git a/imports/Spectral/Dialog/OpenFolderDialog.qml b/imports/NeoChat/Dialog/OpenFolderDialog.qml
similarity index 100%
rename from imports/Spectral/Dialog/OpenFolderDialog.qml
rename to imports/NeoChat/Dialog/OpenFolderDialog.qml
diff --git a/imports/Spectral/Dialog/RoomSettingsDialog.qml b/imports/NeoChat/Dialog/RoomSettingsDialog.qml
similarity index 98%
rename from imports/Spectral/Dialog/RoomSettingsDialog.qml
rename to imports/NeoChat/Dialog/RoomSettingsDialog.qml
index 3b97659bf..cf22a355f 100644
--- a/imports/Spectral/Dialog/RoomSettingsDialog.qml
+++ b/imports/NeoChat/Dialog/RoomSettingsDialog.qml
@@ -3,11 +3,11 @@ import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import org.kde.kirigami 2.13 as Kirigami
-import Spectral.Component 2.0
-import Spectral.Effect 2.0
-import Spectral.Setting 0.1
+import NeoChat.Component 2.0
+import NeoChat.Effect 2.0
+import NeoChat.Setting 0.1
-import Spectral 0.1
+import org.kde.neochat 0.1
Dialog {
property var room
diff --git a/imports/Spectral/Dialog/StartChatDialog.qml b/imports/NeoChat/Dialog/StartChatDialog.qml
similarity index 97%
rename from imports/Spectral/Dialog/StartChatDialog.qml
rename to imports/NeoChat/Dialog/StartChatDialog.qml
index 481c7c14d..dd07c73de 100644
--- a/imports/Spectral/Dialog/StartChatDialog.qml
+++ b/imports/NeoChat/Dialog/StartChatDialog.qml
@@ -2,11 +2,11 @@ import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
-import Spectral.Component 2.0
-import Spectral.Effect 2.0
-import Spectral.Setting 0.1
+import NeoChat.Component 2.0
+import NeoChat.Effect 2.0
+import NeoChat.Setting 0.1
-import Spectral 0.1
+import org.kde.neochat 0.1
Dialog {
property var connection
diff --git a/imports/Spectral/Dialog/UserDetailDialog.qml b/imports/NeoChat/Dialog/UserDetailDialog.qml
similarity index 97%
rename from imports/Spectral/Dialog/UserDetailDialog.qml
rename to imports/NeoChat/Dialog/UserDetailDialog.qml
index d4260ed27..835245bd7 100644
--- a/imports/Spectral/Dialog/UserDetailDialog.qml
+++ b/imports/NeoChat/Dialog/UserDetailDialog.qml
@@ -3,9 +3,9 @@ import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import org.kde.kirigami 2.13 as Kirigami
-import Spectral.Component 2.0
-import Spectral.Effect 2.0
-import Spectral.Setting 0.1
+import NeoChat.Component 2.0
+import NeoChat.Effect 2.0
+import NeoChat.Setting 0.1
Dialog {
property var room
diff --git a/imports/Spectral/Dialog/qmldir b/imports/NeoChat/Dialog/qmldir
similarity index 96%
rename from imports/Spectral/Dialog/qmldir
rename to imports/NeoChat/Dialog/qmldir
index 70ca5b9e6..1c69fde11 100644
--- a/imports/Spectral/Dialog/qmldir
+++ b/imports/NeoChat/Dialog/qmldir
@@ -1,4 +1,4 @@
-module Spectral.Dialog
+module NeoChat.Dialog
RoomSettingsDialog 2.0 RoomSettingsDialog.qml
UserDetailDialog 2.0 UserDetailDialog.qml
MessageSourceDialog 2.0 MessageSourceDialog.qml
diff --git a/imports/Spectral/Effect/CircleMask.qml b/imports/NeoChat/Effect/CircleMask.qml
similarity index 100%
rename from imports/Spectral/Effect/CircleMask.qml
rename to imports/NeoChat/Effect/CircleMask.qml
diff --git a/imports/Spectral/Effect/ElevationEffect.qml b/imports/NeoChat/Effect/ElevationEffect.qml
similarity index 100%
rename from imports/Spectral/Effect/ElevationEffect.qml
rename to imports/NeoChat/Effect/ElevationEffect.qml
diff --git a/imports/Spectral/Effect/RippleEffect.qml b/imports/NeoChat/Effect/RippleEffect.qml
similarity index 99%
rename from imports/Spectral/Effect/RippleEffect.qml
rename to imports/NeoChat/Effect/RippleEffect.qml
index 33a002f59..eff782b2b 100644
--- a/imports/Spectral/Effect/RippleEffect.qml
+++ b/imports/NeoChat/Effect/RippleEffect.qml
@@ -2,8 +2,8 @@ import QtQuick 2.12
import QtQuick.Controls 2.12
import QtGraphicalEffects 1.0
-import Spectral.Component 2.0
-import Spectral.Setting 0.1
+import NeoChat.Component 2.0
+import NeoChat.Setting 0.1
AutoMouseArea {
id: ripple
diff --git a/imports/Spectral/Effect/qmldir b/imports/NeoChat/Effect/qmldir
similarity index 76%
rename from imports/Spectral/Effect/qmldir
rename to imports/NeoChat/Effect/qmldir
index 89f10e489..deab3499d 100644
--- a/imports/Spectral/Effect/qmldir
+++ b/imports/NeoChat/Effect/qmldir
@@ -1,3 +1,3 @@
-module Spectral.Effect
+module NeoChat.Effect
ElevationEffect 2.0 ElevationEffect.qml
RippleEffect 2.0 RippleEffect.qml
diff --git a/imports/NeoChat/Menu/RoomListContextMenu.qml b/imports/NeoChat/Menu/RoomListContextMenu.qml
new file mode 100644
index 000000000..79a6226e7
--- /dev/null
+++ b/imports/NeoChat/Menu/RoomListContextMenu.qml
@@ -0,0 +1,47 @@
+/**
+ * SPDX-FileCopyrightText: 2019 Black Hat
+ * SPDX-FileCopyrightText: 2020 Carl Schwan
+ *
+ * SPDX-LicenseIdentifier: GPL-3.0-only
+ */
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+
+/**
+ * Context menu when clicking on a room in the room list
+ */
+Menu {
+ id: root
+ property var room
+
+ MenuItem {
+ text: i18n("Favourite")
+ checkable: true
+ checked: room.isFavourite
+
+ onTriggered: room.isFavourite ? room.removeTag("m.favourite") : room.addTag("m.favourite", 1.0)
+ }
+
+ MenuItem {
+ text: i18n("Deprioritize")
+ checkable: true
+ checked: room.isLowPriority
+
+ onTriggered: room.isLowPriority ? room.removeTag("m.lowpriority") : room.addTag("m.lowpriority", 1.0)
+ }
+
+ MenuSeparator {}
+
+ MenuItem {
+ text: i18n("Mark as Read")
+
+ onTriggered: room.markAllMessagesAsRead()
+ }
+
+ MenuItem {
+ text: i18n("Leave Room")
+ onTriggered: room.forget()
+ }
+
+ onClosed: destroy()
+}
diff --git a/imports/Spectral/Menu/Timeline/FileDelegateContextMenu.qml b/imports/NeoChat/Menu/Timeline/FileDelegateContextMenu.qml
similarity index 95%
rename from imports/Spectral/Menu/Timeline/FileDelegateContextMenu.qml
rename to imports/NeoChat/Menu/Timeline/FileDelegateContextMenu.qml
index 650e57381..cb1ba3ae8 100644
--- a/imports/Spectral/Menu/Timeline/FileDelegateContextMenu.qml
+++ b/imports/NeoChat/Menu/Timeline/FileDelegateContextMenu.qml
@@ -1,7 +1,7 @@
import QtQuick 2.12
import QtQuick.Controls 2.12
-import Spectral.Dialog 2.0
+import NeoChat.Dialog 2.0
Menu {
signal viewSource()
diff --git a/imports/Spectral/Menu/Timeline/MessageDelegateContextMenu.qml b/imports/NeoChat/Menu/Timeline/MessageDelegateContextMenu.qml
similarity index 99%
rename from imports/Spectral/Menu/Timeline/MessageDelegateContextMenu.qml
rename to imports/NeoChat/Menu/Timeline/MessageDelegateContextMenu.qml
index 7d31e4aa5..0f248db6d 100644
--- a/imports/Spectral/Menu/Timeline/MessageDelegateContextMenu.qml
+++ b/imports/NeoChat/Menu/Timeline/MessageDelegateContextMenu.qml
@@ -9,7 +9,7 @@ import QtQuick.Controls 2.12 as QQC2
import QtQuick.Layouts 1.12
import org.kde.kirigami 2.13 as Kirigami
-import Spectral.Dialog 2.0
+import NeoChat.Dialog 2.0
Kirigami.OverlaySheet {
id: root
diff --git a/imports/Spectral/Menu/Timeline/qmldir b/imports/NeoChat/Menu/Timeline/qmldir
similarity index 79%
rename from imports/Spectral/Menu/Timeline/qmldir
rename to imports/NeoChat/Menu/Timeline/qmldir
index 20b869c17..0dd1e97bd 100644
--- a/imports/Spectral/Menu/Timeline/qmldir
+++ b/imports/NeoChat/Menu/Timeline/qmldir
@@ -1,3 +1,3 @@
-module Spectral.Menu.Timeline
+module NeoChat.Menu.Timeline
MessageDelegateContextMenu 2.0 MessageDelegateContextMenu.qml
FileDelegateContextMenu 2.0 FileDelegateContextMenu.qml
diff --git a/imports/Spectral/Menu/qmldir b/imports/NeoChat/Menu/qmldir
similarity index 69%
rename from imports/Spectral/Menu/qmldir
rename to imports/NeoChat/Menu/qmldir
index c52d0fd48..5e9d0448a 100644
--- a/imports/Spectral/Menu/qmldir
+++ b/imports/NeoChat/Menu/qmldir
@@ -1,2 +1,2 @@
-module Spectral.Menu
+module NeoChat.Menu
RoomListContextMenu 2.0 RoomListContextMenu.qml
diff --git a/qml/AccountsPage.qml b/imports/NeoChat/Page/AccountsPage.qml
similarity index 99%
rename from qml/AccountsPage.qml
rename to imports/NeoChat/Page/AccountsPage.qml
index b9ef2fa88..80d378a06 100644
--- a/qml/AccountsPage.qml
+++ b/imports/NeoChat/Page/AccountsPage.qml
@@ -10,7 +10,7 @@ import QtQuick.Layouts 1.14
import org.kde.kirigami 2.12 as Kirigami
-import Spectral 0.1
+import NeoChat 0.1
Kirigami.ScrollablePage {
title: i18n("Accounts")
diff --git a/qml/LoadingPage.qml b/imports/NeoChat/Page/LoadingPage.qml
similarity index 100%
rename from qml/LoadingPage.qml
rename to imports/NeoChat/Page/LoadingPage.qml
diff --git a/qml/LoginPage.qml b/imports/NeoChat/Page/LoginPage.qml
similarity index 97%
rename from qml/LoginPage.qml
rename to imports/NeoChat/Page/LoginPage.qml
index 230b0826d..22d43d764 100644
--- a/qml/LoginPage.qml
+++ b/imports/NeoChat/Page/LoginPage.qml
@@ -8,9 +8,9 @@ import QtQuick 2.12
import QtQuick.Controls 2.12 as QQC2
import QtQuick.Layouts 1.12
-import Spectral 0.1
+import NeoChat 0.1
-import Spectral.Component 2.0
+import NeoChat.Component 2.0
import org.kde.kirigami 2.12 as Kirigami
diff --git a/qml/RoomListPage.qml b/imports/NeoChat/Page/RoomListPage.qml
similarity index 98%
rename from qml/RoomListPage.qml
rename to imports/NeoChat/Page/RoomListPage.qml
index ef9c8a94f..ee361f253 100644
--- a/qml/RoomListPage.qml
+++ b/imports/NeoChat/Page/RoomListPage.qml
@@ -9,12 +9,11 @@ import QtQuick.Controls 2.12 as QQC2
import QtQuick.Layouts 1.12
import org.kde.kirigami 2.13 as Kirigami
-
import org.kde.kitemmodels 1.0
-import Spectral.Component 2.0
-import Spectral 0.1
+import org.kde.neochat 0.1
-import org.kde.neochat 1.0
+import NeoChat.Component 2.0
+import NeoChat.Menu 2.0
Kirigami.ScrollablePage {
id: page
diff --git a/qml/RoomPage.qml b/imports/NeoChat/Page/RoomPage.qml
similarity index 98%
rename from qml/RoomPage.qml
rename to imports/NeoChat/Page/RoomPage.qml
index dae2bb92c..a691af0f1 100644
--- a/qml/RoomPage.qml
+++ b/imports/NeoChat/Page/RoomPage.qml
@@ -6,14 +6,13 @@ import QtQuick.Controls.Material 2.12
import org.kde.kirigami 2.13 as Kirigami
import org.kde.kitemmodels 1.0
-import org.kde.neochat 1.0
+import org.kde.neochat 0.1
-import Spectral.Component 2.0
-import Spectral.Component.Timeline 2.0
-import Spectral.Dialog 2.0
-import Spectral.Effect 2.0
-import Spectral.Menu.Timeline 2.0
-import Spectral 0.1
+import NeoChat.Component 2.0
+import NeoChat.Component.Timeline 2.0
+import NeoChat.Dialog 2.0
+import NeoChat.Effect 2.0
+import NeoChat.Menu.Timeline 2.0
Kirigami.ScrollablePage {
id: page
diff --git a/imports/NeoChat/Page/qmldir b/imports/NeoChat/Page/qmldir
new file mode 100644
index 000000000..254dc858a
--- /dev/null
+++ b/imports/NeoChat/Page/qmldir
@@ -0,0 +1,5 @@
+module NeoChat.Page
+LoadingPage 2.0 LoadingPage.qml
+LoginPage 2.0 LoginPage.qml
+RoomListPage 2.0 RoomListPage.qml
+RoomPage 2.0 RoomPage.qml
diff --git a/imports/Spectral/Panel/SpectralSidebar.qml b/imports/NeoChat/Panel/NeoChatSidebar.qml
similarity index 77%
rename from imports/Spectral/Panel/SpectralSidebar.qml
rename to imports/NeoChat/Panel/NeoChatSidebar.qml
index 1eb4b93fa..59a32bd06 100644
--- a/imports/Spectral/Panel/SpectralSidebar.qml
+++ b/imports/NeoChat/Panel/NeoChatSidebar.qml
@@ -7,9 +7,9 @@ import org.kde.kirigami 2.12 as Kirigami
import SortFilterProxyModel 0.2
-import Spectral.Component 2.0
-import Spectral.Component.Timeline 2.0
-import Spectral 0.1
+import NeoChat.Component 2.0
+import NeoChat.Component.Timeline 2.0
+import org.kde.neochat 0.1
Kirigami.GlobalDrawer {
id: root
diff --git a/imports/Spectral/Panel/RoomDrawer.qml b/imports/NeoChat/Panel/RoomDrawer.qml
similarity index 97%
rename from imports/Spectral/Panel/RoomDrawer.qml
rename to imports/NeoChat/Panel/RoomDrawer.qml
index 6b43adf11..2655a68fd 100644
--- a/imports/Spectral/Panel/RoomDrawer.qml
+++ b/imports/NeoChat/Panel/RoomDrawer.qml
@@ -5,12 +5,12 @@ import QtQuick.Layouts 1.12
import org.kde.kirigami 2.13 as Kirigami
-import Spectral.Component 2.0
-import Spectral.Dialog 2.0
-import Spectral.Effect 2.0
-import Spectral.Setting 0.1
+import NeoChat.Component 2.0
+import NeoChat.Dialog 2.0
+import NeoChat.Effect 2.0
+import NeoChat.Setting 0.1
-import Spectral 0.1
+import org.kde.neochat 0.1
Kirigami.OverlayDrawer {
property var room
diff --git a/imports/Spectral/Panel/RoomHeader.qml b/imports/NeoChat/Panel/RoomHeader.qml
similarity index 90%
rename from imports/Spectral/Panel/RoomHeader.qml
rename to imports/NeoChat/Panel/RoomHeader.qml
index a682f6c3a..859953d76 100644
--- a/imports/Spectral/Panel/RoomHeader.qml
+++ b/imports/NeoChat/Panel/RoomHeader.qml
@@ -3,10 +3,10 @@ import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtQuick.Controls.Material 2.12
-import Spectral 0.1
-import Spectral.Effect 2.0
-import Spectral.Component 2.0
-import Spectral.Setting 0.1
+import org.kde.neochat 0.1
+import NeoChat.Effect 2.0
+import NeoChat.Component 2.0
+import NeoChat.Setting 0.1
Control {
signal clicked()
diff --git a/imports/Spectral/Panel/RoomListPanel.qml b/imports/NeoChat/Panel/RoomListPanel.qml
similarity index 98%
rename from imports/Spectral/Panel/RoomListPanel.qml
rename to imports/NeoChat/Panel/RoomListPanel.qml
index 6ea76bcb9..02325739a 100644
--- a/imports/Spectral/Panel/RoomListPanel.qml
+++ b/imports/NeoChat/Panel/RoomListPanel.qml
@@ -5,8 +5,8 @@ import QtQuick.Layouts 1.12
import org.kde.kirigami 2.13 as Kirigami
import org.kde.kitemmodels 1.0
-import Spectral.Component 2.0
-import Spectral 0.1
+import NeoChat.Component 2.0
+import org.kde.neochat 0.1
Kirigami.ScrollablePage {
id: page
diff --git a/imports/Spectral/Panel/qmldir b/imports/NeoChat/Panel/qmldir
similarity index 60%
rename from imports/Spectral/Panel/qmldir
rename to imports/NeoChat/Panel/qmldir
index b405d340d..fbe7adac8 100644
--- a/imports/Spectral/Panel/qmldir
+++ b/imports/NeoChat/Panel/qmldir
@@ -1,5 +1,5 @@
-module Spectral.Panel
+module NeoChat.Panel
RoomPanel 2.0 RoomPanel.qml
RoomListPanel 2.0 RoomListPanel.qml
RoomDrawer 2.0 RoomDrawer.qml
-SpectralSidebar 2.0 SpectralSidebar.qml
+NeoChatSidebar 2.0 NeoChatSidebar.qml
diff --git a/imports/Spectral/Setting/Palette.qml b/imports/NeoChat/Setting/Palette.qml
similarity index 100%
rename from imports/Spectral/Setting/Palette.qml
rename to imports/NeoChat/Setting/Palette.qml
diff --git a/imports/Spectral/Setting/Setting.qml b/imports/NeoChat/Setting/Setting.qml
similarity index 100%
rename from imports/Spectral/Setting/Setting.qml
rename to imports/NeoChat/Setting/Setting.qml
diff --git a/imports/Spectral/Setting/qmldir b/imports/NeoChat/Setting/qmldir
similarity index 74%
rename from imports/Spectral/Setting/qmldir
rename to imports/NeoChat/Setting/qmldir
index 2c923cd47..d20825b59 100644
--- a/imports/Spectral/Setting/qmldir
+++ b/imports/NeoChat/Setting/qmldir
@@ -1,3 +1,3 @@
-module Spectral.Setting
+module NeoChat.Setting
singleton MSettings 0.1 Setting.qml
singleton MPalette 0.1 Palette.qml
diff --git a/qml/main.qml b/qml/main.qml
index 216f9e84d..81f414dad 100644
--- a/qml/main.qml
+++ b/qml/main.qml
@@ -10,9 +10,10 @@ import QtQuick.Layouts 1.14
import org.kde.kirigami 2.12 as Kirigami
-import Spectral 0.1
-import Spectral.Component 2.0
-import Spectral.Panel 2.0
+import org.kde.neochat 0.1
+import NeoChat.Component 2.0
+import NeoChat.Panel 2.0
+import NeoChat.Page 2.0
Kirigami.ApplicationWindow {
id: root
diff --git a/res.qrc b/res.qrc
index a985eac07..295f6770c 100644
--- a/res.qrc
+++ b/res.qrc
@@ -1,62 +1,62 @@
- qml/main.qml
- qml/LoginPage.qml
- qml/LoadingPage.qml
- qml/RoomListPage.qml
- qml/RoomPage.qml
- qml/ChatTextInput.qml
- qml/RoomListContextMenu.qml
- qml/AccountsPage.qml
- imports/Spectral/Component/Emoji/EmojiPicker.qml
- imports/Spectral/Component/Emoji/qmldir
- imports/Spectral/Component/Timeline/MessageDelegate.qml
- imports/Spectral/Component/Timeline/qmldir
- imports/Spectral/Component/Timeline/StateDelegate.qml
- imports/Spectral/Component/AutoMouseArea.qml
- imports/Spectral/Component/qmldir
- imports/Spectral/Effect/ElevationEffect.qml
- imports/Spectral/Effect/qmldir
- assets/img/icon.png
- imports/Spectral/Setting/Setting.qml
- imports/Spectral/Setting/qmldir
- imports/Spectral/Panel/qmldir
- imports/Spectral/Panel/RoomDrawer.qml
- imports/Spectral/Panel/RoomHeader.qml
- imports/Spectral/Panel/SpectralSidebar.qml
- imports/Spectral/Component/ScrollHelper.qml
- imports/Spectral/Component/AutoListView.qml
- imports/Spectral/Component/AutoTextField.qml
- imports/Spectral/Component/Timeline/SectionDelegate.qml
assets/img/matrix.svg
- imports/Spectral/Effect/RippleEffect.qml
- imports/Spectral/Effect/CircleMask.qml
- imports/Spectral/Component/Timeline/ImageDelegate.qml
- imports/Spectral/Setting/Palette.qml
- imports/Spectral/Component/Timeline/FileDelegate.qml
- imports/Spectral/Component/FullScreenImage.qml
- imports/Spectral/Dialog/qmldir
- imports/Spectral/Dialog/RoomSettingsDialog.qml
- imports/Spectral/Dialog/UserDetailDialog.qml
- imports/Spectral/Dialog/MessageSourceDialog.qml
- imports/Spectral/Dialog/CreateRoomDialog.qml
- imports/Spectral/Dialog/JoinRoomDialog.qml
- imports/Spectral/Dialog/InviteUserDialog.qml
- imports/Spectral/Dialog/AcceptInvitationDialog.qml
- imports/Spectral/Menu/qmldir
- imports/Spectral/Menu/Timeline/qmldir
- imports/Spectral/Menu/Timeline/MessageDelegateContextMenu.qml
- imports/Spectral/Menu/Timeline/FileDelegateContextMenu.qml
- imports/Spectral/Dialog/FontFamilyDialog.qml
- imports/Spectral/Dialog/AccountDetailDialog.qml
- imports/Spectral/Dialog/OpenFileDialog.qml
- imports/Spectral/Dialog/OpenFolderDialog.qml
- imports/Spectral/Component/Timeline/VideoDelegate.qml
- imports/Spectral/Component/AutoRectangle.qml
- imports/Spectral/Component/Timeline/ReactionDelegate.qml
- imports/Spectral/Component/Timeline/AudioDelegate.qml
- imports/Spectral/Dialog/StartChatDialog.qml
- imports/Spectral/Component/Timeline/TextDelegate.qml
- imports/Spectral/Component/Timeline/TimelineContainer.qml
+ assets/img/icon.png
+ qml/main.qml
+ imports/NeoChat/Page/qmldir
+ imports/NeoChat/Page/LoginPage.qml
+ imports/NeoChat/Page/LoadingPage.qml
+ imports/NeoChat/Page/RoomListPage.qml
+ imports/NeoChat/Page/RoomPage.qml
+ imports/NeoChat/Component/qmldir
+ imports/NeoChat/Component/ChatTextInput.qml
+ imports/NeoChat/Component/AutoMouseArea.qml
+ imports/NeoChat/Component/ScrollHelper.qml
+ imports/NeoChat/Component/AutoListView.qml
+ imports/NeoChat/Component/AutoTextField.qml
+ imports/NeoChat/Component/AutoRectangle.qml
+ imports/NeoChat/Component/FullScreenImage.qml
+ imports/NeoChat/Component/Emoji/EmojiPicker.qml
+ imports/NeoChat/Component/Emoji/qmldir
+ imports/NeoChat/Component/Timeline/MessageDelegate.qml
+ imports/NeoChat/Component/Timeline/qmldir
+ imports/NeoChat/Component/Timeline/StateDelegate.qml
+ imports/NeoChat/Component/Timeline/TextDelegate.qml
+ imports/NeoChat/Component/Timeline/TimelineContainer.qml
+ imports/NeoChat/Component/Timeline/SectionDelegate.qml
+ imports/NeoChat/Component/Timeline/VideoDelegate.qml
+ imports/NeoChat/Component/Timeline/ReactionDelegate.qml
+ imports/NeoChat/Component/Timeline/AudioDelegate.qml
+ imports/NeoChat/Component/Timeline/FileDelegate.qml
+ imports/NeoChat/Component/Timeline/ImageDelegate.qml
+ imports/NeoChat/Setting/Setting.qml
+ imports/NeoChat/Setting/qmldir
+ imports/NeoChat/Setting/Palette.qml
+ imports/NeoChat/Panel/qmldir
+ imports/NeoChat/Panel/RoomDrawer.qml
+ imports/NeoChat/Panel/RoomHeader.qml
+ imports/NeoChat/Panel/NeoChatSidebar.qml
+ imports/NeoChat/Effect/RippleEffect.qml
+ imports/NeoChat/Effect/CircleMask.qml
+ imports/NeoChat/Effect/ElevationEffect.qml
+ imports/NeoChat/Effect/qmldir
+ imports/NeoChat/Dialog/qmldir
+ imports/NeoChat/Dialog/RoomSettingsDialog.qml
+ imports/NeoChat/Dialog/UserDetailDialog.qml
+ imports/NeoChat/Dialog/MessageSourceDialog.qml
+ imports/NeoChat/Dialog/CreateRoomDialog.qml
+ imports/NeoChat/Dialog/JoinRoomDialog.qml
+ imports/NeoChat/Dialog/InviteUserDialog.qml
+ imports/NeoChat/Dialog/AcceptInvitationDialog.qml
+ imports/NeoChat/Dialog/StartChatDialog.qml
+ imports/NeoChat/Dialog/FontFamilyDialog.qml
+ imports/NeoChat/Dialog/AccountDetailDialog.qml
+ imports/NeoChat/Dialog/OpenFileDialog.qml
+ imports/NeoChat/Dialog/OpenFolderDialog.qml
+ imports/NeoChat/Menu/qmldir
+ imports/NeoChat/Menu/Timeline/qmldir
+ imports/NeoChat/Menu/Timeline/MessageDelegateContextMenu.qml
+ imports/NeoChat/Menu/Timeline/FileDelegateContextMenu.qml
+ imports/NeoChat/Menu/RoomListContextMenu.qml
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 093bd41e4..b30b7bdae 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -6,8 +6,8 @@ add_executable(neochat
matriximageprovider.cpp
messageeventmodel.cpp
roomlistmodel.cpp
- spectralroom.cpp
- spectraluser.cpp
+ neochatroom.cpp
+ neochatuser.cpp
trayicon.cpp
userlistmodel.cpp
publicroomlistmodel.cpp
diff --git a/src/controller.cpp b/src/controller.cpp
index 4d22f6e50..850f723d8 100644
--- a/src/controller.cpp
+++ b/src/controller.cpp
@@ -38,8 +38,8 @@
#include "events/eventcontent.h"
#include "events/roommessageevent.h"
#include "settings.h"
-#include "spectralroom.h"
-#include "spectraluser.h"
+#include "neochatroom.h"
+#include "neochatuser.h"
#include "utils.h"
Controller::Controller(QObject *parent)
@@ -47,8 +47,8 @@ Controller::Controller(QObject *parent)
{
QApplication::setQuitOnLastWindowClosed(false);
- Connection::setRoomType();
- Connection::setUserType();
+ Connection::setRoomType();
+ Connection::setUserType();
connect(&m_ncm, &QNetworkConfigurationManager::onlineStateChanged, this, &Controller::isOnlineChanged);
@@ -83,7 +83,7 @@ void Controller::loginWithCredentials(QString serverAddr, QString user, QString
}
if (deviceName.isEmpty()) {
- deviceName = "Spectral " + QSysInfo::machineHostName() + " " + QSysInfo::productType() + " " + QSysInfo::productVersion() + " " + QSysInfo::currentCpuArchitecture();
+ deviceName = "NeoChat " + QSysInfo::machineHostName() + " " + QSysInfo::productType() + " " + QSysInfo::productVersion() + " " + QSysInfo::currentCpuArchitecture();
}
QUrl serverUrl(serverAddr);
diff --git a/src/main.cpp b/src/main.cpp
index 02d4d74d6..079132d7b 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -31,8 +31,8 @@
#include "room.h"
#include "roomlistmodel.h"
#include "sortfilterroomlistmodel.h"
-#include "spectralroom.h"
-#include "spectraluser.h"
+#include "neochatroom.h"
+#include "neochatuser.h"
#include "trayicon.h"
#include "userdirectorylistmodel.h"
#include "userlistmodel.h"
@@ -60,21 +60,21 @@ int main(int argc, char *argv[])
Clipboard clipboard;
- qmlRegisterSingletonInstance("Spectral", 0, 1, "Controller", &Controller::instance());
+ qmlRegisterSingletonInstance("org.kde.neochat", 0, 1, "Controller", &Controller::instance());
qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "Clipboard", &clipboard);
- qmlRegisterType("Spectral", 0, 1, "AccountListModel");
- qmlRegisterType("Spectral", 0, 1, "RoomListModel");
- qmlRegisterType("Spectral", 0, 1, "UserListModel");
- qmlRegisterType("Spectral", 0, 1, "MessageEventModel");
- qmlRegisterType("Spectral", 0, 1, "PublicRoomListModel");
- qmlRegisterType("Spectral", 0, 1, "UserDirectoryListModel");
- qmlRegisterType("Spectral", 0, 1, "EmojiModel");
- qmlRegisterType("Spectral", 0, 1, "NotificationsManager");
- qmlRegisterType("Spectral", 0, 1, "TrayIcon");
- qmlRegisterType("org.kde.neochat", 1, 0, "SortFilterRoomListModel");
- qmlRegisterUncreatableType("Spectral", 0, 1, "RoomMessageEvent", "ENUM");
- qmlRegisterUncreatableType("Spectral", 0, 1, "RoomType", "ENUM");
- qmlRegisterUncreatableType("Spectral", 0, 1, "UserType", "ENUM");
+ qmlRegisterType("org.kde.neochat", 0, 1, "AccountListModel");
+ qmlRegisterType("org.kde.neochat", 0, 1, "RoomListModel");
+ qmlRegisterType("org.kde.neochat", 0, 1, "UserListModel");
+ qmlRegisterType("org.kde.neochat", 0, 1, "MessageEventModel");
+ qmlRegisterType("org.kde.neochat", 0, 1, "PublicRoomListModel");
+ qmlRegisterType("org.kde.neochat", 0, 1, "UserDirectoryListModel");
+ qmlRegisterType("org.kde.neochat", 0, 1, "EmojiModel");
+ qmlRegisterType("org.kde.neochat", 0, 1, "NotificationsManager");
+ qmlRegisterType("org.kde.neochat", 0, 1, "TrayIcon");
+ qmlRegisterType("org.kde.neochat", 0, 1, "SortFilterRoomListModel");
+ qmlRegisterUncreatableType("org.kde.neochat", 0, 1, "RoomMessageEvent", "ENUM");
+ qmlRegisterUncreatableType("org.kde.neochat", 0, 1, "RoomType", "ENUM");
+ qmlRegisterUncreatableType("org.kde.neochat", 0, 1, "UserType", "ENUM");
qRegisterMetaType("User*");
qRegisterMetaType("const User*");
@@ -82,8 +82,8 @@ int main(int argc, char *argv[])
qRegisterMetaType("Room*");
qRegisterMetaType("Connection*");
qRegisterMetaType("MessageEventType");
- qRegisterMetaType("SpectralRoom*");
- qRegisterMetaType("SpectralUser*");
+ qRegisterMetaType("NeoChatRoom*");
+ qRegisterMetaType("NeoChatUser*");
qRegisterMetaType("GetRoomEventsJob*");
qRegisterMetaTypeStreamOperators();
diff --git a/src/messageeventmodel.cpp b/src/messageeventmodel.cpp
index fe72fb898..a86d97225 100644
--- a/src/messageeventmodel.cpp
+++ b/src/messageeventmodel.cpp
@@ -44,16 +44,16 @@ MessageEventModel::MessageEventModel(QObject *parent)
, m_currentRoom(nullptr)
{
using namespace Quotient;
- qmlRegisterAnonymousType("Spectral", 1);
+ qmlRegisterAnonymousType("NeoChat", 1);
qRegisterMetaType();
- qmlRegisterUncreatableType("Spectral", 0, 1, "EventStatus", "EventStatus is not an creatable type");
+ qmlRegisterUncreatableType("NeoChat", 0, 1, "EventStatus", "EventStatus is not an creatable type");
}
MessageEventModel::~MessageEventModel()
{
}
-void MessageEventModel::setRoom(SpectralRoom *room)
+void MessageEventModel::setRoom(NeoChatRoom *room)
{
if (room == m_currentRoom)
return;
@@ -253,7 +253,7 @@ int MessageEventModel::rowCount(const QModelIndex &parent) const
return m_currentRoom->timelineSize();
}
-inline QVariantMap userAtEvent(SpectralUser *user, SpectralRoom *room, const RoomEvent &evt)
+inline QVariantMap userAtEvent(NeoChatUser *user, NeoChatRoom *room, const RoomEvent &evt)
{
Q_UNUSED(evt)
return QVariantMap {
@@ -323,7 +323,7 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
return EventTypeRegistry::getMatrixType(evt.type());
if (role == AuthorRole) {
- auto author = static_cast(isPending ? m_currentRoom->localUser() : m_currentRoom->user(evt.senderId()));
+ auto author = static_cast(isPending ? m_currentRoom->localUser() : m_currentRoom->user(evt.senderId()));
return userAtEvent(author, m_currentRoom, evt);
}
@@ -423,7 +423,7 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
return {};
const auto &replyEvt = **replyIt;
- return QVariantMap {{"eventId", replyEventId}, {"display", m_currentRoom->eventToString(replyEvt, Qt::RichText)}, {"author", userAtEvent(static_cast(m_currentRoom->user(replyEvt.senderId())), m_currentRoom, evt)}};
+ return QVariantMap {{"eventId", replyEventId}, {"display", m_currentRoom->eventToString(replyEvt, Qt::RichText)}, {"author", userAtEvent(static_cast(m_currentRoom->user(replyEvt.senderId())), m_currentRoom, evt)}};
}
if (role == ShowAuthorRole) {
@@ -452,12 +452,12 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
const auto &annotations = m_currentRoom->relatedEvents(evt, EventRelation::Annotation());
if (annotations.isEmpty())
return {};
- QMap> reactions = {};
+ QMap> reactions = {};
for (const auto &a : annotations) {
if (a->isRedacted()) // Just in case?
continue;
if (auto e = eventCast(a))
- reactions[e->relation().key].append(static_cast(m_currentRoom->user(e->senderId())));
+ reactions[e->relation().key].append(static_cast(m_currentRoom->user(e->senderId())));
}
if (reactions.isEmpty()) {
@@ -471,7 +471,7 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
for (auto author : i.value()) {
authors.append(userAtEvent(author, m_currentRoom, evt));
}
- bool hasLocalUser = i.value().contains(static_cast(m_currentRoom->localUser()));
+ bool hasLocalUser = i.value().contains(static_cast(m_currentRoom->localUser()));
res.append(QVariantMap {{"reaction", i.key()}, {"count", i.value().count()}, {"authors", authors}, {"hasLocalUser", hasLocalUser}});
++i;
}
diff --git a/src/messageeventmodel.h b/src/messageeventmodel.h
index c78965e96..950f13455 100644
--- a/src/messageeventmodel.h
+++ b/src/messageeventmodel.h
@@ -4,12 +4,12 @@
#include
#include "room.h"
-#include "spectralroom.h"
+#include "neochatroom.h"
class MessageEventModel : public QAbstractListModel
{
Q_OBJECT
- Q_PROPERTY(SpectralRoom *room READ room WRITE setRoom NOTIFY roomChanged)
+ Q_PROPERTY(NeoChatRoom *room READ room WRITE setRoom NOTIFY roomChanged)
public:
enum EventRoles {
@@ -50,11 +50,11 @@ public:
explicit MessageEventModel(QObject *parent = nullptr);
~MessageEventModel() override;
- SpectralRoom *room() const
+ NeoChatRoom *room() const
{
return m_currentRoom;
}
- void setRoom(SpectralRoom *room);
+ void setRoom(NeoChatRoom *room);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
@@ -67,7 +67,7 @@ private Q_SLOTS:
void refreshRow(int row);
private:
- SpectralRoom *m_currentRoom = nullptr;
+ NeoChatRoom *m_currentRoom = nullptr;
QString lastReadEventId;
int rowBelowInserted = -1;
bool movingEvent = 0;
diff --git a/src/spectralroom.cpp b/src/neochatroom.cpp
similarity index 88%
rename from src/spectralroom.cpp
rename to src/neochatroom.cpp
index c5d40b664..357706168 100644
--- a/src/spectralroom.cpp
+++ b/src/neochatroom.cpp
@@ -1,4 +1,4 @@
-#include "spectralroom.h"
+#include "neochatroom.h"
#include
@@ -27,18 +27,18 @@
#include "user.h"
#include "utils.h"
-SpectralRoom::SpectralRoom(Connection *connection, QString roomId, JoinState joinState)
+NeoChatRoom::NeoChatRoom(Connection *connection, QString roomId, JoinState joinState)
: Room(connection, std::move(roomId), joinState)
{
- connect(this, &SpectralRoom::notificationCountChanged, this, &SpectralRoom::countChanged);
- connect(this, &SpectralRoom::highlightCountChanged, this, &SpectralRoom::countChanged);
+ connect(this, &NeoChatRoom::notificationCountChanged, this, &NeoChatRoom::countChanged);
+ connect(this, &NeoChatRoom::highlightCountChanged, this, &NeoChatRoom::countChanged);
connect(this, &Room::fileTransferCompleted, this, [=] {
setFileUploadingProgress(0);
setHasFileUploading(false);
});
}
-void SpectralRoom::uploadFile(const QUrl &url, const QString &body)
+void NeoChatRoom::uploadFile(const QUrl &url, const QString &body)
{
if (url.isEmpty())
return;
@@ -65,17 +65,17 @@ void SpectralRoom::uploadFile(const QUrl &url, const QString &body)
});
}
-void SpectralRoom::acceptInvitation()
+void NeoChatRoom::acceptInvitation()
{
connection()->joinRoom(id());
}
-void SpectralRoom::forget()
+void NeoChatRoom::forget()
{
connection()->forgetRoom(id());
}
-QVariantList SpectralRoom::getUsersTyping() const
+QVariantList NeoChatRoom::getUsersTyping() const
{
auto users = usersTyping();
users.removeAll(localUser());
@@ -86,12 +86,12 @@ QVariantList SpectralRoom::getUsersTyping() const
return userVariants;
}
-void SpectralRoom::sendTypingNotification(bool isTyping)
+void NeoChatRoom::sendTypingNotification(bool isTyping)
{
connection()->callApi(BackgroundRequest, localUser()->id(), id(), isTyping, 10000);
}
-QString SpectralRoom::lastEvent() const
+QString NeoChatRoom::lastEvent() const
{
for (auto i = messageEvents().rbegin(); i < messageEvents().rend(); i++) {
const RoomEvent *evt = i->get();
@@ -118,12 +118,12 @@ QString SpectralRoom::lastEvent() const
return "";
}
-bool SpectralRoom::isEventHighlighted(const RoomEvent *e) const
+bool NeoChatRoom::isEventHighlighted(const RoomEvent *e) const
{
return highlights.contains(e);
}
-void SpectralRoom::checkForHighlights(const Quotient::TimelineItem &ti)
+void NeoChatRoom::checkForHighlights(const Quotient::TimelineItem &ti)
{
auto localUserId = localUser()->id();
if (ti->senderId() == localUserId)
@@ -135,21 +135,21 @@ void SpectralRoom::checkForHighlights(const Quotient::TimelineItem &ti)
}
}
-void SpectralRoom::onAddNewTimelineEvents(timeline_iter_t from)
+void NeoChatRoom::onAddNewTimelineEvents(timeline_iter_t from)
{
std::for_each(from, messageEvents().cend(), [this](const TimelineItem &ti) {
checkForHighlights(ti);
});
}
-void SpectralRoom::onAddHistoricalTimelineEvents(rev_iter_t from)
+void NeoChatRoom::onAddHistoricalTimelineEvents(rev_iter_t from)
{
std::for_each(from, messageEvents().crend(), [this](const TimelineItem &ti) {
checkForHighlights(ti);
});
}
-void SpectralRoom::onRedaction(const RoomEvent &prevEvent, const RoomEvent & /*after*/)
+void NeoChatRoom::onRedaction(const RoomEvent &prevEvent, const RoomEvent & /*after*/)
{
if (const auto &e = eventCast(&prevEvent)) {
if (auto relatedEventId = e->relation().eventId; !relatedEventId.isEmpty()) {
@@ -158,7 +158,7 @@ void SpectralRoom::onRedaction(const RoomEvent &prevEvent, const RoomEvent & /*a
}
}
-void SpectralRoom::countChanged()
+void NeoChatRoom::countChanged()
{
if (displayed() && !hasUnreadMessages()) {
resetNotificationCount();
@@ -166,24 +166,24 @@ void SpectralRoom::countChanged()
}
}
-QDateTime SpectralRoom::lastActiveTime() const
+QDateTime NeoChatRoom::lastActiveTime() const
{
if (timelineSize() == 0)
return QDateTime();
return messageEvents().rbegin()->get()->originTimestamp();
}
-int SpectralRoom::savedTopVisibleIndex() const
+int NeoChatRoom::savedTopVisibleIndex() const
{
return firstDisplayedMarker() == timelineEdge() ? 0 : int(firstDisplayedMarker() - messageEvents().rbegin());
}
-int SpectralRoom::savedBottomVisibleIndex() const
+int NeoChatRoom::savedBottomVisibleIndex() const
{
return lastDisplayedMarker() == timelineEdge() ? 0 : int(lastDisplayedMarker() - messageEvents().rbegin());
}
-void SpectralRoom::saveViewport(int topIndex, int bottomIndex)
+void NeoChatRoom::saveViewport(int topIndex, int bottomIndex)
{
if (topIndex == -1 || bottomIndex == -1 || (bottomIndex == savedBottomVisibleIndex() && (bottomIndex == 0 || topIndex == savedTopVisibleIndex())))
return;
@@ -196,7 +196,7 @@ void SpectralRoom::saveViewport(int topIndex, int bottomIndex)
setLastDisplayedEvent(maxTimelineIndex() - bottomIndex);
}
-QVariantList SpectralRoom::getUsers(const QString &keyword) const
+QVariantList NeoChatRoom::getUsers(const QString &keyword) const
{
const auto userList = users();
QVariantList matchedList;
@@ -208,12 +208,12 @@ QVariantList SpectralRoom::getUsers(const QString &keyword) const
return matchedList;
}
-QUrl SpectralRoom::urlToMxcUrl(QUrl mxcUrl)
+QUrl NeoChatRoom::urlToMxcUrl(QUrl mxcUrl)
{
return DownloadFileJob::makeRequestUrl(connection()->homeserver(), mxcUrl);
}
-QString SpectralRoom::avatarMediaId() const
+QString NeoChatRoom::avatarMediaId() const
{
if (const auto avatar = Room::avatarMediaId(); !avatar.isEmpty()) {
return avatar;
@@ -230,7 +230,7 @@ QString SpectralRoom::avatarMediaId() const
return {};
}
-QString SpectralRoom::eventToString(const RoomEvent &evt, Qt::TextFormat format, bool removeReply) const
+QString NeoChatRoom::eventToString(const RoomEvent &evt, Qt::TextFormat format, bool removeReply) const
{
const bool prettyPrint = (format == Qt::RichText);
@@ -358,7 +358,7 @@ QString SpectralRoom::eventToString(const RoomEvent &evt, Qt::TextFormat format,
tr("Unknown event"));
}
-void SpectralRoom::changeAvatar(QUrl localFile)
+void NeoChatRoom::changeAvatar(QUrl localFile)
{
const auto job = connection()->uploadFile(localFile.toLocalFile());
if (isJobRunning(job)) {
@@ -368,7 +368,7 @@ void SpectralRoom::changeAvatar(QUrl localFile)
}
}
-void SpectralRoom::addLocalAlias(const QString &alias)
+void NeoChatRoom::addLocalAlias(const QString &alias)
{
auto a = aliases();
if (a.contains(alias))
@@ -379,7 +379,7 @@ void SpectralRoom::addLocalAlias(const QString &alias)
setLocalAliases(a);
}
-void SpectralRoom::removeLocalAlias(const QString &alias)
+void NeoChatRoom::removeLocalAlias(const QString &alias)
{
auto a = aliases();
if (!a.contains(alias))
@@ -390,7 +390,7 @@ void SpectralRoom::removeLocalAlias(const QString &alias)
setLocalAliases(a);
}
-QString SpectralRoom::markdownToHTML(const QString &markdown)
+QString NeoChatRoom::markdownToHTML(const QString &markdown)
{
const auto str = markdown.toUtf8();
char *tmp_buf = cmark_markdown_to_html(str.constData(), str.size(), CMARK_OPT_DEFAULT);
@@ -407,7 +407,7 @@ QString SpectralRoom::markdownToHTML(const QString &markdown)
return result;
}
-void SpectralRoom::postArbitaryMessage(const QString &text, MessageEventType type, const QString &replyEventId)
+void NeoChatRoom::postArbitaryMessage(const QString &text, MessageEventType type, const QString &replyEventId)
{
const auto parsedHTML = markdownToHTML(text);
const bool isRichText = Qt::mightBeRichText(parsedHTML);
@@ -443,7 +443,7 @@ QString msgTypeToString(MessageEventType msgType)
}
}
-void SpectralRoom::postPlainMessage(const QString &text, MessageEventType type, const QString &replyEventId)
+void NeoChatRoom::postPlainMessage(const QString &text, MessageEventType type, const QString &replyEventId)
{
bool isReply = !replyEventId.isEmpty();
const auto replyIt = findInTimeline(replyEventId);
@@ -487,7 +487,7 @@ void SpectralRoom::postPlainMessage(const QString &text, MessageEventType type,
Room::postMessage(text, type);
}
-void SpectralRoom::postHtmlMessage(const QString &text, const QString &html, MessageEventType type, const QString &replyEventId)
+void NeoChatRoom::postHtmlMessage(const QString &text, const QString &html, MessageEventType type, const QString &replyEventId)
{
bool isReply = !replyEventId.isEmpty();
const auto replyIt = findInTimeline(replyEventId);
@@ -531,7 +531,7 @@ void SpectralRoom::postHtmlMessage(const QString &text, const QString &html, Mes
Room::postHtmlMessage(text, html, type);
}
-void SpectralRoom::toggleReaction(const QString &eventId, const QString &reaction)
+void NeoChatRoom::toggleReaction(const QString &eventId, const QString &reaction)
{
if (eventId.isEmpty() || reaction.isEmpty())
return;
@@ -568,7 +568,7 @@ void SpectralRoom::toggleReaction(const QString &eventId, const QString &reactio
}
}
-bool SpectralRoom::containsUser(QString userID) const
+bool NeoChatRoom::containsUser(QString userID) const
{
auto u = Room::user(userID);
@@ -578,7 +578,7 @@ bool SpectralRoom::containsUser(QString userID) const
return Room::memberJoinState(u) != JoinState::Leave;
}
-bool SpectralRoom::canSendEvent(const QString &eventType) const
+bool NeoChatRoom::canSendEvent(const QString &eventType) const
{
auto plEvent = getCurrentState();
auto pl = plEvent->powerLevelForEvent(eventType);
@@ -587,7 +587,7 @@ bool SpectralRoom::canSendEvent(const QString &eventType) const
return currentPl >= pl;
}
-bool SpectralRoom::canSendState(const QString &eventType) const
+bool NeoChatRoom::canSendState(const QString &eventType) const
{
auto plEvent = getCurrentState();
auto pl = plEvent->powerLevelForState(eventType);
diff --git a/src/spectralroom.h b/src/neochatroom.h
similarity index 94%
rename from src/spectralroom.h
rename to src/neochatroom.h
index 3862dea2c..abe308319 100644
--- a/src/spectralroom.h
+++ b/src/neochatroom.h
@@ -1,5 +1,4 @@
-#ifndef SpectralRoom_H
-#define SpectralRoom_H
+#pragma once
#include
#include
@@ -14,11 +13,11 @@
#include
#include "room.h"
-#include "spectraluser.h"
+#include "neochatuser.h"
using namespace Quotient;
-class SpectralRoom : public Room
+class NeoChatRoom : public Room
{
Q_OBJECT
Q_PROPERTY(QVariantList usersTyping READ getUsersTyping NOTIFY typingChanged)
@@ -28,7 +27,7 @@ class SpectralRoom : public Room
Q_PROPERTY(QString avatarMediaId READ avatarMediaId NOTIFY avatarChanged STORED false)
public:
- explicit SpectralRoom(Connection *connection, QString roomId, JoinState joinState = {});
+ explicit NeoChatRoom(Connection *connection, QString roomId, JoinState joinState = {});
QVariantList getUsersTyping() const;
@@ -118,5 +117,3 @@ public Q_SLOTS:
void removeLocalAlias(const QString &alias);
void toggleReaction(const QString &eventId, const QString &reaction);
};
-
-#endif // SpectralRoom_H
diff --git a/src/spectraluser.cpp b/src/neochatuser.cpp
similarity index 83%
rename from src/spectraluser.cpp
rename to src/neochatuser.cpp
index efa89631f..8324f1fab 100644
--- a/src/spectraluser.cpp
+++ b/src/neochatuser.cpp
@@ -1,13 +1,13 @@
-#include "spectraluser.h"
+#include "neochatuser.h"
#include "csapi/profile.h"
-QColor SpectralUser::color()
+QColor NeoChatUser::color()
{
return QColor::fromHslF(hueF(), 0.7, 0.5, 1);
}
//TODO libQuotient 0.7: remove default name
-void SpectralUser::setDefaultName(QString defaultName)
+void NeoChatUser::setDefaultName(QString defaultName)
{
rename(defaultName);
connect(this, &Quotient::User::defaultNameChanged, this, [this]() {
@@ -17,7 +17,7 @@ void SpectralUser::setDefaultName(QString defaultName)
});
}
-QString SpectralUser::defaultName()
+QString NeoChatUser::defaultName()
{
if(m_defaultName.isEmpty()) {
GetDisplayNameJob *job = connection()->callApi(id());
diff --git a/src/spectraluser.h b/src/neochatuser.h
similarity index 75%
rename from src/spectraluser.h
rename to src/neochatuser.h
index 635b06e2b..b959e2cd8 100644
--- a/src/spectraluser.h
+++ b/src/neochatuser.h
@@ -1,5 +1,4 @@
-#ifndef SpectralUser_H
-#define SpectralUser_H
+#pragma once
#include
@@ -8,13 +7,13 @@
using namespace Quotient;
-class SpectralUser : public User
+class NeoChatUser : public User
{
Q_OBJECT
Q_PROPERTY(QColor color READ color CONSTANT)
Q_PROPERTY(QString defaultName READ defaultName WRITE setDefaultName NOTIFY nameChanged)
public:
- SpectralUser(QString userId, Connection *connection)
+ NeoChatUser(QString userId, Connection *connection)
: User(userId, connection)
{
}
@@ -31,5 +30,3 @@ Q_SIGNALS:
private:
QString m_defaultName;
};
-
-#endif // SpectralUser_H
diff --git a/src/roomlistmodel.cpp b/src/roomlistmodel.cpp
index b3ecd55af..96ef969ab 100644
--- a/src/roomlistmodel.cpp
+++ b/src/roomlistmodel.cpp
@@ -38,7 +38,7 @@ void RoomListModel::setConnection(Connection *connection)
m_connection = connection;
- for (SpectralRoom *room : qAsConst(m_rooms)) {
+ for (NeoChatRoom *room : qAsConst(m_rooms)) {
room->disconnect(this);
}
@@ -52,7 +52,7 @@ void RoomListModel::setConnection(Connection *connection)
for (const QString &roomID : values) {
auto room = connection->room(roomID);
if (room)
- refresh(static_cast(room));
+ refresh(static_cast(room));
}
});
@@ -72,14 +72,14 @@ void RoomListModel::doResetModel()
refreshNotificationCount();
}
-SpectralRoom *RoomListModel::roomAt(int row) const
+NeoChatRoom *RoomListModel::roomAt(int row) const
{
return m_rooms.at(row);
}
void RoomListModel::doAddRoom(Room *r)
{
- if (auto room = static_cast(r)) {
+ if (auto room = static_cast(r)) {
m_rooms.append(room);
connectRoomSignals(room);
Q_EMIT roomAdded(room);
@@ -89,7 +89,7 @@ void RoomListModel::doAddRoom(Room *r)
}
}
-void RoomListModel::connectRoomSignals(SpectralRoom *room)
+void RoomListModel::connectRoomSignals(NeoChatRoom *room)
{
connect(room, &Room::displaynameChanged, this, [=] {
refresh(room);
@@ -159,7 +159,7 @@ void RoomListModel::updateRoom(Room *room, Room *prev)
// the previously left room (in both cases prev has the previous state).
if (prev == room) {
qCritical() << "RoomListModel::updateRoom: room tried to replace itself";
- refresh(static_cast(room));
+ refresh(static_cast(room));
return;
}
if (prev && room->id() != prev->id()) {
@@ -167,8 +167,8 @@ void RoomListModel::updateRoom(Room *room, Room *prev)
// That doesn't look right but technically we still can do it.
}
// Ok, we're through with pre-checks, now for the real thing.
- auto newRoom = static_cast(room);
- const auto it = std::find_if(m_rooms.begin(), m_rooms.end(), [=](const SpectralRoom *r) {
+ auto newRoom = static_cast(room);
+ const auto it = std::find_if(m_rooms.begin(), m_rooms.end(), [=](const NeoChatRoom *r) {
return r == prev || r == newRoom;
});
if (it != m_rooms.end()) {
@@ -216,7 +216,7 @@ QVariant RoomListModel::data(const QModelIndex &index, int role) const
qDebug() << "UserListModel: something wrong here...";
return QVariant();
}
- SpectralRoom *room = m_rooms.at(index.row());
+ NeoChatRoom *room = m_rooms.at(index.row());
if (role == NameRole)
return room->displayName();
if (role == AvatarRole)
@@ -256,7 +256,7 @@ QVariant RoomListModel::data(const QModelIndex &index, int role) const
return QVariant();
}
-void RoomListModel::refresh(SpectralRoom *room, const QVector &roles)
+void RoomListModel::refresh(NeoChatRoom *room, const QVector &roles)
{
const auto it = std::find(m_rooms.begin(), m_rooms.end(), room);
if (it == m_rooms.end()) {
diff --git a/src/roomlistmodel.h b/src/roomlistmodel.h
index b1fbcb11e..2b050a708 100644
--- a/src/roomlistmodel.h
+++ b/src/roomlistmodel.h
@@ -4,7 +4,7 @@
#include "connection.h"
#include "events/roomevent.h"
#include "room.h"
-#include "spectralroom.h"
+#include "neochatroom.h"
#include
@@ -58,7 +58,7 @@ public:
void setConnection(Connection *connection);
void doResetModel();
- Q_INVOKABLE SpectralRoom *roomAt(int row) const;
+ Q_INVOKABLE NeoChatRoom *roomAt(int row) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
Q_INVOKABLE int rowCount(const QModelIndex &parent = QModelIndex()) const override;
@@ -78,24 +78,24 @@ private Q_SLOTS:
void doAddRoom(Quotient::Room *room);
void updateRoom(Quotient::Room *room, Quotient::Room *prev);
void deleteRoom(Quotient::Room *room);
- void refresh(SpectralRoom *room, const QVector &roles = {});
+ void refresh(NeoChatRoom *room, const QVector &roles = {});
void refreshNotificationCount();
private:
Connection *m_connection = nullptr;
- QList m_rooms;
+ QList m_rooms;
QMap m_categoryVisibility;
int m_notificationCount = 0;
- void connectRoomSignals(SpectralRoom *room);
+ void connectRoomSignals(NeoChatRoom *room);
Q_SIGNALS:
void connectionChanged();
void notificationCountChanged();
- void roomAdded(SpectralRoom *room);
+ void roomAdded(NeoChatRoom *room);
void newMessage(const QString &roomId, const QString &eventId, const QString &roomName, const QString &senderName, const QString &text, const QImage &icon);
void newHighlight(const QString &roomId, const QString &eventId, const QString &roomName, const QString &senderName, const QString &text, const QImage &icon);
};
diff --git a/src/userlistmodel.cpp b/src/userlistmodel.cpp
index fa0c7e366..8d392bf53 100644
--- a/src/userlistmodel.cpp
+++ b/src/userlistmodel.cpp
@@ -10,7 +10,7 @@
#include
#include
-#include "spectraluser.h"
+#include "neochatuser.h"
UserListModel::UserListModel(QObject *parent)
: QAbstractListModel(parent)