413 lines
16 KiB
QML
413 lines
16 KiB
QML
/*
|
|
* Copyright (C) 2016 Morgan McMillian <gilag@monkeystew.com>
|
|
*
|
|
* 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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
import bb.cascades 1.4
|
|
import com.netimage 1.0
|
|
import "moment.js" as Moment
|
|
import "parser.js" as Parser
|
|
|
|
Container {
|
|
id: postitem
|
|
|
|
leftPadding: ui.sdu(3.0)
|
|
rightPadding: ui.sdu(3.0)
|
|
topPadding: ui.sdu(2.0)
|
|
//bottomPadding: ui.sdu(2.0)
|
|
|
|
property variant theme : Application.themeSupport.theme.colorTheme.style
|
|
|
|
enabled: (ListItemData.is_deleted) ? false : true
|
|
opacity: (ListItemData.is_deleted) ? 0.5 : 1.0
|
|
visible: (ListItemData.is_deleted) ? false : true
|
|
|
|
Container { // post header
|
|
layout: DockLayout {}
|
|
horizontalAlignment: HorizontalAlignment.Fill
|
|
Container {
|
|
layout: StackLayout {
|
|
orientation: LayoutOrientation.LeftToRight
|
|
}
|
|
Container { // user avatar
|
|
background: (theme === VisualStyle.Bright) ? Color.create("#e9e9e9") : Color.create("#282828")
|
|
ImageButton {
|
|
id: avatar
|
|
minWidth: ui.du(12)
|
|
minHeight: ui.du(12)
|
|
maxWidth: ui.du(12)
|
|
maxHeight: ui.du(12)
|
|
//imageSource: "asset:///icons/laughing_man.png"
|
|
defaultImage: tracker.image
|
|
onClicked: {
|
|
postitem.ListItem.view.viewProfile(ListItemData.user)
|
|
}
|
|
attachedObjects: [
|
|
NetImageTracker {
|
|
id: tracker
|
|
source: (postitem.ListItem.view.hideAvatar()) ? "" : ListItemData.user.content.avatar_image.link
|
|
manager: postitem.ListItem.view.userImageManager
|
|
}
|
|
]
|
|
}
|
|
}
|
|
Container { // user name
|
|
leftMargin: ui.sdu(3.0)
|
|
Container {
|
|
Label {
|
|
id: name
|
|
text: ListItemData.user.name
|
|
textStyle.fontWeight: FontWeight.Bold
|
|
}
|
|
}
|
|
Container {
|
|
Label {
|
|
id: username
|
|
// text: ListItemData.user.username
|
|
text: "<a href=\"#profile\">" + ListItemData.user.username + "</a>"
|
|
activeTextHandler: ActiveTextHandler {
|
|
onTriggered: {
|
|
postitem.ListItem.view.viewProfile(ListItemData.user)
|
|
}
|
|
}
|
|
textFormat: TextFormat.Html
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Container { // post counts
|
|
horizontalAlignment: HorizontalAlignment.Right
|
|
Container {
|
|
layout: StackLayout {
|
|
orientation: LayoutOrientation.RightToLeft
|
|
}
|
|
horizontalAlignment: HorizontalAlignment.Fill
|
|
topMargin: ui.sdu(1.0)
|
|
Container {
|
|
ImageView {
|
|
// (ListItemData.counts.threads > 0 || ListItemData.counts.replies > 0 || ListItemData.id !== ListItemData.thread_id)
|
|
visible: (ListItemData.counts.threads > 0 || ListItemData.id !== ListItemData.thread_id)
|
|
imageSource: "asset:///icons/comments.png"
|
|
filterColor: (theme == VisualStyle.Bright) ? Color.Black : false
|
|
maxWidth: ui.du(6)
|
|
maxHeight: ui.du(6)
|
|
accessibility.name: "thread"
|
|
}
|
|
}
|
|
Container {
|
|
verticalAlignment: VerticalAlignment.Bottom
|
|
Label {
|
|
text: (ListItemData.counts.bookmarks > 0) ? ListItemData.counts.bookmarks : ""
|
|
textStyle.fontSize: FontSize.XXSmall
|
|
}
|
|
}
|
|
Container {
|
|
ImageView {
|
|
visible: (ListItemData.counts.bookmarks > 0)
|
|
imageSource: "asset:///icons/ic_favorite.png"
|
|
filterColor: (theme == VisualStyle.Bright) ? Color.Black : false
|
|
maxWidth: ui.du(6)
|
|
maxHeight: ui.du(6)
|
|
accessibility.name: "favorite"
|
|
}
|
|
}
|
|
Container {
|
|
verticalAlignment: VerticalAlignment.Bottom
|
|
Label {
|
|
text: (ListItemData.counts.reposts > 0) ? ListItemData.counts.reposts : ""
|
|
textStyle.fontSize: FontSize.XXSmall
|
|
}
|
|
}
|
|
Container {
|
|
ImageView {
|
|
visible: (ListItemData.counts.reposts > 0)
|
|
imageSource: "asset:///icons/retweet.png"
|
|
filterColor: (theme == VisualStyle.Bright) ? Color.Black : false
|
|
maxWidth: ui.du(6)
|
|
maxHeight: ui.du(6)
|
|
accessibility.name: "repost"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Container { // post text
|
|
topMargin: ui.sdu(2.0)
|
|
bottomMargin: ui.sdu(2.0)
|
|
Label {
|
|
text: Parser.fixPostHtml(ListItemData.content.html)
|
|
multiline: true
|
|
textFormat: TextFormat.Html
|
|
navigation.focusPolicy: NavigationFocusPolicy.NotFocusable
|
|
}
|
|
}
|
|
Container { // long post body
|
|
topMargin: ui.sdu(2.0)
|
|
bottomMargin: ui.sdu(2.0)
|
|
visible: {
|
|
if (postitem.ListItem.view.hideLongPosts()) {
|
|
return false
|
|
} else {
|
|
if (typeof ListItemData.longpost_body !== "undefined") {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
Divider {
|
|
}
|
|
Label {
|
|
text: (typeof ListItemData.longpost_body !== "undefined") ? ListItemData.longpost_body : ""
|
|
multiline: true
|
|
textFormat: TextFormat.Html
|
|
navigation.focusPolicy: NavigationFocusPolicy.NotFocusable
|
|
}
|
|
}
|
|
Container { // post embeds
|
|
// TODO: add tab to open full image in a page
|
|
horizontalAlignment: HorizontalAlignment.Center
|
|
bottomMargin: ui.sdu(2.0)
|
|
ImageButton {
|
|
id: pimage
|
|
maxWidth: ui.du(20)
|
|
maxHeight: ui.du(20)
|
|
visible: {
|
|
var isphoto = false
|
|
if (typeof ListItemData.raw !== "undefined") {
|
|
ListItemData.raw.forEach(function (item) {
|
|
if (item["type"] == "io.pnut.core.oembed") {
|
|
if (item["value"]["type"] == "photo") {
|
|
isphoto = true
|
|
}
|
|
}
|
|
})
|
|
}
|
|
return isphoto
|
|
}
|
|
defaultImage: (postitem.ListItem.view.hidePhoto()) ? "" : thumbtracker.image
|
|
onClicked: {
|
|
postitem.ListItem.view.showImage(ptracker.imageSource)
|
|
}
|
|
attachedObjects: [
|
|
NetImageTracker {
|
|
id: ptracker
|
|
manager: postitem.ListItem.view.listImageManager
|
|
source: {
|
|
var photo_url = ""
|
|
if (typeof ListItemData.raw !== "undefined" && !postitem.ListItem.view.hidePhoto()) {
|
|
ListItemData.raw.forEach(function (item) {
|
|
if (item["type"] == "io.pnut.core.oembed") {
|
|
if (item["value"]["type"] == "photo") {
|
|
photo_url = item["value"]["url"]
|
|
}
|
|
}
|
|
})
|
|
}
|
|
return photo_url
|
|
}
|
|
},
|
|
NetImageTracker {
|
|
id: thumbtracker
|
|
manager: postitem.ListItem.view.listImageManager
|
|
source: {
|
|
var photo_url = ""
|
|
if (typeof ListItemData.raw !== "undefined" && !postitem.ListItem.view.hidePhoto()) {
|
|
ListItemData.raw.forEach(function (item) {
|
|
if (item["type"] == "io.pnut.core.oembed") {
|
|
if (item["value"]["type"] == "photo") {
|
|
if (item["value"]["thumbnail_url"]) {
|
|
photo_url = item["value"]["thumbnail_url"]
|
|
} else {
|
|
photo_url = item["value"]["url"]
|
|
}
|
|
// photo_url = item["value"]["url"]
|
|
}
|
|
}
|
|
})
|
|
}
|
|
return photo_url
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
Container { // post footer
|
|
layout: DockLayout {}
|
|
horizontalAlignment: HorizontalAlignment.Fill
|
|
Container {
|
|
horizontalAlignment: HorizontalAlignment.Left
|
|
Label { // "Sep 23, 2016 7:17 AM"
|
|
text: Moment.moment(ListItemData.created_at).format("lll")
|
|
textStyle.fontSize: FontSize.XSmall
|
|
}
|
|
}
|
|
Container {
|
|
horizontalAlignment: HorizontalAlignment.Right
|
|
Label { // "Broadsword Hack"
|
|
text: {
|
|
if (ListItemData.reposted_by) {
|
|
return "reposted by @" + ListItemData.reposted_by
|
|
} else {
|
|
return ListItemData.source.name
|
|
}
|
|
}
|
|
textStyle.fontSize: FontSize.XSmall
|
|
textStyle.fontStyle: FontStyle.Italic
|
|
}
|
|
}
|
|
}
|
|
Divider {
|
|
accessibility.name: "divider"
|
|
}
|
|
contextActions: [
|
|
ActionSet {
|
|
title: "[" + ListItemData.id + "] " + ListItemData.user.username
|
|
ActionItem {
|
|
title: qsTr("Reply")
|
|
onTriggered: {
|
|
replySheet.text = atMention(ListItemData.user.username);
|
|
replySheet.open();
|
|
replySheet.input.requestFocus();
|
|
}
|
|
imageSource: "asset:///icons/ic_reply.png"
|
|
}
|
|
ActionItem {
|
|
title: qsTr("Reply All")
|
|
onTriggered: {
|
|
replySheet.text = atMention(ListItemData.user.username) + parseMentions(ListItemData.content.entities.mentions);
|
|
console.log(JSON.stringify(ListItemData.content.entities.mentions))
|
|
replySheet.open();
|
|
replySheet.input.requestFocus();
|
|
}
|
|
imageSource: "asset:///icons/ic_reply_all.png"
|
|
}
|
|
ActionItem {
|
|
title: (ListItemData.you_bookmarked) ? qsTr("Delete Bookmark") : qsTr("Add Bookmark")
|
|
imageSource: "asset:///icons/ic_favorite.png" //(ListItemData.you_bookmarked) ? "asset:///icons/star.png" : "asset:///icons/star-o.png"
|
|
onTriggered: {
|
|
if (ListItemData.you_bookmarked) {
|
|
postitem.ListItem.view.delBookmark(ListItemData.id);
|
|
} else {
|
|
postitem.ListItem.view.addBookmark(ListItemData.id);
|
|
}
|
|
}
|
|
}
|
|
ActionItem {
|
|
title: (ListItemData.you_reposted) ? qsTr("Delete Repost") : qsTr("Repost")
|
|
imageSource: "asset:///icons/retweet.png"
|
|
onTriggered: {
|
|
if (ListItemData.you_reposted) {
|
|
postitem.ListItem.view.delRepost(ListItemData.id);
|
|
} else {
|
|
postitem.ListItem.view.repost(ListItemData.id);
|
|
}
|
|
}
|
|
}
|
|
ActionItem {
|
|
title: qsTr("Quote")
|
|
imageSource: "asset:///icons/quote-left.png"
|
|
onTriggered: {
|
|
replySheet.text = " >> @" + ListItemData.user.username + ": " + ListItemData.content.text;
|
|
replySheet.open();
|
|
// replySheet.input.requestFocus();
|
|
}
|
|
}
|
|
ActionItem {
|
|
title: qsTr("View Profile")
|
|
imageSource: "asset:///icons/ic_contact.png"
|
|
onTriggered: {
|
|
postitem.ListItem.view.viewProfile(ListItemData.user)
|
|
}
|
|
}
|
|
ActionItem {
|
|
title: qsTr("Copy text")
|
|
imageSource: "asset:///icons/ic_copy.png"
|
|
onTriggered: {
|
|
postitem.ListItem.view.copyText(ListItemData.content.text)
|
|
}
|
|
}
|
|
InvokeActionItem {
|
|
title: "Share"
|
|
query {
|
|
mimeType: "text/plain"
|
|
invokeActionId: "bb.action.SHARE"
|
|
}
|
|
data: {
|
|
var text = "@" + ListItemData.user.username + ": " + ListItemData.content.text
|
|
text = text + "\n\n" + "https://posts.pnut.io/" + ListItemData.id
|
|
return text
|
|
}
|
|
}
|
|
// ActionItem {
|
|
// id: edItem
|
|
// enabled: (ListItemData.user.username === postitem.ListItem.view.getUserName())
|
|
// title: qsTr("Edit")
|
|
// imageSource: "asset:///icons/ic_edit.png"
|
|
// onTriggered: {
|
|
// // do an edit
|
|
// }
|
|
// }
|
|
DeleteActionItem {
|
|
id: delItem
|
|
enabled: (ListItemData.user.username === postitem.ListItem.view.getUserName())
|
|
title: qsTr("Delete")
|
|
onTriggered: {
|
|
postitem.ListItem.view.delPost(ListItemData.id)
|
|
}
|
|
}
|
|
}
|
|
]
|
|
attachedObjects: [
|
|
NewPostSheet {
|
|
id: replySheet
|
|
onSendPost: {
|
|
postitem.ListItem.view.sendReply(text, ListItemData.id);
|
|
}
|
|
onPostChanging: {
|
|
replySheet.count = 256 - postitem.ListItem.view.postLength(text)
|
|
if (replySheet.count < 0) {
|
|
replySheet.counttext = "longpost"
|
|
} else {
|
|
replySheet.counttext = replySheet.count.toString()
|
|
}
|
|
}
|
|
}
|
|
]
|
|
function parseMentions(mentions) {
|
|
var mtext = ""
|
|
for(var i = 0; i < mentions.length; i++) {
|
|
var mu = mentions[i].text
|
|
mtext += atMention(mu)
|
|
}
|
|
if (mtext.length > 0) {
|
|
if (postitem.ListItem.view.ccOnReply()) {
|
|
return "\n/" + mtext
|
|
} else {
|
|
return mtext
|
|
}
|
|
} else {
|
|
return ""
|
|
}
|
|
}
|
|
function atMention(username) {
|
|
var atname = ""
|
|
if (username !== postitem.ListItem.view.getUserName()) {
|
|
atname = "@" + username + " "
|
|
}
|
|
return atname
|
|
}
|
|
}
|