commit bdf24c36553b7bf80ecafb134641fad4e60fdd52
Author: Phorge Migration <migration@localhost>
Date: Tue, 21 Jul 2026 18:24:07 +0200
Archive issues/PRs export for Nordgedanken/Morpheus
Diffstat:
154 files changed, 9423 insertions(+), 0 deletions(-)
diff --git a/issues/1.json b/issues/1.json
@@ -0,0 +1,15 @@
+{
+ "number": 1,
+ "title": "Markdown Parser?",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-08-21T23:03:26Z",
+ "closed_at": "2017-09-05T15:07:29Z",
+ "labels": [
+ "enhancement",
+ "help wanted"
+ ],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/1.md b/issues/1.md
@@ -0,0 +1,12 @@
+# #1 Markdown Parser?
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-08-21T23:03:26Z
+- **Closed:** 2017-09-05T15:07:29Z
+- **Labels:** enhancement, help wanted
+
+---
+
+_No description._
+
diff --git a/issues/10.json b/issues/10.json
@@ -0,0 +1,15 @@
+{
+ "number": 10,
+ "title": "Desktop Notifications",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-08-26T14:43:01Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "to do"
+ ],
+ "assignees": [],
+ "body": "- Windows: https://github.com/go-toast/toast\r\n- OSX: https://github.com/deckarep/gosx-notifier\r\n- Linux: ?",
+ "comments": []
+}
diff --git a/issues/10.md b/issues/10.md
@@ -0,0 +1,13 @@
+# #10 Desktop Notifications
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-08-26T14:43:01Z
+- **Labels:** enhancement, to do
+
+---
+
+- Windows: https://github.com/go-toast/toast
+- OSX: https://github.com/deckarep/gosx-notifier
+- Linux: ?
+
diff --git a/issues/11.json b/issues/11.json
@@ -0,0 +1,15 @@
+{
+ "number": 11,
+ "title": "Logout should bring you back to Login even the logout fails because of invalid access token",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-10-05T18:37:34Z",
+ "closed_at": null,
+ "labels": [
+ "to do",
+ "good first issue"
+ ],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/11.md b/issues/11.md
@@ -0,0 +1,11 @@
+# #11 Logout should bring you back to Login even the logout fails because of invalid access token
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-10-05T18:37:34Z
+- **Labels:** to do, good first issue
+
+---
+
+_No description._
+
diff --git a/issues/12.json b/issues/12.json
@@ -0,0 +1,23 @@
+{
+ "number": 12,
+ "title": "Investigate weird crash on login",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-10T15:53:50Z",
+ "closed_at": "2017-11-22T18:35:04Z",
+ "labels": [
+ "bug",
+ "invalid"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "Horrible Log I got:\r\n\r\n```\r\nmarce@DESKTOP-EGVRLFQ MINGW64 ~/go/src/github.com/Nordgedanken/Morpheus/deploy/w indows (master)\r\n$ ./Morpheus.exe\r\n2017-10-10 17:52:23 - Starting Morpheus\r\n2017-10-10 17:52:23 - Starting Auto Login Sequenze in background\r\n2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!DgvjtO ljKujDBrxyHk:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!EDuQpg unAOTYiUKIcU:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!PisumN CACkTdCduGyB:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!OYyXUb cTKVsDBUniNn:matrix.eclabs.de/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!BPvgRc BVHzyFSlYkrg:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!zTIXGm DjyRcAqbrWab:matrix.ffslfl.net/state/m.room.aliases code=404 wrapped=M_NOT_FOUND : Event not found.\r\n2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!cURbaf jkfsMDVwdRDQ:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!XqBunH wQIXUiqCaoxq:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!PQgcrP ZqvvbaAGKezi:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!fmweAI KpbYgSAtNnmw:matrix.ffslfl.net/state/m.room.aliases code=404 wrapped=M_NOT_FOUND : Event not found.\r\n2017-10-10 17:52:23 - Syncing now\r\n2017-10-10 17:52:23 - sync\r\n2017-10-10 17:52:23 - Starting Logout Sequenze in background\r\nException 0xc0000005 0x0 0xfffffffffffffff0 0x6fd08927\r\nPC=0x6fd08927\r\nsignal arrived during external code execution\r\n\r\ngithub.com/therecipe/qt/widgets._Cfunc_QWidget_KeyPressEventDefault(0x3875330, 0 xd1c450)\r\n github.com/therecipe/qt/widgets/_obj/_cgo_gotypes.go:11080 +0x48\r\ngithub.com/therecipe/qt/widgets.(*QWidget).KeyPressEventDefault.func1(0x3875330, 0xd1c450)\r\n C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go :12023 +0xaa\r\ngithub.com/therecipe/qt/widgets.(*QWidget).KeyPressEventDefault(0xc042297a20, 0x a71c00, 0xc042152388)\r\n C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go :12023 +0x77\r\nmain.NewMainUI.func6(0xc042152388)\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/uis.go:290 +0x277\r\ngithub.com/therecipe/qt/widgets.callbackQWidget_KeyPressEvent(0x37d1a70, 0xd1c45 0)\r\n C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go :11988 +0x183\r\ngithub.com/therecipe/qt/widgets._cgoexpwrap_5a494a80844b_callbackQWidget_KeyPres sEvent(0x37d1a70, 0xd1c450)\r\n github.com/therecipe/qt/widgets/_obj/_cgo_gotypes.go:14427 +0x3c\r\ngithub.com/therecipe/qt/widgets._Cfunc_QApplication_QApplication_Exec(0x0)\r\n github.com/therecipe/qt/widgets/_obj/_cgo_gotypes.go:1138 +0x50\r\ngithub.com/therecipe/qt/widgets.QApplication_Exec(0xc0420ddaf0)\r\n C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go :1169 +0x29\r\nmain.main()\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/main.go:95 +0x67e\r\n\r\ngoroutine 17 [syscall, locked to thread]:\r\nruntime.goexit()\r\n C:/Go/src/runtime/asm_amd64.s:2197 +0x1\r\n\r\ngoroutine 5 [chan receive]:\r\ngithub.com/tidwall/buntdb.(*DB).backgroundManager(0xc042014a00)\r\n C:/Users/marce/go/src/github.com/tidwall/buntdb/buntdb.go:542 +0xeb\r\ncreated by github.com/tidwall/buntdb.Open\r\n C:/Users/marce/go/src/github.com/tidwall/buntdb/buntdb.go:165 +0x20d\r\n\r\ngoroutine 53 [IO wait]:\r\nnet.runtime_pollWait(0x7140f00, 0x72, 0xa6c1d0)\r\n C:/Go/src/runtime/netpoll.go:164 +0x60\r\nnet.(*pollDesc).wait(0xc0421a81a0, 0x72, 0xa6c1d0, 0x0)\r\n C:/Go/src/net/fd_poll_runtime.go:75 +0x3f\r\nnet.(*ioSrv).ExecIO(0xc0421a6000, 0xc0421a8060, 0x7d4dae, 0x7, 0x7e86e0, 0x0, 0x 64, 0x1)\r\n C:/Go/src/net/fd_windows.go:196 +0xfe\r\nnet.(*netFD).Read(0xc0421a8000, 0xc04212ec00, 0x400, 0x400, 0x0, 0x0, 0x0)\r\n C:/Go/src/net/fd_windows.go:452 +0x13d\r\nnet.(*conn).Read(0xc0421a6010, 0xc04212ec00, 0x400, 0x400, 0x0, 0x0, 0x0)\r\n C:/Go/src/net/net.go:181 +0x77\r\ncrypto/tls.(*block).readFromUntil(0xc04219a1b0, 0x7140fc0, 0xc0421a6010, 0x5, 0x c0421a6010, 0x28)\r\n C:/Go/src/crypto/tls/conn.go:488 +0x9f\r\ncrypto/tls.(*Conn).readRecord(0xc0421ac000, 0x7e8d17, 0xc0421ac120, 0x452b80)\r\n C:/Go/src/crypto/tls/conn.go:590 +0xcb\r\ncrypto/tls.(*Conn).Read(0xc0421ac000, 0xc0421bf000, 0x1000, 0x1000, 0x0, 0x0, 0x 0)\r\n C:/Go/src/crypto/tls/conn.go:1134 +0x124\r\nnet/http.(*persistConn).Read(0xc042194000, 0xc0421bf000, 0x1000, 0x1000, 0x5, 0x 450ad0, 0xc04218a180)\r\n C:/Go/src/net/http/transport.go:1316 +0x152\r\nbufio.(*Reader).fill(0xc0421a0ba0)\r\n C:/Go/src/bufio/bufio.go:97 +0x11e\r\nbufio.(*Reader).Peek(0xc0421a0ba0, 0x1, 0xc042139be5, 0xc042297a01, 0x4, 0xc0420 1a300, 0x0)\r\n C:/Go/src/bufio/bufio.go:129 +0x6e\r\nnet/http.(*persistConn).readLoop(0xc042194000)\r\n C:/Go/src/net/http/transport.go:1474 +0x19d\r\ncreated by net/http.(*Transport).dialConn\r\n C:/Go/src/net/http/transport.go:1117 +0xa3c\r\n\r\ngoroutine 54 [select]:\r\nnet/http.(*persistConn).writeLoop(0xc042194000)\r\n C:/Go/src/net/http/transport.go:1704 +0x441\r\ncreated by net/http.(*Transport).dialConn\r\n C:/Go/src/net/http/transport.go:1118 +0xa61\r\n\r\ngoroutine 8 [select]:\r\nnet/http.(*persistConn).roundTrip(0xc042194000, 0xc042198240, 0x0, 0x0, 0x0)\r\n C:/Go/src/net/http/transport.go:1898 +0x97b\r\nnet/http.(*Transport).RoundTrip(0xa9af00, 0xc042282100, 0xa9af00, 0x0, 0x0)\r\n C:/Go/src/net/http/transport.go:391 +0x753\r\nnet/http.send(0xc042282100, 0xa6e280, 0xa9af00, 0x0, 0x0, 0x0, 0x0, 0x8, 0xc0421 52110, 0x410f4f)\r\n C:/Go/src/net/http/client.go:249 +0x169\r\nnet/http.(*Client).send(0xad5be0, 0xc042282100, 0x0, 0x0, 0x0, 0xc042152110, 0x0 , 0x1, 0x409f15)\r\n C:/Go/src/net/http/client.go:173 +0x10f\r\nnet/http.(*Client).Do(0xad5be0, 0xc042282100, 0xc, 0x7d9ac3, 0x10)\r\n C:/Go/src/net/http/client.go:595 +0x25b\r\ngithub.com/matrix-org/gomatrix.(*Client).MakeRequest(0xc04213e080, 0x7d27c4, 0x3 , 0xc0421829a0, 0x15a, 0x0, 0x0, 0x726760, 0xc0421520f0, 0x0, ...)\r\n C:/Users/marce/go/src/github.com/matrix-org/gomatrix/client.go:204 +0x21 d\r\ngithub.com/matrix-org/gomatrix.(*Client).SyncRequest(0xc04213e080, 0x7530, 0x0, 0x0, 0xc042297ae8, 0x3, 0x0, 0x0, 0x0, 0xc042012620, ...)\r\n C:/Users/marce/go/src/github.com/matrix-org/gomatrix/client.go:270 +0x21 b\r\ngithub.com/matrix-org/gomatrix.(*Client).Sync(0xc04213e080, 0xc04211dfb8, 0x1)\r\n C:/Users/marce/go/src/github.com/matrix-org/gomatrix/client.go:132 +0x13 d\r\nmain.NewMainUI.func5(0xc04213e080)\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/uis.go:269 +0xc8\r\ncreated by main.NewMainUI\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/uis.go:276 +0xc46\r\n\r\ngoroutine 10 [IO wait]:\r\nnet.runtime_pollWait(0x7140e40, 0x72, 0xa6c1d0)\r\n C:/Go/src/runtime/netpoll.go:164 +0x60\r\nnet.(*pollDesc).wait(0xc0422e01a0, 0x72, 0xa6c1d0, 0x0)\r\n C:/Go/src/net/fd_poll_runtime.go:75 +0x3f\r\nnet.(*ioSrv).ExecIO(0xc0421a6000, 0xc0422e0060, 0x7d4dae, 0x7, 0x7e86e0, 0x0, 0x 64, 0x1)\r\n C:/Go/src/net/fd_windows.go:196 +0xfe\r\nnet.(*netFD).Read(0xc0422e0000, 0xc04212f400, 0x400, 0x400, 0x0, 0x0, 0x0)\r\n C:/Go/src/net/fd_windows.go:452 +0x13d\r\nnet.(*conn).Read(0xc042004030, 0xc04212f400, 0x400, 0x400, 0x0, 0x0, 0x0)\r\n C:/Go/src/net/net.go:181 +0x77\r\ncrypto/tls.(*block).readFromUntil(0xc0421405a0, 0x7140fc0, 0xc042004030, 0x5, 0x c042004030, 0x28)\r\n C:/Go/src/crypto/tls/conn.go:488 +0x9f\r\ncrypto/tls.(*Conn).readRecord(0xc0421ac700, 0x7e8d17, 0xc0421ac820, 0x452b80)\r\n C:/Go/src/crypto/tls/conn.go:590 +0xcb\r\ncrypto/tls.(*Conn).Read(0xc0421ac700, 0xc0422eb000, 0x1000, 0x1000, 0x0, 0x0, 0x 0)\r\n C:/Go/src/crypto/tls/conn.go:1134 +0x124\r\nnet/http.(*persistConn).Read(0xc0421e4000, 0xc0422eb000, 0x1000, 0x1000, 0x5, 0x 450ad0, 0xc0420d4c00)\r\n C:/Go/src/net/http/transport.go:1316 +0x152\r\nbufio.(*Reader).fill(0xc0420d4a80)\r\n C:/Go/src/bufio/bufio.go:97 +0x11e\r\nbufio.(*Reader).Peek(0xc0420d4a80, 0x1, 0xc042463be5, 0xc0422da101, 0x4, 0xc0420 d4ae0, 0x0)\r\n C:/Go/src/bufio/bufio.go:129 +0x6e\r\nnet/http.(*persistConn).readLoop(0xc0421e4000)\r\n C:/Go/src/net/http/transport.go:1474 +0x19d\r\ncreated by net/http.(*Transport).dialConn\r\n C:/Go/src/net/http/transport.go:1117 +0xa3c\r\n\r\ngoroutine 11 [select]:\r\nnet/http.(*persistConn).writeLoop(0xc0421e4000)\r\n C:/Go/src/net/http/transport.go:1704 +0x441\r\ncreated by net/http.(*Transport).dialConn\r\n C:/Go/src/net/http/transport.go:1118 +0xa61\r\nrax 0x0\r\nrbx 0x3875330\r\nrcx 0x3875330\r\nrdi 0xab8ac0\r\nrsi 0x0\r\nrbp 0xab9390\r\nrsp 0xd1b940\r\nr8 0xab8ac0\r\nr9 0x0\r\nr10 0xc042152388\r\nr11 0xc042152388\r\nr12 0x1\r\nr13 0x72\r\nr14 0x388\r\nr15 0x400\r\nrip 0x6fd08927\r\nrflags 0x10202\r\ncs 0x33\r\nfs 0x53\r\ngs 0x2b\r\n```",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-10-10T15:56:11Z",
+ "body": "Somehow the DB failed on Logout. Now the client is in a deadlock state"
+ }
+ ]
+}
diff --git a/issues/12.md b/issues/12.md
@@ -0,0 +1,182 @@
+# #12 Investigate weird crash on login
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-10T15:53:50Z
+- **Closed:** 2017-11-22T18:35:04Z
+- **Labels:** bug, invalid
+- **Assignees:** @MTRNord
+
+---
+
+Horrible Log I got:
+
+```
+marce@DESKTOP-EGVRLFQ MINGW64 ~/go/src/github.com/Nordgedanken/Morpheus/deploy/w indows (master)
+$ ./Morpheus.exe
+2017-10-10 17:52:23 - Starting Morpheus
+2017-10-10 17:52:23 - Starting Auto Login Sequenze in background
+2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!DgvjtO ljKujDBrxyHk:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!EDuQpg unAOTYiUKIcU:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!PisumN CACkTdCduGyB:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!OYyXUb cTKVsDBUniNn:matrix.eclabs.de/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!BPvgRc BVHzyFSlYkrg:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!zTIXGm DjyRcAqbrWab:matrix.ffslfl.net/state/m.room.aliases code=404 wrapped=M_NOT_FOUND : Event not found.
+2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!cURbaf jkfsMDVwdRDQ:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!XqBunH wQIXUiqCaoxq:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!PQgcrP ZqvvbaAGKezi:matrix.org/state/m.room.aliases code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-10-10 17:52:23 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!fmweAI KpbYgSAtNnmw:matrix.ffslfl.net/state/m.room.aliases code=404 wrapped=M_NOT_FOUND : Event not found.
+2017-10-10 17:52:23 - Syncing now
+2017-10-10 17:52:23 - sync
+2017-10-10 17:52:23 - Starting Logout Sequenze in background
+Exception 0xc0000005 0x0 0xfffffffffffffff0 0x6fd08927
+PC=0x6fd08927
+signal arrived during external code execution
+
+github.com/therecipe/qt/widgets._Cfunc_QWidget_KeyPressEventDefault(0x3875330, 0 xd1c450)
+ github.com/therecipe/qt/widgets/_obj/_cgo_gotypes.go:11080 +0x48
+github.com/therecipe/qt/widgets.(*QWidget).KeyPressEventDefault.func1(0x3875330, 0xd1c450)
+ C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go :12023 +0xaa
+github.com/therecipe/qt/widgets.(*QWidget).KeyPressEventDefault(0xc042297a20, 0x a71c00, 0xc042152388)
+ C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go :12023 +0x77
+main.NewMainUI.func6(0xc042152388)
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/uis.go:290 +0x277
+github.com/therecipe/qt/widgets.callbackQWidget_KeyPressEvent(0x37d1a70, 0xd1c45 0)
+ C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go :11988 +0x183
+github.com/therecipe/qt/widgets._cgoexpwrap_5a494a80844b_callbackQWidget_KeyPres sEvent(0x37d1a70, 0xd1c450)
+ github.com/therecipe/qt/widgets/_obj/_cgo_gotypes.go:14427 +0x3c
+github.com/therecipe/qt/widgets._Cfunc_QApplication_QApplication_Exec(0x0)
+ github.com/therecipe/qt/widgets/_obj/_cgo_gotypes.go:1138 +0x50
+github.com/therecipe/qt/widgets.QApplication_Exec(0xc0420ddaf0)
+ C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go :1169 +0x29
+main.main()
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/main.go:95 +0x67e
+
+goroutine 17 [syscall, locked to thread]:
+runtime.goexit()
+ C:/Go/src/runtime/asm_amd64.s:2197 +0x1
+
+goroutine 5 [chan receive]:
+github.com/tidwall/buntdb.(*DB).backgroundManager(0xc042014a00)
+ C:/Users/marce/go/src/github.com/tidwall/buntdb/buntdb.go:542 +0xeb
+created by github.com/tidwall/buntdb.Open
+ C:/Users/marce/go/src/github.com/tidwall/buntdb/buntdb.go:165 +0x20d
+
+goroutine 53 [IO wait]:
+net.runtime_pollWait(0x7140f00, 0x72, 0xa6c1d0)
+ C:/Go/src/runtime/netpoll.go:164 +0x60
+net.(*pollDesc).wait(0xc0421a81a0, 0x72, 0xa6c1d0, 0x0)
+ C:/Go/src/net/fd_poll_runtime.go:75 +0x3f
+net.(*ioSrv).ExecIO(0xc0421a6000, 0xc0421a8060, 0x7d4dae, 0x7, 0x7e86e0, 0x0, 0x 64, 0x1)
+ C:/Go/src/net/fd_windows.go:196 +0xfe
+net.(*netFD).Read(0xc0421a8000, 0xc04212ec00, 0x400, 0x400, 0x0, 0x0, 0x0)
+ C:/Go/src/net/fd_windows.go:452 +0x13d
+net.(*conn).Read(0xc0421a6010, 0xc04212ec00, 0x400, 0x400, 0x0, 0x0, 0x0)
+ C:/Go/src/net/net.go:181 +0x77
+crypto/tls.(*block).readFromUntil(0xc04219a1b0, 0x7140fc0, 0xc0421a6010, 0x5, 0x c0421a6010, 0x28)
+ C:/Go/src/crypto/tls/conn.go:488 +0x9f
+crypto/tls.(*Conn).readRecord(0xc0421ac000, 0x7e8d17, 0xc0421ac120, 0x452b80)
+ C:/Go/src/crypto/tls/conn.go:590 +0xcb
+crypto/tls.(*Conn).Read(0xc0421ac000, 0xc0421bf000, 0x1000, 0x1000, 0x0, 0x0, 0x 0)
+ C:/Go/src/crypto/tls/conn.go:1134 +0x124
+net/http.(*persistConn).Read(0xc042194000, 0xc0421bf000, 0x1000, 0x1000, 0x5, 0x 450ad0, 0xc04218a180)
+ C:/Go/src/net/http/transport.go:1316 +0x152
+bufio.(*Reader).fill(0xc0421a0ba0)
+ C:/Go/src/bufio/bufio.go:97 +0x11e
+bufio.(*Reader).Peek(0xc0421a0ba0, 0x1, 0xc042139be5, 0xc042297a01, 0x4, 0xc0420 1a300, 0x0)
+ C:/Go/src/bufio/bufio.go:129 +0x6e
+net/http.(*persistConn).readLoop(0xc042194000)
+ C:/Go/src/net/http/transport.go:1474 +0x19d
+created by net/http.(*Transport).dialConn
+ C:/Go/src/net/http/transport.go:1117 +0xa3c
+
+goroutine 54 [select]:
+net/http.(*persistConn).writeLoop(0xc042194000)
+ C:/Go/src/net/http/transport.go:1704 +0x441
+created by net/http.(*Transport).dialConn
+ C:/Go/src/net/http/transport.go:1118 +0xa61
+
+goroutine 8 [select]:
+net/http.(*persistConn).roundTrip(0xc042194000, 0xc042198240, 0x0, 0x0, 0x0)
+ C:/Go/src/net/http/transport.go:1898 +0x97b
+net/http.(*Transport).RoundTrip(0xa9af00, 0xc042282100, 0xa9af00, 0x0, 0x0)
+ C:/Go/src/net/http/transport.go:391 +0x753
+net/http.send(0xc042282100, 0xa6e280, 0xa9af00, 0x0, 0x0, 0x0, 0x0, 0x8, 0xc0421 52110, 0x410f4f)
+ C:/Go/src/net/http/client.go:249 +0x169
+net/http.(*Client).send(0xad5be0, 0xc042282100, 0x0, 0x0, 0x0, 0xc042152110, 0x0 , 0x1, 0x409f15)
+ C:/Go/src/net/http/client.go:173 +0x10f
+net/http.(*Client).Do(0xad5be0, 0xc042282100, 0xc, 0x7d9ac3, 0x10)
+ C:/Go/src/net/http/client.go:595 +0x25b
+github.com/matrix-org/gomatrix.(*Client).MakeRequest(0xc04213e080, 0x7d27c4, 0x3 , 0xc0421829a0, 0x15a, 0x0, 0x0, 0x726760, 0xc0421520f0, 0x0, ...)
+ C:/Users/marce/go/src/github.com/matrix-org/gomatrix/client.go:204 +0x21 d
+github.com/matrix-org/gomatrix.(*Client).SyncRequest(0xc04213e080, 0x7530, 0x0, 0x0, 0xc042297ae8, 0x3, 0x0, 0x0, 0x0, 0xc042012620, ...)
+ C:/Users/marce/go/src/github.com/matrix-org/gomatrix/client.go:270 +0x21 b
+github.com/matrix-org/gomatrix.(*Client).Sync(0xc04213e080, 0xc04211dfb8, 0x1)
+ C:/Users/marce/go/src/github.com/matrix-org/gomatrix/client.go:132 +0x13 d
+main.NewMainUI.func5(0xc04213e080)
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/uis.go:269 +0xc8
+created by main.NewMainUI
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/uis.go:276 +0xc46
+
+goroutine 10 [IO wait]:
+net.runtime_pollWait(0x7140e40, 0x72, 0xa6c1d0)
+ C:/Go/src/runtime/netpoll.go:164 +0x60
+net.(*pollDesc).wait(0xc0422e01a0, 0x72, 0xa6c1d0, 0x0)
+ C:/Go/src/net/fd_poll_runtime.go:75 +0x3f
+net.(*ioSrv).ExecIO(0xc0421a6000, 0xc0422e0060, 0x7d4dae, 0x7, 0x7e86e0, 0x0, 0x 64, 0x1)
+ C:/Go/src/net/fd_windows.go:196 +0xfe
+net.(*netFD).Read(0xc0422e0000, 0xc04212f400, 0x400, 0x400, 0x0, 0x0, 0x0)
+ C:/Go/src/net/fd_windows.go:452 +0x13d
+net.(*conn).Read(0xc042004030, 0xc04212f400, 0x400, 0x400, 0x0, 0x0, 0x0)
+ C:/Go/src/net/net.go:181 +0x77
+crypto/tls.(*block).readFromUntil(0xc0421405a0, 0x7140fc0, 0xc042004030, 0x5, 0x c042004030, 0x28)
+ C:/Go/src/crypto/tls/conn.go:488 +0x9f
+crypto/tls.(*Conn).readRecord(0xc0421ac700, 0x7e8d17, 0xc0421ac820, 0x452b80)
+ C:/Go/src/crypto/tls/conn.go:590 +0xcb
+crypto/tls.(*Conn).Read(0xc0421ac700, 0xc0422eb000, 0x1000, 0x1000, 0x0, 0x0, 0x 0)
+ C:/Go/src/crypto/tls/conn.go:1134 +0x124
+net/http.(*persistConn).Read(0xc0421e4000, 0xc0422eb000, 0x1000, 0x1000, 0x5, 0x 450ad0, 0xc0420d4c00)
+ C:/Go/src/net/http/transport.go:1316 +0x152
+bufio.(*Reader).fill(0xc0420d4a80)
+ C:/Go/src/bufio/bufio.go:97 +0x11e
+bufio.(*Reader).Peek(0xc0420d4a80, 0x1, 0xc042463be5, 0xc0422da101, 0x4, 0xc0420 d4ae0, 0x0)
+ C:/Go/src/bufio/bufio.go:129 +0x6e
+net/http.(*persistConn).readLoop(0xc0421e4000)
+ C:/Go/src/net/http/transport.go:1474 +0x19d
+created by net/http.(*Transport).dialConn
+ C:/Go/src/net/http/transport.go:1117 +0xa3c
+
+goroutine 11 [select]:
+net/http.(*persistConn).writeLoop(0xc0421e4000)
+ C:/Go/src/net/http/transport.go:1704 +0x441
+created by net/http.(*Transport).dialConn
+ C:/Go/src/net/http/transport.go:1118 +0xa61
+rax 0x0
+rbx 0x3875330
+rcx 0x3875330
+rdi 0xab8ac0
+rsi 0x0
+rbp 0xab9390
+rsp 0xd1b940
+r8 0xab8ac0
+r9 0x0
+r10 0xc042152388
+r11 0xc042152388
+r12 0x1
+r13 0x72
+r14 0x388
+r15 0x400
+rip 0x6fd08927
+rflags 0x10202
+cs 0x33
+fs 0x53
+gs 0x2b
+```
+
+
+## Comments
+
+### @MTRNord — 2017-10-10T15:56:11Z
+
+Somehow the DB failed on Logout. Now the client is in a deadlock state
+
diff --git a/issues/13.json b/issues/13.json
@@ -0,0 +1,20 @@
+{
+ "number": 13,
+ "title": "Bundle Morpheus for Windows, Linux and if someone wants to build it MacOS",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-10-10T16:40:05Z",
+ "closed_at": null,
+ "labels": [
+ "help wanted"
+ ],
+ "assignees": [],
+ "body": "This process isn't possible on CI as those keep timing out as the binding installation is massive... It takes about 1,5h to setup... Impossible on CI so packaging has to be done manual",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-12-08T20:41:38Z",
+ "body": "Deb builds are now generated on the CI https://circleci.com/gh/Nordgedanken/workflows\r\n"
+ }
+ ]
+}
diff --git a/issues/13.md b/issues/13.md
@@ -0,0 +1,19 @@
+# #13 Bundle Morpheus for Windows, Linux and if someone wants to build it MacOS
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-10-10T16:40:05Z
+- **Labels:** help wanted
+
+---
+
+This process isn't possible on CI as those keep timing out as the binding installation is massive... It takes about 1,5h to setup... Impossible on CI so packaging has to be done manual
+
+
+## Comments
+
+### @MTRNord — 2017-12-08T20:41:38Z
+
+Deb builds are now generated on the CI https://circleci.com/gh/Nordgedanken/workflows
+
+
diff --git a/issues/14.json b/issues/14.json
@@ -0,0 +1,14 @@
+{
+ "number": 14,
+ "title": "fix CircleCI pointing to the wrong QT Version",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-10T17:11:37Z",
+ "closed_at": "2017-12-06T12:21:33Z",
+ "labels": [],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/14.md b/issues/14.md
@@ -0,0 +1,12 @@
+# #14 fix CircleCI pointing to the wrong QT Version
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-10T17:11:37Z
+- **Closed:** 2017-12-06T12:21:33Z
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
diff --git a/issues/15.json b/issues/15.json
@@ -0,0 +1,16 @@
+{
+ "number": 15,
+ "title": "Consider allowing to use the Systems (QT) Theme",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-10-10T17:29:12Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "help wanted",
+ "question"
+ ],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/15.md b/issues/15.md
@@ -0,0 +1,11 @@
+# #15 Consider allowing to use the Systems (QT) Theme
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-10-10T17:29:12Z
+- **Labels:** enhancement, help wanted, question
+
+---
+
+_No description._
+
diff --git a/issues/16.json b/issues/16.json
@@ -0,0 +1,16 @@
+{
+ "number": 16,
+ "title": "Track WebRTC golang client support",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-10-10T17:39:48Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "help wanted",
+ "to do"
+ ],
+ "assignees": [],
+ "body": "There is https://github.com/keroserene/go-webrtc/ which looks like a working client but currently without the needed audio/video recording and playback so it propably needs to have a PR on it.\r\n\r\nA basic audio conection support without actual recording is open at https://github.com/keroserene/go-webrtc/pull/65",
+ "comments": []
+}
diff --git a/issues/16.md b/issues/16.md
@@ -0,0 +1,13 @@
+# #16 Track WebRTC golang client support
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-10-10T17:39:48Z
+- **Labels:** enhancement, help wanted, to do
+
+---
+
+There is https://github.com/keroserene/go-webrtc/ which looks like a working client but currently without the needed audio/video recording and playback so it propably needs to have a PR on it.
+
+A basic audio conection support without actual recording is open at https://github.com/keroserene/go-webrtc/pull/65
+
diff --git a/issues/17.json b/issues/17.json
@@ -0,0 +1,17 @@
+{
+ "number": 17,
+ "title": "Split settings and cache DB",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-13T18:27:24Z",
+ "closed_at": "2017-10-18T15:02:49Z",
+ "labels": [
+ "enhancement",
+ "good first issue"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/17.md b/issues/17.md
@@ -0,0 +1,13 @@
+# #17 Split settings and cache DB
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-13T18:27:24Z
+- **Closed:** 2017-10-18T15:02:49Z
+- **Labels:** enhancement, good first issue
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
diff --git a/issues/18.json b/issues/18.json
@@ -0,0 +1,16 @@
+{
+ "number": 18,
+ "title": "Remove minimumSizes",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-14T08:32:01Z",
+ "closed_at": "2017-10-14T18:15:32Z",
+ "labels": [
+ "enhancement"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/18.md b/issues/18.md
@@ -0,0 +1,13 @@
+# #18 Remove minimumSizes
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-14T08:32:01Z
+- **Closed:** 2017-10-14T18:15:32Z
+- **Labels:** enhancement
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
diff --git a/issues/19.json b/issues/19.json
@@ -0,0 +1,15 @@
+{
+ "number": 19,
+ "title": "use GetUserAvatar at GetOwnUserAvatar instead of having 2 times the same code",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-14T15:02:25Z",
+ "closed_at": "2017-10-14T18:18:00Z",
+ "labels": [
+ "enhancement",
+ "good first issue"
+ ],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/19.md b/issues/19.md
@@ -0,0 +1,12 @@
+# #19 use GetUserAvatar at GetOwnUserAvatar instead of having 2 times the same code
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-14T15:02:25Z
+- **Closed:** 2017-10-14T18:18:00Z
+- **Labels:** enhancement, good first issue
+
+---
+
+_No description._
+
diff --git a/issues/2.json b/issues/2.json
@@ -0,0 +1,15 @@
+{
+ "number": 2,
+ "title": "Allow Inline Images?",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-08-21T23:03:46Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "to do"
+ ],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/2.md b/issues/2.md
@@ -0,0 +1,11 @@
+# #2 Allow Inline Images?
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-08-21T23:03:46Z
+- **Labels:** enhancement, to do
+
+---
+
+_No description._
+
diff --git a/issues/20.json b/issues/20.json
@@ -0,0 +1,16 @@
+{
+ "number": 20,
+ "title": "use CI only for linting as the binding is too huge for CI",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-14T15:12:44Z",
+ "closed_at": "2017-12-06T12:21:33Z",
+ "labels": [
+ "enhancement"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/20.md b/issues/20.md
@@ -0,0 +1,13 @@
+# #20 use CI only for linting as the binding is too huge for CI
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-14T15:12:44Z
+- **Closed:** 2017-12-06T12:21:33Z
+- **Labels:** enhancement
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
diff --git a/issues/21.json b/issues/21.json
@@ -0,0 +1,16 @@
+{
+ "number": 21,
+ "title": "figure out useful error handling",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-14T15:48:00Z",
+ "closed_at": "2017-10-14T21:50:37Z",
+ "labels": [
+ "enhancement"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/21.md b/issues/21.md
@@ -0,0 +1,13 @@
+# #21 figure out useful error handling
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-14T15:48:00Z
+- **Closed:** 2017-10-14T21:50:37Z
+- **Labels:** enhancement
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
diff --git a/issues/22.json b/issues/22.json
@@ -0,0 +1,17 @@
+{
+ "number": 22,
+ "title": "Add a windows installer for releases",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-14T17:16:47Z",
+ "closed_at": "2018-03-07T06:38:05Z",
+ "labels": [
+ "enhancement",
+ "Important"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/22.md b/issues/22.md
@@ -0,0 +1,13 @@
+# #22 Add a windows installer for releases
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-14T17:16:47Z
+- **Closed:** 2018-03-07T06:38:05Z
+- **Labels:** enhancement, Important
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
diff --git a/issues/23.json b/issues/23.json
@@ -0,0 +1,12 @@
+{
+ "number": 23,
+ "title": "some goroutines need cleanup",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-14T20:00:23Z",
+ "closed_at": "2017-11-26T15:57:56Z",
+ "labels": [],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/23.md b/issues/23.md
@@ -0,0 +1,11 @@
+# #23 some goroutines need cleanup
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-14T20:00:23Z
+- **Closed:** 2017-11-26T15:57:56Z
+
+---
+
+_No description._
+
diff --git a/issues/24.json b/issues/24.json
@@ -0,0 +1,12 @@
+{
+ "number": 24,
+ "title": "refactor uis.go",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-14T20:00:35Z",
+ "closed_at": "2017-10-15T15:07:55Z",
+ "labels": [],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/24.md b/issues/24.md
@@ -0,0 +1,11 @@
+# #24 refactor uis.go
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-14T20:00:35Z
+- **Closed:** 2017-10-15T15:07:55Z
+
+---
+
+_No description._
+
diff --git a/issues/25.json b/issues/25.json
@@ -0,0 +1,15 @@
+{
+ "number": 25,
+ "title": "linkify links via https://github.com/opennota/linkify",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-16T14:49:42Z",
+ "closed_at": "2017-12-22T11:14:46Z",
+ "labels": [
+ "enhancement",
+ "good first issue"
+ ],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/25.md b/issues/25.md
@@ -0,0 +1,12 @@
+# #25 linkify links via https://github.com/opennota/linkify
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-16T14:49:42Z
+- **Closed:** 2017-12-22T11:14:46Z
+- **Labels:** enhancement, good first issue
+
+---
+
+_No description._
+
diff --git a/issues/26.json b/issues/26.json
@@ -0,0 +1,12 @@
+{
+ "number": 26,
+ "title": "fix user avatar size in messages. they are extremly huge",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-16T20:21:30Z",
+ "closed_at": "2017-10-16T20:51:16Z",
+ "labels": [],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/26.md b/issues/26.md
@@ -0,0 +1,11 @@
+# #26 fix user avatar size in messages. they are extremly huge
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-16T20:21:30Z
+- **Closed:** 2017-10-16T20:51:16Z
+
+---
+
+_No description._
+
diff --git a/issues/27.json b/issues/27.json
@@ -0,0 +1,16 @@
+{
+ "number": 27,
+ "title": "switch logout button icon",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-10-16T21:09:24Z",
+ "closed_at": null,
+ "labels": [
+ "bug",
+ "enhancement",
+ "good first issue"
+ ],
+ "assignees": [],
+ "body": "people (like me xD) might think it means to shutdown the client",
+ "comments": []
+}
diff --git a/issues/27.md b/issues/27.md
@@ -0,0 +1,11 @@
+# #27 switch logout button icon
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-10-16T21:09:24Z
+- **Labels:** bug, enhancement, good first issue
+
+---
+
+people (like me xD) might think it means to shutdown the client
+
diff --git a/issues/28.json b/issues/28.json
@@ -0,0 +1,18 @@
+{
+ "number": 28,
+ "title": "investigate on memory leak",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-16T21:21:47Z",
+ "closed_at": "2017-10-16T21:27:52Z",
+ "labels": [],
+ "assignees": [],
+ "body": "It feels like the image saving and generating has some kind of memory leak. might be the cache",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-10-16T21:27:52Z",
+ "body": "Actually screw it it went up by a few MB and now uses only half of the memory. Might be just the cache caching in the Memory for a few seconds"
+ }
+ ]
+}
diff --git a/issues/28.md b/issues/28.md
@@ -0,0 +1,18 @@
+# #28 investigate on memory leak
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-16T21:21:47Z
+- **Closed:** 2017-10-16T21:27:52Z
+
+---
+
+It feels like the image saving and generating has some kind of memory leak. might be the cache
+
+
+## Comments
+
+### @MTRNord — 2017-10-16T21:27:52Z
+
+Actually screw it it went up by a few MB and now uses only half of the memory. Might be just the cache caching in the Memory for a few seconds
+
diff --git a/issues/29.json b/issues/29.json
@@ -0,0 +1,16 @@
+{
+ "number": 29,
+ "title": "get webkit installed to get webrtc support :D",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-10-17T09:31:41Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/29.md b/issues/29.md
@@ -0,0 +1,12 @@
+# #29 get webkit installed to get webrtc support :D
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-10-17T09:31:41Z
+- **Labels:** enhancement
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
diff --git a/issues/3.json b/issues/3.json
@@ -0,0 +1,22 @@
+{
+ "number": 3,
+ "title": "Check if custom Port HS do work",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-08-21T23:04:13Z",
+ "closed_at": null,
+ "labels": [
+ "bug",
+ "help wanted",
+ "to do"
+ ],
+ "assignees": [],
+ "body": "",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-12-08T20:43:20Z",
+ "body": "Nope they dont ^^"
+ }
+ ]
+}
diff --git a/issues/3.md b/issues/3.md
@@ -0,0 +1,18 @@
+# #3 Check if custom Port HS do work
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-08-21T23:04:13Z
+- **Labels:** bug, help wanted, to do
+
+---
+
+_No description._
+
+
+## Comments
+
+### @MTRNord — 2017-12-08T20:43:20Z
+
+Nope they dont ^^
+
diff --git a/issues/30.json b/issues/30.json
@@ -0,0 +1,35 @@
+{
+ "number": 30,
+ "title": "track 2017-10-17 17:10:54 - invalid database",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-17T16:09:43Z",
+ "closed_at": "2017-11-22T18:34:20Z",
+ "labels": [
+ "bug",
+ "invalid",
+ "wontfix",
+ "Important"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-10-18T11:56:15Z",
+ "body": "Happens nearly every 10minutes now. I broke something..."
+ },
+ {
+ "author": "MTRNord",
+ "created_at": "2017-10-18T15:33:59Z",
+ "body": "seems to be somehwere inside the cache not in the settings DB"
+ },
+ {
+ "author": "MTRNord",
+ "created_at": "2017-10-18T19:03:54Z",
+ "body": "Pretty sure dots in the sender id are breaking the DB"
+ }
+ ]
+}
diff --git a/issues/30.md b/issues/30.md
@@ -0,0 +1,28 @@
+# #30 track 2017-10-17 17:10:54 - invalid database
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-17T16:09:43Z
+- **Closed:** 2017-11-22T18:34:20Z
+- **Labels:** bug, invalid, wontfix, Important
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
+
+## Comments
+
+### @MTRNord — 2017-10-18T11:56:15Z
+
+Happens nearly every 10minutes now. I broke something...
+
+### @MTRNord — 2017-10-18T15:33:59Z
+
+seems to be somehwere inside the cache not in the settings DB
+
+### @MTRNord — 2017-10-18T19:03:54Z
+
+Pretty sure dots in the sender id are breaking the DB
+
diff --git a/issues/31.json b/issues/31.json
@@ -0,0 +1,16 @@
+{
+ "number": 31,
+ "title": "Consider saving avatars as cache via filesystem instead directly into the DB",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-10-18T15:40:26Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "to do",
+ "good first issue"
+ ],
+ "assignees": [],
+ "body": "might fix #30 ",
+ "comments": []
+}
diff --git a/issues/31.md b/issues/31.md
@@ -0,0 +1,11 @@
+# #31 Consider saving avatars as cache via filesystem instead directly into the DB
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-10-18T15:40:26Z
+- **Labels:** enhancement, to do, good first issue
+
+---
+
+might fix #30
+
diff --git a/issues/32.json b/issues/32.json
@@ -0,0 +1,12 @@
+{
+ "number": 32,
+ "title": "[DESIGN] add missing drop shadow left of Content/messageScrollArea",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-10-20T19:49:04Z",
+ "closed_at": null,
+ "labels": [],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/32.md b/issues/32.md
@@ -0,0 +1,10 @@
+# #32 [DESIGN] add missing drop shadow left of Content/messageScrollArea
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-10-20T19:49:04Z
+
+---
+
+_No description._
+
diff --git a/issues/33.json b/issues/33.json
@@ -0,0 +1,18 @@
+{
+ "number": 33,
+ "title": "Make designs for all Event types not just text Only",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-10-21T17:06:48Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "in progress",
+ "good first issue"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/33.md b/issues/33.md
@@ -0,0 +1,12 @@
+# #33 Make designs for all Event types not just text Only
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-10-21T17:06:48Z
+- **Labels:** enhancement, in progress, good first issue
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
diff --git a/issues/34.json b/issues/34.json
@@ -0,0 +1,17 @@
+{
+ "number": 34,
+ "title": "Start using QThreads!!!! (...when adding widgets to the layout)",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-21T20:16:34Z",
+ "closed_at": "2017-12-22T11:14:22Z",
+ "labels": [
+ "enhancement",
+ "Important"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "https://stackoverflow.com/questions/22989848/qt-show-widget-without-blocking-his-gui",
+ "comments": []
+}
diff --git a/issues/34.md b/issues/34.md
@@ -0,0 +1,13 @@
+# #34 Start using QThreads!!!! (...when adding widgets to the layout)
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-21T20:16:34Z
+- **Closed:** 2017-12-22T11:14:22Z
+- **Labels:** enhancement, Important
+- **Assignees:** @MTRNord
+
+---
+
+https://stackoverflow.com/questions/22989848/qt-show-widget-without-blocking-his-gui
+
diff --git a/issues/35.json b/issues/35.json
@@ -0,0 +1,15 @@
+{
+ "number": 35,
+ "title": "Add a custom URLHandler (matrix:// or mx:// as spec says)",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-10-21T21:32:12Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "to do"
+ ],
+ "assignees": [],
+ "body": "Method == slot (see messageList file)\r\n\r\nQTDoc: http://doc.qt.io/qt-5/qdesktopservices.html#setUrlHandler\r\n\r\nSpec Issue: https://github.com/matrix-org/matrix-doc/issues/455",
+ "comments": []
+}
diff --git a/issues/35.md b/issues/35.md
@@ -0,0 +1,15 @@
+# #35 Add a custom URLHandler (matrix:// or mx:// as spec says)
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-10-21T21:32:12Z
+- **Labels:** enhancement, to do
+
+---
+
+Method == slot (see messageList file)
+
+QTDoc: http://doc.qt.io/qt-5/qdesktopservices.html#setUrlHandler
+
+Spec Issue: https://github.com/matrix-org/matrix-doc/issues/455
+
diff --git a/issues/36.json b/issues/36.json
@@ -0,0 +1,21 @@
+{
+ "number": 36,
+ "title": "change buntdb to badger too be faster on the Cache",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-22T00:43:55Z",
+ "closed_at": "2017-11-22T18:27:20Z",
+ "labels": [
+ "enhancement",
+ "Important"
+ ],
+ "assignees": [],
+ "body": "https://github.com/dgraph-io/badger",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-11-22T18:27:20Z",
+ "body": "Done"
+ }
+ ]
+}
diff --git a/issues/36.md b/issues/36.md
@@ -0,0 +1,19 @@
+# #36 change buntdb to badger too be faster on the Cache
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-22T00:43:55Z
+- **Closed:** 2017-11-22T18:27:20Z
+- **Labels:** enhancement, Important
+
+---
+
+https://github.com/dgraph-io/badger
+
+
+## Comments
+
+### @MTRNord — 2017-11-22T18:27:20Z
+
+Done
+
diff --git a/issues/37.json b/issues/37.json
@@ -0,0 +1,18 @@
+{
+ "number": 37,
+ "title": "[IMPORTANT] rewrite cache layer. Morpheus is doing stuff faster than the FS in Windows.",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-10-23T18:10:44Z",
+ "closed_at": "2017-11-22T18:27:12Z",
+ "labels": [],
+ "assignees": [],
+ "body": "Maybe first keep it in a struct and periodicly write it. Or split it in more DBs because I can",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-11-22T18:27:12Z",
+ "body": "Done :)"
+ }
+ ]
+}
diff --git a/issues/37.md b/issues/37.md
@@ -0,0 +1,18 @@
+# #37 [IMPORTANT] rewrite cache layer. Morpheus is doing stuff faster than the FS in Windows.
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-10-23T18:10:44Z
+- **Closed:** 2017-11-22T18:27:12Z
+
+---
+
+Maybe first keep it in a struct and periodicly write it. Or split it in more DBs because I can
+
+
+## Comments
+
+### @MTRNord — 2017-11-22T18:27:12Z
+
+Done :)
+
diff --git a/issues/38.json b/issues/38.json
@@ -0,0 +1,24 @@
+{
+ "number": 38,
+ "title": "investigate why some cached avatars crash the client",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-11-23T20:25:39Z",
+ "closed_at": null,
+ "labels": [
+ "bug",
+ "to do",
+ "Important"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "might acutally be a bug in the image pkg of go",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-11-23T20:36:45Z",
+ "body": "```\r\n$ ./Morpheus.exe\r\n2017-11-23 21:35:51 - Starting Morpheus\r\n2017-11-23 21:35:51 - Starting Auto Login Sequenze in background\r\n2017-11-23 21:35:52 - Start sync\r\n2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!EDuQpgunAOTYiUKIcU:matrix.org/state/m.room.name code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!EDuQpgunAOTYiUKIcU:matrix.org/state/m.room.canonical_alias code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!fitDMVZWZRNjRIvEvb:matrix.org/state/m.room.name code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!fitDMVZWZRNjRIvEvb:matrix.org/state/m.room.canonical_alias code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!FyQrGcOoVamcLcvdob:matrix.org/state/m.room.name code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!fmweAIKpbYgSAtNnmw:matrix.ffslfl.net/state/m.room.name code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!fmweAIKpbYgSAtNnmw:matrix.ffslfl.net/state/m.room.canonical_alias code=404 wrapped=M_NOT_FOUND: Event not found.\r\n2017/11/23 21:35:54 load cache\r\n0\r\nStefan\r\ntrue\r\n0\r\n0\r\nPeter V\u00e1gner\r\nException 0xc0000005 0x0 0x18 0x1be7082\r\nPC=0x1be7082\r\nsignal arrived during external code execution\r\n\r\ngithub.com/therecipe/qt/widgets._Cfunc_QLabel_SetPixmap(0x6322270, 0x0)\r\n github.com/therecipe/qt/widgets/_obj/_cgo_gotypes.go:5664 +0x48\r\ngithub.com/therecipe/qt/widgets.(*QLabel).SetPixmap.func1(0x6322270, 0x0)\r\n C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go:6361 +0xaa\r\ngithub.com/therecipe/qt/widgets.(*QLabel).SetPixmap(0xc04203d598, 0xf0b6a0, 0x0)\r\n C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go:6361 +0x83\r\ngithub.com/Nordgedanken/Morpheus/ui.(*QVBoxLayoutWithTriggerSlot).NewMessage(0xc04ce54160, 0xc04cd2a2d0, 0x8a, 0xc0420e6180, 0xc04d1ab040, 0x13, 0x15fe50c44c1, 0xc04cd180d0, 0x8ca400, 0x5fed252, ...)\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/messageList.go:100 +0x7c2\r\ngithub.com/Nordgedanken/Morpheus/ui.(*MainUI).NewUI.func3(0xc04cd2a2d0, 0x8a, 0xc04d1ab040, 0x13, 0x15fe50c44c1)\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:142 +0xad\r\ngithub.com/Nordgedanken/Morpheus/ui.callbackQVBoxLayoutWithTriggerSlot_TriggerMessage(0x5ff6050, 0x6367da2, 0x8a, 0x5fed252, 0x13, 0x15fe50c44c1)\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/moc.go:841 +0xfc\r\ngithub.com/Nordgedanken/Morpheus/ui._cgoexpwrap_cde1b6ea5d44_callbackQVBoxLayoutWithTriggerSlot_TriggerMessage(0x5ff6050, 0x6367da2, 0x8a, 0x5fed252, 0x13, 0x15fe50c44c1)\r\n github.com/Nordgedanken/Morpheus/ui/_obj/_cgo_gotypes.go:1941 +0x64\r\ngithub.com/Nordgedanken/Morpheus/ui._Cfunc_QVBoxLayoutWithTriggerSlot_EventDefault(0x5ff6050, 0x6216aa0, 0x0)\r\n github.com/Nordgedanken/Morpheus/ui/_obj/_cgo_gotypes.go:899 +0x51\r\ngithub.com/Nordgedanken/Morpheus/ui.(*QVBoxLayoutWithTriggerSlot).EventDefault.func1(0x5ff6050, 0x6216aa0, 0x6216aa0)\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/moc.go:1395 +0xaa\r\ngithub.com/Nordgedanken/Morpheus/ui.(*QVBoxLayoutWithTriggerSlot).EventDefault(0xc04ce54160, 0xf084a0, 0xc0476f6f20, 0x5)\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/moc.go:1395 +0x9b\r\ngithub.com/Nordgedanken/Morpheus/ui.callbackQVBoxLayoutWithTriggerSlot_Event(0x5ff6050, 0x6216aa0, 0xc000000008)\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/moc.go:1390 +0x158\r\ngithub.com/Nordgedanken/Morpheus/ui._cgoexpwrap_cde1b6ea5d44_callbackQVBoxLayoutWithTriggerSlot_Event(0x5ff6050, 0x6216aa0, 0x1344601)\r\n github.com/Nordgedanken/Morpheus/ui/_obj/_cgo_gotypes.go:2222 +0x3c\r\ngithub.com/therecipe/qt/widgets._Cfunc_QApplication_QApplication_Exec(0x0)\r\n github.com/therecipe/qt/widgets/_obj/_cgo_gotypes.go:1378 +0x50\r\ngithub.com/therecipe/qt/widgets.QApplication_Exec(0xc04cd18010)\r\n C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go:1402 +0x29\r\nmain.main()\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/main.go:192 +0x977\r\n\r\ngoroutine 5 [syscall]:\r\nos/signal.signal_recv(0x0)\r\n C:/Go/src/runtime/sigqueue.go:131 +0xad\r\nos/signal.loop()\r\n C:/Go/src/os/signal/signal_unix.go:22 +0x29\r\ncreated by os/signal.init.0\r\n C:/Go/src/os/signal/signal_unix.go:28 +0x48\r\n\r\ngoroutine 6 [chan receive]:\r\nmain.main.func1(0xc0420404e0)\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/main.go:32 +0x3b\r\ncreated by main.main\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/main.go:31 +0x12f\r\n\r\ngoroutine 7 [select]:\r\ngithub.com/dgraph-io/badger.(*DB).updateSize(0xc042280000, 0xc0420cd200)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:856 +0x1d3\r\ncreated by github.com/dgraph-io/badger.Open\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:245 +0xa9a\r\n\r\ngoroutine 421 [select]:\r\ngithub.com/dgraph-io/badger.(*levelsController).runWorker(0xc042114070, 0xc047706120)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:187 +0x1e9\r\ncreated by github.com/dgraph-io/badger.(*levelsController).startCompact\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:172 +0x89\r\n\r\ngoroutine 416 [select]:\r\nnet/http.(*persistConn).roundTrip(0xc04cd1f440, 0xc047830810, 0x0, 0x0, 0x0)\r\n C:/Go/src/net/http/transport.go:1970 +0x60f\r\nnet/http.(*Transport).RoundTrip(0xf5a340, 0xc04cffa000, 0xf5a340, 0x0, 0x0)\r\n C:/Go/src/net/http/transport.go:413 +0x999\r\nnet/http.send(0xc04cffa000, 0xf08de0, 0xf5a340, 0x0, 0x0, 0x0, 0xc0476f6078, 0x100, 0xc042039b38, 0x1)\r\n C:/Go/src/net/http/client.go:249 +0x1b0\r\nnet/http.(*Client).send(0xfc0240, 0xc04cffa000, 0x0, 0x0, 0x0, 0xc0476f6078, 0x0, 0x1, 0x3e5acd0)\r\n C:/Go/src/net/http/client.go:173 +0x104\r\nnet/http.(*Client).Do(0xfc0240, 0xc04cffa000, 0xc, 0xa1dfc6, 0x10)\r\n C:/Go/src/net/http/client.go:602 +0x294\r\ngithub.com/matrix-org/gomatrix.(*Client).MakeRequest(0xc0420e6180, 0xa1616f, 0x3, 0xc04cff6160, 0x15a, 0x0, 0x0, 0x91a960, 0xc0476f6038, 0x0, ...)\r\n C:/Users/marce/go/src/github.com/matrix-org/gomatrix/client.go:204 +0x218\r\ngithub.com/matrix-org/gomatrix.(*Client).SyncRequest(0xc0420e6180, 0x7530, 0x0, 0x0, 0xc047702328, 0x3, 0x0, 0x0, 0x0, 0xc042072210, ...)\r\n C:/Users/marce/go/src/github.com/matrix-org/gomatrix/client.go:270 +0x201\r\ngithub.com/matrix-org/gomatrix.(*Client).Sync(0xc0420e6180, 0xc047727fb0, 0x1)\r\n C:/Users/marce/go/src/github.com/matrix-org/gomatrix/client.go:132 +0x152\r\ngithub.com/Nordgedanken/Morpheus/ui.(*MainUI).startSync.func2(0xc04cd120b0, 0xc04ce5e120)\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:326 +0x91\r\ncreated by github.com/Nordgedanken/Morpheus/ui.(*MainUI).startSync\r\n C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:322 +0x39f\r\n\r\ngoroutine 534 [IO wait]:\r\ninternal/poll.runtime_pollWait(0x57a4d80, 0x72, 0x0)\r\n C:/Go/src/runtime/netpoll.go:173 +0x5e\r\ninternal/poll.(*pollDesc).wait(0xc04cfdc158, 0x72, 0xf06500, 0x0, 0x0)\r\n C:/Go/src/internal/poll/fd_poll_runtime.go:85 +0xb5\r\ninternal/poll.(*ioSrv).ExecIO(0xfbe330, 0xc04cfdc018, 0xa37840, 0xc04ce5e2f0, 0xc0475b6400, 0x6fc23ac00)\r\n C:/Go/src/internal/poll/fd_windows.go:195 +0x13a\r\ninternal/poll.(*FD).Read(0xc04cfdc000, 0xc04d008400, 0x400, 0x400, 0x0, 0x0, 0x0)\r\n C:/Go/src/internal/poll/fd_windows.go:439 +0x266\r\nnet.(*netFD).Read(0xc04cfdc000, 0xc04d008400, 0x400, 0x400, 0xc0477178b0, 0x57a4ef, 0xfbf4e0)\r\n C:/Go/src/net/fd_windows.go:151 +0x59\r\nnet.(*conn).Read(0xc0476f6088, 0xc04d008400, 0x400, 0x400, 0x0, 0x0, 0x0)\r\n C:/Go/src/net/net.go:176 +0x74\r\ncrypto/tls.(*block).readFromUntil(0xc047830ab0, 0x57a4fc0, 0xc0476f6088, 0x5, 0xc0476f6088, 0x0)\r\n C:/Go/src/crypto/tls/conn.go:488 +0x9c\r\ncrypto/tls.(*Conn).readRecord(0xc042268380, 0xa37f17, 0xc0422684a0, 0x0)\r\n C:/Go/src/crypto/tls/conn.go:590 +0xe7\r\ncrypto/tls.(*Conn).Read(0xc042268380, 0xc04d164000, 0x1000, 0x1000, 0x0, 0x0, 0x0)\r\n C:/Go/src/crypto/tls/conn.go:1134 +0x117\r\nnet/http.(*persistConn).Read(0xc04ce4c5a0, 0xc04d164000, 0x1000, 0x1000, 0x0, 0x0, 0xc047717b68)\r\n C:/Go/src/net/http/transport.go:1391 +0x147\r\nbufio.(*Reader).fill(0xc047603da0)\r\n C:/Go/src/bufio/bufio.go:97 +0x121\r\nbufio.(*Reader).Peek(0xc047603da0, 0x1, 0xc0421ba540, 0xc047717c80, 0x0, 0x0, 0x0)\r\n C:/Go/src/bufio/bufio.go:129 +0x41\r\nnet/http.(*persistConn).readLoop(0xc04ce4c5a0)\r\n C:/Go/src/net/http/transport.go:1539 +0x18c\r\ncreated by net/http.(*Transport).dialConn\r\n C:/Go/src/net/http/transport.go:1186 +0xa35\r\n\r\ngoroutine 420 [select]:\r\ngithub.com/dgraph-io/badger.(*levelsController).runWorker(0xc042114070, 0xc047706120)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:187 +0x1e9\r\ncreated by github.com/dgraph-io/badger.(*levelsController).startCompact\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:172 +0x89\r\n\r\ngoroutine 519 [IO wait]:\r\ninternal/poll.runtime_pollWait(0x57a4c00, 0x72, 0x0)\r\n C:/Go/src/runtime/netpoll.go:173 +0x5e\r\ninternal/poll.(*pollDesc).wait(0xc04cfdc5d8, 0x72, 0xf06500, 0x0, 0x0)\r\n C:/Go/src/internal/poll/fd_poll_runtime.go:85 +0xb5\r\ninternal/poll.(*ioSrv).ExecIO(0xfbe330, 0xc04cfdc498, 0xa37840, 0x0, 0x3f3, 0xc04d018405)\r\n C:/Go/src/internal/poll/fd_windows.go:195 +0x13a\r\ninternal/poll.(*FD).Read(0xc04cfdc480, 0xc04d018400, 0x400, 0x400, 0x0, 0x0, 0x0)\r\n C:/Go/src/internal/poll/fd_windows.go:439 +0x266\r\nnet.(*netFD).Read(0xc04cfdc480, 0xc04d018400, 0x400, 0x400, 0xc04d1c817e, 0xc042268000, 0x3da0d50)\r\n C:/Go/src/net/fd_windows.go:151 +0x59\r\nnet.(*conn).Read(0xc04ce640e0, 0xc04d018400, 0x400, 0x400, 0x0, 0x0, 0x0)\r\n C:/Go/src/net/net.go:176 +0x74\r\ncrypto/tls.(*block).readFromUntil(0xc04ce4eab0, 0x57a4fc0, 0xc04ce640e0, 0x5, 0xc04ce640e0, 0xc04e2dd2c0)\r\n C:/Go/src/crypto/tls/conn.go:488 +0x9c\r\ncrypto/tls.(*Conn).readRecord(0xc0476fe380, 0xa37f17, 0xc0476fe4a0, 0x42fcb2)\r\n C:/Go/src/crypto/tls/conn.go:590 +0xe7\r\ncrypto/tls.(*Conn).Read(0xc0476fe380, 0xc04d1c8000, 0x1000, 0x1000, 0x0, 0x0, 0x0)\r\n C:/Go/src/crypto/tls/conn.go:1134 +0x117\r\nnet/http.(*persistConn).Read(0xc0420837a0, 0xc04d1c8000, 0x1000, 0x1000, 0xc04d156310, 0xc0421ba6b8, 0x453a30)\r\n C:/Go/src/net/http/transport.go:1391 +0x147\r\nbufio.(*Reader).fill(0xc047704a80)\r\n C:/Go/src/bufio/bufio.go:97 +0x121\r\nbufio.(*Reader).Peek(0xc047704a80, 0x1, 0x0, 0x0, 0x1, 0xc042021b00, 0x0)\r\n C:/Go/src/bufio/bufio.go:129 +0x41\r\nnet/http.(*persistConn).readLoop(0xc0420837a0)\r\n C:/Go/src/net/http/transport.go:1539 +0x18c\r\ncreated by net/http.(*Transport).dialConn\r\n C:/Go/src/net/http/transport.go:1186 +0xa35\r\n\r\ngoroutine 535 [select]:\r\nnet/http.(*persistConn).writeLoop(0xc04ce4c5a0)\r\n C:/Go/src/net/http/transport.go:1759 +0x16c\r\ncreated by net/http.(*Transport).dialConn\r\n C:/Go/src/net/http/transport.go:1187 +0xa5a\r\n\r\ngoroutine 422 [chan receive]:\r\ngithub.com/dgraph-io/badger.(*DB).flushMemtable(0xc042280300, 0xc047706140, 0x0, 0x0)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:751 +0x101\r\ncreated by github.com/dgraph-io/badger.Open\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:257 +0xc48\r\n\r\ngoroutine 51 [select]:\r\ngithub.com/dgraph-io/badger.(*DB).doWrites(0xc042280300, 0xc0420cc5e0)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:610 +0x481\r\ncreated by github.com/dgraph-io/badger.Open\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:301 +0x10f4\r\n\r\ngoroutine 129 [chan receive]:\r\ngithub.com/dgraph-io/badger.(*valueLog).waitOnGC(0xc042280128, 0xc0420cc6c0)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/value.go:981 +0x68\r\ncreated by github.com/dgraph-io/badger.Open\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:304 +0x115a\r\n\r\ngoroutine 418 [select]:\r\ngithub.com/dgraph-io/badger.(*DB).updateSize(0xc042280300, 0xc0420cc7c0)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:856 +0x1d3\r\ncreated by github.com/dgraph-io/badger.Open\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:245 +0xa9a\r\n\r\ngoroutine 411 [select]:\r\ngithub.com/dgraph-io/badger.(*levelsController).runWorker(0xc0476f4000, 0xc047706300)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:187 +0x1e9\r\ncreated by github.com/dgraph-io/badger.(*levelsController).startCompact\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:172 +0x89\r\n\r\ngoroutine 412 [select]:\r\ngithub.com/dgraph-io/badger.(*levelsController).runWorker(0xc0476f4000, 0xc047706300)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:187 +0x1e9\r\ncreated by github.com/dgraph-io/badger.(*levelsController).startCompact\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:172 +0x89\r\n\r\ngoroutine 413 [select]:\r\ngithub.com/dgraph-io/badger.(*levelsController).runWorker(0xc0476f4000, 0xc047706300)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:187 +0x1e9\r\ncreated by github.com/dgraph-io/badger.(*levelsController).startCompact\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:172 +0x89\r\n\r\ngoroutine 414 [chan receive]:\r\ngithub.com/dgraph-io/badger.(*DB).flushMemtable(0xc042280000, 0xc047706320, 0x0, 0x0)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:751 +0x101\r\ncreated by github.com/dgraph-io/badger.Open\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:257 +0xc48\r\n\r\ngoroutine 61 [IO wait]:\r\ninternal/poll.runtime_pollWait(0x57a4f00, 0x72, 0x0)\r\n C:/Go/src/runtime/netpoll.go:173 +0x5e\r\ninternal/poll.(*pollDesc).wait(0xc042080818, 0x72, 0xf06500, 0x0, 0x0)\r\n C:/Go/src/internal/poll/fd_poll_runtime.go:85 +0xb5\r\ninternal/poll.(*ioSrv).ExecIO(0xfbe330, 0xc0420806d8, 0xa37840, 0x0, 0x3ff3, 0xc04ce68005)\r\n C:/Go/src/internal/poll/fd_windows.go:195 +0x13a\r\ninternal/poll.(*FD).Read(0xc0420806c0, 0xc04ce68000, 0x4000, 0x4000, 0x0, 0x0, 0x0)\r\n C:/Go/src/internal/poll/fd_windows.go:439 +0x266\r\nnet.(*netFD).Read(0xc0420806c0, 0xc04ce68000, 0x4000, 0x4000, 0xc04cd8317e, 0xc042032700, 0x3da0d50)\r\n C:/Go/src/net/fd_windows.go:151 +0x59\r\nnet.(*conn).Read(0xc04797a118, 0xc04ce68000, 0x4000, 0x4000, 0x0, 0x0, 0x0)\r\n C:/Go/src/net/net.go:176 +0x74\r\ncrypto/tls.(*block).readFromUntil(0xc04cd1c810, 0x57a4fc0, 0xc04797a118, 0x5, 0xc04797a118, 0x0)\r\n C:/Go/src/crypto/tls/conn.go:488 +0x9c\r\ncrypto/tls.(*Conn).readRecord(0xc042033180, 0xa37f17, 0xc0420332a0, 0x42fcb2)\r\n C:/Go/src/crypto/tls/conn.go:590 +0xe7\r\ncrypto/tls.(*Conn).Read(0xc042033180, 0xc04cd83000, 0x1000, 0x1000, 0x0, 0x0, 0x0)\r\n C:/Go/src/crypto/tls/conn.go:1134 +0x117\r\nnet/http.(*persistConn).Read(0xc04cd1f440, 0xc04cd83000, 0x1000, 0x1000, 0xc04200a0d0, 0xc0421ba478, 0x453a30)\r\n C:/Go/src/net/http/transport.go:1391 +0x147\r\nbufio.(*Reader).fill(0xc0475db680)\r\n C:/Go/src/bufio/bufio.go:97 +0x121\r\nbufio.(*Reader).Peek(0xc0475db680, 0x1, 0x0, 0x0, 0x1, 0xc04ce66300, 0x0)\r\n C:/Go/src/bufio/bufio.go:129 +0x41\r\nnet/http.(*persistConn).readLoop(0xc04cd1f440)\r\n C:/Go/src/net/http/transport.go:1539 +0x18c\r\ncreated by net/http.(*Transport).dialConn\r\n C:/Go/src/net/http/transport.go:1186 +0xa35\r\n\r\ngoroutine 62 [select]:\r\nnet/http.(*persistConn).writeLoop(0xc04cd1f440)\r\n C:/Go/src/net/http/transport.go:1759 +0x16c\r\ncreated by net/http.(*Transport).dialConn\r\n C:/Go/src/net/http/transport.go:1187 +0xa5a\r\n\r\ngoroutine 52 [chan receive]:\r\ngithub.com/dgraph-io/badger.(*valueLog).waitOnGC(0xc042280428, 0xc0420cc600)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/value.go:981 +0x68\r\ncreated by github.com/dgraph-io/badger.Open\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:304 +0x115a\r\n\r\ngoroutine 128 [select]:\r\ngithub.com/dgraph-io/badger.(*DB).doWrites(0xc042280000, 0xc0420cc6a0)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:610 +0x481\r\ncreated by github.com/dgraph-io/badger.Open\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:301 +0x10f4\r\n\r\ngoroutine 419 [select]:\r\ngithub.com/dgraph-io/badger.(*levelsController).runWorker(0xc042114070, 0xc047706120)\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:187 +0x1e9\r\ncreated by github.com/dgraph-io/badger.(*levelsController).startCompact\r\n C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:172 +0x89\r\n\r\ngoroutine 520 [select]:\r\nnet/http.(*persistConn).writeLoop(0xc0420837a0)\r\n C:/Go/src/net/http/transport.go:1759 +0x16c\r\ncreated by net/http.(*Transport).dialConn\r\n C:/Go/src/net/http/transport.go:1187 +0xa5a\r\nrax 0x0\r\nrbx 0x63043c0\r\nrcx 0x0\r\nrdi 0x0\r\nrsi 0x1be7080\r\nrbp 0xa00000002\r\nrsp 0x125b148\r\nr8 0x3\r\nr9 0x125b380\r\nr10 0x0\r\nr11 0x8101010101010100\r\nr12 0x2\r\nr13 0x0\r\nr14 0x6322270\r\nr15 0x2430d60\r\nrip 0x1be7082\r\nrflags 0x10246\r\ncs 0x33\r\nfs 0x53\r\ngs 0x2b\r\n```"
+ }
+ ]
+}
diff --git a/issues/38.md b/issues/38.md
@@ -0,0 +1,320 @@
+# #38 investigate why some cached avatars crash the client
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-11-23T20:25:39Z
+- **Labels:** bug, to do, Important
+- **Assignees:** @MTRNord
+
+---
+
+might acutally be a bug in the image pkg of go
+
+
+## Comments
+
+### @MTRNord — 2017-11-23T20:36:45Z
+
+```
+$ ./Morpheus.exe
+2017-11-23 21:35:51 - Starting Morpheus
+2017-11-23 21:35:51 - Starting Auto Login Sequenze in background
+2017-11-23 21:35:52 - Start sync
+2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!EDuQpgunAOTYiUKIcU:matrix.org/state/m.room.name code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!EDuQpgunAOTYiUKIcU:matrix.org/state/m.room.canonical_alias code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!fitDMVZWZRNjRIvEvb:matrix.org/state/m.room.name code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!fitDMVZWZRNjRIvEvb:matrix.org/state/m.room.canonical_alias code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!FyQrGcOoVamcLcvdob:matrix.org/state/m.room.name code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!fmweAIKpbYgSAtNnmw:matrix.ffslfl.net/state/m.room.name code=404 wrapped=M_NOT_FOUND: Event not found.
+2017-11-23 21:35:52 - msg=Failed to GET JSON to /_matrix/client/r0/rooms/!fmweAIKpbYgSAtNnmw:matrix.ffslfl.net/state/m.room.canonical_alias code=404 wrapped=M_NOT_FOUND: Event not found.
+2017/11/23 21:35:54 load cache
+0
+Stefan
+true
+0
+0
+Peter Vágner
+Exception 0xc0000005 0x0 0x18 0x1be7082
+PC=0x1be7082
+signal arrived during external code execution
+
+github.com/therecipe/qt/widgets._Cfunc_QLabel_SetPixmap(0x6322270, 0x0)
+ github.com/therecipe/qt/widgets/_obj/_cgo_gotypes.go:5664 +0x48
+github.com/therecipe/qt/widgets.(*QLabel).SetPixmap.func1(0x6322270, 0x0)
+ C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go:6361 +0xaa
+github.com/therecipe/qt/widgets.(*QLabel).SetPixmap(0xc04203d598, 0xf0b6a0, 0x0)
+ C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go:6361 +0x83
+github.com/Nordgedanken/Morpheus/ui.(*QVBoxLayoutWithTriggerSlot).NewMessage(0xc04ce54160, 0xc04cd2a2d0, 0x8a, 0xc0420e6180, 0xc04d1ab040, 0x13, 0x15fe50c44c1, 0xc04cd180d0, 0x8ca400, 0x5fed252, ...)
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/messageList.go:100 +0x7c2
+github.com/Nordgedanken/Morpheus/ui.(*MainUI).NewUI.func3(0xc04cd2a2d0, 0x8a, 0xc04d1ab040, 0x13, 0x15fe50c44c1)
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:142 +0xad
+github.com/Nordgedanken/Morpheus/ui.callbackQVBoxLayoutWithTriggerSlot_TriggerMessage(0x5ff6050, 0x6367da2, 0x8a, 0x5fed252, 0x13, 0x15fe50c44c1)
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/moc.go:841 +0xfc
+github.com/Nordgedanken/Morpheus/ui._cgoexpwrap_cde1b6ea5d44_callbackQVBoxLayoutWithTriggerSlot_TriggerMessage(0x5ff6050, 0x6367da2, 0x8a, 0x5fed252, 0x13, 0x15fe50c44c1)
+ github.com/Nordgedanken/Morpheus/ui/_obj/_cgo_gotypes.go:1941 +0x64
+github.com/Nordgedanken/Morpheus/ui._Cfunc_QVBoxLayoutWithTriggerSlot_EventDefault(0x5ff6050, 0x6216aa0, 0x0)
+ github.com/Nordgedanken/Morpheus/ui/_obj/_cgo_gotypes.go:899 +0x51
+github.com/Nordgedanken/Morpheus/ui.(*QVBoxLayoutWithTriggerSlot).EventDefault.func1(0x5ff6050, 0x6216aa0, 0x6216aa0)
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/moc.go:1395 +0xaa
+github.com/Nordgedanken/Morpheus/ui.(*QVBoxLayoutWithTriggerSlot).EventDefault(0xc04ce54160, 0xf084a0, 0xc0476f6f20, 0x5)
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/moc.go:1395 +0x9b
+github.com/Nordgedanken/Morpheus/ui.callbackQVBoxLayoutWithTriggerSlot_Event(0x5ff6050, 0x6216aa0, 0xc000000008)
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/moc.go:1390 +0x158
+github.com/Nordgedanken/Morpheus/ui._cgoexpwrap_cde1b6ea5d44_callbackQVBoxLayoutWithTriggerSlot_Event(0x5ff6050, 0x6216aa0, 0x1344601)
+ github.com/Nordgedanken/Morpheus/ui/_obj/_cgo_gotypes.go:2222 +0x3c
+github.com/therecipe/qt/widgets._Cfunc_QApplication_QApplication_Exec(0x0)
+ github.com/therecipe/qt/widgets/_obj/_cgo_gotypes.go:1378 +0x50
+github.com/therecipe/qt/widgets.QApplication_Exec(0xc04cd18010)
+ C:/Users/marce/go/src/github.com/therecipe/qt/widgets/widgets-minimal.go:1402 +0x29
+main.main()
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/main.go:192 +0x977
+
+goroutine 5 [syscall]:
+os/signal.signal_recv(0x0)
+ C:/Go/src/runtime/sigqueue.go:131 +0xad
+os/signal.loop()
+ C:/Go/src/os/signal/signal_unix.go:22 +0x29
+created by os/signal.init.0
+ C:/Go/src/os/signal/signal_unix.go:28 +0x48
+
+goroutine 6 [chan receive]:
+main.main.func1(0xc0420404e0)
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/main.go:32 +0x3b
+created by main.main
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/main.go:31 +0x12f
+
+goroutine 7 [select]:
+github.com/dgraph-io/badger.(*DB).updateSize(0xc042280000, 0xc0420cd200)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:856 +0x1d3
+created by github.com/dgraph-io/badger.Open
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:245 +0xa9a
+
+goroutine 421 [select]:
+github.com/dgraph-io/badger.(*levelsController).runWorker(0xc042114070, 0xc047706120)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:187 +0x1e9
+created by github.com/dgraph-io/badger.(*levelsController).startCompact
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:172 +0x89
+
+goroutine 416 [select]:
+net/http.(*persistConn).roundTrip(0xc04cd1f440, 0xc047830810, 0x0, 0x0, 0x0)
+ C:/Go/src/net/http/transport.go:1970 +0x60f
+net/http.(*Transport).RoundTrip(0xf5a340, 0xc04cffa000, 0xf5a340, 0x0, 0x0)
+ C:/Go/src/net/http/transport.go:413 +0x999
+net/http.send(0xc04cffa000, 0xf08de0, 0xf5a340, 0x0, 0x0, 0x0, 0xc0476f6078, 0x100, 0xc042039b38, 0x1)
+ C:/Go/src/net/http/client.go:249 +0x1b0
+net/http.(*Client).send(0xfc0240, 0xc04cffa000, 0x0, 0x0, 0x0, 0xc0476f6078, 0x0, 0x1, 0x3e5acd0)
+ C:/Go/src/net/http/client.go:173 +0x104
+net/http.(*Client).Do(0xfc0240, 0xc04cffa000, 0xc, 0xa1dfc6, 0x10)
+ C:/Go/src/net/http/client.go:602 +0x294
+github.com/matrix-org/gomatrix.(*Client).MakeRequest(0xc0420e6180, 0xa1616f, 0x3, 0xc04cff6160, 0x15a, 0x0, 0x0, 0x91a960, 0xc0476f6038, 0x0, ...)
+ C:/Users/marce/go/src/github.com/matrix-org/gomatrix/client.go:204 +0x218
+github.com/matrix-org/gomatrix.(*Client).SyncRequest(0xc0420e6180, 0x7530, 0x0, 0x0, 0xc047702328, 0x3, 0x0, 0x0, 0x0, 0xc042072210, ...)
+ C:/Users/marce/go/src/github.com/matrix-org/gomatrix/client.go:270 +0x201
+github.com/matrix-org/gomatrix.(*Client).Sync(0xc0420e6180, 0xc047727fb0, 0x1)
+ C:/Users/marce/go/src/github.com/matrix-org/gomatrix/client.go:132 +0x152
+github.com/Nordgedanken/Morpheus/ui.(*MainUI).startSync.func2(0xc04cd120b0, 0xc04ce5e120)
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:326 +0x91
+created by github.com/Nordgedanken/Morpheus/ui.(*MainUI).startSync
+ C:/Users/marce/go/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:322 +0x39f
+
+goroutine 534 [IO wait]:
+internal/poll.runtime_pollWait(0x57a4d80, 0x72, 0x0)
+ C:/Go/src/runtime/netpoll.go:173 +0x5e
+internal/poll.(*pollDesc).wait(0xc04cfdc158, 0x72, 0xf06500, 0x0, 0x0)
+ C:/Go/src/internal/poll/fd_poll_runtime.go:85 +0xb5
+internal/poll.(*ioSrv).ExecIO(0xfbe330, 0xc04cfdc018, 0xa37840, 0xc04ce5e2f0, 0xc0475b6400, 0x6fc23ac00)
+ C:/Go/src/internal/poll/fd_windows.go:195 +0x13a
+internal/poll.(*FD).Read(0xc04cfdc000, 0xc04d008400, 0x400, 0x400, 0x0, 0x0, 0x0)
+ C:/Go/src/internal/poll/fd_windows.go:439 +0x266
+net.(*netFD).Read(0xc04cfdc000, 0xc04d008400, 0x400, 0x400, 0xc0477178b0, 0x57a4ef, 0xfbf4e0)
+ C:/Go/src/net/fd_windows.go:151 +0x59
+net.(*conn).Read(0xc0476f6088, 0xc04d008400, 0x400, 0x400, 0x0, 0x0, 0x0)
+ C:/Go/src/net/net.go:176 +0x74
+crypto/tls.(*block).readFromUntil(0xc047830ab0, 0x57a4fc0, 0xc0476f6088, 0x5, 0xc0476f6088, 0x0)
+ C:/Go/src/crypto/tls/conn.go:488 +0x9c
+crypto/tls.(*Conn).readRecord(0xc042268380, 0xa37f17, 0xc0422684a0, 0x0)
+ C:/Go/src/crypto/tls/conn.go:590 +0xe7
+crypto/tls.(*Conn).Read(0xc042268380, 0xc04d164000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
+ C:/Go/src/crypto/tls/conn.go:1134 +0x117
+net/http.(*persistConn).Read(0xc04ce4c5a0, 0xc04d164000, 0x1000, 0x1000, 0x0, 0x0, 0xc047717b68)
+ C:/Go/src/net/http/transport.go:1391 +0x147
+bufio.(*Reader).fill(0xc047603da0)
+ C:/Go/src/bufio/bufio.go:97 +0x121
+bufio.(*Reader).Peek(0xc047603da0, 0x1, 0xc0421ba540, 0xc047717c80, 0x0, 0x0, 0x0)
+ C:/Go/src/bufio/bufio.go:129 +0x41
+net/http.(*persistConn).readLoop(0xc04ce4c5a0)
+ C:/Go/src/net/http/transport.go:1539 +0x18c
+created by net/http.(*Transport).dialConn
+ C:/Go/src/net/http/transport.go:1186 +0xa35
+
+goroutine 420 [select]:
+github.com/dgraph-io/badger.(*levelsController).runWorker(0xc042114070, 0xc047706120)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:187 +0x1e9
+created by github.com/dgraph-io/badger.(*levelsController).startCompact
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:172 +0x89
+
+goroutine 519 [IO wait]:
+internal/poll.runtime_pollWait(0x57a4c00, 0x72, 0x0)
+ C:/Go/src/runtime/netpoll.go:173 +0x5e
+internal/poll.(*pollDesc).wait(0xc04cfdc5d8, 0x72, 0xf06500, 0x0, 0x0)
+ C:/Go/src/internal/poll/fd_poll_runtime.go:85 +0xb5
+internal/poll.(*ioSrv).ExecIO(0xfbe330, 0xc04cfdc498, 0xa37840, 0x0, 0x3f3, 0xc04d018405)
+ C:/Go/src/internal/poll/fd_windows.go:195 +0x13a
+internal/poll.(*FD).Read(0xc04cfdc480, 0xc04d018400, 0x400, 0x400, 0x0, 0x0, 0x0)
+ C:/Go/src/internal/poll/fd_windows.go:439 +0x266
+net.(*netFD).Read(0xc04cfdc480, 0xc04d018400, 0x400, 0x400, 0xc04d1c817e, 0xc042268000, 0x3da0d50)
+ C:/Go/src/net/fd_windows.go:151 +0x59
+net.(*conn).Read(0xc04ce640e0, 0xc04d018400, 0x400, 0x400, 0x0, 0x0, 0x0)
+ C:/Go/src/net/net.go:176 +0x74
+crypto/tls.(*block).readFromUntil(0xc04ce4eab0, 0x57a4fc0, 0xc04ce640e0, 0x5, 0xc04ce640e0, 0xc04e2dd2c0)
+ C:/Go/src/crypto/tls/conn.go:488 +0x9c
+crypto/tls.(*Conn).readRecord(0xc0476fe380, 0xa37f17, 0xc0476fe4a0, 0x42fcb2)
+ C:/Go/src/crypto/tls/conn.go:590 +0xe7
+crypto/tls.(*Conn).Read(0xc0476fe380, 0xc04d1c8000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
+ C:/Go/src/crypto/tls/conn.go:1134 +0x117
+net/http.(*persistConn).Read(0xc0420837a0, 0xc04d1c8000, 0x1000, 0x1000, 0xc04d156310, 0xc0421ba6b8, 0x453a30)
+ C:/Go/src/net/http/transport.go:1391 +0x147
+bufio.(*Reader).fill(0xc047704a80)
+ C:/Go/src/bufio/bufio.go:97 +0x121
+bufio.(*Reader).Peek(0xc047704a80, 0x1, 0x0, 0x0, 0x1, 0xc042021b00, 0x0)
+ C:/Go/src/bufio/bufio.go:129 +0x41
+net/http.(*persistConn).readLoop(0xc0420837a0)
+ C:/Go/src/net/http/transport.go:1539 +0x18c
+created by net/http.(*Transport).dialConn
+ C:/Go/src/net/http/transport.go:1186 +0xa35
+
+goroutine 535 [select]:
+net/http.(*persistConn).writeLoop(0xc04ce4c5a0)
+ C:/Go/src/net/http/transport.go:1759 +0x16c
+created by net/http.(*Transport).dialConn
+ C:/Go/src/net/http/transport.go:1187 +0xa5a
+
+goroutine 422 [chan receive]:
+github.com/dgraph-io/badger.(*DB).flushMemtable(0xc042280300, 0xc047706140, 0x0, 0x0)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:751 +0x101
+created by github.com/dgraph-io/badger.Open
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:257 +0xc48
+
+goroutine 51 [select]:
+github.com/dgraph-io/badger.(*DB).doWrites(0xc042280300, 0xc0420cc5e0)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:610 +0x481
+created by github.com/dgraph-io/badger.Open
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:301 +0x10f4
+
+goroutine 129 [chan receive]:
+github.com/dgraph-io/badger.(*valueLog).waitOnGC(0xc042280128, 0xc0420cc6c0)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/value.go:981 +0x68
+created by github.com/dgraph-io/badger.Open
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:304 +0x115a
+
+goroutine 418 [select]:
+github.com/dgraph-io/badger.(*DB).updateSize(0xc042280300, 0xc0420cc7c0)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:856 +0x1d3
+created by github.com/dgraph-io/badger.Open
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:245 +0xa9a
+
+goroutine 411 [select]:
+github.com/dgraph-io/badger.(*levelsController).runWorker(0xc0476f4000, 0xc047706300)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:187 +0x1e9
+created by github.com/dgraph-io/badger.(*levelsController).startCompact
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:172 +0x89
+
+goroutine 412 [select]:
+github.com/dgraph-io/badger.(*levelsController).runWorker(0xc0476f4000, 0xc047706300)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:187 +0x1e9
+created by github.com/dgraph-io/badger.(*levelsController).startCompact
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:172 +0x89
+
+goroutine 413 [select]:
+github.com/dgraph-io/badger.(*levelsController).runWorker(0xc0476f4000, 0xc047706300)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:187 +0x1e9
+created by github.com/dgraph-io/badger.(*levelsController).startCompact
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:172 +0x89
+
+goroutine 414 [chan receive]:
+github.com/dgraph-io/badger.(*DB).flushMemtable(0xc042280000, 0xc047706320, 0x0, 0x0)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:751 +0x101
+created by github.com/dgraph-io/badger.Open
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:257 +0xc48
+
+goroutine 61 [IO wait]:
+internal/poll.runtime_pollWait(0x57a4f00, 0x72, 0x0)
+ C:/Go/src/runtime/netpoll.go:173 +0x5e
+internal/poll.(*pollDesc).wait(0xc042080818, 0x72, 0xf06500, 0x0, 0x0)
+ C:/Go/src/internal/poll/fd_poll_runtime.go:85 +0xb5
+internal/poll.(*ioSrv).ExecIO(0xfbe330, 0xc0420806d8, 0xa37840, 0x0, 0x3ff3, 0xc04ce68005)
+ C:/Go/src/internal/poll/fd_windows.go:195 +0x13a
+internal/poll.(*FD).Read(0xc0420806c0, 0xc04ce68000, 0x4000, 0x4000, 0x0, 0x0, 0x0)
+ C:/Go/src/internal/poll/fd_windows.go:439 +0x266
+net.(*netFD).Read(0xc0420806c0, 0xc04ce68000, 0x4000, 0x4000, 0xc04cd8317e, 0xc042032700, 0x3da0d50)
+ C:/Go/src/net/fd_windows.go:151 +0x59
+net.(*conn).Read(0xc04797a118, 0xc04ce68000, 0x4000, 0x4000, 0x0, 0x0, 0x0)
+ C:/Go/src/net/net.go:176 +0x74
+crypto/tls.(*block).readFromUntil(0xc04cd1c810, 0x57a4fc0, 0xc04797a118, 0x5, 0xc04797a118, 0x0)
+ C:/Go/src/crypto/tls/conn.go:488 +0x9c
+crypto/tls.(*Conn).readRecord(0xc042033180, 0xa37f17, 0xc0420332a0, 0x42fcb2)
+ C:/Go/src/crypto/tls/conn.go:590 +0xe7
+crypto/tls.(*Conn).Read(0xc042033180, 0xc04cd83000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
+ C:/Go/src/crypto/tls/conn.go:1134 +0x117
+net/http.(*persistConn).Read(0xc04cd1f440, 0xc04cd83000, 0x1000, 0x1000, 0xc04200a0d0, 0xc0421ba478, 0x453a30)
+ C:/Go/src/net/http/transport.go:1391 +0x147
+bufio.(*Reader).fill(0xc0475db680)
+ C:/Go/src/bufio/bufio.go:97 +0x121
+bufio.(*Reader).Peek(0xc0475db680, 0x1, 0x0, 0x0, 0x1, 0xc04ce66300, 0x0)
+ C:/Go/src/bufio/bufio.go:129 +0x41
+net/http.(*persistConn).readLoop(0xc04cd1f440)
+ C:/Go/src/net/http/transport.go:1539 +0x18c
+created by net/http.(*Transport).dialConn
+ C:/Go/src/net/http/transport.go:1186 +0xa35
+
+goroutine 62 [select]:
+net/http.(*persistConn).writeLoop(0xc04cd1f440)
+ C:/Go/src/net/http/transport.go:1759 +0x16c
+created by net/http.(*Transport).dialConn
+ C:/Go/src/net/http/transport.go:1187 +0xa5a
+
+goroutine 52 [chan receive]:
+github.com/dgraph-io/badger.(*valueLog).waitOnGC(0xc042280428, 0xc0420cc600)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/value.go:981 +0x68
+created by github.com/dgraph-io/badger.Open
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:304 +0x115a
+
+goroutine 128 [select]:
+github.com/dgraph-io/badger.(*DB).doWrites(0xc042280000, 0xc0420cc6a0)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:610 +0x481
+created by github.com/dgraph-io/badger.Open
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/db.go:301 +0x10f4
+
+goroutine 419 [select]:
+github.com/dgraph-io/badger.(*levelsController).runWorker(0xc042114070, 0xc047706120)
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:187 +0x1e9
+created by github.com/dgraph-io/badger.(*levelsController).startCompact
+ C:/Users/marce/go/src/github.com/dgraph-io/badger/levels.go:172 +0x89
+
+goroutine 520 [select]:
+net/http.(*persistConn).writeLoop(0xc0420837a0)
+ C:/Go/src/net/http/transport.go:1759 +0x16c
+created by net/http.(*Transport).dialConn
+ C:/Go/src/net/http/transport.go:1187 +0xa5a
+rax 0x0
+rbx 0x63043c0
+rcx 0x0
+rdi 0x0
+rsi 0x1be7080
+rbp 0xa00000002
+rsp 0x125b148
+r8 0x3
+r9 0x125b380
+r10 0x0
+r11 0x8101010101010100
+r12 0x2
+r13 0x0
+r14 0x6322270
+r15 0x2430d60
+rip 0x1be7082
+rflags 0x10246
+cs 0x33
+fs 0x53
+gs 0x2b
+```
+
diff --git a/issues/39.json b/issues/39.json
@@ -0,0 +1,24 @@
+{
+ "number": 39,
+ "title": "Update readme",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-11-24T10:25:13Z",
+ "closed_at": "2017-12-06T12:21:33Z",
+ "labels": [
+ "enhancement",
+ "good first issue",
+ "Important"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "- [ ] add better build instructions for all systems\r\n- [ ] add coding style (even I dont really have one xD)\r\n- [ ] add goal",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-12-05T14:56:31Z",
+ "body": "see https://github.com/Nordgedanken/Morpheus/tree/feature/Rework_Documentation"
+ }
+ ]
+}
diff --git a/issues/39.md b/issues/39.md
@@ -0,0 +1,22 @@
+# #39 Update readme
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-11-24T10:25:13Z
+- **Closed:** 2017-12-06T12:21:33Z
+- **Labels:** enhancement, good first issue, Important
+- **Assignees:** @MTRNord
+
+---
+
+- [ ] add better build instructions for all systems
+- [ ] add coding style (even I dont really have one xD)
+- [ ] add goal
+
+
+## Comments
+
+### @MTRNord — 2017-12-05T14:56:31Z
+
+see https://github.com/Nordgedanken/Morpheus/tree/feature/Rework_Documentation
+
diff --git a/issues/4.json b/issues/4.json
@@ -0,0 +1,22 @@
+{
+ "number": 4,
+ "title": "State/Sync Cache with buntdb",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-08-22T13:22:26Z",
+ "closed_at": "2017-11-22T20:29:15Z",
+ "labels": [
+ "enhancement",
+ "invalid",
+ "wontfix"
+ ],
+ "assignees": [],
+ "body": "Use https://github.com/tidwall/buntdb to do a (hopefully) fast cache.",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-08-28T13:33:53Z",
+ "body": "Basic implemented and working. Need to get sync running and check size"
+ }
+ ]
+}
diff --git a/issues/4.md b/issues/4.md
@@ -0,0 +1,19 @@
+# #4 State/Sync Cache with buntdb
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-08-22T13:22:26Z
+- **Closed:** 2017-11-22T20:29:15Z
+- **Labels:** enhancement, invalid, wontfix
+
+---
+
+Use https://github.com/tidwall/buntdb to do a (hopefully) fast cache.
+
+
+## Comments
+
+### @MTRNord — 2017-08-28T13:33:53Z
+
+Basic implemented and working. Need to get sync running and check size
+
diff --git a/issues/40.json b/issues/40.json
@@ -0,0 +1,19 @@
+{
+ "number": 40,
+ "title": "Implement basic e2e Support ",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-12-03T07:47:22Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "to do",
+ "good first issue",
+ "Important"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/40.md b/issues/40.md
@@ -0,0 +1,12 @@
+# #40 Implement basic e2e Support
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-12-03T07:47:22Z
+- **Labels:** enhancement, to do, good first issue, Important
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
diff --git a/issues/43.json b/issues/43.json
@@ -0,0 +1,23 @@
+{
+ "number": 43,
+ "title": "Generate .deb files via CI",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-12-06T17:03:45Z",
+ "closed_at": "2017-12-10T17:47:22Z",
+ "labels": [
+ "enhancement",
+ "CI"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-12-06T17:04:55Z",
+ "body": "https://github.com/mh-cbon/go-bin-deb"
+ }
+ ]
+}
diff --git a/issues/43.md b/issues/43.md
@@ -0,0 +1,20 @@
+# #43 Generate .deb files via CI
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-12-06T17:03:45Z
+- **Closed:** 2017-12-10T17:47:22Z
+- **Labels:** enhancement, CI
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
+
+## Comments
+
+### @MTRNord — 2017-12-06T17:04:55Z
+
+https://github.com/mh-cbon/go-bin-deb
+
diff --git a/issues/44.json b/issues/44.json
@@ -0,0 +1,18 @@
+{
+ "number": 44,
+ "title": "Update Hello Matrix Screenshot",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-12-07T09:18:29Z",
+ "closed_at": "2017-12-10T17:47:12Z",
+ "labels": [
+ "enhancement",
+ "good first issue",
+ "Important"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/44.md b/issues/44.md
@@ -0,0 +1,13 @@
+# #44 Update Hello Matrix Screenshot
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-12-07T09:18:29Z
+- **Closed:** 2017-12-10T17:47:12Z
+- **Labels:** enhancement, good first issue, Important
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
diff --git a/issues/45.json b/issues/45.json
@@ -0,0 +1,23 @@
+{
+ "number": 45,
+ "title": "init DB after window opens",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-12-07T13:31:22Z",
+ "closed_at": "2017-12-07T14:10:25Z",
+ "labels": [
+ "bug",
+ "Important"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "the window opens very late. without the console it feels like it crashed while starting",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-12-07T14:10:22Z",
+ "body": "Closed in e78e5134a5d9279f2e0223e2cd5045127624e3d9"
+ }
+ ]
+}
diff --git a/issues/45.md b/issues/45.md
@@ -0,0 +1,20 @@
+# #45 init DB after window opens
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-12-07T13:31:22Z
+- **Closed:** 2017-12-07T14:10:25Z
+- **Labels:** bug, Important
+- **Assignees:** @MTRNord
+
+---
+
+the window opens very late. without the console it feels like it crashed while starting
+
+
+## Comments
+
+### @MTRNord — 2017-12-07T14:10:22Z
+
+Closed in e78e5134a5d9279f2e0223e2cd5045127624e3d9
+
diff --git a/issues/46.json b/issues/46.json
@@ -0,0 +1,18 @@
+{
+ "number": 46,
+ "title": "linux config file permissions buggy",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-12-07T15:15:06Z",
+ "closed_at": "2017-12-07T15:15:30Z",
+ "labels": [],
+ "assignees": [],
+ "body": "",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-12-07T15:15:30Z",
+ "body": "Too slow github..."
+ }
+ ]
+}
diff --git a/issues/46.md b/issues/46.md
@@ -0,0 +1,18 @@
+# #46 linux config file permissions buggy
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-12-07T15:15:06Z
+- **Closed:** 2017-12-07T15:15:30Z
+
+---
+
+_No description._
+
+
+## Comments
+
+### @MTRNord — 2017-12-07T15:15:30Z
+
+Too slow github...
+
diff --git a/issues/47.json b/issues/47.json
@@ -0,0 +1,25 @@
+{
+ "number": 47,
+ "title": "Add Spinner",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-12-07T21:03:11Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "help wanted",
+ "to do",
+ "good first issue"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-12-07T21:03:27Z",
+ "body": "https://github.com/snowwlex/QtWaitingSpinner/blob/master/waitingspinnerwidget.cpp"
+ }
+ ]
+}
diff --git a/issues/47.md b/issues/47.md
@@ -0,0 +1,19 @@
+# #47 Add Spinner
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-12-07T21:03:11Z
+- **Labels:** enhancement, help wanted, to do, good first issue
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
+
+## Comments
+
+### @MTRNord — 2017-12-07T21:03:27Z
+
+https://github.com/snowwlex/QtWaitingSpinner/blob/master/waitingspinnerwidget.cpp
+
diff --git a/issues/48.json b/issues/48.json
@@ -0,0 +1,17 @@
+{
+ "number": 48,
+ "title": "rework message widgets to hold their message ID",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-12-08T10:08:02Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "help wanted",
+ "good first issue",
+ "Important"
+ ],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/48.md b/issues/48.md
@@ -0,0 +1,11 @@
+# #48 rework message widgets to hold their message ID
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-12-08T10:08:02Z
+- **Labels:** enhancement, help wanted, good first issue, Important
+
+---
+
+_No description._
+
diff --git a/issues/49.json b/issues/49.json
@@ -0,0 +1,20 @@
+{
+ "number": 49,
+ "title": "on my Laptop the images aren't in the correct size. (highDPI)",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-12-08T10:12:32Z",
+ "closed_at": null,
+ "labels": [
+ "bug"
+ ],
+ "assignees": [],
+ "body": "Issue tracker is **ONLY** used for reporting bugs. NO NEW FEATURE ACCEPTED! Use the [Matrix Room](https://matrix.to/#/#Morpheus:matrix.ffslfl.net) for supporting issues.\r\n\r\n<!--- Provide a general summary of the issue in the Title above -->\r\n\r\n## Expected Behavior\r\nIcons size look _normal_\r\n<!--- Tell us what should happen -->\r\n\r\n## Current Behavior\r\nThey are a lot smaller\r\n<!--- Tell us what happens instead of the expected behavior -->\r\n\r\n## Possible Solution\r\nuse highDPI Flag\r\n<!--- Not obligatory, but suggest a fix/reason for the bug, -->\r\n\r\n## Steps to Reproduce\r\n<!--- Provide a link to a live example, or an unambiguous set of steps to -->\r\n<!--- reproduce this bug. Include code to reproduce, if relevant -->\r\n1. Buy a 1440p res screen in 1080p size\r\n2. Open Morpheus\r\n3. Look at the icons\r\n\r\n## Context (Environment)\r\nA 1440p monitor. (Lenovo 900s)\r\n<!--- How has this issue affected you? What are you trying to accomplish? -->\r\n<!--- Providing context helps us come up with a solution that is most useful in the real world -->\r\n\r\n<!--- Provide a general summary of the issue in the Title above -->\r\n\r\n## Detailed Description\r\n<!--- Provide a detailed description of the change or addition you are proposing -->\r\n\r\n## Possible Implementation\r\n<!--- Not obligatory, but suggest an idea for implementing addition or change -->",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-12-08T10:13:08Z",
+ "body": "\r\n"
+ }
+ ]
+}
diff --git a/issues/49.md b/issues/49.md
@@ -0,0 +1,53 @@
+# #49 on my Laptop the images aren't in the correct size. (highDPI)
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-12-08T10:12:32Z
+- **Labels:** bug
+
+---
+
+Issue tracker is **ONLY** used for reporting bugs. NO NEW FEATURE ACCEPTED! Use the [Matrix Room](https://matrix.to/#/#Morpheus:matrix.ffslfl.net) for supporting issues.
+
+<!--- Provide a general summary of the issue in the Title above -->
+
+## Expected Behavior
+Icons size look _normal_
+<!--- Tell us what should happen -->
+
+## Current Behavior
+They are a lot smaller
+<!--- Tell us what happens instead of the expected behavior -->
+
+## Possible Solution
+use highDPI Flag
+<!--- Not obligatory, but suggest a fix/reason for the bug, -->
+
+## Steps to Reproduce
+<!--- Provide a link to a live example, or an unambiguous set of steps to -->
+<!--- reproduce this bug. Include code to reproduce, if relevant -->
+1. Buy a 1440p res screen in 1080p size
+2. Open Morpheus
+3. Look at the icons
+
+## Context (Environment)
+A 1440p monitor. (Lenovo 900s)
+<!--- How has this issue affected you? What are you trying to accomplish? -->
+<!--- Providing context helps us come up with a solution that is most useful in the real world -->
+
+<!--- Provide a general summary of the issue in the Title above -->
+
+## Detailed Description
+<!--- Provide a detailed description of the change or addition you are proposing -->
+
+## Possible Implementation
+<!--- Not obligatory, but suggest an idea for implementing addition or change -->
+
+
+## Comments
+
+### @MTRNord — 2017-12-08T10:13:08Z
+
+
+
+
diff --git a/issues/5.json b/issues/5.json
@@ -0,0 +1,26 @@
+{
+ "number": 5,
+ "title": "Design?",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-08-22T17:39:35Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "help wanted"
+ ],
+ "assignees": [],
+ "body": "Tracking issue about designing the App\r\n\r\n### TODO:\r\n- [ ] Mockup design Idea\r\n - [x] Theme Idea? \r\n - Google Chrome like(?)\r\n - [ ] Coloring?\r\n - [ ] Font?\r\n - [x] Icons?\r\n - [ ] Pages?\r\n - [ ] Settings\r\n - [ ] Rooms\r\n - [ ] Directory\r\n - [ ] Login\r\n - [ ] Room Settings\r\n - [x] Logo?",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-08-22T19:11:02Z",
+ "body": "Possible Direction Ideas:\r\n- Google Chromish\r\n- https://uimovement.com/ui/3772/profile-page/ (very nheko like)\r\n- Glassy like ( https://uimovement.com/ui/642/sign-up-and-login/ ?)"
+ },
+ {
+ "author": "MTRNord",
+ "created_at": "2017-08-22T19:26:10Z",
+ "body": "Link List of QT Tipps in terms of Design:\r\n- Rounded Corners: https://stackoverflow.com/questions/25480788/qt-creating-smooth-rounded-corners-of-a-widget\r\n- Animations: http://doc.qt.io/qt-4.8/animation-overview.html (Just little ones maybe)\r\n- Custom Window (Frameless Window): https://stackoverflow.com/questions/19716227/qt-working-windows-8-style-frameless-custom-window"
+ }
+ ]
+}
diff --git a/issues/5.md b/issues/5.md
@@ -0,0 +1,43 @@
+# #5 Design?
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-08-22T17:39:35Z
+- **Labels:** enhancement, help wanted
+
+---
+
+Tracking issue about designing the App
+
+### TODO:
+- [ ] Mockup design Idea
+ - [x] Theme Idea?
+ - Google Chrome like(?)
+ - [ ] Coloring?
+ - [ ] Font?
+ - [x] Icons?
+ - [ ] Pages?
+ - [ ] Settings
+ - [ ] Rooms
+ - [ ] Directory
+ - [ ] Login
+ - [ ] Room Settings
+ - [x] Logo?
+
+
+## Comments
+
+### @MTRNord — 2017-08-22T19:11:02Z
+
+Possible Direction Ideas:
+- Google Chromish
+- https://uimovement.com/ui/3772/profile-page/ (very nheko like)
+- Glassy like ( https://uimovement.com/ui/642/sign-up-and-login/ ?)
+
+### @MTRNord — 2017-08-22T19:26:10Z
+
+Link List of QT Tipps in terms of Design:
+- Rounded Corners: https://stackoverflow.com/questions/25480788/qt-creating-smooth-rounded-corners-of-a-widget
+- Animations: http://doc.qt.io/qt-4.8/animation-overview.html (Just little ones maybe)
+- Custom Window (Frameless Window): https://stackoverflow.com/questions/19716227/qt-working-windows-8-style-frameless-custom-window
+
diff --git a/issues/50.json b/issues/50.json
@@ -0,0 +1,23 @@
+{
+ "number": 50,
+ "title": "Start vendoring",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-12-20T17:47:36Z",
+ "closed_at": "2018-02-24T08:58:24Z",
+ "labels": [
+ "bug",
+ "enhancement"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2018-02-24T08:58:24Z",
+ "body": "develop has dep vendoring"
+ }
+ ]
+}
diff --git a/issues/50.md b/issues/50.md
@@ -0,0 +1,20 @@
+# #50 Start vendoring
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-12-20T17:47:36Z
+- **Closed:** 2018-02-24T08:58:24Z
+- **Labels:** bug, enhancement
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
+
+## Comments
+
+### @MTRNord — 2018-02-24T08:58:24Z
+
+develop has dep vendoring
+
diff --git a/issues/51.json b/issues/51.json
@@ -0,0 +1,17 @@
+{
+ "number": 51,
+ "title": "We REALLY need a settings page ^^ ",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-12-21T16:29:21Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "to do",
+ "good first issue",
+ "Important"
+ ],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/51.md b/issues/51.md
@@ -0,0 +1,11 @@
+# #51 We REALLY need a settings page ^^
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-12-21T16:29:21Z
+- **Labels:** enhancement, to do, good first issue, Important
+
+---
+
+_No description._
+
diff --git a/issues/56.json b/issues/56.json
@@ -0,0 +1,23 @@
+{
+ "number": 56,
+ "title": "Overall Message Performance is extremly bad",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-12-22T11:05:54Z",
+ "closed_at": null,
+ "labels": [
+ "bug",
+ "help wanted",
+ "Important",
+ "Upstream"
+ ],
+ "assignees": [],
+ "body": "The Client crashes after a certian amount of message loading. And Propably the same would happen with the RoomList too. \r\n\r\nSolving Ideas I have or I think their are:\r\n- Only add thoose widgets that are actually shown and load as needed\r\n- Do it the correct way. (It is my first time QT and I got no idea how to do best practices) <--- Prefered if anyone knows how",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2018-03-10T16:48:50Z",
+ "body": "Upstream Issue: https://github.com/therecipe/qt/issues/567"
+ }
+ ]
+}
diff --git a/issues/56.md b/issues/56.md
@@ -0,0 +1,22 @@
+# #56 Overall Message Performance is extremly bad
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-12-22T11:05:54Z
+- **Labels:** bug, help wanted, Important, Upstream
+
+---
+
+The Client crashes after a certian amount of message loading. And Propably the same would happen with the RoomList too.
+
+Solving Ideas I have or I think their are:
+- Only add thoose widgets that are actually shown and load as needed
+- Do it the correct way. (It is my first time QT and I got no idea how to do best practices) <--- Prefered if anyone knows how
+
+
+## Comments
+
+### @MTRNord — 2018-03-10T16:48:50Z
+
+Upstream Issue: https://github.com/therecipe/qt/issues/567
+
diff --git a/issues/57.json b/issues/57.json
@@ -0,0 +1,12 @@
+{
+ "number": 57,
+ "title": "Rework Avatar generating to use QTs Paint Event instead of golang as golang seems to be quite slow (causes crash)",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-12-23T09:24:51Z",
+ "closed_at": null,
+ "labels": [],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/57.md b/issues/57.md
@@ -0,0 +1,10 @@
+# #57 Rework Avatar generating to use QTs Paint Event instead of golang as golang seems to be quite slow (causes crash)
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-12-23T09:24:51Z
+
+---
+
+_No description._
+
diff --git a/issues/58.json b/issues/58.json
@@ -0,0 +1,21 @@
+{
+ "number": 58,
+ "title": "CI for Linux is broken (again)",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-12-28T23:22:18Z",
+ "closed_at": "2018-01-21T16:17:15Z",
+ "labels": [
+ "Release Blocker",
+ "Upstream"
+ ],
+ "assignees": [],
+ "body": "All Linux Docker Builds are failing. Upstream bug at: https://github.com/therecipe/qt/issues/514",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2018-01-21T16:17:15Z",
+ "body": "Fixed itself now on develop"
+ }
+ ]
+}
diff --git a/issues/58.md b/issues/58.md
@@ -0,0 +1,19 @@
+# #58 CI for Linux is broken (again)
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-12-28T23:22:18Z
+- **Closed:** 2018-01-21T16:17:15Z
+- **Labels:** Release Blocker, Upstream
+
+---
+
+All Linux Docker Builds are failing. Upstream bug at: https://github.com/therecipe/qt/issues/514
+
+
+## Comments
+
+### @MTRNord — 2018-01-21T16:17:15Z
+
+Fixed itself now on develop
+
diff --git a/issues/59.json b/issues/59.json
@@ -0,0 +1,27 @@
+{
+ "number": 59,
+ "title": "Konversation 2.0",
+ "state": "closed",
+ "author": "ShalokShalom",
+ "created_at": "2018-01-12T18:19:30Z",
+ "closed_at": "2018-01-13T01:37:55Z",
+ "labels": [
+ "question"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "You know Konversation 2 is doing quite the same?\r\n\r\nhttps://blogs.kde.org/2017/09/05/konversation-2x-2018-new-user-interface-matrix-support-mobile-version\r\n\r\n",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2018-01-12T23:17:24Z",
+ "body": "Well first of All I never one that existed as a client :) but my Design is a bit different and this Client has a Windows first Focus. So I guess the KDE Client is more Linux first and the Design they have (and the Design goal I have for the future) are different too. My client is way closer to nheko. And yeah of course there are many matrix clients :) this project exists currently for 3 Personal reasons: learn qt, learn how to do \"Real\" applications, learn the Matrix protocol.\n\nOr what exactly do you want to hear as a awnser. Of course matrix has plenty of clients. (because it is open) "
+ },
+ {
+ "author": "ShalokShalom",
+ "created_at": "2018-01-13T01:37:50Z",
+ "body": "Just trying to prevent you from unnecessary effort. :)\r\n\r\nGood luck :D\r\n\r\n"
+ }
+ ]
+}
diff --git a/issues/59.md b/issues/59.md
@@ -0,0 +1,34 @@
+# #59 Konversation 2.0
+
+- **State:** closed
+- **Author:** @ShalokShalom
+- **Created:** 2018-01-12T18:19:30Z
+- **Closed:** 2018-01-13T01:37:55Z
+- **Labels:** question
+- **Assignees:** @MTRNord
+
+---
+
+You know Konversation 2 is doing quite the same?
+
+https://blogs.kde.org/2017/09/05/konversation-2x-2018-new-user-interface-matrix-support-mobile-version
+
+
+
+
+## Comments
+
+### @MTRNord — 2018-01-12T23:17:24Z
+
+Well first of All I never one that existed as a client :) but my Design is a bit different and this Client has a Windows first Focus. So I guess the KDE Client is more Linux first and the Design they have (and the Design goal I have for the future) are different too. My client is way closer to nheko. And yeah of course there are many matrix clients :) this project exists currently for 3 Personal reasons: learn qt, learn how to do "Real" applications, learn the Matrix protocol.
+
+Or what exactly do you want to hear as a awnser. Of course matrix has plenty of clients. (because it is open)
+
+### @ShalokShalom — 2018-01-13T01:37:50Z
+
+Just trying to prevent you from unnecessary effort. :)
+
+Good luck :D
+
+
+
diff --git a/issues/6.json b/issues/6.json
@@ -0,0 +1,28 @@
+{
+ "number": 6,
+ "title": "Show a list with public HS that aren't matrix.org on register",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-08-22T18:41:22Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "in progress"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "Hello-Matrix provides a List with public joinable HS. It would be cool to show these HS on the Register Page to spread Users over Homeservers instead of default to matrix.org.\r\n\r\nCurrent \"API\": https://www.hello-matrix.net/public_servers.php?format=plain&only_public=true",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-08-27T10:56:17Z",
+ "body": "JSON API: https://www.hello-matrix.net/public_servers.php?format=json&only_public=true\r\n"
+ },
+ {
+ "author": "MTRNord",
+ "created_at": "2018-01-25T13:12:16Z",
+ "body": "The current Register and Login Page have a basic support for this"
+ }
+ ]
+}
diff --git a/issues/6.md b/issues/6.md
@@ -0,0 +1,26 @@
+# #6 Show a list with public HS that aren't matrix.org on register
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-08-22T18:41:22Z
+- **Labels:** enhancement, in progress
+- **Assignees:** @MTRNord
+
+---
+
+Hello-Matrix provides a List with public joinable HS. It would be cool to show these HS on the Register Page to spread Users over Homeservers instead of default to matrix.org.
+
+Current "API": https://www.hello-matrix.net/public_servers.php?format=plain&only_public=true
+
+
+## Comments
+
+### @MTRNord — 2017-08-27T10:56:17Z
+
+JSON API: https://www.hello-matrix.net/public_servers.php?format=json&only_public=true
+
+
+### @MTRNord — 2018-01-25T13:12:16Z
+
+The current Register and Login Page have a basic support for this
+
diff --git a/issues/60.json b/issues/60.json
@@ -0,0 +1,15 @@
+{
+ "number": 60,
+ "title": "Recover DB on crash instead throwing and not telling the User",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2018-01-21T15:38:43Z",
+ "closed_at": "2018-03-07T06:38:05Z",
+ "labels": [
+ "bug",
+ "Important"
+ ],
+ "assignees": [],
+ "body": "## Expected Behavior\r\nThe Client either recovers the Cache (mostly by removing the lock) or forces the User to relogin\r\n\r\n## Current Behavior\r\nThe Client crashes and has no Visual output why\r\n\r\n## Possible Solution\r\nRemove the lock file manualy",
+ "comments": []
+}
diff --git a/issues/60.md b/issues/60.md
@@ -0,0 +1,19 @@
+# #60 Recover DB on crash instead throwing and not telling the User
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2018-01-21T15:38:43Z
+- **Closed:** 2018-03-07T06:38:05Z
+- **Labels:** bug, Important
+
+---
+
+## Expected Behavior
+The Client either recovers the Cache (mostly by removing the lock) or forces the User to relogin
+
+## Current Behavior
+The Client crashes and has no Visual output why
+
+## Possible Solution
+Remove the lock file manualy
+
diff --git a/issues/61.json b/issues/61.json
@@ -0,0 +1,14 @@
+{
+ "number": 61,
+ "title": "Update Avatars after adding the widgets from inside a goroutine",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2018-01-21T17:05:15Z",
+ "closed_at": "2018-03-07T06:37:57Z",
+ "labels": [
+ "enhancement"
+ ],
+ "assignees": [],
+ "body": "generating Avatars is sadly slow. Updating them after loading the message should make the start up faster",
+ "comments": []
+}
diff --git a/issues/61.md b/issues/61.md
@@ -0,0 +1,12 @@
+# #61 Update Avatars after adding the widgets from inside a goroutine
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2018-01-21T17:05:15Z
+- **Closed:** 2018-03-07T06:37:57Z
+- **Labels:** enhancement
+
+---
+
+generating Avatars is sadly slow. Updating them after loading the message should make the start up faster
+
diff --git a/issues/62.json b/issues/62.json
@@ -0,0 +1,16 @@
+{
+ "number": 62,
+ "title": "fatal error: concurrent map read and map write",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2018-01-21T17:39:31Z",
+ "closed_at": "2018-03-07T06:37:48Z",
+ "labels": [
+ "bug"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "$ ./Morpheus.exe\r\nlevel=info msg=\"Starting Morpheus\"\r\nlevel=info msg=\"Starting Login Sequenze in background\"\r\nlevel=info msg=\"Start sync\"\r\nfatal error: concurrent map read and map write\r\n\r\ngoroutine 1 [running, locked to thread]:\r\nruntime.throw(0xa6054f, 0x21)\r\n /usr/local/go/src/runtime/panic.go:605 +0x9c fp=0xc04203f698 sp=0xc04203f678 pc=0x42e00c\r\nruntime.mapaccess1_faststr(0x9a4b60, 0xc0422b0ea0, 0xc042012de0, 0x1e, 0x5a15572)\r\n /usr/local/go/src/runtime/hashmap_fast.go:217 +0x441 fp=0xc04203f6f0 sp=0xc04203f698 pc=0x40d1b1\r\ngithub.com/Nordgedanken/Morpheus/ui.(*MainUI).NewUI.func3(0xc042012de0, 0x1e)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:126 +0x6a fp=0xc04203f740 sp=0xc04203f6f0 pc=0x906eba\r\ngithub.com/Nordgedanken/Morpheus/ui.callbackQRoomVBoxLayoutWithTriggerSlot_TriggerRoom(0x6e1a700, 0x5a15572, 0x1e)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/moc.go:850 +0xc0 fp=0xc04203f790 sp=0xc04203f740 pc=0x9007a0\r\ngithub.com/Nordgedanken/Morpheus/ui._cgoexpwrap_cd2fa8037e7e_callbackQRoomVBoxLayoutWithTriggerSlot_TriggerRoom(0x6e1a700, 0x5a15572, 0x1e)\r\n github.com/Nordgedanken/Morpheus/ui/_obj/_cgo_gotypes.go:2090 +0x46 fp=0xc04203f7b8 sp=0xc04203f790 pc=0x8f9306\r\nruntime.call32(0x0, 0x22ebb18, 0x22ebc90, 0x18)\r\n /usr/local/go/src/runtime/asm_amd64.s:509 +0x42 fp=0xc04203f7e8 sp=0xc04203f7b8 pc=0x456f62\r\nruntime.cgocallbackg1(0x0)\r\n /usr/local/go/src/runtime/cgocall.go:305 +0x1aa fp=0xc04203f868 sp=0xc04203f7e8 pc=0x402f6a\r\nruntime.cgocallbackg(0x0)\r\n /usr/local/go/src/runtime/cgocall.go:187 +0x9a fp=0xc04203f8d0 sp=0xc04203f868 pc=0x402d1a\r\nruntime.cgocallback_gofunc(0x402bd2, 0xea6520, 0xc04203f968, 0x8)\r\n /usr/local/go/src/runtime/asm_amd64.s:762 +0xaf fp=0xc04203f8f0 sp=0xc04203f8d0 pc=0x4585bf\r\nruntime.asmcgocall(0xea6520, 0xc04203f968)\r\n /usr/local/go/src/runtime/asm_amd64.s:609 +0x47 fp=0xc04203f8f8 sp=0xc04203f8f0 pc=0x458437\r\nruntime.cgocall(0xea6520, 0xc04203f968, 0x0)\r\n /usr/local/go/src/runtime/cgocall.go:133 +0x102 fp=0xc04203f938 sp=0xc04203f8f8 pc=0x402bd2\r\ngithub.com/Nordgedanken/Morpheus/ui._Cfunc_QRoomVBoxLayoutWithTriggerSlot_EventDefault(0x6e1a700, 0x6f20620, 0x0)\r\n github.com/Nordgedanken/Morpheus/ui/_obj/_cgo_gotypes.go:333 +0x51 fp=0xc04203f968 sp=0xc04203f938 pc=0x8f4ff1\r\ngithub.com/Nordgedanken/Morpheus/ui.(*QRoomVBoxLayoutWithTriggerSlot).EventDefault.func1(0x6e1a700, 0x6f20620, 0x6f20620)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/moc.go:1447 +0xaa fp=0xc04203f9a0 sp=0xc04203f968 pc=0x90ed3a\r\ngithub.com/Nordgedanken/Morpheus/ui.(*QRoomVBoxLayoutWithTriggerSlot).EventDefault(0xc04215e140, 0x1b364a0, 0xc0420040d0, 0x5)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/moc.go:1447 +0x9b fp=0xc04203f9d0 sp=0xc04203f9a0 pc=0x90468b\r\ngithub.com/Nordgedanken/Morpheus/ui.callbackQRoomVBoxLayoutWithTriggerSlot_Event(0x6e1a700, 0x6f20620, 0xc000000008)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/moc.go:1442 +0x158 fp=0xc04203fa38 sp=0xc04203f9d0 pc=0x904598\r\ngithub.com/Nordgedanken/Morpheus/ui._cgoexpwrap_cd2fa8037e7e_callbackQRoomVBoxLayoutWithTriggerSlot_Event(0x6e1a700, 0x6f20620, 0x2cc2e30)\r\n github.com/Nordgedanken/Morpheus/ui/_obj/_cgo_gotypes.go:2384 +0x3c fp=0xc04203fa60 sp=0xc04203fa38 pc=0x8fa3ec\r\nruntime.call32(0x0, 0x22ec038, 0x22ec1b0, 0x18)\r\n /usr/local/go/src/runtime/asm_amd64.s:509 +0x42 fp=0xc04203fa90 sp=0xc04203fa60 pc=0x456f62\r\nruntime.cgocallbackg1(0x0)\r\n /usr/local/go/src/runtime/cgocall.go:305 +0x1aa fp=0xc04203fb10 sp=0xc04203fa90 pc=0x402f6a\r\nruntime.cgocallbackg(0x0)\r\n /usr/local/go/src/runtime/cgocall.go:187 +0x9a fp=0xc04203fb78 sp=0xc04203fb10 pc=0x402d1a\r\nruntime.cgocallback_gofunc(0x402bd2, 0xed8e10, 0xc04203fc10, 0xc04203fc18)\r\n /usr/local/go/src/runtime/asm_amd64.s:762 +0xaf fp=0xc04203fb98 sp=0xc04203fb78 pc=0x4585bf\r\nruntime.asmcgocall(0xed8e10, 0xc04203fc10)\r\n /usr/local/go/src/runtime/asm_amd64.s:609 +0x47 fp=0xc04203fba0 sp=0xc04203fb98 pc=0x458437\r\nruntime.cgocall(0xed8e10, 0xc04203fc10, 0x0)\r\n /usr/local/go/src/runtime/cgocall.go:133 +0x102 fp=0xc04203fbe0 sp=0xc04203fba0 pc=0x402bd2\r\ngithub.com/therecipe/qt/widgets._Cfunc_QApplication_QApplication_Exec(0x25800000000)\r\n github.com/therecipe/qt/widgets/_obj/_cgo_gotypes.go:1408 +0x50 fp=0xc04203fc10 sp=0xc04203fbe0 pc=0x828210\r\ngithub.com/therecipe/qt/widgets.QApplication_Exec(0xc042036060)\r\n /home/user/work/src/github.com/therecipe/qt/widgets/widgets-minimal.go:1389 +0x29 fp=0xc04203fc28 sp=0xc04203fc10 pc=0x8510c9\r\nmain.main()\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/main.go:150 +0xab6 fp=0xc04203ff80 sp=0xc04203fc28 pc=0x913eb6\r\nruntime.main()\r\n /usr/local/go/src/runtime/proc.go:195 +0x222 fp=0xc04203ffe0 sp=0xc04203ff80 pc=0x42f742\r\nruntime.goexit()\r\n /usr/local/go/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc04203ffe8 sp=0xc04203ffe0 pc=0x459891\r\n\r\ngoroutine 19 [chan receive]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/Nordgedanken/dugong.NewFSHook.func1(0xc0420fc420)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/Nordgedanken/dugong/fshook.go:85 +0xb0\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/Nordgedanken/dugong.NewFSHook\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/Nordgedanken/dugong/fshook.go:84 +0x168\r\n\r\ngoroutine 4 [select]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*DB).updateSize(0xc0422d2000, 0xc042002440)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:872 +0x171\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:248 +0xaa3\r\n\r\ngoroutine 146 [select]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).runWorker(0xc04772c000, 0xc042052460)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:187 +0x1e9\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).startCompact\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:172 +0x89\r\n\r\ngoroutine 147 [select]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).runWorker(0xc04772c000, 0xc042052460)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:187 +0x1e9\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).startCompact\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:172 +0x89\r\n\r\ngoroutine 148 [select]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).runWorker(0xc04772c000, 0xc042052460)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:187 +0x1e9\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).startCompact\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:172 +0x89\r\n\r\ngoroutine 149 [chan receive]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*DB).flushMemtable(0xc0422d2000, 0xc042052480, 0x0, 0x0)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:754 +0x101\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:260 +0xc51\r\n\r\ngoroutine 151 [select]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*DB).doWrites(0xc0422d2000, 0xc047728180)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:613 +0x481\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:304 +0x10fd\r\n\r\ngoroutine 152 [chan receive]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*valueLog).waitOnGC(0xc0422d2128, 0xc0477281a0)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/value.go:981 +0x68\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:307 +0x1163\r\n\r\ngoroutine 162 [select]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*DB).updateSize(0xc047870000, 0xc047728be0)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:872 +0x171\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:248 +0xaa3\r\n\r\ngoroutine 128 [IO wait]:\r\ninternal/poll.runtime_pollWait(0x43e6240, 0x72, 0x0)\r\n /usr/local/go/src/runtime/netpoll.go:173 +0x5e\r\ninternal/poll.(*pollDesc).wait(0xc0420985d8, 0x72, 0x1b34500, 0x0, 0x0)\r\n /usr/local/go/src/internal/poll/fd_poll_runtime.go:85 +0xb5\r\ninternal/poll.(*ioSrv).ExecIO(0x204a9e8, 0xc042098498, 0xa707a8, 0x0, 0x3f3, 0xc0420b7005)\r\n /usr/local/go/src/internal/poll/fd_windows.go:205 +0x13a\r\ninternal/poll.(*FD).Read(0xc042098480, 0xc0420b7000, 0x400, 0x400, 0x0, 0x0, 0x0)\r\n /usr/local/go/src/internal/poll/fd_windows.go:458 +0x266\r\nnet.(*netFD).Read(0xc042098480, 0xc0420b7000, 0x400, 0x400, 0xc042150174, 0xc042034e00, 0x22f0000)\r\n /usr/local/go/src/net/fd_windows.go:151 +0x59\r\nnet.(*conn).Read(0xc042004630, 0xc0420b7000, 0x400, 0x400, 0x0, 0x0, 0x0)\r\n /usr/local/go/src/net/net.go:176 +0x74\r\ncrypto/tls.(*block).readFromUntil(0xc042137b00, 0x2379800, 0xc042004630, 0x5, 0xc042004630, 0xc0422b0c90)\r\n /usr/local/go/src/crypto/tls/conn.go:488 +0x9c\r\ncrypto/tls.(*Conn).readRecord(0xc042035180, 0xa70f17, 0xc0420352a0, 0x42fd42)\r\n /usr/local/go/src/crypto/tls/conn.go:590 +0xe7\r\ncrypto/tls.(*Conn).Read(0xc042035180, 0xc042150000, 0x1000, 0x1000, 0x0, 0x0, 0x0)\r\n /usr/local/go/src/crypto/tls/conn.go:1134 +0x117\r\nnet/http.(*persistConn).Read(0xc04209b440, 0xc042150000, 0x1000, 0x1000, 0xc0420128e0, 0xc04204a4d8, 0x453910)\r\n /usr/local/go/src/net/http/transport.go:1391 +0x147\r\nbufio.(*Reader).fill(0xc047736600)\r\n /usr/local/go/src/bufio/bufio.go:97 +0x121\r\nbufio.(*Reader).Peek(0xc047736600, 0x1, 0x0, 0x0, 0x1, 0xc04204a3c0, 0x0)\r\n /usr/local/go/src/bufio/bufio.go:129 +0x41\r\nnet/http.(*persistConn).readLoop(0xc04209b440)\r\n /usr/local/go/src/net/http/transport.go:1539 +0x18c\r\ncreated by net/http.(*Transport).dialConn\r\n /usr/local/go/src/net/http/transport.go:1186 +0xa35\r\n\r\ngoroutine 129 [select]:\r\nnet/http.(*persistConn).writeLoop(0xc04209b440)\r\n /usr/local/go/src/net/http/transport.go:1759 +0x16c\r\ncreated by net/http.(*Transport).dialConn\r\n /usr/local/go/src/net/http/transport.go:1187 +0xa5a\r\n\r\ngoroutine 145 [IO wait]:\r\ninternal/poll.runtime_pollWait(0x43e6180, 0x72, 0x0)\r\n /usr/local/go/src/runtime/netpoll.go:173 +0x5e\r\ninternal/poll.(*pollDesc).wait(0xc042098a58, 0x72, 0x1b34500, 0x0, 0x0)\r\n /usr/local/go/src/internal/poll/fd_poll_runtime.go:85 +0xb5\r\ninternal/poll.(*ioSrv).ExecIO(0x204a9e8, 0xc042098918, 0xa707a8, 0x0, 0xff3, 0xc04cc14005)\r\n /usr/local/go/src/internal/poll/fd_windows.go:205 +0x13a\r\ninternal/poll.(*FD).Read(0xc042098900, 0xc04cc14000, 0x1000, 0x1000, 0x0, 0x0, 0x0)\r\n /usr/local/go/src/internal/poll/fd_windows.go:458 +0x266\r\nnet.(*netFD).Read(0xc042098900, 0xc04cc14000, 0x1000, 0x1000, 0xc04cc10174, 0xc042044000, 0x22f0000)\r\n /usr/local/go/src/net/fd_windows.go:151 +0x59\r\nnet.(*conn).Read(0xc0420761f0, 0xc04cc14000, 0x1000, 0x1000, 0x0, 0x0, 0x0)\r\n /usr/local/go/src/net/net.go:176 +0x74\r\ncrypto/tls.(*block).readFromUntil(0xc0422b0780, 0x2379800, 0xc0420761f0, 0x5, 0xc0420761f0, 0xc042160840)\r\n /usr/local/go/src/crypto/tls/conn.go:488 +0x9c\r\ncrypto/tls.(*Conn).readRecord(0xc04773a700, 0xa70f17, 0xc04773a820, 0x42fd42)\r\n /usr/local/go/src/crypto/tls/conn.go:590 +0xe7\r\ncrypto/tls.(*Conn).Read(0xc04773a700, 0xc04cc10000, 0x1000, 0x1000, 0x0, 0x0, 0x0)\r\n /usr/local/go/src/crypto/tls/conn.go:1134 +0x117\r\nnet/http.(*persistConn).Read(0xc042192360, 0xc04cc10000, 0x1000, 0x1000, 0xc0420125e0, 0xc0422981d8, 0x453910)\r\n /usr/local/go/src/net/http/transport.go:1391 +0x147\r\nbufio.(*Reader).fill(0xc0477365a0)\r\n /usr/local/go/src/bufio/bufio.go:97 +0x121\r\nbufio.(*Reader).Peek(0xc0477365a0, 0x1, 0x0, 0x0, 0x1, 0xc0422980c0, 0x0)\r\n /usr/local/go/src/bufio/bufio.go:129 +0x41\r\nnet/http.(*persistConn).readLoop(0xc042192360)\r\n /usr/local/go/src/net/http/transport.go:1539 +0x18c\r\ncreated by net/http.(*Transport).dialConn\r\n /usr/local/go/src/net/http/transport.go:1186 +0xa35\r\n\r\ngoroutine 163 [select]:\r\nnet/http.(*persistConn).roundTrip(0xc04209b440, 0xc0421603c0, 0x0, 0x0, 0x0)\r\n /usr/local/go/src/net/http/transport.go:1970 +0x60f\r\nnet/http.(*Transport).RoundTrip(0x1b87180, 0xc042106100, 0x1b87180, 0x0, 0x0)\r\n /usr/local/go/src/net/http/transport.go:413 +0x999\r\nnet/http.send(0xc042106100, 0x1b36e60, 0x1b87180, 0x0, 0x0, 0x0, 0xc042004068, 0x20, 0xc04cbadb30, 0x1)\r\n /usr/local/go/src/net/http/client.go:249 +0x1b0\r\nnet/http.(*Client).send(0x204c8a0, 0xc042106100, 0x0, 0x0, 0x0, 0xc042004068, 0x0, 0x1, 0x2335f50)\r\n /usr/local/go/src/net/http/client.go:173 +0x104\r\nnet/http.(*Client).Do(0x204c8a0, 0xc042106100, 0xc, 0xa56ef9, 0x10)\r\n /usr/local/go/src/net/http/client.go:602 +0x294\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/matrix-org/gomatrix.(*Client).MakeRequest(0xc0422c2100, 0xa4f2de, 0x4, 0xc04cbf0000, 0x17c, 0x9ab100, 0xc0420e8e80, 0x94e0c0, 0xc042004038, 0x0, ...)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/matrix-org/gomatrix/client.go:204 +0x218\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/matrix-org/gomatrix.(*Client).CreateFilter(0xc0422c2100, 0xc04204a240, 0x5c, 0x60, 0x5c, 0x60, 0x76c49d)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/matrix-org/gomatrix/client.go:248 +0x16b\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/matrix-org/gomatrix.(*Client).Sync(0xc0422c2100, 0x1, 0x1)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/matrix-org/gomatrix/client.go:123 +0x344\r\ngithub.com/Nordgedanken/Morpheus/ui.(*MainUI).startSync.func2(0xc0422b20c0, 0xc04204ce90)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:369 +0x84\r\ncreated by github.com/Nordgedanken/Morpheus/ui.(*MainUI).startSync\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:366 +0x56e\r\n\r\ngoroutine 141 [chan receive]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*valueLog).waitOnGC(0xc047870128, 0xc04215e020)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/value.go:981 +0x68\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:307 +0x1163\r\n\r\ngoroutine 242 [select]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).runWorker(0xc04772c070, 0xc04cbb2220)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:187 +0x1e9\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).startCompact\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:172 +0x89\r\n\r\ngoroutine 243 [select]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).runWorker(0xc04772c070, 0xc04cbb2220)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:187 +0x1e9\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).startCompact\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:172 +0x89\r\n\r\ngoroutine 244 [select]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).runWorker(0xc04772c070, 0xc04cbb2220)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:187 +0x1e9\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).startCompact\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:172 +0x89\r\n\r\ngoroutine 245 [chan receive]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*DB).flushMemtable(0xc047870000, 0xc04cbb2240, 0x0, 0x0)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:754 +0x101\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:260 +0xc51\r\n\r\ngoroutine 140 [select]:\r\ngithub.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*DB).doWrites(0xc047870000, 0xc04215e000)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:613 +0x481\r\ncreated by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:304 +0x10fd\r\n\r\ngoroutine 143 [runnable]:\r\ngithub.com/Nordgedanken/Morpheus/ui.(*QRoomVBoxLayoutWithTriggerSlot).TriggerRoom.func2(0x6e1a700, 0x6e197d0, 0x24)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/moc.go:886 +0x8a\r\ngithub.com/Nordgedanken/Morpheus/ui.(*QRoomVBoxLayoutWithTriggerSlot).TriggerRoom(0xc04215e140, 0xc04200e870, 0x24)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/moc.go:887 +0x88\r\ngithub.com/Nordgedanken/Morpheus/ui.(*MainUI).initRoomList(0xc0422b20c0, 0xc04215e140, 0xc04204d320, 0xc0, 0xc0)\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:391 +0x162\r\ncreated by github.com/Nordgedanken/Morpheus/ui.(*MainUI).NewUI\r\n /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:135 +0x440\r\n\r\ngoroutine 258 [select]:\r\nnet/http.(*persistConn).writeLoop(0xc042192360)\r\n /usr/local/go/src/net/http/transport.go:1759 +0x16c\r\ncreated by net/http.(*Transport).dialConn\r\n /usr/local/go/src/net/http/transport.go:1187 +0xa5a\r\nfatal error: exitsyscall: syscall frame is no longer valid\r\npanic during panic\r\n\r\nruntime stack:\r\nruntime.startpanic_m()\r\n /usr/local/go/src/runtime/panic.go:671 +0x1a8\r\nruntime.systemstack(0xa70ed0)\r\n /usr/local/go/src/runtime/asm_amd64.s:360 +0xb5\r\nruntime.startpanic()\r\n /usr/local/go/src/runtime/panic.go:578 +0x1e\r\nruntime.throw(0xa64f1a, 0x2d)\r\n /usr/local/go/src/runtime/panic.go:604 +0x8f\r\nruntime.exitsyscall.func1()\r\n /usr/local/go/src/runtime/proc.go:2634 +0x3d\r\nruntime.systemstack(0x22ebac8)\r\n /usr/local/go/src/runtime/asm_amd64.s:344 +0x7e\r\nruntime.mstart()\r\n /usr/local/go/src/runtime/proc.go:1135\r\nfatal error: unexpected signal during runtime execution\r\nstack trace unavailable\r\n",
+ "comments": []
+}
diff --git a/issues/62.md b/issues/62.md
@@ -0,0 +1,288 @@
+# #62 fatal error: concurrent map read and map write
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2018-01-21T17:39:31Z
+- **Closed:** 2018-03-07T06:37:48Z
+- **Labels:** bug
+- **Assignees:** @MTRNord
+
+---
+
+$ ./Morpheus.exe
+level=info msg="Starting Morpheus"
+level=info msg="Starting Login Sequenze in background"
+level=info msg="Start sync"
+fatal error: concurrent map read and map write
+
+goroutine 1 [running, locked to thread]:
+runtime.throw(0xa6054f, 0x21)
+ /usr/local/go/src/runtime/panic.go:605 +0x9c fp=0xc04203f698 sp=0xc04203f678 pc=0x42e00c
+runtime.mapaccess1_faststr(0x9a4b60, 0xc0422b0ea0, 0xc042012de0, 0x1e, 0x5a15572)
+ /usr/local/go/src/runtime/hashmap_fast.go:217 +0x441 fp=0xc04203f6f0 sp=0xc04203f698 pc=0x40d1b1
+github.com/Nordgedanken/Morpheus/ui.(*MainUI).NewUI.func3(0xc042012de0, 0x1e)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:126 +0x6a fp=0xc04203f740 sp=0xc04203f6f0 pc=0x906eba
+github.com/Nordgedanken/Morpheus/ui.callbackQRoomVBoxLayoutWithTriggerSlot_TriggerRoom(0x6e1a700, 0x5a15572, 0x1e)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/moc.go:850 +0xc0 fp=0xc04203f790 sp=0xc04203f740 pc=0x9007a0
+github.com/Nordgedanken/Morpheus/ui._cgoexpwrap_cd2fa8037e7e_callbackQRoomVBoxLayoutWithTriggerSlot_TriggerRoom(0x6e1a700, 0x5a15572, 0x1e)
+ github.com/Nordgedanken/Morpheus/ui/_obj/_cgo_gotypes.go:2090 +0x46 fp=0xc04203f7b8 sp=0xc04203f790 pc=0x8f9306
+runtime.call32(0x0, 0x22ebb18, 0x22ebc90, 0x18)
+ /usr/local/go/src/runtime/asm_amd64.s:509 +0x42 fp=0xc04203f7e8 sp=0xc04203f7b8 pc=0x456f62
+runtime.cgocallbackg1(0x0)
+ /usr/local/go/src/runtime/cgocall.go:305 +0x1aa fp=0xc04203f868 sp=0xc04203f7e8 pc=0x402f6a
+runtime.cgocallbackg(0x0)
+ /usr/local/go/src/runtime/cgocall.go:187 +0x9a fp=0xc04203f8d0 sp=0xc04203f868 pc=0x402d1a
+runtime.cgocallback_gofunc(0x402bd2, 0xea6520, 0xc04203f968, 0x8)
+ /usr/local/go/src/runtime/asm_amd64.s:762 +0xaf fp=0xc04203f8f0 sp=0xc04203f8d0 pc=0x4585bf
+runtime.asmcgocall(0xea6520, 0xc04203f968)
+ /usr/local/go/src/runtime/asm_amd64.s:609 +0x47 fp=0xc04203f8f8 sp=0xc04203f8f0 pc=0x458437
+runtime.cgocall(0xea6520, 0xc04203f968, 0x0)
+ /usr/local/go/src/runtime/cgocall.go:133 +0x102 fp=0xc04203f938 sp=0xc04203f8f8 pc=0x402bd2
+github.com/Nordgedanken/Morpheus/ui._Cfunc_QRoomVBoxLayoutWithTriggerSlot_EventDefault(0x6e1a700, 0x6f20620, 0x0)
+ github.com/Nordgedanken/Morpheus/ui/_obj/_cgo_gotypes.go:333 +0x51 fp=0xc04203f968 sp=0xc04203f938 pc=0x8f4ff1
+github.com/Nordgedanken/Morpheus/ui.(*QRoomVBoxLayoutWithTriggerSlot).EventDefault.func1(0x6e1a700, 0x6f20620, 0x6f20620)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/moc.go:1447 +0xaa fp=0xc04203f9a0 sp=0xc04203f968 pc=0x90ed3a
+github.com/Nordgedanken/Morpheus/ui.(*QRoomVBoxLayoutWithTriggerSlot).EventDefault(0xc04215e140, 0x1b364a0, 0xc0420040d0, 0x5)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/moc.go:1447 +0x9b fp=0xc04203f9d0 sp=0xc04203f9a0 pc=0x90468b
+github.com/Nordgedanken/Morpheus/ui.callbackQRoomVBoxLayoutWithTriggerSlot_Event(0x6e1a700, 0x6f20620, 0xc000000008)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/moc.go:1442 +0x158 fp=0xc04203fa38 sp=0xc04203f9d0 pc=0x904598
+github.com/Nordgedanken/Morpheus/ui._cgoexpwrap_cd2fa8037e7e_callbackQRoomVBoxLayoutWithTriggerSlot_Event(0x6e1a700, 0x6f20620, 0x2cc2e30)
+ github.com/Nordgedanken/Morpheus/ui/_obj/_cgo_gotypes.go:2384 +0x3c fp=0xc04203fa60 sp=0xc04203fa38 pc=0x8fa3ec
+runtime.call32(0x0, 0x22ec038, 0x22ec1b0, 0x18)
+ /usr/local/go/src/runtime/asm_amd64.s:509 +0x42 fp=0xc04203fa90 sp=0xc04203fa60 pc=0x456f62
+runtime.cgocallbackg1(0x0)
+ /usr/local/go/src/runtime/cgocall.go:305 +0x1aa fp=0xc04203fb10 sp=0xc04203fa90 pc=0x402f6a
+runtime.cgocallbackg(0x0)
+ /usr/local/go/src/runtime/cgocall.go:187 +0x9a fp=0xc04203fb78 sp=0xc04203fb10 pc=0x402d1a
+runtime.cgocallback_gofunc(0x402bd2, 0xed8e10, 0xc04203fc10, 0xc04203fc18)
+ /usr/local/go/src/runtime/asm_amd64.s:762 +0xaf fp=0xc04203fb98 sp=0xc04203fb78 pc=0x4585bf
+runtime.asmcgocall(0xed8e10, 0xc04203fc10)
+ /usr/local/go/src/runtime/asm_amd64.s:609 +0x47 fp=0xc04203fba0 sp=0xc04203fb98 pc=0x458437
+runtime.cgocall(0xed8e10, 0xc04203fc10, 0x0)
+ /usr/local/go/src/runtime/cgocall.go:133 +0x102 fp=0xc04203fbe0 sp=0xc04203fba0 pc=0x402bd2
+github.com/therecipe/qt/widgets._Cfunc_QApplication_QApplication_Exec(0x25800000000)
+ github.com/therecipe/qt/widgets/_obj/_cgo_gotypes.go:1408 +0x50 fp=0xc04203fc10 sp=0xc04203fbe0 pc=0x828210
+github.com/therecipe/qt/widgets.QApplication_Exec(0xc042036060)
+ /home/user/work/src/github.com/therecipe/qt/widgets/widgets-minimal.go:1389 +0x29 fp=0xc04203fc28 sp=0xc04203fc10 pc=0x8510c9
+main.main()
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/main.go:150 +0xab6 fp=0xc04203ff80 sp=0xc04203fc28 pc=0x913eb6
+runtime.main()
+ /usr/local/go/src/runtime/proc.go:195 +0x222 fp=0xc04203ffe0 sp=0xc04203ff80 pc=0x42f742
+runtime.goexit()
+ /usr/local/go/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc04203ffe8 sp=0xc04203ffe0 pc=0x459891
+
+goroutine 19 [chan receive]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/Nordgedanken/dugong.NewFSHook.func1(0xc0420fc420)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/Nordgedanken/dugong/fshook.go:85 +0xb0
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/Nordgedanken/dugong.NewFSHook
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/Nordgedanken/dugong/fshook.go:84 +0x168
+
+goroutine 4 [select]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*DB).updateSize(0xc0422d2000, 0xc042002440)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:872 +0x171
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:248 +0xaa3
+
+goroutine 146 [select]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).runWorker(0xc04772c000, 0xc042052460)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:187 +0x1e9
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).startCompact
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:172 +0x89
+
+goroutine 147 [select]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).runWorker(0xc04772c000, 0xc042052460)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:187 +0x1e9
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).startCompact
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:172 +0x89
+
+goroutine 148 [select]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).runWorker(0xc04772c000, 0xc042052460)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:187 +0x1e9
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).startCompact
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:172 +0x89
+
+goroutine 149 [chan receive]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*DB).flushMemtable(0xc0422d2000, 0xc042052480, 0x0, 0x0)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:754 +0x101
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:260 +0xc51
+
+goroutine 151 [select]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*DB).doWrites(0xc0422d2000, 0xc047728180)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:613 +0x481
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:304 +0x10fd
+
+goroutine 152 [chan receive]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*valueLog).waitOnGC(0xc0422d2128, 0xc0477281a0)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/value.go:981 +0x68
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:307 +0x1163
+
+goroutine 162 [select]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*DB).updateSize(0xc047870000, 0xc047728be0)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:872 +0x171
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:248 +0xaa3
+
+goroutine 128 [IO wait]:
+internal/poll.runtime_pollWait(0x43e6240, 0x72, 0x0)
+ /usr/local/go/src/runtime/netpoll.go:173 +0x5e
+internal/poll.(*pollDesc).wait(0xc0420985d8, 0x72, 0x1b34500, 0x0, 0x0)
+ /usr/local/go/src/internal/poll/fd_poll_runtime.go:85 +0xb5
+internal/poll.(*ioSrv).ExecIO(0x204a9e8, 0xc042098498, 0xa707a8, 0x0, 0x3f3, 0xc0420b7005)
+ /usr/local/go/src/internal/poll/fd_windows.go:205 +0x13a
+internal/poll.(*FD).Read(0xc042098480, 0xc0420b7000, 0x400, 0x400, 0x0, 0x0, 0x0)
+ /usr/local/go/src/internal/poll/fd_windows.go:458 +0x266
+net.(*netFD).Read(0xc042098480, 0xc0420b7000, 0x400, 0x400, 0xc042150174, 0xc042034e00, 0x22f0000)
+ /usr/local/go/src/net/fd_windows.go:151 +0x59
+net.(*conn).Read(0xc042004630, 0xc0420b7000, 0x400, 0x400, 0x0, 0x0, 0x0)
+ /usr/local/go/src/net/net.go:176 +0x74
+crypto/tls.(*block).readFromUntil(0xc042137b00, 0x2379800, 0xc042004630, 0x5, 0xc042004630, 0xc0422b0c90)
+ /usr/local/go/src/crypto/tls/conn.go:488 +0x9c
+crypto/tls.(*Conn).readRecord(0xc042035180, 0xa70f17, 0xc0420352a0, 0x42fd42)
+ /usr/local/go/src/crypto/tls/conn.go:590 +0xe7
+crypto/tls.(*Conn).Read(0xc042035180, 0xc042150000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
+ /usr/local/go/src/crypto/tls/conn.go:1134 +0x117
+net/http.(*persistConn).Read(0xc04209b440, 0xc042150000, 0x1000, 0x1000, 0xc0420128e0, 0xc04204a4d8, 0x453910)
+ /usr/local/go/src/net/http/transport.go:1391 +0x147
+bufio.(*Reader).fill(0xc047736600)
+ /usr/local/go/src/bufio/bufio.go:97 +0x121
+bufio.(*Reader).Peek(0xc047736600, 0x1, 0x0, 0x0, 0x1, 0xc04204a3c0, 0x0)
+ /usr/local/go/src/bufio/bufio.go:129 +0x41
+net/http.(*persistConn).readLoop(0xc04209b440)
+ /usr/local/go/src/net/http/transport.go:1539 +0x18c
+created by net/http.(*Transport).dialConn
+ /usr/local/go/src/net/http/transport.go:1186 +0xa35
+
+goroutine 129 [select]:
+net/http.(*persistConn).writeLoop(0xc04209b440)
+ /usr/local/go/src/net/http/transport.go:1759 +0x16c
+created by net/http.(*Transport).dialConn
+ /usr/local/go/src/net/http/transport.go:1187 +0xa5a
+
+goroutine 145 [IO wait]:
+internal/poll.runtime_pollWait(0x43e6180, 0x72, 0x0)
+ /usr/local/go/src/runtime/netpoll.go:173 +0x5e
+internal/poll.(*pollDesc).wait(0xc042098a58, 0x72, 0x1b34500, 0x0, 0x0)
+ /usr/local/go/src/internal/poll/fd_poll_runtime.go:85 +0xb5
+internal/poll.(*ioSrv).ExecIO(0x204a9e8, 0xc042098918, 0xa707a8, 0x0, 0xff3, 0xc04cc14005)
+ /usr/local/go/src/internal/poll/fd_windows.go:205 +0x13a
+internal/poll.(*FD).Read(0xc042098900, 0xc04cc14000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
+ /usr/local/go/src/internal/poll/fd_windows.go:458 +0x266
+net.(*netFD).Read(0xc042098900, 0xc04cc14000, 0x1000, 0x1000, 0xc04cc10174, 0xc042044000, 0x22f0000)
+ /usr/local/go/src/net/fd_windows.go:151 +0x59
+net.(*conn).Read(0xc0420761f0, 0xc04cc14000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
+ /usr/local/go/src/net/net.go:176 +0x74
+crypto/tls.(*block).readFromUntil(0xc0422b0780, 0x2379800, 0xc0420761f0, 0x5, 0xc0420761f0, 0xc042160840)
+ /usr/local/go/src/crypto/tls/conn.go:488 +0x9c
+crypto/tls.(*Conn).readRecord(0xc04773a700, 0xa70f17, 0xc04773a820, 0x42fd42)
+ /usr/local/go/src/crypto/tls/conn.go:590 +0xe7
+crypto/tls.(*Conn).Read(0xc04773a700, 0xc04cc10000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
+ /usr/local/go/src/crypto/tls/conn.go:1134 +0x117
+net/http.(*persistConn).Read(0xc042192360, 0xc04cc10000, 0x1000, 0x1000, 0xc0420125e0, 0xc0422981d8, 0x453910)
+ /usr/local/go/src/net/http/transport.go:1391 +0x147
+bufio.(*Reader).fill(0xc0477365a0)
+ /usr/local/go/src/bufio/bufio.go:97 +0x121
+bufio.(*Reader).Peek(0xc0477365a0, 0x1, 0x0, 0x0, 0x1, 0xc0422980c0, 0x0)
+ /usr/local/go/src/bufio/bufio.go:129 +0x41
+net/http.(*persistConn).readLoop(0xc042192360)
+ /usr/local/go/src/net/http/transport.go:1539 +0x18c
+created by net/http.(*Transport).dialConn
+ /usr/local/go/src/net/http/transport.go:1186 +0xa35
+
+goroutine 163 [select]:
+net/http.(*persistConn).roundTrip(0xc04209b440, 0xc0421603c0, 0x0, 0x0, 0x0)
+ /usr/local/go/src/net/http/transport.go:1970 +0x60f
+net/http.(*Transport).RoundTrip(0x1b87180, 0xc042106100, 0x1b87180, 0x0, 0x0)
+ /usr/local/go/src/net/http/transport.go:413 +0x999
+net/http.send(0xc042106100, 0x1b36e60, 0x1b87180, 0x0, 0x0, 0x0, 0xc042004068, 0x20, 0xc04cbadb30, 0x1)
+ /usr/local/go/src/net/http/client.go:249 +0x1b0
+net/http.(*Client).send(0x204c8a0, 0xc042106100, 0x0, 0x0, 0x0, 0xc042004068, 0x0, 0x1, 0x2335f50)
+ /usr/local/go/src/net/http/client.go:173 +0x104
+net/http.(*Client).Do(0x204c8a0, 0xc042106100, 0xc, 0xa56ef9, 0x10)
+ /usr/local/go/src/net/http/client.go:602 +0x294
+github.com/Nordgedanken/Morpheus/vendor/github.com/matrix-org/gomatrix.(*Client).MakeRequest(0xc0422c2100, 0xa4f2de, 0x4, 0xc04cbf0000, 0x17c, 0x9ab100, 0xc0420e8e80, 0x94e0c0, 0xc042004038, 0x0, ...)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/matrix-org/gomatrix/client.go:204 +0x218
+github.com/Nordgedanken/Morpheus/vendor/github.com/matrix-org/gomatrix.(*Client).CreateFilter(0xc0422c2100, 0xc04204a240, 0x5c, 0x60, 0x5c, 0x60, 0x76c49d)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/matrix-org/gomatrix/client.go:248 +0x16b
+github.com/Nordgedanken/Morpheus/vendor/github.com/matrix-org/gomatrix.(*Client).Sync(0xc0422c2100, 0x1, 0x1)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/matrix-org/gomatrix/client.go:123 +0x344
+github.com/Nordgedanken/Morpheus/ui.(*MainUI).startSync.func2(0xc0422b20c0, 0xc04204ce90)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:369 +0x84
+created by github.com/Nordgedanken/Morpheus/ui.(*MainUI).startSync
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:366 +0x56e
+
+goroutine 141 [chan receive]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*valueLog).waitOnGC(0xc047870128, 0xc04215e020)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/value.go:981 +0x68
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:307 +0x1163
+
+goroutine 242 [select]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).runWorker(0xc04772c070, 0xc04cbb2220)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:187 +0x1e9
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).startCompact
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:172 +0x89
+
+goroutine 243 [select]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).runWorker(0xc04772c070, 0xc04cbb2220)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:187 +0x1e9
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).startCompact
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:172 +0x89
+
+goroutine 244 [select]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).runWorker(0xc04772c070, 0xc04cbb2220)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:187 +0x1e9
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*levelsController).startCompact
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/levels.go:172 +0x89
+
+goroutine 245 [chan receive]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*DB).flushMemtable(0xc047870000, 0xc04cbb2240, 0x0, 0x0)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:754 +0x101
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:260 +0xc51
+
+goroutine 140 [select]:
+github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.(*DB).doWrites(0xc047870000, 0xc04215e000)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:613 +0x481
+created by github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger.Open
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/vendor/github.com/dgraph-io/badger/db.go:304 +0x10fd
+
+goroutine 143 [runnable]:
+github.com/Nordgedanken/Morpheus/ui.(*QRoomVBoxLayoutWithTriggerSlot).TriggerRoom.func2(0x6e1a700, 0x6e197d0, 0x24)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/moc.go:886 +0x8a
+github.com/Nordgedanken/Morpheus/ui.(*QRoomVBoxLayoutWithTriggerSlot).TriggerRoom(0xc04215e140, 0xc04200e870, 0x24)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/moc.go:887 +0x88
+github.com/Nordgedanken/Morpheus/ui.(*MainUI).initRoomList(0xc0422b20c0, 0xc04215e140, 0xc04204d320, 0xc0, 0xc0)
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:391 +0x162
+created by github.com/Nordgedanken/Morpheus/ui.(*MainUI).NewUI
+ /home/user/work/src/github.com/Nordgedanken/Morpheus/ui/MainUI.go:135 +0x440
+
+goroutine 258 [select]:
+net/http.(*persistConn).writeLoop(0xc042192360)
+ /usr/local/go/src/net/http/transport.go:1759 +0x16c
+created by net/http.(*Transport).dialConn
+ /usr/local/go/src/net/http/transport.go:1187 +0xa5a
+fatal error: exitsyscall: syscall frame is no longer valid
+panic during panic
+
+runtime stack:
+runtime.startpanic_m()
+ /usr/local/go/src/runtime/panic.go:671 +0x1a8
+runtime.systemstack(0xa70ed0)
+ /usr/local/go/src/runtime/asm_amd64.s:360 +0xb5
+runtime.startpanic()
+ /usr/local/go/src/runtime/panic.go:578 +0x1e
+runtime.throw(0xa64f1a, 0x2d)
+ /usr/local/go/src/runtime/panic.go:604 +0x8f
+runtime.exitsyscall.func1()
+ /usr/local/go/src/runtime/proc.go:2634 +0x3d
+runtime.systemstack(0x22ebac8)
+ /usr/local/go/src/runtime/asm_amd64.s:344 +0x7e
+runtime.mstart()
+ /usr/local/go/src/runtime/proc.go:1135
+fatal error: unexpected signal during runtime execution
+stack trace unavailable
+
+
diff --git a/issues/64.json b/issues/64.json
@@ -0,0 +1,12 @@
+{
+ "number": 64,
+ "title": "Don't crash on wrong password",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2018-01-24T19:14:16Z",
+ "closed_at": null,
+ "labels": [],
+ "assignees": [],
+ "body": "Instead show a error message",
+ "comments": []
+}
diff --git a/issues/64.md b/issues/64.md
@@ -0,0 +1,10 @@
+# #64 Don't crash on wrong password
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2018-01-24T19:14:16Z
+
+---
+
+Instead show a error message
+
diff --git a/issues/65.json b/issues/65.json
@@ -0,0 +1,12 @@
+{
+ "number": 65,
+ "title": "use goroutines for http requests",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2018-01-25T18:52:54Z",
+ "closed_at": null,
+ "labels": [],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/65.md b/issues/65.md
@@ -0,0 +1,10 @@
+# #65 use goroutines for http requests
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2018-01-25T18:52:54Z
+
+---
+
+_No description._
+
diff --git a/issues/67.json b/issues/67.json
@@ -0,0 +1,21 @@
+{
+ "number": 67,
+ "title": "[TRACKING ISSUE] QT refuses to render widgets inside of scrollAreas",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2018-02-20T13:06:20Z",
+ "closed_at": null,
+ "labels": [
+ "bug",
+ "Important"
+ ],
+ "assignees": [],
+ "body": "<!--- Provide a general summary of the issue in the Title above -->\r\nSince the rework of the ScrollArea Initialisation both (room and message View) are empty. SOmetimes the Room Header is missing too or added very late.\r\n\r\n## Expected Behavior\r\nWe should see a room List and the messages of the current Room\r\n\r\n## Current Behavior\r\nBoth Views are empty\r\n\r\n## Possible Solution\r\nPropably I have done something wrong in either adding the widgets to the scrollLayouts or adding the Layout to the ScrollArea\r\n\r\n## Steps to Reproduce\r\nSee the latest CI build\r\n\r\n## Context (Environment)\r\nTested on Windows 10 but propably affects other Systems too.\r\n\r\n\r\n## Comit Explenations\r\nUsed commit is: 0f41edb679e66f7b601f1c22d41c2f41ca226d8b\r\nLatest working commit (which has CI builds, missing avatars are \"intended\" as they are caused by a already fixed problem): 84ed8542ec5323aad6ec59a542e05c558b6582c3\r\nFirst failing commit with CI builds: 9f0d082f56d0a1b50e9d2ba4e702e167120100ba\r\n\r\n## What changed?\r\n1. It doesn't use QT/C Slots anymore but rather uses pure GO Code to add stuff.\r\n2. The Layout isn't the struct anymore but rather the non customized type which is provided by the Binding.\r\n3. Avatar updates got fixed but aren't really tested as I now miss the whole widget :)\r\n4. Some minor optimizations that shouldn't affect this in any way.",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2018-02-23T17:26:25Z",
+ "body": "Debuged and apparently this is caused by a timing issue. as soon as I use the Slots by QT it works fine again. Issue will be kept open to track this further"
+ }
+ ]
+}
diff --git a/issues/67.md b/issues/67.md
@@ -0,0 +1,46 @@
+# #67 [TRACKING ISSUE] QT refuses to render widgets inside of scrollAreas
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2018-02-20T13:06:20Z
+- **Labels:** bug, Important
+
+---
+
+<!--- Provide a general summary of the issue in the Title above -->
+Since the rework of the ScrollArea Initialisation both (room and message View) are empty. SOmetimes the Room Header is missing too or added very late.
+
+## Expected Behavior
+We should see a room List and the messages of the current Room
+
+## Current Behavior
+Both Views are empty
+
+## Possible Solution
+Propably I have done something wrong in either adding the widgets to the scrollLayouts or adding the Layout to the ScrollArea
+
+## Steps to Reproduce
+See the latest CI build
+
+## Context (Environment)
+Tested on Windows 10 but propably affects other Systems too.
+
+
+## Comit Explenations
+Used commit is: 0f41edb679e66f7b601f1c22d41c2f41ca226d8b
+Latest working commit (which has CI builds, missing avatars are "intended" as they are caused by a already fixed problem): 84ed8542ec5323aad6ec59a542e05c558b6582c3
+First failing commit with CI builds: 9f0d082f56d0a1b50e9d2ba4e702e167120100ba
+
+## What changed?
+1. It doesn't use QT/C Slots anymore but rather uses pure GO Code to add stuff.
+2. The Layout isn't the struct anymore but rather the non customized type which is provided by the Binding.
+3. Avatar updates got fixed but aren't really tested as I now miss the whole widget :)
+4. Some minor optimizations that shouldn't affect this in any way.
+
+
+## Comments
+
+### @MTRNord — 2018-02-23T17:26:25Z
+
+Debuged and apparently this is caused by a timing issue. as soon as I use the Slots by QT it works fine again. Issue will be kept open to track this further
+
diff --git a/issues/68.json b/issues/68.json
@@ -0,0 +1,12 @@
+{
+ "number": 68,
+ "title": "large resyncs cause Morpheus to freeze and even to let Windows freeze as well",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2018-02-23T14:06:42Z",
+ "closed_at": null,
+ "labels": [],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/68.md b/issues/68.md
@@ -0,0 +1,10 @@
+# #68 large resyncs cause Morpheus to freeze and even to let Windows freeze as well
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2018-02-23T14:06:42Z
+
+---
+
+_No description._
+
diff --git a/issues/69.json b/issues/69.json
@@ -0,0 +1,28 @@
+{
+ "number": 69,
+ "title": "Syncer and cacheloading broke on develop",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2018-02-24T08:54:03Z",
+ "closed_at": "2018-03-05T20:23:39Z",
+ "labels": [
+ "bug",
+ "Important"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2018-03-05T19:47:02Z",
+ "body": "Syncer fixed!"
+ },
+ {
+ "author": "MTRNord",
+ "created_at": "2018-03-05T20:23:39Z",
+ "body": "Fixed again :)"
+ }
+ ]
+}
diff --git a/issues/69.md b/issues/69.md
@@ -0,0 +1,24 @@
+# #69 Syncer and cacheloading broke on develop
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2018-02-24T08:54:03Z
+- **Closed:** 2018-03-05T20:23:39Z
+- **Labels:** bug, Important
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
+
+## Comments
+
+### @MTRNord — 2018-03-05T19:47:02Z
+
+Syncer fixed!
+
+### @MTRNord — 2018-03-05T20:23:39Z
+
+Fixed again :)
+
diff --git a/issues/7.json b/issues/7.json
@@ -0,0 +1,31 @@
+{
+ "number": 7,
+ "title": "Scalar Integrations -> Windows has bug with webviews",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-08-23T18:51:44Z",
+ "closed_at": null,
+ "labels": [
+ "bug",
+ "enhancement",
+ "help wanted",
+ "question",
+ "in progress"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "As this qt binding has some issues with webviews either build a scalar like thingy into the desktop app or follow suggestion from https://github.com/therecipe/qt/wiki/FAQ#why-webengine-and-webview-are-not-working-",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2017-08-23T19:23:37Z",
+ "body": "Doc on Integrations/Scalar https://github.com/turt2live/matrix-dimension/blob/master/docs/scalar_client_api.md"
+ },
+ {
+ "author": "MTRNord",
+ "created_at": "2017-12-21T20:46:14Z",
+ "body": "Some thaughts:\r\n- [x] Use this to map qt/go with JS -> http://doc.qt.io/archives/qt-4.8/qtwebkit-bridge.html \r\n- ~Need to modify HTML to add the listener or so. -> http://doc.qt.io/archives/qt-5.5/qwebframe.html#setHtml~\r\n- [ ] Implement Code from https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/ScalarMessaging.js in Golang/qt"
+ }
+ ]
+}
diff --git a/issues/7.md b/issues/7.md
@@ -0,0 +1,26 @@
+# #7 Scalar Integrations -> Windows has bug with webviews
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-08-23T18:51:44Z
+- **Labels:** bug, enhancement, help wanted, question, in progress
+- **Assignees:** @MTRNord
+
+---
+
+As this qt binding has some issues with webviews either build a scalar like thingy into the desktop app or follow suggestion from https://github.com/therecipe/qt/wiki/FAQ#why-webengine-and-webview-are-not-working-
+
+
+## Comments
+
+### @MTRNord — 2017-08-23T19:23:37Z
+
+Doc on Integrations/Scalar https://github.com/turt2live/matrix-dimension/blob/master/docs/scalar_client_api.md
+
+### @MTRNord — 2017-12-21T20:46:14Z
+
+Some thaughts:
+- [x] Use this to map qt/go with JS -> http://doc.qt.io/archives/qt-4.8/qtwebkit-bridge.html
+- ~Need to modify HTML to add the listener or so. -> http://doc.qt.io/archives/qt-5.5/qwebframe.html#setHtml~
+- [ ] Implement Code from https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/ScalarMessaging.js in Golang/qt
+
diff --git a/issues/70.json b/issues/70.json
@@ -0,0 +1,17 @@
+{
+ "number": 70,
+ "title": "Messages dont wrap",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2018-03-05T20:55:22Z",
+ "closed_at": null,
+ "labels": [
+ "bug",
+ "Important"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/70.md b/issues/70.md
@@ -0,0 +1,12 @@
+# #70 Messages dont wrap
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2018-03-05T20:55:22Z
+- **Labels:** bug, Important
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
diff --git a/issues/71.json b/issues/71.json
@@ -0,0 +1,23 @@
+{
+ "number": 71,
+ "title": "room List doesn't get reset on logout",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2018-03-07T05:29:14Z",
+ "closed_at": "2018-03-10T15:37:00Z",
+ "labels": [
+ "bug",
+ "Release Blocker"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": [
+ {
+ "author": "MTRNord",
+ "created_at": "2018-03-10T15:37:00Z",
+ "body": "Fixed on develop"
+ }
+ ]
+}
diff --git a/issues/71.md b/issues/71.md
@@ -0,0 +1,20 @@
+# #71 room List doesn't get reset on logout
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2018-03-07T05:29:14Z
+- **Closed:** 2018-03-10T15:37:00Z
+- **Labels:** bug, Release Blocker
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
+
+## Comments
+
+### @MTRNord — 2018-03-10T15:37:00Z
+
+Fixed on develop
+
diff --git a/issues/72.json b/issues/72.json
@@ -0,0 +1,14 @@
+{
+ "number": 72,
+ "title": "Register on a HS that requires Captcha",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2018-03-12T13:44:36Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement"
+ ],
+ "assignees": [],
+ "body": "Solution written in here: https://github.com/mujx/nheko/issues/264#issuecomment-372182640",
+ "comments": []
+}
diff --git a/issues/72.md b/issues/72.md
@@ -0,0 +1,11 @@
+# #72 Register on a HS that requires Captcha
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2018-03-12T13:44:36Z
+- **Labels:** enhancement
+
+---
+
+Solution written in here: https://github.com/mujx/nheko/issues/264#issuecomment-372182640
+
diff --git a/issues/73.json b/issues/73.json
@@ -0,0 +1,18 @@
+{
+ "number": 73,
+ "title": "Consider adding a Debian package to the upstream repos when releasing 0.1.0",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2018-03-14T19:58:11Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "help wanted",
+ "Important"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/73.md b/issues/73.md
@@ -0,0 +1,12 @@
+# #73 Consider adding a Debian package to the upstream repos when releasing 0.1.0
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2018-03-14T19:58:11Z
+- **Labels:** enhancement, help wanted, Important
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
diff --git a/issues/74.json b/issues/74.json
@@ -0,0 +1,17 @@
+{
+ "number": 74,
+ "title": "Finish Register Page",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2018-03-14T20:00:33Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "Release Blocker"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/74.md b/issues/74.md
@@ -0,0 +1,12 @@
+# #74 Finish Register Page
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2018-03-14T20:00:33Z
+- **Labels:** enhancement, Release Blocker
+- **Assignees:** @MTRNord
+
+---
+
+_No description._
+
diff --git a/issues/75.json b/issues/75.json
@@ -0,0 +1,15 @@
+{
+ "number": 75,
+ "title": "Do snaps on CircleCI",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2018-03-14T20:03:41Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "CI"
+ ],
+ "assignees": [],
+ "body": "It has the advantages of already include the ready go qt installation",
+ "comments": []
+}
diff --git a/issues/75.md b/issues/75.md
@@ -0,0 +1,11 @@
+# #75 Do snaps on CircleCI
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2018-03-14T20:03:41Z
+- **Labels:** enhancement, CI
+
+---
+
+It has the advantages of already include the ready go qt installation
+
diff --git a/issues/8.json b/issues/8.json
@@ -0,0 +1,15 @@
+{
+ "number": 8,
+ "title": "Nice features to add which riot doesn't support yet... ",
+ "state": "open",
+ "author": "MTRNord",
+ "created_at": "2017-08-24T09:58:29Z",
+ "closed_at": null,
+ "labels": [
+ "enhancement",
+ "help wanted"
+ ],
+ "assignees": [],
+ "body": "- [ ] colored messages\r\n- [ ] emoji picker (not auto completion)\r\n- [ ] inline images #2 \r\n- [ ] multi user login\r\n- [ ] Optional sync of user addresses/contacts to davical or other contact managers\r\n.\r\n.\r\n. ",
+ "comments": []
+}
diff --git a/issues/8.md b/issues/8.md
@@ -0,0 +1,18 @@
+# #8 Nice features to add which riot doesn't support yet...
+
+- **State:** open
+- **Author:** @MTRNord
+- **Created:** 2017-08-24T09:58:29Z
+- **Labels:** enhancement, help wanted
+
+---
+
+- [ ] colored messages
+- [ ] emoji picker (not auto completion)
+- [ ] inline images #2
+- [ ] multi user login
+- [ ] Optional sync of user addresses/contacts to davical or other contact managers
+.
+.
+.
+
diff --git a/issues/9.json b/issues/9.json
@@ -0,0 +1,12 @@
+{
+ "number": 9,
+ "title": "[TODO] Name change to Morpheus as Neo is already taken :(",
+ "state": "closed",
+ "author": "MTRNord",
+ "created_at": "2017-08-25T23:33:59Z",
+ "closed_at": "2017-08-26T00:08:56Z",
+ "labels": [],
+ "assignees": [],
+ "body": "",
+ "comments": []
+}
diff --git a/issues/9.md b/issues/9.md
@@ -0,0 +1,11 @@
+# #9 [TODO] Name change to Morpheus as Neo is already taken :(
+
+- **State:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-08-25T23:33:59Z
+- **Closed:** 2017-08-26T00:08:56Z
+
+---
+
+_No description._
+
diff --git a/pulls/41.diff b/pulls/41.diff
@@ -0,0 +1,279 @@
+diff --git a/.ci/linux.sh b/.ci/linux.sh
+deleted file mode 100644
+index 6d65677..0000000
+--- a/.ci/linux.sh
++++ /dev/null
+@@ -1,43 +0,0 @@
+-#!/bin/bash
+-set -ev
+-
+-#check env
+-df -h
+-
+-ls $HOME/*
+-du -sh $HOME/*
+-
+-#needed for headless qt installation
+-export QT_QPA_PLATFORM=minimal
+-
+-#additional deps for multimedia
+-sudo apt-get -y -qq install libpulse-dev && sudo apt-get -qq clean
+-
+-#replace gcc4 with gcc5
+-sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
+-sudo apt-get -qq update
+-sudo apt-get -y -qq install gcc-5 g++-5 && sudo apt-get -qq clean
+-sudo rm -f /usr/bin/gcc; sudo ln -s /usr/bin/gcc-5 /usr/bin/gcc
+-sudo rm -f /usr/bin/g++; sudo ln -s /usr/bin/g++-5 /usr/bin/g++
+-
+-#download and install qt
+-sudo add-apt-repository -y ppa:beineri/opt-qt58-trusty
+-sudo apt-get -qq update
+-sudo apt-get -y -qq install qt583d qt58base qt58canvas3d qt58charts-no-lgpl qt58connectivity qt58creator qt58datavis3d-no-lgpl qt58declarative qt58doc qt58gamepad qt58graphicaleffects qt58imageformats qt58location qt58multimedia qt58qbs qt58quickcontrols qt58quickcontrols2 qt58script qt58scxml qt58sensors qt58serialbus qt58serialport qt58svg qt58tools qt58translations qt58virtualkeyboard-no-lgpl qt58webchannel qt58webengine qt58websockets qt58x11extras qt58xmlpatterns qt58speech qt58networkauth-no-lgpl && sudo apt-get -qq clean
+-QT=qt-unified-linux-x64-online.run
+-curl -sL --retry 10 --retry-delay 10 -o /tmp/$QT https://download.qt.io/official_releases/online_installers/$QT
+-chmod +x /tmp/$QT
+-/tmp/$QT --script $GOPATH/src/github.com/therecipe/qt/internal/ci/iscript.qs
+-rm -f /tmp/$QT
+-
+-#prepare env
+-sudo chown $USER /usr/local/bin
+-sudo chown $USER $GOROOT/pkg | true
+-
+-#check env
+-df -h
+-
+-ls $HOME/*
+-du -sh $HOME/*
+-
+-exit 0
+diff --git a/.circleci/config.yml b/.circleci/config.yml
+new file mode 100644
+index 0000000..75c8a1b
+--- /dev/null
++++ b/.circleci/config.yml
+@@ -0,0 +1,19 @@
++version: 2
++jobs:
++ build:
++ docker:
++ - image: therecipe/qt:linux
++ environment:
++ DESKTOP: true
++ steps:
++ - run:
++ name: Get Morpheus
++ command: go get -u -v -d github.com/Nordgedanken/Morpheus/...
++ - run:
++ name: Run Build
++ working_directory: /home/user/work/src/github.com/Nordgedanken/Morpheus/
++ command: $GOPATH/bin/qtdeploy build desktop
++ - run:
++ name: Run Tests
++ working_directory: /home/user/work/src/github.com/Nordgedanken/Morpheus/
++ command: $GOPATH/bin/qtdeploy test desktop
+diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
+new file mode 100644
+index 0000000..5e0d4a7
+--- /dev/null
++++ b/.github/ISSUE_TEMPLATE.md
+@@ -0,0 +1,32 @@
++Issue tracker is **ONLY** used for reporting bugs. NO NEW FEATURE ACCEPTED! Use the [Matrix Room](https://matrix.to/#/#Morpheus:matrix.ffslfl.net) for supporting issues.
++
++<!--- Provide a general summary of the issue in the Title above -->
++
++## Expected Behavior
++<!--- Tell us what should happen -->
++
++## Current Behavior
++<!--- Tell us what happens instead of the expected behavior -->
++
++## Possible Solution
++<!--- Not obligatory, but suggest a fix/reason for the bug, -->
++
++## Steps to Reproduce
++<!--- Provide a link to a live example, or an unambiguous set of steps to -->
++<!--- reproduce this bug. Include code to reproduce, if relevant -->
++1.
++2.
++3.
++4.
++
++## Context (Environment)
++<!--- How has this issue affected you? What are you trying to accomplish? -->
++<!--- Providing context helps us come up with a solution that is most useful in the real world -->
++
++<!--- Provide a general summary of the issue in the Title above -->
++
++## Detailed Description
++<!--- Provide a detailed description of the change or addition you are proposing -->
++
++## Possible Implementation
++<!--- Not obligatory, but suggest an idea for implementing addition or change -->
+\ No newline at end of file
+diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
+new file mode 100644
+index 0000000..b04be77
+--- /dev/null
++++ b/CONTRIBUTING.md
+@@ -0,0 +1,90 @@
++# Contributing
++
++When contributing to this repository, please first discuss the change you wish to make via issue,
++[matrix](https://matrix.to/#/#Morpheus:matrix.ffslfl.net), or any other method with the owners of this repository before making a change.
++
++Please note we have a code of conduct, please follow it in all your interactions with the project.
++
++## Pull Request Process
++
++1. Ensure any install or build dependencies are removed before the end of the layer when doing a
++ build.
++2. Update the README.md with details of changes to the interface, this includes new environment
++ variables, useful file locations.
++<!--3. You may merge the Pull Request in once you have the sign-off of two other developers, or if you
++ do not have permission to do that, you may request the second reviewer to merge it for you. -->
++
++## Code of Conduct
++
++### Our Pledge
++
++In the interest of fostering an open and welcoming environment, we as
++contributors and maintainers pledge to making participation in our project and
++our community a harassment-free experience for everyone, regardless of age, body
++size, disability, ethnicity, gender identity and expression, level of experience,
++nationality, personal appearance, race, religion, or sexual identity and
++orientation.
++
++### Our Standards
++
++Examples of behavior that contributes to creating a positive environment
++include:
++
++* Using welcoming and inclusive language
++* Being respectful of differing viewpoints and experiences
++* Gracefully accepting constructive criticism
++* Focusing on what is best for the community
++* Showing empathy towards other community members
++
++Examples of unacceptable behavior by participants include:
++
++* The use of sexualized language or imagery and unwelcome sexual attention or
++advances
++* Trolling, insulting/derogatory comments, and personal or political attacks
++* Public or private harassment
++* Publishing others' private information, such as a physical or electronic
++ address, without explicit permission
++* Other conduct which could reasonably be considered inappropriate in a
++ professional setting
++
++### Our Responsibilities
++
++Project maintainers are responsible for clarifying the standards of acceptable
++behavior and are expected to take appropriate and fair corrective action in
++response to any instances of unacceptable behavior.
++
++Project maintainers have the right and responsibility to remove, edit, or
++reject comments, commits, code, wiki edits, issues, and other contributions
++that are not aligned to this Code of Conduct, or to ban temporarily or
++permanently any contributor for other behaviors that they deem inappropriate,
++threatening, offensive, or harmful.
++
++### Scope
++
++This Code of Conduct applies both within project spaces and in public spaces
++when an individual is representing the project or its community. Examples of
++representing a project or community include using an official project [matrix
++room](https://matrix.to/#/#Morpheus:matrix.ffslfl.net), posting via an official social media account, or acting as an appointed
++representative at an online or offline event. Representation of a project may be
++further defined and clarified by project maintainers.
++
++### Enforcement
++
++Instances of abusive, harassing, or otherwise unacceptable behavior may be
++reported by contacting the project team at "info [at] nordgedanken [dot] de". All
++complaints will be reviewed and investigated and will result in a response that
++is deemed necessary and appropriate to the circumstances. The project team is
++obligated to maintain confidentiality with regard to the reporter of an incident.
++Further details of specific enforcement policies may be posted separately.
++
++Project maintainers who do not follow or enforce the Code of Conduct in good
++faith may face temporary or permanent repercussions as determined by other
++members of the project's leadership.
++
++### Attribution
++
++This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
++available at [http://contributor-covenant.org/version/1/4][version]
++
++[homepage]: http://contributor-covenant.org
++[version]: http://contributor-covenant.org/version/1/4/
+\ No newline at end of file
+diff --git a/README.md b/README.md
+index 5d24fd0..250ab30 100644
+--- a/README.md
++++ b/README.md
+@@ -1,11 +1,33 @@
+ # Morpheus
+-[](https://circleci.com/gh/Nordgedanken/Morpheus) [](https://ci.appveyor.com/project/MTRNord/neo)
++[](https://circleci.com/gh/Nordgedanken/Morpheus) [](https://ci.appveyor.com/project/MTRNord/neo)
++
++_Appveyor CI is known to be broken_
++
++---
+
+ A Matrix client written in Go-QT
+
+-# How to build
++## Contributing - Matrix Room
++Join the Matrix Room at [#Morpheus:matrix.ffslfl.net](https://matrix.to/#/#Morpheus:matrix.ffslfl.net)
++Read the [Contribution Guideline](CONTRIBUTING.md)
++
++## How to build
++### Prerequisites
++1. https://github.com/therecipe/qt
++ * Follow https://github.com/therecipe/qt/wiki/Installation
++2. Clone this repo by doing `go get -u github.com/Nordgedanken/Morpheus`
++
++### Build
++1. Run `qtdeploy build desktop` inside `$GOPATH/src/github.com/Nordgedanken/Morpheus`
++2. Run the Application from within `deploy/**`
++
++
++## Versioning
++We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/Nordgedanken/Morpheus/tags).
++
++
++## License
++This project is licensed under the GPLv3 License - see the [LICENSE](LICENSE) file for details
+
+-1. Follow https://github.com/therecipe/qt#installation
+-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`
++## Acknowledgments
++* Inspired by [nheko](http://github.com/mujx/nheko)
+diff --git a/circle.yml b/circle.yml
+deleted file mode 100644
+index b8690c9..0000000
+--- a/circle.yml
++++ /dev/null
+@@ -1,19 +0,0 @@
+-machine:
+- environment:
+- OS: linux
+- DESKTOP: true
+- GOROOT: /usr/local/go
+- GOPATH: /home/ubuntu/.go_project
+-dependencies:
+- pre:
+- override:
+- - 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/Morpheus/...
+- post:
+-test:
+- pre:
+- override:
+- - if [[ "$DESKTOP" == "true" ]]; then /home/ubuntu/.go_project/bin/qtsetup && /home/ubuntu/.go_project/bin/qtdeploy test desktop; fi
+- post:
diff --git a/pulls/41.json b/pulls/41.json
@@ -0,0 +1,22 @@
+{
+ "number": 41,
+ "title": "CI Update and Doc update",
+ "state": "merged",
+ "diff_file": "41.diff",
+ "author": "MTRNord",
+ "created_at": "2017-12-06T12:17:28Z",
+ "closed_at": "2017-12-06T12:21:33Z",
+ "merged_at": "2017-12-06T12:21:32Z",
+ "base_ref": "master",
+ "head_ref": "develop",
+ "labels": [
+ "enhancement"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "requested_reviewers": [],
+ "body": "fixes #39 \r\nfixes #14 \r\ncloses #20 ",
+ "comments": [],
+ "review_comments": []
+}
diff --git a/pulls/41.md b/pulls/41.md
@@ -0,0 +1,17 @@
+# PR #41 CI Update and Doc update
+
+- **Status:** merged
+- **Author:** @MTRNord
+- **Created:** 2017-12-06T12:17:28Z
+- **Branch:** develop → master
+- **Merged:** 2017-12-06T12:21:32Z
+- **Labels:** enhancement
+- **Assignees:** @MTRNord
+- **Diff:** [41.diff](./41.diff)
+
+---
+
+fixes #39
+fixes #14
+closes #20
+
diff --git a/pulls/42.diff b/pulls/42.diff
@@ -0,0 +1,111 @@
+diff --git a/.circleci/config.yml b/.circleci/config.yml
+index 75c8a1b..8608ac7 100644
+--- a/.circleci/config.yml
++++ b/.circleci/config.yml
+@@ -1,6 +1,6 @@
+ version: 2
+ jobs:
+- build:
++ prepare:
+ docker:
+ - image: therecipe/qt:linux
+ environment:
+@@ -9,11 +9,81 @@ jobs:
+ - run:
+ name: Get Morpheus
+ command: go get -u -v -d github.com/Nordgedanken/Morpheus/...
++ - persist_to_workspace:
++ # Must be an absolute path, or relative path from working_directory
++ root: /home/user/work/
++ # Must be relative path from root
++ paths:
++ - src/
++ build_linux:
++ docker:
++ - image: therecipe/qt:linux
++ environment:
++ DESKTOP: true
++ steps:
++ - attach_workspace:
++ # Must be absolute path or relative path from working_directory
++ at: /home/user/work/
++ - run:
++ name: Run Build
++ working_directory: /home/user/work/src/github.com/Nordgedanken/Morpheus/
++ command: $GOPATH/bin/qtdeploy build linux
++ test_linux:
++ docker:
++ - image: therecipe/qt:linux
++ environment:
++ DESKTOP: true
++ steps:
++ - attach_workspace:
++ # Must be absolute path or relative path from working_directory
++ at: /home/user/work/
++ - run:
++ name: Run Tests
++ working_directory: /home/user/work/src/github.com/Nordgedanken/Morpheus/
++ command: $GOPATH/bin/qtdeploy test linux
++ build_win_static:
++ docker:
++ - image: therecipe/qt:windows_64_static
++ environment:
++ DESKTOP: true
++ steps:
++ - attach_workspace:
++ # Must be absolute path or relative path from working_directory
++ at: /home/user/work/
+ - run:
+ name: Run Build
+ working_directory: /home/user/work/src/github.com/Nordgedanken/Morpheus/
+- command: $GOPATH/bin/qtdeploy build desktop
++ command: $GOPATH/bin/qtdeploy build windows
++ test_win_static:
++ docker:
++ - image: therecipe/qt:windows_64_static
++ environment:
++ DESKTOP: true
++ steps:
++ - attach_workspace:
++ # Must be absolute path or relative path from working_directory
++ at: /home/user/work/
+ - run:
+ name: Run Tests
+ working_directory: /home/user/work/src/github.com/Nordgedanken/Morpheus/
+- command: $GOPATH/bin/qtdeploy test desktop
++ command: $GOPATH/bin/qtdeploy test windows
++workflows:
++ version: 2
++ build-test-linux:
++ jobs:
++ - prepare
++ - build_linux:
++ requires:
++ - prepare
++ - test_linux:
++ requires:
++ - prepare
++ build-test-win:
++ jobs:
++ - prepare
++ - build_win_static:
++ requires:
++ - prepare
++ - test_win_static:
++ requires:
++ - prepare
+diff --git a/README.md b/README.md
+index 250ab30..b1d7cbf 100644
+--- a/README.md
++++ b/README.md
+@@ -1,8 +1,7 @@
+ # Morpheus
+-[](https://circleci.com/gh/Nordgedanken/Morpheus) [](https://ci.appveyor.com/project/MTRNord/neo)
+-
+-_Appveyor CI is known to be broken_
++[](https://circleci.com/gh/Nordgedanken/Morpheus)
+
++[]()
+ ---
+
+ A Matrix client written in Go-QT
diff --git a/pulls/42.json b/pulls/42.json
@@ -0,0 +1,22 @@
+{
+ "number": 42,
+ "title": "Switch Windows CI to CircleCI",
+ "state": "merged",
+ "diff_file": "42.diff",
+ "author": "MTRNord",
+ "created_at": "2017-12-06T16:05:23Z",
+ "closed_at": "2017-12-06T16:06:40Z",
+ "merged_at": "2017-12-06T16:06:40Z",
+ "base_ref": "master",
+ "head_ref": "develop",
+ "labels": [
+ "enhancement"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "requested_reviewers": [],
+ "body": "",
+ "comments": [],
+ "review_comments": []
+}
diff --git a/pulls/42.md b/pulls/42.md
@@ -0,0 +1,15 @@
+# PR #42 Switch Windows CI to CircleCI
+
+- **Status:** merged
+- **Author:** @MTRNord
+- **Created:** 2017-12-06T16:05:23Z
+- **Branch:** develop → master
+- **Merged:** 2017-12-06T16:06:40Z
+- **Labels:** enhancement
+- **Assignees:** @MTRNord
+- **Diff:** [42.diff](./42.diff)
+
+---
+
+_No description._
+
diff --git a/pulls/52.json b/pulls/52.json
@@ -0,0 +1,22 @@
+{
+ "number": 52,
+ "title": "Rework Login UI",
+ "state": "merged",
+ "diff_file": null,
+ "author": "MTRNord",
+ "created_at": "2017-12-21T16:50:51Z",
+ "closed_at": "2017-12-21T16:51:36Z",
+ "merged_at": "2017-12-21T16:51:36Z",
+ "base_ref": "develop",
+ "head_ref": "feature/Rework_Login",
+ "labels": [
+ "enhancement"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "requested_reviewers": [],
+ "body": "fixes #50 and reworks the login UI",
+ "comments": [],
+ "review_comments": []
+}
diff --git a/pulls/52.md b/pulls/52.md
@@ -0,0 +1,15 @@
+# PR #52 Rework Login UI
+
+- **Status:** merged
+- **Author:** @MTRNord
+- **Created:** 2017-12-21T16:50:51Z
+- **Branch:** feature/Rework_Login → develop
+- **Merged:** 2017-12-21T16:51:36Z
+- **Labels:** enhancement
+- **Assignees:** @MTRNord
+- **Diff:** _not available (branch/fork likely deleted on GitHub)_
+
+---
+
+fixes #50 and reworks the login UI
+
diff --git a/pulls/53.json b/pulls/53.json
@@ -0,0 +1,20 @@
+{
+ "number": 53,
+ "title": "Update Scalar Branch to newest develop",
+ "state": "merged",
+ "diff_file": null,
+ "author": "MTRNord",
+ "created_at": "2017-12-21T16:54:39Z",
+ "closed_at": "2017-12-21T16:55:41Z",
+ "merged_at": "2017-12-21T16:55:41Z",
+ "base_ref": "feature/Morpheus-7_Scalar",
+ "head_ref": "develop",
+ "labels": [],
+ "assignees": [
+ "MTRNord"
+ ],
+ "requested_reviewers": [],
+ "body": "",
+ "comments": [],
+ "review_comments": []
+}
diff --git a/pulls/53.md b/pulls/53.md
@@ -0,0 +1,14 @@
+# PR #53 Update Scalar Branch to newest develop
+
+- **Status:** merged
+- **Author:** @MTRNord
+- **Created:** 2017-12-21T16:54:39Z
+- **Branch:** develop → feature/Morpheus-7_Scalar
+- **Merged:** 2017-12-21T16:55:41Z
+- **Assignees:** @MTRNord
+- **Diff:** _not available (branch/fork likely deleted on GitHub)_
+
+---
+
+_No description._
+
diff --git a/pulls/54.json b/pulls/54.json
@@ -0,0 +1,22 @@
+{
+ "number": 54,
+ "title": "Add Integration Manager Support",
+ "state": "closed",
+ "diff_file": null,
+ "author": "MTRNord",
+ "created_at": "2017-12-21T16:57:21Z",
+ "closed_at": "2017-12-21T20:18:50Z",
+ "merged_at": null,
+ "base_ref": "develop",
+ "head_ref": "feature/Morpheus-7_Scalar",
+ "labels": [
+ "enhancement"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "requested_reviewers": [],
+ "body": "",
+ "comments": [],
+ "review_comments": []
+}
diff --git a/pulls/54.md b/pulls/54.md
@@ -0,0 +1,15 @@
+# PR #54 Add Integration Manager Support
+
+- **Status:** closed
+- **Author:** @MTRNord
+- **Created:** 2017-12-21T16:57:21Z
+- **Branch:** feature/Morpheus-7_Scalar → develop
+- **Closed:** 2017-12-21T20:18:50Z
+- **Labels:** enhancement
+- **Assignees:** @MTRNord
+- **Diff:** _not available (branch/fork likely deleted on GitHub)_
+
+---
+
+_No description._
+
diff --git a/pulls/55.diff b/pulls/55.diff
@@ -0,0 +1,247 @@
+diff --git a/main.go b/main.go
+index 9f05cfe..cb2706c 100644
+--- a/main.go
++++ b/main.go
+@@ -8,6 +8,7 @@ import (
+
+ "github.com/Nordgedanken/Morpheus/matrix"
+ "github.com/Nordgedanken/Morpheus/matrix/db"
++ "github.com/Nordgedanken/Morpheus/matrix/scalar"
+ "github.com/Nordgedanken/Morpheus/ui"
+ "github.com/Nordgedanken/dugong"
+ "github.com/matrix-org/gomatrix"
+@@ -118,6 +119,7 @@ func main() {
+ log.Errorln("mainUI: ", mainUIErr)
+ return
+ }
++ scalar.ReqAndSaveScalarToken(mainUIStruct.GetCli())
+
+ mainUIStruct.GetWidget().Resize2(windowWidth, windowHeight)
+ window.SetCentralWidget(mainUIStruct.GetWidget())
+diff --git a/matrix/scalar/client.go b/matrix/scalar/client.go
+new file mode 100644
+index 0000000..e6c4810
+--- /dev/null
++++ b/matrix/scalar/client.go
+@@ -0,0 +1,127 @@
++package scalar
++
++import (
++ "github.com/Nordgedanken/Morpheus/matrix/db"
++ "github.com/dgraph-io/badger"
++ "github.com/matrix-org/gomatrix"
++ log "github.com/sirupsen/logrus"
++)
++
++type openIDTokenResponse struct {
++ AccessToken string `json:"access_token"`
++ TokenType string `json:"token_type"`
++ ExpiresIn int `json:"expires_in"`
++ MatrixServerName string `json:"matrix_server_name"`
++}
++
++func getOpenIDToken(cli *gomatrix.Client) (resp *openIDTokenResponse, err error) {
++ urlPath := cli.BuildURL("user", cli.UserID, "openid", "request_token")
++ _, err = makeRequest(cli, "POST", urlPath, "{}", &resp)
++ return
++}
++
++type scalarRegisterResp struct {
++ ScalarToken string `json:"scalar_token"`
++}
++
++//getScalarToken returns the scalar token for the current user. Used inside the Integration manager.
++func getScalarToken(cli *gomatrix.Client, openIDToken *openIDTokenResponse) (resp *scalarRegisterResp, err error) {
++ urlPath := "https://scalar.vector.im/api/register"
++ _, err = cli.MakeRequest("POST", urlPath, openIDToken, &resp)
++ return
++}
++
++func ReqAndSaveScalarToken(cli *gomatrix.Client) (err error) {
++ cacheDB, DBOpenErr := db.OpenCacheDB()
++ if DBOpenErr != nil {
++ log.Fatalln(DBOpenErr)
++ }
++
++ var integToken string
++
++ // Get cache
++ DBErr := cacheDB.View(func(txn *badger.Txn) error {
++ roomAvatarDataItem, QueryErr := txn.Get([]byte("user|" + cli.UserID + "|integToken"))
++ if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
++ return QueryErr
++ }
++ if QueryErr != badger.ErrKeyNotFound {
++ integToken = roomAvatarDataItem.ToString()
++ return nil
++ }
++ return nil
++ })
++ if DBErr != nil {
++ err = DBErr
++ return
++ }
++
++ if integToken != "" {
++ openIdToken, OpenIDerr := getOpenIDToken(cli)
++ if OpenIDerr != nil {
++ err = OpenIDerr
++ return
++ }
++ var ScalarRegisterErr error
++ scalarToken, ScalarRegisterErr := getScalarToken(cli, openIdToken)
++ if ScalarRegisterErr != nil {
++ err = ScalarRegisterErr
++ }
++ integToken = scalarToken.ScalarToken
++
++ // Update cache
++ DBSetErr := cacheDB.Update(func(txn *badger.Txn) error {
++ DBSetErr := txn.Set([]byte("user|"+cli.UserID+"|integToken"), []byte(integToken))
++ return DBSetErr
++ })
++ if DBSetErr != nil {
++ err = DBSetErr
++ return
++ }
++ }
++
++ return
++}
++
++func GetScalarURL(cli *gomatrix.Client) (err error, urlPath string) {
++ cacheDB, DBOpenErr := db.OpenCacheDB()
++ if DBOpenErr != nil {
++ log.Fatalln(DBOpenErr)
++ }
++
++ var integToken string
++
++ // Get cache
++ DBErr := cacheDB.View(func(txn *badger.Txn) error {
++ roomAvatarDataItem, QueryErr := txn.Get([]byte("user|" + cli.UserID + "|integToken"))
++ if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
++ return QueryErr
++ }
++ if QueryErr != badger.ErrKeyNotFound {
++ integToken = roomAvatarDataItem.ToString()
++ return nil
++ }
++ return nil
++ })
++ if DBErr != nil {
++ err = DBErr
++ return
++ }
++
++ urlPath = "https://scalar.vector.im/?access_token=" + integToken
++
++ return
++}
++
++// How to listen for Scalar events:
++/*
++webframe := webkit.NewQWebView(nil)
++webframe.Load(core.NewQUrl3(GetScalarURL(cli), core.QUrl__TolerantMode))
++webframe.ConnectLoadFinished(func(ok bool) {
++ javascript := "window.addEventListener(\"message\", qtJS-onMessage, false);"
++
++ mainFrame := webframe.Page().MainFrame()
++// Replace second argument with actual QObject
++ mainFrame.AddToJavaScriptWindowObject("qtJS", nil, webkit.QWebFrame__AutoOwnership)
++ mainFrame.EvaluateJavaScript(javascript)
++})*/
+diff --git a/matrix/scalar/utils.go b/matrix/scalar/utils.go
+new file mode 100644
+index 0000000..ab238c3
+--- /dev/null
++++ b/matrix/scalar/utils.go
+@@ -0,0 +1,66 @@
++package scalar
++
++import (
++ "bytes"
++ "encoding/json"
++ "io/ioutil"
++ "net/http"
++
++ "github.com/matrix-org/gomatrix"
++)
++
++//makeRequest does the same as cli.MakeRequest but with a string as body instead of a struct
++func makeRequest(cli *gomatrix.Client, method string, httpURL string, reqBody string, resBody interface{}) ([]byte, error) {
++ var req *http.Request
++ var err error
++ if reqBody != "" {
++ byteString := []byte(reqBody)
++ req, err = http.NewRequest(method, httpURL, bytes.NewBuffer(byteString))
++ } else {
++ req, err = http.NewRequest(method, httpURL, nil)
++ }
++
++ if err != nil {
++ return nil, err
++ }
++ req.Header.Set("Content-Type", "application/json")
++ res, err := cli.Client.Do(req)
++ if res != nil {
++ defer res.Body.Close()
++ }
++ if err != nil {
++ return nil, err
++ }
++ contents, err := ioutil.ReadAll(res.Body)
++ if res.StatusCode/100 != 2 { // not 2xx
++ var wrap error
++ var respErr gomatrix.RespError
++ if _ = json.Unmarshal(contents, &respErr); respErr.ErrCode != "" {
++ wrap = respErr
++ }
++
++ // If we failed to decode as RespError, don't just drop the HTTP body, include it in the
++ // HTTP error instead (e.g proxy errors which return HTML).
++ msg := "Failed to " + method + " JSON to " + req.URL.Path
++ if wrap == nil {
++ msg = msg + ": " + string(contents)
++ }
++
++ return contents, gomatrix.HTTPError{
++ Code: res.StatusCode,
++ Message: msg,
++ WrappedError: wrap,
++ }
++ }
++ if err != nil {
++ return nil, err
++ }
++
++ if resBody != nil {
++ if err = json.Unmarshal(contents, &resBody); err != nil {
++ return nil, err
++ }
++ }
++
++ return contents, nil
++}
+diff --git a/ui/LoginUI.go b/ui/LoginUI.go
+index 7a77a04..fddb138 100644
+--- a/ui/LoginUI.go
++++ b/ui/LoginUI.go
+@@ -4,6 +4,7 @@ import (
+ "sync"
+
+ "github.com/Nordgedanken/Morpheus/matrix"
++ "github.com/Nordgedanken/Morpheus/matrix/scalar"
+ "github.com/Nordgedanken/Morpheus/matrix/globalTypes"
+ "github.com/matrix-org/gomatrix"
+ log "github.com/sirupsen/logrus"
+@@ -173,6 +174,9 @@ func (l *LoginUI) login() (err error) {
+ err = mainUIErr
+ return
+ }
++
++ scalar.ReqAndSaveScalarToken(MainUIStruct.GetCli())
++
+ l.window.SetCentralWidget(MainUIStruct.GetWidget())
+ l.window.Resize(l.widget.Size())
+ }
diff --git a/pulls/55.json b/pulls/55.json
@@ -0,0 +1,23 @@
+{
+ "number": 55,
+ "title": "Add Integration Manager Support",
+ "state": "open",
+ "diff_file": "55.diff",
+ "author": "MTRNord",
+ "created_at": "2017-12-21T20:21:29Z",
+ "closed_at": null,
+ "merged_at": null,
+ "base_ref": "develop",
+ "head_ref": "feature/Morpheus-7_Scalar",
+ "labels": [
+ "enhancement",
+ "in progress"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "requested_reviewers": [],
+ "body": "will fix #7 ",
+ "comments": [],
+ "review_comments": []
+}
diff --git a/pulls/55.md b/pulls/55.md
@@ -0,0 +1,14 @@
+# PR #55 Add Integration Manager Support
+
+- **Status:** open
+- **Author:** @MTRNord
+- **Created:** 2017-12-21T20:21:29Z
+- **Branch:** feature/Morpheus-7_Scalar → develop
+- **Labels:** enhancement, in progress
+- **Assignees:** @MTRNord
+- **Diff:** [55.diff](./55.diff)
+
+---
+
+will fix #7
+
diff --git a/pulls/63.diff b/pulls/63.diff
@@ -0,0 +1,5417 @@
+diff --git a/.circleci/config.yml b/.circleci/config.yml
+index 8655879..f460b8d 100644
+--- a/.circleci/config.yml
++++ b/.circleci/config.yml
+@@ -38,6 +38,10 @@ jobs:
+ - attach_workspace:
+ # Must be absolute path or relative path from working_directory
+ at: /home/user/work/
++ - run:
++ name: Update Build Deps
++ working_directory: /home/user/work/src/github.com/Nordgedanken/Morpheus/
++ command: apt-get update -y -qq && apt-get install apt -y -qq && add-apt-repository ppa:ubuntu-toolchain-r/test -y && apt-get update -y -qq && apt-get -y -qq install gcc-5 g++-5 && rm -f /usr/bin/gcc && ln -s /usr/bin/gcc-5 /usr/bin/gcc && rm -f /usr/bin/g++ && ln -s /usr/bin/g++-5 /usr/bin/g++
+ - run:
+ name: Run Build
+ working_directory: /home/user/work/src/github.com/Nordgedanken/Morpheus/
+@@ -67,12 +71,12 @@ jobs:
+ - run:
+ name: Build Tests
+ working_directory: /home/user/work/src/github.com/Nordgedanken/Morpheus/
+- command: $GOPATH/bin/ginkgo build /home/user/work/src/github.com/Nordgedanken/Morpheus/
++ command: $GOPATH/bin/ginkgo build --cover /home/user/work/src/github.com/Nordgedanken/Morpheus/
+ no_output_timeout: 1200
+ - run:
+ name: Run Tests
+ working_directory: /home/user/work/src/github.com/Nordgedanken/Morpheus/
+- command: $GOPATH/bin/ginkgo -r -p --randomizeAllSpecs --randomizeSuites --failOnPending --trace --race --progress /home/user/work/src/github.com/Nordgedanken/Morpheus/Morpheus.test
++ command: $GOPATH/bin/ginkgo --cover --coverprofile=c.out -r -p --randomizeAllSpecs --randomizeSuites --failOnPending --trace --race --progress /home/user/work/src/github.com/Nordgedanken/Morpheus/Morpheus.test
+ no_output_timeout: 1200
+ - run:
+ name: Debug Print directory
+@@ -81,6 +85,22 @@ jobs:
+ command: ls -lah
+ - store_test_results:
+ path: /home/user/work/src/github.com/Nordgedanken/Morpheus/junit.xml
++ lint:
++ docker:
++ - image: therecipe/qt:linux
++ steps:
++ - attach_workspace:
++ # Must be absolute path or relative path from working_directory
++ at: /home/user/work/
++ - run:
++ name: Generate additional binding files
++ working_directory: /home/user/work/src/github.com/Nordgedanken/Morpheus/
++ command: $GOPATH/bin/qtrcc desktop && $GOPATH/bin/qtmoc desktop
++ - run:
++ name: Run Lint
++ working_directory: /home/user/work/src/github.com/Nordgedanken/Morpheus/
++ command: chmod +x scripts/lint.sh && scripts/lint.sh
++ no_output_timeout: 1200
+ build_win_static:
+ docker:
+ - image: therecipe/qt:windows_64_static
+@@ -109,6 +129,9 @@ workflows:
+ - test:
+ requires:
+ - prepare
++ - lint:
++ requires:
++ - prepare
+ notify:
+ webhooks:
+ - url: https://riot.nordgedanken.de:4051/services/hooks/Y2lyY2xlY2lfc2VydmljZQ
+diff --git a/.gitignore b/.gitignore
+index fbc1321..e1da019 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -18,6 +18,7 @@ debug*
+ log/
+ data/
+ ui/moc*
++matrix/moc*
+ .idea/
+ Morpheus.exe
+ Morpheus.msi
+\ No newline at end of file
+diff --git a/README.md b/README.md
+index 0255893..7ffd929 100644
+--- a/README.md
++++ b/README.md
+@@ -2,6 +2,8 @@
+ [](https://circleci.com/gh/Nordgedanken/Morpheus)
+
+ []()
++
++[](https://goreportcard.com/report/github.com/Nordgedanken/Morpheus)
+ ---
+
+ A Matrix client written in Go-QT
+diff --git a/artwork/34c3Banner.jpg b/artwork/34c3Banner.jpg
+new file mode 100644
+index 0000000..c46c007
+Binary files /dev/null and b/artwork/34c3Banner.jpg differ
+diff --git a/artwork/34c3Banner.xcf b/artwork/34c3Banner.xcf
+new file mode 100644
+index 0000000..fc0849a
+Binary files /dev/null and b/artwork/34c3Banner.xcf differ
+diff --git a/artwork/Morpheus Long Logo with link.xcf b/artwork/Morpheus Long Logo with link.xcf
+new file mode 100644
+index 0000000..0b9b0f0
+Binary files /dev/null and b/artwork/Morpheus Long Logo with link.xcf differ
+diff --git a/artwork/Morpheus Long Logo.png b/artwork/Morpheus Long Logo.png
+new file mode 100644
+index 0000000..b70ac9a
+Binary files /dev/null and b/artwork/Morpheus Long Logo.png differ
+diff --git a/artwork/Morpheus Long Logo.xcf b/artwork/Morpheus Long Logo.xcf
+new file mode 100644
+index 0000000..4f5577b
+Binary files /dev/null and b/artwork/Morpheus Long Logo.xcf differ
+diff --git a/linter.json b/linter.json
+index 14230e7..2b2b1f4 100644
+--- a/linter.json
++++ b/linter.json
+@@ -1,5 +1,5 @@
+ {
+- "Vendor": false,
++ "Vendor": true,
+ "Cyclo": 12,
+ "Deadline": "5m",
+ "Enable": [
+diff --git a/main.go b/main.go
+index b20f4a0..9f05cfe 100644
+--- a/main.go
++++ b/main.go
+@@ -8,7 +8,6 @@ import (
+
+ "github.com/Nordgedanken/Morpheus/matrix"
+ "github.com/Nordgedanken/Morpheus/matrix/db"
+- "github.com/Nordgedanken/Morpheus/matrix/scalar"
+ "github.com/Nordgedanken/Morpheus/ui"
+ "github.com/Nordgedanken/dugong"
+ "github.com/matrix-org/gomatrix"
+@@ -20,6 +19,8 @@ import (
+ )
+
+ var window *widgets.QMainWindow
++var mainUIStruct *ui.MainUI
++var loginUIStruct *ui.LoginUI
+
+ func main() {
+ runtime.GOMAXPROCS(128)
+@@ -110,41 +111,28 @@ func main() {
+
+ //Show MainUI
+ for result := range results {
+- //TODO Don't switch screen on wrong login data.
+- MainUIStruct := ui.NewMainUIStruct(windowWidth, windowHeight, window)
+- MainUIStruct.SetCli(result)
+- mainUIErr := MainUIStruct.NewUI()
++ mainUIStruct = ui.NewMainUIStruct(windowWidth, windowHeight, window)
++ mainUIStruct.SetCli(result)
++ mainUIErr := mainUIStruct.NewUI()
+ if mainUIErr != nil {
+ log.Errorln("mainUI: ", mainUIErr)
+ return
+ }
+
+- //scalarTokenTest
+- openIdToken, OpenIDerr := scalar.GetOpenIDToken(MainUIStruct.GetCli())
+- if OpenIDerr != nil {
+- log.Warnln(OpenIDerr)
+- }
+- scalarToken, ScalarRegisterErr := scalar.GetScalarToken(MainUIStruct.GetCli(), openIdToken)
+- if ScalarRegisterErr != nil {
+- log.Warnln(ScalarRegisterErr)
+- }
+-
+- log.Infoln(scalarToken)
+-
+- MainUIStruct.GetWidget().Resize2(windowWidth, windowHeight)
+- window.SetCentralWidget(MainUIStruct.GetWidget())
++ mainUIStruct.GetWidget().Resize2(windowWidth, windowHeight)
++ window.SetCentralWidget(mainUIStruct.GetWidget())
+ }
+ } else {
+ //Show loginUI
+- LoginUIStruct := ui.NewLoginUIStruct(windowWidth, windowHeight, window)
+- loginUIErr := LoginUIStruct.NewUI()
++ loginUIStruct = ui.NewLoginUIStruct(windowWidth, windowHeight, window)
++ loginUIErr := loginUIStruct.NewUI()
+ if loginUIErr != nil {
+ log.Errorln("Login Err: ", loginUIErr)
+ return
+ }
+
+- LoginUIStruct.GetWidget().Resize2(windowWidth, windowHeight)
+- window.SetCentralWidget(LoginUIStruct.GetWidget())
++ loginUIStruct.GetWidget().Resize2(windowWidth, windowHeight)
++ window.SetCentralWidget(loginUIStruct.GetWidget())
+ }
+
+ window.Resize2(windowWidth, windowHeight)
+@@ -164,6 +152,21 @@ func main() {
+
+ func cleanup() bool {
+ log.Infoln("cleanup")
++
++ if mainUIStruct != nil {
++ if mainUIStruct.GetCli() != nil {
++ log.Infoln("Stop Sync")
++ mainUIStruct.GetCli().StopSync()
++ }
++ }
++
++ if loginUIStruct != nil {
++ if loginUIStruct.GetCli() != nil {
++ log.Infoln("Stop Sync")
++ loginUIStruct.GetCli().StopSync()
++ }
++ }
++
+ UserDB, DBOpenErr := db.OpenUserDB()
+ if DBOpenErr != nil {
+ log.Errorln(DBOpenErr)
+diff --git a/matrix/db/db.go b/matrix/db/db.go
+index cc1b971..942aa01 100644
+--- a/matrix/db/db.go
++++ b/matrix/db/db.go
+@@ -5,31 +5,36 @@ import (
+ "os"
+ "path/filepath"
+ "strconv"
+- "sync"
+
+ "github.com/dgraph-io/badger"
+ "github.com/shibukawa/configdir"
+ )
+
+-var UserDB *badger.DB
+-var CacheDB *badger.DB
+-var onceCache sync.Once
+-var onceUser sync.Once
++var userDB *badger.DB
++var cacheDB *badger.DB
++var onceCache Once
++var onceUser Once
++
++func ResetOnceUser() {
++ onceUser.Reset()
++}
+
+ // OpenCacheDB opens or generates the Database file for settings and Cache
+ func OpenCacheDB() (db *badger.DB, err error) {
+ onceCache.Do(func() {
+ // Open the data.db file. It will be created if it doesn't exist.
+ configDirs := configdir.New("Nordgedanken", "Morpheus")
+- if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/"); os.IsNotExist(StatErr) {
+- MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/", 0755)
++ filePath := filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)
++
++ if _, StatErr := os.Stat(filePath + "/data/"); os.IsNotExist(StatErr) {
++ MkdirErr := os.MkdirAll(filePath+"/data/", 0700)
+ if MkdirErr != nil {
+ err = MkdirErr
+ return
+ }
+ }
+- if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/cache/"); os.IsNotExist(StatErr) {
+- MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/cache/", 0755)
++ if _, StatErr := os.Stat(filePath + "/data/cache/"); os.IsNotExist(StatErr) {
++ MkdirErr := os.MkdirAll(filePath+"/data/cache/", 0700)
+ if MkdirErr != nil {
+ err = MkdirErr
+ return
+@@ -37,23 +42,31 @@ func OpenCacheDB() (db *badger.DB, err error) {
+ }
+ opts := badger.DefaultOptions
+ opts.SyncWrites = false
+- opts.Dir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/cache"
+- opts.ValueDir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/cache"
++ opts.Dir = filePath + "/data/cache"
++ opts.ValueDir = filePath + "/data/cache"
++
++ if _, StatErr := os.Stat(filePath + "/data/cache/LOCK"); StatErr == nil {
++ DeleteErr := os.Remove(filePath + "/data/cache/LOCK")
++ if DeleteErr != nil {
++ err = DeleteErr
++ return
++ }
++ }
+
+ expDB, DBErr := badger.Open(opts)
+ if DBErr != nil {
+ err = DBErr
+ return
+ }
+- CacheDB = expDB
++ userDB = expDB
+ })
+
+- if CacheDB == nil {
++ if userDB == nil {
+ err = errors.New("missing CacheDB")
+ return
+ }
+
+- db = CacheDB
++ db = userDB
+ return
+ }
+
+@@ -62,15 +75,17 @@ func OpenUserDB() (db *badger.DB, err error) {
+ onceUser.Do(func() {
+ // Open the data.db file. It will be created if it doesn't exist.
+ configDirs := configdir.New("Nordgedanken", "Morpheus")
+- if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/"); os.IsNotExist(StatErr) {
+- MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/", 0755)
++ filePath := filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)
++
++ if _, StatErr := os.Stat(filePath + "/data/"); os.IsNotExist(StatErr) {
++ MkdirErr := os.MkdirAll(filePath+"/data/", 0700)
+ if MkdirErr != nil {
+ err = MkdirErr
+ return
+ }
+ }
+- if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/user/"); os.IsNotExist(StatErr) {
+- MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/user/", 0755)
++ if _, StatErr := os.Stat(filePath + "/data/user/"); os.IsNotExist(StatErr) {
++ MkdirErr := os.MkdirAll(filePath+"/data/user/", 0700)
+ if MkdirErr != nil {
+ err = MkdirErr
+ return
+@@ -78,8 +93,16 @@ func OpenUserDB() (db *badger.DB, err error) {
+ }
+ opts := badger.DefaultOptions
+ opts.SyncWrites = false
+- opts.Dir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/user"
+- opts.ValueDir = filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/user"
++ opts.Dir = filePath + "/data/user"
++ opts.ValueDir = filePath + "/data/user"
++
++ if _, StatErr := os.Stat(filePath + "/data/user/LOCK"); StatErr == nil {
++ DeleteErr := os.Remove(filePath + "/data/user/LOCK")
++ if DeleteErr != nil {
++ err = DeleteErr
++ return
++ }
++ }
+
+ expDB, DBErr := badger.Open(opts)
+ if DBErr != nil {
+@@ -87,15 +110,15 @@ func OpenUserDB() (db *badger.DB, err error) {
+ return
+ }
+
+- UserDB = expDB
++ cacheDB = expDB
+ })
+
+- if UserDB == nil {
++ if cacheDB == nil {
+ err = errors.New("missing UserDB")
+ return
+ }
+
+- db = UserDB
++ db = cacheDB
+ return
+ }
+
+@@ -136,3 +159,21 @@ func CacheMessageEvents(id, sender, roomID, message string, timestamp int64) (er
+
+ return
+ }
++
++// Get dedpulicates all the Gets inside the Database to not repeat that much code.
++func Get(txn *badger.Txn, key []byte) (result []byte, err error) {
++ item, QueryErr := txn.Get(key)
++ if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
++ err = QueryErr
++ return
++ }
++ if QueryErr != badger.ErrKeyNotFound {
++ valueByte, valueErr := item.Value()
++ result = valueByte
++ if valueErr != nil {
++ err = valueErr
++ return
++ }
++ }
++ return
++}
+diff --git a/matrix/db/once.go b/matrix/db/once.go
+new file mode 100644
+index 0000000..8f0f987
+--- /dev/null
++++ b/matrix/db/once.go
+@@ -0,0 +1,38 @@
++package db
++
++import (
++ "sync"
++ "sync/atomic"
++)
++
++// Once is an object that will perform exactly one action
++// until Reset is called.
++// See http://golang.org/pkg/sync/#Once
++type Once struct {
++ m sync.Mutex
++ done uint32
++}
++
++// Do simulates sync.Once.Do by executing the specified function
++// only once, until Reset is called.
++// See http://golang.org/pkg/sync/#Once
++func (o *Once) Do(f func()) {
++ if atomic.LoadUint32(&o.done) == 1 {
++ return
++ }
++ // Slow-path.
++ o.m.Lock()
++ defer o.m.Unlock()
++ if o.done == 0 {
++ defer atomic.StoreUint32(&o.done, 1)
++ f()
++ }
++}
++
++// Reset indicates that the next call to Do should actually be called
++// once again.
++func (o *Once) Reset() {
++ o.m.Lock()
++ defer o.m.Unlock()
++ atomic.StoreUint32(&o.done, 0)
++}
+diff --git a/matrix/db/storer.go b/matrix/db/storer.go
+index a898e40..b79f627 100644
+--- a/matrix/db/storer.go
++++ b/matrix/db/storer.go
+@@ -1,6 +1,8 @@
+ package db
+
+ import (
++ "fmt"
++
+ "github.com/dgraph-io/badger"
+ )
+
+@@ -10,6 +12,7 @@ type Storer interface {
+ LoadNextBatch(userID string) (nextBatch string, err error)
+ }
+
++// MorpheusStorage is the StorageInterface which needs to be conformed to in order to persist Go-NEB data
+ type MorpheusStorage struct {
+ Database *badger.DB
+ }
+@@ -31,18 +34,11 @@ func (m *MorpheusStorage) UpdateNextBatch(userID, nextBatch string) (err error)
+ // LoadNextBatch loads the next_batch token for the given user.
+ func (m *MorpheusStorage) LoadNextBatch(userID string) (nextBatch string, err error) {
+ DBerr := m.Database.View(func(txn *badger.Txn) error {
+-
+- nextBatchItem, NextBatchErr := txn.Get([]byte("matrix|" + userID + "|nextBatch|"))
+- if NextBatchErr != nil {
+- return NextBatchErr
++ nextBatchResult, QueryErr := Get(txn, []byte("user|accessToken"))
++ if QueryErr != nil {
++ return QueryErr
+ }
+-
+- nextBatchByte, nextBatchByteErr := nextBatchItem.Value()
+- if nextBatchByteErr != nil {
+- return nextBatchByteErr
+- }
+-
+- nextBatch = string(nextBatchByte)
++ nextBatch = fmt.Sprintf("%s", nextBatchResult)
+ return nil
+ })
+ if DBerr != nil {
+diff --git a/matrix/globalTypes/types.go b/matrix/globalTypes/types.go
+new file mode 100644
+index 0000000..8f24617
+--- /dev/null
++++ b/matrix/globalTypes/types.go
+@@ -0,0 +1,44 @@
++package globalTypes
++
++import (
++ "github.com/Nordgedanken/Morpheus/matrix/db"
++ "github.com/Nordgedanken/Morpheus/matrix/rooms"
++ "github.com/Nordgedanken/Morpheus/ui/listLayouts"
++ "github.com/matrix-org/gomatrix"
++)
++
++// Config holds important reused information in the UI
++type Config struct {
++ Username string
++ Password string
++
++ WindowWidth int
++ WindowHeight int
++
++ Rooms map[string]*rooms.Room
++ CurrentRoom string
++
++ MessageListLayout *listLayouts.QVBoxLayoutWithTriggerSlot
++ RoomListLayout *listLayouts.QRoomVBoxLayoutWithTriggerSlot
++
++ matrixClient
++}
++
++type matrixClient struct {
++ databases
++ Cli *gomatrix.Client
++}
++
++// GetCli returns the Matrix Client
++func (mc *matrixClient) GetCli() *gomatrix.Client {
++ return mc.Cli
++}
++
++type databases struct {
++ CacheDB db.Storer
++}
++
++// SetCurrentRoom sets the new room ID of the MainUI
++func (d *databases) SetCacheDB(db db.Storer) {
++ d.CacheDB = db
++}
+diff --git a/matrix/rooms.go b/matrix/rooms.go
+deleted file mode 100644
+index a594a81..0000000
+--- a/matrix/rooms.go
++++ /dev/null
+@@ -1,210 +0,0 @@
+-package matrix
+-
+-import (
+- "bytes"
+- "image"
+- "image/draw"
+- "image/png"
+- "strings"
+-
+- "github.com/Nordgedanken/Morpheus/matrix/db"
+- "github.com/dgraph-io/badger"
+- "github.com/matrix-org/gomatrix"
+- "github.com/rhinoman/go-commonmark"
+- log "github.com/sirupsen/logrus"
+- "github.com/therecipe/qt/gui"
+-)
+-
+-// Room saves the information of a Room
+-type Room struct {
+- cli *gomatrix.Client
+- RoomID string
+- RoomName string
+- RoomAvatarURL string
+- RoomTopic string
+-}
+-
+-// NewRoom Inits a new Room struct
+-func NewRoom(roomID string, cli *gomatrix.Client) (room *Room) {
+- room = &Room{RoomID: roomID, cli: cli}
+- return
+-}
+-
+-func (r *Room) crawlRoomAvatarURL() {
+- roomAvatar := struct {
+- URL string `json:"url"`
+- }{}
+- r.cli.StateEvent(r.RoomID, "m.room.avatar", "", &roomAvatar)
+- r.RoomAvatarURL = roomAvatar.URL
+-}
+-
+-func (r *Room) crawlRoomTopic() {
+- roomTopic := struct {
+- Topic string `json:"topic"`
+- }{}
+- r.cli.StateEvent(r.RoomID, "m.room.topic", "", &roomTopic)
+- r.RoomTopic = roomTopic.Topic
+-}
+-
+-// GetRoomTopic returns the Topic of the Room and crawls it if needed
+-func (r *Room) GetRoomTopic() (topic string) {
+- if r.RoomTopic == "" {
+- r.crawlRoomTopic()
+- }
+-
+- mardownMessage := commonmark.Md2Html(r.RoomTopic, 0)
+-
+- if mardownMessage == r.RoomTopic {
+- topic = r.RoomTopic
+- return
+- } else {
+- r.RoomTopic = mardownMessage
+- topic = r.RoomTopic
+- return
+- }
+-}
+-
+-// GetRoomAvatar generates the Avatar Image for a Room
+-func (r *Room) GetRoomAvatar() (avatarResp *gui.QPixmap, err error) {
+- // Get the Avatar URL if needed
+- if r.RoomAvatarURL == "" {
+- r.crawlRoomAvatarURL()
+- }
+-
+- // Get the image Data
+- cacheDB, DBOpenErr := db.OpenCacheDB()
+- if DBOpenErr != nil {
+- log.Fatalln(DBOpenErr)
+- }
+-
+- // Init local vars
+- var roomAvatarData []byte
+- var IMGdata []byte
+-
+- // Get cache
+- DBErr := cacheDB.View(func(txn *badger.Txn) error {
+- roomAvatarDataItem, QueryErr := txn.Get([]byte("room|" + r.RoomID + "|84x84"))
+- if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
+- return QueryErr
+- }
+- if QueryErr != badger.ErrKeyNotFound {
+- roomAvatarDataBytes, roomAvatarDataErr := roomAvatarDataItem.Value()
+- roomAvatarData = roomAvatarDataBytes
+- return roomAvatarDataErr
+- }
+- return nil
+- })
+- if DBErr != nil {
+- err = DBErr
+- return
+- }
+-
+- //If cache is empty do a ServerQuery
+- if len(roomAvatarData) <= 0 {
+- // If avatarURL is not empty (aka. has a avatar set) download it at the size of 100x100. Else make the data string empty
+- if r.RoomAvatarURL != "" {
+- hsURL := r.cli.HomeserverURL.String()
+- roomAvatarURLSplits := strings.Split(strings.Replace(r.RoomAvatarURL, "mxc://", "", -1), "/")
+-
+- urlPath := hsURL + "/_matrix/media/r0/thumbnail/" + roomAvatarURLSplits[0] + "/" + roomAvatarURLSplits[1] + "?width=84&height=84&method=crop"
+-
+- data, ReqErr := r.cli.MakeRequest("GET", urlPath, nil, nil)
+- if ReqErr != nil {
+- err = ReqErr
+- return
+- }
+- IMGdata = data
+- } else {
+- log.Println("Generating Room Avatar")
+- var GenerateImgErr error
+- var roomName string
+- if r.RoomName == "" {
+- r.crawlRoomName()
+- }
+- roomName = r.RoomName
+- log.Println(roomName)
+- if roomName == "" {
+- roomName = "#"
+- }
+- IMGdata, GenerateImgErr = generateGenericImages(roomName, 84)
+- if GenerateImgErr != nil {
+- err = GenerateImgErr
+- return
+- }
+- }
+-
+- // Update cache
+- DBSetErr := cacheDB.Update(func(txn *badger.Txn) error {
+- DBSetErr := txn.Set([]byte("room|"+r.RoomID+"|84x84"), IMGdata)
+- return DBSetErr
+- })
+- if DBSetErr != nil {
+- err = DBSetErr
+- return
+- }
+-
+- } else {
+- IMGdata = roomAvatarData
+- }
+-
+- reader := bytes.NewReader(IMGdata)
+- srcIMG, _, DecodeErr := image.Decode(reader)
+- if DecodeErr != nil {
+- err = DecodeErr
+- }
+-
+- // 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}, cx}, image.ZP, draw.Over)
+-
+- avatar := gui.NewQPixmap()
+- buf := new(bytes.Buffer)
+- ConvErr := png.Encode(buf, canvas)
+- if ConvErr != nil {
+- err = ConvErr
+- }
+-
+- str := buf.String()
+- avatar.LoadFromData(str, uint(len(str)), "", 0)
+- avatarResp = avatar
+- return
+-}
+-
+-func (r *Room) crawlRoomName() {
+- roomName := struct {
+- Name string `json:"name"`
+- }{}
+- roomCanoncialAlias := struct {
+- Alias string `json:"alias"`
+- }{}
+-
+- if roomNameStateEventErr := r.cli.StateEvent(r.RoomID, "m.room.name", "", &roomName); roomNameStateEventErr != nil {
+- log.Println(roomNameStateEventErr)
+- // Not returning as a Error NotFound is allowed
+- }
+- if roomName.Name == "" {
+- if roomCanoncialAliasStateEventErr := r.cli.StateEvent(r.RoomID, "m.room.canonical_alias", "", &roomCanoncialAlias); roomCanoncialAliasStateEventErr != nil {
+- log.Println(roomCanoncialAliasStateEventErr)
+- // Not returning as a Error NotFound is allowed
+- }
+- if roomCanoncialAlias.Alias == "" {
+- r.RoomName = r.RoomID
+- } else {
+- r.RoomName = roomCanoncialAlias.Alias
+- }
+- } else {
+- r.RoomName = roomName.Name
+- }
+-
+-}
+-
+-// GetRoomName gives you the name of the current Room
+-func (r *Room) GetRoomName() (name string) {
+- if r.RoomName == "" {
+- r.crawlRoomName()
+- }
+- name = r.RoomName
+- return
+-}
+diff --git a/matrix/rooms/rooms.go b/matrix/rooms/rooms.go
+new file mode 100644
+index 0000000..9d13be7
+--- /dev/null
++++ b/matrix/rooms/rooms.go
+@@ -0,0 +1,314 @@
++package rooms
++
++import (
++ "fmt"
++ "strings"
++
++ "github.com/Nordgedanken/Morpheus/matrix"
++ "github.com/Nordgedanken/Morpheus/matrix/db"
++ "github.com/dgraph-io/badger"
++ "github.com/matrix-org/gomatrix"
++ "github.com/rhinoman/go-commonmark"
++ log "github.com/sirupsen/logrus"
++ "github.com/therecipe/qt/gui"
++)
++
++const mRoomNameEv = "m.room.name"
++const mRoomCanonicalAliasEv = "m.room.canonical_alias"
++
++// Room saves the information of a Room
++type Room struct {
++ cli *gomatrix.Client
++ RoomID string
++ RoomName string
++ RoomNameEventType string
++ RoomAvatarURL string
++ RoomTopic string
++}
++
++// GetRooms either returns the joinedRoomsList from the Server or the cachedList
++func GetRooms(cli *gomatrix.Client) (rooms []string, err error) {
++ // Get Cache
++ cacheDB, DBOpenErr := db.OpenCacheDB()
++ if DBOpenErr != nil {
++ log.Fatalln(DBOpenErr)
++ }
++
++ var roomsString string
++ DBErr := cacheDB.View(func(txn *badger.Txn) error {
++ roomsResult, QueryErr := db.Get(txn, []byte("rooms"))
++ if QueryErr != nil {
++ return QueryErr
++ }
++ roomsString = fmt.Sprintf("%s", roomsResult)
++ return nil
++ })
++ if DBErr != nil {
++ err = DBErr
++ return
++ }
++
++ if roomsString == "" {
++ roomsResp, ReqErr := cli.JoinedRooms()
++ if ReqErr != nil {
++ err = ReqErr
++ return
++ }
++ rooms = roomsResp.JoinedRooms
++ DBSetErr := cacheDB.Update(func(txn *badger.Txn) error {
++ DBSetErr := txn.Set([]byte("rooms"), []byte(strings.Join(rooms, ",")))
++ return DBSetErr
++ })
++ if DBSetErr != nil {
++ err = DBSetErr
++ return
++ }
++ } else {
++ rooms = strings.Split(roomsString, ",")
++ }
++ return
++}
++
++// NewRoom Inits a new Room struct
++func NewRoom(roomID string, cli *gomatrix.Client) (room *Room) {
++ room = &Room{RoomID: roomID, cli: cli}
++ return
++}
++
++func (r *Room) crawlRoomAvatarURL() {
++ roomAvatar := struct {
++ URL string `json:"url"`
++ }{}
++ r.cli.StateEvent(r.RoomID, "m.room.avatar", "", &roomAvatar)
++ r.RoomAvatarURL = roomAvatar.URL
++}
++
++func (r *Room) crawlRoomTopic() {
++ roomTopic := struct {
++ Topic string `json:"topic"`
++ }{}
++ r.cli.StateEvent(r.RoomID, "m.room.topic", "", &roomTopic)
++ r.RoomTopic = roomTopic.Topic
++}
++
++// GetRoomTopic returns the Topic of the Room and crawls it if needed
++func (r *Room) GetRoomTopic() (topic string) {
++ if r.RoomTopic == "" {
++ r.crawlRoomTopic()
++ }
++
++ mardownMessage := commonmark.Md2Html(r.RoomTopic, 0)
++
++ topic = r.RoomTopic
++ if mardownMessage == r.RoomTopic {
++ topic = r.RoomTopic
++ } else {
++ r.RoomTopic = mardownMessage
++ }
++ return
++}
++
++// GetRoomAvatar generates the Avatar Image for a Room
++func (r *Room) GetRoomAvatar() (avatarResp *gui.QPixmap, err error) {
++ // Get the Avatar URL if needed
++ if r.RoomAvatarURL == "" {
++ r.crawlRoomAvatarURL()
++ }
++
++ // Get the image Data
++ cacheDB, DBOpenErr := db.OpenCacheDB()
++ if DBOpenErr != nil {
++ log.Fatalln(DBOpenErr)
++ }
++
++ // Init local vars
++ var roomAvatarData []byte
++ var IMGdata []byte
++
++ // Get cache
++ DBErr := cacheDB.View(func(txn *badger.Txn) error {
++ roomAvatarDataResult, QueryErr := db.Get(txn, []byte("room|"+r.RoomID+"|84x84"))
++ if QueryErr != nil {
++ return QueryErr
++ }
++ roomAvatarData = roomAvatarDataResult
++ return nil
++ })
++ if DBErr != nil {
++ err = DBErr
++ return
++ }
++
++ //If cache is empty do a ServerQuery
++ if len(roomAvatarData) <= 0 {
++ // If avatarURL is not empty (aka. has a avatar set) download it at the size of 100x100. Else make the data string empty
++ if r.RoomAvatarURL != "" {
++ hsURL := r.cli.HomeserverURL.String()
++ roomAvatarURLSplits := strings.Split(strings.Replace(r.RoomAvatarURL, "mxc://", "", -1), "/")
++
++ urlPath := hsURL + "/_matrix/media/r0/thumbnail/" + roomAvatarURLSplits[0] + "/" + roomAvatarURLSplits[1] + "?width=84&height=84&method=crop"
++
++ data, ReqErr := r.cli.MakeRequest("GET", urlPath, nil, nil)
++ if ReqErr != nil {
++ err = ReqErr
++ return
++ }
++ IMGdata = data
++ } else {
++ log.Println("Generating Room Avatar")
++ var GenerateImgErr error
++ var roomName string
++ if r.RoomName == "" {
++ r.crawlRoomName()
++ }
++ roomName = r.RoomName
++ log.Println(roomName)
++ if roomName == "" {
++ roomName = "#"
++ }
++ IMGdata, GenerateImgErr = matrix.GenerateGenericImages(roomName, 84)
++ if GenerateImgErr != nil {
++ err = GenerateImgErr
++ return
++ }
++ }
++
++ // Update cache
++ DBSetErr := cacheDB.Update(func(txn *badger.Txn) error {
++ DBSetErr := txn.Set([]byte("room|"+r.RoomID+"|84x84"), IMGdata)
++ return DBSetErr
++ })
++ if DBSetErr != nil {
++ err = DBSetErr
++ return
++ }
++
++ } else {
++ IMGdata = roomAvatarData
++ }
++
++ avatar := gui.NewQPixmap()
++
++ str := string(IMGdata[:])
++ avatar.LoadFromData(str, uint(len(str)), "", 0)
++ avatarResp = avatar
++ return
++}
++
++func (r *Room) crawlRoomName() {
++ roomName := struct {
++ Name string `json:"name"`
++ }{}
++ roomCanonicalAlias := struct {
++ Alias string `json:"alias"`
++ }{}
++
++ if roomNameStateEventErr := r.cli.StateEvent(r.RoomID, mRoomNameEv, "", &roomName); roomNameStateEventErr != nil {
++ log.Println(roomNameStateEventErr)
++ // Not returning as a Error NotFound is allowed
++ }
++ if roomName.Name == "" {
++ if roomCanonicalAliasStateEventErr := r.cli.StateEvent(r.RoomID, mRoomCanonicalAliasEv, "", &roomCanonicalAlias); roomCanonicalAliasStateEventErr != nil {
++ log.Println(roomCanonicalAliasStateEventErr)
++ // Not returning as a Error NotFound is allowed
++ }
++ if roomCanonicalAlias.Alias == "" {
++ r.RoomNameEventType = "roomID"
++ r.RoomName = r.RoomID
++ } else {
++ r.RoomNameEventType = mRoomCanonicalAliasEv
++ r.RoomName = roomCanonicalAlias.Alias
++ }
++ } else {
++ r.RoomNameEventType = mRoomNameEv
++ r.RoomName = roomName.Name
++ }
++
++}
++
++// UpdateRoomNameByEvent used to Update the Room Name of a Room when a Room Change Event comes down the Sync
++func (r *Room) UpdateRoomNameByEvent(newName, evType string) {
++ if r.RoomNameEventType == "" {
++ r.getRoomNameEventTypeFromDB()
++ }
++ if r.RoomNameEventType == mRoomNameEv && r.RoomNameEventType == evType {
++ r.RoomName = newName
++ r.cacheRoomName()
++ } else if r.RoomNameEventType != mRoomNameEv {
++ r.RoomName = newName
++ r.cacheRoomName()
++ }
++}
++
++func (r *Room) cacheRoomName() (err error) {
++ cacheDB, DBOpenErr := db.OpenCacheDB()
++ if DBOpenErr != nil {
++ err = DBOpenErr
++ return
++ }
++
++ // Update cache
++ DBSetErr := cacheDB.Update(func(txn *badger.Txn) error {
++ DBSetErr := txn.Set([]byte("room|"+r.RoomID+"|nameEventType"), []byte(r.RoomNameEventType))
++ if DBSetErr != nil {
++ return DBSetErr
++ }
++
++ DBSetErr = txn.Set([]byte("room|"+r.RoomID+"|name"), []byte(r.RoomName))
++ return DBSetErr
++ })
++ if DBSetErr != nil {
++ err = DBSetErr
++ return
++ }
++ return
++}
++
++func (r *Room) getRoomNameEventTypeFromDB() (err error) {
++ cacheDB, DBOpenErr := db.OpenCacheDB()
++ if DBOpenErr != nil {
++ err = DBOpenErr
++ return
++ }
++
++ cacheDB.View(func(txn *badger.Txn) error {
++ roomNameEventTypeResult, QueryErr := db.Get(txn, []byte("room|"+r.RoomID+"|nameEventType"))
++ if QueryErr != nil {
++ return QueryErr
++ }
++ r.RoomNameEventType = fmt.Sprintf("%s", roomNameEventTypeResult)
++ return nil
++ })
++
++ return
++}
++
++func (r *Room) getRoomNameFromDB() (err error) {
++ cacheDB, DBOpenErr := db.OpenCacheDB()
++ if DBOpenErr != nil {
++ err = DBOpenErr
++ return
++ }
++
++ cacheDB.View(func(txn *badger.Txn) error {
++ roomNameResult, QueryErr := db.Get(txn, []byte("room|"+r.RoomID+"|name"))
++ if QueryErr != nil {
++ return QueryErr
++ }
++ r.RoomName = fmt.Sprintf("%s", roomNameResult)
++ return nil
++ })
++
++ return
++}
++
++// GetRoomName gives you the name of the current Room
++func (r *Room) GetRoomName() (name string) {
++ r.getRoomNameFromDB()
++ if r.RoomName == "" {
++ r.crawlRoomName()
++ r.cacheRoomName()
++ }
++ name = r.RoomName
++ return
++}
+diff --git a/matrix/scalar/client.go b/matrix/scalar/client.go
+deleted file mode 100644
+index bb7e57c..0000000
+--- a/matrix/scalar/client.go
++++ /dev/null
+@@ -1,26 +0,0 @@
+-package scalar
+-
+-import "github.com/matrix-org/gomatrix"
+-
+-type OpenIDTokenResponse struct {
+- AccessToken string `json:"access_token"`
+- TokenType string `json:"token_type"`
+- ExpiresIn int `json:"expires_in"`
+- MatrixServerName string `json:"matrix_server_name"`
+-}
+-
+-func GetOpenIDToken(cli *gomatrix.Client) (resp *OpenIDTokenResponse, err error) {
+- urlPath := cli.BuildURL("user", cli.UserID, "openid", "request_token")
+- _, err = MakeRequest(cli, "POST", urlPath, "{}", &resp)
+- return
+-}
+-
+-type ScalarRegisterResp struct {
+- ScalarToken string `json:"scalar_token"`
+-}
+-
+-func GetScalarToken(cli *gomatrix.Client, openIDToken *OpenIDTokenResponse) (resp *ScalarRegisterResp, err error) {
+- urlPath := "https://scalar.vector.im/api/register"
+- _, err = cli.MakeRequest("POST", urlPath, openIDToken, &resp)
+- return
+-}
+diff --git a/matrix/scalar/utils.go b/matrix/scalar/utils.go
+deleted file mode 100644
+index 821edcc..0000000
+--- a/matrix/scalar/utils.go
++++ /dev/null
+@@ -1,65 +0,0 @@
+-package scalar
+-
+-import (
+- "bytes"
+- "encoding/json"
+- "io/ioutil"
+- "net/http"
+-
+- "github.com/matrix-org/gomatrix"
+-)
+-
+-func MakeRequest(cli *gomatrix.Client, method string, httpURL string, reqBody string, resBody interface{}) ([]byte, error) {
+- var req *http.Request
+- var err error
+- if reqBody != "" {
+- byteString := []byte(reqBody)
+- req, err = http.NewRequest(method, httpURL, bytes.NewBuffer(byteString))
+- } else {
+- req, err = http.NewRequest(method, httpURL, nil)
+- }
+-
+- if err != nil {
+- return nil, err
+- }
+- req.Header.Set("Content-Type", "application/json")
+- res, err := cli.Client.Do(req)
+- if res != nil {
+- defer res.Body.Close()
+- }
+- if err != nil {
+- return nil, err
+- }
+- contents, err := ioutil.ReadAll(res.Body)
+- if res.StatusCode/100 != 2 { // not 2xx
+- var wrap error
+- var respErr gomatrix.RespError
+- if _ = json.Unmarshal(contents, &respErr); respErr.ErrCode != "" {
+- wrap = respErr
+- }
+-
+- // If we failed to decode as RespError, don't just drop the HTTP body, include it in the
+- // HTTP error instead (e.g proxy errors which return HTML).
+- msg := "Failed to " + method + " JSON to " + req.URL.Path
+- if wrap == nil {
+- msg = msg + ": " + string(contents)
+- }
+-
+- return contents, gomatrix.HTTPError{
+- Code: res.StatusCode,
+- Message: msg,
+- WrappedError: wrap,
+- }
+- }
+- if err != nil {
+- return nil, err
+- }
+-
+- if resBody != nil {
+- if err = json.Unmarshal(contents, &resBody); err != nil {
+- return nil, err
+- }
+- }
+-
+- return contents, nil
+-}
+diff --git a/matrix/syncer/syncer.go b/matrix/syncer/syncer.go
+index 4b5d6ff..1be1738 100644
+--- a/matrix/syncer/syncer.go
++++ b/matrix/syncer/syncer.go
+@@ -6,13 +6,17 @@ import (
+ "runtime/debug"
+ "time"
+
++ "github.com/Nordgedanken/Morpheus/matrix/globalTypes"
++ "github.com/Nordgedanken/Morpheus/matrix/rooms"
+ "github.com/matrix-org/gomatrix"
+ )
+
++//MorpheusSyncer holds the UserID, the used Storer and the listener
+ type MorpheusSyncer struct {
+ UserID string
+ Store gomatrix.Storer
+ listeners map[string][]OnEventListener // event type to listeners array
++ config *globalTypes.Config
+ }
+
+ // OnEventListener can be used with DefaultSyncer.OnEventType to be informed of incoming events.
+@@ -41,7 +45,7 @@ func (s *MorpheusSyncer) ProcessResponse(res *gomatrix.RespSync, since string) (
+ }()
+
+ for roomID, roomData := range res.Rooms.Join {
+- room := s.getOrCreateRoom(roomID)
++ room := s.getOrCreateRoom(roomID, "join")
+ for _, event := range roomData.State.Events {
+ event.RoomID = roomID
+ room.UpdateState(&event)
+@@ -53,7 +57,7 @@ func (s *MorpheusSyncer) ProcessResponse(res *gomatrix.RespSync, since string) (
+ }
+ }
+ for roomID, roomData := range res.Rooms.Invite {
+- room := s.getOrCreateRoom(roomID)
++ room := s.getOrCreateRoom(roomID, "invite")
+ for _, event := range roomData.State.Events {
+ event.RoomID = roomID
+ room.UpdateState(&event)
+@@ -61,7 +65,7 @@ func (s *MorpheusSyncer) ProcessResponse(res *gomatrix.RespSync, since string) (
+ }
+ }
+ for roomID, roomData := range res.Rooms.Leave {
+- room := s.getOrCreateRoom(roomID)
++ room := s.getOrCreateRoom(roomID, "leave")
+ for _, event := range roomData.Timeline.Events {
+ if event.StateKey != nil {
+ event.RoomID = roomID
+@@ -121,7 +125,14 @@ func (s *MorpheusSyncer) shouldProcessResponse(resp *gomatrix.RespSync, since st
+ }
+
+ // getOrCreateRoom must only be called by the Sync() goroutine which calls ProcessResponse()
+-func (s *MorpheusSyncer) getOrCreateRoom(roomID string) *gomatrix.Room {
++func (s *MorpheusSyncer) getOrCreateRoom(roomID, state string) *gomatrix.Room {
++ // Add new Room to the List if new
++ _, present := s.config.Rooms[roomID]
++ if !present && state == "join" {
++ s.config.Rooms[roomID] = rooms.NewRoom(roomID, s.config.GetCli())
++ s.config.RoomListLayout.TriggerRoom(roomID)
++ }
++
+ room := s.Store.LoadRoom(roomID)
+ if room == nil { // create a new Room
+ room = gomatrix.NewRoom(roomID)
+diff --git a/matrix/user.go b/matrix/user.go
+index cb310ba..90b340c 100644
+--- a/matrix/user.go
++++ b/matrix/user.go
+@@ -3,65 +3,22 @@ package matrix
+ import (
+ "bytes"
+ "fmt"
+- "image"
+- "image/color"
+- "image/draw"
+- // image/gif needed to load gif images
+- _ "image/gif"
+- // image/jpeg needed to load jpeg images
+- _ "image/jpeg"
+ "image/png"
+- // image/png needed to load png images
+- _ "image/png"
+ "strconv"
+ "strings"
+ "unicode"
+ "unicode/utf8"
+
+- log "github.com/sirupsen/logrus"
+-
+ "github.com/Nordgedanken/Morpheus/matrix/db"
++ "github.com/dgraph-io/badger"
+ "github.com/disintegration/letteravatar"
+ "github.com/matrix-org/gomatrix"
++ log "github.com/sirupsen/logrus"
+ "github.com/therecipe/qt/gui"
+-
+- "github.com/dgraph-io/badger"
+- // golang.org/x/image/webp needed to load webp images
+- _ "golang.org/x/image/webp"
+-
+- // golang.org/x/image/bmp needed to load bmp images
+- _ "golang.org/x/image/bmp"
+-
+- // golang.org/x/image/riff needed to load riff images
+- _ "golang.org/x/image/riff"
+-
+- // golang.org/x/image/tiff needed to load tiff images
+- _ "golang.org/x/image/tiff"
+ )
+
+-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{A: 255}
+- }
+- return color.Alpha{A: 0}
+-}
+-
+-func generateGenericImages(displayname string, size int) (imgData []byte, err error) {
+- identifier := displayname
++// GenerateGenericImages generates a byte slice containing a Image with the starting char as symbol and a colored background
++func GenerateGenericImages(identifier string, size int) (imgData []byte, err error) {
+ if (identifier[0] == '#' || identifier[0] == '!' || identifier[0] == '@') && len(identifier) > 1 {
+ identifier = identifier[1:]
+ }
+@@ -103,15 +60,11 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string, size int) (avatarResp *gui
+
+ // Get cache
+ DBErr := cacheDB.View(func(txn *badger.Txn) error {
+- roomAvatarDataItem, QueryErr := txn.Get([]byte("user|" + mxid + "|avatarData" + strconv.Itoa(size) + "x" + strconv.Itoa(size)))
+- if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
++ avatarDataResult, QueryErr := db.Get(txn, []byte("user|"+mxid+"|avatarData"+strconv.Itoa(size)+"x"+strconv.Itoa(size)))
++ if QueryErr != nil {
+ return QueryErr
+ }
+- if QueryErr != badger.ErrKeyNotFound {
+- avatarDataBytes, avatarDataErr := roomAvatarDataItem.Value()
+- avatarData = avatarDataBytes
+- return avatarDataErr
+- }
++ avatarData = avatarDataResult
+ return nil
+ })
+ if DBErr != nil {
+@@ -151,7 +104,7 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string, size int) (avatarResp *gui
+ DisplayNameResp, _ := cli.GetDisplayName(mxid)
+ DisplayName := DisplayNameResp.DisplayName
+ var GenerateImgErr error
+- IMGdata, GenerateImgErr = generateGenericImages(DisplayName, size)
++ IMGdata, GenerateImgErr = GenerateGenericImages(DisplayName, size)
+ if GenerateImgErr != nil {
+ err = GenerateImgErr
+ return
+@@ -171,70 +124,38 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string, size int) (avatarResp *gui
+ IMGdata = avatarData
+ }
+
+- r := bytes.NewReader(IMGdata)
+- srcIMG, _, DecodeErr := image.Decode(r)
+- if DecodeErr != nil {
+- err = DecodeErr
+- }
+-
+- // 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}, cx}, image.ZP, draw.Over)
+-
+ avatar := gui.NewQPixmap()
+- buf := new(bytes.Buffer)
+- ConvErr := png.Encode(buf, canvas)
+- if ConvErr != nil {
+- err = ConvErr
+- }
+
+- str := buf.Bytes()
++ str := string(IMGdata[:])
+
+- avatar.LoadFromData(string(str[:]), uint(len(str)), "PNG", 0)
++ avatar.LoadFromData(string(str[:]), uint(len(str)), "", 0)
+ avatarResp = avatar
+ return
+ }
+
++//GetUserDataFromCache gets the last User from the cache
+ func GetUserDataFromCache() (accessToken, homeserverURL, userID string, err error) {
+ UserDB, err := db.OpenUserDB()
+
+ // Get cache
+ DBErr := UserDB.View(func(txn *badger.Txn) error {
+- accessTokenItem, QueryErr := txn.Get([]byte("user|accessToken"))
+- if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
++ accessTokenResult, QueryErr := db.Get(txn, []byte("user|accessToken"))
++ if QueryErr != nil {
+ return QueryErr
+ }
+- if QueryErr != badger.ErrKeyNotFound {
+- accessTokenByte, accessTokenErr := accessTokenItem.Value()
+- accessToken = fmt.Sprintf("%s", accessTokenByte)
+- if accessTokenErr != nil {
+- return accessTokenErr
+- }
+- }
++ accessToken = fmt.Sprintf("%s", accessTokenResult)
+
+- homeserverURLItem, QueryErr := txn.Get([]byte("user|homeserverURL"))
+- if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
++ homeserverURLResult, QueryErr := db.Get(txn, []byte("user|homeserverURL"))
++ if QueryErr != nil {
+ return QueryErr
+ }
+- if QueryErr != badger.ErrKeyNotFound {
+- homeserverURLByte, homeserverURLErr := homeserverURLItem.Value()
+- homeserverURL = fmt.Sprintf("%s", homeserverURLByte)
+- if homeserverURLErr != nil {
+- return homeserverURLErr
+- }
+- }
++ homeserverURL = fmt.Sprintf("%s", homeserverURLResult)
+
+- userIDItem, QueryErr := txn.Get([]byte("user|userID"))
+- if QueryErr != nil && QueryErr != badger.ErrKeyNotFound {
++ userIDResult, QueryErr := db.Get(txn, []byte("user|userID"))
++ if QueryErr != nil {
+ return QueryErr
+ }
+- if QueryErr != badger.ErrKeyNotFound {
+- userIDByte, userIDErr := userIDItem.Value()
+- userID = fmt.Sprintf("%s", userIDByte)
+- return userIDErr
+- }
++ userID = fmt.Sprintf("%s", userIDResult)
+ return nil
+ })
+ if DBErr != nil {
+diff --git a/qml/ui/chat.ui b/qml/ui/chat.ui
+index cbfeb47..460c534 100644
+--- a/qml/ui/chat.ui
++++ b/qml/ui/chat.ui
+@@ -566,7 +566,7 @@ border-radius: 5px;</string>
+ <item>
+ <widget class="QScrollArea" name="roomScroll">
+ <property name="sizePolicy">
+- <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
++ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+@@ -676,9 +676,6 @@ border-radius: 2px;</string>
+ <property name="text">
+ <string/>
+ </property>
+- <property name="pixmap">
+- <pixmap>../../../../../../../Downloads/MatrixHQ.png</pixmap>
+- </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+@@ -712,7 +709,7 @@ border-radius: 2px;</string>
+ </font>
+ </property>
+ <property name="text">
+- <string>Matrix HQ</string>
++ <string/>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+@@ -747,7 +744,7 @@ border-radius: 2px;</string>
+ </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>
++ <string/>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::AutoText</enum>
+@@ -890,7 +887,7 @@ border-radius: 2px;</string>
+ <x>0</x>
+ <y>0</y>
+ <width>601</width>
+- <height>424</height>
++ <height>469</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+diff --git a/qml/ui/message.ui b/qml/ui/message.ui
+index e427e23..3a37ba9 100644
+--- a/qml/ui/message.ui
++++ b/qml/ui/message.ui
+@@ -117,7 +117,7 @@ border: 0;
+ border-radius:7px;</string>
+ </property>
+ <property name="text">
+- <string>Test</string>
++ <string/>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+@@ -153,7 +153,7 @@ border-radius:7px;</string>
+ <string notr="true">color:grey;</string>
+ </property>
+ <property name="text">
+- <string>MTRNord</string>
++ <string/>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+@@ -174,7 +174,7 @@ border-radius:7px;</string>
+ <string notr="true">color:grey;</string>
+ </property>
+ <property name="text">
+- <string>Way to early to say a time^^</string>
++ <string/>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+diff --git a/qml/ui/ownmessage.ui b/qml/ui/ownmessage.ui
+index 9b18ed7..29dafb4 100644
+--- a/qml/ui/ownmessage.ui
++++ b/qml/ui/ownmessage.ui
+@@ -114,7 +114,7 @@ border: 0;
+ border-radius:7px;</string>
+ </property>
+ <property name="text">
+- <string>Test</string>
++ <string/>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+@@ -150,7 +150,7 @@ border-radius:7px;</string>
+ <string notr="true">color:grey;</string>
+ </property>
+ <property name="text">
+- <string>Way to early to say a time^^</string>
++ <string/>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+@@ -174,7 +174,7 @@ border-radius:7px;</string>
+ <string notr="true">color:grey;</string>
+ </property>
+ <property name="text">
+- <string>MTRNord</string>
++ <string/>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+diff --git a/qml/ui/room.ui b/qml/ui/room.ui
+index 50dfbc0..4969ef0 100644
+--- a/qml/ui/room.ui
++++ b/qml/ui/room.ui
+@@ -129,7 +129,7 @@
+ <string notr="true">border: 0;</string>
+ </property>
+ <property name="text">
+- <string>Test</string>
++ <string/>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+diff --git a/scripts/lint.sh b/scripts/lint.sh
+index b831caf..ca212a4 100644
+--- a/scripts/lint.sh
++++ b/scripts/lint.sh
+@@ -25,8 +25,8 @@ then args="$args --enable-gc"
+ fi
+
+ echo "Installing lint search engine..."
+-go install github.com/alecthomas/gometalinter/
+-gometalinter --config=linter.json ./... --install
++go get -u -v github.com/alecthomas/gometalinter/
++$GOPATH/bin/gometalinter --config=linter.json ./... --install
+
+ echo "Looking for lint..."
+-gometalinter ./... ${args}
+\ No newline at end of file
++$GOPATH/bin/gometalinter ./... ${args} --skip=vendor --exclude "vendor" --exclude "moc" --exclude "qt"
+diff --git a/ui/LoginUI.go b/ui/LoginUI.go
+index dad233f..7a77a04 100644
+--- a/ui/LoginUI.go
++++ b/ui/LoginUI.go
+@@ -4,6 +4,7 @@ import (
+ "sync"
+
+ "github.com/Nordgedanken/Morpheus/matrix"
++ "github.com/Nordgedanken/Morpheus/matrix/globalTypes"
+ "github.com/matrix-org/gomatrix"
+ log "github.com/sirupsen/logrus"
+ "github.com/therecipe/qt/core"
+@@ -13,22 +14,22 @@ import (
+ )
+
+ // NewLoginUIStruct gives you a LoginUI struct with prefilled data
+-func NewLoginUIStruct(windowWidth, windowHeight int, window *widgets.QMainWindow) (loginUIStruct LoginUI) {
+- configStruct := config{
+- windowWidth: windowWidth,
+- windowHeight: windowHeight,
++func NewLoginUIStruct(windowWidth, windowHeight int, window *widgets.QMainWindow) (loginUIStruct *LoginUI) {
++ configStruct := globalTypes.Config{
++ WindowWidth: windowWidth,
++ WindowHeight: windowHeight,
+ }
+- loginUIStruct = LoginUI{
+- config: configStruct,
++ loginUIStruct = &LoginUI{
++ Config: configStruct,
+ window: window,
+ }
+ return
+ }
+
+ // NewLoginUIStructWithExistingConfig gives you a LoginUI struct with prefilled data and data from a previous Config
+-func NewLoginUIStructWithExistingConfig(configStruct config, window *widgets.QMainWindow) (loginUIStruct LoginUI) {
+- loginUIStruct = LoginUI{
+- config: configStruct,
++func NewLoginUIStructWithExistingConfig(configStruct globalTypes.Config, window *widgets.QMainWindow) (loginUIStruct *LoginUI) {
++ loginUIStruct = &LoginUI{
++ Config: configStruct,
+ window: window,
+ }
+ return
+@@ -77,35 +78,31 @@ func (l *LoginUI) NewUI() (err error) {
+ if usernameInput.StyleSheet() == "border: 1px solid red" {
+ usernameInput.SetStyleSheet("")
+ }
+- l.username = value
++ l.Username = value
+ })
+
+ passwordInput.ConnectTextChanged(func(value string) {
+ if passwordInput.StyleSheet() == "border: 1px solid red" {
+ passwordInput.SetStyleSheet("")
+ }
+- l.password = value
++ l.Password = value
+ })
+
+ loginButton.ConnectClicked(func(_ bool) {
+- if l.username != "" {
+- if l.password != "" {
+- LoginErr := l.login()
+- if LoginErr != nil {
+- err = LoginErr
+- return
+- }
+- } else {
+- passwordInput.SetStyleSheet("border: 1px solid red")
++ if l.Username != "" && l.Password != "" {
++ LoginErr := l.login()
++ if LoginErr != nil {
++ err = LoginErr
++ return
+ }
+ } else {
+- usernameInput.SetStyleSheet("border: 1px solid red")
++ passwordInput.SetStyleSheet("border: 1px solid red")
+ }
+ })
+
+ usernameInput.ConnectKeyPressEvent(func(ev *gui.QKeyEvent) {
+ if int(ev.Key()) == int(core.Qt__Key_Enter) || int(ev.Key()) == int(core.Qt__Key_Return) {
+- if l.password != "" {
++ if l.Password != "" {
+ LoginErr := l.login()
+ if LoginErr != nil {
+ err = LoginErr
+@@ -126,7 +123,7 @@ func (l *LoginUI) NewUI() (err error) {
+
+ passwordInput.ConnectKeyPressEvent(func(ev *gui.QKeyEvent) {
+ if int(ev.Key()) == int(core.Qt__Key_Enter) || int(ev.Key()) == int(core.Qt__Key_Return) {
+- if l.username != "" {
++ if l.Username != "" {
+ LoginErr := l.login()
+ if LoginErr != nil {
+ err = LoginErr
+@@ -155,12 +152,12 @@ func (l *LoginUI) login() (err error) {
+
+ var wg sync.WaitGroup
+
+- if l.username != "" && l.password != "" {
++ if l.Username != "" && l.Password != "" {
+ log.Infoln("Starting Login Sequenze in background")
+ results := make(chan *gomatrix.Client)
+
+ wg.Add(1)
+- go matrix.DoLogin(l.username, l.password, "", "", "", results, &wg)
++ go matrix.DoLogin(l.Username, l.Password, "", "", "", results, &wg)
+
+ go func() {
+ wg.Wait() // wait for each execTask to return
+@@ -169,9 +166,8 @@ func (l *LoginUI) login() (err error) {
+
+ //Show MainUI
+ for result := range results {
+- //TODO Don't switch screen on wrong login data.
+- l.cli = result
+- MainUIStruct := NewMainUIStructWithExistingConfig(l.config, l.window)
++ l.Cli = result
++ MainUIStruct := NewMainUIStructWithExistingConfig(l.Config, l.window)
+ mainUIErr := MainUIStruct.NewUI()
+ if mainUIErr != nil {
+ err = mainUIErr
+diff --git a/ui/MainUI.go b/ui/MainUI.go
+index a5f8cfa..fc818ad 100644
+--- a/ui/MainUI.go
++++ b/ui/MainUI.go
+@@ -2,18 +2,24 @@ package ui
+
+ import (
+ "fmt"
++ "os"
++ "path/filepath"
+ "strconv"
+ "strings"
+ "sync"
+
+ "github.com/Nordgedanken/Morpheus/matrix"
+ "github.com/Nordgedanken/Morpheus/matrix/db"
++ "github.com/Nordgedanken/Morpheus/matrix/globalTypes"
++ "github.com/Nordgedanken/Morpheus/matrix/rooms"
+ "github.com/Nordgedanken/Morpheus/matrix/syncer"
++ "github.com/Nordgedanken/Morpheus/ui/listLayouts"
+ "github.com/dgraph-io/badger"
+ "github.com/matrix-org/gomatrix"
+ "github.com/opennota/linkify"
+ "github.com/pkg/errors"
+ "github.com/rhinoman/go-commonmark"
++ "github.com/shibukawa/configdir"
+ log "github.com/sirupsen/logrus"
+ "github.com/therecipe/qt/core"
+ "github.com/therecipe/qt/gui"
+@@ -22,32 +28,32 @@ import (
+ )
+
+ // NewMainUIStruct gives you a MainUI struct with prefilled data
+-func NewMainUIStruct(windowWidth, windowHeight int, window *widgets.QMainWindow) (mainUIStruct MainUI) {
+- configStruct := config{
+- windowWidth: windowWidth,
+- windowHeight: windowHeight,
++func NewMainUIStruct(windowWidth, windowHeight int, window *widgets.QMainWindow) (mainUIStruct *MainUI) {
++ configStruct := globalTypes.Config{
++ WindowWidth: windowWidth,
++ WindowHeight: windowHeight,
++ Rooms: make(map[string]*rooms.Room),
+ }
+- mainUIStruct = MainUI{
+- config: configStruct,
++ mainUIStruct = &MainUI{
++ Config: configStruct,
+ window: window,
+- rooms: make(map[string]*matrix.Room),
+ }
+ return
+ }
+
+ // NewMainUIStructWithExistingConfig gives you a MainUI struct with prefilled data and data from a previous Config
+-func NewMainUIStructWithExistingConfig(configStruct config, window *widgets.QMainWindow) (mainUIStruct MainUI) {
+- mainUIStruct = MainUI{
+- config: configStruct,
++func NewMainUIStructWithExistingConfig(configStruct globalTypes.Config, window *widgets.QMainWindow) (mainUIStruct *MainUI) {
++ configStruct.Rooms = make(map[string]*rooms.Room)
++ mainUIStruct = &MainUI{
++ Config: configStruct,
+ window: window,
+- rooms: make(map[string]*matrix.Room),
+ }
+ return
+ }
+
+ // SetCli allows you to add a gomatrix.Client to your MainUI struct
+ func (m *MainUI) SetCli(cli *gomatrix.Client) {
+- m.cli = cli
++ m.Cli = cli
+ }
+
+ // GetWidget gives you the widget of the MainUI struct
+@@ -58,38 +64,11 @@ func (m *MainUI) GetWidget() (widget *widgets.QWidget) {
+
+ // NewUI initializes a new Main Screen
+ func (m *MainUI) NewUI() (err error) {
+- m.widget = widgets.NewQWidget(nil, 0)
+-
+- var loader = uitools.NewQUiLoader(nil)
+- var file = core.NewQFile2(":/qml/ui/chat.ui")
+-
+- file.Open(core.QIODevice__ReadOnly)
+- m.MainWidget = loader.Load(file, m.widget)
+- file.Close()
+-
+- m.messageScrollArea = widgets.NewQScrollAreaFromPointer(m.widget.FindChild("messageScroll", core.Qt__FindChildrenRecursively).Pointer())
+- messagesScrollAreaContent := widgets.NewQWidgetFromPointer(m.widget.FindChild("messagesScrollAreaContent", core.Qt__FindChildrenRecursively).Pointer())
+- roomScrollArea := widgets.NewQScrollAreaFromPointer(m.widget.FindChild("roomScroll", core.Qt__FindChildrenRecursively).Pointer())
+- roomScrollAreaContent := widgets.NewQWidgetFromPointer(m.widget.FindChild("roomScrollAreaContent", core.Qt__FindChildrenRecursively).Pointer())
+-
+- m.RoomAvatar = widgets.NewQLabelFromPointer(m.widget.FindChild("roomAvatar", core.Qt__FindChildrenRecursively).Pointer())
+- m.RoomTitle = widgets.NewQLabelFromPointer(m.widget.FindChild("RoomTitle", core.Qt__FindChildrenRecursively).Pointer())
+- m.RoomTopic = widgets.NewQLabelFromPointer(m.widget.FindChild("Topic", core.Qt__FindChildrenRecursively).Pointer())
+-
+- var layout = widgets.NewQHBoxLayout()
+- m.window.SetLayout(layout)
+- layout.InsertWidget(0, m.MainWidget, 0, core.Qt__AlignTop|core.Qt__AlignLeft)
+- layout.SetSpacing(0)
+- layout.SetContentsMargins(0, 0, 0, 0)
+-
+- m.widget.ConnectResizeEvent(func(event *gui.QResizeEvent) {
+- m.MainWidget.Resize(event.Size())
+- event.Accept()
+- })
++ m.loadChatUIDefaults()
+
+ //Set Avatar
+ avatarLogo := widgets.NewQLabelFromPointer(m.widget.FindChild("UserAvatar", core.Qt__FindChildrenRecursively).Pointer())
+- avatar, AvatarErr := matrix.GetOwnUserAvatar(m.cli)
++ avatar, AvatarErr := matrix.GetOwnUserAvatar(m.Cli)
+ if AvatarErr != nil {
+ err = AvatarErr
+ return
+@@ -106,25 +85,12 @@ func (m *MainUI) NewUI() (err error) {
+ }
+ })
+
+- // Init Message View
+- m.MessageListLayout = NewMessageList(m.messageScrollArea, messagesScrollAreaContent)
+-
+- // Init Room View
+- roomListLayout := NewRoomList(roomScrollArea, roomScrollAreaContent)
+-
+- m.messageScrollArea.SetWidgetResizable(true)
+- m.messageScrollArea.SetHorizontalScrollBarPolicy(core.Qt__ScrollBarAlwaysOff)
+- m.messageScrollArea.SetContentsMargins(0, 0, 0, 0)
+- //messageScrollArea.SetSizeAdjustPolicy(widgets.QAbstractScrollArea__AdjustToContents)
+-
+- roomScrollArea.SetWidgetResizable(true)
+- roomScrollArea.SetHorizontalScrollBarPolicy(core.Qt__ScrollBarAlwaysOff)
+- roomScrollArea.SetContentsMargins(0, 0, 0, 0)
+- roomScrollArea.SetSizeAdjustPolicy(widgets.QAbstractScrollArea__AdjustToContents)
++ m.initScrolls()
+
+ m.MessageListLayout.ConnectTriggerMessage(func(messageBody, sender string, timestamp int64) {
++ log.Println("triggered Message")
+ var own bool
+- if sender == m.cli.UserID {
++ if sender == m.Cli.UserID {
+ own = true
+ } else {
+ own = false
+@@ -152,43 +118,24 @@ func (m *MainUI) NewUI() (err error) {
+ }
+ }
+ }
+- NewMessageErr := m.MessageListLayout.NewMessage(messageBody, m.cli, sender, timestamp, m.messageScrollArea, own, m)
+- if NewMessageErr != nil {
+- err = NewMessageErr
+- return
+- }
++ m.MessageListLayout.NewMessage(messageBody, m.Cli, sender, timestamp, m.messageScrollArea, own)
+ })
+
+- m.startSync()
++ go m.startSync()
+ m.widget.SetSizePolicy2(widgets.QSizePolicy__Expanding, widgets.QSizePolicy__Expanding)
+ m.MainWidget.SetSizePolicy2(widgets.QSizePolicy__Expanding, widgets.QSizePolicy__Expanding)
+
+- roomListLayout.ConnectTriggerRoom(func(roomID string) {
+- room := m.rooms[roomID]
++ m.RoomListLayout.ConnectTriggerRoom(func(roomID string) {
++ room := m.Rooms[roomID]
+
+- NewRoomErr := roomListLayout.NewRoom(room, roomScrollArea, m)
++ NewRoomErr := m.RoomListLayout.NewRoom(room, m.roomScrollArea)
+ if NewRoomErr != nil {
+ err = NewRoomErr
+ return
+ }
+ })
+
+- m.initRoomList(roomListLayout, roomScrollArea)
+-
+- go m.loadCache()
+-
+- m.MainWidget.SetWindowTitle("Morpheus - " + m.rooms[m.currentRoom].GetRoomTopic())
+-
+- avatar, roomAvatarErr := m.rooms[m.currentRoom].GetRoomAvatar()
+- if roomAvatarErr != nil {
+- err = roomAvatarErr
+- return
+- }
+- m.RoomAvatar.SetPixmap(avatar)
+-
+- m.RoomTitle.SetText(m.rooms[m.currentRoom].GetRoomName())
+-
+- m.RoomTopic.SetText(m.rooms[m.currentRoom].GetRoomTopic())
++ go m.initRoomList()
+
+ var message string
+ messageInput := widgets.NewQLineEditFromPointer(m.widget.FindChild("MessageInput", core.Qt__FindChildrenRecursively).Pointer())
+@@ -198,11 +145,7 @@ func (m *MainUI) NewUI() (err error) {
+
+ m.window.ConnectKeyPressEvent(func(ev *gui.QKeyEvent) {
+ if int(ev.Key()) == int(core.Qt__Key_Enter) || int(ev.Key()) == int(core.Qt__Key_Return) {
+- MessageErr := m.sendMessage(message)
+- if MessageErr != nil {
+- err = MessageErr
+- return
+- }
++ go m.sendMessage(message)
+
+ messageInput.Clear()
+ ev.Accept()
+@@ -210,11 +153,84 @@ func (m *MainUI) NewUI() (err error) {
+ messageInput.KeyPressEventDefault(ev)
+ ev.Ignore()
+ }
++ return
++ })
++
++ m.RoomListLayout.ConnectChangeRoom(func(roomID string) {
++ room := m.Rooms[roomID]
++ roomAvatar, roomAvatarErr := room.GetRoomAvatar()
++ if roomAvatarErr != nil {
++ err = roomAvatarErr
++ return
++ }
++ if m.CurrentRoom != room.RoomID {
++ m.SetCurrentRoom(room.RoomID)
++ m.MainWidget.SetWindowTitle("Morpheus - " + room.GetRoomTopic())
++
++ m.RoomAvatar.SetPixmap(roomAvatar)
++
++ m.RoomTitle.SetText(room.GetRoomName())
++
++ m.RoomTopic.SetText(room.GetRoomTopic())
++ count := m.MessageListLayout.Count()
++ for i := 0; i < count; i++ {
++ widgetScroll := m.MessageListLayout.ItemAt(i).Widget()
++ widgetScroll.DeleteLater()
++ }
++
++ log.Println("next loadCache")
++ go m.loadCache()
++ }
+ })
+
+ return
+ }
+
++func (m *MainUI) initScrolls() {
++ // Init Message View
++ m.MessageListLayout = listLayouts.NewMessageList(m.messageScrollArea)
++
++ // Init Room View
++ m.RoomListLayout = listLayouts.NewRoomList(m.roomScrollArea)
++
++ m.messageScrollArea.SetWidgetResizable(true)
++ m.messageScrollArea.SetHorizontalScrollBarPolicy(core.Qt__ScrollBarAlwaysOff)
++ m.messageScrollArea.SetContentsMargins(0, 0, 0, 0)
++
++ m.roomScrollArea.SetWidgetResizable(true)
++ m.roomScrollArea.SetHorizontalScrollBarPolicy(core.Qt__ScrollBarAlwaysOff)
++ m.roomScrollArea.SetContentsMargins(0, 0, 0, 0)
++}
++
++func (m *MainUI) loadChatUIDefaults() {
++ m.widget = widgets.NewQWidget(nil, 0)
++
++ var loader = uitools.NewQUiLoader(nil)
++ var file = core.NewQFile2(":/qml/ui/chat.ui")
++
++ file.Open(core.QIODevice__ReadOnly)
++ m.MainWidget = loader.Load(file, m.widget)
++ file.Close()
++
++ m.messageScrollArea = widgets.NewQScrollAreaFromPointer(m.widget.FindChild("messageScroll", core.Qt__FindChildrenRecursively).Pointer())
++ m.roomScrollArea = widgets.NewQScrollAreaFromPointer(m.widget.FindChild("roomScroll", core.Qt__FindChildrenRecursively).Pointer())
++
++ m.RoomAvatar = widgets.NewQLabelFromPointer(m.widget.FindChild("roomAvatar", core.Qt__FindChildrenRecursively).Pointer())
++ m.RoomTitle = widgets.NewQLabelFromPointer(m.widget.FindChild("RoomTitle", core.Qt__FindChildrenRecursively).Pointer())
++ m.RoomTopic = widgets.NewQLabelFromPointer(m.widget.FindChild("Topic", core.Qt__FindChildrenRecursively).Pointer())
++
++ var layout = widgets.NewQHBoxLayout()
++ m.window.SetLayout(layout)
++ layout.InsertWidget(0, m.MainWidget, 0, core.Qt__AlignTop|core.Qt__AlignLeft)
++ layout.SetSpacing(0)
++ layout.SetContentsMargins(0, 0, 0, 0)
++
++ m.widget.ConnectResizeEvent(func(event *gui.QResizeEvent) {
++ m.MainWidget.Resize(event.Size())
++ event.Accept()
++ })
++}
++
+ func (m *MainUI) sendMessage(message string) (err error) {
+ messageOriginal := message
+ lm := linkify.Links(message)
+@@ -225,13 +241,13 @@ func (m *MainUI) sendMessage(message string) (err error) {
+
+ mardownMessage := commonmark.Md2Html(message, 0)
+ if mardownMessage == message {
+- _, SendErr := m.cli.SendMessageEvent(m.currentRoom, "m.room.message", matrix.HTMLMessage{MsgType: "m.text", Body: messageOriginal, FormattedBody: message, Format: "org.matrix.custom.html"})
++ _, SendErr := m.Cli.SendMessageEvent(m.CurrentRoom, "m.room.message", matrix.HTMLMessage{MsgType: "m.text", Body: messageOriginal, FormattedBody: message, Format: "org.matrix.custom.html"})
+ if SendErr != nil {
+ err = SendErr
+ return
+ }
+ } else {
+- _, SendErr := m.cli.SendMessageEvent(m.currentRoom, "m.room.message", matrix.HTMLMessage{MsgType: "m.text", Body: message, FormattedBody: mardownMessage, Format: "org.matrix.custom.html"})
++ _, SendErr := m.Cli.SendMessageEvent(m.CurrentRoom, "m.room.message", matrix.HTMLMessage{MsgType: "m.text", Body: message, FormattedBody: mardownMessage, Format: "org.matrix.custom.html"})
+ if SendErr != nil {
+ err = SendErr
+ return
+@@ -241,7 +257,6 @@ func (m *MainUI) sendMessage(message string) (err error) {
+ }
+
+ func (m *MainUI) logout(widget *widgets.QWidget, messageScrollArea *widgets.QScrollArea) (err error) {
+- //TODO register enter and show loader or so
+ log.Infoln("Starting Logout Sequence in background")
+ var wg sync.WaitGroup
+ results := make(chan bool)
+@@ -249,6 +264,7 @@ func (m *MainUI) logout(widget *widgets.QWidget, messageScrollArea *widgets.QScr
+ wg.Add(1)
+ go func(cli *gomatrix.Client, results chan<- bool) {
+ defer wg.Done()
++ cli.StopSync()
+ _, LogoutErr := cli.Logout()
+ if LogoutErr != nil {
+ log.Errorln(LogoutErr)
+@@ -260,29 +276,18 @@ func (m *MainUI) logout(widget *widgets.QWidget, messageScrollArea *widgets.QScr
+ if DBOpenErr != nil {
+ log.Errorln(DBOpenErr)
+ }
++ userDB.Close()
+
+- //Flush complete DB
+- txn := userDB.NewTransaction(true) // Read-write txn
+- QueryErr := txn.Delete([]byte(""))
+- if QueryErr != nil {
+- log.Errorln(QueryErr)
+- results <- false
+- }
+-
+- CommitErr := txn.Commit(nil)
+- if CommitErr != nil {
+- log.Errorln(CommitErr)
++ configDirs := configdir.New("Nordgedanken", "Morpheus")
++ filePath := filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)
++ DeleteErr := os.RemoveAll(filePath + "/data/user/")
++ if DeleteErr != nil {
++ log.Errorln(DeleteErr)
+ results <- false
+ }
+-
+- DBPurgeErr := userDB.PurgeOlderVersions()
+- if DBPurgeErr != nil {
+- log.Errorln(DBPurgeErr)
+- results <- false
+- } else {
+- results <- true
+- }
+- }(m.cli, results)
++ db.ResetOnceUser()
++ results <- true
++ }(m.Cli, results)
+
+ go func() {
+ wg.Wait() // wait for each execTask to return
+@@ -297,7 +302,7 @@ func (m *MainUI) logout(widget *widgets.QWidget, messageScrollArea *widgets.QScr
+ widget.DisconnectResizeEvent()
+ messageScrollArea.DisconnectResizeEvent()
+
+- LoginUIStruct := NewLoginUIStructWithExistingConfig(m.config, m.window)
++ LoginUIStruct := NewLoginUIStructWithExistingConfig(m.Config, m.window)
+ loginUIErr := LoginUIStruct.NewUI()
+ if loginUIErr != nil {
+ err = loginUIErr
+@@ -321,16 +326,16 @@ func (m *MainUI) startSync() (err error) {
+ })
+ m.storage = &syncer.MorpheusStore{
+ InMemoryStore: *gomatrix.NewInMemoryStore(),
+- CacheDatabase: m.cacheDB,
++ CacheDatabase: m.CacheDB,
+ }
+
+- m.syncer = syncer.NewMorpheusSyncer(m.cli.UserID, m.storage)
++ Syncer := syncer.NewMorpheusSyncer(m.Cli.UserID, m.storage)
+
+- m.cli.Store = m.storage
+- m.cli.Syncer = m.syncer
+- m.syncer.Store = m.storage
++ m.Cli.Store = m.storage
++ m.Cli.Syncer = Syncer
++ Syncer.Store = m.storage
+
+- m.syncer.OnEventType("m.room.message", func(ev *gomatrix.Event) {
++ Syncer.OnEventType("m.room.message", func(ev *gomatrix.Event) {
+ formattedBody, _ := ev.Content["formatted_body"]
+ var msg string
+ msg, _ = formattedBody.(string)
+@@ -342,17 +347,38 @@ func (m *MainUI) startSync() (err error) {
+ id := ev.ID
+ timestamp := ev.Timestamp
+ go db.CacheMessageEvents(id, sender, room, msg, timestamp)
+- if room == m.currentRoom {
++ if room == m.CurrentRoom {
+ go m.MessageListLayout.TriggerMessage(msg, sender, timestamp)
+ }
+ })
+
++ Syncer.OnEventType("m.room.name", func(ev *gomatrix.Event) {
++ roomNameRaw, _ := ev.Content["name"]
++ var roomName string
++ roomName, _ = roomNameRaw.(string)
++ evType := ev.Type
++ room := ev.RoomID
++ go m.Rooms[room].UpdateRoomNameByEvent(roomName, evType)
++ })
++
++ Syncer.OnEventType("m.room.name", func(ev *gomatrix.Event) {
++ roomNameRaw, _ := ev.Content["name"]
++ var roomName string
++ roomName, _ = roomNameRaw.(string)
++ evType := ev.Type
++ room := ev.RoomID
++ go m.Rooms[room].UpdateRoomNameByEvent(roomName, evType)
++ })
++
+ // Start Non-blocking sync
+ go func() {
+ log.Infoln("Start sync")
+ for {
+-
+- if e := m.cli.Sync(); e != nil {
++ e := m.Cli.Sync()
++ if e == nil {
++ break
++ }
++ if e != nil {
+ err = e
+ }
+ }
+@@ -360,21 +386,21 @@ func (m *MainUI) startSync() (err error) {
+ return
+ }
+
+-func (m *MainUI) initRoomList(roomListLayout *QRoomVBoxLayoutWithTriggerSlot, roomScrollArea *widgets.QScrollArea) (err error) {
+- rooms, ReqErr := m.cli.JoinedRooms()
+- if ReqErr != nil {
+- err = ReqErr
++func (m *MainUI) initRoomList() (err error) {
++ roomsStruct, roomsErr := rooms.GetRooms(m.Cli)
++ if roomsErr != nil {
++ err = roomsErr
+ return
+ }
+
+- x := 0
+- for _, roomID := range rooms.JoinedRooms {
+- if x == 0 {
+- m.currentRoom = roomID
++ first := true
++ for _, roomID := range roomsStruct {
++ m.Rooms[roomID] = rooms.NewRoom(roomID, m.Cli)
++ m.RoomListLayout.TriggerRoom(roomID)
++ if first {
++ go m.RoomListLayout.ChangeRoom(roomID)
+ }
+- x++
+- m.rooms[roomID] = matrix.NewRoom(roomID, m.cli)
+- roomListLayout.TriggerRoom(roomID)
++ first = false
+ }
+
+ return
+@@ -406,7 +432,7 @@ func (m *MainUI) loadCache() (err error) {
+ MsgOpts := badger.DefaultIteratorOptions
+ MsgOpts.PrefetchSize = 10
+ MsgIt := txn.NewIterator(MsgOpts)
+- MsgPrefix := []byte("room|" + m.currentRoom + "|messages|")
++ MsgPrefix := []byte("room|" + m.CurrentRoom + "|messages")
+
+ var doneMsg []string
+
+@@ -414,203 +440,47 @@ func (m *MainUI) loadCache() (err error) {
+ item := MsgIt.Item()
+ key := item.Key()
+ stringKey := fmt.Sprintf("%s", key)
++ stringKeySlice := strings.Split(stringKey, "|")
++ stringKeyEnd := stringKeySlice[len(stringKeySlice)-1]
++ if stringKeyEnd != "id" {
++ continue
++ }
++
+ value, ValueErr := item.Value()
+ if ValueErr != nil {
+ return ValueErr
+ }
+- stringValue := fmt.Sprintf("%s", value)
+-
+- if strings.HasSuffix(stringKey, "|id") {
+- if !contains(doneMsg, stringValue) {
+- // Remember we already added this message to the view
+- doneMsg = append(doneMsg, stringValue)
+-
+- // Get all Data
+- senderItem, senderErr := txn.Get([]byte(strings.Replace(stringKey, "|id", "|sender", -1)))
+- if senderErr != nil {
+- return errors.WithMessage(senderErr, "Key: "+strings.Replace(stringKey, "|id", "|sender", -1))
+- }
+-
+- senderValue, senderValueErr := senderItem.Value()
+- if senderValueErr != nil {
+- return senderValueErr
+- }
+- sender := fmt.Sprintf("%s", senderValue)
+-
+- messageItem, messageErr := txn.Get([]byte(strings.Replace(stringKey, "|id", "|messageString", -1)))
+- if messageErr != nil {
+- return errors.WithMessage(messageErr, "Key: "+strings.Replace(stringKey, "|id", "|messageString", -1))
+- }
+-
+- messageValue, messageValueErr := messageItem.Value()
+- if messageValueErr != nil {
+- return messageValueErr
+- }
+- msg := fmt.Sprintf("%s", messageValue)
+-
+- timestampItem, timestampErr := txn.Get([]byte(strings.Replace(stringKey, "|id", "|timestamp", -1)))
+- if timestampErr != nil {
+- return errors.WithMessage(timestampErr, "Key: "+strings.Replace(stringKey, "|id", "|timestamp", -1))
+- }
+-
+- timestampValue, timestampValueErr := timestampItem.Value()
+- if timestampValueErr != nil {
+- return timestampValueErr
+- }
+- timestamp := fmt.Sprintf("%s", timestampValue)
+- timestampInt, ConvErr := strconv.ParseInt(timestamp, 10, 64)
+- if ConvErr != nil {
+- return ConvErr
+- }
+-
+- m.MessageListLayout.TriggerMessage(msg, sender, timestampInt)
+- }
+- }
++ idValue := fmt.Sprintf("%s", value)
+
+- if strings.HasSuffix(stringKey, "|sender") {
+- idItem, idErr := txn.Get([]byte(strings.Replace(stringKey, "|sender", "|id", -1)))
+- if idErr != nil {
+- return errors.WithMessage(idErr, "Key: "+strings.Replace(stringKey, "|sender", "|id", -1))
+- }
+- idValue, idValueErr := idItem.Value()
+- if idValueErr != nil {
+- return idValueErr
+- }
+- id := fmt.Sprintf("%s", idValue)
+-
+- if !contains(doneMsg, id) {
+- // Remember we already added this message to the view
+- doneMsg = append(doneMsg, id)
+-
+- // Get all Data
+- sender := stringValue
+-
+- messageItem, messageErr := txn.Get([]byte(strings.Replace(stringKey, "|sender", "|messageString", -1)))
+- if messageErr != nil {
+- return errors.WithMessage(messageErr, "Key: "+strings.Replace(stringKey, "|sender", "|messageString", -1))
+- }
++ if !contains(doneMsg, idValue) {
++ // Remember we already added this message to the view
++ doneMsg = append(doneMsg, idValue)
+
+- messageValue, messageValueErr := messageItem.Value()
+- if messageValueErr != nil {
+- return messageValueErr
+- }
+- msg := fmt.Sprintf("%s", messageValue)
+-
+- timestampItem, timestampErr := txn.Get([]byte(strings.Replace(stringKey, "|sender", "|timestamp", -1)))
+- if timestampErr != nil {
+- return errors.WithMessage(timestampErr, "Key: "+strings.Replace(stringKey, "|sender", "|timestamp", -1))
+- }
+-
+- timestampValue, timestampValueErr := timestampItem.Value()
+- if timestampValueErr != nil {
+- return timestampValueErr
+- }
+- timestamp := fmt.Sprintf("%s", timestampValue)
+-
+- timestampInt, ConvErr := strconv.ParseInt(timestamp, 10, 64)
+- if ConvErr != nil {
+- return ConvErr
+- }
+-
+- m.MessageListLayout.TriggerMessage(msg, sender, timestampInt)
+- }
+- }
+-
+- if strings.HasSuffix(stringKey, "|messageString") {
+- idItem, idErr := txn.Get([]byte(strings.Replace(stringKey, "|messageString", "|id", -1)))
+- if idErr != nil {
+- return errors.WithMessage(idErr, "Key: "+strings.Replace(stringKey, "|messageString", "|id", -1))
++ // Get all Data
++ senderResult, QueryErr := db.Get(txn, []byte(strings.Replace(stringKey, "|id", "|sender", -1)))
++ if QueryErr != nil {
++ return errors.WithMessage(QueryErr, "Key: "+strings.Replace(stringKey, "|id", "|sender", -1))
+ }
++ sender := fmt.Sprintf("%s", senderResult)
+
+- idValue, idValueErr := idItem.Value()
+- if idValueErr != nil {
+- return idValueErr
++ msgResult, QueryErr := db.Get(txn, []byte(strings.Replace(stringKey, "|id", "|messageString", -1)))
++ if QueryErr != nil {
++ return errors.WithMessage(QueryErr, "Key: "+strings.Replace(stringKey, "|id", "|messageString", -1))
+ }
+- id := fmt.Sprintf("%s", idValue)
+-
+- if !contains(doneMsg, id) {
+- // Remember we already added this message to the view
+- doneMsg = append(doneMsg, id)
+-
+- // Get all Data
+- senderItem, senderErr := txn.Get([]byte(strings.Replace(stringKey, "|messageString", "|sender", -1)))
+- if senderErr != nil {
+- return errors.WithMessage(senderErr, "Key: "+strings.Replace(stringKey, "|messageString", "|sender", -1))
+- }
+-
+- senderValue, senderValueErr := senderItem.Value()
+- if senderValueErr != nil {
+- return senderValueErr
+- }
+- sender := fmt.Sprintf("%s", senderValue)
+-
+- msg := stringValue
+-
+- timestampItem, timestampErr := txn.Get([]byte(strings.Replace(stringKey, "|messageString", "|timestamp", -1)))
+- if timestampErr != nil {
+- return errors.WithMessage(timestampErr, "Key: "+strings.Replace(stringKey, "|messageString", "|timestamp", -1))
+- }
+-
+- timestampValue, timestampValueErr := timestampItem.Value()
+- if timestampValueErr != nil {
+- return timestampValueErr
+- }
+- timestamp := fmt.Sprintf("%s", timestampValue)
++ msg := fmt.Sprintf("%s", msgResult)
+
+- timestampInt, ConvErr := strconv.ParseInt(timestamp, 10, 64)
+- if ConvErr != nil {
+- return ConvErr
+- }
+-
+- m.MessageListLayout.TriggerMessage(msg, sender, timestampInt)
++ timestampResult, QueryErr := db.Get(txn, []byte(strings.Replace(stringKey, "|id", "|timestamp", -1)))
++ if QueryErr != nil {
++ return errors.WithMessage(QueryErr, "Key: "+strings.Replace(stringKey, "|id", "|timestamp", -1))
+ }
+- }
++ timestamp := fmt.Sprintf("%s", timestampResult)
+
+- if strings.HasSuffix(stringKey, "|timestamp") {
+- idItem, idErr := txn.Get([]byte(strings.Replace(stringKey, "|timestamp", "|id", -1)))
+- if idErr != nil {
+- return errors.WithMessage(idErr, "Key: "+strings.Replace(stringKey, "|timestamp", "|id", -1))
++ timestampInt, ConvErr := strconv.ParseInt(timestamp, 10, 64)
++ if ConvErr != nil {
++ return errors.WithMessage(ConvErr, "Timestamp String: "+timestamp)
+ }
+- idValue, idValueErr := idItem.Value()
+- if idValueErr != nil {
+- return idValueErr
+- }
+- id := fmt.Sprintf("%s", idValue)
+-
+- if !contains(doneMsg, id) {
+- // Remember we already added this message to the view
+- doneMsg = append(doneMsg, id)
+
+- // Get all Data
+- senderItem, senderErr := txn.Get([]byte(strings.Replace(stringKey, "|timestamp", "|sender", -1)))
+- if senderErr != nil {
+- return errors.WithMessage(senderErr, "Key: "+strings.Replace(stringKey, "|timestamp", "|sender", -1))
+- }
+- senderValue, senderValueErr := senderItem.Value()
+- if senderValueErr != nil {
+- return senderValueErr
+- }
+- sender := fmt.Sprintf("%s", senderValue)
+-
+- messageItem, messageErr := txn.Get([]byte(strings.Replace(stringKey, "|timestamp", "|messageString", -1)))
+- if messageErr != nil {
+- return errors.WithMessage(messageErr, "Key: "+strings.Replace(stringKey, "|timestamp", "|messageString", -1))
+- }
+- messageValue, messageValueErr := messageItem.Value()
+- if messageValueErr != nil {
+- return messageValueErr
+- }
+- msg := fmt.Sprintf("%s", messageValue)
+-
+- timestamp := stringValue
+-
+- timestampInt, ConvErr := strconv.ParseInt(timestamp, 10, 64)
+- if ConvErr != nil {
+- return ConvErr
+- }
+-
+- m.MessageListLayout.TriggerMessage(msg, sender, timestampInt)
+- }
++ go m.MessageListLayout.TriggerMessage(msg, sender, timestampInt)
+ }
+ }
+
+@@ -623,6 +493,7 @@ func (m *MainUI) loadCache() (err error) {
+ }
+
+ if barAtBottom {
++ bar.Update()
+ bar.SetValue(bar.Maximum())
+ }
+
+diff --git a/ui/messageList.go b/ui/listLayouts/messageList.go
+similarity index 80%
+rename from ui/messageList.go
+rename to ui/listLayouts/messageList.go
+index e5a3c6c..90a6a6b 100644
+--- a/ui/messageList.go
++++ b/ui/listLayouts/messageList.go
+@@ -1,4 +1,4 @@
+-package ui
++package listLayouts
+
+ import (
+ "time"
+@@ -6,7 +6,9 @@ import (
+ "github.com/Nordgedanken/Morpheus/matrix"
+ "github.com/matrix-org/gomatrix"
+ "github.com/rhinoman/go-commonmark"
++ log "github.com/sirupsen/logrus"
+ "github.com/therecipe/qt/core"
++ "github.com/therecipe/qt/gui"
+ "github.com/therecipe/qt/uitools"
+ "github.com/therecipe/qt/widgets"
+ )
+@@ -26,17 +28,17 @@ import (
+ type QVBoxLayoutWithTriggerSlot struct {
+ widgets.QVBoxLayout
+
+- _ func(messageBody, sender string, timestamp int64) `slot:"TriggerMessage"`
++ _ func(messageBody, sender string, timestamp int64) `signal:"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)
++func NewMessageList(scrollArea *widgets.QScrollArea) (messageViewLayout *QVBoxLayoutWithTriggerSlot) {
++ messageViewLayout = NewQVBoxLayoutWithTriggerSlot2(scrollArea.Widget())
+
+ messageViewLayout.SetSpacing(0)
+- messageViewLayout.SetContentsMargins(0, 0, 0, 0)
+- messageView.SetContentsMargins(0, 0, 0, 0)
+- scrollArea.SetWidget(messageView)
++ messageViewLayout.AddStretch(1)
++ messageViewLayout.SetContentsMargins(15, 0, 15, 15)
++ scrollArea.Widget().SetContentsMargins(0, 0, 0, 0)
+ scrollArea.SetAlignment(core.Qt__AlignLeading | core.Qt__AlignLeft | core.Qt__AlignVCenter)
+ scrollArea.Widget().SetLayout(messageViewLayout)
+
+@@ -44,7 +46,7 @@ func NewMessageList(scrollArea *widgets.QScrollArea, messageView *widgets.QWidge
+ }
+
+ // NewMessage adds a new message object to the view
+-func (messageViewLayout *QVBoxLayoutWithTriggerSlot) NewMessage(body string, cli *gomatrix.Client, sender string, timestamp int64, scrollArea *widgets.QScrollArea, own bool, mainUIStruct *MainUI) (err error) {
++func (messageViewLayout *QVBoxLayoutWithTriggerSlot) NewMessage(body string, cli *gomatrix.Client, sender string, timestamp int64, scrollArea *widgets.QScrollArea, own bool) (err error) {
+ barAtBottom := false
+ bar := scrollArea.VerticalScrollBar()
+ if bar.Value() == bar.Maximum() {
+@@ -94,6 +96,21 @@ func (messageViewLayout *QVBoxLayoutWithTriggerSlot) NewMessage(body string, cli
+ }
+ senderContent.SetText(senderDisplayName)
+ timestampContent.SetText(timestampString)
++
++ avatarNew := gui.NewQPixmap()
++ avatarLogo.ConnectPaintEvent(func(event *gui.QPaintEvent) {
++ log.Println("PaintEventAvatar")
++ painter := gui.NewQPainter2(avatarLogo)
++
++ aWidth := 61 / 2
++ aHeight := 61 / 2
++
++ painter.DrawEllipse3(aWidth, aHeight, 61.0, 61.0)
++ painter.DrawPixmap2(avatarLogo.Rect(), avatarNew, avatar.Rect())
++ //avatarLogo.Update()
++ avatarLogo.SetPixmap(avatarNew)
++ })
++
+ avatarLogo.SetPixmap(avatar)
+
+ var lineLength int
+diff --git a/ui/listLayouts/moc.cpp b/ui/listLayouts/moc.cpp
+new file mode 100644
+index 0000000..72b0ed7
+--- /dev/null
++++ b/ui/listLayouts/moc.cpp
+@@ -0,0 +1,706 @@
++
++
++#define protected public
++#define private public
++
++#include "moc.h"
++#include "_cgo_export.h"
++
++#include <QByteArray>
++#include <QChildEvent>
++#include <QEvent>
++#include <QLayout>
++#include <QLayoutItem>
++#include <QList>
++#include <QMetaMethod>
++#include <QObject>
++#include <QRect>
++#include <QSize>
++#include <QSizePolicy>
++#include <QSpacerItem>
++#include <QString>
++#include <QTime>
++#include <QTimer>
++#include <QTimerEvent>
++#include <QVBoxLayout>
++#include <QWidget>
++
++
++class QRoomVBoxLayoutWithTriggerSlot: public QVBoxLayout
++{
++Q_OBJECT
++public:
++ QRoomVBoxLayoutWithTriggerSlot() : QVBoxLayout() {qRegisterMetaType<quintptr>("quintptr");QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaType();QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaTypes();callbackQRoomVBoxLayoutWithTriggerSlot_Constructor(this);};
++ QRoomVBoxLayoutWithTriggerSlot(QWidget *parent) : QVBoxLayout(parent) {qRegisterMetaType<quintptr>("quintptr");QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaType();QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaTypes();callbackQRoomVBoxLayoutWithTriggerSlot_Constructor(this);};
++ void Signal_TriggerRoom(QString roomID) { QByteArray tdf131c = roomID.toUtf8(); Moc_PackedString roomIDPacked = { const_cast<char*>(tdf131c.prepend("WHITESPACE").constData()+10), tdf131c.size()-10 };callbackQRoomVBoxLayoutWithTriggerSlot_TriggerRoom(this, roomIDPacked); };
++ void Signal_ChangeRoom(QString roomID) { QByteArray tdf131c = roomID.toUtf8(); Moc_PackedString roomIDPacked = { const_cast<char*>(tdf131c.prepend("WHITESPACE").constData()+10), tdf131c.size()-10 };callbackQRoomVBoxLayoutWithTriggerSlot_ChangeRoom(this, roomIDPacked); };
++ QLayoutItem * takeAt(int index) { return static_cast<QLayoutItem*>(callbackQRoomVBoxLayoutWithTriggerSlot_TakeAt(this, index)); };
++ void addItem(QLayoutItem * item) { callbackQRoomVBoxLayoutWithTriggerSlot_AddItem(this, item); };
++ void invalidate() { callbackQRoomVBoxLayoutWithTriggerSlot_Invalidate(this); };
++ void setGeometry(const QRect & r) { callbackQRoomVBoxLayoutWithTriggerSlot_SetGeometry(this, const_cast<QRect*>(&r)); };
++ QLayoutItem * itemAt(int index) const { return static_cast<QLayoutItem*>(callbackQRoomVBoxLayoutWithTriggerSlot_ItemAt(const_cast<void*>(static_cast<const void*>(this)), index)); };
++ QSize maximumSize() const { return *static_cast<QSize*>(callbackQRoomVBoxLayoutWithTriggerSlot_MaximumSize(const_cast<void*>(static_cast<const void*>(this)))); };
++ QSize minimumSize() const { return *static_cast<QSize*>(callbackQRoomVBoxLayoutWithTriggerSlot_MinimumSize(const_cast<void*>(static_cast<const void*>(this)))); };
++ QSize sizeHint() const { return *static_cast<QSize*>(callbackQRoomVBoxLayoutWithTriggerSlot_SizeHint(const_cast<void*>(static_cast<const void*>(this)))); };
++ Qt::Orientations expandingDirections() const { return static_cast<Qt::Orientation>(callbackQRoomVBoxLayoutWithTriggerSlot_ExpandingDirections(const_cast<void*>(static_cast<const void*>(this)))); };
++ bool hasHeightForWidth() const { return callbackQRoomVBoxLayoutWithTriggerSlot_HasHeightForWidth(const_cast<void*>(static_cast<const void*>(this))) != 0; };
++ int count() const { return callbackQRoomVBoxLayoutWithTriggerSlot_Count(const_cast<void*>(static_cast<const void*>(this))); };
++ int heightForWidth(int w) const { return callbackQRoomVBoxLayoutWithTriggerSlot_HeightForWidth(const_cast<void*>(static_cast<const void*>(this)), w); };
++ int minimumHeightForWidth(int w) const { return callbackQRoomVBoxLayoutWithTriggerSlot_MinimumHeightForWidth(const_cast<void*>(static_cast<const void*>(this)), w); };
++ QLayout * layout() { return static_cast<QLayout*>(callbackQRoomVBoxLayoutWithTriggerSlot_Layout(this)); };
++ void childEvent(QChildEvent * e) { callbackQRoomVBoxLayoutWithTriggerSlot_ChildEvent(this, e); };
++ QRect geometry() const { return *static_cast<QRect*>(callbackQRoomVBoxLayoutWithTriggerSlot_Geometry(const_cast<void*>(static_cast<const void*>(this)))); };
++ QSizePolicy::ControlTypes controlTypes() const { return static_cast<QSizePolicy::ControlType>(callbackQRoomVBoxLayoutWithTriggerSlot_ControlTypes(const_cast<void*>(static_cast<const void*>(this)))); };
++ bool isEmpty() const { return callbackQRoomVBoxLayoutWithTriggerSlot_IsEmpty(const_cast<void*>(static_cast<const void*>(this))) != 0; };
++ int indexOf(QWidget * widget) const { return callbackQRoomVBoxLayoutWithTriggerSlot_IndexOf(const_cast<void*>(static_cast<const void*>(this)), widget); };
++ bool event(QEvent * e) { return callbackQRoomVBoxLayoutWithTriggerSlot_Event(this, e) != 0; };
++ bool eventFilter(QObject * watched, QEvent * event) { return callbackQRoomVBoxLayoutWithTriggerSlot_EventFilter(this, watched, event) != 0; };
++ void connectNotify(const QMetaMethod & sign) { callbackQRoomVBoxLayoutWithTriggerSlot_ConnectNotify(this, const_cast<QMetaMethod*>(&sign)); };
++ void customEvent(QEvent * event) { callbackQRoomVBoxLayoutWithTriggerSlot_CustomEvent(this, event); };
++ void deleteLater() { callbackQRoomVBoxLayoutWithTriggerSlot_DeleteLater(this); };
++ void Signal_Destroyed(QObject * obj) { callbackQRoomVBoxLayoutWithTriggerSlot_Destroyed(this, obj); };
++ void disconnectNotify(const QMetaMethod & sign) { callbackQRoomVBoxLayoutWithTriggerSlot_DisconnectNotify(this, const_cast<QMetaMethod*>(&sign)); };
++ void Signal_ObjectNameChanged(const QString & objectName) { QByteArray taa2c4f = objectName.toUtf8(); Moc_PackedString objectNamePacked = { const_cast<char*>(taa2c4f.prepend("WHITESPACE").constData()+10), taa2c4f.size()-10 };callbackQRoomVBoxLayoutWithTriggerSlot_ObjectNameChanged(this, objectNamePacked); };
++ void timerEvent(QTimerEvent * event) { callbackQRoomVBoxLayoutWithTriggerSlot_TimerEvent(this, event); };
++
++ QSpacerItem * spacerItem() { return static_cast<QSpacerItem*>(callbackQRoomVBoxLayoutWithTriggerSlot_SpacerItem(this)); };
++ QWidget * widget() { return static_cast<QWidget*>(callbackQRoomVBoxLayoutWithTriggerSlot_Widget(this)); };
++signals:
++ void TriggerRoom(QString roomID);
++ void ChangeRoom(QString roomID);
++public slots:
++private:
++};
++
++Q_DECLARE_METATYPE(QRoomVBoxLayoutWithTriggerSlot*)
++
++
++void QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaTypes() {
++}
++
++class QVBoxLayoutWithTriggerSlot: public QVBoxLayout
++{
++Q_OBJECT
++public:
++ QVBoxLayoutWithTriggerSlot() : QVBoxLayout() {qRegisterMetaType<quintptr>("quintptr");QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaType();QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaTypes();callbackQVBoxLayoutWithTriggerSlot_Constructor(this);};
++ QVBoxLayoutWithTriggerSlot(QWidget *parent) : QVBoxLayout(parent) {qRegisterMetaType<quintptr>("quintptr");QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaType();QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaTypes();callbackQVBoxLayoutWithTriggerSlot_Constructor(this);};
++ void Signal_TriggerMessage(QString messageBody, QString sender, qint64 timestamp) { QByteArray t59bf16 = messageBody.toUtf8(); Moc_PackedString messageBodyPacked = { const_cast<char*>(t59bf16.prepend("WHITESPACE").constData()+10), t59bf16.size()-10 };QByteArray tacc6a3 = sender.toUtf8(); Moc_PackedString senderPacked = { const_cast<char*>(tacc6a3.prepend("WHITESPACE").constData()+10), tacc6a3.size()-10 };callbackQVBoxLayoutWithTriggerSlot_TriggerMessage(this, messageBodyPacked, senderPacked, timestamp); };
++ QLayoutItem * takeAt(int index) { return static_cast<QLayoutItem*>(callbackQVBoxLayoutWithTriggerSlot_TakeAt(this, index)); };
++ void addItem(QLayoutItem * item) { callbackQVBoxLayoutWithTriggerSlot_AddItem(this, item); };
++ void invalidate() { callbackQVBoxLayoutWithTriggerSlot_Invalidate(this); };
++ void setGeometry(const QRect & r) { callbackQVBoxLayoutWithTriggerSlot_SetGeometry(this, const_cast<QRect*>(&r)); };
++ QLayoutItem * itemAt(int index) const { return static_cast<QLayoutItem*>(callbackQVBoxLayoutWithTriggerSlot_ItemAt(const_cast<void*>(static_cast<const void*>(this)), index)); };
++ QSize maximumSize() const { return *static_cast<QSize*>(callbackQVBoxLayoutWithTriggerSlot_MaximumSize(const_cast<void*>(static_cast<const void*>(this)))); };
++ QSize minimumSize() const { return *static_cast<QSize*>(callbackQVBoxLayoutWithTriggerSlot_MinimumSize(const_cast<void*>(static_cast<const void*>(this)))); };
++ QSize sizeHint() const { return *static_cast<QSize*>(callbackQVBoxLayoutWithTriggerSlot_SizeHint(const_cast<void*>(static_cast<const void*>(this)))); };
++ Qt::Orientations expandingDirections() const { return static_cast<Qt::Orientation>(callbackQVBoxLayoutWithTriggerSlot_ExpandingDirections(const_cast<void*>(static_cast<const void*>(this)))); };
++ bool hasHeightForWidth() const { return callbackQVBoxLayoutWithTriggerSlot_HasHeightForWidth(const_cast<void*>(static_cast<const void*>(this))) != 0; };
++ int count() const { return callbackQVBoxLayoutWithTriggerSlot_Count(const_cast<void*>(static_cast<const void*>(this))); };
++ int heightForWidth(int w) const { return callbackQVBoxLayoutWithTriggerSlot_HeightForWidth(const_cast<void*>(static_cast<const void*>(this)), w); };
++ int minimumHeightForWidth(int w) const { return callbackQVBoxLayoutWithTriggerSlot_MinimumHeightForWidth(const_cast<void*>(static_cast<const void*>(this)), w); };
++ QLayout * layout() { return static_cast<QLayout*>(callbackQVBoxLayoutWithTriggerSlot_Layout(this)); };
++ void childEvent(QChildEvent * e) { callbackQVBoxLayoutWithTriggerSlot_ChildEvent(this, e); };
++ QRect geometry() const { return *static_cast<QRect*>(callbackQVBoxLayoutWithTriggerSlot_Geometry(const_cast<void*>(static_cast<const void*>(this)))); };
++ QSizePolicy::ControlTypes controlTypes() const { return static_cast<QSizePolicy::ControlType>(callbackQVBoxLayoutWithTriggerSlot_ControlTypes(const_cast<void*>(static_cast<const void*>(this)))); };
++ bool isEmpty() const { return callbackQVBoxLayoutWithTriggerSlot_IsEmpty(const_cast<void*>(static_cast<const void*>(this))) != 0; };
++ int indexOf(QWidget * widget) const { return callbackQVBoxLayoutWithTriggerSlot_IndexOf(const_cast<void*>(static_cast<const void*>(this)), widget); };
++ bool event(QEvent * e) { return callbackQVBoxLayoutWithTriggerSlot_Event(this, e) != 0; };
++ bool eventFilter(QObject * watched, QEvent * event) { return callbackQVBoxLayoutWithTriggerSlot_EventFilter(this, watched, event) != 0; };
++ void connectNotify(const QMetaMethod & sign) { callbackQVBoxLayoutWithTriggerSlot_ConnectNotify(this, const_cast<QMetaMethod*>(&sign)); };
++ void customEvent(QEvent * event) { callbackQVBoxLayoutWithTriggerSlot_CustomEvent(this, event); };
++ void deleteLater() { callbackQVBoxLayoutWithTriggerSlot_DeleteLater(this); };
++ void Signal_Destroyed(QObject * obj) { callbackQVBoxLayoutWithTriggerSlot_Destroyed(this, obj); };
++ void disconnectNotify(const QMetaMethod & sign) { callbackQVBoxLayoutWithTriggerSlot_DisconnectNotify(this, const_cast<QMetaMethod*>(&sign)); };
++ void Signal_ObjectNameChanged(const QString & objectName) { QByteArray taa2c4f = objectName.toUtf8(); Moc_PackedString objectNamePacked = { const_cast<char*>(taa2c4f.prepend("WHITESPACE").constData()+10), taa2c4f.size()-10 };callbackQVBoxLayoutWithTriggerSlot_ObjectNameChanged(this, objectNamePacked); };
++ void timerEvent(QTimerEvent * event) { callbackQVBoxLayoutWithTriggerSlot_TimerEvent(this, event); };
++
++ QSpacerItem * spacerItem() { return static_cast<QSpacerItem*>(callbackQVBoxLayoutWithTriggerSlot_SpacerItem(this)); };
++ QWidget * widget() { return static_cast<QWidget*>(callbackQVBoxLayoutWithTriggerSlot_Widget(this)); };
++signals:
++ void TriggerMessage(QString messageBody, QString sender, qint64 timestamp);
++public slots:
++private:
++};
++
++Q_DECLARE_METATYPE(QVBoxLayoutWithTriggerSlot*)
++
++
++void QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaTypes() {
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_ConnectTriggerRoom(void* ptr)
++{
++ QObject::connect(static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr), static_cast<void (QRoomVBoxLayoutWithTriggerSlot::*)(QString)>(&QRoomVBoxLayoutWithTriggerSlot::TriggerRoom), static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr), static_cast<void (QRoomVBoxLayoutWithTriggerSlot::*)(QString)>(&QRoomVBoxLayoutWithTriggerSlot::Signal_TriggerRoom));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_DisconnectTriggerRoom(void* ptr)
++{
++ QObject::disconnect(static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr), static_cast<void (QRoomVBoxLayoutWithTriggerSlot::*)(QString)>(&QRoomVBoxLayoutWithTriggerSlot::TriggerRoom), static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr), static_cast<void (QRoomVBoxLayoutWithTriggerSlot::*)(QString)>(&QRoomVBoxLayoutWithTriggerSlot::Signal_TriggerRoom));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_TriggerRoom(void* ptr, struct Moc_PackedString roomID)
++{
++ static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->TriggerRoom(QString::fromUtf8(roomID.data, roomID.len));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_ConnectChangeRoom(void* ptr)
++{
++ QObject::connect(static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr), static_cast<void (QRoomVBoxLayoutWithTriggerSlot::*)(QString)>(&QRoomVBoxLayoutWithTriggerSlot::ChangeRoom), static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr), static_cast<void (QRoomVBoxLayoutWithTriggerSlot::*)(QString)>(&QRoomVBoxLayoutWithTriggerSlot::Signal_ChangeRoom));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_DisconnectChangeRoom(void* ptr)
++{
++ QObject::disconnect(static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr), static_cast<void (QRoomVBoxLayoutWithTriggerSlot::*)(QString)>(&QRoomVBoxLayoutWithTriggerSlot::ChangeRoom), static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr), static_cast<void (QRoomVBoxLayoutWithTriggerSlot::*)(QString)>(&QRoomVBoxLayoutWithTriggerSlot::Signal_ChangeRoom));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_ChangeRoom(void* ptr, struct Moc_PackedString roomID)
++{
++ static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->ChangeRoom(QString::fromUtf8(roomID.data, roomID.len));
++}
++
++int QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaType()
++{
++ return qRegisterMetaType<QRoomVBoxLayoutWithTriggerSlot*>();
++}
++
++int QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaType2(char* typeName)
++{
++ return qRegisterMetaType<QRoomVBoxLayoutWithTriggerSlot*>(const_cast<const char*>(typeName));
++}
++
++int QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QmlRegisterType()
++{
++#ifdef QT_QML_LIB
++ return qmlRegisterType<QRoomVBoxLayoutWithTriggerSlot>();
++#else
++ return 0;
++#endif
++}
++
++int QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QmlRegisterType2(char* uri, int versionMajor, int versionMinor, char* qmlName)
++{
++#ifdef QT_QML_LIB
++ return qmlRegisterType<QRoomVBoxLayoutWithTriggerSlot>(const_cast<const char*>(uri), versionMajor, versionMinor, const_cast<const char*>(qmlName));
++#else
++ return 0;
++#endif
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot___dynamicPropertyNames_atList(void* ptr, int i)
++{
++ return new QByteArray(static_cast<QList<QByteArray>*>(ptr)->at(i));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot___dynamicPropertyNames_setList(void* ptr, void* i)
++{
++ static_cast<QList<QByteArray>*>(ptr)->append(*static_cast<QByteArray*>(i));
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot___dynamicPropertyNames_newList(void* ptr)
++{
++ Q_UNUSED(ptr);
++ return new QList<QByteArray>;
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot___findChildren_atList2(void* ptr, int i)
++{
++ return const_cast<QObject*>(static_cast<QList<QObject*>*>(ptr)->at(i));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot___findChildren_setList2(void* ptr, void* i)
++{
++ static_cast<QList<QObject*>*>(ptr)->append(static_cast<QObject*>(i));
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot___findChildren_newList2(void* ptr)
++{
++ Q_UNUSED(ptr);
++ return new QList<QObject*>;
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot___findChildren_atList3(void* ptr, int i)
++{
++ return const_cast<QObject*>(static_cast<QList<QObject*>*>(ptr)->at(i));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot___findChildren_setList3(void* ptr, void* i)
++{
++ static_cast<QList<QObject*>*>(ptr)->append(static_cast<QObject*>(i));
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot___findChildren_newList3(void* ptr)
++{
++ Q_UNUSED(ptr);
++ return new QList<QObject*>;
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot___findChildren_atList(void* ptr, int i)
++{
++ return const_cast<QObject*>(static_cast<QList<QObject*>*>(ptr)->at(i));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot___findChildren_setList(void* ptr, void* i)
++{
++ static_cast<QList<QObject*>*>(ptr)->append(static_cast<QObject*>(i));
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot___findChildren_newList(void* ptr)
++{
++ Q_UNUSED(ptr);
++ return new QList<QObject*>;
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot___children_atList(void* ptr, int i)
++{
++ return const_cast<QObject*>(static_cast<QList<QObject *>*>(ptr)->at(i));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot___children_setList(void* ptr, void* i)
++{
++ static_cast<QList<QObject *>*>(ptr)->append(static_cast<QObject*>(i));
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot___children_newList(void* ptr)
++{
++ Q_UNUSED(ptr);
++ return new QList<QObject *>;
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot_NewQRoomVBoxLayoutWithTriggerSlot()
++{
++ return new QRoomVBoxLayoutWithTriggerSlot();
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot_NewQRoomVBoxLayoutWithTriggerSlot2(void* parent)
++{
++ return new QRoomVBoxLayoutWithTriggerSlot(static_cast<QWidget*>(parent));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_DestroyQRoomVBoxLayoutWithTriggerSlot(void* ptr)
++{
++ static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->~QRoomVBoxLayoutWithTriggerSlot();
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot_TakeAtDefault(void* ptr, int index)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::takeAt(index);
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_AddItemDefault(void* ptr, void* item)
++{
++ static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::addItem(static_cast<QLayoutItem*>(item));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_InvalidateDefault(void* ptr)
++{
++ static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::invalidate();
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_SetGeometryDefault(void* ptr, void* r)
++{
++ static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::setGeometry(*static_cast<QRect*>(r));
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot_ItemAtDefault(void* ptr, int index)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::itemAt(index);
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot_MaximumSizeDefault(void* ptr)
++{
++ return ({ QSize tmpValue = static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::maximumSize(); new QSize(tmpValue.width(), tmpValue.height()); });
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot_MinimumSizeDefault(void* ptr)
++{
++ return ({ QSize tmpValue = static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::minimumSize(); new QSize(tmpValue.width(), tmpValue.height()); });
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot_SizeHintDefault(void* ptr)
++{
++ return ({ QSize tmpValue = static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::sizeHint(); new QSize(tmpValue.width(), tmpValue.height()); });
++}
++
++long long QRoomVBoxLayoutWithTriggerSlot_ExpandingDirectionsDefault(void* ptr)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::expandingDirections();
++}
++
++char QRoomVBoxLayoutWithTriggerSlot_HasHeightForWidthDefault(void* ptr)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::hasHeightForWidth();
++}
++
++int QRoomVBoxLayoutWithTriggerSlot_CountDefault(void* ptr)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::count();
++}
++
++int QRoomVBoxLayoutWithTriggerSlot_HeightForWidthDefault(void* ptr, int w)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::heightForWidth(w);
++}
++
++int QRoomVBoxLayoutWithTriggerSlot_MinimumHeightForWidthDefault(void* ptr, int w)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::minimumHeightForWidth(w);
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot_LayoutDefault(void* ptr)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::layout();
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_ChildEventDefault(void* ptr, void* e)
++{
++ static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::childEvent(static_cast<QChildEvent*>(e));
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot_GeometryDefault(void* ptr)
++{
++ return ({ QRect tmpValue = static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::geometry(); new QRect(tmpValue.x(), tmpValue.y(), tmpValue.width(), tmpValue.height()); });
++}
++
++long long QRoomVBoxLayoutWithTriggerSlot_ControlTypesDefault(void* ptr)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::controlTypes();
++}
++
++char QRoomVBoxLayoutWithTriggerSlot_IsEmptyDefault(void* ptr)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::isEmpty();
++}
++
++int QRoomVBoxLayoutWithTriggerSlot_IndexOfDefault(void* ptr, void* widget)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::indexOf(static_cast<QWidget*>(widget));
++}
++
++char QRoomVBoxLayoutWithTriggerSlot_EventDefault(void* ptr, void* e)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::event(static_cast<QEvent*>(e));
++}
++
++char QRoomVBoxLayoutWithTriggerSlot_EventFilterDefault(void* ptr, void* watched, void* event)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::eventFilter(static_cast<QObject*>(watched), static_cast<QEvent*>(event));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_ConnectNotifyDefault(void* ptr, void* sign)
++{
++ static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::connectNotify(*static_cast<QMetaMethod*>(sign));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_CustomEventDefault(void* ptr, void* event)
++{
++ static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::customEvent(static_cast<QEvent*>(event));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_DeleteLaterDefault(void* ptr)
++{
++ static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::deleteLater();
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_DisconnectNotifyDefault(void* ptr, void* sign)
++{
++ static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::disconnectNotify(*static_cast<QMetaMethod*>(sign));
++}
++
++void QRoomVBoxLayoutWithTriggerSlot_TimerEventDefault(void* ptr, void* event)
++{
++ static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::timerEvent(static_cast<QTimerEvent*>(event));
++}
++
++
++
++void* QRoomVBoxLayoutWithTriggerSlot_SpacerItemDefault(void* ptr)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::spacerItem();
++}
++
++void* QRoomVBoxLayoutWithTriggerSlot_WidgetDefault(void* ptr)
++{
++ return static_cast<QRoomVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::widget();
++}
++
++void QVBoxLayoutWithTriggerSlot_ConnectTriggerMessage(void* ptr)
++{
++ QObject::connect(static_cast<QVBoxLayoutWithTriggerSlot*>(ptr), static_cast<void (QVBoxLayoutWithTriggerSlot::*)(QString, QString, qint64)>(&QVBoxLayoutWithTriggerSlot::TriggerMessage), static_cast<QVBoxLayoutWithTriggerSlot*>(ptr), static_cast<void (QVBoxLayoutWithTriggerSlot::*)(QString, QString, qint64)>(&QVBoxLayoutWithTriggerSlot::Signal_TriggerMessage));
++}
++
++void QVBoxLayoutWithTriggerSlot_DisconnectTriggerMessage(void* ptr)
++{
++ QObject::disconnect(static_cast<QVBoxLayoutWithTriggerSlot*>(ptr), static_cast<void (QVBoxLayoutWithTriggerSlot::*)(QString, QString, qint64)>(&QVBoxLayoutWithTriggerSlot::TriggerMessage), static_cast<QVBoxLayoutWithTriggerSlot*>(ptr), static_cast<void (QVBoxLayoutWithTriggerSlot::*)(QString, QString, qint64)>(&QVBoxLayoutWithTriggerSlot::Signal_TriggerMessage));
++}
++
++void QVBoxLayoutWithTriggerSlot_TriggerMessage(void* ptr, struct Moc_PackedString messageBody, struct Moc_PackedString sender, long long timestamp)
++{
++ static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->TriggerMessage(QString::fromUtf8(messageBody.data, messageBody.len), QString::fromUtf8(sender.data, sender.len), timestamp);
++}
++
++int QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaType()
++{
++ return qRegisterMetaType<QVBoxLayoutWithTriggerSlot*>();
++}
++
++int QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaType2(char* typeName)
++{
++ return qRegisterMetaType<QVBoxLayoutWithTriggerSlot*>(const_cast<const char*>(typeName));
++}
++
++int QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QmlRegisterType()
++{
++#ifdef QT_QML_LIB
++ return qmlRegisterType<QVBoxLayoutWithTriggerSlot>();
++#else
++ return 0;
++#endif
++}
++
++int QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QmlRegisterType2(char* uri, int versionMajor, int versionMinor, char* qmlName)
++{
++#ifdef QT_QML_LIB
++ return qmlRegisterType<QVBoxLayoutWithTriggerSlot>(const_cast<const char*>(uri), versionMajor, versionMinor, const_cast<const char*>(qmlName));
++#else
++ return 0;
++#endif
++}
++
++void* QVBoxLayoutWithTriggerSlot___dynamicPropertyNames_atList(void* ptr, int i)
++{
++ return new QByteArray(static_cast<QList<QByteArray>*>(ptr)->at(i));
++}
++
++void QVBoxLayoutWithTriggerSlot___dynamicPropertyNames_setList(void* ptr, void* i)
++{
++ static_cast<QList<QByteArray>*>(ptr)->append(*static_cast<QByteArray*>(i));
++}
++
++void* QVBoxLayoutWithTriggerSlot___dynamicPropertyNames_newList(void* ptr)
++{
++ Q_UNUSED(ptr);
++ return new QList<QByteArray>;
++}
++
++void* QVBoxLayoutWithTriggerSlot___findChildren_atList2(void* ptr, int i)
++{
++ return const_cast<QObject*>(static_cast<QList<QObject*>*>(ptr)->at(i));
++}
++
++void QVBoxLayoutWithTriggerSlot___findChildren_setList2(void* ptr, void* i)
++{
++ static_cast<QList<QObject*>*>(ptr)->append(static_cast<QObject*>(i));
++}
++
++void* QVBoxLayoutWithTriggerSlot___findChildren_newList2(void* ptr)
++{
++ Q_UNUSED(ptr);
++ return new QList<QObject*>;
++}
++
++void* QVBoxLayoutWithTriggerSlot___findChildren_atList3(void* ptr, int i)
++{
++ return const_cast<QObject*>(static_cast<QList<QObject*>*>(ptr)->at(i));
++}
++
++void QVBoxLayoutWithTriggerSlot___findChildren_setList3(void* ptr, void* i)
++{
++ static_cast<QList<QObject*>*>(ptr)->append(static_cast<QObject*>(i));
++}
++
++void* QVBoxLayoutWithTriggerSlot___findChildren_newList3(void* ptr)
++{
++ Q_UNUSED(ptr);
++ return new QList<QObject*>;
++}
++
++void* QVBoxLayoutWithTriggerSlot___findChildren_atList(void* ptr, int i)
++{
++ return const_cast<QObject*>(static_cast<QList<QObject*>*>(ptr)->at(i));
++}
++
++void QVBoxLayoutWithTriggerSlot___findChildren_setList(void* ptr, void* i)
++{
++ static_cast<QList<QObject*>*>(ptr)->append(static_cast<QObject*>(i));
++}
++
++void* QVBoxLayoutWithTriggerSlot___findChildren_newList(void* ptr)
++{
++ Q_UNUSED(ptr);
++ return new QList<QObject*>;
++}
++
++void* QVBoxLayoutWithTriggerSlot___children_atList(void* ptr, int i)
++{
++ return const_cast<QObject*>(static_cast<QList<QObject *>*>(ptr)->at(i));
++}
++
++void QVBoxLayoutWithTriggerSlot___children_setList(void* ptr, void* i)
++{
++ static_cast<QList<QObject *>*>(ptr)->append(static_cast<QObject*>(i));
++}
++
++void* QVBoxLayoutWithTriggerSlot___children_newList(void* ptr)
++{
++ Q_UNUSED(ptr);
++ return new QList<QObject *>;
++}
++
++void* QVBoxLayoutWithTriggerSlot_NewQVBoxLayoutWithTriggerSlot()
++{
++ return new QVBoxLayoutWithTriggerSlot();
++}
++
++void* QVBoxLayoutWithTriggerSlot_NewQVBoxLayoutWithTriggerSlot2(void* parent)
++{
++ return new QVBoxLayoutWithTriggerSlot(static_cast<QWidget*>(parent));
++}
++
++void QVBoxLayoutWithTriggerSlot_DestroyQVBoxLayoutWithTriggerSlot(void* ptr)
++{
++ static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->~QVBoxLayoutWithTriggerSlot();
++}
++
++void* QVBoxLayoutWithTriggerSlot_TakeAtDefault(void* ptr, int index)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::takeAt(index);
++}
++
++void QVBoxLayoutWithTriggerSlot_AddItemDefault(void* ptr, void* item)
++{
++ static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::addItem(static_cast<QLayoutItem*>(item));
++}
++
++void QVBoxLayoutWithTriggerSlot_InvalidateDefault(void* ptr)
++{
++ static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::invalidate();
++}
++
++void QVBoxLayoutWithTriggerSlot_SetGeometryDefault(void* ptr, void* r)
++{
++ static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::setGeometry(*static_cast<QRect*>(r));
++}
++
++void* QVBoxLayoutWithTriggerSlot_ItemAtDefault(void* ptr, int index)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::itemAt(index);
++}
++
++void* QVBoxLayoutWithTriggerSlot_MaximumSizeDefault(void* ptr)
++{
++ return ({ QSize tmpValue = static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::maximumSize(); new QSize(tmpValue.width(), tmpValue.height()); });
++}
++
++void* QVBoxLayoutWithTriggerSlot_MinimumSizeDefault(void* ptr)
++{
++ return ({ QSize tmpValue = static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::minimumSize(); new QSize(tmpValue.width(), tmpValue.height()); });
++}
++
++void* QVBoxLayoutWithTriggerSlot_SizeHintDefault(void* ptr)
++{
++ return ({ QSize tmpValue = static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::sizeHint(); new QSize(tmpValue.width(), tmpValue.height()); });
++}
++
++long long QVBoxLayoutWithTriggerSlot_ExpandingDirectionsDefault(void* ptr)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::expandingDirections();
++}
++
++char QVBoxLayoutWithTriggerSlot_HasHeightForWidthDefault(void* ptr)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::hasHeightForWidth();
++}
++
++int QVBoxLayoutWithTriggerSlot_CountDefault(void* ptr)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::count();
++}
++
++int QVBoxLayoutWithTriggerSlot_HeightForWidthDefault(void* ptr, int w)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::heightForWidth(w);
++}
++
++int QVBoxLayoutWithTriggerSlot_MinimumHeightForWidthDefault(void* ptr, int w)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::minimumHeightForWidth(w);
++}
++
++void* QVBoxLayoutWithTriggerSlot_LayoutDefault(void* ptr)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::layout();
++}
++
++void QVBoxLayoutWithTriggerSlot_ChildEventDefault(void* ptr, void* e)
++{
++ static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::childEvent(static_cast<QChildEvent*>(e));
++}
++
++void* QVBoxLayoutWithTriggerSlot_GeometryDefault(void* ptr)
++{
++ return ({ QRect tmpValue = static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::geometry(); new QRect(tmpValue.x(), tmpValue.y(), tmpValue.width(), tmpValue.height()); });
++}
++
++long long QVBoxLayoutWithTriggerSlot_ControlTypesDefault(void* ptr)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::controlTypes();
++}
++
++char QVBoxLayoutWithTriggerSlot_IsEmptyDefault(void* ptr)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::isEmpty();
++}
++
++int QVBoxLayoutWithTriggerSlot_IndexOfDefault(void* ptr, void* widget)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::indexOf(static_cast<QWidget*>(widget));
++}
++
++char QVBoxLayoutWithTriggerSlot_EventDefault(void* ptr, void* e)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::event(static_cast<QEvent*>(e));
++}
++
++char QVBoxLayoutWithTriggerSlot_EventFilterDefault(void* ptr, void* watched, void* event)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::eventFilter(static_cast<QObject*>(watched), static_cast<QEvent*>(event));
++}
++
++void QVBoxLayoutWithTriggerSlot_ConnectNotifyDefault(void* ptr, void* sign)
++{
++ static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::connectNotify(*static_cast<QMetaMethod*>(sign));
++}
++
++void QVBoxLayoutWithTriggerSlot_CustomEventDefault(void* ptr, void* event)
++{
++ static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::customEvent(static_cast<QEvent*>(event));
++}
++
++void QVBoxLayoutWithTriggerSlot_DeleteLaterDefault(void* ptr)
++{
++ static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::deleteLater();
++}
++
++void QVBoxLayoutWithTriggerSlot_DisconnectNotifyDefault(void* ptr, void* sign)
++{
++ static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::disconnectNotify(*static_cast<QMetaMethod*>(sign));
++}
++
++void QVBoxLayoutWithTriggerSlot_TimerEventDefault(void* ptr, void* event)
++{
++ static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::timerEvent(static_cast<QTimerEvent*>(event));
++}
++
++
++
++void* QVBoxLayoutWithTriggerSlot_SpacerItemDefault(void* ptr)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::spacerItem();
++}
++
++void* QVBoxLayoutWithTriggerSlot_WidgetDefault(void* ptr)
++{
++ return static_cast<QVBoxLayoutWithTriggerSlot*>(ptr)->QVBoxLayout::widget();
++}
++
++#include "moc_moc.h"
+diff --git a/ui/listLayouts/moc.go b/ui/listLayouts/moc.go
+new file mode 100644
+index 0000000..55fc930
+--- /dev/null
++++ b/ui/listLayouts/moc.go
+@@ -0,0 +1,1595 @@
++package listLayouts
++
++//#include <stdint.h>
++//#include <stdlib.h>
++//#include <string.h>
++//#include "moc.h"
++import "C"
++import (
++ "runtime"
++ "unsafe"
++
++ "github.com/therecipe/qt"
++ std_core "github.com/therecipe/qt/core"
++ std_widgets "github.com/therecipe/qt/widgets"
++)
++
++func cGoUnpackString(s C.struct_Moc_PackedString) string {
++ if len := int(s.len); len == -1 {
++ return C.GoString(s.data)
++ }
++ return C.GoStringN(s.data, C.int(s.len))
++}
++
++type QRoomVBoxLayoutWithTriggerSlot_ITF interface {
++ std_widgets.QVBoxLayout_ITF
++ QRoomVBoxLayoutWithTriggerSlot_PTR() *QRoomVBoxLayoutWithTriggerSlot
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) QRoomVBoxLayoutWithTriggerSlot_PTR() *QRoomVBoxLayoutWithTriggerSlot {
++ return ptr
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) Pointer() unsafe.Pointer {
++ if ptr != nil {
++ return ptr.QVBoxLayout_PTR().Pointer()
++ }
++ return nil
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) SetPointer(p unsafe.Pointer) {
++ if ptr != nil {
++ ptr.QVBoxLayout_PTR().SetPointer(p)
++ }
++}
++
++func PointerFromQRoomVBoxLayoutWithTriggerSlot(ptr QRoomVBoxLayoutWithTriggerSlot_ITF) unsafe.Pointer {
++ if ptr != nil {
++ return ptr.QRoomVBoxLayoutWithTriggerSlot_PTR().Pointer()
++ }
++ return nil
++}
++
++func NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr unsafe.Pointer) *QRoomVBoxLayoutWithTriggerSlot {
++ var n *QRoomVBoxLayoutWithTriggerSlot
++ if gPtr, ok := qt.Receive(ptr); !ok {
++ n = new(QRoomVBoxLayoutWithTriggerSlot)
++ n.SetPointer(ptr)
++ } else {
++ switch deduced := gPtr.(type) {
++ case *QRoomVBoxLayoutWithTriggerSlot:
++ n = deduced
++
++ case *std_widgets.QVBoxLayout:
++ n = &QRoomVBoxLayoutWithTriggerSlot{QVBoxLayout: *deduced}
++
++ default:
++ n = new(QRoomVBoxLayoutWithTriggerSlot)
++ n.SetPointer(ptr)
++ }
++ }
++ return n
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_Constructor
++func callbackQRoomVBoxLayoutWithTriggerSlot_Constructor(ptr unsafe.Pointer) {
++ gPtr := NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr)
++ qt.Register(ptr, gPtr)
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_TriggerRoom
++func callbackQRoomVBoxLayoutWithTriggerSlot_TriggerRoom(ptr unsafe.Pointer, roomID C.struct_Moc_PackedString) {
++ if signal := qt.GetSignal(ptr, "TriggerRoom"); signal != nil {
++ signal.(func(string))(cGoUnpackString(roomID))
++ }
++
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) ConnectTriggerRoom(f func(roomID string)) {
++ if ptr.Pointer() != nil {
++
++ if !qt.ExistsSignal(ptr.Pointer(), "TriggerRoom") {
++ C.QRoomVBoxLayoutWithTriggerSlot_ConnectTriggerRoom(ptr.Pointer())
++ }
++
++ if signal := qt.LendSignal(ptr.Pointer(), "TriggerRoom"); signal != nil {
++ qt.ConnectSignal(ptr.Pointer(), "TriggerRoom", func(roomID string) {
++ signal.(func(string))(roomID)
++ f(roomID)
++ })
++ } else {
++ qt.ConnectSignal(ptr.Pointer(), "TriggerRoom", f)
++ }
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) DisconnectTriggerRoom() {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot_DisconnectTriggerRoom(ptr.Pointer())
++ qt.DisconnectSignal(ptr.Pointer(), "TriggerRoom")
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) TriggerRoom(roomID string) {
++ if ptr.Pointer() != nil {
++ var roomIDC *C.char
++ if roomID != "" {
++ roomIDC = C.CString(roomID)
++ defer C.free(unsafe.Pointer(roomIDC))
++ }
++ C.QRoomVBoxLayoutWithTriggerSlot_TriggerRoom(ptr.Pointer(), C.struct_Moc_PackedString{data: roomIDC, len: C.longlong(len(roomID))})
++ }
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_ChangeRoom
++func callbackQRoomVBoxLayoutWithTriggerSlot_ChangeRoom(ptr unsafe.Pointer, roomID C.struct_Moc_PackedString) {
++ if signal := qt.GetSignal(ptr, "ChangeRoom"); signal != nil {
++ signal.(func(string))(cGoUnpackString(roomID))
++ }
++
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) ConnectChangeRoom(f func(roomID string)) {
++ if ptr.Pointer() != nil {
++
++ if !qt.ExistsSignal(ptr.Pointer(), "ChangeRoom") {
++ C.QRoomVBoxLayoutWithTriggerSlot_ConnectChangeRoom(ptr.Pointer())
++ }
++
++ if signal := qt.LendSignal(ptr.Pointer(), "ChangeRoom"); signal != nil {
++ qt.ConnectSignal(ptr.Pointer(), "ChangeRoom", func(roomID string) {
++ signal.(func(string))(roomID)
++ f(roomID)
++ })
++ } else {
++ qt.ConnectSignal(ptr.Pointer(), "ChangeRoom", f)
++ }
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) DisconnectChangeRoom() {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot_DisconnectChangeRoom(ptr.Pointer())
++ qt.DisconnectSignal(ptr.Pointer(), "ChangeRoom")
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) ChangeRoom(roomID string) {
++ if ptr.Pointer() != nil {
++ var roomIDC *C.char
++ if roomID != "" {
++ roomIDC = C.CString(roomID)
++ defer C.free(unsafe.Pointer(roomIDC))
++ }
++ C.QRoomVBoxLayoutWithTriggerSlot_ChangeRoom(ptr.Pointer(), C.struct_Moc_PackedString{data: roomIDC, len: C.longlong(len(roomID))})
++ }
++}
++
++func QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaType() int {
++ return int(int32(C.QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaType()))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) QRegisterMetaType() int {
++ return int(int32(C.QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaType()))
++}
++
++func QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaType2(typeName string) int {
++ var typeNameC *C.char
++ if typeName != "" {
++ typeNameC = C.CString(typeName)
++ defer C.free(unsafe.Pointer(typeNameC))
++ }
++ return int(int32(C.QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaType2(typeNameC)))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) QRegisterMetaType2(typeName string) int {
++ var typeNameC *C.char
++ if typeName != "" {
++ typeNameC = C.CString(typeName)
++ defer C.free(unsafe.Pointer(typeNameC))
++ }
++ return int(int32(C.QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaType2(typeNameC)))
++}
++
++func QRoomVBoxLayoutWithTriggerSlot_QmlRegisterType() int {
++ return int(int32(C.QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QmlRegisterType()))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) QmlRegisterType() int {
++ return int(int32(C.QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QmlRegisterType()))
++}
++
++func QRoomVBoxLayoutWithTriggerSlot_QmlRegisterType2(uri string, versionMajor int, versionMinor int, qmlName string) int {
++ var uriC *C.char
++ if uri != "" {
++ uriC = C.CString(uri)
++ defer C.free(unsafe.Pointer(uriC))
++ }
++ var qmlNameC *C.char
++ if qmlName != "" {
++ qmlNameC = C.CString(qmlName)
++ defer C.free(unsafe.Pointer(qmlNameC))
++ }
++ return int(int32(C.QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QmlRegisterType2(uriC, C.int(int32(versionMajor)), C.int(int32(versionMinor)), qmlNameC)))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) QmlRegisterType2(uri string, versionMajor int, versionMinor int, qmlName string) int {
++ var uriC *C.char
++ if uri != "" {
++ uriC = C.CString(uri)
++ defer C.free(unsafe.Pointer(uriC))
++ }
++ var qmlNameC *C.char
++ if qmlName != "" {
++ qmlNameC = C.CString(qmlName)
++ defer C.free(unsafe.Pointer(qmlNameC))
++ }
++ return int(int32(C.QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QmlRegisterType2(uriC, C.int(int32(versionMajor)), C.int(int32(versionMinor)), qmlNameC)))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __dynamicPropertyNames_atList(i int) *std_core.QByteArray {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQByteArrayFromPointer(C.QRoomVBoxLayoutWithTriggerSlot___dynamicPropertyNames_atList(ptr.Pointer(), C.int(int32(i))))
++ runtime.SetFinalizer(tmpValue, (*std_core.QByteArray).DestroyQByteArray)
++ return tmpValue
++ }
++ return nil
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __dynamicPropertyNames_setList(i std_core.QByteArray_ITF) {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot___dynamicPropertyNames_setList(ptr.Pointer(), std_core.PointerFromQByteArray(i))
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __dynamicPropertyNames_newList() unsafe.Pointer {
++ return unsafe.Pointer(C.QRoomVBoxLayoutWithTriggerSlot___dynamicPropertyNames_newList(ptr.Pointer()))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __findChildren_atList2(i int) *std_core.QObject {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQObjectFromPointer(C.QRoomVBoxLayoutWithTriggerSlot___findChildren_atList2(ptr.Pointer(), C.int(int32(i))))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++ }
++ return nil
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __findChildren_setList2(i std_core.QObject_ITF) {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot___findChildren_setList2(ptr.Pointer(), std_core.PointerFromQObject(i))
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __findChildren_newList2() unsafe.Pointer {
++ return unsafe.Pointer(C.QRoomVBoxLayoutWithTriggerSlot___findChildren_newList2(ptr.Pointer()))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __findChildren_atList3(i int) *std_core.QObject {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQObjectFromPointer(C.QRoomVBoxLayoutWithTriggerSlot___findChildren_atList3(ptr.Pointer(), C.int(int32(i))))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++ }
++ return nil
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __findChildren_setList3(i std_core.QObject_ITF) {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot___findChildren_setList3(ptr.Pointer(), std_core.PointerFromQObject(i))
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __findChildren_newList3() unsafe.Pointer {
++ return unsafe.Pointer(C.QRoomVBoxLayoutWithTriggerSlot___findChildren_newList3(ptr.Pointer()))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __findChildren_atList(i int) *std_core.QObject {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQObjectFromPointer(C.QRoomVBoxLayoutWithTriggerSlot___findChildren_atList(ptr.Pointer(), C.int(int32(i))))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++ }
++ return nil
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __findChildren_setList(i std_core.QObject_ITF) {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot___findChildren_setList(ptr.Pointer(), std_core.PointerFromQObject(i))
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __findChildren_newList() unsafe.Pointer {
++ return unsafe.Pointer(C.QRoomVBoxLayoutWithTriggerSlot___findChildren_newList(ptr.Pointer()))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __children_atList(i int) *std_core.QObject {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQObjectFromPointer(C.QRoomVBoxLayoutWithTriggerSlot___children_atList(ptr.Pointer(), C.int(int32(i))))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++ }
++ return nil
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __children_setList(i std_core.QObject_ITF) {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot___children_setList(ptr.Pointer(), std_core.PointerFromQObject(i))
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) __children_newList() unsafe.Pointer {
++ return unsafe.Pointer(C.QRoomVBoxLayoutWithTriggerSlot___children_newList(ptr.Pointer()))
++}
++
++func NewQRoomVBoxLayoutWithTriggerSlot() *QRoomVBoxLayoutWithTriggerSlot {
++ var tmpValue = NewQRoomVBoxLayoutWithTriggerSlotFromPointer(C.QRoomVBoxLayoutWithTriggerSlot_NewQRoomVBoxLayoutWithTriggerSlot())
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++}
++
++func NewQRoomVBoxLayoutWithTriggerSlot2(parent std_widgets.QWidget_ITF) *QRoomVBoxLayoutWithTriggerSlot {
++ var tmpValue = NewQRoomVBoxLayoutWithTriggerSlotFromPointer(C.QRoomVBoxLayoutWithTriggerSlot_NewQRoomVBoxLayoutWithTriggerSlot2(std_widgets.PointerFromQWidget(parent)))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) DestroyQRoomVBoxLayoutWithTriggerSlot() {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot_DestroyQRoomVBoxLayoutWithTriggerSlot(ptr.Pointer())
++ ptr.SetPointer(nil)
++ runtime.SetFinalizer(ptr, nil)
++ }
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_TakeAt
++func callbackQRoomVBoxLayoutWithTriggerSlot_TakeAt(ptr unsafe.Pointer, index C.int) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "takeAt"); signal != nil {
++ return std_widgets.PointerFromQLayoutItem(signal.(func(int) *std_widgets.QLayoutItem)(int(int32(index))))
++ }
++
++ return std_widgets.PointerFromQLayoutItem(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).TakeAtDefault(int(int32(index))))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) TakeAtDefault(index int) *std_widgets.QLayoutItem {
++ if ptr.Pointer() != nil {
++ return std_widgets.NewQLayoutItemFromPointer(C.QRoomVBoxLayoutWithTriggerSlot_TakeAtDefault(ptr.Pointer(), C.int(int32(index))))
++ }
++ return nil
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_AddItem
++func callbackQRoomVBoxLayoutWithTriggerSlot_AddItem(ptr unsafe.Pointer, item unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "addItem"); signal != nil {
++ signal.(func(*std_widgets.QLayoutItem))(std_widgets.NewQLayoutItemFromPointer(item))
++ } else {
++ NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).AddItemDefault(std_widgets.NewQLayoutItemFromPointer(item))
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) AddItemDefault(item std_widgets.QLayoutItem_ITF) {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot_AddItemDefault(ptr.Pointer(), std_widgets.PointerFromQLayoutItem(item))
++ }
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_Invalidate
++func callbackQRoomVBoxLayoutWithTriggerSlot_Invalidate(ptr unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "invalidate"); signal != nil {
++ signal.(func())()
++ } else {
++ NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).InvalidateDefault()
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) InvalidateDefault() {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot_InvalidateDefault(ptr.Pointer())
++ }
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_SetGeometry
++func callbackQRoomVBoxLayoutWithTriggerSlot_SetGeometry(ptr unsafe.Pointer, r unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "setGeometry"); signal != nil {
++ signal.(func(*std_core.QRect))(std_core.NewQRectFromPointer(r))
++ } else {
++ NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).SetGeometryDefault(std_core.NewQRectFromPointer(r))
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) SetGeometryDefault(r std_core.QRect_ITF) {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot_SetGeometryDefault(ptr.Pointer(), std_core.PointerFromQRect(r))
++ }
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_ItemAt
++func callbackQRoomVBoxLayoutWithTriggerSlot_ItemAt(ptr unsafe.Pointer, index C.int) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "itemAt"); signal != nil {
++ return std_widgets.PointerFromQLayoutItem(signal.(func(int) *std_widgets.QLayoutItem)(int(int32(index))))
++ }
++
++ return std_widgets.PointerFromQLayoutItem(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).ItemAtDefault(int(int32(index))))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) ItemAtDefault(index int) *std_widgets.QLayoutItem {
++ if ptr.Pointer() != nil {
++ return std_widgets.NewQLayoutItemFromPointer(C.QRoomVBoxLayoutWithTriggerSlot_ItemAtDefault(ptr.Pointer(), C.int(int32(index))))
++ }
++ return nil
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_MaximumSize
++func callbackQRoomVBoxLayoutWithTriggerSlot_MaximumSize(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "maximumSize"); signal != nil {
++ return std_core.PointerFromQSize(signal.(func() *std_core.QSize)())
++ }
++
++ return std_core.PointerFromQSize(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).MaximumSizeDefault())
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) MaximumSizeDefault() *std_core.QSize {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQSizeFromPointer(C.QRoomVBoxLayoutWithTriggerSlot_MaximumSizeDefault(ptr.Pointer()))
++ runtime.SetFinalizer(tmpValue, (*std_core.QSize).DestroyQSize)
++ return tmpValue
++ }
++ return nil
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_MinimumSize
++func callbackQRoomVBoxLayoutWithTriggerSlot_MinimumSize(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "minimumSize"); signal != nil {
++ return std_core.PointerFromQSize(signal.(func() *std_core.QSize)())
++ }
++
++ return std_core.PointerFromQSize(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).MinimumSizeDefault())
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) MinimumSizeDefault() *std_core.QSize {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQSizeFromPointer(C.QRoomVBoxLayoutWithTriggerSlot_MinimumSizeDefault(ptr.Pointer()))
++ runtime.SetFinalizer(tmpValue, (*std_core.QSize).DestroyQSize)
++ return tmpValue
++ }
++ return nil
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_SizeHint
++func callbackQRoomVBoxLayoutWithTriggerSlot_SizeHint(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "sizeHint"); signal != nil {
++ return std_core.PointerFromQSize(signal.(func() *std_core.QSize)())
++ }
++
++ return std_core.PointerFromQSize(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).SizeHintDefault())
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) SizeHintDefault() *std_core.QSize {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQSizeFromPointer(C.QRoomVBoxLayoutWithTriggerSlot_SizeHintDefault(ptr.Pointer()))
++ runtime.SetFinalizer(tmpValue, (*std_core.QSize).DestroyQSize)
++ return tmpValue
++ }
++ return nil
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_ExpandingDirections
++func callbackQRoomVBoxLayoutWithTriggerSlot_ExpandingDirections(ptr unsafe.Pointer) C.longlong {
++ if signal := qt.GetSignal(ptr, "expandingDirections"); signal != nil {
++ return C.longlong(signal.(func() std_core.Qt__Orientation)())
++ }
++
++ return C.longlong(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).ExpandingDirectionsDefault())
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) ExpandingDirectionsDefault() std_core.Qt__Orientation {
++ if ptr.Pointer() != nil {
++ return std_core.Qt__Orientation(C.QRoomVBoxLayoutWithTriggerSlot_ExpandingDirectionsDefault(ptr.Pointer()))
++ }
++ return 0
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_HasHeightForWidth
++func callbackQRoomVBoxLayoutWithTriggerSlot_HasHeightForWidth(ptr unsafe.Pointer) C.char {
++ if signal := qt.GetSignal(ptr, "hasHeightForWidth"); signal != nil {
++ return C.char(int8(qt.GoBoolToInt(signal.(func() bool)())))
++ }
++
++ return C.char(int8(qt.GoBoolToInt(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).HasHeightForWidthDefault())))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) HasHeightForWidthDefault() bool {
++ if ptr.Pointer() != nil {
++ return C.QRoomVBoxLayoutWithTriggerSlot_HasHeightForWidthDefault(ptr.Pointer()) != 0
++ }
++ return false
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_Count
++func callbackQRoomVBoxLayoutWithTriggerSlot_Count(ptr unsafe.Pointer) C.int {
++ if signal := qt.GetSignal(ptr, "count"); signal != nil {
++ return C.int(int32(signal.(func() int)()))
++ }
++
++ return C.int(int32(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).CountDefault()))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) CountDefault() int {
++ if ptr.Pointer() != nil {
++ return int(int32(C.QRoomVBoxLayoutWithTriggerSlot_CountDefault(ptr.Pointer())))
++ }
++ return 0
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_HeightForWidth
++func callbackQRoomVBoxLayoutWithTriggerSlot_HeightForWidth(ptr unsafe.Pointer, w C.int) C.int {
++ if signal := qt.GetSignal(ptr, "heightForWidth"); signal != nil {
++ return C.int(int32(signal.(func(int) int)(int(int32(w)))))
++ }
++
++ return C.int(int32(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).HeightForWidthDefault(int(int32(w)))))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) HeightForWidthDefault(w int) int {
++ if ptr.Pointer() != nil {
++ return int(int32(C.QRoomVBoxLayoutWithTriggerSlot_HeightForWidthDefault(ptr.Pointer(), C.int(int32(w)))))
++ }
++ return 0
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_MinimumHeightForWidth
++func callbackQRoomVBoxLayoutWithTriggerSlot_MinimumHeightForWidth(ptr unsafe.Pointer, w C.int) C.int {
++ if signal := qt.GetSignal(ptr, "minimumHeightForWidth"); signal != nil {
++ return C.int(int32(signal.(func(int) int)(int(int32(w)))))
++ }
++
++ return C.int(int32(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).MinimumHeightForWidthDefault(int(int32(w)))))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) MinimumHeightForWidthDefault(w int) int {
++ if ptr.Pointer() != nil {
++ return int(int32(C.QRoomVBoxLayoutWithTriggerSlot_MinimumHeightForWidthDefault(ptr.Pointer(), C.int(int32(w)))))
++ }
++ return 0
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_Layout
++func callbackQRoomVBoxLayoutWithTriggerSlot_Layout(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "layout"); signal != nil {
++ return std_widgets.PointerFromQLayout(signal.(func() *std_widgets.QLayout)())
++ }
++
++ return std_widgets.PointerFromQLayout(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).LayoutDefault())
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) LayoutDefault() *std_widgets.QLayout {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_widgets.NewQLayoutFromPointer(C.QRoomVBoxLayoutWithTriggerSlot_LayoutDefault(ptr.Pointer()))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++ }
++ return nil
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_ChildEvent
++func callbackQRoomVBoxLayoutWithTriggerSlot_ChildEvent(ptr unsafe.Pointer, e unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "childEvent"); signal != nil {
++ signal.(func(*std_core.QChildEvent))(std_core.NewQChildEventFromPointer(e))
++ } else {
++ NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).ChildEventDefault(std_core.NewQChildEventFromPointer(e))
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) ChildEventDefault(e std_core.QChildEvent_ITF) {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot_ChildEventDefault(ptr.Pointer(), std_core.PointerFromQChildEvent(e))
++ }
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_Geometry
++func callbackQRoomVBoxLayoutWithTriggerSlot_Geometry(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "geometry"); signal != nil {
++ return std_core.PointerFromQRect(signal.(func() *std_core.QRect)())
++ }
++
++ return std_core.PointerFromQRect(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).GeometryDefault())
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) GeometryDefault() *std_core.QRect {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQRectFromPointer(C.QRoomVBoxLayoutWithTriggerSlot_GeometryDefault(ptr.Pointer()))
++ runtime.SetFinalizer(tmpValue, (*std_core.QRect).DestroyQRect)
++ return tmpValue
++ }
++ return nil
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_ControlTypes
++func callbackQRoomVBoxLayoutWithTriggerSlot_ControlTypes(ptr unsafe.Pointer) C.longlong {
++ if signal := qt.GetSignal(ptr, "controlTypes"); signal != nil {
++ return C.longlong(signal.(func() std_widgets.QSizePolicy__ControlType)())
++ }
++
++ return C.longlong(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).ControlTypesDefault())
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) ControlTypesDefault() std_widgets.QSizePolicy__ControlType {
++ if ptr.Pointer() != nil {
++ return std_widgets.QSizePolicy__ControlType(C.QRoomVBoxLayoutWithTriggerSlot_ControlTypesDefault(ptr.Pointer()))
++ }
++ return 0
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_IsEmpty
++func callbackQRoomVBoxLayoutWithTriggerSlot_IsEmpty(ptr unsafe.Pointer) C.char {
++ if signal := qt.GetSignal(ptr, "isEmpty"); signal != nil {
++ return C.char(int8(qt.GoBoolToInt(signal.(func() bool)())))
++ }
++
++ return C.char(int8(qt.GoBoolToInt(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).IsEmptyDefault())))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) IsEmptyDefault() bool {
++ if ptr.Pointer() != nil {
++ return C.QRoomVBoxLayoutWithTriggerSlot_IsEmptyDefault(ptr.Pointer()) != 0
++ }
++ return false
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_IndexOf
++func callbackQRoomVBoxLayoutWithTriggerSlot_IndexOf(ptr unsafe.Pointer, widget unsafe.Pointer) C.int {
++ if signal := qt.GetSignal(ptr, "indexOf"); signal != nil {
++ return C.int(int32(signal.(func(*std_widgets.QWidget) int)(std_widgets.NewQWidgetFromPointer(widget))))
++ }
++
++ return C.int(int32(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).IndexOfDefault(std_widgets.NewQWidgetFromPointer(widget))))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) IndexOfDefault(widget std_widgets.QWidget_ITF) int {
++ if ptr.Pointer() != nil {
++ return int(int32(C.QRoomVBoxLayoutWithTriggerSlot_IndexOfDefault(ptr.Pointer(), std_widgets.PointerFromQWidget(widget))))
++ }
++ return 0
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_Event
++func callbackQRoomVBoxLayoutWithTriggerSlot_Event(ptr unsafe.Pointer, e unsafe.Pointer) C.char {
++ if signal := qt.GetSignal(ptr, "event"); signal != nil {
++ return C.char(int8(qt.GoBoolToInt(signal.(func(*std_core.QEvent) bool)(std_core.NewQEventFromPointer(e)))))
++ }
++
++ return C.char(int8(qt.GoBoolToInt(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).EventDefault(std_core.NewQEventFromPointer(e)))))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) EventDefault(e std_core.QEvent_ITF) bool {
++ if ptr.Pointer() != nil {
++ return C.QRoomVBoxLayoutWithTriggerSlot_EventDefault(ptr.Pointer(), std_core.PointerFromQEvent(e)) != 0
++ }
++ return false
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_EventFilter
++func callbackQRoomVBoxLayoutWithTriggerSlot_EventFilter(ptr unsafe.Pointer, watched unsafe.Pointer, event unsafe.Pointer) C.char {
++ if signal := qt.GetSignal(ptr, "eventFilter"); signal != nil {
++ return C.char(int8(qt.GoBoolToInt(signal.(func(*std_core.QObject, *std_core.QEvent) bool)(std_core.NewQObjectFromPointer(watched), std_core.NewQEventFromPointer(event)))))
++ }
++
++ return C.char(int8(qt.GoBoolToInt(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).EventFilterDefault(std_core.NewQObjectFromPointer(watched), std_core.NewQEventFromPointer(event)))))
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) EventFilterDefault(watched std_core.QObject_ITF, event std_core.QEvent_ITF) bool {
++ if ptr.Pointer() != nil {
++ return C.QRoomVBoxLayoutWithTriggerSlot_EventFilterDefault(ptr.Pointer(), std_core.PointerFromQObject(watched), std_core.PointerFromQEvent(event)) != 0
++ }
++ return false
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_ConnectNotify
++func callbackQRoomVBoxLayoutWithTriggerSlot_ConnectNotify(ptr unsafe.Pointer, sign unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "connectNotify"); signal != nil {
++ signal.(func(*std_core.QMetaMethod))(std_core.NewQMetaMethodFromPointer(sign))
++ } else {
++ NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).ConnectNotifyDefault(std_core.NewQMetaMethodFromPointer(sign))
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) ConnectNotifyDefault(sign std_core.QMetaMethod_ITF) {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot_ConnectNotifyDefault(ptr.Pointer(), std_core.PointerFromQMetaMethod(sign))
++ }
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_CustomEvent
++func callbackQRoomVBoxLayoutWithTriggerSlot_CustomEvent(ptr unsafe.Pointer, event unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "customEvent"); signal != nil {
++ signal.(func(*std_core.QEvent))(std_core.NewQEventFromPointer(event))
++ } else {
++ NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).CustomEventDefault(std_core.NewQEventFromPointer(event))
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) CustomEventDefault(event std_core.QEvent_ITF) {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot_CustomEventDefault(ptr.Pointer(), std_core.PointerFromQEvent(event))
++ }
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_DeleteLater
++func callbackQRoomVBoxLayoutWithTriggerSlot_DeleteLater(ptr unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "deleteLater"); signal != nil {
++ signal.(func())()
++ } else {
++ NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).DeleteLaterDefault()
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) DeleteLaterDefault() {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot_DeleteLaterDefault(ptr.Pointer())
++ ptr.SetPointer(nil)
++ runtime.SetFinalizer(ptr, nil)
++ }
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_Destroyed
++func callbackQRoomVBoxLayoutWithTriggerSlot_Destroyed(ptr unsafe.Pointer, obj unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "destroyed"); signal != nil {
++ signal.(func(*std_core.QObject))(std_core.NewQObjectFromPointer(obj))
++ }
++
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_DisconnectNotify
++func callbackQRoomVBoxLayoutWithTriggerSlot_DisconnectNotify(ptr unsafe.Pointer, sign unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "disconnectNotify"); signal != nil {
++ signal.(func(*std_core.QMetaMethod))(std_core.NewQMetaMethodFromPointer(sign))
++ } else {
++ NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).DisconnectNotifyDefault(std_core.NewQMetaMethodFromPointer(sign))
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) DisconnectNotifyDefault(sign std_core.QMetaMethod_ITF) {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot_DisconnectNotifyDefault(ptr.Pointer(), std_core.PointerFromQMetaMethod(sign))
++ }
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_ObjectNameChanged
++func callbackQRoomVBoxLayoutWithTriggerSlot_ObjectNameChanged(ptr unsafe.Pointer, objectName C.struct_Moc_PackedString) {
++ if signal := qt.GetSignal(ptr, "objectNameChanged"); signal != nil {
++ signal.(func(string))(cGoUnpackString(objectName))
++ }
++
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_TimerEvent
++func callbackQRoomVBoxLayoutWithTriggerSlot_TimerEvent(ptr unsafe.Pointer, event unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "timerEvent"); signal != nil {
++ signal.(func(*std_core.QTimerEvent))(std_core.NewQTimerEventFromPointer(event))
++ } else {
++ NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).TimerEventDefault(std_core.NewQTimerEventFromPointer(event))
++ }
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) TimerEventDefault(event std_core.QTimerEvent_ITF) {
++ if ptr.Pointer() != nil {
++ C.QRoomVBoxLayoutWithTriggerSlot_TimerEventDefault(ptr.Pointer(), std_core.PointerFromQTimerEvent(event))
++ }
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_SpacerItem
++func callbackQRoomVBoxLayoutWithTriggerSlot_SpacerItem(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "spacerItem"); signal != nil {
++ return std_widgets.PointerFromQSpacerItem(signal.(func() *std_widgets.QSpacerItem)())
++ }
++
++ return std_widgets.PointerFromQSpacerItem(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).SpacerItemDefault())
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) SpacerItemDefault() *std_widgets.QSpacerItem {
++ if ptr.Pointer() != nil {
++ return std_widgets.NewQSpacerItemFromPointer(C.QRoomVBoxLayoutWithTriggerSlot_SpacerItemDefault(ptr.Pointer()))
++ }
++ return nil
++}
++
++//export callbackQRoomVBoxLayoutWithTriggerSlot_Widget
++func callbackQRoomVBoxLayoutWithTriggerSlot_Widget(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "widget"); signal != nil {
++ return std_widgets.PointerFromQWidget(signal.(func() *std_widgets.QWidget)())
++ }
++
++ return std_widgets.PointerFromQWidget(NewQRoomVBoxLayoutWithTriggerSlotFromPointer(ptr).WidgetDefault())
++}
++
++func (ptr *QRoomVBoxLayoutWithTriggerSlot) WidgetDefault() *std_widgets.QWidget {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_widgets.NewQWidgetFromPointer(C.QRoomVBoxLayoutWithTriggerSlot_WidgetDefault(ptr.Pointer()))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++ }
++ return nil
++}
++
++type QVBoxLayoutWithTriggerSlot_ITF interface {
++ std_widgets.QVBoxLayout_ITF
++ QVBoxLayoutWithTriggerSlot_PTR() *QVBoxLayoutWithTriggerSlot
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) QVBoxLayoutWithTriggerSlot_PTR() *QVBoxLayoutWithTriggerSlot {
++ return ptr
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) Pointer() unsafe.Pointer {
++ if ptr != nil {
++ return ptr.QVBoxLayout_PTR().Pointer()
++ }
++ return nil
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) SetPointer(p unsafe.Pointer) {
++ if ptr != nil {
++ ptr.QVBoxLayout_PTR().SetPointer(p)
++ }
++}
++
++func PointerFromQVBoxLayoutWithTriggerSlot(ptr QVBoxLayoutWithTriggerSlot_ITF) unsafe.Pointer {
++ if ptr != nil {
++ return ptr.QVBoxLayoutWithTriggerSlot_PTR().Pointer()
++ }
++ return nil
++}
++
++func NewQVBoxLayoutWithTriggerSlotFromPointer(ptr unsafe.Pointer) *QVBoxLayoutWithTriggerSlot {
++ var n *QVBoxLayoutWithTriggerSlot
++ if gPtr, ok := qt.Receive(ptr); !ok {
++ n = new(QVBoxLayoutWithTriggerSlot)
++ n.SetPointer(ptr)
++ } else {
++ switch deduced := gPtr.(type) {
++ case *QVBoxLayoutWithTriggerSlot:
++ n = deduced
++
++ case *std_widgets.QVBoxLayout:
++ n = &QVBoxLayoutWithTriggerSlot{QVBoxLayout: *deduced}
++
++ default:
++ n = new(QVBoxLayoutWithTriggerSlot)
++ n.SetPointer(ptr)
++ }
++ }
++ return n
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_Constructor
++func callbackQVBoxLayoutWithTriggerSlot_Constructor(ptr unsafe.Pointer) {
++ gPtr := NewQVBoxLayoutWithTriggerSlotFromPointer(ptr)
++ qt.Register(ptr, gPtr)
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_TriggerMessage
++func callbackQVBoxLayoutWithTriggerSlot_TriggerMessage(ptr unsafe.Pointer, messageBody C.struct_Moc_PackedString, sender C.struct_Moc_PackedString, timestamp C.longlong) {
++ if signal := qt.GetSignal(ptr, "TriggerMessage"); signal != nil {
++ signal.(func(string, string, int64))(cGoUnpackString(messageBody), cGoUnpackString(sender), int64(timestamp))
++ }
++
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) ConnectTriggerMessage(f func(messageBody string, sender string, timestamp int64)) {
++ if ptr.Pointer() != nil {
++
++ if !qt.ExistsSignal(ptr.Pointer(), "TriggerMessage") {
++ C.QVBoxLayoutWithTriggerSlot_ConnectTriggerMessage(ptr.Pointer())
++ }
++
++ if signal := qt.LendSignal(ptr.Pointer(), "TriggerMessage"); signal != nil {
++ qt.ConnectSignal(ptr.Pointer(), "TriggerMessage", func(messageBody string, sender string, timestamp int64) {
++ signal.(func(string, string, int64))(messageBody, sender, timestamp)
++ f(messageBody, sender, timestamp)
++ })
++ } else {
++ qt.ConnectSignal(ptr.Pointer(), "TriggerMessage", f)
++ }
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) DisconnectTriggerMessage() {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot_DisconnectTriggerMessage(ptr.Pointer())
++ qt.DisconnectSignal(ptr.Pointer(), "TriggerMessage")
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) TriggerMessage(messageBody string, sender string, timestamp int64) {
++ if ptr.Pointer() != nil {
++ var messageBodyC *C.char
++ if messageBody != "" {
++ messageBodyC = C.CString(messageBody)
++ defer C.free(unsafe.Pointer(messageBodyC))
++ }
++ var senderC *C.char
++ if sender != "" {
++ senderC = C.CString(sender)
++ defer C.free(unsafe.Pointer(senderC))
++ }
++ C.QVBoxLayoutWithTriggerSlot_TriggerMessage(ptr.Pointer(), C.struct_Moc_PackedString{data: messageBodyC, len: C.longlong(len(messageBody))}, C.struct_Moc_PackedString{data: senderC, len: C.longlong(len(sender))}, C.longlong(timestamp))
++ }
++}
++
++func QVBoxLayoutWithTriggerSlot_QRegisterMetaType() int {
++ return int(int32(C.QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaType()))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) QRegisterMetaType() int {
++ return int(int32(C.QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaType()))
++}
++
++func QVBoxLayoutWithTriggerSlot_QRegisterMetaType2(typeName string) int {
++ var typeNameC *C.char
++ if typeName != "" {
++ typeNameC = C.CString(typeName)
++ defer C.free(unsafe.Pointer(typeNameC))
++ }
++ return int(int32(C.QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaType2(typeNameC)))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) QRegisterMetaType2(typeName string) int {
++ var typeNameC *C.char
++ if typeName != "" {
++ typeNameC = C.CString(typeName)
++ defer C.free(unsafe.Pointer(typeNameC))
++ }
++ return int(int32(C.QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaType2(typeNameC)))
++}
++
++func QVBoxLayoutWithTriggerSlot_QmlRegisterType() int {
++ return int(int32(C.QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QmlRegisterType()))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) QmlRegisterType() int {
++ return int(int32(C.QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QmlRegisterType()))
++}
++
++func QVBoxLayoutWithTriggerSlot_QmlRegisterType2(uri string, versionMajor int, versionMinor int, qmlName string) int {
++ var uriC *C.char
++ if uri != "" {
++ uriC = C.CString(uri)
++ defer C.free(unsafe.Pointer(uriC))
++ }
++ var qmlNameC *C.char
++ if qmlName != "" {
++ qmlNameC = C.CString(qmlName)
++ defer C.free(unsafe.Pointer(qmlNameC))
++ }
++ return int(int32(C.QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QmlRegisterType2(uriC, C.int(int32(versionMajor)), C.int(int32(versionMinor)), qmlNameC)))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) QmlRegisterType2(uri string, versionMajor int, versionMinor int, qmlName string) int {
++ var uriC *C.char
++ if uri != "" {
++ uriC = C.CString(uri)
++ defer C.free(unsafe.Pointer(uriC))
++ }
++ var qmlNameC *C.char
++ if qmlName != "" {
++ qmlNameC = C.CString(qmlName)
++ defer C.free(unsafe.Pointer(qmlNameC))
++ }
++ return int(int32(C.QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QmlRegisterType2(uriC, C.int(int32(versionMajor)), C.int(int32(versionMinor)), qmlNameC)))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __dynamicPropertyNames_atList(i int) *std_core.QByteArray {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQByteArrayFromPointer(C.QVBoxLayoutWithTriggerSlot___dynamicPropertyNames_atList(ptr.Pointer(), C.int(int32(i))))
++ runtime.SetFinalizer(tmpValue, (*std_core.QByteArray).DestroyQByteArray)
++ return tmpValue
++ }
++ return nil
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __dynamicPropertyNames_setList(i std_core.QByteArray_ITF) {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot___dynamicPropertyNames_setList(ptr.Pointer(), std_core.PointerFromQByteArray(i))
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __dynamicPropertyNames_newList() unsafe.Pointer {
++ return unsafe.Pointer(C.QVBoxLayoutWithTriggerSlot___dynamicPropertyNames_newList(ptr.Pointer()))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __findChildren_atList2(i int) *std_core.QObject {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQObjectFromPointer(C.QVBoxLayoutWithTriggerSlot___findChildren_atList2(ptr.Pointer(), C.int(int32(i))))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++ }
++ return nil
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __findChildren_setList2(i std_core.QObject_ITF) {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot___findChildren_setList2(ptr.Pointer(), std_core.PointerFromQObject(i))
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __findChildren_newList2() unsafe.Pointer {
++ return unsafe.Pointer(C.QVBoxLayoutWithTriggerSlot___findChildren_newList2(ptr.Pointer()))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __findChildren_atList3(i int) *std_core.QObject {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQObjectFromPointer(C.QVBoxLayoutWithTriggerSlot___findChildren_atList3(ptr.Pointer(), C.int(int32(i))))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++ }
++ return nil
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __findChildren_setList3(i std_core.QObject_ITF) {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot___findChildren_setList3(ptr.Pointer(), std_core.PointerFromQObject(i))
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __findChildren_newList3() unsafe.Pointer {
++ return unsafe.Pointer(C.QVBoxLayoutWithTriggerSlot___findChildren_newList3(ptr.Pointer()))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __findChildren_atList(i int) *std_core.QObject {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQObjectFromPointer(C.QVBoxLayoutWithTriggerSlot___findChildren_atList(ptr.Pointer(), C.int(int32(i))))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++ }
++ return nil
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __findChildren_setList(i std_core.QObject_ITF) {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot___findChildren_setList(ptr.Pointer(), std_core.PointerFromQObject(i))
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __findChildren_newList() unsafe.Pointer {
++ return unsafe.Pointer(C.QVBoxLayoutWithTriggerSlot___findChildren_newList(ptr.Pointer()))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __children_atList(i int) *std_core.QObject {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQObjectFromPointer(C.QVBoxLayoutWithTriggerSlot___children_atList(ptr.Pointer(), C.int(int32(i))))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++ }
++ return nil
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __children_setList(i std_core.QObject_ITF) {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot___children_setList(ptr.Pointer(), std_core.PointerFromQObject(i))
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) __children_newList() unsafe.Pointer {
++ return unsafe.Pointer(C.QVBoxLayoutWithTriggerSlot___children_newList(ptr.Pointer()))
++}
++
++func NewQVBoxLayoutWithTriggerSlot() *QVBoxLayoutWithTriggerSlot {
++ var tmpValue = NewQVBoxLayoutWithTriggerSlotFromPointer(C.QVBoxLayoutWithTriggerSlot_NewQVBoxLayoutWithTriggerSlot())
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++}
++
++func NewQVBoxLayoutWithTriggerSlot2(parent std_widgets.QWidget_ITF) *QVBoxLayoutWithTriggerSlot {
++ var tmpValue = NewQVBoxLayoutWithTriggerSlotFromPointer(C.QVBoxLayoutWithTriggerSlot_NewQVBoxLayoutWithTriggerSlot2(std_widgets.PointerFromQWidget(parent)))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) DestroyQVBoxLayoutWithTriggerSlot() {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot_DestroyQVBoxLayoutWithTriggerSlot(ptr.Pointer())
++ ptr.SetPointer(nil)
++ runtime.SetFinalizer(ptr, nil)
++ }
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_TakeAt
++func callbackQVBoxLayoutWithTriggerSlot_TakeAt(ptr unsafe.Pointer, index C.int) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "takeAt"); signal != nil {
++ return std_widgets.PointerFromQLayoutItem(signal.(func(int) *std_widgets.QLayoutItem)(int(int32(index))))
++ }
++
++ return std_widgets.PointerFromQLayoutItem(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).TakeAtDefault(int(int32(index))))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) TakeAtDefault(index int) *std_widgets.QLayoutItem {
++ if ptr.Pointer() != nil {
++ return std_widgets.NewQLayoutItemFromPointer(C.QVBoxLayoutWithTriggerSlot_TakeAtDefault(ptr.Pointer(), C.int(int32(index))))
++ }
++ return nil
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_AddItem
++func callbackQVBoxLayoutWithTriggerSlot_AddItem(ptr unsafe.Pointer, item unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "addItem"); signal != nil {
++ signal.(func(*std_widgets.QLayoutItem))(std_widgets.NewQLayoutItemFromPointer(item))
++ } else {
++ NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).AddItemDefault(std_widgets.NewQLayoutItemFromPointer(item))
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) AddItemDefault(item std_widgets.QLayoutItem_ITF) {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot_AddItemDefault(ptr.Pointer(), std_widgets.PointerFromQLayoutItem(item))
++ }
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_Invalidate
++func callbackQVBoxLayoutWithTriggerSlot_Invalidate(ptr unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "invalidate"); signal != nil {
++ signal.(func())()
++ } else {
++ NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).InvalidateDefault()
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) InvalidateDefault() {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot_InvalidateDefault(ptr.Pointer())
++ }
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_SetGeometry
++func callbackQVBoxLayoutWithTriggerSlot_SetGeometry(ptr unsafe.Pointer, r unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "setGeometry"); signal != nil {
++ signal.(func(*std_core.QRect))(std_core.NewQRectFromPointer(r))
++ } else {
++ NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).SetGeometryDefault(std_core.NewQRectFromPointer(r))
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) SetGeometryDefault(r std_core.QRect_ITF) {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot_SetGeometryDefault(ptr.Pointer(), std_core.PointerFromQRect(r))
++ }
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_ItemAt
++func callbackQVBoxLayoutWithTriggerSlot_ItemAt(ptr unsafe.Pointer, index C.int) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "itemAt"); signal != nil {
++ return std_widgets.PointerFromQLayoutItem(signal.(func(int) *std_widgets.QLayoutItem)(int(int32(index))))
++ }
++
++ return std_widgets.PointerFromQLayoutItem(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).ItemAtDefault(int(int32(index))))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) ItemAtDefault(index int) *std_widgets.QLayoutItem {
++ if ptr.Pointer() != nil {
++ return std_widgets.NewQLayoutItemFromPointer(C.QVBoxLayoutWithTriggerSlot_ItemAtDefault(ptr.Pointer(), C.int(int32(index))))
++ }
++ return nil
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_MaximumSize
++func callbackQVBoxLayoutWithTriggerSlot_MaximumSize(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "maximumSize"); signal != nil {
++ return std_core.PointerFromQSize(signal.(func() *std_core.QSize)())
++ }
++
++ return std_core.PointerFromQSize(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).MaximumSizeDefault())
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) MaximumSizeDefault() *std_core.QSize {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQSizeFromPointer(C.QVBoxLayoutWithTriggerSlot_MaximumSizeDefault(ptr.Pointer()))
++ runtime.SetFinalizer(tmpValue, (*std_core.QSize).DestroyQSize)
++ return tmpValue
++ }
++ return nil
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_MinimumSize
++func callbackQVBoxLayoutWithTriggerSlot_MinimumSize(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "minimumSize"); signal != nil {
++ return std_core.PointerFromQSize(signal.(func() *std_core.QSize)())
++ }
++
++ return std_core.PointerFromQSize(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).MinimumSizeDefault())
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) MinimumSizeDefault() *std_core.QSize {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQSizeFromPointer(C.QVBoxLayoutWithTriggerSlot_MinimumSizeDefault(ptr.Pointer()))
++ runtime.SetFinalizer(tmpValue, (*std_core.QSize).DestroyQSize)
++ return tmpValue
++ }
++ return nil
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_SizeHint
++func callbackQVBoxLayoutWithTriggerSlot_SizeHint(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "sizeHint"); signal != nil {
++ return std_core.PointerFromQSize(signal.(func() *std_core.QSize)())
++ }
++
++ return std_core.PointerFromQSize(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).SizeHintDefault())
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) SizeHintDefault() *std_core.QSize {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQSizeFromPointer(C.QVBoxLayoutWithTriggerSlot_SizeHintDefault(ptr.Pointer()))
++ runtime.SetFinalizer(tmpValue, (*std_core.QSize).DestroyQSize)
++ return tmpValue
++ }
++ return nil
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_ExpandingDirections
++func callbackQVBoxLayoutWithTriggerSlot_ExpandingDirections(ptr unsafe.Pointer) C.longlong {
++ if signal := qt.GetSignal(ptr, "expandingDirections"); signal != nil {
++ return C.longlong(signal.(func() std_core.Qt__Orientation)())
++ }
++
++ return C.longlong(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).ExpandingDirectionsDefault())
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) ExpandingDirectionsDefault() std_core.Qt__Orientation {
++ if ptr.Pointer() != nil {
++ return std_core.Qt__Orientation(C.QVBoxLayoutWithTriggerSlot_ExpandingDirectionsDefault(ptr.Pointer()))
++ }
++ return 0
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_HasHeightForWidth
++func callbackQVBoxLayoutWithTriggerSlot_HasHeightForWidth(ptr unsafe.Pointer) C.char {
++ if signal := qt.GetSignal(ptr, "hasHeightForWidth"); signal != nil {
++ return C.char(int8(qt.GoBoolToInt(signal.(func() bool)())))
++ }
++
++ return C.char(int8(qt.GoBoolToInt(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).HasHeightForWidthDefault())))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) HasHeightForWidthDefault() bool {
++ if ptr.Pointer() != nil {
++ return C.QVBoxLayoutWithTriggerSlot_HasHeightForWidthDefault(ptr.Pointer()) != 0
++ }
++ return false
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_Count
++func callbackQVBoxLayoutWithTriggerSlot_Count(ptr unsafe.Pointer) C.int {
++ if signal := qt.GetSignal(ptr, "count"); signal != nil {
++ return C.int(int32(signal.(func() int)()))
++ }
++
++ return C.int(int32(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).CountDefault()))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) CountDefault() int {
++ if ptr.Pointer() != nil {
++ return int(int32(C.QVBoxLayoutWithTriggerSlot_CountDefault(ptr.Pointer())))
++ }
++ return 0
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_HeightForWidth
++func callbackQVBoxLayoutWithTriggerSlot_HeightForWidth(ptr unsafe.Pointer, w C.int) C.int {
++ if signal := qt.GetSignal(ptr, "heightForWidth"); signal != nil {
++ return C.int(int32(signal.(func(int) int)(int(int32(w)))))
++ }
++
++ return C.int(int32(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).HeightForWidthDefault(int(int32(w)))))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) HeightForWidthDefault(w int) int {
++ if ptr.Pointer() != nil {
++ return int(int32(C.QVBoxLayoutWithTriggerSlot_HeightForWidthDefault(ptr.Pointer(), C.int(int32(w)))))
++ }
++ return 0
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_MinimumHeightForWidth
++func callbackQVBoxLayoutWithTriggerSlot_MinimumHeightForWidth(ptr unsafe.Pointer, w C.int) C.int {
++ if signal := qt.GetSignal(ptr, "minimumHeightForWidth"); signal != nil {
++ return C.int(int32(signal.(func(int) int)(int(int32(w)))))
++ }
++
++ return C.int(int32(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).MinimumHeightForWidthDefault(int(int32(w)))))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) MinimumHeightForWidthDefault(w int) int {
++ if ptr.Pointer() != nil {
++ return int(int32(C.QVBoxLayoutWithTriggerSlot_MinimumHeightForWidthDefault(ptr.Pointer(), C.int(int32(w)))))
++ }
++ return 0
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_Layout
++func callbackQVBoxLayoutWithTriggerSlot_Layout(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "layout"); signal != nil {
++ return std_widgets.PointerFromQLayout(signal.(func() *std_widgets.QLayout)())
++ }
++
++ return std_widgets.PointerFromQLayout(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).LayoutDefault())
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) LayoutDefault() *std_widgets.QLayout {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_widgets.NewQLayoutFromPointer(C.QVBoxLayoutWithTriggerSlot_LayoutDefault(ptr.Pointer()))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++ }
++ return nil
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_ChildEvent
++func callbackQVBoxLayoutWithTriggerSlot_ChildEvent(ptr unsafe.Pointer, e unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "childEvent"); signal != nil {
++ signal.(func(*std_core.QChildEvent))(std_core.NewQChildEventFromPointer(e))
++ } else {
++ NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).ChildEventDefault(std_core.NewQChildEventFromPointer(e))
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) ChildEventDefault(e std_core.QChildEvent_ITF) {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot_ChildEventDefault(ptr.Pointer(), std_core.PointerFromQChildEvent(e))
++ }
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_Geometry
++func callbackQVBoxLayoutWithTriggerSlot_Geometry(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "geometry"); signal != nil {
++ return std_core.PointerFromQRect(signal.(func() *std_core.QRect)())
++ }
++
++ return std_core.PointerFromQRect(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).GeometryDefault())
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) GeometryDefault() *std_core.QRect {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_core.NewQRectFromPointer(C.QVBoxLayoutWithTriggerSlot_GeometryDefault(ptr.Pointer()))
++ runtime.SetFinalizer(tmpValue, (*std_core.QRect).DestroyQRect)
++ return tmpValue
++ }
++ return nil
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_ControlTypes
++func callbackQVBoxLayoutWithTriggerSlot_ControlTypes(ptr unsafe.Pointer) C.longlong {
++ if signal := qt.GetSignal(ptr, "controlTypes"); signal != nil {
++ return C.longlong(signal.(func() std_widgets.QSizePolicy__ControlType)())
++ }
++
++ return C.longlong(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).ControlTypesDefault())
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) ControlTypesDefault() std_widgets.QSizePolicy__ControlType {
++ if ptr.Pointer() != nil {
++ return std_widgets.QSizePolicy__ControlType(C.QVBoxLayoutWithTriggerSlot_ControlTypesDefault(ptr.Pointer()))
++ }
++ return 0
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_IsEmpty
++func callbackQVBoxLayoutWithTriggerSlot_IsEmpty(ptr unsafe.Pointer) C.char {
++ if signal := qt.GetSignal(ptr, "isEmpty"); signal != nil {
++ return C.char(int8(qt.GoBoolToInt(signal.(func() bool)())))
++ }
++
++ return C.char(int8(qt.GoBoolToInt(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).IsEmptyDefault())))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) IsEmptyDefault() bool {
++ if ptr.Pointer() != nil {
++ return C.QVBoxLayoutWithTriggerSlot_IsEmptyDefault(ptr.Pointer()) != 0
++ }
++ return false
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_IndexOf
++func callbackQVBoxLayoutWithTriggerSlot_IndexOf(ptr unsafe.Pointer, widget unsafe.Pointer) C.int {
++ if signal := qt.GetSignal(ptr, "indexOf"); signal != nil {
++ return C.int(int32(signal.(func(*std_widgets.QWidget) int)(std_widgets.NewQWidgetFromPointer(widget))))
++ }
++
++ return C.int(int32(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).IndexOfDefault(std_widgets.NewQWidgetFromPointer(widget))))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) IndexOfDefault(widget std_widgets.QWidget_ITF) int {
++ if ptr.Pointer() != nil {
++ return int(int32(C.QVBoxLayoutWithTriggerSlot_IndexOfDefault(ptr.Pointer(), std_widgets.PointerFromQWidget(widget))))
++ }
++ return 0
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_Event
++func callbackQVBoxLayoutWithTriggerSlot_Event(ptr unsafe.Pointer, e unsafe.Pointer) C.char {
++ if signal := qt.GetSignal(ptr, "event"); signal != nil {
++ return C.char(int8(qt.GoBoolToInt(signal.(func(*std_core.QEvent) bool)(std_core.NewQEventFromPointer(e)))))
++ }
++
++ return C.char(int8(qt.GoBoolToInt(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).EventDefault(std_core.NewQEventFromPointer(e)))))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) EventDefault(e std_core.QEvent_ITF) bool {
++ if ptr.Pointer() != nil {
++ return C.QVBoxLayoutWithTriggerSlot_EventDefault(ptr.Pointer(), std_core.PointerFromQEvent(e)) != 0
++ }
++ return false
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_EventFilter
++func callbackQVBoxLayoutWithTriggerSlot_EventFilter(ptr unsafe.Pointer, watched unsafe.Pointer, event unsafe.Pointer) C.char {
++ if signal := qt.GetSignal(ptr, "eventFilter"); signal != nil {
++ return C.char(int8(qt.GoBoolToInt(signal.(func(*std_core.QObject, *std_core.QEvent) bool)(std_core.NewQObjectFromPointer(watched), std_core.NewQEventFromPointer(event)))))
++ }
++
++ return C.char(int8(qt.GoBoolToInt(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).EventFilterDefault(std_core.NewQObjectFromPointer(watched), std_core.NewQEventFromPointer(event)))))
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) EventFilterDefault(watched std_core.QObject_ITF, event std_core.QEvent_ITF) bool {
++ if ptr.Pointer() != nil {
++ return C.QVBoxLayoutWithTriggerSlot_EventFilterDefault(ptr.Pointer(), std_core.PointerFromQObject(watched), std_core.PointerFromQEvent(event)) != 0
++ }
++ return false
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_ConnectNotify
++func callbackQVBoxLayoutWithTriggerSlot_ConnectNotify(ptr unsafe.Pointer, sign unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "connectNotify"); signal != nil {
++ signal.(func(*std_core.QMetaMethod))(std_core.NewQMetaMethodFromPointer(sign))
++ } else {
++ NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).ConnectNotifyDefault(std_core.NewQMetaMethodFromPointer(sign))
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) ConnectNotifyDefault(sign std_core.QMetaMethod_ITF) {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot_ConnectNotifyDefault(ptr.Pointer(), std_core.PointerFromQMetaMethod(sign))
++ }
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_CustomEvent
++func callbackQVBoxLayoutWithTriggerSlot_CustomEvent(ptr unsafe.Pointer, event unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "customEvent"); signal != nil {
++ signal.(func(*std_core.QEvent))(std_core.NewQEventFromPointer(event))
++ } else {
++ NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).CustomEventDefault(std_core.NewQEventFromPointer(event))
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) CustomEventDefault(event std_core.QEvent_ITF) {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot_CustomEventDefault(ptr.Pointer(), std_core.PointerFromQEvent(event))
++ }
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_DeleteLater
++func callbackQVBoxLayoutWithTriggerSlot_DeleteLater(ptr unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "deleteLater"); signal != nil {
++ signal.(func())()
++ } else {
++ NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).DeleteLaterDefault()
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) DeleteLaterDefault() {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot_DeleteLaterDefault(ptr.Pointer())
++ ptr.SetPointer(nil)
++ runtime.SetFinalizer(ptr, nil)
++ }
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_Destroyed
++func callbackQVBoxLayoutWithTriggerSlot_Destroyed(ptr unsafe.Pointer, obj unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "destroyed"); signal != nil {
++ signal.(func(*std_core.QObject))(std_core.NewQObjectFromPointer(obj))
++ }
++
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_DisconnectNotify
++func callbackQVBoxLayoutWithTriggerSlot_DisconnectNotify(ptr unsafe.Pointer, sign unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "disconnectNotify"); signal != nil {
++ signal.(func(*std_core.QMetaMethod))(std_core.NewQMetaMethodFromPointer(sign))
++ } else {
++ NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).DisconnectNotifyDefault(std_core.NewQMetaMethodFromPointer(sign))
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) DisconnectNotifyDefault(sign std_core.QMetaMethod_ITF) {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot_DisconnectNotifyDefault(ptr.Pointer(), std_core.PointerFromQMetaMethod(sign))
++ }
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_ObjectNameChanged
++func callbackQVBoxLayoutWithTriggerSlot_ObjectNameChanged(ptr unsafe.Pointer, objectName C.struct_Moc_PackedString) {
++ if signal := qt.GetSignal(ptr, "objectNameChanged"); signal != nil {
++ signal.(func(string))(cGoUnpackString(objectName))
++ }
++
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_TimerEvent
++func callbackQVBoxLayoutWithTriggerSlot_TimerEvent(ptr unsafe.Pointer, event unsafe.Pointer) {
++ if signal := qt.GetSignal(ptr, "timerEvent"); signal != nil {
++ signal.(func(*std_core.QTimerEvent))(std_core.NewQTimerEventFromPointer(event))
++ } else {
++ NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).TimerEventDefault(std_core.NewQTimerEventFromPointer(event))
++ }
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) TimerEventDefault(event std_core.QTimerEvent_ITF) {
++ if ptr.Pointer() != nil {
++ C.QVBoxLayoutWithTriggerSlot_TimerEventDefault(ptr.Pointer(), std_core.PointerFromQTimerEvent(event))
++ }
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_SpacerItem
++func callbackQVBoxLayoutWithTriggerSlot_SpacerItem(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "spacerItem"); signal != nil {
++ return std_widgets.PointerFromQSpacerItem(signal.(func() *std_widgets.QSpacerItem)())
++ }
++
++ return std_widgets.PointerFromQSpacerItem(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).SpacerItemDefault())
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) SpacerItemDefault() *std_widgets.QSpacerItem {
++ if ptr.Pointer() != nil {
++ return std_widgets.NewQSpacerItemFromPointer(C.QVBoxLayoutWithTriggerSlot_SpacerItemDefault(ptr.Pointer()))
++ }
++ return nil
++}
++
++//export callbackQVBoxLayoutWithTriggerSlot_Widget
++func callbackQVBoxLayoutWithTriggerSlot_Widget(ptr unsafe.Pointer) unsafe.Pointer {
++ if signal := qt.GetSignal(ptr, "widget"); signal != nil {
++ return std_widgets.PointerFromQWidget(signal.(func() *std_widgets.QWidget)())
++ }
++
++ return std_widgets.PointerFromQWidget(NewQVBoxLayoutWithTriggerSlotFromPointer(ptr).WidgetDefault())
++}
++
++func (ptr *QVBoxLayoutWithTriggerSlot) WidgetDefault() *std_widgets.QWidget {
++ if ptr.Pointer() != nil {
++ var tmpValue = std_widgets.NewQWidgetFromPointer(C.QVBoxLayoutWithTriggerSlot_WidgetDefault(ptr.Pointer()))
++ if !qt.ExistsSignal(tmpValue.Pointer(), "destroyed") {
++ tmpValue.ConnectDestroyed(func(*std_core.QObject) { tmpValue.SetPointer(nil) })
++ }
++ return tmpValue
++ }
++ return nil
++}
+diff --git a/ui/listLayouts/moc.h b/ui/listLayouts/moc.h
+new file mode 100644
+index 0000000..422cfa2
+--- /dev/null
++++ b/ui/listLayouts/moc.h
+@@ -0,0 +1,136 @@
++
++
++#pragma once
++
++#ifndef GO_MOC_H
++#define GO_MOC_H
++
++#include <stdint.h>
++
++#ifdef __cplusplus
++class QVBoxLayoutWithTriggerSlot;
++void QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaTypes();
++class QRoomVBoxLayoutWithTriggerSlot;
++void QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaTypes();
++extern "C" {
++#endif
++
++struct Moc_PackedString { char* data; long long len; };
++struct Moc_PackedList { void* data; long long len; };
++void QRoomVBoxLayoutWithTriggerSlot_ConnectTriggerRoom(void* ptr);
++void QRoomVBoxLayoutWithTriggerSlot_DisconnectTriggerRoom(void* ptr);
++void QRoomVBoxLayoutWithTriggerSlot_TriggerRoom(void* ptr, struct Moc_PackedString roomID);
++void QRoomVBoxLayoutWithTriggerSlot_ConnectChangeRoom(void* ptr);
++void QRoomVBoxLayoutWithTriggerSlot_DisconnectChangeRoom(void* ptr);
++void QRoomVBoxLayoutWithTriggerSlot_ChangeRoom(void* ptr, struct Moc_PackedString roomID);
++int QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaType();
++int QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QRegisterMetaType2(char* typeName);
++int QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QmlRegisterType();
++int QRoomVBoxLayoutWithTriggerSlot_QRoomVBoxLayoutWithTriggerSlot_QmlRegisterType2(char* uri, int versionMajor, int versionMinor, char* qmlName);
++void* QRoomVBoxLayoutWithTriggerSlot___dynamicPropertyNames_atList(void* ptr, int i);
++void QRoomVBoxLayoutWithTriggerSlot___dynamicPropertyNames_setList(void* ptr, void* i);
++void* QRoomVBoxLayoutWithTriggerSlot___dynamicPropertyNames_newList(void* ptr);
++void* QRoomVBoxLayoutWithTriggerSlot___findChildren_atList2(void* ptr, int i);
++void QRoomVBoxLayoutWithTriggerSlot___findChildren_setList2(void* ptr, void* i);
++void* QRoomVBoxLayoutWithTriggerSlot___findChildren_newList2(void* ptr);
++void* QRoomVBoxLayoutWithTriggerSlot___findChildren_atList3(void* ptr, int i);
++void QRoomVBoxLayoutWithTriggerSlot___findChildren_setList3(void* ptr, void* i);
++void* QRoomVBoxLayoutWithTriggerSlot___findChildren_newList3(void* ptr);
++void* QRoomVBoxLayoutWithTriggerSlot___findChildren_atList(void* ptr, int i);
++void QRoomVBoxLayoutWithTriggerSlot___findChildren_setList(void* ptr, void* i);
++void* QRoomVBoxLayoutWithTriggerSlot___findChildren_newList(void* ptr);
++void* QRoomVBoxLayoutWithTriggerSlot___children_atList(void* ptr, int i);
++void QRoomVBoxLayoutWithTriggerSlot___children_setList(void* ptr, void* i);
++void* QRoomVBoxLayoutWithTriggerSlot___children_newList(void* ptr);
++void* QRoomVBoxLayoutWithTriggerSlot_NewQRoomVBoxLayoutWithTriggerSlot();
++void* QRoomVBoxLayoutWithTriggerSlot_NewQRoomVBoxLayoutWithTriggerSlot2(void* parent);
++void QRoomVBoxLayoutWithTriggerSlot_DestroyQRoomVBoxLayoutWithTriggerSlot(void* ptr);
++void* QRoomVBoxLayoutWithTriggerSlot_TakeAtDefault(void* ptr, int index);
++void QRoomVBoxLayoutWithTriggerSlot_AddItemDefault(void* ptr, void* item);
++void QRoomVBoxLayoutWithTriggerSlot_InvalidateDefault(void* ptr);
++void QRoomVBoxLayoutWithTriggerSlot_SetGeometryDefault(void* ptr, void* r);
++void* QRoomVBoxLayoutWithTriggerSlot_ItemAtDefault(void* ptr, int index);
++void* QRoomVBoxLayoutWithTriggerSlot_MaximumSizeDefault(void* ptr);
++void* QRoomVBoxLayoutWithTriggerSlot_MinimumSizeDefault(void* ptr);
++void* QRoomVBoxLayoutWithTriggerSlot_SizeHintDefault(void* ptr);
++long long QRoomVBoxLayoutWithTriggerSlot_ExpandingDirectionsDefault(void* ptr);
++char QRoomVBoxLayoutWithTriggerSlot_HasHeightForWidthDefault(void* ptr);
++int QRoomVBoxLayoutWithTriggerSlot_CountDefault(void* ptr);
++int QRoomVBoxLayoutWithTriggerSlot_HeightForWidthDefault(void* ptr, int w);
++int QRoomVBoxLayoutWithTriggerSlot_MinimumHeightForWidthDefault(void* ptr, int w);
++void* QRoomVBoxLayoutWithTriggerSlot_LayoutDefault(void* ptr);
++void QRoomVBoxLayoutWithTriggerSlot_ChildEventDefault(void* ptr, void* e);
++void* QRoomVBoxLayoutWithTriggerSlot_GeometryDefault(void* ptr);
++long long QRoomVBoxLayoutWithTriggerSlot_ControlTypesDefault(void* ptr);
++char QRoomVBoxLayoutWithTriggerSlot_IsEmptyDefault(void* ptr);
++int QRoomVBoxLayoutWithTriggerSlot_IndexOfDefault(void* ptr, void* widget);
++char QRoomVBoxLayoutWithTriggerSlot_EventDefault(void* ptr, void* e);
++char QRoomVBoxLayoutWithTriggerSlot_EventFilterDefault(void* ptr, void* watched, void* event);
++void QRoomVBoxLayoutWithTriggerSlot_ConnectNotifyDefault(void* ptr, void* sign);
++void QRoomVBoxLayoutWithTriggerSlot_CustomEventDefault(void* ptr, void* event);
++void QRoomVBoxLayoutWithTriggerSlot_DeleteLaterDefault(void* ptr);
++void QRoomVBoxLayoutWithTriggerSlot_DisconnectNotifyDefault(void* ptr, void* sign);
++void QRoomVBoxLayoutWithTriggerSlot_TimerEventDefault(void* ptr, void* event);
++;
++void* QRoomVBoxLayoutWithTriggerSlot_SpacerItemDefault(void* ptr);
++void* QRoomVBoxLayoutWithTriggerSlot_WidgetDefault(void* ptr);
++void QVBoxLayoutWithTriggerSlot_ConnectTriggerMessage(void* ptr);
++void QVBoxLayoutWithTriggerSlot_DisconnectTriggerMessage(void* ptr);
++void QVBoxLayoutWithTriggerSlot_TriggerMessage(void* ptr, struct Moc_PackedString messageBody, struct Moc_PackedString sender, long long timestamp);
++int QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaType();
++int QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QRegisterMetaType2(char* typeName);
++int QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QmlRegisterType();
++int QVBoxLayoutWithTriggerSlot_QVBoxLayoutWithTriggerSlot_QmlRegisterType2(char* uri, int versionMajor, int versionMinor, char* qmlName);
++void* QVBoxLayoutWithTriggerSlot___dynamicPropertyNames_atList(void* ptr, int i);
++void QVBoxLayoutWithTriggerSlot___dynamicPropertyNames_setList(void* ptr, void* i);
++void* QVBoxLayoutWithTriggerSlot___dynamicPropertyNames_newList(void* ptr);
++void* QVBoxLayoutWithTriggerSlot___findChildren_atList2(void* ptr, int i);
++void QVBoxLayoutWithTriggerSlot___findChildren_setList2(void* ptr, void* i);
++void* QVBoxLayoutWithTriggerSlot___findChildren_newList2(void* ptr);
++void* QVBoxLayoutWithTriggerSlot___findChildren_atList3(void* ptr, int i);
++void QVBoxLayoutWithTriggerSlot___findChildren_setList3(void* ptr, void* i);
++void* QVBoxLayoutWithTriggerSlot___findChildren_newList3(void* ptr);
++void* QVBoxLayoutWithTriggerSlot___findChildren_atList(void* ptr, int i);
++void QVBoxLayoutWithTriggerSlot___findChildren_setList(void* ptr, void* i);
++void* QVBoxLayoutWithTriggerSlot___findChildren_newList(void* ptr);
++void* QVBoxLayoutWithTriggerSlot___children_atList(void* ptr, int i);
++void QVBoxLayoutWithTriggerSlot___children_setList(void* ptr, void* i);
++void* QVBoxLayoutWithTriggerSlot___children_newList(void* ptr);
++void* QVBoxLayoutWithTriggerSlot_NewQVBoxLayoutWithTriggerSlot();
++void* QVBoxLayoutWithTriggerSlot_NewQVBoxLayoutWithTriggerSlot2(void* parent);
++void QVBoxLayoutWithTriggerSlot_DestroyQVBoxLayoutWithTriggerSlot(void* ptr);
++void* QVBoxLayoutWithTriggerSlot_TakeAtDefault(void* ptr, int index);
++void QVBoxLayoutWithTriggerSlot_AddItemDefault(void* ptr, void* item);
++void QVBoxLayoutWithTriggerSlot_InvalidateDefault(void* ptr);
++void QVBoxLayoutWithTriggerSlot_SetGeometryDefault(void* ptr, void* r);
++void* QVBoxLayoutWithTriggerSlot_ItemAtDefault(void* ptr, int index);
++void* QVBoxLayoutWithTriggerSlot_MaximumSizeDefault(void* ptr);
++void* QVBoxLayoutWithTriggerSlot_MinimumSizeDefault(void* ptr);
++void* QVBoxLayoutWithTriggerSlot_SizeHintDefault(void* ptr);
++long long QVBoxLayoutWithTriggerSlot_ExpandingDirectionsDefault(void* ptr);
++char QVBoxLayoutWithTriggerSlot_HasHeightForWidthDefault(void* ptr);
++int QVBoxLayoutWithTriggerSlot_CountDefault(void* ptr);
++int QVBoxLayoutWithTriggerSlot_HeightForWidthDefault(void* ptr, int w);
++int QVBoxLayoutWithTriggerSlot_MinimumHeightForWidthDefault(void* ptr, int w);
++void* QVBoxLayoutWithTriggerSlot_LayoutDefault(void* ptr);
++void QVBoxLayoutWithTriggerSlot_ChildEventDefault(void* ptr, void* e);
++void* QVBoxLayoutWithTriggerSlot_GeometryDefault(void* ptr);
++long long QVBoxLayoutWithTriggerSlot_ControlTypesDefault(void* ptr);
++char QVBoxLayoutWithTriggerSlot_IsEmptyDefault(void* ptr);
++int QVBoxLayoutWithTriggerSlot_IndexOfDefault(void* ptr, void* widget);
++char QVBoxLayoutWithTriggerSlot_EventDefault(void* ptr, void* e);
++char QVBoxLayoutWithTriggerSlot_EventFilterDefault(void* ptr, void* watched, void* event);
++void QVBoxLayoutWithTriggerSlot_ConnectNotifyDefault(void* ptr, void* sign);
++void QVBoxLayoutWithTriggerSlot_CustomEventDefault(void* ptr, void* event);
++void QVBoxLayoutWithTriggerSlot_DeleteLaterDefault(void* ptr);
++void QVBoxLayoutWithTriggerSlot_DisconnectNotifyDefault(void* ptr, void* sign);
++void QVBoxLayoutWithTriggerSlot_TimerEventDefault(void* ptr, void* event);
++;
++void* QVBoxLayoutWithTriggerSlot_SpacerItemDefault(void* ptr);
++void* QVBoxLayoutWithTriggerSlot_WidgetDefault(void* ptr);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+\ No newline at end of file
+diff --git a/ui/listLayouts/moc_cgo_windows_windows_386.go b/ui/listLayouts/moc_cgo_windows_windows_386.go
+new file mode 100644
+index 0000000..1a7efe7
+--- /dev/null
++++ b/ui/listLayouts/moc_cgo_windows_windows_386.go
+@@ -0,0 +1,11 @@
++package listLayouts
++
++/*
++#cgo CFLAGS: -fno-keep-inline-dllexport -O2 -Wextra -Wall -W -DUNICODE -D_UNICODE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN
++#cgo CXXFLAGS: -fno-keep-inline-dllexport -O2 -std=gnu++11 -Wextra -Wall -W -fexceptions -mthreads -DUNICODE -D_UNICODE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN
++#cgo CXXFLAGS: -I../../Morpheus -I. -IC:/Qt/Qt5.9.1/5.9.3/mingw53_32/include -IC:/Qt/Qt5.9.1/5.9.3/mingw53_32/include/QtWidgets -IC:/Qt/Qt5.9.1/5.9.3/mingw53_32/include/QtGui -IC:/Qt/Qt5.9.1/5.9.3/mingw53_32/include/QtANGLE -IC:/Qt/Qt5.9.1/5.9.3/mingw53_32/include/QtCore -Irelease -IC:/Qt/Qt5.9.1/5.9.3/mingw53_32/mkspecs/win32-g++
++#cgo LDFLAGS: -Wl,-s -Wl,-subsystem,windows -mthreads
++#cgo LDFLAGS: -lmingw32 -LC:/Qt/Qt5.9.1/5.9.3/mingw53_32/lib C:/Qt/Qt5.9.1/5.9.3/mingw53_32/lib/libqtmain.a -LC:/utils/my_sql/my_sql/lib -LC:/utils/postgresql/pgsql/lib -lshell32 C:/Qt/Qt5.9.1/5.9.3/mingw53_32/lib/libQt5Widgets.a C:/Qt/Qt5.9.1/5.9.3/mingw53_32/lib/libQt5Gui.a C:/Qt/Qt5.9.1/5.9.3/mingw53_32/lib/libQt5Core.a
++#cgo LDFLAGS: -Wl,--allow-multiple-definition
++*/
++import "C"
+diff --git a/ui/listLayouts/moc_moc.h b/ui/listLayouts/moc_moc.h
+new file mode 100644
+index 0000000..6806399
+--- /dev/null
++++ b/ui/listLayouts/moc_moc.h
+@@ -0,0 +1,257 @@
++/****************************************************************************
++** Meta object code from reading C++ file 'moc.cpp'
++**
++** Created by: The Qt Meta Object Compiler version 67 (Qt 5.9.3)
++**
++** WARNING! All changes made in this file will be lost!
++*****************************************************************************/
++
++#include <QtCore/qbytearray.h>
++#include <QtCore/qmetatype.h>
++#if !defined(Q_MOC_OUTPUT_REVISION)
++#error "The header file 'moc.cpp' doesn't include <QObject>."
++#elif Q_MOC_OUTPUT_REVISION != 67
++#error "This file was generated using the moc from 5.9.3. It"
++#error "cannot be used with the include files from this version of Qt."
++#error "(The moc has changed too much.)"
++#endif
++
++QT_BEGIN_MOC_NAMESPACE
++QT_WARNING_PUSH
++QT_WARNING_DISABLE_DEPRECATED
++struct qt_meta_stringdata_QRoomVBoxLayoutWithTriggerSlot_t {
++ QByteArrayData data[5];
++ char stringdata0[62];
++};
++#define QT_MOC_LITERAL(idx, ofs, len) \
++ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
++ qptrdiff(offsetof(qt_meta_stringdata_QRoomVBoxLayoutWithTriggerSlot_t, stringdata0) + ofs \
++ - idx * sizeof(QByteArrayData)) \
++ )
++static const qt_meta_stringdata_QRoomVBoxLayoutWithTriggerSlot_t qt_meta_stringdata_QRoomVBoxLayoutWithTriggerSlot = {
++ {
++QT_MOC_LITERAL(0, 0, 30), // "QRoomVBoxLayoutWithTriggerSlot"
++QT_MOC_LITERAL(1, 31, 11), // "TriggerRoom"
++QT_MOC_LITERAL(2, 43, 0), // ""
++QT_MOC_LITERAL(3, 44, 6), // "roomID"
++QT_MOC_LITERAL(4, 51, 10) // "ChangeRoom"
++
++ },
++ "QRoomVBoxLayoutWithTriggerSlot\0"
++ "TriggerRoom\0\0roomID\0ChangeRoom"
++};
++#undef QT_MOC_LITERAL
++
++static const uint qt_meta_data_QRoomVBoxLayoutWithTriggerSlot[] = {
++
++ // content:
++ 7, // revision
++ 0, // classname
++ 0, 0, // classinfo
++ 2, 14, // methods
++ 0, 0, // properties
++ 0, 0, // enums/sets
++ 0, 0, // constructors
++ 0, // flags
++ 2, // signalCount
++
++ // signals: name, argc, parameters, tag, flags
++ 1, 1, 24, 2, 0x06 /* Public */,
++ 4, 1, 27, 2, 0x06 /* Public */,
++
++ // signals: parameters
++ QMetaType::Void, QMetaType::QString, 3,
++ QMetaType::Void, QMetaType::QString, 3,
++
++ 0 // eod
++};
++
++void QRoomVBoxLayoutWithTriggerSlot::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
++{
++ if (_c == QMetaObject::InvokeMetaMethod) {
++ QRoomVBoxLayoutWithTriggerSlot *_t = static_cast<QRoomVBoxLayoutWithTriggerSlot *>(_o);
++ Q_UNUSED(_t)
++ switch (_id) {
++ case 0: _t->TriggerRoom((*reinterpret_cast< QString(*)>(_a[1]))); break;
++ case 1: _t->ChangeRoom((*reinterpret_cast< QString(*)>(_a[1]))); break;
++ default: ;
++ }
++ } else if (_c == QMetaObject::IndexOfMethod) {
++ int *result = reinterpret_cast<int *>(_a[0]);
++ {
++ typedef void (QRoomVBoxLayoutWithTriggerSlot::*_t)(QString );
++ if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&QRoomVBoxLayoutWithTriggerSlot::TriggerRoom)) {
++ *result = 0;
++ return;
++ }
++ }
++ {
++ typedef void (QRoomVBoxLayoutWithTriggerSlot::*_t)(QString );
++ if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&QRoomVBoxLayoutWithTriggerSlot::ChangeRoom)) {
++ *result = 1;
++ return;
++ }
++ }
++ }
++}
++
++const QMetaObject QRoomVBoxLayoutWithTriggerSlot::staticMetaObject = {
++ { &QVBoxLayout::staticMetaObject, qt_meta_stringdata_QRoomVBoxLayoutWithTriggerSlot.data,
++ qt_meta_data_QRoomVBoxLayoutWithTriggerSlot, qt_static_metacall, nullptr, nullptr}
++};
++
++
++const QMetaObject *QRoomVBoxLayoutWithTriggerSlot::metaObject() const
++{
++ return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
++}
++
++void *QRoomVBoxLayoutWithTriggerSlot::qt_metacast(const char *_clname)
++{
++ if (!_clname) return nullptr;
++ if (!strcmp(_clname, qt_meta_stringdata_QRoomVBoxLayoutWithTriggerSlot.stringdata0))
++ return static_cast<void*>(this);
++ return QVBoxLayout::qt_metacast(_clname);
++}
++
++int QRoomVBoxLayoutWithTriggerSlot::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
++{
++ _id = QVBoxLayout::qt_metacall(_c, _id, _a);
++ if (_id < 0)
++ return _id;
++ if (_c == QMetaObject::InvokeMetaMethod) {
++ if (_id < 2)
++ qt_static_metacall(this, _c, _id, _a);
++ _id -= 2;
++ } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
++ if (_id < 2)
++ *reinterpret_cast<int*>(_a[0]) = -1;
++ _id -= 2;
++ }
++ return _id;
++}
++
++// SIGNAL 0
++void QRoomVBoxLayoutWithTriggerSlot::TriggerRoom(QString _t1)
++{
++ void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
++ QMetaObject::activate(this, &staticMetaObject, 0, _a);
++}
++
++// SIGNAL 1
++void QRoomVBoxLayoutWithTriggerSlot::ChangeRoom(QString _t1)
++{
++ void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
++ QMetaObject::activate(this, &staticMetaObject, 1, _a);
++}
++struct qt_meta_stringdata_QVBoxLayoutWithTriggerSlot_t {
++ QByteArrayData data[6];
++ char stringdata0[72];
++};
++#define QT_MOC_LITERAL(idx, ofs, len) \
++ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
++ qptrdiff(offsetof(qt_meta_stringdata_QVBoxLayoutWithTriggerSlot_t, stringdata0) + ofs \
++ - idx * sizeof(QByteArrayData)) \
++ )
++static const qt_meta_stringdata_QVBoxLayoutWithTriggerSlot_t qt_meta_stringdata_QVBoxLayoutWithTriggerSlot = {
++ {
++QT_MOC_LITERAL(0, 0, 26), // "QVBoxLayoutWithTriggerSlot"
++QT_MOC_LITERAL(1, 27, 14), // "TriggerMessage"
++QT_MOC_LITERAL(2, 42, 0), // ""
++QT_MOC_LITERAL(3, 43, 11), // "messageBody"
++QT_MOC_LITERAL(4, 55, 6), // "sender"
++QT_MOC_LITERAL(5, 62, 9) // "timestamp"
++
++ },
++ "QVBoxLayoutWithTriggerSlot\0TriggerMessage\0"
++ "\0messageBody\0sender\0timestamp"
++};
++#undef QT_MOC_LITERAL
++
++static const uint qt_meta_data_QVBoxLayoutWithTriggerSlot[] = {
++
++ // content:
++ 7, // revision
++ 0, // classname
++ 0, 0, // classinfo
++ 1, 14, // methods
++ 0, 0, // properties
++ 0, 0, // enums/sets
++ 0, 0, // constructors
++ 0, // flags
++ 1, // signalCount
++
++ // signals: name, argc, parameters, tag, flags
++ 1, 3, 19, 2, 0x06 /* Public */,
++
++ // signals: parameters
++ QMetaType::Void, QMetaType::QString, QMetaType::QString, QMetaType::LongLong, 3, 4, 5,
++
++ 0 // eod
++};
++
++void QVBoxLayoutWithTriggerSlot::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
++{
++ if (_c == QMetaObject::InvokeMetaMethod) {
++ QVBoxLayoutWithTriggerSlot *_t = static_cast<QVBoxLayoutWithTriggerSlot *>(_o);
++ Q_UNUSED(_t)
++ switch (_id) {
++ case 0: _t->TriggerMessage((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< QString(*)>(_a[2])),(*reinterpret_cast< qint64(*)>(_a[3]))); break;
++ default: ;
++ }
++ } else if (_c == QMetaObject::IndexOfMethod) {
++ int *result = reinterpret_cast<int *>(_a[0]);
++ {
++ typedef void (QVBoxLayoutWithTriggerSlot::*_t)(QString , QString , qint64 );
++ if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&QVBoxLayoutWithTriggerSlot::TriggerMessage)) {
++ *result = 0;
++ return;
++ }
++ }
++ }
++}
++
++const QMetaObject QVBoxLayoutWithTriggerSlot::staticMetaObject = {
++ { &QVBoxLayout::staticMetaObject, qt_meta_stringdata_QVBoxLayoutWithTriggerSlot.data,
++ qt_meta_data_QVBoxLayoutWithTriggerSlot, qt_static_metacall, nullptr, nullptr}
++};
++
++
++const QMetaObject *QVBoxLayoutWithTriggerSlot::metaObject() const
++{
++ return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
++}
++
++void *QVBoxLayoutWithTriggerSlot::qt_metacast(const char *_clname)
++{
++ if (!_clname) return nullptr;
++ if (!strcmp(_clname, qt_meta_stringdata_QVBoxLayoutWithTriggerSlot.stringdata0))
++ return static_cast<void*>(this);
++ return QVBoxLayout::qt_metacast(_clname);
++}
++
++int QVBoxLayoutWithTriggerSlot::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
++{
++ _id = QVBoxLayout::qt_metacall(_c, _id, _a);
++ if (_id < 0)
++ return _id;
++ if (_c == QMetaObject::InvokeMetaMethod) {
++ if (_id < 1)
++ qt_static_metacall(this, _c, _id, _a);
++ _id -= 1;
++ } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
++ if (_id < 1)
++ *reinterpret_cast<int*>(_a[0]) = -1;
++ _id -= 1;
++ }
++ return _id;
++}
++
++// SIGNAL 0
++void QVBoxLayoutWithTriggerSlot::TriggerMessage(QString _t1, QString _t2, qint64 _t3)
++{
++ void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)), const_cast<void*>(reinterpret_cast<const void*>(&_t3)) };
++ QMetaObject::activate(this, &staticMetaObject, 0, _a);
++}
++QT_WARNING_POP
++QT_END_MOC_NAMESPACE
+diff --git a/ui/roomlist.go b/ui/listLayouts/roomlist.go
+similarity index 62%
+rename from ui/roomlist.go
+rename to ui/listLayouts/roomlist.go
+index 0664703..5774889 100644
+--- a/ui/roomlist.go
++++ b/ui/listLayouts/roomlist.go
+@@ -1,7 +1,8 @@
+-package ui
++package listLayouts
+
+ import (
+- "github.com/Nordgedanken/Morpheus/matrix"
++ "github.com/Nordgedanken/Morpheus/matrix/rooms"
++ log "github.com/sirupsen/logrus"
+ "github.com/therecipe/qt/core"
+ "github.com/therecipe/qt/gui"
+ "github.com/therecipe/qt/uitools"
+@@ -23,25 +24,24 @@ import (
+ type QRoomVBoxLayoutWithTriggerSlot struct {
+ widgets.QVBoxLayout
+
+- _ func(roomID string) `slot:"TriggerRoom"`
+- _ func(url *core.QUrl) `slot:"ChangeRoom"`
++ _ func(roomID string) `signal:"TriggerRoom"`
++ _ func(roomID string) `signal:"ChangeRoom"`
+ }
+
+ // NewRoomList generates a new QRoomVBoxLayoutWithTriggerSlot and adds it to the room scrollArea
+-func NewRoomList(scrollArea *widgets.QScrollArea, roomView *widgets.QWidget) (roomViewLayout *QRoomVBoxLayoutWithTriggerSlot) {
+- roomViewLayout = NewQRoomVBoxLayoutWithTriggerSlot2(roomView)
++func NewRoomList(scrollArea *widgets.QScrollArea) (roomViewLayout *QRoomVBoxLayoutWithTriggerSlot) {
++ roomViewLayout = NewQRoomVBoxLayoutWithTriggerSlot2(scrollArea.Widget())
+
+ roomViewLayout.SetSpacing(0)
+ roomViewLayout.SetContentsMargins(0, 0, 0, 0)
+- roomView.SetContentsMargins(0, 0, 0, 0)
+- scrollArea.SetWidget(roomView)
++ scrollArea.Widget().SetContentsMargins(0, 0, 0, 0)
+ scrollArea.Widget().SetLayout(roomViewLayout)
+
+ return
+ }
+
+ // NewRoom adds a new room object to the view
+-func (roomViewLayout *QRoomVBoxLayoutWithTriggerSlot) NewRoom(room *matrix.Room, scrollArea *widgets.QScrollArea, mainUIStruct *MainUI) (err error) {
++func (roomViewLayout *QRoomVBoxLayoutWithTriggerSlot) NewRoom(room *rooms.Room, scrollArea *widgets.QScrollArea) (err error) {
+ roomAvatar, roomAvatarErr := room.GetRoomAvatar()
+ if roomAvatarErr != nil {
+ err = roomAvatarErr
+@@ -61,42 +61,38 @@ func (roomViewLayout *QRoomVBoxLayoutWithTriggerSlot) NewRoom(room *matrix.Room,
+ roomName := widgets.NewQLabelFromPointer(widget.FindChild("roomName", core.Qt__FindChildrenRecursively).Pointer())
+ /*lastMessageContent := widgets.NewQLabelFromPointer(widget.FindChild("lastMessage", core.Qt__FindChildrenRecursively).Pointer())*/
+
+- roomAvatarQLabel.SetPixmap(roomAvatar)
+- roomName.SetText(room.GetRoomName())
++ roomAvatarQLabel.ConnectSetPixmap(func(vqp *gui.QPixmap) {
++ log.Println("SetPixmapEventRoomAvatar")
+
+- /*
+- messageContent.SetText(markdownMessage)
++ vqp.Scaled2(roomAvatarQLabel.Width(), roomAvatarQLabel.Height(), 0, 0)
+
+- messageContent.SetMinimumWidth(messageContent.LineWidth())
++ newPixmap := gui.NewQPixmap3(2*roomAvatarQLabel.Width(), 2*roomAvatarQLabel.Height())
++ newPixmap.Fill(nil)
+
+- roomWidget.SetMinimumWidth(messageContent.LineWidth() + 100)
+- */
+- widget.Resize(wrapperWidget.Size())
++ painter := gui.NewQPainter2(newPixmap)
+
+- var filterObject = core.NewQObject(nil)
+- filterObject.ConnectEventFilter(func(watched *core.QObject, event *core.QEvent) bool {
+- if event.Type() == core.QEvent__MouseButtonPress {
+- var mouseEvent = gui.NewQMouseEventFromPointer(event.Pointer())
++ r := gui.NewQRegion2(roomAvatarQLabel.Width()/2, roomAvatarQLabel.Height()/2, roomAvatarQLabel.Width(), roomAvatarQLabel.Height(), gui.QRegion__Ellipse)
+
+- if mouseEvent.Button() == core.Qt__LeftButton {
+- if mainUIStruct.currentRoom != room.RoomID {
+- mainUIStruct.SetCurrentRoom(room.RoomID)
+- mainUIStruct.MainWidget.SetWindowTitle("Morpheus - " + room.GetRoomTopic())
++ painter.SetClipRegion(r, 0)
+
+- mainUIStruct.RoomAvatar.SetPixmap(roomAvatar)
++ painter.DrawPixmap10(roomAvatarQLabel.Rect(), vqp)
++ newImage := newPixmap.ToImage()
++ vqp.FromImage(newImage, 0)
++ })
+
+- mainUIStruct.RoomTitle.SetText(room.GetRoomName())
++ roomAvatarQLabel.SetPixmap(roomAvatar)
++ roomName.SetText(room.GetRoomName())
+
+- mainUIStruct.RoomTopic.SetText(room.GetRoomTopic())
+- count := mainUIStruct.MessageListLayout.Count()
+- for i := 0; i < count; i++ {
+- widgetScroll := mainUIStruct.MessageListLayout.ItemAt(i).Widget()
+- widgetScroll.DeleteLater()
+- }
++ wrapperWidget.Resize2(scrollArea.Widget().Size().Width(), wrapperWidget.Size().Height())
++ widget.Resize2(scrollArea.Widget().Size().Width(), wrapperWidget.Size().Height())
+
+- go mainUIStruct.loadCache()
+- }
++ var filterObject = core.NewQObject(nil)
++ filterObject.ConnectEventFilter(func(watched *core.QObject, event *core.QEvent) bool {
++ if event.Type() == core.QEvent__MouseButtonPress {
++ var mouseEvent = gui.NewQMouseEventFromPointer(event.Pointer())
+
++ if mouseEvent.Button() == core.Qt__LeftButton {
++ go roomViewLayout.ChangeRoom(room.RoomID)
+ return true
+ }
+
+@@ -112,6 +108,9 @@ func (roomViewLayout *QRoomVBoxLayoutWithTriggerSlot) NewRoom(room *matrix.Room,
+ wrapperWidget.InstallEventFilter(filterObject)
+
+ roomViewLayout.InsertWidget(roomViewLayout.Count()+1, wrapperWidget, 0, 0)
++ scrollArea.SetWidgetResizable(true)
++ scrollArea.Resize2(wrapperWidget.Size().Width(), scrollArea.Widget().Size().Height())
++ scrollArea.Widget().Resize2(wrapperWidget.Size().Width(), scrollArea.Widget().Size().Height())
+
+ return
+ }
+diff --git a/ui/types.go b/ui/types.go
+index ea32e62..7364a0f 100644
+--- a/ui/types.go
++++ b/ui/types.go
+@@ -1,70 +1,36 @@
+ package ui
+
+ import (
+- "github.com/Nordgedanken/Morpheus/matrix"
+- "github.com/Nordgedanken/Morpheus/matrix/db"
++ "github.com/Nordgedanken/Morpheus/matrix/globalTypes"
+ "github.com/Nordgedanken/Morpheus/matrix/syncer"
+- "github.com/matrix-org/gomatrix"
+ "github.com/therecipe/qt/widgets"
+ )
+
+-// Config holds important reused information in the UI
+-type config struct {
+- username string
+- password string
+-
+- windowWidth int
+- windowHeight int
+-
+- matrixClient
+-}
+-
+-type matrixClient struct {
+- databases
+- cli *gomatrix.Client
+- syncer *syncer.MorpheusSyncer
+-}
+-
+-// GetCli returns the Matrix Client
+-func (mc *matrixClient) GetCli() *gomatrix.Client{
+- return mc.cli
+-}
+-
+-type databases struct {
+- cacheDB db.Storer
+-}
+-
+-// SetCurrentRoom sets the new room ID of the MainUI
+-func (d *databases) SetCacheDB(db db.Storer) {
+- d.cacheDB = db
+-}
+-
+ // MainUI holds information about the MainUI
+ type MainUI struct {
+- config
++ globalTypes.Config
+
+ widget *widgets.QWidget
+ RoomAvatar *widgets.QLabel
+ RoomTitle *widgets.QLabel
+ RoomTopic *widgets.QLabel
+ MainWidget *widgets.QWidget
+- MessageListLayout *QVBoxLayoutWithTriggerSlot
+ messageScrollArea *widgets.QScrollArea
++ roomScrollArea *widgets.QScrollArea
+
+- window *widgets.QMainWindow
+- storage *syncer.MorpheusStore
+- rooms map[string]*matrix.Room
+- currentRoom string
++ window *widgets.QMainWindow
++ storage *syncer.MorpheusStore
+ }
+
+ // SetCurrentRoom sets the new room ID of the MainUI
+ func (m *MainUI) SetCurrentRoom(RoomID string) {
+- m.currentRoom = RoomID
++ m.CurrentRoom = RoomID
+ }
+
+ // LoginUI holds information about the LoginUI
+ type LoginUI struct {
+- config
++ globalTypes.Config
++
+ LoginWidget *widgets.QWidget
+ widget *widgets.QWidget
+ window *widgets.QMainWindow
diff --git a/pulls/63.json b/pulls/63.json
@@ -0,0 +1,20 @@
+{
+ "number": 63,
+ "title": "Update Scalar Branch",
+ "state": "closed",
+ "diff_file": "63.diff",
+ "author": "MTRNord",
+ "created_at": "2018-01-22T14:00:04Z",
+ "closed_at": "2018-01-22T14:00:37Z",
+ "merged_at": null,
+ "base_ref": "feature/Morpheus-7_Scalar",
+ "head_ref": "develop",
+ "labels": [],
+ "assignees": [
+ "MTRNord"
+ ],
+ "requested_reviewers": [],
+ "body": "",
+ "comments": [],
+ "review_comments": []
+}
diff --git a/pulls/63.md b/pulls/63.md
@@ -0,0 +1,14 @@
+# PR #63 Update Scalar Branch
+
+- **Status:** closed
+- **Author:** @MTRNord
+- **Created:** 2018-01-22T14:00:04Z
+- **Branch:** develop → feature/Morpheus-7_Scalar
+- **Closed:** 2018-01-22T14:00:37Z
+- **Assignees:** @MTRNord
+- **Diff:** [63.diff](./63.diff)
+
+---
+
+_No description._
+
diff --git a/pulls/66.json b/pulls/66.json
@@ -0,0 +1,22 @@
+{
+ "number": 66,
+ "title": "Develop",
+ "state": "open",
+ "diff_file": null,
+ "author": "MTRNord",
+ "created_at": "2018-01-29T18:20:58Z",
+ "closed_at": null,
+ "merged_at": null,
+ "base_ref": "master",
+ "head_ref": "develop",
+ "labels": [
+ "in progress"
+ ],
+ "assignees": [
+ "MTRNord"
+ ],
+ "requested_reviewers": [],
+ "body": "",
+ "comments": [],
+ "review_comments": []
+}
diff --git a/pulls/66.md b/pulls/66.md
@@ -0,0 +1,14 @@
+# PR #66 Develop
+
+- **Status:** open
+- **Author:** @MTRNord
+- **Created:** 2018-01-29T18:20:58Z
+- **Branch:** develop → master
+- **Labels:** in progress
+- **Assignees:** @MTRNord
+- **Diff:** _not available (branch/fork likely deleted on GitHub)_
+
+---
+
+_No description._
+