Merge branch 'ui-improvements'

This commit is contained in:
molan-git 2020-07-12 09:23:55 +02:00
commit 42c4964d8f
42 changed files with 1122 additions and 984 deletions

View file

@ -14,9 +14,9 @@ TARGET = harbour-tooterb
CONFIG += sailfishapp CONFIG += sailfishapp
QT += network dbus sql QT += network dbus sql
QT += multimedia
CONFIG += link_pkgconfig CONFIG += link_pkgconfig
PKGCONFIG += sailfishapp PKGCONFIG += sailfishapp \
PKGCONFIG += \
nemonotifications-qt5 nemonotifications-qt5
DEFINES += "APPVERSION=\\\"$${SPECVERSION}\\\"" DEFINES += "APPVERSION=\\\"$${SPECVERSION}\\\""
@ -58,16 +58,16 @@ DISTFILES += qml/harbour-tooterb.qml \
qml/pages/SettingsPage.qml \ qml/pages/SettingsPage.qml \
qml/pages/components/InfoBanner.qml \ qml/pages/components/InfoBanner.qml \
qml/pages/components/MediaFullScreen.qml \ qml/pages/components/MediaFullScreen.qml \
qml/pages/components/MyMedia.qml \
qml/pages/components/NavigationPanel.qml \
qml/pages/components/ProfileImage.qml \ qml/pages/components/ProfileImage.qml \
qml/pages/components/VisualContainer.qml \ qml/pages/components/VisualContainer.qml \
qml/pages/components/MiniStatus.qml \ qml/pages/components/MiniStatus.qml \
qml/pages/components/MiniHeader.qml \ qml/pages/components/MiniHeader.qml \
qml/pages/components/ItemUser.qml \ qml/pages/components/ItemUser.qml \
qml/pages/components/MyList.qml \ qml/pages/components/MyList.qml \
qml/pages/components/Navigation.qml \
qml/pages/components/ProfileHeader.qml \ qml/pages/components/ProfileHeader.qml \
qml/pages/components/MediaBlock.qml \ qml/pages/components/MediaBlock.qml \
qml/pages/components/MyImage.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 \

View file

@ -87,5 +87,4 @@ ApplicationWindow {
activate() activate()
} }
} }
} }

View file

@ -2,8 +2,6 @@
<title>icon-s-bookmark</title> <title>icon-s-bookmark</title>
<g> <g>
<rect width="32" height="32" fill="#fff" fill-opacity="0"/> <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="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.74ZM16,18.55a1.07,1.07,0,0,1,.69.24l9.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.79A1.07,1.07,0,0,1,16,18.55Z" 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> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 776 B

After

Width:  |  Height:  |  Size: 623 B

View file

