commit
26e309e327
10 changed files with 705 additions and 617 deletions
|
@ -36,7 +36,6 @@ import "./lib/API.js" as Logic
|
||||||
ApplicationWindow
|
ApplicationWindow
|
||||||
{
|
{
|
||||||
id: appWindow
|
id: appWindow
|
||||||
//initialPage: Component { FirstPage { } }
|
|
||||||
cover: Qt.resolvedUrl("cover/CoverPage.qml")
|
cover: Qt.resolvedUrl("cover/CoverPage.qml")
|
||||||
allowedOrientations: defaultAllowedOrientations
|
allowedOrientations: defaultAllowedOrientations
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
|
@ -59,9 +58,6 @@ ApplicationWindow
|
||||||
pageStack.push(Qt.resolvedUrl("./pages/MainPage.qml"), {})
|
pageStack.push(Qt.resolvedUrl("./pages/MainPage.qml"), {})
|
||||||
});
|
});
|
||||||
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//pageStack.push(Qt.resolvedUrl("./pages/Conversation.qml"), {})
|
|
||||||
} else {
|
} else {
|
||||||
pageStack.push(Qt.resolvedUrl("./pages/LoginPage.qml"), {})
|
pageStack.push(Qt.resolvedUrl("./pages/LoginPage.qml"), {})
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,7 +82,7 @@ WorkerScript.onMessage = function(msg) {
|
||||||
console.log("descendants")
|
console.log("descendants")
|
||||||
for (var j = 0; j < data[i].length; j ++) {
|
for (var j = 0; j < data[i].length; j ++) {
|
||||||
item = parseToot(data[i][j]);
|
item = parseToot(data[i][j]);
|
||||||
item['id'] = item['status_id']
|
item['id'] = item['status_id'];
|
||||||
if (typeof item['attachments'] === "undefined")
|
if (typeof item['attachments'] === "undefined")
|
||||||
item['attachments'] = [];
|
item['attachments'] = [];
|
||||||
items.push(item)
|
items.push(item)
|
||||||
|
|
|
@ -6,32 +6,37 @@ import "./components/"
|
||||||
|
|
||||||
Page {
|
Page {
|
||||||
id: conversationPage
|
id: conversationPage
|
||||||
property string type;
|
property string type
|
||||||
property alias title: header.title
|
property alias title: header.title
|
||||||
property alias description: header.description
|
property alias description: header.description
|
||||||
property alias avatar: header.image
|
property alias avatar: header.image
|
||||||
property string suggestedUser: ""
|
property string suggestedUser: ""
|
||||||
property ListModel suggestedModel;
|
property ListModel suggestedModel
|
||||||
property string toot_id: ""
|
property string toot_id: ""
|
||||||
property int tootMaxChar: 500;
|
property int tootMaxChar: 500;
|
||||||
property ListModel mdl;
|
property ListModel mdl
|
||||||
allowedOrientations: Orientation.All
|
allowedOrientations: Orientation.All
|
||||||
onSuggestedUserChanged: {
|
onSuggestedUserChanged: {
|
||||||
console.log(suggestedUser)
|
console.log(suggestedUser)
|
||||||
suggestedModel = Qt.createQmlObject('import QtQuick 2.0; ListModel { }', Qt.application, 'InternalQmlObject');
|
suggestedModel = Qt.createQmlObject(
|
||||||
predictionList.visible = false;
|
'import QtQuick 2.0; ListModel { }',
|
||||||
|
Qt.application, 'InternalQmlObject'
|
||||||
|
)
|
||||||
|
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' : [ {name: "q", data: suggestedUser} ],
|
"params": [{
|
||||||
|
"name": "q",
|
||||||
'conf' : Logic.conf
|
"data": suggestedUser
|
||||||
};
|
}],
|
||||||
worker.sendMessage(msg);
|
"conf": Logic.conf
|
||||||
predictionList.visible = true;
|
}
|
||||||
|
worker.sendMessage(msg)
|
||||||
|
predictionList.visible = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +64,7 @@ Page {
|
||||||
header: PageHeader {
|
header: PageHeader {
|
||||||
title: qsTr("Conversation")
|
title: qsTr("Conversation")
|
||||||
}
|
}
|
||||||
clip: true;
|
clip: true
|
||||||
anchors {
|
anchors {
|
||||||
top: parent.top
|
top: parent.top
|
||||||
bottom: panel.top
|
bottom: panel.top
|
||||||
|
@ -74,21 +79,21 @@ Page {
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: predictionList
|
id: predictionList
|
||||||
visible: false;
|
visible: false
|
||||||
anchors.bottom: panel.top
|
anchors.bottom: panel.top
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: panel.right
|
anchors.right: panel.right
|
||||||
|
@ -102,20 +107,24 @@ Page {
|
||||||
|
|
||||||
delegate: ItemUser {
|
delegate: ItemUser {
|
||||||
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) + ' @'+model.account_acct + ' ' + textOperations.text.substring(textOperations.selectionEnd).trim()
|
toot.text = textOperations.text.substring(0, textOperations.selectionStart)
|
||||||
|
+ ' @'
|
||||||
|
+ model.account_acct
|
||||||
|
+ ' '
|
||||||
|
+ textOperations.text.substring(textOperations.selectionEnd).trim()
|
||||||
|
|
||||||
toot.cursorPosition = toot.text.indexOf('@'+model.account_acct)
|
toot.cursorPosition = toot.text.indexOf('@' + model.account_acct)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onCountChanged: {
|
onCountChanged: {
|
||||||
positionViewAtIndex(suggestedModel.count-1, ListView.End )
|
positionViewAtIndex(suggestedModel.count - 1, ListView.End)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -130,7 +139,9 @@ Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: progressBar.height + toot.height + (mediaModel.count ? uploadedImages.height : 0) + btnContentWarning.height + Theme.paddingMedium + (warningContent.visible ? warningContent.height : 0)
|
height: progressBar.height + toot.height + (mediaModel.count ? uploadedImages.height : 0)
|
||||||
|
+ btnContentWarning.height + Theme.paddingMedium
|
||||||
|
+ (warningContent.visible ? warningContent.height : 0)
|
||||||
dock: Dock.Bottom
|
dock: Dock.Bottom
|
||||||
Rectangle {
|
Rectangle {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
@ -145,7 +156,7 @@ Page {
|
||||||
}
|
}
|
||||||
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
|
||||||
|
@ -159,7 +170,7 @@ Page {
|
||||||
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
|
||||||
|
@ -168,7 +179,9 @@ Page {
|
||||||
}
|
}
|
||||||
autoScrollEnabled: true
|
autoScrollEnabled: true
|
||||||
labelVisible: false
|
labelVisible: false
|
||||||
placeholderText: qsTr("Content warning!")
|
placeholderText: qsTr("Write your warning here")
|
||||||
|
placeholderColor: palette.highlightColor
|
||||||
|
color: palette.highlightColor
|
||||||
horizontalAlignment: Text.AlignLeft
|
horizontalAlignment: Text.AlignLeft
|
||||||
EnterKey.onClicked: {
|
EnterKey.onClicked: {
|
||||||
//tweet()
|
//tweet()
|
||||||
|
@ -191,9 +204,13 @@ Page {
|
||||||
autoScrollEnabled: true
|
autoScrollEnabled: true
|
||||||
labelVisible: false
|
labelVisible: false
|
||||||
//focus: true
|
//focus: true
|
||||||
text: description !== "" && (description.charAt(0) == '@' || description.charAt(0) == '#') ? description+' ' : ''
|
text: description !== "" && (description.charAt(0) == '@'
|
||||||
height: implicitHeight
|
|| description.charAt(
|
||||||
|
0) == '#') ? description + ' ' : ''
|
||||||
|
height: Math.max(250, Math.min(900, implicitHeight))
|
||||||
|
//height: implicitHeight
|
||||||
horizontalAlignment: Text.AlignLeft
|
horizontalAlignment: Text.AlignLeft
|
||||||
|
placeholderText: qsTrId("What's on your mind?")
|
||||||
EnterKey.onClicked: {
|
EnterKey.onClicked: {
|
||||||
//tweet()
|
//tweet()
|
||||||
}
|
}
|
||||||
|
@ -201,12 +218,14 @@ Page {
|
||||||
textOperations.text = toot.text
|
textOperations.text = toot.text
|
||||||
textOperations.cursorPosition = toot.cursorPosition
|
textOperations.cursorPosition = toot.cursorPosition
|
||||||
textOperations.selectWord()
|
textOperations.selectWord()
|
||||||
textOperations.select(textOperations.selectionStart ? textOperations.selectionStart-1 : 0, textOperations.selectionEnd)
|
textOperations.select(
|
||||||
|
textOperations.selectionStart ? textOperations.selectionStart - 1 : 0,
|
||||||
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -218,18 +237,18 @@ Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
anchors {
|
anchors {
|
||||||
|
top: warningContent.bottom + 4
|
||||||
bottom: bottom.top
|
bottom: bottom.top
|
||||||
right: parent.right
|
right: parent.right
|
||||||
rightMargin: Theme.paddingSmall
|
rightMargin: Theme.paddingSmall
|
||||||
}
|
}
|
||||||
icon.source: "image://theme/icon-s-edit?" + (pressed
|
icon.source: "../../qml/images/emojiselect.svg" + (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
|
||||||
? Theme.highlightColor
|
|
||||||
: (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
|
|
||||||
onClicked: pageStack.push(firstWizardPage)
|
onClicked: pageStack.push(firstWizardPage)
|
||||||
}
|
}
|
||||||
SilicaGridView {
|
SilicaGridView {
|
||||||
id: uploadedImages
|
id: uploadedImages
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
anchors.top: bottom.toot
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
height: mediaModel.count ? Theme.itemSizeSmall : 0
|
height: mediaModel.count ? Theme.itemSizeSmall : 0
|
||||||
model: mediaModel
|
model: mediaModel
|
||||||
|
@ -239,7 +258,9 @@ Page {
|
||||||
id: myDelegate
|
id: myDelegate
|
||||||
width: uploadedImages.cellWidth
|
width: uploadedImages.cellWidth
|
||||||
height: uploadedImages.cellHeight
|
height: uploadedImages.cellHeight
|
||||||
RemorseItem { id: remorse }
|
RemorseItem {
|
||||||
|
id: remorse
|
||||||
|
}
|
||||||
Image {
|
Image {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
fillMode: Image.PreserveAspectCrop
|
fillMode: Image.PreserveAspectCrop
|
||||||
|
@ -250,18 +271,34 @@ Page {
|
||||||
var idx = index
|
var idx = index
|
||||||
console.log(idx)
|
console.log(idx)
|
||||||
//mediaModel.remove(idx)
|
//mediaModel.remove(idx)
|
||||||
remorse.execute(myDelegate, qsTr("Delete"), function() { mediaModel.remove(idx) } )
|
remorse.execute(myDelegate, qsTr("Delete"), function () {
|
||||||
|
mediaModel.remove(idx)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
add: Transition {
|
add: Transition {
|
||||||
NumberAnimation { property: "opacity"; from: 0; to: 1.0; duration: 800 }
|
NumberAnimation {
|
||||||
|
property: "opacity"
|
||||||
|
from: 0
|
||||||
|
to: 1.0
|
||||||
|
duration: 800
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
remove: Transition {
|
remove: Transition {
|
||||||
NumberAnimation { property: "opacity"; from: 1.0; to: 0; duration: 800 }
|
NumberAnimation {
|
||||||
|
property: "opacity"
|
||||||
|
from: 1.0
|
||||||
|
to: 0
|
||||||
|
duration: 800
|
||||||
|
}
|
||||||
}
|
}
|
||||||
displaced: Transition {
|
displaced: Transition {
|
||||||
NumberAnimation { properties: "x,y"; duration: 800; easing.type: Easing.InOutBack }
|
NumberAnimation {
|
||||||
|
properties: "x,y"
|
||||||
|
duration: 800
|
||||||
|
easing.type: Easing.InOutBack
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
IconButton {
|
IconButton {
|
||||||
|
@ -272,9 +309,8 @@ Page {
|
||||||
left: parent.left
|
left: parent.left
|
||||||
leftMargin: Theme.paddingMedium
|
leftMargin: Theme.paddingMedium
|
||||||
}
|
}
|
||||||
icon.source: "image://theme/icon-s-warning?" + (pressed
|
icon.source: "image://theme/icon-s-warning?"
|
||||||
? Theme.highlightColor
|
+ (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
|
||||||
: (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
|
|
||||||
onClicked: warningContent.visible = !warningContent.visible
|
onClicked: warningContent.visible = !warningContent.visible
|
||||||
}
|
}
|
||||||
IconButton {
|
IconButton {
|
||||||
|
@ -285,112 +321,114 @@ Page {
|
||||||
left: btnContentWarning.right
|
left: btnContentWarning.right
|
||||||
leftMargin: Theme.paddingSmall
|
leftMargin: Theme.paddingSmall
|
||||||
}
|
}
|
||||||
icon.source: "image://theme/icon-s-attach?" + (pressed
|
icon.source: "image://theme/icon-s-attach?"
|
||||||
? Theme.highlightColor
|
+ (pressed ? Theme.highlightColor : (warningContent.visible ? Theme.secondaryHighlightColor : Theme.primaryColor))
|
||||||
: (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
|
topMargin: -Theme.paddingSmall * 2
|
||||||
topMargin: -Theme.paddingSmall*2
|
|
||||||
left: btnAddImage.right
|
left: btnAddImage.right
|
||||||
right: btnSend.left
|
right: btnSend.left
|
||||||
|
bottom: parent.bottom
|
||||||
}
|
}
|
||||||
menu: ContextMenu {
|
menu: ContextMenu {
|
||||||
MenuItem { text: qsTr("public") }
|
MenuItem {
|
||||||
MenuItem { text: qsTr("unlisted") }
|
text: qsTr("Public")
|
||||||
MenuItem { text: qsTr("followers only") }
|
}
|
||||||
MenuItem { text: qsTr("direct") }
|
MenuItem {
|
||||||
|
text: qsTr("Unlisted")
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
text: qsTr("Followers-only")
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
text: qsTr("Direct")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
IconButton {
|
IconButton {
|
||||||
id: btnSend
|
id: btnSend
|
||||||
icon.source: "image://theme/icon-m-send?" + (pressed
|
icon.source: "image://theme/icon-m-send?"
|
||||||
? Theme.highlightColor
|
+ (pressed ? Theme.highlightColor : Theme.primaryColor)
|
||||||
: Theme.primaryColor)
|
|
||||||
anchors {
|
anchors {
|
||||||
top: toot.bottom
|
top: toot.bottom
|
||||||
right: parent.right
|
right: parent.right
|
||||||
rightMargin: Theme.paddingLarge
|
rightMargin: Theme.paddingSmall
|
||||||
}
|
}
|
||||||
enabled: toot.text !== "" && toot.text.length < tootMaxChar
|
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()
|
||||||
|
pageStack.pop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: uploadProgress
|
id: uploadProgress
|
||||||
color: Theme.highlightBackgroundColor
|
color: Theme.highlightBackgroundColor
|
||||||
|
@ -402,45 +440,46 @@ Page {
|
||||||
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
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
Component {
|
Component {
|
||||||
id: firstWizardPage
|
id: firstWizardPage
|
||||||
|
|
||||||
Dialog {
|
Dialog {
|
||||||
id: emoticonsDialog
|
id: emoticonsDialog
|
||||||
canAccept: false; //selector.currentIndex >= 0
|
canAccept: false //selector.currentIndex >= 0
|
||||||
//acceptDestination: conversationPage
|
|
||||||
|
|
||||||
|
//acceptDestination: conversationPage
|
||||||
onAcceptPendingChanged: {
|
onAcceptPendingChanged: {
|
||||||
if (acceptPending) {
|
if (acceptPending) {
|
||||||
|
|
||||||
// Tell the destination page what the selected category is
|
// Tell the destination page what the selected category is
|
||||||
// acceptDestinationInstance.category = selector.value
|
// acceptDestinationInstance.category = selector.value
|
||||||
}
|
}
|
||||||
|
@ -515,7 +554,6 @@ Page {
|
||||||
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: "🚀" }
|
||||||
|
@ -561,11 +599,6 @@ Page {
|
||||||
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 {
|
delegate: BackgroundItem {
|
||||||
width: gridView.cellWidth
|
width: gridView.cellWidth
|
||||||
|
@ -578,11 +611,12 @@ Page {
|
||||||
}
|
}
|
||||||
onClicked: {
|
onClicked: {
|
||||||
var cursorPosition = toot.cursorPosition
|
var cursorPosition = toot.cursorPosition
|
||||||
toot.text = toot.text.substring(0, cursorPosition) + model.glyph + toot.text.substring(cursorPosition)
|
toot.text = toot.text.substring(
|
||||||
toot.cursorPosition = cursorPosition+model.glyph.length
|
0, cursorPosition) + model.glyph + toot.text.substring(
|
||||||
emoticonsDialog.canAccept = true;
|
cursorPosition)
|
||||||
|
toot.cursorPosition = cursorPosition + model.glyph.length
|
||||||
|
emoticonsDialog.canAccept = true
|
||||||
emoticonsDialog.accept()
|
emoticonsDialog.accept()
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,6 @@ import "../lib/API.js" as Logic
|
||||||
|
|
||||||
Page {
|
Page {
|
||||||
id: loginPage
|
id: loginPage
|
||||||
|
|
||||||
// The effective value will be restricted by ApplicationWindow.allowedOrientations
|
// The effective value will be restricted by ApplicationWindow.allowedOrientations
|
||||||
allowedOrientations: Orientation.All
|
allowedOrientations: Orientation.All
|
||||||
|
|
||||||
|
@ -62,7 +61,7 @@ Page {
|
||||||
TextField {
|
TextField {
|
||||||
id: instance
|
id: instance
|
||||||
focus: true
|
focus: true
|
||||||
label: qsTr("Enter an Mastodon instance URL")
|
label: qsTr("Enter a valid Mastodon instance URL")
|
||||||
text: "https://"
|
text: "https://"
|
||||||
placeholderText: "https://mastodon.social"
|
placeholderText: "https://mastodon.social"
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
|
|
@ -69,10 +69,11 @@ Page {
|
||||||
onOpenDrawer: infoPanel.open = setDrawer
|
onOpenDrawer: infoPanel.open = setDrawer
|
||||||
}
|
}
|
||||||
MyList{
|
MyList{
|
||||||
id: tlPublic;
|
id: tlNotifications;
|
||||||
title: qsTr("Federated")
|
title: qsTr("Notifications")
|
||||||
type: "timelines/public"
|
type: "notifications"
|
||||||
mdl: Logic.modelTLpublic
|
notifier: true
|
||||||
|
mdl: Logic.modelTLnotifications
|
||||||
width: parent.itemWidth
|
width: parent.itemWidth
|
||||||
height: parent.itemHeight
|
height: parent.itemHeight
|
||||||
onOpenDrawer: infoPanel.open = setDrawer
|
onOpenDrawer: infoPanel.open = setDrawer
|
||||||
|
@ -88,11 +89,10 @@ Page {
|
||||||
onOpenDrawer: infoPanel.open = setDrawer
|
onOpenDrawer: infoPanel.open = setDrawer
|
||||||
}
|
}
|
||||||
MyList{
|
MyList{
|
||||||
id: tlNotifications;
|
id: tlPublic;
|
||||||
title: qsTr("Notifications")
|
title: qsTr("Federated")
|
||||||
type: "notifications"
|
type: "timelines/public"
|
||||||
notifier: true
|
mdl: Logic.modelTLpublic
|
||||||
mdl: Logic.modelTLnotifications
|
|
||||||
width: parent.itemWidth
|
width: parent.itemWidth
|
||||||
height: parent.itemHeight
|
height: parent.itemHeight
|
||||||
onOpenDrawer: infoPanel.open = setDrawer
|
onOpenDrawer: infoPanel.open = setDrawer
|
||||||
|
@ -260,6 +260,11 @@ Page {
|
||||||
slideshow.positionViewAtIndex(4, ListView.SnapToItem)
|
slideshow.positionViewAtIndex(4, ListView.SnapToItem)
|
||||||
navigation.navigateTo('search')
|
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 {
|
} else {
|
||||||
Qt.openUrlExternally(href);
|
Qt.openUrlExternally(href);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,8 +16,9 @@ Page {
|
||||||
property int favourites_count;
|
property int favourites_count;
|
||||||
property int reblogs_count;
|
property int reblogs_count;
|
||||||
property int count_moments;
|
property int count_moments;
|
||||||
property string profile_background : "";
|
property string profile_background: "";
|
||||||
property string note: "";
|
property string note: "";
|
||||||
|
property string url: "";
|
||||||
|
|
||||||
property bool locked : false;
|
property bool locked : false;
|
||||||
property date created_at;
|
property date created_at;
|
||||||
|
@ -28,7 +29,6 @@ Page {
|
||||||
property bool muting : false;
|
property bool muting : false;
|
||||||
property bool domain_blocking : false;
|
property bool domain_blocking : false;
|
||||||
|
|
||||||
|
|
||||||
WorkerScript {
|
WorkerScript {
|
||||||
id: worker
|
id: worker
|
||||||
source: "../lib/Worker.js"
|
source: "../lib/Worker.js"
|
||||||
|
@ -68,9 +68,10 @@ Page {
|
||||||
following_count = messageObject.data
|
following_count = messageObject.data
|
||||||
break;
|
break;
|
||||||
case 'acct':
|
case 'acct':
|
||||||
//username = messageObject.data
|
// line below was commented out, reason unknown
|
||||||
|
// username = messageObject.data
|
||||||
break;
|
break;
|
||||||
case 'locked':
|
case 'locked':m
|
||||||
locked = messageObject.data
|
locked = messageObject.data
|
||||||
break;
|
break;
|
||||||
case 'created_at':
|
case 'created_at':
|
||||||
|
@ -82,6 +83,9 @@ Page {
|
||||||
case 'note':
|
case 'note':
|
||||||
note = messageObject.data
|
note = messageObject.data
|
||||||
break;
|
break;
|
||||||
|
case 'url':
|
||||||
|
url = messageObject.data
|
||||||
|
break;
|
||||||
case 'following':
|
case 'following':
|
||||||
following = messageObject.data
|
following = messageObject.data
|
||||||
followers_count = followers_count + (following ? 1 : - 1)
|
followers_count = followers_count + (following ? 1 : - 1)
|
||||||
|
@ -238,10 +242,65 @@ Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
/*ExpandingSection {
|
ExpandingSection {
|
||||||
title: "Tweets"
|
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: " "
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -57,29 +57,29 @@ Page {
|
||||||
IconTextSwitch {
|
IconTextSwitch {
|
||||||
//enabled: false
|
//enabled: false
|
||||||
checked: typeof Logic.conf['loadImages'] !== "undefined" && Logic.conf['loadImages']
|
checked: typeof Logic.conf['loadImages'] !== "undefined" && Logic.conf['loadImages']
|
||||||
text: qsTr("Load images in toots")
|
text: qsTr("Load Images in Toots")
|
||||||
description: qsTr("Disable this option if you want to preserve your data connection")
|
description: qsTr("Disable this option if you want to preserve your data connection")
|
||||||
icon.source: "image://theme/icon-m-mobile-network"
|
icon.source: "image://theme/icon-m-mobile-network"
|
||||||
onClicked: {
|
onClicked: {
|
||||||
Logic.conf['loadImages'] = checked
|
Logic.conf['loadImages'] = checked
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
IconTextSwitch {
|
// IconTextSwitch {
|
||||||
text: qsTr("Translate")
|
// text: qsTr("Translate")
|
||||||
description: qsTr("Use Transifex to help with app translation to your language")
|
// description: qsTr("Use Transifex to help with app translation to your language")
|
||||||
icon.source: "image://theme/icon-m-presence"
|
// icon.source: "image://theme/icon-m-presence"
|
||||||
onCheckedChanged: {
|
// onCheckedChanged: {
|
||||||
busy = true;
|
// busy = true;
|
||||||
checked = false;
|
// checked = false;
|
||||||
Qt.openUrlExternally("https://www.transifex.com/dysko/tooter/");
|
// Qt.openUrlExternally("https://www.transifex.com/dysko/tooter/");
|
||||||
timer2.start()
|
// timer2.start()
|
||||||
}
|
// }
|
||||||
Timer {
|
// Timer {
|
||||||
id: timer2
|
// id: timer2
|
||||||
interval: 4700
|
// interval: 4700
|
||||||
onTriggered: parent.busy = false
|
// onTriggered: parent.busy = false
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
SectionHeader {
|
SectionHeader {
|
||||||
|
@ -113,6 +113,12 @@ Page {
|
||||||
}
|
}
|
||||||
Repeater {
|
Repeater {
|
||||||
model: ListModel {
|
model: ListModel {
|
||||||
|
ListElement {
|
||||||
|
name: "molan"
|
||||||
|
desc: qsTr("Maintainer of this release")
|
||||||
|
mastodon: ""
|
||||||
|
mail: "mol_an@sunrise.ch"
|
||||||
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
name: "Duško Angirević"
|
name: "Duško Angirević"
|
||||||
desc: qsTr("UI/UX design and development")
|
desc: qsTr("UI/UX design and development")
|
||||||
|
@ -121,38 +127,31 @@ Page {
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
name: "Miodrag Nikolić"
|
name: "Miodrag Nikolić"
|
||||||
desc: "visual identity"
|
desc: qsTr("Visual identity")
|
||||||
mastodon: ""
|
mastodon: ""
|
||||||
mail: "micotakis@gmail.com"
|
mail: "micotakis@gmail.com"
|
||||||
}
|
}
|
||||||
ListElement {
|
|
||||||
name: "Molan"
|
|
||||||
desc: "Maintainer of this forked version"
|
|
||||||
mastodon: ""
|
|
||||||
mail: "mol_an@sunrise.ch"
|
|
||||||
}
|
|
||||||
ListElement {
|
ListElement {
|
||||||
name: "Quentin PAGÈS / Quenti ♏"
|
name: "Quentin PAGÈS / Quenti ♏"
|
||||||
desc: "Occitan & French translation"
|
desc: qsTr("Occitan & French translation")
|
||||||
mastodon: "Quenti@framapiaf.org"
|
mastodon: "Quenti@framapiaf.org"
|
||||||
mail: ""
|
mail: ""
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
name: "André Koot"
|
name: "André Koot"
|
||||||
desc: "Dutch translation"
|
desc: qsTr("Dutch translation")
|
||||||
mastodon: "meneer@mastodon.social"
|
mastodon: "meneer@mastodon.social"
|
||||||
mail: "https://twitter.com/meneer"
|
mail: "https://twitter.com/meneer"
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
name: "Carlos Gonzalez / Caballlero"
|
name: "Carlos Gonzalez / Caballlero"
|
||||||
desc: "Español translation"
|
desc: qsTr("Spanish translation")
|
||||||
mastodon: ""
|
mastodon: ""
|
||||||
mail: "carlosgonz@protonmail.com"
|
mail: "carlosgonz@protonmail.com"
|
||||||
}
|
}
|
||||||
|
|
||||||
ListElement {
|
ListElement {
|
||||||
name: "Mohamed-Touhami MAHDI"
|
name: "Mohamed-Touhami MAHDI"
|
||||||
desc: "Added README file"
|
desc: qsTr("Added README file")
|
||||||
mastodon: "dragnucs@touha.me"
|
mastodon: "dragnucs@touha.me"
|
||||||
mail: "touhami@touha.me"
|
mail: "touhami@touha.me"
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,11 +21,10 @@ SilicaGridView {
|
||||||
unread: false
|
unread: false
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
icon: "image://theme/icon-m-website"
|
icon: "image://theme/icon-m-alarm"
|
||||||
slug: "federated"
|
slug: "notifications"
|
||||||
name: "Federated"
|
name: "Notifications"
|
||||||
active: false
|
active: false
|
||||||
unread: false
|
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
icon: "image://theme/icon-m-whereami"
|
icon: "image://theme/icon-m-whereami"
|
||||||
|
@ -35,10 +34,11 @@ SilicaGridView {
|
||||||
unread: false
|
unread: false
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
icon: "image://theme/icon-m-alarm"
|
icon: "image://theme/icon-m-website"
|
||||||
slug: "notifications"
|
slug: "federated"
|
||||||
name: "Notifications"
|
name: "Federated"
|
||||||
active: false
|
active: false
|
||||||
|
unread: false
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
icon: "image://theme/icon-m-search"
|
icon: "image://theme/icon-m-search"
|
||||||
|
|
|
@ -4,7 +4,6 @@ import QtGraphicalEffects 1.0
|
||||||
|
|
||||||
BackgroundItem {
|
BackgroundItem {
|
||||||
signal send (string notice)
|
signal send (string notice)
|
||||||
|
|
||||||
id: delegate
|
id: delegate
|
||||||
//property string text: "0"
|
//property string text: "0"
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
@ -149,10 +148,9 @@ BackgroundItem {
|
||||||
console.log(link)
|
console.log(link)
|
||||||
if (link[0] === "@") {
|
if (link[0] === "@") {
|
||||||
pageStack.push(Qt.resolvedUrl("../Profile.qml"), {
|
pageStack.push(Qt.resolvedUrl("../Profile.qml"), {
|
||||||
"display_name": account_display_name,
|
"name": "",
|
||||||
"username": account_username,
|
"username": link.substring(1),
|
||||||
"user_id": model.account_id,
|
"profileImage": ""
|
||||||
"profileImage": account_avatar
|
|
||||||
})
|
})
|
||||||
} else if (link[0] === "#") {
|
} else if (link[0] === "#") {
|
||||||
|
|
||||||
|
|
|
@ -134,12 +134,10 @@ BackgroundItem {
|
||||||
}));
|
}));
|
||||||
send(link)
|
send(link)
|
||||||
} else if (test.length === 4 && test[3][0] === "@" ) {
|
} else if (test.length === 4 && test[3][0] === "@" ) {
|
||||||
pageStack.push(Qt.resolvedUrl("../Profile.qml"), {
|
tlSearch.search = decodeURIComponent("@"+test[3].substring(1)+"@"+test[2])
|
||||||
"display_name": account_display_name,
|
slideshow.positionViewAtIndex(4, ListView.SnapToItem)
|
||||||
"username": account_username,
|
navigation.navigateTo('search')
|
||||||
"user_id": model.account_id,
|
|
||||||
"profileImage": account_avatar
|
|
||||||
})
|
|
||||||
} else {
|
} else {
|
||||||
Qt.openUrlExternally(link);
|
Qt.openUrlExternally(link);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue