morpheus

A Matrix client written in Go-QT
git clone git://archive.git.mtrnord.blog/Nordgedanken/morpheus.git
Log | Files | Refs | README | LICENSE

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:
MREADME.md | 8++++----
Mcircle.yml | 2+-
Aelements/messageList.go | 38++++++++++++++++++++++++++++++++++++++
Aelements/roomlist.go | 33+++++++++++++++++++++++++++++++++
Mmain.go | 26+++++++++++++++-----------
Mmatrix/db.go | 2+-
Mmatrix/login.go | 22++++++++++------------
Mmatrix/ownUser.go | 47++++++++---------------------------------------
Dmatrix/types.go | 28----------------------------
Aqml/icons/README.md | 8++++++++
Aqml/icons/cog.svg | 2++
Aqml/icons/phone.svg | 2++
Aqml/icons/video.svg | 2++
Aqml/ui/chat.ui | 685+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Muis.go | 205++++++++++++++++++-------------------------------------------------------------
Auis.old | 147+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mutil/logger.go | 4++--
17 files changed, 1005 insertions(+), 256 deletions(-)

diff --git a/README.md b/README.md @@ -1,11 +1,11 @@ -# Neo -[![CircleCI](https://circleci.com/gh/Nordgedanken/Neo.svg?style=svg)](https://circleci.com/gh/Nordgedanken/Neo) [![Build status](https://ci.appveyor.com/api/projects/status/a0ke0029ely9w7hu?svg=true)](https://ci.appveyor.com/project/MTRNord/neo) +# Morpheus +[![CircleCI](https://circleci.com/gh/Nordgedanken/Morpheus.svg?style=svg)](https://circleci.com/gh/Nordgedanken/Morpheus) [![Build status](https://ci.appveyor.com/api/projects/status/a0ke0029ely9w7hu?svg=true)](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) }