@ -9,6 +9,7 @@ var mediator = (function(){
mediator.channels[channel].push({ context : this, callback : fn }); mediator.channels[channel].push({ context : this, callback : fn });
return this; return this;
}; };
var publish = function(channel){ var publish = function(channel){
if(!mediator.channels[channel]) return false; if(!mediator.channels[channel]) return false;
var args = Array.prototype.slice.call(arguments, 1); var args = Array.prototype.slice.call(arguments, 1);
@ -18,6 +19,7 @@ var mediator = (function(){
}; };
return this; return this;
}; };
return { return {
channels : {}, channels : {},
publish : publish, publish : publish,
@ -28,6 +30,7 @@ var mediator = (function(){
} }
}; };
}()); }());
var init = function(){ var init = function(){
console.log("db.version: "+db.version); console.log("db.version: "+db.version);
if(db.version === '') { if(db.version === '') {
@ -103,6 +106,7 @@ var tootParser = function(data){
console.log(ret) console.log(ret)
} }
var test = 1; var test = 1;
Qt.include("Mastodon.js") Qt.include("Mastodon.js")
@ -161,6 +165,7 @@ var notifier = function(item){
key: item.id key: item.id
} }
break; break;
case "follow": case "follow":
msg = { msg = {
urgency: "critical", urgency: "critical",
@ -182,6 +187,7 @@ var notifier = function(item){
key: item.id key: item.id
} }
break; break;
case "mention": case "mention":
msg = { msg = {
urgency: "critical", urgency: "critical",
@ -193,6 +199,7 @@ var notifier = function(item){
key: item.id key: item.id
} }
break; break;
default: default:
//console.log(JSON.stringify(messageObject.data)) //console.log(JSON.stringify(messageObject.data))
return; return;

View file

@ -10,10 +10,12 @@ var mastodonAPI = function(config) {
// modify initial config afterwards // modify initial config afterwards
config[key] = value; config[key] = value;
}, },
getConfig: function(key) { getConfig: function(key) {
//get config key //get config key
return config[key]; return config[key];
}, },
get: function (endpoint) { get: function (endpoint) {
// for GET API calls // for GET API calls
// can be called with two or three parameters // can be called with two or three parameters
@ -67,6 +69,7 @@ var mastodonAPI = function(config) {
} }
http.send(); http.send();
}, },
post: function (endpoint) { post: function (endpoint) {
// for POST API calls // for POST API calls
var postData, callback; var postData, callback;
@ -113,6 +116,7 @@ var mastodonAPI = function(config) {
} }
});*/ });*/
}, },
delete: function (endpoint, callback) { delete: function (endpoint, callback) {
// for DELETE API calls. // for DELETE API calls.
$.ajax({ $.ajax({
@ -125,6 +129,7 @@ var mastodonAPI = function(config) {
} }
}); });
}, },
stream: function (streamType, onData) { stream: function (streamType, onData) {
// Event Stream Support // Event Stream Support
// websocket streaming is undocumented. i had to reverse engineer the fucking web client. // websocket streaming is undocumented. i had to reverse engineer the fucking web client.
@ -132,7 +137,7 @@ var mastodonAPI = function(config) {
// user for your local home TL and notifications // user for your local home TL and notifications
// public for your federated TL // public for your federated TL
// public:local for your home TL // public:local for your home TL
// hashtag&tag=fuckdonaldtrump for the stream of #fuckdonaldtrump // hashtag&tag=mastodonrocks for the stream of #mastodonrocks
// callback gets called whenever new data ist recieved // callback gets called whenever new data ist recieved
// callback { event: (eventtype), payload: {mastodon object as described in the api docs} } // callback { event: (eventtype), payload: {mastodon object as described in the api docs} }
// eventtype could be notification (=notification) or update (= new toot in TL) // eventtype could be notification (=notification) or update (= new toot in TL)
@ -147,12 +152,10 @@ var mastodonAPI = function(config) {
onData(event); onData(event);
}; };
es.onmessage = listener; es.onmessage = listener;
}, },
registerApplication: function (client_name, redirect_uri, scopes, website, callback) { registerApplication: function (client_name, redirect_uri, scopes, website, callback) {
//register a new application //register a new application
// OAuth Auth flow: // OAuth Auth flow:
// First register the application // First register the application
// 2) get a access code from a user (using the link, generation function below!) // 2) get a access code from a user (using the link, generation function below!)
@ -191,10 +194,12 @@ var mastodonAPI = function(config) {
} }
http.send(params); http.send(params);
}, },
generateAuthLink: function (client_id, redirect_uri, responseType, scopes) { generateAuthLink: function (client_id, redirect_uri, responseType, scopes) {
return config.instance + "/oauth/authorize?client_id=" + client_id + "&redirect_uri=" + redirect_uri + return config.instance + "/oauth/authorize?client_id=" + client_id + "&redirect_uri=" + redirect_uri +
"&response_type=" + responseType + "&scope=" + scopes.join("+"); "&response_type=" + responseType + "&scope=" + scopes.join("+");
}, },
getAccessTokenFromAuthCode: function (client_id, client_secret, redirect_uri, code, callback) { getAccessTokenFromAuthCode: function (client_id, client_secret, redirect_uri, code, callback) {
/*$.ajax({ /*$.ajax({
url: config.instance + "/oauth/token", url: config.instance + "/oauth/token",

View file

@ -10,7 +10,7 @@ WorkerScript.onMessage = function(msg) {
console.log("Conf > " + JSON.stringify(msg.conf)) console.log("Conf > " + JSON.stringify(msg.conf))
console.log("Params > " + JSON.stringify(msg.params)) console.log("Params > " + JSON.stringify(msg.params))
// 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)
@ -18,14 +18,17 @@ WorkerScript.onMessage = function(msg) {
} }
} }
/** Logged-in status */
if (!msg.conf || !msg.conf.login) { if (!msg.conf || !msg.conf.login) {
console.log("Not loggedin") console.log("Not loggedin")
return; return;
} }
/** Load images */
if (typeof msg.conf['loadImages'] !== "undefined") if (typeof msg.conf['loadImages'] !== "undefined")
loadImages = msg.conf['loadImages'] loadImages = msg.conf['loadImages']
/** POST statuses */
var API = mastodonAPI({ instance: msg.conf.instance, api_user_token: msg.conf.api_user_token}); var API = mastodonAPI({ instance: msg.conf.instance, api_user_token: msg.conf.api_user_token});
if (msg.method === "POST"){ if (msg.method === "POST"){
API.post(msg.action, msg.params, function(data) { API.post(msg.action, msg.params, function(data) {
@ -63,7 +66,7 @@ WorkerScript.onMessage = function(msg) {
} else if(msg.action === "notifications") { } else if(msg.action === "notifications") {
// notification // notification
// console.log("Is notification... parsing...") console.log("Get notification list")
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)
@ -73,7 +76,9 @@ WorkerScript.onMessage = function(msg) {
console.log("ancestors") console.log("ancestors")
for (var j = 0; j < data[i].length; j ++) { for (var j = 0; j < data[i].length; j ++) {
item = parseToot(data[i][j]); item = parseToot(data[i][j]);
item['id'] = item['status_id'] item['id'] = item['status_id'];
if (typeof item['attachments'] === "undefined")
item['attachments'] = [];
items.push(item) items.push(item)
console.log(JSON.stringify(data[i][j])) console.log(JSON.stringify(data[i][j]))
} }
@ -82,7 +87,7 @@ WorkerScript.onMessage = function(msg) {
//console.log(JSON.stringify(i)) //console.log(JSON.stringify(i))
} else if(msg.action.indexOf("statuses") >-1 && msg.action.indexOf("context") >-1 && i === "descendants") { } else if(msg.action.indexOf("statuses") >-1 && msg.action.indexOf("context") >-1 && i === "descendants") {
// status ancestors toots - conversation // status descendants toots - conversation
console.log("descendants") console.log("descendants")
for (var j = 0; j < data[i].length; j ++) { for (var j = 0; j < data[i].length; j ++) {
item = parseToot(data[i][j]); item = parseToot(data[i][j]);
@ -94,16 +99,19 @@ 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("Get Toot")
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] })
} }
} }
} }
if(msg.model && items.length) if(msg.model && items.length)
addDataToModel(msg.model, msg.mode, items) addDataToModel(msg.model, msg.mode, items)
/*if(msg.action === "notifications") /*if(msg.action === "notifications")
@ -123,11 +131,10 @@ function addDataToModel (model, mode, items) {
model.insert(0,items[i]) model.insert(0,items[i])
} }
} }
model.sync() model.sync()
} }
// Get Account Data: Represents a user of Mastodon and their associated profile. /** Function: Get Account Data */
function parseAccounts(collection, prefix, data) { function parseAccounts(collection, prefix, data) {
var res = collection; var res = collection;
@ -153,13 +160,12 @@ function parseAccounts(collection, prefix, data) {
//res[prefix + 'account_fields'] = data["fields"] //res[prefix + 'account_fields'] = data["fields"]
res[prefix + 'account_bot'] = data["bot"] res[prefix + 'account_bot'] = data["bot"]
res[prefix + 'account_group'] = data["group"] 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: Get Notification Data */
function parseNotification(data){ function parseNotification(data){
//console.log(JSON.stringify(data)) //console.log(JSON.stringify(data))
var item = { var item = {
@ -168,12 +174,12 @@ function parseNotification(data){
attachments: [] attachments: []
}; };
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-alarm" item['typeIcon'] = "image://theme/icon-s-alarm"
item['type'] = "mention" item['type'] = "mention"
break; break;
@ -197,19 +203,18 @@ function parseNotification(data){
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'] = "favourite"
item['typeIcon'] = "image://theme/icon-s-favorite" item['typeIcon'] = "image://theme/icon-s-favorite"
item['type'] = "favourite";
//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-follow.svg" item['typeIcon'] = "../../images/icon-s-follow.svg"
item['attachments'] = [] //item['attachments'] = []
break; break;
default: default:
@ -222,6 +227,7 @@ function parseNotification(data){
return item; return item;
} }
/** Function: */
function collect() { function collect() {
var ret = {}; var ret = {};
var len = arguments.length; var len = arguments.length;
@ -235,12 +241,13 @@ function collect() {
return ret; return ret;
} }
/** Function: Get Status date */
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)
} }
// Get Status / Toot Data /** Function: Get Status data */
function parseToot (data) { function parseToot (data) {
var i = 0; var i = 0;
var item = {}; var item = {};
@ -253,7 +260,6 @@ function parseToot (data) {
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"] item['status_language'] = data["language"]
item['status_uri'] = data["uri"] item['status_uri'] = data["uri"]
item['status_url'] = data["url"] item['status_url'] = data["url"]
item['status_replies_count'] = data["replies_count"] item['status_replies_count'] = data["replies_count"]
@ -262,33 +268,38 @@ function parseToot (data) {
item['status_favourited'] = data["favourited"] item['status_favourited'] = data["favourited"]
item['status_reblogged'] = data["reblogged"] item['status_reblogged'] = data["reblogged"]
item['status_bookmarked'] = data["bookmarked"] item['status_bookmarked'] = data["bookmarked"]
item['status_content'] = data["content"] item['status_content'] = data["content"]
item['attachments'] = data['media_attachments']
item['status_in_reply_to_id'] = data["in_reply_to_id"] 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_in_reply_to_account_id'] = data["in_reply_to_account_id"]
item['status_reblog'] = data["reblog"] ? true : false item['status_reblog'] = data["reblog"] ? true : false
item['section'] = getDate(data["created_at"]) item['section'] = getDate(data["created_at"])
// If Toot is a Reblog /** If Toot is a Reblog */
if(item['status_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_sensitive'] = data["reblog"]["sensitive"] item['status_sensitive'] = data["reblog"]["sensitive"]
item['status_spoiler_text'] = data["reblog"]["spoiler_text"]
item['status_replies_count'] = data["reblog"]["replies_count"]
item['status_reblogs_count'] = data["reblog"]["reblogs_count"]
item['status_favourites_count'] = data["reblog"]["favourites_count"]
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"])
} }
/** Replace HTML content in Toots */
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'] = [];
// Media attachements in Toots /** Media attachements in Toots */
item['attachments'] = [];
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'], '')
@ -301,7 +312,7 @@ function parseToot (data) {
item['attachments'].push(tmp) item['attachments'].push(tmp)
} }
// Media attachements in Reblogs /** Media attachements in Reblogs */
if(item['status_reblog']) { if(item['status_reblog']) {
for(i = 0; i < data['reblog']['media_attachments'].length ; i++) { for(i = 0; i < data['reblog']['media_attachments'].length ; i++) {
var attachments = data['reblog']['media_attachments'][i]; var attachments = data['reblog']['media_attachments'][i];
@ -319,7 +330,7 @@ function parseToot (data) {
return addEmojis(item, data); return addEmojis(item, data);
} }
// Display function for custom Emojis in Toots /** Function: Display custom Emojis in Toots */
function addEmojis(item, data) { 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++) {

View file

@ -8,28 +8,37 @@ import "./components/"
Page { Page {
id: conversationPage id: conversationPage
property string type
property string description: ""
property string headerTitle: ""
property string suggestedUser: ""
property ListModel suggestedModel property ListModel suggestedModel
property string toot_id: "" property ListModel mdl
property string toot_url: "" property int tootMaxChar: 500
property string toot_uri: ""
property int tootMaxChar: 500;
property bool bot: false //otherwise ReferenceError ProfileHeader.qml property bool bot: false //otherwise ReferenceError ProfileHeader.qml
property bool followed_by: false //otherwise ReferenceError ProfileHeader.qml property bool followed_by: false //otherwise ReferenceError ProfileHeader.qml
property bool locked: false //otherwise ReferenceError ProfileHeader.qml property bool locked: false //otherwise ReferenceError ProfileHeader.qml
property bool group: false //otherwise ReferenceError ProfileHeader.qml property bool group: false //otherwise ReferenceError ProfileHeader.qml
property ListModel mdl property string type
property string username: ""
property string headerTitle: ""
property string suggestedUser: ""
property string status_id: ""
property string status_url: ""
property string status_uri: ""
property string status_link:
if (status_url === "") {
var test = status_uri.split("/")
console.log(status_uri)
console.log(JSON.stringify(test))
console.log(JSON.stringify(test.length))
if (test.length === 8 && (test[7] === "activity")) {
var urialt = status_uri.replace("activity", "")
status_link = urialt
}
else status_link = status_uri
} else status_link = status_url
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 { }', Qt.application, 'InternalQmlObject' )
'import QtQuick 2.0; ListModel { }',
Qt.application, 'InternalQmlObject'
)
predictionList.visible = false predictionList.visible = false
if (suggestedUser.length > 0) { if (suggestedUser.length > 0) {
var msg = { var msg = {
@ -58,18 +67,12 @@ Page {
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 {
id: header
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
} }
@ -90,12 +93,11 @@ Page {
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 === status_id) {
console.log(mdl.get(i).status_id) console.log(mdl.get(i).status_id)
positionViewAtIndex(i, ListView.Center) positionViewAtIndex(i, ListView.Center)
} }
@ -106,31 +108,25 @@ Page {
id: pulleyConversation id: pulleyConversation
visible: type === "reply" visible: type === "reply"
MenuItem {
text: qsTr("Open in Browser")
onClicked: {
Qt.openUrlExternally(status_link)
}
}
MenuItem { MenuItem {
//: Use the translation of "Copy Link" for a shorter PullDownMenu label //: 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: Clipboard.text = status_link
var test = toot_uri.split("/")
console.log(toot_uri)
console.log(JSON.stringify(test))
console.log(JSON.stringify(test.length))
if (test.length === 8 && (test[7] === "activity")) {
var urialt = toot_uri.replace("activity", "")
Clipboard.text = urialt
}
else Clipboard.text = toot_uri
} else Clipboard.text = toot_url
} }
MenuItem { MenuItem {
//: "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply" //: "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
text: !panel.open ? qsTr("Reply") : qsTr("Hide Reply") text: !panel.open ? qsTr("Reply") : qsTr("Hide Reply")
visible: type == "reply" visible: type == "reply"
onClicked: if (!panel.open) { onClicked: !panel.open ? panel.open = true : panel.open = false
panel.open = true
} else panel.open = false
} }
} }
} }
@ -142,20 +138,16 @@ Page {
anchors { anchors {
left: panel.left left: panel.left
right: panel.right right: panel.right
bottom: if (panel.open == true) { bottom: panel.open == true ? panel.top : hiddenPanel.top
panel.top
} else {
hiddenPanel.top
}
} }
SilicaListView { SilicaListView {
rotation: 180 id: predictionResults
rotation: 180 // shows best matching result on the bottom
anchors.fill: parent anchors.fill: parent
model: suggestedModel model: suggestedModel
clip: true clip: true
quickScroll: false quickScroll: false
VerticalScrollDecorator {}
delegate: ItemUser { delegate: ItemUser {
rotation: 180 rotation: 180
onClicked: { onClicked: {
@ -171,7 +163,6 @@ Page {
+ 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)
} }
} }
@ -180,21 +171,20 @@ Page {
positionViewAtBeginning(suggestedModel.count - 1, ListView.Beginning) positionViewAtBeginning(suggestedModel.count - 1, ListView.Beginning)
} }
} }
VerticalScrollDecorator {}
} }
} }
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 + (warningContent.visible ? warningContent.height : 0)
+ btnContentWarning.height + Theme.paddingMedium
+ (warningContent.visible ? warningContent.height : 0)
dock: Dock.Bottom dock: Dock.Bottom
open: true open: true
animationDuration: 300
Rectangle { Rectangle {
id: progressBarBg
width: parent.width width: parent.width
height: progressBar.height height: progressBar.height
color: Theme.highlightBackgroundColor color: Theme.highlightBackgroundColor
@ -225,17 +215,18 @@ Page {
autoScrollEnabled: true autoScrollEnabled: true
labelVisible: false labelVisible: false
font.pixelSize: Theme.fontSizeSmall font.pixelSize: Theme.fontSizeSmall
//: placeholderText in Toot content warning panel
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: {}
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
} }
EnterKey.onClicked: {}
} }
TextInput { TextInput {
@ -247,18 +238,19 @@ Page {
id: toot id: toot
autoScrollEnabled: true autoScrollEnabled: true
labelVisible: false labelVisible: false
text: description !== "" && (description.charAt(0) === '@' //: placeholderText in Toot text panel
|| description.charAt(
0) === '#') ? description + ' ' : ''
height: if (type !== "reply") {
Math.max(conversationPage.height / 3, Math.min(conversationPage.height * 0.65, implicitHeight))
}
else {
Math.max(conversationPage.height / 4, Math.min(conversationPage.height * 0.65, implicitHeight))
}
horizontalAlignment: Text.AlignLeft
placeholderText: qsTr("What's on your mind?") placeholderText: qsTr("What's on your mind?")
font.pixelSize: Theme.fontSizeSmall font.pixelSize: Theme.fontSizeSmall
text: username !== "" && (username.charAt(0) === '@'
|| username.charAt(
0) === '#') ? username + ' ' : ''
height: if (type !== "reply") {
isPortrait ? Math.max(conversationPage.height / 3, Math.min(conversationPage.height * 0.65, implicitHeight)) : Math.max(conversationPage.height / 2, Math.min(conversationPage.height * 0.65, implicitHeight))
}
else {
isPortrait ? Math.max(conversationPage.height / 4, Math.min(conversationPage.height * 0.65, implicitHeight)) : Math.max(conversationPage.height / 2.5, Math.min(conversationPage.height * 0.65, implicitHeight))
}
horizontalAlignment: Text.AlignLeft
anchors { anchors {
top: warningContent.bottom top: warningContent.bottom
topMargin: Theme.paddingMedium topMargin: Theme.paddingMedium
@ -274,7 +266,6 @@ Page {
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(toot.text.length) console.log(toot.text.length)
suggestedUser = "" suggestedUser = ""
if (textOperations.selectedText.charAt(0) === "@") { if (textOperations.selectedText.charAt(0) === "@") {
@ -302,7 +293,7 @@ Page {
rightMargin: Theme.paddingSmall rightMargin: Theme.paddingSmall
} }
onSelectionChanged: { console.log(selection) } onSelectionChanged: { console.log(selection) }
onClicked: pageStack.push(emojiSelect) onClicked: pageStack.push(emojiDialog)
} }
SilicaGridView { SilicaGridView {
@ -313,13 +304,14 @@ Page {
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: isPortrait ? cellWidth : 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
cancelText: ""
} }
Image { Image {
@ -331,7 +323,7 @@ Page {
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, "", function () {
mediaModel.remove(idx) mediaModel.remove(idx)
}) })
} }
@ -363,28 +355,26 @@ Page {
IconButton { IconButton {
id: btnContentWarning id: btnContentWarning
icon.source: "image://theme/icon-s-warning?" + ( pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor) )
onClicked: warningContent.visible = !warningContent.visible
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?"
+ (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
onClicked: warningContent.visible = !warningContent.visible
} }
IconButton { IconButton {
id: btnAddImage id: btnAddImage
enabled: mediaModel.count < 4 enabled: mediaModel.count < 4
icon.source: "image://theme/icon-s-attach?" + ( pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor) )
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?"
+ (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
onClicked: { onClicked: {
btnAddImage.enabled = false btnAddImage.enabled = false
var once = true var once = true
@ -421,12 +411,6 @@ Page {
ComboBox { ComboBox {
id: privacy id: privacy
anchors {
top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5
left: btnAddImage.right
right: btnSend.left
}
menu: ContextMenu { menu: ContextMenu {
MenuItem { MenuItem {
text: qsTr("Public") text: qsTr("Public")
@ -441,19 +425,24 @@ Page {
text: qsTr("Direct") text: qsTr("Direct")
} }
} }
anchors {
top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5
left: btnAddImage.right
right: btnSend.left
}
} }
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) enabled: toot.text !== "" && toot.text.length < tootMaxChar && uploadProgress.width == 0
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
onClicked: { onClicked: {
var visibility = ["public", "unlisted", "private", "direct"] var visibility = ["public", "unlisted", "private", "direct"]
var media_ids = [] var media_ids = []
@ -473,8 +462,8 @@ Page {
}, },
"conf": Logic.conf "conf": Logic.conf
} }
if (toot_id) if (status_id)
msg.params['in_reply_to_id'] = (toot_id) + "" msg.params['in_reply_to_id'] = (status_id) + ""
if (warningContent.visible && warningContent.text.length > 0) { if (warningContent.visible && warningContent.text.length > 0) {
msg.params['sensitive'] = 1 msg.params['sensitive'] = 1
@ -492,9 +481,11 @@ Page {
Rectangle { Rectangle {
id: uploadProgress id: uploadProgress
color: Theme.highlightBackgroundColor color: Theme.highlightBackgroundColor
anchors.bottom: parent.bottom
anchors.left: parent.left
height: Theme.itemSizeSmall * 0.05 height: Theme.itemSizeSmall * 0.05
anchors {
bottom: parent.bottom
left: parent.left
}
} }
} }
@ -564,9 +555,9 @@ Page {
color: Theme.highlightBackgroundColor color: Theme.highlightBackgroundColor
opacity: 0.2 opacity: 0.2
anchors { anchors {
top: parent.top
left: parent.left left: parent.left
right: parent.right right: parent.right
top: parent.top
} }
} }
@ -577,15 +568,15 @@ Page {
color: Theme.highlightBackgroundColor color: Theme.highlightBackgroundColor
opacity: 0.7 opacity: 0.7
anchors { anchors {
left: parent.left
top: parent.top top: parent.top
left: parent.left
} }
} }
} }
EmojiSelect { EmojiSelect {
id: emojiSelect id: emojiDialog
} }
InfoBanner { InfoBanner {

View file

@ -72,38 +72,35 @@ Page {
); );
} }
} }
Label { Label {
id: serviceDescr
text: qsTr("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.")
font.pixelSize: Theme.fontSizeExtraSmall
color: Theme.highlightColor
wrapMode: Text.WordWrap
width: parent.width
anchors { anchors {
left: parent.left
right: parent.right
topMargin: Theme.paddingMedium topMargin: Theme.paddingMedium
left: parent.left
leftMargin: Theme.horizontalPageMargin leftMargin: Theme.horizontalPageMargin
right: parent.right
rightMargin: Theme.horizontalPageMargin rightMargin: Theme.horizontalPageMargin
} }
width: parent.width
wrapMode: Text.WordWrap
color: Theme.highlightColor
font.pixelSize: Theme.fontSizeExtraSmall
text: qsTr("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.")
} }
} }
} }
SilicaWebView { SilicaWebView {
id: webView id: webView
visible: false visible: false
opacity: 0
anchors { anchors {
top: parent.top top: parent.top
left: parent.left left: parent.left
right: parent.right right: parent.right
bottom: parent.bottom bottom: parent.bottom
} }
opacity: 0
onLoadingChanged: { onLoadingChanged: {
console.log(url) console.log(url)
if ( if (
@ -154,6 +151,7 @@ Page {
} }
FadeAnimation on opacity {} FadeAnimation on opacity {}
PullDownMenu { PullDownMenu {
MenuItem { MenuItem {
text: qsTr("Reload") text: qsTr("Reload")

View file

@ -12,14 +12,15 @@ Page {
allowedOrientations: Orientation.All allowedOrientations: Orientation.All
// Docked Navigation panel
DockedPanel { DockedPanel {
id: infoPanel id: infoPanel
open: true open: true
width: mainPage.isPortrait ? parent.width : Theme.itemSizeLarge width: isPortrait ? parent.width : Theme.itemSizeLarge
height: mainPage.isPortrait ? Theme.itemSizeLarge : parent.height height: isPortrait ? Theme.itemSizeLarge : parent.height
dock: mainPage.isPortrait ? Dock.Bottom : Dock.Right dock: isPortrait ? Dock.Bottom : Dock.Right
Navigation { NavigationPanel {
id: navigation id: navigation
isPortrait: !mainPage.isPortrait isPortrait: !mainPage.isPortrait
onSlideshowShow: { onSlideshowShow: {
@ -37,9 +38,9 @@ Page {
title: qsTr("Home") title: qsTr("Home")
type: "timelines/home" type: "timelines/home"
mdl: Logic.modelTLhome mdl: Logic.modelTLhome
width: parent.itemWidth width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
height: parent.itemHeight height: parent.itemHeight
onOpenDrawer: infoPanel.open = setDrawer onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
} }
MyList { MyList {
@ -48,9 +49,9 @@ Page {
type: "notifications" type: "notifications"
notifier: true notifier: true
mdl: Logic.modelTLnotifications mdl: Logic.modelTLnotifications
width: parent.itemWidth width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
height: parent.itemHeight height: parent.itemHeight
onOpenDrawer: infoPanel.open = setDrawer onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
} }
MyList { MyList {
@ -59,9 +60,9 @@ Page {
type: "timelines/public?local=true" type: "timelines/public?local=true"
//params: ["local", true] //params: ["local", true]
mdl: Logic.modelTLlocal mdl: Logic.modelTLlocal
width: parent.itemWidth width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
height: parent.itemHeight height: parent.itemHeight
onOpenDrawer: infoPanel.open = setDrawer onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
} }
MyList { MyList {
@ -69,9 +70,9 @@ Page {
title: qsTr("Federated") title: qsTr("Federated")
type: "timelines/public" type: "timelines/public"
mdl: Logic.modelTLpublic mdl: Logic.modelTLpublic
width: parent.itemWidth width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
height: parent.itemHeight height: parent.itemHeight
onOpenDrawer: infoPanel.open = setDrawer onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
} }
Item { Item {
@ -80,7 +81,7 @@ Page {
property ListModel mdl: ListModel {} property ListModel mdl: ListModel {}
property string search property string search
width: parent.itemWidth width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
height: parent.itemHeight height: parent.itemHeight
onSearchChanged: { onSearchChanged: {
console.log(search) console.log(search)
@ -134,7 +135,7 @@ Page {
mdl: ListModel {} mdl: ListModel {}
width: parent.width width: parent.width
height: parent.height height: parent.height
onOpenDrawer: infoPanel.open = setDrawer onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
anchors.fill: parent anchors.fill: parent
currentIndex: -1 // otherwise currentItem will steal focus currentIndex: -1 // otherwise currentItem will steal focus
header: Item { header: Item {
@ -233,16 +234,16 @@ Page {
itemWidth: isTablet ? Math.round(parent.width) : parent.width itemWidth: isTablet ? Math.round(parent.width) : parent.width
itemHeight: height itemHeight: height
clip: true clip: true
model: visualModel
onCurrentIndexChanged: { onCurrentIndexChanged: {
navigation.slideshowIndexChanged(currentIndex) navigation.slideshowIndexChanged(currentIndex)
} }
anchors { anchors {
fill: parent fill: parent
top: parent.top top: parent.top
rightMargin: mainPage.isPortrait ? 0 : infoPanel.visibleSize rightMargin: isPortrait ? 0 : infoPanel.visibleSize
bottomMargin: mainPage.isPortrait ? infoPanel.visibleSize : 0 bottomMargin: isPortrait ? infoPanel.visibleSize : 0
} }
model: visualModel
Component.onCompleted: { Component.onCompleted: {
} }
} }
@ -255,7 +256,7 @@ Page {
icon.source: "image://theme/icon-l-add" icon.source: "image://theme/icon-l-add"
anchors { anchors {
right: (mainPage.isPortrait ? parent.right : infoPanel.left) right: (mainPage.isPortrait ? parent.right : infoPanel.left)
rightMargin: Theme.paddingLarge rightMargin: isPortrait ? Theme.paddingLarge : Theme.paddingLarge * 0.8
bottom: (mainPage.isPortrait ? infoPanel.top : parent.bottom) bottom: (mainPage.isPortrait ? infoPanel.top : parent.bottom)
bottomMargin: Theme.paddingLarge bottomMargin: Theme.paddingLarge
} }

View file

@ -182,9 +182,9 @@ Page {
id: txtNote id: txtNote
text: note text: note
textFormat: Text.StyledText textFormat: Text.StyledText
color: Theme.secondaryColor color: Theme.secondaryHighlightColor
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
linkColor: Theme.highlightColor linkColor: Theme.secondaryColor
wrapMode: Text.Wrap wrapMode: Text.Wrap
width: parent.width - ( 2 * Theme.horizontalPageMargin ) width: parent.width - ( 2 * Theme.horizontalPageMargin )
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
@ -227,37 +227,43 @@ Page {
anchors.leftMargin: Theme.paddingLarge anchors.leftMargin: Theme.paddingLarge
anchors.rightMargin: Theme.paddingLarge anchors.rightMargin: Theme.paddingLarge
Text { Label {
id: txtFollowers id: txtFollowers
visible: true //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")
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
color: Theme.highlightColor color: Theme.primaryColor
wrapMode: Text.Wrap wrapMode: Text.Wrap
} }
Text { Label {
id: txtFollowing id: txtFollowing
visible: true //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")
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
color: Theme.highlightColor color: Theme.primaryColor
wrapMode: Text.Wrap wrapMode: Text.Wrap
} }
Text { Label {
id: txtStatuses id: txtStatuses
visible: true //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")
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
color: Theme.highlightColor color: pressed ? Theme.highlightColor : Theme.primaryColor
wrapMode: Text.Wrap wrapMode: Text.Wrap
MouseArea {
anchors.fill: parent
onClicked: expandingSection1.expanded = false
}
} }
} }
@ -299,7 +305,6 @@ Page {
'conf' : Logic.conf 'conf' : Logic.conf
}; };
worker.sendMessage(msg); worker.sendMessage(msg);
// to-do: create notification banner "Follow request sent!"
} }
} }
@ -338,20 +343,10 @@ Page {
'params' : [], 'params' : [],
'action' : "accounts/" + user_id + (blocking ? '/unblock':'/block'), 'action' : "accounts/" + user_id + (blocking ? '/unblock':'/block'),
'conf' : Logic.conf 'conf' : Logic.conf
};
worker.sendMessage(msg);
} }
worker.sendMessage(msg)
} }
} }
Button {
id: btnBrowser
text: qsTr("Open in Browser")
preferredWidth: Theme.buttonWidthMedium
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
Qt.openUrlExternally(url)
}
} }
Rectangle { // dummy item for spacing Rectangle { // dummy item for spacing

View file

@ -2,11 +2,9 @@ import QtQuick 2.0
import Sailfish.Silica 1.0 import Sailfish.Silica 1.0
Component {
id: emojiComponent
Dialog { Dialog {
id: emoticonsDialog id: emojiDialog
allowedOrientations: Orientation.All
canAccept: false //selector.currentIndex >= 0 canAccept: false //selector.currentIndex >= 0
onAcceptPendingChanged: { onAcceptPendingChanged: {
if (acceptPending) { if (acceptPending) {
@ -14,6 +12,13 @@ Component {
// acceptDestinationInstance.category = selector.value // acceptDestinationInstance.category = selector.value
} }
} }
anchors.top: parent.top
Column {
id: emojiColumn
spacing: Theme.paddingLarge
width: parent.width
height: parent.height
SilicaGridView { SilicaGridView {
id: gridView id: gridView
@ -21,75 +26,175 @@ Component {
title: qsTr("Emojis") title: qsTr("Emojis")
description: qsTr("Tap to insert") description: qsTr("Tap to insert")
} }
cellWidth: gridView.width / 6 cellWidth: isPortrait ? gridView.width / 6 : gridView.width / 10
cellHeight: cellWidth cellHeight: cellWidth
anchors.fill: parent width: parent.width
height: parent.height
model: ListModel { model: ListModel {
ListElement { section: "smileys"; glyph: "😁" } ListElement { section: "Smileys"; glyph: "😄" }
ListElement { section: "smileys"; glyph: "😂" } ListElement { section: "Smileys"; glyph: "😃" }
ListElement { section: "smileys"; glyph: "😃" } ListElement { section: "Smileys"; glyph: "😀" }
ListElement { section: "smileys"; glyph: "😄" } ListElement { section: "Smileys"; glyph: "😊" }
ListElement { section: "smileys"; glyph: "😅" } ListElement { section: "Smileys"; glyph: "☺" }
ListElement { section: "smileys"; glyph: "😆" } ListElement { section: "Smileys"; glyph: "😉" }
ListElement { section: "smileys"; glyph: "😉" } ListElement { section: "Smileys"; glyph: "😍" }
ListElement { section: "smileys"; glyph: "😊" } ListElement { section: "Smileys"; glyph: "😘" }
ListElement { section: "smileys"; glyph: "😋" } ListElement { section: "Smileys"; glyph: "😚" }
ListElement { section: "smileys"; glyph: "😎" } ListElement { section: "Smileys"; glyph: "😗" }
ListElement { section: "smileys"; glyph: "😌" } ListElement { section: "Smileys"; glyph: "😙" }
ListElement { section: "smileys"; glyph: "😍" } ListElement { section: "Smileys"; glyph: "😜" }
ListElement { section: "smileys"; glyph: "😘" } ListElement { section: "Smileys"; glyph: "😝" }
ListElement { section: "smileys"; glyph: "😏" } ListElement { section: "Smileys"; glyph: "😛" }
ListElement { section: "smileys"; glyph: "😒" } ListElement { section: "Smileys"; glyph: "😳" }
ListElement { section: "smileys"; glyph: "😓" } ListElement { section: "Smileys"; glyph: "😁" }
ListElement { section: "smileys"; glyph: "😔" } ListElement { section: "Smileys"; glyph: "😔" }
ListElement { section: "smileys"; glyph: "😖" } ListElement { section: "Smileys"; glyph: "😌" }
ListElement { section: "smileys"; glyph: "😚" } ListElement { section: "Smileys"; glyph: "😒" }
ListElement { section: "smileys"; glyph: "😜" } ListElement { section: "Smileys"; glyph: "😞" }
ListElement { section: "smileys"; glyph: "😝" } ListElement { section: "Smileys"; glyph: "😣" }
ListElement { section: "smileys"; glyph: "😞" } ListElement { section: "Smileys"; glyph: "😢" }
ListElement { section: "smileys"; glyph: "😠" } ListElement { section: "Smileys"; glyph: "😂" }
ListElement { section: "smileys"; glyph: "😡" } ListElement { section: "Smileys"; glyph: "😭" }
ListElement { section: "smileys"; glyph: "😢" } ListElement { section: "Smileys"; glyph: "😪" }
ListElement { section: "smileys"; glyph: "😣" } ListElement { section: "Smileys"; glyph: "😥" }
ListElement { section: "smileys"; glyph: "😤" } ListElement { section: "Smileys"; glyph: "😰" }
ListElement { section: "smileys"; glyph: "😥" } ListElement { section: "Smileys"; glyph: "😅" }
ListElement { section: "smileys"; glyph: "😨" } ListElement { section: "Smileys"; glyph: "😩" }
ListElement { section: "smileys"; glyph: "😩" } ListElement { section: "Smileys"; glyph: "😫" }
ListElement { section: "smileys"; glyph: "😪" } ListElement { section: "Smileys"; glyph: "😨" }
ListElement { section: "smileys"; glyph: "😫" } ListElement { section: "Smileys"; glyph: "😱" }
ListElement { section: "smileys"; glyph: "😭" } ListElement { section: "Smileys"; glyph: "😠" }
ListElement { section: "smileys"; glyph: "😰" } ListElement { section: "Smileys"; glyph: "😡" }
ListElement { section: "smileys"; glyph: "😱" } ListElement { section: "Smileys"; glyph: "😤" }
ListElement { section: "smileys"; glyph: "😲" } ListElement { section: "Smileys"; glyph: "😖" }
ListElement { section: "smileys"; glyph: "😳" } ListElement { section: "Smileys"; glyph: "😆" }
ListElement { section: "smileys"; glyph: "😵" } ListElement { section: "Smileys"; glyph: "😋" }
ListElement { section: "smileys"; glyph: "😷" } ListElement { section: "Smileys"; glyph: "😷" }
ListElement { section: "smileys"; glyph: "😸" } ListElement { section: "Smileys"; glyph: "😎" }
ListElement { section: "smileys"; glyph: "😹" } ListElement { section: "Smileys"; glyph: "😴" }
ListElement { section: "smileys"; glyph: "😺" } ListElement { section: "Smileys"; glyph: "😵" }
ListElement { section: "smileys"; glyph: "😻" } ListElement { section: "Smileys"; glyph: "😲" }
ListElement { section: "smileys"; glyph: "😼" } ListElement { section: "Smileys"; glyph: "😟" }
ListElement { section: "smileys"; glyph: "😽" } ListElement { section: "Smileys"; glyph: "😦" }
ListElement { section: "smileys"; glyph: "😾" } ListElement { section: "Smileys"; glyph: "😧" }
ListElement { section: "smileys"; glyph: "😿" } ListElement { section: "Smileys"; glyph: "😈" }
ListElement { section: "smileys"; glyph: "🙀" } ListElement { section: "Smileys"; glyph: "👿" }
ListElement { section: "Smileys"; glyph: "😮" }
ListElement { section: "Smileys"; glyph: "😬" }
ListElement { section: "Smileys"; glyph: "😐" }
ListElement { section: "Smileys"; glyph: "😕" }
ListElement { section: "Smileys"; glyph: "😯" }
ListElement { section: "Smileys"; glyph: "😶" }
ListElement { section: "Smileys"; glyph: "😇" }
ListElement { section: "Smileys"; glyph: "😏" }
ListElement { section: "Smileys"; glyph: "😑" }
ListElement { section: "People and Fantasy"; glyph: "🙅" } ListElement { section: "Cat Faces"; glyph: "😺" }
ListElement { section: "People and Fantasy"; glyph: "🙆" } ListElement { section: "Cat Faces"; glyph: "😸" }
ListElement { section: "People and Fantasy"; glyph: "🙇" } ListElement { section: "Cat Faces"; glyph: "😻" }
ListElement { section: "People and Fantasy"; glyph: "🙈" } ListElement { section: "Cat Faces"; glyph: "😽" }
ListElement { section: "People and Fantasy"; glyph: "🙉" } ListElement { section: "Cat Faces"; glyph: "😼" }
ListElement { section: "People and Fantasy"; glyph: "🙊" } ListElement { section: "Cat Faces"; glyph: "🙀" }
ListElement { section: "People and Fantasy"; glyph: "🙋" } ListElement { section: "Cat Faces"; glyph: "😿" }
ListElement { section: "People and Fantasy"; glyph: "🙍" } ListElement { section: "Cat Faces"; glyph: "😹" }
ListElement { section: "People and Fantasy"; glyph: "🙎" } ListElement { section: "Cat Faces"; glyph: "😾" }
ListElement { section: "People and Fantasy"; glyph: "👍" }
ListElement { section: "People and Fantasy"; glyph: "👎" } ListElement { section: "Other Faces"; glyph: "👹" }
ListElement { section: "People and Fantasy"; glyph: "🙌" } ListElement { section: "Other Faces"; glyph: "👺" }
ListElement { section: "People and Fantasy"; glyph: "✊" } ListElement { section: "Other Faces"; glyph: "🙈" }
ListElement { section: "People and Fantasy"; glyph: "💪" } ListElement { section: "Other Faces"; glyph: "🙉" }
ListElement { section: "People and Fantasy"; glyph: "👉" } ListElement { section: "Other Faces"; glyph: "🙊" }
ListElement { section: "People and Fantasy"; glyph: "🙏" } ListElement { section: "Other Faces"; glyph: "💀" }
ListElement { section: "Other Faces"; glyph: "👽" }
ListElement { section: "Misc Emoji"; glyph: "🔥" }
ListElement { section: "Misc Emoji"; glyph: "✨" }
ListElement { section: "Misc Emoji"; glyph: "🌟" }
ListElement { section: "Misc Emoji"; glyph: "💫" }
ListElement { section: "Misc Emoji"; glyph: "💥" }
ListElement { section: "Misc Emoji"; glyph: "💢" }
ListElement { section: "Misc Emoji"; glyph: "💦" }
ListElement { section: "Misc Emoji"; glyph: "💧" }
ListElement { section: "Misc Emoji"; glyph: "💤" }
ListElement { section: "Misc Emoji"; glyph: "💨" }
ListElement { section: "Misc Emoji"; glyph: "👂" }
ListElement { section: "Misc Emoji"; glyph: "👀" }
ListElement { section: "Misc Emoji"; glyph: "👃" }
ListElement { section: "Misc Emoji"; glyph: "👅" }
ListElement { section: "Misc Emoji"; glyph: "👄" }
ListElement { section: "Misc Emoji"; glyph: "👍" }
ListElement { section: "Misc Emoji"; glyph: "👎" }
ListElement { section: "Misc Emoji"; glyph: "👌" }
ListElement { section: "Misc Emoji"; glyph: "👊" }
ListElement { section: "Misc Emoji"; glyph: "✊" }
ListElement { section: "Misc Emoji"; glyph: "✌" }
ListElement { section: "Misc Emoji"; glyph: "👋" }
ListElement { section: "Misc Emoji"; glyph: "✋" }
ListElement { section: "Misc Emoji"; glyph: "👐" }
ListElement { section: "Misc Emoji"; glyph: "👆" }
ListElement { section: "Misc Emoji"; glyph: "👇" }
ListElement { section: "Misc Emoji"; glyph: "👉" }
ListElement { section: "Misc Emoji"; glyph: "👈" }
ListElement { section: "Misc Emoji"; glyph: "🙌" }
ListElement { section: "Misc Emoji"; glyph: "🙏" }
ListElement { section: "Misc Emoji"; glyph: "☝" }
ListElement { section: "Misc Emoji"; glyph: "👏" }
ListElement { section: "Misc Emoji"; glyph: "💪" }
ListElement { section: "Animals Emoji"; glyph: "🐶" }
ListElement { section: "Animals Emoji"; glyph: "🐺" }
ListElement { section: "Animals Emoji"; glyph: "🐱" }
ListElement { section: "Animals Emoji"; glyph: "🐭" }
ListElement { section: "Animals Emoji"; glyph: "🐹" }
ListElement { section: "Animals Emoji"; glyph: "🐰" }
ListElement { section: "Animals Emoji"; glyph: "🐸" }
ListElement { section: "Animals Emoji"; glyph: "🐯" }
ListElement { section: "Animals Emoji"; glyph: "🐨" }
ListElement { section: "Animals Emoji"; glyph: "🐘" }
ListElement { section: "Animals Emoji"; glyph: "🐼" }
ListElement { section: "Animals Emoji"; glyph: "🐧" }
ListElement { section: "Animals Emoji"; glyph: "🐦" }
ListElement { section: "Animals Emoji"; glyph: "🐤" }
ListElement { section: "Animals Emoji"; glyph: "🐥" }
ListElement { section: "Animals Emoji"; glyph: "🐣" }
ListElement { section: "Animals Emoji"; glyph: "🐔" }
ListElement { section: "Animals Emoji"; glyph: "🐍" }
ListElement { section: "Animals Emoji"; glyph: "🐢" }
ListElement { section: "Animals Emoji"; glyph: "🐛" }
ListElement { section: "Animals Emoji"; glyph: "🐝" }
ListElement { section: "Animals Emoji"; glyph: "🐜" }
ListElement { section: "Animals Emoji"; glyph: "🐞" }
ListElement { section: "Animals Emoji"; glyph: "🐌" }
ListElement { section: "Animals Emoji"; glyph: "🐙" }
ListElement { section: "Animals Emoji"; glyph: "🐚" }
ListElement { section: "Animals Emoji"; glyph: "🐠" }
ListElement { section: "Animals Emoji"; glyph: "🐟" }
ListElement { section: "Animals Emoji"; glyph: "🐬" }
ListElement { section: "Animals Emoji"; glyph: "🐳" }
ListElement { section: "Animals Emoji"; glyph: "🐋" }
ListElement { section: "Animals Emoji"; glyph: "🐄" }
ListElement { section: "Animals Emoji"; glyph: "🐏" }
ListElement { section: "Animals Emoji"; glyph: "🐀" }
ListElement { section: "Animals Emoji"; glyph: "🐃" }
ListElement { section: "Animals Emoji"; glyph: "🐅" }
ListElement { section: "Animals Emoji"; glyph: "🐇" }
ListElement { section: "Animals Emoji"; glyph: "🐉" }
ListElement { section: "Animals Emoji"; glyph: "🐎" }
ListElement { section: "Animals Emoji"; glyph: "🐐" }
ListElement { section: "Animals Emoji"; glyph: "🐓" }
ListElement { section: "Animals Emoji"; glyph: "🐕" }
ListElement { section: "Animals Emoji"; glyph: "🐖" }
ListElement { section: "Animals Emoji"; glyph: "🐁" }
ListElement { section: "Animals Emoji"; glyph: "🐂" }
ListElement { section: "Animals Emoji"; glyph: "🐲" }
ListElement { section: "Animals Emoji"; glyph: "🐡" }
ListElement { section: "Animals Emoji"; glyph: "🐊" }
ListElement { section: "Animals Emoji"; glyph: "🐫" }
ListElement { section: "Animals Emoji"; glyph: "🐪" }
ListElement { section: "Animals Emoji"; glyph: "🐆" }
ListElement { section: "Animals Emoji"; glyph: "🐈" }
ListElement { section: "Animals Emoji"; glyph: "🐩" }
ListElement { section: "Animals Emoji"; glyph: "🐾" }
ListElement { section: "Transport and Map"; glyph: "🚀" } ListElement { section: "Transport and Map"; glyph: "🚀" }
ListElement { section: "Transport and Map"; glyph: "🚃" } ListElement { section: "Transport and Map"; glyph: "🚃" }
@ -137,6 +242,7 @@ Component {
ListElement { section: "Horoscope Signs"; glyph: "♒" } ListElement { section: "Horoscope Signs"; glyph: "♒" }
ListElement { section: "Horoscope Signs"; glyph: "♓" } ListElement { section: "Horoscope Signs"; glyph: "♓" }
} }
delegate: BackgroundItem { delegate: BackgroundItem {
width: gridView.cellWidth width: gridView.cellWidth
height: gridView.cellHeight height: gridView.cellHeight
@ -144,21 +250,21 @@ Component {
Label { Label {
text: glyph text: glyph
font.pixelSize: Theme.fontSizeLarge font.pixelSize: Theme.fontSizeLarge
color: (highlighted ? Theme.secondaryHighlightColor : Theme.secondaryColor) color: highlighted ? Theme.secondaryHighlightColor : Theme.secondaryColor
anchors.centerIn: parent anchors.centerIn: parent
} }
onClicked: { onClicked: {
var cursorPosition = toot.cursorPosition var cursorPosition = toot.cursorPosition
toot.text = toot.text.substring( toot.text = toot.text.substring(
0, cursorPosition) + model.glyph + toot.text.substring( 0, cursorPosition) + model.glyph + toot.text.substring(
cursorPosition) cursorPosition)
toot.cursorPosition = cursorPosition + model.glyph.length toot.cursorPosition = cursorPosition + model.glyph.length
emoticonsDialog.canAccept = true emojiDialog.canAccept = true
emoticonsDialog.accept() emojiDialog.accept()
} }
} }
VerticalScrollDecorator { flickable: gridView }
VerticalScrollDecorator {flickable: listEmojis }
} }
} }
} }

View file

@ -5,8 +5,9 @@ import Sailfish.Silica 1.0
DockedPanel { DockedPanel {
id: root id: root
dock: Dock.Top dock: Dock.Top
width: parent.width width: isPortrait ? parent.width : Theme.buttonWidthLarge * 1.5
height: content.height height: content.height
anchors.horizontalCenter: parent.horizontalCenter
Rectangle { Rectangle {
id: content id: content

View file

@ -10,16 +10,14 @@ BackgroundItem {
width: parent.width width: parent.width
height: Theme.itemSizeMedium height: Theme.itemSizeMedium
Rectangle { Item {
id: avatar id: avatar
color: "transparent"
width: Theme.itemSizeExtraSmall width: Theme.itemSizeExtraSmall
height: width height: width
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: Theme.horizontalPageMargin anchors.leftMargin: Theme.horizontalPageMargin
Image { Image {
id: img id: img
opacity: status === Image.Ready ? 1.0 : 0.0 opacity: status === Image.Ready ? 1.0 : 0.0
@ -50,13 +48,14 @@ BackgroundItem {
"following_count": model.account_following_count, "following_count": model.account_following_count,
"statuses_count": model.account_statuses_count, "statuses_count": model.account_statuses_count,
"locked": model.account_locked, "locked": model.account_locked,
"bot": model.account_bot "bot": model.account_bot,
"group": model.account_group
}) })
} }
} }
Item { Item {
id: userdescription id: userDescription
height: account_acct.height + display_name.height height: account_acct.height + display_name.height
anchors.left: avatar.right anchors.left: avatar.right
anchors.leftMargin: Theme.paddingLarge anchors.leftMargin: Theme.paddingLarge
@ -72,7 +71,6 @@ BackgroundItem {
truncationMode: TruncationMode.Fade truncationMode: TruncationMode.Fade
width: parent.width - Theme.paddingMedium width: parent.width - Theme.paddingMedium
anchors.top: parent.top anchors.top: parent.top
} }
Label { Label {

View file

@ -79,7 +79,7 @@ Item {
} }
} }
MyImage { MyMedia {
id: placeholder1 id: placeholder1
width: 2 width: 2
height: 1 height: 1
@ -98,7 +98,7 @@ Item {
} }
} }
MyImage { MyMedia {
id: placeholder2 id: placeholder2
width: 2 width: 2
height: 1 height: 1
@ -117,7 +117,7 @@ Item {
} }
} }
MyImage { MyMedia {
id: placeholder3 id: placeholder3
width: 2 width: 2
height: 1 height: 1
@ -136,7 +136,7 @@ Item {
} }
} }
MyImage { MyMedia {
id: placeholder4 id: placeholder4
width: 2 width: 2
height: 1 height: 1

View file

@ -1,6 +1,6 @@
import QtQuick 2.0 import QtQuick 2.0
import Sailfish.Silica 1.0 import Sailfish.Silica 1.0
import QtMultimedia 5.0 import QtMultimedia 5.6
FullscreenContentPage { FullscreenContentPage {
@ -21,15 +21,17 @@ FullscreenContentPage {
} else { } else {
video.source = mediaURL video.source = mediaURL
video.fillMode = VideoOutput.PreserveAspectFit video.fillMode = VideoOutput.PreserveAspectFit
video.play()
videoFlickable.visible = true videoFlickable.visible = true
playerIcon.visible = true
playerProgress.visible = true
video.play()
hideTimer.start()
} }
} }
Flickable { SilicaFlickable {
id: videoFlickable id: videoFlickable
visible: false visible: false
clip: true
contentWidth: imageContainer.width contentWidth: imageContainer.width
contentHeight: imageContainer.height contentHeight: imageContainer.height
anchors.fill: parent anchors.fill: parent
@ -84,49 +86,27 @@ FullscreenContentPage {
} }
} }
onStopped: function() { onStopped: function() {
if (type != 'video') if (type == 'gifv') {
video.play() video.play()
else } else {
video.stop() video.stop()
} overlayIcons.active = true
hideTimer.stop()
IconButton {
id: playerIcon
icon.source: "image://theme/icon-m-play"
anchors {
left: parent.left
bottom: parent.bottom
leftMargin: Theme.horizontalPageMargin
bottomMargin: Theme.horizontalPageMargin
}
onClicked: function() {
if (video.playbackState === MediaPlayer.PlayingState)
video.pause()
else
video.play()
} }
} }
ProgressBar {
id: playerProgress
indeterminate: true
width: 400
anchors {
verticalCenter: playerIcon.verticalCenter
left: playerIcon.right
right: parent.right
rightMargin: Theme.horizontalPageMargin + Theme.iconSizeMedium
bottomMargin: Theme.horizontalPageMargin
}
}
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: function() { onClicked: function() {
if (video.playbackState === MediaPlayer.PlayingState) if (video.playbackState === MediaPlayer.PlayingState) {
video.pause() video.pause()
else overlayIcons.active = true
hideTimer.stop()
} else {
video.play() video.play()
hideTimer.start()
}
} }
} }
@ -155,12 +135,11 @@ FullscreenContentPage {
} }
Flickable { SilicaFlickable {
id: imageFlickable id: imageFlickable
visible: false visible: false
contentWidth: imageContainer.width contentWidth: imageContainer.width
contentHeight: imageContainer.height contentHeight: imageContainer.height
clip: true
anchors.fill: parent anchors.fill: parent
onHeightChanged: if (imagePreview.status === Image.Ready) { onHeightChanged: if (imagePreview.status === Image.Ready) {
imagePreview.fitToScreen() imagePreview.fitToScreen()
@ -224,7 +203,6 @@ FullscreenContentPage {
property real minScale: 1.0 property real minScale: 1.0
property real maxScale: 3.0 property real maxScale: 3.0
opacity: 0.3
anchors.fill: parent anchors.fill: parent
enabled: imagePreview.status === Image.Ready enabled: imagePreview.status === Image.Ready
pinch.target: imagePreview pinch.target: imagePreview
@ -250,6 +228,11 @@ FullscreenContentPage {
property: "scale" property: "scale"
from: imagePreview.scale from: imagePreview.scale
} }
MouseArea {
anchors.fill: parent
onClicked: overlayIcons.active = !overlayIcons.active
}
} }
} }
@ -292,32 +275,86 @@ FullscreenContentPage {
} }
} }
Item {
id: overlayIcons
property bool active: true
enabled: active
anchors.fill: parent
opacity: active ? 1.0 : 0.0
Behavior on opacity { FadeAnimator {}}
IconButton { IconButton {
id: dismissBtn y: Theme.paddingLarge
icon.source: "image://theme/icon-m-dismiss" icon.source: "image://theme/icon-m-dismiss"
onClicked: pageStack.pop()
anchors { anchors {
top: parent.top
topMargin: Theme.horizontalPageMargin
right: parent.right right: parent.right
rightMargin: Theme.horizontalPageMargin rightMargin: Theme.horizontalPageMargin
} }
onClicked: pageStack.pop()
} }
IconButton { IconButton {
id: mediaDlBtn id: mediaDlBtn
icon.source: "image://theme/icon-m-cloud-download"
anchors { anchors {
right: parent.right right: parent.right
rightMargin: Theme.horizontalPageMargin rightMargin: Theme.horizontalPageMargin
bottom: parent.bottom bottom: parent.bottom
bottomMargin: Theme.horizontalPageMargin bottomMargin: Theme.horizontalPageMargin
} }
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])
} }
} }
IconButton {
id: playerIcon
visible: false
icon.source: "image://theme/icon-m-play"
anchors {
left: parent.left
bottom: parent.bottom
leftMargin: Theme.horizontalPageMargin
bottomMargin: Theme.horizontalPageMargin
}
onClicked: function() {
if (video.playbackState === MediaPlayer.PlayingState) {
video.pause()
hideTimer.stop()
} else {
video.play()
hideTimer.start()
}
}
}
ProgressBar {
id: playerProgress
visible: false
indeterminate: true
width: 400
anchors {
verticalCenter: playerIcon.verticalCenter
left: playerIcon.right
right: parent.right
rightMargin: Theme.horizontalPageMargin + Theme.iconSizeMedium
bottomMargin: Theme.horizontalPageMargin
}
}
Timer {
id: hideTimer
running: false
interval: 2000
onTriggered: {
overlayIcons.active = !overlayIcons.active
}
}
}
VerticalScrollDecorator { flickable: imageFlickable } VerticalScrollDecorator { flickable: imageFlickable }
} }

View file

@ -48,9 +48,9 @@ Item {
width: parent.width - Theme.paddingMedium width: parent.width - Theme.paddingMedium
truncationMode: TruncationMode.Fade truncationMode: TruncationMode.Fade
anchors { anchors {
top: lblName.bottom
left: parent.left left: parent.left
leftMargin: Theme.paddingMedium leftMargin: Theme.paddingMedium
top: lblName.bottom
} }
} }

View file

@ -5,8 +5,8 @@ import Sailfish.Silica 1.0
Item { Item {
id: miniStatus id: miniStatus
visible: true visible: true
height: icon.height+Theme.paddingMedium
width: parent.width width: parent.width
height: icon.height+Theme.paddingMedium
Icon { Icon {
id: icon id: icon
@ -18,9 +18,9 @@ Item {
anchors { anchors {
top: parent.top top: parent.top
topMargin: Theme.paddingMedium topMargin: Theme.paddingMedium
bottomMargin: Theme.paddingMedium
left: parent.left left: parent.left
leftMargin: Theme.horizontalPageMargin + Theme.iconSizeMedium - width leftMargin: Theme.horizontalPageMargin + Theme.iconSizeMedium - width
bottomMargin: Theme.paddingMedium
} }
} }

View file

@ -9,8 +9,6 @@ SilicaListView {
property string type property string type
property string title property string title
property string vwPlaceholderText: qsTr("Loading")
property string vwPlaceholderHint: qsTr("please wait...")
property string description property string description
property ListModel mdl: [] property ListModel mdl: []
property variant params: [] property variant params: []
@ -29,7 +27,6 @@ SilicaListView {
onNotify: { onNotify: {
console.log(what + " - " + num) console.log(what + " - " + num)
} }
signal openDrawer (bool setDrawer) signal openDrawer (bool setDrawer)
onOpenDrawer: { onOpenDrawer: {
//console.log("Open drawer: " + setDrawer) //console.log("Open drawer: " + setDrawer)
@ -39,28 +36,41 @@ SilicaListView {
console.log("LIST send signal emitted with notice: " + notice) console.log("LIST send signal emitted with notice: " + notice)
} }
header: PageHeader { header: PageHeader {
title: myList.title title: myList.title
description: myList.description description: myList.description
} }
BusyIndicator { BusyLabel {
size: BusyIndicatorSize.Large id: myListBusyLabel
running: myList.model.count === 0 && !viewPlaceHolder.visible running: model.count === 0
anchors.centerIn: parent anchors {
horizontalCenter: parent.horizontalCenter
verticalCenter: parent.verticalCenter
}
Timer {
interval: 5000
running: true
onTriggered: {
myListBusyLabel.visible = false
loadStatusPlaceholder.visible = true
}
}
} }
ViewPlaceholder { ViewPlaceholder {
id: viewPlaceHolder id: loadStatusPlaceholder
visible: false
enabled: model.count === 0 enabled: model.count === 0
text: vwPlaceholderText text: qsTr("Nothing found")
hintText: vwPlaceholderHint
} }
PullDownMenu { PullDownMenu {
id: mainPulleyMenu
MenuItem { MenuItem {
text: qsTr("Settings") text: qsTr("Settings")
visible: !profilePage
onClicked: { onClicked: {
pageStack.push(Qt.resolvedUrl("../SettingsPage.qml"), {}) pageStack.push(Qt.resolvedUrl("../SettingsPage.qml"), {})
} }
@ -68,6 +78,7 @@ SilicaListView {
MenuItem { MenuItem {
text: qsTr("New Toot") text: qsTr("New Toot")
visible: !profilePage
onClicked: { onClicked: {
pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), { pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), {
headerTitle: qsTr("New Toot"), headerTitle: qsTr("New Toot"),
@ -77,7 +88,15 @@ SilicaListView {
} }
MenuItem { MenuItem {
text: qsTr("Load more") text: qsTr("Open in Browser")
visible: !mainPage
onClicked: {
Qt.openUrlExternally(url)
}
}
MenuItem {
text: qsTr("Reload")
onClicked: { onClicked: {
loadData("prepend") loadData("prepend")
} }
@ -116,10 +135,13 @@ SilicaListView {
} }
BusyIndicator { BusyIndicator {
running: loadStarted
visible: myListBusyLabel.running ? false : true
size: BusyIndicatorSize.Small size: BusyIndicatorSize.Small
running: loadStarted; anchors {
anchors.verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter horizontalCenter: parent.horizontalCenter
}
} }
} }
@ -163,10 +185,10 @@ 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})
} }
@ -180,7 +202,8 @@ SilicaListView {
'model' : model, 'model' : model,
'mode' : mode, 'mode' : mode,
'conf' : Logic.conf 'conf' : Logic.conf
}; }
console.log(JSON.stringify(msg)) console.log(JSON.stringify(msg))
if (type !== "") if (type !== "")
worker.sendMessage(msg) worker.sendMessage(msg)

View file

@ -4,20 +4,39 @@ import QtMultimedia 5.0
Item { Item {
id: myImage id: myMedia
property string type : "" property string type : ""
property string previewURL: "" property string previewURL: ""
property string mediaURL: "" property string mediaURL: ""
Rectangle { Rectangle {
opacity: 0.2 opacity: 0.4
color: Theme.highlightDimmerColor color: Theme.highlightDimmerColor
anchors.fill: parent anchors.fill: parent
} }
Image { Image {
source: "image://theme/icon-m-image" visible: type == 'image'
opacity: img.status === Image.Ready ? 0.0 : 1.0
Behavior on opacity { FadeAnimator {} }
source: "image://theme/icon-m-image?"
anchors.centerIn: parent
}
Image {
visible: type == 'video' || type == "gifv"
opacity: img.status === Image.Ready ? 0.0 : 1.0
Behavior on opacity { FadeAnimator {} }
source: "image://theme/icon-m-file-video?"
anchors.centerIn: parent
}
Image {
visible: type == 'audio'
//opacity: img.status === Image.Ready ? 0.0 : 1.0
Behavior on opacity { FadeAnimator {} }
source: "image://theme/icon-m-file-audio?"
anchors.centerIn: parent anchors.centerIn: parent
} }
@ -31,6 +50,7 @@ Item {
Image { Image {
id: img id: img
visible: type != 'audio'
asynchronous: true asynchronous: true
opacity: status === Image.Ready ? 1.0 : 0.0 opacity: status === Image.Ready ? 1.0 : 0.0
Behavior on opacity { FadeAnimator {} } Behavior on opacity { FadeAnimator {} }
@ -59,30 +79,31 @@ Item {
Image { Image {
id: videoIcon id: videoIcon
visible: type === "video" || type === "gifv" visible: type === "video" || type === "gifv"
source: "image://theme/icon-l-play" source: "image://theme/icon-l-play?"
anchors.centerIn: parent anchors.centerIn: parent
} }
BusyIndicator { BusyIndicator {
id: mediaLoader id: mediaLoader
visible: type != 'audio'
size: BusyIndicatorSize.Large size: BusyIndicatorSize.Large
running: img.status !== Image.Ready running: img.status !== Image.Ready
opacity: img.status === Image.Ready ? 0.0 : 1.0 opacity: img.status === Image.Ready ? 0.0 : 1.0
anchors.verticalCenter: parent.verticalCenter anchors {
anchors.horizontalCenter: parent.horizontalCenter verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
} }
Rectangle { Rectangle {
id: mediaWarning id: mediaWarning
color: Theme.highlightDimmerColor color: Theme.highlightDimmerColor
visible: typeof status_sensitive != 'undefined' && status_sensitive ? true : false visible: typeof status_sensitive != "undefined" && status_sensitive ? true : false
anchors.fill: parent
Image { Image {
source: "image://theme/icon-l-attention?"+Theme.highlightColor source: "image://theme/icon-l-attention?"+Theme.highlightColor
anchors.centerIn: parent anchors.centerIn: parent
} }
anchors.fill: parent
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: parent.visible = false onClicked: parent.visible = false

View file

@ -17,7 +17,7 @@ SilicaGridView {
ListModel { ListModel {
id: listModel id: listModel
ListElement { ListElement {
icon: "image://theme/icon-m-home" icon: "image://theme/icon-m-home?"
slug: "home" slug: "home"
name: "Home" name: "Home"
active: true active: true
@ -25,14 +25,14 @@ SilicaGridView {
} }
ListElement { ListElement {
icon: "image://theme/icon-m-alarm" icon: "image://theme/icon-m-alarm?"
slug: "notifications" slug: "notifications"
name: "Notifications" name: "Notifications"
active: false active: false
} }
ListElement { ListElement {
icon: "image://theme/icon-m-whereami" icon: "image://theme/icon-m-whereami?"
slug: "local" slug: "local"
name: "Local" name: "Local"
active: false active: false
@ -40,7 +40,7 @@ SilicaGridView {
} }
ListElement { ListElement {
icon: "image://theme/icon-m-website" icon: "image://theme/icon-m-website?"
slug: "federated" slug: "federated"
name: "Federated" name: "Federated"
active: false active: false
@ -48,7 +48,7 @@ SilicaGridView {
} }
ListElement { ListElement {
icon: "image://theme/icon-m-search" icon: "image://theme/icon-m-search?"
slug: "search" slug: "search"
name: "Search" name: "Search"
active: false active: false
@ -100,54 +100,19 @@ SilicaGridView {
} }
} }
OpacityRampEffect {
sourceItem: label
offset: 0.5
}
ColorOverlay {
source: image
color: (highlighted ? Theme.highlightColor : (model.active ? Theme.primaryColor : Theme.secondaryHighlightColor))
anchors.fill: image
}
Image { Image {
id: image id: image
visible: false visible: false
source: model.icon // +'?'+ (highlighted ? Theme.highlightColor : (model.active ? Theme.primaryColor : Theme.secondaryHighlightColor)) source: model.icon
sourceSize.width: Theme.iconSizeMedium sourceSize.width: Theme.iconSizeMedium
sourceSize.height: Theme.iconSizeMedium sourceSize.height: Theme.iconSizeMedium
anchors.centerIn: parent anchors.centerIn: parent
} }
Text { ColorOverlay {
visible: false source: image
text: model.name color: (highlighted ? Theme.highlightColor : (model.active ? Theme.secondaryHighlightColor : Theme.primaryColor))
font.pixelSize: Theme.fontSizeExtraSmall/2 anchors.fill: image
color: (highlighted
? Theme.highlightColor
: (model.active ? Theme.primaryColor : Theme.secondaryHighlightColor))
horizontalAlignment: Text.AlignHCenter
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
bottomMargin: Theme.paddingSmall
}
}
Label {
id: label
visible: false
color: (highlighted ? Theme.highlightColor : Theme.secondaryHighlightColor)
text: {
return model.name.toUpperCase();
}
font.pixelSize: Theme.fontSizeExtraSmall
font.family: Theme.fontFamilyHeading
width: parent.width
horizontalAlignment : Text.AlignHCenter
anchors.bottom: parent.bottom
} }
onClicked: { onClicked: {

View file

@ -12,14 +12,14 @@ Item {
property string bg: "" property string bg: ""
width: parent.width width: parent.width
height: avatarImage.height + Theme.paddingLarge*3 + infoLbl.height height: isPortrait ? (avatarImage.height + Theme.paddingLarge*3 + infoLbl.height) : (avatarImage.height + Theme.paddingLarge*2.5 + infoLbl.height)
Rectangle { Rectangle {
id: bgImage id: bgImage
opacity: 0.2 opacity: 0.7
gradient: Gradient { gradient: Gradient {
GradientStop { position: 0.0; color: Theme.highlightBackgroundColor } GradientStop { position: 0.0; color: Theme.highlightDimmerColor }
GradientStop { position: 1.0; color: Theme.highlightBackgroundColor } GradientStop { position: 2.0; color: Theme.highlightBackgroundColor }
} }
anchors.fill: parent anchors.fill: parent
@ -27,6 +27,7 @@ Item {
asynchronous: true asynchronous: true
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
source: bg source: bg
opacity: 0.6
anchors.fill: parent anchors.fill: parent
} }
} }
@ -35,11 +36,9 @@ Item {
id: avatarImage id: avatarImage
asynchronous: true asynchronous: true
source: if (avatarImage.status === Image.Error) source: if (avatarImage.status === Image.Error)
source = "../../images/icon-l-profile.svg?" + (pressed source = "../../images/icon-l-profile.svg?" + Theme.primaryColor
? Theme.highlightColor
: Theme.primaryColor)
else image else image
width: Theme.iconSizeLarge width: isPortrait ? Theme.iconSizeLarge : Theme.iconSizeExtraLarge
height: width height: width
anchors { anchors {
left: parent.left left: parent.left
@ -96,7 +95,7 @@ Item {
color: Theme.secondaryHighlightColor color: Theme.secondaryHighlightColor
truncationMode: TruncationMode.Fade truncationMode: TruncationMode.Fade
width: parent.width width: parent.width
height: description === "" ? 0 : contentHeight height: contentHeight
horizontalAlignment: Text.AlignRight horizontalAlignment: Text.AlignRight
} }
} }
@ -108,7 +107,7 @@ Item {
height: followed_by || locked || bot || group ? Theme.iconSizeSmall + Theme.paddingSmall : 0 height: followed_by || locked || bot || group ? Theme.iconSizeSmall + Theme.paddingSmall : 0
anchors { anchors {
top: avatarImage.bottom top: avatarImage.bottom
topMargin: Theme.paddingMedium topMargin: isPortrait ? Theme.paddingMedium : 0
left: parent.left left: parent.left
leftMargin: Theme.horizontalPageMargin leftMargin: Theme.horizontalPageMargin
right: parent.right right: parent.right
@ -183,8 +182,10 @@ Item {
text: qsTr("Bot") text: qsTr("Bot")
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
color: Theme.primaryColor color: Theme.primaryColor
anchors.horizontalCenter: parent.horizontalCenter anchors {
anchors.verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter
verticalCenter: parent.verticalCenter
}
} }
} }
} }

View file

@ -16,12 +16,12 @@ FullscreenContentPage {
IconButton { IconButton {
icon.source: "image://theme/icon-m-dismiss" icon.source: "image://theme/icon-m-dismiss"
onClicked: pageStack.pop()
anchors { anchors {
top: profileImage.top top: profileImage.top
topMargin: Theme.horizontalPageMargin topMargin: Theme.horizontalPageMargin
right: parent.right right: parent.right
rightMargin: Theme.horizontalPageMargin rightMargin: Theme.horizontalPageMargin
} }
onClicked: pageStack.pop()
} }
} }

View file

@ -9,7 +9,6 @@ BackgroundItem {
signal send (string notice) signal send (string notice)
signal navigateTo(string link) signal navigateTo(string link)
width: parent.width
height: if (myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) { height: if (myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) {
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)
@ -19,7 +18,7 @@ BackgroundItem {
id: bgDirect id: bgDirect
x: 0 x: 0
y: 0 y: 0
visible: status_visibility === "direct" visible: model.status_visibility === "direct"
width: parent.width width: parent.width
height: parent.height height: parent.height
opacity: 0.3 opacity: 0.3
@ -43,7 +42,6 @@ BackgroundItem {
// Account avatar // Account avatar
Image { Image {
id: avatar id: avatar
visible: true
opacity: status === Image.Ready ? 1.0 : 0.0 opacity: status === Image.Ready ? 1.0 : 0.0
Behavior on opacity { FadeAnimator {} } Behavior on opacity { FadeAnimator {} }
asynchronous: true asynchronous: true
@ -59,9 +57,7 @@ BackgroundItem {
} }
onStatusChanged: { onStatusChanged: {
if (avatar.status === Image.Error) if (avatar.status === Image.Error)
source = "../../images/icon-m-profile.svg?" + (pressed source = "../../images/icon-m-profile.svg?" + Theme.primaryColor
? Theme.highlightColor
: Theme.primaryColor)
} }
MouseArea { MouseArea {
@ -98,7 +94,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: "image://theme/icon-m-mail?" + Theme.primaryColor
color: Theme.primaryColor color: Theme.primaryColor
anchors { anchors {
horizontalCenter: avatar.horizontalCenter horizontalCenter: avatar.horizontalCenter
@ -192,7 +188,7 @@ BackgroundItem {
left: miniHeader.left left: miniHeader.left
leftMargin: Theme.paddingMedium leftMargin: Theme.paddingMedium
right: miniHeader.right right: miniHeader.right
rightMargin: Theme.horizontalPageMargin rightMargin: Theme.horizontalPageMargin + Theme.paddingMedium
top: miniHeader.bottom top: miniHeader.bottom
topMargin: Theme.paddingSmall topMargin: Theme.paddingSmall
bottomMargin: Theme.paddingLarge bottomMargin: Theme.paddingLarge
@ -202,7 +198,6 @@ BackgroundItem {
console.log(link) console.log(link)
console.log(JSON.stringify(test)) console.log(JSON.stringify(test))
console.log(JSON.stringify(test.length)) console.log(JSON.stringify(test.length))
if (test.length === 5 && (test[3] === "tags" || test[3] === "tag") ) { if (test.length === 5 && (test[3] === "tags" || test[3] === "tag") ) {
pageStack.pop(pageStack.find(function(page) { pageStack.pop(pageStack.find(function(page) {
var check = page.isFirstPage === true; var check = page.isFirstPage === true;
@ -255,21 +250,20 @@ BackgroundItem {
anchors.fill: parent anchors.fill: parent
onClicked: parent.visible = false onClicked: parent.visible = false
} }
} }
} }
// Displays media in Toots // Displays media in Toots
MediaBlock { MediaBlock {
id: media id: media
visible: if (myList.type === "notifications" && ( type === "favourite" || type === "reblog" )) { visible: (myList.type === "notifications" && ( type === "favourite" || type === "reblog" )) ? false : true
false
} 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: lblContent.left
leftMargin: isPortrait ? 0 : Theme.itemSizeSmall
right: lblContent.right right: lblContent.right
rightMargin: isPortrait ? 0 : Theme.itemSizeLarge * 1.2
top: lblContent.bottom top: lblContent.bottom
topMargin: Theme.paddingMedium topMargin: Theme.paddingMedium
bottomMargin: Theme.paddingLarge bottomMargin: Theme.paddingLarge
@ -283,7 +277,7 @@ BackgroundItem {
MenuItem { MenuItem {
id: mnuBoost id: mnuBoost
visible: model.type !== "follow" visible: model.type !== "follow"
enabled: status_visibility !== "direct" enabled: model.status_visibility !== "direct"
text: typeof model.status_reblogged !== "undefined" && model.status_reblogged ? qsTr("Unboost") : qsTr("Boost") text: typeof model.status_reblogged !== "undefined" && model.status_reblogged ? qsTr("Unboost") : qsTr("Boost")
onClicked: { onClicked: {
var status = typeof model.status_reblogged !== "undefined" && model.status_reblogged var status = typeof model.status_reblogged !== "undefined" && model.status_reblogged
@ -301,7 +295,7 @@ BackgroundItem {
Icon { Icon {
id: icRT id: icRT
source: "image://theme/icon-s-retweet?" + (!model.status_reblogged ? Theme.highlightColor : Theme.primaryColor) source: "image://theme/icon-s-retweet?" + (!model.status_reblogged ? Theme.highlightColor : Theme.primaryColor)
width: Theme.iconSizeExtraSmall width: Theme.iconSizeSmall
height: width height: width
anchors { anchors {
leftMargin: Theme.horizontalPageMargin leftMargin: Theme.horizontalPageMargin
@ -311,8 +305,8 @@ BackgroundItem {
} }
Label { Label {
text: status_reblogs_count // from API.js text: status_reblogs_count
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeSmall
color: !model.status_reblogged ? Theme.highlightColor : Theme.primaryColor color: !model.status_reblogged ? Theme.highlightColor : Theme.primaryColor
anchors { anchors {
left: icRT.right left: icRT.right
@ -342,18 +336,18 @@ BackgroundItem {
Icon { Icon {
id: icFA id: icFA
source: "image://theme/icon-s-favorite?" + (!model.status_favourited ? Theme.highlightColor : Theme.primaryColor) source: "image://theme/icon-s-favorite?" + (!model.status_favourited ? Theme.highlightColor : Theme.primaryColor)
width: Theme.iconSizeExtraSmall width: Theme.iconSizeSmall
height: width height: width
anchors { anchors {
leftMargin: Theme.horizontalPageMargin
left: parent.left left: parent.left
leftMargin: Theme.horizontalPageMargin
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
} }
Label { Label {
text: status_favourites_count text: status_favourites_count
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeSmall
color: !model.status_favourited ? Theme.highlightColor : Theme.primaryColor color: !model.status_favourited ? Theme.highlightColor : Theme.primaryColor
anchors { anchors {
left: icFA.right left: icFA.right
@ -383,7 +377,7 @@ BackgroundItem {
id: icBM id: icBM
source: "../../images/icon-s-bookmark.svg?" source: "../../images/icon-s-bookmark.svg?"
color: !model.status_bookmarked ? Theme.highlightColor : Theme.primaryColor color: !model.status_bookmarked ? Theme.highlightColor : Theme.primaryColor
width: Theme.iconSizeExtraSmall width: Theme.iconSizeSmall
height: width height: width
anchors { anchors {
left: parent.left left: parent.left
@ -393,7 +387,6 @@ BackgroundItem {
} }
} }
MenuItem { MenuItem {
id: mnuMention id: mnuMention
visible: model.type === "follow" visible: model.type === "follow"
@ -409,7 +402,7 @@ BackgroundItem {
Icon { Icon {
id: icMT id: icMT
source: "image://theme/icon-s-chat?" + (!model.status_favourited ? Theme.highlightColor : Theme.primaryColor) source: "image://theme/icon-s-chat?" + (!model.status_favourited ? Theme.highlightColor : Theme.primaryColor)
width: Theme.iconSizeExtraSmall width: Theme.iconSizeSmall
height: width height: width
anchors { anchors {
left: parent.left left: parent.left
@ -420,21 +413,39 @@ BackgroundItem {
} }
} }
// Open ConversationPage and show other Toots in thread (if available) // Open ConversationPage and show other Toots in thread (if available) or ProfilePage if new Follower
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))
if (model.type !== "follow") {
pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), { pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), {
headerTitle: qsTr("Conversation"), headerTitle: qsTr("Conversation"),
"toot_id": status_id, "status_id": status_id,
"toot_url": status_url, "status_url": status_url,
"toot_uri": status_uri, "status_uri": status_uri,
"description": '@'+account_acct, "username": '@'+account_acct,
mdl: m, mdl: m,
type: "reply" type: "reply"
}) })
} else pageStack.push(Qt.resolvedUrl("../ProfilePage.qml"), {
"display_name": model.account_display_name,
"username": model.account_acct,
"user_id": model.account_id,
"profileImage": model.account_avatar,
"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
} )
} }
onPressAndHold: { onPressAndHold: {
console.log(JSON.stringify(mdl.get(index))) console.log(JSON.stringify(mdl.get(index)))
mnu.open(delegate) mnu.open(delegate)

View file

@ -25,7 +25,10 @@ BuildRequires: pkgconfig(sailfishapp) >= 1.0.2
BuildRequires: pkgconfig(Qt5Core) BuildRequires: pkgconfig(Qt5Core)
BuildRequires: pkgconfig(Qt5Qml) BuildRequires: pkgconfig(Qt5Qml)
BuildRequires: pkgconfig(Qt5Quick) BuildRequires: pkgconfig(Qt5Quick)
BuildRequires: pkgconfig(Qt5DBus)
BuildRequires: pkgconfig(Qt5Multimedia)
BuildRequires: pkgconfig(nemonotifications-qt5) BuildRequires: pkgconfig(nemonotifications-qt5)
BuildRequires: pkgconfig(openssl)
BuildRequires: desktop-file-utils BuildRequires: desktop-file-utils
%description %description

View file

@ -25,12 +25,14 @@ PkgConfigBR:
- Qt5Core - Qt5Core
- Qt5Qml - Qt5Qml
- Qt5Quick - Qt5Quick
- Qt5DBus
- Qt5Multimedia
- nemonotifications-qt5 - nemonotifications-qt5
- openssl
# Build dependencies without a pkgconfig setup can be listed here # Build dependencies without a pkgconfig setup can be listed here
# PkgBR: # PkgBR:
# - package-needed-to-build # - qt5-qtmultimedia-plugin-mediaservice-gstmediaplayer
# Runtime dependencies which are not automatically detected # Runtime dependencies which are not automatically detected
Requires: Requires:

View file

@ -24,7 +24,7 @@ class FileDownloader : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit FileDownloader(QQmlEngine *engine, QObject *parent = 0); explicit FileDownloader(QQmlEngine *engine, QObject *parent = nullptr);
Q_INVOKABLE void downloadFile(QUrl url, QString filename); Q_INVOKABLE void downloadFile(QUrl url, QString filename);
Q_INVOKABLE void open(QString filename); Q_INVOKABLE void open(QString filename);

View file

@ -8,7 +8,6 @@
#include <QtCore/QFile> #include <QtCore/QFile>
#include <QtCore/QFileInfo> #include <QtCore/QFileInfo>
//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(nullptr), m_reply(nullptr) { ImageUploader::ImageUploader(QObject *parent) : QObject(parent), m_networkAccessManager(nullptr), m_reply(nullptr) {
@ -101,12 +100,8 @@ void ImageUploader::upload() {
//imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(fileInfo)); //imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(fileInfo));
//POST data //POST data
QNetworkRequest request(m_uploadUrl); QNetworkRequest request(m_uploadUrl);
request.setRawHeader("Authorization", m_authorizationHeader); request.setRawHeader("Authorization", m_authorizationHeader);
m_reply = m_networkAccessManager->post(request, multiPart); m_reply = m_networkAccessManager->post(request, multiPart);
@ -114,8 +109,6 @@ void ImageUploader::upload() {
connect(m_reply, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(uploadProgress(qint64,qint64))); connect(m_reply, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(uploadProgress(qint64,qint64)));
connect(m_reply, SIGNAL(finished()), this, SLOT(replyFinished())); connect(m_reply, SIGNAL(finished()), this, SLOT(replyFinished()));
//connect(m_reply, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(uploadProgress(qint64,qint64))); //connect(m_reply, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(uploadProgress(qint64,qint64)));
//connect(m_reply, SIGNAL(finished()), this, SLOT(replyFinished()));*/ //connect(m_reply, SIGNAL(finished()), this, SLOT(replyFinished()));*/
} }

View file

@ -12,7 +12,7 @@ class ImageUploader : public QObject
Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged) Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged)
public: public:
explicit ImageUploader(QObject *parent = 0); explicit ImageUploader(QObject *parent = nullptr);
~ImageUploader(); ~ImageUploader();
Q_INVOKABLE void setFile(const QString &fileName); Q_INVOKABLE void setFile(const QString &fileName);

View file

@ -29,16 +29,14 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<extracomment>placeholderText in Toot content warning panel</extracomment>
<translation>Inhaltswarnung</translation> <translation>Inhaltswarnung</translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<extracomment>placeholderText in Toot text panel</extracomment>
<translation>Was gibt&apos;s Neues?</translation> <translation>Was gibt&apos;s Neues?</translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Löschen</translation>
</message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation>Öffentlich</translation> <translation>Öffentlich</translation>
@ -68,6 +66,10 @@
<source>Hide Reply</source> <source>Hide Reply</source>
<translation>Antwort verbergen</translation> <translation>Antwort verbergen</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation>Im Browser öffnen</translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -128,8 +130,12 @@
<translation>Benachrichtigungen</translation> <translation>Benachrichtigungen</translation>
</message> </message>
<message> <message>
<source>New Toot</source> <source>Local</source>
<translation>Neuer Toot</translation> <translation>Lokal</translation>
</message>
<message>
<source>Federated</source>
<translation>Föderiert</translation>
</message> </message>
<message> <message>
<source>Search</source> <source>Search</source>
@ -140,12 +146,8 @@
<translation>@Benutzer oder #Ausdruck</translation> <translation>@Benutzer oder #Ausdruck</translation>
</message> </message>
<message> <message>
<source>Local</source> <source>New Toot</source>
<translation>Lokal</translation> <translation>Neuer Toot</translation>
</message>
<message>
<source>Federated</source>
<translation>Föderation</translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,26 +174,26 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation>Lade mehr</translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation>Einstellungen</translation> <translation>Einstellungen</translation>
</message> </message>
<message>
<source>Loading</source>
<translation>Wird geladen</translation>
</message>
<message>
<source>please wait...</source>
<translation>bitte warten...</translation>
</message>
<message> <message>
<source>New Toot</source> <source>New Toot</source>
<translation>Neuer Toot</translation> <translation>Neuer Toot</translation>
</message> </message>
<message>
<source>Reload</source>
<translation>Neu laden</translation>
</message>
<message>
<source>Open in Browser</source>
<translation>Im Browser öffnen</translation>
</message>
<message>
<source>Nothing found</source>
<translation>Nichts gefunden</translation>
</message>
</context> </context>
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
@ -230,6 +232,10 @@
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation>Beiträge</translation> <translation>Beiträge</translation>
</message> </message>
<message>
<source>Mention</source>
<translation>Erwähnen</translation>
</message>
<message> <message>
<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>
@ -265,14 +271,6 @@
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Blockieren</translation> <translation>Blockieren</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation>Im Browser öffnen</translation>
</message>
<message>
<source>Mention</source>
<translation>Erwähnen</translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>

View file

@ -29,16 +29,14 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<extracomment>placeholderText in Toot content warning panel</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<extracomment>placeholderText in Toot text panel</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Διαγραφή</translation>
</message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -68,6 +66,10 @@
<source>Hide Reply</source> <source>Hide Reply</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -114,7 +116,7 @@
</message> </message>
<message> <message>
<source>Reload</source> <source>Reload</source>
<translation type="unfinished"></translation> <translation type="unfinished">Επαναφόρτωση</translation>
</message> </message>
</context> </context>
<context> <context>
@ -128,8 +130,12 @@
<translation>Ειδοποιήσεις</translation> <translation>Ειδοποιήσεις</translation>
</message> </message>
<message> <message>
<source>New Toot</source> <source>Local</source>
<translation>Νέος</translation> <translation>Τοπικός</translation>
</message>
<message>
<source>Federated</source>
<translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Search</source> <source>Search</source>
@ -140,12 +146,8 @@
<translation>@χρήστη ή #όρος</translation> <translation>@χρήστη ή #όρος</translation>
</message> </message>
<message> <message>
<source>Local</source> <source>New Toot</source>
<translation>Τοπικός</translation> <translation>Νέος</translation>
</message>
<message>
<source>Federated</source>
<translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,25 +174,25 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation>Φόρτωση περισσοτέρων</translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation>Ρυθμίσεις</translation> <translation>Ρυθμίσεις</translation>
</message> </message>
<message> <message>
<source>Loading</source> <source>New Toot</source>
<translation>Φόρτωση</translation> <translation>Νέος</translation>
</message> </message>
<message> <message>
<source>please wait...</source> <source>Reload</source>
<translation>Φόρτωση περισσοτέρων</translation>
</message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>New Toot</source> <source>Nothing found</source>
<translation>Νέος</translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context> <context>
@ -230,6 +232,10 @@
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation>Κατάσταση</translation> <translation>Κατάσταση</translation>
</message> </message>
<message>
<source>Mention</source>
<translation>Φραγή</translation>
</message>
<message> <message>
<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>
@ -265,14 +271,6 @@
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Φραγή</translation> <translation>Φραγή</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mention</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>
@ -379,7 +377,7 @@
</message> </message>
<message> <message>
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation type="unfinished">Φραγή</translation>
</message> </message>
<message> <message>
<source>Conversation</source> <source>Conversation</source>

View file

@ -29,16 +29,14 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<extracomment>placeholderText in Toot content warning panel</extracomment>
<translation>Escribe aquí tu advertencia</translation> <translation>Escribe aquí tu advertencia</translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<extracomment>placeholderText in Toot text panel</extracomment>
<translation>¿En qué estás pensando?</translation> <translation>¿En qué estás pensando?</translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Borrar</translation>
</message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation>Público</translation> <translation>Público</translation>
@ -68,6 +66,10 @@
<source>Hide Reply</source> <source>Hide Reply</source>
<translation>Cerrar respuesta</translation> <translation>Cerrar respuesta</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation>Abrir en el navegador</translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -128,8 +130,12 @@
<translation>Notificaciones</translation> <translation>Notificaciones</translation>
</message> </message>
<message> <message>
<source>New Toot</source> <source>Local</source>
<translation>Nuevo toot</translation> <translation>Local</translation>
</message>
<message>
<source>Federated</source>
<translation>Federada</translation>
</message> </message>
<message> <message>
<source>Search</source> <source>Search</source>
@ -140,12 +146,8 @@
<translation>@usuario o #término</translation> <translation>@usuario o #término</translation>
</message> </message>
<message> <message>
<source>Local</source> <source>New Toot</source>
<translation>Local</translation> <translation>Nuevo toot</translation>
</message>
<message>
<source>Federated</source>
<translation>Federada</translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,26 +174,26 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation>Cargar más</translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation>Ajustes</translation> <translation>Ajustes</translation>
</message> </message>
<message>
<source>Loading</source>
<translation>Cargando</translation>
</message>
<message>
<source>please wait...</source>
<translation>por favor, espera...</translation>
</message>
<message> <message>
<source>New Toot</source> <source>New Toot</source>
<translation>Nuevo toot</translation> <translation>Nuevo toot</translation>
</message> </message>
<message>
<source>Reload</source>
<translation>Volver a cargar</translation>
</message>
<message>
<source>Open in Browser</source>
<translation>Abrir en el navegador</translation>
</message>
<message>
<source>Nothing found</source>
<translation>No encontrado nada</translation>
</message>
</context> </context>
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
@ -230,6 +232,10 @@
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation>Estados</translation> <translation>Estados</translation>
</message> </message>
<message>
<source>Mention</source>
<translation>Mencionar</translation>
</message>
<message> <message>
<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>
@ -265,14 +271,6 @@
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Bloquear</translation> <translation>Bloquear</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation>Abrir en el navegador</translation>
</message>
<message>
<source>Mention</source>
<translation>Mencionar</translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>

View file

@ -29,16 +29,14 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<extracomment>placeholderText in Toot content warning panel</extracomment>
<translation>Rédigez votre alerte ici</translation> <translation>Rédigez votre alerte ici</translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<extracomment>placeholderText in Toot text panel</extracomment>
<translation>Qu&apos;avez-vous en tête?</translation> <translation>Qu&apos;avez-vous en tête?</translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Supprimer</translation>
</message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation>Public</translation> <translation>Public</translation>
@ -68,6 +66,10 @@
<source>Hide Reply</source> <source>Hide Reply</source>
<translation>Masquer la réponse</translation> <translation>Masquer la réponse</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation>Ouvrir dans le navigateur</translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -128,8 +130,12 @@
<translation>Notifications</translation> <translation>Notifications</translation>
</message> </message>
<message> <message>
<source>New Toot</source> <source>Local</source>
<translation>Nouveau pouet</translation> <translation>Fil public local</translation>
</message>
<message>
<source>Federated</source>
<translation>Fil public global</translation>
</message> </message>
<message> <message>
<source>Search</source> <source>Search</source>
@ -140,12 +146,8 @@
<translation>@personne ou #terme</translation> <translation>@personne ou #terme</translation>
</message> </message>
<message> <message>
<source>Local</source> <source>New Toot</source>
<translation>Fil public local</translation> <translation>Nouveau pouet</translation>
</message>
<message>
<source>Federated</source>
<translation>Fil public global</translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,26 +174,26 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation>Charger plus</translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation>Paramètres</translation> <translation>Paramètres</translation>
</message> </message>
<message>
<source>Loading</source>
<translation>Chargement</translation>
</message>
<message>
<source>please wait...</source>
<translation>patientez...</translation>
</message>
<message> <message>
<source>New Toot</source> <source>New Toot</source>
<translation>Nouveau pouet</translation> <translation>Nouveau pouet</translation>
</message> </message>
<message>
<source>Reload</source>
<translation>Recharger</translation>
</message>
<message>
<source>Open in Browser</source>
<translation>Ouvrir dans le navigateur</translation>
</message>
<message>
<source>Nothing found</source>
<translation>Rien trouvé</translation>
</message>
</context> </context>
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
@ -230,6 +232,10 @@
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation>Pouets</translation> <translation>Pouets</translation>
</message> </message>
<message>
<source>Mention</source>
<translation>Mentionner</translation>
</message>
<message> <message>
<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>
@ -265,14 +271,6 @@
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Bloquer</translation> <translation>Bloquer</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation>Ouvrir dans le navigateur</translation>
</message>
<message>
<source>Mention</source>
<translation>Mentionner</translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>

View file

@ -29,16 +29,14 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<extracomment>placeholderText in Toot content warning panel</extracomment>
<translation>Contenuto avviso</translation> <translation>Contenuto avviso</translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<extracomment>placeholderText in Toot text panel</extracomment>
<translation>A cosa stai pensando?</translation> <translation>A cosa stai pensando?</translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Elimina</translation>
</message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation>Pubblico</translation> <translation>Pubblico</translation>
@ -68,6 +66,10 @@
<source>Hide Reply</source> <source>Hide Reply</source>
<translation>Chuidere risposta</translation> <translation>Chuidere risposta</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation>Aprire nel browser</translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -128,8 +130,12 @@
<translation>Notifiche</translation> <translation>Notifiche</translation>
</message> </message>
<message> <message>
<source>New Toot</source> <source>Local</source>
<translation>Nuovo Toot</translation> <translation>Locale</translation>
</message>
<message>
<source>Federated</source>
<translation>Federazione</translation>
</message> </message>
<message> <message>
<source>Search</source> <source>Search</source>
@ -140,12 +146,8 @@
<translation>@utente o #terme</translation> <translation>@utente o #terme</translation>
</message> </message>
<message> <message>
<source>Local</source> <source>New Toot</source>
<translation>Locale</translation> <translation>Nuovo Toot</translation>
</message>
<message>
<source>Federated</source>
<translation>Federazione</translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,26 +174,26 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation>Caricare altri</translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation>Impostazioni</translation> <translation>Impostazioni</translation>
</message> </message>
<message>
<source>Loading</source>
<translation>Caricamento</translation>
</message>
<message>
<source>please wait...</source>
<translation>Attendere un momento...</translation>
</message>
<message> <message>
<source>New Toot</source> <source>New Toot</source>
<translation>Nuovo Toot</translation> <translation>Nuovo Toot</translation>
</message> </message>
<message>
<source>Reload</source>
<translation>Ricarica</translation>
</message>
<message>
<source>Open in Browser</source>
<translation>Aprire nel browser</translation>
</message>
<message>
<source>Nothing found</source>
<translation>Niente trovato</translation>
</message>
</context> </context>
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
@ -230,6 +232,10 @@
<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>
<source>Mention</source>
<translation>Menzionare</translation>
</message>
<message> <message>
<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>
@ -265,14 +271,6 @@
<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>
<source>Open in Browser</source>
<translation>Aprire nel browser</translation>
</message>
<message>
<source>Mention</source>
<translation>Menzionare</translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>

View file

@ -29,16 +29,14 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<extracomment>placeholderText in Toot content warning panel</extracomment>
<translation>Waarschuwingstekst</translation> <translation>Waarschuwingstekst</translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<extracomment>placeholderText in Toot text panel</extracomment>
<translation>Wat wil je kwijt?</translation> <translation>Wat wil je kwijt?</translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Verwijderen</translation>
</message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation>Openbaar</translation> <translation>Openbaar</translation>
@ -68,6 +66,10 @@
<source>Hide Reply</source> <source>Hide Reply</source>
<translation>Antwoord verbergen</translation> <translation>Antwoord verbergen</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation>Open een Browser</translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -128,8 +130,12 @@
<translation>Meldingen</translation> <translation>Meldingen</translation>
</message> </message>
<message> <message>
<source>New Toot</source> <source>Local</source>
<translation>Nieuwe Toot</translation> <translation>Lokaal</translation>
</message>
<message>
<source>Federated</source>
<translation>Gefedereerd</translation>
</message> </message>
<message> <message>
<source>Search</source> <source>Search</source>
@ -140,19 +146,15 @@
<translation>@user of #term</translation> <translation>@user of #term</translation>
</message> </message>
<message> <message>
<source>Local</source> <source>New Toot</source>
<translation>Lokaal</translation> <translation>Nieuwe Toot</translation>
</message>
<message>
<source>Federated</source>
<translation>Gefedereerd</translation>
</message> </message>
</context> </context>
<context> <context>
<name>MediaFullScreen</name> <name>MediaFullScreen</name>
<message> <message>
<source>Error loading</source> <source>Error loading</source>
<translation type="unfinished"></translation> <translation>Laadfout</translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,26 +174,26 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation>Meer laden</translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation>Instellingen</translation> <translation>Instellingen</translation>
</message> </message>
<message>
<source>Loading</source>
<translation>Laden</translation>
</message>
<message>
<source>please wait...</source>
<translation>even geduld</translation>
</message>
<message> <message>
<source>New Toot</source> <source>New Toot</source>
<translation>Nieuwe Toot</translation> <translation>Nieuwe Toot</translation>
</message> </message>
<message>
<source>Reload</source>
<translation>Herladen</translation>
</message>
<message>
<source>Open in Browser</source>
<translation>Open een Browser</translation>
</message>
<message>
<source>Nothing found</source>
<translation>Niets gevonden</translation>
</message>
</context> </context>
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
@ -230,6 +232,10 @@
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation>Statussen</translation> <translation>Statussen</translation>
</message> </message>
<message>
<source>Mention</source>
<translation>Vermelden</translation>
</message>
<message> <message>
<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>
@ -265,14 +271,6 @@
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Blokkeren</translation> <translation>Blokkeren</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation>Open een Browser</translation>
</message>
<message>
<source>Mention</source>
<translation>Vermelden</translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>
@ -327,7 +325,7 @@
</message> </message>
<message> <message>
<source>Visual identity</source> <source>Visual identity</source>
<translation type="unfinished"></translation> <translation>Visuele identiteit</translation>
</message> </message>
<message> <message>
<source>Development and translations</source> <source>Development and translations</source>
@ -335,19 +333,19 @@
</message> </message>
<message> <message>
<source>Occitan &amp; French translation</source> <source>Occitan &amp; French translation</source>
<translation type="unfinished"></translation> <translation>Occitaanse &amp; Franse vertaling</translation>
</message> </message>
<message> <message>
<source>Chinese translation</source> <source>Chinese translation</source>
<translation type="unfinished"></translation> <translation>Chinese vertaling</translation>
</message> </message>
<message> <message>
<source>Dutch translation</source> <source>Dutch translation</source>
<translation type="unfinished"></translation> <translation>Nederlandse vertaling</translation>
</message> </message>
<message> <message>
<source>Spanish translation</source> <source>Spanish translation</source>
<translation type="unfinished"></translation> <translation>Spaanse vertaling</translation>
</message> </message>
<message> <message>
<source>Use</source> <source>Use</source>

View file

@ -29,16 +29,14 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<extracomment>placeholderText in Toot content warning panel</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<extracomment>placeholderText in Toot text panel</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Verwijderen</translation>
</message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -68,6 +66,10 @@
<source>Hide Reply</source> <source>Hide Reply</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -80,7 +82,7 @@
<name>EmojiSelect</name> <name>EmojiSelect</name>
<message> <message>
<source>Emojis</source> <source>Emojis</source>
<translation>Emojis</translation> <translation>Emojis</translation>
</message> </message>
<message> <message>
<source>Tap to insert</source> <source>Tap to insert</source>
@ -128,8 +130,12 @@
<translation>Meldingen</translation> <translation>Meldingen</translation>
</message> </message>
<message> <message>
<source>New Toot</source> <source>Local</source>
<translation>Nieuwen toot</translation> <translation>Lokaal</translation>
</message>
<message>
<source>Federated</source>
<translation>Gefedereerd</translation>
</message> </message>
<message> <message>
<source>Search</source> <source>Search</source>
@ -140,12 +146,8 @@
<translation>@gebruiker of #term</translation> <translation>@gebruiker of #term</translation>
</message> </message>
<message> <message>
<source>Local</source> <source>New Toot</source>
<translation>Lokaal</translation> <translation>Nieuwen toot</translation>
</message>
<message>
<source>Federated</source>
<translation>Gefedereerd</translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,26 +174,26 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation>Meer laden</translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation>Instellingen</translation> <translation>Instellingen</translation>
</message> </message>
<message>
<source>Loading</source>
<translation>Laden</translation>
</message>
<message>
<source>please wait...</source>
<translation>efkens geduld</translation>
</message>
<message> <message>
<source>New Toot</source> <source>New Toot</source>
<translation>Nieuwen toot</translation> <translation>Nieuwen toot</translation>
</message> </message>
<message>
<source>Reload</source>
<translation>Herladen</translation>
</message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Nothing found</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
@ -230,6 +232,10 @@
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation>Statussen</translation> <translation>Statussen</translation>
</message> </message>
<message>
<source>Mention</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<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>
@ -265,14 +271,6 @@
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Blokkeren</translation> <translation>Blokkeren</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mention</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>

View file

@ -29,16 +29,14 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<extracomment>placeholderText in Toot content warning panel</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<extracomment>placeholderText in Toot text panel</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Escafar</translation>
</message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -68,6 +66,10 @@
<source>Hide Reply</source> <source>Hide Reply</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -121,31 +123,31 @@
<name>MainPage</name> <name>MainPage</name>
<message> <message>
<source>Home</source> <source>Home</source>
<translation>Acuèlh</translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Notifications</source> <source>Notifications</source>
<translation>Notificacions</translation> <translation type="unfinished"></translation>
</message>
<message>
<source>New Toot</source>
<translation>Nòu Tut</translation>
</message>
<message>
<source>Search</source>
<translation>Cercar</translation>
</message>
<message>
<source>@user or #term</source>
<translation>@utilizaire o #tèrm</translation>
</message> </message>
<message> <message>
<source>Local</source> <source>Local</source>
<translation>Local</translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Federated</source> <source>Federated</source>
<translation>Federat</translation> <translation type="unfinished"></translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>@user or #term</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>New Toot</source>
<translation type="unfinished">Nòu Tut</translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,26 +174,26 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation>Cargar mai</translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation>Parmètres</translation> <translation>Parmètres</translation>
</message> </message>
<message>
<source>Loading</source>
<translation>Cargament</translation>
</message>
<message>
<source>please wait...</source>
<translation>esperatz....</translation>
</message>
<message> <message>
<source>New Toot</source> <source>New Toot</source>
<translation>Nòu Tut</translation> <translation>Nòu Tut</translation>
</message> </message>
<message>
<source>Reload</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Nothing found</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
@ -230,6 +232,10 @@
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation>Estatuts</translation> <translation>Estatuts</translation>
</message> </message>
<message>
<source>Mention</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<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>
@ -265,14 +271,6 @@
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Blocar</translation> <translation>Blocar</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mention</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>

View file

@ -29,16 +29,14 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<extracomment>placeholderText in Toot content warning panel</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<extracomment>placeholderText in Toot text panel</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Usuń</translation>
</message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -68,6 +66,10 @@
<source>Hide Reply</source> <source>Hide Reply</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation type="unfinished">Otwarte w przeglądarce</translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -98,7 +100,7 @@
<name>LoginPage</name> <name>LoginPage</name>
<message> <message>
<source>Login</source> <source>Login</source>
<translation type="unfinished"></translation> <translation>Login</translation>
</message> </message>
<message> <message>
<source>Instance</source> <source>Instance</source>
@ -114,7 +116,7 @@
</message> </message>
<message> <message>
<source>Reload</source> <source>Reload</source>
<translation type="unfinished"></translation> <translation type="unfinished">Załaduj ponownie</translation>
</message> </message>
</context> </context>
<context> <context>
@ -128,8 +130,12 @@
<translation>Powiadomienia</translation> <translation>Powiadomienia</translation>
</message> </message>
<message> <message>
<source>New Toot</source> <source>Local</source>
<translation>Nowy wpis</translation> <translation>Lokalne</translation>
</message>
<message>
<source>Federated</source>
<translation>Globalne</translation>
</message> </message>
<message> <message>
<source>Search</source> <source>Search</source>
@ -140,12 +146,8 @@
<translation>@użytkownik lub #tag</translation> <translation>@użytkownik lub #tag</translation>
</message> </message>
<message> <message>
<source>Local</source> <source>New Toot</source>
<translation>Lokalne</translation> <translation>Nowy wpis</translation>
</message>
<message>
<source>Federated</source>
<translation>Globalne</translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,26 +174,26 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation>Załaduj więcej</translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation>Ustawienia</translation> <translation>Ustawienia</translation>
</message> </message>
<message>
<source>Loading</source>
<translation>Ładowanie</translation>
</message>
<message>
<source>please wait...</source>
<translation>proszę czekać</translation>
</message>
<message> <message>
<source>New Toot</source> <source>New Toot</source>
<translation>Nowy wpis</translation> <translation>Nowy wpis</translation>
</message> </message>
<message>
<source>Reload</source>
<translation>Załaduj ponownie</translation>
</message>
<message>
<source>Open in Browser</source>
<translation>Otwarte w przeglądarce</translation>
</message>
<message>
<source>Nothing found</source>
<translation>Nic nie znaleziono</translation>
</message>
</context> </context>
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
@ -230,6 +232,10 @@
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Mention</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<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>
@ -265,14 +271,6 @@
<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 type="unfinished"></translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mention</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>

View file

@ -25,48 +25,50 @@
<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> <extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation type="unfinished"></translation> <translation>Копировать ссылку</translation>
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<translation type="unfinished"></translation> <extracomment>placeholderText in Toot content warning panel</extracomment>
<translation>Текст предупреждения</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> <extracomment>placeholderText in Toot text panel</extracomment>
</message> <translation>О чём думаете?</translation>
<message>
<source>Delete</source>
<translation>Удалить</translation>
</message> </message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation type="unfinished"></translation> <translation>Публичный</translation>
</message> </message>
<message> <message>
<source>Unlisted</source> <source>Unlisted</source>
<translation type="unfinished"></translation> <translation>Скрытый</translation>
</message> </message>
<message> <message>
<source>Followers-only</source> <source>Followers-only</source>
<translation type="unfinished"></translation> <translation>Приватный</translation>
</message> </message>
<message> <message>
<source>Direct</source> <source>Direct</source>
<translation type="unfinished"></translation> <translation>Адресованный</translation>
</message> </message>
<message> <message>
<source>Toot sent!</source> <source>Toot sent!</source>
<translation type="unfinished"></translation> <translation>Поста отправлено!</translation>
</message> </message>
<message> <message>
<source>Reply</source> <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> <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> <translation>Ответ</translation>
</message> </message>
<message> <message>
<source>Hide Reply</source> <source>Hide Reply</source>
<translation type="unfinished"></translation> <translation>Скрыть ответ</translation>
</message>
<message>
<source>Open in Browser</source>
<translation>Открыть в браузере</translation>
</message> </message>
</context> </context>
<context> <context>
@ -98,11 +100,11 @@
<name>LoginPage</name> <name>LoginPage</name>
<message> <message>
<source>Login</source> <source>Login</source>
<translation type="unfinished"></translation> <translation>Авторизоваться</translation>
</message> </message>
<message> <message>
<source>Instance</source> <source>Instance</source>
<translation type="unfinished"></translation> <translation>Экземпляра</translation>
</message> </message>
<message> <message>
<source>Enter a valid Mastodon instance URL</source> <source>Enter a valid Mastodon instance URL</source>
@ -114,7 +116,7 @@
</message> </message>
<message> <message>
<source>Reload</source> <source>Reload</source>
<translation type="unfinished"></translation> <translation>Перезарядка</translation>
</message> </message>
</context> </context>
<context> <context>
@ -128,8 +130,12 @@
<translation>Уведомления</translation> <translation>Уведомления</translation>
</message> </message>
<message> <message>
<source>New Toot</source> <source>Local</source>
<translation>Новый</translation> <translation>Локальны</translation>
</message>
<message>
<source>Federated</source>
<translation>Федеративные</translation>
</message> </message>
<message> <message>
<source>Search</source> <source>Search</source>
@ -140,19 +146,15 @@
<translation>@пользователь или #срок</translation> <translation>@пользователь или #срок</translation>
</message> </message>
<message> <message>
<source>Local</source> <source>New Toot</source>
<translation>Локальный</translation> <translation>Новый</translation>
</message>
<message>
<source>Federated</source>
<translation>Федеративные</translation>
</message> </message>
</context> </context>
<context> <context>
<name>MediaFullScreen</name> <name>MediaFullScreen</name>
<message> <message>
<source>Error loading</source> <source>Error loading</source>
<translation type="unfinished"></translation> <translation>Ошибка при загрузке</translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,40 +174,40 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation>Загрузи больше</translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation>Настройки</translation> <translation>Настройки</translation>
</message> </message>
<message>
<source>Loading</source>
<translation>Загрузка</translation>
</message>
<message>
<source>please wait...</source>
<translation>Пожалуйста, подождите...</translation>
</message>
<message> <message>
<source>New Toot</source> <source>New Toot</source>
<translation>Новый</translation> <translation>Новый</translation>
</message> </message>
<message>
<source>Reload</source>
<translation>Перезагрузить</translation>
</message>
<message>
<source>Open in Browser</source>
<translation>Открыть в браузере</translation>
</message>
<message>
<source>Nothing found</source>
<translation>Ничего не найдено</translation>
</message>
</context> </context>
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
<message> <message>
<source>Bot</source> <source>Bot</source>
<translation type="unfinished"></translation> <translation>бот</translation>
</message> </message>
<message> <message>
<source>Follows you</source> <source>Follows you</source>
<translation type="unfinished"></translation> <translation>Подписан(а) на вас</translation>
</message> </message>
<message> <message>
<source>Group</source> <source>Group</source>
<translation type="unfinished"></translation> <translation>Группа</translation>
</message> </message>
</context> </context>
<context> <context>
@ -213,7 +215,7 @@
<message> <message>
<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 type="unfinished"></translation> <translation>Подробности</translation>
</message> </message>
<message> <message>
<source>Followers</source> <source>Followers</source>
@ -230,6 +232,10 @@
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation>Статусы</translation> <translation>Статусы</translation>
</message> </message>
<message>
<source>Mention</source>
<translation>Упоминание</translation>
</message>
<message> <message>
<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>
@ -238,7 +244,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>Запрошенный</translation>
</message> </message>
<message> <message>
<source>Follow</source> <source>Follow</source>
@ -265,14 +271,6 @@
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Блокировать</translation> <translation>Блокировать</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mention</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>
@ -282,7 +280,7 @@
</message> </message>
<message> <message>
<source>Options</source> <source>Options</source>
<translation type="unfinished"></translation> <translation>Параметры</translation>
</message> </message>
<message> <message>
<source>Load Images in Toots</source> <source>Load Images in Toots</source>
@ -327,27 +325,27 @@
</message> </message>
<message> <message>
<source>Visual identity</source> <source>Visual identity</source>
<translation type="unfinished"></translation> <translation>Визуальная идентичность</translation>
</message> </message>
<message> <message>
<source>Development and translations</source> <source>Development and translations</source>
<translation type="unfinished"></translation> <translation>Разработка и переводы</translation>
</message> </message>
<message> <message>
<source>Occitan &amp; French translation</source> <source>Occitan &amp; French translation</source>
<translation type="unfinished"></translation> <translation>французский перевод</translation>
</message> </message>
<message> <message>
<source>Chinese translation</source> <source>Chinese translation</source>
<translation type="unfinished"></translation> <translation>Китайский перевод</translation>
</message> </message>
<message> <message>
<source>Dutch translation</source> <source>Dutch translation</source>
<translation type="unfinished"></translation> <translation>Голландский перевод</translation>
</message> </message>
<message> <message>
<source>Spanish translation</source> <source>Spanish translation</source>
<translation type="unfinished"></translation> <translation>Испанский перевод</translation>
</message> </message>
<message> <message>
<source>Use</source> <source>Use</source>
@ -379,19 +377,19 @@
</message> </message>
<message> <message>
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation>Упоминание</translation>
</message> </message>
<message> <message>
<source>Conversation</source> <source>Conversation</source>
<translation type="unfinished"></translation> <translation>беседа</translation>
</message> </message>
<message> <message>
<source>Remove Bookmark</source> <source>Remove Bookmark</source>
<translation type="unfinished"></translation> <translation>Убрать из закладок</translation>
</message> </message>
<message> <message>
<source>Bookmark</source> <source>Bookmark</source>
<translation type="unfinished"></translation> <translation>Добавить в закладки</translation>
</message> </message>
</context> </context>
</TS> </TS>

View file

@ -29,16 +29,14 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<extracomment>placeholderText in Toot content warning panel</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<extracomment>placeholderText in Toot text panel</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Обриши</translation>
</message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -68,6 +66,10 @@
<source>Hide Reply</source> <source>Hide Reply</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -114,7 +116,7 @@
</message> </message>
<message> <message>
<source>Reload</source> <source>Reload</source>
<translation type="unfinished"></translation> <translation type="unfinished">учитај још</translation>
</message> </message>
</context> </context>
<context> <context>
@ -128,8 +130,12 @@
<translation>Обавјештење</translation> <translation>Обавјештење</translation>
</message> </message>
<message> <message>
<source>New Toot</source> <source>Local</source>
<translation>Novi toot</translation> <translation>Локална</translation>
</message>
<message>
<source>Federated</source>
<translation>Федеративна</translation>
</message> </message>
<message> <message>
<source>Search</source> <source>Search</source>
@ -140,12 +146,8 @@
<translation>@korisnik ili #pojam</translation> <translation>@korisnik ili #pojam</translation>
</message> </message>
<message> <message>
<source>Local</source> <source>New Toot</source>
<translation>Локална</translation> <translation>Novi toot</translation>
</message>
<message>
<source>Federated</source>
<translation>Федеративна</translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,26 +174,26 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation>учитај још</translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation>Подешавања</translation> <translation>Подешавања</translation>
</message> </message>
<message>
<source>Loading</source>
<translation>Učitavanje</translation>
</message>
<message>
<source>please wait...</source>
<translation>молимо вас, сачекајте...</translation>
</message>
<message> <message>
<source>New Toot</source> <source>New Toot</source>
<translation>Novi toot</translation> <translation>Novi toot</translation>
</message> </message>
<message>
<source>Reload</source>
<translation>учитај још</translation>
</message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Nothing found</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
@ -230,6 +232,10 @@
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation>Статуси</translation> <translation>Статуси</translation>
</message> </message>
<message>
<source>Mention</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<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>
@ -265,14 +271,6 @@
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Блокирати</translation> <translation>Блокирати</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mention</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>

View file

@ -29,16 +29,14 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<extracomment>placeholderText in Toot content warning panel</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<extracomment>placeholderText in Toot text panel</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Radera</translation>
</message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -68,6 +66,10 @@
<source>Hide Reply</source> <source>Hide Reply</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -114,7 +116,7 @@
</message> </message>
<message> <message>
<source>Reload</source> <source>Reload</source>
<translation type="unfinished"></translation> <translation type="unfinished">Ladda mer</translation>
</message> </message>
</context> </context>
<context> <context>
@ -128,8 +130,12 @@
<translation>Notifieringar</translation> <translation>Notifieringar</translation>
</message> </message>
<message> <message>
<source>New Toot</source> <source>Local</source>
<translation>Ny toot</translation> <translation>Lokalt</translation>
</message>
<message>
<source>Federated</source>
<translation>Förenade</translation>
</message> </message>
<message> <message>
<source>Search</source> <source>Search</source>
@ -140,12 +146,8 @@
<translation>@user eller #term</translation> <translation>@user eller #term</translation>
</message> </message>
<message> <message>
<source>Local</source> <source>New Toot</source>
<translation>Lokalt</translation> <translation>Ny toot</translation>
</message>
<message>
<source>Federated</source>
<translation>Förenade</translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,26 +174,26 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation>Ladda mer</translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation>Inställningar</translation> <translation>Inställningar</translation>
</message> </message>
<message>
<source>Loading</source>
<translation>Laddar</translation>
</message>
<message>
<source>please wait...</source>
<translation>Vänligen vänta...</translation>
</message>
<message> <message>
<source>New Toot</source> <source>New Toot</source>
<translation>Ny toot</translation> <translation>Ny toot</translation>
</message> </message>
<message>
<source>Reload</source>
<translation>Ladda mer</translation>
</message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Nothing found</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
@ -230,6 +232,10 @@
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation>Statusar</translation> <translation>Statusar</translation>
</message> </message>
<message>
<source>Mention</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<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>
@ -265,14 +271,6 @@
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Blockera</translation> <translation>Blockera</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mention</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>

View file

@ -29,16 +29,14 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<extracomment>placeholderText in Toot content warning panel</extracomment>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<extracomment>placeholderText in Toot text panel</extracomment>
<translation>?</translation> <translation>?</translation>
</message> </message>
<message>
<source>Delete</source>
<translation></translation>
</message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation></translation> <translation></translation>
@ -68,6 +66,10 @@
<source>Hide Reply</source> <source>Hide Reply</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -128,8 +130,12 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<source>New Toot</source> <source>Local</source>
<translation></translation> <translation></translation>
</message>
<message>
<source>Federated</source>
<translation></translation>
</message> </message>
<message> <message>
<source>Search</source> <source>Search</source>
@ -140,12 +146,8 @@
<translation>@用户或#</translation> <translation>@用户或#</translation>
</message> </message>
<message> <message>
<source>Local</source> <source>New Toot</source>
<translation></translation> <translation></translation>
</message>
<message>
<source>Federated</source>
<translation></translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,26 +174,26 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation></translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Loading</source>
<translation></translation>
</message>
<message>
<source>please wait...</source>
<translation>......</translation>
</message>
<message> <message>
<source>New Toot</source> <source>New Toot</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Reload</source>
<translation></translation>
</message>
<message>
<source>Open in Browser</source>
<translation></translation>
</message>
<message>
<source>Nothing found</source>
<translation>西</translation>
</message>
</context> </context>
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
@ -230,6 +232,10 @@
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Mention</source>
<translation></translation>
</message>
<message> <message>
<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>
@ -265,14 +271,6 @@
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation></translation>
</message>
<message>
<source>Mention</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>
@ -356,7 +354,7 @@
</message> </message>
<message> <message>
<source>to help with app translation to your language.</source> <source>to help with app translation to your language.</source>
<translation>使</translation> <translation>使.</translation>
</message> </message>
</context> </context>
<context> <context>

View file

@ -29,16 +29,14 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<extracomment>placeholderText in Toot content warning panel</extracomment>
<translation>Write your warning here</translation> <translation>Write your warning here</translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<extracomment>placeholderText in Toot text panel</extracomment>
<translation>What&apos;s on your mind?</translation> <translation>What&apos;s on your mind?</translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Delete</translation>
</message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation>Public</translation> <translation>Public</translation>
@ -68,6 +66,10 @@
<source>Hide Reply</source> <source>Hide Reply</source>
<translation>Hide Reply</translation> <translation>Hide Reply</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation>Open in Browser</translation>
</message>
</context> </context>
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
@ -121,31 +123,31 @@
<name>MainPage</name> <name>MainPage</name>
<message> <message>
<source>Home</source> <source>Home</source>
<translation></translation> <translation>Home</translation>
</message> </message>
<message> <message>
<source>Notifications</source> <source>Notifications</source>
<translation></translation> <translation>Notifications</translation>
</message>
<message>
<source>New Toot</source>
<translation></translation>
</message>
<message>
<source>Search</source>
<translation></translation>
</message>
<message>
<source>@user or #term</source>
<translation></translation>
</message> </message>
<message> <message>
<source>Local</source> <source>Local</source>
<translation></translation> <translation>Local</translation>
</message> </message>
<message> <message>
<source>Federated</source> <source>Federated</source>
<translation></translation> <translation>Federated</translation>
</message>
<message>
<source>Search</source>
<translation>Search</translation>
</message>
<message>
<source>@user or #term</source>
<translation>@user or #term</translation>
</message>
<message>
<source>New Toot</source>
<translation>New Toot</translation>
</message> </message>
</context> </context>
<context> <context>
@ -172,26 +174,26 @@
</context> </context>
<context> <context>
<name>MyList</name> <name>MyList</name>
<message>
<source>Load more</source>
<translation>Load more</translation>
</message>
<message> <message>
<source>Settings</source> <source>Settings</source>
<translation>Settings</translation> <translation>Settings</translation>
</message> </message>
<message>
<source>Loading</source>
<translation></translation>
</message>
<message>
<source>please wait...</source>
<translation></translation>
</message>
<message> <message>
<source>New Toot</source> <source>New Toot</source>
<translation>New Toot</translation> <translation>New Toot</translation>
</message> </message>
<message>
<source>Reload</source>
<translation>Reload</translation>
</message>
<message>
<source>Open in Browser</source>
<translation>Open in Browser</translation>
</message>
<message>
<source>Nothing found</source>
<translation>Nothing found</translation>
</message>
</context> </context>
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
@ -230,6 +232,10 @@
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation>Statuses</translation> <translation>Statuses</translation>
</message> </message>
<message>
<source>Mention</source>
<translation>Mention</translation>
</message>
<message> <message>
<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>
@ -265,14 +271,6 @@
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Block</translation> <translation>Block</translation>
</message> </message>
<message>
<source>Open in Browser</source>
<translation>Open in Browser</translation>
</message>
<message>
<source>Mention</source>
<translation>Mention</translation>
</message>
</context> </context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>