use a drawer and manage selection on longpress
This commit is contained in:
parent
d260bfd922
commit
93203b8157
1 changed files with 188 additions and 107 deletions
|
|
@ -27,13 +27,7 @@ Page {
|
||||||
id: feeditemsPage
|
id: feeditemsPage
|
||||||
property var feed
|
property var feed
|
||||||
property bool needsUpdate: false
|
property bool needsUpdate: false
|
||||||
|
property bool selectionModeActive: false
|
||||||
property int remorseCounter: 0
|
|
||||||
onRemorseCounterChanged: {
|
|
||||||
// Disallow model changes while a RemorseItem is running.
|
|
||||||
pullmenu.visible = remorseCounter === 0
|
|
||||||
pushmenu.visible = remorseCounter === 0
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
feedItemModel.feed = feeditemsPage.feed
|
feedItemModel.feed = feeditemsPage.feed
|
||||||
|
|
@ -42,120 +36,206 @@ Page {
|
||||||
|
|
||||||
RemorsePopup { id: remorse }
|
RemorsePopup { id: remorse }
|
||||||
|
|
||||||
SilicaListView {
|
Drawer {
|
||||||
id: listView
|
id: drawer
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
model: feedItemModel
|
dock: Dock.Bottom
|
||||||
|
backgroundSize: drawerView.contentHeight
|
||||||
|
|
||||||
PullDownMenu {
|
open: selectionModeActive
|
||||||
id: pullmenu
|
|
||||||
MenuItem {
|
background: SilicaFlickable {
|
||||||
text: qsTr("Update")
|
id: drawerView
|
||||||
enabled: !network.loading
|
anchors.fill: parent
|
||||||
|
contentHeight: selectionModeActive ? 250 : Theme.itemSizeSmall
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
Column {
|
||||||
|
visible: selectionModeActive
|
||||||
|
width: parent.width
|
||||||
|
height: parent.height - Theme.itemSizeSmall
|
||||||
|
|
||||||
|
Separator {
|
||||||
|
width: parent.width
|
||||||
|
horizontalAlignment: Qt.AlignHCenter
|
||||||
|
color: Theme.highlightColor
|
||||||
|
}
|
||||||
|
|
||||||
|
IconButton {
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
icon.source: "image://theme/icon-m-close"
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
feedItemModel.unselectAll();
|
||||||
|
selectionModeActive = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: selectedLabel
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
color: Theme.highlightColor
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
font.pixelSize: Theme.fontSizeExtraLarge
|
||||||
|
text: qsTr("%1 selected").arg(feedItemModel.selectedItems)
|
||||||
|
}
|
||||||
|
|
||||||
|
Row {
|
||||||
|
visible: selectionModeActive
|
||||||
|
height: Theme.itemSizeSmall
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
|
||||||
|
IconButton {
|
||||||
|
enabled: feedItemModel.selectedItems > 0
|
||||||
|
icon.source: "qrc:///images/ic_rss_"
|
||||||
|
+ (feedItemModel.allPublished ? "enabled" : "disabled") + ".png"
|
||||||
|
onClicked: {
|
||||||
|
feedItemModel.setAllSelectedRSSState(!feedItemModel.allPublished)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IconButton {
|
||||||
|
enabled: feedItemModel.selectedItems > 0
|
||||||
|
icon.source: "qrc:///images/ic_star_"
|
||||||
|
+ (feedItemModel.allStarred ? "enabled" : "disabled") + ".png"
|
||||||
|
onClicked: {
|
||||||
|
feedItemModel.setAllSelectedMarkedState(!feedItemModel.allStarred)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IconButton {
|
||||||
|
enabled: feedItemModel.selectedItems > 0
|
||||||
|
icon.source: "qrc:///images/ic_"
|
||||||
|
+ (feedItemModel.allUnread ? "unread" : "read") + ".png"
|
||||||
|
onClicked: {
|
||||||
|
feedItemModel.setAllSelectedReadState(feedItemModel.allUnread)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SilicaListView {
|
||||||
|
id: listView
|
||||||
|
anchors.fill: parent
|
||||||
|
model: feedItemModel
|
||||||
|
|
||||||
|
PullDownMenu {
|
||||||
|
id: pullmenu
|
||||||
|
MenuItem {
|
||||||
|
text: qsTr("Update")
|
||||||
|
enabled: !network.loading
|
||||||
|
onClicked: feeditemsPage.update()
|
||||||
|
}
|
||||||
|
ToggleShowAllItem {
|
||||||
|
onUpdateView: {
|
||||||
|
if (feeditemsPage.visible) {
|
||||||
|
feeditemsPage.update()
|
||||||
|
} else {
|
||||||
|
feeditemsPage.needsUpdate = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
text: qsTr('Mark all loaded read')
|
||||||
|
onClicked: markAllLoadedAsRead()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PushUpMenu {
|
||||||
|
id: pushmenu
|
||||||
|
MenuItem {
|
||||||
|
text: qsTr('Mark all loaded read')
|
||||||
|
onClicked: markAllLoadedAsRead()
|
||||||
|
}
|
||||||
|
ToggleShowAllItem {
|
||||||
|
onUpdateView: {
|
||||||
|
if (feeditemsPage.visible) {
|
||||||
|
feeditemsPage.update()
|
||||||
|
} else {
|
||||||
|
feeditemsPage.needsUpdate = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
section {
|
||||||
|
property: 'date'
|
||||||
|
|
||||||
|
delegate: SectionHeader {
|
||||||
|
text: section
|
||||||
|
height: Theme.itemSizeExtraSmall
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delegate: FeedItemDelegate {
|
||||||
onClicked: {
|
onClicked: {
|
||||||
feeditemsPage.update()
|
if (selectionModeActive) {
|
||||||
|
feedItemModel.select(index)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
feedItemModel.selectedIndex = index
|
||||||
|
pageStack.push(Qt.resolvedUrl("FeedItem.qml"), { isCat: feed.isCat })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
onPressAndHold: {
|
||||||
ToggleShowAllItem {
|
if (selectionModeActive) {
|
||||||
onUpdateView: {
|
feedItemModel.selectedIndex = index
|
||||||
if (feeditemsPage.visible) {
|
pageStack.push(Qt.resolvedUrl("FeedItem.qml"), { isCat: feed.isCat })
|
||||||
feeditemsPage.update()
|
}
|
||||||
} else {
|
else {
|
||||||
feeditemsPage.needsUpdate = true
|
feedItemModel.select(index)
|
||||||
|
selectionModeActive = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MenuItem {
|
|
||||||
text: qsTr('Mark all loaded read')
|
|
||||||
onClicked: markAllLoadedAsRead()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PushUpMenu {
|
footer: Button {
|
||||||
id: pushmenu
|
|
||||||
MenuItem {
|
|
||||||
text: qsTr('Mark all loaded read')
|
|
||||||
onClicked: markAllLoadedAsRead()
|
|
||||||
}
|
|
||||||
ToggleShowAllItem {
|
|
||||||
onUpdateView: {
|
|
||||||
if (feeditemsPage.visible) {
|
|
||||||
feeditemsPage.update()
|
|
||||||
} else {
|
|
||||||
feeditemsPage.needsUpdate = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
section {
|
|
||||||
property: 'date'
|
|
||||||
|
|
||||||
delegate: SectionHeader {
|
|
||||||
text: section
|
|
||||||
height: Theme.itemSizeExtraSmall
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate: FeedItemDelegate {
|
|
||||||
onClicked: {
|
|
||||||
feedItemModel.selectedIndex = index
|
|
||||||
pageStack.push(Qt.resolvedUrl("FeedItem.qml"),
|
|
||||||
{ isCat: feed.isCat })
|
|
||||||
}
|
|
||||||
onRemorseRunning: {
|
|
||||||
if (running) {
|
|
||||||
++feeditemsPage.remorseCounter
|
|
||||||
} else {
|
|
||||||
--feeditemsPage.remorseCounter
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
footer: Button {
|
|
||||||
text: qsTr("Load more")
|
|
||||||
visible: settings.feeditemsOrder === 0 && feedItemModel.hasMoreItems
|
|
||||||
height: settings.feeditemsOrder === 0 && feedItemModel.hasMoreItems ? 51 : 0
|
|
||||||
width: parent.width
|
|
||||||
onClicked: feedItemModel.update()
|
|
||||||
}
|
|
||||||
|
|
||||||
header: Column {
|
|
||||||
width: listView.width
|
|
||||||
height: header.height + info.height + lastUpdated.height
|
|
||||||
PageHeader {
|
|
||||||
id: header
|
|
||||||
title: feed.title
|
|
||||||
}
|
|
||||||
Button {
|
|
||||||
id: info
|
|
||||||
text: qsTr("Load more")
|
text: qsTr("Load more")
|
||||||
visible: settings.feeditemsOrder === 1 && feedItemModel.hasMoreItems
|
visible: settings.feeditemsOrder === 0 && feedItemModel.hasMoreItems
|
||||||
height: settings.feeditemsOrder === 1 && feedItemModel.hasMoreItems ? 51 : 0
|
height: settings.feeditemsOrder === 0 && feedItemModel.hasMoreItems ? 51 : 0
|
||||||
width: parent.width
|
width: parent.width
|
||||||
onClicked: feedItemModel.update()
|
onClicked: feedItemModel.update()
|
||||||
}
|
}
|
||||||
SectionHeader {
|
|
||||||
id: lastUpdated
|
|
||||||
text: feed.lastUpdated !== "" ? qsTr("Last updated: %1").arg(feed.lastUpdated) : ""
|
|
||||||
visible: text !== ""
|
|
||||||
height: Theme.itemSizeExtraSmall
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ViewPlaceholder {
|
header: Column {
|
||||||
enabled: listView.count == 0
|
width: listView.width
|
||||||
text: network.loading ?
|
height: header.height + info.height + lastUpdated.height
|
||||||
qsTr("Loading") :
|
PageHeader {
|
||||||
settings.showAll ? qsTr("No items in feed") : qsTr("No unread items in feed")
|
id: header
|
||||||
|
title: feed.title
|
||||||
|
}
|
||||||
|
Button {
|
||||||
|
id: info
|
||||||
|
text: qsTr("Load more")
|
||||||
|
visible: settings.feeditemsOrder === 1 && feedItemModel.hasMoreItems
|
||||||
|
height: settings.feeditemsOrder === 1 && feedItemModel.hasMoreItems ? 51 : 0
|
||||||
|
width: parent.width
|
||||||
|
onClicked: feedItemModel.update()
|
||||||
|
}
|
||||||
|
SectionHeader {
|
||||||
|
id: lastUpdated
|
||||||
|
text: feed.lastUpdated !== "" ? qsTr("Last updated: %1").arg(feed.lastUpdated) : ""
|
||||||
|
visible: text !== ""
|
||||||
|
height: Theme.itemSizeExtraSmall
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ViewPlaceholder {
|
||||||
|
enabled: listView.count == 0
|
||||||
|
text: network.loading ?
|
||||||
|
qsTr("Loading") :
|
||||||
|
settings.showAll ? qsTr("No items in feed") : qsTr("No unread items in feed")
|
||||||
|
}
|
||||||
|
BusyIndicator {
|
||||||
|
visible: listView.count != 0 && network.loading
|
||||||
|
running: visible
|
||||||
|
anchors.centerIn: parent
|
||||||
|
size: BusyIndicatorSize.Large
|
||||||
|
}
|
||||||
|
VerticalScrollDecorator { }
|
||||||
}
|
}
|
||||||
BusyIndicator {
|
|
||||||
visible: listView.count != 0 && network.loading
|
|
||||||
running: visible
|
|
||||||
anchors.centerIn: parent
|
|
||||||
size: BusyIndicatorSize.Large
|
|
||||||
}
|
|
||||||
VerticalScrollDecorator { }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function showFeed(feedModel) {
|
function showFeed(feedModel) {
|
||||||
|
|
@ -186,6 +266,7 @@ Page {
|
||||||
feedItemModel.continuation = 0
|
feedItemModel.continuation = 0
|
||||||
feedItemModel.hasMoreItems = false
|
feedItemModel.hasMoreItems = false
|
||||||
feedItemModel.clear()
|
feedItemModel.clear()
|
||||||
|
feedItemModel.selectedItems = 0
|
||||||
feedItemModel.update()
|
feedItemModel.update()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue