new features / ui improvements

- add Toots to bookmarks
This commit is contained in:
molan-git 2020-06-18 18:40:24 +02:00
parent f77d539f5a
commit 72c49c3777
26 changed files with 706 additions and 490 deletions

View file

@ -75,6 +75,7 @@ DISTFILES += qml/harbour-tooter.qml \
qml/lib/API.js \ qml/lib/API.js \
qml/images/icon-s-bot.svg \ qml/images/icon-s-bot.svg \
qml/images/icon-s-following \ qml/images/icon-s-following \
qml/images/icon-s-bookmark \
qml/images/icon-m-emoji.svg \ qml/images/icon-m-emoji.svg \
qml/images/icon-m-profile.svg \ qml/images/icon-m-profile.svg \
qml/images/icon-l-profile.svg \ qml/images/icon-l-profile.svg \
@ -93,7 +94,7 @@ SAILFISHAPP_ICONS = 86x86 108x108 128x128 172x172
# to disable building translations every time, comment out the # to disable building translations every time, comment out the
# following CONFIG line # following CONFIG line
# CONFIG += sailfishapp_i18n CONFIG += sailfishapp_i18n
TRANSLATIONS += translations/harbour-tooter.ts \ TRANSLATIONS += translations/harbour-tooter.ts \
translations/harbour-tooter-de.ts \ translations/harbour-tooter-de.ts \

View file

@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<title>icon-s-bookmark</title>
<g>
<rect width="32" height="32" fill="#fff" fill-opacity="0"/>
<path d="M20.81,10H11.19a1,1,0,1,1,0-2h9.63a1,1,0,0,1,0,2Z" fill="#fff"/>
<path d="M20.81,14.62H11.19a1,1,0,0,1,0-2h9.63a1,1,0,0,1,0,2Z" fill="#fff"/>
<path d="M26.85,29.74a1,1,0,0,1-.66-.25L16,20.82,5.81,29.48a1,1,0,0,1-1,.2c-.7-.22-.7-.76-.7-1.58,0-.63,0-1.88,0-4.38V4.48A2.41,2.41,0,0,1,6.44,2H25.56a2.41,2.41,0,0,1,2.29,2.5V23.73c0,2.5,0,3.75,0,4.38,0,.82,0,1.36-.7,1.58A1,1,0,0,1,26.85,29.74Zm-10.16-11,9.16,7.79c0-.7,0-1.62,0-2.84V4.48c0-.3-.18-.5-.29-.5H6.44c-.12,0-.29.2-.29.5V23.73c0,1.22,0,2.14,0,2.84l9.16-7.79h0a1.11,1.11,0,0,1,1.39,0Z" fill="#fff" opacity="0.6"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 776 B

View file

