commit 040bd0b6dc5701d9435a42ffd8d96dbbe252bf1d
parent 3d075168e8b4d38ba812c39a79cb75ee55671bb6
Author: MTRNord <mtrnord1@gmail.com>
Date: Sat, 26 Aug 2017 01:44:30 +0200
Add new Main Design and rebrand ro Morpheus
Signed-off-by: MTRNord <mtrnord1@gmail.com>
Diffstat:
17 files changed, 1005 insertions(+), 256 deletions(-)
diff --git a/README.md b/README.md
@@ -1,11 +1,11 @@
-# Neo
-[](https://circleci.com/gh/Nordgedanken/Neo) [](https://ci.appveyor.com/project/MTRNord/neo)
+# Morpheus
+[](https://circleci.com/gh/Nordgedanken/Morpheus) [](https://ci.appveyor.com/project/MTRNord/neo)
A Matrix client written in Go-QT
# How to build
1. Follow https://github.com/therecipe/qt#installation
-2. Run `go get -u github.com/Nordgedanken/Neo` to clone this Repo
-3. Run `qtdeploy build desktop .` inside `$GOPATH/src/github.com/Nordgedanken/Neo`
+2. Run `go get -u github.com/Nordgedanken/Morpheus` to clone this Repo
+3. Run `qtdeploy build desktop .` inside `$GOPATH/src/github.com/Nordgedanken/Morpheus`
4. Run the Application from within `deploy/windows`
diff --git a/circle.yml b/circle.yml
@@ -10,7 +10,7 @@ dependencies:
- go get -u -v github.com/therecipe/qt/cmd/...
- if [[ "$OS" == "linux" ]]; then chmod +x ./.ci/linux.sh && ./.ci/linux.sh; fi
- /home/ubuntu/.go_project/bin/qtsetup full desktop
- - go get -v github.com/Nordgedanken/Neo/...
+ - go get -v github.com/Nordgedanken/Morpheus/...
post:
test:
pre:
diff --git a/elements/messageList.go b/elements/messageList.go
@@ -0,0 +1,38 @@
+package elements
+
+import (
+ "github.com/therecipe/qt/core"
+ "github.com/therecipe/qt/widgets"
+)
+
+func NewMessageList() (messageView *widgets.QWidget, messageViewLayout *widgets.QGridLayout) {
+ messageView = widgets.NewQWidget(nil, 0)
+
+ messageScroll := widgets.NewQScrollArea(nil)
+ messageScroll.SetObjectName("messageScroll")
+ messageScroll.SetStyleSheet("QScrollArea#messageScroll { border: 0px; };")
+
+ messageViewLayout = widgets.NewQGridLayout(messageView)
+ messageViewLayout.SetSpacing(0)
+ messageViewLayout.SetContentsMargins(0, 0, 0, 0)
+
+ messageScroll.SetWidget(messageView)
+ messageScroll.SetWidgetResizable(true)
+
+ return
+}
+
+func NewMessage(messageBody string, messageViewLayout *widgets.QGridLayout) {
+ mesageWidget := widgets.NewQWidget(nil, 0)
+ mesageWidget.SetStyleSheet("QLabel { border: 0px; }; QWidget { border: 0px; };")
+
+ messageLayout := widgets.NewQVBoxLayout2(mesageWidget)
+
+ message := widgets.NewQLabel2(messageBody, nil, 0)
+
+ messageLayout.AddWidget(message, 0, core.Qt__AlignTop)
+
+ messageViewLayout.AddWidget(message, 0, 0, core.Qt__AlignTop)
+
+ return
+}
diff --git a/elements/roomlist.go b/elements/roomlist.go
@@ -0,0 +1,33 @@
+package elements
+
+import (
+ "github.com/therecipe/qt/core"
+ "github.com/therecipe/qt/widgets"
+)
+
+func NewRoomList() (roomListView *widgets.QWidget, roomListViewLayout *widgets.QGridLayout) {
+ roomListView = widgets.NewQWidget(nil, 0)
+
+ roomListScroll := widgets.NewQScrollArea(nil)
+ roomListScroll.SetObjectName("roomListScroll")
+ roomListScroll.SetStyleSheet("QAbstractScrollArea#roomListScroll { border: 0px; };")
+
+ roomListViewLayout = widgets.NewQGridLayout(roomListView)
+ roomListViewLayout.SetSpacing(0)
+ roomListViewLayout.SetContentsMargins(0, 0, 0, 0)
+
+ roomListScroll.SetWidget(roomListView)
+ roomListScroll.SetWidgetResizable(true)
+
+ return
+}
+
+func NewRoom(name string, roomListViewLayout *widgets.QGridLayout) {
+ roomWidget := widgets.NewQWidget(nil, 0)
+ roomLayout := widgets.NewQVBoxLayout2(roomWidget)
+ room := widgets.NewQLabel2(name, nil, 0)
+ roomLayout.AddWidget(room, 0, core.Qt__AlignTop)
+ roomListViewLayout.AddWidget(room, 0, 0, core.Qt__AlignTop)
+
+ return
+}
diff --git a/main.go b/main.go
@@ -4,8 +4,10 @@ import (
"log"
"os"
- "github.com/Nordgedanken/Neo/matrix"
- "github.com/Nordgedanken/Neo/util"
+ "fmt"
+ "github.com/Nordgedanken/Morpheus/matrix"
+ "github.com/Nordgedanken/Morpheus/util"
+ "github.com/matrix-org/gomatrix"
"github.com/therecipe/qt/widgets"
"github.com/tidwall/buntdb"
"sync"
@@ -24,18 +26,18 @@ func main() {
db = matrix.OpenDB()
defer db.Close()
- localLog.Println("Starting Neo")
+ localLog.Println("Starting Morpheus")
widgets.NewQApplication(len(os.Args), os.Args)
desktopApp := widgets.QApplication_Desktop()
primaryScreen := desktopApp.PrimaryScreen()
screen := desktopApp.Screen(primaryScreen)
- windowWidth := (screen.Width() / 2)
- windowHeight := (screen.Height() / 2)
+ windowWidth := screen.Width() / 2
+ windowHeight := screen.Height() / 2
window = widgets.NewQMainWindow(nil, 0)
- window.SetMinimumSize2(windowWidth, windowHeight)
+ //window.SetMinimumSize2(windowWidth, windowHeight)
var accessToken string
var homeserverURL string
@@ -68,7 +70,7 @@ func main() {
if accessToken != "" && homeserverURL != "" && userID != "" {
var wg sync.WaitGroup
localLog.Println("Starting Auto Login Sequenze in background")
- results := make(chan *matrix.Client)
+ results := make(chan *gomatrix.Client)
wg.Add(1)
go DoLogin("", "", homeserverURL, userID, accessToken, localLog, results, &wg)
@@ -80,14 +82,16 @@ func main() {
//Show MainUI
for result := range results {
+ fmt.Println(result)
//TODO Don't switch screen on wrong login data.
- MainUI := NewMainUI(windowWidth, windowHeight, result)
- window.SetCentralWidget(MainUI)
+ //mainUI := NewMainUI(windowWidth, windowHeight, result)
+ mainUI := NewMainUI(windowWidth, windowHeight)
+ mainUI.SetMinimumSize2(windowWidth, windowHeight)
+ window.SetCentralWidget(mainUI)
}
} else {
//Show loginUI
loginUI := NewLoginUI(windowWidth, windowHeight)
- loginUI.Resize2(windowWidth, windowHeight)
loginUI.SetMinimumSize2(windowWidth, windowHeight)
window.SetCentralWidget(loginUI)
}
@@ -95,5 +99,5 @@ func main() {
//enter the main event loop
widgets.QApplication_Exec()
- localLog.Println("Stopping Neo")
+ localLog.Println("Stopping Morpheus")
}
diff --git a/matrix/db.go b/matrix/db.go
@@ -13,7 +13,7 @@ var db *buntdb.DB
func OpenDB() (expDB *buntdb.DB) {
// Open the data.db file. It will be created if it doesn't exist.
- configDirs := configdir.New("Nordgedanken", "Neo")
+ configDirs := configdir.New("Nordgedanken", "Morpheus")
if _, err := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/"); os.IsNotExist(err) {
os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/", 0666)
}
diff --git a/matrix/login.go b/matrix/login.go
@@ -8,23 +8,21 @@ import (
)
//GetClient returns a Client
-func GetClient(homeserverURL, userID, accessToken string) (clientInstance *Client, err error) {
- var client *gomatrix.Client
+func GetClient(homeserverURL, userID, accessToken string) (client *gomatrix.Client, err error) {
client, err = gomatrix.NewClient(homeserverURL, userID, accessToken)
if err != nil {
- clientInstance = nil
+ client = nil
return
}
- clientInstance = &Client{client}
err = db.Update(func(tx *buntdb.Tx) error {
- tx.Set("user:accessToken", clientInstance.Client.AccessToken, nil)
- tx.Set("user:homeserverURL", clientInstance.Client.HomeserverURL.String(), nil)
- tx.Set("user:userID", clientInstance.Client.UserID, nil)
+ tx.Set("user:accessToken", client.AccessToken, nil)
+ tx.Set("user:homeserverURL", client.HomeserverURL.String(), nil)
+ tx.Set("user:userID", client.UserID, nil)
return nil
})
if err != nil {
- clientInstance = nil
+ client = nil
return
}
@@ -32,10 +30,10 @@ func GetClient(homeserverURL, userID, accessToken string) (clientInstance *Clien
}
//LoginUser Creates a Session for the User
-func LoginUser(username, password string) (*Client, error) {
+func LoginUser(username, password string) (*gomatrix.Client, error) {
usernameSplit := strings.Split(username, ":")
homeserverURL := usernameSplit[1]
- var cli *Client
+ var cli *gomatrix.Client
var cliErr error
if strings.HasPrefix(homeserverURL, "https://") {
cli, cliErr = GetClient(homeserverURL, "", "")
@@ -48,7 +46,7 @@ func LoginUser(username, password string) (*Client, error) {
return nil, cliErr
}
- resp, err := cli.Client.Login(&gomatrix.ReqLogin{
+ resp, err := cli.Login(&gomatrix.ReqLogin{
Type: "m.login.password",
User: username,
Password: password,
@@ -56,7 +54,7 @@ func LoginUser(username, password string) (*Client, error) {
if err != nil {
return nil, err
}
- cli.Client.SetCredentials(resp.UserID, resp.AccessToken)
+ cli.SetCredentials(resp.UserID, resp.AccessToken)
DBerr := db.Update(func(tx *buntdb.Tx) error {
tx.Set("user:accessToken", resp.AccessToken, nil)
tx.Set("user:deviceID", resp.DeviceID, nil)
diff --git a/matrix/ownUser.go b/matrix/ownUser.go
@@ -5,7 +5,8 @@ import (
"os"
"strings"
- "github.com/Nordgedanken/Neo/util"
+ "github.com/Nordgedanken/Morpheus/util"
+ "github.com/matrix-org/gomatrix"
"github.com/therecipe/qt/gui"
"github.com/tidwall/buntdb"
)
@@ -19,47 +20,15 @@ func init() {
defer file.Close()
}
-// getUserDisplayName returns the Dispaly name to a MXID TODO: rework cache for own User and per Room
-func getUserDisplayName(mxid string, cli *Client) (displayName string, err error) {
- // Get cache
- db.View(func(tx *buntdb.Tx) error {
- QueryErr := tx.AscendKeys("user:"+mxid+":displayName",
- func(key, value string) bool {
- displayName = value
- return true
- })
- if QueryErr != nil {
- return QueryErr
- }
- return nil
- })
-
- // If cache is empty query the api
- if displayName == "" {
- urlPath := cli.Client.BuildURL("profile", mxid, "displayname")
- var resp *RespUserDisplayName
- _, err = cli.Client.MakeRequest("GET", urlPath, nil, &resp)
-
- // Update cache
- err = db.Update(func(tx *buntdb.Tx) error {
- tx.Set("user:"+mxid+":displayName", resp.DisplayName, nil)
- return nil
- })
-
- displayName = resp.DisplayName
- }
- return
-}
-
// getOwnUserAvatar returns a *gui.QPixmap of an UserAvatar
-func getOwnUserAvatar(cli *Client) *gui.QPixmap {
+func getOwnUserAvatar(cli *gomatrix.Client) *gui.QPixmap {
// Init local vars
var avatarData string
var IMGdata string
// Get cache
db.View(func(tx *buntdb.Tx) error {
- QueryErr := tx.AscendKeys("user:"+cli.Client.UserID+":avatarData100x100",
+ QueryErr := tx.AscendKeys("user:"+cli.UserID+":avatarData100x100",
func(key, value string) bool {
avatarData = value
return true
@@ -73,19 +42,19 @@ func getOwnUserAvatar(cli *Client) *gui.QPixmap {
//If cache is empty do a ServerQuery
if avatarData == "" {
// Get avatarURL
- avatarURL, avatarErr := cli.Client.GetAvatarURL()
+ avatarURL, avatarErr := cli.GetAvatarURL()
if avatarErr != nil {
localLog.Println(avatarErr)
}
// If avatarURL is not empty (aka. has a avatar set) download it at the size of 100x100. Else make the data string empty
if avatarURL != "" {
- hsURL := cli.Client.HomeserverURL.String()
+ hsURL := cli.HomeserverURL.String()
avatarURL_splits := strings.Split(strings.Replace(avatarURL, "mxc://", "", -1), "/")
urlPath := hsURL + "/_matrix/media/r0/thumbnail/" + avatarURL_splits[0] + "/" + avatarURL_splits[1] + "?width=100&height=100"
- data, err := cli.Client.MakeRequest("GET", urlPath, nil, nil)
+ data, err := cli.MakeRequest("GET", urlPath, nil, nil)
if err != nil {
localLog.Println(err)
}
@@ -97,7 +66,7 @@ func getOwnUserAvatar(cli *Client) *gui.QPixmap {
// Update cache
DBerr := db.Update(func(tx *buntdb.Tx) error {
- tx.Set("user:"+cli.Client.UserID+":avatarData100x100", IMGdata, nil)
+ tx.Set("user:"+cli.UserID+":avatarData100x100", IMGdata, nil)
return nil
})
if DBerr != nil {
diff --git a/matrix/types.go b/matrix/types.go
@@ -1,28 +0,0 @@
-package matrix
-
-import (
- "github.com/matrix-org/gomatrix"
- "github.com/therecipe/qt/gui"
-)
-
-// Client is the Client type extender toadd new methods to it which gomatrix lacks currently
-type Client struct {
- Client *gomatrix.Client
-}
-
-// RespUserDisplayName is the Response type of getUserDisplayName()
-type RespUserDisplayName struct {
- DisplayName string `json:"displayname"`
-}
-
-// GetUserDisplayName returns the Dispaly name to a MXID
-func (cli *Client) GetUserDisplayName(mxid string) (displayName string, err error) {
- displayName, err = getUserDisplayName(mxid, cli)
- return
-}
-
-// GetOwnUserAvatar returns a *gui.QPixmap of an UserAvatar
-func (cli *Client) GetOwnUserAvatar() (img *gui.QPixmap) {
- img = getOwnUserAvatar(cli)
- return
-}
diff --git a/qml/icons/README.md b/qml/icons/README.md
@@ -0,0 +1,7 @@
+# Icons come from [Typicons](http://typicons.com)
+
+## License
+See: https://github.com/stephenhutchings/typicons.font#license
+
+## Used Version
+v2.0.7
+\ No newline at end of file
diff --git a/qml/icons/cog.svg b/qml/icons/cog.svg
@@ -0,0 +1 @@
+<svg version="1.2" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M9.387 17.548l.371 1.482c.133.533.692.97 1.242.97h1c.55 0 1.109-.437 1.242-.97l.371-1.482c.133-.533.675-.846 1.203-.694l1.467.42c.529.151 1.188-.114 1.462-.591l.5-.867c.274-.477.177-1.179-.219-1.562l-1.098-1.061c-.396-.383-.396-1.008.001-1.39l1.096-1.061c.396-.382.494-1.084.22-1.561l-.501-.867c-.275-.477-.933-.742-1.461-.591l-1.467.42c-.529.151-1.07-.161-1.204-.694l-.37-1.48c-.133-.532-.692-.969-1.242-.969h-1c-.55 0-1.109.437-1.242.97l-.37 1.48c-.134.533-.675.846-1.204.695l-1.467-.42c-.529-.152-1.188.114-1.462.59l-.5.867c-.274.477-.177 1.179.22 1.562l1.096 1.059c.395.383.395 1.008 0 1.391l-1.098 1.061c-.395.383-.494 1.085-.219 1.562l.501.867c.274.477.933.742 1.462.591l1.467-.42c.528-.153 1.07.16 1.203.693zm2.113-7.048c1.104 0 2 .895 2 2 0 1.104-.896 2-2 2s-2-.896-2-2c0-1.105.896-2 2-2z"/></svg>
+\ No newline at end of file
diff --git a/qml/icons/phone.svg b/qml/icons/phone.svg
@@ -0,0 +1 @@
+<svg version="1.2" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M13.374 7.083l3.711-3.71-.438-.434c-.566-.566-1.555-.566-2.121 0l-1.586 1.586c-.284.284-.44.661-.44 1.061s.156.777.438 1.06l.436.437zM6.646 12.939c-.566-.566-1.555-.566-2.121 0l-1.586 1.586c-.283.284-.439.661-.439 1.061s.156.777.441 1.062l.437.432 3.703-3.703-.435-.438zM18.437 4.729l-.354-.354-3.708 3.708.65.649c.095.095.146.22.146.354s-.052.259-.146.354l-5.586 5.586c-.189.188-.518.189-.707 0l-.65-.65-3.702 3.71.354.354c.26.26 1.246 1.105 3.056 1.105 1.616 0 4.256-.712 7.65-4.105 6.773-6.775 3.158-10.55 2.997-10.711z"/></svg>
+\ No newline at end of file
diff --git a/qml/icons/video.svg b/qml/icons/video.svg
@@ -0,0 +1 @@
+<svg version="1.2" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M22.525 7.149c-.16-.099-.342-.149-.525-.149-.153 0-.306.035-.447.105l-2.553 1.277v-.382c0-1.654-1.346-3-3-3h-11c-1.654 0-3 1.346-3 3v8c0 1.654 1.346 3 3 3h11c1.654 0 3-1.346 3-3v-.382l2.553 1.276c.141.071.294.106.447.106.183 0 .365-.05.525-.149.295-.183.475-.504.475-.851v-8c0-.347-.18-.668-.475-.851zm-15.525 6.351c-.829 0-1.5-.671-1.5-1.5s.671-1.5 1.5-1.5 1.5.671 1.5 1.5-.671 1.5-1.5 1.5z"/></svg>
+\ No newline at end of file
diff --git a/qml/ui/chat.ui b/qml/ui/chat.ui
@@ -0,0 +1,685 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ChatWidget</class>
+ <widget class="QWidget" name="ChatWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1585</width>
+ <height>730</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Neo</string>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">background-color: rgb(244, 246, 250);</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QWidget" name="sidebarWidget_2" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">background-color: rgb(70, 79, 96);</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_6">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QWidget" name="widget_5" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <widget class="QLabel" name="UserAvatar">
+ <property name="geometry">
+ <rect>
+ <x>7</x>
+ <y>10</y>
+ <width>61</width>
+ <height>61</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap>../../../../../../../Downloads/avatar.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QWidget" name="widget_4" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_8">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QWidget" name="widget_6" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="spacing">
+ <number>84</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="pushButton_11">
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>27</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>PushButton</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_12">
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>28</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>PushButton</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_13">
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>27</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>PushButton</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_14">
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>28</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>PushButton</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_15">
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>27</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>PushButton</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_3" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QPushButton" name="settingsMenuButton_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>41</width>
+ <height>41</height>
+ </size>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">border: 0;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/qml/icons/cog.svg</normaloff>:/qml/icons/cog.svg</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>35</width>
+ <height>35</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ <zorder>widget_4</zorder>
+ <zorder>widget_5</zorder>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QWidget" name="widget_2" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QWidget" name="widget" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>9</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>9</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLineEdit" name="SearchInput_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>271</width>
+ <height>31</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">background-color: rgb(235, 239, 245);
+border: 0;
+border-radius: 5px;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="placeholderText">
+ <string>Search...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QScrollArea" name="RoomScroll_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>291</width>
+ <height>671</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">border:0;</string>
+ </property>
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAsNeeded</enum>
+ </property>
+ <property name="horizontalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOff</enum>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents_4">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>291</width>
+ <height>681</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>291</width>
+ <height>671</height>
+ </size>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QWidget" name="RoomWidget_2" native="true">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">background-color: rgb(250, 250, 250);</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_9">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QWidget" name="titleBar_3" native="true">
+ <property name="minimumSize">
+ <size>
+ <width>901</width>
+ <height>91</height>
+ </size>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_7">
+ <item row="0" column="0">
+ <widget class="QLabel" name="RoomImage_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>71</width>
+ <height>71</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap>../../../../../../../Downloads/MatrixHQ.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QLabel" name="RoomTitel_3">
+ <property name="minimumSize">
+ <size>
+ <width>611</width>
+ <height>31</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>Arial</family>
+ <pointsize>25</pointsize>
+ <underline>true</underline>
+ <stylestrategy>PreferAntialias</stylestrategy>
+ </font>
+ </property>
+ <property name="text">
+ <string>Matrix HQ</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="subTitle_3">
+ <property name="minimumSize">
+ <size>
+ <width>611</width>
+ <height>31</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>Arial</family>
+ <pointsize>9</pointsize>
+ <stylestrategy>PreferAntialias</stylestrategy>
+ </font>
+ </property>
+ <property name="text">
+ <string>The Official Matrix HQ - please come chat here! | To support Matrix.org development: https://patreon.com/matrixdotorg | Try http://riot.im/app for a glossy web client | Looking for homeserver hosting? Check out https://upcloud.com/matrix!</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::AutoText</enum>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="2">
+ <widget class="QPushButton" name="videoCallButton_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>41</width>
+ <height>41</height>
+ </size>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">border: 0;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/qml/icons/video.svg</normaloff>:/qml/icons/video.svg</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>35</width>
+ <height>35</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QPushButton" name="callButton_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>41</width>
+ <height>41</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">border: 0;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/qml/icons/phone.svg</normaloff>:/qml/icons/phone.svg</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>35</width>
+ <height>35</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_7">
+ <property name="spacing">
+ <number>21</number>
+ </property>
+ <item>
+ <widget class="QScrollArea" name="messageScroll_3">
+ <property name="minimumSize">
+ <size>
+ <width>901</width>
+ <height>581</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">border:0;</string>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents_5">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1217</width>
+ <height>581</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>901</width>
+ <height>581</height>
+ </size>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="messageInputWrapper_2" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>889</width>
+ <height>50</height>
+ </size>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_5">
+ <item row="0" column="0">
+ <widget class="QLineEdit" name="MessageInput_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>861</width>
+ <height>31</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">background-color: rgb(229, 229, 229);
+border: 0;
+border-radius: 5px;
+padding: 3px</string>
+ </property>
+ <property name="inputMask">
+ <string/>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="placeholderText">
+ <string>Send a Message (unecrypted)...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ <zorder>widget_2</zorder>
+ <zorder>sidebarWidget_2</zorder>
+ <zorder>RoomWidget_2</zorder>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/uis.go b/uis.go
@@ -2,24 +2,23 @@ package main
import (
"fmt"
- "log"
- "strings"
- "sync"
- "time"
-
- "github.com/Nordgedanken/Neo/matrix"
+ "github.com/Nordgedanken/Morpheus/matrix"
"github.com/matrix-org/gomatrix"
"github.com/therecipe/qt/core"
+ "github.com/therecipe/qt/gui"
+ "github.com/therecipe/qt/uitools"
"github.com/therecipe/qt/widgets"
- "github.com/tidwall/buntdb"
+ "log"
+ "strings"
+ "sync"
)
var username string
var password string
-func DoLogin(username, password, homeserverURL, userID, accessToken string, localLog *log.Logger, results chan<- *matrix.Client, wg *sync.WaitGroup) {
+func DoLogin(username, password, homeserverURL, userID, accessToken string, localLog *log.Logger, results chan<- *gomatrix.Client, wg *sync.WaitGroup) {
defer wg.Done()
- var cli *matrix.Client
+ var cli *gomatrix.Client
if accessToken != "" && homeserverURL != "" && userID != "" {
var cliErr error
if strings.HasPrefix(homeserverURL, "https://") {
@@ -32,7 +31,7 @@ func DoLogin(username, password, homeserverURL, userID, accessToken string, loca
if cliErr != nil {
localLog.Println(cliErr)
}
- cli.Client.SetCredentials(userID, accessToken)
+ cli.SetCredentials(userID, accessToken)
} else {
var err error
cli, err = matrix.LoginUser(username, password)
@@ -47,6 +46,8 @@ func DoLogin(username, password, homeserverURL, userID, accessToken string, loca
//NewLoginUI initializes the login Screen
func NewLoginUI(windowWidth, windowHeight int) *widgets.QWidget {
widget := widgets.NewQWidget(nil, 0)
+ widget.SetObjectName("LoginWrapper")
+ widget.SetStyleSheet("QWidget#LoginWrapper { border: 0px; };")
topLayout := widgets.NewQVBoxLayout()
formWidget := widgets.NewQWidget(nil, 0)
@@ -115,7 +116,7 @@ func NewLoginUI(windowWidth, windowHeight int) *widgets.QWidget {
if username != "" && password != "" {
localLog.Println("Starting Login Sequenze in background")
- results := make(chan *matrix.Client)
+ results := make(chan *gomatrix.Client)
wg.Add(1)
go DoLogin(username, password, "", "", "", localLog, results, &wg)
@@ -127,174 +128,62 @@ func NewLoginUI(windowWidth, windowHeight int) *widgets.QWidget {
//Show MainUI
for result := range results {
+ fmt.Println(result)
//TODO Don't switch screen on wrong login data.
- MainUI := NewMainUI(windowWidth, windowHeight, result)
- window.SetCentralWidget(MainUI)
+ //MainUI := NewMainUI(windowWidth, windowHeight, result)
+ mainUI := NewMainUI(windowWidth, windowHeight)
+ window.SetCentralWidget(mainUI)
}
} else {
localLog.Println("Username and/or password is empty. Do Nothing.")
}
})
- widget.SetWindowTitle("Neo - Login")
+ widget.SetWindowTitle("Morpheus - Login")
return widget
}
//NewMainUI initializes the login Screen
-func NewMainUI(windowWidth, windowHeight int, cli *matrix.Client) *widgets.QWidget {
- widget := widgets.NewQWidget(nil, 0)
- topLayout := widgets.NewQVBoxLayout2(widget)
-
- // var (
- // usernameLabel = widgets.NewQLabelFromPointer(widget.FindChild("UsernameLabel", core.Qt__FindChildrenRecursively).Pointer())
- // mxidLabel = widgets.NewQLabelFromPointer(widget.FindChild("MXIDLabel", core.Qt__FindChildrenRecursively).Pointer())
- // avatarLogo = widgets.NewQLabelFromPointer(widget.FindChild("AvatarLabel", core.Qt__FindChildrenRecursively).Pointer())
- // )
- //
- // // Set MXID Label
- // mxidLabel.SetText(fmt.Sprint(username))
- //
- // // Set Dispalyname Label
- // displayName, displayNameErr := cli.GetUserDisplayName(username)
- // if displayNameErr != nil {
- // localLog.Println(displayNameErr)
- // }
- // usernameLabel.SetText(fmt.Sprint(displayName))
- //
- // // Set Avatar
- // avatarLogo.SetAlignment(core.Qt__AlignBottom | core.Qt__AlignRight)
- // avatarLogo.SetPixmap(cli.GetOwnUserAvatar())
-
- // Wrapper
- wrapperWidget := widgets.NewQGroupBox2("", nil)
- wrapperLayout := widgets.NewQGridLayout2()
-
- // Roomlist
- roomListView := widgets.NewQWidget(nil, 0)
- roomListView.SetMinimumHeight(windowHeight)
- roomListScroll := widgets.NewQScrollArea(nil)
- roomListViewLayout := widgets.NewQGridLayout(roomListView)
- roomListScroll.SetWidget(roomListView)
- roomListScroll.SetWidgetResizable(true)
-
- // Fake Room
- RoomWidget := widgets.NewQWidget(nil, 0)
- roomLayout := widgets.NewQVBoxLayout2(RoomWidget)
- room := widgets.NewQLabel2("test", nil, 0)
- roomLayout.AddWidget(room, 0, core.Qt__AlignTop)
- roomListViewLayout.AddWidget(room, 0, 0, core.Qt__AlignTop)
-
- wrapperLayout.AddWidget(roomListScroll, 0, 0, 0)
-
- // Message View
- messageView := widgets.NewQWidget(nil, 0)
- messageView.SetMinimumHeight(windowHeight)
- messageScroll := widgets.NewQScrollArea(nil)
- messageViewLayout := widgets.NewQGridLayout(messageView)
- messageScroll.SetWidget(messageView)
- messageScroll.SetWidgetResizable(true)
-
- // Messages
- syncer := cli.Client.Syncer.(*gomatrix.DefaultSyncer)
- customStore := gomatrix.NewInMemoryStore()
- cli.Client.Store = customStore
- syncer.Store = customStore
- syncer.OnEventType("m.room.message", func(ev *gomatrix.Event) {
- // TODO Later needs to match current Room
- if ev.RoomID == "!zTIXGmDjyRcAqbrWab:matrix.ffslfl.net" {
- messageBody, messageOk := ev.Body()
- if messageOk == true {
- mesageWidget := widgets.NewQWidget(nil, 0)
- messageLayout := widgets.NewQVBoxLayout2(mesageWidget)
- message := widgets.NewQLabel2(messageBody, nil, 0)
- messageLayout.AddWidget(message, 0, core.Qt__AlignTop)
- messageViewLayout.AddWidget(message, 0, 0, core.Qt__AlignTop)
- } else {
- localLog.Println("Message not ok: ", messageOk)
- }
- }
- })
+//func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client) *widgets.QWidget {
+func NewMainUI(windowWidth, windowHeight int) *widgets.QWidget {
+ var widget = widgets.NewQWidget(nil, 0)
- // Start Non-blocking sync
- localLog.Println("Syncing now")
- go func() {
- for {
- fmt.Println("sync")
- if e := cli.Client.Sync(); e != nil {
- fmt.Println("Fatal Sync() error")
- time.Sleep(10 * time.Second)
- }
- time.Sleep(10 * time.Second)
- }
- }()
+ var loader = uitools.NewQUiLoader(nil)
+ var file = core.NewQFile2(":/qml/ui/chat.ui")
- localLog.Println("Started Syncing")
+ file.Open(core.QIODevice__ReadOnly)
+ var mainWidget = loader.Load(file, widget)
+ file.Close()
- wrapperLayout.AddWidget(messageScroll, 0, 1, 0)
+ mainWidget.SetMinimumSize2(windowWidth, windowHeight)
+ mainWidget.Resize2(windowWidth, windowHeight)
+ mainWidget.SetGeometry2(0, 0, windowWidth, windowHeight)
- // logoutButton //TODO move it to correct place
- buttonWidget := widgets.NewQWidget(nil, 0)
- buttonLayout := widgets.NewQVBoxLayout()
+ widget.SetMinimumSize2(windowWidth, windowHeight)
+ widget.SetGeometry2(0, 0, windowWidth, windowHeight)
- logoutButton := widgets.NewQPushButton2("LOGOUT", nil)
- logoutButton.SetMinimumSize2(350, 65)
+ chatWidget := widgets.NewQWidgetFromPointer(widget.FindChild("ChatWidget", core.Qt__FindChildrenRecursively).Pointer())
+ chatWidget.SetMinimumSize2(windowWidth, windowHeight)
+ chatWidget.SetGeometry2(0, 0, windowWidth, windowHeight)
- buttonLayout.AddStretch(1)
- buttonLayout.AddWidget(logoutButton, 0, 0)
- buttonLayout.AddStretch(1)
+ mainWidget.SetWindowTitle("Morpheus - MatrixHQ")
+ var layout = widgets.NewQHBoxLayout()
+ layout.AddWidget(mainWidget, 1, core.Qt__AlignTop|core.Qt__AlignLeft)
+ widget.SetLayout(layout)
+ layout.SetSpacing(0)
+ layout.SetContentsMargins(0, 0, 0, 0)
- buttonWidget.SetLayout(buttonLayout)
- wrapperLayout.AddWidget(buttonWidget, 1, 0, core.Qt__AlignBottom)
+ window.ConnectResizeEvent(func(event *gui.QResizeEvent) {
- logoutButton.ConnectClicked(func(checked bool) {
- //TODO register enter and show loader or so
- localLog.Println("Starting Logout Sequenze in background")
- var wg sync.WaitGroup
- results := make(chan bool)
-
- wg.Add(1)
- go func(cli *matrix.Client, localLog *log.Logger, results chan<- bool) {
- defer wg.Done()
- _, err := cli.Client.Logout()
- if err != nil {
- localLog.Println(err)
- results <- false
- } else {
- cli.Client.ClearCredentials()
- //Flush complete DB
- db.View(func(tx *buntdb.Tx) error {
- var QueryErr error
- QueryErr = tx.DeleteAll()
- if QueryErr != nil {
- return QueryErr
- }
- return nil
- })
- results <- true
- }
- }(cli, localLog, results)
-
- go func() {
- wg.Wait() // wait for each execTask to return
- close(results) // then close the results channel
- }()
-
- //Show MainUI
- for result := range results {
- if result {
- LoginUI := NewLoginUI(windowWidth, windowHeight)
- window.SetCentralWidget(LoginUI)
- }
- }
- })
+ widget.SetGeometry2(0, 0, event.Size().Width(), event.Size().Height())
+ mainWidget.SetGeometry2(0, 0, event.Size().Width(), event.Size().Height())
+ chatWidget.SetGeometry2(0, 0, event.Size().Width(), event.Size().Height())
- wrapperLayout.SetColumnMinimumWidth(0, windowWidth/3)
- wrapperLayout.SetColumnMinimumWidth(1, (windowWidth/3)*2)
- wrapperLayout.SetRowMinimumHeight(0, windowHeight)
- wrapperWidget.SetLayout(wrapperLayout)
- topLayout.AddWidget(wrapperWidget, 1, core.Qt__AlignVCenter)
- widget.SetLayout(topLayout)
+ widget.Resize(event.Size())
+ mainWidget.Resize(event.Size())
+ chatWidget.Resize(event.Size())
+ })
return widget
}
diff --git a/uis.old b/uis.old
@@ -0,0 +1,146 @@
+ widget := widgets.NewQWidget(nil, 0)
+ widget.SetObjectName("MainWrapper")
+ widget.SetStyleSheet("QWidget#MainWrapper { border: 0px; };")
+ window.SetupUi(widget)
+ topLayout := widgets.NewQVBoxLayout2(widget)
+ topLayout.SetSpacing(0)
+
+ // var (
+ // usernameLabel = widgets.NewQLabelFromPointer(widget.FindChild("UsernameLabel", core.Qt__FindChildrenRecursively).Pointer())
+ // mxidLabel = widgets.NewQLabelFromPointer(widget.FindChild("MXIDLabel", core.Qt__FindChildrenRecursively).Pointer())
+ // avatarLogo = widgets.NewQLabelFromPointer(widget.FindChild("AvatarLabel", core.Qt__FindChildrenRecursively).Pointer())
+ // )
+ //
+ // // Set MXID Label
+ // mxidLabel.SetText(fmt.Sprint(username))
+ //
+ // // Set Dispalyname Label
+ // displayName, displayNameErr := cli.GetUserDisplayName(username)
+ // if displayNameErr != nil {
+ // localLog.Println(displayNameErr)
+ // }
+ // usernameLabel.SetText(fmt.Sprint(displayName))
+ //
+ // // Set Avatar
+ // avatarLogo.SetAlignment(core.Qt__AlignBottom | core.Qt__AlignRight)
+ // avatarLogo.SetPixmap(cli.GetOwnUserAvatar())
+
+ // Wrapper
+ wrapperWidget := widgets.NewQGroupBox2("", nil)
+ wrapperWidget.SetContentsMargins(0, 0, 0, 0)
+ wrapperWidget.SetObjectName("MainWrapperWidget")
+ wrapperWidget.SetStyleSheet("QWidget#MainWrapperWidget { border: 0px; };")
+ wrapperLayout := widgets.NewQGridLayout2()
+ wrapperLayout.SetSpacing(0)
+ wrapperLayout.SetContentsMargins(0, 0, 0, 0)
+
+ // Roomlist
+ roomList, roomListLayout := elements.NewRoomList()
+
+ // Fake Room
+ elements.NewRoom("Test", roomListLayout)
+
+ wrapperLayout.AddWidget(roomList, 0, 0, 0)
+
+ // Message View
+ messageList, messageListLayout := elements.NewMessageList()
+
+ // Messages
+ syncer := cli.Syncer.(*gomatrix.DefaultSyncer)
+ customStore := gomatrix.NewInMemoryStore()
+ cli.Store = customStore
+ syncer.Store = customStore
+ syncer.OnEventType("m.room.message", func(ev *gomatrix.Event) {
+ // TODO Later needs to match current Room
+ if ev.RoomID == "!zTIXGmDjyRcAqbrWab:matrix.ffslfl.net" {
+ messageBody, messageOk := ev.Body()
+ if messageOk == true {
+ elements.NewMessage(messageBody, messageListLayout)
+ } else {
+ localLog.Println("Message not ok: ", messageOk)
+ }
+ }
+ })
+
+ // Start Non-blocking sync
+ localLog.Println("Syncing now")
+ go func() {
+ for {
+ fmt.Println("sync")
+ if e := cli.Sync(); e != nil {
+ fmt.Println("Fatal Sync() error")
+ time.Sleep(10 * time.Second)
+ }
+ time.Sleep(10 * time.Second)
+ }
+ }()
+
+ localLog.Println("Started Syncing")
+
+ wrapperLayout.AddWidget(messageList, 0, 1, 0)
+
+ // logoutButton //TODO move it to correct place
+ buttonWidget := widgets.NewQWidget(nil, 0)
+ buttonLayout := widgets.NewQVBoxLayout()
+ buttonLayout.SetSpacing(0)
+
+ logoutButton := widgets.NewQPushButton2("LOGOUT", nil)
+ logoutButton.SetMinimumSize2(350, 65)
+
+ buttonLayout.AddStretch(1)
+ buttonLayout.AddWidget(logoutButton, 0, 0)
+ buttonLayout.AddStretch(1)
+
+ buttonWidget.SetLayout(buttonLayout)
+ wrapperLayout.AddWidget(buttonWidget, 1, 0, core.Qt__AlignBottom)
+
+ logoutButton.ConnectClicked(func(checked bool) {
+ //TODO register enter and show loader or so
+ localLog.Println("Starting Logout Sequenze in background")
+ var wg sync.WaitGroup
+ results := make(chan bool)
+
+ wg.Add(1)
+ go func(cli *gomatrix.Client, localLog *log.Logger, results chan<- bool) {
+ defer wg.Done()
+ _, err := cli.Logout()
+ if err != nil {
+ localLog.Println(err)
+ results <- false
+ } else {
+ cli.ClearCredentials()
+ //Flush complete DB
+ db.View(func(tx *buntdb.Tx) error {
+ var QueryErr error
+ QueryErr = tx.DeleteAll()
+ if QueryErr != nil {
+ return QueryErr
+ }
+ return nil
+ })
+ results <- true
+ }
+ }(cli, localLog, results)
+
+ go func() {
+ wg.Wait() // wait for each execTask to return
+ close(results) // then close the results channel
+ }()
+
+ //Show MainUI
+ for result := range results {
+ if result {
+ LoginUI := NewLoginUI(windowWidth, windowHeight)
+ window.SetCentralWidget(LoginUI)
+ }
+ }
+ })
+
+ wrapperLayout.SetColumnMinimumWidth(0, windowWidth/3)
+ wrapperLayout.SetColumnMinimumWidth(1, (windowWidth/3)*2)
+ wrapperLayout.SetRowMinimumHeight(0, windowHeight)
+ wrapperWidget.SetLayout(wrapperLayout)
+ topLayout.AddWidget(wrapperWidget, 1, core.Qt__AlignVCenter)
+ widget.SetLayout(topLayout)
+
+ return widget
+\ No newline at end of file
diff --git a/util/logger.go b/util/logger.go
@@ -24,11 +24,11 @@ func Logger() *log.Logger {
//StartFileLog initialises the logging function
func StartFileLog(localLog *log.Logger) (*log.Logger, *os.File) {
- configDirs := configdir.New("Nordgedanken", "Neo")
+ configDirs := configdir.New("Nordgedanken", "Morpheus")
if _, err := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/log/"); os.IsNotExist(err) {
os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/log/", 0666)
}
- f, err := os.OpenFile(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/log/Neo.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
+ f, err := os.OpenFile(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/log/Morpheus.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
if err != nil {
localLog.Printf("error opening file: %v", err)
}