Skip to content
Snippets Groups Projects
Completer.qml 3.88 KiB
Newer Older
  • Learn to ignore specific revisions
  • Nicolas Werner's avatar
    Nicolas Werner committed
    import QtQuick 2.9
    import QtQuick.Controls 2.3
    import QtQuick.Layouts 1.2
    import im.nheko 1.0
    
    Popup {
        id: popup
    
        property int currentIndex: -1
        property string completerName
        property var completer
    
        property bool bottomToTop: true
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
        function up() {
    
            if (bottomToTop)
                down_();
            else
                up_();
        }
    
        function down() {
            if (bottomToTop)
                up_();
            else
                down_();
        }
    
        function up_() {
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            currentIndex = currentIndex - 1;
            if (currentIndex == -2)
    
                currentIndex = listView.count - 1;
    
        function down_() {
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            currentIndex = currentIndex + 1;
    
            if (currentIndex >= listView.count)
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                currentIndex = -1;
    
        }
    
        function currentCompletion() {
    
            if (currentIndex > -1 && currentIndex < listView.count)
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                return completer.completionAt(currentIndex);
            else
                return null;
        }
    
        onCompleterNameChanged: {
    
            if (completerName) {
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                completer = TimelineManager.timeline.input.completerFor(completerName);
    
                completer.setSearchString("");
            } else {
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                completer = undefined;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
        }
        padding: 0
        onAboutToShow: currentIndex = -1
    
        height: listView.contentHeight
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
    
    Nicolas Werner's avatar
    Nicolas Werner committed
        Connections {
            onTimelineChanged: completer = null
            target: TimelineManager
        }
    
    
        ListView {
            id: listView
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
    
            anchors.fill: parent
            implicitWidth: contentItem.childrenRect.width
            model: completer
            verticalLayoutDirection: popup.bottomToTop ? ListView.BottomToTop : ListView.TopToBottom
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
    
            delegate: Rectangle {
                color: model.index == popup.currentIndex ? colors.highlight : colors.base
                height: chooser.childrenRect.height + 4
                implicitWidth: chooser.childrenRect.width + 4
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
    
                DelegateChooser {
                    id: chooser
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
    
                    roleValue: popup.completerName
                    anchors.centerIn: parent
    
                    DelegateChoice {
                        roleValue: "user"
    
                        RowLayout {
                            id: del
    
                            anchors.centerIn: parent
    
                            Avatar {
                                height: 24
                                width: 24
                                displayName: model.displayName
                                url: model.avatarUrl.replace("mxc://", "image://MxcImage/")
                            }
    
                            Label {
                                text: model.displayName
                                color: model.index == popup.currentIndex ? colors.highlightedText : colors.text
    
                    DelegateChoice {
                        roleValue: "emoji"
    
                        RowLayout {
                            id: del
    
                            anchors.centerIn: parent
    
                            Label {
                                text: model.unicode
                                color: model.index == popup.currentIndex ? colors.highlightedText : colors.text
                                font: Settings.emojiFont
                            }
    
                            Label {
                                text: model.shortName
                                color: model.index == popup.currentIndex ? colors.highlightedText : colors.text
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                        }
    
                    }
    
                }
    
            }
    
        }
    
        enter: Transition {
            NumberAnimation {
                property: "opacity"
                from: 0
                to: 1
                duration: 100
            }
    
        }
    
        exit: Transition {
            NumberAnimation {
                property: "opacity"
                from: 1
                to: 0
                duration: 100
            }
    
        }
    
        background: Rectangle {
    
            color: colors.base
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            implicitHeight: popup.contentHeight
            implicitWidth: popup.contentWidth
        }
    
    }