@ -95,6 +95,8 @@ var tootParser = function(data){
ret.reblogged = data.reblogged ? true : false ret.reblogged = data.reblogged ? true : false
ret.status_reblogs_count = data.reblogs_count ? data.reblogs_count : false ret.status_reblogs_count = data.reblogs_count ? data.reblogs_count : false
ret.bookmarked = data.bookmarked ? true : false
ret.muted = data.muted ? true : false ret.muted = data.muted ? true : false
ret.sensitive = data.sensitive ? true : false ret.sensitive = data.sensitive ? true : false
ret.visibility = data.visibility ? data.visibility : false ret.visibility = data.visibility ? data.visibility : false

View file

@ -152,6 +152,7 @@ function parseAccounts(collection, prefix, data) {
// Optional attributes // Optional attributes
//res[prefix + 'account_fields'] = data["fields"] //res[prefix + 'account_fields'] = data["fields"]
res[prefix + 'account_bot'] = data["bot"] res[prefix + 'account_bot'] = data["bot"]
res[prefix + 'account_group'] = data["group"]
res[prefix + 'account_source'] = data["source"] res[prefix + 'account_source'] = data["source"]
//console.log(JSON.stringify(res)) //console.log(JSON.stringify(res))

View file

@ -6,73 +6,74 @@ import "./components/"
Page { Page {
id: conversationPage id: conversationPage
property string type property string type
property string description: "" property string description: ""
property string headerTitle: "" property string headerTitle: ""
property string suggestedUser: "" property string suggestedUser: ""
property ListModel suggestedModel property ListModel suggestedModel
property string toot_id: "" property string toot_id: ""
property string toot_url: "" property string toot_url: ""
property string toot_uri: "" property string toot_uri: ""
property int tootMaxChar: 500; property int tootMaxChar: 500;
property bool bot: false //otherwise ReferenceError ProfileHeader.qml property bool bot: false //otherwise ReferenceError ProfileHeader.qml
property bool followed_by: false //otherwise ReferenceError ProfileHeader.qml property bool followed_by: false //otherwise ReferenceError ProfileHeader.qml
property bool locked: false //otherwise ReferenceError ProfileHeader.qml property bool locked: false //otherwise ReferenceError ProfileHeader.qml
property bool group: false //otherwise ReferenceError ProfileHeader.qml
property ListModel mdl property ListModel mdl
allowedOrientations: Orientation.All allowedOrientations: Orientation.All
onSuggestedUserChanged: { onSuggestedUserChanged: {
console.log(suggestedUser) console.log(suggestedUser)
suggestedModel = Qt.createQmlObject( suggestedModel = Qt.createQmlObject(
'import QtQuick 2.0; ListModel { }', 'import QtQuick 2.0; ListModel { }',
Qt.application, 'InternalQmlObject' Qt.application, 'InternalQmlObject'
) )
predictionList.visible = false predictionList.visible = false
if (suggestedUser.length > 0) { if (suggestedUser.length > 0) {
var msg = { var msg = {
"action": 'accounts/search', "action": 'accounts/search',
"method": 'GET', "method": 'GET',
"model": suggestedModel, "model": suggestedModel,
"mode": "append", "mode": "append",
"params": [{ "params": [{
"name": "q", "name": "q",
"data": suggestedUser "data": suggestedUser
}], }],
"conf": Logic.conf "conf": Logic.conf
} }
worker.sendMessage(msg) worker.sendMessage(msg)
predictionList.visible = true predictionList.visible = true
} }
} }
ListModel { ListModel {
id: mediaModel id: mediaModel
onCountChanged: { onCountChanged: {
btnAddImage.enabled = mediaModel.count < 4 btnAddImage.enabled = mediaModel.count < 4
} }
} }
WorkerScript { WorkerScript {
id: worker id: worker
source: "../lib/Worker.js" source: "../lib/Worker.js"
onMessage: { onMessage: {
console.log(JSON.stringify(messageObject)) console.log(JSON.stringify(messageObject))
} }
} }
ProfileHeader { ProfileHeader {
id: header id: header
visible: false visible: false
} }
SilicaListView { SilicaListView {
id: myList id: myList
header: PageHeader { header: PageHeader {
title: headerTitle // pageTitle pushed from MainPage.qml or VisualContainer.qml title: headerTitle // pageTitle pushed from MainPage.qml or VisualContainer.qml
} }
clip: true clip: true
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
@ -81,25 +82,25 @@ Page {
} else { } else {
hiddenPanel.top hiddenPanel.top
} }
model: mdl model: mdl
section { section {
property: 'section' property: 'section'
delegate: SectionHeader { delegate: SectionHeader {
height: Theme.itemSizeExtraSmall height: Theme.itemSizeExtraSmall
text: Format.formatDate(section, Formatter.DateMedium) text: Format.formatDate(section, Formatter.DateMedium)
} }
} }
delegate: VisualContainer { delegate: VisualContainer {
} }
onCountChanged: { onCountChanged: {
if (mdl) if (mdl)
for (var i = 0; i < mdl.count; i++) { for (var i = 0; i < mdl.count; i++) {
if (mdl.get(i).status_id === toot_id) { if (mdl.get(i).status_id === toot_id) {
console.log(mdl.get(i).status_id) console.log(mdl.get(i).status_id)
positionViewAtIndex(i, ListView.Center) positionViewAtIndex(i, ListView.Center)
} }
} }
} }
PullDownMenu { PullDownMenu {
id: pulleyConversation id: pulleyConversation
@ -133,9 +134,9 @@ Page {
} }
} }
Rectangle { Rectangle {
id: predictionList id: predictionList
visible: false visible: false
color: Theme.highlightDimmerColor color: Theme.highlightDimmerColor
height: parent.height - panel.height - (Theme.paddingLarge * 4.5) height: parent.height - panel.height - (Theme.paddingLarge * 4.5)
anchors { anchors {
@ -151,27 +152,27 @@ Page {
SilicaListView { SilicaListView {
rotation: 180 rotation: 180
anchors.fill: parent anchors.fill: parent
model: suggestedModel model: suggestedModel
clip: true clip: true
quickScroll: false quickScroll: false
VerticalScrollDecorator {} VerticalScrollDecorator {}
delegate: ItemUser { delegate: ItemUser {
rotation: 180 rotation: 180
onClicked: { onClicked: {
var start = toot.cursorPosition var start = toot.cursorPosition
while (toot.text[start] !== "@" && start > 0) { while (toot.text[start] !== "@" && start > 0) {
start-- start--
} }
textOperations.text = toot.text textOperations.text = toot.text
textOperations.cursorPosition = toot.cursorPosition textOperations.cursorPosition = toot.cursorPosition
textOperations.moveCursorSelection(start - 1, TextInput.SelectWords) textOperations.moveCursorSelection(start - 1, TextInput.SelectWords)
toot.text = textOperations.text.substring(0, textOperations.selectionStart) toot.text = textOperations.text.substring(0, textOperations.selectionStart)
+ ' @' + ' @'
+ model.account_acct + model.account_acct
+ ' ' + ' '
+ textOperations.text.substring(textOperations.selectionEnd).trim() + textOperations.text.substring(textOperations.selectionEnd).trim()
toot.cursorPosition = toot.text.indexOf('@' + model.account_acct) toot.cursorPosition = toot.text.indexOf('@' + model.account_acct)
} }
} }
onCountChanged: { onCountChanged: {
@ -182,82 +183,80 @@ Page {
} }
} }
DockedPanel { DockedPanel {
id: panel id: panel
width: parent.width width: parent.width
height: progressBar.height + toot.height + (mediaModel.count ? uploadedImages.height : 0) height: progressBar.height + toot.height + (mediaModel.count ? uploadedImages.height : 0)
+ btnContentWarning.height + Theme.paddingMedium + btnContentWarning.height + Theme.paddingMedium
+ (warningContent.visible ? warningContent.height : 0) + (warningContent.visible ? warningContent.height : 0)
dock: Dock.Bottom dock: Dock.Bottom
open: if (type == "new") { open: true
true
} else false
animationDuration: 300 animationDuration: 300
Rectangle { Rectangle {
width: parent.width width: parent.width
height: progressBar.height height: progressBar.height
color: Theme.highlightBackgroundColor color: Theme.highlightBackgroundColor
opacity: 0.2 opacity: 0.2
anchors { anchors {
left: parent.left left: parent.left
right: parent.right right: parent.right
top: parent.top top: parent.top
} }
} }
Rectangle { Rectangle {
id: progressBar id: progressBar
width: toot.text.length ? panel.width * (toot.text.length / tootMaxChar) : 0 width: toot.text.length ? panel.width * (toot.text.length / tootMaxChar) : 0
height: Theme.itemSizeSmall * 0.05 height: Theme.itemSizeSmall * 0.05
color: Theme.highlightBackgroundColor color: Theme.highlightBackgroundColor
opacity: 0.7 opacity: 0.7
anchors { anchors {
left: parent.left left: parent.left
top: parent.top top: parent.top
} }
} }
TextField { TextField {
id: warningContent id: warningContent
visible: false visible: false
height: visible ? implicitHeight : 0 height: visible ? implicitHeight : 0
anchors { anchors {
top: parent.top top: parent.top
topMargin: Theme.paddingMedium topMargin: Theme.paddingMedium
left: parent.left left: parent.left
right: parent.right right: parent.right
} }
autoScrollEnabled: true autoScrollEnabled: true
labelVisible: false labelVisible: false
font.pixelSize: Theme.fontSizeSmall font.pixelSize: Theme.fontSizeSmall
placeholderText: qsTr("Write your warning here") placeholderText: qsTr("Write your warning here")
placeholderColor: palette.highlightColor placeholderColor: palette.highlightColor
color: palette.highlightColor color: palette.highlightColor
horizontalAlignment: Text.AlignLeft horizontalAlignment: Text.AlignLeft
EnterKey.onClicked: {} EnterKey.onClicked: {}
} }
TextInput { TextInput {
id: textOperations id: textOperations
visible: false visible: false
} }
TextArea { TextArea {
id: toot id: toot
anchors { anchors {
top: warningContent.bottom top: warningContent.bottom
topMargin: Theme.paddingMedium topMargin: Theme.paddingMedium
left: parent.left left: parent.left
right: parent.right right: parent.right
rightMargin: Theme.paddingLarge * 2 rightMargin: Theme.paddingLarge * 2
} }
autoScrollEnabled: true autoScrollEnabled: true
labelVisible: false labelVisible: false
text: description !== "" && (description.charAt(0) === '@' text: description !== "" && (description.charAt(0) === '@'
|| description.charAt( || description.charAt(
0) === '#') ? description + ' ' : '' 0) === '#') ? description + ' ' : ''
height: if (type !== "reply") { height: if (type !== "reply") {
Math.max(conversationPage.height / 3, Math.min(conversationPage.height * 0.65, implicitHeight)) Math.max(conversationPage.height / 3, Math.min(conversationPage.height * 0.65, implicitHeight))
} }
@ -268,269 +267,269 @@ Page {
placeholderText: qsTr("What's on your mind?") placeholderText: qsTr("What's on your mind?")
font.pixelSize: Theme.fontSizeSmall font.pixelSize: Theme.fontSizeSmall
EnterKey.onClicked: {} EnterKey.onClicked: {}
onTextChanged: { onTextChanged: {
textOperations.text = toot.text textOperations.text = toot.text
textOperations.cursorPosition = toot.cursorPosition textOperations.cursorPosition = toot.cursorPosition
textOperations.selectWord() textOperations.selectWord()
textOperations.select( textOperations.select(
textOperations.selectionStart ? textOperations.selectionStart - 1 : 0, textOperations.selectionStart ? textOperations.selectionStart - 1 : 0,
textOperations.selectionEnd) textOperations.selectionEnd)
//console.log(textOperations.text.substr(textOperations.selectionStart, textOperations.selectionEnd)) //console.log(textOperations.text.substr(textOperations.selectionStart, textOperations.selectionEnd))
console.log(toot.text.length) console.log(toot.text.length)
suggestedUser = "" suggestedUser = ""
if (textOperations.selectedText.charAt(0) === "@") { if (textOperations.selectedText.charAt(0) === "@") {
suggestedUser = textOperations.selectedText.trim().substring(1) suggestedUser = textOperations.selectedText.trim().substring(1)
} }
} }
} }
IconButton { IconButton {
id: btnSmileys id: btnSmileys
property string selection property string selection
opacity: 0.7 opacity: 0.7
icon { icon {
source: "../../qml/images/icon-m-emoji.svg?"
color: Theme.secondaryColor color: Theme.secondaryColor
width: Theme.iconSizeSmallPlus width: Theme.iconSizeSmallPlus
fillMode: Image.PreserveAspectFit fillMode: Image.PreserveAspectFit
source: "../../qml/images/icon-m-emoji.svg"
} }
anchors { anchors {
top: warningContent.bottom top: warningContent.bottom
bottom: bottom.top bottom: bottom.top
right: parent.right right: parent.right
rightMargin: Theme.paddingSmall rightMargin: Theme.paddingSmall
} }
onSelectionChanged: { console.log(selection) } onSelectionChanged: { console.log(selection) }
onClicked: pageStack.push(emojiSelect) onClicked: pageStack.push(emojiSelect)
} }
SilicaGridView { SilicaGridView {
id: uploadedImages id: uploadedImages
width: parent.width width: parent.width
anchors.top: bottom.toot anchors.top: bottom.toot
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
height: mediaModel.count ? Theme.itemSizeExtraLarge : 0 height: mediaModel.count ? Theme.itemSizeExtraLarge : 0
model: mediaModel model: mediaModel
cellWidth: uploadedImages.width / 4 cellWidth: uploadedImages.width / 4
cellHeight: Theme.itemSizeExtraLarge cellHeight: Theme.itemSizeExtraLarge
delegate: BackgroundItem { delegate: BackgroundItem {
id: myDelegate id: myDelegate
width: uploadedImages.cellWidth width: uploadedImages.cellWidth
height: uploadedImages.cellHeight height: uploadedImages.cellHeight
RemorseItem { RemorseItem {
id: remorse id: remorse
} }
Image { Image {
anchors.fill: parent anchors.fill: parent
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
source: model.preview_url source: model.preview_url
} }
onClicked: { onClicked: {
var idx = index var idx = index
console.log(idx) console.log(idx)
//mediaModel.remove(idx) //mediaModel.remove(idx)
remorse.execute(myDelegate, qsTr("Delete"), function () { remorse.execute(myDelegate, qsTr("Delete"), function () {
mediaModel.remove(idx) mediaModel.remove(idx)
}) })
} }
} }
add: Transition { add: Transition {
NumberAnimation { NumberAnimation {
property: "opacity" property: "opacity"
from: 0 from: 0
to: 1.0 to: 1.0
duration: 800 duration: 800
} }
} }
remove: Transition { remove: Transition {
NumberAnimation { NumberAnimation {
property: "opacity" property: "opacity"
from: 1.0 from: 1.0
to: 0 to: 0
duration: 800 duration: 800
} }
} }
displaced: Transition { displaced: Transition {
NumberAnimation { NumberAnimation {
properties: "x,y" properties: "x,y"
duration: 800 duration: 800
easing.type: Easing.InOutBack easing.type: Easing.InOutBack
} }
} }
} }
IconButton { IconButton {
id: btnContentWarning id: btnContentWarning
anchors { anchors {
top: toot.bottom top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5 topMargin: -Theme.paddingSmall * 1.5
left: parent.left left: parent.left
leftMargin: Theme.paddingMedium leftMargin: Theme.paddingMedium
} }
icon.source: "image://theme/icon-s-warning?" icon.source: "image://theme/icon-s-warning?"
+ (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor)) + (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
onClicked: warningContent.visible = !warningContent.visible onClicked: warningContent.visible = !warningContent.visible
} }
IconButton { IconButton {
id: btnAddImage id: btnAddImage
enabled: mediaModel.count < 4 enabled: mediaModel.count < 4
anchors { anchors {
top: toot.bottom top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5 topMargin: -Theme.paddingSmall * 1.5
left: btnContentWarning.right left: btnContentWarning.right
leftMargin: Theme.paddingSmall leftMargin: Theme.paddingSmall
} }
icon.source: "image://theme/icon-s-attach?" icon.source: "image://theme/icon-s-attach?"
+ (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor)) + (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
onClicked: { onClicked: {
btnAddImage.enabled = false btnAddImage.enabled = false
var once = true var once = true
var imagePicker = pageStack.push("Sailfish.Pickers.ImagePickerPage", {"allowedOrientations": Orientation.All}) var imagePicker = pageStack.push("Sailfish.Pickers.ImagePickerPage", {"allowedOrientations": Orientation.All})
imagePicker.selectedContentChanged.connect(function () { imagePicker.selectedContentChanged.connect(function () {
var imagePath = imagePicker.selectedContent var imagePath = imagePicker.selectedContent
console.log(imagePath) console.log(imagePath)
imageUploader.setUploadUrl(Logic.conf.instance + "/api/v1/media") imageUploader.setUploadUrl(Logic.conf.instance + "/api/v1/media")
imageUploader.setFile(imagePath) imageUploader.setFile(imagePath)
imageUploader.setAuthorizationHeader(Logic.conf.api_user_token) imageUploader.setAuthorizationHeader(Logic.conf.api_user_token)
imageUploader.upload() imageUploader.upload()
}) })
} }
} }
ImageUploader { ImageUploader {
id: imageUploader id: imageUploader
onProgressChanged: { onProgressChanged: {
console.log("progress " + progress) console.log("progress " + progress)
uploadProgress.width = parent.width * progress uploadProgress.width = parent.width * progress
} }
onSuccess: { onSuccess: {
uploadProgress.width = 0 uploadProgress.width = 0
console.log(replyData) console.log(replyData)
mediaModel.append(JSON.parse(replyData)) mediaModel.append(JSON.parse(replyData))
} }
onFailure: { onFailure: {
uploadProgress.width = 0 uploadProgress.width = 0
btnAddImage.enabled = true btnAddImage.enabled = true
console.log(status) console.log(status)
console.log(statusText) console.log(statusText)
} }
} }
ComboBox { ComboBox {
id: privacy id: privacy
anchors { anchors {
top: toot.bottom top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5 topMargin: -Theme.paddingSmall * 1.5
left: btnAddImage.right left: btnAddImage.right
right: btnSend.left right: btnSend.left
} }
menu: ContextMenu { menu: ContextMenu {
MenuItem { MenuItem {
text: qsTr("Public") text: qsTr("Public")
} }
MenuItem { MenuItem {
text: qsTr("Unlisted") text: qsTr("Unlisted")
} }
MenuItem { MenuItem {
text: qsTr("Followers-only") text: qsTr("Followers-only")
} }
MenuItem { MenuItem {
text: qsTr("Direct") text: qsTr("Direct")
} }
} }
} }
IconButton { IconButton {
id: btnSend id: btnSend
icon.source: "image://theme/icon-m-send?" icon.source: "image://theme/icon-m-send?"
+ (pressed ? Theme.highlightColor : Theme.primaryColor) + (pressed ? Theme.highlightColor : Theme.primaryColor)
anchors { anchors {
top: toot.bottom top: toot.bottom
topMargin: -Theme.paddingSmall * 1.5 topMargin: -Theme.paddingSmall * 1.5
right: parent.right right: parent.right
rightMargin: Theme.paddingSmall rightMargin: Theme.paddingSmall
} }
enabled: toot.text !== "" && toot.text.length < tootMaxChar && uploadProgress.width == 0 enabled: toot.text !== "" && toot.text.length < tootMaxChar && uploadProgress.width == 0
onClicked: { onClicked: {
var visibility = ["public", "unlisted", "private", "direct"] var visibility = ["public", "unlisted", "private", "direct"]
var media_ids = [] var media_ids = []
for (var k = 0; k < mediaModel.count; k++) { for (var k = 0; k < mediaModel.count; k++) {
console.log(mediaModel.get(k).id) console.log(mediaModel.get(k).id)
media_ids.push(mediaModel.get(k).id) media_ids.push(mediaModel.get(k).id)
} }
var msg = { var msg = {
"action": 'statuses', "action": 'statuses',
"method": 'POST', "method": 'POST',
"model": mdl, "model": mdl,
"mode": "append", "mode": "append",
"params": { "params": {
"status": toot.text, "status": toot.text,
"visibility": visibility[privacy.currentIndex], "visibility": visibility[privacy.currentIndex],
"media_ids": media_ids "media_ids": media_ids
}, },
"conf": Logic.conf "conf": Logic.conf
} }
if (toot_id) if (toot_id)
msg.params['in_reply_to_id'] = (toot_id) + "" msg.params['in_reply_to_id'] = (toot_id) + ""
if (warningContent.visible && warningContent.text.length > 0) { if (warningContent.visible && warningContent.text.length > 0) {
msg.params['sensitive'] = 1 msg.params['sensitive'] = 1
msg.params['spoiler_text'] = warningContent.text msg.params['spoiler_text'] = warningContent.text
} }
worker.sendMessage(msg) worker.sendMessage(msg)
warningContent.text = "" warningContent.text = ""
toot.text = "" toot.text = ""
mediaModel.clear() mediaModel.clear()
sentBanner.showText(qsTr("Toot sent!")) sentBanner.showText(qsTr("Toot sent!"))
} }
} }
Rectangle { Rectangle {
id: uploadProgress id: uploadProgress
color: Theme.highlightBackgroundColor color: Theme.highlightBackgroundColor
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
height: Theme.itemSizeSmall * 0.05 height: Theme.itemSizeSmall * 0.05
} }
} }
Component.onCompleted: { Component.onCompleted: {
toot.cursorPosition = toot.text.length toot.cursorPosition = toot.text.length
if (mdl.count > 0) { if (mdl.count > 0) {
var setIndex = 0 var setIndex = 0
switch (mdl.get(0).status_visibility) { switch (mdl.get(0).status_visibility) {
case "unlisted": case "unlisted":
setIndex = 1 setIndex = 1
break break
case "private": case "private":
setIndex = 2 setIndex = 2
break break
case "direct": case "direct":
privacy.enabled = false privacy.enabled = false
setIndex = 3 setIndex = 3
break break
default: default:
privacy.enabled = true privacy.enabled = true
setIndex = 0 setIndex = 0
} }
privacy.currentIndex = setIndex privacy.currentIndex = setIndex
} }
console.log(JSON.stringify()) console.log(JSON.stringify())
worker.sendMessage({ worker.sendMessage({
"action": 'statuses/' + mdl.get(0).status_id + '/context', "action": 'statuses/' + mdl.get(0).status_id + '/context',
"method": 'GET', "method": 'GET',
"model": mdl, "model": mdl,
"params": { }, "params": { },
"conf": Logic.conf "conf": Logic.conf
}) })
} }
BackgroundItem { BackgroundItem {
id: hiddenPanel id: hiddenPanel
@ -587,7 +586,7 @@ Page {
EmojiSelect { EmojiSelect {
id: emojiSelect id: emojiSelect
} }
InfoBanner { InfoBanner {
id: sentBanner id: sentBanner

View file

@ -184,7 +184,8 @@ Page {
"following_count": model.account_following_count, "following_count": model.account_following_count,
"statuses_count": model.account_statuses_count, "statuses_count": model.account_statuses_count,
"locked": model.account_locked, "locked": model.account_locked,
"bot": model.account_bot "bot": model.account_bot,
"group": model.account_group
}) })
} }
} }

View file

@ -21,6 +21,7 @@ Page {
property int followers_count property int followers_count
property bool locked: false property bool locked: false
property bool bot: false property bool bot: false
property bool group: false
property bool following: false property bool following: false
property bool followed_by: false property bool followed_by: false
property bool requested: false property bool requested: false
@ -68,16 +69,9 @@ Page {
case 'following_count': case 'following_count':
following_count = messageObject.data following_count = messageObject.data
break; break;
case 'acct': /* case 'acct':
// line below was commented out, reason unknown username = messageObject.data
// username = messageObject.data break; */
break;
case 'locked':
locked = messageObject.data
break;
case 'bot':
bot = messageObject.data
break;
case 'created_at': case 'created_at':
created_at = messageObject.data created_at = messageObject.data
break; break;
@ -99,10 +93,7 @@ Page {
break; break;
case 'blocking': case 'blocking':
blocking = messageObject.data blocking = messageObject.data
followers_count = followers_count + (blocking ? -1 : 0) // followers_count = followers_count + (blocking ? -1 : 0)
break;
case 'followed_by':
followed_by = messageObject.data
break; break;
} }
} }
@ -121,13 +112,6 @@ Page {
} }
worker.sendMessage(msg) worker.sendMessage(msg)
// reason for crashes when opening ProfilePage.qml
/* msg = {
'action' : "accounts/"+user_id,
'conf' : Logic.conf
}
worker.sendMessage(msg) */
} else { } else {
var instance = Logic.conf['instance'].split("//") var instance = Logic.conf['instance'].split("//")
msg = { msg = {
@ -160,13 +144,10 @@ Page {
} }
} }
ExpandingSectionGroup { // ProfilePage ExpandingSection // ProfilePage ExpandingSection
ExpandingSectionGroup {
id: profileExpander id: profileExpander
anchors { anchors.bottom: parent.bottom
bottom: parent.bottom
left: parent.left
right: parent.right
}
ExpandingSection { ExpandingSection {
id: expandingSection1 id: expandingSection1
@ -174,13 +155,12 @@ Page {
//: If there's no good translation for "About", use "Details" (in details about profile). //: If there's no good translation for "About", use "Details" (in details about profile).
qsTr("About") qsTr("About")
content.sourceComponent: Column { content.sourceComponent: Column {
height: Math.min( txtContainer, parent.height * 0.7 )
spacing: Theme.paddingLarge spacing: Theme.paddingLarge
Item { Item {
id: txtContainer id: txtContainer
width: parent.width width: parent.width
height: Math.min( txtNote.height, parent.height * 0.55 ) height: profilePage.isPortrait ? Math.min( txtNote.height, parent.height * 0.5 ) : Math.min( txtNote.height, parent.height * 0.2 )
visible: { visible: {
if ((note.text === "") || ( note.text === "<p></p>" )) { if ((note.text === "") || ( note.text === "<p></p>" )) {
false false

View file

@ -31,7 +31,7 @@ BackgroundItem {
size: BusyIndicatorSize.Small size: BusyIndicatorSize.Small
opacity: img.status === Image.Ready ? 0.0 : 1.0 opacity: img.status === Image.Ready ? 0.0 : 1.0
Behavior on opacity { FadeAnimator {} } Behavior on opacity { FadeAnimator {} }
running: avatar.status !== Image.Ready; running: avatar.status !== Image.Ready
anchors.centerIn: parent anchors.centerIn: parent
} }
@ -105,6 +105,7 @@ BackgroundItem {
"following_count": model.account_following_count, "following_count": model.account_following_count,
"statuses_count": model.account_statuses_count, "statuses_count": model.account_statuses_count,
"locked": model.account_locked, "locked": model.account_locked,
"bot": model.account_bot "bot": model.account_bot,
"group": model.account_group
} ) } )
} }

View file

@ -32,8 +32,8 @@ Item {
break; break;
case 2: case 2:
placeholder1.visible = true; placeholder1.visible = true
placeholder2.visible = true; placeholder2.visible = true
placeholder1.width = (holder.width-Theme.paddingSmall)/2 placeholder1.width = (holder.width-Theme.paddingSmall)/2
placeholder1.height = placeholder1.width placeholder1.height = placeholder1.width
placeholder2.width = placeholder1.width placeholder2.width = placeholder1.width
@ -43,10 +43,10 @@ Item {
break; break;
case 3: case 3:
placeholder1.visible = true; placeholder1.visible = true
placeholder2.visible = true; placeholder2.visible = true
placeholder3.visible = true; placeholder3.visible = true
placeholder4.visible = false; placeholder4.visible = false
placeholder1.width = holder.width - Theme.paddingSmall - Theme.itemSizeLarge; placeholder1.width = holder.width - Theme.paddingSmall - Theme.itemSizeLarge;
placeholder1.height = Theme.itemSizeLarge*2+Theme.paddingSmall placeholder1.height = Theme.itemSizeLarge*2+Theme.paddingSmall
@ -59,16 +59,16 @@ Item {
break; break;
case 4: case 4:
placeholder1.visible = true; placeholder1.visible = true
placeholder2.visible = true; placeholder2.visible = true
placeholder3.visible = true; placeholder3.visible = true
placeholder4.visible = true; placeholder4.visible = true
placeholder1.width = placeholder2.width = placeholder3.width = placeholder4.width = (holder.width - 3*Theme.paddingSmall)/4 placeholder1.width = placeholder2.width = placeholder3.width = placeholder4.width = (holder.width - 3*Theme.paddingSmall)/4
placeholder1.height = placeholder2.height = placeholder3.height = placeholder4.height = Theme.itemSizeLarge*2+Theme.paddingSmall placeholder1.height = placeholder2.height = placeholder3.height = placeholder4.height = Theme.itemSizeLarge*2+Theme.paddingSmall
placeholder2.x = 1*(placeholder1.width)+ 1*Theme.paddingSmall; placeholder2.x = 1*(placeholder1.width)+ 1*Theme.paddingSmall
placeholder3.x = 2*(placeholder1.width)+ 2*Theme.paddingSmall; placeholder3.x = 2*(placeholder1.width)+ 2*Theme.paddingSmall
placeholder4.x = 3*(placeholder1.width)+ 3*Theme.paddingSmall; placeholder4.x = 3*(placeholder1.width)+ 3*Theme.paddingSmall
holder.height = placeholder1.height holder.height = placeholder1.height
break; break;

View file

@ -20,10 +20,11 @@ Item {
anchors.left: parent.left anchors.left: parent.left
} }
Image { Icon {
id: icnBot id: icnBot
visible: account_bot visible: account_bot
source: "../../images/icon-s-bot.svg?" + ( pressed ? Theme.highlightColor : Theme.primaryColor ) source: "../../images/icon-s-bot.svg?" + ( pressed ? Theme.highlightColor : Theme.primaryColor )
color: Theme.primaryColor
width: account_bot ? Theme.iconSizeExtraSmall * 1.3 : 0 width: account_bot ? Theme.iconSizeExtraSmall * 1.3 : 0
height: width height: width
y: Theme.paddingLarge y: Theme.paddingLarge

View file

@ -12,7 +12,7 @@ Item {
property string bg: "" property string bg: ""
width: parent.width width: parent.width
height: avatarImage.height + Theme.paddingLarge*3 + infoLbl.height + Theme.paddingLarge height: avatarImage.height + Theme.paddingLarge*3 + infoLbl.height
Rectangle { Rectangle {
id: bgImage id: bgImage
@ -27,7 +27,6 @@ Item {
asynchronous: true asynchronous: true
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
source: bg source: bg
opacity: 0.8
anchors.fill: parent anchors.fill: parent
} }
} }
@ -40,11 +39,11 @@ Item {
? Theme.highlightColor ? Theme.highlightColor
: Theme.primaryColor) : Theme.primaryColor)
else image else image
width: description === "" ? Theme.iconSizeMedium : Theme.iconSizeLarge width: Theme.iconSizeLarge
height: width height: width
anchors { anchors {
left: parent.left left: parent.left
leftMargin: Theme.paddingLarge leftMargin: Theme.horizontalPageMargin
top: parent.top top: parent.top
topMargin: Theme.paddingLarge * 1.5 topMargin: Theme.paddingLarge * 1.5
} }
@ -69,11 +68,11 @@ Item {
Column { Column {
anchors { anchors {
top: parent.top top: parent.top
topMargin: Theme.paddingLarge * 1.5 topMargin: Theme.paddingLarge
left: avatarImage.right left: avatarImage.right
leftMargin: Theme.paddingLarge leftMargin: Theme.horizontalPageMargin
right: parent.right right: parent.right
rightMargin: Theme.paddingLarge rightMargin: Theme.horizontalPageMargin
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
@ -106,14 +105,32 @@ Item {
id: infoLbl id: infoLbl
spacing: Theme.paddingLarge spacing: Theme.paddingLarge
layoutDirection: Qt.RightToLeft layoutDirection: Qt.RightToLeft
height: followed_by || locked || bot ? Theme.iconSizeSmall + Theme.paddingSmall : 0 height: followed_by || locked || bot || group ? Theme.iconSizeSmall + Theme.paddingSmall : 0
anchors { anchors {
top: avatarImage.bottom top: avatarImage.bottom
topMargin: Theme.paddingLarge topMargin: Theme.paddingMedium
left: parent.left left: parent.left
leftMargin: Theme.paddingLarge leftMargin: Theme.horizontalPageMargin
right: parent.right right: parent.right
rightMargin: Theme.paddingLarge rightMargin: Theme.horizontalPageMargin
}
Rectangle {
id: groupBg
visible: (group ? true : false)
radius: Theme.paddingSmall
color: Theme.secondaryHighlightColor
width: groupLbl.width + 2*Theme.paddingLarge
height: parent.height
Label {
id: groupLbl
text: qsTr("Group")
font.pixelSize: Theme.fontSizeExtraSmall
color: Theme.primaryColor
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
}
} }
Rectangle { Rectangle {

View file

@ -93,7 +93,8 @@ BackgroundItem {
"following_count": model.account_following_count, "following_count": model.account_following_count,
"statuses_count": model.account_statuses_count, "statuses_count": model.account_statuses_count,
"locked": model.account_locked, "locked": model.account_locked,
"bot": model.account_bot "bot": model.account_bot,
"group": model.account_group
} ) } )
} }
} }
@ -123,7 +124,7 @@ BackgroundItem {
visible: status_visibility === "direct" visible: status_visibility === "direct"
width: Theme.iconSizeMedium width: Theme.iconSizeMedium
height: width height: width
source: "image://theme/icon-m-mail" source: "../../images/icon-m-mail.svg?"
anchors { anchors {
horizontalCenter: avatar.horizontalCenter horizontalCenter: avatar.horizontalCenter
top: avatar.bottom top: avatar.bottom
@ -172,7 +173,8 @@ BackgroundItem {
"following_count": model.reblog_account_following_count, "following_count": model.reblog_account_following_count,
"statuses_count": model.reblog_account_statuses_count, "statuses_count": model.reblog_account_statuses_count,
"locked": model.reblog_account_locked, "locked": model.reblog_account_locked,
"bot": model.reblog_account_bot "bot": model.reblog_account_bot,
"group": model.reblog_account_group
} ) } )
} }
} }
@ -213,7 +215,7 @@ BackgroundItem {
Theme.paddingLarge Theme.paddingLarge
} else if (myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) { } else if (myList.type === "notifications" && ( model.type === "favourite" || model.type === "reblog" )) {
Math.min( implicitHeight, Theme.itemSizeExtraLarge * 1.5 ) Math.min( implicitHeight, Theme.itemSizeExtraLarge * 1.5 )
} else content.length ? (contentWarningLabel.paintedHeight > paintedHeight ? contentWarningLabel.paintedHeight : paintedHeight) : 0 } else content.length ? ( contentWarningLabel.paintedHeight > paintedHeight ? contentWarningLabel.paintedHeight : paintedHeight ) : 0
anchors { anchors {
left: miniHeader.left left: miniHeader.left
right: miniHeader.right right: miniHeader.right
@ -249,6 +251,7 @@ BackgroundItem {
// Content warning cover for Toots // Content warning cover for Toots
Rectangle { Rectangle {
id: contentWarningBg
color: Theme.highlightDimmerColor color: Theme.highlightDimmerColor
visible: status_spoiler_text.length > 0 visible: status_spoiler_text.length > 0
anchors.fill: parent anchors.fill: parent
@ -320,7 +323,7 @@ BackgroundItem {
model.reblogged = !model.reblogged model.reblogged = !model.reblogged
} }
Image { Icon {
id: icRT id: icRT
source: "image://theme/icon-s-retweet?" + (!model.reblogged ? Theme.highlightColor : Theme.primaryColor) source: "image://theme/icon-s-retweet?" + (!model.reblogged ? Theme.highlightColor : Theme.primaryColor)
width: Theme.iconSizeExtraSmall width: Theme.iconSizeExtraSmall
@ -347,9 +350,9 @@ BackgroundItem {
MenuItem { MenuItem {
id: mnuFavourite id: mnuFavourite
visible: model.type !== "follow" visible: model.type !== "follow"
text: typeof model.favourited !== "undefined" && model.favourited ? qsTr("Unfavorite") : qsTr("Favorite") text: typeof model.status_favourited !== "undefined" && model.status_favourited ? qsTr("Unfavorite") : qsTr("Favorite")
onClicked: { onClicked: {
var status = typeof model.favourited !== "undefined" && model.favourited var status = typeof model.status_favourited !== "undefined" && model.status_favourited
worker.sendMessage({ worker.sendMessage({
"conf" : Logic.conf, "conf" : Logic.conf,
"params" : [], "params" : [],
@ -358,25 +361,25 @@ BackgroundItem {
"action" : "statuses/"+model.status_id+"/" + (status ? "unfavourite" : "favourite") "action" : "statuses/"+model.status_id+"/" + (status ? "unfavourite" : "favourite")
}) })
model.status_favourites_count = !status ? model.status_favourites_count+1 : (model.status_favourites_count > 0 ? model.status_favourites_count-1 : model.status_favourites_count); model.status_favourites_count = !status ? model.status_favourites_count+1 : (model.status_favourites_count > 0 ? model.status_favourites_count-1 : model.status_favourites_count);
model.favourited = !model.favourited model.status_favourited = !model.status_favourited
} }
Image { Icon {
id: icFA id: icFA
source: "image://theme/icon-s-favorite?" + (!model.status_favourited ? Theme.highlightColor : Theme.primaryColor)
width: Theme.iconSizeExtraSmall
height: width
anchors { anchors {
leftMargin: Theme.horizontalPageMargin leftMargin: Theme.horizontalPageMargin
left: parent.left left: parent.left
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
width: Theme.iconSizeExtraSmall
height: width
source: "image://theme/icon-s-favorite?" + (!model.favourited ? Theme.highlightColor : Theme.primaryColor)
} }
Label { Label {
text: status_favourites_count // from API.js text: status_favourites_count
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
color: !model.favourited ? Theme.highlightColor : Theme.primaryColor color: !model.status_favourited ? Theme.highlightColor : Theme.primaryColor
anchors { anchors {
left: icFA.right left: icFA.right
leftMargin: Theme.paddingMedium leftMargin: Theme.paddingMedium
@ -385,6 +388,36 @@ BackgroundItem {
} }
} }
MenuItem {
id: mnuBookmark
visible: model.type !== "follow"
text: typeof model.status_bookmarked !== "undefined" && model.status_bookmarked ? qsTr("Remove Bookmark") : qsTr("Bookmark")
onClicked: {
var status = typeof model.status_bookmarked !== "undefined" && model.status_bookmarked
worker.sendMessage({
"conf" : Logic.conf,
"params" : [],
"method" : "POST",
"bgAction": true,
"action" : "statuses/"+model.status_id+"/" + (status ? "unbookmark" : "bookmark")
})
model.status_bookmarked = !model.status_bookmarked
}
Icon {
source: "../../images/icon-s-bookmark.svg?"
color: !model.status_bookmarked ? Theme.highlightColor : Theme.primaryColor
width: Theme.iconSizeExtraSmall
height: width
anchors {
left: parent.left
leftMargin: Theme.horizontalPageMargin + Theme.paddingMedium
verticalCenter: parent.verticalCenter
}
}
}
MenuItem { MenuItem {
id: mnuMention id: mnuMention
visible: model.type === "follow" visible: model.type === "follow"
@ -397,16 +430,16 @@ BackgroundItem {
}) })
} }
Image { Icon {
id: icMT id: icMT
source: "image://theme/icon-s-chat?" + (!model.status_favourited ? Theme.highlightColor : Theme.primaryColor)
width: Theme.iconSizeExtraSmall
height: width
anchors { anchors {
leftMargin: Theme.horizontalPageMargin leftMargin: Theme.horizontalPageMargin + Theme.paddingMedium
left: parent.left left: parent.left
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
width: Theme.iconSizeExtraSmall
height: width
source: "image://theme/icon-s-chat?" + (!model.favourited ? Theme.highlightColor : Theme.primaryColor)
} }
} }
} }

View file

@ -203,6 +203,10 @@
<source>Follows you</source> <source>Follows you</source>
<translation>Folgt dir</translation> <translation>Folgt dir</translation>
</message> </message>
<message>
<source>Group</source>
<translation>Gruppe</translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -384,5 +388,13 @@
<source>Conversation</source> <source>Conversation</source>
<translation>Konversation</translation> <translation>Konversation</translation>
</message> </message>
<message>
<source>Remove Bookmark</source>
<translation>Lesezeichen entfernen</translation>
</message>
<message>
<source>Bookmark</source>
<translation>Lesezeichen</translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -203,6 +203,10 @@
<source>Follows you</source> <source>Follows you</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -384,5 +388,13 @@
<source>Conversation</source> <source>Conversation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -62,11 +62,11 @@
<message> <message>
<source>Reply</source> <source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment> <extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation type="unfinished"></translation> <translation>Respuesta</translation>
</message> </message>
<message> <message>
<source>Hide Reply</source> <source>Hide Reply</source>
<translation type="unfinished"></translation> <translation>Cerrar respuesta</translation>
</message> </message>
</context> </context>
<context> <context>
@ -201,7 +201,11 @@
</message> </message>
<message> <message>
<source>Follows you</source> <source>Follows you</source>
<translation type="unfinished"></translation> <translation>Te sigue</translation>
</message>
<message>
<source>Group</source>
<translation>Grupo</translation>
</message> </message>
</context> </context>
<context> <context>
@ -234,7 +238,7 @@
<message> <message>
<source>Requested</source> <source>Requested</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation type="unfinished"></translation> <translation>Requerido</translation>
</message> </message>
<message> <message>
<source>Follow</source> <source>Follow</source>
@ -267,7 +271,7 @@
</message> </message>
<message> <message>
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation>Mencionar</translation>
</message> </message>
</context> </context>
<context> <context>
@ -378,11 +382,19 @@
</message> </message>
<message> <message>
<source>Mention</source> <source>Mention</source>
<translation type="unfinished"></translation> <translation>Mencionar</translation>
</message> </message>
<message> <message>
<source>Conversation</source> <source>Conversation</source>
<translation type="unfinished"></translation> <translation>Conversación</translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation>Eliminar marcador</translation>
</message>
<message>
<source>Bookmark</source>
<translation>Marcador</translation>
</message> </message>
</context> </context>
</TS> </TS>

View file

@ -203,6 +203,10 @@
<source>Follows you</source> <source>Follows you</source>
<translation>Vous suit</translation> <translation>Vous suit</translation>
</message> </message>
<message>
<source>Group</source>
<translation>Groupe</translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -384,5 +388,13 @@
<source>Conversation</source> <source>Conversation</source>
<translation>Conversation</translation> <translation>Conversation</translation>
</message> </message>
<message>
<source>Remove Bookmark</source>
<translation>Retirer marque-page</translation>
</message>
<message>
<source>Bookmark</source>
<translation>Ajouter aux marque-pages</translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -4,23 +4,23 @@
<context> <context>
<name>API</name> <name>API</name>
<message> <message>
<location filename="../qml/lib/API.js" line="156"/> <location filename="../qml/lib/API.js" line="158"/>
<source>favourited</source> <source>favourited</source>
<translation>ha apprezzato</translation> <translation>ha apprezzato</translation>
</message> </message>
<message> <message>
<location filename="../qml/lib/API.js" line="167"/> <location filename="../qml/lib/API.js" line="169"/>
<source>followed you</source> <source>followed you</source>
<translation>ha iniziato a seguirti</translation> <translation>ha iniziato a seguirti</translation>
</message> </message>
<message> <message>
<location filename="../qml/lib/API.js" line="177"/> <location filename="../qml/lib/API.js" line="179"/>
<source>boosted</source> <source>boosted</source>
<translation>ha condiviso</translation> <translation>ha condiviso</translation>
</message> </message>
<message> <message>
<location filename="../qml/lib/API.js" line="187"/>
<location filename="../qml/lib/API.js" line="189"/> <location filename="../qml/lib/API.js" line="189"/>
<location filename="../qml/lib/API.js" line="191"/>
<source>said</source> <source>said</source>
<translation>ha detto</translation> <translation>ha detto</translation>
</message> </message>
@ -28,59 +28,59 @@
<context> <context>
<name>ConversationPage</name> <name>ConversationPage</name>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="110"/> <location filename="../qml/pages/ConversationPage.qml" line="111"/>
<source>Copy Link to Clipboard</source> <source>Copy Link to Clipboard</source>
<extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment> <extracomment>Use the translation of &quot;Copy Link&quot; for a shorter PullDownMenu label</extracomment>
<translation>Copia link</translation> <translation>Copia link</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="126"/> <location filename="../qml/pages/ConversationPage.qml" line="127"/>
<source>Reply</source> <source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment> <extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation>Risposta</translation> <translation>Risposta</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="126"/> <location filename="../qml/pages/ConversationPage.qml" line="127"/>
<source>Hide Reply</source> <source>Hide Reply</source>
<translation>Chiudere Risposta</translation> <translation>Chiudere Risposta</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="235"/> <location filename="../qml/pages/ConversationPage.qml" line="234"/>
<source>Write your warning here</source> <source>Write your warning here</source>
<translation>Contenuto avviso</translation> <translation>Contenuto avviso</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="268"/> <location filename="../qml/pages/ConversationPage.qml" line="267"/>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<translation>A cosa stai pensando?</translation> <translation>A cosa stai pensando?</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="335"/> <location filename="../qml/pages/ConversationPage.qml" line="334"/>
<source>Delete</source> <source>Delete</source>
<translation>Elimina</translation> <translation>Elimina</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="433"/> <location filename="../qml/pages/ConversationPage.qml" line="432"/>
<source>Public</source> <source>Public</source>
<translation>Pubblico</translation> <translation>Pubblico</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="436"/> <location filename="../qml/pages/ConversationPage.qml" line="435"/>
<source>Unlisted</source> <source>Unlisted</source>
<translation>Non elencato</translation> <translation>Non elencato</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="439"/> <location filename="../qml/pages/ConversationPage.qml" line="438"/>
<source>Followers-only</source> <source>Followers-only</source>
<translation>Solo ai seguaci</translation> <translation>Solo ai seguaci</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="442"/> <location filename="../qml/pages/ConversationPage.qml" line="441"/>
<source>Direct</source> <source>Direct</source>
<translation>Diretto</translation> <translation>Diretto</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ConversationPage.qml" line="489"/> <location filename="../qml/pages/ConversationPage.qml" line="488"/>
<source>Toot sent!</source> <source>Toot sent!</source>
<translation>Toot è stato pubblicato!</translation> <translation>Toot è stato pubblicato!</translation>
</message> </message>
@ -175,7 +175,7 @@
<translation>@utente o #termine</translation> <translation>@utente o #termine</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="263"/> <location filename="../qml/pages/MainPage.qml" line="264"/>
<source>New Toot</source> <source>New Toot</source>
<translation>Nuovo toot</translation> <translation>Nuovo toot</translation>
</message> </message>
@ -238,12 +238,17 @@
<context> <context>
<name>ProfileHeader</name> <name>ProfileHeader</name>
<message> <message>
<location filename="../qml/pages/components/ProfileHeader.qml" line="129"/> <location filename="../qml/pages/components/ProfileHeader.qml" line="128"/>
<source>Group</source>
<translation>Gruppo</translation>
</message>
<message>
<location filename="../qml/pages/components/ProfileHeader.qml" line="146"/>
<source>Follows you</source> <source>Follows you</source>
<translation>Ti segue</translation> <translation>Ti segue</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/components/ProfileHeader.qml" line="166"/> <location filename="../qml/pages/components/ProfileHeader.qml" line="183"/>
<source>Bot</source> <source>Bot</source>
<translation>Bot</translation> <translation>Bot</translation>
</message> </message>
@ -251,79 +256,79 @@
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="175"/> <location filename="../qml/pages/ProfilePage.qml" line="156"/>
<source>About</source> <source>About</source>
<extracomment>If there&apos;s no good translation for &quot;About&quot;, use &quot;Details&quot; (in details about profile).</extracomment> <extracomment>If there&apos;s no good translation for &quot;About&quot;, use &quot;Details&quot; (in details about profile).</extracomment>
<translation>Dettagli</translation> <translation>Dettagli</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="255"/> <location filename="../qml/pages/ProfilePage.qml" line="235"/>
<source>Followers</source> <source>Followers</source>
<extracomment>Will show as: &quot;35 Followers&quot;</extracomment> <extracomment>Will show as: &quot;35 Followers&quot;</extracomment>
<translation>Seguaci</translation> <translation>Seguaci</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="266"/> <location filename="../qml/pages/ProfilePage.qml" line="246"/>
<source>Following</source> <source>Following</source>
<extracomment>Will show as: &quot;23 Following&quot;</extracomment> <extracomment>Will show as: &quot;23 Following&quot;</extracomment>
<translation>Segue</translation> <translation>Segue</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="277"/> <location filename="../qml/pages/ProfilePage.qml" line="257"/>
<source>Statuses</source> <source>Statuses</source>
<extracomment>Will show as: &quot;115 Statuses&quot;</extracomment> <extracomment>Will show as: &quot;115 Statuses&quot;</extracomment>
<translation>Toots</translation> <translation>Toots</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="293"/> <location filename="../qml/pages/ProfilePage.qml" line="273"/>
<location filename="../qml/pages/ProfilePage.qml" line="296"/> <location filename="../qml/pages/ProfilePage.qml" line="276"/>
<source>Mention</source> <source>Mention</source>
<translation>Menzionare</translation> <translation>Menzionare</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="308"/> <location filename="../qml/pages/ProfilePage.qml" line="288"/>
<source>Unfollow</source> <source>Unfollow</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Smetti di seguire</translation> <translation>Smetti di seguire</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="310"/> <location filename="../qml/pages/ProfilePage.qml" line="290"/>
<source>Requested</source> <source>Requested</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Richiesto</translation> <translation>Richiesto</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="312"/> <location filename="../qml/pages/ProfilePage.qml" line="292"/>
<source>Follow</source> <source>Follow</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Segui</translation> <translation>Segui</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="331"/> <location filename="../qml/pages/ProfilePage.qml" line="311"/>
<source>Unmute</source> <source>Unmute</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Non silenziare</translation> <translation>Non silenziare</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="333"/> <location filename="../qml/pages/ProfilePage.qml" line="313"/>
<source>Mute</source> <source>Mute</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Silenzia</translation> <translation>Silenzia</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="351"/> <location filename="../qml/pages/ProfilePage.qml" line="331"/>
<source>Unblock</source> <source>Unblock</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Sblocca</translation> <translation>Sblocca</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="353"/> <location filename="../qml/pages/ProfilePage.qml" line="333"/>
<source>Block</source> <source>Block</source>
<extracomment>Is a button. Keep it as short as possible.</extracomment> <extracomment>Is a button. Keep it as short as possible.</extracomment>
<translation>Blocca</translation> <translation>Blocca</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/ProfilePage.qml" line="369"/> <location filename="../qml/pages/ProfilePage.qml" line="349"/>
<source>Open in Browser</source> <source>Open in Browser</source>
<translation>Aprire nel browser</translation> <translation>Aprire nel browser</translation>
</message> </message>
@ -440,33 +445,43 @@
<context> <context>
<name>VisualContainer</name> <name>VisualContainer</name>
<message> <message>
<location filename="../qml/pages/components/VisualContainer.qml" line="309"/> <location filename="../qml/pages/components/VisualContainer.qml" line="312"/>
<source>Unboost</source> <source>Unboost</source>
<translation>Annulla condivisione</translation> <translation>Annulla condivisione</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/components/VisualContainer.qml" line="309"/> <location filename="../qml/pages/components/VisualContainer.qml" line="312"/>
<source>Boost</source> <source>Boost</source>
<translation>Condividi</translation> <translation>Condividi</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/components/VisualContainer.qml" line="350"/> <location filename="../qml/pages/components/VisualContainer.qml" line="353"/>
<source>Unfavorite</source> <source>Unfavorite</source>
<translation>Annulla apprezzamento</translation> <translation>Annulla apprezzamento</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/components/VisualContainer.qml" line="350"/> <location filename="../qml/pages/components/VisualContainer.qml" line="353"/>
<source>Favorite</source> <source>Favorite</source>
<translation>Apprezzato</translation> <translation>Apprezzato</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/components/VisualContainer.qml" line="391"/>
<location filename="../qml/pages/components/VisualContainer.qml" line="394"/> <location filename="../qml/pages/components/VisualContainer.qml" line="394"/>
<source>Remove Bookmark</source>
<translation>Elimina segnalibro</translation>
</message>
<message>
<location filename="../qml/pages/components/VisualContainer.qml" line="394"/>
<source>Bookmark</source>
<translation>Aggiungi segnalibro</translation>
</message>
<message>
<location filename="../qml/pages/components/VisualContainer.qml" line="424"/>
<location filename="../qml/pages/components/VisualContainer.qml" line="427"/>
<source>Mention</source> <source>Mention</source>
<translation>Menzionare</translation> <translation>Menzionare</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/components/VisualContainer.qml" line="420"/> <location filename="../qml/pages/components/VisualContainer.qml" line="453"/>
<source>Conversation</source> <source>Conversation</source>
<translation>Conversazione</translation> <translation>Conversazione</translation>
</message> </message>

View file

@ -29,11 +29,11 @@
</message> </message>
<message> <message>
<source>Write your warning here</source> <source>Write your warning here</source>
<translation type="unfinished"></translation> <translation>Waarschuwingstekst</translation>
</message> </message>
<message> <message>
<source>What&apos;s on your mind?</source> <source>What&apos;s on your mind?</source>
<translation type="unfinished"></translation> <translation>Wat wil je kwijt?</translation>
</message> </message>
<message> <message>
<source>Delete</source> <source>Delete</source>
@ -41,32 +41,32 @@
</message> </message>
<message> <message>
<source>Public</source> <source>Public</source>
<translation type="unfinished"></translation> <translation>Openbaar</translation>
</message> </message>
<message> <message>
<source>Unlisted</source> <source>Unlisted</source>
<translation type="unfinished"></translation> <translation>Minder openbaar</translation>
</message> </message>
<message> <message>
<source>Followers-only</source> <source>Followers-only</source>
<translation type="unfinished"></translation> <translation>Alleen volgers</translation>
</message> </message>
<message> <message>
<source>Direct</source> <source>Direct</source>
<translation type="unfinished"></translation> <translation>Direct</translation>
</message> </message>
<message> <message>
<source>Toot sent!</source> <source>Toot sent!</source>
<translation type="unfinished"></translation> <translation>Toot verzonden!</translation>
</message> </message>
<message> <message>
<source>Reply</source> <source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment> <extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation type="unfinished"></translation> <translation>Antwoord</translation>
</message> </message>
<message> <message>
<source>Hide Reply</source> <source>Hide Reply</source>
<translation type="unfinished"></translation> <translation>Antwoord verbergen</translation>
</message> </message>
</context> </context>
<context> <context>
@ -106,7 +106,7 @@
</message> </message>
<message> <message>
<source>Enter a valid Mastodon instance URL</source> <source>Enter a valid Mastodon instance URL</source>
<translation type="unfinished"></translation> <translation>Geldig Mastodon URL</translation>
</message> </message>
<message> <message>
<source>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.</source> <source>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.</source>
@ -201,7 +201,11 @@
</message> </message>
<message> <message>
<source>Follows you</source> <source>Follows you</source>
<translation type="unfinished"></translation> <translation>Volgt jou</translation>
</message>
<message>
<source>Group</source>
<translation>Groep</translation>
</message> </message>
</context> </context>
<context> <context>
@ -267,7 +271,7 @@
</message> </message>
<message> <message>
<source>Mention</source> <source>Mention</source>
<translation type="unfinished">Vermelden</translation> <translation>Vermelden</translation>
</message> </message>
</context> </context>
<context> <context>
@ -382,7 +386,15 @@
</message> </message>
<message> <message>
<source>Conversation</source> <source>Conversation</source>
<translation type="unfinished"></translation> <translation>Conversatie</translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation>Bookmarken</translation>
</message>
<message>
<source>Bookmark</source>
<translation>Bladwijzer verwijderen</translation>
</message> </message>
</context> </context>
</TS> </TS>

View file

@ -203,6 +203,10 @@
<source>Follows you</source> <source>Follows you</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -384,5 +388,13 @@
<source>Conversation</source> <source>Conversation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -203,6 +203,10 @@
<source>Follows you</source> <source>Follows you</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -384,5 +388,13 @@
<source>Conversation</source> <source>Conversation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -203,6 +203,10 @@
<source>Follows you</source> <source>Follows you</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -384,5 +388,13 @@
<source>Conversation</source> <source>Conversation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -203,6 +203,10 @@
<source>Follows you</source> <source>Follows you</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -384,5 +388,13 @@
<source>Conversation</source> <source>Conversation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -203,6 +203,10 @@
<source>Follows you</source> <source>Follows you</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -384,5 +388,13 @@
<source>Conversation</source> <source>Conversation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -203,6 +203,10 @@
<source>Follows you</source> <source>Follows you</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -384,5 +388,13 @@
<source>Conversation</source> <source>Conversation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -203,6 +203,10 @@
<source>Follows you</source> <source>Follows you</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ProfilePage</name> <name>ProfilePage</name>
@ -384,5 +388,13 @@
<source>Conversation</source> <source>Conversation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Remove Bookmark</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bookmark</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -62,11 +62,11 @@
<message> <message>
<source>Reply</source> <source>Reply</source>
<extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment> <extracomment>&quot;Reply&quot; will show the Toot text entry Panel. &quot;Hide Reply&quot; closes it. Alternative: Use &quot;Close Reply&quot;</extracomment>
<translation type="unfinished"></translation> <translation>Reply</translation>
</message> </message>
<message> <message>
<source>Hide Reply</source> <source>Hide Reply</source>
<translation type="unfinished"></translation> <translation>Hide Reply</translation>
</message> </message>
</context> </context>
<context> <context>
@ -201,7 +201,11 @@
</message> </message>
<message> <message>
<source>Follows you</source> <source>Follows you</source>
<translation type="unfinished"></translation> <translation>Follows you</translation>
</message>
<message>
<source>Group</source>
<translation>Group</translation>
</message> </message>
</context> </context>
<context> <context>
@ -382,7 +386,15 @@
</message> </message>
<message> <message>
<source>Conversation</source> <source>Conversation</source>
<translation type="unfinished"></translation> <translation>Conversation</translation>
</message>
<message>
<source>Remove Bookmark</source>
<translation>Remove Bookmark</translation>
</message>
<message>
<source>Bookmark</source>
<translation>Bookmark</translation>
</message> </message>
</context> </context>
</TS> </TS>