diff --git a/harbour-tooterb.pro b/harbour-tooterb.pro
index 1b3c051..cf3b679 100644
--- a/harbour-tooterb.pro
+++ b/harbour-tooterb.pro
@@ -14,9 +14,9 @@ TARGET = harbour-tooterb
CONFIG += sailfishapp
QT += network dbus sql
+QT += multimedia
CONFIG += link_pkgconfig
-PKGCONFIG += sailfishapp
-PKGCONFIG += \
+PKGCONFIG += sailfishapp \
nemonotifications-qt5
DEFINES += "APPVERSION=\\\"$${SPECVERSION}\\\""
@@ -58,16 +58,16 @@ DISTFILES += qml/harbour-tooterb.qml \
qml/pages/SettingsPage.qml \
qml/pages/components/InfoBanner.qml \
qml/pages/components/MediaFullScreen.qml \
+ qml/pages/components/MyMedia.qml \
+ qml/pages/components/NavigationPanel.qml \
qml/pages/components/ProfileImage.qml \
qml/pages/components/VisualContainer.qml \
qml/pages/components/MiniStatus.qml \
qml/pages/components/MiniHeader.qml \
qml/pages/components/ItemUser.qml \
qml/pages/components/MyList.qml \
- qml/pages/components/Navigation.qml \
qml/pages/components/ProfileHeader.qml \
qml/pages/components/MediaBlock.qml \
- qml/pages/components/MyImage.qml \
qml/cover/CoverPage.qml \
qml/pages/MainPage.qml \
qml/pages/LoginPage.qml \
diff --git a/qml/harbour-tooterb.qml b/qml/harbour-tooterb.qml
index b50b096..60e8399 100644
--- a/qml/harbour-tooterb.qml
+++ b/qml/harbour-tooterb.qml
@@ -87,5 +87,4 @@ ApplicationWindow {
activate()
}
}
-
}
diff --git a/qml/images/icon-s-bookmark.svg b/qml/images/icon-s-bookmark.svg
index 6a7cba2..f05bf8a 100644
--- a/qml/images/icon-s-bookmark.svg
+++ b/qml/images/icon-s-bookmark.svg
@@ -2,8 +2,6 @@
icon-s-bookmark
-
-
-
+
diff --git a/qml/lib/API.js b/qml/lib/API.js
index ba90d18..cfc6fa8 100644
--- a/qml/lib/API.js
+++ b/qml/lib/API.js
@@ -9,6 +9,7 @@ var mediator = (function(){
mediator.channels[channel].push({ context : this, callback : fn });
return this;
};
+
var publish = function(channel){
if(!mediator.channels[channel]) return false;
var args = Array.prototype.slice.call(arguments, 1);
@@ -18,6 +19,7 @@ var mediator = (function(){
};
return this;
};
+
return {
channels : {},
publish : publish,
@@ -28,6 +30,7 @@ var mediator = (function(){
}
};
}());
+
var init = function(){
console.log("db.version: "+db.version);
if(db.version === '') {
@@ -35,7 +38,7 @@ var init = function(){
tx.executeSql('CREATE TABLE IF NOT EXISTS settings ('
+ ' key TEXT UNIQUE, '
+ ' value TEXT '
- +');');
+ + ');');
//tx.executeSql('INSERT INTO settings (key, value) VALUES (?, ?)', ["conf", "{}"]);
});
db.changeVersion('', '0.1', function(tx) {
@@ -103,6 +106,7 @@ var tootParser = function(data){
console.log(ret)
}
+
var test = 1;
Qt.include("Mastodon.js")
@@ -161,6 +165,7 @@ var notifier = function(item){
key: item.id
}
break;
+
case "follow":
msg = {
urgency: "critical",
@@ -182,6 +187,7 @@ var notifier = function(item){
key: item.id
}
break;
+
case "mention":
msg = {
urgency: "critical",
@@ -193,6 +199,7 @@ var notifier = function(item){
key: item.id
}
break;
+
default:
//console.log(JSON.stringify(messageObject.data))
return;
diff --git a/qml/lib/Mastodon.js b/qml/lib/Mastodon.js
index 55265be..97b5bcc 100644
--- a/qml/lib/Mastodon.js
+++ b/qml/lib/Mastodon.js
@@ -10,10 +10,12 @@ var mastodonAPI = function(config) {
// modify initial config afterwards
config[key] = value;
},
+
getConfig: function(key) {
//get config key
return config[key];
},
+
get: function (endpoint) {
// for GET API calls
// can be called with two or three parameters
@@ -67,6 +69,7 @@ var mastodonAPI = function(config) {
}
http.send();
},
+
post: function (endpoint) {
// for POST API calls
var postData, callback;
@@ -113,6 +116,7 @@ var mastodonAPI = function(config) {
}
});*/
},
+
delete: function (endpoint, callback) {
// for DELETE API calls.
$.ajax({
@@ -125,6 +129,7 @@ var mastodonAPI = function(config) {
}
});
},
+
stream: function (streamType, onData) {
// Event Stream Support
// 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
// public for your federated 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 { event: (eventtype), payload: {mastodon object as described in the api docs} }
// eventtype could be notification (=notification) or update (= new toot in TL)
@@ -147,12 +152,10 @@ var mastodonAPI = function(config) {
onData(event);
};
es.onmessage = listener;
-
-
},
+
registerApplication: function (client_name, redirect_uri, scopes, website, callback) {
//register a new application
-
// OAuth Auth flow:
// First register the application
// 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);
},
+
generateAuthLink: function (client_id, redirect_uri, responseType, scopes) {
return config.instance + "/oauth/authorize?client_id=" + client_id + "&redirect_uri=" + redirect_uri +
"&response_type=" + responseType + "&scope=" + scopes.join("+");
},
+
getAccessTokenFromAuthCode: function (client_id, client_secret, redirect_uri, code, callback) {
/*$.ajax({
url: config.instance + "/oauth/token",
diff --git a/qml/lib/Worker.js b/qml/lib/Worker.js
index 268c024..1373fb0 100644
--- a/qml/lib/Worker.js
+++ b/qml/lib/Worker.js
@@ -10,7 +10,7 @@ WorkerScript.onMessage = function(msg) {
console.log("Conf > " + JSON.stringify(msg.conf))
console.log("Params > " + JSON.stringify(msg.params))
- // order notifications in ASC order
+ /** order notifications in ASC order */
function orderNotifications(items){
for (var i = items.length-1; i > 0; i--) {
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) {
console.log("Not loggedin")
return;
}
+ /** Load images */
if (typeof msg.conf['loadImages'] !== "undefined")
loadImages = msg.conf['loadImages']
+ /** POST statuses */
var API = mastodonAPI({ instance: msg.conf.instance, api_user_token: msg.conf.api_user_token});
if (msg.method === "POST"){
API.post(msg.action, msg.params, function(data) {
@@ -63,7 +66,7 @@ WorkerScript.onMessage = function(msg) {
} else if(msg.action === "notifications") {
// notification
- // console.log("Is notification... parsing...")
+ console.log("Get notification list")
console.log(JSON.stringify(data[i]))
item = parseNotification(data[i]);
items.push(item)
@@ -73,7 +76,9 @@ WorkerScript.onMessage = function(msg) {
console.log("ancestors")
for (var j = 0; j < data[i].length; 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)
console.log(JSON.stringify(data[i][j]))
}
@@ -82,7 +87,7 @@ WorkerScript.onMessage = function(msg) {
//console.log(JSON.stringify(i))
} 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")
for (var j = 0; j < data[i].length; j ++) {
item = parseToot(data[i][j]);
@@ -94,16 +99,19 @@ WorkerScript.onMessage = function(msg) {
}
addDataToModel (msg.model, "append", items);
items = [];
+
} else if (data[i].hasOwnProperty("content")){
- // console.log("Is toot... parsing...")
+ //console.log("Get Toot")
item = parseToot(data[i]);
item['id'] = item['status_id']
items.push(item)
+
} else {
WorkerScript.sendMessage({ 'action': msg.action, 'success': true, key: i, "data": data[i] })
}
}
}
+
if(msg.model && items.length)
addDataToModel(msg.model, msg.mode, items)
/*if(msg.action === "notifications")
@@ -123,11 +131,10 @@ function addDataToModel (model, mode, items) {
model.insert(0,items[i])
}
}
-
model.sync()
}
-// Get Account Data: Represents a user of Mastodon and their associated profile.
+/** Function: Get Account Data */
function parseAccounts(collection, prefix, data) {
var res = collection;
@@ -153,13 +160,12 @@ function parseAccounts(collection, prefix, data) {
//res[prefix + 'account_fields'] = data["fields"]
res[prefix + 'account_bot'] = data["bot"]
res[prefix + 'account_group'] = data["group"]
- res[prefix + 'account_source'] = data["source"]
//console.log(JSON.stringify(res))
return (res);
}
-// Get Notification Data
+/** Function: Get Notification Data */
function parseNotification(data){
//console.log(JSON.stringify(data))
var item = {
@@ -168,12 +174,12 @@ function parseNotification(data){
attachments: []
};
switch (item['type']){
+
case "mention":
if (!data.status) {
break;
}
item = parseToot(data.status)
- item['typeIcon'] = "image://theme/icon-s-retweet"
item['typeIcon'] = "image://theme/icon-s-alarm"
item['type'] = "mention"
break;
@@ -197,19 +203,18 @@ function parseNotification(data){
item = parseToot(data.status)
item = parseAccounts(item, "reblog_", data["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['type'] = "favourite";
- //item['retweetScreenName'] = item['reblog_account_username'];
break;
case "follow":
item['type'] = "follow";
item = parseAccounts(item, "", 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['attachments'] = []
+ //item['attachments'] = []
break;
default:
@@ -222,6 +227,7 @@ function parseNotification(data){
return item;
}
+/** Function: */
function collect() {
var ret = {};
var len = arguments.length;
@@ -235,12 +241,13 @@ function collect() {
return ret;
}
+/** Function: Get Status date */
function getDate(dateStr) {
var ts = new Date(dateStr);
return new Date(ts.getFullYear(), ts.getMonth(), ts.getDate(), 0, 0, 0)
}
-// Get Status / Toot Data
+/** Function: Get Status data */
function parseToot (data) {
var i = 0;
var item = {};
@@ -253,7 +260,6 @@ function parseToot (data) {
item['status_spoiler_text'] = data["spoiler_text"]
item['status_visibility'] = data["visibility"]
item['status_language'] = data["language"]
-
item['status_uri'] = data["uri"]
item['status_url'] = data["url"]
item['status_replies_count'] = data["replies_count"]
@@ -262,34 +268,39 @@ function parseToot (data) {
item['status_favourited'] = data["favourited"]
item['status_reblogged'] = data["reblogged"]
item['status_bookmarked'] = data["bookmarked"]
-
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_account_id'] = data["in_reply_to_account_id"]
item['status_reblog'] = data["reblog"] ? true : false
item['section'] = getDate(data["created_at"])
- // If Toot is a Reblog
+ /** If Toot is a Reblog */
if(item['status_reblog']) {
item['type'] = "reblog";
item['typeIcon'] = "image://theme/icon-s-retweet"
- item['status_id'] = data["reblog"]["id"];
- item['status_spoiler_text'] = data["reblog"]["spoiler_text"]
+ item['status_id'] = data["reblog"]["id"]
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, "reblog_", data["account"])
} else {
item = parseAccounts(item, "", data["account"])
}
+
+ /** Replace HTML content in Toots */
item['content'] = data['content']
.replaceAll('', '')
.replaceAll('', '')
.replaceAll('', '')
.replaceAll('class=""', '');
- item['attachments'] = [];
- // Media attachements in Toots
- for(i = 0; i < data['media_attachments'].length ; i++) {
+ /** Media attachements in Toots */
+ item['attachments'] = [];
+ for(i = 0; i < data['media_attachments'].length; i++) {
var attachments = data['media_attachments'][i];
item['content'] = item['content'].replaceAll(attachments['text_url'], '')
var tmp = {
@@ -301,7 +312,7 @@ function parseToot (data) {
item['attachments'].push(tmp)
}
- // Media attachements in Reblogs
+ /** Media attachements in Reblogs */
if(item['status_reblog']) {
for(i = 0; i < data['reblog']['media_attachments'].length ; i++) {
var attachments = data['reblog']['media_attachments'][i];
@@ -319,7 +330,7 @@ function parseToot (data) {
return addEmojis(item, data);
}
-// Display function for custom Emojis in Toots
+/** Function: Display custom Emojis in Toots */
function addEmojis(item, data) {
var emoji, i;
for (i = 0; i < data["emojis"].length; i++) {
diff --git a/qml/pages/ConversationPage.qml b/qml/pages/ConversationPage.qml
index c6a9dc5..f641278 100644
--- a/qml/pages/ConversationPage.qml
+++ b/qml/pages/ConversationPage.qml
@@ -8,28 +8,37 @@ import "./components/"
Page {
id: conversationPage
- property string type
- property string description: ""
- property string headerTitle: ""
- property string suggestedUser: ""
property ListModel suggestedModel
- property string toot_id: ""
- property string toot_url: ""
- property string toot_uri: ""
- property int tootMaxChar: 500;
+ property ListModel mdl
+ property int tootMaxChar: 500
property bool bot: false //otherwise ReferenceError ProfileHeader.qml
property bool followed_by: false //otherwise ReferenceError ProfileHeader.qml
property bool locked: false //otherwise ReferenceError ProfileHeader.qml
property bool group: false //otherwise ReferenceError ProfileHeader.qml
- property ListModel mdl
+ property 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
onSuggestedUserChanged: {
console.log(suggestedUser)
- suggestedModel = Qt.createQmlObject(
- 'import QtQuick 2.0; ListModel { }',
- Qt.application, 'InternalQmlObject'
- )
+ suggestedModel = Qt.createQmlObject( 'import QtQuick 2.0; ListModel { }', Qt.application, 'InternalQmlObject' )
predictionList.visible = false
if (suggestedUser.length > 0) {
var msg = {
@@ -58,18 +67,12 @@ Page {
WorkerScript {
id: worker
source: "../lib/Worker.js"
- onMessage: {
- console.log(JSON.stringify(messageObject))
- }
- }
-
- ProfileHeader {
- id: header
- visible: false
+ onMessage: { console.log(JSON.stringify(messageObject)) }
}
SilicaListView {
id: myList
+
header: PageHeader {
title: headerTitle // pageTitle pushed from MainPage.qml or VisualContainer.qml
}
@@ -90,12 +93,11 @@ Page {
text: Format.formatDate(section, Formatter.DateMedium)
}
}
- delegate: VisualContainer {
- }
+ delegate: VisualContainer {}
onCountChanged: {
if (mdl)
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)
positionViewAtIndex(i, ListView.Center)
}
@@ -106,31 +108,25 @@ Page {
id: pulleyConversation
visible: type === "reply"
+ MenuItem {
+ text: qsTr("Open in Browser")
+ onClicked: {
+ Qt.openUrlExternally(status_link)
+ }
+ }
+
MenuItem {
//: Use the translation of "Copy Link" for a shorter PullDownMenu label
text: qsTr("Copy Link to Clipboard")
- onClicked: if (toot_url === "") {
- 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
+ onClicked: Clipboard.text = status_link
}
MenuItem {
//: "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
text: !panel.open ? qsTr("Reply") : qsTr("Hide Reply")
visible: type == "reply"
- onClicked: if (!panel.open) {
- panel.open = true
- } else panel.open = false
+ onClicked: !panel.open ? panel.open = true : panel.open = false
}
-
}
}
@@ -142,20 +138,16 @@ Page {
anchors {
left: panel.left
right: panel.right
- bottom: if (panel.open == true) {
- panel.top
- } else {
- hiddenPanel.top
- }
+ bottom: panel.open == true ? panel.top : hiddenPanel.top
}
SilicaListView {
- rotation: 180
+ id: predictionResults
+ rotation: 180 // shows best matching result on the bottom
anchors.fill: parent
model: suggestedModel
clip: true
quickScroll: false
- VerticalScrollDecorator {}
delegate: ItemUser {
rotation: 180
onClicked: {
@@ -171,7 +163,6 @@ Page {
+ model.account_acct
+ ' '
+ textOperations.text.substring(textOperations.selectionEnd).trim()
-
toot.cursorPosition = toot.text.indexOf('@' + model.account_acct)
}
}
@@ -180,21 +171,20 @@ Page {
positionViewAtBeginning(suggestedModel.count - 1, ListView.Beginning)
}
}
+
+ VerticalScrollDecorator {}
}
}
DockedPanel {
id: panel
width: parent.width
- height: progressBar.height + toot.height + (mediaModel.count ? uploadedImages.height : 0)
- + btnContentWarning.height + Theme.paddingMedium
- + (warningContent.visible ? warningContent.height : 0)
+ height: progressBar.height + toot.height + (mediaModel.count ? uploadedImages.height : 0) + btnContentWarning.height + Theme.paddingMedium + (warningContent.visible ? warningContent.height : 0)
dock: Dock.Bottom
open: true
- animationDuration: 300
-
Rectangle {
+ id: progressBarBg
width: parent.width
height: progressBar.height
color: Theme.highlightBackgroundColor
@@ -225,17 +215,18 @@ Page {
autoScrollEnabled: true
labelVisible: false
font.pixelSize: Theme.fontSizeSmall
+ //: placeholderText in Toot content warning panel
placeholderText: qsTr("Write your warning here")
placeholderColor: palette.highlightColor
color: palette.highlightColor
horizontalAlignment: Text.AlignLeft
+ EnterKey.onClicked: {}
anchors {
top: parent.top
topMargin: Theme.paddingMedium
left: parent.left
right: parent.right
}
- EnterKey.onClicked: {}
}
TextInput {
@@ -247,18 +238,19 @@ Page {
id: toot
autoScrollEnabled: true
labelVisible: false
- text: description !== "" && (description.charAt(0) === '@'
- || 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 in Toot text panel
placeholderText: qsTr("What's on your mind?")
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 {
top: warningContent.bottom
topMargin: Theme.paddingMedium
@@ -274,7 +266,6 @@ Page {
textOperations.select(
textOperations.selectionStart ? textOperations.selectionStart - 1 : 0,
textOperations.selectionEnd)
- //console.log(textOperations.text.substr(textOperations.selectionStart, textOperations.selectionEnd))
console.log(toot.text.length)
suggestedUser = ""
if (textOperations.selectedText.charAt(0) === "@") {
@@ -302,7 +293,7 @@ Page {
rightMargin: Theme.paddingSmall
}
onSelectionChanged: { console.log(selection) }
- onClicked: pageStack.push(emojiSelect)
+ onClicked: pageStack.push(emojiDialog)
}
SilicaGridView {
@@ -313,13 +304,14 @@ Page {
height: mediaModel.count ? Theme.itemSizeExtraLarge : 0
model: mediaModel
cellWidth: uploadedImages.width / 4
- cellHeight: Theme.itemSizeExtraLarge
+ cellHeight: isPortrait ? cellWidth : Theme.itemSizeExtraLarge
delegate: BackgroundItem {
id: myDelegate
width: uploadedImages.cellWidth
height: uploadedImages.cellHeight
RemorseItem {
id: remorse
+ cancelText: ""
}
Image {
@@ -331,7 +323,7 @@ Page {
var idx = index
console.log(idx)
//mediaModel.remove(idx)
- remorse.execute(myDelegate, qsTr("Delete"), function () {
+ remorse.execute(myDelegate, "", function () {
mediaModel.remove(idx)
})
}
@@ -363,32 +355,30 @@ Page {
IconButton {
id: btnContentWarning
+ icon.source: "image://theme/icon-s-warning?" + ( pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor) )
+ onClicked: warningContent.visible = !warningContent.visible
anchors {
top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5
left: parent.left
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 {
id: btnAddImage
enabled: mediaModel.count < 4
+ icon.source: "image://theme/icon-s-attach?" + ( pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor) )
anchors {
top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5
left: btnContentWarning.right
leftMargin: Theme.paddingSmall
}
- icon.source: "image://theme/icon-s-attach?"
- + (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
onClicked: {
btnAddImage.enabled = false
var once = true
- var imagePicker = pageStack.push("Sailfish.Pickers.ImagePickerPage", {"allowedOrientations": Orientation.All})
+ var imagePicker = pageStack.push("Sailfish.Pickers.ImagePickerPage", { "allowedOrientations": Orientation.All })
imagePicker.selectedContentChanged.connect(function () {
var imagePath = imagePicker.selectedContent
console.log(imagePath)
@@ -421,12 +411,6 @@ Page {
ComboBox {
id: privacy
- anchors {
- top: toot.bottom
- topMargin: -Theme.paddingSmall * 1.5
- left: btnAddImage.right
- right: btnSend.left
- }
menu: ContextMenu {
MenuItem {
text: qsTr("Public")
@@ -441,19 +425,24 @@ Page {
text: qsTr("Direct")
}
}
+ anchors {
+ top: toot.bottom
+ topMargin: -Theme.paddingSmall * 1.5
+ left: btnAddImage.right
+ right: btnSend.left
+ }
}
IconButton {
id: btnSend
- icon.source: "image://theme/icon-m-send?"
- + (pressed ? Theme.highlightColor : Theme.primaryColor)
+ icon.source: "image://theme/icon-m-send?" + (pressed ? Theme.highlightColor : Theme.primaryColor)
+ enabled: toot.text !== "" && toot.text.length < tootMaxChar && uploadProgress.width == 0
anchors {
top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5
right: parent.right
rightMargin: Theme.paddingSmall
}
- enabled: toot.text !== "" && toot.text.length < tootMaxChar && uploadProgress.width == 0
onClicked: {
var visibility = ["public", "unlisted", "private", "direct"]
var media_ids = []
@@ -473,8 +462,8 @@ Page {
},
"conf": Logic.conf
}
- if (toot_id)
- msg.params['in_reply_to_id'] = (toot_id) + ""
+ if (status_id)
+ msg.params['in_reply_to_id'] = (status_id) + ""
if (warningContent.visible && warningContent.text.length > 0) {
msg.params['sensitive'] = 1
@@ -492,9 +481,11 @@ Page {
Rectangle {
id: uploadProgress
color: Theme.highlightBackgroundColor
- anchors.bottom: parent.bottom
- anchors.left: parent.left
height: Theme.itemSizeSmall * 0.05
+ anchors {
+ bottom: parent.bottom
+ left: parent.left
+ }
}
}
@@ -564,9 +555,9 @@ Page {
color: Theme.highlightBackgroundColor
opacity: 0.2
anchors {
+ top: parent.top
left: parent.left
right: parent.right
- top: parent.top
}
}
@@ -577,15 +568,15 @@ Page {
color: Theme.highlightBackgroundColor
opacity: 0.7
anchors {
- left: parent.left
top: parent.top
+ left: parent.left
}
}
}
EmojiSelect {
- id: emojiSelect
+ id: emojiDialog
}
InfoBanner {
diff --git a/qml/pages/LoginPage.qml b/qml/pages/LoginPage.qml
index 10f469e..5227d13 100644
--- a/qml/pages/LoginPage.qml
+++ b/qml/pages/LoginPage.qml
@@ -50,10 +50,10 @@ Page {
conf.login = false;
/*conf['login'] = false;
- conf['mastodon_client_id'] = data['mastodon_client_id'];
- conf['mastodon_client_secret'] = data['mastodon_client_secret'];
- conf['mastodon_client_redirect_uri'] = data['mastodon_client_redirect_uri'];
- delete Logic.conf;*/
+ conf['mastodon_client_id'] = data['mastodon_client_id'];
+ conf['mastodon_client_secret'] = data['mastodon_client_secret'];
+ conf['mastodon_client_redirect_uri'] = data['mastodon_client_redirect_uri'];
+ delete Logic.conf;*/
Logic.conf = conf;
console.log(JSON.stringify(conf))
console.log(JSON.stringify(Logic.conf))
@@ -72,38 +72,35 @@ Page {
);
}
}
+
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 {
- left: parent.left
- right: parent.right
topMargin: Theme.paddingMedium
+ left: parent.left
leftMargin: Theme.horizontalPageMargin
+ right: parent.right
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 {
id: webView
visible: false
+ opacity: 0
anchors {
top: parent.top
left: parent.left
right: parent.right
bottom: parent.bottom
}
-
- opacity: 0
onLoadingChanged: {
console.log(url)
if (
@@ -154,6 +151,7 @@ Page {
}
FadeAnimation on opacity {}
+
PullDownMenu {
MenuItem {
text: qsTr("Reload")
diff --git a/qml/pages/MainPage.qml b/qml/pages/MainPage.qml
index a0bed46..0ce3be1 100644
--- a/qml/pages/MainPage.qml
+++ b/qml/pages/MainPage.qml
@@ -12,14 +12,15 @@ Page {
allowedOrientations: Orientation.All
+ // Docked Navigation panel
DockedPanel {
id: infoPanel
open: true
- width: mainPage.isPortrait ? parent.width : Theme.itemSizeLarge
- height: mainPage.isPortrait ? Theme.itemSizeLarge : parent.height
- dock: mainPage.isPortrait ? Dock.Bottom : Dock.Right
+ width: isPortrait ? parent.width : Theme.itemSizeLarge
+ height: isPortrait ? Theme.itemSizeLarge : parent.height
+ dock: isPortrait ? Dock.Bottom : Dock.Right
- Navigation {
+ NavigationPanel {
id: navigation
isPortrait: !mainPage.isPortrait
onSlideshowShow: {
@@ -32,46 +33,46 @@ Page {
VisualItemModel {
id: visualModel
- MyList{
+ MyList {
id: tlHome
title: qsTr("Home")
type: "timelines/home"
mdl: Logic.modelTLhome
- width: parent.itemWidth
+ width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
height: parent.itemHeight
- onOpenDrawer: infoPanel.open = setDrawer
+ onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
}
- MyList{
+ MyList {
id: tlNotifications
title: qsTr("Notifications")
type: "notifications"
notifier: true
mdl: Logic.modelTLnotifications
- width: parent.itemWidth
+ width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
height: parent.itemHeight
- onOpenDrawer: infoPanel.open = setDrawer
+ onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
}
- MyList{
+ MyList {
id: tlLocal
title: qsTr("Local")
type: "timelines/public?local=true"
//params: ["local", true]
mdl: Logic.modelTLlocal
- width: parent.itemWidth
+ width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
height: parent.itemHeight
- onOpenDrawer: infoPanel.open = setDrawer
+ onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
}
- MyList{
+ MyList {
id: tlPublic
title: qsTr("Federated")
type: "timelines/public"
mdl: Logic.modelTLpublic
- width: parent.itemWidth
+ width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
height: parent.itemHeight
- onOpenDrawer: infoPanel.open = setDrawer
+ onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
}
Item {
@@ -80,7 +81,7 @@ Page {
property ListModel mdl: ListModel {}
property string search
- width: parent.itemWidth
+ width: isPortrait ? parent.itemWidth : parent.itemWidth - Theme.itemSizeLarge
height: parent.itemHeight
onSearchChanged: {
console.log(search)
@@ -134,7 +135,7 @@ Page {
mdl: ListModel {}
width: parent.width
height: parent.height
- onOpenDrawer: infoPanel.open = setDrawer
+ onOpenDrawer: isPortrait ? infoPanel.open = setDrawer : infoPanel.open = true
anchors.fill: parent
currentIndex: -1 // otherwise currentItem will steal focus
header: Item {
@@ -233,16 +234,16 @@ Page {
itemWidth: isTablet ? Math.round(parent.width) : parent.width
itemHeight: height
clip: true
+ model: visualModel
onCurrentIndexChanged: {
navigation.slideshowIndexChanged(currentIndex)
}
anchors {
fill: parent
top: parent.top
- rightMargin: mainPage.isPortrait ? 0 : infoPanel.visibleSize
- bottomMargin: mainPage.isPortrait ? infoPanel.visibleSize : 0
+ rightMargin: isPortrait ? 0 : infoPanel.visibleSize
+ bottomMargin: isPortrait ? infoPanel.visibleSize : 0
}
- model: visualModel
Component.onCompleted: {
}
}
@@ -255,7 +256,7 @@ Page {
icon.source: "image://theme/icon-l-add"
anchors {
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)
bottomMargin: Theme.paddingLarge
}
diff --git a/qml/pages/ProfilePage.qml b/qml/pages/ProfilePage.qml
index 0cf7bd5..efb5b21 100644
--- a/qml/pages/ProfilePage.qml
+++ b/qml/pages/ProfilePage.qml
@@ -182,9 +182,9 @@ Page {
id: txtNote
text: note
textFormat: Text.StyledText
- color: Theme.secondaryColor
+ color: Theme.secondaryHighlightColor
font.pixelSize: Theme.fontSizeExtraSmall
- linkColor: Theme.highlightColor
+ linkColor: Theme.secondaryColor
wrapMode: Text.Wrap
width: parent.width - ( 2 * Theme.horizontalPageMargin )
anchors.horizontalCenter: parent.horizontalCenter
@@ -227,37 +227,43 @@ Page {
anchors.leftMargin: Theme.paddingLarge
anchors.rightMargin: Theme.paddingLarge
- Text {
+ Label {
id: txtFollowers
visible: true //followers_count ? true : false
text: followers_count+" "+
//: Will show as: "35 Followers"
qsTr("Followers")
font.pixelSize: Theme.fontSizeExtraSmall
- color: Theme.highlightColor
+ color: Theme.primaryColor
wrapMode: Text.Wrap
}
- Text {
+ Label {
id: txtFollowing
visible: true //following_count ? true : false
text: following_count+" "+
//: Will show as: "23 Following"
qsTr("Following")
font.pixelSize: Theme.fontSizeExtraSmall
- color: Theme.highlightColor
+ color: Theme.primaryColor
wrapMode: Text.Wrap
}
- Text {
+ Label {
id: txtStatuses
visible: true //statuses_count ? true : false
text: statuses_count+" "+
//: Will show as: "115 Statuses"
qsTr("Statuses")
font.pixelSize: Theme.fontSizeExtraSmall
- color: Theme.highlightColor
+ color: pressed ? Theme.highlightColor : Theme.primaryColor
wrapMode: Text.Wrap
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: expandingSection1.expanded = false
+ }
+
}
}
@@ -299,7 +305,6 @@ Page {
'conf' : Logic.conf
};
worker.sendMessage(msg);
- // to-do: create notification banner "Follow request sent!"
}
}
@@ -338,22 +343,12 @@ Page {
'params' : [],
'action' : "accounts/" + user_id + (blocking ? '/unblock':'/block'),
'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
height: Theme.paddingSmall
width: parent.width
diff --git a/qml/pages/components/EmojiSelect.qml b/qml/pages/components/EmojiSelect.qml
index 67c067a..7e808e2 100644
--- a/qml/pages/components/EmojiSelect.qml
+++ b/qml/pages/components/EmojiSelect.qml
@@ -2,18 +2,23 @@ import QtQuick 2.0
import Sailfish.Silica 1.0
-Component {
- id: emojiComponent
-
- Dialog {
- id: emoticonsDialog
- canAccept: false //selector.currentIndex >= 0
- onAcceptPendingChanged: {
- if (acceptPending) {
- // Tell the destination page what the selected category is
- // acceptDestinationInstance.category = selector.value
- }
+Dialog {
+ id: emojiDialog
+ allowedOrientations: Orientation.All
+ canAccept: false //selector.currentIndex >= 0
+ onAcceptPendingChanged: {
+ if (acceptPending) {
+ // Tell the destination page what the selected category is
+ // acceptDestinationInstance.category = selector.value
}
+ }
+ anchors.top: parent.top
+
+ Column {
+ id: emojiColumn
+ spacing: Theme.paddingLarge
+ width: parent.width
+ height: parent.height
SilicaGridView {
id: gridView
@@ -21,75 +26,175 @@ Component {
title: qsTr("Emojis")
description: qsTr("Tap to insert")
}
- cellWidth: gridView.width / 6
+ cellWidth: isPortrait ? gridView.width / 6 : gridView.width / 10
cellHeight: cellWidth
- anchors.fill: parent
+ width: parent.width
+ height: parent.height
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: "People and Fantasy"; glyph: "🙆" }
- ListElement { section: "People and Fantasy"; glyph: "🙇" }
- ListElement { section: "People and Fantasy"; glyph: "🙈" }
- ListElement { section: "People and Fantasy"; glyph: "🙉" }
- ListElement { section: "People and Fantasy"; glyph: "🙊" }
- ListElement { section: "People and Fantasy"; glyph: "🙋" }
- ListElement { section: "People and Fantasy"; glyph: "🙍" }
- ListElement { section: "People and Fantasy"; glyph: "🙎" }
- ListElement { section: "People and Fantasy"; glyph: "👍" }
- ListElement { section: "People and Fantasy"; glyph: "👎" }
- ListElement { section: "People and Fantasy"; glyph: "🙌" }
- ListElement { section: "People and Fantasy"; glyph: "✊" }
- ListElement { section: "People and Fantasy"; glyph: "💪" }
- ListElement { section: "People and Fantasy"; glyph: "👉" }
- ListElement { section: "People and Fantasy"; glyph: "🙏" }
+ ListElement { section: "Cat Faces"; glyph: "😺" }
+ ListElement { section: "Cat Faces"; glyph: "😸" }
+ ListElement { section: "Cat Faces"; glyph: "😻" }
+ ListElement { section: "Cat Faces"; glyph: "😽" }
+ ListElement { section: "Cat Faces"; glyph: "😼" }
+ ListElement { section: "Cat Faces"; glyph: "🙀" }
+ ListElement { section: "Cat Faces"; glyph: "😿" }
+ ListElement { section: "Cat Faces"; glyph: "😹" }
+ ListElement { section: "Cat Faces"; glyph: "😾" }
+
+ ListElement { section: "Other Faces"; glyph: "👹" }
+ ListElement { section: "Other Faces"; glyph: "👺" }
+ ListElement { section: "Other Faces"; glyph: "🙈" }
+ ListElement { section: "Other Faces"; glyph: "🙉" }
+ ListElement { section: "Other Faces"; 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: "🚃" }
@@ -137,6 +242,7 @@ Component {
ListElement { section: "Horoscope Signs"; glyph: "♒" }
ListElement { section: "Horoscope Signs"; glyph: "♓" }
}
+
delegate: BackgroundItem {
width: gridView.cellWidth
height: gridView.cellHeight
@@ -144,21 +250,21 @@ Component {
Label {
text: glyph
font.pixelSize: Theme.fontSizeLarge
- color: (highlighted ? Theme.secondaryHighlightColor : Theme.secondaryColor)
+ color: highlighted ? Theme.secondaryHighlightColor : Theme.secondaryColor
anchors.centerIn: parent
}
+
onClicked: {
var cursorPosition = toot.cursorPosition
toot.text = toot.text.substring(
0, cursorPosition) + model.glyph + toot.text.substring(
cursorPosition)
toot.cursorPosition = cursorPosition + model.glyph.length
- emoticonsDialog.canAccept = true
- emoticonsDialog.accept()
+ emojiDialog.canAccept = true
+ emojiDialog.accept()
}
}
-
- VerticalScrollDecorator {flickable: listEmojis }
+ VerticalScrollDecorator { flickable: gridView }
}
}
}
diff --git a/qml/pages/components/InfoBanner.qml b/qml/pages/components/InfoBanner.qml
index 048a43f..e740634 100644
--- a/qml/pages/components/InfoBanner.qml
+++ b/qml/pages/components/InfoBanner.qml
@@ -5,8 +5,9 @@ import Sailfish.Silica 1.0
DockedPanel {
id: root
dock: Dock.Top
- width: parent.width
+ width: isPortrait ? parent.width : Theme.buttonWidthLarge * 1.5
height: content.height
+ anchors.horizontalCenter: parent.horizontalCenter
Rectangle {
id: content
diff --git a/qml/pages/components/ItemUser.qml b/qml/pages/components/ItemUser.qml
index edd79fa..02913eb 100644
--- a/qml/pages/components/ItemUser.qml
+++ b/qml/pages/components/ItemUser.qml
@@ -10,16 +10,14 @@ BackgroundItem {
width: parent.width
height: Theme.itemSizeMedium
- Rectangle {
+ Item {
id: avatar
- color: "transparent"
width: Theme.itemSizeExtraSmall
height: width
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: Theme.horizontalPageMargin
-
Image {
id: img
opacity: status === Image.Ready ? 1.0 : 0.0
@@ -50,13 +48,14 @@ BackgroundItem {
"following_count": model.account_following_count,
"statuses_count": model.account_statuses_count,
"locked": model.account_locked,
- "bot": model.account_bot
+ "bot": model.account_bot,
+ "group": model.account_group
})
}
}
Item {
- id: userdescription
+ id: userDescription
height: account_acct.height + display_name.height
anchors.left: avatar.right
anchors.leftMargin: Theme.paddingLarge
@@ -72,7 +71,6 @@ BackgroundItem {
truncationMode: TruncationMode.Fade
width: parent.width - Theme.paddingMedium
anchors.top: parent.top
-
}
Label {
diff --git a/qml/pages/components/MediaBlock.qml b/qml/pages/components/MediaBlock.qml
index 0e60884..e3bb587 100644
--- a/qml/pages/components/MediaBlock.qml
+++ b/qml/pages/components/MediaBlock.qml
@@ -14,7 +14,7 @@ Item {
height: height
Component.onCompleted: {
if (model && model.count && model.get(0).type === "video") {
- while (model.count>1){
+ while (model.count>1) {
model.remove(model.count-1)
}
//console.log(JSON.stringify(model.get(0)))
@@ -79,7 +79,7 @@ Item {
}
}
- MyImage {
+ MyMedia {
id: placeholder1
width: 2
height: 1
@@ -98,7 +98,7 @@ Item {
}
}
- MyImage {
+ MyMedia {
id: placeholder2
width: 2
height: 1
@@ -117,7 +117,7 @@ Item {
}
}
- MyImage {
+ MyMedia {
id: placeholder3
width: 2
height: 1
@@ -136,7 +136,7 @@ Item {
}
}
- MyImage {
+ MyMedia {
id: placeholder4
width: 2
height: 1
diff --git a/qml/pages/components/MediaFullScreen.qml b/qml/pages/components/MediaFullScreen.qml
index cd53ec7..f4adf7d 100644
--- a/qml/pages/components/MediaFullScreen.qml
+++ b/qml/pages/components/MediaFullScreen.qml
@@ -1,6 +1,6 @@
import QtQuick 2.0
import Sailfish.Silica 1.0
-import QtMultimedia 5.0
+import QtMultimedia 5.6
FullscreenContentPage {
@@ -21,15 +21,17 @@ FullscreenContentPage {
} else {
video.source = mediaURL
video.fillMode = VideoOutput.PreserveAspectFit
- video.play()
videoFlickable.visible = true
+ playerIcon.visible = true
+ playerProgress.visible = true
+ video.play()
+ hideTimer.start()
}
}
- Flickable {
+ SilicaFlickable {
id: videoFlickable
visible: false
- clip: true
contentWidth: imageContainer.width
contentHeight: imageContainer.height
anchors.fill: parent
@@ -49,7 +51,7 @@ FullscreenContentPage {
}
onStatusChanged: {
console.log(status)
- switch (status){
+ switch (status) {
case MediaPlayer.Loading:
console.log("loading")
return;
@@ -84,49 +86,27 @@ FullscreenContentPage {
}
}
onStopped: function() {
- if (type != 'video')
+ if (type == 'gifv') {
video.play()
- else
+ } else {
video.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()
+ overlayIcons.active = true
+ hideTimer.stop()
}
}
- 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 {
anchors.fill: parent
onClicked: function() {
- if (video.playbackState === MediaPlayer.PlayingState)
+ if (video.playbackState === MediaPlayer.PlayingState) {
video.pause()
- else
+ overlayIcons.active = true
+ hideTimer.stop()
+ } else {
video.play()
+ hideTimer.start()
+ }
}
}
@@ -155,12 +135,11 @@ FullscreenContentPage {
}
- Flickable {
+ SilicaFlickable {
id: imageFlickable
visible: false
contentWidth: imageContainer.width
contentHeight: imageContainer.height
- clip: true
anchors.fill: parent
onHeightChanged: if (imagePreview.status === Image.Ready) {
imagePreview.fitToScreen()
@@ -224,7 +203,6 @@ FullscreenContentPage {
property real minScale: 1.0
property real maxScale: 3.0
- opacity: 0.3
anchors.fill: parent
enabled: imagePreview.status === Image.Ready
pinch.target: imagePreview
@@ -250,6 +228,11 @@ FullscreenContentPage {
property: "scale"
from: imagePreview.scale
}
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: overlayIcons.active = !overlayIcons.active
+ }
}
}
@@ -292,32 +275,86 @@ FullscreenContentPage {
}
}
- IconButton {
- id: dismissBtn
- icon.source: "image://theme/icon-m-dismiss"
- anchors {
- top: parent.top
- topMargin: Theme.horizontalPageMargin
- right: parent.right
- rightMargin: Theme.horizontalPageMargin
- }
- onClicked: pageStack.pop()
- }
+ Item {
+ id: overlayIcons
- IconButton {
- id: mediaDlBtn
- anchors {
- right: parent.right
- rightMargin: Theme.horizontalPageMargin
- bottom: parent.bottom
- bottomMargin: Theme.horizontalPageMargin
+ property bool active: true
+
+ enabled: active
+ anchors.fill: parent
+ opacity: active ? 1.0 : 0.0
+ Behavior on opacity { FadeAnimator {}}
+
+ IconButton {
+ y: Theme.paddingLarge
+ icon.source: "image://theme/icon-m-dismiss"
+ onClicked: pageStack.pop()
+ anchors {
+ right: parent.right
+ rightMargin: Theme.horizontalPageMargin
+ }
}
- icon.source: "image://theme/icon-m-cloud-download"
- onClicked: {
- var filename = mediaURL.split("/")
- FileDownloader.downloadFile(mediaURL, filename[filename.length-1])
+
+ IconButton {
+ id: mediaDlBtn
+ icon.source: "image://theme/icon-m-cloud-download"
+ anchors {
+ right: parent.right
+ rightMargin: Theme.horizontalPageMargin
+ bottom: parent.bottom
+ bottomMargin: Theme.horizontalPageMargin
+ }
+ onClicked: {
+ var filename = mediaURL.split("/")
+ 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 }
}
+
diff --git a/qml/pages/components/MiniHeader.qml b/qml/pages/components/MiniHeader.qml
index 1774e95..3cf3cd3 100644
--- a/qml/pages/components/MiniHeader.qml
+++ b/qml/pages/components/MiniHeader.qml
@@ -48,9 +48,9 @@ Item {
width: parent.width - Theme.paddingMedium
truncationMode: TruncationMode.Fade
anchors {
+ top: lblName.bottom
left: parent.left
leftMargin: Theme.paddingMedium
- top: lblName.bottom
}
}
diff --git a/qml/pages/components/MiniStatus.qml b/qml/pages/components/MiniStatus.qml
index 946fe98..96170fe 100644
--- a/qml/pages/components/MiniStatus.qml
+++ b/qml/pages/components/MiniStatus.qml
@@ -5,8 +5,8 @@ import Sailfish.Silica 1.0
Item {
id: miniStatus
visible: true
- height: icon.height+Theme.paddingMedium
width: parent.width
+ height: icon.height+Theme.paddingMedium
Icon {
id: icon
@@ -18,9 +18,9 @@ Item {
anchors {
top: parent.top
topMargin: Theme.paddingMedium
- bottomMargin: Theme.paddingMedium
left: parent.left
leftMargin: Theme.horizontalPageMargin + Theme.iconSizeMedium - width
+ bottomMargin: Theme.paddingMedium
}
}
diff --git a/qml/pages/components/MyList.qml b/qml/pages/components/MyList.qml
index ec732a4..23ddd73 100644
--- a/qml/pages/components/MyList.qml
+++ b/qml/pages/components/MyList.qml
@@ -9,8 +9,6 @@ SilicaListView {
property string type
property string title
- property string vwPlaceholderText: qsTr("Loading")
- property string vwPlaceholderHint: qsTr("please wait...")
property string description
property ListModel mdl: []
property variant params: []
@@ -29,7 +27,6 @@ SilicaListView {
onNotify: {
console.log(what + " - " + num)
}
-
signal openDrawer (bool setDrawer)
onOpenDrawer: {
//console.log("Open drawer: " + setDrawer)
@@ -39,28 +36,41 @@ SilicaListView {
console.log("LIST send signal emitted with notice: " + notice)
}
-
header: PageHeader {
title: myList.title
description: myList.description
}
- BusyIndicator {
- size: BusyIndicatorSize.Large
- running: myList.model.count === 0 && !viewPlaceHolder.visible
- anchors.centerIn: parent
+ BusyLabel {
+ id: myListBusyLabel
+ running: model.count === 0
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ verticalCenter: parent.verticalCenter
+ }
+
+ Timer {
+ interval: 5000
+ running: true
+ onTriggered: {
+ myListBusyLabel.visible = false
+ loadStatusPlaceholder.visible = true
+ }
+ }
}
ViewPlaceholder {
- id: viewPlaceHolder
+ id: loadStatusPlaceholder
+ visible: false
enabled: model.count === 0
- text: vwPlaceholderText
- hintText: vwPlaceholderHint
+ text: qsTr("Nothing found")
}
PullDownMenu {
+ id: mainPulleyMenu
MenuItem {
text: qsTr("Settings")
+ visible: !profilePage
onClicked: {
pageStack.push(Qt.resolvedUrl("../SettingsPage.qml"), {})
}
@@ -68,6 +78,7 @@ SilicaListView {
MenuItem {
text: qsTr("New Toot")
+ visible: !profilePage
onClicked: {
pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), {
headerTitle: qsTr("New Toot"),
@@ -77,7 +88,15 @@ SilicaListView {
}
MenuItem {
- text: qsTr("Load more")
+ text: qsTr("Open in Browser")
+ visible: !mainPage
+ onClicked: {
+ Qt.openUrlExternally(url)
+ }
+ }
+
+ MenuItem {
+ text: qsTr("Reload")
onClicked: {
loadData("prepend")
}
@@ -101,7 +120,7 @@ SilicaListView {
console.log("CountChanged!")*/
}
- footer: Item{
+ footer: Item {
visible: autoLoadMore
width: parent.width
height: Theme.itemSizeLarge
@@ -116,10 +135,13 @@ SilicaListView {
}
BusyIndicator {
+ running: loadStarted
+ visible: myListBusyLabel.running ? false : true
size: BusyIndicatorSize.Small
- running: loadStarted;
- anchors.verticalCenter: parent.verticalCenter
- anchors.horizontalCenter: parent.horizontalCenter
+ anchors {
+ verticalCenter: parent.verticalCenter
+ horizontalCenter: parent.horizontalCenter
+ }
}
}
@@ -163,10 +185,10 @@ SilicaListView {
function loadData(mode) {
var p = []
- if (params.length)
+ if (params.length) {
for(var i = 0; i= 1.0.2
BuildRequires: pkgconfig(Qt5Core)
BuildRequires: pkgconfig(Qt5Qml)
BuildRequires: pkgconfig(Qt5Quick)
+BuildRequires: pkgconfig(Qt5DBus)
+BuildRequires: pkgconfig(Qt5Multimedia)
BuildRequires: pkgconfig(nemonotifications-qt5)
+BuildRequires: pkgconfig(openssl)
BuildRequires: desktop-file-utils
%description
diff --git a/rpm/harbour-tooterb.yaml b/rpm/harbour-tooterb.yaml
index f520784..ea06e37 100644
--- a/rpm/harbour-tooterb.yaml
+++ b/rpm/harbour-tooterb.yaml
@@ -25,12 +25,14 @@ PkgConfigBR:
- Qt5Core
- Qt5Qml
- Qt5Quick
+ - Qt5DBus
+ - Qt5Multimedia
- nemonotifications-qt5
-
+ - openssl
# Build dependencies without a pkgconfig setup can be listed here
-# PkgBR:
-# - package-needed-to-build
+# PkgBR:
+# - qt5-qtmultimedia-plugin-mediaservice-gstmediaplayer
# Runtime dependencies which are not automatically detected
Requires:
diff --git a/src/filedownloader.h b/src/filedownloader.h
index a8f5179..125ac84 100644
--- a/src/filedownloader.h
+++ b/src/filedownloader.h
@@ -24,7 +24,7 @@ class FileDownloader : public QObject
{
Q_OBJECT
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 open(QString filename);
diff --git a/src/imageuploader.cpp b/src/imageuploader.cpp
index 40ddb2a..4e66a65 100644
--- a/src/imageuploader.cpp
+++ b/src/imageuploader.cpp
@@ -8,7 +8,6 @@
#include
#include
-//static const QUrl IMGUR_UPLOAD_URL("https://httpbin.org/post");
//static const QUrl IMGUR_UPLOAD_URL();
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));
-
-
//POST data
-
-
QNetworkRequest request(m_uploadUrl);
request.setRawHeader("Authorization", m_authorizationHeader);
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(finished()), this, SLOT(replyFinished()));
-
-
//connect(m_reply, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(uploadProgress(qint64,qint64)));
//connect(m_reply, SIGNAL(finished()), this, SLOT(replyFinished()));*/
}
diff --git a/src/imageuploader.h b/src/imageuploader.h
index e530e48..86eda07 100644
--- a/src/imageuploader.h
+++ b/src/imageuploader.h
@@ -12,7 +12,7 @@ class ImageUploader : public QObject
Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged)
public:
- explicit ImageUploader(QObject *parent = 0);
+ explicit ImageUploader(QObject *parent = nullptr);
~ImageUploader();
Q_INVOKABLE void setFile(const QString &fileName);
diff --git a/translations/harbour-tooterb-de.ts b/translations/harbour-tooterb-de.ts
index e8cd4f0..ebe1c3c 100644
--- a/translations/harbour-tooterb-de.ts
+++ b/translations/harbour-tooterb-de.ts
@@ -29,16 +29,14 @@
+ placeholderText in Toot content warning panel
Inhaltswarnung
+ placeholderText in Toot text panel
Was gibt's Neues?
-
-
- Löschen
-
Öffentlich
@@ -68,6 +66,10 @@
Antwort verbergen
+
+
+ Im Browser öffnen
+
CoverPage
@@ -128,8 +130,12 @@
Benachrichtigungen
-
- Neuer Toot
+
+ Lokal
+
+
+
+ Föderiert
@@ -140,12 +146,8 @@
@Benutzer oder #Ausdruck
-
- Lokal
-
-
-
- Föderation
+
+ Neuer Toot
@@ -172,26 +174,26 @@
MyList
-
-
- Lade mehr
-
Einstellungen
-
-
- Wird geladen
-
-
-
- bitte warten...
-
Neuer Toot
+
+
+ Neu laden
+
+
+
+ Im Browser öffnen
+
+
+
+ Nichts gefunden
+
ProfileHeader
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
Beiträge
+
+
+ Erwähnen
+
Is a button. Keep it as short as possible.
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
Blockieren
-
-
- Im Browser öffnen
-
-
-
- Erwähnen
-
SettingsPage
diff --git a/translations/harbour-tooterb-el.ts b/translations/harbour-tooterb-el.ts
index 487297e..a4a7b3b 100644
--- a/translations/harbour-tooterb-el.ts
+++ b/translations/harbour-tooterb-el.ts
@@ -29,16 +29,14 @@
+ placeholderText in Toot content warning panel
+ placeholderText in Toot text panel
-
-
- Διαγραφή
-
@@ -68,6 +66,10 @@
+
+
+
+
CoverPage
@@ -114,7 +116,7 @@
-
+ Επαναφόρτωση
@@ -128,8 +130,12 @@
Ειδοποιήσεις
-
- Νέος
+
+ Τοπικός
+
+
+
+
@@ -140,12 +146,8 @@
@χρήστη ή #όρος
-
- Τοπικός
-
-
-
-
+
+ Νέος
@@ -172,25 +174,25 @@
MyList
-
-
- Φόρτωση περισσοτέρων
-
Ρυθμίσεις
-
- Φόρτωση
+
+ Νέος
-
+
+ Φόρτωση περισσοτέρων
+
+
+
-
- Νέος
+
+
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
Κατάσταση
+
+
+ Φραγή
+
Is a button. Keep it as short as possible.
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
Φραγή
-
-
-
-
-
-
-
-
SettingsPage
@@ -379,7 +377,7 @@
-
+ Φραγή
diff --git a/translations/harbour-tooterb-es.ts b/translations/harbour-tooterb-es.ts
index ce1675f..92b07d4 100644
--- a/translations/harbour-tooterb-es.ts
+++ b/translations/harbour-tooterb-es.ts
@@ -29,16 +29,14 @@
+ placeholderText in Toot content warning panel
Escribe aquí tu advertencia
+ placeholderText in Toot text panel
¿En qué estás pensando?
-
-
- Borrar
-
Público
@@ -68,6 +66,10 @@
Cerrar respuesta
+
+
+ Abrir en el navegador
+
CoverPage
@@ -128,8 +130,12 @@
Notificaciones
-
- Nuevo toot
+
+ Local
+
+
+
+ Federada
@@ -140,12 +146,8 @@
@usuario o #término
-
- Local
-
-
-
- Federada
+
+ Nuevo toot
@@ -172,26 +174,26 @@
MyList
-
-
- Cargar más
-
Ajustes
-
-
- Cargando
-
-
-
- por favor, espera...
-
Nuevo toot
+
+
+ Volver a cargar
+
+
+
+ Abrir en el navegador
+
+
+
+ No encontrado nada
+
ProfileHeader
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
Estados
+
+
+ Mencionar
+
Is a button. Keep it as short as possible.
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
Bloquear
-
-
- Abrir en el navegador
-
-
-
- Mencionar
-
SettingsPage
diff --git a/translations/harbour-tooterb-fr.ts b/translations/harbour-tooterb-fr.ts
index e302031..5657178 100644
--- a/translations/harbour-tooterb-fr.ts
+++ b/translations/harbour-tooterb-fr.ts
@@ -29,16 +29,14 @@
+ placeholderText in Toot content warning panel
Rédigez votre alerte ici
+ placeholderText in Toot text panel
Qu'avez-vous en tête?
-
-
- Supprimer
-
Public
@@ -68,6 +66,10 @@
Masquer la réponse
+
+
+ Ouvrir dans le navigateur
+
CoverPage
@@ -128,8 +130,12 @@
Notifications
-
- Nouveau pouet
+
+ Fil public local
+
+
+
+ Fil public global
@@ -140,12 +146,8 @@
@personne ou #terme
-
- Fil public local
-
-
-
- Fil public global
+
+ Nouveau pouet
@@ -172,26 +174,26 @@
MyList
-
-
- Charger plus
-
Paramètres
-
-
- Chargement
-
-
-
- patientez...
-
Nouveau pouet
+
+
+ Recharger
+
+
+
+ Ouvrir dans le navigateur
+
+
+
+ Rien trouvé
+
ProfileHeader
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
Pouets
+
+
+ Mentionner
+
Is a button. Keep it as short as possible.
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
Bloquer
-
-
- Ouvrir dans le navigateur
-
-
-
- Mentionner
-
SettingsPage
diff --git a/translations/harbour-tooterb-it.ts b/translations/harbour-tooterb-it.ts
index 76ed877..9b7dfe8 100644
--- a/translations/harbour-tooterb-it.ts
+++ b/translations/harbour-tooterb-it.ts
@@ -29,16 +29,14 @@
+ placeholderText in Toot content warning panel
Contenuto avviso
+ placeholderText in Toot text panel
A cosa stai pensando?
-
-
- Elimina
-
Pubblico
@@ -68,6 +66,10 @@
Chuidere risposta
+
+
+ Aprire nel browser
+
CoverPage
@@ -128,8 +130,12 @@
Notifiche
-
- Nuovo Toot
+
+ Locale
+
+
+
+ Federazione
@@ -140,12 +146,8 @@
@utente o #terme
-
- Locale
-
-
-
- Federazione
+
+ Nuovo Toot
@@ -172,26 +174,26 @@
MyList
-
-
- Caricare altri
-
Impostazioni
-
-
- Caricamento
-
-
-
- Attendere un momento...
-
Nuovo Toot
+
+
+ Ricarica
+
+
+
+ Aprire nel browser
+
+
+
+ Niente trovato
+
ProfileHeader
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
Toots
+
+
+ Menzionare
+
Is a button. Keep it as short as possible.
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
Blocca
-
-
- Aprire nel browser
-
-
-
- Menzionare
-
SettingsPage
diff --git a/translations/harbour-tooterb-nl.ts b/translations/harbour-tooterb-nl.ts
index 45da362..e0bf1d1 100644
--- a/translations/harbour-tooterb-nl.ts
+++ b/translations/harbour-tooterb-nl.ts
@@ -29,16 +29,14 @@
+ placeholderText in Toot content warning panel
Waarschuwingstekst
+ placeholderText in Toot text panel
Wat wil je kwijt?
-
-
- Verwijderen
-
Openbaar
@@ -68,6 +66,10 @@
Antwoord verbergen
+
+
+ Open een Browser
+
CoverPage
@@ -128,8 +130,12 @@
Meldingen
-
- Nieuwe Toot
+
+ Lokaal
+
+
+
+ Gefedereerd
@@ -140,19 +146,15 @@
@user of #term
-
- Lokaal
-
-
-
- Gefedereerd
+
+ Nieuwe Toot
MediaFullScreen
-
+ Laadfout
@@ -172,26 +174,26 @@
MyList
-
-
- Meer laden
-
Instellingen
-
-
- Laden
-
-
-
- even geduld…
-
Nieuwe Toot
+
+
+ Herladen
+
+
+
+ Open een Browser
+
+
+
+ Niets gevonden
+
ProfileHeader
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
Statussen
+
+
+ Vermelden
+
Is a button. Keep it as short as possible.
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
Blokkeren
-
-
- Open een Browser
-
-
-
- Vermelden
-
SettingsPage
@@ -327,7 +325,7 @@
-
+ Visuele identiteit
@@ -335,19 +333,19 @@
-
+ Occitaanse & Franse vertaling
-
+ Chinese vertaling
-
+ Nederlandse vertaling
-
+ Spaanse vertaling
diff --git a/translations/harbour-tooterb-nl_BE.ts b/translations/harbour-tooterb-nl_BE.ts
index c88c27f..0089850 100644
--- a/translations/harbour-tooterb-nl_BE.ts
+++ b/translations/harbour-tooterb-nl_BE.ts
@@ -29,16 +29,14 @@
+ placeholderText in Toot content warning panel
+ placeholderText in Toot text panel
-
-
- Verwijderen
-
@@ -68,6 +66,10 @@
+
+
+
+
CoverPage
@@ -80,7 +82,7 @@
EmojiSelect
- Emoji’s
+ Emojis
@@ -128,8 +130,12 @@
Meldingen
-
- Nieuwen toot
+
+ Lokaal
+
+
+
+ Gefedereerd
@@ -140,12 +146,8 @@
@gebruiker of #term
-
- Lokaal
-
-
-
- Gefedereerd
+
+ Nieuwen toot
@@ -172,26 +174,26 @@
MyList
-
-
- Meer laden
-
Instellingen
-
-
- Laden
-
-
-
- efkens geduld…
-
Nieuwen toot
+
+
+ Herladen
+
+
+
+
+
+
+
+
+
ProfileHeader
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
Statussen
+
+
+
+
Is a button. Keep it as short as possible.
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
Blokkeren
-
-
-
-
-
-
-
-
SettingsPage
diff --git a/translations/harbour-tooterb-oc.ts b/translations/harbour-tooterb-oc.ts
index 26a7f08..81fb159 100644
--- a/translations/harbour-tooterb-oc.ts
+++ b/translations/harbour-tooterb-oc.ts
@@ -29,16 +29,14 @@
+ placeholderText in Toot content warning panel
+ placeholderText in Toot text panel
-
-
- Escafar
-
@@ -68,6 +66,10 @@
+
+
+
+
CoverPage
@@ -121,31 +123,31 @@
MainPage
- Acuèlh
+
- Notificacions
-
-
-
- Nòu Tut
-
-
-
- Cercar
-
-
-
- @utilizaire o #tèrm
+
- Local
+
- Federat
+
+
+
+
+
+
+
+
+
+
+
+
+ Nòu Tut
@@ -172,26 +174,26 @@
MyList
-
-
- Cargar mai
-
Parmètres
-
-
- Cargament
-
-
-
- esperatz....
-
Nòu Tut
+
+
+
+
+
+
+
+
+
+
+
+
ProfileHeader
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
Estatuts
+
+
+
+
Is a button. Keep it as short as possible.
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
Blocar
-
-
-
-
-
-
-
-
SettingsPage
diff --git a/translations/harbour-tooterb-pl.ts b/translations/harbour-tooterb-pl.ts
index f8f3ef9..8c1140c 100644
--- a/translations/harbour-tooterb-pl.ts
+++ b/translations/harbour-tooterb-pl.ts
@@ -29,16 +29,14 @@
+ placeholderText in Toot content warning panel
+ placeholderText in Toot text panel
-
-
- Usuń
-
@@ -68,6 +66,10 @@
+
+
+ Otwarte w przeglądarce
+
CoverPage
@@ -98,7 +100,7 @@
LoginPage
-
+ Login
@@ -114,7 +116,7 @@
-
+ Załaduj ponownie
@@ -128,8 +130,12 @@
Powiadomienia
-
- Nowy wpis
+
+ Lokalne
+
+
+
+ Globalne
@@ -140,12 +146,8 @@
@użytkownik lub #tag
-
- Lokalne
-
-
-
- Globalne
+
+ Nowy wpis
@@ -172,26 +174,26 @@
MyList
-
-
- Załaduj więcej
-
Ustawienia
-
-
- Ładowanie
-
-
-
- proszę czekać…
-
Nowy wpis
+
+
+ Załaduj ponownie
+
+
+
+ Otwarte w przeglądarce
+
+
+
+ Nic nie znaleziono
+
ProfileHeader
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
+
+
+
+
Is a button. Keep it as short as possible.
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
-
-
-
-
-
-
-
-
SettingsPage
diff --git a/translations/harbour-tooterb-ru.ts b/translations/harbour-tooterb-ru.ts
index 571b499..98a54ca 100644
--- a/translations/harbour-tooterb-ru.ts
+++ b/translations/harbour-tooterb-ru.ts
@@ -25,48 +25,50 @@
Use the translation of "Copy Link" for a shorter PullDownMenu label
-
+ Копировать ссылку
-
+ placeholderText in Toot content warning panel
+ Текст предупреждения
-
-
-
-
- Удалить
+ placeholderText in Toot text panel
+ О чём думаете?
-
+ Публичный
-
+ Скрытый
-
+ Приватный
-
+ Адресованный
-
+ Поста отправлено!
"Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
-
+ Ответ
-
+ Скрыть ответ
+
+
+
+ Открыть в браузере
@@ -98,11 +100,11 @@
LoginPage
-
+ Авторизоваться
-
+ Экземпляра
@@ -114,7 +116,7 @@
-
+ Перезарядка
@@ -128,8 +130,12 @@
Уведомления
-
- Новый
+
+ Локальны
+
+
+
+ Федеративные
@@ -140,19 +146,15 @@
@пользователь или #срок
-
- Локальный
-
-
-
- Федеративные
+
+ Новый
MediaFullScreen
-
+ Ошибка при загрузке
@@ -172,40 +174,40 @@
MyList
-
-
- Загрузи больше
-
Настройки
-
-
- Загрузка
-
-
-
- Пожалуйста, подождите...
-
Новый
+
+
+ Перезагрузить
+
+
+
+ Открыть в браузере
+
+
+
+ Ничего не найдено
+
ProfileHeader
-
+ бот
-
+ Подписан(а) на вас
-
+ Группа
@@ -213,7 +215,7 @@
If there's no good translation for "About", use "Details" (in details about profile).
-
+ Подробности
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
Статусы
+
+
+ Упоминание
+
Is a button. Keep it as short as possible.
@@ -238,7 +244,7 @@
Is a button. Keep it as short as possible.
-
+ Запрошенный
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
Блокировать
-
-
-
-
-
-
-
-
SettingsPage
@@ -282,7 +280,7 @@
-
+ Параметры
@@ -327,27 +325,27 @@
-
+ Визуальная идентичность
-
+ Разработка и переводы
-
+ французский перевод
-
+ Китайский перевод
-
+ Голландский перевод
-
+ Испанский перевод
@@ -379,19 +377,19 @@
-
+ Упоминание
-
+ беседа
-
+ Убрать из закладок
-
+ Добавить в закладки
diff --git a/translations/harbour-tooterb-sr.ts b/translations/harbour-tooterb-sr.ts
index a8b3f4d..11298c2 100644
--- a/translations/harbour-tooterb-sr.ts
+++ b/translations/harbour-tooterb-sr.ts
@@ -29,16 +29,14 @@
+ placeholderText in Toot content warning panel
+ placeholderText in Toot text panel
-
-
- Обриши
-
@@ -68,6 +66,10 @@
+
+
+
+
CoverPage
@@ -114,7 +116,7 @@
-
+ учитај још
@@ -128,8 +130,12 @@
Обавјештење
-
- Novi toot
+
+ Локална
+
+
+
+ Федеративна
@@ -140,12 +146,8 @@
@korisnik ili #pojam
-
- Локална
-
-
-
- Федеративна
+
+ Novi toot
@@ -172,26 +174,26 @@
MyList
-
-
- учитај још
-
Подешавања
-
-
- Učitavanje
-
-
-
- молимо вас, сачекајте...
-
Novi toot
+
+
+ учитај још
+
+
+
+
+
+
+
+
+
ProfileHeader
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
Статуси
+
+
+
+
Is a button. Keep it as short as possible.
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
Блокирати
-
-
-
-
-
-
-
-
SettingsPage
diff --git a/translations/harbour-tooterb-sv.ts b/translations/harbour-tooterb-sv.ts
index fab63f4..53b7f6e 100644
--- a/translations/harbour-tooterb-sv.ts
+++ b/translations/harbour-tooterb-sv.ts
@@ -29,16 +29,14 @@
+ placeholderText in Toot content warning panel
+ placeholderText in Toot text panel
-
-
- Radera
-
@@ -68,6 +66,10 @@
+
+
+
+
CoverPage
@@ -114,7 +116,7 @@
-
+ Ladda mer
@@ -128,8 +130,12 @@
Notifieringar
-
- Ny toot
+
+ Lokalt
+
+
+
+ Förenade
@@ -140,12 +146,8 @@
@user eller #term
-
- Lokalt
-
-
-
- Förenade
+
+ Ny toot
@@ -172,26 +174,26 @@
MyList
-
-
- Ladda mer
-
Inställningar
-
-
- Laddar
-
-
-
- Vänligen vänta...
-
Ny toot
+
+
+ Ladda mer
+
+
+
+
+
+
+
+
+
ProfileHeader
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
Statusar
+
+
+
+
Is a button. Keep it as short as possible.
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
Blockera
-
-
-
-
-
-
-
-
SettingsPage
diff --git a/translations/harbour-tooterb-zh_CN.ts b/translations/harbour-tooterb-zh_CN.ts
index 22aef92..050c9fc 100644
--- a/translations/harbour-tooterb-zh_CN.ts
+++ b/translations/harbour-tooterb-zh_CN.ts
@@ -29,16 +29,14 @@
+ placeholderText in Toot content warning panel
在此编写你的警告信息
+ placeholderText in Toot text panel
有何想法?
-
-
- 删除
-
公共区域
@@ -68,6 +66,10 @@
隐藏回复
+
+
+ 在浏览器打开个人简介
+
CoverPage
@@ -128,8 +130,12 @@
通知
-
- 新嘟嘟
+
+ 本地
+
+
+
+ 联合
@@ -140,12 +146,8 @@
@用户或#项目
-
- 本地
-
-
-
- 联合
+
+ 新嘟嘟
@@ -172,26 +174,26 @@
MyList
-
-
- 加载更多
-
设置
-
-
- 加载中
-
-
-
- 稍等片刻......
-
新嘟嘟
+
+
+ 重新加载
+
+
+
+ 在浏览器打开个人简介
+
+
+
+ 没有发现任何东西
+
ProfileHeader
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
状态
+
+
+ 提及
+
Is a button. Keep it as short as possible.
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
封锁
-
-
- 在浏览器打开个人简介
-
-
-
- 提及
-
SettingsPage
@@ -356,7 +354,7 @@
- 以帮助翻译软件为你使用的语言
+ 以帮助翻译软件为你使用的语言.
diff --git a/translations/harbour-tooterb.ts b/translations/harbour-tooterb.ts
index 7940e30..49f0835 100644
--- a/translations/harbour-tooterb.ts
+++ b/translations/harbour-tooterb.ts
@@ -29,16 +29,14 @@
+ placeholderText in Toot content warning panel
Write your warning here
+ placeholderText in Toot text panel
What's on your mind?
-
-
- Delete
-
Public
@@ -68,6 +66,10 @@
Hide Reply
+
+
+ Open in Browser
+
CoverPage
@@ -121,31 +123,31 @@
MainPage
-
+ Home
-
-
-
-
-
-
-
-
-
-
-
-
-
+ Notifications
-
+ Local
-
+ Federated
+
+
+
+ Search
+
+
+
+ @user or #term
+
+
+
+ New Toot
@@ -172,26 +174,26 @@
MyList
-
-
- Load more
-
Settings
-
-
-
-
-
-
-
-
New Toot
+
+
+ Reload
+
+
+
+ Open in Browser
+
+
+
+ Nothing found
+
ProfileHeader
@@ -230,6 +232,10 @@
Will show as: "115 Statuses"
Statuses
+
+
+ Mention
+
Is a button. Keep it as short as possible.
@@ -265,14 +271,6 @@
Is a button. Keep it as short as possible.
Block
-
-
- Open in Browser
-
-
-
- Mention
-
SettingsPage