Search
Write a publication
Pull to refresh
0
0
Денис Клычков @kdsx

Пользователь

Send message
Джек женат, а Джордж – нет

Джордж не женат.

У Qt своих заморочек хватает, но вполне сносно.


Набросал аналог одним файлом:


main.qml
import QtQuick 2.11
import QtQuick.Window 2.11
import QtQuick.Controls 2.2
import QtQuick.Controls.Material 2.4

ApplicationWindow {
    id: window

    visible: true
    width: 320
    height: 480
    title: qsTr("Animated Buttons")

    Material.theme: Material.Light
    Material.primary: Material.Blue

    property string currentLanguage: ""
    property bool buttonsOpened: false

    ListModel {
        id: buttonsModel

        ListElement {
            name: "C++"
            icon: "cpp.svg"
        }
        ListElement {
            name: "PHP"
            icon: "php.svg"
        }
        ListElement {
            name: "Python"
            icon: "python.svg"
        }
    }

    Column {
        anchors {
            bottom: editButton.top
            bottomMargin: 16
            horizontalCenter: editButton.horizontalCenter
        }

        Repeater {
            id: repeater
            model: buttonsModel

            delegate: Item {
                id: wrapper

                width: 46
                height: 46

                RoundButton {
                    id: button
                    width: 46
                    height: 46
                    icon.source: model.icon
                    Material.elevation: 5
                    Material.background: Material.Blue
                    onClicked: currentLanguage = model.name

                    state: buttonsOpened ? "opened" : "closed"
                    states: [
                        State {
                            name: "opened"
                            ParentChange { target: button; parent: wrapper; x: 0; y: 0 }
                        },
                        State {
                            name: "closed"
                            ParentChange { target: button; parent: dock; x: 0; y: 0 }
                        }
                    ]
                    transitions: [
                        Transition {
                            from: "opened"
                            to: "closed"
                            ParentAnimation {
                                NumberAnimation {
                                    property: "y"
                                    duration: 500
                                    easing.type: Easing.InElastic
                                }
                            }
                        },
                        Transition {
                            from: "closed"
                            to: "opened"
                            ParentAnimation {
                                NumberAnimation {
                                    property: "y"
                                    duration: 500
                                    easing.type: Easing.OutElastic
                                }
                            }
                        }
                    ]
                }

                Rectangle {
                    id: label

                    implicitWidth: text.implicitWidth
                    implicitHeight: text.implicitHeight

                    anchors.verticalCenter: parent.verticalCenter

                    color: Material.primary
                    border.color: "#70000000"
                    radius: 3

                    Text {
                        id: text
                        leftPadding: 6
                        rightPadding: 6
                        anchors.centerIn: parent
                        font.bold: true
                        text: model.name
                    }

                    state: buttonsOpened ? "opened" : "closed"
                    states: [
                        State {
                            name: "opened"
                            PropertyChanges { target: label; x: -width - 8 }
                        },
                        State {
                            name: "closed"
                            PropertyChanges { target: label; x: -width - window.width }
                        }
                    ]
                    transitions: [
                        Transition {
                            from: "opened"
                            to: "closed"
                            NumberAnimation {
                                property: "x"
                                duration: 1000 - (repeater.count - index) * 300
                                easing.type: Easing.InElastic
                            }
                        },
                        Transition {
                            from: "closed"
                            to: "opened"
                            NumberAnimation {
                                property: "x"
                                duration: 500 * (repeater.count - index + 1)
                                easing.type: Easing.OutElastic
                            }
                        }
                    ]
                }
            }
        }
    }

    Item {
        id: dock
        width: 46
        height: 46
        anchors.centerIn: editButton
    }

    RoundButton {
        id: editButton
        anchors.bottom: parent.bottom
        anchors.right: parent.right
        width: 56
        height: 56
        icon.source: "edit.svg"
        Material.elevation: 5
        Material.background: Material.Blue
        onClicked: buttonsOpened = !buttonsOpened
    }

    Text {
        y: window.height / 3
        anchors.horizontalCenter: parent.horizontalCenter
        textFormat: Text.StyledText
        font.bold: true
        text: currentLanguage
            ? qsTr("I program in %1").arg(
                "<font color=\"%1\">%2</font>").arg(Material.primary).arg(currentLanguage)
            : ""
    }
}

Discord умеет сообщать о появлении нового пользователя специальным сообщением в указанный канал. У нас поток людей небольшой, поэтому таким каналом назначен просто #general. А вообще можно создать специальный канал для этой цели, невидимый никому, кроме модераторов, и по нему отслеживать.


хорошо бы бота написать, чтобы при регистрации юзера с почтой из нужного домена добавлять роль

Его API я не ковырял, но судя по даной странице, это вполне возможно.


Automatically join private Discord servers or gain new roles based on external website permissions

Да и вряд ли в Discord такое появится в ближайшем будущем. И целевая аудитория совсем не та, где это нужно, и подход к учётным записям иной (они глобальные). На своём сервере пока обходимся двумя вещами:
1) invite-link не рассылается кому попало;
2) даже если на сервер попадёт кто-то лишний (впрочем такого пока не случалось, кроме тестов), ему не будет доступно ничего до явного назначения роли модератором.

Да и я не предлагал Discord как лучший выбор. У него и кроме облачной натуры хватает своих проблем и багов. Просто если какая-то компания уже использует Slack, то ей, скорее всего, не принципиально, где хранится переписка. Если же далее этой компании не нравится, что за хранение истории в Slack приходится платить, то стоит рассмотреть Discord как альтернативу.

Да, действительно :)

Пока в этом плане неплохо выступает Conan.

Мне сходу придумалось только использование в юнит-тестах.


Но полезность фичи, кончено, зашкаливает.

Как и у Slack, который для корпоративной переписки и был создан.

Далеко не идеальный, но очень неплохой вариант — Discord. Хотя Rocket мне кажется более подходящим для корпоративной переписки. Может использовали бы его (Rocket), если бы ни ужасное мобильное приложение.

А что вы скажете про QML?

С релизом QBS 1.8 разработчики объявили, что станет основным в Qt 6.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity