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 a5cc849..15c13fd 100644 --- a/qml/lib/Worker.js +++ b/qml/lib/Worker.js @@ -82,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) @@ -150,7 +150,7 @@ function parseNotification(data){ switch (item['type']){ case "mention": if (!data.status) { - break; + break; } item = parseToot(data.status) 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-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 - Updated translations diff --git a/rpm/harbour-tooter.spec b/rpm/harbour-tooter.spec index 520b70c..4c576ba 100644 --- a/rpm/harbour-tooter.spec +++ b/rpm/harbour-tooter.spec @@ -13,8 +13,8 @@ Name: harbour-tooter %{!?qtc_make:%define qtc_make make} %{?qtc_builddir:%define _builddir %qtc_builddir} Summary: Tooter -Version: 1.0.3 -Release: 0 +Version: 1.0.4 +Release: 1 Group: Qt/Qt License: LICENSE URL: http://example.org/ diff --git a/rpm/harbour-tooter.yaml b/rpm/harbour-tooter.yaml index edf95f4..093166c 100644 --- a/rpm/harbour-tooter.yaml +++ b/rpm/harbour-tooter.yaml @@ -1,7 +1,7 @@ Name: harbour-tooter Summary: Tooter -Version: 1.0.3 -Release: 0 +Version: 1.0.4 +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 51c1f01..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 @@ -96,7 +81,7 @@ LoginPage Login - + Login Instance @@ -104,11 +89,11 @@ Enter an Mastodon instance URL - + Gib eine Mastadon Instance URL ein 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 ist ein freies, auf OpenSource begründetes Soziales Netzwerk. Es bietet eine dezentralisierte Alternative zu den kommerziellen Plattformen, vermeidet aber das Risiko, dass ein einzelnes Unternehmen das Monopol auf deine gesamte Kommunikation erhält. Wähle selbst einen Server (Instanz) der du vertraust - egal welche du wählst, du kannst mit allen kommunizieren. Oder du betreibst deine eigene Mastodon Instanz und verbindest dich nahtlos mit dem Mastodon Netzwerk. Reload @@ -230,51 +215,83 @@ Followers Anhänger + + Bio + + + + Open Profile in Browser + + Settings Settings - Einstellungen + Einstellungen Remove Account - + Account löschen Add Account - + Account hinzufügen Deauthorize this app and remove your account - + Der App Autorisierung entziehen und Account entfernen Authorize this app to use your Mastodon account in your behalf - + Autorisiere diese App deinen Mastodon Account in deinem Namen zu nutzen Load images in toots - + Lade Bilder in den Toots Disable this option if you want to preserve your data connection - + Deaktiviere diese Option um deinen Datenverbindung zu schonen Translate - + Übersetzen Use Transifex to help with app translation to your language - + Nutze Transifex um bei der Übersetzung in deine Sprache zu helfen Credits - + Credits 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 diff --git a/translations/harbour-tooter-el.ts b/translations/harbour-tooter-el.ts index 9be4361..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 @@ -96,7 +81,7 @@ LoginPage Login - + Σύνδεση Instance @@ -230,51 +215,83 @@ Followers Σας ακολουθούν + + Bio + + + + Open Profile in Browser + + Settings Settings - Ρυθμίσεις + Ρυθμίσεις 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 - + Φόρτωση των εικόνων στα toot 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 σχεδιασμός και ανάπτυξη + + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence diff --git a/translations/harbour-tooter-es.ts b/translations/harbour-tooter-es.ts index 8bbcec9..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 @@ -96,23 +81,23 @@ LoginPage Login - + Acceso Instance - + Instancia Enter an Mastodon instance URL - + Introduce URL de una instancia de 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 es una red social gratuita y de código abierto. Una alternativa descentralizada a las plataformas comerciales, evita los riesgos de una única compañía que monopolice tu comunicación. Elije un servidor en el que confíes — cualquiera que elijas, puede interactuar con todos los demás. Cualquiera puede ejecutar su propia instancia de Mastodon y participar en la red social sin problemas. Reload - + Volver a cargar @@ -230,51 +215,83 @@ Followers Seguidores + + Bio + + + + Open Profile in Browser + + Settings Settings - Ajustes + Ajustes Remove Account - + Eliminar cuenta Add Account - + Añadir cuenta Deauthorize this app and remove your account - + Retira la autorización a esta aplicación y elimina tu cuenta Authorize this app to use your Mastodon account in your behalf - + Autoriza a esta aplicación a usar tu cuenta de Mastodon en tu nombre Load images in toots - + Cargar imágenes en toots Disable this option if you want to preserve your data connection - + Deshabilita esta opción si quieres ahorrar en tu conexión de datos Translate - + Traducir Use Transifex to help with app translation to your language - + Usa Transifex para ayudar en la traducción a tu idioma de esta aplicación Credits - + Créditos 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 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 dc04704..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 @@ -96,23 +81,23 @@ LoginPage Login - + Login Instance - + Instance Enter an Mastodon instance URL - + Saisissez l’URL d’une instance 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 est un réseau libre et open source. Il s’agit d'une alternative aux plateformes commerciales, pour éviter qu'une seule entreprise monopolise vos communications. Choisissez un serveur dans lequel vous avez confiance - quelque que soit votre choix vous pourrez interagir avec d’autres personnes. Tout le monde peut monter sa propre instance Mastodon et participer rendre le réseau plus robuste. Reload - + Recharger @@ -230,51 +215,83 @@ Followers Abonnés + + Bio + + + + Open Profile in Browser + + Settings Settings - Paramètres + Préférences Remove Account - + Supprimer le compte Add Account - + Ajouter un compte Deauthorize this app and remove your account - + Supprimer votre compte de l'application Authorize this app to use your Mastodon account in your behalf - + Autoriser cette application à utiliser votre compte Mastodon en votre nom Load images in toots - + Charger les images des pouets Disable this option if you want to preserve your data connection - + Désactivez cette option si vous souhaitez économiser votre consommation de données Translate - + Traduire Use Transifex to help with app translation to your language - + Utilisez Transifex pour aider à la traduction de l'application dans votre langue Credits - + Crédits 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 diff --git a/translations/harbour-tooter-nl.ts b/translations/harbour-tooter-nl.ts index 115d648..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 @@ -96,23 +81,23 @@ LoginPage Login - + Inloggen Instance - + Instantie Enter an Mastodon instance URL - + Voer de URL van een Mastodon-instantie in 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 is een vrij sociaal netwerk. Als gedecentraliseerd alternatief voor commerciële platformen, vermijdt het de risico’s van een enkel bedrijf dat je communicatie monopoliseert. Kies een server die je vertrouwt — welke je ook kiest, je kunt met iedereen communiceren. Iedereen kan zelf een Mastodon-instantie hebben en naadloos deelnemen aan het sociale netwerk. Reload - + Herladen @@ -230,51 +215,83 @@ Followers Volgers + + Bio + + + + Open Profile in Browser + + Settings Settings - Instellingen + Instellingen Remove Account - + Verwijderen account Add Account - + Toevoegen account Deauthorize this app and remove your account - + Trek autorisaties van deze app in en verwijder je account Authorize this app to use your Mastodon account in your behalf - + Autoriseer deze app om je Mastodon namens jou te gebruiken Load images in toots - + Laden afbeeldingen in toots Disable this option if you want to preserve your data connection - + Schakel deze optie uit als je je dataverbinding wilt behouden Translate - + Vertalen Use Transifex to help with app translation to your language - + Gebruik Transifex om deze app te helpen vertalen in jouw taal Credits - + Credits 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 diff --git a/translations/harbour-tooter-nl_BE.ts b/translations/harbour-tooter-nl_BE.ts index 385fa6c..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 @@ -96,23 +81,23 @@ LoginPage Login - + Inloggen Instance - + Instantie Enter an Mastodon instance URL - + Voert den URL van een Mastodon-instantie in 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 is e vrij sociaal netwerk. Als gedecentraliseerd alternatief voor commerciële platformen, vermijdt het de risico’s van één enkel bedrijf dat uw communicatie monopoliseert. Kiest ne server die ge vertrouwt — dewelken dat ge ook kiest, ge kunt met iedereen communiceren. Iedereen kan zelf een Mastodon-instantie hebben en naadloos deelnemen aan het sociaal netwerk. Reload - + Herladen @@ -230,51 +215,83 @@ Followers Volgers + + Bio + + + + Open Profile in Browser + + Settings Settings - Instellingen + Instellingen Remove Account - + Account verwijderen Add Account - + Account toevoegen Deauthorize this app and remove your account - + Trekt autorisaties van dezen app in en verwijdert uwen account Authorize this app to use your Mastodon account in your behalf - + Autoriseert dezen app voor uwe Mastodon-account namens u te gebruiken Load images in toots - + Afbeeldingen in toots laden Disable this option if you want to preserve your data connection - + Schakelt dees optie uit als ge uw verbinding wilt behouden Translate - + Vertalen Use Transifex to help with app translation to your language - + Gebruikt Transifex voor te helpen met dezen app in uw taal te vertalen Credits - + Credits 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 diff --git a/translations/harbour-tooter-oc.ts b/translations/harbour-tooter-oc.ts index 0f43a2a..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 @@ -96,7 +81,7 @@ LoginPage Login - + Connexion Instance @@ -104,11 +89,11 @@ Enter an Mastodon instance URL - + Picatz l’URL d’una instància 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 es un malhum liure e open source. Es una alternativa descentralizada a las plataformas comercialas, per empachar qu'una sola entrepresa monopolize vòstras comunicacions. Causissètz un servidor que vos fisatz - qualque siá vòstre causida poiretz interagir amb los autres. Tot lo monde pòt montar sa pròpria instància Mastodon e atal participar a construire un malhum mai solid. Reload @@ -230,51 +215,83 @@ Followers Seguidors + + Bio + + + + Open Profile in Browser + + Settings Settings - Parmètres + Paramètres Remove Account - + Levar un compte Add Account - + Ajustar un compte Deauthorize this app and remove your account - + Revocar l’aplicacion e levar vòstre compte Authorize this app to use your Mastodon account in your behalf - + Autorizar aquesta aplicacion a utilizar vòstre compte Mastodon per vos Load images in toots - + Cargar los imatges dels tuts Disable this option if you want to preserve your data connection - + Desactivar aquesta opcion per estalviar vòstra connexion de donadas Translate - + Traduire Use Transifex to help with app translation to your language - + Utilizar Transifex per ajudar a traduire l’aplicacion dins vòstra lenga Credits - + Crèdits 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 diff --git a/translations/harbour-tooter-pl.ts b/translations/harbour-tooter-pl.ts index 60c7451..6efba16 100644 --- a/translations/harbour-tooter-pl.ts +++ b/translations/harbour-tooter-pl.ts @@ -1,95 +1,80 @@ - + API favourited - dodał(a) do ulubionych + followed you - zaczął(-ęła) Cię śledzić + boosted - podbił(a) + said - napisał(a) - - - - Browser - - Open in Browser - Otwórz w przeglądarce - - - Web mode - Tryb sieci - - - Reading mode - Tryb czytania - - - Copy URL - Kopiuj URL + Conversation Conversation - Konwersacja - - - Content warning! - Ostrzeżenie o zawartości! - - - public - publiczny - - - unlisted - niewidoczny - - - followers only - tylko dla śledzących - - - direct - bezpośredni + Delete - Usuń + Emojis - Emoji + Tap to insert - Dotknij aby wstawić + + + + Write your warning here + + + + What's on your mind? + + + + Public + + + + Unlisted + + + + Followers-only + + + + Direct + ImageFullScreen Error loading - Błąd ładowania + ImageUploader The file %1 does not exists - Plik %1 nie istnieje + @@ -119,123 +104,131 @@ MainPage Home - Strona główna + Notifications - Powiadomienia + New Toot - Nowy wpis + Search - Szukaj + @user or #term - @użytkownik lub #tag + Local - Lokalne + Federated - Globalne + MiniStatus boosted - podbił(a) + favourited - dodał(a) do ulubionych + followed you - zaczął(-ęła) Cię śledzić + MyList Load more - Załaduj więcej + Settings - Ustawienia + Loading - Ładowanie + please wait... - proszę czekać… + Profile Unfollow - Przestań śledzić + Follow request sent! - Wysłano prośbę o możliwość śledzenia! + Following - Śledzisz + Mute - Wycisz + Unmute - Unmute + Unblock - Unblock + Block - Block + Statuses - Statuses + Favourites - Favourites + Follow - Follow + Summary - Summary + Followers - Followers + + + + Bio + + + + Open Profile in Browser + Settings Settings - Ustawienia + Remove Account @@ -277,39 +270,63 @@ UI/UX design and development + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence + + Toot boosted - podbił(a) + favourited - dodał(a) do ulubionych + followed you - zaczął(-ęła Cię śledzić) + VisualContainer Unboost - Cofnij podbicie + Boost - Podbij + Unfavorite - Usuń z ulubionych + Favorite - Dodaj do ulubionych + diff --git a/translations/harbour-tooter-ru.ts b/translations/harbour-tooter-ru.ts index ee37bee..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 @@ -96,7 +81,7 @@ LoginPage Login - + Авторизоваться Instance @@ -104,11 +89,11 @@ Enter an Mastodon instance URL - + Введите 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 и беспрепятственно участвовать в социальной сети. Reload @@ -230,51 +215,83 @@ Followers Читают + + Bio + + + + Open Profile in Browser + + Settings Settings - Настройки + Настройки 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 - + Загружать изображения 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 + + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence diff --git a/translations/harbour-tooter-sr.ts b/translations/harbour-tooter-sr.ts index 48ef2cb..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 @@ -96,23 +81,23 @@ LoginPage Login - + Пријава Instance - + Инстанца Enter an Mastodon instance URL - + Унесите URL ваше Мастодон инстанце 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 је бесплатна, open-source друштвена мрежа. Децентрализована алтернатива комерцијалним платформама која избегава ризике једне компаније која монополизује вашу комуникацију. Одаберите сервер у који имате поверења и без обзира на ваш избор - комуницирајте с осталим корисницима других мрежа. Свако може водити сопствену инстанцу Mastodon мреже и учестовати у комуникацији с другим инстанцама. Reload - + освежи @@ -230,51 +215,83 @@ Followers Пратиоци + + Bio + + + + Open Profile in Browser + + Settings Settings - Подешавања + Подешавања 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 - + Прикажи слике у објавама 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 + интерфејс дизајн и развој + + + Visual identity + + + + Occitan & French translation + + + + Dutch translation + + + + Spanish translation + + + + Added README file + + + + Development and maintenence diff --git a/translations/harbour-tooter-sv.ts b/translations/harbour-tooter-sv.ts index 16be25c..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 @@ -96,7 +81,7 @@ LoginPage Login - + Logga in Instance @@ -104,11 +89,11 @@ Enter an Mastodon instance URL - + Fyll i URL till Mastodoninstans 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 är ett fritt och öppet socialt nätverk byggt på öppen källkod. Ett decentraliserat alternativ till kommersiella plattformar, vilket undviker att ett ensamt företag monopoliserar din kommunikation. Välj en server du litar på --- beroende på vilken du väljer, kan du interagera med alla andra. Vem som helst kan köra deras egen Mastodoninstans och delta i nätverket. Även du! Reload @@ -230,51 +215,83 @@ Followers Följare + + Bio + + + + Open Profile in Browser + + Settings Settings - Inställningar + Inställningar Remove Account - + Radera konto Add Account - + Lägg till konto Deauthorize this app and remove your account - + Avauktorisera denna app och radera ditt konto Authorize this app to use your Mastodon account in your behalf - + Godkänn denna app att använda ditt Mastodon-konto på dina vägnar Load images in toots - + Ladda bilder i toots Disable this option if you want to preserve your data connection - + Inaktivera det här alternativet om du vill behålla din dataanslutning Translate - + Översätt Use Transifex to help with app translation to your language - + Använd Transifex för att hjälpa med app-översättningar till ditt språk Credits - + Erkännanden 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 diff --git a/translations/harbour-tooter-zh.ts b/translations/harbour-tooter-zh_CN.ts similarity index 79% rename from translations/harbour-tooter-zh.ts rename to translations/harbour-tooter-zh_CN.ts index f9bedda..417161c 100644 --- a/translations/harbour-tooter-zh.ts +++ b/translations/harbour-tooter-zh_CN.ts @@ -1,6 +1,6 @@ - + API @@ -13,7 +13,7 @@ boosted - 推出的 + 推起的 said @@ -47,7 +47,7 @@ Content warning! - 内容警告 + 内容警告! public @@ -89,29 +89,34 @@ ImageUploader The file %1 does not exists - 文件%1 不存在 + 文件 %1 不存在 LoginPage Login - + 登录 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 实例,然后无缝加入社交网站。 + Reload + 重新加载 + + + Enter an Mastodon instance URL @@ -150,7 +155,7 @@ MiniStatus boosted - 推出的 + 推起的 favourited @@ -184,11 +189,12 @@ Profile Unfollow + 未关注 Follow request sent! - 关注请求已寄出 + 关注请求已寄出! Following @@ -230,59 +236,67 @@ Followers 关注者 + + Bio + 简介 + + + Open Profile in Browser + 在浏览器打开个人简介 + Settings Settings - 设置 + 设置 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 - + 在嘟嘟加载图片 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 设计及开发 Toot boosted - 推出的 + 推起的 favourited @@ -297,14 +311,15 @@ VisualContainer Unboost - 取消推出 + 取消推起 Boost - 推出 + 推起 Unfavorite + 取消收藏 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