Use modules.

This commit is contained in:
Black Hat 2018-10-01 16:07:48 +08:00
parent 0654a8b2b6
commit 385135a658
41 changed files with 158 additions and 89 deletions

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 697 KiB

After

Width:  |  Height:  |  Size: 697 KiB

View File

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -1,5 +1,6 @@
import QtQuick 2.9 import QtQuick 2.9
import Spectral.Settings 0.1
import Spectral.Setting 0.1
MouseArea { MouseArea {
signal primaryClicked() signal primaryClicked()

View File

@ -2,6 +2,7 @@ import QtQuick 2.9
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import QtQuick.Controls.Material 2.2 import QtQuick.Controls.Material 2.2
import Spectral 0.1 import Spectral 0.1
Popup { Popup {

View File

@ -0,0 +1,2 @@
module Spectral.Component.Emoji
EmojiPicker 2.0 EmojiPicker.qml

View File

@ -1,7 +1,9 @@
import QtQuick 2.9 import QtQuick 2.9
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import Spectral.Settings 0.1
import Spectral.Setting 0.1
import Spectral.Font 0.1
Text { Text {
property alias icon: materialLabel.text property alias icon: materialLabel.text
@ -10,7 +12,7 @@ Text {
color: MSettings.darkTheme ? "white" : "dark" color: MSettings.darkTheme ? "white" : "dark"
font.pointSize: 16 font.pointSize: 16
font.family: materialFont.name font.family: MaterialFont.name
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
} }

View File

@ -1,7 +1,8 @@
import QtQuick 2.9 import QtQuick 2.9
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtQuick.Controls.Material 2.2 import QtQuick.Controls.Material 2.2
import Spectral.Settings 0.1
import Spectral.Setting 0.1
Label { Label {
property bool coloredBackground property bool coloredBackground

View File

@ -1,7 +1,11 @@
import QtQuick 2.9 import QtQuick 2.9
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtQuick.Controls.Material 2.2 import QtQuick.Controls.Material 2.2
import Spectral.Settings 0.1
import Spectral.Component 2.0
import Spectral.Effect 2.0
import Spectral.Setting 0.1
Control { Control {
property bool highlighted: false property bool highlighted: false

View File

@ -2,8 +2,10 @@ import QtQuick 2.9
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import QtQuick.Controls.Material 2.2 import QtQuick.Controls.Material 2.2
import Spectral 0.1 import Spectral 0.1
import Spectral.Settings 0.1 import Spectral.Setting 0.1
import "qrc:/js/util.js" as Util import "qrc:/js/util.js" as Util
RowLayout { RowLayout {

View File

@ -2,7 +2,8 @@ import QtQuick 2.9
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import QtQuick.Controls.Material 2.2 import QtQuick.Controls.Material 2.2
import Spectral.Settings 0.1
import Spectral.Setting 0.1
Label { Label {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter

View File

@ -0,0 +1,4 @@
module Spectral.Component.Timeline
MessageDelegate 2.0 MessageDelegate.qml
StateDelegate 2.0 StateDelegate.qml

View File

@ -0,0 +1,4 @@
module Spectral.Component
AutoMouseArea 2.0 AutoMouseArea.qml
MaterialIcon 2.0 MaterialIcon.qml
SideNavButton 2.0 SideNavButton.qml

View File

@ -0,0 +1,2 @@
module Spectral.Effect
ElevationEffect 2.0 ElevationEffect.qml

View File

@ -0,0 +1,6 @@
pragma Singleton
import QtQuick 2.9
FontLoader {
source: "qrc:/assets/font/material.ttf"
}

View File

@ -2,6 +2,9 @@ import QtQuick 2.9
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtQuick.Controls.Material 2.2 import QtQuick.Controls.Material 2.2
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import Spectral.Component 2.0
import Spectral 0.1 import Spectral 0.1
import "qrc:/js/util.js" as Util import "qrc:/js/util.js" as Util

View File

@ -2,12 +2,17 @@ import QtQuick 2.9
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import QtQuick.Controls.Material 2.2 import QtQuick.Controls.Material 2.2
import Spectral.Component 2.0
import Spectral.Component.Emoji 2.0
import Spectral.Component.Timeline 2.0
import Spectral.Menu 2.0
import Spectral.Effect 2.0
import Spectral 0.1 import Spectral 0.1
import Spectral.Settings 0.1 import Spectral.Setting 0.1
import SortFilterProxyModel 0.2 import SortFilterProxyModel 0.2
import "../component"
import "../menu"
import "qrc:/js/md.js" as Markdown import "qrc:/js/md.js" as Markdown
import "qrc:/js/util.js" as Util import "qrc:/js/util.js" as Util
@ -122,20 +127,15 @@ Item {
spacing: 8 spacing: 8
cacheBuffer: 200 cacheBuffer: 200
flickDeceleration: 4096
boundsBehavior: Flickable.DragOverBounds boundsBehavior: Flickable.DragOverBounds
property int largestVisibleIndex: count > 0 ? indexAt(contentX, contentY + height - 1) : -1 property int largestVisibleIndex: count > 0 ? indexAt(contentX, contentY + height - 1) : -1
onContentYChanged: { onContentYChanged: {
// Check whether we're about to bump into the ceiling in 2 seconds if(verticalVelocity < 0 && contentY - 5000 < originY)
var curVelocity = verticalVelocity // Snapshot the current speed
if(curVelocity < 0 && contentY - 5000 < originY)
{
currentRoom.getPreviousContent(50); currentRoom.getPreviousContent(50);
} }
}
onMovementEnded: currentRoom.saveViewport(sortedMessageEventModel.mapToSource(indexAt(contentX, contentY)), sortedMessageEventModel.mapToSource(largestVisibleIndex)) onMovementEnded: currentRoom.saveViewport(sortedMessageEventModel.mapToSource(indexAt(contentX, contentY)), sortedMessageEventModel.mapToSource(largestVisibleIndex))
@ -167,7 +167,7 @@ Item {
messageListView.currentIndex = lastScrollPosition messageListView.currentIndex = lastScrollPosition
} }
if (messageListView.contentY < messageListView.originY + 10 || currentRoom.timelineSize === 0) if (messageListView.contentY < messageListView.originY + 10 || currentRoom.timelineSize === 0)
currentRoom.getPreviousContent(50) currentRoom.getPreviousContent(100)
} }
console.log("Model timeline reset") console.log("Model timeline reset")
} }

View File

@ -4,12 +4,15 @@ import QtQuick.Layouts 1.3
import QtGraphicalEffects 1.0 import QtGraphicalEffects 1.0
import QtQuick.Controls.Material 2.2 import QtQuick.Controls.Material 2.2
import QtQml.Models 2.3 import QtQml.Models 2.3
import Spectral 0.1
import SortFilterProxyModel 0.2
import Spectral.Settings 0.1
import "../component" import Spectral.Component 2.0
import "../menu" import Spectral.Menu 2.0
import Spectral.Effect 2.0
import Spectral 0.1
import Spectral.Setting 0.1
import SortFilterProxyModel 0.2
import "qrc:/js/util.js" as Util import "qrc:/js/util.js" as Util
Rectangle { Rectangle {

View File

@ -0,0 +1,4 @@
module Spectral.Form
RoomForm 2.0 RoomForm.qml
RoomListForm 2.0 RoomListForm.qml

View File

@ -0,0 +1,4 @@
module Spectral.Menu
MessageContextMenu 2.0 MessageContextMenu.qml
RoomContextMenu 2.0 RoomContextMenu.qml

View File

@ -3,10 +3,10 @@ import QtQuick.Layouts 1.3
import QtGraphicalEffects 1.0 import QtGraphicalEffects 1.0
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtQuick.Controls.Material 2.2 import QtQuick.Controls.Material 2.2
import Qt.labs.settings 1.0
import Spectral.Settings 0.1
import "component" import Spectral.Component 2.0
import Spectral.Setting 0.1
Page { Page {
property var controller property var controller
@ -22,7 +22,7 @@ Page {
Image { Image {
id: background id: background
anchors.fill: parent anchors.fill: parent
source: "qrc:/asset/img/background.jpg" source: "qrc:/assets/img/background.jpg"
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
cache: false cache: false
} }

View File

@ -2,11 +2,13 @@ import QtQuick 2.9
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import QtQuick.Controls.Material 2.2 import QtQuick.Controls.Material 2.2
import Spectral 0.1
import Spectral.Settings 0.1
import "form" import Spectral.Form 2.0
import "component" import Spectral.Component 2.0
import Spectral.Effect 2.0
import Spectral 0.1
import Spectral.Setting 0.1
Page { Page {
property alias connection: roomListModel.connection property alias connection: roomListModel.connection

View File

@ -2,11 +2,13 @@ import QtQuick 2.9
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtQuick.Controls.Material 2.2 import QtQuick.Controls.Material 2.2
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import Spectral 0.1
import Spectral.Settings 0.1
import "component" import Spectral.Component 2.0
import "form" import Spectral.Effect 2.0
import Spectral 0.1
import Spectral.Setting 0.1
import "qrc:/js/util.js" as Util import "qrc:/js/util.js" as Util
Page { Page {
@ -227,7 +229,7 @@ Page {
Layout.preferredWidth: 64 Layout.preferredWidth: 64
Layout.preferredHeight: 64 Layout.preferredHeight: 64
source: "qrc:/asset/img/icon.png" source: "qrc:/assets/img/icon.png"
} }
Label { text: "Spectral, an IM client for the Matrix protocol." } Label { text: "Spectral, an IM client for the Matrix protocol." }
Label { text: "Released under GNU General Public License, version 3." } Label { text: "Released under GNU General Public License, version 3." }

View File

@ -0,0 +1,5 @@
module Spectral.Page
Login 2.0 Login.qml
Room 2.0 Room.qml
Setting 2.0 Setting.qml

View File

@ -3,12 +3,13 @@ import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import QtQuick.Controls.Material 2.2 import QtQuick.Controls.Material 2.2
import Qt.labs.settings 1.0 import Qt.labs.settings 1.0
import QtGraphicalEffects 1.0
import Spectral 0.1
import Spectral.Settings 0.1
import "component" import Spectral.Component 2.0
import "form" import Spectral.Page 2.0
import Spectral 0.1
import Spectral.Setting 0.1
import "qrc:/js/util.js" as Util import "qrc:/js/util.js" as Util
ApplicationWindow { ApplicationWindow {
@ -28,8 +29,6 @@ ApplicationWindow {
Material.accent: spectralController.color(currentConnection ? currentConnection.localUserId : "") Material.accent: spectralController.color(currentConnection ? currentConnection.localUserId : "")
FontLoader { id: materialFont; source: "qrc:/asset/font/material.ttf" }
Controller { Controller {
id: spectralController id: spectralController

62
res.qrc
View File

@ -1,35 +1,43 @@
<RCC> <RCC>
<qresource prefix="/"> <qresource prefix="/">
<file>qtquickcontrols2.conf</file> <file>qtquickcontrols2.conf</file>
<file>asset/img/avatar.png</file>
<file>asset/img/background.jpg</file>
<file>asset/font/material.ttf</file>
<file>qml/Login.qml</file>
<file>qml/main.qml</file> <file>qml/main.qml</file>
<file>qml/form/RoomForm.qml</file>
<file>qml/Room.qml</file>
<file>qml/component/SideNavButton.qml</file>
<file>qml/component/MaterialIcon.qml</file>
<file>asset/img/icon.png</file>
<file>js/md.js</file> <file>js/md.js</file>
<file>qml/component/MessageDelegate.qml</file>
<file>qml/component/DownloadableContent.qml</file>
<file>qml/form/RoomListForm.qml</file>
<file>qml/Setting.qml</file>
<file>qml/component/EmojiPicker.qml</file>
<file>qml/component/EmojiButton.qml</file>
<file>qml/component/AutoImage.qml</file>
<file>asset/img/icon.ico</file>
<file>asset/img/icon.icns</file>
<file>qml/component/AutoMouseArea.qml</file>
<file>qml/SpectralSettings.qml</file>
<file>qml/menu/MessageContextMenu.qml</file>
<file>qml/menu/RoomContextMenu.qml</file>
<file>qml/component/GenericBubble.qml</file>
<file>qml/component/StateDelegate.qml</file>
<file>qml/component/AutoLabel.qml</file>
<file>qml/component/RoomDrawer.qml</file>
<file>js/util.js</file> <file>js/util.js</file>
<file>qml/component/ElevationEffect.qml</file> <file>imports/Spectral/Component/Emoji/EmojiButton.qml</file>
<file>imports/Spectral/Component/Emoji/EmojiPicker.qml</file>
<file>imports/Spectral/Component/Emoji/qmldir</file>
<file>imports/Spectral/Component/Timeline/AutoImage.qml</file>
<file>imports/Spectral/Component/Timeline/AutoLabel.qml</file>
<file>imports/Spectral/Component/Timeline/DownloadableContent.qml</file>
<file>imports/Spectral/Component/Timeline/GenericBubble.qml</file>
<file>imports/Spectral/Component/Timeline/MessageDelegate.qml</file>
<file>imports/Spectral/Component/Timeline/qmldir</file>
<file>imports/Spectral/Component/Timeline/StateDelegate.qml</file>
<file>imports/Spectral/Component/AutoMouseArea.qml</file>
<file>imports/Spectral/Component/MaterialIcon.qml</file>
<file>imports/Spectral/Component/qmldir</file>
<file>imports/Spectral/Component/SideNavButton.qml</file>
<file>imports/Spectral/Effect/ElevationEffect.qml</file>
<file>imports/Spectral/Effect/qmldir</file>
<file>imports/Spectral/Form/qmldir</file>
<file>imports/Spectral/Form/RoomDrawer.qml</file>
<file>imports/Spectral/Form/RoomForm.qml</file>
<file>imports/Spectral/Form/RoomListForm.qml</file>
<file>imports/Spectral/Menu/MessageContextMenu.qml</file>
<file>imports/Spectral/Menu/qmldir</file>
<file>imports/Spectral/Menu/RoomContextMenu.qml</file>
<file>imports/Spectral/Page/Login.qml</file>
<file>imports/Spectral/Page/qmldir</file>
<file>imports/Spectral/Page/Room.qml</file>
<file>imports/Spectral/Page/Setting.qml</file>
<file>assets/font/material.ttf</file>
<file>assets/img/avatar.png</file>
<file>assets/img/background.jpg</file>
<file>assets/img/icon.icns</file>
<file>assets/img/icon.ico</file>
<file>assets/img/icon.png</file>
<file>imports/Spectral/Setting/Setting.qml</file>
<file>imports/Spectral/Font/MaterialFont.qml</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -39,26 +39,26 @@ DEFINES += QT_DEPRECATED_WARNINGS
# You can also select to disable deprecated APIs only up to a certain version of Qt. # You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += $$PWD/src/main.cpp \ SOURCES += src/main.cpp \
$$PWD/src/controller.cpp \ src/controller.cpp \
$$PWD/src/roomlistmodel.cpp \ src/roomlistmodel.cpp \
$$PWD/src/imageprovider.cpp \ src/imageprovider.cpp \
$$PWD/src/messageeventmodel.cpp \ src/messageeventmodel.cpp \
$$PWD/src/emojimodel.cpp \ src/emojimodel.cpp \
$$PWD/src/spectralroom.cpp \ src/spectralroom.cpp \
$$PWD/src/userlistmodel.cpp \ src/userlistmodel.cpp \
$$PWD/src/imageitem.cpp \ src/imageitem.cpp \
$$PWD/src/accountlistmodel.cpp \ src/accountlistmodel.cpp \
$$PWD/src/spectraluser.cpp src/spectraluser.cpp
RESOURCES += \ RESOURCES += \
res.qrc res.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model # Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH = QML_IMPORT_PATH += imports/
# Additional import path used to resolve QML modules just for Qt Quick Designer # Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH = QML_DESIGNER_IMPORT_PATH += imports/
# Default rules for deployment. # Default rules for deployment.
unix:!mac:isEmpty(PREFIX) { unix:!mac:isEmpty(PREFIX) {
@ -80,11 +80,11 @@ unix:!mac {
} }
win32 { win32 {
RC_ICONS = asset/img/icon.ico RC_ICONS = assets/img/icon.ico
} }
mac { mac {
ICON = asset/img/icon.icns ICON = assets/img/icon.icns
} }
HEADERS += \ HEADERS += \

View File

@ -27,7 +27,7 @@
#include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkReply>
Controller::Controller(QObject* parent) : QObject(parent) { Controller::Controller(QObject* parent) : QObject(parent) {
tray->setIcon(QIcon(":/asset/img/icon.png")); tray->setIcon(QIcon(":/assets/img/icon.png"));
tray->setToolTip("Spectral"); tray->setToolTip("Spectral");
connect(tray, &QSystemTrayIcon::activated, connect(tray, &QSystemTrayIcon::activated,
[this](QSystemTrayIcon::ActivationReason r) { [this](QSystemTrayIcon::ActivationReason r) {

View File

@ -8,10 +8,10 @@
#include "emojimodel.h" #include "emojimodel.h"
#include "imageitem.h" #include "imageitem.h"
#include "imageprovider.h" #include "imageprovider.h"
#include "spectralroom.h"
#include "messageeventmodel.h" #include "messageeventmodel.h"
#include "room.h" #include "room.h"
#include "roomlistmodel.h" #include "roomlistmodel.h"
#include "spectralroom.h"
#include "userlistmodel.h" #include "userlistmodel.h"
#include "csapi/joining.h" #include "csapi/joining.h"
@ -47,11 +47,18 @@ int main(int argc, char *argv[]) {
qmlRegisterUncreatableType<RoomMessageEvent>("Spectral", 0, 1, qmlRegisterUncreatableType<RoomMessageEvent>("Spectral", 0, 1,
"RoomMessageEvent", "ENUM"); "RoomMessageEvent", "ENUM");
qmlRegisterUncreatableType<RoomType>("Spectral", 0, 1, "RoomType", "ENUM"); qmlRegisterUncreatableType<RoomType>("Spectral", 0, 1, "RoomType", "ENUM");
qmlRegisterSingletonType(QUrl("qrc:/qml/SpectralSettings.qml"),
"Spectral.Settings", 0, 1, "MSettings"); qmlRegisterSingletonType(QUrl("qrc:/imports/Spectral/Setting/Setting.qml"),
"Spectral.Setting", 0, 1, "MSettings");
qmlRegisterSingletonType(
QUrl("qrc:/imports/Spectral/Font/MaterialFont.qml"), "Spectral.Font",
0, 1, "MaterialFont");
qmlRegisterModule("qrc:/qml/component", 2, 0);
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
engine.addImportPath("qrc:/imports");
ImageProvider *m_provider = new ImageProvider(); ImageProvider *m_provider = new ImageProvider();
engine.rootContext()->setContextProperty("imageProvider", m_provider); engine.rootContext()->setContextProperty("imageProvider", m_provider);

View File

@ -87,10 +87,12 @@ void MessageEventModel::setRoom(SpectralRoom* room) {
{AboveEventTypeRole, AboveAuthorRole, {AboveEventTypeRole, AboveAuthorRole,
AboveSectionRole, AboveTimeRole}); AboveSectionRole, AboveTimeRole});
} }
for (auto i = m_currentRoom->maxTimelineIndex() - biggest; for (auto i = m_currentRoom->maxTimelineIndex() - biggest;
i <= m_currentRoom->maxTimelineIndex() - lowest; ++i) i <= m_currentRoom->maxTimelineIndex() - lowest; ++i)
refreshLastUserEvents(i); refreshLastUserEvents(i);
}); },
Qt::QueuedConnection);
connect(m_currentRoom, &Room::pendingEventAboutToAdd, this, connect(m_currentRoom, &Room::pendingEventAboutToAdd, this,
[this] { beginInsertRows({}, 0, 0); }); [this] { beginInsertRows({}, 0, 0); });
connect(m_currentRoom, &Room::pendingEventAdded, this, connect(m_currentRoom, &Room::pendingEventAdded, this,