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 @@ + + Artboard 1 + + + + + + + + + + + + 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 - - Open in Browser - Öffne in Browser - - - Web mode - Web-Modus - - - Reading mode - Lese-Modus - - - Copy URL - Kopiere URL - - Conversation Conversation Konversation - - Content warning! - Inhaltswarnung! - - - public - öffentlich - - - unlisted - nicht aufgeführt - - - followers only - nur Follower - - - direct - direkt - Delete Löschen @@ -77,6 +38,30 @@ Tap to insert Tippen um einzufügen + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + + ImageFullScreen @@ -230,6 +215,14 @@ Followers Anhänger + + Bio + + + + Open Profile in Browser + + Settings @@ -277,6 +270,30 @@ UI/UX design and development UI/UX Design und Implementierung + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + 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 - - Open in Browser - Άνοιγμα στον φυλλομετρητή - - - Web mode - Λειτουργία ιστού - - - Reading mode - Λειτουργία ανάγνωσης - - - Copy URL - Αντιγραφή διεύθυνσης URL - - Conversation Conversation Συνομιλία - - Content warning! - Προειδοποίηση περιεχομένου! - - - public - δημόσιο - - - unlisted - μη καταχωρημένο - - - followers only - μόνο αυτοί που σας ακολουθούν - - - direct - απευθείας - Delete Διαγραφή @@ -77,6 +38,30 @@ Tap to insert Κτυπήστε για εισαγωγή + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + + ImageFullScreen @@ -230,6 +215,14 @@ Followers Σας ακολουθούν + + Bio + + + + Open Profile in Browser + + Settings @@ -277,6 +270,30 @@ UI/UX design and development UI/UX σχεδιασμός και ανάπτυξη + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + 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 - - Open in Browser - Abrir en navegador - - - Web mode - Modo Web - - - Reading mode - Modo lectura - - - Copy URL - Copiar URL - - Conversation Conversation Conversación - - Content warning! - Advertencia de contenido - - - public - público - - - unlisted - sin federar - - - followers only - sólo seguidores - - - direct - directo - Delete Borrar @@ -77,6 +38,30 @@ Tap to insert Toca para insertar + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + + ImageFullScreen @@ -230,6 +215,14 @@ Followers Seguidores + + Bio + + + + Open Profile in Browser + + Settings @@ -277,6 +270,30 @@ UI/UX design and development Diseño UI/UX y desarrollo + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + 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 - - 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 + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + + ImageFullScreen @@ -230,6 +215,14 @@ Followers + + Bio + + + + Open Profile in Browser + + Settings @@ -277,6 +270,30 @@ UI/UX design and development + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + 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 - - Open in Browser - Ouvrir dans le navigateur - - - Web mode - Vue internet - - - Reading mode - Mode lecture - - - Copy URL - Copier l'URL - - Conversation Conversation Conversation - - Content warning! - Contenu sensible ! - - - public - public - - - unlisted - non listé - - - followers only - abonnés seulement - - - direct - direct - Delete Supprimer @@ -77,6 +38,30 @@ Tap to insert Appuyez pour insérer + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + + ImageFullScreen @@ -230,6 +215,14 @@ Followers Abonnés + + Bio + + + + Open Profile in Browser + + Settings @@ -277,6 +270,30 @@ UI/UX design and development design et développement de l'interface + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + 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 - - Open in Browser - Openen in browser - - - Web mode - Webmodus - - - Reading mode - Leesmodus - - - Copy URL - Kopieer URL - - Conversation Conversation Gesprek - - Content warning! - Gevoelige inhoud! - - - public - openbaar - - - unlisted - niet op lijst - - - followers only - alleen volgers - - - direct - direct - Delete Verwijderen @@ -77,6 +38,30 @@ Tap to insert Tikken om in te voegen + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + + ImageFullScreen @@ -230,6 +215,14 @@ Followers Volgers + + Bio + + + + Open Profile in Browser + + Settings @@ -277,6 +270,30 @@ UI/UX design and development UI/UX ontwerp en ontwikkeling + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + 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 - - Open in Browser - Openen in browser - - - Web mode - Webmodus - - - Reading mode - Leesmodus - - - Copy URL - URL kopiëren - - Conversation Conversation Gesprek - - Content warning! - Gevoeligen inhoud! - - - public - openbaar - - - unlisted - niet op lijst - - - followers only - alleen volgers - - - direct - direct - Delete Verwijderen @@ -77,6 +38,30 @@ Tap to insert Tikt voor in te voegen + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + + ImageFullScreen @@ -230,6 +215,14 @@ Followers Volgers + + Bio + + + + Open Profile in Browser + + Settings @@ -277,6 +270,30 @@ UI/UX design and development UI/UX-ontwerp en -ontwikkeling + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + 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 - - Open in Browser - Dobrir dins lo navigator - - - Web mode - Mòde Web - - - Reading mode - Mòde lectura - - - Copy URL - Copiar l'URL - - Conversation Conversation Discutida - - Content warning! - Contengut sensible ! - - - public - public - - - unlisted - pas listat - - - followers only - seguidors solament - - - direct - dirècte - Delete Escafar @@ -77,6 +38,30 @@ Tap to insert Tustejar per inserir + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + + ImageFullScreen @@ -230,6 +215,14 @@ Followers Seguidors + + Bio + + + + Open Profile in Browser + + Settings @@ -277,6 +270,30 @@ UI/UX design and development UI/UX design e desvlopament + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + 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 - - 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 + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + + ImageFullScreen @@ -230,6 +215,14 @@ Followers + + Bio + + + + Open Profile in Browser + + Settings @@ -277,6 +270,30 @@ UI/UX design and development + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + 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 - - Open in Browser - Открыть в браузере - - - Web mode - Веб-режим - - - Reading mode - Режим чтения - - - Copy URL - Копировать URL - - Conversation Conversation Беседа - - Content warning! - Предупреждение о содержании! - - - public - публика - - - unlisted - не указан - - - followers only - только последователи - - - direct - непосредственный - Delete Удалить @@ -77,6 +38,30 @@ Tap to insert Нажмите, чтобы вставить + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + + ImageFullScreen @@ -230,6 +215,14 @@ Followers Читают + + Bio + + + + Open Profile in Browser + + Settings @@ -277,6 +270,30 @@ UI/UX design and development Дизайн и разработка UI / UX + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + 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 - - Open in Browser - Отвори у прегледнику веба - - - Web mode - Прегледник веба - - - Reading mode - Мод за читање - - - Copy URL - Kopiraj link - - Conversation Conversation Разговор - - Content warning! - Упозорење на садржај - - - public - јавно - - - unlisted - не приказано - - - followers only - само за пратиоце - - - direct - директна порука - Delete Обриши @@ -77,6 +38,30 @@ Tap to insert Тапни за убацивање + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + + ImageFullScreen @@ -230,6 +215,14 @@ Followers Пратиоци + + Bio + + + + Open Profile in Browser + + Settings @@ -277,6 +270,30 @@ UI/UX design and development интерфејс дизајн и развој + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + 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 - - Open in Browser - Öppna i webbläsare - - - Web mode - Webbläge - - - Reading mode - Läsläge - - - Copy URL - Kopiera URL - - Conversation Conversation Konversation - - Content warning! - Innehållsvarning! - - - public - publik - - - unlisted - olistad - - - followers only - endast följare - - - direct - direkt - Delete Radera @@ -77,6 +38,30 @@ Tap to insert Tryck för att infoga + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + + ImageFullScreen @@ -230,6 +215,14 @@ Followers Följare + + Bio + + + + Open Profile in Browser + + Settings @@ -277,6 +270,30 @@ UI/UX design and development UI/UX design och utveckling + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + 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 @@ boosted - 推出的 + 推起的 said - 说的 - - - - Browser - - Open in Browser - 在浏览器打开 - - - Web mode - 网页模式 - - - Reading mode - 阅读模式 - - - Copy URL - 复制链接 + 说过 @@ -45,26 +26,6 @@ Conversation 对话 - - Content warning! - 内容警告 - - - public - 公共区域 - - - unlisted - 未列的 - - - followers only - 仅关注者 - - - direct - 直接 - Delete 删除 @@ -75,7 +36,31 @@ Tap to insert - 点击插入 + 点击以插入 + + + Write your warning here + 在此编写你的警告信息 + + + Public + 公共区域 + + + Unlisted + 不公开 + + + Followers-only + 仅关注者 + + + Direct + 私信 + + + What's on your mind? + 有何想法? @@ -89,7 +74,7 @@ ImageUploader The file %1 does not exists - 文件%1 不存在 + 文件 %1 不存在 @@ -100,18 +85,18 @@ Instance - - - - Enter an Mastodon instance URL - 输入一个Mastodon链接实例 + 实例 Mastodon is a free, open-source social network. A decentralized alternative to commercial platforms, it avoids the risks of a single company monopolizing your communication. Pick a server that you trust — whichever you choose, you can interact with everyone else. Anyone can run their own Mastodon instance and participate in the social network seamlessly. - Mastodon 是一个免费且开源的社交网络。一个去中心化的商业平台的替代品,帮助你避免某个公司垄断你的通讯方式的风险。选取一个你信任的服务器,无论你选择什么,你都可以和其它任何人互动。任何人都能运行他们的Mastodon 实例并且无缝加入此社交网络。 + ​Mastodon 是一个自由且开源的社交网络。一个去中心化的商业平台的替代品。它能够避免某个公司垄断你的通讯方式的风险。选择一个你所信任的服务器——无论你选择什么,你都可以和其他人进行互动。任何人都能运行他们自己的 Mastodon 实例,然后无缝加入社交网站。 Reload + 重新加载 + + + Enter an Mastodon instance URL @@ -150,7 +135,7 @@ MiniStatus boosted - 推出的 + 推起的 favourited @@ -177,18 +162,18 @@ please wait... - 请等候...... + 稍等片刻...... Profile Unfollow - 未关注 + 取消关注 Follow request sent! - 关注请求已寄出 + 已寄出关注请求! Following @@ -230,6 +215,14 @@ Followers 关注者 + + Bio + 简介 + + + Open Profile in Browser + 在浏览器打开个人简介 + Settings @@ -239,50 +232,74 @@ Remove Account - 删除账户 + 移除账号 Add Account - 添加账户 + 添加账号 Deauthorize this app and remove your account - 取消授权此应用并且移除你的账户 + 取消授权此软件并移除你的账号 Authorize this app to use your Mastodon account in your behalf - 授权应用使用你信任的Mastodon账户 - - - Load images in toots - 加载嘟嘟的图片 + 授权此软件使用你的 Mastodon 账号 Disable this option if you want to preserve your data connection - 如果想要保护你的数据连接,取消此操作 - - - Translate - 翻译 - - - Use Transifex to help with app translation to your language - 使用Transifex 以帮助翻译成你使用的语言 + 如果你想保护你的数据连接,请禁用此选项 Credits - 信用 + 信誉 UI/UX design and development - UI/UX 设计和开发 + UI/UX设计及开发 + + + Visual identity + 视觉识别 + + + Occitan & French translation + 奥克西坦语及法语翻译 + + + Dutch translation + 尼德兰语翻译 + + + Spanish translation + 西班牙语翻译 + + + Added README file + 添加 README 文件 + + + Load images in toots + + + + Translate + + + + Use Transifex to help with app translation to your language + + + + Development and maintenence + Toot boosted - 推出的 + 推起的 favourited @@ -297,19 +314,19 @@ VisualContainer Unboost - 取消推出 + 取消推起 Boost - 推出 + 推起 Unfavorite - 取消收藏 + 取消关注 Favorite - 收藏 + 关注 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 - Open in Browser - - - Web mode - Web mode - - - Reading mode - Reading mode - - - Copy URL - Copy URL - - Conversation Conversation Conversation - - Content warning! - Content warning! - - - public - public - - - unlisted - unlisted - - - followers only - followers only - - - direct - direct - Delete Delete @@ -77,6 +38,30 @@ Tap to insert Tap to insert + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + + ImageFullScreen @@ -230,6 +215,14 @@ Followers Followers + + Bio + + + + Open Profile in Browser + + Settings @@ -277,6 +270,30 @@ UI/UX design and development + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + Toot