Merge branch 'ui-improvements'

This commit is contained in:
molan-git 2020-06-18 18:53:19 +02:00
commit be45ada288
40 changed files with 1334 additions and 1136 deletions

View file

@ -71,10 +71,11 @@ DISTFILES += qml/harbour-tooterb.qml \
qml/cover/CoverPage.qml \ qml/cover/CoverPage.qml \
qml/pages/MainPage.qml \ qml/pages/MainPage.qml \
qml/pages/LoginPage.qml \ qml/pages/LoginPage.qml \
qml/pages/components/Toot.qml \
qml/pages/Browser.qml \ qml/pages/Browser.qml \
qml/lib/API.js \ qml/lib/API.js \
qml/images/icon-s-bot.svg \
qml/images/icon-s-following \ qml/images/icon-s-following \
qml/images/icon-s-bookmark \
qml/images/icon-m-emoji.svg \ qml/images/icon-m-emoji.svg \
qml/images/icon-m-profile.svg \ qml/images/icon-m-profile.svg \
qml/images/icon-l-profile.svg \ qml/images/icon-l-profile.svg \

View file

@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<title>icon-s-bookmark</title>
<g>
<rect width="32" height="32" fill="#fff" fill-opacity="0"/>
<path d="M20.81,10H11.19a1,1,0,1,1,0-2h9.63a1,1,0,0,1,0,2Z" fill="#fff"/>
<path d="M20.81,14.62H11.19a1,1,0,0,1,0-2h9.63a1,1,0,0,1,0,2Z" fill="#fff"/>
<path d="M26.85,29.74a1,1,0,0,1-.66-.25L16,20.82,5.81,29.48a1,1,0,0,1-1,.2c-.7-.22-.7-.76-.7-1.58,0-.63,0-1.88,0-4.38V4.48A2.41,2.41,0,0,1,6.44,2H25.56a2.41,2.41,0,0,1,2.29,2.5V23.73c0,2.5,0,3.75,0,4.38,0,.82,0,1.36-.7,1.58A1,1,0,0,1,26.85,29.74Zm-10.16-11,9.16,7.79c0-.7,0-1.62,0-2.84V4.48c0-.3-.18-.5-.29-.5H6.44c-.12,0-.29.2-.29.5V23.73c0,1.22,0,2.14,0,2.84l9.16-7.79h0a1.11,1.11,0,0,1,1.39,0Z" fill="#fff" opacity="0.6"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 776 B

11
qml/images/icon-s-bot.svg Normal file
View file

@ -0,0 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<title>icon-s-bot</title>
<g>
<path d="M27.28,14.83a5,5,0,0,0-5-4.72H9.7a5,5,0,0,0-5,4.72,1.32,1.32,0,0,0,0,.28V24a1.32,1.32,0,0,0,0,.28A5,5,0,0,0,9.7,29H22.3a5,5,0,0,0,5-4.72,1.32,1.32,0,0,0,0-.28V15.11A1.32,1.32,0,0,0,27.28,14.83ZM10.85,21.32a2.81,2.81,0,1,1,2.81-2.81A2.81,2.81,0,0,1,10.85,21.32Zm10.3,0A2.81,2.81,0,1,1,24,18.51,2.81,2.81,0,0,1,21.15,21.32Z" fill="#fff"/>
<g opacity="0.6">
<path d="M17.67,5.06v5h-4v-5a2,2,0,0,1,4,0Z" fill="#fff"/>
</g>
<path d="M30.43,19.55c0,2.61-1.4,4.73-3.13,4.73h0a1.32,1.32,0,0,0,0-.28V15.11a1.32,1.32,0,0,0,0-.28h0C29,14.83,30.43,16.94,30.43,19.55Z" fill="#fff" opacity="0.6"/>
<path d="M4.7,24a1.32,1.32,0,0,0,0,.28h0c-1.73,0-3.13-2.12-3.13-4.73S3,14.83,4.7,14.83h0a1.32,1.32,0,0,0,0,.28Z" fill="#fff" opacity="0.6"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 880 B

View file

Before

Width:  |  Height:  |  Size: 451 B

After

Width:  |  Height:  |  Size: 451 B

View file

