/* * 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.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: "" + ListItemData.user.username + "" 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.parsePostText(ListItemData.content) 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); } } ] 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 } }