From 1011d4a4f9a1f9f5295a4049e97001a1e6cb6a91 Mon Sep 17 00:00:00 2001 From: erinn Date: Mon, 29 Oct 2018 11:00:21 -0700 Subject: [PATCH] initial commit --- chatchannellistener.go | 6 +- gcd.go | 24 ++++-- main.go | 57 +++++++++----- qml/main.qml | 132 ++++++++++++++++++++++++++++++--- qml/widgets/Contact.qml | 5 +- qml/widgets/Contact.qmlc | Bin 12296 -> 0 bytes qml/widgets/ContactList.qmlc | Bin 7512 -> 0 bytes qml/widgets/ContactPicture.qml | 1 - qml/widgets/Message.qml | 35 +++++++-- qml/widgets/Message.qmlc | Bin 8972 -> 0 bytes qml/widgets/MessageList.qml | 32 +++++--- qml/widgets/MessageList.qmlc | Bin 18888 -> 0 bytes qml/widgets/MyProfile.qml | 63 ++++++++++++---- qml/widgets/MyProfile.qmlc | Bin 18920 -> 21392 bytes qml/widgets/StackToolbar.qml | 49 ++++++++++++ 15 files changed, 331 insertions(+), 73 deletions(-) delete mode 100644 qml/widgets/Contact.qmlc delete mode 100644 qml/widgets/ContactList.qmlc delete mode 100644 qml/widgets/Message.qmlc delete mode 100644 qml/widgets/MessageList.qmlc create mode 100644 qml/widgets/StackToolbar.qml diff --git a/chatchannellistener.go b/chatchannellistener.go index 50eb77c..dcaa873 100644 --- a/chatchannellistener.go +++ b/chatchannellistener.go @@ -32,7 +32,11 @@ func (this *ChatChannelListener) OpenInbound() { } func (this *ChatChannelListener) ChatMessage(messageID uint32, when time.Time, message string) bool { - DeliverMessageToUI(this.rai.RemoteHostname, message, uint(messageID), false, when) + DeliverMessageToUI(this.rai.RemoteHostname, this.rai.RemoteHostname, "", message, uint(messageID), false, when) + go func() { + time.Sleep(time.Second) + peer.Save() + }() return true } diff --git a/gcd.go b/gcd.go index 3bd7c7c..f61dfe6 100644 --- a/gcd.go +++ b/gcd.go @@ -18,7 +18,7 @@ type GrandCentralDispatcher struct { currentOpenConversation string // messages pane stuff - _ func(from, message string, mID uint, ts string) `signal:"AppendMessage"` + _ func(from, message, displayname string, mID uint, ts, source string) `signal:"AppendMessage"` _ func() `signal:"ClearMessages"` _ func() `signal:"ResetMessagePane"` _ func(uint) `signal:"Acknowledged"` @@ -78,7 +78,7 @@ func (this *GrandCentralDispatcher) sendMessage(message string, mID uint) { default: } - DeliverMessageToUI(gcd.currentOpenConversation, message, mID, true, time.Now()) + DeliverMessageToUI(gcd.currentOpenConversation, gcd.currentOpenConversation, "", message, mID, true, time.Now()) } func (this *GrandCentralDispatcher) loadMessagesPane(onion string) { @@ -86,15 +86,27 @@ func (this *GrandCentralDispatcher) loadMessagesPane(onion string) { gcd.currentOpenConversation = onion gcd.SetUnread(onion, 0) - if len(onion) == 32 { // eg 48e7dcfc353e6d77da2c31d63654fd19 + if len(onion) == 32 { // LOAD GROUP log.Printf("LOADING GROUP %s", onion) tl := peer.GetGroup(onion).GetTimeline() log.Printf("messages: %d", len(tl)) for i := range tl { - gcd.AppendMessage(tl[i].PeerID, tl[i].Message, 0, tl[i].Timestamp.Format(TIME_FORMAT)) + var handle string + if tl[i].PeerID == peer.GetProfile().Onion { + handle = "me" + } else { + handle = tl[i].PeerID + } + var name string + var exists bool + name, exists = peer.GetProfile().GetCustomAttribute(tl[i].PeerID + "_name") + if !exists || name == "" { + name = tl[i].PeerID[:16] + "..." + } + gcd.AppendMessage(handle, tl[i].Message, name, 0, tl[i].Timestamp.Format(TIME_FORMAT), randomProfileImage(tl[i].PeerID)) } return - } + } // ELSE LOAD CONTACT _, exists := contactMgr[onion] if exists { // (if not, they haven't been accepted as a contact yet) @@ -106,7 +118,7 @@ func (this *GrandCentralDispatcher) loadMessagesPane(onion string) { if messages[i].FromMe { from = "me" } - gcd.AppendMessage(from, messages[i].Message, messages[i].MessageID, messages[i].Timestamp.Format(TIME_FORMAT)) + gcd.AppendMessage(from, messages[i].Message, "", messages[i].MessageID, messages[i].Timestamp.Format(TIME_FORMAT), randomProfileImage(onion)) } } } diff --git a/main.go b/main.go index 26b0e54..aaa27ba 100644 --- a/main.go +++ b/main.go @@ -52,21 +52,21 @@ type Message struct { Timestamp time.Time } -func DeliverMessageToUI(from, message string, mID uint, fromMe bool, ts time.Time) { - _, found := contactMgr[from] +func DeliverMessageToUI(handle, from, displayname, message string, mID uint, fromMe bool, ts time.Time) { + _, found := contactMgr[handle] if !found { - contactMgr[from] = &Contact{[]Message{}, 0, 0} + contactMgr[handle] = &Contact{[]Message{}, 0, 0} } - contactMgr[from].AddMessage(Message{from, message, fromMe, mID, ts}) - if gcd.currentOpenConversation == from { + contactMgr[handle].AddMessage(Message{from, message, fromMe, mID, ts}) + if gcd.currentOpenConversation == handle { if fromMe { from = "me" } - gcd.AppendMessage(from, message, mID, ts.Format(TIME_FORMAT)) + gcd.AppendMessage(from, message, displayname, mID, ts.Format(TIME_FORMAT), randomProfileImage(from)) } else { - contactMgr[from].Unread++ - gcd.SetUnread(from, contactMgr[from].Unread) + contactMgr[handle].Unread++ + gcd.SetUnread(handle, contactMgr[handle].Unread) } } @@ -83,7 +83,9 @@ func main() { quickcontrols2.QQuickStyle_SetStyle("Universe") view := quick.NewQQuickView(nil) view.SetResizeMode(quick.QQuickView__SizeRootObjectToView) - view.SetTitle("bounce") + view.SetMinimumHeight(280) + view.SetMinimumWidth(300) + view.SetTitle("cwtch") gcd = NewGrandCentralDispatcher(nil) view.RootContext().SetContextProperty("gcd", gcd) @@ -113,11 +115,12 @@ func groupPoller() { groups := peer.GetGroups() for i := range groups { group := peer.GetGroup(groups[i]) - log.Printf("setting group %s to status %d", groups[i], int(servers[group.GroupServer])) + //log.Printf("setting group %s to status %d", groups[i], int(servers[group.GroupServer])) gcd.SetConnectionStatus(groups[i], int(servers[group.GroupServer])) } } } + func presencePoller() { // TODO: make this subscribe-able in ricochet time.Sleep(time.Second * 4) for { @@ -181,8 +184,22 @@ func torStatusPoller() { func cwtchListener(groupID string, channel chan model.Message) { for { m := <-channel - log.Printf("GROUPMSG %s", m.Message) - DeliverMessageToUI(groupID, m.Message, 0, m.PeerID == peer.GetProfile().Onion, m.Timestamp) + log.Printf("GROUPMSG %s %s", m.Message, m.PeerID) + name := m.PeerID + if name == peer.GetProfile().Onion { + name = "me" + } else { + var exists bool // lol this is a golang antifeature + name, exists = peer.GetProfile().GetCustomAttribute(m.PeerID + "_name") + if !exists { + name = "" + } + } + if name == "" { + name = m.PeerID[:16] + "..." + } + DeliverMessageToUI(groupID, m.PeerID, name, m.Message, 0, m.PeerID == peer.GetProfile().Onion, m.Timestamp) + peer.Save() } } @@ -225,19 +242,20 @@ func andHisBlackAndWhiteCat(incomingMessages chan Message) { } func initialize(view *quick.QQuickView) { + log.Printf(os.Args[0]) //TODO: this section is ported over and has a lot of printf errors, need to show them in the ui var dirname, filename string - if os.Getenv("SENDAFRIEND_FOLDER") != "" { - dirname = os.Getenv("SENDAFRIEND_FOLDER") - filename = path.Join(dirname, "identity.private") + if os.Getenv("CWTCH_FOLDER") != "" { + dirname = os.Getenv("CWTCH_FOLDER") + filename = path.Join(dirname, "keep-this-file-private") } else { usr, err := user.Current() if err != nil { fmt.Printf("\nerror: could not load current user: %v\n", err) os.Exit(1) } - dirname = path.Join(usr.HomeDir, ".sendafriend") - filename = path.Join(dirname, "identity.private") + dirname = path.Join(usr.HomeDir, ".cwtch") + filename = path.Join(dirname, "keep-this-file-private") } os.MkdirAll(dirname, 0700) @@ -293,6 +311,11 @@ func initialize(view *quick.QQuickView) { // temporary until we do real picture selection func randomProfileImage(onion string) string { + //TODO: this is a hack, fix ever passing this in + if onion == "me" { + onion = peer.GetProfile().Onion + } + choices := []string{"001-centaur", "002-kraken", "003-dinosaur", "004-tree-1", "005-hand", "006-echidna", "007-robot", "008-mushroom", "009-harpy", "010-phoenix", "011-dragon-1", "012-devil", "013-troll", "014-alien", "015-minotaur", "016-madre-monte", "017-satyr", "018-karakasakozou", "019-pirate", "020-werewolf", "021-scarecrow", "022-valkyrie", "023-curupira", "024-loch-ness-monster", "025-tree", "026-cerberus", "027-gryphon", "028-mermaid", "029-vampire", "030-goblin", "031-yeti", "032-leprechaun", "033-medusa", "034-chimera", "035-elf", "036-hydra", "037-cyclops", "038-pegasus", "039-narwhal", "040-woodcutter", "041-zombie", "042-dragon", "043-frankenstein", "044-witch", "045-fairy", "046-genie", "047-pinocchio", "048-ghost", "049-wizard", "050-unicorn"} barr, err := base32.StdEncoding.DecodeString(strings.ToUpper(onion)) if err != nil || len(barr) != 35 { diff --git a/qml/main.qml b/qml/main.qml index 1c05f56..3925599 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -8,17 +8,18 @@ import "fonts/Twemoji.js" as T import "widgets" Item { + id: windowItem width: 525 height: 500 - id: root + readonly property real ratio: height / width - FontAwesome { + FontAwesome { // PRETTY BUTTON ICONS id: awesome resource: "qrc:/qml/fonts/fontawesome.ttf" } - function parse(text, size) { + function parse(text, size) { // REPLACE EMOJI WITH TAGS T.twemoji.base = "qrc:/qml/fonts/twemoji/" T.twemoji.ext = ".png" T.twemoji.size = "72x72" @@ -26,7 +27,7 @@ Item { return T.twemoji.parse(text) } - function restoreEmoji(text) { + function restoreEmoji(text) { // REPLACE TAGS WITH EMOJI var re = //g var arr var newtext = text @@ -42,7 +43,57 @@ Item { } - RowLayout { + /* Rectangle { // THE TOOLBAR + id: toolbar + anchors.top: parent.top + anchors.left: parent.left + width: ratio >= 0.92 ? parent.width : 70 + height: ratio >= 0.92 ? 70 : parent.height + color: "#4B3557" + + GridLayout { + width: parent.width + height: parent.height + columns: ratio >= 0.92 ? children.length : 1 + + + ContactPicture { + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + source: "qrc:/qml/images/profiles/001-centaur.png" + status: -2 + } + + ContactPicture { + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + source: "qrc:/qml/images/profiles/002-kraken.png" + status: -2 + } + + ContactPicture { + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + source: "qrc:/qml/images/profiles/003-dinosaur.png" + status: -2 + } + + ContactPicture { + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + source: "qrc:/qml/images/profiles/004-tree-1.png" + status: -2 + } + + ContactPicture { + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + source: "qrc:/qml/images/profiles/005-hand.png" + status: -2 + } + } + }*/ + + RowLayout { // CONTAINS EVERYTHING EXCEPT THE TOOLBAR + /* anchors.left: ratio >= 0.92 ? parent.left : toolbar.right + anchors.top: ratio >= 0.92 ? toolbar.bottom : parent.top + anchors.right: parent.right + anchors.bottom: parent.bottom */ anchors.fill: parent spacing: 0 @@ -50,8 +101,9 @@ Item { Rectangle { // THE LEFT PANE WITH TOOLS AND CONTACTS color: "#D2C0DD" Layout.fillHeight: true - Layout.minimumWidth: 200 - Layout.maximumWidth: 200 + Layout.minimumWidth: Layout.maximumWidth + Layout.maximumWidth: theStack.pane == theStack.emptyPane ? parent.width : 200 + visible: (ratio <= 1.08 && windowItem.width >= 500) || theStack.pane == theStack.emptyPane ContactList{ @@ -59,21 +111,79 @@ Item { } } - Rectangle { // THE RIGHT PANE WHERE THE MESSAGES GO + Rectangle { // THE RIGHT PANE WHERE THE MESSAGES AND STuFF GO color: "#EEEEFF" Layout.fillWidth: true Layout.fillHeight: true - MessageList{ + StackLayout { + id: theStack anchors.fill: parent + currentIndex: 0 + + property alias pane: theStack.currentIndex + readonly property int emptyPane: 0 + readonly property int messagePane: 1 + readonly property int settingsPane: 2 + readonly property int userProfilePane: 3 + readonly property int groupProfilePane: 4 + + + Item {} // empty + + MessageList { // messagePane + anchors.fill: parent + } + + ColumnLayout { // settingsPane + anchors.fill: parent + + + StackToolbar { + text: "Cwtch Settings" + aux.visible: false + } + + Label { text: "welcome to the global app settings page!" } + } + + ColumnLayout { // userProfilePane + anchors.fill: parent + + + StackToolbar { + text: "Settings for Sarah" + aux.visible: false + + back.onClicked: theStack.pane = theStack.messagePane + } + + Label { text: "per-user things like contact name and picture will be edited here" } + } + + Label { // groupProfilePane + font.pixelSize: 12 + text: "invite new people or change the group name here" + + + StackToolbar { text: "Group settings" } + } + + Label { // addGroupPane + font.pixelSize: 12 + text: "add a new group" + + + StackToolbar { text: "Create group" } + } } } } PropertyAnimation { id: anmPopup; easing.type: Easing.InQuart; duration: 7000; target: popup; property: "opacity"; to: 0; } - Rectangle { + Rectangle { // THE ERROR MESSAGE POPUP id: popup anchors.top: parent.top anchors.horizontalCenter: parent.horizontalCenter @@ -96,7 +206,7 @@ Item { } - Connections { + Connections { // POPUPS ARE INVOKED BY GO FUNCS target: gcd onInvokePopup: function(str) { diff --git a/qml/widgets/Contact.qml b/qml/widgets/Contact.qml index 4bebd3e..f94f5a4 100644 --- a/qml/widgets/Contact.qml +++ b/qml/widgets/Contact.qml @@ -57,7 +57,7 @@ RowLayout { // LOTS OF NESTING TO DEAL WITH QT WEIRDNESS, SORRY id: rectUnread anchors.right: parent.right height: 16 - width: childrenRect.width + 10 + width: lblUnread.width + 10 radius: 8 color: "#4B3557" visible: badge != "0" @@ -65,6 +65,7 @@ RowLayout { // LOTS OF NESTING TO DEAL WITH QT WEIRDNESS, SORRY Label { + id: lblUnread anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter color: "#FFFFFF" @@ -82,6 +83,7 @@ RowLayout { // LOTS OF NESTING TO DEAL WITH QT WEIRDNESS, SORRY onClicked: { gcd.broadcast("ResetMessagePane") isActive = true + theStack.pane = theStack.messagePane gcd.loadMessagesPane(onion) } @@ -108,7 +110,6 @@ RowLayout { // LOTS OF NESTING TO DEAL WITH QT WEIRDNESS, SORRY } onSetConnectionStatus: function(foronion, x) { - if (foronion.length == 32) console.log(onion+" setting status "+x+" for contact "+foronion) if (onion == foronion) { status = x } diff --git a/qml/widgets/Contact.qmlc b/qml/widgets/Contact.qmlc deleted file mode 100644 index a383a2648fc3556c1362fd72bccf97500cd7a2d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12296 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 root.parent.width - 70 ? root.parent.width - 70 : dummy.width + width: Math.min(dummy.width, root.parent.width - (imgProfile.visible ? imgProfile.width : 0) - 40) wrapMode: TextEdit.Wrap textFormat: Text.RichText } } RowLayout { + id: rowBottom anchors.left: parent.left anchors.right: parent.right - Label { + Label { // TIMESTAMP id: ts color: "#FFFFFF" font.pixelSize: 10 @@ -82,13 +99,15 @@ RowLayout { leftPadding: 10 } - Label { + Label { text: dummy.width+", "+root.width } + + Label { // MESSAGE ACKNOWLEDGMENT id: ack color: "#FFFFFF" font.pixelSize: 10 anchors.right: parent.right font.family: "FontAwesome" - text: from == "me" ? awesome.icons.fa_ellipsis_h : "" + text: from == "me" ? awesome.icons.fa_ellipsis_h : displayname } } } diff --git a/qml/widgets/Message.qmlc b/qml/widgets/Message.qmlc deleted file mode 100644 index a38dd1a341198471bedc7d7da3b3031c45572556..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8972 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 sv.contentHeight - colMessages.height && sv.contentHeight > sv.height) { @@ -67,8 +75,10 @@ ColumnLayout { delegate: Message { from: f message: m + displayname: d messageID: i timestamp: t + source: src } } } @@ -98,9 +108,7 @@ ColumnLayout { maximumFlickVelocity: 300 - ScrollBar.vertical: ScrollBar{ - policy: ScrollBar.AlwaysOn - } + ScrollBar.vertical: ScrollBar{} TextEdit { id: txtMessage @@ -116,7 +124,7 @@ ColumnLayout { Keys.onReturnPressed: { // CTRL+ENTER = LINEBREAK if (event.modifiers & Qt.ControlModifier) { - txtMessage.insert(txtMessage.cursorPosition, "\n") + txtMessage.insert(txtMessage.cursorPosition, "
") } else if (event.modifiers == Qt.NoModifier) { btnSend.clicked() } @@ -126,7 +134,7 @@ ColumnLayout { // while also stripping any other tag, including other images. // TODO: this probably breaks if people actually do want to paste html onTextChanged: { - console.log("onTextChanged()") + //console.log("onTextChanged()") // we're taking advantage of TextEdit.getText()'s parsing capability, which means occasionally // passing text into it to be filtered. this prevents recursive calls putting us into an @@ -137,7 +145,7 @@ ColumnLayout { return } - console.log("1: " + txtMessage.getText(0, txtMessage.text.length)) + //console.log("1: " + txtMessage.getText(0, txtMessage.text.length)) // convert tags back to their emoji form var nt = restoreEmoji(txtMessage.text) @@ -146,15 +154,15 @@ ColumnLayout { txtMessage.text = nt } - console.log("2: " + txtMessage.getText(0, txtMessage.text.length)) + //console.log("2: " + txtMessage.getText(0, txtMessage.text.length)) // strip all HTML tags var theText = txtMessage.getText(0, txtMessage.text.length) - console.log("3: " + theText) + //console.log("3: " + theText) // convert emoji back to tags nt = parse(theText, 10) - console.log("4: " + nt) + //console.log("4: " + nt) // if there were changes... if (nt != txtMessage.getText(0, txtMessage.text.length)) { diff --git a/qml/widgets/MessageList.qmlc b/qml/widgets/MessageList.qmlc deleted file mode 100644 index deb16e43cbe9e9e8617a51e209f6fc37e696b2fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18888 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 diff --git a/qml/widgets/MyProfile.qml b/qml/widgets/MyProfile.qml index e832e36..2e74c04 100644 --- a/qml/widgets/MyProfile.qml +++ b/qml/widgets/MyProfile.qml @@ -2,6 +2,7 @@ import QtGraphicalEffects 1.0 import QtQuick 2.7 import QtQuick.Controls 2.4 import QtQuick.Controls.Material 2.0 +import QtQuick.Controls.Styles 1.4 import QtQuick.Layouts 1.3 ColumnLayout { @@ -10,8 +11,8 @@ ColumnLayout { width: parent.width property alias image: imgProfileImg.source - property alias nick: lblNick.text - property alias onion: lblOnion.text + property string nick + property string onion Item{ height: 6 } @@ -93,23 +94,56 @@ ColumnLayout { } } - InplaceEditText { // USER NICKNAME - id: lblNick - anchors.horizontalCenter: parent.horizontalCenter - width: parent.width + //InplaceEditText { // USER NICKNAME + // id: lblNick + // anchors.horizontalCenter: parent.horizontalCenter + // width: parent.width + // + // onUpdated: { + // gcd.updateNick(lblNick.text) + // } + //} - onUpdated: { - gcd.updateNick(lblNick.text) + Text { + id: txtNick + fontSizeMode: Text.HorizontalFit + minimumPixelSize: 10 + font.pixelSize: 20 + width: 195 + anchors.horizontalCenter: parent.horizontalCenter + text: cbNick.editText + + MouseArea { + anchors.fill: parent + onClicked: { + parent.visible = false + cbNick.visible = true + } + } + } + + ComboBox { // USER NICKNAME + id: cbNick + anchors.horizontalCenter: parent.horizontalCenter + popup.font.pixelSize: 12 + width: 200 + font.pixelSize: 20 + model: ["erinn", "erinn (open privacy)", "supergirl", "add new profile..."] + visible: false + + onCurrentTextChanged: { + visible = false + txtNick.visible = true } } - // TODO: this doesnt quite fit everything :{ Label { // ONION ADDRESS id: lblOnion font.pixelSize: 6 Layout.fillWidth: true padding: 3 horizontalAlignment: Text.AlignHCenter + text: "This is your address. You can give it out to people!\n" + onion } RowLayout { // TOOLS FOR EDITING PROFILE @@ -121,7 +155,7 @@ ColumnLayout { visible: false } - IconButton { + IconButton { // COPY ONION ADDRESS BUTTON icon: awesome.icons.fa_clipboard label: "copy" @@ -133,20 +167,19 @@ ColumnLayout { } } - IconButton { + IconButton { // SETTINGS BUTTON icon: awesome.icons.fa_cog //label: "settings" - onClicked: gcd.popup("not yet implemented, sorry :(") + onClicked: theStack.pane = theStack.settingsPane } - IconButton { + IconButton { // SIGN OUT BUTTON icon: awesome.icons.fa_sign_out //label: "sign out" onClicked: { gcd.popup("not yet implemented, sorry :(") - console.log(parse("💜", 20)) } } } @@ -199,7 +232,7 @@ ColumnLayout { onUpdateMyProfile: function(_nick, _onion, _image) { nick = _nick - onion = "This is your address. You should give it out to people!\n" + _onion + onion = _onion image = _image } diff --git a/qml/widgets/MyProfile.qmlc b/qml/widgets/MyProfile.qmlc index acefdcfe4b213b6b1aec9a71a5caa52f6c32dba6..da21d08616f7c8427c465541bf5798bb26ea748d 100644 GIT binary patch literal 21392 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 diff --git a/qml/widgets/StackToolbar.qml b/qml/widgets/StackToolbar.qml new file mode 100644 index 0000000..4ae957d --- /dev/null +++ b/qml/widgets/StackToolbar.qml @@ -0,0 +1,49 @@ +import QtGraphicalEffects 1.0 +import QtQuick 2.7 +import QtQuick.Controls 2.4 +import QtQuick.Controls.Material 2.0 +import QtQuick.Layouts 1.3 + +import "controls" as Awesome +import "../fonts/Twemoji.js" as T + +Rectangle { // OVERHEAD BAR ON STACK PANE + id: toolbar + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + height: 28 + color: "#EDEDED" + + property alias text: lbl.text + property alias aux: btnAux + property alias back: btnBack + + + IconButton {// BACK BUTTON + id: btnBack + icon: awesome.icons.fa_arrow_circle_o_left + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: 6 + visible: ratio >= 1.08 || windowItem.width < 500 + + onClicked: theStack.pane = theStack.emptyPane + } + + Label { // TEXT + id: lbl + font.pixelSize: 16 + text: "Sarah Jamie Lewis" + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + + IconButton { // COG BUTTON + id: btnAux + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 6 + icon: awesome.icons.fa_cog + } +} \ No newline at end of file