@ -89,11 +89,13 @@ var tootParser = function(data){
ret.avatar_static = data.account.avatar_static ret.avatar_static = data.account.avatar_static
ret.favourited = data.favourited ? true : false ret.favourited = data.favourited ? true : false
ret.favourites_count = data.favourites_count ? data.favourites_count : 0 ret.status_favourites_count = data.favourites_count ? data.favourites_count : 0
ret.reblog = data.reblog ? true : false ret.reblog = data.reblog ? true : false
ret.reblogged = data.reblogged ? true : false ret.reblogged = data.reblogged ? true : false
ret.reblogs_count = data.reblogs_count ? data.reblogs_count : false ret.status_reblogs_count = data.reblogs_count ? data.reblogs_count : false
ret.bookmarked = data.bookmarked ? true : false
ret.muted = data.muted ? true : false ret.muted = data.muted ? true : false
ret.sensitive = data.sensitive ? true : false ret.sensitive = data.sensitive ? true : false

View file

@ -1,5 +1,8 @@
Qt.include("Mastodon.js") Qt.include("Mastodon.js")
var loadImages = true; var loadImages = true;
WorkerScript.onMessage = function(msg) { WorkerScript.onMessage = function(msg) {
console.log("Action > " + msg.action) console.log("Action > " + msg.action)
console.log("Model > " + msg.model) console.log("Model > " + msg.model)
@ -9,16 +12,17 @@ WorkerScript.onMessage = function(msg) {
// order notifications in ASC order // order notifications in ASC order
function orderNotifications(items){ function orderNotifications(items){
for (var i = items.length-1; i > 0; i--){ for (var i = items.length-1; i > 0; i--) {
if (items[i].id > 0 ) //msg.conf.notificationLastID) if (items[i].id > 0 ) //msg.conf.notificationLastID)
WorkerScript.sendMessage({ 'fireNotification': true, "data": items[i]}) WorkerScript.sendMessage({ 'fireNotification': true, "data": items[i]})
} }
} }
if (!msg.conf || !msg.conf.login){ if (!msg.conf || !msg.conf.login) {
console.log("Not loggedin") console.log("Not loggedin")
return; return;
} }
if (typeof msg.conf['loadImages'] !== "undefined") if (typeof msg.conf['loadImages'] !== "undefined")
loadImages = msg.conf['loadImages'] loadImages = msg.conf['loadImages']
@ -27,7 +31,7 @@ WorkerScript.onMessage = function(msg) {
API.post(msg.action, msg.params, function(data) { API.post(msg.action, msg.params, function(data) {
if (msg.bgAction){ if (msg.bgAction){
console.log(JSON.stringify(data)) console.log(JSON.stringify(data))
} else if (msg.action === "statuses"){ } else if (msg.action === "statuses") {
// status posted // status posted
if(msg.model){ if(msg.model){
var item = parseToot(data); var item = parseToot(data);
@ -59,7 +63,7 @@ WorkerScript.onMessage = function(msg) {
} else if(msg.action === "notifications") { } else if(msg.action === "notifications") {
// notification // notification
//console.log("Is notification... parsing...") // console.log("Is notification... parsing...")
console.log(JSON.stringify(data[i])) console.log(JSON.stringify(data[i]))
item = parseNotification(data[i]); item = parseNotification(data[i]);
items.push(item) items.push(item)
@ -90,14 +94,13 @@ WorkerScript.onMessage = function(msg) {
} }
addDataToModel (msg.model, "append", items); addDataToModel (msg.model, "append", items);
items = []; items = [];
} else if (data[i].hasOwnProperty("content")){ } else if (data[i].hasOwnProperty("content")){
//console.log("Is toot... parsing...") // console.log("Is toot... parsing...")
item = parseToot(data[i]); item = parseToot(data[i]);
item['id'] = item['status_id'] item['id'] = item['status_id']
items.push(item) items.push(item)
} else { } else {
WorkerScript.sendMessage({ 'action': msg.action, 'success': true, key: i, "data": data[i]}) WorkerScript.sendMessage({ 'action': msg.action, 'success': true, key: i, "data": data[i] })
} }
} }
} }
@ -108,40 +111,55 @@ WorkerScript.onMessage = function(msg) {
}); });
} }
//WorkerScript.sendMessage({ 'notifyNewItems': length - i }) //WorkerScript.sendMessage({ 'notifyNewItems': length - i })
function addDataToModel (model, mode, items){ function addDataToModel (model, mode, items) {
var length = items.length; var length = items.length;
console.log("Fetched > " +length) console.log("Fetched > " +length)
if (mode === "append") { if (mode === "append") {
model.append(items) model.append(items)
} else if (mode === "prepend") { } else if (mode === "prepend") {
for(var i = length-1; i >= 0 ; i--){ for(var i = length-1; i >= 0 ; i--) {
model.insert(0,items[i]) model.insert(0,items[i])
} }
} }
model.sync() model.sync()
} }
function parseAccounts(collection, prefix, data){
var res = collection;
// Get Account Data: Represents a user of Mastodon and their associated profile.
function parseAccounts(collection, prefix, data) {
var res = collection;
// Base attributes
res[prefix + 'account_id'] = data["id"] res[prefix + 'account_id'] = data["id"]
res[prefix + 'account_username'] = data["username"] res[prefix + 'account_username'] = data["username"]
res[prefix + 'account_acct'] = data["acct"] res[prefix + 'account_acct'] = data["acct"]
res[prefix + 'account_url'] = data["url"]
// Display attributes
res[prefix + 'account_display_name'] = data["display_name"] res[prefix + 'account_display_name'] = data["display_name"]
res[prefix + 'account_discoverable'] = data["discoverable"] res[prefix + 'account_note'] = data["note"]
res[prefix + 'account_locked'] = data["locked"]
res[prefix + 'account_created_at'] = data["created_at"]
res[prefix + 'account_avatar'] = data["avatar"] res[prefix + 'account_avatar'] = data["avatar"]
res[prefix + 'account_header'] = data["header"] res[prefix + 'account_header'] = data["header"]
res[prefix + 'account_locked'] = data["locked"]
//res[prefix + 'account_emojis'] = data["emojis"]
res[prefix + 'account_discoverable'] = data["discoverable"]
// Statistical attributes
res[prefix + 'account_created_at'] = data["created_at"]
res[prefix + 'account_statuses_count'] = data["statuses_count"]
res[prefix + 'account_followers_count'] = data["followers_count"]
res[prefix + 'account_following_count'] = data["following_count"]
// Optional attributes
//res[prefix + 'account_fields'] = data["fields"]
res[prefix + 'account_bot'] = data["bot"]
res[prefix + 'account_group'] = data["group"]
res[prefix + 'account_source'] = data["source"]
// console.log(JSON.stringify(res)) //console.log(JSON.stringify(res))
return (res); return (res);
} }
// Get Notification Data
function parseNotification(data){ function parseNotification(data){
//console.log(JSON.stringify(data)) //console.log(JSON.stringify(data))
var item = { var item = {
@ -152,31 +170,30 @@ function parseNotification(data){
switch (item['type']){ switch (item['type']){
case "mention": case "mention":
if (!data.status) { if (!data.status) {
break; break;
} }
item = parseToot(data.status) item = parseToot(data.status)
item['typeIcon'] = "image://theme/icon-s-retweet" item['typeIcon'] = "image://theme/icon-s-retweet"
item['typeIcon'] = "image://theme/icon-s-alarm" item['typeIcon'] = "image://theme/icon-s-alarm"
item['type'] = "mention"; item['type'] = "mention"
break; break;
case "reblog": case "reblog":
if (!data.status) { if (!data.status) {
break; break;
} }
item = parseToot(data.status) item = parseToot(data.status)
item = parseAccounts(item, "reblog_", data["account"]) item = parseAccounts(item, "reblog_", data["account"])
item = parseAccounts(item, "", data["status"]["account"]) item = parseAccounts(item, "", data["status"]["account"])
item['status_reblog'] = true; item['status_reblog'] = true
item['type'] = "reblog"; item['type'] = "reblog"
item['typeIcon'] = "image://theme/icon-s-retweet" item['typeIcon'] = "image://theme/icon-s-retweet"
break; break;
case "favourite": case "favourite":
if (!data.status) { if (!data.status) {
break; break;
} }
item = parseToot(data.status) item = parseToot(data.status)
item = parseAccounts(item, "reblog_", data["account"]) item = parseAccounts(item, "reblog_", data["account"])
item = parseAccounts(item, "", data["status"]["account"]) item = parseAccounts(item, "", data["status"]["account"])
@ -185,15 +202,16 @@ function parseNotification(data){
item['type'] = "favourite"; item['type'] = "favourite";
//item['retweetScreenName'] = item['reblog_account_username']; //item['retweetScreenName'] = item['reblog_account_username'];
break; break;
case "follow": case "follow":
item['type'] = "follow"; item['type'] = "follow";
item = parseAccounts(item, "", data["account"]) item = parseAccounts(item, "", data["account"])
item = parseAccounts(item, "reblog_", data["account"]) item = parseAccounts(item, "reblog_", data["account"])
item['content'] = data['account']['note'] item['content'] = data['account']['note']
item['typeIcon'] = "../../images/icon-s-following.svg" item['typeIcon'] = "../../images/icon-s-follow.svg"
item['attachments'] = [] item['attachments'] = []
break; break;
default: default:
item['typeIcon'] = "image://theme/icon-s-sailfish" item['typeIcon'] = "image://theme/icon-s-sailfish"
} }
@ -216,70 +234,76 @@ function collect() {
} }
return ret; return ret;
} }
function getDate(dateStr){
function getDate(dateStr) {
var ts = new Date(dateStr); var ts = new Date(dateStr);
return new Date(ts.getFullYear(), ts.getMonth(), ts.getDate(), 0, 0, 0) return new Date(ts.getFullYear(), ts.getMonth(), ts.getDate(), 0, 0, 0)
} }
function parseToot (data){
// Get Status / Toot Data
function parseToot (data) {
var i = 0; var i = 0;
var item = {}; var item = {};
item['type'] = "toot" item['type'] = "toot"
item['highlight'] = false item['highlight'] = false
item['status_id'] = data["id"] item['status_id'] = data["id"]
item['status_uri'] = data["uri"] item['status_created_at'] = item['created_at'] = new Date(data["created_at"])
item['status_url'] = data["url"]
item['status_in_reply_to_id'] = data["in_reply_to_id"]
item['status_in_reply_to_account_id'] = data["in_reply_to_account_id"]
item['status_reblog'] = data["reblog"] ? true : false
item['status_content'] = data["content"]
item['status_created_at'] = item['created_at'] = new Date(data["created_at"]);
item['section'] = getDate(data["created_at"]);
item['reblogs_count'] = data["reblogs_count"]
item['favourites_count'] = data["favourites_count"]
item['reblogged'] = data["reblogged"]
item['favourited'] = data["favourited"]
item['bookmarked'] = data["bookmarked"]
item['status_sensitive'] = data["sensitive"] item['status_sensitive'] = data["sensitive"]
item['status_spoiler_text'] = data["spoiler_text"] item['status_spoiler_text'] = data["spoiler_text"]
item['status_visibility'] = data["visibility"] item['status_visibility'] = data["visibility"]
item['status_language'] = data["language"]
if(item['status_reblog']){ item['status_uri'] = data["uri"]
item['status_url'] = data["url"]
item['status_replies_count'] = data["replies_count"]
item['status_reblogs_count'] = data["reblogs_count"]
item['status_favourites_count'] = data["favourites_count"]
item['status_favourited'] = data["favourited"]
item['status_reblogged'] = data["reblogged"]
item['status_bookmarked'] = data["bookmarked"]
item['status_content'] = data["content"]
item['status_in_reply_to_id'] = data["in_reply_to_id"]
item['status_in_reply_to_account_id'] = data["in_reply_to_account_id"]
item['status_reblog'] = data["reblog"] ? true : false
item['section'] = getDate(data["created_at"])
// If Toot is a Reblog
if(item['status_reblog']) {
item['type'] = "reblog"; item['type'] = "reblog";
item['typeIcon'] = "image://theme/icon-s-retweet" item['typeIcon'] = "image://theme/icon-s-retweet"
item['status_id'] = data["reblog"]["id"]; item['status_id'] = data["reblog"]["id"];
item['status_spoiler_text'] = data["reblog"]["spoiler_text"] item['status_spoiler_text'] = data["reblog"]["spoiler_text"]
item['status_sensitive'] = data["reblog"]["sensitive"] item['status_sensitive'] = data["reblog"]["sensitive"]
item['emojis'] = data["reblog"]["emojis"];
item = parseAccounts(item, "", data['reblog']["account"]) item = parseAccounts(item, "", data['reblog']["account"])
item = parseAccounts(item, "reblog_", data["account"]) item = parseAccounts(item, "reblog_", data["account"])
} else { } else {
item = parseAccounts(item, "", data["account"]) item = parseAccounts(item, "", data["account"])
} }
item['content'] = data['content'] item['content'] = data['content']
.replaceAll('</span><span class="invisible">', '') .replaceAll('</span><span class="invisible">', '')
.replaceAll('<span class="invisible">', '') .replaceAll('<span class="invisible">', '')
.replaceAll('</span><span class="ellipsis">', '') .replaceAll('</span><span class="ellipsis">', '')
.replaceAll('class=""', ''); .replaceAll('class=""', '');
item['attachments'] = []; item['attachments'] = [];
// Media attachements in Toots
for(i = 0; i < data['media_attachments'].length ; i++) {
for(i = 0; i < data['media_attachments'].length ; i++){
var attachments = data['media_attachments'][i]; var attachments = data['media_attachments'][i];
item['content'] = item['content'].replaceAll(attachments['text_url'], '') item['content'] = item['content'].replaceAll(attachments['text_url'], '')
var tmp = { var tmp = {
id: attachments['id'],
id: attachments['id'], id: attachments['id'],
type: attachments['type'], type: attachments['type'],
url: attachments['remote_url'] && typeof attachments['remote_url'] == "string" ? attachments['remote_url'] : attachments['url'] , url: attachments['remote_url'] && typeof attachments['remote_url'] == "string" ? attachments['remote_url'] : attachments['url'] ,
preview_url: loadImages ? attachments['preview_url'] : '' preview_url: loadImages ? attachments['preview_url'] : ''
} }
item['attachments'].push(tmp) item['attachments'].push(tmp)
} }
if(item['status_reblog']){
for(i = 0; i < data['reblog']['media_attachments'].length ; i++){ // Media attachements in Reblogs
if(item['status_reblog']) {
for(i = 0; i < data['reblog']['media_attachments'].length ; i++) {
var attachments = data['reblog']['media_attachments'][i]; var attachments = data['reblog']['media_attachments'][i];
item['content'] = item['content'].replaceAll(attachments['text_url'], '') item['content'] = item['content'].replaceAll(attachments['text_url'], '')
var tmp = { var tmp = {
@ -291,18 +315,20 @@ function parseToot (data){
item['attachments'].push(tmp) item['attachments'].push(tmp)
} }
} }
return addEmojis(item, data); return addEmojis(item, data);
} }
function addEmojis(item, data){ // Display function for custom Emojis in Toots
function addEmojis(item, data) {
var emoji, i; var emoji, i;
for (i = 0; i < data["emojis"].length; i++){ for (i = 0; i < data["emojis"].length; i++) {
emoji = data["emojis"][i]; emoji = data["emojis"][i];
item['content'] = item['content'].replaceAll(":"+emoji.shortcode+":", "<img src=\"" + emoji.static_url+"\" align=\"top\" width=\"50\" height=\"50\">") item['content'] = item['content'].replaceAll(":"+emoji.shortcode+":", "<img src=\"" + emoji.static_url+"\" align=\"top\" width=\"50\" height=\"50\">")
//console.log(JSON.stringify(data["emojis"][i])) //console.log(JSON.stringify(data["emojis"][i]))
} }
if (data["reblog"]) if (data["reblog"])
for (i = 0; i < data["reblog"]["emojis"].length; i++){ for (i = 0; i < data["reblog"]["emojis"].length; i++) {
emoji = data["reblog"]["emojis"][i]; emoji = data["reblog"]["emojis"][i];
item['content'] = item['content'].replaceAll(":"+emoji.shortcode+":", "<img src=\"" + emoji.static_url+"\" align=\"top\" width=\"50\" height=\"50\">") item['content'] = item['content'].replaceAll(":"+emoji.shortcode+":", "<img src=\"" + emoji.static_url+"\" align=\"top\" width=\"50\" height=\"50\">")
} }

View file

@ -6,73 +6,74 @@ import "./components/"
Page { Page {
id: conversationPage id: conversationPage
property string headerTitle: ""
property string type property string type
property alias title: header.title property string description: ""
property alias description: header.description property string headerTitle: ""
property alias avatar: header.image property string suggestedUser: ""
property string suggestedUser: "" property ListModel suggestedModel
property ListModel suggestedModel property string toot_id: ""
property string toot_id: ""
property string toot_url: "" property string toot_url: ""
property string toot_uri: "" property string toot_uri: ""
property int tootMaxChar: 500; property int tootMaxChar: 500;
property bool bot: false property bool bot: false //otherwise ReferenceError ProfileHeader.qml
property bool followed_by: false //otherwise ReferenceError ProfileHeader.qml
property bool locked: false //otherwise ReferenceError ProfileHeader.qml
property bool group: false //otherwise ReferenceError ProfileHeader.qml
property ListModel mdl property ListModel mdl
allowedOrientations: Orientation.All allowedOrientations: Orientation.All
onSuggestedUserChanged: { onSuggestedUserChanged: {
console.log(suggestedUser) console.log(suggestedUser)
suggestedModel = Qt.createQmlObject( suggestedModel = Qt.createQmlObject(
'import QtQuick 2.0; ListModel { }', 'import QtQuick 2.0; ListModel { }',
Qt.application, 'InternalQmlObject' Qt.application, 'InternalQmlObject'
) )
predictionList.visible = false predictionList.visible = false
if (suggestedUser.length > 0) { if (suggestedUser.length > 0) {
var msg = { var msg = {
"action": 'accounts/search', "action": 'accounts/search',
"method": 'GET', "method": 'GET',
"model": suggestedModel, "model": suggestedModel,
"mode": "append", "mode": "append",
"params": [{ "params": [{
"name": "q", "name": "q",
"data": suggestedUser "data": suggestedUser
}], }],
"conf": Logic.conf "conf": Logic.conf
} }
worker.sendMessage(msg) worker.sendMessage(msg)
predictionList.visible = true predictionList.visible = true
} }
} }
ListModel { ListModel {
id: mediaModel id: mediaModel
onCountChanged: { onCountChanged: {
btnAddImage.enabled = mediaModel.count < 4 btnAddImage.enabled = mediaModel.count < 4
} }
} }
WorkerScript { WorkerScript {
id: worker id: worker
source: "../lib/Worker.js" source: "../lib/Worker.js"
onMessage: { onMessage: {
console.log(JSON.stringify(messageObject)) console.log(JSON.stringify(messageObject))
} }
} }
ProfileHeader { ProfileHeader {
id: header id: header
visible: false visible: false
} }
SilicaListView { SilicaListView {
id: myList id: myList
header: PageHeader { header: PageHeader {
title: headerTitle // pageTitle pushed from MainPage.qml or VisualContainer.qml title: headerTitle // pageTitle pushed from MainPage.qml or VisualContainer.qml
} }
clip: true clip: true
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
@ -81,33 +82,34 @@ Page {
} else { } else {
hiddenPanel.top hiddenPanel.top
} }
model: mdl model: mdl
section { section {
property: 'section' property: 'section'
delegate: SectionHeader { delegate: SectionHeader {
height: Theme.itemSizeExtraSmall height: Theme.itemSizeExtraSmall
text: Format.formatDate(section, Formatter.DateMedium) text: Format.formatDate(section, Formatter.DateMedium)
} }
} }
delegate: VisualContainer { delegate: VisualContainer {
} }
onCountChanged: { onCountChanged: {
if (mdl) if (mdl)
for (var i = 0; i < mdl.count; i++) { for (var i = 0; i < mdl.count; i++) {
if (mdl.get(i).status_id === toot_id) { if (mdl.get(i).status_id === toot_id) {
console.log(mdl.get(i).status_id) console.log(mdl.get(i).status_id)
positionViewAtIndex(i, ListView.Center) positionViewAtIndex(i, ListView.Center)
} }
} }
} }
PullDownMenu { PullDownMenu {
id: pulleyConversation id: pulleyConversation
visible: type === "reply" visible: type === "reply"
MenuItem { MenuItem {
//: Use the translation of "Copy Link" for a shorter PullDownMenu label
text: qsTr("Copy Link to Clipboard") text: qsTr("Copy Link to Clipboard")
onClicked: if (toot_url === "") { onClicked: if (toot_url === "") {
var test = toot_uri.split("/") var test = toot_uri.split("/")
console.log(toot_uri) console.log(toot_uri)
console.log(JSON.stringify(test)) console.log(JSON.stringify(test))
@ -117,15 +119,24 @@ Page {
Clipboard.text = urialt Clipboard.text = urialt
} }
else Clipboard.text = toot_uri else Clipboard.text = toot_uri
} else Clipboard.text = toot_url
} else onClicked: Clipboard.text = toot_url
} }
MenuItem {
//: "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
text: !panel.open ? qsTr("Reply") : qsTr("Hide Reply")
visible: type == "reply"
onClicked: if (!panel.open) {
panel.open = true
} else panel.open = false
}
} }
} }
Rectangle { Rectangle {
id: predictionList id: predictionList
visible: false visible: false
color: Theme.highlightDimmerColor color: Theme.highlightDimmerColor
height: parent.height - panel.height - (Theme.paddingLarge * 4.5) height: parent.height - panel.height - (Theme.paddingLarge * 4.5)
anchors { anchors {
@ -141,108 +152,111 @@ Page {
SilicaListView { SilicaListView {
rotation: 180 rotation: 180
anchors.fill: parent anchors.fill: parent
model: suggestedModel model: suggestedModel
clip: true clip: true
quickScroll: false quickScroll: false
VerticalScrollDecorator {} VerticalScrollDecorator {}
delegate: ItemUser { delegate: ItemUser {
rotation: 180 rotation: 180
onClicked: { onClicked: {
var start = toot.cursorPosition var start = toot.cursorPosition
while (toot.text[start] !== "@" && start > 0) { while (toot.text[start] !== "@" && start > 0) {
start-- start--
} }
textOperations.text = toot.text textOperations.text = toot.text
textOperations.cursorPosition = toot.cursorPosition textOperations.cursorPosition = toot.cursorPosition
textOperations.moveCursorSelection(start - 1, TextInput.SelectWords) textOperations.moveCursorSelection(start - 1, TextInput.SelectWords)
toot.text = textOperations.text.substring(0, textOperations.selectionStart) toot.text = textOperations.text.substring(0, textOperations.selectionStart)
+ ' @' + ' @'
+ model.account_acct + model.account_acct
+ ' ' + ' '
+ textOperations.text.substring(textOperations.selectionEnd).trim() + textOperations.text.substring(textOperations.selectionEnd).trim()
toot.cursorPosition = toot.text.indexOf('@' + model.account_acct) toot.cursorPosition = toot.text.indexOf('@' + model.account_acct)
} }
} }
onCountChanged: { onCountChanged: {
positionViewAtBeginning(suggestedModel.count - 1, ListView.Beginning) if (count > 0) {
} positionViewAtBeginning(suggestedModel.count - 1, ListView.Beginning)
} }
} }
}
}
DockedPanel { DockedPanel {
id: panel id: panel
width: parent.width width: parent.width
height: progressBar.height + toot.height + (mediaModel.count ? uploadedImages.height : 0) height: progressBar.height + toot.height + (mediaModel.count ? uploadedImages.height : 0)
+ btnContentWarning.height + Theme.paddingMedium + btnContentWarning.height + Theme.paddingMedium
+ (warningContent.visible ? warningContent.height : 0) + (warningContent.visible ? warningContent.height : 0)
dock: Dock.Bottom dock: Dock.Bottom
open: true open: true
animationDuration: 200
animationDuration: 300
Rectangle { Rectangle {
width: parent.width width: parent.width
height: progressBar.height height: progressBar.height
color: Theme.highlightBackgroundColor color: Theme.highlightBackgroundColor
opacity: 0.2 opacity: 0.2
anchors { anchors {
left: parent.left left: parent.left
right: parent.right right: parent.right
top: parent.top top: parent.top
} }
} }
Rectangle { Rectangle {
id: progressBar id: progressBar
width: toot.text.length ? panel.width * (toot.text.length / tootMaxChar) : 0 width: toot.text.length ? panel.width * (toot.text.length / tootMaxChar) : 0
height: Theme.itemSizeSmall * 0.05 height: Theme.itemSizeSmall * 0.05
color: Theme.highlightBackgroundColor color: Theme.highlightBackgroundColor
opacity: 0.7 opacity: 0.7
anchors { anchors {
left: parent.left left: parent.left
top: parent.top top: parent.top
} }
} }
TextField { TextField {
id: warningContent id: warningContent
visible: false visible: false
height: visible ? implicitHeight : 0 height: visible ? implicitHeight : 0
anchors { anchors {
top: parent.top top: parent.top
topMargin: Theme.paddingMedium topMargin: Theme.paddingMedium
left: parent.left left: parent.left
right: parent.right right: parent.right
} }
autoScrollEnabled: true autoScrollEnabled: true
labelVisible: false labelVisible: false
font.pixelSize: Theme.fontSizeSmall font.pixelSize: Theme.fontSizeSmall
placeholderText: qsTr("Write your warning here") placeholderText: qsTr("Write your warning here")
placeholderColor: palette.highlightColor placeholderColor: palette.highlightColor
color: palette.highlightColor color: palette.highlightColor
horizontalAlignment: Text.AlignLeft horizontalAlignment: Text.AlignLeft
EnterKey.onClicked: {} EnterKey.onClicked: {}
} }
TextInput { TextInput {
id: textOperations id: textOperations
visible: false visible: false
} }
TextArea { TextArea {
id: toot id: toot
anchors { anchors {
top: warningContent.bottom top: warningContent.bottom
topMargin: Theme.paddingMedium topMargin: Theme.paddingMedium
left: parent.left left: parent.left
right: parent.right right: parent.right
rightMargin: Theme.paddingLarge * 2 rightMargin: Theme.paddingLarge * 2
} }
autoScrollEnabled: true autoScrollEnabled: true
labelVisible: false labelVisible: false
text: description !== "" && (description.charAt(0) === '@' text: description !== "" && (description.charAt(0) === '@'
|| description.charAt( || description.charAt(
0) === '#') ? description + ' ' : '' 0) === '#') ? description + ' ' : ''
height: if (type !== "reply") { height: if (type !== "reply") {
Math.max(conversationPage.height / 3, Math.min(conversationPage.height * 0.65, implicitHeight)) Math.max(conversationPage.height / 3, Math.min(conversationPage.height * 0.65, implicitHeight))
} }
@ -253,274 +267,274 @@ Page {
placeholderText: qsTr("What's on your mind?") placeholderText: qsTr("What's on your mind?")
font.pixelSize: Theme.fontSizeSmall font.pixelSize: Theme.fontSizeSmall
EnterKey.onClicked: {} EnterKey.onClicked: {}
onTextChanged: { onTextChanged: {
textOperations.text = toot.text textOperations.text = toot.text
textOperations.cursorPosition = toot.cursorPosition textOperations.cursorPosition = toot.cursorPosition
textOperations.selectWord() textOperations.selectWord()
textOperations.select( textOperations.select(
textOperations.selectionStart ? textOperations.selectionStart - 1 : 0, textOperations.selectionStart ? textOperations.selectionStart - 1 : 0,
textOperations.selectionEnd) textOperations.selectionEnd)
//console.log(textOperations.text.substr(textOperations.selectionStart, textOperations.selectionEnd)) //console.log(textOperations.text.substr(textOperations.selectionStart, textOperations.selectionEnd))
console.log(toot.text.length) console.log(toot.text.length)
suggestedUser = "" suggestedUser = ""
if (textOperations.selectedText.charAt(0) === "@") { if (textOperations.selectedText.charAt(0) === "@") {
suggestedUser = textOperations.selectedText.trim().substring(1) suggestedUser = textOperations.selectedText.trim().substring(1)
} }
} }
} }
IconButton { IconButton {
id: btnSmileys id: btnSmileys
property string selection property string selection
opacity: 0.7 opacity: 0.7
icon { icon {
source: "../../qml/images/icon-m-emoji.svg?"
color: Theme.secondaryColor color: Theme.secondaryColor
width: Theme.iconSizeSmallPlus width: Theme.iconSizeSmallPlus
fillMode: Image.PreserveAspectFit fillMode: Image.PreserveAspectFit
source: "../../qml/images/icon-m-emoji.svg"
} }
anchors { anchors {
top: warningContent.bottom top: warningContent.bottom
bottom: bottom.top bottom: bottom.top
right: parent.right right: parent.right
rightMargin: Theme.paddingSmall rightMargin: Theme.paddingSmall
} }
onSelectionChanged: { console.log(selection) } onSelectionChanged: { console.log(selection) }
onClicked: pageStack.push(emojiSelect) onClicked: pageStack.push(emojiSelect)
} }
SilicaGridView { SilicaGridView {
id: uploadedImages id: uploadedImages
width: parent.width width: parent.width
anchors.top: bottom.toot anchors.top: bottom.toot
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
height: mediaModel.count ? Theme.itemSizeExtraLarge : 0 height: mediaModel.count ? Theme.itemSizeExtraLarge : 0
model: mediaModel model: mediaModel
cellWidth: uploadedImages.width / 4 cellWidth: uploadedImages.width / 4
cellHeight: Theme.itemSizeExtraLarge cellHeight: Theme.itemSizeExtraLarge
delegate: BackgroundItem { delegate: BackgroundItem {
id: myDelegate id: myDelegate
width: uploadedImages.cellWidth width: uploadedImages.cellWidth
height: uploadedImages.cellHeight height: uploadedImages.cellHeight
RemorseItem { RemorseItem {
id: remorse id: remorse
} }
Image { Image {
anchors.fill: parent anchors.fill: parent
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
source: model.preview_url source: model.preview_url
} }
onClicked: { onClicked: {
var idx = index var idx = index
console.log(idx) console.log(idx)
//mediaModel.remove(idx) //mediaModel.remove(idx)
remorse.execute(myDelegate, qsTr("Delete"), function () { remorse.execute(myDelegate, qsTr("Delete"), function () {
mediaModel.remove(idx) mediaModel.remove(idx)
}) })
} }
} }
add: Transition { add: Transition {
NumberAnimation { NumberAnimation {
property: "opacity" property: "opacity"
from: 0 from: 0
to: 1.0 to: 1.0
duration: 800 duration: 800
} }
} }
remove: Transition { remove: Transition {
NumberAnimation { NumberAnimation {
property: "opacity" property: "opacity"
from: 1.0 from: 1.0
to: 0 to: 0
duration: 800 duration: 800
} }
} }
displaced: Transition { displaced: Transition {
NumberAnimation { NumberAnimation {
properties: "x,y" properties: "x,y"
duration: 800 duration: 800
easing.type: Easing.InOutBack easing.type: Easing.InOutBack
} }
} }
} }
IconButton { IconButton {
id: btnContentWarning id: btnContentWarning
anchors { anchors {
top: toot.bottom top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5 topMargin: -Theme.paddingSmall * 1.5
left: parent.left left: parent.left
leftMargin: Theme.paddingMedium leftMargin: Theme.paddingMedium
} }
icon.source: "image://theme/icon-s-warning?" icon.source: "image://theme/icon-s-warning?"
+ (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor)) + (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
onClicked: warningContent.visible = !warningContent.visible onClicked: warningContent.visible = !warningContent.visible
} }
IconButton { IconButton {
id: btnAddImage id: btnAddImage
enabled: mediaModel.count < 4 enabled: mediaModel.count < 4
anchors { anchors {
top: toot.bottom top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5 topMargin: -Theme.paddingSmall * 1.5
left: btnContentWarning.right left: btnContentWarning.right
leftMargin: Theme.paddingSmall leftMargin: Theme.paddingSmall
} }
icon.source: "image://theme/icon-s-attach?" icon.source: "image://theme/icon-s-attach?"
+ (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor)) + (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
onClicked: { onClicked: {
btnAddImage.enabled = false btnAddImage.enabled = false
var once = true var once = true
var imagePicker = pageStack.push("Sailfish.Pickers.ImagePickerPage", {"allowedOrientations": Orientation.All}) var imagePicker = pageStack.push("Sailfish.Pickers.ImagePickerPage", {"allowedOrientations": Orientation.All})
imagePicker.selectedContentChanged.connect(function () { imagePicker.selectedContentChanged.connect(function () {
var imagePath = imagePicker.selectedContent var imagePath = imagePicker.selectedContent
console.log(imagePath) console.log(imagePath)
imageUploader.setUploadUrl(Logic.conf.instance + "/api/v1/media") imageUploader.setUploadUrl(Logic.conf.instance + "/api/v1/media")
imageUploader.setFile(imagePath) imageUploader.setFile(imagePath)
imageUploader.setAuthorizationHeader(Logic.conf.api_user_token) imageUploader.setAuthorizationHeader(Logic.conf.api_user_token)
imageUploader.upload() imageUploader.upload()
}) })
} }
} }
ImageUploader { ImageUploader {
id: imageUploader id: imageUploader
onProgressChanged: { onProgressChanged: {
console.log("progress " + progress) console.log("progress " + progress)
uploadProgress.width = parent.width * progress uploadProgress.width = parent.width * progress
} }
onSuccess: { onSuccess: {
uploadProgress.width = 0 uploadProgress.width = 0
console.log(replyData) console.log(replyData)
mediaModel.append(JSON.parse(replyData)) mediaModel.append(JSON.parse(replyData))
} }
onFailure: { onFailure: {
uploadProgress.width = 0 uploadProgress.width = 0
btnAddImage.enabled = true btnAddImage.enabled = true
console.log(status) console.log(status)
console.log(statusText) console.log(statusText)
} }
} }
ComboBox { ComboBox {
id: privacy id: privacy
anchors { anchors {
top: toot.bottom top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5 topMargin: -Theme.paddingSmall * 1.5
left: btnAddImage.right left: btnAddImage.right
right: btnSend.left right: btnSend.left
} }
menu: ContextMenu { menu: ContextMenu {
MenuItem { MenuItem {
text: qsTr("Public") text: qsTr("Public")
} }
MenuItem { MenuItem {
text: qsTr("Unlisted") text: qsTr("Unlisted")
} }
MenuItem { MenuItem {
text: qsTr("Followers-only") text: qsTr("Followers-only")
} }
MenuItem { MenuItem {
text: qsTr("Direct") text: qsTr("Direct")
} }
} }
} }
IconButton { IconButton {
id: btnSend id: btnSend
icon.source: "image://theme/icon-m-send?" icon.source: "image://theme/icon-m-send?"
+ (pressed ? Theme.highlightColor : Theme.primaryColor) + (pressed ? Theme.highlightColor : Theme.primaryColor)
anchors { anchors {
top: toot.bottom top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5 topMargin: -Theme.paddingSmall * 1.5
right: parent.right right: parent.right
rightMargin: Theme.paddingSmall rightMargin: Theme.paddingSmall
} }
enabled: toot.text !== "" && toot.text.length < tootMaxChar && uploadProgress.width == 0 enabled: toot.text !== "" && toot.text.length < tootMaxChar && uploadProgress.width == 0
onClicked: { onClicked: {
var visibility = ["public", "unlisted", "private", "direct"] var visibility = ["public", "unlisted", "private", "direct"]
var media_ids = [] var media_ids = []
for (var k = 0; k < mediaModel.count; k++) { for (var k = 0; k < mediaModel.count; k++) {
console.log(mediaModel.get(k).id) console.log(mediaModel.get(k).id)
media_ids.push(mediaModel.get(k).id) media_ids.push(mediaModel.get(k).id)
} }
var msg = { var msg = {
"action": 'statuses', "action": 'statuses',
"method": 'POST', "method": 'POST',
"model": mdl, "model": mdl,
"mode": "append", "mode": "append",
"params": { "params": {
"status": toot.text, "status": toot.text,
"visibility": visibility[privacy.currentIndex], "visibility": visibility[privacy.currentIndex],
"media_ids": media_ids "media_ids": media_ids
}, },
"conf": Logic.conf "conf": Logic.conf
} }
if (toot_id) if (toot_id)
msg.params['in_reply_to_id'] = (toot_id) + "" msg.params['in_reply_to_id'] = (toot_id) + ""
if (warningContent.visible && warningContent.text.length > 0) { if (warningContent.visible && warningContent.text.length > 0) {
msg.params['sensitive'] = 1 msg.params['sensitive'] = 1
msg.params['spoiler_text'] = warningContent.text msg.params['spoiler_text'] = warningContent.text
} }
worker.sendMessage(msg) worker.sendMessage(msg)
warningContent.text = "" warningContent.text = ""
toot.text = "" toot.text = ""
mediaModel.clear() mediaModel.clear()
sentBanner.showText(qsTr("Toot sent!")) sentBanner.showText(qsTr("Toot sent!"))
} }
} }
Rectangle { Rectangle {
id: uploadProgress id: uploadProgress
color: Theme.highlightBackgroundColor color: Theme.highlightBackgroundColor
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
height: Theme.itemSizeSmall * 0.05 height: Theme.itemSizeSmall * 0.05
} }
} }
Component.onCompleted: { Component.onCompleted: {
toot.cursorPosition = toot.text.length toot.cursorPosition = toot.text.length
if (mdl.count > 0) { if (mdl.count > 0) {
var setIndex = 0 var setIndex = 0
switch (mdl.get(0).status_visibility) { switch (mdl.get(0).status_visibility) {
case "unlisted": case "unlisted":
setIndex = 1 setIndex = 1
break break
case "private": case "private":
setIndex = 2 setIndex = 2
break break
case "direct": case "direct":
privacy.enabled = false privacy.enabled = false
setIndex = 3 setIndex = 3
break break
default: default:
privacy.enabled = true privacy.enabled = true
setIndex = 0 setIndex = 0
} }
privacy.currentIndex = setIndex privacy.currentIndex = setIndex
} }
console.log(JSON.stringify()) console.log(JSON.stringify())
worker.sendMessage({ worker.sendMessage({
"action": 'statuses/' + mdl.get(0).status_id + '/context', "action": 'statuses/' + mdl.get(0).status_id + '/context',
"method": 'GET', "method": 'GET',
"model": mdl, "model": mdl,
"params": { }, "params": { },
"conf": Logic.conf "conf": Logic.conf
}) })
} }
BackgroundItem { BackgroundItem {
id: hiddenPanel id: hiddenPanel
visible: !panel.open visible: !panel.open
height: Theme.paddingLarge * 0.5 height: Theme.paddingLarge * 0.7
width: parent.width width: parent.width
opacity: enabled ? 0.6 : 0.0 opacity: enabled ? 0.6 : 0.0
Behavior on opacity { FadeAnimator { duration: 400 } } Behavior on opacity { FadeAnimator { duration: 400 } }
@ -572,10 +586,9 @@ Page {
EmojiSelect { EmojiSelect {
id: emojiSelect id: emojiSelect
} }
InfoBanner { InfoBanner {
id: sentBanner id: sentBanner
} }
} }

View file

@ -161,5 +161,4 @@ Page {
} }
} }
} }
} }

View file

@ -10,7 +10,6 @@ Page {
property bool isFirstPage: true property bool isFirstPage: true
property bool isTablet: true //Screen.sizeCategory >= Screen.Large property bool isTablet: true //Screen.sizeCategory >= Screen.Large
// The effective value will be restricted by ApplicationWindow.allowedOrientations
allowedOrientations: Orientation.All allowedOrientations: Orientation.All
DockedPanel { DockedPanel {
@ -19,6 +18,7 @@ Page {
width: mainPage.isPortrait ? parent.width : Theme.itemSizeLarge width: mainPage.isPortrait ? parent.width : Theme.itemSizeLarge
height: mainPage.isPortrait ? Theme.itemSizeLarge : parent.height height: mainPage.isPortrait ? Theme.itemSizeLarge : parent.height
dock: mainPage.isPortrait ? Dock.Bottom : Dock.Right dock: mainPage.isPortrait ? Dock.Bottom : Dock.Right
Navigation { Navigation {
id: navigation id: navigation
isPortrait: !mainPage.isPortrait isPortrait: !mainPage.isPortrait
@ -31,6 +31,7 @@ Page {
VisualItemModel { VisualItemModel {
id: visualModel id: visualModel
MyList{ MyList{
id: tlHome id: tlHome
title: qsTr("Home") title: qsTr("Home")
@ -88,7 +89,7 @@ Page {
loader.sourceComponent = userListComponent loader.sourceComponent = userListComponent
} else if (search.charAt(0) === "#") { } else if (search.charAt(0) === "#") {
loader.sourceComponent = tagListComponent loader.sourceComponent = tagListComponent
} else { loader.sourceComponent = wordListComponent} } else loader.sourceComponent = wordListComponent
} }
Loader { Loader {
@ -102,6 +103,7 @@ Page {
PageHeader { PageHeader {
title: qsTr("Search") title: qsTr("Search")
} }
SearchField { SearchField {
id: searchField id: searchField
width: parent.width width: parent.width
@ -175,10 +177,19 @@ Page {
"username": model.account_acct, "username": model.account_acct,
"user_id": model.account_id, "user_id": model.account_id,
"profileImage": model.account_avatar, "profileImage": model.account_avatar,
"profileBackground": model.account_header "profileBackground": model.account_header,
"note": model.account_note,
"url": model.account_url,
"followers_count": model.account_followers_count,
"following_count": model.account_following_count,
"statuses_count": model.account_statuses_count,
"locked": model.account_locked,
"bot": model.account_bot,
"group": model.account_group
}) })
} }
} }
Component.onCompleted: { Component.onCompleted: {
view2.type = "accounts/search" view2.type = "accounts/search"
view2.params = [] view2.params = []
@ -256,7 +267,7 @@ Page {
} }
} }
function onLinkActivated(href){ function onLinkActivated(href) {
var test = href.split("/") var test = href.split("/")
console.log(href) console.log(href)
console.log(JSON.stringify(test)) console.log(JSON.stringify(test))
@ -279,5 +290,4 @@ Page {
Component.onCompleted: { Component.onCompleted: {
console.log("aaa") console.log("aaa")
} }
} }

View file

@ -19,14 +19,12 @@ Page {
property int statuses_count property int statuses_count
property int following_count property int following_count
property int followers_count property int followers_count
property int favourites_count
property int reblogs_count
property int count_moments
property bool locked: false property bool locked: false
property bool bot: false property bool bot: false
property bool group: false
property bool following: false property bool following: false
property bool requested: false
property bool followed_by: false property bool followed_by: false
property bool requested: false
property bool blocking: false property bool blocking: false
property bool muting: false property bool muting: false
property bool domain_blocking: false property bool domain_blocking: false
@ -57,12 +55,12 @@ Page {
if(messageObject.action === "accounts/relationships/"){ if(messageObject.action === "accounts/relationships/"){
console.log(JSON.stringify(messageObject)) console.log(JSON.stringify(messageObject))
following= messageObject.data.following following = messageObject.data.following
requested= messageObject.data.requested requested = messageObject.data.requested
followed_by= messageObject.data.followed_by followed_by = messageObject.data.followed_by
blocking= messageObject.data.blocking blocking = messageObject.data.blocking
muting= messageObject.data.muting muting = messageObject.data.muting
domain_blocking= messageObject.data.domain_blocking domain_blocking = messageObject.data.domain_blocking
} }
switch (messageObject.key) { switch (messageObject.key) {
case 'followers_count': case 'followers_count':
@ -71,16 +69,9 @@ Page {
case 'following_count': case 'following_count':
following_count = messageObject.data following_count = messageObject.data
break; break;
case 'acct': /* case 'acct':
// line below was commented out, reason unknown username = messageObject.data
// username = messageObject.data break; */
break;
case 'locked':
locked = messageObject.data
break;
case 'bot':
bot = messageObject.data
break;
case 'created_at': case 'created_at':
created_at = messageObject.data created_at = messageObject.data
break; break;
@ -102,10 +93,7 @@ Page {
break; break;
case 'blocking': case 'blocking':
blocking = messageObject.data blocking = messageObject.data
followers_count = followers_count + (blocking ? -1 : 0) // followers_count = followers_count + (blocking ? -1 : 0)
break;
case 'followed_by':
followed_by = messageObject.data
break; break;
} }
} }
@ -119,15 +107,11 @@ Page {
if (user_id) { if (user_id) {
msg = { msg = {
'action' : "accounts/relationships/", 'action' : "accounts/relationships/",
'params' : [ {name: "id", data: user_id}], 'params' : [ {name: "id", data: user_id} ],
'conf' : Logic.conf
}
worker.sendMessage(msg)
msg = {
'action' : "accounts/"+user_id,
'conf' : Logic.conf 'conf' : Logic.conf
} }
worker.sendMessage(msg) worker.sendMessage(msg)
} else { } else {
var instance = Logic.conf['instance'].split("//") var instance = Logic.conf['instance'].split("//")
msg = { msg = {
@ -160,13 +144,10 @@ Page {
} }
} }
ExpandingSectionGroup { // ProfilePage ExpandingSection // ProfilePage ExpandingSection
ExpandingSectionGroup {
id: profileExpander id: profileExpander
anchors { anchors.bottom: parent.bottom
bottom: parent.bottom
left: parent.left
right: parent.right
}
ExpandingSection { ExpandingSection {
id: expandingSection1 id: expandingSection1
@ -174,13 +155,12 @@ Page {
//: If there's no good translation for "About", use "Details" (in details about profile). //: If there's no good translation for "About", use "Details" (in details about profile).
qsTr("About") qsTr("About")
content.sourceComponent: Column { content.sourceComponent: Column {
height: Math.min( txtContainer, parent.height * 0.7 )
spacing: Theme.paddingLarge spacing: Theme.paddingLarge
Item { Item {
id: txtContainer id: txtContainer
width: parent.width width: parent.width
height: Math.min( txtNote.height, parent.height * 0.55 ) height: profilePage.isPortrait ? Math.min( txtNote.height, parent.height * 0.5 ) : Math.min( txtNote.height, parent.height * 0.2 )
visible: { visible: {
if ((note.text === "") || ( note.text === "<p></p>" )) { if ((note.text === "") || ( note.text === "<p></p>" )) {
false false
@ -249,7 +229,7 @@ Page {
Text { Text {
id: txtFollowers id: txtFollowers
visible: followers_count ? true : false visible: true //followers_count ? true : false
text: followers_count+" "+ text: followers_count+" "+
//: Will show as: "35 Followers" //: Will show as: "35 Followers"
qsTr("Followers") qsTr("Followers")
@ -260,7 +240,7 @@ Page {
Text { Text {
id: txtFollowing id: txtFollowing
visible: following_count ? true : false visible: true //following_count ? true : false
text: following_count+" "+ text: following_count+" "+
//: Will show as: "23 Following" //: Will show as: "23 Following"
qsTr("Following") qsTr("Following")
@ -271,7 +251,7 @@ Page {
Text { Text {
id: txtStatuses id: txtStatuses
visible: statuses_count ? true : false visible: true //statuses_count ? true : false
text: statuses_count+" "+ text: statuses_count+" "+
//: Will show as: "115 Statuses" //: Will show as: "115 Statuses"
qsTr("Statuses") qsTr("Statuses")
@ -279,17 +259,6 @@ Page {
color: Theme.highlightColor color: Theme.highlightColor
wrapMode: Text.Wrap wrapMode: Text.Wrap
} }
/*Text {
id: txtFavourites
visible: favourites_count ? true : false
text: favourites_count+" "+
//: Will show as: "56 Favourites"
qsTr("Favourites")
font.pixelSize: Theme.fontSizeExtraSmall
color: Theme.highlightColor
wrapMode: Text.Wrap
} */
} }
Item { // dummy item for spacing Item { // dummy item for spacing
@ -301,7 +270,7 @@ Page {
Button { Button {
id: btnMention id: btnMention
preferredWidth: Theme.buttonWidthSmall preferredWidth: Theme.buttonWidthSmall
text: "Mention" text: qsTr("Mention")
onClicked: { onClicked: {
pageStack.push(Qt.resolvedUrl("ConversationPage.qml"), { pageStack.push(Qt.resolvedUrl("ConversationPage.qml"), {
headerTitle: qsTr("Mention"), headerTitle: qsTr("Mention"),
@ -393,5 +362,4 @@ Page {
} }
} }
} }
} }

View file

@ -31,14 +31,13 @@ Page {
text: qsTr("Load Images in Toots") text: qsTr("Load Images in Toots")
description: qsTr("Disable this option if you want to preserve your data connection") description: qsTr("Disable this option if you want to preserve your data connection")
icon.source: "image://theme/icon-m-image" icon.source: "image://theme/icon-m-image"
enabled: true
checked: typeof Logic.conf['loadImages'] !== "undefined" && Logic.conf['loadImages'] checked: typeof Logic.conf['loadImages'] !== "undefined" && Logic.conf['loadImages']
onClicked: { onClicked: {
Logic.conf['loadImages'] = checked Logic.conf['loadImages'] = checked
} }
} }
SectionHeader { text: qsTr("Account")} SectionHeader { text: qsTr("Account") }
Item { Item {
id: removeAccount id: removeAccount
@ -97,11 +96,8 @@ Page {
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
wrapMode: Text.Wrap wrapMode: Text.Wrap
color: Theme.highlightColor color: Theme.highlightColor
anchors { width: parent.width - Theme.paddingMedium
left: parent.left anchors.left: parent.left
right: parent.right
rightMargin: Theme.paddingLarge + icnRemoveAccount
}
} }
} }
} }
@ -253,5 +249,4 @@ Page {
} }
} }
} }
} }

View file

@ -161,6 +161,4 @@ Component {
VerticalScrollDecorator {flickable: listEmojis } VerticalScrollDecorator {flickable: listEmojis }
} }
} }
} }

View file

@ -55,5 +55,4 @@ DockedPanel {
stop() stop()
} }
} }
} }

View file

@ -18,6 +18,7 @@ BackgroundItem {
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: Theme.horizontalPageMargin anchors.leftMargin: Theme.horizontalPageMargin
color: Theme.highlightDimmerColor color: Theme.highlightDimmerColor
Image { Image {
id: img id: img
opacity: status === Image.Ready ? 1.0 : 0.0 opacity: status === Image.Ready ? 1.0 : 0.0
@ -30,7 +31,7 @@ BackgroundItem {
size: BusyIndicatorSize.Small size: BusyIndicatorSize.Small
opacity: img.status === Image.Ready ? 0.0 : 1.0 opacity: img.status === Image.Ready ? 0.0 : 1.0
Behavior on opacity { FadeAnimator {} } Behavior on opacity { FadeAnimator {} }
running: avatar.status !== Image.Ready; running: avatar.status !== Image.Ready
anchors.centerIn: parent anchors.centerIn: parent
} }
@ -41,36 +42,70 @@ BackgroundItem {
"username": model.account_acct, "username": model.account_acct,
"user_id": model.account_id, "user_id": model.account_id,
"profileImage": model.account_avatar, "profileImage": model.account_avatar,
"profileBackground": model.account_header "profileBackground": model.account_header,
"note": model.account_note,
"url": model.account_url,
"followers_count": model.account_followers_count,
"following_count": model.account_following_count,
"statuses_count": model.account_statuses_count,
"locked": model.account_locked,
"bot": model.account_bot
}) })
} }
} }
Column { Item {
anchors.left: avatar.right anchors.left: avatar.right
anchors.leftMargin: Theme.paddingLarge anchors.leftMargin: Theme.paddingLarge
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
height: account_acct.height + display_name.height height: account_acct.height + display_name.height
Label { Label {
id: display_name id: display_name
text: model.account_display_name+" " text: account_display_name ? account_display_name : account_username.split('@')[0]
color: !pressed ? Theme.primaryColor : Theme.highlightColor color: !pressed ? Theme.primaryColor : Theme.highlightColor
font.pixelSize: Theme.fontSizeSmall font.pixelSize: Theme.fontSizeSmall
anchors.top: parent.top
} }
Image {
id: icnBot
visible: account_bot
source: "../../images/icon-s-bot.svg?" + ( pressed ? Theme.highlightColor : Theme.primaryColor )
width: account_bot ? Theme.iconSizeExtraSmall : 0
height: width
y: Theme.paddingLarge
anchors {
left: display_name.right
leftMargin: Theme.paddingSmall
verticalCenter: display_name.verticalCenter
}
}
Label { Label {
id: account_acct id: account_acct
text: "@"+model.account_acct text: "@"+model.account_acct
color: !pressed ? Theme.secondaryColor : Theme.secondaryHighlightColor color: !pressed ? Theme.secondaryColor : Theme.secondaryHighlightColor
anchors.leftMargin: Theme.paddingMedium anchors.leftMargin: Theme.paddingMedium
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
anchors.top: display_name.bottom
} }
} }
onClicked: openUser({
onClicked: openUser( {
"display_name": model.account_display_name, "display_name": model.account_display_name,
"username": model.account_acct, "username": model.account_acct,
"user_id": model.account_id, "user_id": model.account_id,
"profileImage": model.account_avatar, "profileImage": model.account_avatar,
"profileBackground": model.account_header "profileBackground": model.account_header,
}) "note": model.account_note,
"url": model.account_url,
"followers_count": model.account_followers_count,
"following_count": model.account_following_count,
"statuses_count": model.account_statuses_count,
"locked": model.account_locked,
"bot": model.account_bot,
"group": model.account_group
} )
} }

View file

@ -23,15 +23,17 @@ Item {
if (model && model.count) if (model && model.count)
count = model.count count = model.count
switch(count){ switch(count){
case 1: case 1:
placeholder1.width = holder.width placeholder1.width = holder.width
placeholder1.height = placeholder1.width*hRatio placeholder1.height = placeholder1.width*hRatio
placeholder1.visible = true; placeholder1.visible = true;
holder.height = placeholder1.height holder.height = placeholder1.height
break; break;
case 2: case 2:
placeholder1.visible = true; placeholder1.visible = true
placeholder2.visible = true; placeholder2.visible = true
placeholder1.width = (holder.width-Theme.paddingSmall)/2 placeholder1.width = (holder.width-Theme.paddingSmall)/2
placeholder1.height = placeholder1.width placeholder1.height = placeholder1.width
placeholder2.width = placeholder1.width placeholder2.width = placeholder1.width
@ -39,11 +41,12 @@ Item {
placeholder2.x = placeholder1.width + placeholder2.x + Theme.paddingSmall placeholder2.x = placeholder1.width + placeholder2.x + Theme.paddingSmall
holder.height = placeholder1.height holder.height = placeholder1.height
break; break;
case 3: case 3:
placeholder1.visible = true; placeholder1.visible = true
placeholder2.visible = true; placeholder2.visible = true
placeholder3.visible = true; placeholder3.visible = true
placeholder4.visible = false; placeholder4.visible = false
placeholder1.width = holder.width - Theme.paddingSmall - Theme.itemSizeLarge; placeholder1.width = holder.width - Theme.paddingSmall - Theme.itemSizeLarge;
placeholder1.height = Theme.itemSizeLarge*2+Theme.paddingSmall placeholder1.height = Theme.itemSizeLarge*2+Theme.paddingSmall
@ -53,23 +56,23 @@ Item {
placeholder3.height = placeholder3.width = placeholder2.height = placeholder2.width placeholder3.height = placeholder3.width = placeholder2.height = placeholder2.width
placeholder3.x = placeholder2.x = placeholder1.x + placeholder1.width + Theme.paddingSmall; placeholder3.x = placeholder2.x = placeholder1.x + placeholder1.width + Theme.paddingSmall;
placeholder3.y = placeholder2.y + placeholder2.height + Theme.paddingSmall; placeholder3.y = placeholder2.y + placeholder2.height + Theme.paddingSmall;
break; break;
case 4: case 4:
placeholder1.visible = true; placeholder1.visible = true
placeholder2.visible = true; placeholder2.visible = true
placeholder3.visible = true; placeholder3.visible = true
placeholder4.visible = true; placeholder4.visible = true
placeholder1.width = placeholder2.width = placeholder3.width = placeholder4.width = (holder.width - 3*Theme.paddingSmall)/4 placeholder1.width = placeholder2.width = placeholder3.width = placeholder4.width = (holder.width - 3*Theme.paddingSmall)/4
placeholder1.height = placeholder2.height = placeholder3.height = placeholder4.height = Theme.itemSizeLarge*2+Theme.paddingSmall placeholder1.height = placeholder2.height = placeholder3.height = placeholder4.height = Theme.itemSizeLarge*2+Theme.paddingSmall
placeholder2.x = 1*(placeholder1.width)+ 1*Theme.paddingSmall; placeholder2.x = 1*(placeholder1.width)+ 1*Theme.paddingSmall
placeholder3.x = 2*(placeholder1.width)+ 2*Theme.paddingSmall; placeholder3.x = 2*(placeholder1.width)+ 2*Theme.paddingSmall
placeholder4.x = 3*(placeholder1.width)+ 3*Theme.paddingSmall; placeholder4.x = 3*(placeholder1.width)+ 3*Theme.paddingSmall
holder.height = placeholder1.height
holder.height = placeholder1.height
break; break;
default: default:
holder.height = 0 holder.height = 0
placeholder1.visible = placeholder2.visible = placeholder3.visible = placeholder4.visible = false; placeholder1.visible = placeholder2.visible = placeholder3.visible = placeholder4.visible = false;
@ -86,7 +89,7 @@ Item {
type = model.get(0).type type = model.get(0).type
previewURL = model.get(0).preview_url previewURL = model.get(0).preview_url
mediaURL = model.get(0).url mediaURL = model.get(0).url
height = 200 height = Theme.itemSizeLarge
return true return true
} else { } else {
height = 0 height = 0
@ -105,7 +108,7 @@ Item {
type = model.get(1).type type = model.get(1).type
previewURL = model.get(1).preview_url previewURL = model.get(1).preview_url
mediaURL = model.get(1).url mediaURL = model.get(1).url
height = 200 height = Theme.itemSizeLarge
return true return true
} else { } else {
height = 0 height = 0
@ -124,7 +127,7 @@ Item {
type = model.get(2).type type = model.get(2).type
previewURL = model.get(2).preview_url previewURL = model.get(2).preview_url
mediaURL = model.get(2).url mediaURL = model.get(2).url
height = 200 height = Theme.itemSizeLarge
return true return true
} else { } else {
height = 0 height = 0
@ -143,7 +146,7 @@ Item {
type = model.get(3).type type = model.get(3).type
previewURL = model.get(3).preview_url previewURL = model.get(3).preview_url
mediaURL = model.get(3).url mediaURL = model.get(3).url
height = 200 height = Theme.itemSizeLarge
return true return true
} else { } else {
height = 0 height = 0
@ -151,5 +154,4 @@ Item {
} }
} }
} }
} }

View file

@ -11,7 +11,7 @@ FullscreenContentPage {
property string mediaURL: "" property string mediaURL: ""
allowedOrientations: Orientation.All allowedOrientations: Orientation.All
Component.onCompleted: function(){ Component.onCompleted: function() {
console.log(type) console.log(type)
console.log(previewURL) console.log(previewURL)
console.log(mediaURL) console.log(mediaURL)
@ -44,7 +44,7 @@ FullscreenContentPage {
Video { Video {
id: video id: video
anchors.fill: parent anchors.fill: parent
onErrorStringChanged: function(){ onErrorStringChanged: function() {
videoError.visible = true videoError.visible = true
} }
onStatusChanged: { onStatusChanged: {
@ -60,7 +60,7 @@ FullscreenContentPage {
} }
onPlaybackStateChanged: { onPlaybackStateChanged: {
console.log(playbackState) console.log(playbackState)
switch (playbackState){ switch (playbackState) {
case MediaPlayer.PlayingState: case MediaPlayer.PlayingState:
playerIcon.icon.source = "image://theme/icon-m-pause" playerIcon.icon.source = "image://theme/icon-m-pause"
return; return;
@ -72,7 +72,7 @@ FullscreenContentPage {
return; return;
} }
} }
onPositionChanged: function(){ onPositionChanged: function() {
//console.log(duration) //console.log(duration)
//console.log(bufferProgress) //console.log(bufferProgress)
//console.log(position) //console.log(position)
@ -84,7 +84,7 @@ FullscreenContentPage {
} }
} }
onStopped: function() { onStopped: function() {
if (video.duration < 30000) if (type != 'video')
video.play() video.play()
else else
video.stop() video.stop()
@ -151,7 +151,6 @@ FullscreenContentPage {
anchors.centerIn: parent anchors.centerIn: parent
} }
} }
} }
} }
@ -288,7 +287,7 @@ FullscreenContentPage {
id: failedLoading id: failedLoading
Text { Text {
text: qsTr("Error loading") text: qsTr("Error loading")
font.pixelSize: Theme.fontSizeSmall; font.pixelSize: Theme.fontSizeSmall
color: Theme.highlightColor color: Theme.highlightColor
} }
} }
@ -315,11 +314,10 @@ FullscreenContentPage {
} }
icon.source: "image://theme/icon-m-cloud-download" icon.source: "image://theme/icon-m-cloud-download"
onClicked: { onClicked: {
var filename = mediaURL.split("/"); var filename = mediaURL.split("/")
FileDownloader.downloadFile(mediaURL, filename[filename.length-1]); FileDownloader.downloadFile(mediaURL, filename[filename.length-1])
} }
} }
VerticalScrollDecorator { flickable: imageFlickable } VerticalScrollDecorator { flickable: imageFlickable }
} }

View file

@ -9,30 +9,23 @@ Item {
Label { Label {
id: lblName id: lblName
text: text: account_display_name ? account_display_name : account_username.split('@')[0]
if (account_display_name === "") {
account_username.split('@')[0]
}
else account_display_name
font.weight: Font.Bold font.weight: Font.Bold
font.pixelSize: Theme.fontSizeSmall font.pixelSize: Theme.fontSizeSmall
color: if (myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) { color: if ( myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) {
(pressed ? Theme.secondaryHighlightColor : (!highlight ? Theme.secondaryColor : Theme.secondaryHighlightColor)) ( pressed ? Theme.secondaryHighlightColor : (!highlight ? Theme.secondaryColor : Theme.secondaryHighlightColor ))
} else (pressed ? Theme.highlightColor : (!highlight ? Theme.primaryColor : Theme.secondaryColor)) } else ( pressed ? Theme.highlightColor : ( !highlight ? Theme.primaryColor : Theme.secondaryColor ))
truncationMode: TruncationMode.Fade truncationMode: TruncationMode.Fade
width: contentWidth > parent.width /2 ? parent.width /2 : contentWidth width: contentWidth > parent.width /2 ? parent.width /2 : contentWidth
anchors { anchors.left: parent.left
left: parent.left
leftMargin: Theme.paddingMedium
}
} }
Image { Icon {
id: icnLocked id: icnBot
visible: account_locked visible: account_bot
opacity: 0.8 source: "../../images/icon-s-bot.svg?" + ( pressed ? Theme.highlightColor : Theme.primaryColor )
source: "image://theme/icon-s-secure?" + (pressed ? Theme.highlightColor : Theme.primaryColor) color: Theme.primaryColor
width: account_locked ? Theme.iconSizeExtraSmall*0.8 : 0 width: account_bot ? Theme.iconSizeExtraSmall * 1.3 : 0
height: width height: width
y: Theme.paddingLarge y: Theme.paddingLarge
anchors { anchors {
@ -44,15 +37,30 @@ Item {
Label { Label {
id: lblScreenName id: lblScreenName
visible: model.type !== "follow"
text: '@'+account_username text: '@'+account_username
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
color: (pressed ? Theme.secondaryHighlightColor : Theme.secondaryColor) color: ( pressed ? Theme.secondaryHighlightColor : Theme.secondaryColor )
truncationMode: TruncationMode.Fade truncationMode: TruncationMode.Fade
anchors { anchors {
left: icnLocked.right left: icnBot ? icnBot.right : icnLocked.right
leftMargin: Theme.paddingSmall
right: lblDate.left right: lblDate.left
leftMargin: Theme.paddingMedium rightMargin: Theme.paddingMedium
baseline: lblName.baseline verticalCenter: lblName.verticalCenter
}
}
Label {
id: lblScreenNameFollow
visible: model.type === "follow" && myList.type === "notifications"
text: '@'+account_username
font.pixelSize: Theme.fontSizeExtraSmall
color: ( pressed ? Theme.secondaryHighlightColor : Theme.secondaryColor )
truncationMode: TruncationMode.Fade
anchors {
left: parent.left
top: lblName.bottom
} }
} }
@ -60,13 +68,11 @@ Item {
id: lblDate id: lblDate
text: Format.formatDate(created_at, new Date() - created_at < 60*60*1000 ? Formatter.DurationElapsedShort : Formatter.TimeValueTwentyFourHours) text: Format.formatDate(created_at, new Date() - created_at < 60*60*1000 ? Formatter.DurationElapsedShort : Formatter.TimeValueTwentyFourHours)
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
color: (pressed ? Theme.highlightColor : Theme.primaryColor) color: ( pressed ? Theme.highlightColor : Theme.secondaryColor )
horizontalAlignment: Text.AlignRight horizontalAlignment: Text.AlignRight
anchors { anchors {
right: parent.right right: parent.right
rightMargin: Theme.horizontalPageMargin verticalCenter: lblName.verticalCenter
baseline: lblName.baseline
} }
} }
} }

View file

@ -26,13 +26,8 @@ Item {
Label { Label {
id: lblRtByName id: lblRtByName
visible: type.length visible: type.length
anchors {
left: icon.right
leftMargin: Theme.paddingMedium
verticalCenter: icon.verticalCenter
}
text: { text: {
var action = ""; var action = ""
switch(type){ switch(type){
case "reblog": case "reblog":
action = qsTr('boosted'); action = qsTr('boosted');
@ -47,9 +42,14 @@ Item {
miniStatus.visible = false miniStatus.visible = false
action = type; action = type;
} }
return typeof reblog_account_username !== "undefined" ? '@' + reblog_account_username + ' ' + action : '' return typeof reblog_account_username !== "undefined" ? "@" + reblog_account_username + " " + action : " "
} }
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
color: Theme.highlightColor color: Theme.highlightColor
anchors {
left: icon.right
leftMargin: Theme.paddingMedium
verticalCenter: icon.verticalCenter
}
} }
} }

View file

@ -89,5 +89,4 @@ Item {
} }
} }
} }
} }

View file

@ -70,7 +70,7 @@ SilicaListView {
text: qsTr("New Toot") text: qsTr("New Toot")
onClicked: { onClicked: {
pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), { pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), {
//headerTitle: "New Toot", headerTitle: qsTr("New Toot"),
type: "new" type: "new"
}) })
} }
@ -84,8 +84,7 @@ SilicaListView {
} }
} }
delegate: VisualContainer { delegate: VisualContainer { }
} //Toot {}
add: Transition { add: Transition {
NumberAnimation { property: "opacity"; from: 0; to: 1.0; duration: 800 } NumberAnimation { property: "opacity"; from: 0; to: 1.0; duration: 800 }
@ -129,7 +128,7 @@ SilicaListView {
openDrawer(contentY - scrollOffset > 0 ? false : true ) openDrawer(contentY - scrollOffset > 0 ? false : true )
scrollOffset = contentY scrollOffset = contentY
} }
if(contentY+height > footerItem.y && !loadStarted && autoLoadMore){ if(contentY+height > footerItem.y && !loadStarted && autoLoadMore) {
loadData("append") loadData("append")
loadStarted = true loadStarted = true
} }
@ -162,16 +161,16 @@ SilicaListView {
} }
} }
function loadData(mode){ function loadData(mode) {
var p = [] var p = []
if (params.length) if (params.length)
for(var i = 0; i<params.length; i++) for(var i = 0; i<params.length; i++)
p.push(params[i]) p.push(params[i])
if (mode === "append" && model.count){ if (mode === "append" && model.count) {
p.push({name: 'max_id', data: model.get(model.count-1).id}) p.push({name: 'max_id', data: model.get(model.count-1).id})
} }
if (mode === "prepend" && model.count){ if (mode === "prepend" && model.count) {
p.push({name:'since_id', data: model.get(0).id}) p.push({name:'since_id', data: model.get(0).id})
} }
@ -186,5 +185,4 @@ SilicaListView {
if (type !== "") if (type !== "")
worker.sendMessage(msg) worker.sendMessage(msg)
} }
} }

