diff --git a/harbour-tooterb.pro b/harbour-tooterb.pro
index 7b348f4..ae9b634 100644
--- a/harbour-tooterb.pro
+++ b/harbour-tooterb.pro
@@ -71,10 +71,11 @@ DISTFILES += qml/harbour-tooterb.qml \
qml/cover/CoverPage.qml \
qml/pages/MainPage.qml \
qml/pages/LoginPage.qml \
- qml/pages/components/Toot.qml \
qml/pages/Browser.qml \
qml/lib/API.js \
+ qml/images/icon-s-bot.svg \
qml/images/icon-s-following \
+ qml/images/icon-s-bookmark \
qml/images/icon-m-emoji.svg \
qml/images/icon-m-profile.svg \
qml/images/icon-l-profile.svg \
diff --git a/qml/images/icon-s-bookmark.svg b/qml/images/icon-s-bookmark.svg
new file mode 100644
index 0000000..6a7cba2
--- /dev/null
+++ b/qml/images/icon-s-bookmark.svg
@@ -0,0 +1,9 @@
+
diff --git a/qml/images/icon-s-bot.svg b/qml/images/icon-s-bot.svg
new file mode 100644
index 0000000..d4c484c
--- /dev/null
+++ b/qml/images/icon-s-bot.svg
@@ -0,0 +1,11 @@
+
diff --git a/qml/images/icon-s-following.svg b/qml/images/icon-s-follow.svg
similarity index 100%
rename from qml/images/icon-s-following.svg
rename to qml/images/icon-s-follow.svg
diff --git a/qml/lib/API.js b/qml/lib/API.js
index 09f454d..ba90d18 100644
--- a/qml/lib/API.js
+++ b/qml/lib/API.js
@@ -89,11 +89,13 @@ var tootParser = function(data){
ret.avatar_static = data.account.avatar_static
ret.favourited = data.favourited ? true : false
- ret.favourites_count = data.favourites_count ? data.favourites_count : 0
+ ret.status_favourites_count = data.favourites_count ? data.favourites_count : 0
ret.reblog = data.reblog ? true : false
ret.reblogged = data.reblogged ? true : false
- ret.reblogs_count = data.reblogs_count ? data.reblogs_count : false
+ ret.status_reblogs_count = data.reblogs_count ? data.reblogs_count : false
+
+ ret.bookmarked = data.bookmarked ? true : false
ret.muted = data.muted ? true : false
ret.sensitive = data.sensitive ? true : false
diff --git a/qml/lib/Worker.js b/qml/lib/Worker.js
index 0317523..268c024 100644
--- a/qml/lib/Worker.js
+++ b/qml/lib/Worker.js
@@ -1,5 +1,8 @@
Qt.include("Mastodon.js")
+
+
var loadImages = true;
+
WorkerScript.onMessage = function(msg) {
console.log("Action > " + msg.action)
console.log("Model > " + msg.model)
@@ -9,16 +12,17 @@ WorkerScript.onMessage = function(msg) {
// order notifications in ASC order
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)
WorkerScript.sendMessage({ 'fireNotification': true, "data": items[i]})
}
}
- if (!msg.conf || !msg.conf.login){
+ if (!msg.conf || !msg.conf.login) {
console.log("Not loggedin")
return;
}
+
if (typeof msg.conf['loadImages'] !== "undefined")
loadImages = msg.conf['loadImages']
@@ -27,7 +31,7 @@ WorkerScript.onMessage = function(msg) {
API.post(msg.action, msg.params, function(data) {
if (msg.bgAction){
console.log(JSON.stringify(data))
- } else if (msg.action === "statuses"){
+ } else if (msg.action === "statuses") {
// status posted
if(msg.model){
var item = parseToot(data);
@@ -59,7 +63,7 @@ WorkerScript.onMessage = function(msg) {
} else if(msg.action === "notifications") {
// notification
- //console.log("Is notification... parsing...")
+ // console.log("Is notification... parsing...")
console.log(JSON.stringify(data[i]))
item = parseNotification(data[i]);
items.push(item)
@@ -90,14 +94,13 @@ WorkerScript.onMessage = function(msg) {
}
addDataToModel (msg.model, "append", items);
items = [];
-
} else if (data[i].hasOwnProperty("content")){
- //console.log("Is toot... parsing...")
+ // console.log("Is toot... parsing...")
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]})
+ WorkerScript.sendMessage({ 'action': msg.action, 'success': true, key: i, "data": data[i] })
}
}
}
@@ -108,40 +111,55 @@ WorkerScript.onMessage = function(msg) {
});
}
-
-
//WorkerScript.sendMessage({ 'notifyNewItems': length - i })
-function addDataToModel (model, mode, items){
+function addDataToModel (model, mode, items) {
var length = items.length;
console.log("Fetched > " +length)
if (mode === "append") {
model.append(items)
} else if (mode === "prepend") {
- for(var i = length-1; i >= 0 ; i--){
+ for(var i = length-1; i >= 0 ; i--) {
model.insert(0,items[i])
}
}
model.sync()
}
-function parseAccounts(collection, prefix, data){
- var res = collection;
+// Get Account Data: Represents a user of Mastodon and their associated profile.
+function parseAccounts(collection, prefix, data) {
+
+ var res = collection;
+ // Base attributes
res[prefix + 'account_id'] = data["id"]
res[prefix + 'account_username'] = data["username"]
res[prefix + 'account_acct'] = data["acct"]
+ res[prefix + 'account_url'] = data["url"]
+ // Display attributes
res[prefix + 'account_display_name'] = data["display_name"]
- res[prefix + 'account_discoverable'] = data["discoverable"]
- res[prefix + 'account_locked'] = data["locked"]
- res[prefix + 'account_created_at'] = data["created_at"]
+ res[prefix + 'account_note'] = data["note"]
res[prefix + 'account_avatar'] = data["avatar"]
res[prefix + 'account_header'] = data["header"]
+ res[prefix + 'account_locked'] = data["locked"]
+ //res[prefix + 'account_emojis'] = data["emojis"]
+ res[prefix + 'account_discoverable'] = data["discoverable"]
+ // Statistical attributes
+ res[prefix + 'account_created_at'] = data["created_at"]
+ res[prefix + 'account_statuses_count'] = data["statuses_count"]
+ res[prefix + 'account_followers_count'] = data["followers_count"]
+ res[prefix + 'account_following_count'] = data["following_count"]
+ // Optional attributes
+ //res[prefix + 'account_fields'] = data["fields"]
+ res[prefix + 'account_bot'] = data["bot"]
+ res[prefix + 'account_group'] = data["group"]
+ res[prefix + 'account_source'] = data["source"]
- // console.log(JSON.stringify(res))
+ //console.log(JSON.stringify(res))
return (res);
}
+// Get Notification Data
function parseNotification(data){
//console.log(JSON.stringify(data))
var item = {
@@ -152,31 +170,30 @@ function parseNotification(data){
switch (item['type']){
case "mention":
if (!data.status) {
- break;
+ break;
}
-
item = parseToot(data.status)
item['typeIcon'] = "image://theme/icon-s-retweet"
item['typeIcon'] = "image://theme/icon-s-alarm"
- item['type'] = "mention";
+ item['type'] = "mention"
break;
+
case "reblog":
if (!data.status) {
break;
}
-
item = parseToot(data.status)
item = parseAccounts(item, "reblog_", data["account"])
item = parseAccounts(item, "", data["status"]["account"])
- item['status_reblog'] = true;
- item['type'] = "reblog";
+ item['status_reblog'] = true
+ item['type'] = "reblog"
item['typeIcon'] = "image://theme/icon-s-retweet"
break;
+
case "favourite":
if (!data.status) {
break;
}
-
item = parseToot(data.status)
item = parseAccounts(item, "reblog_", data["account"])
item = parseAccounts(item, "", data["status"]["account"])
@@ -185,15 +202,16 @@ function parseNotification(data){
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['typeIcon'] = "../../images/icon-s-following.svg"
+ item['typeIcon'] = "../../images/icon-s-follow.svg"
item['attachments'] = []
-
break;
+
default:
item['typeIcon'] = "image://theme/icon-s-sailfish"
}
@@ -216,70 +234,76 @@ function collect() {
}
return ret;
}
-function getDate(dateStr){
+
+function getDate(dateStr) {
var ts = new Date(dateStr);
return new Date(ts.getFullYear(), ts.getMonth(), ts.getDate(), 0, 0, 0)
}
-function parseToot (data){
+
+// Get Status / Toot Data
+function parseToot (data) {
var i = 0;
var item = {};
item['type'] = "toot"
item['highlight'] = false
item['status_id'] = data["id"]
- item['status_uri'] = data["uri"]
- item['status_url'] = data["url"]
- item['status_in_reply_to_id'] = data["in_reply_to_id"]
- item['status_in_reply_to_account_id'] = data["in_reply_to_account_id"]
- item['status_reblog'] = data["reblog"] ? true : false
- item['status_content'] = data["content"]
- item['status_created_at'] = item['created_at'] = new Date(data["created_at"]);
- item['section'] = getDate(data["created_at"]);
- item['reblogs_count'] = data["reblogs_count"]
- item['favourites_count'] = data["favourites_count"]
- item['reblogged'] = data["reblogged"]
- item['favourited'] = data["favourited"]
- item['bookmarked'] = data["bookmarked"]
+ item['status_created_at'] = item['created_at'] = new Date(data["created_at"])
item['status_sensitive'] = data["sensitive"]
item['status_spoiler_text'] = data["spoiler_text"]
item['status_visibility'] = data["visibility"]
+ item['status_language'] = data["language"]
- if(item['status_reblog']){
+ item['status_uri'] = data["uri"]
+ item['status_url'] = data["url"]
+ item['status_replies_count'] = data["replies_count"]
+ item['status_reblogs_count'] = data["reblogs_count"]
+ item['status_favourites_count'] = data["favourites_count"]
+ item['status_favourited'] = data["favourited"]
+ item['status_reblogged'] = data["reblogged"]
+ item['status_bookmarked'] = data["bookmarked"]
+
+ item['status_content'] = data["content"]
+ item['status_in_reply_to_id'] = data["in_reply_to_id"]
+ item['status_in_reply_to_account_id'] = data["in_reply_to_account_id"]
+ item['status_reblog'] = data["reblog"] ? true : false
+ item['section'] = getDate(data["created_at"])
+
+ // If Toot is a Reblog
+ if(item['status_reblog']) {
item['type'] = "reblog";
item['typeIcon'] = "image://theme/icon-s-retweet"
item['status_id'] = data["reblog"]["id"];
item['status_spoiler_text'] = data["reblog"]["spoiler_text"]
item['status_sensitive'] = data["reblog"]["sensitive"]
- item['emojis'] = data["reblog"]["emojis"];
item = parseAccounts(item, "", data['reblog']["account"])
item = parseAccounts(item, "reblog_", data["account"])
} else {
item = parseAccounts(item, "", data["account"])
}
item['content'] = data['content']
- .replaceAll('', '')
- .replaceAll('', '')
- .replaceAll('', '')
- .replaceAll('class=""', '');
+ .replaceAll('', '')
+ .replaceAll('', '')
+ .replaceAll('', '')
+ .replaceAll('class=""', '');
item['attachments'] = [];
-
-
-
- for(i = 0; i < data['media_attachments'].length ; i++){
+ // Media attachements in Toots
+ 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 = {
- id: attachments['id'],
id: attachments['id'],
type: attachments['type'],
url: attachments['remote_url'] && typeof attachments['remote_url'] == "string" ? attachments['remote_url'] : attachments['url'] ,
- preview_url: loadImages ? attachments['preview_url'] : ''
+ preview_url: loadImages ? attachments['preview_url'] : ''
}
item['attachments'].push(tmp)
}
- if(item['status_reblog']){
- for(i = 0; i < data['reblog']['media_attachments'].length ; i++){
+
+ // Media attachements in Reblogs
+ if(item['status_reblog']) {
+ for(i = 0; i < data['reblog']['media_attachments'].length ; i++) {
var attachments = data['reblog']['media_attachments'][i];
item['content'] = item['content'].replaceAll(attachments['text_url'], '')
var tmp = {
@@ -291,18 +315,20 @@ function parseToot (data){
item['attachments'].push(tmp)
}
}
+
return addEmojis(item, data);
}
-function addEmojis(item, data){
+// Display function for custom Emojis in Toots
+function addEmojis(item, data) {
var emoji, i;
- for (i = 0; i < data["emojis"].length; i++){
+ for (i = 0; i < data["emojis"].length; i++) {
emoji = data["emojis"][i];
item['content'] = item['content'].replaceAll(":"+emoji.shortcode+":", "")
//console.log(JSON.stringify(data["emojis"][i]))
}
if (data["reblog"])
- for (i = 0; i < data["reblog"]["emojis"].length; i++){
+ for (i = 0; i < data["reblog"]["emojis"].length; i++) {
emoji = data["reblog"]["emojis"][i];
item['content'] = item['content'].replaceAll(":"+emoji.shortcode+":", "")
}
diff --git a/qml/pages/ConversationPage.qml b/qml/pages/ConversationPage.qml
index 5f2e40b..c536ba7 100644
--- a/qml/pages/ConversationPage.qml
+++ b/qml/pages/ConversationPage.qml
@@ -6,73 +6,74 @@ import "./components/"
Page {
- id: conversationPage
+ id: conversationPage
- property string headerTitle: ""
property string type
- property alias title: header.title
- property alias description: header.description
- property alias avatar: header.image
- property string suggestedUser: ""
- property ListModel suggestedModel
- property string toot_id: ""
+ 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 bool bot: false
+ property bool bot: false //otherwise ReferenceError ProfileHeader.qml
+ property bool followed_by: false //otherwise ReferenceError ProfileHeader.qml
+ property bool locked: false //otherwise ReferenceError ProfileHeader.qml
+ property bool group: false //otherwise ReferenceError ProfileHeader.qml
property ListModel mdl
- allowedOrientations: Orientation.All
- onSuggestedUserChanged: {
- console.log(suggestedUser)
- suggestedModel = Qt.createQmlObject(
- 'import QtQuick 2.0; ListModel { }',
- Qt.application, 'InternalQmlObject'
- )
- predictionList.visible = false
- if (suggestedUser.length > 0) {
- var msg = {
- "action": 'accounts/search',
- "method": 'GET',
- "model": suggestedModel,
- "mode": "append",
- "params": [{
- "name": "q",
- "data": suggestedUser
- }],
- "conf": Logic.conf
- }
- worker.sendMessage(msg)
- predictionList.visible = true
- }
- }
+ allowedOrientations: Orientation.All
+ onSuggestedUserChanged: {
+ console.log(suggestedUser)
+ suggestedModel = Qt.createQmlObject(
+ 'import QtQuick 2.0; ListModel { }',
+ Qt.application, 'InternalQmlObject'
+ )
+ predictionList.visible = false
+ if (suggestedUser.length > 0) {
+ var msg = {
+ "action": 'accounts/search',
+ "method": 'GET',
+ "model": suggestedModel,
+ "mode": "append",
+ "params": [{
+ "name": "q",
+ "data": suggestedUser
+ }],
+ "conf": Logic.conf
+ }
+ worker.sendMessage(msg)
+ predictionList.visible = true
+ }
+ }
- ListModel {
- id: mediaModel
- onCountChanged: {
- btnAddImage.enabled = mediaModel.count < 4
- }
- }
+ ListModel {
+ id: mediaModel
+ onCountChanged: {
+ btnAddImage.enabled = mediaModel.count < 4
+ }
+ }
- WorkerScript {
- id: worker
- source: "../lib/Worker.js"
- onMessage: {
- console.log(JSON.stringify(messageObject))
- }
- }
+ WorkerScript {
+ id: worker
+ source: "../lib/Worker.js"
+ onMessage: {
+ console.log(JSON.stringify(messageObject))
+ }
+ }
- ProfileHeader {
- id: header
- visible: false
- }
+ ProfileHeader {
+ id: header
+ visible: false
+ }
SilicaListView {
id: myList
- header: PageHeader {
+ header: PageHeader {
title: headerTitle // pageTitle pushed from MainPage.qml or VisualContainer.qml
- }
- clip: true
+ }
+ clip: true
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
@@ -81,33 +82,34 @@ Page {
} else {
hiddenPanel.top
}
- model: mdl
- section {
- property: 'section'
- delegate: SectionHeader {
- height: Theme.itemSizeExtraSmall
- text: Format.formatDate(section, Formatter.DateMedium)
- }
- }
- delegate: VisualContainer {
- }
- onCountChanged: {
- if (mdl)
- for (var i = 0; i < mdl.count; i++) {
- if (mdl.get(i).status_id === toot_id) {
- console.log(mdl.get(i).status_id)
- positionViewAtIndex(i, ListView.Center)
- }
- }
- }
+ model: mdl
+ section {
+ property: 'section'
+ delegate: SectionHeader {
+ height: Theme.itemSizeExtraSmall
+ text: Format.formatDate(section, Formatter.DateMedium)
+ }
+ }
+ delegate: VisualContainer {
+ }
+ onCountChanged: {
+ if (mdl)
+ for (var i = 0; i < mdl.count; i++) {
+ if (mdl.get(i).status_id === toot_id) {
+ console.log(mdl.get(i).status_id)
+ positionViewAtIndex(i, ListView.Center)
+ }
+ }
+ }
PullDownMenu {
id: pulleyConversation
visible: type === "reply"
+
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))
@@ -117,15 +119,24 @@ Page {
Clipboard.text = urialt
}
else Clipboard.text = toot_uri
-
- } else onClicked: Clipboard.text = toot_url
+ } else Clipboard.text = toot_url
}
+
+ MenuItem {
+ //: "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+ text: !panel.open ? qsTr("Reply") : qsTr("Hide Reply")
+ visible: type == "reply"
+ onClicked: if (!panel.open) {
+ panel.open = true
+ } else panel.open = false
+ }
+
}
}
- Rectangle {
- id: predictionList
- visible: false
+ Rectangle {
+ id: predictionList
+ visible: false
color: Theme.highlightDimmerColor
height: parent.height - panel.height - (Theme.paddingLarge * 4.5)
anchors {
@@ -141,108 +152,111 @@ Page {
SilicaListView {
rotation: 180
anchors.fill: parent
- model: suggestedModel
- clip: true
+ model: suggestedModel
+ clip: true
quickScroll: false
VerticalScrollDecorator {}
- delegate: ItemUser {
+ delegate: ItemUser {
rotation: 180
- onClicked: {
- var start = toot.cursorPosition
- while (toot.text[start] !== "@" && start > 0) {
- start--
- }
- textOperations.text = toot.text
- textOperations.cursorPosition = toot.cursorPosition
- textOperations.moveCursorSelection(start - 1, TextInput.SelectWords)
- toot.text = textOperations.text.substring(0, textOperations.selectionStart)
- + ' @'
- + model.account_acct
- + ' '
- + textOperations.text.substring(textOperations.selectionEnd).trim()
+ onClicked: {
+ var start = toot.cursorPosition
+ while (toot.text[start] !== "@" && start > 0) {
+ start--
+ }
+ textOperations.text = toot.text
+ textOperations.cursorPosition = toot.cursorPosition
+ textOperations.moveCursorSelection(start - 1, TextInput.SelectWords)
+ toot.text = textOperations.text.substring(0, textOperations.selectionStart)
+ + ' @'
+ + model.account_acct
+ + ' '
+ + textOperations.text.substring(textOperations.selectionEnd).trim()
- toot.cursorPosition = toot.text.indexOf('@' + model.account_acct)
- }
- }
- onCountChanged: {
- positionViewAtBeginning(suggestedModel.count - 1, ListView.Beginning)
- }
- }
- }
+ toot.cursorPosition = toot.text.indexOf('@' + model.account_acct)
+ }
+ }
+ onCountChanged: {
+ if (count > 0) {
+ positionViewAtBeginning(suggestedModel.count - 1, ListView.Beginning)
+ }
+ }
+ }
+ }
- DockedPanel {
- id: panel
- width: parent.width
+ 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)
+ + btnContentWarning.height + Theme.paddingMedium
+ + (warningContent.visible ? warningContent.height : 0)
dock: Dock.Bottom
open: true
- animationDuration: 200
+
+ animationDuration: 300
Rectangle {
- width: parent.width
- height: progressBar.height
- color: Theme.highlightBackgroundColor
- opacity: 0.2
- anchors {
- left: parent.left
- right: parent.right
- top: parent.top
- }
- }
+ width: parent.width
+ height: progressBar.height
+ color: Theme.highlightBackgroundColor
+ opacity: 0.2
+ anchors {
+ left: parent.left
+ right: parent.right
+ top: parent.top
+ }
+ }
- Rectangle {
- id: progressBar
- width: toot.text.length ? panel.width * (toot.text.length / tootMaxChar) : 0
+ Rectangle {
+ id: progressBar
+ width: toot.text.length ? panel.width * (toot.text.length / tootMaxChar) : 0
height: Theme.itemSizeSmall * 0.05
- color: Theme.highlightBackgroundColor
- opacity: 0.7
- anchors {
- left: parent.left
+ color: Theme.highlightBackgroundColor
+ opacity: 0.7
+ anchors {
+ left: parent.left
top: parent.top
- }
- }
+ }
+ }
- TextField {
- id: warningContent
- visible: false
- height: visible ? implicitHeight : 0
- anchors {
+ TextField {
+ id: warningContent
+ visible: false
+ height: visible ? implicitHeight : 0
+ anchors {
top: parent.top
- topMargin: Theme.paddingMedium
- left: parent.left
- right: parent.right
- }
- autoScrollEnabled: true
- labelVisible: false
+ topMargin: Theme.paddingMedium
+ left: parent.left
+ right: parent.right
+ }
+ autoScrollEnabled: true
+ labelVisible: false
font.pixelSize: Theme.fontSizeSmall
placeholderText: qsTr("Write your warning here")
placeholderColor: palette.highlightColor
color: palette.highlightColor
- horizontalAlignment: Text.AlignLeft
- EnterKey.onClicked: {}
- }
+ horizontalAlignment: Text.AlignLeft
+ EnterKey.onClicked: {}
+ }
- TextInput {
- id: textOperations
- visible: false
- }
+ TextInput {
+ id: textOperations
+ visible: false
+ }
- TextArea {
- id: toot
- anchors {
- top: warningContent.bottom
- topMargin: Theme.paddingMedium
- left: parent.left
+ TextArea {
+ id: toot
+ anchors {
+ top: warningContent.bottom
+ topMargin: Theme.paddingMedium
+ left: parent.left
right: parent.right
rightMargin: Theme.paddingLarge * 2
- }
- autoScrollEnabled: true
- labelVisible: false
+ }
+ autoScrollEnabled: true
+ labelVisible: false
text: description !== "" && (description.charAt(0) === '@'
- || description.charAt(
- 0) === '#') ? description + ' ' : ''
+ || description.charAt(
+ 0) === '#') ? description + ' ' : ''
height: if (type !== "reply") {
Math.max(conversationPage.height / 3, Math.min(conversationPage.height * 0.65, implicitHeight))
}
@@ -253,274 +267,274 @@ Page {
placeholderText: qsTr("What's on your mind?")
font.pixelSize: Theme.fontSizeSmall
EnterKey.onClicked: {}
- onTextChanged: {
- textOperations.text = toot.text
- textOperations.cursorPosition = toot.cursorPosition
- textOperations.selectWord()
- 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) === "@") {
- suggestedUser = textOperations.selectedText.trim().substring(1)
- }
- }
- }
+ onTextChanged: {
+ textOperations.text = toot.text
+ textOperations.cursorPosition = toot.cursorPosition
+ textOperations.selectWord()
+ 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) === "@") {
+ suggestedUser = textOperations.selectedText.trim().substring(1)
+ }
+ }
+ }
- IconButton {
- id: btnSmileys
+ IconButton {
+ id: btnSmileys
property string selection
opacity: 0.7
icon {
+ source: "../../qml/images/icon-m-emoji.svg?"
color: Theme.secondaryColor
width: Theme.iconSizeSmallPlus
fillMode: Image.PreserveAspectFit
- source: "../../qml/images/icon-m-emoji.svg"
}
- anchors {
+ anchors {
top: warningContent.bottom
- bottom: bottom.top
- right: parent.right
- rightMargin: Theme.paddingSmall
- }
+ bottom: bottom.top
+ right: parent.right
+ rightMargin: Theme.paddingSmall
+ }
onSelectionChanged: { console.log(selection) }
onClicked: pageStack.push(emojiSelect)
- }
+ }
- SilicaGridView {
- id: uploadedImages
- width: parent.width
+ SilicaGridView {
+ id: uploadedImages
+ width: parent.width
anchors.top: bottom.toot
- anchors.bottom: parent.bottom
+ anchors.bottom: parent.bottom
height: mediaModel.count ? Theme.itemSizeExtraLarge : 0
model: mediaModel
- cellWidth: uploadedImages.width / 4
+ cellWidth: uploadedImages.width / 4
cellHeight: Theme.itemSizeExtraLarge
- delegate: BackgroundItem {
- id: myDelegate
- width: uploadedImages.cellWidth
- height: uploadedImages.cellHeight
- RemorseItem {
+ delegate: BackgroundItem {
+ id: myDelegate
+ width: uploadedImages.cellWidth
+ height: uploadedImages.cellHeight
+ RemorseItem {
id: remorse
- }
+ }
- Image {
- anchors.fill: parent
- fillMode: Image.PreserveAspectCrop
- source: model.preview_url
- }
- onClicked: {
- var idx = index
- console.log(idx)
- //mediaModel.remove(idx)
- remorse.execute(myDelegate, qsTr("Delete"), function () {
- mediaModel.remove(idx)
- })
- }
- }
- add: Transition {
- NumberAnimation {
- property: "opacity"
- from: 0
- to: 1.0
- duration: 800
- }
- }
- remove: Transition {
- NumberAnimation {
- property: "opacity"
- from: 1.0
- to: 0
- duration: 800
- }
- }
- displaced: Transition {
- NumberAnimation {
- properties: "x,y"
- duration: 800
- easing.type: Easing.InOutBack
- }
- }
- }
+ Image {
+ anchors.fill: parent
+ fillMode: Image.PreserveAspectCrop
+ source: model.preview_url
+ }
+ onClicked: {
+ var idx = index
+ console.log(idx)
+ //mediaModel.remove(idx)
+ remorse.execute(myDelegate, qsTr("Delete"), function () {
+ mediaModel.remove(idx)
+ })
+ }
+ }
+ add: Transition {
+ NumberAnimation {
+ property: "opacity"
+ from: 0
+ to: 1.0
+ duration: 800
+ }
+ }
+ remove: Transition {
+ NumberAnimation {
+ property: "opacity"
+ from: 1.0
+ to: 0
+ duration: 800
+ }
+ }
+ displaced: Transition {
+ NumberAnimation {
+ properties: "x,y"
+ duration: 800
+ easing.type: Easing.InOutBack
+ }
+ }
+ }
- IconButton {
- id: btnContentWarning
- anchors {
+ IconButton {
+ id: btnContentWarning
+ 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
- }
+ 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
- anchors {
+ IconButton {
+ id: btnAddImage
+ enabled: mediaModel.count < 4
+ 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})
- imagePicker.selectedContentChanged.connect(function () {
- var imagePath = imagePicker.selectedContent
- console.log(imagePath)
- imageUploader.setUploadUrl(Logic.conf.instance + "/api/v1/media")
- imageUploader.setFile(imagePath)
- imageUploader.setAuthorizationHeader(Logic.conf.api_user_token)
- imageUploader.upload()
- })
- }
- }
+ 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})
+ imagePicker.selectedContentChanged.connect(function () {
+ var imagePath = imagePicker.selectedContent
+ console.log(imagePath)
+ imageUploader.setUploadUrl(Logic.conf.instance + "/api/v1/media")
+ imageUploader.setFile(imagePath)
+ imageUploader.setAuthorizationHeader(Logic.conf.api_user_token)
+ imageUploader.upload()
+ })
+ }
+ }
- ImageUploader {
- id: imageUploader
- onProgressChanged: {
- console.log("progress " + progress)
- uploadProgress.width = parent.width * progress
- }
- onSuccess: {
- uploadProgress.width = 0
- console.log(replyData)
- mediaModel.append(JSON.parse(replyData))
- }
- onFailure: {
- uploadProgress.width = 0
- btnAddImage.enabled = true
- console.log(status)
- console.log(statusText)
- }
- }
+ ImageUploader {
+ id: imageUploader
+ onProgressChanged: {
+ console.log("progress " + progress)
+ uploadProgress.width = parent.width * progress
+ }
+ onSuccess: {
+ uploadProgress.width = 0
+ console.log(replyData)
+ mediaModel.append(JSON.parse(replyData))
+ }
+ onFailure: {
+ uploadProgress.width = 0
+ btnAddImage.enabled = true
+ console.log(status)
+ console.log(statusText)
+ }
+ }
- ComboBox {
+ ComboBox {
id: privacy
- anchors {
+ anchors {
top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5
- left: btnAddImage.right
+ left: btnAddImage.right
right: btnSend.left
}
menu: ContextMenu {
- MenuItem {
+ MenuItem {
text: qsTr("Public")
- }
- MenuItem {
+ }
+ MenuItem {
text: qsTr("Unlisted")
- }
- MenuItem {
+ }
+ MenuItem {
text: qsTr("Followers-only")
- }
- MenuItem {
+ }
+ MenuItem {
text: qsTr("Direct")
- }
- }
- }
+ }
+ }
+ }
- IconButton {
- id: btnSend
- icon.source: "image://theme/icon-m-send?"
- + (pressed ? Theme.highlightColor : Theme.primaryColor)
- anchors {
+ IconButton {
+ id: btnSend
+ icon.source: "image://theme/icon-m-send?"
+ + (pressed ? Theme.highlightColor : Theme.primaryColor)
+ anchors {
top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5
- right: parent.right
+ right: parent.right
rightMargin: Theme.paddingSmall
- }
- enabled: toot.text !== "" && toot.text.length < tootMaxChar && uploadProgress.width == 0
- onClicked: {
+ }
+ enabled: toot.text !== "" && toot.text.length < tootMaxChar && uploadProgress.width == 0
+ onClicked: {
var visibility = ["public", "unlisted", "private", "direct"]
- var media_ids = []
- for (var k = 0; k < mediaModel.count; k++) {
- console.log(mediaModel.get(k).id)
- media_ids.push(mediaModel.get(k).id)
- }
- var msg = {
- "action": 'statuses',
- "method": 'POST',
- "model": mdl,
- "mode": "append",
- "params": {
- "status": toot.text,
- "visibility": visibility[privacy.currentIndex],
- "media_ids": media_ids
- },
- "conf": Logic.conf
- }
- if (toot_id)
- msg.params['in_reply_to_id'] = (toot_id) + ""
+ var media_ids = []
+ for (var k = 0; k < mediaModel.count; k++) {
+ console.log(mediaModel.get(k).id)
+ media_ids.push(mediaModel.get(k).id)
+ }
+ var msg = {
+ "action": 'statuses',
+ "method": 'POST',
+ "model": mdl,
+ "mode": "append",
+ "params": {
+ "status": toot.text,
+ "visibility": visibility[privacy.currentIndex],
+ "media_ids": media_ids
+ },
+ "conf": Logic.conf
+ }
+ if (toot_id)
+ msg.params['in_reply_to_id'] = (toot_id) + ""
- if (warningContent.visible && warningContent.text.length > 0) {
- msg.params['sensitive'] = 1
- msg.params['spoiler_text'] = warningContent.text
- }
+ if (warningContent.visible && warningContent.text.length > 0) {
+ msg.params['sensitive'] = 1
+ msg.params['spoiler_text'] = warningContent.text
+ }
worker.sendMessage(msg)
warningContent.text = ""
toot.text = ""
mediaModel.clear()
sentBanner.showText(qsTr("Toot sent!"))
- }
- }
+ }
+ }
- Rectangle {
- id: uploadProgress
- color: Theme.highlightBackgroundColor
+ Rectangle {
+ id: uploadProgress
+ color: Theme.highlightBackgroundColor
anchors.bottom: parent.bottom
- anchors.left: parent.left
+ anchors.left: parent.left
height: Theme.itemSizeSmall * 0.05
- }
- }
+ }
+ }
- Component.onCompleted: {
- toot.cursorPosition = toot.text.length
- if (mdl.count > 0) {
- var setIndex = 0
- switch (mdl.get(0).status_visibility) {
- case "unlisted":
- setIndex = 1
- break
- case "private":
- setIndex = 2
- break
- case "direct":
- privacy.enabled = false
- setIndex = 3
- break
- default:
- privacy.enabled = true
- setIndex = 0
- }
- privacy.currentIndex = setIndex
- }
+ Component.onCompleted: {
+ toot.cursorPosition = toot.text.length
+ if (mdl.count > 0) {
+ var setIndex = 0
+ switch (mdl.get(0).status_visibility) {
+ case "unlisted":
+ setIndex = 1
+ break
+ case "private":
+ setIndex = 2
+ break
+ case "direct":
+ privacy.enabled = false
+ setIndex = 3
+ break
+ default:
+ privacy.enabled = true
+ setIndex = 0
+ }
+ privacy.currentIndex = setIndex
+ }
- console.log(JSON.stringify())
+ console.log(JSON.stringify())
- worker.sendMessage({
- "action": 'statuses/' + mdl.get(0).status_id + '/context',
- "method": 'GET',
- "model": mdl,
- "params": { },
- "conf": Logic.conf
- })
- }
+ worker.sendMessage({
+ "action": 'statuses/' + mdl.get(0).status_id + '/context',
+ "method": 'GET',
+ "model": mdl,
+ "params": { },
+ "conf": Logic.conf
+ })
+ }
BackgroundItem {
id: hiddenPanel
visible: !panel.open
- height: Theme.paddingLarge * 0.5
+ height: Theme.paddingLarge * 0.7
width: parent.width
opacity: enabled ? 0.6 : 0.0
Behavior on opacity { FadeAnimator { duration: 400 } }
@@ -572,10 +586,9 @@ Page {
EmojiSelect {
id: emojiSelect
- }
+ }
InfoBanner {
id: sentBanner
}
-
}
diff --git a/qml/pages/LoginPage.qml b/qml/pages/LoginPage.qml
index 3a2cb10..10f469e 100644
--- a/qml/pages/LoginPage.qml
+++ b/qml/pages/LoginPage.qml
@@ -161,5 +161,4 @@ Page {
}
}
}
-
}
diff --git a/qml/pages/MainPage.qml b/qml/pages/MainPage.qml
index 2ff089f..a0bed46 100644
--- a/qml/pages/MainPage.qml
+++ b/qml/pages/MainPage.qml
@@ -10,7 +10,6 @@ Page {
property bool isFirstPage: true
property bool isTablet: true //Screen.sizeCategory >= Screen.Large
- // The effective value will be restricted by ApplicationWindow.allowedOrientations
allowedOrientations: Orientation.All
DockedPanel {
@@ -19,6 +18,7 @@ Page {
width: mainPage.isPortrait ? parent.width : Theme.itemSizeLarge
height: mainPage.isPortrait ? Theme.itemSizeLarge : parent.height
dock: mainPage.isPortrait ? Dock.Bottom : Dock.Right
+
Navigation {
id: navigation
isPortrait: !mainPage.isPortrait
@@ -31,6 +31,7 @@ Page {
VisualItemModel {
id: visualModel
+
MyList{
id: tlHome
title: qsTr("Home")
@@ -88,7 +89,7 @@ Page {
loader.sourceComponent = userListComponent
} else if (search.charAt(0) === "#") {
loader.sourceComponent = tagListComponent
- } else { loader.sourceComponent = wordListComponent}
+ } else loader.sourceComponent = wordListComponent
}
Loader {
@@ -102,6 +103,7 @@ Page {
PageHeader {
title: qsTr("Search")
}
+
SearchField {
id: searchField
width: parent.width
@@ -175,10 +177,19 @@ Page {
"username": model.account_acct,
"user_id": model.account_id,
"profileImage": model.account_avatar,
- "profileBackground": model.account_header
+ "profileBackground": model.account_header,
+ "note": model.account_note,
+ "url": model.account_url,
+ "followers_count": model.account_followers_count,
+ "following_count": model.account_following_count,
+ "statuses_count": model.account_statuses_count,
+ "locked": model.account_locked,
+ "bot": model.account_bot,
+ "group": model.account_group
})
}
}
+
Component.onCompleted: {
view2.type = "accounts/search"
view2.params = []
@@ -256,7 +267,7 @@ Page {
}
}
- function onLinkActivated(href){
+ function onLinkActivated(href) {
var test = href.split("/")
console.log(href)
console.log(JSON.stringify(test))
@@ -279,5 +290,4 @@ Page {
Component.onCompleted: {
console.log("aaa")
}
-
}
diff --git a/qml/pages/ProfilePage.qml b/qml/pages/ProfilePage.qml
index e5ce206..0cf7bd5 100644
--- a/qml/pages/ProfilePage.qml
+++ b/qml/pages/ProfilePage.qml
@@ -19,14 +19,12 @@ Page {
property int statuses_count
property int following_count
property int followers_count
- property int favourites_count
- property int reblogs_count
- property int count_moments
property bool locked: false
property bool bot: false
+ property bool group: false
property bool following: false
- property bool requested: false
property bool followed_by: false
+ property bool requested: false
property bool blocking: false
property bool muting: false
property bool domain_blocking: false
@@ -57,12 +55,12 @@ Page {
if(messageObject.action === "accounts/relationships/"){
console.log(JSON.stringify(messageObject))
- following= messageObject.data.following
- requested= messageObject.data.requested
- followed_by= messageObject.data.followed_by
- blocking= messageObject.data.blocking
- muting= messageObject.data.muting
- domain_blocking= messageObject.data.domain_blocking
+ following = messageObject.data.following
+ requested = messageObject.data.requested
+ followed_by = messageObject.data.followed_by
+ blocking = messageObject.data.blocking
+ muting = messageObject.data.muting
+ domain_blocking = messageObject.data.domain_blocking
}
switch (messageObject.key) {
case 'followers_count':
@@ -71,16 +69,9 @@ Page {
case 'following_count':
following_count = messageObject.data
break;
- case 'acct':
- // line below was commented out, reason unknown
- // username = messageObject.data
- break;
- case 'locked':
- locked = messageObject.data
- break;
- case 'bot':
- bot = messageObject.data
- break;
+ /* case 'acct':
+ username = messageObject.data
+ break; */
case 'created_at':
created_at = messageObject.data
break;
@@ -102,10 +93,7 @@ Page {
break;
case 'blocking':
blocking = messageObject.data
- followers_count = followers_count + (blocking ? -1 : 0)
- break;
- case 'followed_by':
- followed_by = messageObject.data
+ // followers_count = followers_count + (blocking ? -1 : 0)
break;
}
}
@@ -119,15 +107,11 @@ Page {
if (user_id) {
msg = {
'action' : "accounts/relationships/",
- 'params' : [ {name: "id", data: user_id}],
- 'conf' : Logic.conf
- }
- worker.sendMessage(msg)
- msg = {
- 'action' : "accounts/"+user_id,
+ 'params' : [ {name: "id", data: user_id} ],
'conf' : Logic.conf
}
worker.sendMessage(msg)
+
} else {
var instance = Logic.conf['instance'].split("//")
msg = {
@@ -160,13 +144,10 @@ Page {
}
}
- ExpandingSectionGroup { // ProfilePage ExpandingSection
+ // ProfilePage ExpandingSection
+ ExpandingSectionGroup {
id: profileExpander
- anchors {
- bottom: parent.bottom
- left: parent.left
- right: parent.right
- }
+ anchors.bottom: parent.bottom
ExpandingSection {
id: expandingSection1
@@ -174,13 +155,12 @@ Page {
//: If there's no good translation for "About", use "Details" (in details about profile).
qsTr("About")
content.sourceComponent: Column {
- height: Math.min( txtContainer, parent.height * 0.7 )
spacing: Theme.paddingLarge
Item {
id: txtContainer
width: parent.width
- height: Math.min( txtNote.height, parent.height * 0.55 )
+ height: profilePage.isPortrait ? Math.min( txtNote.height, parent.height * 0.5 ) : Math.min( txtNote.height, parent.height * 0.2 )
visible: {
if ((note.text === "") || ( note.text === "" )) {
false
@@ -249,7 +229,7 @@ Page {
Text {
id: txtFollowers
- visible: followers_count ? true : false
+ visible: true //followers_count ? true : false
text: followers_count+" "+
//: Will show as: "35 Followers"
qsTr("Followers")
@@ -260,7 +240,7 @@ Page {
Text {
id: txtFollowing
- visible: following_count ? true : false
+ visible: true //following_count ? true : false
text: following_count+" "+
//: Will show as: "23 Following"
qsTr("Following")
@@ -271,7 +251,7 @@ Page {
Text {
id: txtStatuses
- visible: statuses_count ? true : false
+ visible: true //statuses_count ? true : false
text: statuses_count+" "+
//: Will show as: "115 Statuses"
qsTr("Statuses")
@@ -279,17 +259,6 @@ Page {
color: Theme.highlightColor
wrapMode: Text.Wrap
}
-
- /*Text {
- id: txtFavourites
- visible: favourites_count ? true : false
- text: favourites_count+" "+
- //: Will show as: "56 Favourites"
- qsTr("Favourites")
- font.pixelSize: Theme.fontSizeExtraSmall
- color: Theme.highlightColor
- wrapMode: Text.Wrap
- } */
}
Item { // dummy item for spacing
@@ -301,7 +270,7 @@ Page {
Button {
id: btnMention
preferredWidth: Theme.buttonWidthSmall
- text: "Mention"
+ text: qsTr("Mention")
onClicked: {
pageStack.push(Qt.resolvedUrl("ConversationPage.qml"), {
headerTitle: qsTr("Mention"),
@@ -393,5 +362,4 @@ Page {
}
}
}
-
}
diff --git a/qml/pages/SettingsPage.qml b/qml/pages/SettingsPage.qml
index 4b05ea9..899792b 100644
--- a/qml/pages/SettingsPage.qml
+++ b/qml/pages/SettingsPage.qml
@@ -31,14 +31,13 @@ Page {
text: qsTr("Load Images in Toots")
description: qsTr("Disable this option if you want to preserve your data connection")
icon.source: "image://theme/icon-m-image"
- enabled: true
checked: typeof Logic.conf['loadImages'] !== "undefined" && Logic.conf['loadImages']
onClicked: {
Logic.conf['loadImages'] = checked
}
}
- SectionHeader { text: qsTr("Account")}
+ SectionHeader { text: qsTr("Account") }
Item {
id: removeAccount
@@ -97,11 +96,8 @@ Page {
font.pixelSize: Theme.fontSizeExtraSmall
wrapMode: Text.Wrap
color: Theme.highlightColor
- anchors {
- left: parent.left
- right: parent.right
- rightMargin: Theme.paddingLarge + icnRemoveAccount
- }
+ width: parent.width - Theme.paddingMedium
+ anchors.left: parent.left
}
}
}
@@ -253,5 +249,4 @@ Page {
}
}
}
-
}
diff --git a/qml/pages/components/EmojiSelect.qml b/qml/pages/components/EmojiSelect.qml
index 45a6f10..67c067a 100644
--- a/qml/pages/components/EmojiSelect.qml
+++ b/qml/pages/components/EmojiSelect.qml
@@ -161,6 +161,4 @@ Component {
VerticalScrollDecorator {flickable: listEmojis }
}
}
-
-
}
diff --git a/qml/pages/components/InfoBanner.qml b/qml/pages/components/InfoBanner.qml
index 06601aa..048a43f 100644
--- a/qml/pages/components/InfoBanner.qml
+++ b/qml/pages/components/InfoBanner.qml
@@ -55,5 +55,4 @@ DockedPanel {
stop()
}
}
-
}
diff --git a/qml/pages/components/ItemUser.qml b/qml/pages/components/ItemUser.qml
index d1df686..4357a97 100644
--- a/qml/pages/components/ItemUser.qml
+++ b/qml/pages/components/ItemUser.qml
@@ -18,6 +18,7 @@ BackgroundItem {
anchors.left: parent.left
anchors.leftMargin: Theme.horizontalPageMargin
color: Theme.highlightDimmerColor
+
Image {
id: img
opacity: status === Image.Ready ? 1.0 : 0.0
@@ -30,7 +31,7 @@ BackgroundItem {
size: BusyIndicatorSize.Small
opacity: img.status === Image.Ready ? 0.0 : 1.0
Behavior on opacity { FadeAnimator {} }
- running: avatar.status !== Image.Ready;
+ running: avatar.status !== Image.Ready
anchors.centerIn: parent
}
@@ -41,36 +42,70 @@ BackgroundItem {
"username": model.account_acct,
"user_id": model.account_id,
"profileImage": model.account_avatar,
- "profileBackground": model.account_header
+ "profileBackground": model.account_header,
+ "note": model.account_note,
+ "url": model.account_url,
+ "followers_count": model.account_followers_count,
+ "following_count": model.account_following_count,
+ "statuses_count": model.account_statuses_count,
+ "locked": model.account_locked,
+ "bot": model.account_bot
})
}
}
- Column {
+ Item {
anchors.left: avatar.right
anchors.leftMargin: Theme.paddingLarge
anchors.verticalCenter: parent.verticalCenter
height: account_acct.height + display_name.height
+
Label {
id: display_name
- text: model.account_display_name+" "
- color: !pressed ? Theme.primaryColor : Theme.highlightColor
+ text: account_display_name ? account_display_name : account_username.split('@')[0]
+ color: !pressed ? Theme.primaryColor : Theme.highlightColor
font.pixelSize: Theme.fontSizeSmall
+ anchors.top: parent.top
+
}
+
+ Image {
+ id: icnBot
+ visible: account_bot
+ source: "../../images/icon-s-bot.svg?" + ( pressed ? Theme.highlightColor : Theme.primaryColor )
+ width: account_bot ? Theme.iconSizeExtraSmall : 0
+ height: width
+ y: Theme.paddingLarge
+ anchors {
+ left: display_name.right
+ leftMargin: Theme.paddingSmall
+ verticalCenter: display_name.verticalCenter
+ }
+ }
+
Label {
id: account_acct
text: "@"+model.account_acct
color: !pressed ? Theme.secondaryColor : Theme.secondaryHighlightColor
anchors.leftMargin: Theme.paddingMedium
font.pixelSize: Theme.fontSizeExtraSmall
+ anchors.top: display_name.bottom
}
}
- onClicked: openUser({
+
+ onClicked: openUser( {
"display_name": model.account_display_name,
"username": model.account_acct,
"user_id": model.account_id,
"profileImage": model.account_avatar,
- "profileBackground": model.account_header
- })
-
+ "profileBackground": model.account_header,
+ "note": model.account_note,
+ "url": model.account_url,
+ "followers_count": model.account_followers_count,
+ "following_count": model.account_following_count,
+ "statuses_count": model.account_statuses_count,
+ "locked": model.account_locked,
+ "bot": model.account_bot,
+ "group": model.account_group
+ } )
}
diff --git a/qml/pages/components/MediaBlock.qml b/qml/pages/components/MediaBlock.qml
index bf3c047..0e60884 100644
--- a/qml/pages/components/MediaBlock.qml
+++ b/qml/pages/components/MediaBlock.qml
@@ -23,15 +23,17 @@ Item {
if (model && model.count)
count = model.count
switch(count){
+
case 1:
placeholder1.width = holder.width
placeholder1.height = placeholder1.width*hRatio
placeholder1.visible = true;
holder.height = placeholder1.height
break;
+
case 2:
- placeholder1.visible = true;
- placeholder2.visible = true;
+ placeholder1.visible = true
+ placeholder2.visible = true
placeholder1.width = (holder.width-Theme.paddingSmall)/2
placeholder1.height = placeholder1.width
placeholder2.width = placeholder1.width
@@ -39,11 +41,12 @@ Item {
placeholder2.x = placeholder1.width + placeholder2.x + Theme.paddingSmall
holder.height = placeholder1.height
break;
+
case 3:
- placeholder1.visible = true;
- placeholder2.visible = true;
- placeholder3.visible = true;
- placeholder4.visible = false;
+ placeholder1.visible = true
+ placeholder2.visible = true
+ placeholder3.visible = true
+ placeholder4.visible = false
placeholder1.width = holder.width - Theme.paddingSmall - Theme.itemSizeLarge;
placeholder1.height = Theme.itemSizeLarge*2+Theme.paddingSmall
@@ -53,23 +56,23 @@ Item {
placeholder3.height = placeholder3.width = placeholder2.height = placeholder2.width
placeholder3.x = placeholder2.x = placeholder1.x + placeholder1.width + Theme.paddingSmall;
placeholder3.y = placeholder2.y + placeholder2.height + Theme.paddingSmall;
-
break;
+
case 4:
- placeholder1.visible = true;
- placeholder2.visible = true;
- placeholder3.visible = true;
- placeholder4.visible = true;
+ placeholder1.visible = true
+ placeholder2.visible = true
+ placeholder3.visible = true
+ placeholder4.visible = true
placeholder1.width = placeholder2.width = placeholder3.width = placeholder4.width = (holder.width - 3*Theme.paddingSmall)/4
placeholder1.height = placeholder2.height = placeholder3.height = placeholder4.height = Theme.itemSizeLarge*2+Theme.paddingSmall
- placeholder2.x = 1*(placeholder1.width)+ 1*Theme.paddingSmall;
- placeholder3.x = 2*(placeholder1.width)+ 2*Theme.paddingSmall;
- placeholder4.x = 3*(placeholder1.width)+ 3*Theme.paddingSmall;
+ placeholder2.x = 1*(placeholder1.width)+ 1*Theme.paddingSmall
+ placeholder3.x = 2*(placeholder1.width)+ 2*Theme.paddingSmall
+ placeholder4.x = 3*(placeholder1.width)+ 3*Theme.paddingSmall
-
- holder.height = placeholder1.height
+ holder.height = placeholder1.height
break;
+
default:
holder.height = 0
placeholder1.visible = placeholder2.visible = placeholder3.visible = placeholder4.visible = false;
@@ -86,7 +89,7 @@ Item {
type = model.get(0).type
previewURL = model.get(0).preview_url
mediaURL = model.get(0).url
- height = 200
+ height = Theme.itemSizeLarge
return true
} else {
height = 0
@@ -105,7 +108,7 @@ Item {
type = model.get(1).type
previewURL = model.get(1).preview_url
mediaURL = model.get(1).url
- height = 200
+ height = Theme.itemSizeLarge
return true
} else {
height = 0
@@ -124,7 +127,7 @@ Item {
type = model.get(2).type
previewURL = model.get(2).preview_url
mediaURL = model.get(2).url
- height = 200
+ height = Theme.itemSizeLarge
return true
} else {
height = 0
@@ -143,7 +146,7 @@ Item {
type = model.get(3).type
previewURL = model.get(3).preview_url
mediaURL = model.get(3).url
- height = 200
+ height = Theme.itemSizeLarge
return true
} else {
height = 0
@@ -151,5 +154,4 @@ Item {
}
}
}
-
}
diff --git a/qml/pages/components/MediaFullScreen.qml b/qml/pages/components/MediaFullScreen.qml
index 38ec83a..cd53ec7 100644
--- a/qml/pages/components/MediaFullScreen.qml
+++ b/qml/pages/components/MediaFullScreen.qml
@@ -11,7 +11,7 @@ FullscreenContentPage {
property string mediaURL: ""
allowedOrientations: Orientation.All
- Component.onCompleted: function(){
+ Component.onCompleted: function() {
console.log(type)
console.log(previewURL)
console.log(mediaURL)
@@ -44,7 +44,7 @@ FullscreenContentPage {
Video {
id: video
anchors.fill: parent
- onErrorStringChanged: function(){
+ onErrorStringChanged: function() {
videoError.visible = true
}
onStatusChanged: {
@@ -60,7 +60,7 @@ FullscreenContentPage {
}
onPlaybackStateChanged: {
console.log(playbackState)
- switch (playbackState){
+ switch (playbackState) {
case MediaPlayer.PlayingState:
playerIcon.icon.source = "image://theme/icon-m-pause"
return;
@@ -72,7 +72,7 @@ FullscreenContentPage {
return;
}
}
- onPositionChanged: function(){
+ onPositionChanged: function() {
//console.log(duration)
//console.log(bufferProgress)
//console.log(position)
@@ -84,7 +84,7 @@ FullscreenContentPage {
}
}
onStopped: function() {
- if (video.duration < 30000)
+ if (type != 'video')
video.play()
else
video.stop()
@@ -151,7 +151,6 @@ FullscreenContentPage {
anchors.centerIn: parent
}
}
-
}
}
@@ -288,7 +287,7 @@ FullscreenContentPage {
id: failedLoading
Text {
text: qsTr("Error loading")
- font.pixelSize: Theme.fontSizeSmall;
+ font.pixelSize: Theme.fontSizeSmall
color: Theme.highlightColor
}
}
@@ -315,11 +314,10 @@ FullscreenContentPage {
}
icon.source: "image://theme/icon-m-cloud-download"
onClicked: {
- var filename = mediaURL.split("/");
- FileDownloader.downloadFile(mediaURL, filename[filename.length-1]);
+ var filename = mediaURL.split("/")
+ FileDownloader.downloadFile(mediaURL, filename[filename.length-1])
}
}
VerticalScrollDecorator { flickable: imageFlickable }
}
-
diff --git a/qml/pages/components/MiniHeader.qml b/qml/pages/components/MiniHeader.qml
index e227fd0..aa4f5e2 100644
--- a/qml/pages/components/MiniHeader.qml
+++ b/qml/pages/components/MiniHeader.qml
@@ -9,30 +9,23 @@ Item {
Label {
id: lblName
- text:
- if (account_display_name === "") {
- account_username.split('@')[0]
- }
- else account_display_name
+ text: account_display_name ? account_display_name : account_username.split('@')[0]
font.weight: Font.Bold
font.pixelSize: Theme.fontSizeSmall
- color: if (myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) {
- (pressed ? Theme.secondaryHighlightColor : (!highlight ? Theme.secondaryColor : Theme.secondaryHighlightColor))
- } else (pressed ? Theme.highlightColor : (!highlight ? Theme.primaryColor : Theme.secondaryColor))
+ color: if ( myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) {
+ ( pressed ? Theme.secondaryHighlightColor : (!highlight ? Theme.secondaryColor : Theme.secondaryHighlightColor ))
+ } else ( pressed ? Theme.highlightColor : ( !highlight ? Theme.primaryColor : Theme.secondaryColor ))
truncationMode: TruncationMode.Fade
width: contentWidth > parent.width /2 ? parent.width /2 : contentWidth
- anchors {
- left: parent.left
- leftMargin: Theme.paddingMedium
- }
+ anchors.left: parent.left
}
- Image {
- id: icnLocked
- visible: account_locked
- opacity: 0.8
- source: "image://theme/icon-s-secure?" + (pressed ? Theme.highlightColor : Theme.primaryColor)
- width: account_locked ? Theme.iconSizeExtraSmall*0.8 : 0
+ Icon {
+ id: icnBot
+ visible: account_bot
+ source: "../../images/icon-s-bot.svg?" + ( pressed ? Theme.highlightColor : Theme.primaryColor )
+ color: Theme.primaryColor
+ width: account_bot ? Theme.iconSizeExtraSmall * 1.3 : 0
height: width
y: Theme.paddingLarge
anchors {
@@ -44,15 +37,30 @@ Item {
Label {
id: lblScreenName
+ visible: model.type !== "follow"
text: '@'+account_username
font.pixelSize: Theme.fontSizeExtraSmall
- color: (pressed ? Theme.secondaryHighlightColor : Theme.secondaryColor)
+ color: ( pressed ? Theme.secondaryHighlightColor : Theme.secondaryColor )
truncationMode: TruncationMode.Fade
anchors {
- left: icnLocked.right
+ left: icnBot ? icnBot.right : icnLocked.right
+ leftMargin: Theme.paddingSmall
right: lblDate.left
- leftMargin: Theme.paddingMedium
- baseline: lblName.baseline
+ rightMargin: Theme.paddingMedium
+ verticalCenter: lblName.verticalCenter
+ }
+ }
+
+ Label {
+ id: lblScreenNameFollow
+ visible: model.type === "follow" && myList.type === "notifications"
+ text: '@'+account_username
+ font.pixelSize: Theme.fontSizeExtraSmall
+ color: ( pressed ? Theme.secondaryHighlightColor : Theme.secondaryColor )
+ truncationMode: TruncationMode.Fade
+ anchors {
+ left: parent.left
+ top: lblName.bottom
}
}
@@ -60,13 +68,11 @@ Item {
id: lblDate
text: Format.formatDate(created_at, new Date() - created_at < 60*60*1000 ? Formatter.DurationElapsedShort : Formatter.TimeValueTwentyFourHours)
font.pixelSize: Theme.fontSizeExtraSmall
- color: (pressed ? Theme.highlightColor : Theme.primaryColor)
+ color: ( pressed ? Theme.highlightColor : Theme.secondaryColor )
horizontalAlignment: Text.AlignRight
anchors {
right: parent.right
- rightMargin: Theme.horizontalPageMargin
- baseline: lblName.baseline
+ verticalCenter: lblName.verticalCenter
}
}
-
}
diff --git a/qml/pages/components/MiniStatus.qml b/qml/pages/components/MiniStatus.qml
index d9dc96c..48b77d6 100644
--- a/qml/pages/components/MiniStatus.qml
+++ b/qml/pages/components/MiniStatus.qml
@@ -26,13 +26,8 @@ Item {
Label {
id: lblRtByName
visible: type.length
- anchors {
- left: icon.right
- leftMargin: Theme.paddingMedium
- verticalCenter: icon.verticalCenter
- }
text: {
- var action = "";
+ var action = ""
switch(type){
case "reblog":
action = qsTr('boosted');
@@ -47,9 +42,14 @@ Item {
miniStatus.visible = false
action = type;
}
- return typeof reblog_account_username !== "undefined" ? '@' + reblog_account_username + ' ' + action : ''
+ return typeof reblog_account_username !== "undefined" ? "@" + reblog_account_username + " " + action : " "
}
font.pixelSize: Theme.fontSizeExtraSmall
color: Theme.highlightColor
+ anchors {
+ left: icon.right
+ leftMargin: Theme.paddingMedium
+ verticalCenter: icon.verticalCenter
+ }
}
}
diff --git a/qml/pages/components/MyImage.qml b/qml/pages/components/MyImage.qml
index 8e0be74..9b60c4d 100644
--- a/qml/pages/components/MyImage.qml
+++ b/qml/pages/components/MyImage.qml
@@ -89,5 +89,4 @@ Item {
}
}
}
-
}
diff --git a/qml/pages/components/MyList.qml b/qml/pages/components/MyList.qml
index ce8f5e6..14f90ea 100644
--- a/qml/pages/components/MyList.qml
+++ b/qml/pages/components/MyList.qml
@@ -70,7 +70,7 @@ SilicaListView {
text: qsTr("New Toot")
onClicked: {
pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), {
- //headerTitle: "New Toot",
+ headerTitle: qsTr("New Toot"),
type: "new"
})
}
@@ -84,8 +84,7 @@ SilicaListView {
}
}
- delegate: VisualContainer {
- } //Toot {}
+ delegate: VisualContainer { }
add: Transition {
NumberAnimation { property: "opacity"; from: 0; to: 1.0; duration: 800 }
@@ -129,7 +128,7 @@ SilicaListView {
openDrawer(contentY - scrollOffset > 0 ? false : true )
scrollOffset = contentY
}
- if(contentY+height > footerItem.y && !loadStarted && autoLoadMore){
+ if(contentY+height > footerItem.y && !loadStarted && autoLoadMore) {
loadData("append")
loadStarted = true
}
@@ -162,16 +161,16 @@ SilicaListView {
}
}
- function loadData(mode){
+ function loadData(mode) {
var p = []
if (params.length)
for(var i = 0; i 0 ? Theme.paddingLarge : 0 )+ lblName.paintedHeight + (type.length ? Theme.paddingLarge + iconRT.height : 0) + Theme.paddingLarge
-
- Image {
- id: iconRT
- y: Theme.paddingLarge
- anchors.right: avatar.right
- visible: type.length
- width: Theme.iconSizeExtraSmall
- height: width
- source: "../../images/boosted.svg"
- }
-
- Label {
- id: lblRtByName
- visible: type.length
- anchors.left: lblName.left
- anchors.bottom: iconRT.bottom
- font.pixelSize: Theme.fontSizeExtraSmall
- color: Theme.secondaryColor
- text: {
- var action;
- switch(type){
- case "reblog":
- action = qsTr('boosted');
- break;
- case "favourite":
- action = qsTr('favourited');
- break;
- case "follow":
- action = qsTr('followed you');
- break;
- default:
- action = type;
- }
- return '@' + retweetScreenName + ' ' + action
- }
- }
-
- Image {
- id: avatar
- x: Theme.horizontalPageMargin
- y: Theme.paddingLarge + (type.length ? iconRT.height+Theme.paddingMedium : 0)
- asynchronous: true
- width: Theme.iconSizeMedium
- height: width
- smooth: true
- source: account_avatar
- visible: true
- MouseArea {
- anchors.fill: parent
- onClicked: {
- pageStack.push(Qt.resolvedUrl("../ProfilePage.qml"), {
- "display_name": account_display_name,
- "username": account_username,
- "profileImage": account_avatar
- })
- }
- }
- }
-
- Label {
- id: lblName
- text: account_display_name
- font.weight: Font.Bold
- font.pixelSize: Theme.fontSizeSmall
- color: (pressed ? Theme.highlightColor : Theme.primaryColor)
- anchors {
- top: avatar.top
- topMargin: 0
- left: avatar.right
- leftMargin: Theme.paddingMedium
- }
- }
-
- Image {
- id: iconLocked
- visible: account_locked
- y: Theme.paddingLarge
- opacity: 0.8
- source: "image://theme/icon-s-secure?" + (pressed
- ? Theme.highlightColor
- : Theme.primaryColor)
- width: account_locked ? Theme.iconSizeExtraSmall*0.8 : 0
- height: width
- anchors {
- left: lblName.right
- leftMargin: Theme.paddingSmall
- verticalCenter: lblName.verticalCenter
- }
- }
-
- Label {
- id: lblScreenName
- truncationMode: TruncationMode.Fade
- text: '@'+account_username
- font.pixelSize: Theme.fontSizeExtraSmall
- color: (pressed ? Theme.secondaryHighlightColor : Theme.secondaryColor)
- anchors {
- left: iconLocked.right
- right: lblDate.left
- leftMargin: Theme.paddingMedium
- baseline: lblName.baseline
- }
- }
-
- Label {
- id: lblDate
- function timestamp() {
- var txt = Format.formatDate(created_at, Formatter.Timepoint)
- var elapsed = Format.formatDate(created_at, Formatter.DurationElapsedShort)
- return (elapsed ? elapsed : txt )
- }
- text: Format.formatDate(created_at, new Date() - created_at < 60*60*1000 ? Formatter.DurationElapsedShort : Formatter.TimeValueTwentyFourHours)
- font.pixelSize: Theme.fontSizeExtraSmall
- color: (pressed ? Theme.highlightColor : Theme.primaryColor)
- horizontalAlignment: Text.AlignRight
- anchors {
- right: parent.right
- baseline: lblName.baseline
- rightMargin: Theme.paddingLarge
- }
- }
-
- Text {
- id: lblText
- height: content.length ? paintedHeight : 0
- onLinkActivated: {
- console.log(link)
- if (link[0] === "@") {
- pageStack.push(Qt.resolvedUrl("../Profile.qml"), {
- "name": "",
- "username": link.substring(1),
- "profileImage": ""
- })
- } else if (link[0] === "#") {
- pageStack.pop(pageStack.find(function(page) {
- var check = page.isFirstPage === true;
- if (check)
- page.onLinkActivated(link)
- return check;
- }));
- send(link)
- } else {
- Qt.openUrlExternally(link);
- }
- }
- text: content
- textFormat: Text.RichText
- font.pixelSize: Theme.fontSizeSmall
- color: (pressed ? Theme.highlightColor : Theme.primaryColor)
- linkColor : Theme.highlightColor
- wrapMode: Text.Wrap
- maximumLineCount: 6
- anchors {
- left: lblName.left
- right: parent.right
- top: lblScreenName.bottom
- topMargin: Theme.paddingSmall
- rightMargin: Theme.paddingLarge
- }
- }
-
- onClicked: {
- pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), {
- headerTitle: "Conversation",
- toot_id: id,
- toot_url: status_url,
- //title: account_display_name,
- description: '@'+account_acc,
- avatar: account_avatar,
- type: "reply"
- })
- }
-
-}
diff --git a/qml/pages/components/VisualContainer.qml b/qml/pages/components/VisualContainer.qml
index 3778955..75c8ddc 100644
--- a/qml/pages/components/VisualContainer.qml
+++ b/qml/pages/components/VisualContainer.qml
@@ -14,6 +14,7 @@ BackgroundItem {
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)
+ // Background for Direct Messages in Notification View
Rectangle {
id: bgDirect
x: 0
@@ -28,7 +29,8 @@ BackgroundItem {
}
}
- Rectangle {
+ // Background for reblogs and favourited statuses in Notification View
+ /* Rectangle {
id: bgNotifications
x: 0
y: 0
@@ -40,9 +42,9 @@ BackgroundItem {
GradientStop { position: -0.5; color: "transparent" }
GradientStop { position: 0.4; color: Theme.highlightDimmerColor }
}
- }
+ } */
- MiniStatus {
+ MiniStatus { // Element showing reblog- or favourite status on top of Toot
id: miniStatus
anchors {
leftMargin: Theme.horizontalPageMargin
@@ -52,6 +54,7 @@ BackgroundItem {
}
}
+ // Account avatar
Image {
id: avatar
visible: true
@@ -83,8 +86,16 @@ BackgroundItem {
"username": model.account_acct,
"user_id": model.account_id,
"profileImage": model.account_avatar,
- "profileBackground": model.account_header
- })
+ "profileBackground": model.account_header,
+ "note": model.account_note,
+ "url": model.account_url,
+ "followers_count": model.account_followers_count,
+ "following_count": model.account_following_count,
+ "statuses_count": model.account_statuses_count,
+ "locked": model.account_locked,
+ "bot": model.account_bot,
+ "group": model.account_group
+ } )
}
}
@@ -113,7 +124,7 @@ BackgroundItem {
visible: status_visibility === "direct"
width: Theme.iconSizeMedium
height: width
- source: "image://theme/icon-m-mail"
+ source: "../../images/icon-m-mail.svg?"
anchors {
horizontalCenter: avatar.horizontalCenter
top: avatar.bottom
@@ -146,39 +157,68 @@ BackgroundItem {
width: Theme.iconSizeSmall
height: width
}
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ pageStack.push(Qt.resolvedUrl("../ProfilePage.qml"), {
+ "display_name": model.reblog_account_display_name,
+ "username": model.reblog_account_acct,
+ "user_id": model.reblog_account_id,
+ "profileImage": model.reblog_account_avatar,
+ "profileBackground": model.account_header,
+ "note": model.reblog_account_note,
+ "url": model.reblog_account_url,
+ "followers_count": model.reblog_account_followers_count,
+ "following_count": model.reblog_account_following_count,
+ "statuses_count": model.reblog_account_statuses_count,
+ "locked": model.reblog_account_locked,
+ "bot": model.reblog_account_bot,
+ "group": model.reblog_account_group
+ } )
+ }
+ }
}
}
+ // Display name, username, date of Toot
MiniHeader {
id: miniHeader
anchors {
top: avatar.top
left: avatar.right
+ leftMargin: Theme.paddingMedium
right: parent.right
+ rightMargin: Theme.horizontalPageMargin
}
}
- Text {
+ // Toot content
+ Label {
id: lblContent
+
visible: model.type !== "follow"
- text: content.replace(new RegExp(" paintedHeight ? contentWarningLabel.paintedHeight : paintedHeight) : 0
+ } else if (myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) {
+ Math.min( implicitHeight, Theme.itemSizeExtraLarge * 1.5 )
+ } else content.length ? ( contentWarningLabel.paintedHeight > paintedHeight ? contentWarningLabel.paintedHeight : paintedHeight ) : 0
anchors {
left: miniHeader.left
- leftMargin: Theme.paddingMedium
right: miniHeader.right
- rightMargin: Theme.horizontalPageMargin
top: miniHeader.bottom
topMargin: Theme.paddingSmall
bottomMargin: Theme.paddingLarge
@@ -210,8 +250,9 @@ BackgroundItem {
}
}
+ // Content warning cover for Toots
Rectangle {
- radius: 2
+ id: contentWarningBg
color: Theme.highlightDimmerColor
visible: status_spoiler_text.length > 0
anchors.fill: parent
@@ -244,22 +285,24 @@ BackgroundItem {
}
}
+ // Displays media in Toots
MediaBlock {
id: media
visible: if (myList.type === "notifications" && ( type === "favourite" || type === "reblog" )) {
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
anchors {
- left: lblContent.left
- right: lblContent.right
+ left: miniHeader.left
+ right: miniHeader.right
top: lblContent.bottom
- topMargin: Theme.paddingSmall
+ topMargin: Theme.paddingMedium
bottomMargin: Theme.paddingLarge
}
}
+ // Context menu for Toots
ContextMenu {
id: mnu
@@ -277,11 +320,11 @@ BackgroundItem {
"bgAction": true,
"action" : "statuses/"+model.status_id+"/" + (status ? "unreblog" : "reblog")
})
- model.reblogs_count = !status ? model.reblogs_count+1 : (model.reblogs_count > 0 ? model.reblogs_count-1 : model.reblogs_count);
+ model.status_reblogs_count = !status ? model.status_reblogs_count+1 : (model.status_reblogs_count > 0 ? model.status_reblogs_count-1 : model.status_reblogs_count);
model.reblogged = !model.reblogged
}
- Image {
+ Icon {
id: icRT
source: "image://theme/icon-s-retweet?" + (!model.reblogged ? Theme.highlightColor : Theme.primaryColor)
width: Theme.iconSizeExtraSmall
@@ -294,7 +337,7 @@ BackgroundItem {
}
Label {
- text: reblogs_count
+ text: status_reblogs_count // from API.js
font.pixelSize: Theme.fontSizeExtraSmall
color: !model.reblogged ? Theme.highlightColor : Theme.primaryColor
anchors {
@@ -308,9 +351,9 @@ BackgroundItem {
MenuItem {
id: mnuFavourite
visible: model.type !== "follow"
- text: typeof model.favourited !== "undefined" && model.favourited ? qsTr("Unfavorite") : qsTr("Favorite")
+ text: typeof model.status_favourited !== "undefined" && model.status_favourited ? qsTr("Unfavorite") : qsTr("Favorite")
onClicked: {
- var status = typeof model.favourited !== "undefined" && model.favourited
+ var status = typeof model.status_favourited !== "undefined" && model.status_favourited
worker.sendMessage({
"conf" : Logic.conf,
"params" : [],
@@ -318,26 +361,26 @@ BackgroundItem {
"bgAction": true,
"action" : "statuses/"+model.status_id+"/" + (status ? "unfavourite" : "favourite")
})
- model.favourites_count = !status ? model.favourites_count+1 : (model.favourites_count > 0 ? model.favourites_count-1 : model.favourites_count);
- model.favourited = !model.favourited
+ model.status_favourites_count = !status ? model.status_favourites_count+1 : (model.status_favourites_count > 0 ? model.status_favourites_count-1 : model.status_favourites_count);
+ model.status_favourited = !model.status_favourited
}
- Image {
+ Icon {
id: icFA
+ source: "image://theme/icon-s-favorite?" + (!model.status_favourited ? Theme.highlightColor : Theme.primaryColor)
+ width: Theme.iconSizeExtraSmall
+ height: width
anchors {
leftMargin: Theme.horizontalPageMargin
left: parent.left
verticalCenter: parent.verticalCenter
}
- width: Theme.iconSizeExtraSmall
- height: width
- source: "image://theme/icon-s-favorite?" + (!model.favourited ? Theme.highlightColor : Theme.primaryColor)
}
Label {
- text: favourites_count
+ text: status_favourites_count
font.pixelSize: Theme.fontSizeExtraSmall
- color: !model.favourited ? Theme.highlightColor : Theme.primaryColor
+ color: !model.status_favourited ? Theme.highlightColor : Theme.primaryColor
anchors {
left: icFA.right
leftMargin: Theme.paddingMedium
@@ -346,54 +389,83 @@ BackgroundItem {
}
}
+ MenuItem {
+ id: mnuBookmark
+ visible: model.type !== "follow"
+ text: typeof model.status_bookmarked !== "undefined" && model.status_bookmarked ? qsTr("Remove Bookmark") : qsTr("Bookmark")
+ onClicked: {
+ var status = typeof model.status_bookmarked !== "undefined" && model.status_bookmarked
+ worker.sendMessage({
+ "conf" : Logic.conf,
+ "params" : [],
+ "method" : "POST",
+ "bgAction": true,
+ "action" : "statuses/"+model.status_id+"/" + (status ? "unbookmark" : "bookmark")
+ })
+ model.status_bookmarked = !model.status_bookmarked
+ }
+
+ Icon {
+ source: "../../images/icon-s-bookmark.svg?"
+ color: !model.status_bookmarked ? Theme.highlightColor : Theme.primaryColor
+ width: Theme.iconSizeExtraSmall
+ height: width
+ anchors {
+ left: parent.left
+ leftMargin: Theme.horizontalPageMargin + Theme.paddingMedium
+ verticalCenter: parent.verticalCenter
+ }
+ }
+ }
+
+
MenuItem {
id: mnuMention
visible: model.type === "follow"
text: qsTr("Mention")
onClicked: {
pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), {
- headerTitle: "Mention",
+ headerTitle: qsTr("Mention"),
description: "@"+reblog_account_acct,
type: "new"
})
}
- Image {
+ Icon {
id: icMT
+ source: "image://theme/icon-s-chat?" + (!model.status_favourited ? Theme.highlightColor : Theme.primaryColor)
+ width: Theme.iconSizeExtraSmall
+ height: width
anchors {
- leftMargin: Theme.horizontalPageMargin
+ leftMargin: Theme.horizontalPageMargin + Theme.paddingMedium
left: parent.left
verticalCenter: parent.verticalCenter
}
- width: Theme.iconSizeExtraSmall
- height: width
- source: "image://theme/icon-s-chat?" + (!model.favourited ? Theme.highlightColor : Theme.primaryColor)
}
}
}
+ // Open ConversationPage and show other Toots in thread (if available)
onClicked: {
- 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")
m.append(mdl.get(index))
pageStack.push(Qt.resolvedUrl("../ConversationPage.qml"), {
- headerTitle: "Conversation",
- toot_id: status_id,
- toot_url: status_url,
- toot_uri: status_uri,
- title: account_display_name,
- description: '@'+account_acct,
- avatar: account_avatar,
+ headerTitle: qsTr("Conversation"),
+ "toot_id": status_id,
+ "toot_url": status_url,
+ "toot_uri": status_uri,
+ "description": '@'+account_acct,
mdl: m,
type: "reply"
})
}
onPressAndHold: {
console.log(JSON.stringify(mdl.get(index)))
- mnu.show(delegate)
+ mnu.open(delegate)
}
+
onDoubleClicked: {
console.log("double click")
}
-
}
diff --git a/src/imageuploader.cpp b/src/imageuploader.cpp
index 3153372..40ddb2a 100644
--- a/src/imageuploader.cpp
+++ b/src/imageuploader.cpp
@@ -11,15 +11,15 @@
//static const QUrl IMGUR_UPLOAD_URL("https://httpbin.org/post");
//static const QUrl IMGUR_UPLOAD_URL();
-ImageUploader::ImageUploader(QObject *parent) : QObject(parent), m_networkAccessManager(0), m_reply(0) {
+ImageUploader::ImageUploader(QObject *parent) : QObject(parent), m_networkAccessManager(nullptr), m_reply(nullptr) {
m_networkAccessManager = new QNetworkAccessManager(this);
}
ImageUploader::~ImageUploader() {
- if (m_reply != 0) {
+ if (m_reply != nullptr) {
m_reply->disconnect();
m_reply->deleteLater();
- m_reply = 0;
+ m_reply = nullptr;
}
}
@@ -58,10 +58,10 @@ void ImageUploader::upload() {
return;
}
- if (m_reply != 0) {
+ if (m_reply != nullptr) {
m_reply->disconnect();
m_reply->deleteLater();
- m_reply = 0;
+ m_reply = nullptr;
}
/*QFileInfo fileInfo(QUrl(m_fileName).toLocalFile());
@@ -146,6 +146,6 @@ void ImageUploader::replyFinished() {
}
m_reply->deleteLater();
- m_reply = 0;
+ m_reply = nullptr;
postdata.clear();
}
diff --git a/translations/harbour-tooterb-de.ts b/translations/harbour-tooterb-de.ts
index d3a6af8..61656dd 100644
--- a/translations/harbour-tooterb-de.ts
+++ b/translations/harbour-tooterb-de.ts
@@ -24,6 +24,7 @@
ConversationPage
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
Link kopieren
@@ -58,6 +59,15 @@
Toot gesendet!
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+ Antworten
+
+
+
+ Antwort verbergen
+
CoverPage
@@ -189,6 +199,14 @@
Bot
+
+
+ Folgt dir
+
+
+
+ Gruppe
+
ProfilePage
@@ -344,21 +362,6 @@
um bei den Übersetzungen mitzuhelfen.
-
- Toot
-
-
- hat geteilt
-
-
-
- hat favorisiert
-
-
-
- folgt dir
-
-
VisualContainer
@@ -381,5 +384,17 @@
Erwähnen
+
+
+ Konversation
+
+
+
+ Lesezeichen entfernen
+
+
+
+ Lesezeichen
+
diff --git a/translations/harbour-tooterb-el.ts b/translations/harbour-tooterb-el.ts
index a5e1201..95ffd93 100644
--- a/translations/harbour-tooterb-el.ts
+++ b/translations/harbour-tooterb-el.ts
@@ -24,6 +24,7 @@
ConversationPage
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
@@ -58,6 +59,15 @@
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+
+
+
+
+
+
CoverPage
@@ -189,6 +199,14 @@
+
+
+
+
+
+
+
+
ProfilePage
@@ -344,21 +362,6 @@
για να βοηθήσετε την μετάφραση της εφαρμογής στην γλώσσα σας.
-
- Toot
-
-
- προωθημένο
-
-
-
- στους σελιδοδείκτες
-
-
-
- σας ακολουθούν
-
-
VisualContainer
@@ -381,5 +384,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translations/harbour-tooterb-es.ts b/translations/harbour-tooterb-es.ts
index 75ca954..d538f0d 100644
--- a/translations/harbour-tooterb-es.ts
+++ b/translations/harbour-tooterb-es.ts
@@ -24,6 +24,7 @@
ConversationPage
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
Copiar enlace al portapapeles
@@ -58,6 +59,15 @@
¡Toot enviado!
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+ Respuesta
+
+
+
+ Cerrar respuesta
+
CoverPage
@@ -189,6 +199,14 @@
Bot
+
+
+ Te sigue
+
+
+
+ Grupo
+
ProfilePage
@@ -220,7 +238,7 @@
Is a button. Keep it as short as possible.
-
+ Requerido
@@ -253,7 +271,7 @@
-
+ Mencionar
@@ -344,21 +362,6 @@
para ayudar con traducciones.
-
- Toot
-
-
- retooteó
-
-
-
- marcó como favorito
-
-
-
- te empezó a seguir
-
-
VisualContainer
@@ -379,7 +382,19 @@
-
+ Mencionar
+
+
+
+ Conversación
+
+
+
+ Eliminar marcador
+
+
+
+ Marcador
diff --git a/translations/harbour-tooterb-fr.ts b/translations/harbour-tooterb-fr.ts
index 10f6ce9..6f2dcba 100644
--- a/translations/harbour-tooterb-fr.ts
+++ b/translations/harbour-tooterb-fr.ts
@@ -24,6 +24,7 @@
ConversationPage
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
Copier le lien
@@ -58,6 +59,15 @@
Pouet envoyé !
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+ Répondre
+
+
+
+ Fermer Répondre
+
CoverPage
@@ -189,6 +199,14 @@
Bot
+
+
+ Vous suit
+
+
+
+ Groupe
+
ProfilePage
@@ -344,21 +362,6 @@
pour aider à traduire cette application.
-
- Toot
-
-
- a partagé
-
-
-
- a ajouté à ses favoris
-
-
-
- vous suit
-
-
VisualContainer
@@ -381,5 +384,17 @@
Mentionner
+
+
+ Conversation
+
+
+
+ Retirer marque-page
+
+
+
+ Ajouter aux marque-pages
+
diff --git a/translations/harbour-tooterb-it.ts b/translations/harbour-tooterb-it.ts
index d73d685..007307c 100644
--- a/translations/harbour-tooterb-it.ts
+++ b/translations/harbour-tooterb-it.ts
@@ -4,23 +4,23 @@
API
-
+
ha apprezzato
-
+
ha iniziato a seguirti
-
+
ha condiviso
-
+
ha detto
@@ -28,47 +28,59 @@
ConversationPage
-
+
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
Copia link
-
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+ Risposta
+
+
+
+
+ Chiudere Risposta
+
+
+
Contenuto avviso
-
+
A cosa stai pensando?
-
+
Elimina
-
+
Pubblico
-
+ s
Non elencato
-
+ s
Solo ai seguaci
-
+
Diretto
-
+
Toot è stato pubblicato!
@@ -133,37 +145,37 @@
MainPage
-
+
Home
-
+
Notifiche
-
+
Locale
-
+
Federazione
-
+
Cerca
-
+
@utente o #termine
-
+
Nuovo toot
@@ -171,7 +183,7 @@
MediaFullScreen
-
+
Errore durante caricamento
@@ -179,17 +191,17 @@
MiniStatus
-
+
ha condiviso
-
+
ha apprezzato
-
+
ha iniziato a seguirti
@@ -213,6 +225,7 @@
+
Nuovo toot
@@ -225,7 +238,17 @@
ProfileHeader
-
+
+
+ Gruppo
+
+
+
+
+ Ti segue
+
+
+
Bot
@@ -233,78 +256,79 @@
ProfilePage
-
+
If there's no good translation for "About", use "Details" (in details about profile).
Dettagli
-
+
Will show as: "35 Followers"
Seguaci
-
+
Will show as: "23 Following"
Segue
-
+
Will show as: "115 Statuses"
Toots
-
+
+
Menzionare
-
+
Is a button. Keep it as short as possible.
Smetti di seguire
-
+
Is a button. Keep it as short as possible.
Richiesto
-
+
Is a button. Keep it as short as possible.
Segui
-
+
Is a button. Keep it as short as possible.
Non silenziare
-
+
Is a button. Keep it as short as possible.
Silenzia
-
+
Is a button. Keep it as short as possible.
Sblocca
-
+
Is a button. Keep it as short as possible.
Blocca
-
+
Aprire nel browser
@@ -332,136 +356,134 @@
Disabilitare questa opzione per conservare connessione dati
-
+
Account
-
+
Rimozione del account
-
+
Aggiungi account
-
+
Annullare l'autorizzazione dell'app e rimuovere l'account
-
+
Autorizzare l'app all'utilizzo del conto Mastodon
-
+
Tradurre
-
+
Full sentence for translation: "Use Transifex to help with app translation to your language." - The word Transifex is a link and doesn't need translation.
Utilizzare
-
+
per aiutare nella traduzione dell'app.
-
+
Sviluppo
-
+
Design UI/UX e sviluppo
-
+
Identità visiva
-
+
Sviluppo e traduzioni
-
+
Traduzione francese e occitanica
-
+
Traduzione cinese
-
+
Traduzione olandese
-
+
Traduzione spagnola
-
+
Aggiunto file README
-
- Toot
-
-
-
- ha condiviso
-
-
-
-
- ha apprezzato
-
-
-
-
- ha iniziato a seguirti
-
-
VisualContainer
-
+
Annulla condivisione
-
+
Condividi
-
+
Annulla apprezzamento
-
+
Apprezzato
-
+
+
+ Elimina segnalibro
+
+
+
+
+ Aggiungi segnalibro
+
+
+
+
Menzionare
+
+
+
+ Conversazione
+
diff --git a/translations/harbour-tooterb-nl.ts b/translations/harbour-tooterb-nl.ts
index 6879a00..e24485a 100644
--- a/translations/harbour-tooterb-nl.ts
+++ b/translations/harbour-tooterb-nl.ts
@@ -24,15 +24,16 @@
ConversationPage
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
Linkadres kopiëren
-
+ Waarschuwingstekst
-
+ Wat wil je kwijt?
@@ -40,23 +41,32 @@
-
+ Openbaar
-
+ Minder openbaar
-
+ Alleen volgers
-
+ Direct
-
+ Toot verzonden!
+
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+ Antwoord
+
+
+
+ Antwoord verbergen
@@ -96,7 +106,7 @@
-
+ Geldig Mastodon URL
@@ -189,6 +199,14 @@
Bot
+
+
+ Volgt jou
+
+
+
+ Groep
+
ProfilePage
@@ -253,7 +271,7 @@
- Vermelden
+ Vermelden
@@ -344,21 +362,6 @@
om deze app te helpen vertalen in jouw taal.
-
- Toot
-
-
- boostte
-
-
-
- maakte favoriet
-
-
-
- volgde jou
-
-
VisualContainer
@@ -381,5 +384,17 @@
Vermelden
+
+
+ Conversatie
+
+
+
+ Bookmarken
+
+
+
+ Bladwijzer verwijderen
+
diff --git a/translations/harbour-tooterb-nl_BE.ts b/translations/harbour-tooterb-nl_BE.ts
index 712bc42..9c9ccf0 100644
--- a/translations/harbour-tooterb-nl_BE.ts
+++ b/translations/harbour-tooterb-nl_BE.ts
@@ -24,6 +24,7 @@
ConversationPage
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
@@ -58,6 +59,15 @@
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+
+
+
+
+
+
CoverPage
@@ -189,6 +199,14 @@
Bot
+
+
+
+
+
+
+
+
ProfilePage
@@ -344,21 +362,6 @@
voor te helpen met dezen app in uw taal te vertalen.
-
- Toot
-
-
- heeft geboost
-
-
-
- heeft geduimd voor
-
-
-
- volgt u nu
-
-
VisualContainer
@@ -381,5 +384,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translations/harbour-tooterb-oc.ts b/translations/harbour-tooterb-oc.ts
index 4912f6c..70c903b 100644
--- a/translations/harbour-tooterb-oc.ts
+++ b/translations/harbour-tooterb-oc.ts
@@ -24,6 +24,7 @@
ConversationPage
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
@@ -58,6 +59,15 @@
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+
+
+
+
+
+
CoverPage
@@ -189,6 +199,14 @@
Bot
+
+
+
+
+
+
+
+
ProfilePage
@@ -344,21 +362,6 @@
per ajudar a traduire l’aplicacion dins vòstra lenga.
-
- Toot
-
-
- a tornat partejar
-
-
-
- a mes en favorit
-
-
-
- vos sèc
-
-
VisualContainer
@@ -381,5 +384,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translations/harbour-tooterb-pl.ts b/translations/harbour-tooterb-pl.ts
index b2fbbb9..9a2caba 100644
--- a/translations/harbour-tooterb-pl.ts
+++ b/translations/harbour-tooterb-pl.ts
@@ -24,6 +24,7 @@
ConversationPage
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
@@ -58,6 +59,15 @@
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+
+
+
+
+
+
CoverPage
@@ -189,6 +199,14 @@
Bot
+
+
+
+
+
+
+
+
ProfilePage
@@ -344,21 +362,6 @@
-
- Toot
-
-
- podbił(a)
-
-
-
- dodał(a) do ulubionych
-
-
-
- zaczął(-ęła Cię śledzić)
-
-
VisualContainer
@@ -381,5 +384,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translations/harbour-tooterb-ru.ts b/translations/harbour-tooterb-ru.ts
index 50a075a..105378a 100644
--- a/translations/harbour-tooterb-ru.ts
+++ b/translations/harbour-tooterb-ru.ts
@@ -24,6 +24,7 @@
ConversationPage
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
@@ -58,6 +59,15 @@
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+
+
+
+
+
+
CoverPage
@@ -189,6 +199,14 @@
+
+
+
+
+
+
+
+
ProfilePage
@@ -344,21 +362,6 @@
чтобы помочь с переводом приложения на ваш язык.
-
- Toot
-
-
- росту
-
-
-
- имеет любимый
-
-
-
- следую за тобой
-
-
VisualContainer
@@ -381,5 +384,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translations/harbour-tooterb-sr.ts b/translations/harbour-tooterb-sr.ts
index 471c224..aab50f1 100644
--- a/translations/harbour-tooterb-sr.ts
+++ b/translations/harbour-tooterb-sr.ts
@@ -24,6 +24,7 @@
ConversationPage
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
@@ -58,6 +59,15 @@
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+
+
+
+
+
+
CoverPage
@@ -189,6 +199,14 @@
+
+
+
+
+
+
+
+
ProfilePage
@@ -344,21 +362,6 @@
и помозите у преводу апликације на други језик.
-
- Toot
-
-
- разглашено
-
-
-
- омиљено
-
-
-
- вас прати
-
-
VisualContainer
@@ -381,5 +384,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translations/harbour-tooterb-sv.ts b/translations/harbour-tooterb-sv.ts
index 394ddbf..67ea6cf 100644
--- a/translations/harbour-tooterb-sv.ts
+++ b/translations/harbour-tooterb-sv.ts
@@ -24,6 +24,7 @@
ConversationPage
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
@@ -58,6 +59,15 @@
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+
+
+
+
+
+
CoverPage
@@ -189,6 +199,14 @@
Bot
+
+
+
+
+
+
+
+
ProfilePage
@@ -344,21 +362,6 @@
för att hjälpa med app-översättningar till ditt språk.
-
- Toot
-
-
- puffade
-
-
-
- favoriserad
-
-
-
- följer dig
-
-
VisualContainer
@@ -381,5 +384,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translations/harbour-tooterb-zh_CN.ts b/translations/harbour-tooterb-zh_CN.ts
index fb93b97..a00b9e4 100644
--- a/translations/harbour-tooterb-zh_CN.ts
+++ b/translations/harbour-tooterb-zh_CN.ts
@@ -24,6 +24,7 @@
ConversationPage
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
复制链接到剪切板
@@ -58,6 +59,15 @@
已发送嘟嘟!
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+
+
+
+
+
+
CoverPage
@@ -189,6 +199,14 @@
+
+
+
+
+
+
+
+
ProfilePage
@@ -344,21 +362,6 @@
-
- Toot
-
-
- 推起
-
-
-
- 收藏
-
-
-
- 关注你
-
-
VisualContainer
@@ -381,5 +384,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translations/harbour-tooterb.ts b/translations/harbour-tooterb.ts
index 2a521e4..e3b0909 100644
--- a/translations/harbour-tooterb.ts
+++ b/translations/harbour-tooterb.ts
@@ -24,6 +24,7 @@
ConversationPage
+ Use the translation of "Copy Link" for a shorter PullDownMenu label
Copy Link to Clipboard
@@ -58,6 +59,15 @@
Toot sent!
+
+
+ "Reply" will show the Toot text entry Panel. "Hide Reply" closes it. Alternative: Use "Close Reply"
+ Reply
+
+
+
+ Hide Reply
+
CoverPage
@@ -189,6 +199,14 @@
Bot
+
+
+ Follows you
+
+
+
+ Group
+
ProfilePage
@@ -344,21 +362,6 @@
to help with app translation to your language.
-
- Toot
-
-
- boosted
-
-
-
- favourited
-
-
-
- followed you
-
-
VisualContainer
@@ -381,5 +384,17 @@
Mention
+
+
+ Conversation
+
+
+
+ Remove Bookmark
+
+
+
+ Bookmark
+