diff --git a/harbour-tooter.pro b/harbour-tooter.pro
index eb7ed40..8b1cb5f 100644
--- a/harbour-tooter.pro
+++ b/harbour-tooter.pro
@@ -114,4 +114,4 @@ TRANSLATIONS += translations/harbour-tooter-pl.ts
TRANSLATIONS += translations/harbour-tooter-ru.ts
TRANSLATIONS += translations/harbour-tooter-sr.ts
TRANSLATIONS += translations/harbour-tooter-sv.ts
-TRANSLATIONS += translations/harbour-tooter-zh.ts
+TRANSLATIONS += translations/harbour-tooter-zh_CN.ts
diff --git a/qml/images/emojiselect.svg b/qml/images/emojiselect.svg
new file mode 100644
index 0000000..ffef849
--- /dev/null
+++ b/qml/images/emojiselect.svg
@@ -0,0 +1,14 @@
+
diff --git a/qml/images/federated.svg b/qml/images/federated.svg
deleted file mode 100644
index 5511f58..0000000
--- a/qml/images/federated.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
diff --git a/qml/images/home.svg b/qml/images/home.svg
deleted file mode 100644
index be54abc..0000000
--- a/qml/images/home.svg
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
diff --git a/qml/images/local.svg b/qml/images/local.svg
deleted file mode 100644
index 1ae1e7f..0000000
--- a/qml/images/local.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
diff --git a/qml/images/public.svg b/qml/images/public.svg
deleted file mode 100644
index bb92391..0000000
--- a/qml/images/public.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
diff --git a/qml/images/search.svg b/qml/images/search.svg
deleted file mode 100644
index 53514ed..0000000
--- a/qml/images/search.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
diff --git a/qml/lib/Worker.js b/qml/lib/Worker.js
index ff34e44..bbd6a6b 100644
--- a/qml/lib/Worker.js
+++ b/qml/lib/Worker.js
@@ -60,6 +60,7 @@ WorkerScript.onMessage = function(msg) {
} else if(msg.action === "notifications") {
// notification
//console.log("Is notification... parsing...")
+ console.log(JSON.stringify(data[i]))
item = parseNotification(data[i]);
items.push(item)
@@ -81,7 +82,7 @@ WorkerScript.onMessage = function(msg) {
console.log("descendants")
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)
@@ -148,12 +149,20 @@ function parseNotification(data){
};
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;
case "reblog":
+ if (!data.status) {
+ break;
+ }
+
item = parseToot(data.status)
item = parseAccounts(item, "reblog_", data["account"])
item = parseAccounts(item, "", data["status"]["account"])
@@ -162,6 +171,10 @@ function parseNotification(data){
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"])
diff --git a/qml/pages/Browser.qml b/qml/pages/Browser.qml
deleted file mode 100644
index 4143575..0000000
--- a/qml/pages/Browser.qml
+++ /dev/null
@@ -1,284 +0,0 @@
-/****************************************************************************************
-**
-** Copyright (C) 2013 Jolla Ltd.
-** Contact: Raine Makelainen
-** All rights reserved.
-**
-** This file is part of Sailfish Silica UI component package.
-**
-** You may use this file under the terms of BSD license as follows:
-**
-** Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in the
-** documentation and/or other materials provided with the distribution.
-** * Neither the name of the Jolla Ltd nor the
-** names of its contributors may be used to endorse or promote products
-** derived from this software without specific prior written permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
-** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-**
-****************************************************************************************/
-
-import QtQuick 2.0
-import QtWebKit 3.0
-import Sailfish.Silica 1.0
-
-Page {
- id: browser
- property string href;
- property bool screenReaderMode: true
- property bool loaded: false
- property string articleContent: ""
- property string articleTitle: ""
- property string articleDate: ""
- property string articleImage: ""
- onLoadedChanged: {
- pullDownMenu.busy = pullDownMenu2.busy = !loaded
- }
- onStatusChanged: {
- if (status === PageStatus.Active) {
- fetchData();
- }
-
- }
- onScreenReaderModeChanged: {
- loaded = false;
- fetchData();
- }
-
- allowedOrientations: Orientation.All
- function fetchData(){
- var xhr = new XMLHttpRequest();
- xhr.open("GET", "https://mercury.postlight.com/parser?url="+href, true);
- xhr.onreadystatechange = function() {
- if ( xhr.readyState === xhr.DONE ) {
- if ( xhr.status === 200 ) {
- console.log(xhr.responseText)
- var response = JSON.parse(xhr.responseText);
- //if (response.date_published)
- //articleDate = new Date(response.date_published.replace(/^(\w+) (\w+) (\d+) ([\d:]+) \+0000 (\d+)$/,"$1, $2 $3 $5 $4 GMT"));
- if (response.title)
- articleTitle = response.title;
- if (response.lead_image_url)
- articleImage = response.lead_image_url
- if (response.content)
- articleContent = response.content;
- if (response.content && response.lead_image_url)
- articleContent = articleContent.replace(articleImage, "")
- } else {
-
- }
- loaded = true;
- }
- }
- xhr.setRequestHeader("Content-Type", 'application/json');
- xhr.setRequestHeader("x-api-key", 'uakC11NlSubREs1r5NjkOCS1NJEkwti6DnDutcYC');
-
- if (screenReaderMode)
- xhr.send();
- else
- webView.url = 'https://mercury.postlight.com/amp?url='+href
- }
-
-
-
- BusyIndicator {
- id: loading
- size: BusyIndicatorSize.Large
- anchors.centerIn: parent
- running: !loaded
- }
-
- SilicaWebView {
- enabled: !screenReaderMode
- visible: !screenReaderMode
- id: webView
- anchors {
- fill: parent
- }
-
- PullDownMenu {
- id: pullDownMenu
- MenuItem {
- text: qsTr("Open in Browser")
- onClicked: {
- Qt.openUrlExternally(href);
- }
- }
- MenuItem {
- text: screenReaderMode ? qsTr("Web mode") : qsTr("Reading mode")
- onClicked: {
- screenReaderMode = !screenReaderMode
- }
- }
- }
-
- opacity: 0
- onLoadingChanged: {
- switch (loadRequest.status)
- {
- case WebView.LoadSucceededStatus:
- opacity = 1
- loaded = true;
- break
- case WebView.LoadFailedStatus:
- opacity = 0
- loaded = true;
- viewPlaceHolder.errorString = loadRequest.errorString
- break
- default:
- opacity = 0
- loaded = false;
- break
- }
- }
- FadeAnimation on opacity {}
- }
- ViewPlaceholder {
- id: viewPlaceHolder
- property string errorString
- enabled: webView.opacity === 0 && loaded && !screenReaderMode
- text: errorString
- hintText: "Check network connectivity and pull down to reload"
- }
-
-
-
- SilicaFlickable {
- visible: screenReaderMode
- enabled: screenReaderMode
- anchors {
- fill: parent
- }
- contentHeight: article.height
- VerticalScrollDecorator {}
- PullDownMenu {
- id: pullDownMenu2
- MenuItem {
- text: qsTr("Copy URL")
- onClicked: Clipboard.text = href
- }
- MenuItem {
- text: qsTr("Open in Browser")
- onClicked: Qt.openUrlExternally(href);
- }
- MenuItem {
- text: screenReaderMode ? qsTr("Web mode") : qsTr("Reading mode")
- onClicked: {
- screenReaderMode = !screenReaderMode
- }
- }
- }
- Column {
-
- id: article
- width: parent.width
-
- Rectangle {
- height: Theme.itemSizeExtraSmall/3
- width: parent.width
- opacity: 0
- }
-
- Label {
- id: title
- text: articleTitle
- font.pixelSize: Theme.fontSizeLarge
- color: Theme.highlightColor
- textFormat: Text.StyledText
- wrapMode: Text.WordWrap
- font.bold: true
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.paddingLarge
- rightMargin: Theme.paddingLarge
- }
- }
- Label {
- id: date
- visible: articleDate !== ""
- text: articleDate
- font.pixelSize: Theme.fontSizeExtraSmall
- color: Theme.secondaryColor
- anchors {
- left: parent.left
- right: parent.right
- topMargin: Theme.paddingSmall
- bottomMargin: Theme.paddingSmall
- leftMargin: Theme.paddingLarge
- rightMargin: Theme.paddingLarge
- }
- }
- Rectangle {
- height: image.visible ? Theme.itemSizeExtraSmall/3 : 0
- width: parent.width
- opacity: 0
- }
- Image {
- id: image
- visible: articleImage !== "" ? true : false
- source: articleImage
- width: parent.width
- height: Theme.itemSizeExtraLarge
- fillMode: Image.PreserveAspectCrop
- anchors {
- left: parent.left
- right: parent.right
- }
- BusyIndicator {
- size: BusyIndicatorSize.Small
- anchors.centerIn: parent
- running: parent.status != Image.Ready
- }
-
- onStatusChanged: if (image.status === Image.Ready) {
- var ratio = image.sourceSize.width/image.sourceSize.height
- height = width / ratio
- }
- }
- Rectangle {
- height: image.visible ? Theme.itemSizeExtraSmall/3 : 0
- width: parent.width
- opacity: 0
- }
- Label {
- id: content
- readonly property string _linkStyle: ""
- textFormat: Text.RichText
- text: _linkStyle + articleContent;
- font.pixelSize: Theme.fontSizeSmall
- color: Theme.secondaryColor
- wrapMode: Text.WordWrap
- anchors {
- left: parent.left
- right: parent.right
- topMargin: image.visible ? Theme.paddingSmall : Theme.paddingLarge
- leftMargin: Theme.paddingLarge
- rightMargin: Theme.paddingLarge
- bottomMargin: Theme.paddingLarge
- }
-
- }
- Rectangle {
- height: Theme.itemSizeExtraSmall/3
- width: parent.width
- opacity: 0
- }
-
- }
- }
-}
diff --git a/qml/pages/Conversation.qml b/qml/pages/Conversation.qml
index fbfc551..fce4817 100644
--- a/qml/pages/Conversation.qml
+++ b/qml/pages/Conversation.qml
@@ -5,587 +5,621 @@ import "../lib/API.js" as Logic
import "./components/"
Page {
- id: conversationPage
- 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: ""
+ id: conversationPage
+ 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 int tootMaxChar: 500;
- 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} ],
+ 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
+ }
+ }
- '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
+ }
+ SilicaListView {
+ id: conversationList
+ header: PageHeader {
+ title: qsTr("Conversation")
+ }
+ clip: true
+ anchors {
+ top: parent.top
+ bottom: panel.top
+ left: parent.left
+ right: parent.right
+ }
+ 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)
+ }
+ }
+ }
+ }
+ Rectangle {
+ id: predictionList
+ visible: false
+ anchors.bottom: panel.top
+ anchors.left: parent.left
+ anchors.right: panel.right
+ height: suggestedModel.count > 6 ? Theme.itemSizeMedium * 6 : Theme.itemSizeMedium * suggestedModel.count
+ color: Theme.highlightDimmerColor
- ProfileHeader {
- id: header
- visible: false
- }
- SilicaListView {
- id: conversationList
- header: PageHeader {
- title: qsTr("Conversation")
- }
- clip: true;
- anchors {
- top: parent.top
- bottom: panel.top
- left: parent.left
- right: parent.right
- }
- 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 )
- }
- }
- }
+ SilicaListView {
+ anchors.fill: parent
+ model: suggestedModel
+ clip: true
- }
- Rectangle {
- id: predictionList
- visible: false;
- anchors.bottom: panel.top
- anchors.left: parent.left
- anchors.right: panel.right
- height: suggestedModel.count > 6 ? Theme.itemSizeMedium * 6 : Theme.itemSizeMedium * suggestedModel.count
- color: Theme.highlightDimmerColor
+ delegate: ItemUser {
+ 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()
- SilicaListView {
- anchors.fill: parent
- model: suggestedModel
- clip: true
+ toot.cursorPosition = toot.text.indexOf('@' + model.account_acct)
+ }
+ }
+ onCountChanged: {
+ positionViewAtIndex(suggestedModel.count - 1, ListView.End)
+ }
+ }
+ }
- delegate: ItemUser {
- 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()
+ DockedPanel {
+ id: panel
+ open: true
+ onExpandedChanged: {
+ if (!expanded) {
+ show()
+ }
+ }
- toot.cursorPosition = toot.text.indexOf('@'+model.account_acct)
- }
- }
- onCountChanged: {
- positionViewAtIndex(suggestedModel.count-1, ListView.End )
- }
- }
- }
+ width: parent.width
+ height: progressBar.height + toot.height + (mediaModel.count ? uploadedImages.height : 0)
+ + btnContentWarning.height + Theme.paddingMedium
+ + (warningContent.visible ? warningContent.height : 0)
+ dock: Dock.Bottom
+ Rectangle {
+ 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
- DockedPanel {
- id: panel
- open: true
- onExpandedChanged: {
- if (!expanded) {
- show()
- }
- }
+ height: Theme.itemSizeSmall * 0.05
+ color: Theme.highlightBackgroundColor
+ opacity: 0.7
+ anchors {
+ left: parent.left
+ top: parent.top
+ }
+ }
- width: parent.width
- height: progressBar.height + toot.height + (mediaModel.count ? uploadedImages.height : 0) + btnContentWarning.height + Theme.paddingMedium + (warningContent.visible ? warningContent.height : 0)
- dock: Dock.Bottom
- Rectangle {
- 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;
+ 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
+ placeholderText: qsTr("Write your warning here")
+ placeholderColor: palette.highlightColor
+ color: palette.highlightColor
+ horizontalAlignment: Text.AlignLeft
+ EnterKey.onClicked: {
+ //tweet()
+ }
+ }
+ TextInput {
+ id: textOperations
+ visible: false
+ }
- height: Theme.itemSizeSmall * 0.05
- color: Theme.highlightBackgroundColor
- opacity: 0.7
- anchors {
- left: parent.left
- top: parent.top
- }
- }
+ TextArea {
+ id: toot
+ anchors {
+ top: warningContent.bottom
+ topMargin: Theme.paddingMedium
+ left: parent.left
+ right: parent.right
+ rightMargin: Theme.paddingMedium
+ }
+ autoScrollEnabled: true
+ labelVisible: false
+ //focus: true
+ text: description !== "" && (description.charAt(0) == '@'
+ || description.charAt(
+ 0) == '#') ? description + ' ' : ''
+ height: Math.max(270, Math.min(900, implicitHeight))
+ //height: implicitHeight
+ horizontalAlignment: Text.AlignLeft
+ placeholderText: qsTr("What's on your mind?")
+ EnterKey.onClicked: {
+ //tweet()
+ }
+ 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
+ property string selection
+ onSelectionChanged: {
+ console.log(selection)
+ }
- 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
- placeholderText: qsTr("Content warning!")
- horizontalAlignment: Text.AlignLeft
- EnterKey.onClicked: {
- //tweet()
- }
- }
- TextInput {
- id: textOperations
- visible: false
- }
-
- TextArea {
- id: toot
- anchors {
+ anchors {
top: warningContent.bottom
- topMargin: Theme.paddingMedium
- left: parent.left
- right: parent.right
- rightMargin: Theme.paddingMedium
- }
- autoScrollEnabled: true
- labelVisible: false
- //focus: true
- text: description !== "" && (description.charAt(0) == '@' || description.charAt(0) == '#') ? description+' ' : ''
- height: implicitHeight
- horizontalAlignment: Text.AlignLeft
- EnterKey.onClicked: {
- //tweet()
- }
- 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
- property string selection
- onSelectionChanged: {
- console.log(selection)
- }
-
- anchors {
- bottom: bottom.top
- right: parent.right
- rightMargin: Theme.paddingSmall
- }
- icon.source: "image://theme/icon-s-mms?" + (pressed
- ? Theme.highlightColor
- : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
- onClicked: pageStack.push(firstWizardPage)
- }
- SilicaGridView {
- id: uploadedImages
- width: parent.width
- anchors.bottom: parent.bottom
+ bottom: bottom.top
+ right: parent.right
+ rightMargin: Theme.paddingSmall
+ }
+ icon.source: "../../qml/images/emojiselect.svg" + (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
+ onClicked: pageStack.push(firstWizardPage)
+ }
+ SilicaGridView {
+ id: uploadedImages
+ width: parent.width
+ anchors.top: bottom.toot
+ anchors.bottom: parent.bottom
height: mediaModel.count ? Theme.itemSizeSmall : 0
- model: mediaModel
- cellWidth: uploadedImages.width / 4
+ model: mediaModel
+ cellWidth: uploadedImages.width / 4
cellHeight: Theme.itemSizeSmall
- delegate: BackgroundItem {
- id: myDelegate
- width: uploadedImages.cellWidth
- height: uploadedImages.cellHeight
- RemorseItem { id: remorse }
- Image {
- anchors.fill: parent
- fillMode: Image.PreserveAspectCrop
- source: model.preview_url
- }
+ 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 }
- }
+ 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 {
+ 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 {
- verticalCenter: privacy.verticalCenter
- left: parent.left
- leftMargin: Theme.paddingMedium
- }
- icon.source: "image://theme/icon-s-high-importance?" + (pressed
- ? Theme.highlightColor
- : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
- onClicked: warningContent.visible = !warningContent.visible
- }
- IconButton {
- id: btnAddImage
- enabled: mediaModel.count < 4
- anchors {
- verticalCenter: privacy.verticalCenter
- 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
+ id: btnContentWarning
+ anchors {
+ verticalCenter: privacy.verticalCenter
+ 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 {
+ verticalCenter: privacy.verticalCenter
+ 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
- }
+ onProgressChanged: {
+ console.log("progress " + progress)
+ uploadProgress.width = parent.width * progress
+ }
- onSuccess: {
- uploadProgress.width =0
- console.log(replyData);
+ onSuccess: {
+ uploadProgress.width = 0
+ console.log(replyData)
- mediaModel.append(JSON.parse(replyData))
+ mediaModel.append(JSON.parse(replyData))
+ }
-
- }
-
- onFailure: {
- uploadProgress.width =0
- btnAddImage.enabled = true;
- console.log(status)
- console.log(statusText)
-
- }
-
- }
- ComboBox {
- id: privacy
- anchors {
+ onFailure: {
+ uploadProgress.width = 0
+ btnAddImage.enabled = true
+ console.log(status)
+ console.log(statusText)
+ }
+ }
+ ComboBox {
+ id: privacy
+ anchors {
top: toot.bottom
- topMargin: -Theme.paddingSmall*2
- left: btnAddImage.right
- right: btnSend.left
- }
- menu: ContextMenu {
- MenuItem { text: qsTr("public") }
- MenuItem { text: qsTr("unlisted") }
- MenuItem { text: qsTr("followers only") }
- MenuItem { text: qsTr("direct") }
- }
- }
- IconButton {
- id: btnSend
- icon.source: "image://theme/icon-m-enter?" + (pressed
- ? Theme.highlightColor
- : Theme.primaryColor)
- anchors {
+ topMargin: -Theme.paddingSmall * 2
+ left: btnAddImage.right
+ right: btnSend.left
+ }
+ menu: ContextMenu {
+ MenuItem {
+ text: qsTr("Public")
+ }
+ MenuItem {
+ text: qsTr("Unlisted")
+ }
+ MenuItem {
+ text: qsTr("Followers-only")
+ }
+ MenuItem {
+ text: qsTr("Direct")
+ }
+ }
+ }
+
+ IconButton {
+ id: btnSend
+ icon.source: "image://theme/icon-m-send?"
+ + (pressed ? Theme.highlightColor : Theme.primaryColor)
+ anchors {
top: toot.bottom
- right: parent.right
- rightMargin: Theme.paddingLarge
- }
- enabled: toot.text !== "" && toot.text.length < tootMaxChar
- 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)
- }
+ 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 = []
+ 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 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()
- }
- }
+ worker.sendMessage(msg)
+ warningContent.text = ""
+ toot.text = ""
+ mediaModel.clear()
+ pageStack.pop()
+ }
+ }
+ Rectangle {
+ id: uploadProgress
+ color: Theme.highlightBackgroundColor
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ height: 3
+ }
+ }
+ 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())
- Rectangle {
- id: uploadProgress
- color: Theme.highlightBackgroundColor
- anchors.bottom: parent.bottom
- anchors.left: parent.left
- height: 3
- }
- }
- 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;
- }
+ worker.sendMessage({
+ "action": 'statuses/' + mdl.get(0).status_id + '/context',
+ "method": 'GET',
+ "model": mdl,
+ "params": { },
+ "conf": Logic.conf
+ })
+ }
+ Component {
+ id: firstWizardPage
- console.log(JSON.stringify())
+ Dialog {
+ id: emoticonsDialog
+ canAccept: false //selector.currentIndex >= 0
- worker.sendMessage({
- 'action' : 'statuses/'+mdl.get(0).status_id+'/context',
- 'method' : 'GET',
- 'model' : mdl,
- 'params' : { },
- 'conf' : Logic.conf
- });
- }
- Component {
- id: firstWizardPage
+ //acceptDestination: conversationPage
+ onAcceptPendingChanged: {
+ if (acceptPending) {
- Dialog {
- id: emoticonsDialog
- canAccept: false; //selector.currentIndex >= 0
- //acceptDestination: conversationPage
+ // Tell the destination page what the selected category is
+ // acceptDestinationInstance.category = selector.value
+ }
+ }
- onAcceptPendingChanged: {
- if (acceptPending) {
- // Tell the destination page what the selected category is
- // acceptDestinationInstance.category = selector.value
- }
- }
+ SilicaGridView {
+ id: gridView
+ anchors.fill: parent
+ cellWidth: gridView.width / 6
+ cellHeight: cellWidth
+ header: PageHeader {
+ title: qsTr("Emojis")
+ description: qsTr("Tap to insert")
+ }
+ 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: "🙏" }
- SilicaGridView {
- id: gridView
- anchors.fill: parent
- cellWidth: gridView.width / 6
- cellHeight: cellWidth
- header: PageHeader {
- title: qsTr("Emojis")
- description: qsTr("Tap to insert")
- }
- 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: "Transport and map"; glyph: "🚀" }
+ ListElement { section: "Transport and map"; glyph: "🚃" }
+ ListElement { section: "Transport and map"; glyph: "🚀" }
+ ListElement { section: "Transport and map"; glyph: "🚄" }
+ ListElement { section: "Transport and map"; glyph: "🚅" }
+ ListElement { section: "Transport and map"; glyph: "🚇" }
+ ListElement { section: "Transport and map"; glyph: "🚉" }
+ ListElement { section: "Transport and map"; glyph: "🚌" }
+ ListElement { section: "Transport and map"; glyph: "🚏" }
+ ListElement { section: "Transport and map"; glyph: "🚑" }
+ ListElement { section: "Transport and map"; glyph: "🚒" }
+ ListElement { section: "Transport and map"; glyph: "🚓" }
+ ListElement { section: "Transport and map"; glyph: "🚕" }
+ ListElement { section: "Transport and map"; glyph: "🚗" }
+ ListElement { section: "Transport and map"; glyph: "🚙" }
+ ListElement { section: "Transport and map"; glyph: "🚚" }
+ ListElement { section: "Transport and map"; glyph: "🚢" }
+ ListElement { section: "Transport and map"; glyph: "🚨" }
+ ListElement { section: "Transport and map"; glyph: "🚩" }
+ ListElement { section: "Transport and map"; glyph: "🚪" }
+ ListElement { section: "Transport and map"; glyph: "🚫" }
+ ListElement { section: "Transport and map"; glyph: "🚬" }
+ ListElement { section: "Transport and map"; glyph: "🚭" }
+ ListElement { section: "Transport and map"; glyph: "🚲" }
+ ListElement { section: "Transport and map"; glyph: "🚶" }
+ ListElement { section: "Transport and map"; glyph: "🚹" }
+ ListElement { section: "Transport and map"; glyph: "🚺" }
+ ListElement { section: "Transport and map"; glyph: "🚻" }
+ ListElement { section: "Transport and map"; glyph: "🚼" }
+ ListElement { section: "Transport and map"; glyph: "🚽" }
+ ListElement { section: "Transport and map"; glyph: "🚾" }
+ ListElement { section: "Transport and map"; glyph: "🛀" }
-
- ListElement { section: "Transport and map"; glyph: "🚀" }
- ListElement { section: "Transport and map"; glyph: "🚃" }
- ListElement { section: "Transport and map"; glyph: "🚀" }
- ListElement { section: "Transport and map"; glyph: "🚄" }
- ListElement { section: "Transport and map"; glyph: "🚅" }
- ListElement { section: "Transport and map"; glyph: "🚇" }
- ListElement { section: "Transport and map"; glyph: "🚉" }
- ListElement { section: "Transport and map"; glyph: "🚌" }
- ListElement { section: "Transport and map"; glyph: "🚏" }
- ListElement { section: "Transport and map"; glyph: "🚑" }
- ListElement { section: "Transport and map"; glyph: "🚒" }
- ListElement { section: "Transport and map"; glyph: "🚓" }
- ListElement { section: "Transport and map"; glyph: "🚕" }
- ListElement { section: "Transport and map"; glyph: "🚗" }
- ListElement { section: "Transport and map"; glyph: "🚙" }
- ListElement { section: "Transport and map"; glyph: "🚚" }
- ListElement { section: "Transport and map"; glyph: "🚢" }
- ListElement { section: "Transport and map"; glyph: "🚨" }
- ListElement { section: "Transport and map"; glyph: "🚩" }
- ListElement { section: "Transport and map"; glyph: "🚪" }
- ListElement { section: "Transport and map"; glyph: "🚫" }
- ListElement { section: "Transport and map"; glyph: "🚬" }
- ListElement { section: "Transport and map"; glyph: "🚭" }
- ListElement { section: "Transport and map"; glyph: "🚲" }
- ListElement { section: "Transport and map"; glyph: "🚶" }
- ListElement { section: "Transport and map"; glyph: "🚹" }
- ListElement { section: "Transport and map"; glyph: "🚺" }
- ListElement { section: "Transport and map"; glyph: "🚻" }
- ListElement { section: "Transport and map"; glyph: "🚼" }
- ListElement { section: "Transport and map"; glyph: "🚽" }
- ListElement { section: "Transport and map"; glyph: "🚾" }
- ListElement { section: "Transport and map"; glyph: "🛀" }
-
- ListElement { section: "Horoscope Signs"; glyph: "♈" }
- ListElement { section: "Horoscope Signs"; glyph: "♉" }
- ListElement { section: "Horoscope Signs"; glyph: "♊" }
- ListElement { section: "Horoscope Signs"; glyph: "♋" }
- ListElement { section: "Horoscope Signs"; glyph: "♌" }
- ListElement { section: "Horoscope Signs"; glyph: "♍" }
- ListElement { section: "Horoscope Signs"; glyph: "♎" }
- ListElement { section: "Horoscope Signs"; glyph: "♏" }
- ListElement { section: "Horoscope Signs"; glyph: "♐" }
- ListElement { section: "Horoscope Signs"; glyph: "♑" }
- ListElement { section: "Horoscope Signs"; glyph: "♒" }
- ListElement { section: "Horoscope Signs"; glyph: "♓" }
-
-
-
-
-
- }
- delegate: BackgroundItem {
- width: gridView.cellWidth
- height: gridView.cellHeight
- Label {
- anchors.centerIn: parent
- color: (highlighted ? Theme.secondaryHighlightColor : Theme.secondaryColor)
- font.pixelSize: Theme.fontSizeLarge
- text: glyph
- }
- 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()
-
- }
- }
- }
- }
- }
+ ListElement { section: "Horoscope Signs"; glyph: "♈" }
+ ListElement { section: "Horoscope Signs"; glyph: "♉" }
+ ListElement { section: "Horoscope Signs"; glyph: "♊" }
+ ListElement { section: "Horoscope Signs"; glyph: "♋" }
+ ListElement { section: "Horoscope Signs"; glyph: "♌" }
+ ListElement { section: "Horoscope Signs"; glyph: "♍" }
+ ListElement { section: "Horoscope Signs"; glyph: "♎" }
+ ListElement { section: "Horoscope Signs"; glyph: "♏" }
+ ListElement { section: "Horoscope Signs"; glyph: "♐" }
+ ListElement { section: "Horoscope Signs"; glyph: "♑" }
+ ListElement { section: "Horoscope Signs"; glyph: "♒" }
+ ListElement { section: "Horoscope Signs"; glyph: "♓" }
+ }
+ delegate: BackgroundItem {
+ width: gridView.cellWidth
+ height: gridView.cellHeight
+ Label {
+ anchors.centerIn: parent
+ color: (highlighted ? Theme.secondaryHighlightColor : Theme.secondaryColor)
+ font.pixelSize: Theme.fontSizeLarge
+ text: glyph
+ }
+ 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()
+ }
+ }
+ }
+ }
+ }
}
diff --git a/qml/pages/MainPage.qml b/qml/pages/MainPage.qml
index 3745cc7..e676870 100644
--- a/qml/pages/MainPage.qml
+++ b/qml/pages/MainPage.qml
@@ -69,10 +69,11 @@ Page {
onOpenDrawer: infoPanel.open = setDrawer
}
MyList{
- id: tlPublic;
- title: qsTr("Federated")
- type: "timelines/public"
- mdl: Logic.modelTLpublic
+ id: tlNotifications;
+ title: qsTr("Notifications")
+ type: "notifications"
+ notifier: true
+ mdl: Logic.modelTLnotifications
width: parent.itemWidth
height: parent.itemHeight
onOpenDrawer: infoPanel.open = setDrawer
@@ -88,11 +89,10 @@ Page {
onOpenDrawer: infoPanel.open = setDrawer
}
MyList{
- id: tlNotifications;
- title: qsTr("Notifications")
- type: "notifications"
- notifier: true
- mdl: Logic.modelTLnotifications
+ id: tlPublic;
+ title: qsTr("Federated")
+ type: "timelines/public"
+ mdl: Logic.modelTLpublic
width: parent.itemWidth
height: parent.itemHeight
onOpenDrawer: infoPanel.open = setDrawer
@@ -185,7 +185,7 @@ Page {
delegate: ItemUser {
onClicked: {
pageStack.push(Qt.resolvedUrl("Profile.qml"), {
- "displayname": model.account_username,
+ "display_name": model.account_display_name,
"username": model.account_acct,
"user_id": model.account_id,
"profileImage": model.account_avatar
@@ -260,8 +260,13 @@ Page {
slideshow.positionViewAtIndex(4, ListView.SnapToItem)
navigation.navigateTo('search')
+ } else if (test.length === 4 && test[3][0] === "@" ) {
+ tlSearch.search = decodeURIComponent("@"+test[3].substring(1)+"@"+test[2])
+ slideshow.positionViewAtIndex(4, ListView.SnapToItem)
+ navigation.navigateTo('search')
+
} else {
- pageStack.push(Qt.resolvedUrl("Browser.qml"), {"href" : href})
+ Qt.openUrlExternally(href);
}
}
Component.onCompleted: {
diff --git a/qml/pages/Profile.qml b/qml/pages/Profile.qml
index c432b04..c26c7ed 100644
--- a/qml/pages/Profile.qml
+++ b/qml/pages/Profile.qml
@@ -6,7 +6,7 @@ import QtGraphicalEffects 1.0
Page {
property ListModel tweets;
- property string displayname : "";
+ property string display_name : "";
property string username : "";
property string profileImage : "";
property int user_id;
@@ -16,8 +16,9 @@ Page {
property int favourites_count;
property int reblogs_count;
property int count_moments;
- property string profile_background : "";
+ property string profile_background: "";
property string note: "";
+ property string url: "";
property bool locked : false;
property date created_at;
@@ -39,7 +40,7 @@ Page {
followers_count = messageObject.data.followers_count
following_count = messageObject.data.following_count
username = messageObject.data.acct
- displayname = messageObject.data.display_name
+ display_name = messageObject.data.display_name
profileImage = messageObject.data.avatar_static
var msg = {
@@ -68,9 +69,10 @@ Page {
following_count = messageObject.data
break;
case 'acct':
- //username = messageObject.data
+ // line below was commented out, reason unknown
+ // username = messageObject.data
break;
- case 'locked':
+ case 'locked':m
locked = messageObject.data
break;
case 'created_at':
@@ -82,6 +84,9 @@ Page {
case 'note':
note = messageObject.data
break;
+ case 'url':
+ url = messageObject.data
+ break;
case 'following':
following = messageObject.data
followers_count = followers_count + (following ? 1 : - 1)
@@ -135,7 +140,7 @@ Page {
id: list
header: ProfileHeader {
id: header
- title: displayname
+ title: display_name
description: '@'+username
image: profileImage
}
@@ -238,10 +243,65 @@ Page {
}
}
- /*ExpandingSection {
- title: "Tweets"
+ ExpandingSection {
+ title: qsTr("Bio")
+ content.sourceComponent: Column {
+ spacing: Theme.paddingMedium
+ anchors.bottomMargin: Theme.paddingLarge
+ Text {
+ x: Theme.horizontalPageMargin
+ width: parent.width - ( 2 * Theme.horizontalPageMargin )
+ id: txtnote
+ text: note
+ font.pixelSize: Theme.fontSizeExtraSmall
+ color: Theme.secondaryColor
+ linkColor: Theme.secondaryHighlightColor
+ wrapMode: Text.Wrap
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ }
+ onLinkActivated: {
+ var test = link.split("/")
+ console.log(link)
+ console.log(JSON.stringify(test))
+ console.log(JSON.stringify(test.length))
- }*/
+ if (test.length === 5 && (test[3] === "tags" || test[3] === "tag") ) {
+ pageStack.pop(pageStack.find(function(page) {
+ var check = page.isFirstPage === true;
+ if (check)
+ page.onLinkActivated(link)
+ return check;
+ }));
+ send(link)
+
+ } else if (test.length === 4 && test[3][0] === "@" ) {
+ tlSearch.search = decodeURIComponent("@"+test[3].substring(1)+"@"+test[2])
+ slideshow.positionViewAtIndex(4, ListView.SnapToItem)
+ navigation.navigateTo('search')
+
+ } else {
+ Qt.openUrlExternally(link);
+ }
+ }
+
+ }
+ Column {
+ spacing: Theme.paddingMedium
+ anchors.horizontalCenter: parent.horizontalCenter
+ Button {
+ id: btnUrl
+ text: qsTr("Open Profile in Browser")
+ onClicked: {
+ Qt.openUrlExternally(url);
+ }
+ }
+ }
+ Label {
+ text: " "
+ }
+ }
+ }
}
diff --git a/qml/pages/Settings.qml b/qml/pages/Settings.qml
index 0dbc847..637cf94 100644
--- a/qml/pages/Settings.qml
+++ b/qml/pages/Settings.qml
@@ -102,32 +102,38 @@ Page {
}
ListElement {
name: "Miodrag Nikolić"
- desc: "visual identity"
+ desc: qsTr("Visual identity")
mastodon: ""
mail: "micotakis@gmail.com"
}
+ ListElement {
+ name: "molan"
+ desc: qsTr("Development and maintenence")
+ mastodon: ""
+ mail: "mol_an@sunrise.ch"
+ }
ListElement {
name: "Quentin PAGÈS / Quenti ♏"
- desc: "Occitan & French translation"
+ desc: qsTr("Occitan & French translation")
mastodon: "Quenti@framapiaf.org"
mail: ""
}
ListElement {
name: "André Koot"
- desc: "Dutch translation"
+ desc: qsTr("Dutch translation")
mastodon: "meneer@mastodon.social"
mail: "https://twitter.com/meneer"
}
ListElement {
- name: "Carlos Gonzalez / Caballlero"
- desc: "Español translation"
+ name: "CarmenFdez"
+ desc: qsTr("Spanish translation")
mastodon: ""
- mail: "carlosgonz@protonmail.com"
+ mail: ""
}
ListElement {
name: "Mohamed-Touhami MAHDI"
- desc: "Added README file"
+ desc: qsTr("Added README file")
mastodon: "dragnucs@touha.me"
mail: "touhami@touha.me"
}
diff --git a/qml/pages/components/ItemUser.qml b/qml/pages/components/ItemUser.qml
index ffebb63..809c97e 100644
--- a/qml/pages/components/ItemUser.qml
+++ b/qml/pages/components/ItemUser.qml
@@ -33,7 +33,7 @@ BackgroundItem {
MouseArea {
anchors.fill: parent
onClicked: pageStack.push(Qt.resolvedUrl("./../Profile.qml"), {
- "displayname": model.account_username,
+ "display_name": model.account_display_name,
"username": model.account_acct,
"user_id": model.account_id,
"profileImage": model.account_avatar
@@ -60,7 +60,7 @@ BackgroundItem {
}
}
onClicked: openUser({
- "displayname": model.account_username,
+ "display_name": model.account_display_name,
"username": model.account_acct,
"user_id": model.account_id,
"profileImage": model.account_avatar
diff --git a/qml/pages/components/Navigation.qml b/qml/pages/components/Navigation.qml
index d2e3c35..30e5e81 100644
--- a/qml/pages/components/Navigation.qml
+++ b/qml/pages/components/Navigation.qml
@@ -15,38 +15,33 @@ SilicaGridView {
id: listModel
ListElement {
icon: "image://theme/icon-m-home"
- //icon: "../../images/home.svg"
slug: "home"
name: "Home"
active: true
unread: false
}
ListElement {
- //icon: "image://theme/icon-m-region"
- icon: "../../images/federated.svg"
- slug: "federated"
- name: "Federated"
+ icon: "image://theme/icon-m-alarm"
+ slug: "notifications"
+ name: "Notifications"
active: false
- unread: false
}
ListElement {
- //icon: "image://theme/icon-m-sailfish"
- icon: "../../images/local.svg"
+ icon: "image://theme/icon-m-whereami"
slug: "local"
name: "Local"
active: false
unread: false
}
ListElement {
- icon: "image://theme/icon-m-alarm"
- //icon: "../../images/notification.svg"
- slug: "notifications"
- name: "Notifications"
+ icon: "image://theme/icon-m-website"
+ slug: "federated"
+ name: "Federated"
active: false
+ unread: false
}
ListElement {
icon: "image://theme/icon-m-search"
- //icon: "../../images/search.svg"
slug: "search"
name: "Search"
active: false
diff --git a/qml/pages/components/ProfileHeader.qml b/qml/pages/components/ProfileHeader.qml
index e557bcb..8dd369c 100644
--- a/qml/pages/components/ProfileHeader.qml
+++ b/qml/pages/components/ProfileHeader.qml
@@ -19,7 +19,7 @@ Item {
}*/
Rectangle {
anchors.fill: parent
- opacity: 0.1
+ opacity: 0.2
gradient: Gradient {
GradientStop { position: 0.0; color: Theme.highlightBackgroundColor }
GradientStop { position: 1.0; color: Theme.highlightBackgroundColor }
@@ -51,7 +51,7 @@ Item {
id: ttl
text: title
height: contentHeight
- color: Theme.highlightColor
+ color: Theme.primaryColor
font.pixelSize: Theme.fontSizeLarge
font.family: Theme.fontFamilyHeading
horizontalAlignment: Text.AlignRight
@@ -61,7 +61,7 @@ Item {
Label {
height: description === "" ? 0 : contentHeight
text: description
- color: Theme.secondaryHighlightColor
+ color: Theme.primaryColor
font.pixelSize: Theme.fontSizeSmall
font.family: Theme.fontFamilyHeading
horizontalAlignment: Text.AlignRight
diff --git a/qml/pages/components/Toot.qml b/qml/pages/components/Toot.qml
index fb9b9ab..7809e7a 100644
--- a/qml/pages/components/Toot.qml
+++ b/qml/pages/components/Toot.qml
@@ -63,7 +63,7 @@ BackgroundItem {
anchors.fill: parent
onClicked: {
pageStack.push(Qt.resolvedUrl("../Profile.qml"), {
- "displayname": account_display_name,
+ "display_name": account_display_name,
"username": account_username,
"profileImage": account_avatar
})
@@ -142,7 +142,7 @@ BackgroundItem {
right: parent.right
top: lblScreenName.bottom
topMargin: Theme.paddingSmall
- rightMargin: Theme.paddingLarge
+ rightMargin: Theme.paddingLarge
}
height: content.length ? paintedHeight : 0
onLinkActivated: {
@@ -164,7 +164,7 @@ BackgroundItem {
send(link)
} else {
- pageStack.push(Qt.resolvedUrl("../Browser.qml"), {"href" : link})
+ Qt.openUrlExternally(link);
}
diff --git a/qml/pages/components/VisualContainer.qml b/qml/pages/components/VisualContainer.qml
index 9f649d9..2d42d6c 100644
--- a/qml/pages/components/VisualContainer.qml
+++ b/qml/pages/components/VisualContainer.qml
@@ -55,7 +55,7 @@ BackgroundItem {
anchors.fill: parent
onClicked: {
pageStack.push(Qt.resolvedUrl("../Profile.qml"), {
- "displayname": model.account_username,
+ "display_name": model.account_display_name,
"username": model.account_acct,
"user_id": model.account_id,
"profileImage": model.account_avatar
@@ -134,13 +134,12 @@ BackgroundItem {
}));
send(link)
} else if (test.length === 4 && test[3][0] === "@" ) {
- pageStack.push(Qt.resolvedUrl("../Profile.qml"), {
- "name": "",
- "username": test[3].substring(1)+"@"+test[2],
- "profileImage": ""
- })
+ tlSearch.search = decodeURIComponent("@"+test[3].substring(1)+"@"+test[2])
+ slideshow.positionViewAtIndex(4, ListView.SnapToItem)
+ navigation.navigateTo('search')
+
} else {
- pageStack.push(Qt.resolvedUrl("../Browser.qml"), {"href" : link})
+ Qt.openUrlExternally(link);
}
}
text: content.replace(new RegExp(" 1.0.4-0
-- Login bugfix merge request
-- Updated translations
+* Thu Apr 16 2020 Dusko Angirevic 1.0.4-1
+- Merge with molan code
+
+* Tue Feb 04 2020 molan 1.0.3-8
+- Fix for broken translations
+- Updated Spanish translation
+
+* Mon Feb 03 2020 molan 1.0.3-7
+- Updated translations for new language strings
+
+* Thu Jan 30 2020 molan 1.0.3-6
+- Workaround for opening user profiles in toots
+- Show profile descriptions (Bio) with option to open them in Browser
+- Updated and improved UI for Conversation page
+- Indication for sending toot (move back to previous page)
+- New arrangement of main pages (like used in Mastodon websites and other apps)
+- Small UI and text/label changes
+
+* Thu Jan 16 2020 molan 1.0.3-5 [fork of Tooter 1.0.3]
+- Fix for broken profile pages when clicking on usernames in toots
+- Fixed navigation icons for inverted ambiences
+- Updated Chinese translation (thanks to dashinfantry)
+
+* Wed Jan 15 2020 molan 1.0.3-4 [fork of Tooter 1.0.3]
+- Website links in toots now open directly in browser since the web scraper service which was used before is discontinued
+- Profile page now shows full display name in title instead of user name
+- Changed send, content warning and add emoji icon in Conversation page for clarification
+- Small update to Chinese translation (thanks to dashinfantry)
+- Completed German and French translations
+
+* Mon Jan 06 2020 molan 1.0.3-3 [fork of Tooter 1.0.3]
+- Update and rename harbour-tooter-zh.ts to harbour-tooter-zh_CN.ts (thanks to dashinfantry)
+
+* Sat Dec 28 2019 molan 1.0.3-1 [fork of Tooter 1.0.3]
+- Fixed broken Mastodon login (app built with Sailfish SDK 2.4)
+- Fixed crash on certain notifications
* Sun Jan 27 2019 Dusko Angirevic 1.0.3-0
- Remorse popup added for account removal
diff --git a/rpm/harbour-tooter.spec b/rpm/harbour-tooter.spec
index 3e9ea00..4c576ba 100644
--- a/rpm/harbour-tooter.spec
+++ b/rpm/harbour-tooter.spec
@@ -14,7 +14,7 @@ Name: harbour-tooter
%{?qtc_builddir:%define _builddir %qtc_builddir}
Summary: Tooter
Version: 1.0.4
-Release: 0
+Release: 1
Group: Qt/Qt
License: LICENSE
URL: http://example.org/
diff --git a/rpm/harbour-tooter.yaml b/rpm/harbour-tooter.yaml
index e0531cf..093166c 100644
--- a/rpm/harbour-tooter.yaml
+++ b/rpm/harbour-tooter.yaml
@@ -1,7 +1,7 @@
Name: harbour-tooter
Summary: Tooter
Version: 1.0.4
-Release: 0
+Release: 1
# The contents of the Group field should be one of the groups listed here:
# https://github.com/mer-tools/spectacle/blob/master/data/GROUPS
Group: Qt/Qt
diff --git a/translations/harbour-tooter-de.ts b/translations/harbour-tooter-de.ts
index ce57760..e6f310d 100644
--- a/translations/harbour-tooter-de.ts
+++ b/translations/harbour-tooter-de.ts
@@ -20,51 +20,12 @@
hat gesagt
-
- Browser
-
-
- Öffne in Browser
-
-
-
- Web-Modus
-
-
-
- Lese-Modus
-
-
-
- Kopiere URL
-
-
Conversation
Konversation
-
-
- Inhaltswarnung!
-
-
-
- öffentlich
-
-
-
- nicht aufgeführt
-
-
-
- nur Follower
-
-
-
- direkt
-
Löschen
@@ -77,6 +38,30 @@
Tippen um einzufügen
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ImageFullScreen
@@ -230,6 +215,14 @@
Anhänger
+
+
+
+
+
+
+
+
Settings
@@ -277,6 +270,30 @@
UI/UX Design und Implementierung
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot
diff --git a/translations/harbour-tooter-el.ts b/translations/harbour-tooter-el.ts
index cfb00c7..c3f464a 100644
--- a/translations/harbour-tooter-el.ts
+++ b/translations/harbour-tooter-el.ts
@@ -20,51 +20,12 @@
είπε
-
- Browser
-
-
- Άνοιγμα στον φυλλομετρητή
-
-
-
- Λειτουργία ιστού
-
-
-
- Λειτουργία ανάγνωσης
-
-
-
- Αντιγραφή διεύθυνσης URL
-
-
Conversation
Συνομιλία
-
-
- Προειδοποίηση περιεχομένου!
-
-
-
- δημόσιο
-
-
-
- μη καταχωρημένο
-
-
-
- μόνο αυτοί που σας ακολουθούν
-
-
-
- απευθείας
-
Διαγραφή
@@ -77,6 +38,30 @@
Κτυπήστε για εισαγωγή
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ImageFullScreen
@@ -230,6 +215,14 @@
Σας ακολουθούν
+
+
+
+
+
+
+
+
Settings
@@ -277,6 +270,30 @@
UI/UX σχεδιασμός και ανάπτυξη
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot
diff --git a/translations/harbour-tooter-es.ts b/translations/harbour-tooter-es.ts
index acbe287..7f6acfd 100644
--- a/translations/harbour-tooter-es.ts
+++ b/translations/harbour-tooter-es.ts
@@ -20,51 +20,12 @@
dijo
-
- Browser
-
-
- Abrir en navegador
-
-
-
- Modo Web
-
-
-
- Modo lectura
-
-
-
- Copiar URL
-
-
Conversation
Conversación
-
-
- Advertencia de contenido
-
-
-
- público
-
-
-
- sin federar
-
-
-
- sólo seguidores
-
-
-
- directo
-
Borrar
@@ -77,6 +38,30 @@
Toca para insertar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ImageFullScreen
@@ -230,6 +215,14 @@
Seguidores
+
+
+
+
+
+
+
+
Settings
@@ -277,6 +270,30 @@
Diseño UI/UX y desarrollo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot
diff --git a/translations/harbour-tooter-fi.ts b/translations/harbour-tooter-fi.ts
index 8a9fe60..daf06a7 100644
--- a/translations/harbour-tooter-fi.ts
+++ b/translations/harbour-tooter-fi.ts
@@ -20,51 +20,12 @@
-
- Browser
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Conversation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -77,6 +38,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ImageFullScreen
@@ -230,6 +215,14 @@
+
+
+
+
+
+
+
+
Settings
@@ -277,6 +270,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot
diff --git a/translations/harbour-tooter-fr.ts b/translations/harbour-tooter-fr.ts
index 3c7ddec..d41d682 100644
--- a/translations/harbour-tooter-fr.ts
+++ b/translations/harbour-tooter-fr.ts
@@ -20,51 +20,12 @@
a dit
-
- Browser
-
-
- Ouvrir dans le navigateur
-
-
-
- Vue internet
-
-
-
- Mode lecture
-
-
-
- Copier l'URL
-
-
Conversation
Conversation
-
-
- Contenu sensible !
-
-
-
- public
-
-
-
- non listé
-
-
-
- abonnés seulement
-
-
-
- direct
-
Supprimer
@@ -77,6 +38,30 @@
Appuyez pour insérer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ImageFullScreen
@@ -230,6 +215,14 @@
Abonnés
+
+
+
+
+
+
+
+
Settings
@@ -277,6 +270,30 @@
design et développement de l'interface
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot
diff --git a/translations/harbour-tooter-nl.ts b/translations/harbour-tooter-nl.ts
index 2779c3c..ef0f5d3 100644
--- a/translations/harbour-tooter-nl.ts
+++ b/translations/harbour-tooter-nl.ts
@@ -20,51 +20,12 @@
zei
-
- Browser
-
-
- Openen in browser
-
-
-
- Webmodus
-
-
-
- Leesmodus
-
-
-
- Kopieer URL
-
-
Conversation
Gesprek
-
-
- Gevoelige inhoud!
-
-
-
- openbaar
-
-
-
- niet op lijst
-
-
-
- alleen volgers
-
-
-
- direct
-
Verwijderen
@@ -77,6 +38,30 @@
Tikken om in te voegen
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ImageFullScreen
@@ -230,6 +215,14 @@
Volgers
+
+
+
+
+
+
+
+
Settings
@@ -277,6 +270,30 @@
UI/UX ontwerp en ontwikkeling
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot
diff --git a/translations/harbour-tooter-nl_BE.ts b/translations/harbour-tooter-nl_BE.ts
index 4772b6d..878cbfc 100644
--- a/translations/harbour-tooter-nl_BE.ts
+++ b/translations/harbour-tooter-nl_BE.ts
@@ -20,51 +20,12 @@
zei
-
- Browser
-
-
- Openen in browser
-
-
-
- Webmodus
-
-
-
- Leesmodus
-
-
-
- URL kopiëren
-
-
Conversation
Gesprek
-
-
- Gevoeligen inhoud!
-
-
-
- openbaar
-
-
-
- niet op lijst
-
-
-
- alleen volgers
-
-
-
- direct
-
Verwijderen
@@ -77,6 +38,30 @@
Tikt voor in te voegen
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ImageFullScreen
@@ -230,6 +215,14 @@
Volgers
+
+
+
+
+
+
+
+
Settings
@@ -277,6 +270,30 @@
UI/UX-ontwerp en -ontwikkeling
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot
diff --git a/translations/harbour-tooter-oc.ts b/translations/harbour-tooter-oc.ts
index 9e310a2..2b226a0 100644
--- a/translations/harbour-tooter-oc.ts
+++ b/translations/harbour-tooter-oc.ts
@@ -20,51 +20,12 @@
a dich
-
- Browser
-
-
- Dobrir dins lo navigator
-
-
-
- Mòde Web
-
-
-
- Mòde lectura
-
-
-
- Copiar l'URL
-
-
Conversation
Discutida
-
-
- Contengut sensible !
-
-
-
- public
-
-
-
- pas listat
-
-
-
- seguidors solament
-
-
-
- dirècte
-
Escafar
@@ -77,6 +38,30 @@
Tustejar per inserir
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ImageFullScreen
@@ -230,6 +215,14 @@
Seguidors
+
+
+
+
+
+
+
+
Settings
@@ -277,6 +270,30 @@
UI/UX design e desvlopament
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot
diff --git a/translations/harbour-tooter-pl.ts b/translations/harbour-tooter-pl.ts
index b2f84d9..6efba16 100644
--- a/translations/harbour-tooter-pl.ts
+++ b/translations/harbour-tooter-pl.ts
@@ -20,51 +20,12 @@
-
- Browser
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Conversation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -77,6 +38,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ImageFullScreen
@@ -230,6 +215,14 @@
+
+
+
+
+
+
+
+
Settings
@@ -277,6 +270,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot
diff --git a/translations/harbour-tooter-ru.ts b/translations/harbour-tooter-ru.ts
index a49da69..21152ef 100644
--- a/translations/harbour-tooter-ru.ts
+++ b/translations/harbour-tooter-ru.ts
@@ -20,51 +20,12 @@
сказал
-
- Browser
-
-
- Открыть в браузере
-
-
-
- Веб-режим
-
-
-
- Режим чтения
-
-
-
- Копировать URL
-
-
Conversation
Беседа
-
-
- Предупреждение о содержании!
-
-
-
- публика
-
-
-
- не указан
-
-
-
- только последователи
-
-
-
- непосредственный
-
Удалить
@@ -77,6 +38,30 @@
Нажмите, чтобы вставить
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ImageFullScreen
@@ -230,6 +215,14 @@
Читают
+
+
+
+
+
+
+
+
Settings
@@ -277,6 +270,30 @@
Дизайн и разработка UI / UX
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot
diff --git a/translations/harbour-tooter-sr.ts b/translations/harbour-tooter-sr.ts
index 694c51b..f4006bb 100644
--- a/translations/harbour-tooter-sr.ts
+++ b/translations/harbour-tooter-sr.ts
@@ -20,51 +20,12 @@
каже
-
- Browser
-
-
- Отвори у прегледнику веба
-
-
-
- Прегледник веба
-
-
-
- Мод за читање
-
-
-
- Kopiraj link
-
-
Conversation
Разговор
-
-
- Упозорење на садржај
-
-
-
- јавно
-
-
-
- не приказано
-
-
-
- само за пратиоце
-
-
-
- директна порука
-
Обриши
@@ -77,6 +38,30 @@
Тапни за убацивање
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ImageFullScreen
@@ -230,6 +215,14 @@
Пратиоци
+
+
+
+
+
+
+
+
Settings
@@ -277,6 +270,30 @@
интерфејс дизајн и развој
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot
diff --git a/translations/harbour-tooter-sv.ts b/translations/harbour-tooter-sv.ts
index 35bc745..e91a9cf 100644
--- a/translations/harbour-tooter-sv.ts
+++ b/translations/harbour-tooter-sv.ts
@@ -20,51 +20,12 @@
sade
-
- Browser
-
-
- Öppna i webbläsare
-
-
-
- Webbläge
-
-
-
- Läsläge
-
-
-
- Kopiera URL
-
-
Conversation
Konversation
-
-
- Innehållsvarning!
-
-
-
- publik
-
-
-
- olistad
-
-
-
- endast följare
-
-
-
- direkt
-
Radera
@@ -77,6 +38,30 @@
Tryck för att infoga
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ImageFullScreen
@@ -230,6 +215,14 @@
Följare
+
+
+
+
+
+
+
+
Settings
@@ -277,6 +270,30 @@
UI/UX design och utveckling
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot
diff --git a/translations/harbour-tooter-zh.ts b/translations/harbour-tooter-zh_CN.ts
similarity index 69%
rename from translations/harbour-tooter-zh.ts
rename to translations/harbour-tooter-zh_CN.ts
index 62ac87d..8e8d00f 100644
--- a/translations/harbour-tooter-zh.ts
+++ b/translations/harbour-tooter-zh_CN.ts
@@ -1,6 +1,6 @@
-
+
API
@@ -13,30 +13,11 @@
- 推出的
+ 推起的
- 说的
-
-
-
- Browser
-
-
- 在浏览器打开
-
-
-
- 网页模式
-
-
-
- 阅读模式
-
-
-
- 复制链接
+ 说过
@@ -45,26 +26,6 @@
对话
-
-
- 内容警告
-
-
-
- 公共区域
-
-
-
- 未列的
-
-
-
- 仅关注者
-
-
-
- 直接
-
删除
@@ -75,7 +36,31 @@
- 点击插入
+ 点击以插入
+
+
+
+ 在此编写你的警告信息
+
+
+
+ 公共区域
+
+
+
+ 不公开
+
+
+
+ 仅关注者
+
+
+
+ 私信
+
+
+
+ 有何想法?
@@ -89,7 +74,7 @@
ImageUploader
- 文件%1 不存在
+ 文件 %1 不存在
@@ -100,18 +85,18 @@
-
-
-
-
- 输入一个Mastodon链接实例
+ 实例
- Mastodon 是一个免费且开源的社交网络。一个去中心化的商业平台的替代品,帮助你避免某个公司垄断你的通讯方式的风险。选取一个你信任的服务器,无论你选择什么,你都可以和其它任何人互动。任何人都能运行他们的Mastodon 实例并且无缝加入此社交网络。
+ Mastodon 是一个自由且开源的社交网络。一个去中心化的商业平台的替代品。它能够避免某个公司垄断你的通讯方式的风险。选择一个你所信任的服务器——无论你选择什么,你都可以和其他人进行互动。任何人都能运行他们自己的 Mastodon 实例,然后无缝加入社交网站。
+ 重新加载
+
+
+
@@ -150,7 +135,7 @@
MiniStatus
- 推出的
+ 推起的
@@ -177,18 +162,18 @@
- 请等候......
+ 稍等片刻......
Profile
- 未关注
+ 取消关注
- 关注请求已寄出
+ 已寄出关注请求!
@@ -230,6 +215,14 @@
关注者
+
+
+ 简介
+
+
+
+ 在浏览器打开个人简介
+
Settings
@@ -239,50 +232,74 @@
- 删除账户
+ 移除账号
- 添加账户
+ 添加账号
- 取消授权此应用并且移除你的账户
+ 取消授权此软件并移除你的账号
- 授权应用使用你信任的Mastodon账户
-
-
-
- 加载嘟嘟的图片
+ 授权此软件使用你的 Mastodon 账号
- 如果想要保护你的数据连接,取消此操作
-
-
-
- 翻译
-
-
-
- 使用Transifex 以帮助翻译成你使用的语言
+ 如果你想保护你的数据连接,请禁用此选项
- 信用
+ 信誉
- UI/UX 设计和开发
+ UI/UX设计及开发
+
+
+
+ 视觉识别
+
+
+
+ 奥克西坦语及法语翻译
+
+
+
+ 尼德兰语翻译
+
+
+
+ 西班牙语翻译
+
+
+
+ 添加 README 文件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot
- 推出的
+ 推起的
@@ -297,19 +314,19 @@
VisualContainer
- 取消推出
+ 取消推起
- 推出
+ 推起
- 取消收藏
+ 取消关注
- 收藏
+ 关注
diff --git a/translations/harbour-tooter.ts b/translations/harbour-tooter.ts
index c580d4b..03bddc9 100644
--- a/translations/harbour-tooter.ts
+++ b/translations/harbour-tooter.ts
@@ -20,51 +20,12 @@
said
-
- Browser
-
-
- Open in Browser
-
-
-
- Web mode
-
-
-
- Reading mode
-
-
-
- Copy URL
-
-
Conversation
Conversation
-
-
- Content warning!
-
-
-
- public
-
-
-
- unlisted
-
-
-
- followers only
-
-
-
- direct
-
Delete
@@ -77,6 +38,30 @@
Tap to insert
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ImageFullScreen
@@ -230,6 +215,14 @@
Followers
+
+
+
+
+
+
+
+
Settings
@@ -277,6 +270,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Toot