/* * Copyright (C) 2016 Morgan McMillian * * This file is apart of the Goober application, a client for pnut.io * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import bb.cascades 1.4 import com.monkeystew.pnut 1.0 import com.monkeystew.qtimer 1.0 NavigationPane { id: nav property string stream_type property string endpoint property int unread: -1 property bool refreshpull: false Page { Container { ListView { id: streamView dataModel: ArrayDataModel { id: postModel } leadingVisual: RefreshItem { onRefresh: { refreshpull = true pnut.getStream(endpoint, Pnut.STREAM_NEWER); } } listItemComponents: [ ListItemComponent { id: root PostItem {} } ] onTriggered: { var page = threadPage.createObject(); pnut.threadReceived.connect(page.loadThread); pnut.getThread(postModel.data(indexPath).thread_id); nav.push(page); } function viewProfile(userobj) { console.log("narf: " + JSON.stringify(userobj)) var page = profilePage.createObject(); page.user = userobj page.follow.connect(pnut.followUser) page.unfollow.connect(pnut.unfollowUser) page.block.connect(pnut.blockUser) page.unblock.connect(pnut.unblockUser) page.mute.connect(pnut.muteUser) page.unmute.connect(pnut.unmuteUser) nav.push(page); } function sendReply(text, pid) { pnut.sendReply(text, pid); } function getUserName() { return _app.setting("username"); } function addBookmark(pid) { pnut.setBookmark(pid); } function delBookmark(pid) { pnut.deleteBookmark(pid); } function repost(pid) { pnut.repost(pid); } function delRepost(pid) { pnut.deleteRepost(pid); } attachedObjects: [ ListScrollStateHandler { onAtEndChanged: { if (atEnd) { console.log("I'm at the end!!!") pnut.getStream(endpoint, Pnut.STREAM_OLDER); } } onAtBeginningChanged: { if (atBeginning) { console.log("I'm at the top!!!") unread = 0 nav.parent.unreadContentCount = unread } } } ] } } actions: [ ActionItem { title: qsTr("New Post") ActionBar.placement: ActionBarPlacement.Signature onTriggered: { newPostSheet.open(); newPostSheet.input.requestFocus(); } imageSource: "asset:///icons/ic_compose.png" shortcuts: [ SystemShortcut { type: SystemShortcuts.CreateNew } ] }, ActionItem { title: qsTr("To Top") ActionBar.placement: ActionBarPlacement.InOverflow onTriggered: { //refreshpull = true //pnut.getStream(endpoint, Pnut.STREAM_NEWER); streamView.scrollToPosition(ScrollPosition.Beginning, ScrollAnimation.None); } imageSource: "asset:///icons/ic_to_top.png" shortcuts: [ SystemShortcut { type: SystemShortcuts.JumpToTop } ] }, ActionItem { title: qsTr("Reload") ActionBar.placement: ActionBarPlacement.InOverflow onTriggered: { postModel.clear() pnut.beforeId = 0 pnut.sinceId = 0 pnut.getStream(endpoint, Pnut.STREAM_OLDER); } imageSource: "asset:///icons/ic_reload.png" }, ActionItem { title: qsTr("To Bottom") ActionBar.placement: ActionBarPlacement.InOverflow onTriggered: { streamView.scrollToPosition(ScrollPosition.End, ScrollAnimation.None); //pnut.getStream(endpoint, Pnut.STREAM_OLDER); } imageSource: "asset:///icons/ic_to_bottom.png" shortcuts: [ SystemShortcut { type: SystemShortcuts.JumpToBottom } ] } ] actionBarAutoHideBehavior: ActionBarAutoHideBehavior.HideOnScroll actionBarVisibility: ChromeVisibility.Overlay } attachedObjects: [ ComponentDefinition { id: threadPage source: "ThreadPage.qml" }, ComponentDefinition { id: profilePage source: "ProfilePage.qml" }, NewPostSheet { id: newPostSheet onSendPost: { console.log("send: " + text); pnut.sendPost(text); } }, LoginSheet { id: loginSheet onLogin: { pnut.authorize(); } }, QTimer { id: timer interval: 30000 onTimeout: { pnut.getStream(endpoint, Pnut.STREAM_NEWER); } }, Pnut { id: pnut onStreamReceived: { //nav.parent.unreadContentCount = stream.length switch (rtype) { case Pnut.STREAM_OLDER: //streamView.scrollToPosition(ScrollPosition.End, ScrollAnimation.None); postModel.append(stream); break; case Pnut.STREAM_NEWER: postModel.insert(0, stream); if (stream.length > 0) { update_app_cover(stream.length) } if (refreshpull) { refreshpull = false streamView.scrollToPosition(ScrollPosition.Beginning, ScrollAnimation.None); } break; } pnut.beforeId = postModel.value(postModel.size() - 1).id; pnut.sinceId = postModel.value(0).id; } onAuthorizationRequired: { loginSheet.open(); timer.stop(); } onAuthorizationReceived: { loginSheet.close(); pnut.getStream(endpoint, Pnut.STREAM_OLDER); timer.start(); } onFollowSuccess: update_user_page(user) onUnfollowSuccess: update_user_page(user) onBlockSuccess: update_user_page(user) onUnblockSuccess: update_user_page(user) onMuteSuccess: update_user_page(user) onUnmuteSuccess: update_user_page(user) function update_user_page(user) { nav.top.user = user postModel.clear() pnut.beforeId = 0 pnut.sinceId = 0 pnut.getStream(endpoint, Pnut.STREAM_OLDER) } function update_app_cover(count) { if (count > 0 && unread >=0) { unread += count } else { unread = 0 } nav.parent.unreadContentCount = unread } } ] onPopTransitionEnded: { page.destroy(); } onCreationCompleted: { switch (stream_type) { case "Home": endpoint = "/posts/streams/unified"; break; case "Global": default: endpoint = "/posts/streams/global" break; } if (_app.setting("access_token") && _app.setting("access_token").length > 0) { pnut.getUserInfo(); pnut.getStream(endpoint, Pnut.STREAM_OLDER); timer.start(); } else { loginSheet.open(); timer.stop(); } } function logout() { pnut.logout(); } }