384 lines
12 KiB
QML
384 lines
12 KiB
QML
import QtQuick 2.13
|
|
import QtQuick.Controls 2.13
|
|
import QtQuick.Layouts 1.3
|
|
import QtGraphicalEffects 1.0
|
|
|
|
import StatusQ.Core 0.1
|
|
import StatusQ.Components 0.1
|
|
import StatusQ.Controls 0.1
|
|
|
|
import utils 1.0
|
|
import shared.panels 1.0
|
|
import shared.stores 1.0
|
|
import shared.controls 1.0
|
|
|
|
Popup {
|
|
id: root
|
|
|
|
enum Category {
|
|
Trending,
|
|
Recent,
|
|
Favorite,
|
|
Search
|
|
}
|
|
|
|
property var gifSelected: function () {}
|
|
property var searchGif: Backpressure.debounce(searchBox, 500, function (query) {
|
|
RootStore.searchGifs(query)
|
|
})
|
|
property var toggleCategory: function(newCategory) {
|
|
previousCategory = currentCategory
|
|
currentCategory = newCategory
|
|
searchBox.text = ""
|
|
if (currentCategory === StatusGifPopup.Category.Trending) {
|
|
RootStore.getTrendingsGifs()
|
|
} else if(currentCategory === StatusGifPopup.Category.Favorite) {
|
|
RootStore.getFavoritesGifs()
|
|
} else if(currentCategory === StatusGifPopup.Category.Recent) {
|
|
RootStore.getRecentsGifs()
|
|
}
|
|
}
|
|
property var toggleFavorite: function(item) {
|
|
RootStore.toggleFavoriteGif(item.id, currentCategory === StatusGifPopup.Category.Favorite)
|
|
}
|
|
property alias searchString: searchBox.text
|
|
property int currentCategory: StatusGifPopup.Category.Trending
|
|
property int previousCategory: StatusGifPopup.Category.Trending
|
|
|
|
modal: false
|
|
width: 360
|
|
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent
|
|
|
|
background: Rectangle {
|
|
radius: Style.current.radius
|
|
color: Style.current.background
|
|
border.color: Style.current.border
|
|
layer.enabled: true
|
|
layer.effect: DropShadow {
|
|
verticalOffset: 3
|
|
radius: 8
|
|
samples: 15
|
|
cached: true
|
|
color: "#22000000"
|
|
}
|
|
}
|
|
|
|
onOpened: {
|
|
searchBox.text = ""
|
|
searchBox.input.edit.forceActiveFocus()
|
|
if (RootStore.isTenorWarningAccepted) {
|
|
RootStore.getTrendingsGifs()
|
|
} else {
|
|
confirmationPopup.open()
|
|
}
|
|
}
|
|
|
|
onClosed: {
|
|
root.currentCategory = StatusGifPopup.Category.Trending
|
|
root.previousCategory = StatusGifPopup.Category.Trending
|
|
|
|
if (confirmationPopup.opened) {
|
|
confirmationPopup.close()
|
|
}
|
|
}
|
|
|
|
contentItem: Item {
|
|
anchors.fill: parent
|
|
|
|
ColumnLayout {
|
|
anchors.fill: parent
|
|
spacing: 0
|
|
|
|
Item {
|
|
property int headerMargin: 8
|
|
|
|
id: gifHeader
|
|
Layout.fillWidth: true
|
|
Layout.preferredHeight: searchBox.height + gifHeader.headerMargin
|
|
|
|
SearchBox {
|
|
id: searchBox
|
|
placeholderText: qsTr("Search")
|
|
enabled: RootStore.isTenorWarningAccepted
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: gifHeader.headerMargin
|
|
anchors.top: parent.top
|
|
anchors.topMargin: gifHeader.headerMargin
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: gifHeader.headerMargin
|
|
Keys.onReleased: {
|
|
if (searchBox.text === "") {
|
|
toggleCategory(previousCategory)
|
|
return
|
|
}
|
|
if (root.currentCategory !== StatusGifPopup.Category.Search) {
|
|
root.previousCategory = root.currentCategory
|
|
root.currentCategory = StatusGifPopup.Category.Search
|
|
}
|
|
Qt.callLater(searchGif, searchBox.text)
|
|
}
|
|
}
|
|
}
|
|
|
|
StatusBaseText {
|
|
id: headerText
|
|
text: {
|
|
if (currentCategory === StatusGifPopup.Category.Trending) {
|
|
return qsTr("TRENDING")
|
|
} else if(currentCategory === StatusGifPopup.Category.Favorite) {
|
|
return qsTr("FAVORITES")
|
|
} else if(currentCategory === StatusGifPopup.Category.Recent) {
|
|
return qsTr("RECENT")
|
|
}
|
|
return ""
|
|
}
|
|
visible: searchBox.text === ""
|
|
color: Style.current.secondaryText
|
|
font.pixelSize: 13
|
|
topPadding: gifHeader.headerMargin
|
|
leftPadding: gifHeader.headerMargin
|
|
}
|
|
|
|
Loader {
|
|
id: gifsLoader
|
|
active: root.opened && RootStore.isTenorWarningAccepted
|
|
Layout.fillWidth: true
|
|
Layout.rightMargin: Style.current.smallPadding / 2
|
|
Layout.leftMargin: Style.current.smallPadding / 2
|
|
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
|
|
Layout.preferredHeight: {
|
|
const headerTextHeight = searchBox.text === "" ? headerText.height : 0
|
|
return 400 - gifHeader.height - headerTextHeight
|
|
}
|
|
sourceComponent: RootStore.gifColumnA.rowCount() === 0 ? empty : gifItems
|
|
}
|
|
|
|
Row {
|
|
id: categorySelector
|
|
Layout.fillWidth: true
|
|
leftPadding: Style.current.smallPadding / 2
|
|
rightPadding: Style.current.smallPadding / 2
|
|
spacing: 0
|
|
|
|
|
|
StatusTabBarIconButton {
|
|
icon.name: "flash"
|
|
highlighted: StatusGifPopup.Category.Trending === root.currentCategory
|
|
onClicked: {
|
|
toggleCategory(StatusGifPopup.Category.Trending)
|
|
}
|
|
enabled: RootStore.isTenorWarningAccepted
|
|
}
|
|
|
|
StatusTabBarIconButton {
|
|
icon.name: "time"
|
|
highlighted: StatusGifPopup.Category.Recent === root.currentCategory
|
|
onClicked: {
|
|
toggleCategory(StatusGifPopup.Category.Recent)
|
|
}
|
|
enabled: RootStore.isTenorWarningAccepted
|
|
}
|
|
|
|
StatusTabBarIconButton {
|
|
icon.name: "favourite"
|
|
highlighted: StatusGifPopup.Category.Favorite === root.currentCategory
|
|
onClicked: {
|
|
toggleCategory(StatusGifPopup.Category.Favorite)
|
|
}
|
|
enabled: RootStore.isTenorWarningAccepted
|
|
}
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
color: 'black'
|
|
opacity: 0.4
|
|
radius: Style.current.radius
|
|
anchors.fill: parent
|
|
visible: confirmationPopup.opened
|
|
}
|
|
}
|
|
|
|
Popup {
|
|
id: confirmationPopup
|
|
|
|
anchors.centerIn: parent
|
|
height: 278
|
|
width: 291
|
|
|
|
horizontalPadding: 6
|
|
verticalPadding: 32
|
|
|
|
modal: false
|
|
closePolicy: Popup.NoAutoClose
|
|
|
|
background: Rectangle {
|
|
radius: Style.current.radius
|
|
color: Style.current.background
|
|
border.color: Style.current.border
|
|
layer.enabled: true
|
|
layer.effect: DropShadow{
|
|
verticalOffset: 3
|
|
radius: 8
|
|
samples: 15
|
|
fast: true
|
|
cached: true
|
|
color: "#22000000"
|
|
}
|
|
}
|
|
|
|
SVGImage {
|
|
id: gifImage
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
anchors.top: parent.top
|
|
source: Style.svg(`gifs-${Style.current.name}`)
|
|
}
|
|
|
|
StatusBaseText {
|
|
id: title
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
anchors.top: gifImage.bottom
|
|
anchors.topMargin: 8
|
|
text: qsTr("Enable Tenor GIFs?")
|
|
font.weight: Font.Medium
|
|
font.pixelSize: Style.current.primaryTextFontSize
|
|
}
|
|
|
|
StatusBaseText {
|
|
id: headline
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
anchors.top: title.bottom
|
|
anchors.topMargin: 4
|
|
|
|
text: qsTr("Once enabled, GIFs posted in the chat may share your metadata with Tenor.")
|
|
width: parent.width
|
|
horizontalAlignment: Text.AlignHCenter
|
|
wrapMode: Text.WordWrap
|
|
font.pixelSize: 13
|
|
color: Style.current.secondaryText
|
|
}
|
|
|
|
StatusButton {
|
|
id: removeBtn
|
|
objectName: "enableGifsButton"
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
anchors.bottom: parent.bottom
|
|
text: qsTr("Enable")
|
|
|
|
size: StatusBaseButton.Size.Small
|
|
|
|
onClicked: {
|
|
RootStore.setIsTenorWarningAccepted(true)
|
|
RootStore.getTrendingsGifs()
|
|
confirmationPopup.close()
|
|
}
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: empty
|
|
Rectangle {
|
|
height: parent.height
|
|
width: parent.width
|
|
color: Style.current.background
|
|
|
|
StatusBaseText {
|
|
id: emptyText
|
|
anchors.centerIn: parent
|
|
text: {
|
|
if(currentCategory === StatusGifPopup.Category.Favorite) {
|
|
return qsTr("Favorite GIFs will appear here")
|
|
} else if(currentCategory === StatusGifPopup.Category.Recent) {
|
|
return qsTr("Recent GIFs will appear here")
|
|
}
|
|
|
|
return qsTr("Error while contacting Tenor API, please retry.")
|
|
}
|
|
font.pixelSize: 15
|
|
color: Style.current.secondaryText
|
|
}
|
|
|
|
StatusButton {
|
|
id: retryBtn
|
|
anchors.top: emptyText.bottom
|
|
anchors.topMargin: Style.current.padding
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
|
|
text: qsTr("Retry")
|
|
visible: currentCategory === StatusGifPopup.Category.Trending || currentCategory === StatusGifPopup.Category.Search
|
|
onClicked: {
|
|
if (searchBox.text === "") {
|
|
RootStore.getTrendingsGifs()
|
|
|
|
return
|
|
}
|
|
|
|
searchGif(searchBox.text)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: gifItems
|
|
StatusScrollView {
|
|
id: scrollView
|
|
property ScrollBar vScrollBar: ScrollBar.vertical
|
|
topPadding: Style.current.smallPadding
|
|
leftPadding: Style.current.smallPadding
|
|
rightPadding: Style.current.smallPadding
|
|
ScrollBar.vertical.policy: ScrollBar.AlwaysOn
|
|
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
|
|
|
|
Row {
|
|
id: gifs
|
|
width: scrollView.availableWidth
|
|
spacing: Style.current.halfPadding
|
|
|
|
property string lastHoveredId
|
|
|
|
StatusGifColumn {
|
|
gifList.model: RootStore.gifColumnA
|
|
gifWidth: (root.width / 3) - Style.current.padding
|
|
gifSelected: root.gifSelected
|
|
toggleFavorite: root.toggleFavorite
|
|
lastHoveredId: gifs.lastHoveredId
|
|
store: RootStore
|
|
onGifHovered: {
|
|
gifs.lastHoveredId = id
|
|
}
|
|
}
|
|
|
|
StatusGifColumn {
|
|
gifList.model: RootStore.gifColumnB
|
|
gifWidth: (root.width / 3) - Style.current.padding
|
|
gifSelected: root.gifSelected
|
|
toggleFavorite: root.toggleFavorite
|
|
lastHoveredId: gifs.lastHoveredId
|
|
store: RootStore
|
|
onGifHovered: {
|
|
gifs.lastHoveredId = id
|
|
}
|
|
}
|
|
|
|
StatusGifColumn {
|
|
gifList.model: RootStore.gifColumnC
|
|
gifWidth: (root.width / 3) - Style.current.padding
|
|
gifSelected: root.gifSelected
|
|
toggleFavorite: root.toggleFavorite
|
|
lastHoveredId: gifs.lastHoveredId
|
|
store: RootStore
|
|
onGifHovered: {
|
|
gifs.lastHoveredId = id
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/*##^##
|
|
Designer {
|
|
D{i:0;formeditorColor:"#ffffff";height:440;width:360}
|
|
}
|
|
##^##*/
|