View file

@ -169,6 +169,4 @@ SilicaGridView {
} }
VerticalScrollDecorator {} VerticalScrollDecorator {}
} }

View file

@ -12,9 +12,7 @@ Item {
property string bg: "" property string bg: ""
width: parent.width width: parent.width
height: if (bot === true) { height: avatarImage.height + Theme.paddingLarge*3 + infoLbl.height
avatarImage.height + Theme.paddingLarge*2 + infoLbl.height + Theme.paddingLarge
} else avatarImage.height + Theme.paddingLarge*2
Rectangle { Rectangle {
id: bgImage id: bgImage
@ -29,7 +27,6 @@ Item {
asynchronous: true asynchronous: true
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
source: bg source: bg
opacity: 0.8
anchors.fill: parent anchors.fill: parent
} }
} }
@ -37,19 +34,18 @@ Item {
Image { Image {
id: avatarImage id: avatarImage
asynchronous: true asynchronous: true
source: source: if (avatarImage.status === Image.Error)
if (avatarImage.status === Image.Error) source = "../../images/icon-l-profile.svg?" + (pressed
source = "../../images/icon-l-profile.svg?" + (pressed ? Theme.highlightColor
? Theme.highlightColor : Theme.primaryColor)
: Theme.primaryColor) else image
else image width: Theme.iconSizeLarge
width: description === "" ? Theme.iconSizeMedium : Theme.iconSizeLarge
height: width height: width
anchors { anchors {
left: parent.left left: parent.left
leftMargin: Theme.paddingLarge leftMargin: Theme.horizontalPageMargin
top: parent.top top: parent.top
topMargin: Theme.paddingLarge topMargin: Theme.paddingLarge * 1.5
} }
Button { Button {
@ -74,18 +70,15 @@ Item {
top: parent.top top: parent.top
topMargin: Theme.paddingLarge topMargin: Theme.paddingLarge
left: avatarImage.right left: avatarImage.right
leftMargin: Theme.paddingLarge leftMargin: Theme.horizontalPageMargin
right: parent.right right: parent.right
rightMargin: Theme.paddingLarge rightMargin: Theme.horizontalPageMargin
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
Label { Label {
id: profileTitle id: profileTitle
text: if (title === "") { text: title ? title : description.split('@')[0]
description.split('@')[0]
}
else title
font.pixelSize: Theme.fontSizeLarge font.pixelSize: Theme.fontSizeLarge
font.family: Theme.fontFamilyHeading font.family: Theme.fontFamilyHeading
color: Theme.highlightColor color: Theme.highlightColor
@ -112,19 +105,37 @@ Item {
id: infoLbl id: infoLbl
spacing: Theme.paddingLarge spacing: Theme.paddingLarge
layoutDirection: Qt.RightToLeft layoutDirection: Qt.RightToLeft
height: Theme.iconSizeSmall + Theme.paddingSmall height: followed_by || locked || bot || group ? Theme.iconSizeSmall + Theme.paddingSmall : 0
anchors { anchors {
top: avatarImage.bottom top: avatarImage.bottom
topMargin: Theme.paddingLarge topMargin: Theme.paddingMedium
left: parent.left left: parent.left
leftMargin: Theme.paddingLarge leftMargin: Theme.horizontalPageMargin
right: parent.right right: parent.right
rightMargin: Theme.paddingLarge rightMargin: Theme.horizontalPageMargin
} }
/* Rectangle { Rectangle {
id: groupBg
visible: (group ? true : false)
radius: Theme.paddingSmall
color: Theme.secondaryHighlightColor
width: groupLbl.width + 2*Theme.paddingLarge
height: parent.height
Label {
id: groupLbl
text: qsTr("Group")
font.pixelSize: Theme.fontSizeExtraSmall
color: Theme.primaryColor
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
}
}
Rectangle {
id: followingBg id: followingBg
visible: (following ? true : false) visible: (followed_by ? true : false)
radius: Theme.paddingSmall radius: Theme.paddingSmall
color: Theme.secondaryHighlightColor color: Theme.secondaryHighlightColor
width: followingLbl.width + 2*Theme.paddingLarge width: followingLbl.width + 2*Theme.paddingLarge
@ -138,7 +149,26 @@ Item {
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
} }
} */ }
Rectangle {
id: lockedBg
visible: (locked ? true : false)
radius: Theme.paddingSmall
color: Theme.secondaryHighlightColor
width: lockedImg.width + 2*Theme.paddingLarge
height: parent.height
HighlightImage {
id: lockedImg
source: "image://theme/icon-s-secure?"
width: Theme.fontSizeExtraSmall
height: width
color: Theme.primaryColor
anchors.horizontalCenter: lockedBg.horizontalCenter
anchors.verticalCenter: lockedBg.verticalCenter
}
}
Rectangle { Rectangle {
id: botBg id: botBg

View file

@ -24,5 +24,4 @@ FullscreenContentPage {
} }
onClicked: pageStack.pop() onClicked: pageStack.pop()
} }
} }

View file

@ -1,187 +0,0 @@
import QtQuick 2.0
import Sailfish.Silica 1.0
import QtGraphicalEffects 1.0
BackgroundItem {
id: delegate
signal send (string notice)
signal navigateTo(string link)
width: parent.width
height: lblText.paintedHeight + (lblText.text.length > 0 ? Theme.paddingLarge : 0 )+ lblName.paintedHeight + (type.length ? Theme.paddingLarge + iconRT.height : 0) + Theme.paddingLarge
Image {
id: iconRT
y: Theme.paddingLarge
anchors.right: avatar.right
visible: type.length
width: Theme.iconSizeExtraSmall
height: width
source: "../../images/boosted.svg"
}
Label {
id: lblRtByName
visible: type.length
anchors.left: lblName.left
anchors.bottom: iconRT.bottom
font.pixelSize: Theme.fontSizeExtraSmall
color: Theme.secondaryColor
text: {
var action;
switch(type){
case "reblog":
action = qsTr('boosted');
break;
case "favourite":
action = qsTr('favourited');
break;
case "follow":
action = qsTr('followed you');
break;
default:
action = type;
}
return '@' + retweetScreenName + ' ' + action
}
}
Image {
id: avatar
x: Theme.horizontalPageMargin
y: Theme.paddingLarge + (type.length ? iconRT.height+Theme.paddingMedium : 0)
asynchronous: true
width: Theme.iconSizeMedium
height: width
smooth: true
source: account_avatar
visible: true
MouseArea {
anchors.fill: parent
onClicked: {
pageStack.push(Qt.resolvedUrl("../ProfilePage.qml"), {
"display_name": account_display_name,
"username": account_username,
"profileImage": account_avatar
})
}
}
}
Label {
id: lblName
text: account_display_name
font.weight: Font.Bold
font.pixelSize: Theme.fontSizeSmall
color: (pressed ? Theme.highlightColor : Theme.primaryColor)
anchors {
top: avatar.top
topMargin: 0
left: avatar.right
leftMargin: Theme.paddingMedium
}
}
Image {
id: iconLocked
visible: account_locked
y: Theme.paddingLarge
opacity: 0.8
source: "image://theme/icon-s-secure?" + (pressed
? Theme.highlightColor
: Theme.primaryColor)
width: account_locked ? Theme.iconSizeExtraSmall*0.8 : 0
height: width
anchors {
left: lblName.right
leftMargin: Theme.paddingSmall
verticalCenter: lblName.verticalCenter
}
}
Label {
id: lblScreenName
truncationMode: TruncationMode.Fade
text: '@'+account_username
font.pixelSize: Theme.fontSizeExtraSmall
color: (pressed ? Theme.secondaryHighlightColor : Theme.secondaryColor)
anchors {
left: iconLocked.right
right: lblDate.left
leftMargin: Theme.paddingMedium
baseline: lblName.baseline
}
}
Label {
id: lblDate
function timestamp() {
var txt = Format.formatDate(created_at, Formatter.Timepoint)
var elapsed = Format.formatDate(created_at, Formatter.DurationElapsedShort)
return (elapsed ? elapsed : txt )
}
text: Format.formatDate(created_at, new Date() - created_at < 60*60*1000 ? Formatter.DurationElapsedShort : Formatter.TimeValueTwentyFourHours)
font.pixelSize: Theme.fontSizeExtraSmall
color: (pressed ? Theme.highlightColor : Theme.primaryColor)
horizontalAlignment: Text.AlignRight
anchors {
right: parent.right
baseline: lblName.baseline
rightMargin: Theme.paddingLarge
}
}
Text {
id: lblText
height: content.length ? paintedHeight : 0
onLinkActivated: {
console.log(link)
if (link[0] === "@") {
pageStack.push(Qt.resolvedUrl("../Profile.qml"), {
"name": "",
"username": link.substring(1),
"profileImage": ""
})
} else if (link[0] === "#") {
pageStack.pop(pageStack.find(function(page) {
var check = page.isFirstPage === true;
if (check)
page.onLinkActivated(link)
return check;
}));
send(link)
} else {
Qt.openUrlExternally(link);
}
}
text: content
textFormat: Text.RichText
font.pixelSize: Theme.fontSizeSmall
color: (pressed ? Theme.highlightColor : Theme.primaryColor)
linkColor : Theme.highlightColor
wrapMode: Text.Wrap
maximumLineCount: 6
anchors {
left: lblName.left
right: parent.right
top: lblScreenName.bottom
topMargin: Theme.paddingSmall
rightMargin: Theme.paddingLarge
}
}
onClicked: {
pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), {
headerTitle: "Conversation",
toot_id: id,
toot_url: status_url,
//title: account_display_name,
description: '@'+account_acc,
avatar: account_avatar,
type: "reply"
})
}
}

View file

@ -14,6 +14,7 @@ BackgroundItem {
mnu.height + miniHeader.height + Theme.paddingLarge + lblContent.height + Theme.paddingLarge + (miniStatus.visible ? miniStatus.height : 0) mnu.height + miniHeader.height + Theme.paddingLarge + lblContent.height + Theme.paddingLarge + (miniStatus.visible ? miniStatus.height : 0)
} else mnu.height + miniHeader.height + (typeof attachments !== "undefined" && attachments.count ? media.height + Theme.paddingLarge + Theme.paddingMedium: Theme.paddingLarge) + lblContent.height + Theme.paddingLarge + (miniStatus.visible ? miniStatus.height : 0) + (iconDirectMsg.visible ? iconDirectMsg.height : 0) } else mnu.height + miniHeader.height + (typeof attachments !== "undefined" && attachments.count ? media.height + Theme.paddingLarge + Theme.paddingMedium: Theme.paddingLarge) + lblContent.height + Theme.paddingLarge + (miniStatus.visible ? miniStatus.height : 0) + (iconDirectMsg.visible ? iconDirectMsg.height : 0)
// Background for Direct Messages in Notification View
Rectangle { Rectangle {
id: bgDirect id: bgDirect
x: 0 x: 0
@ -28,7 +29,8 @@ BackgroundItem {
} }
} }
Rectangle { // Background for reblogs and favourited statuses in Notification View
/* Rectangle {
id: bgNotifications id: bgNotifications
x: 0 x: 0
y: 0 y: 0
@ -40,9 +42,9 @@ BackgroundItem {
GradientStop { position: -0.5; color: "transparent" } GradientStop { position: -0.5; color: "transparent" }
GradientStop { position: 0.4; color: Theme.highlightDimmerColor } GradientStop { position: 0.4; color: Theme.highlightDimmerColor }
} }
} } */
MiniStatus { MiniStatus { // Element showing reblog- or favourite status on top of Toot
id: miniStatus id: miniStatus
anchors { anchors {
leftMargin: Theme.horizontalPageMargin leftMargin: Theme.horizontalPageMargin
@ -52,6 +54,7 @@ BackgroundItem {
} }
} }
// Account avatar
Image { Image {
id: avatar id: avatar
visible: true visible: true
@ -83,8 +86,16 @@ BackgroundItem {
"username": model.account_acct, "username": model.account_acct,
"user_id": model.account_id, "user_id": model.account_id,
"profileImage": model.account_avatar, "profileImage": model.account_avatar,
"profileBackground": model.account_header "profileBackground": model.account_header,
}) "note": model.account_note,
"url": model.account_url,
"followers_count": model.account_followers_count,
"following_count": model.account_following_count,
"statuses_count": model.account_statuses_count,
"locked": model.account_locked,
"bot": model.account_bot,
"group": model.account_group
} )
} }
} }
@ -113,7 +124,7 @@ BackgroundItem {
visible: status_visibility === "direct" visible: status_visibility === "direct"
width: Theme.iconSizeMedium width: Theme.iconSizeMedium
height: width height: width
source: "image://theme/icon-m-mail" source: "../../images/icon-m-mail.svg?"
anchors { anchors {
horizontalCenter: avatar.horizontalCenter horizontalCenter: avatar.horizontalCenter
top: avatar.bottom top: avatar.bottom
@ -146,39 +157,68 @@ BackgroundItem {
width: Theme.iconSizeSmall width: Theme.iconSizeSmall
height: width height: width
} }
MouseArea {
anchors.fill: parent
onClicked: {
pageStack.push(Qt.resolvedUrl("../ProfilePage.qml"), {
"display_name": model.reblog_account_display_name,
"username": model.reblog_account_acct,
"user_id": model.reblog_account_id,
"profileImage": model.reblog_account_avatar,
"profileBackground": model.account_header,
"note": model.reblog_account_note,
"url": model.reblog_account_url,
"followers_count": model.reblog_account_followers_count,
"following_count": model.reblog_account_following_count,
"statuses_count": model.reblog_account_statuses_count,
"locked": model.reblog_account_locked,
"bot": model.reblog_account_bot,
"group": model.reblog_account_group
} )
}
}
} }
} }
// Display name, username, date of Toot
MiniHeader { MiniHeader {
id: miniHeader id: miniHeader
anchors { anchors {
top: avatar.top top: avatar.top
left: avatar.right left: avatar.right
leftMargin: Theme.paddingMedium
right: parent.right right: parent.right
rightMargin: Theme.horizontalPageMargin
} }
} }
Text { // Toot content
Label {
id: lblContent id: lblContent
visible: model.type !== "follow" visible: model.type !== "follow"
text: content.replace(new RegExp("<a ", 'g'), '<a style="text-decoration: none; color:'+(pressed ? Theme.secondaryColor : Theme.highlightColor)+'" ') text: if (myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) {
textFormat: Text.RichText content
} else content.replace(new RegExp("<a ", 'g'), '<a style="text-decoration: none; color:'+(pressed ? Theme.secondaryColor : Theme.highlightColor)+'" ')
textFormat: myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" ) ? Text.StyledText : Text.RichText
font.pixelSize: Theme.fontSizeSmall font.pixelSize: Theme.fontSizeSmall
linkColor: if (myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) {
Theme.secondaryHighlightColor
} else Theme.highlightColor
wrapMode: Text.Wrap wrapMode: Text.Wrap
truncationMode: TruncationMode.Elide
color: if (myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) { color: if (myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) {
(pressed ? Theme.secondaryHighlightColor : (!highlight ? Theme.secondaryColor : Theme.secondaryHighlightColor)) (pressed ? Theme.secondaryHighlightColor : (!highlight ? Theme.secondaryColor : Theme.secondaryHighlightColor))
} else (pressed ? Theme.highlightColor : (!highlight ? Theme.primaryColor : Theme.secondaryColor)) } else (pressed ? Theme.highlightColor : (!highlight ? Theme.primaryColor : Theme.secondaryColor))
linkColor: if (myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) {
Theme.secondaryHighlightColor
} else Theme.highlightColor
height: if (model.type === "follow") { height: if (model.type === "follow") {
Theme.paddingLarge Theme.paddingLarge
} else content.length ? (contentWarningLabel.paintedHeight > paintedHeight ? contentWarningLabel.paintedHeight : paintedHeight) : 0 } else if (myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) {
Math.min( implicitHeight, Theme.itemSizeExtraLarge * 1.5 )
} else content.length ? ( contentWarningLabel.paintedHeight > paintedHeight ? contentWarningLabel.paintedHeight : paintedHeight ) : 0
anchors { anchors {
left: miniHeader.left left: miniHeader.left
leftMargin: Theme.paddingMedium
right: miniHeader.right right: miniHeader.right
rightMargin: Theme.horizontalPageMargin
top: miniHeader.bottom top: miniHeader.bottom
topMargin: Theme.paddingSmall topMargin: Theme.paddingSmall
bottomMargin: Theme.paddingLarge bottomMargin: Theme.paddingLarge
@ -210,8 +250,9 @@ BackgroundItem {
} }
} }
// Content warning cover for Toots
Rectangle { Rectangle {
radius: 2 id: contentWarningBg
color: Theme.highlightDimmerColor color: Theme.highlightDimmerColor
visible: status_spoiler_text.length > 0 visible: status_spoiler_text.length > 0
anchors.fill: parent anchors.fill: parent
@ -244,22 +285,24 @@ BackgroundItem {
} }
} }
// Displays media in Toots
MediaBlock { MediaBlock {
id: media id: media
visible: if (myList.type === "notifications" && ( type === "favourite" || type === "reblog" )) { visible: if (myList.type === "notifications" && ( type === "favourite" || type === "reblog" )) {
false false
} else true } else true
model: typeof attachments !== "undefined" ? attachments : Qt.createQmlObject('import QtQuick 2.0; ListModel { }', Qt.application, 'InternalQmlObject'); model: typeof attachments !== "undefined" ? attachments : Qt.createQmlObject('import QtQuick 2.0; ListModel { }', Qt.application, 'InternalQmlObject')
height: Theme.iconSizeExtraLarge * 2 height: Theme.iconSizeExtraLarge * 2
anchors { anchors {
left: lblContent.left left: miniHeader.left
right: lblContent.right right: miniHeader.right
top: lblContent.bottom top: lblContent.bottom
topMargin: Theme.paddingSmall topMargin: Theme.paddingMedium
bottomMargin: Theme.paddingLarge bottomMargin: Theme.paddingLarge
} }
} }
// Context menu for Toots
ContextMenu { ContextMenu {
id: mnu id: mnu
@ -277,11 +320,11 @@ BackgroundItem {
"bgAction": true, "bgAction": true,
"action" : "statuses/"+model.status_id+"/" + (status ? "unreblog" : "reblog") "action" : "statuses/"+model.status_id+"/" + (status ? "unreblog" : "reblog")
}) })
model.reblogs_count = !status ? model.reblogs_count+1 : (model.reblogs_count > 0 ? model.reblogs_count-1 : model.reblogs_count); model.status_reblogs_count = !status ? model.status_reblogs_count+1 : (model.status_reblogs_count > 0 ? model.status_reblogs_count-1 : model.status_reblogs_count);
model.reblogged = !model.reblogged model.reblogged = !model.reblogged
} }
Image { Icon {
id: icRT id: icRT
source: "image://theme/icon-s-retweet?" + (!model.reblogged ? Theme.highlightColor : Theme.primaryColor) source: "image://theme/icon-s-retweet?" + (!model.reblogged ? Theme.highlightColor : Theme.primaryColor)
width: Theme.iconSizeExtraSmall width: Theme.iconSizeExtraSmall
@ -294,7 +337,7 @@ BackgroundItem {
} }
Label { Label {
text: reblogs_count text: status_reblogs_count // from API.js
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
color: !model.reblogged ? Theme.highlightColor : Theme.primaryColor color: !model.reblogged ? Theme.highlightColor : Theme.primaryColor
anchors { anchors {
@ -308,9 +351,9 @@ BackgroundItem {
MenuItem { MenuItem {
id: mnuFavourite id: mnuFavourite
visible: model.type !== "follow" visible: model.type !== "follow"
text: typeof model.favourited !== "undefined" && model.favourited ? qsTr("Unfavorite") : qsTr("Favorite") text: typeof model.status_favourited !== "undefined" && model.status_favourited ? qsTr("Unfavorite") : qsTr("Favorite")
onClicked: { onClicked: {
var status = typeof model.favourited !== "undefined" && model.favourited var status = typeof model.status_favourited !== "undefined" && model.status_favourited
worker.sendMessage({ worker.sendMessage({
"conf" : Logic.conf, "conf" : Logic.conf,
"params" : [], "params" : [],
@ -318,26 +361,26 @@ BackgroundItem {
"bgAction": true, "bgAction": true,
"action" : "statuses/"+model.status_id+"/" + (status ? "unfavourite" : "favourite") "action" : "statuses/"+model.status_id+"/" + (status ? "unfavourite" : "favourite")
}) })
model.favourites_count = !status ? model.favourites_count+1 : (model.favourites_count > 0 ? model.favourites_count-1 : model.favourites_count); model.status_favourites_count = !status ? model.status_favourites_count+1 : (model.status_favourites_count > 0 ? model.status_favourites_count-1 : model.status_favourites_count);
model.favourited = !model.favourited model.status_favourited = !model.status_favourited
} }
Image { Icon {
id: icFA id: icFA
source: "image://theme/icon-s-favorite?" + (!model.status_favourited ? Theme.highlightColor : Theme.primaryColor)
width: Theme.iconSizeExtraSmall
height: width
anchors { anchors {
leftMargin: Theme.horizontalPageMargin leftMargin: Theme.horizontalPageMargin
left: parent.left left: parent.left
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
width: Theme.iconSizeExtraSmall
height: width
source: "image://theme/icon-s-favorite?" + (!model.favourited ? Theme.highlightColor : Theme.primaryColor)
} }
Label { Label {
text: favourites_count text: status_favourites_count
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
color: !model.favourited ? Theme.highlightColor : Theme.primaryColor color: !model.status_favourited ? Theme.highlightColor : Theme.primaryColor
anchors { anchors {
left: icFA.right left: icFA.right
leftMargin: Theme.paddingMedium leftMargin: Theme.paddingMedium
@ -346,54 +389,83 @@ BackgroundItem {
} }
} }
MenuItem {
id: mnuBookmark
visible: model.type !== "follow"
text: typeof model.status_bookmarked !== "undefined" && model.status_bookmarked ? qsTr("Remove Bookmark") : qsTr("Bookmark")
onClicked: {
var status = typeof model.status_bookmarked !== "undefined" && model.status_bookmarked
worker.sendMessage({
"conf" : Logic.conf,
"params" : [],
"method" : "POST",
"bgAction": true,
"action" : "statuses/"+model.status_id+"/" + (status ? "unbookmark" : "bookmark")
})
model.status_bookmarked = !model.status_bookmarked
}
Icon {
source: "../../images/icon-s-bookmark.svg?"
color: !model.status_bookmarked ? Theme.highlightColor : Theme.primaryColor
width: Theme.iconSizeExtraSmall
height: width
anchors {
left: parent.left
leftMargin: Theme.horizontalPageMargin + Theme.paddingMedium
verticalCenter: parent.verticalCenter
}
}
}
MenuItem { MenuItem {
id: mnuMention id: mnuMention
visible: model.type === "follow" visible: model.type === "follow"
text: qsTr("Mention") text: qsTr("Mention")
onClicked: { onClicked: {
pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), { pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), {
headerTitle: "Mention", headerTitle: qsTr("Mention"),
description: "@"+reblog_account_acct, description: "@"+reblog_account_acct,
type: "new" type: "new"
}) })
} }
Image { Icon {
id: icMT id: icMT
source: "image://theme/icon-s-chat?" + (!model.status_favourited ? Theme.highlightColor : Theme.primaryColor)
width: Theme.iconSizeExtraSmall
height: width
anchors { anchors {
leftMargin: Theme.horizontalPageMargin leftMargin: Theme.horizontalPageMargin + Theme.paddingMedium
left: parent.left left: parent.left
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
width: Theme.iconSizeExtraSmall
height: width
source: "image://theme/icon-s-chat?" + (!model.favourited ? Theme.highlightColor : Theme.primaryColor)
} }
} }
} }
// Open ConversationPage and show other Toots in thread (if available)
onClicked: { onClicked: {
var m = Qt.createQmlObject('import QtQuick 2.0; ListModel { }', Qt.application, 'InternalQmlObject'); var m = Qt.createQmlObject('import QtQuick 2.0; ListModel { }', Qt.application, 'InternalQmlObject');
if (typeof mdl !== "undefined") if (typeof mdl !== "undefined")
m.append(mdl.get(index)) m.append(mdl.get(index))
pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), { pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), {
headerTitle: "Conversation", headerTitle: qsTr("Conversation"),
toot_id: status_id, "toot_id": status_id,
toot_url: status_url, "toot_url": status_url,
toot_uri: status_uri, "toot_uri": status_uri,
title: account_display_name, "description": '@'+account_acct,
description: '@'+account_acct,
avatar: account_avatar,
mdl: m, mdl: m,
type: "reply" type: "reply"
}) })
} }
onPressAndHold: { onPressAndHold: {
console.log(JSON.stringify(mdl.get(index))) console.log(JSON.stringify(mdl.get(index)))
mnu.show(delegate) mnu.open(delegate)
} }
onDoubleClicked: { onDoubleClicked: {
console.log("double click") console.log("double click")
} }
} }

View file

@ -11,15 +11,15 @@
//static const QUrl IMGUR_UPLOAD_URL("https://httpbin.org/post"); //static const QUrl IMGUR_UPLOAD_URL("https://httpbin.org/post");
//static const QUrl IMGUR_UPLOAD_URL(); //static const QUrl IMGUR_UPLOAD_URL();
ImageUploader::ImageUploader(QObject *parent) : QObject(parent), m_networkAccessManager(0), m_reply(0) { ImageUploader::ImageUploader(QObject *parent) : QObject(parent), m_networkAccessManager(nullptr), m_reply(nullptr) {
m_networkAccessManager = new QNetworkAccessManager(this); m_networkAccessManager = new QNetworkAccessManager(this);
} }
ImageUploader::~ImageUploader() { ImageUploader::~ImageUploader() {
if (m_reply != 0) { if (m_reply != nullptr) {
m_reply->disconnect(); m_reply->disconnect();
m_reply->deleteLater(); m_reply->deleteLater();
m_reply = 0; m_reply = nullptr;
} }
} }
@ -58,10 +58,10 @@ void ImageUploader::upload() {
return; return;
} }
if (m_reply != 0) { if (m_reply != nullptr) {
m_reply->disconnect(); m_reply->disconnect();
m_reply->deleteLater(); m_reply->deleteLater();
m_reply = 0; m_reply = nullptr;
} }
/*QFileInfo fileInfo(QUrl(m_fileName).toLocalFile()); /*QFileInfo fileInfo(QUrl(m_fileName).toLocalFile());
@ -146,6 +146,6 @@ void ImageUploader::replyFinished() {
} }
m_reply->deleteLater(); m_reply->deleteLater();
m_reply = 0; m_reply = nullptr;
postdata.clear(); postdata.clear();
} }

View file

@ -24,6 +24,7 @@
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation>Link kopieren</translation> <translation>Link kopieren</translation>
</message> </message>
<message> <message>
@ -58,6 +59,15 @@
<source>Toot sent!</source> <source>Toot sent!</source>
<translation>Toot gesendet!</translation> <translation>Toot gesendet!</translation>
</message> </message>
<message>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation>Antworten</translation>
</message>
<message>
<source>Hide Reply</source>
<translation>Antwort verbergen</translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -189,6 +199,14 @@
<source>Bot</source> <source>Bot</source>
<translation>Bot</translation> <translation>Bot</translation>
</message> </message>
<message>
<source>Follows you</source>
<translation>Folgt dir</translation>
</message>
<message>
<source>Group</source>
<translation>Gruppe</translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -344,21 +362,6 @@
<translation>um bei den Übersetzungen mitzuhelfen.</translation> <translation>um bei den Übersetzungen mitzuhelfen.</translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<source>boosted</source>
<translation>hat geteilt</translation>
</message>
<message>
<source>favourited</source>
<translation>hat favorisiert</translation>
</message>
<message>
<source>followed you</source>
<translation>folgt dir</translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
@ -381,5 +384,17 @@
<source>Mention</source> <source>Mention</source>
<translation>Erwähnen</translation> <translation>Erwähnen</translation>
</message> </message>
<message>
<source>Conversation</source>
<translation>Konversation</translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation>Lesezeichen entfernen</translation>
</message>
<message>
<source>Bookmark</source>
<translation>Lesezeichen</translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -24,6 +24,7 @@
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@ -58,6 +59,15 @@
<source>Toot sent!</source> <source>Toot sent!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Hide Reply</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -189,6 +199,14 @@
<source>Bot</source> <source>Bot</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Follows you</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -344,21 +362,6 @@
<translation>για να βοηθήσετε την μετάφραση της εφαρμογής στην γλώσσα σας.</translation> <translation>για να βοηθήσετε την μετάφραση της εφαρμογής στην γλώσσα σας.</translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<source>boosted</source>
<translation>προωθημένο</translation>
</message>
<message>
<source>favourited</source>
<translation>στους σελιδοδείκτες</translation>
</message>
<message>
<source>followed you</source>
<translation>σας ακολουθούν</translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
@ -381,5 +384,17 @@
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -24,6 +24,7 @@
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation>Copiar enlace al portapapeles</translation> <translation>Copiar enlace al portapapeles</translation>
</message> </message>
<message> <message>
@ -58,6 +59,15 @@
<source>Toot sent!</source> <source>Toot sent!</source>
<translation>¡Toot enviado!</translation> <translation>¡Toot enviado!</translation>
</message> </message>
<message>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation>Respuesta</translation>
</message>
<message>
<source>Hide Reply</source>
<translation>Cerrar respuesta</translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -189,6 +199,14 @@
<source>Bot</source> <source>Bot</source>
<translation>Bot</translation> <translation>Bot</translation>
</message> </message>
<message>
<source>Follows you</source>
<translation>Te sigue</translation>
</message>
<message>
<source>Group</source>
<translation>Grupo</translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -220,7 +238,7 @@
<message> <message>
<source>Requested</source> <source>Requested</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation type="unfinished"></translation> <translation>Requerido</translation>
</message> </message>
<message> <message>
<source>Follow</source> <source>Follow</source>
@ -253,7 +271,7 @@
</message> </message>
<message> <message>
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation>Mencionar</translation>
</message> </message>
</context> </context>
<context> <context>
@ -344,21 +362,6 @@
<translation>para ayudar con traducciones.</translation> <translation>para ayudar con traducciones.</translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<source>boosted</source>
<translation>retooteó</translation>
</message>
<message>
<source>favourited</source>
<translation>marcó como favorito</translation>
</message>
<message>
<source>followed you</source>
<translation>te empezó a seguir</translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
@ -379,7 +382,19 @@
</message> </message>
<message> <message>
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation>Mencionar</translation>
</message>
<message>
<source>Conversation</source>
<translation>Conversación</translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation>Eliminar marcador</translation>
</message>
<message>
<source>Bookmark</source>
<translation>Marcador</translation>
</message> </message>
</context> </context>
</TS> </TS>

View file

@ -24,6 +24,7 @@
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation>Copier le lien</translation> <translation>Copier le lien</translation>
</message> </message>
<message> <message>
@ -58,6 +59,15 @@
<source>Toot sent!</source> <source>Toot sent!</source>
<translation>Pouet envoyé !</translation> <translation>Pouet envoyé !</translation>
</message> </message>
<message>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation>Répondre</translation>
</message>
<message>
<source>Hide Reply</source>
<translation>Fermer Répondre</translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -189,6 +199,14 @@
<source>Bot</source> <source>Bot</source>
<translation>Bot</translation> <translation>Bot</translation>
</message> </message>
<message>
<source>Follows you</source>
<translation>Vous suit</translation>
</message>
<message>
<source>Group</source>
<translation>Groupe</translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -344,21 +362,6 @@
<translation>pour aider à traduire cette application.</translation> <translation>pour aider à traduire cette application.</translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<source>boosted</source>
<translation>a partagé</translation>
</message>
<message>
<source>favourited</source>
<translation>a ajouté à ses favoris</translation>
</message>
<message>
<source>followed you</source>
<translation>vous suit</translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
@ -381,5 +384,17 @@
<source>Mention</source> <source>Mention</source>
<translation>Mentionner</translation> <translation>Mentionner</translation>
</message> </message>
<message>
<source>Conversation</source>
<translation>Conversation</translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation>Retirer marque-page</translation>
</message>
<message>
<source>Bookmark</source>
<translation>Ajouter aux marque-pages</translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -4,23 +4,23 @@
<context> <context>
<name>API</name> <name>API</name>
<message> <message>
<location filename="../qml/lib/API.js" line="156"/> <location filename="../qml/lib/API.js" line="158"/>
<source>favourited</source> <source>favourited</source>
<translation>ha apprezzato</translation> <translation>ha apprezzato</translation>
</message> </message>
<message> <message>
<location filename="../qml/lib/API.js" line="167"/> <location filename="../qml/lib/API.js" line="169"/>
<source>followed you</source> <source>followed you</source>
<translation>ha iniziato a seguirti</translation> <translation>ha iniziato a seguirti</translation>
</message> </message>
<message> <message>
<location filename="../qml/lib/API.js" line="177"/> <location filename="../qml/lib/API.js" line="179"/>
<source>boosted</source> <source>boosted</source>
<translation>ha condiviso</translation> <translation>ha condiviso</translation>
</message> </message>
<message> <message>
<location filename="../qml/lib/API.js" line="187"/>
<location filename="../qml/lib/API.js" line="189"/> <location filename="../qml/lib/API.js" line="189"/>
<location filename="../qml/lib/API.js" line="191"/>
<source>said</source> <source>said</source>
<translation>ha detto</translation> <translation>ha detto</translation>
</message> </message>
@ -28,47 +28,59 @@
<context> <context>
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="108"/> <location filename="../qml/pages/ConversationPage.qml" line="111"/>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation>Copia link</translation> <translation>Copia link</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="220"/> <location filename="../qml/pages/ConversationPage.qml" line="127"/>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation>Risposta</translation>
</message>
<message>
<location filename="../qml/pages/ConversationPage.qml" line="127"/>
<source>Hide Reply</source>
<translation>Chiudere Risposta</translation>
</message>
<message>
<location filename="../qml/pages/ConversationPage.qml" line="234"/>
<source>Write your warning here</source> <source>Write your warning here</source>
<translation>Contenuto avviso</translation> <translation>Contenuto avviso</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="253"/> <location filename="../qml/pages/ConversationPage.qml" line="267"/>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<translation>A cosa stai pensando?</translation> <translation>A cosa stai pensando?</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="320"/> <location filename="../qml/pages/ConversationPage.qml" line="334"/>
<source>Delete</source> <source>Delete</source>
<translation>Elimina</translation> <translation>Elimina</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="418"/> <location filename="../qml/pages/ConversationPage.qml" line="432"/>
<source>Public</source> <source>Public</source>
<translation>Pubblico</translation> <translation>Pubblico</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="421"/> <location filename="../qml/pages/ConversationPage.qml" line="435"/>s
<source>Unlisted</source> <source>Unlisted</source>
<translation>Non elencato</translation> <translation>Non elencato</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="424"/> <location filename="../qml/pages/ConversationPage.qml" line="438"/>s
<source>Followers-only</source> <source>Followers-only</source>
<translation>Solo ai seguaci</translation> <translation>Solo ai seguaci</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="427"/> <location filename="../qml/pages/ConversationPage.qml" line="441"/>
<source>Direct</source> <source>Direct</source>
<translation>Diretto</translation> <translation>Diretto</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="474"/> <location filename="../qml/pages/ConversationPage.qml" line="488"/>
<source>Toot sent!</source> <source>Toot sent!</source>
<translation>Toot è stato pubblicato!</translation> <translation>Toot è stato pubblicato!</translation>
</message> </message>
@ -133,37 +145,37 @@
<context> <context>
<name>MainPage</name> <name>MainPage</name>
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="36"/> <location filename="../qml/pages/MainPage.qml" line="37"/>
<source>Home</source> <source>Home</source>
<translation>Home</translation> <translation>Home</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="46"/> <location filename="../qml/pages/MainPage.qml" line="47"/>
<source>Notifications</source> <source>Notifications</source>
<translation>Notifiche</translation> <translation>Notifiche</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="57"/> <location filename="../qml/pages/MainPage.qml" line="58"/>
<source>Local</source> <source>Local</source>
<translation>Locale</translation> <translation>Locale</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="68"/> <location filename="../qml/pages/MainPage.qml" line="69"/>
<source>Federated</source> <source>Federated</source>
<translation>Federazione</translation> <translation>Federazione</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="103"/> <location filename="../qml/pages/MainPage.qml" line="104"/>
<source>Search</source> <source>Search</source>
<translation>Cerca</translation> <translation>Cerca</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="108"/> <location filename="../qml/pages/MainPage.qml" line="110"/>
<source>@user or #term</source> <source>@user or #term</source>
<translation>@utente o #termine</translation> <translation>@utente o #termine</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="253"/> <location filename="../qml/pages/MainPage.qml" line="264"/>
<source>New Toot</source> <source>New Toot</source>
<translation>Nuovo toot</translation> <translation>Nuovo toot</translation>
</message> </message>
@ -171,7 +183,7 @@
<context> <context>
<name>MediaFullScreen</name> <name>MediaFullScreen</name>
<message> <message>
<location filename="../qml/pages/components/MediaFullScreen.qml" line="290"/> <location filename="../qml/pages/components/MediaFullScreen.qml" line="289"/>
<source>Error loading</source> <source>Error loading</source>
<translation>Errore durante caricamento</translation> <translation>Errore durante caricamento</translation>
</message> </message>
@ -179,17 +191,17 @@
<context> <context>
<name>MiniStatus</name> <name>MiniStatus</name>
<message> <message>
<location filename="../qml/pages/components/MiniStatus.qml" line="38"/> <location filename="../qml/pages/components/MiniStatus.qml" line="33"/>
<source>boosted</source> <source>boosted</source>
<translation>ha condiviso</translation> <translation>ha condiviso</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/components/MiniStatus.qml" line="41"/> <location filename="../qml/pages/components/MiniStatus.qml" line="36"/>
<source>favourited</source> <source>favourited</source>
<translation>ha apprezzato</translation> <translation>ha apprezzato</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/components/MiniStatus.qml" line="44"/> <location filename="../qml/pages/components/MiniStatus.qml" line="39"/>
<source>followed you</source> <source>followed you</source>
<translation>ha iniziato a seguirti</translation> <translation>ha iniziato a seguirti</translation>
</message> </message>
@ -213,6 +225,7 @@
</message> </message>
<message> <message>
<location filename="../qml/pages/components/MyList.qml" line="70"/> <location filename="../qml/pages/components/MyList.qml" line="70"/>
<location filename="../qml/pages/components/MyList.qml" line="73"/>
<source>New Toot</source> <source>New Toot</source>
<translation>Nuovo toot</translation> <translation>Nuovo toot</translation>
</message> </message>
@ -225,7 +238,17 @@
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
<message> <message>
<location filename="../qml/pages/components/ProfileHeader.qml" line="153"/> <location filename="../qml/pages/components/ProfileHeader.qml" line="128"/>
<source>Group</source>
<translation>Gruppo</translation>
</message>
<message>
<location filename="../qml/pages/components/ProfileHeader.qml" line="146"/>
<source>Follows you</source>
<translation>Ti segue</translation>
</message>
<message>
<location filename="../qml/pages/components/ProfileHeader.qml" line="183"/>
<source>Bot</source> <source>Bot</source>
<translation>Bot</translation> <translation>Bot</translation>
</message> </message>
@ -233,78 +256,79 @@
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="175"/> <location filename="../qml/pages/ProfilePage.qml" line="156"/>
<source>About</source> <source>About</source>
<extracomment>If there&apos;s no good translation for &quot;About&quot;, use &quot;Details&quot; (in details about profile).</extracomment> <extracomment>If there&apos;s no good translation for &quot;About&quot;, use &quot;Details&quot; (in details about profile).</extracomment>
<translation>Dettagli</translation> <translation>Dettagli</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="255"/> <location filename="../qml/pages/ProfilePage.qml" line="235"/>
<source>Followers</source> <source>Followers</source>
<extracomment>Will show as: &quot;35 Followers&quot;</extracomment> <extracomment>Will show as: &quot;35 Followers&quot;</extracomment>
<translation>Seguaci</translation> <translation>Seguaci</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="266"/> <location filename="../qml/pages/ProfilePage.qml" line="246"/>
<source>Following</source> <source>Following</source>
<extracomment>Will show as: &quot;23 Following&quot;</extracomment> <extracomment>Will show as: &quot;23 Following&quot;</extracomment>
<translation>Segue</translation> <translation>Segue</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="277"/> <location filename="../qml/pages/ProfilePage.qml" line="257"/>
<source>Statuses</source> <source>Statuses</source>
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation>Toots</translation> <translation>Toots</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="307"/> <location filename="../qml/pages/ProfilePage.qml" line="273"/>
<location filename="../qml/pages/ProfilePage.qml" line="276"/>
<source>Mention</source> <source>Mention</source>
<translation>Menzionare</translation> <translation>Menzionare</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="319"/> <location filename="../qml/pages/ProfilePage.qml" line="288"/>
<source>Unfollow</source> <source>Unfollow</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Smetti di seguire</translation> <translation>Smetti di seguire</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="321"/> <location filename="../qml/pages/ProfilePage.qml" line="290"/>
<source>Requested</source> <source>Requested</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Richiesto</translation> <translation>Richiesto</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="323"/> <location filename="../qml/pages/ProfilePage.qml" line="292"/>
<source>Follow</source> <source>Follow</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Segui</translation> <translation>Segui</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="342"/> <location filename="../qml/pages/ProfilePage.qml" line="311"/>
<source>Unmute</source> <source>Unmute</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Non silenziare</translation> <translation>Non silenziare</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="344"/> <location filename="../qml/pages/ProfilePage.qml" line="313"/>
<source>Mute</source> <source>Mute</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Silenzia</translation> <translation>Silenzia</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="362"/> <location filename="../qml/pages/ProfilePage.qml" line="331"/>
<source>Unblock</source> <source>Unblock</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Sblocca</translation> <translation>Sblocca</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="364"/> <location filename="../qml/pages/ProfilePage.qml" line="333"/>
<source>Block</source> <source>Block</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Blocca</translation> <translation>Blocca</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="380"/> <location filename="../qml/pages/ProfilePage.qml" line="349"/>
<source>Open in Browser</source> <source>Open in Browser</source>
<translation>Aprire nel browser</translation> <translation>Aprire nel browser</translation>
</message> </message>
@ -332,136 +356,134 @@
<translation>Disabilitare questa opzione per conservare connessione dati</translation> <translation>Disabilitare questa opzione per conservare connessione dati</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="41"/> <location filename="../qml/pages/SettingsPage.qml" line="40"/>
<source>Account</source> <source>Account</source>
<translation>Account</translation> <translation>Account</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="73"/> <location filename="../qml/pages/SettingsPage.qml" line="72"/>
<source>Remove Account</source> <source>Remove Account</source>
<translation>Rimozione del account</translation> <translation>Rimozione del account</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="73"/> <location filename="../qml/pages/SettingsPage.qml" line="72"/>
<source>Add Account</source> <source>Add Account</source>
<translation>Aggiungi account</translation> <translation>Aggiungi account</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="96"/> <location filename="../qml/pages/SettingsPage.qml" line="95"/>
<source>Deauthorize this app from using your account and remove account data from phone</source> <source>Deauthorize this app from using your account and remove account data from phone</source>
<translation>Annullare l&apos;autorizzazione dell&apos;app e rimuovere l&apos;account</translation> <translation>Annullare l&apos;autorizzazione dell&apos;app e rimuovere l&apos;account</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="96"/> <location filename="../qml/pages/SettingsPage.qml" line="95"/>
<source>Authorize this app to access your Mastodon account</source> <source>Authorize this app to access your Mastodon account</source>
<translation>Autorizzare l&apos;app all&apos;utilizzo del conto Mastodon</translation> <translation>Autorizzare l&apos;app all&apos;utilizzo del conto Mastodon</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="110"/> <location filename="../qml/pages/SettingsPage.qml" line="106"/>
<source>Translate</source> <source>Translate</source>
<translation>Tradurre</translation> <translation>Tradurre</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="116"/> <location filename="../qml/pages/SettingsPage.qml" line="112"/>
<source>Use</source> <source>Use</source>
<extracomment>Full sentence for translation: &quot;Use Transifex to help with app translation to your language.&quot; - The word Transifex is a link and doesn&apos;t need translation.</extracomment> <extracomment>Full sentence for translation: &quot;Use Transifex to help with app translation to your language.&quot; - The word Transifex is a link and doesn&apos;t need translation.</extracomment>
<translation>Utilizzare</translation> <translation>Utilizzare</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="116"/> <location filename="../qml/pages/SettingsPage.qml" line="112"/>
<source>to help with app translation to your language.</source> <source>to help with app translation to your language.</source>
<translation>per aiutare nella traduzione dell&apos;app.</translation> <translation>per aiutare nella traduzione dell&apos;app.</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="132"/> <location filename="../qml/pages/SettingsPage.qml" line="128"/>
<source>Credits</source> <source>Credits</source>
<translation>Sviluppo</translation> <translation>Sviluppo</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="148"/> <location filename="../qml/pages/SettingsPage.qml" line="144"/>
<source>UI/UX design and development</source> <source>UI/UX design and development</source>
<translation>Design UI/UX e sviluppo</translation> <translation>Design UI/UX e sviluppo</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="155"/> <location filename="../qml/pages/SettingsPage.qml" line="151"/>
<source>Visual identity</source> <source>Visual identity</source>
<translation>Identità visiva</translation> <translation>Identità visiva</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="162"/> <location filename="../qml/pages/SettingsPage.qml" line="158"/>
<source>Development and translations</source> <source>Development and translations</source>
<translation>Sviluppo e traduzioni</translation> <translation>Sviluppo e traduzioni</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="169"/> <location filename="../qml/pages/SettingsPage.qml" line="165"/>
<source>Occitan &amp; French translation</source> <source>Occitan &amp; French translation</source>
<translation>Traduzione francese e occitanica</translation> <translation>Traduzione francese e occitanica</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="176"/> <location filename="../qml/pages/SettingsPage.qml" line="172"/>
<source>Chinese translation</source> <source>Chinese translation</source>
<translation>Traduzione cinese</translation> <translation>Traduzione cinese</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="183"/> <location filename="../qml/pages/SettingsPage.qml" line="179"/>
<source>Dutch translation</source> <source>Dutch translation</source>
<translation>Traduzione olandese</translation> <translation>Traduzione olandese</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="190"/> <location filename="../qml/pages/SettingsPage.qml" line="186"/>
<source>Spanish translation</source> <source>Spanish translation</source>
<translation>Traduzione spagnola</translation> <translation>Traduzione spagnola</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="197"/> <location filename="../qml/pages/SettingsPage.qml" line="193"/>
<source>Added README file</source> <source>Added README file</source>
<translation>Aggiunto file README</translation> <translation>Aggiunto file README</translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<location filename="../qml/pages/components/Toot.qml" line="36"/>
<source>boosted</source>
<translation>ha condiviso</translation>
</message>
<message>
<location filename="../qml/pages/components/Toot.qml" line="39"/>
<source>favourited</source>
<translation>ha apprezzato</translation>
</message>
<message>
<location filename="../qml/pages/components/Toot.qml" line="42"/>
<source>followed you</source>
<translation>ha iniziato a seguirti</translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
<location filename="../qml/pages/components/VisualContainer.qml" line="270"/> <location filename="../qml/pages/components/VisualContainer.qml" line="312"/>
<source>Unboost</source> <source>Unboost</source>
<translation>Annulla condivisione</translation> <translation>Annulla condivisione</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/components/VisualContainer.qml" line="270"/> <location filename="../qml/pages/components/VisualContainer.qml" line="312"/>
<source>Boost</source> <source>Boost</source>
<translation>Condividi</translation> <translation>Condividi</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/components/VisualContainer.qml" line="311"/> <location filename="../qml/pages/components/VisualContainer.qml" line="353"/>
<source>Unfavorite</source> <source>Unfavorite</source>
<translation>Annulla apprezzamento</translation> <translation>Annulla apprezzamento</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/components/VisualContainer.qml" line="311"/> <location filename="../qml/pages/components/VisualContainer.qml" line="353"/>
<source>Favorite</source> <source>Favorite</source>
<translation>Apprezzato</translation> <translation>Apprezzato</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/components/VisualContainer.qml" line="352"/> <location filename="../qml/pages/components/VisualContainer.qml" line="394"/>
<source>Remove Bookmark</source>
<translation>Elimina segnalibro</translation>
</message>
<message>
<location filename="../qml/pages/components/VisualContainer.qml" line="394"/>
<source>Bookmark</source>
<translation>Aggiungi segnalibro</translation>
</message>
<message>
<location filename="../qml/pages/components/VisualContainer.qml" line="424"/>
<location filename="../qml/pages/components/VisualContainer.qml" line="427"/>
<source>Mention</source> <source>Mention</source>
<translation>Menzionare</translation> <translation>Menzionare</translation>
</message> </message>
<message>
<location filename="../qml/pages/components/VisualContainer.qml" line="453"/>
<source>Conversation</source>
<translation>Conversazione</translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -24,15 +24,16 @@
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation>Linkadres kopiëren</translation> <translation>Linkadres kopiëren</translation>
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<translation type="unfinished"></translation> <translation>Waarschuwingstekst</translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<translation type="unfinished"></translation> <translation>Wat wil je kwijt?</translation>
</message> </message>
<message> <message>
<source>Delete</source> <source>Delete</source>
@ -40,23 +41,32 @@
</message> </message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation type="unfinished"></translation> <translation>Openbaar</translation>
</message> </message>
<message> <message>
<source>Unlisted</source> <source>Unlisted</source>
<translation type="unfinished"></translation> <translation>Minder openbaar</translation>
</message> </message>
<message> <message>
<source>Followers-only</source> <source>Followers-only</source>
<translation type="unfinished"></translation> <translation>Alleen volgers</translation>
</message> </message>
<message> <message>
<source>Direct</source> <source>Direct</source>
<translation type="unfinished"></translation> <translation>Direct</translation>
</message> </message>
<message> <message>
<source>Toot sent!</source> <source>Toot sent!</source>
<translation type="unfinished"></translation> <translation>Toot verzonden!</translation>
</message>
<message>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation>Antwoord</translation>
</message>
<message>
<source>Hide Reply</source>
<translation>Antwoord verbergen</translation>
</message> </message>
</context> </context>
<context> <context>
@ -96,7 +106,7 @@
</message> </message>
<message> <message>
<source>Enter a valid Mastodon instance URL</source> <source>Enter a valid Mastodon instance URL</source>
<translation type="unfinished"></translation> <translation>Geldig Mastodon URL</translation>
</message> </message>
<message> <message>
<source>Mastodon is a free, open-source social network. A decentralized alternative to commercial platforms, it avoids the risks of a single company monopolizing your communication. Pick a server that you trust whichever you choose, you can interact with everyone else. Anyone can run their own Mastodon instance and participate in the social network seamlessly.</source> <source>Mastodon is a free, open-source social network. A decentralized alternative to commercial platforms, it avoids the risks of a single company monopolizing your communication. Pick a server that you trust whichever you choose, you can interact with everyone else. Anyone can run their own Mastodon instance and participate in the social network seamlessly.</source>
@ -189,6 +199,14 @@
<source>Bot</source> <source>Bot</source>
<translation>Bot</translation> <translation>Bot</translation>
</message> </message>
<message>
<source>Follows you</source>
<translation>Volgt jou</translation>
</message>
<message>
<source>Group</source>
<translation>Groep</translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -253,7 +271,7 @@
</message> </message>
<message> <message>
<source>Mention</source> <source>Mention</source>
<translation type="unfinished">Vermelden</translation> <translation>Vermelden</translation>
</message> </message>
</context> </context>
<context> <context>
@ -344,21 +362,6 @@
<translation>om deze app te helpen vertalen in jouw taal.</translation> <translation>om deze app te helpen vertalen in jouw taal.</translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<source>boosted</source>
<translation>boostte</translation>
</message>
<message>
<source>favourited</source>
<translation>maakte favoriet</translation>
</message>
<message>
<source>followed you</source>
<translation>volgde jou</translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
@ -381,5 +384,17 @@
<source>Mention</source> <source>Mention</source>
<translation>Vermelden</translation> <translation>Vermelden</translation>
</message> </message>
<message>
<source>Conversation</source>
<translation>Conversatie</translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation>Bookmarken</translation>
</message>
<message>
<source>Bookmark</source>
<translation>Bladwijzer verwijderen</translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -24,6 +24,7 @@
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@ -58,6 +59,15 @@
<source>Toot sent!</source> <source>Toot sent!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Hide Reply</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -189,6 +199,14 @@
<source>Bot</source> <source>Bot</source>
<translation>Bot</translation> <translation>Bot</translation>
</message> </message>
<message>
<source>Follows you</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -344,21 +362,6 @@
<translation>voor te helpen met dezen app in uw taal te vertalen.</translation> <translation>voor te helpen met dezen app in uw taal te vertalen.</translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<source>boosted</source>
<translation>heeft geboost</translation>
</message>
<message>
<source>favourited</source>
<translation>heeft geduimd voor</translation>
</message>
<message>
<source>followed you</source>
<translation>volgt u nu</translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
@ -381,5 +384,17 @@
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -24,6 +24,7 @@
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@ -58,6 +59,15 @@
<source>Toot sent!</source> <source>Toot sent!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Hide Reply</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -189,6 +199,14 @@
<source>Bot</source> <source>Bot</source>
<translation>Bot</translation> <translation>Bot</translation>
</message> </message>
<message>
<source>Follows you</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -344,21 +362,6 @@
<translation>per ajudar a traduire laplicacion dins vòstra lenga.</translation> <translation>per ajudar a traduire laplicacion dins vòstra lenga.</translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<source>boosted</source>
<translation>a tornat partejar</translation>
</message>
<message>
<source>favourited</source>
<translation>a mes en favorit</translation>
</message>
<message>
<source>followed you</source>
<translation>vos sèc</translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
@ -381,5 +384,17 @@
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -24,6 +24,7 @@
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@ -58,6 +59,15 @@
<source>Toot sent!</source> <source>Toot sent!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Hide Reply</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -189,6 +199,14 @@
<source>Bot</source> <source>Bot</source>
<translation>Bot</translation> <translation>Bot</translation>
</message> </message>
<message>
<source>Follows you</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -344,21 +362,6 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<source>boosted</source>
<translation>podbił(a)</translation>
</message>
<message>
<source>favourited</source>
<translation>dodał(a) do ulubionych</translation>
</message>
<message>
<source>followed you</source>
<translation>zaczął(-ęła Cię śledzić)</translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
@ -381,5 +384,17 @@
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -24,6 +24,7 @@
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@ -58,6 +59,15 @@
<source>Toot sent!</source> <source>Toot sent!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Hide Reply</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -189,6 +199,14 @@
<source>Bot</source> <source>Bot</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Follows you</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -344,21 +362,6 @@
<translation>чтобы помочь с переводом приложения на ваш язык.</translation> <translation>чтобы помочь с переводом приложения на ваш язык.</translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<source>boosted</source>
<translation>росту</translation>
</message>
<message>
<source>favourited</source>
<translation>имеет любимый</translation>
</message>
<message>
<source>followed you</source>
<translation>следую за тобой</translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
@ -381,5 +384,17 @@
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -24,6 +24,7 @@
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@ -58,6 +59,15 @@
<source>Toot sent!</source> <source>Toot sent!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Hide Reply</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -189,6 +199,14 @@
<source>Bot</source> <source>Bot</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Follows you</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -344,21 +362,6 @@
<translation>и помозите у преводу апликације на други језик.</translation> <translation>и помозите у преводу апликације на други језик.</translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<source>boosted</source>
<translation>разглашено</translation>
</message>
<message>
<source>favourited</source>
<translation>омиљено</translation>
</message>
<message>
<source>followed you</source>
<translation>вас прати</translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
@ -381,5 +384,17 @@
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -24,6 +24,7 @@
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@ -58,6 +59,15 @@
<source>Toot sent!</source> <source>Toot sent!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Hide Reply</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -189,6 +199,14 @@
<source>Bot</source> <source>Bot</source>
<translation>Bot</translation> <translation>Bot</translation>
</message> </message>
<message>
<source>Follows you</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -344,21 +362,6 @@
<translation>för att hjälpa med app-översättningar till ditt språk.</translation> <translation>för att hjälpa med app-översättningar till ditt språk.</translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<source>boosted</source>
<translation>puffade</translation>
</message>
<message>
<source>favourited</source>
<translation>favoriserad</translation>
</message>
<message>
<source>followed you</source>
<translation>följer dig</translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
@ -381,5 +384,17 @@
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -24,6 +24,7 @@
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
@ -58,6 +59,15 @@
<source>Toot sent!</source> <source>Toot sent!</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Hide Reply</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -189,6 +199,14 @@
<source>Bot</source> <source>Bot</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Follows you</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -344,21 +362,6 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<source>boosted</source>
<translation></translation>
</message>
<message>
<source>favourited</source>
<translation></translation>
</message>
<message>
<source>followed you</source>
<translation></translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
@ -381,5 +384,17 @@
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -24,6 +24,7 @@
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation>Copy Link to Clipboard</translation> <translation>Copy Link to Clipboard</translation>
</message> </message>
<message> <message>
@ -58,6 +59,15 @@
<source>Toot sent!</source> <source>Toot sent!</source>
<translation>Toot sent!</translation> <translation>Toot sent!</translation>
</message> </message>
<message>
<source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation>Reply</translation>
</message>
<message>
<source>Hide Reply</source>
<translation>Hide Reply</translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -189,6 +199,14 @@
<source>Bot</source> <source>Bot</source>
<translation>Bot</translation> <translation>Bot</translation>
</message> </message>
<message>
<source>Follows you</source>
<translation>Follows you</translation>
</message>
<message>
<source>Group</source>
<translation>Group</translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -344,21 +362,6 @@
<translation>to help with app translation to your language.</translation> <translation>to help with app translation to your language.</translation>
</message> </message>
</context> </context>
<context>
<name>Toot</name>
<message>
<source>boosted</source>
<translation>boosted</translation>
</message>
<message>
<source>favourited</source>
<translation>favourited</translation>
</message>
<message>
<source>followed you</source>
<translation>followed you</translation>
</message>
</context>
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
@ -381,5 +384,17 @@
<source>Mention</source> <source>Mention</source>
<translation>Mention</translation> <translation>Mention</translation>
</message> </message>
<message>
<source>Conversation</source>
<translation>Conversation</translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation>Remove Bookmark</translation>
</message>
<message>
<source>Bookmark</source>
<translation>Bookmark</translation>
</message>
</context> </context>
</TS> </TS>