diff --git a/imports/Spectral/Component/Avatar.qml b/imports/Spectral/Component/Avatar.qml
new file mode 100644
index 0000000..be95df5
--- /dev/null
+++ b/imports/Spectral/Component/Avatar.qml
@@ -0,0 +1,63 @@
+import QtQuick 2.9
+import QtQuick.Controls 2.2
+import QtGraphicalEffects 1.0
+
+Item {
+ property string hint: "H"
+ property string source: ""
+ readonly property url realSource: source ? "image://mxc/" + source : ""
+
+ id: root
+
+ Image {
+ anchors.fill: parent
+
+ id: image
+ visible: realSource
+ source: realSource
+ sourceSize.width: width
+ sourceSize.height: width
+ fillMode: Image.PreserveAspectCrop
+ layer.enabled: true
+ layer.effect: OpacityMask {
+ maskSource: Rectangle {
+ width: image.width
+ height: image.width
+
+ radius: width / 2
+ }
+ }
+ }
+
+ Rectangle {
+ anchors.fill: parent
+
+ visible: !realSource || image.status != Image.Ready
+
+ radius: height / 2
+
+ color: stringToColor(hint)
+
+ Label {
+ anchors.centerIn: parent
+
+ color: "white"
+ text: hint[0].toUpperCase()
+ font.pixelSize: root.width / 2
+ font.bold: true
+ }
+ }
+
+ function stringToColor(str) {
+ var hash = 0;
+ for (var i = 0; i < str.length; i++) {
+ hash = str.charCodeAt(i) + ((hash << 5) - hash);
+ }
+ var colour = '#';
+ for (var j = 0; j < 3; j++) {
+ var value = (hash >> (j * 8)) & 0xFF;
+ colour += ('00' + value.toString(16)).substr(-2);
+ }
+ return colour;
+ }
+}
diff --git a/imports/Spectral/Component/ScrollHelper.qml b/imports/Spectral/Component/ScrollHelper.qml
index 923a141..25714f0 100644
--- a/imports/Spectral/Component/ScrollHelper.qml
+++ b/imports/Spectral/Component/ScrollHelper.qml
@@ -66,14 +66,13 @@ MouseArea {
}
onWheel: {
- var newPos = calculateNewPosition(flickable, wheel);
// console.warn("Delta: ", wheel.pixelDelta.y);
// console.warn("Old position: ", flickable.contentY);
// console.warn("New position: ", newPos);
// Show the scrollbars
flickable.flick(0, 0);
- flickable.contentY = newPos;
+ flickable.contentY = calculateNewPosition(flickable, wheel);
cancelFlickStateTimer.start()
}
diff --git a/imports/Spectral/Component/Timeline/ImageDelegate.qml b/imports/Spectral/Component/Timeline/ImageDelegate.qml
index 465ff30..362882a 100644
--- a/imports/Spectral/Component/Timeline/ImageDelegate.qml
+++ b/imports/Spectral/Component/Timeline/ImageDelegate.qml
@@ -43,14 +43,14 @@ ColumnLayout {
spacing: 4
- ImageItem {
+ Avatar {
Layout.preferredWidth: 32
Layout.preferredHeight: 32
Layout.alignment: Qt.AlignTop
visible: avatarVisible
hint: author.displayName
- source: author.paintable
+ source: author.avatarUrl
}
Label {
diff --git a/imports/Spectral/Component/Timeline/MessageDelegate.qml b/imports/Spectral/Component/Timeline/MessageDelegate.qml
index 263d334..e58ed3e 100644
--- a/imports/Spectral/Component/Timeline/MessageDelegate.qml
+++ b/imports/Spectral/Component/Timeline/MessageDelegate.qml
@@ -42,14 +42,14 @@ ColumnLayout {
spacing: 4
- ImageItem {
+ Avatar {
Layout.preferredWidth: 32
Layout.preferredHeight: 32
Layout.alignment: Qt.AlignTop
visible: avatarVisible
hint: author.displayName
- source: author.paintable
+ source: author.avatarUrl
}
Label {
@@ -119,12 +119,12 @@ ColumnLayout {
contentItem: RowLayout {
spacing: 8
- ImageItem {
+ Avatar {
Layout.preferredWidth: 36
Layout.preferredHeight: 36
Layout.alignment: Qt.AlignTop
- source: replyAuthor ? replyAuthor.paintable : null
+ source: replyAuthor ? replyAuthor.avatarUrl : ""
}
ColumnLayout {
diff --git a/imports/Spectral/Component/qmldir b/imports/Spectral/Component/qmldir
index e051620..be035c4 100644
--- a/imports/Spectral/Component/qmldir
+++ b/imports/Spectral/Component/qmldir
@@ -6,3 +6,4 @@ ScrollHelper 2.0 ScrollHelper.qml
AutoListView 2.0 AutoListView.qml
AutoTextField 2.0 AutoTextField.qml
SplitView 2.0 SplitView.qml
+Avatar 2.0 Avatar.qml
diff --git a/imports/Spectral/Panel/RoomDrawer.qml b/imports/Spectral/Panel/RoomDrawer.qml
index 77e3a26..2221b5b 100644
--- a/imports/Spectral/Panel/RoomDrawer.qml
+++ b/imports/Spectral/Panel/RoomDrawer.qml
@@ -7,8 +7,6 @@ import Spectral.Component 2.0
import Spectral 0.1
-import "qrc:/js/util.js" as Util
-
Drawer {
property var room
@@ -20,13 +18,13 @@ Drawer {
anchors.fill: parent
anchors.margins: 32
- ImageItem {
+ Avatar {
Layout.preferredWidth: 96
Layout.preferredHeight: 96
Layout.alignment: Qt.AlignHCenter
hint: room ? room.displayName : "No name"
- source: room ? room.paintable : null
+ source: room ? room.avatarUrl : null
}
Label {
@@ -117,11 +115,11 @@ Drawer {
anchors.margins: 8
spacing: 12
- ImageItem {
+ Avatar {
Layout.preferredWidth: height
Layout.fillHeight: true
- source: paintable
+ source: avatar
hint: name
}
diff --git a/imports/Spectral/Panel/RoomHeader.qml b/imports/Spectral/Panel/RoomHeader.qml
index 6b02202..e3c95ff 100644
--- a/imports/Spectral/Panel/RoomHeader.qml
+++ b/imports/Spectral/Panel/RoomHeader.qml
@@ -5,9 +5,10 @@ import QtQuick.Controls.Material 2.2
import Spectral 0.1
import Spectral.Effect 2.0
+import Spectral.Component 2.0
Control {
- property alias paintable: headerImage.source
+ property alias avatar: headerImage.source
property alias topic: headerTopicLabel.text
property bool atTop: false
signal clicked()
@@ -31,13 +32,13 @@ Control {
spacing: 12
- ImageItem {
+ Avatar {
Layout.preferredWidth: height
Layout.fillHeight: true
id: headerImage
- source: currentRoom.paintable
+ source: currentRoom.avatarUrl
hint: currentRoom ? currentRoom.displayName : "No name"
}
diff --git a/imports/Spectral/Panel/RoomListPanel.qml b/imports/Spectral/Panel/RoomListPanel.qml
index a022131..7d9dc3d 100644
--- a/imports/Spectral/Panel/RoomListPanel.qml
+++ b/imports/Spectral/Panel/RoomListPanel.qml
@@ -110,13 +110,13 @@ Rectangle {
contentItem: ColumnLayout {
spacing: 4
- ImageItem {
+ Avatar {
Layout.preferredWidth: 200
Layout.preferredHeight: 200
Layout.margins: 12
Layout.alignment: Qt.AlignHCenter
- source: root.user ? root.user.paintable : null
+ source: root.user ? root.user.avatarUrl : null
hint: root.user ? root.user.displayName : "?"
}
@@ -646,14 +646,14 @@ Rectangle {
background: Item {}
}
- ImageItem {
+ Avatar {
Layout.preferredWidth: height
Layout.fillHeight: true
Layout.alignment: Qt.AlignRight
visible: !searchField.active
- source: root.user ? root.user.paintable : null
+ source: root.user ? root.user.avatarUrl : null
hint: root.user ? root.user.displayName : "?"
MouseArea {
@@ -765,13 +765,11 @@ Rectangle {
spacing: 12
- ImageItem {
- id: imageItem
-
+ Avatar {
Layout.preferredWidth: height
Layout.fillHeight: true
- source: paintable
+ source: avatar
hint: name || "No Name"
}
diff --git a/imports/Spectral/Panel/RoomPanel.qml b/imports/Spectral/Panel/RoomPanel.qml
index d59e8b6..ad8c5da 100644
--- a/imports/Spectral/Panel/RoomPanel.qml
+++ b/imports/Spectral/Panel/RoomPanel.qml
@@ -14,7 +14,6 @@ import Spectral.Setting 0.1
import SortFilterProxyModel 0.2
import "qrc:/js/md.js" as Markdown
-import "qrc:/js/util.js" as Util
Item {
property var currentRoom: null
@@ -63,7 +62,7 @@ Item {
id: roomHeader
- paintable: currentRoom ? currentRoom.paintable : null
+ avatar: currentRoom ? currentRoom.avatarUrl : ""
topic: currentRoom ? (currentRoom.topic).replace(/(\r\n\t|\n|\r\t)/gm,"") : ""
atTop: messageListView.atYBeginning
@@ -295,11 +294,11 @@ Item {
anchors.margins: 8
spacing: 12
- ImageItem {
+ Avatar {
Layout.preferredWidth: height
Layout.fillHeight: true
- source: modelData.paintable
+ source: modelData.avatar
hint: modelData.displayName
}
diff --git a/imports/Spectral/Panel/RoomPanelInput.qml b/imports/Spectral/Panel/RoomPanelInput.qml
index 89ef04a..c558745 100644
--- a/imports/Spectral/Panel/RoomPanelInput.qml
+++ b/imports/Spectral/Panel/RoomPanelInput.qml
@@ -50,11 +50,11 @@ Control {
spacing: 8
- ImageItem {
+ Avatar {
Layout.preferredWidth: 32
Layout.preferredHeight: 32
- source: replyUser ? replyUser.paintable : null
+ source: replyUser ? replyUser.avatarUrl : ""
hint: replyUser ? replyUser.displayName : "No name"
}
@@ -125,11 +125,11 @@ Control {
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
}
- ImageItem {
+ Avatar {
width: 20
height: 20
visible: !isEmoji
- source: modelData.paintable || null
+ source: modelData.avatarUrl || null
}
Label {
height: parent.height
diff --git a/js/util.js b/js/util.js
deleted file mode 100644
index 6b0ade3..0000000
--- a/js/util.js
+++ /dev/null
@@ -1,12 +0,0 @@
-.pragma library
-
-function pushToStack(stack, page) {
- if(page && stack.currentItem !== page) {
- if(stack.depth === 1) {
- stack.replace(page)
- } else {
- stack.pop(null)
- stack.replace(page)
- }
- }
-}
diff --git a/qml/main.qml b/qml/main.qml
index 390e58b..dd7ca62 100644
--- a/qml/main.qml
+++ b/qml/main.qml
@@ -13,8 +13,6 @@ import Spectral.Effect 2.0
import Spectral 0.1
import Spectral.Setting 0.1
-import "qrc:/js/util.js" as Util
-
ApplicationWindow {
Material.theme: MSettings.darkTheme ? Material.Dark : Material.Light
diff --git a/qtquickcontrols2.conf b/qtquickcontrols2.conf
index bb09e95..b4a0454 100644
--- a/qtquickcontrols2.conf
+++ b/qtquickcontrols2.conf
@@ -9,6 +9,6 @@ Style=Material
Theme=Light
Primary=#344955
Accent=#673AB7
-;Foreground=#1D333E
-;Background=#161616
+Foreground=#1D333E
+Background=#161616
Font/Family="Roboto,Noto Sans,Noto Color Emoji"
diff --git a/res.qrc b/res.qrc
index a1be77d..9ae861e 100644
--- a/res.qrc
+++ b/res.qrc
@@ -3,7 +3,6 @@
qtquickcontrols2.conf
qml/main.qml
js/md.js
- js/util.js
imports/Spectral/Component/Emoji/EmojiPicker.qml
imports/Spectral/Component/Emoji/qmldir
imports/Spectral/Component/Timeline/DownloadableContent.qml
@@ -47,5 +46,6 @@
imports/Spectral/Effect/CircleMask.qml
assets/img/roompanel-dark.svg
imports/Spectral/Component/Timeline/ImageDelegate.qml
+ imports/Spectral/Component/Avatar.qml
diff --git a/spectral.pro b/spectral.pro
index c27eda3..2620c0b 100644
--- a/spectral.pro
+++ b/spectral.pro
@@ -103,12 +103,10 @@ HEADERS += \
src/emojimodel.h \
src/spectralroom.h \
src/userlistmodel.h \
- src/imageitem.h \
src/accountlistmodel.h \
src/spectraluser.h \
src/notifications/manager.h \
- src/utils.h \
- src/paintable.h
+ src/utils.h
SOURCES += src/main.cpp \
src/controller.cpp \
@@ -118,11 +116,9 @@ SOURCES += src/main.cpp \
src/emojimodel.cpp \
src/spectralroom.cpp \
src/userlistmodel.cpp \
- src/imageitem.cpp \
src/accountlistmodel.cpp \
src/spectraluser.cpp \
- src/utils.cpp \
- src/paintable.cpp
+ src/utils.cpp
unix:!mac {
SOURCES += src/notifications/managerlinux.cpp
diff --git a/src/imageitem.cpp b/src/imageitem.cpp
deleted file mode 100644
index 22047fa..0000000
--- a/src/imageitem.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-#include "imageitem.h"
-
-#include
-#include
-#include
-#include
-#include
-
-ImageItem::ImageItem(QQuickItem *parent) : QQuickPaintedItem(parent) {}
-
-inline static QString stringtoColor(QString string) {
- int hash = 0;
- for (int i = 0; i < string.length(); i++)
- hash = string.at(i).unicode() + ((hash << 5) - hash);
- QString colour = "#";
- for (int j = 0; j < 3; j++)
- colour += ("00" + QString::number((hash >> (j * 8)) & 0xFF, 16)).right(2);
- return colour;
-}
-
-inline static QImage getImageFromPaintable(QPointer p, int width,
- int height) {
- if (p.isNull()) return {};
- qreal dpi = QApplication::primaryScreen()->devicePixelRatio();
- QImage image(p->image(width * dpi, height * dpi));
- if (image.isNull()) return {};
- return image;
-}
-
-void ImageItem::paint(QPainter *painter) {
- QRectF bounding_rect(boundingRect());
-
- painter->setRenderHint(QPainter::Antialiasing, true);
-
- QImage image(getImageFromPaintable(m_paintable, bounding_rect.width(),
- bounding_rect.height()));
-
- if (image.isNull()) {
- painter->setPen(Qt::NoPen);
- if (m_color.isEmpty())
- painter->setBrush(QColor(stringtoColor(m_hint)));
- else
- painter->setBrush(QColor(m_color));
- if (m_round)
- painter->drawEllipse(bounding_rect);
- else
- painter->drawRect(bounding_rect);
- painter->setPen(QPen(Qt::white, 2));
- QFont font;
- font.setStyleHint(QFont::SansSerif);
-
- font.setPixelSize(int(bounding_rect.width() / 2));
- font.setBold(true);
- painter->setFont(font);
- painter->drawText(bounding_rect, Qt::AlignCenter, m_hint.at(0).toUpper());
- } else {
- QImage scaled;
- if (image.width() > image.height()) {
- scaled = image.copy((image.width() - image.height()) / 2, 0,
- image.height(), image.height());
- } else {
- scaled = image.copy(0, (image.height() - image.width()) / 2,
- image.width(), image.width());
- }
-
- if (m_round) {
- QPainterPath clip;
- clip.addEllipse(bounding_rect); // this is the shape we want to clip to
- painter->setClipPath(clip);
- }
-
- painter->drawImage(bounding_rect, scaled);
- }
-}
-
-void ImageItem::setPaintable(Paintable *paintable) {
- if (!paintable) return;
- if (!m_paintable.isNull()) m_paintable->disconnect(this);
- m_paintable = paintable;
- connect(m_paintable, &Paintable::paintableChanged, this,
- [=] { this->update(); });
- emit paintableChanged();
- update();
-}
-
-void ImageItem::setHint(QString newHint) {
- if (!m_hint.isNull() && m_hint != newHint) {
- m_hint = newHint;
- emit hintChanged();
- update();
- }
-}
-
-void ImageItem::setDefaultColor(QString color) {
- if (color != m_color) {
- m_color = color;
- emit defaultColorChanged();
- update();
- }
-}
-
-void ImageItem::setRound(bool value) {
- if (m_round != value) {
- m_round = value;
- emit roundChanged();
- update();
- }
-}
diff --git a/src/imageitem.h b/src/imageitem.h
deleted file mode 100644
index a0c6816..0000000
--- a/src/imageitem.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef IMAGEITEM_H
-#define IMAGEITEM_H
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "paintable.h"
-
-class ImageItem : public QQuickPaintedItem {
- Q_OBJECT
- Q_PROPERTY(Paintable* source READ paintable WRITE setPaintable NOTIFY
- paintableChanged)
- Q_PROPERTY(QString hint READ hint WRITE setHint NOTIFY hintChanged)
- Q_PROPERTY(QString defaultColor READ defaultColor WRITE setDefaultColor NOTIFY
- defaultColorChanged)
- Q_PROPERTY(bool round READ round WRITE setRound NOTIFY roundChanged)
-
- public:
- ImageItem(QQuickItem* parent = nullptr);
-
- void paint(QPainter* painter);
-
- Paintable* paintable() { return m_paintable; }
- void setPaintable(Paintable* paintable);
-
- QString hint() { return m_hint; }
- void setHint(QString hint);
-
- QString defaultColor() { return m_color; }
- void setDefaultColor(QString color);
-
- bool round() { return m_round; }
- void setRound(bool value);
-
- signals:
- void paintableChanged();
- void hintChanged();
- void defaultColorChanged();
- void roundChanged();
-
- private:
- QPointer m_paintable;
- QString m_hint = "H";
- QString m_color;
- bool m_round = true;
-};
-
-#endif // IMAGEITEM_H
diff --git a/src/imageprovider.cpp b/src/imageprovider.cpp
index 85aad34..c4abc1f 100644
--- a/src/imageprovider.cpp
+++ b/src/imageprovider.cpp
@@ -16,11 +16,7 @@ ImageProvider::ImageProvider(QObject* parent)
: QObject(parent),
QQuickImageProvider(
QQmlImageProviderBase::Image,
- QQmlImageProviderBase::ForceAsynchronousImageLoading) {
-#if (QT_VERSION < QT_VERSION_CHECK(5, 10, 0))
- qRegisterMetaType();
-#endif
-}
+ QQmlImageProviderBase::ForceAsynchronousImageLoading) {}
QImage ImageProvider::requestImage(const QString& id, QSize* pSize,
const QSize& requestedSize) {
@@ -32,31 +28,33 @@ QImage ImageProvider::requestImage(const QString& id, QSize* pSize,
QUrl mxcUri{id};
+ QImage result = image(mxcUri, requestedSize);
+ if (!requestedSize.isEmpty() && result.size() != requestedSize) {
+ QImage scaled = result.scaled(requestedSize, Qt::KeepAspectRatio,
+ Qt::SmoothTransformation);
+ if (pSize != nullptr) *pSize = scaled.size();
+ return scaled;
+ }
+ if (pSize != nullptr) *pSize = result.size();
+ return result;
+}
+
+QImage ImageProvider::image(const QUrl& mxc, const QSize& size) {
QUrl tempfilePath = QUrl::fromLocalFile(
QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/" +
- mxcUri.fileName() + "-" + QString::number(requestedSize.width()) + "x" +
- QString::number(requestedSize.height()) + ".png");
-
+ mxc.fileName() + ".png");
QImage cachedImage;
if (cachedImage.load(tempfilePath.toLocalFile())) {
- if (pSize != nullptr) *pSize = cachedImage.size();
return cachedImage;
}
MediaThumbnailJob* job = nullptr;
QReadLocker locker(&m_lock);
-#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
QMetaObject::invokeMethod(
- m_connection,
- [=] { return m_connection->getThumbnail(mxcUri, requestedSize); },
+ m_connection, [=] { return m_connection->getThumbnail(mxc, size); },
Qt::BlockingQueuedConnection, &job);
-#else
- QMetaObject::invokeMethod(m_connection, "getThumbnail",
- Qt::BlockingQueuedConnection,
- Q_RETURN_ARG(MediaThumbnailJob*, job),
- Q_ARG(QUrl, mxcUri), Q_ARG(QSize, requestedSize));
-#endif
+
if (!job) {
qDebug() << "ImageProvider: failed to send a request";
return {};
@@ -71,8 +69,6 @@ QImage ImageProvider::requestImage(const QString& id, QSize* pSize,
condition.wait(&m_lock);
}
- if (pSize != nullptr) *pSize = result.size();
-
result.save(tempfilePath.toLocalFile());
return result;
diff --git a/src/imageprovider.h b/src/imageprovider.h
index 1e668bc..815c4fc 100644
--- a/src/imageprovider.h
+++ b/src/imageprovider.h
@@ -33,6 +33,8 @@ class ImageProvider : public QObject, public QQuickImageProvider {
private:
QReadWriteLock m_lock;
QMatrixClient::Connection* m_connection = nullptr;
+
+ QImage image(const QUrl& mxc, const QSize& size);
};
#endif // IMAGEPROVIDER_H
diff --git a/src/main.cpp b/src/main.cpp
index 126de59..66346f7 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -7,7 +7,6 @@
#include "accountlistmodel.h"
#include "controller.h"
#include "emojimodel.h"
-#include "imageitem.h"
#include "imageprovider.h"
#include "messageeventmodel.h"
#include "room.h"
@@ -45,7 +44,6 @@ int main(int argc, char *argv[]) {
qmlRegisterType("SortFilterProxyModel", 0,
2, "SortFilterProxyModel");
- qmlRegisterType("Spectral", 0, 1, "ImageItem");
qmlRegisterType("Spectral", 0, 1, "Controller");
qmlRegisterType("Spectral", 0, 1, "AccountListModel");
qmlRegisterType("Spectral", 0, 1, "RoomListModel");
diff --git a/src/paintable.cpp b/src/paintable.cpp
deleted file mode 100644
index a44b826..0000000
--- a/src/paintable.cpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "paintable.h"
-
-Paintable::Paintable(QObject *parent) : QObject(parent) {}
diff --git a/src/paintable.h b/src/paintable.h
deleted file mode 100644
index 5eb56ef..0000000
--- a/src/paintable.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef PAINTABLE_H
-#define PAINTABLE_H
-
-#include
-#include
-
-class Paintable : public QObject {
- Q_OBJECT
- public:
- Paintable(QObject* parent = nullptr);
- virtual ~Paintable() = default;
-
- virtual QImage image(int) = 0;
- virtual QImage image(int, int) = 0;
-
- signals:
- void paintableChanged();
-};
-
-#endif // PAINTABLE_H
diff --git a/src/roomlistmodel.cpp b/src/roomlistmodel.cpp
index 09ec260..6247f4b 100644
--- a/src/roomlistmodel.cpp
+++ b/src/roomlistmodel.cpp
@@ -70,6 +70,8 @@ void RoomListModel::connectRoomSignals(SpectralRoom* room) {
[=] { unreadMessagesChanged(room); });
connect(room, &Room::notificationCountChanged, this,
[=] { unreadMessagesChanged(room); });
+ connect(room, &Room::avatarChanged, this,
+ [this, room] { refresh(room, {AvatarRole}); });
connect(room, &Room::tagsChanged, this, [=] { refresh(room); });
connect(room, &Room::joinStateChanged, this, [=] { refresh(room); });
connect(room, &Room::addedMessages, this,
@@ -153,7 +155,7 @@ QVariant RoomListModel::data(const QModelIndex& index, int role) const {
}
SpectralRoom* room = m_rooms.at(index.row());
if (role == NameRole) return room->displayName();
- if (role == PaintableRole) return QVariant::fromValue(room->paintable());
+ if (role == AvatarRole) return room->avatarUrl();
if (role == TopicRole) return room->topic();
if (role == CategoryRole) {
if (room->joinState() == JoinState::Invite) return RoomType::Invited;
@@ -193,7 +195,7 @@ void RoomListModel::unreadMessagesChanged(SpectralRoom* room) {
QHash RoomListModel::roleNames() const {
QHash roles;
roles[NameRole] = "name";
- roles[PaintableRole] = "paintable";
+ roles[AvatarRole] = "avatar";
roles[TopicRole] = "topic";
roles[CategoryRole] = "category";
roles[UnreadCountRole] = "unreadCount";
diff --git a/src/roomlistmodel.h b/src/roomlistmodel.h
index c42e956..40b0f04 100644
--- a/src/roomlistmodel.h
+++ b/src/roomlistmodel.h
@@ -31,7 +31,7 @@ class RoomListModel : public QAbstractListModel {
public:
enum EventRoles {
NameRole = Qt::UserRole + 1,
- PaintableRole,
+ AvatarRole,
TopicRole,
CategoryRole,
UnreadCountRole,
diff --git a/src/spectralroom.cpp b/src/spectralroom.cpp
index ee7aa44..e003d61 100644
--- a/src/spectralroom.cpp
+++ b/src/spectralroom.cpp
@@ -18,7 +18,7 @@
SpectralRoom::SpectralRoom(Connection* connection, QString roomId,
JoinState joinState)
- : Room(connection, std::move(roomId), joinState), m_paintable(this) {
+ : Room(connection, std::move(roomId), joinState) {
connect(this, &SpectralRoom::notificationCountChanged, this,
&SpectralRoom::countChanged);
connect(this, &SpectralRoom::highlightCountChanged, this,
diff --git a/src/spectralroom.h b/src/spectralroom.h
index 155cb44..21474ca 100644
--- a/src/spectralroom.h
+++ b/src/spectralroom.h
@@ -1,7 +1,6 @@
#ifndef SpectralRoom_H
#define SpectralRoom_H
-#include "paintable.h"
#include "room.h"
#include "spectraluser.h"
@@ -11,29 +10,8 @@
using namespace QMatrixClient;
-class RoomPaintable : public Paintable {
- Q_OBJECT
- public:
- RoomPaintable(Room* parent) : Paintable(parent), m_room(parent) {
- connect(m_room, &Room::avatarChanged, [=] { emit paintableChanged(); });
- }
-
- QImage image(int dimension) override {
- if (!m_room) return {};
- return m_room->avatar(dimension);
- }
- QImage image(int width, int height) override {
- if (!m_room) return {};
- return m_room->avatar(width, height);
- }
-
- private:
- Room* m_room;
-};
-
class SpectralRoom : public Room {
Q_OBJECT
- Q_PROPERTY(Paintable* paintable READ paintable CONSTANT)
Q_PROPERTY(bool hasUsersTyping READ hasUsersTyping NOTIFY typingChanged)
Q_PROPERTY(QString usersTyping READ getUsersTyping NOTIFY typingChanged)
Q_PROPERTY(QString cachedInput READ cachedInput WRITE setCachedInput NOTIFY
@@ -48,8 +26,6 @@ class SpectralRoom : public Room {
explicit SpectralRoom(Connection* connection, QString roomId,
JoinState joinState = {});
- Paintable* paintable() { return &m_paintable; }
-
const QString& cachedInput() const { return m_cachedInput; }
void setCachedInput(const QString& input) {
if (input != m_cachedInput) {
@@ -132,9 +108,6 @@ class SpectralRoom : public Room {
void sendTypingNotification(bool isTyping);
void sendReply(QString userId, QString eventId, QString replyContent,
QString sendContent);
-
- private:
- RoomPaintable m_paintable;
};
#endif // SpectralRoom_H
diff --git a/src/spectraluser.h b/src/spectraluser.h
index 4fe459e..e62e51e 100644
--- a/src/spectraluser.h
+++ b/src/spectraluser.h
@@ -1,44 +1,18 @@
#ifndef SpectralUser_H
#define SpectralUser_H
-#include "paintable.h"
#include "room.h"
#include "user.h"
#include
-#include
using namespace QMatrixClient;
-class UserPaintable : public Paintable {
- Q_OBJECT
- public:
- UserPaintable(User* parent) : Paintable(parent), m_user(parent) {}
-
- QImage image(int dimension) override {
- if (!m_user) return {};
- return m_user->avatar(dimension);
- }
- QImage image(int width, int height) override {
- if (!m_user) return {};
- return m_user->avatar(width, height);
- }
-
- private:
- User* m_user;
-};
-
class SpectralUser : public User {
Q_OBJECT
- Q_PROPERTY(Paintable* paintable READ paintable CONSTANT)
public:
SpectralUser(QString userId, Connection* connection)
- : User(userId, connection), m_paintable(this) {}
-
- Paintable* paintable() { return &m_paintable; }
-
- private:
- UserPaintable m_paintable;
+ : User(userId, connection) {}
};
#endif // SpectralUser_H
diff --git a/src/userlistmodel.cpp b/src/userlistmodel.cpp
index eb242d9..4fc65e8 100644
--- a/src/userlistmodel.cpp
+++ b/src/userlistmodel.cpp
@@ -72,8 +72,8 @@ QVariant UserListModel::data(const QModelIndex& index, int role) const {
if (role == UserIDRole) {
return user->id();
}
- if (role == PaintableRole) {
- return QVariant::fromValue((static_cast(user))->paintable());
+ if (role == AvatarRole) {
+ return user->avatarUrl();
}
return QVariant();
@@ -115,7 +115,7 @@ void UserListModel::refresh(QMatrixClient::User* user, QVector roles) {
void UserListModel::avatarChanged(QMatrixClient::User* user,
const QMatrixClient::Room* context) {
- if (context == m_currentRoom) refresh(user, {PaintableRole});
+ if (context == m_currentRoom) refresh(user, {AvatarRole});
}
int UserListModel::findUserPos(User* user) const {
@@ -130,6 +130,6 @@ QHash UserListModel::roleNames() const {
QHash roles;
roles[NameRole] = "name";
roles[UserIDRole] = "userId";
- roles[PaintableRole] = "paintable";
+ roles[AvatarRole] = "avatar";
return roles;
}
diff --git a/src/userlistmodel.h b/src/userlistmodel.h
index 88146ad..fd01a5e 100644
--- a/src/userlistmodel.h
+++ b/src/userlistmodel.h
@@ -17,7 +17,7 @@ class UserListModel : public QAbstractListModel {
Q_PROPERTY(
QMatrixClient::Room* room READ room WRITE setRoom NOTIFY roomChanged)
public:
- enum EventRoles { NameRole = Qt::UserRole + 1, UserIDRole, PaintableRole };
+ enum EventRoles { NameRole = Qt::UserRole + 1, UserIDRole, AvatarRole };
using User = QMatrixClient::User;