packages feed

hstorchat-0.1.0.0: qml/HSTorChat.qml

import QtQuick 2.0
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1

ApplicationWindow {
    width: 525; height: 400
    title: "HSTorChat"
    visible: true

    toolBar: ToolBar {
        RowLayout {
            anchors.fill: parent
            ComboBox {
                model: [ "Available", "Away", "Extended Away" ]
                onCurrentIndexChanged: { setStatus(model[currentIndex]) }
            }
            TextField {
                id: newbuddy
                anchors.right: addBuddyButton.left
                maximumLength: 16
                focus: true
                validator: RegExpValidator { regExp: /[_\-2-7a-z]+\.onion/ }
                placeholderText: "New buddy..."
            }
            ToolButton {
                id: addBuddyButton
                anchors.right: parent.right
                text: "add"
                onClicked: { newBuddy(newbuddy.text); newbuddy.text = "" }
            }
        }
    }

    ListView {
        id: buddylist
        anchors.left: parent.left
        anchors.top: parent.top
        anchors.bottom: parent.bottom
        anchors.margins: 3
        currentIndex: 0
        clip: true
        width: 160
        focus: true

        Rectangle {
            anchors.fill: parent
            color: "lightgrey"
            z: -1
            radius: 2
        }

        model: buddies
        delegate: Text {
                      width: parent.width
                      text: modelData.onion
                      color: "white"
                      font.pointSize: 11
                      z: 5
                      MouseArea {
                          anchors.fill: parent
                          onClicked: { buddylist.currentIndex = index }
                      }

                      Rectangle {
                        anchors.right: parent.right
                        width: 10; height: parent.height
                        radius: 10
                        color:  { if (modelData.status == "Available")
                                      return "green"
                                  else if (modelData.status == "Handshake")
                                      return "steelblue"
                                  else if (modelData.status == "Away")
                                      return "orange"
                                  else if (modelData.status == "Xa")
                                      return "red"
                                  else
                                      return "grey"
                                }
                      }
                    }

        highlight: Rectangle { color: "grey"; radius: 2 }
    }

    ListView {
        id: msgarea
        anchors.bottom: msgentrylayout.top
        anchors.right: parent.right
        anchors.top: parent.top
        anchors.left: buddylist.right
        anchors.margins: 3
        clip: true
        verticalLayoutDirection: ListView.BottomToTop
        model: { if (buddies[buddylist.currentIndex])
                     buddies[buddylist.currentIndex].msgs }
        delegate: Text { text: modelData.text
                         horizontalAlignment: { if (modelData.fromme)
                                                    Text.AlignRight
                                              }
                         width: parent.width
                         wrapMode: Text.WrapAtWordBoundaryOrAnywhere
                       }

        Image {
            anchors.horizontalCenter: parent.horizontalCenter
            anchors.verticalCenter: parent.verticalCenter
            width: parent.width / 1.3; height: parent.height / 2
            opacity: 0.2
            source: "img/hs.png"
        }
    }


   Rectangle {
        id: msgentrylayout
        anchors.bottom: parent.bottom
        anchors.left: buddylist.right
        anchors.right: parent.right
        anchors.margins: 5

        width: parent.width; height: 80
        border.color: "darkgrey"; border.width: 1; radius: 6

        Flickable {
            id: msgentryflick
            anchors.fill: parent
            anchors.margins: 2

            contentWidth:  msgentry.paintedWidth
            contentHeight: msgentry.paintedHeight
            clip: true

            function ensureVisible(r) {
                if (contentX >= r.x)
                    contentX = r.x;
                else if (contentX+width <= r.x+r.width)
                    contentX = r.x+r.width-width;
                if (contentY >= r.y)
                    contentY = r.y;
                else if (contentY+height <= r.y+r.height)
                    contentY = r.y+r.height-height;
            }

            TextEdit {
                id: msgentry
                width:  msgentryflick.width
                height: msgentryflick.height
                focus: true
                wrapMode: TextEdit.Wrap
                onCursorRectangleChanged: msgentryflick.ensureVisible(cursorRectangle)
                Keys.onReturnPressed: { if (buddylist.length <= 0) return
                                        sendMsg(buddies[buddylist.currentIndex], msgentry.text)
                                        msgentry.text = ""
                                        msgarea.positionViewAtBeginning()
                                      }
            }
        }
    }
}