morpheus

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

commit 579aad7c7d9df11111fef21a854ec66e5dd25200
parent 6b6847e4405bbf63abd40c8678918b61d1312d8c
Author: MTRNord <mtrnord1@gmail.com>
Date:   Sat, 14 Oct 2017 20:15:17 +0200

Delint a lot of code and close #18

Signed-off-by: MTRNord <mtrnord1@gmail.com>

Diffstat:
Melements/messageList.go | 5++++-
Mmain.go | 38+++++++++++++++++++++++++++-----------
Mmatrix/db.go | 3+++
Dmatrix/ownUser.go | 228-------------------------------------------------------------------------------
Mmatrix/types.go | 2++
Amatrix/user.go | 228+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mqml/ui/chat.ui | 100+++++++++++++++++++++++++++++++++++++++++++------------------------------------
Muis.go | 37++++++++++++-------------------------
8 files changed, 331 insertions(+), 310 deletions(-)

diff --git a/elements/messageList.go b/elements/messageList.go @@ -20,12 +20,14 @@ import ( // // //////////////////////////////////////////////////// +// QVBoxLayoutWithTriggerSlot defines the QVBoxLayout with TriggerMessage slot to add messages to the View type QVBoxLayoutWithTriggerSlot struct { widgets.QVBoxLayout _ func(messageBody, sender string) `slot:"TriggerMessage"` } +// NewMessageList generates a new QVBoxLayoutWithTriggerSlot and adds it to the message scrollArea func NewMessageList(scrollArea *widgets.QScrollArea, messageView *widgets.QWidget) (messageViewLayout *QVBoxLayoutWithTriggerSlot) { messageViewLayout = NewQVBoxLayoutWithTriggerSlot2(messageView) @@ -38,6 +40,7 @@ func NewMessageList(scrollArea *widgets.QScrollArea, messageView *widgets.QWidge return } +// NewMessage adds a new message object to the view func (messageViewLayout *QVBoxLayoutWithTriggerSlot) NewMessage(body string, cli *gomatrix.Client, sender string, scrollArea *widgets.QScrollArea) { avatar := matrix.GetUserAvatar(cli, sender) @@ -69,7 +72,7 @@ func (messageViewLayout *QVBoxLayoutWithTriggerSlot) NewMessage(body string, cli messageWidget.SetMinimumWidth(messageContent.LineWidth() + 100) messageWidget.Resize(wrapperWidget.Size()) - messageViewLayout.SetSpacing(0) + messageViewLayout.SetSpacing(1) messageViewLayout.SetContentsMargins(0, 0, 0, 0) messageViewLayout.AddWidget(messageWidget, 0, core.Qt__AlignBottom) diff --git a/main.go b/main.go @@ -38,13 +38,17 @@ func main() { appIcon := gui.NewQIcon5(":/qml/resources/logos/MorpheusBig.png") app.SetWindowIcon(appIcon) + window = widgets.NewQMainWindow(nil, 0) + windowHeight := 600 + windowWidth := 950 + desktopApp := widgets.QApplication_Desktop() primaryScreen := desktopApp.PrimaryScreen() screen := desktopApp.Screen(primaryScreen) - windowWidth := screen.Width() / 2 - windowHeight := screen.Height() / 2 + windowX := (screen.Width() - windowHeight) / 2 + windowY := (screen.Height() - windowWidth) / 2 - window = widgets.NewQMainWindow(nil, 0) + window.Move2(windowX, windowY) var accessToken string var homeserverURL string @@ -52,22 +56,32 @@ func main() { // Get cache db.View(func(tx *buntdb.Tx) error { - QueryErr := tx.AscendKeys("user:accessToken", + accessTokenErr := tx.AscendKeys("user:accessToken", func(key, value string) bool { accessToken = value return true }) - QueryErr = tx.AscendKeys("user:homeserverURL", + if accessTokenErr != nil { + return accessTokenErr + } + homeserverURLErr := tx.AscendKeys("user:homeserverURL", func(key, value string) bool { homeserverURL = value return true }) - QueryErr = tx.AscendKeys("user:userID", + if homeserverURLErr != nil { + return homeserverURLErr + } + userIDErr := tx.AscendKeys("user:userID", func(key, value string) bool { userID = value return true }) - return QueryErr + if userIDErr != nil { + return userIDErr + } + + return nil }) if accessToken != "" && homeserverURL != "" && userID != "" { @@ -86,16 +100,18 @@ func main() { //Show MainUI for result := range results { //TODO Don't switch screen on wrong login data. - mainUI := NewMainUI(windowWidth, windowHeight, result) - mainUI.SetMinimumSize2(windowWidth, windowHeight) + mainUI := NewMainUI(windowWidth, windowHeight, result, window) + mainUI.Resize2(windowWidth, windowHeight) window.SetCentralWidget(mainUI) } } else { //Show loginUI - loginUI := NewLoginUI(windowWidth, windowHeight) - loginUI.SetMinimumSize2(windowWidth, windowHeight) + loginUI := NewLoginUI(windowWidth, windowHeight, window) + loginUI.Resize2(windowWidth, windowHeight) window.SetCentralWidget(loginUI) } + + window.Resize2(windowWidth, windowHeight) window.Show() //enter the main event loop diff --git a/matrix/db.go b/matrix/db.go @@ -12,6 +12,7 @@ import ( var db *buntdb.DB +// OpenDB opens or generates the Database file for settings and Cache func OpenDB() (expDB *buntdb.DB) { // Open the data.db file. It will be created if it doesn't exist. configDirs := configdir.New("Nordgedanken", "Morpheus") @@ -27,6 +28,7 @@ func OpenDB() (expDB *buntdb.DB) { return } +// InitData inits basic Data like getting aliases of joinedRooms func InitData(cli *gomatrix.Client, db *buntdb.DB) { roomsURL := cli.BuildURL("joined_rooms") var rooms JoinedRooms @@ -56,6 +58,7 @@ func InitData(cli *gomatrix.Client, db *buntdb.DB) { } } +// CacheMessageEvents writes message infos into the cache into the defined room func CacheMessageEvents(id, sender, roomID, message string, timestamp int64, db *buntdb.DB) { // Update cache DBerr := db.Update(func(tx *buntdb.Tx) error { diff --git a/matrix/ownUser.go b/matrix/ownUser.go @@ -1,228 +0,0 @@ -package matrix - -import ( - "log" - "os" - "strings" - - "bytes" - "fmt" - "github.com/Nordgedanken/Morpheus/util" - "github.com/matrix-org/gomatrix" - "github.com/therecipe/qt/gui" - "github.com/tidwall/buntdb" - "image" - "image/color" - "image/draw" - _ "image/gif" - _ "image/jpeg" - "image/png" - "math/rand" -) - -var localLog *log.Logger - -func init() { - var file *os.File - localLog = util.Logger() - localLog, file = util.StartFileLog(localLog) - defer file.Close() -} - -type circle struct { - p image.Point - r int -} - -func (c *circle) ColorModel() color.Model { - return color.AlphaModel -} - -func (c *circle) Bounds() image.Rectangle { - return image.Rect(c.p.X-c.r, c.p.Y-c.r, c.p.X+c.r, c.p.Y+c.r) -} - -func (c *circle) At(x, y int) color.Color { - xx, yy, rr := float64(x-c.p.X)+0.5, float64(y-c.p.Y)+0.5, float64(c.r) - if xx*xx+yy*yy < rr*rr { - return color.Alpha{255} - } - return color.Alpha{0} -} - -func generateGenericImages(displayname string) string { - // Create an 100 x 100 image - img := image.NewRGBA(image.Rect(0, 0, 100, 100)) - - // Draw a red dot at (2, 3) - img.Set(50, 50, color.RGBA{uint8(rand.Intn(200)), uint8(rand.Intn(255)), uint8(rand.Intn(255)), 255}) - - buf := new(bytes.Buffer) - png.Encode(buf, img) - return string(buf.Bytes()) -} - -// getOwnUserAvatar returns a *gui.QPixmap of an UserAvatar -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.UserID+":avatarData100x100", - func(key, value string) bool { - avatarData = value - return true - }) - if QueryErr != nil { - return QueryErr - } - return nil - }) - - //If cache is empty do a ServerQuery - if avatarData == "" { - // Get avatarURL - 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.HomeserverURL.String() - avatarURLSplits := strings.Split(strings.Replace(avatarURL, "mxc://", "", -1), "/") - - urlPath := hsURL + "/_matrix/media/r0/thumbnail/" + avatarURLSplits[0] + "/" + avatarURLSplits[1] + "?width=100&height=100" - - data, err := cli.MakeRequest("GET", urlPath, nil, nil) - if err != nil { - localLog.Println(err) - } - IMGdata = string(data[:]) - } else { - //TODO Generate default image (Step: AfterUI) - DisplayNameResp, _ := cli.GetOwnDisplayName() - DisplayName := DisplayNameResp.DisplayName - IMGdata = generateGenericImages(DisplayName) - } - - // Update cache - DBerr := db.Update(func(tx *buntdb.Tx) error { - tx.Set("user:"+cli.UserID+":avatarData100x100", IMGdata, nil) - return nil - }) - if DBerr != nil { - localLog.Fatalln("DB ERROR: ", DBerr) - } - } else { - IMGdata = avatarData - } - - r := bytes.NewReader([]byte(IMGdata)) - srcIMG, _, err := image.Decode(r) - if err != nil { - localLog.Println("Decoder error: ", err) - } - - // Convert avatarimage to QPixmap for usage in QT - canvas := image.NewRGBA(srcIMG.Bounds()) - cx := srcIMG.Bounds().Min.X + srcIMG.Bounds().Dx()/2 - cy := srcIMG.Bounds().Min.Y + srcIMG.Bounds().Dy()/2 - draw.DrawMask(canvas, canvas.Bounds(), srcIMG, image.ZP, &circle{image.Point{cx, cy}, 110}, image.ZP, draw.Over) - avatar := gui.NewQPixmap() - buf := new(bytes.Buffer) - Converr := png.Encode(buf, canvas) - if Converr != nil { - localLog.Println("Converting error: ", Converr) - } - - str := fmt.Sprintf("%s", buf) - avatar.LoadFromData(str, uint(len(str)), "", 0) - return avatar -} - -// getOwnUserAvatar returns a *gui.QPixmap of an UserAvatar -func GetUserAvatar(cli *gomatrix.Client, mxid string) *gui.QPixmap { - // Init local vars - var avatarData string - var IMGdata string - - // Get cache - db.View(func(tx *buntdb.Tx) error { - QueryErr := tx.AscendKeys("user:"+mxid+":avatarData100x100", - func(key, value string) bool { - avatarData = value - return true - }) - if QueryErr != nil { - return QueryErr - } - return nil - }) - - //If cache is empty do a ServerQuery - if avatarData == "" { - // Get avatarURL - urlPath := cli.BuildURL("profile", mxid, "avatar_url") - s := struct { - AvatarURL string `json:"avatar_url"` - }{} - - cli.MakeRequest("GET", urlPath, nil, &s) - avatarURL := s.AvatarURL - - // 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.HomeserverURL.String() - avatarURLSplits := strings.Split(strings.Replace(avatarURL, "mxc://", "", -1), "/") - - urlPath := hsURL + "/_matrix/media/r0/thumbnail/" + avatarURLSplits[0] + "/" + avatarURLSplits[1] + "?width=100&height=100" - - data, err := cli.MakeRequest("GET", urlPath, nil, nil) - if err != nil { - localLog.Println(err) - } - IMGdata = string(data[:]) - } else { - //TODO Generate default image (Step: AfterUI) - DisplayNameResp, _ := cli.GetOwnDisplayName() - DisplayName := DisplayNameResp.DisplayName - IMGdata = generateGenericImages(DisplayName) - } - - // Update cache - DBerr := db.Update(func(tx *buntdb.Tx) error { - tx.Set("user:"+mxid+":avatarData100x100", IMGdata, nil) - return nil - }) - if DBerr != nil { - localLog.Fatalln("DB ERROR: ", DBerr) - } - } else { - IMGdata = avatarData - } - - r := bytes.NewReader([]byte(IMGdata)) - srcIMG, _, err := image.Decode(r) - if err != nil { - localLog.Println("Decoder error: ", err) - } - - // Convert avatarimage to QPixmap for usage in QT - canvas := image.NewRGBA(srcIMG.Bounds()) - cx := srcIMG.Bounds().Min.X + srcIMG.Bounds().Dx()/2 - cy := srcIMG.Bounds().Min.Y + srcIMG.Bounds().Dy()/2 - draw.DrawMask(canvas, canvas.Bounds(), srcIMG, image.ZP, &circle{image.Point{cx, cy}, 110}, image.ZP, draw.Over) - avatar := gui.NewQPixmap() - buf := new(bytes.Buffer) - Converr := png.Encode(buf, canvas) - if Converr != nil { - localLog.Println("Converting error: ", Converr) - } - - str := fmt.Sprintf("%s", buf) - avatar.LoadFromData(str, uint(len(str)), "", 0) - return avatar -} diff --git a/matrix/types.go b/matrix/types.go @@ -8,6 +8,7 @@ type HTMLMessage struct { Format string `json:"format"` } +// RoomAliases is the json response when getting the room aliases type RoomAliases struct { Age int `json:"age"` Content struct { @@ -21,6 +22,7 @@ type RoomAliases struct { Type string `json:"type"` } +// JoinedRooms is the json response when getting the joined rooms list type JoinedRooms struct { JoinedRooms []string `json:"joined_rooms"` } diff --git a/matrix/user.go b/matrix/user.go @@ -0,0 +1,228 @@ +package matrix + +import ( + "log" + "os" + "strings" + + "bytes" + "fmt" + "github.com/Nordgedanken/Morpheus/util" + "github.com/matrix-org/gomatrix" + "github.com/therecipe/qt/gui" + "github.com/tidwall/buntdb" + "image" + "image/color" + "image/draw" + // image/jpeg needed to load jpeg images + _ "image/jpeg" + "image/png" + "math/rand" +) + +var localLog *log.Logger + +func init() { + var file *os.File + localLog = util.Logger() + localLog, file = util.StartFileLog(localLog) + defer file.Close() +} + +type circle struct { + p image.Point + r int +} + +func (c *circle) ColorModel() color.Model { + return color.AlphaModel +} + +func (c *circle) Bounds() image.Rectangle { + return image.Rect(c.p.X-c.r, c.p.Y-c.r, c.p.X+c.r, c.p.Y+c.r) +} + +func (c *circle) At(x, y int) color.Color { + xx, yy, rr := float64(x-c.p.X)+0.5, float64(y-c.p.Y)+0.5, float64(c.r) + if xx*xx+yy*yy < rr*rr { + return color.Alpha{255} + } + return color.Alpha{0} +} + +func generateGenericImages(displayname string) string { + // Create an 100 x 100 image + img := image.NewRGBA(image.Rect(0, 0, 100, 100)) + + // Draw a red dot at (2, 3) + img.Set(50, 50, color.RGBA{uint8(rand.Intn(200)), uint8(rand.Intn(255)), uint8(rand.Intn(255)), 255}) + + buf := new(bytes.Buffer) + png.Encode(buf, img) + return string(buf.Bytes()) +} + +// GetOwnUserAvatar returns a *gui.QPixmap of an UserAvatar +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.UserID+":avatarData100x100", + func(key, value string) bool { + avatarData = value + return true + }) + if QueryErr != nil { + return QueryErr + } + return nil + }) + + //If cache is empty do a ServerQuery + if avatarData == "" { + // Get avatarURL + 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.HomeserverURL.String() + avatarURLSplits := strings.Split(strings.Replace(avatarURL, "mxc://", "", -1), "/") + + urlPath := hsURL + "/_matrix/media/r0/thumbnail/" + avatarURLSplits[0] + "/" + avatarURLSplits[1] + "?width=100&height=100" + + data, err := cli.MakeRequest("GET", urlPath, nil, nil) + if err != nil { + localLog.Println(err) + } + IMGdata = string(data[:]) + } else { + //TODO Generate default image (Step: AfterUI) + DisplayNameResp, _ := cli.GetOwnDisplayName() + DisplayName := DisplayNameResp.DisplayName + IMGdata = generateGenericImages(DisplayName) + } + + // Update cache + DBerr := db.Update(func(tx *buntdb.Tx) error { + tx.Set("user:"+cli.UserID+":avatarData100x100", IMGdata, nil) + return nil + }) + if DBerr != nil { + localLog.Fatalln("DB ERROR: ", DBerr) + } + } else { + IMGdata = avatarData + } + + r := bytes.NewReader([]byte(IMGdata)) + srcIMG, _, err := image.Decode(r) + if err != nil { + localLog.Println("Decoder error: ", err) + } + + // Convert avatarimage to QPixmap for usage in QT + canvas := image.NewRGBA(srcIMG.Bounds()) + cx := srcIMG.Bounds().Min.X + srcIMG.Bounds().Dx()/2 + cy := srcIMG.Bounds().Min.Y + srcIMG.Bounds().Dy()/2 + draw.DrawMask(canvas, canvas.Bounds(), srcIMG, image.ZP, &circle{image.Point{cx, cy}, 110}, image.ZP, draw.Over) + avatar := gui.NewQPixmap() + buf := new(bytes.Buffer) + Converr := png.Encode(buf, canvas) + if Converr != nil { + localLog.Println("Converting error: ", Converr) + } + + str := fmt.Sprintf("%s", buf) + avatar.LoadFromData(str, uint(len(str)), "", 0) + return avatar +} + +// GetUserAvatar returns a *gui.QPixmap of an UserAvatar +func GetUserAvatar(cli *gomatrix.Client, mxid string) *gui.QPixmap { + // Init local vars + var avatarData string + var IMGdata string + + // Get cache + db.View(func(tx *buntdb.Tx) error { + QueryErr := tx.AscendKeys("user:"+mxid+":avatarData100x100", + func(key, value string) bool { + avatarData = value + return true + }) + if QueryErr != nil { + return QueryErr + } + return nil + }) + + //If cache is empty do a ServerQuery + if avatarData == "" { + // Get avatarURL + urlPath := cli.BuildURL("profile", mxid, "avatar_url") + s := struct { + AvatarURL string `json:"avatar_url"` + }{} + + cli.MakeRequest("GET", urlPath, nil, &s) + avatarURL := s.AvatarURL + + // 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.HomeserverURL.String() + avatarURLSplits := strings.Split(strings.Replace(avatarURL, "mxc://", "", -1), "/") + + urlPath := hsURL + "/_matrix/media/r0/thumbnail/" + avatarURLSplits[0] + "/" + avatarURLSplits[1] + "?width=100&height=100" + + data, err := cli.MakeRequest("GET", urlPath, nil, nil) + if err != nil { + localLog.Println(err) + } + IMGdata = string(data[:]) + } else { + //TODO Generate default image (Step: AfterUI) + DisplayNameResp, _ := cli.GetOwnDisplayName() + DisplayName := DisplayNameResp.DisplayName + IMGdata = generateGenericImages(DisplayName) + } + + // Update cache + DBerr := db.Update(func(tx *buntdb.Tx) error { + tx.Set("user:"+mxid+":avatarData100x100", IMGdata, nil) + return nil + }) + if DBerr != nil { + localLog.Fatalln("DB ERROR: ", DBerr) + } + } else { + IMGdata = avatarData + } + + r := bytes.NewReader([]byte(IMGdata)) + srcIMG, _, err := image.Decode(r) + if err != nil { + localLog.Println("Decoder error: ", err) + } + + // Convert avatarimage to QPixmap for usage in QT + canvas := image.NewRGBA(srcIMG.Bounds()) + cx := srcIMG.Bounds().Min.X + srcIMG.Bounds().Dx()/2 + cy := srcIMG.Bounds().Min.Y + srcIMG.Bounds().Dy()/2 + draw.DrawMask(canvas, canvas.Bounds(), srcIMG, image.ZP, &circle{image.Point{cx, cy}, 110}, image.ZP, draw.Over) + avatar := gui.NewQPixmap() + buf := new(bytes.Buffer) + Converr := png.Encode(buf, canvas) + if Converr != nil { + localLog.Println("Converting error: ", Converr) + } + + str := fmt.Sprintf("%s", buf) + avatar.LoadFromData(str, uint(len(str)), "", 0) + return avatar +} diff --git a/qml/ui/chat.ui b/qml/ui/chat.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>1585</width> - <height>745</height> + <width>950</width> + <height>600</height> </rect> </property> <property name="sizePolicy"> @@ -16,8 +16,18 @@ <verstretch>0</verstretch> </sizepolicy> </property> + <property name="minimumSize"> + <size> + <width>950</width> + <height>600</height> + </size> + </property> <property name="windowTitle"> - <string>Neo</string> + <string>Morpheus</string> + </property> + <property name="windowIcon"> + <iconset resource="../../rcc.qrc"> + <normaloff>:/qml/resources/logos/MorpheusBig.png</normaloff>:/qml/resources/logos/MorpheusBig.png</iconset> </property> <property name="autoFillBackground"> <bool>false</bool> @@ -171,8 +181,8 @@ </property> <property name="minimumSize"> <size> - <width>41</width> - <height>41</height> + <width>0</width> + <height>0</height> </size> </property> <property name="toolTip"> @@ -233,8 +243,8 @@ </property> <property name="minimumSize"> <size> - <width>41</width> - <height>41</height> + <width>0</width> + <height>0</height> </size> </property> <property name="toolTip"> @@ -295,8 +305,8 @@ </property> <property name="minimumSize"> <size> - <width>41</width> - <height>41</height> + <width>0</width> + <height>0</height> </size> </property> <property name="toolTip"> @@ -357,8 +367,8 @@ </property> <property name="minimumSize"> <size> - <width>41</width> - <height>41</height> + <width>0</width> + <height>0</height> </size> </property> <property name="mouseTracking"> @@ -419,8 +429,8 @@ </property> <property name="minimumSize"> <size> - <width>41</width> - <height>41</height> + <width>0</width> + <height>0</height> </size> </property> <property name="toolTip"> @@ -553,15 +563,15 @@ border-radius: 5px;</string> <item> <widget class="QScrollArea" name="roomBarArea"> <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Expanding"> + <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> - <width>291</width> - <height>671</height> + <width>0</width> + <height>0</height> </size> </property> <property name="styleSheet"> @@ -584,14 +594,14 @@ border-radius: 5px;</string> <rect> <x>0</x> <y>0</y> - <width>291</width> - <height>696</height> + <width>271</width> + <height>551</height> </rect> </property> <property name="minimumSize"> <size> - <width>291</width> - <height>671</height> + <width>0</width> + <height>0</height> </size> </property> </widget> @@ -631,8 +641,8 @@ border-radius: 5px;</string> <widget class="QWidget" name="titleBar" native="true"> <property name="minimumSize"> <size> - <width>901</width> - <height>91</height> + <width>0</width> + <height>0</height> </size> </property> <property name="styleSheet"> @@ -650,8 +660,8 @@ border-radius: 2px;</string> </property> <property name="minimumSize"> <size> - <width>71</width> - <height>71</height> + <width>0</width> + <height>0</height> </size> </property> <property name="text"> @@ -671,8 +681,8 @@ border-radius: 2px;</string> <widget class="QLabel" name="RoomTitel"> <property name="minimumSize"> <size> - <width>611</width> - <height>31</height> + <width>0</width> + <height>0</height> </size> </property> <property name="font"> @@ -692,8 +702,8 @@ border-radius: 2px;</string> <widget class="QLabel" name="subTitle"> <property name="minimumSize"> <size> - <width>611</width> - <height>31</height> + <width>0</width> + <height>0</height> </size> </property> <property name="font"> @@ -732,8 +742,8 @@ border-radius: 2px;</string> </property> <property name="minimumSize"> <size> - <width>41</width> - <height>41</height> + <width>0</width> + <height>0</height> </size> </property> <property name="toolTip"> @@ -773,8 +783,8 @@ border-radius: 2px;</string> </property> <property name="minimumSize"> <size> - <width>41</width> - <height>41</height> + <width>0</width> + <height>0</height> </size> </property> <property name="toolTip"> @@ -812,15 +822,15 @@ border-radius: 2px;</string> <item> <widget class="QScrollArea" name="messageScroll"> <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> - <width>901</width> - <height>581</height> + <width>0</width> + <height>0</height> </size> </property> <property name="styleSheet"> @@ -837,14 +847,14 @@ border-radius: 2px;</string> <rect> <x>0</x> <y>0</y> - <width>1216</width> - <height>581</height> + <width>601</width> + <height>425</height> </rect> </property> <property name="minimumSize"> <size> - <width>901</width> - <height>581</height> + <width>0</width> + <height>0</height> </size> </property> </widget> @@ -853,15 +863,15 @@ border-radius: 2px;</string> <item> <widget class="QWidget" name="messageInputWrapper" native="true"> <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> - <width>889</width> - <height>50</height> + <width>0</width> + <height>0</height> </size> </property> <layout class="QGridLayout" name="gridLayout_3"> @@ -883,15 +893,15 @@ border-radius: 2px;</string> <item row="0" column="0"> <widget class="QLineEdit" name="MessageInput"> <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> - <width>861</width> - <height>31</height> + <width>0</width> + <height>0</height> </size> </property> <property name="styleSheet"> diff --git a/uis.go b/uis.go @@ -19,6 +19,7 @@ import ( var username string var password string +// DoLogin generates the needed Client func DoLogin(username, password, homeserverURL, userID, accessToken string, localLog *log.Logger, results chan<- *gomatrix.Client, wg *sync.WaitGroup) { defer wg.Done() var cli *gomatrix.Client @@ -47,7 +48,7 @@ func DoLogin(username, password, homeserverURL, userID, accessToken string, loca } //NewLoginUI initializes the login Screen -func NewLoginUI(windowWidth, windowHeight int) *widgets.QWidget { +func NewLoginUI(windowWidth, windowHeight int, window *widgets.QMainWindow) *widgets.QWidget { widget := widgets.NewQWidget(nil, 0) widget.SetObjectName("LoginWrapper") widget.SetStyleSheet("QWidget#LoginWrapper { border: 0px; };") @@ -55,7 +56,6 @@ func NewLoginUI(windowWidth, windowHeight int) *widgets.QWidget { formWidget := widgets.NewQWidget(nil, 0) formWrapper := widgets.NewQHBoxLayout() - formWidget.SetMinimumSize2(350, 200) formLayout := widgets.NewQVBoxLayout() formLayout.SetSpacing(20) @@ -132,8 +132,7 @@ func NewLoginUI(windowWidth, windowHeight int) *widgets.QWidget { //Show MainUI for result := range results { //TODO Don't switch screen on wrong login data. - mainUI := NewMainUI(windowWidth, windowHeight, result) - mainUI.SetMinimumSize2(windowWidth, windowHeight) + mainUI := NewMainUI(windowWidth, windowHeight, result, window) window.SetCentralWidget(mainUI) } } else { @@ -148,7 +147,7 @@ func NewLoginUI(windowWidth, windowHeight int) *widgets.QWidget { //NewMainUI initializes the login Screen //func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client) *widgets.QWidget { -func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client) *widgets.QWidget { +func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client, window *widgets.QMainWindow) *widgets.QWidget { var widget = widgets.NewQWidget(nil, 0) var loader = uitools.NewQUiLoader(nil) @@ -159,21 +158,12 @@ func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client) *widgets.QWi file.Close() matrix.InitData(cli, db) - mainWidget.SetMinimumSize2(window.Size().Width(), window.Size().Height()) - mainWidget.SetGeometry2(0, 0, window.Size().Width(), window.Size().Height()) - mainWidget.Resize2(window.Size().Width(), window.Size().Height()) - - widget.SetMinimumSize2(window.Size().Width(), window.Size().Height()) - widget.SetGeometry2(0, 0, window.Size().Width(), window.Size().Height()) - - chatWidget := widgets.NewQWidgetFromPointer(widget.FindChild("ChatWidget", core.Qt__FindChildrenRecursively).Pointer()) - chatWidget.SetMinimumSize2(window.Size().Width(), window.Size().Height()) - chatWidget.SetGeometry2(0, 0, window.Size().Width(), window.Size().Height()) messageScrollArea := widgets.NewQScrollAreaFromPointer(widget.FindChild("messageScroll", core.Qt__FindChildrenRecursively).Pointer()) messagesScrollAreaContent := widgets.NewQWidgetFromPointer(widget.FindChild("messagesScrollAreaContent", core.Qt__FindChildrenRecursively).Pointer()) mainWidget.SetWindowTitle("Morpheus - MatrixHQ") + var layout = widgets.NewQHBoxLayout() layout.AddWidget(mainWidget, 1, core.Qt__AlignTop|core.Qt__AlignLeft) widget.SetLayout(layout) @@ -181,18 +171,16 @@ func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client) *widgets.QWi layout.SetContentsMargins(0, 0, 0, 0) window.ConnectResizeEvent(func(event *gui.QResizeEvent) { - mainWidget.SetMinimumSize2(1, 1) - widget.SetMinimumSize2(1, 1) - chatWidget.SetMinimumSize2(1, 1) + widget.Resize2(event.Size().Width(), event.Size().Height()) - widget.Resize(event.Size()) - mainWidget.Resize(event.Size()) - chatWidget.Resize(event.Size()) }) - messageScrollArea.ConnectResizeEvent(func(event *gui.QResizeEvent) { - messageScrollArea.SetMinimumSize2(1, 1) + widget.ConnectResizeEvent(func(event *gui.QResizeEvent) { + mainWidget.Resize2(event.Size().Width(), event.Size().Height()) + }) + + messageScrollArea.ConnectResizeEvent(func(event *gui.QResizeEvent) { messageScrollArea.Resize(event.Size()) }) @@ -234,8 +222,7 @@ func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client) *widgets.QWi //Show LoginUI for result := range results { if result { - loginUI := NewLoginUI(windowWidth, windowHeight) - loginUI.SetMinimumSize2(windowWidth, windowHeight) + loginUI := NewLoginUI(windowWidth, windowHeight, window) window.SetCentralWidget(loginUI) } }