/* * 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 org.labsquare 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 { layout: DockLayout {} horizontalAlignment: HorizontalAlignment.Fill Container { layout: StackLayout { orientation: LayoutOrientation.LeftToRight } Container { background: (theme === VisualStyle.Bright) ? Color.create("#e9e9e9") : Color.create("#282828") WebImageView { id: avatar url: ListItemData.user.content.avatar_image.link maxWidth: ui.du(12) maxHeight: ui.du(12) //imageSource: "asset:///icons/laughing_man.png" } } Container { 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 { 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 { topMargin: ui.sdu(2.0) bottomMargin: ui.sdu(2.0) Label { text: Parser.parsePostData(ListItemData.content.html) multiline: true textFormat: TextFormat.Html navigation.focusPolicy: NavigationFocusPolicy.NotFocusable } } Container { // TODO: add tab to open full image in a page horizontalAlignment: HorizontalAlignment.Center bottomMargin: ui.sdu(2.0) WebImageView { url: { var oembed = "" if (typeof ListItemData.raw !== "undefined") { ListItemData.raw.forEach(function (item) { if (item["type"] == "io.pnut.core.oembed") { oembed = item["value"]["thumbnail_url"] } }) } return oembed } scalingMethod: ScalingMethod.AspectFit } } Container { 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: ListItemData.source.name textStyle.fontSize: FontSize.XSmall } } } Divider { accessibility.name: "divider" } contextActions: [ ActionSet { title: "[" + ListItemData.id + "] " + ListItemData.user.username ActionItem { title: qsTr("Reply") onTriggered: { replySheet.text = "@" + ListItemData.user.username + " "; replySheet.open(); replySheet.input.requestFocus(); } imageSource: "asset:///icons/ic_reply.png" } ActionItem { title: qsTr("Reply All") onTriggered: { replySheet.text = "@" + 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 if (mu !== postitem.ListItem.view.getUserName()) { mtext += "@" + mu + " " } } if (mtext.length > 0) { if (postitem.ListItem.view.ccOnReply()) { return "\n/" + mtext } else { return mtext } } else { return "" } } }