harbour-tooter/qml/pages/MainPage.qml

333 lines
12 KiB
QML
Raw Normal View History

2017-06-01 17:13:51 +03:00
import QtQuick 2.0
import Sailfish.Silica 1.0
import "../lib/API.js" as Logic
import "./components/"
2017-06-01 17:13:51 +03:00
Page {
id: mainPage
property bool debug: false
2017-06-07 17:09:41 +03:00
property bool isFirstPage: true
property bool isTablet: true //Screen.sizeCategory >= Screen.Large
2017-06-01 17:13:51 +03:00
allowedOrientations: Orientation.All
2020-06-29 11:48:06 +03:00
// Docked Navigation panel
DockedPanel {
id: infoPanel
open: true
2020-06-29 11:48:06 +03:00
width: isPortrait ? parent.width : Theme.itemSizeLarge
height: isPortrait ? Theme.itemSizeLarge : parent.height
dock: isPortrait ? Dock.Bottom : Dock.Right
2020-06-18 09:32:52 +03:00
2020-06-29 11:48:06 +03:00
NavigationPanel {
id: navigation
isPortrait: !mainPage.isPortrait
onSlideshowShow: {
if (debug) console.log(vIndex)
slideshow.positionViewAtIndex(vIndex, ListView.SnapToItem)
}
}
}
2017-06-07 17:09:41 +03:00
VisualItemModel {
id: visualModel
2020-06-18 09:32:52 +03:00
2020-06-29 11:48:06 +03:00
MyList {
2020-06-04 20:44:12 +03:00
id: tlHome
2017-06-07 17:09:41 +03:00
title: qsTr("Home")
type: "timelines/home"
mdl: Logic.modelTLhome
2020-06-29 11:48:06 +03:00
width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
2017-07-20 13:14:16 +03:00
height: parent.itemHeight
2020-06-29 11:48:06 +03:00
onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
2017-06-07 17:09:41 +03:00
}
2020-06-29 11:48:06 +03:00
MyList {
2020-06-04 20:44:12 +03:00
id: tlNotifications
title: qsTr("Notifications")
type: "notifications"
notifier: true
mdl: Logic.modelTLnotifications
2020-06-29 11:48:06 +03:00
width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
2017-07-20 13:14:16 +03:00
height: parent.itemHeight
2020-06-29 11:48:06 +03:00
onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
2017-06-07 17:09:41 +03:00
}
2020-06-29 11:48:06 +03:00
MyList {
2020-06-04 20:44:12 +03:00
id: tlLocal
2018-05-24 12:14:02 +03:00
title: qsTr("Local")
type: "timelines/public?local=true"
//params: ["local", true]
mdl: Logic.modelTLlocal
2020-06-29 11:48:06 +03:00
width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
2018-05-24 12:14:02 +03:00
height: parent.itemHeight
2020-06-29 11:48:06 +03:00
onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
2018-05-24 12:14:02 +03:00
}
2020-06-29 11:48:06 +03:00
MyList {
2020-06-04 20:44:12 +03:00
id: tlPublic
title: qsTr("Federated")
type: "timelines/public"
mdl: Logic.modelTLpublic
2020-06-29 11:48:06 +03:00
width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
2017-07-20 13:14:16 +03:00
height: parent.itemHeight
2020-06-29 11:48:06 +03:00
onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
2017-06-07 17:09:41 +03:00
}
MyList {
id: tlBookmarks
title: qsTr("Bookmarks")
type: "bookmarks"
mdl: Logic.modelTLbookmarks
width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
height: parent.itemHeight
onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
}
Item {
2020-06-04 12:17:06 +03:00
id: tlSearch
property ListModel mdl: ListModel {}
property string search
2020-06-29 11:48:06 +03:00
width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
height: parent.itemHeight
onSearchChanged: {
if (debug) console.log(search)
2020-07-12 10:12:34 +03:00
loader.sourceComponent = loading
if (search.charAt(0) === "@") {
loader.sourceComponent = userListComponent
} else if (search.charAt(0) === "#") {
2020-06-10 11:17:51 +03:00
loader.sourceComponent = tagListComponent
2020-06-18 09:32:52 +03:00
} else loader.sourceComponent = wordListComponent
}
Loader {
id: loader
anchors.fill: parent
}
Column {
id: headerContainer
width: tlSearch.width
PageHeader {
title: qsTr("Search")
}
2020-06-18 09:32:52 +03:00
SearchField {
id: searchField
width: parent.width
placeholderText: qsTr("@user or #term")
text: tlSearch.search
EnterKey.iconSource: "image://theme/icon-m-enter-close"
EnterKey.onClicked: {
tlSearch.search = text.toLowerCase().trim()
focus = false
if (debug) console.log(text)
}
2017-10-27 17:44:35 +03:00
}
}
2020-07-12 10:12:34 +03:00
Component {
id: loading
BusyIndicator {
size: BusyIndicatorSize.Large
anchors.centerIn: parent
running: true
}
}
Component {
id: tagListComponent
MyList {
id: view
mdl: ListModel {}
width: parent.width
height: parent.height
2020-07-03 11:45:30 +03:00
onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
anchors.fill: parent
currentIndex: -1 // otherwise currentItem will steal focus
header: Item {
id: header
width: headerContainer.width
height: headerContainer.height
Component.onCompleted: headerContainer.parent = header
}
delegate: VisualContainer
Component.onCompleted: {
view.type = "timelines/tag/"+tlSearch.search.substring(1)
var ids = []
view.params = []
view.params.push({name: 'limit', data: "20" });
/* we push the ids via params which we remove in the WorkerScript
* see: MyList:loadData() and should move */
if (mdl.count) {
for(var i = 0 ; i < mdl.count ; i++) {
ids.push(mdl.get(i).id)
//if (debug) console.log(model.get(i).id)
}
view.params.push({name: 'ids', data: ids });
}
view.loadData("append")
}
2017-06-07 17:09:41 +03:00
}
}
Component {
id: userListComponent
MyList {
id: view2
mdl: ListModel {}
autoLoadMore: false
width: parent.width
height: parent.height
onOpenDrawer: infoPanel.open = setDrawer
anchors.fill: parent
currentIndex: -1 // otherwise currentItem will steal focus
header: Item {
id: header
width: headerContainer.width
height: headerContainer.height
Component.onCompleted: headerContainer.parent = header
}
2017-10-27 17:44:35 +03:00
delegate: ItemUser {
onClicked: {
pageStack.push(Qt.resolvedUrl("ProfilePage.qml"), {
"display_name": model.account_display_name,
"username": model.account_acct,
"user_id": model.account_id,
"profileImage": model.account_avatar,
"profileBackground": model.account_header,
"note": model.account_note,
"url": model.account_url,
"followers_count": model.account_followers_count,
"following_count": model.account_following_count,
"statuses_count": model.account_statuses_count,
"locked": model.account_locked,
"bot": model.account_bot,
"group": model.account_group
})
}
}
2020-06-15 11:42:10 +03:00
Component.onCompleted: {
view2.type = "accounts/search"
view2.params = []
view2.params.push({name: 'q', data: tlSearch.search.substring(1)});
view2.loadData("append")
}
}
2017-10-27 17:44:35 +03:00
}
Component {
id: wordListComponent
MyList {
id: view3
mdl: ListModel {}
width: parent.width
height: parent.height
onOpenDrawer: infoPanel.open = setDrawer
anchors.fill: parent
currentIndex: -1 // otherwise currentItem will steal focus
header: Item {
id: header
width: headerContainer.width
height: headerContainer.height
Component.onCompleted: headerContainer.parent = header
}
delegate: VisualContainer
Component.onCompleted: {
var ids = []
view3.params = []
view3.params.push({name: 'limit', data: "20" });
/* we push the ids via params which we remove in the WorkerScript
* see: MyList:loadData() and should move */
if (mdl.count) {
for(var i = 0 ; i < mdl.count ; i++) {
ids.push(mdl.get(i).id)
//if (debug) console.log(model.get(i).id)
}
view3.params.push({name: 'ids', data: ids });
}
view3.type = "timelines/tag/"+tlSearch.search
view3.loadData("prepend")
}
}
}
2017-06-07 17:09:41 +03:00
}
}
SlideshowView {
id: slideshow
width: parent.width
height: parent.height
2017-07-20 13:14:16 +03:00
itemWidth: isTablet ? Math.round(parent.width) : parent.width
itemHeight: height
clip: true
2020-07-03 11:45:30 +03:00
model: visualModel
onCurrentIndexChanged: {
navigation.slideshowIndexChanged(currentIndex)
}
anchors {
fill: parent
top: parent.top
2020-06-29 11:48:06 +03:00
rightMargin: isPortrait ? 0 : infoPanel.visibleSize
bottomMargin: isPortrait ? infoPanel.visibleSize : 0
}
2017-06-07 17:09:41 +03:00
Component.onCompleted: {
}
2017-06-01 17:13:51 +03:00
}
2017-07-20 13:14:16 +03:00
2017-06-08 01:53:54 +03:00
IconButton {
id: newToot
width: Theme.iconSizeLarge
height: width
visible: !isPortrait ? true : !infoPanel.open
icon.source: "image://theme/icon-l-add"
2017-06-08 01:53:54 +03:00
anchors {
right: (mainPage.isPortrait ? parent.right : infoPanel.left)
2020-06-29 11:48:06 +03:00
rightMargin: isPortrait ? Theme.paddingLarge : Theme.paddingLarge * 0.8
2017-06-08 01:53:54 +03:00
bottom: (mainPage.isPortrait ? infoPanel.top : parent.bottom)
bottomMargin: Theme.paddingLarge
2017-06-08 01:53:54 +03:00
}
onClicked: {
pageStack.push(Qt.resolvedUrl("ConversationPage.qml"), {
headerTitle: qsTr("New Toot"),
type: "new"
})
2017-06-08 01:53:54 +03:00
}
}
2017-06-01 17:13:51 +03:00
2020-06-15 11:42:10 +03:00
function onLinkActivated(href) {
var test = href.split("/")
debug = true
if (debug) {
console.log(href)
console.log(JSON.stringify(test))
console.log(JSON.stringify(test.length))
}
if (test.length === 5 && (test[3] === "tags" || test[3] === "tag") ) {
tlSearch.search = "#"+decodeURIComponent(test[4])
slideshow.positionViewAtIndex(5, ListView.SnapToItem)
2017-06-07 17:09:41 +03:00
navigation.navigateTo('search')
if (debug) console.log("search tag")
} else if (test.length === 4 && test[3][0] === "@" ) {
tlSearch.search = decodeURIComponent("@"+test[3].substring(1)+"@"+test[2])
slideshow.positionViewAtIndex(5, ListView.SnapToItem)
navigation.navigateTo('search')
2017-06-07 17:09:41 +03:00
} else {
2020-06-04 12:17:06 +03:00
Qt.openUrlExternally(href)
2017-06-07 17:09:41 +03:00
}
2017-06-01 17:13:51 +03:00
}
2018-05-24 12:14:02 +03:00
Component.onCompleted: {
//console.log("aaa")
2018-05-24 12:14:02 +03:00
}
}