version v0.6.7 with moderation

This commit is contained in:
LubuWest 2023-02-09 21:39:43 +01:00
parent 5f8edccdfe
commit 48a70b8395
46 changed files with 2106 additions and 1026 deletions

View file

@ -1,3 +1,10 @@
## v0.6.7
* Upload multiple images for post and add image descriptions
* Block user
* Report user
* Create Calendar entry from post text
## v0.6.6
* Create event

View file

@ -1,6 +1,6 @@
--- source-linux/qml/friendiqa.qml
+++ source-linux/qml/friendiqa.qml
@@ -191,7 +191,7 @@
@@ -193,7 +193,7 @@
color: Material.backgroundColor
}

View file

@ -31,14 +31,13 @@ Currently supported:
* Update fetches new posts (up to last 50) since last in local DB
* More shows older posts from local DB
* Create new Message with images or direct messages,smileys
* Send image from Android gallery
* Send image(s) from Android gallery
* Send text or urls from other apps to Friendiqa
* Native Android image dialog
ToDo:
* Videos and other binary data as attachment (sending, not supported in API)
* More than one attachment
* Attachments for Direct messages (currently not supported in API)
# Friends
@ -48,7 +47,7 @@ Currently supported:
* Tabs for own profiles, friends, other contacts and groups
* Show profile(s) of user and change profile picture
* List of all known contacts with locally downloaded pictures
* Follow or unfollow contacts
* Follow/unfollow or block/unblock contacts
* Search for new contacts according to topic
* Show follow requests; approve, deny, ignore requests
* Additional information, last messages and other functionality shown in news tab
@ -92,7 +91,7 @@ Currently supported:
ToDo
* Create events (needs API)
* Show more details and attendance of events (needs API)
# Config/Accounts
@ -107,7 +106,7 @@ Currently supported:
ToDo
* OAuth?
* OAuth
# Other

View file

@ -1,5 +1,5 @@
<?xml version="1.0"?>
<manifest package="org.qtproject.friendiqa" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.6.6" android:versionCode="32" android:installLocation="auto">
<manifest package="org.qtproject.friendiqa" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.6.7" android:versionCode="33" android:installLocation="auto">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="31"/>
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.

View file

@ -58,8 +58,10 @@ ApplicationWindow{
signal newstypeSignal(var type)
signal friendsSignal(var username)
signal contactdetailsSignal(var contact)
signal contactRefreshSignal()
signal searchSignal (var searchterm)
signal eventSignal(var contact)
signal eventcreateSignal(var event)
signal uploadSignal(var urls)
signal sendtextSignal(var intenttext)
signal changeimage(var method, var type, var id)

View file

@ -252,5 +252,9 @@
<file>qml/contactqml/ContactsSearchPage.qml</file>
<file>images/Friendiqa.ico</file>
<file>qml/calendarqml/EventCreate.qml</file>
<file>qml/newsqml/BlockUser.qml</file>
<file>qml/newsqml/ReportUser.qml</file>
<file>qml/newsqml/MessageImageUploadDialog.qml</file>
<file>qml/configqml/AcceptRules.qml</file>
</qresource>
</RCC>

View file

@ -307,7 +307,10 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname)
query.bindValue(5,newsitem["source"]);
query.bindValue(6,newsitem["id"].toInt());
if(newsitem["in_reply_to_user_id"]!=QJsonValue::Null){ query.bindValue(7,newsitem["in_reply_to_user_id"].toInt());}
query.bindValue(8,newsitem["geo"]);
QJsonObject geo;
geo["external_url"]=newsitem["external_url"];
query.bindValue(8,QJsonDocument(geo).toJson(QJsonDocument::Compact).toStdString().c_str());
//query.bindValue(8,newsitem["geo"]);
query.bindValue( 9, newsitem["favorited"].toInt());
query.bindValue(10, newsitem["user"]["id"].toInt());
//if (newsitem["friendica_title"]!="") {

View file

@ -49,7 +49,7 @@ XHR *XHR::instance()
XHR::XHR(QObject *parent) : QObject(parent)
{
request.setSslConfiguration(QSslConfiguration::defaultConfiguration());
//request.setSslConfiguration(QSslConfiguration::defaultConfiguration());
}
void XHR::setUrl(QString url)
@ -174,6 +174,7 @@ void XHR::clearParams()
void XHR::download()
{
QUrl requrl(m_url);
QNetworkRequest request;
if(m_downloadtype=="picturelist"){
QByteArray loginData = m_login.toLocal8Bit().toBase64();
QString headerData = "Basic " + loginData;
@ -205,6 +206,7 @@ void XHR::get()
requrl.setQuery(query);
QByteArray loginData = m_login.toLocal8Bit().toBase64();
QString headerData = "Basic " + loginData;
QNetworkRequest request;
request.setRawHeader("Authorization", headerData.toLocal8Bit());
request.setUrl(requrl);
reply = manager.get(request);
@ -224,7 +226,7 @@ void XHR::getlist()
XHR::setUrl(m_filelist.at(dlindex));}
else {
XHR::setUrl(m_filelist.at(dlindex));}
qDebug() << "start download" << m_url;
//qDebug() << "start download" << m_url;
XHR::download();
} else {dlindex=0;m_downloadtype="";m_contactlist.clear();m_filelist.clear();}
}
@ -238,11 +240,8 @@ void XHR::post()
QHashIterator<QString, QString> iparams(params);
while(iparams.hasNext()) {
iparams.next();
//qDebug() << "\t add param " << iparams.key() << " : " << iparams.value();
QHttpPart textPart;
textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"" + iparams.key() + "\""));
textPart.setBody(iparams.value().toUtf8());
multiPart->append(textPart);
}
@ -251,7 +250,7 @@ void XHR::post()
if (files.contains("media")){
uimg.setAngle(files.value("angle").toInt());
uimg.setSource(files.value("media"));
//qDebug() << "\t add media " << files.value("media") << " : " << files.value("angle").toInt();
QHttpPart imagePart;
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(uimg.mimetype()));
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"media\"; filename=\""+uimg.filename()+"\""));
@ -261,8 +260,8 @@ void XHR::post()
QByteArray loginData = m_login.toLocal8Bit().toBase64();
QString headerData = "Basic " + loginData;
QNetworkRequest request;
request.setRawHeader(QByteArray("Authorization"), headerData.toLocal8Bit());
request.setUrl(m_url+m_api);
reply = manager.post(request, multiPart);
qDebug() << "\t request sent";
@ -273,6 +272,26 @@ void XHR::post()
qDebug() << "\t reply signals connected";
}
void XHR::postJSON()
{
if (params.contains("JSON")){
QByteArray mJSON=params.value("JSON").toUtf8();
QByteArray loginData = m_login.toLocal8Bit().toBase64();
QString headerData = "Basic " + loginData;
QNetworkRequest request;
request.setRawHeader(QByteArray("Authorization"), headerData.toLocal8Bit());
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json; charset=UTF-8");
request.setUrl(m_url+m_api);
reply = manager.post(request, mJSON);
qDebug() << "\t request sent";
connect(reply, &QNetworkReply::finished, this, &XHR::onReplySuccess);
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError)));
connect(reply, &QNetworkReply::readyRead, this, &XHR::onReadyRead);
connect(reply, &QNetworkReply::sslErrors, this, &XHR::onSSLError);
qDebug() << "\t reply signals connected";
}
}
void XHR::onReplyError(QNetworkReply::NetworkError code)
{
qDebug() << code;
@ -304,7 +323,7 @@ void XHR::onRequestFinished()
QString helpfilename=jsonObject["filename"].toString();
QString helpfile=helpfilename.left(helpfilename.lastIndexOf("."));
QString filesuffix="";
if (jsonObject["type"].toString()=="image/jpeg"){filesuffix=".jpg";}
if (jsonObject["type"].toString()=="image/jpeg" || jsonObject["type"].toString()=="image/jpg"){filesuffix=".jpg";}
else if (jsonObject["type"].toString()=="image/png"){filesuffix=".png";}
else {filesuffix="";}
if (helpfilename==""){// check if file has any filename

View file

@ -95,6 +95,7 @@ public slots:
void setImageFileParam(QString name, QString url);
void clearParams();
void post();
void postJSON();
void get();
void getlist();
void download();
@ -125,7 +126,7 @@ private:
int dlindex;
QNetworkAccessManager manager;
QNetworkRequest request;
//QNetworkRequest request;
QNetworkReply *reply;
//QNetworkConfiguration nc;
QString bufferToString();

View file

@ -59,7 +59,7 @@ function friendicaPostRequest(login,api,data,method,rootwindow,callback) {
//print(api+JSON.stringify(login)+Qt.atob(login.password));
if (xhrequest.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
} else if(xhrequest.readyState === XMLHttpRequest.DONE) {
try{ if (xhrequest.responseText!=""){print (xhrequest.responseText)
try{ if (xhrequest.responseText!=""){//print (xhrequest.responseText)
callback(xhrequest.responseText)
}else{//print("API:\n" +api+" NO RESPONSE");
//showMessage("Error","API:\n" +api+" NO RESPONSE",rootwindow)
@ -68,7 +68,8 @@ function friendicaPostRequest(login,api,data,method,rootwindow,callback) {
}
catch (e){
print("API:\n" + api+" "+e+"\n Return:"+xhrequest.responseText);
showMessage("Error", "API:\n" + api+" "+e+"\n Return:"+xhrequest.responseText,rootwindow)}
//showMessage("Error", "API:\n" + api+" "+e+"\n Return:"+xhrequest.responseText,rootwindow)
}
}
}
xhrequest.open(method, login.server+api,true,login.username,Qt.atob(login.password));
@ -199,7 +200,7 @@ function updateData(database,table, username, key, value, callback,filter,filter
function showMessage(header,message,rootwindow){//print(message);
var cleanmessage=message.replace(/"/g,"-");
if(cleanmessage.length>200){cleanmessage=cleanmessage.slice(0,200)+'...'}
var messageString='import QtQuick 2.0; import QtQuick.Dialogs 1.2; MessageDialog{ visible: true; title:"'+header+'";standardButtons: StandardButton.Ok; text:" '+cleanmessage+'"}';
var messageString='import QtQuick 2.0; import QtQuick.Controls 2.15; import QtQuick.Controls.Material 2.12; Dialog{ visible: true; title:"'+header+'";standardButtons: Dialog.Ok;anchors.centerIn: parent;Label{text:" '+cleanmessage+'"}}';
var messageObject=Qt.createQmlObject(messageString,rootwindow,"messageOutput");
}

View file

@ -52,16 +52,15 @@ function requestList(login,database,onlynew,rootwindow,callback) {
function dataRequest(login,photo,database,xhr,rootwindow) {
// check if image exist and call download function
Helperjs.friendicaRequest(login,"/api/friendica/photo?photo_id="+photo.id, rootwindow, function (image){
if(image=="" || typeof(image)=="undefined"){currentimageno=currentimageno+1}else{
try{
try{print("image "+ image)
var obj = JSON.parse(image);
if (obj.hasOwnProperty('status')){
var helpfilename=photo.filename.substring(0,photo.filename.lastIndexOf("."));
var filesuffix="";
if (photo.type=="image/jpeg"){filesuffix=".jpg"}
if (photo.type=="image/jpeg" || photo.type=="image/jpg"){filesuffix=".jpg"}
else if (photo.type=="image/png"){filesuffix=".png"}
else {filesuffix=""}
if (helpfilename==""){// check if file has any filename
@ -86,7 +85,7 @@ function dataRequest(login,photo,database,xhr,rootwindow) {
}else{
var helpfilename=obj.filename.substring(0,obj.filename.lastIndexOf("."));
var filesuffix="";
if (obj.type=="image/jpeg"){filesuffix=".jpg"}
if (obj.type=="image/jpeg" || photo.type=="image/jpg"){filesuffix=".jpg"}
else if (obj.type=="image/png"){filesuffix=".png"}
else {filesuffix=""}
if (helpfilename==""){// check if file has any filename
@ -112,7 +111,7 @@ function dataRequest(login,photo,database,xhr,rootwindow) {
}} catch (e){
var helpfilename=photo.filename.substring(0,photo.filename.lastIndexOf("."));
var filesuffix="";
if (photo.type=="image/jpeg"){filesuffix=".jpg"}
if (photo.type=="image/jpeg" || photo.type=="image/jpg"){filesuffix=".jpg"}
else if (photo.type=="image/png"){filesuffix=".png"}
else {filesuffix=""}
if (helpfilename==""){// check if file has any filename

View file

@ -111,6 +111,21 @@ function listFriends(login,database,callback,filter,isFriend=0){
callback(contactlist)
});
}
function listBlocked(login,database,callback){
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
db.transaction( function(tx) {
var result = tx.executeSql('SELECT * from contacts WHERE username="'+login.username+'" AND statusnet_blocking=1 ORDER BY screen_name');
// check for friends
var contactlist=[];
for (var i=0;i<result.rows.length;i++){
var contact=result.rows.item(i)
contact.name=Qt.atob(contact.name);
if (contact.screen_name==null){contact.screen_name=""}
contactlist.push(contact)
}
callback(contactlist)
});
}
function listHashtags(login,database,callback){
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
@ -574,6 +589,7 @@ function cleanhelpernews(database,user,helpernews,allcontacts){
helpernews.statusnet_html=Qt.atob(helpernews.statusnet_html);
helpernews.text=Qt.atob(helpernews.text);
helpernews.id=helpernews.status_id;
try{let geoobj=JSON.parse(helpernews.geo); helpernews.external_url=geoobj.external_url}catch(e){}
helpernews.friendica_author=objFromArray(allcontacts,"url",helpernews.friendica_owner);
if (helpernews.attachments!="" && helpernews.attachments!==null){helpernews.attachments=JSON.parse(Qt.atob(helpernews.attachments))};
return helpernews

View file

@ -127,9 +127,15 @@ WorkerScript.onMessage = function(msg) {
var newsitemobject=msg.news[j];
newsitemobject=beautify(newsitemobject,msg);
if (!(typeof(newsitemobject.currentconversation)=='undefined') && (newsitemobject.currentconversation.length>0)){
newsitemobject.lastcomment=beautify(newsitemobject.currentconversation[newsitemobject.currentconversation.length-1],msg);
newsitemobject.lastcomment.indent=1
newsitemobject.lastcomment.isLastComment=true
let n=1;
while ((n<newsitemobject.currentconversation.length)&&(newsitemobject.currentconversation[newsitemobject.currentconversation.length-n].user.statusnet_blocking==true)) {
n++;
}
if (n<newsitemobject.currentconversation.length){
newsitemobject.lastcomment=beautify(newsitemobject.currentconversation[newsitemobject.currentconversation.length-n],msg);
newsitemobject.lastcomment.indent=1
newsitemobject.lastcomment.isLastComment=true
}
}
if (msg.method=="conversation"){
@ -137,12 +143,10 @@ WorkerScript.onMessage = function(msg) {
var count=0;
var firstReply=0;
for (var k=msg.model.count-1;k>-1;k--){
//print("newsitemobject.in_reply_to_status_id "+newsitemobject.in_reply_to_status_id+" msg.model.get(k).newsitemobject.in_reply_to_status_id "+msg.model.get(k).newsitemobject.in_reply_to_status_id)
if (newsitemobject.in_reply_to_status_id==msg.model.get(k).newsitemobject.id){
if (newsitemobject.in_reply_to_status_id==msg.model.get(k).newsitemobject.id){
newsitemobject.indent=(msg.model.get(k).newsitemobject.indent||0)+1;
if (newsitemobject.indent>6){newsitemobject.indent=6};
firstReply=k;
//break;
}
if (newsitemobject.in_reply_to_status_id==msg.model.get(k).newsitemobject.in_reply_to_status_id){
count+=1
@ -151,11 +155,10 @@ WorkerScript.onMessage = function(msg) {
}}
data=({"newsitemobject": newsitemobject})
}
if(data.newsitemobject.user.statusnet_blocking==true){break}
if(msg.method=="append") {
msg.model.insert(j, data)
} else if (msg.method=="conversation" && firstReply>0){
//print("j "+j +" firstReply "+firstReply+" count "+count)
msg.model.insert(firstReply+count+1, data)
}
else{

View file

@ -408,7 +408,7 @@ function cleanContacts(login,database,callback){
db.transaction( function(tx) {
var oldestnewsrs= tx.executeSql('SELECT created_at FROM news WHERE username="'+login.username+'" AND messagetype=0 ORDER BY created_at ASC LIMIT 1');
if (oldestnewsrs.rows.length>0){ var oldestnewsTime=oldestnewsrs.rows.item(0).created_at- 604800000;} else{var oldestnewsTime=0} //contacts can be 7 days old
var result = tx.executeSql('SELECT * from contacts WHERE username="'+login.username+'" AND isFriend=0 AND imageAge<'+oldestnewsTime); // check for friends
var result = tx.executeSql('SELECT * from contacts WHERE username="'+login.username+'" AND isFriend=0 AND statusnet_blocking<>1 AND imageAge<'+oldestnewsTime); // check for friends
for (var i=0;i<result.rows.length;i++){
filesystem.rmFile(result.rows.item(i).profile_image);
var deleters = tx.executeSql('DELETE from contacts WHERE username="'+login.username+'" AND url="'+result.rows.item(i).url+'"');
@ -455,7 +455,7 @@ function processNews(api,data){//print("processnews "+ " api "+ api + " data "+d
usermessages.push(newslist.status);
newslist=usermessages;
}
if (data=="" || api=="/api/v1/statuses"){print("data "+data); newsBusy.running=false}
if (data=="" || api=="/api/v1/statuses"){newsBusy.running=false}
else if (typeof(newslist)=='undefined'){
Helperjs.showMessage(qsTr("Undefined Array Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root)
}
@ -518,6 +518,10 @@ function processNews(api,data){//print("processnews "+ " api "+ api + " data "+d
if (api=="/api/statuses/replies"){newslist[n].messagetype=3}else{newslist[n].messagetype=0;}
newslist[n].friendica_author=cleanUser(newslist[n].friendica_author);
newslist[n].user=cleanUser(newslist[n].user);
try{
let localContact=Newsjs.objFromArray(allcontacts,"id",newslist[n].user.id);
newslist[n].user.statusnet_blocking=localContact.statusnet_blocking
}catch(e){}
//if (newslist[n].friendica_title!="") {newslist[n].statusnet_html="<b>"+newslist[n].friendica_title +"</b><br><br>"+newslist[n].friendica_html;}
//else{ //friendica_title also included in html
newslist[n].statusnet_html=newslist[n].friendica_html

View file

@ -85,6 +85,10 @@ Rectangle {
return events
}
function createEvent(event){
rootstackView.push("qrc:/qml/calendarqml/EventCreate.qml",{"eventInformation": event})
}
BusyIndicator{
id: calBusy
anchors.horizontalCenter: calendarView.horizontalCenter
@ -150,7 +154,7 @@ Rectangle {
title: qsTr("Delete Event?")
standardButtons: Dialog.Ok | Dialog.Cancel
modal: true
onAccepted: {//print("event.id"+event.id);
onAccepted: {
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setApi("/api/friendica/event_delete");
@ -158,7 +162,7 @@ Rectangle {
xhr.setParam("id",eventid);
xhr.post();
}
onRejected: {print("eventid "+eventid);close()}
onRejected: {close()}
}
MButton{
@ -200,7 +204,6 @@ Rectangle {
width: 20*root.fontFactor*osSettings.systemFontSize
MenuItem {
text: qsTr("Own Calendar")
//font.pixelSize: 3*mm
font.pointSize: osSettings.systemFontSize
onTriggered: {
calendartab.calendartabstatus="Events";
@ -284,6 +287,7 @@ Rectangle {
}
Component.onCompleted: {
root.eventcreateSignal.connect(createEvent);
root.eventSignal.connect(showEvents);
if (calendartab.calendartabstatus=="Events"){showEvents("")}
}

View file

@ -38,354 +38,366 @@ import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml"
import "qrc:/qml/calendarqml"
Rectangle{
Flickable{
id:eventCreateBox
color: Material.backgroundColor
property date startDate: new Date()
property var eventInformation: ({})
anchors.fill: parent
contentWidth: eventRect.width; contentHeight: eventRect.height
function formatText(count, modelData) {
var data = count === 12 ? modelData + 1 : modelData;
return data.toString().length < 2 ? "0" + data : data;
}
MButton{
id:closeButton
anchors.top: parent.top
anchors.topMargin: 1*mm
anchors.right: parent.right
anchors.rightMargin: 1*mm
text: "\uf057"
onClicked:{rootstackView.pop()}
var data = count === 12 ? modelData + 1 : modelData;
return data.toString().length < 2 ? "0" + data : data;
}
Label{
x: 0.5*root.fontFactor*osSettings.bigFontSize
y: 2*root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
height: root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
//verticalAlignment: TextInput.AlignBottom
color: Material.primaryTextColor
text:qsTr("Start")
}
TextField {
id: textStartDate
property string dateDay:(startDate.getDate()).toString().length<2?"0"+(startDate.getDate()):(startDate.getDate())
property string dateMonth: (startDate.getMonth()+1).toString().length<2?"0"+(startDate.getMonth()+1):(startDate.getMonth()+1)
x: 4*root.fontFactor*osSettings.bigFontSize
y: root.fontFactor*osSettings.bigFontSize
width: 5*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
horizontalAlignment: TextInput.AlignRight
text: dateDay+"-"+dateMonth+"-"+startDate.getFullYear()
inputMask: "99-99-9999"
validator: RegExpValidator{regExp: /^([0-2\s]?[0-9\s]|3[0-1\s])-(0[0-9\s]|1[0-2\s])-([0-9\s][0-9\s][0-9\s][0-9\s])$ / }
font.bold: true
}
MButton {
id: textStartDateDropdown
x: 9.5*root.fontFactor*osSettings.bigFontSize
y: root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
text:"\uf0d7"
onClicked:{
cal.visible=true;
cal.curSelection="start"
}
}
TextField {
id: textStartTime
x: 13*root.fontFactor*osSettings.bigFontSize
y: root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
inputMask: "99:99"
text: "00:00"
horizontalAlignment: TextInput.AlignRight
validator: RegExpValidator{regExp: /^([0-1\s]?[0-9\s]|2[0-3\s]):([0-5\s][0-9\s])$ / }
font.bold: true
}
MButton {
id: textStartTimeDropdown
x: 16.5*root.fontFactor*osSettings.bigFontSize
y: root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
text:"\uf0d7"
onClicked:{
onClicked: {timeTumbler.visible=true;timeTumbler.curSelection="start"}
}
}
Label{
x: 0.5*root.fontFactor*osSettings.bigFontSize
y: 4*root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
height: root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
color: Material.primaryTextColor
text:qsTr("End")
}
TextField {
id: textEndDate
x: 4*root.fontFactor*osSettings.bigFontSize
y: 3*root.fontFactor*osSettings.bigFontSize
width: 5*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
horizontalAlignment: TextInput.AlignRight
inputMask: "99-99-9999"
validator: RegExpValidator{regExp: /^([0-2\s]?[0-9\s]|3[0-1\s])-(0[0-9\s]|1[0-2\s])-([0-9\s][0-9\s][0-9\s][0-9\s])$ / }
enabled: false
font.bold: true
}
MButton {
id: textEndDateDropdown
x: 9.5*root.fontFactor*osSettings.bigFontSize
y: 3*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
enabled: false
text:"\uf0d7"
onClicked:{
cal.visible=true;
cal.curSelection="end"
}
}
TextField {
id: textEndTime
x: 13*root.fontFactor*osSettings.bigFontSize
y: 3*root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
enabled: false
horizontalAlignment: TextInput.AlignRight
inputMask: "99:99"
validator: RegExpValidator{regExp: /^([0-1\s]?[0-9\s]|2[0-3\s]):([0-5\s][0-9\s])$ / }
font.bold: true
}
MButton {
id: textEndTimeDropdown
x: 16.5*root.fontFactor*osSettings.bigFontSize
y: 3*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
enabled: false
text:"\uf0d7"
onClicked:{
onClicked: {timeTumbler.visible=true;timeTumbler.curSelection="end"}
}
}
Column{
x: 4*root.fontFactor*osSettings.bigFontSize
y: 6*root.fontFactor*osSettings.bigFontSize
width: parent.width-7*root.fontFactor*osSettings.bigFontSize
Oldcontrols.Calendar{
id:cal
property string curSelection: "start"
width: 12*root.fontFactor*osSettings.bigFontSize
height: 15*root.fontFactor*osSettings.bigFontSize
visible: false
selectedDate: new Date()
onClicked: {
if (curSelection=="start"){
textStartDate.text=Qt.formatDate(cal.selectedDate, "dd-MM-yyyy");
}else{
textEndDate.text=Qt.formatDate(cal.selectedDate, "dd-MM-yyyy");
}
cal.visible=false
}
}
Frame {
id: timeTumbler
width: 12*root.fontFactor*osSettings.bigFontSize
height: 10*root.fontFactor*osSettings.bigFontSize
visible: false
property string curSelection: "start"
Row {
Tumbler {
id: hoursTumbler
model: 24
delegate: tumblerDelegateComponent
currentIndex: 12
}
Tumbler {
id: minutesTumbler
model: 60
delegate: tumblerDelegateComponent
}
}
MButton {
id: timeInputfinished
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
text:"\uf00c"
onClicked:{
if (timeTumbler.curSelection=="start"){
textStartTime.text=formatText(24,hoursTumbler.currentIndex)+":"+formatText(60,minutesTumbler.currentIndex);
}else{
textEndTime.text=formatText(24,hoursTumbler.currentIndex)+":"+formatText(60,minutesTumbler.currentIndex);
}
timeTumbler.visible=false
}
}
}
CheckBox{
id: checkNoEndTime
width: 12*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
checked: true
font.pointSize: osSettings.systemFontSize
text: qsTr("no end")
onCheckedChanged: {
if(checked==true){
textEndDate.enabled=false;
textEndDateDropdown.enabled=false;
textEndTime.enabled=false;
textEndTimeDropdown.enabled=false;
textEndDate.text="";
textEndTime.text=""
}else{
textEndDate.enabled=true;
textEndDateDropdown.enabled=true;
textEndTime.enabled=true;
textEndTimeDropdown.enabled=true;
textEndDate.text=textStartDate.text;
textEndTime.text=textStartTime.text
}
}
}
TextField {
id: titleField
width: parent.width-root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
font.bold: true
placeholderText: qsTr("Title (required)")
}
Rectangle{
color: Material.backgroundColor
radius: 0.5*mm
width: parent.width-root.fontFactor*osSettings.bigFontSize
height:Math.max(bodyField.contentHeight+root.fontFactor*osSettings.bigFontSize,2.5*root.fontFactor*osSettings.bigFontSize)
TextArea {
id: bodyField
anchors.fill: parent
font.pointSize: osSettings.systemFontSize
font.family: "Noto Sans"
wrapMode: Text.Wrap
selectByMouse: true
placeholderText: qsTr("Event description (optional)")
textFormat: TextEdit.PlainText
onLinkActivated:{Qt.openUrlExternally(link)}
}
}
TextField {
id: locationField
width: parent.width-root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
placeholderText: qsTr("Location (optional)")
}
CheckBox{
id: chkbxPublish
width: 10*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
checked: true
font.pointSize: osSettings.systemFontSize
text: qsTr("Publish event?")
}
BusyIndicator{
id: eventCreateBusy
anchors.horizontalCenter: eventCreateBox.horizontalCenter
anchors.top:eventCreateBox.top
anchors.topMargin: 2*root.fontFactor*osSettings.bigFontSize
width:3*root.fontFactor*osSettings.bigFontSize
height: 3*root.fontFactor*osSettings.bigFontSize
running: false
}
boundsBehavior:Flickable.StopAtBounds
ScrollBar.vertical: ScrollBar { }
Rectangle{
id: eventRect
width: root.width
height: textColumn.height + 6*root.fontFactor*osSettings.bigFontSize
color: Material.backgroundColor
MButton{
id:createEventButton
text: qsTr("Create event")
onClicked:{
let startdatetext=textStartDate.getText(0,textStartDate.length);
let startdate=new Date(startdatetext.substring(6,10)+"-"+startdatetext.substring(3,5)+"-"+startdatetext.substring(0,2)+"T"+textStartTime.text)
id:closeButton
anchors.top: parent.top
anchors.topMargin: 1*mm
anchors.right: parent.right
anchors.rightMargin: 1*mm
text: "\uf057"
onClicked:{rootstackView.pop()}
}
if (titleField.text==""){
Helperjs.showMessage(qsTr("Error"),qsTr("No event name supplied"),eventCreateBox)
}else{
Label{
x: 0.5*root.fontFactor*osSettings.bigFontSize
y: 2*root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
height: root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
//verticalAlignment: TextInput.AlignBottom
color: Material.primaryTextColor
text:qsTr("Start")
}
TextField {
id: textStartDate
property string dateDay:(startDate.getDate()).toString().length<2?"0"+(startDate.getDate()):(startDate.getDate())
property string dateMonth: (startDate.getMonth()+1).toString().length<2?"0"+(startDate.getMonth()+1):(startDate.getMonth()+1)
x: 4*root.fontFactor*osSettings.bigFontSize
y: root.fontFactor*osSettings.bigFontSize
width: 5*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
horizontalAlignment: TextInput.AlignRight
text: dateDay+"-"+dateMonth+"-"+startDate.getFullYear()
inputMask: "99-99-9999"
validator: RegExpValidator{regExp: /^([0-2\s]?[0-9\s]|3[0-1\s])-(0[0-9\s]|1[0-2\s])-([0-9\s][0-9\s][0-9\s][0-9\s])$ / }
font.bold: true
}
MButton {
id: textStartDateDropdown
x: 9.5*root.fontFactor*osSettings.bigFontSize
y: root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
text:"\uf0d7"
onClicked:{
cal.visible=true;
cal.curSelection="start"
}
}
TextField {
id: textStartTime
x: 13*root.fontFactor*osSettings.bigFontSize
y: root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
inputMask: "99:99"
text: "00:00"
horizontalAlignment: TextInput.AlignRight
validator: RegExpValidator{regExp: /^([0-1\s]?[0-9\s]|2[0-3\s]):([0-5\s][0-9\s])$ / }
font.bold: true
}
MButton {
id: textStartTimeDropdown
x: 16.5*root.fontFactor*osSettings.bigFontSize
y: root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
text:"\uf0d7"
onClicked:{
onClicked: {timeTumbler.visible=true;timeTumbler.curSelection="start"}
}
}
Label{
x: 0.5*root.fontFactor*osSettings.bigFontSize
y: 4*root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
height: root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
color: Material.primaryTextColor
text:qsTr("End")
}
TextField {
id: textEndDate
x: 4*root.fontFactor*osSettings.bigFontSize
y: 3*root.fontFactor*osSettings.bigFontSize
width: 5*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
horizontalAlignment: TextInput.AlignRight
inputMask: "99-99-9999"
validator: RegExpValidator{regExp: /^([0-2\s]?[0-9\s]|3[0-1\s])-(0[0-9\s]|1[0-2\s])-([0-9\s][0-9\s][0-9\s][0-9\s])$ / }
enabled: false
font.bold: true
}
MButton {
id: textEndDateDropdown
x: 9.5*root.fontFactor*osSettings.bigFontSize
y: 3*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
enabled: false
text:"\uf0d7"
onClicked:{
cal.visible=true;
cal.curSelection="end"
}
}
TextField {
id: textEndTime
x: 13*root.fontFactor*osSettings.bigFontSize
y: 3*root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
enabled: false
horizontalAlignment: TextInput.AlignRight
inputMask: "99:99"
validator: RegExpValidator{regExp: /^([0-1\s]?[0-9\s]|2[0-3\s]):([0-5\s][0-9\s])$ / }
font.bold: true
}
MButton {
id: textEndTimeDropdown
x: 16.5*root.fontFactor*osSettings.bigFontSize
y: 3*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
enabled: false
text:"\uf0d7"
onClicked:{
onClicked: {timeTumbler.visible=true;timeTumbler.curSelection="end"}
}
}
Column{
id: textColumn
x: 4*root.fontFactor*osSettings.bigFontSize
y: 6*root.fontFactor*osSettings.bigFontSize
width: parent.width-7*root.fontFactor*osSettings.bigFontSize
Oldcontrols.Calendar{
id:cal
property string curSelection: "start"
width: 12*root.fontFactor*osSettings.bigFontSize
height: 15*root.fontFactor*osSettings.bigFontSize
visible: false
selectedDate: new Date()
onClicked: {
if (curSelection=="start"){
textStartDate.text=Qt.formatDate(cal.selectedDate, "dd-MM-yyyy");
}else{
textEndDate.text=Qt.formatDate(cal.selectedDate, "dd-MM-yyyy");
}
cal.visible=false
}
}
Frame {
id: timeTumbler
width: 12*root.fontFactor*osSettings.bigFontSize
height: 10*root.fontFactor*osSettings.bigFontSize
visible: false
property string curSelection: "start"
Row {
Tumbler {
id: hoursTumbler
model: 24
delegate: tumblerDelegateComponent
currentIndex: 12
}
Tumbler {
id: minutesTumbler
model: 60
delegate: tumblerDelegateComponent
}
}
MButton {
id: timeInputfinished
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
text:"\uf00c"
onClicked:{
if (timeTumbler.curSelection=="start"){
textStartTime.text=formatText(24,hoursTumbler.currentIndex)+":"+formatText(60,minutesTumbler.currentIndex);
}else{
textEndTime.text=formatText(24,hoursTumbler.currentIndex)+":"+formatText(60,minutesTumbler.currentIndex);
}
timeTumbler.visible=false
}
}
}
CheckBox{
id: checkNoEndTime
width: 12*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
checked: true
font.pointSize: osSettings.systemFontSize
text: qsTr("no end")
onCheckedChanged: {
if(checked==true){
textEndDate.enabled=false;
textEndDateDropdown.enabled=false;
textEndTime.enabled=false;
textEndTimeDropdown.enabled=false;
textEndDate.text="";
textEndTime.text=""
}else{
textEndDate.enabled=true;
textEndDateDropdown.enabled=true;
textEndTime.enabled=true;
textEndTimeDropdown.enabled=true;
textEndDate.text=textStartDate.text;
textEndTime.text=textStartTime.text
}
}
}
TextField {
id: titleField
width: parent.width-root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
font.bold: true
placeholderText: qsTr("Title (required)")
}
Rectangle{
color: Material.backgroundColor
radius: 0.5*mm
width: parent.width-root.fontFactor*osSettings.bigFontSize
height:Math.max(bodyField.contentHeight+root.fontFactor*osSettings.bigFontSize,2.5*root.fontFactor*osSettings.bigFontSize)
TextArea {
id: bodyField
anchors.fill: parent
font.pointSize: osSettings.systemFontSize
font.family: "Noto Sans"
wrapMode: Text.Wrap
selectByMouse: true
placeholderText: qsTr("Event description (optional)")
textFormat: TextEdit.PlainText
text: eventInformation.hasOwnProperty("text")?eventInformation.text:""
onLinkActivated:{Qt.openUrlExternally(link)}
}
}
TextField {
id: locationField
width: parent.width-root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
placeholderText: qsTr("Location (optional)")
}
CheckBox{
id: chkbxPublish
width: 10*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
checked: true
font.pointSize: osSettings.systemFontSize
text: qsTr("Publish event?")
}
BusyIndicator{
id: eventCreateBusy
anchors.horizontalCenter: eventCreateBox.horizontalCenter
anchors.top:eventCreateBox.top
anchors.topMargin: 2*root.fontFactor*osSettings.bigFontSize
width:3*root.fontFactor*osSettings.bigFontSize
height: 3*root.fontFactor*osSettings.bigFontSize
running: false
}
MButton{
id:createEventButton
text: qsTr("Create event")
onClicked:{
let startdatetext=textStartDate.getText(0,textStartDate.length);
let startdate=new Date(startdatetext.substring(6,10)+"-"+startdatetext.substring(3,5)+"-"+startdatetext.substring(0,2)+"T"+textStartTime.text)
eventCreateBusy.running=true;
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/friendica/event_create");
xhr.clearParams();
xhr.setParam("name", titleField.text);
xhr.setParam("start_time",startdate.toISOString())
if(!checkNoEndTime.checked){
let enddatetext=textEndDate.getText(0,textEndDate.length);
let enddate=new Date(enddatetext.substring(6,10)+"-"+enddatetext.substring(3,5)+"-"+enddatetext.substring(0,2)+"T"+textEndTime.text)
xhr.setParam("end_time",enddate.toISOString())
}
xhr.setParam("name",titleField.text)
if (bodyField.text!=""){xhr.setParam("desc",bodyField.text)}
if (locationField.text!=""){xhr.setParam("place",locationField.text)}
xhr.setParam("publish",chkbxPublish.checked)
xhr.post();
}
}
}
Connections{
target: xhr
function onSuccess(text,api){
if (api=="/api/friendica/event_create"){
updatenews.setDatabase();
updatenews.login();
updatenews.setSyncAll(false);
updatenews.events();
try{while(rootstackView.depth>1){rootstackView.pop()}}catch(e){}
}
}
function onError(text,api){
if (api=="/api/friendica/event_create"){
Helperjs.showMessage(qsTr("Error"),text,root)
}
}
}
}
Component {
id: tumblerDelegateComponent
Label {
text: formatText(Tumbler.tumbler.count, modelData)
opacity: 1.0 - Math.abs(Tumbler.displacement) / (Tumbler.tumbler.visibleItemCount / 2)
color:Material.primaryTextColor
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
font.pointSize: osSettings.systemFontSize
if (titleField.text==""){
Helperjs.showMessage(qsTr("Error"),qsTr("No event name supplied"),eventCreateBox)
}else{
let startdatetext=textStartDate.getText(0,textStartDate.length);
let startdate=new Date(startdatetext.substring(6,10)+"-"+startdatetext.substring(3,5)+"-"+startdatetext.substring(0,2)+"T"+textStartTime.text)
eventCreateBusy.running=true;
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/friendica/event_create");
xhr.clearParams();
xhr.setParam("name", titleField.text);
xhr.setParam("start_time",startdate.toISOString())
if(!checkNoEndTime.checked){
let enddatetext=textEndDate.getText(0,textEndDate.length);
let enddate=new Date(enddatetext.substring(6,10)+"-"+enddatetext.substring(3,5)+"-"+enddatetext.substring(0,2)+"T"+textEndTime.text)
xhr.setParam("end_time",enddate.toISOString())
}
xhr.setParam("name",titleField.text)
if (bodyField.text!=""){xhr.setParam("desc",bodyField.text)}
if (locationField.text!=""){xhr.setParam("place",locationField.text)}
xhr.setParam("publish",chkbxPublish.checked)
xhr.post();
}
}
}
Connections{
target: xhr
function onSuccess(text,api){
if (api=="/api/friendica/event_create"){
updatenews.setDatabase();
updatenews.login();
updatenews.setSyncAll(false);
updatenews.events();
try{while(rootstackView.depth>1){rootstackView.pop()}}catch(e){}
}
}
function onError(text,api){
if (api=="/api/friendica/event_create"){
Helperjs.showMessage(qsTr("Error"),text,root)
}
}
}
}
Component {
id: tumblerDelegateComponent
Label {
text: formatText(Tumbler.tumbler.count, modelData)
opacity: 1.0 - Math.abs(Tumbler.displacement) / (Tumbler.tumbler.visibleItemCount / 2)
color:Material.primaryTextColor
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
font.pointSize: osSettings.systemFontSize
}
}
}
}

View file

@ -73,7 +73,7 @@ Rectangle{
title: qsTr("Delete Event?")
standardButtons: Dialog.Ok | Dialog.Cancel
modal: true
onAccepted: {//print("event.id"+event.id);
onAccepted: {
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setApi("/api/friendica/event_delete");
@ -81,7 +81,7 @@ Rectangle{
xhr.setParam("id",eventid);
xhr.post();
}
onRejected: {print("eventid "+eventid);close()}
onRejected: {close()}
}
ListView {

View file

@ -99,7 +99,7 @@ Rectangle{
}
}
onClicked:{print("status "+status)
onClicked:{
if (status==""){
rootstackView.push("qrc:/qml/calendarqml/EventList.qml",{"dayint": event.startday, "events":[event]});
} else {rootstackView.pop()}

View file

@ -0,0 +1,70 @@
// This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// In addition, as a special exception, the copyright holders give
// permission to link the code of portions of this program with the
// OpenSSL library under certain conditions as described in each
// individual source file, and distribute linked combinations including
// the two.
//
// You must obey the GNU General Public License in all respects for all
// of the code used other than OpenSSL. If you modify file(s) with this
// exception, you may extend this exception to your version of the
// file(s), but you are not obligated to do so. If you do not wish to do
// so, delete this exception statement from your version. If you delete
// this exception statement from all source files in the program, then
// also delete it here.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0
import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.12
Dialog {
id: rulesDialog
height: parent.height/2
width: parent.width
anchors.centerIn: parent
title: qsTr("Accept instance rules")
property string rules: ""
standardButtons: Dialog.Yes | Dialog.No
modal: true
onAccepted: {
username.visible=true;
password.visible=true;
ruleButton.visible=false;
confirmation.visible=true
}
onRejected: {close()}
ScrollView{
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
width: root.width-2*root.fontFactor*osSettings.bigFontSize
height:parent.height
clip:true
Text {
x:1; y:1
width: root.width-4*root.fontFactor*osSettings.bigFontSize
wrapMode: TextEdit.Wrap
color: Material.primaryTextColor
linkColor: Material.accentColor
textFormat: Text.PlainText
font.family: "Noto Sans"
font.pointSize: osSettings.systemFontSize
text: rules
}
}
}

View file

@ -74,6 +74,7 @@ Page{
useritems=useritems+"MenuItem{font.pointSize: osSettings.bigFontSize;width:accountPage.width*2/3; text:'"+accountPage.users[i].username+
"'; onTriggered: {Service.readConfig(db,function(obj){
userButton.text=obj.username;
servername.text=obj.server;
serverModel.insert(0,{text:obj.server})
accountPage.setServericon(obj.server);
username.text= obj.username;
@ -148,7 +149,7 @@ Page{
x: 4*root.fontFactor*osSettings.bigFontSize
y: 3.5*root.fontFactor*osSettings.bigFontSize
width: root.width-5*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize//5*mm;
height: 2.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
text:"https://"
onFocusChanged:{
@ -199,10 +200,32 @@ Page{
ListElement{text:"https://venera.social"}
}
MButton {
id: ruleButton
x: root.fontFactor*osSettings.bigFontSize; y: 6*root.fontFactor*osSettings.bigFontSize; width: root.width-9*mm;
visible: (osSettings.osType=="Android") && (userButton.text== qsTr("User"))
height: 2*root.fontFactor*osSettings.bigFontSize;
text: qsTr("Instance rules")
font.pointSize: osSettings.bigFontSize
onClicked:{
Helperjs.friendicaWebRequest(servername.text+"/api/v1/instance/rules",root,function(rules){
let rulestext="";
let rulesarray=JSON.parse(rules)
for (let rule in rulesarray){
rulestext=rulestext+rulesarray[rule].text+"\n"
}
var component = Qt.createComponent("qrc:/qml/configqml/AcceptRules.qml");
var rulesdialog = component.createObject(root,{"rules": rulestext});
rulesdialog.open()
})
}
}
TextField {
id: username
x: root.fontFactor*osSettings.bigFontSize; y: 6*root.fontFactor*osSettings.bigFontSize; width: root.width-9*mm; //height: 5*mm;
font.pointSize: osSettings.systemFontSize
visible: (osSettings.osType=="Android")?(userButton.text!= qsTr("User")):true
placeholderText: qsTr("Nickname")
selectByMouse: true
onEditingFinished: {
@ -219,6 +242,7 @@ Page{
id: password
x: root.fontFactor*osSettings.bigFontSize; y: 9*root.fontFactor*osSettings.bigFontSize; width: root.width-9*mm; //height: 5*mm;
font.pointSize: osSettings.systemFontSize
visible: (osSettings.osType=="Android")?(userButton.text!= qsTr("User")):true
selectByMouse: true
echoMode: TextInput.Password
placeholderText: qsTr("Password")
@ -243,6 +267,7 @@ Page{
wrapMode: TextEdit.NoWrap
onTextChanged: imagestoredir=imagestore.text
}
MButton {
x: root.width-3*root.fontFactor*osSettings.bigFontSize; y: 13*root.fontFactor*osSettings.bigFontSize;
height: 2*root.fontFactor*osSettings.bigFontSize;
@ -252,7 +277,6 @@ Page{
onClicked:{imagestoreDialog.open()}
}
FileDialog {
id: imagestoreDialog
title: "Please choose a directory"
@ -265,7 +289,6 @@ Page{
}
}
BusyIndicator{
id: accountBusy
anchors.horizontalCenter: parent.horizontalCenter
@ -276,56 +299,56 @@ Page{
}
MButton {
x: root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize
text: qsTr("Confirm")
font.pointSize: osSettings.bigFontSize
onClicked:{
accountBusy.running=true;//servername.displayText
var userconfig={server: servername.displayText, username: username.text, password:Qt.btoa(password.text), imagestore:imagestoredir,interval: ""};
var errormessage="";
if (servername.text==""){errormessage=qsTr("No server given! ")}
else if (username.text==""){errormessage+=qsTr("No nickname given! ")}
else if (password.text=="") {errormessage+=qsTr("No password given! ")}
else if (imagestoredir=="") {errormessage+=qsTr("No image directory given!")}
id:confirmation
x: root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize
text: qsTr("Confirm")
font.pointSize: osSettings.bigFontSize
visible: (osSettings.osType=="Android")?userButton.text!= qsTr("User"):true
onClicked:{
accountBusy.running=true;//servername.displayText
var userconfig={server: servername.displayText, username: username.text, password:Qt.btoa(password.text), imagestore:imagestoredir,interval: ""};
var errormessage="";
if (servername.text==""){errormessage=qsTr("No server given! ")}
else if (username.text==""){errormessage+=qsTr("No nickname given! ")}
else if (password.text=="") {errormessage+=qsTr("No password given! ")}
else if (imagestoredir=="") {errormessage+=qsTr("No image directory given!")}
else {errormessage=""}
if (errormessage=="") {
Helperjs.friendicaRequest(userconfig,"/api/account/verify_credentials.json?skip_status=true",root,function(obj){
accountBusy.running=false;
try{var credentials=JSON.parse(obj);
if (credentials.hasOwnProperty('error')){
Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password!"),root)
}
else{
if (users.length==0){Service.setDefaultOptions(db);}
if(userconfig.imagestore == filesystem.homePath+"/"+username.text+"/")
{
filesystem.makePath(filesystem.homePath+"/"+username.text);
}
filesystem.Directory=imagestoredir //userconfig.imagestore;
filesystem.makeDir("contacts");
filesystem.makeDir("albums");
userconfig.accountId=credentials.id
Service.storeConfig(db,userconfig);
Service.readConfig(db,function(userconfig){
Helperjs.readData(db,"config","",function(storedUsers){
storedUsers.sort(function(obj1, obj2) {
return obj1.isActive - obj2.isActive;
});
accountPage.users=storedUsers});
//reset values
login=userconfig;
news=[];
contactlist=[];
rootstack.currentIndex=0;
newstypeSignal("refresh");
},"isActive",0);
//Service.requestProfile(userconfig,db,root,function(nc){root.newContacts=nc});
Helperjs.showMessage(qsTr("Success"),qsTr("Name")+": "+credentials.name+"\nScreen Name: "+credentials.screen_name,root)
rootstackView.pop()
}
}catch(e){Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password!"),root)};
else {errormessage=""}
if (errormessage=="") {
Helperjs.friendicaRequest(userconfig,"/api/account/verify_credentials.json?skip_status=true",root,function(obj){
accountBusy.running=false;
try{var credentials=JSON.parse(obj);
if (credentials.hasOwnProperty('error')){
Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root)
}
else{
if (users.length==0){Service.setDefaultOptions(db);}
if(userconfig.imagestore == filesystem.homePath+"/"+username.text+"/")
{
filesystem.makePath(filesystem.homePath+"/"+username.text);
}
filesystem.Directory=imagestoredir
filesystem.makeDir("contacts");
filesystem.makeDir("albums");
userconfig.accountId=credentials.id
Service.storeConfig(db,userconfig);
Service.readConfig(db,function(userconfig){
Helperjs.readData(db,"config","",function(storedUsers){
storedUsers.sort(function(obj1, obj2) {
return obj1.isActive - obj2.isActive;
});
accountPage.users=storedUsers});
//reset values
login=userconfig;
news=[];
contactlist=[];
rootstack.currentIndex=0;
newstypeSignal("refresh");
},"isActive",0);
Helperjs.showMessage(qsTr("Success"),qsTr("Name")+": "+credentials.name+"\nScreen Name: "+credentials.screen_name,root)
rootstackView.pop()
}
}catch(e){Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root)};
})}
else {Helperjs.showMessage(qsTr("Error"), errormessage,root)}
@ -379,7 +402,7 @@ Page{
servericon.source="";
username.text=""
password.text=""
imagestore.text="" //filesystem.homePath+"/.friendiqa/"+username.text//""
imagestore.text=""
userButton.text=qsTr("User")
}
}

View file

@ -43,7 +43,7 @@ Page{
font.pointSize: osSettings.systemFontSize
color:Material.primaryTextColor
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
text: "<b>Friendiqa v0.6.6 </b><br>Licensed under GPL 3 with the exception of OpenSSL <br> "+
text: "<b>Friendiqa v0.6.7 </b><br>Licensed under GPL 3 with the exception of OpenSSL <br> "+
"Website <a href='https://friendiqa.ma-nic.de'>https://friendiqa.ma-nic.de</a><br>"+
"Sourcecode: <a href='https://git.friendi.ca/LubuWest/Friendiqa'>https://git.friendi.ca/LubuWest/Friendiqa</a><br>"+
"Privacy Policy: <a href='https://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md'>http://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md</a><br>"+

View file

@ -44,6 +44,7 @@ Item{
Layout.fillWidth:true
Layout.fillHeight: true
property int currentContact: 0
signal contactRefreshSignal()
function showFriends(username){
try {friendsModel.clear()} catch(e){};
@ -86,6 +87,19 @@ Item{
},searchText.text,-1);
}
function showBlocked(contact){
try {friendsModel.clear()} catch(e){};
Newsjs.listBlocked(login,db,function(contactsobject){
for (var j=0;j<contactsobject.length;j++){
contactsobject[j].description=Qt.atob(contactsobject[j].description);
if(Helperjs.getCount(db,login,"contacts","screen_name",contactsobject[j].screen_name)>1){
contactsobject[j].screen_name=contactsobject[j].screen_name+"+"+contactsobject[j].cid
}
friendsModel.append({"contact":contactsobject[j]});
}
});
}
Connections{
target:xhr
function onDownloaded(type,url,filename,i){
@ -159,14 +173,18 @@ Item{
width: 6*root.fontFactor*osSettings.bigFontSize
height: 1.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
model: [qsTr("Friends"), qsTr("All")]
model: [qsTr("Friends"), qsTr("All"), qsTr("Blocked")]
onCurrentIndexChanged:{
if (currentIndex === 0) {
showFriends(root.login.username);
} else{
} else
if (currentIndex===1){
showContacts()
} else if (currentIndex===2){
showBlocked()
}
}
Component.onCompleted: {root.contactRefreshSignal.connect(onCurrentIndexChanged)}
}

View file

@ -51,9 +51,6 @@ Item{
function updateGroup(login,database,group){
// update groups
//var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
//var groupdata={"gid":group.id,"name":group.name,"user":group.user};
//print("Groupdata "+JSON.stringify(group));
var api="";
if (group.new){api="/api/friendica/group_create.json?name="+group.name}else{api="/api/friendica/group_update.json?gid="+group.id}
xhr.setUrl(login.server);

View file

@ -61,8 +61,10 @@ ApplicationWindow{
signal newstypeSignal(var type)
signal friendsSignal(var username)
signal contactdetailsSignal(var contact)
signal contactRefreshSignal()
signal searchSignal (var searchterm)
signal eventSignal(var contact)
signal eventcreateSignal(var event)
signal uploadSignal(var urls)
signal sendtextSignal(var intenttext)
signal changeimage(var method, var type, var id)
@ -202,7 +204,10 @@ ApplicationWindow{
TabBar {
id: bar
Layout.fillWidth: true
onCurrentIndexChanged: rootstack.currentIndex=bar.currentIndex
onCurrentIndexChanged: {
rootstack.currentIndex=bar.currentIndex;
try{while(rootstackView.depth>1){rootstackView.pop()}}catch(e){}
}
TabButton {
text: "\uf03a"
background:Rectangle{

View file

@ -42,12 +42,13 @@ Rectangle{
radius: mm
property alias text: mainText.text
property alias font: mainText.font
property alias fontSize: mainText.font.pointSize
signal clicked
state:""
Text{
id:mainText
color: "black"
color: Material.primaryTextColor//"black"
anchors.centerIn: parent
width: contentWidth
height: contentHeight

View file

@ -63,10 +63,10 @@ Item {
onClicked: {
login=account;
if(!wideScreen){leftDrawerAndroid.close()}
newstypeSignal("refresh")
// updatenews.setDatabase();
// updatenews.login();
// updatenews.startsync();
// newstypeSignal("refresh")
updatenews.setDatabase();
updatenews.login();
updatenews.startsync();
}
}
}

View file

@ -29,161 +29,180 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import Qt.labs.folderlistmodel 2.1
import QtQuick.Dialogs 1.2
import Qt.labs.folderlistmodel 2.12
import "qrc:/js/service.js" as Service
import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml"
Rectangle{
Item{
id:imageDialog
z:2
border.color: "grey"
color: Material.backgroundColor
width: parent.width-4*mm
height:parent.height-12*mm
x:2*mm
y:10*mm
// border.color: "grey"
// color: Material.backgroundColor
// width: parent.width-root.fontFactor*osSettings.bigFontSize
// height: parent.height-3*root.fontFactor*osSettings.bigFontSize
// x: 0.5*root.fontFactor*osSettings.bigFontSize
// y: 2*root.fontFactor*osSettings.bigFontSize
property string directory: ""
property bool multiple: false
property string imageUrl: ""
property var imageUrls: []
//property var imageUrls: []
signal ready();
function pickImage() {}
function pickImage() {imageFileDialog.open()}
Text{
id:directoryText
x:0.5*mm
y:0.5*mm
width: imageDialog.width-15*mm
height:contentHeight
wrapMode: Text.Wrap
text: directory
}
Button{
id:closeButton
height: 3*root.fontFactor*osSettings.bigFontSize
anchors.top: parent.top
anchors.topMargin: 0.5*mm
anchors.right: parent.right
anchors.rightMargin: 1*mm
text: "\uf057"
onClicked:{ready();imageDialog.destroy()}
// Text{
// id:directoryText
// anchors.bottom: parent.bottom
//// x:0.5*mm
//// y:0.5*mm
// width: imageDialog.width-3.5*root.fontFactor*osSettings.bigFontSize
// height:contentHeight
// font.pointSize: osSettings.bigFontSize
// wrapMode: Text.Wrap
// text: directory
// color: Material.primaryTextColor
// }
// Button{
// id:closeButton
// height: 2*root.fontFactor*osSettings.bigFontSize
// anchors.top: parent.top
// anchors.topMargin: 0.5*mm
// anchors.right: parent.right
// anchors.rightMargin: 1*mm
// text: "\uf057"
// onClicked:{
// ready();imageDialog.destroy()
// }
// }
FileDialog {
id: imageFileDialog
title: "Please choose a file"
folder: shortcuts.pictures
selectFolder: false
selectMultiple: true
onAccepted: {
imageUrl=imageFileDialog.fileUrls.toString();
ready();
}
}
// ListView {
// id: imageView
// x:0.5*mm
// y: 2.5*root.fontFactor*osSettings.bigFontSize//Math.max(directoryText.height, closeButton.height)+mm
// width: parent.width-2*mm
// height: parent.height-3*root.fontFactor*osSettings.bigFontSize
// boundsBehavior:Flickable.StopAtBounds
// clip: true
// model: imageModel
// delegate: imageItem
// ScrollBar.vertical: ScrollBar { }
// }
ListView {
id: imageView
x:0.5*mm
y: Math.max(directoryText.height, closeButton.height)+mm
width: imageDialog.width-2*mm
height: imageDialog.height-imageView.y-4*mm
clip: true
model: imageModel
delegate: imageItem
}
// FolderListModel{
// id: imageModel
// nameFilters: ["*.png", "*.jpg",".jpeg","*.JPG","*.gif"]
// sortField: FolderListModel.Time
// sortReversed:false
// showDotAndDotDot: true
// showDirs: true
// showDirsFirst: true
// folder:directory
// }
FolderListModel{
id: imageModel
nameFilters: ["*.png", "*.jpg",".jpeg","*.JPG","*.gif"]
sortField: FolderListModel.Time
sortReversed:false
showDotAndDotDot: true
showDirs: true
showDirsFirst: true
folder:directory
}
// BusyIndicator{
// id: imageBusy
// anchors.horizontalCenter: imageView.horizontalCenter
// anchors.top:imageView.top
// anchors.topMargin: 2*mm
// width: 2*root.fontFactor*osSettings.bigFontSize
// height: 2*root.fontFactor*osSettings.bigFontSize
// running:false
// }
BusyIndicator{
id: imageBusy
anchors.horizontalCenter: imageView.horizontalCenter
anchors.top:imageView.top
anchors.topMargin: 2*mm
width:10*mm
height: 10*mm
running:false
}
// Component{
// id:imageItem
// Item{
// width:imageView.width
// height: Math.max(fileImage.height,1.5*root.fontFactor*osSettings.bigFontSize)+2*mm
// Rectangle{
// id:imagetextRectangle
// color:"black"
// x:mm
// z:3
// opacity: fileIsDir?0:0.5
// width:imagetext.contentWidth
// height: imagetext.contentHeight
// anchors.bottom: fileImage.bottom
// }
// Text {
// id:imagetext
// x: mm//fileIsDir?11*mm:mm
// z:4
// text: fileIsDir?"\uf07b "+fileName:fileName
// width: fileIsDir?parent.width - 2.5*root.fontFactor*osSettings.bigFontSize :imageView.width-mm
// anchors.bottom: fileImage.bottom
// color: fileIsDir?Material.primaryTextColor:"white"
// font.pointSize: osSettings.bigFontSize
// wrapMode:Text.Wrap
// }
// Text {
// id:selected
// anchors.right:parent.right
// visible: attachImageURLs.indexOf(fileURL)>-1
// z:4
// text: "\u2713"
// width: 2*root.fontFactor*osSettings.bigFontSize
// anchors.top: fileImage.top
// color: "green"
// font.pointSize: 3*osSettings.bigFontSize
// }
Component{
id:imageItem
Item{
width:imageView.width
height:folderImage.height+2*mm
Rectangle{
id:imagetextRectangle
color:"black"
x:mm
z:3
opacity: fileIsDir?0:0.5
width:imagetext.contentWidth
height: imagetext.contentHeight
anchors.bottom: folderImage.bottom
}
Text {
id:imagetext
x:fileIsDir?11*mm:mm
z:4
text: fileName
width: fileIsDir?parent.width - 12*mm :imageView.width-mm
anchors.bottom: folderImage.bottom
color: fileIsDir?"black":"white"
font.pointSize: osSettings.bigFontSize
wrapMode:Text.Wrap
}
Text {
id:selected
anchors.right:parent.right
visible: attachImageURLs.indexOf(fileURL)>-1
z:4
text: "\u2713"
width: 10*mm
anchors.top: folderImage.top
color: "green"
font.pointSize: 3*osSettings.bigFontSize
}
// Image{id:fileImage
// width: imageView.width-mm
// fillMode:Image.PreserveAspectFit
// source:fileIsDir?"":fileURL
// }
Image{id:folderImage
width: fileIsDir?10*mm: imageView.width-mm
fillMode:Image.PreserveAspectFit
source:fileIsDir?"qrc:/images/folder-blue.png":fileURL
}
// MouseArea{
// anchors.fill: parent
// onClicked:{
// if (fileName==".."){
// imageModel.folder=imageModel.parentFolder;
// directory=imageModel.parentFolder
// }
// else if (fileIsDir){
// imageModel.folder=fileURL;
// directory=fileURL
// }
// else{
// if (multiple!=true){
// //attachImageURLs.push(fileURL);
// //attachImage(fileURL);
// imageUrls.push(fileURL);
// imageUrl=fileURL;
// ready();
// imageDialog.destroy()
// }
// else {
// if(selected.visible==true){
// imageUrls.splice(imageUrls.indexOf(fileURL,1))
// selected.visible=false
// }
// else{
// imageUrls.push(fileURL);
// selected.visible=true;
MouseArea{
anchors.fill: parent
onClicked:{
if (fileName==".."){
imageModel.folder=imageModel.parentFolder;
directory=imageModel.parentFolder
}
else if (fileIsDir){
imageModel.folder=fileURL;
directory=fileURL
}
else{
if (multiple!=true){
//attachImageURLs.push(fileURL);
//attachImage(fileURL);
imageUrls.push(fileURL);
imageUrl=fileURL;
ready();
imageDialog.destroy()
}
else {
if(selected.visible==true){
imageUrls.splice(imageUrls.indexOf(fileURL,1))
selected.visible=false
}
else{
imageUrls.push(fileURL);
selected.visible=true;
}
imageUrl=fileURL
}
}
}
}
}
}
// }
// imageUrl=fileURL
// }
// }
// }
// }
// }
// }
// Component.onCompleted: imageFileDialog.open()
}

View file

@ -22,13 +22,15 @@ Item {
h.push("file://"+ decodeURIComponent(message.imageUrls[n]).substring(5))
}
imageUrls=h;
if(imageUrls.length==1){
rootstack.currentIndex=0;newstab.active=true;
root.uploadSignal(imageUrls)
} else{
rootstack.currentIndex=2;fotostab.active=true;
root.uploadSignal(imageUrls)
}
rootstack.currentIndex=0;newstab.active=true;
root.uploadSignal(imageUrls.join(","))
// if(imageUrls.length==1){
// rootstack.currentIndex=0;newstab.active=true;
// root.uploadSignal(imageUrls)
// } else{
// rootstack.currentIndex=2;fotostab.active=true;
// root.uploadSignal(imageUrls)
// }
} else if (type==m_TEXT_MESSAGE){
rootstack.currentIndex=0;newstab.active=true;
root.sendtextSignal(message)

View file

@ -15,7 +15,6 @@ Item {
function startSyncTimer(interval){
syncTimer.interval=interval*60000;
//print("synctimer interval "+syncTimer.interval)
syncTimer.start()
}

View file

@ -0,0 +1,55 @@
// This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// In addition, as a special exception, the copyright holders give
// permission to link the code of portions of this program with the
// OpenSSL library under certain conditions as described in each
// individual source file, and distribute linked combinations including
// the two.
//
// You must obey the GNU General Public License in all respects for all
// of the code used other than OpenSSL. If you modify file(s) with this
// exception, you may extend this exception to your version of the
// file(s), but you are not obligated to do so. If you do not wish to do
// so, delete this exception statement from your version. If you delete
// this exception statement from all source files in the program, then
// also delete it here.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0
import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.12
import "qrc:/js/helper.js" as Helperjs
Dialog {
id: userReportDialog
anchors.centerIn: parent
property var newsitem:({})
title: qsTr("Block contact?")
standardButtons: Dialog.Ok | Dialog.Cancel
modal: true
onAccepted: {
Helperjs.updateData(root.db,"contacts",login.username,"statusnet_blocking", true,function(){},"id",newsitem.user.id)
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setApi("/api/v1/accounts/" + newsitem.user.id + "/block");
xhr.clearParams();
xhr.post();
}
onRejected: {close()}
Label {text: newsitem.user.name}
}

View file

@ -132,8 +132,8 @@ Page {
BusyIndicator{
id: contactBusy
anchors.centerIn:parent
width:10*mm
height: 10*mm
width: 1.5*root.fontFactor*osSettings.bigFontSize
height: 1.5*root.fontFactor*osSettings.bigFontSize
running: true
}
@ -159,6 +159,7 @@ Page {
function onProfileimagesourceChanged(){profileImage.source=profileimagesource}
}
}
Flow{id:buttonflow
anchors.right: parent.right
anchors.rightMargin: mm
@ -222,6 +223,7 @@ Page {
})
Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){},"id", contact.id)
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop()
}
}
@ -236,6 +238,7 @@ Page {
})
Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){},"id", contact.id)
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop()
}
}
@ -250,6 +253,7 @@ Page {
});
Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){},"id", contact.id)
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop()
}
}
@ -264,6 +268,7 @@ Page {
});
Helperjs.updateData(root.db,"contacts",root.login.username,"isFriend",1,function(){},"id",contact.id)
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
rootstackView.pop()
}
@ -281,10 +286,40 @@ Page {
});
Helperjs.updateData(root.db,"contacts",root.login.username,"isFriend",0,function(){},"id",contact.id)
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop()
}
}
MButton{
id: blockbutton
visible:(contact.statusnet_blocking!=1)
height: 6*mm
text:qsTr("Block")
onClicked:{
contactBusy.running=true;
Helperjs.updateData(root.db,"contacts",root.login.username,"statusnet_blocking",true,function(){},"id",contact.id)
Helperjs.friendicaPostRequest(login,"/api/v1/accounts/" + contact.id + "/block",'',"POST",root,function(returnvalue){
});
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop()
}
}
MButton{
id: unblockbutton
visible:(contact.statusnet_blocking==1)
height: 6*mm
text:qsTr("Unblock")
onClicked:{
contactBusy.running=true;
Helperjs.updateData(root.db,"contacts",root.login.username,"statusnet_blocking",false,function(){},"id",contact.id)
Helperjs.friendicaPostRequest(login,"/api/v1/accounts/" + contact.id + "/unblock",'',"POST",root,function(returnvalue){
});
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop()
}
}
}//Flow end
Label {
@ -370,9 +405,6 @@ Page {
xhr.clearParams();
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
// if(contact.isFriend==1 || contact.hasOwnProperty("acct")){
// xhr.setApi("/api/statuses/user_timeline");}
// else{xhr.setApi("/api/users/show");}
xhr.setApi("/api/statuses/user_timeline")
xhr.setParam("user_id",contact.id)
xhr.get();

View file

@ -104,9 +104,9 @@ Page {
id: conversationBusy
anchors.horizontalCenter: conversationView.horizontalCenter
anchors.top:conversationView.top
anchors.topMargin: 2*mm
width:10*mm
height: 10*mm
anchors.topMargin: mm
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
running: true
}

View file

@ -0,0 +1,301 @@
// This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// In addition, as a special exception, the copyright holders give
// permission to link the code of portions of this program with the
// OpenSSL library under certain conditions as described in each
// individual source file, and distribute linked combinations including
// the two.
//
// You must obey the GNU General Public License in all respects for all
// of the code used other than OpenSSL. If you modify file(s) with this
// exception, you may extend this exception to your version of the
// file(s), but you are not obligated to do so. If you do not wish to do
// so, delete this exception statement from your version. If you delete
// this exception statement from all source files in the program, then
// also delete it here.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.5
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml"
Page{
id:imageDialog
property var attachImageURLs: []
// property var contacts: []
// property var groups: []
// property var contact_allow:login.permissions[0]
// property var contact_deny:login.permissions[1]
// property var group_allow:login.permissions[2]
// property var group_deny:login.permissions[3]
property int imageNo: 0
function uploadImage(imageid){
if(imageUploadModel.get(imageid).uploaded==true){
imageNo=imageNo+1;
if(imageNo<imageUploadModel.count){
uploadImage(imageNo);
}
} else{
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setApi("/api/media/upload");
xhr.clearParams();
//if (group_allow.length>0) {xhr.setParam("group_allow", Helperjs.cleanArray(group_allow))};
//if (group_deny.length>0) {xhr.setParam("group_deny", Helperjs.cleanArray(group_deny))};
//if (contact_allow.length>0) {xhr.setParam("contact_allow", Helperjs.cleanArray(contact_allow))};
//if (contact_deny.length>0) {xhr.setParam("contact_deny", Helperjs.cleanArray(contact_deny))};
xhr.setImageFileParam("media", imageUploadModel.get(imageid).imageUrl);
xhr.setImageFileParam("angle", imageUploadModel.get(imageid).imageRotation);
xhr.post();
}
}
function updateAltText(imageid, media){print("media "+media + " alt_text "+imageUploadModel.get(imageid).description)
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setApi("/api/media/metadata/create");
xhr.clearParams();
xhr.setParam("JSON",JSON.stringify({media_id:media,alt_text:{text:imageUploadModel.get(imageid).description}}));
xhr.postJSON();
}
function attach(){
imagePicking=true;
var imagePicker = Qt.createQmlObject('import QtQuick 2.0; import "qrc:/qml/genericqml";'+
osSettings.imagePickQml+'{multiple : false;onReady: {'+
'attachImage(imageUrl)}}',imageDialog,"imagePicker");
imagePicker.pickImage()
}
function attachImage(url){
if (url.indexOf(",")>0){
let urlArray=url.split(",");
for (let file in urlArray){attachImage(urlArray[file])}
} else{
if(url!=""){
imageUploadModel.append({"imageUrl":url,"description":"","imageUploaded":false,"imageRotation":0})
}
}
}
y:1
width: messageColumn.width-1.5*root.fontFactor*osSettings.bigFontSize
height: 15*root.fontFactor*osSettings.bigFontSize//root.height/2-1.5*root.fontFactor*osSettings.bigFontSize
onVisibleChanged: {if (visible==false){
imageUploadModel.clear();
imageNo=0;
}}
Connections{
target:xhr
function onError(data,url,api,code){
print("error "+data);
}
function onSuccess(data,api){
if (api=="/api/media/upload" ){print("data "+data);
let obj=JSON.parse(data);
messageSend.media_ids.push(obj.media_id);
if(imageUploadModel.get(imageNo).description!==""){
try{
updateAltText(imageNo,obj.media_id_string)
}catch(e){}
}
else{
imageUploadModel.set(imageNo,{"imageUploaded":true});
imageNo=imageNo+1;
if(imageNo<imageUploadModel.count){
uploadImage(imageNo);
}
}
} else if(api=="/api/media/metadata/create"){
imageUploadModel.set(imageNo,{"imageUploaded":true});
imageNo=imageNo+1;
if(imageNo<imageUploadModel.count){
uploadImage(imageNo);
}
}
}
}
ListView{
id: imageUploadView
x: root.fontFactor*osSettings.bigFontSize
y: 0.5*root.fontFactor*osSettings.bigFontSize
width: imageDialog.width-1.5*root.fontFactor*osSettings.bigFontSize
height: parent.height -(3*root.fontFactor*osSettings.bigFontSize)
model: imageUploadModel
delegate: imageDelegate
footer: imageFooter
clip:true
orientation: ListView.Horizontal
spacing: mm
DropArea{
anchors.fill: parent
onDropped: {
if (drop.keys.includes('text/uri-list')){
var urllist=drop.text.split('\n');
for(var i=0;i< urllist.length;i++){
var droptext = urllist[i].replace(/(\r\n|\n|\r)/gm, ",");
attachImage(droptext)
}
}
}
}
}
BusyIndicator{
id: uploadBusy
running: false
anchors.horizontalCenter: imageUploadView.horizontalCenter
anchors.top:imageUploadView.top
anchors.topMargin: root.fontFactor*osSettings.bigFontSize
width: 2.5*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
}
ListModel{
id: imageUploadModel
}
Component{
id: imageDelegate
Rectangle{
width: Math.max(10*root.fontFactor*osSettings.bigFontSize,uploadImage.width)
height:imageUploadView.height-4*root.fontFactor*osSettings.bigFontSize
color: Material.backgroundColor
Image{
id: uploadImage
width: parent.width //root.width/2-mm
height: imageUploadView.height-(3*root.fontFactor*osSettings.bigFontSize+2*mm)
fillMode: Image.PreserveAspectFit
source:imageUrl
transform: Rotation {id:rotator; origin.x: uploadImage.width/2; origin.y: uploadImage.height/2; angle: imageRotation}
onVisibleChanged: descriptionInput.focus=true;
}
Rectangle{//rotation
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
visible: uploadImage.source!=""
anchors.bottom: uploadImage.bottom
anchors.right: uploadImage.right
color: "black"
opacity: 0.5
Text{anchors.centerIn:parent;text: "\uf01e";color: "white"}
MouseArea{
anchors.fill:parent;
onClicked:{
rotator.angle+=90;
imageRotation+=90
imageUploadModel.set(index,{"imageRotation":imageRotation});
}
}
}
Rectangle{//remove
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
visible: uploadImage.source!=""
anchors.bottom: uploadImage.bottom
anchors.left: uploadImage.left
color: "black"
opacity: 0.5
Text{anchors.centerIn:parent;text: "\uf00d";color: "white"}
MouseArea{
anchors.fill:parent;
onClicked:{
imageUploadModel.remove(index)
}
}
}
Text {
id:uploadedArrow
anchors.right:uploadImage.right
visible: imageUploaded
z:4
text: "\u2713"
width: root.fontFactor*osSettings.bigFontSize
anchors.top: parent.top
color: "green"
font.pointSize: 3*osSettings.bigFontSize
}
Rectangle{
id:descriptionRectangle
color: Material.backgroundColor
border.color: "grey"
anchors.top: uploadImage.bottom
anchors.topMargin: mm
width: parent.width //root.width/2-mm //Math.max(root.width/2-mm, descriptionInput.contentWidth);
height: 2.5*root.fontFactor*osSettings.bigFontSize //5*mm;
TextField{
id: descriptionInput
anchors.fill: parent
anchors.margins: 0.5*mm
font.pointSize: osSettings.systemFontSize
selectByMouse: true
placeholderText: qsTr("Description")
text:description!=""?description:""
onTextChanged: imageUploadModel.set(index,{"description":descriptionInput.text});
}
}
}
}
Component{
id: imageFooter
BlueButton{
width: 5*root.fontFactor*osSettings.bigFontSize
height:imageUploadView.height-3*root.fontFactor*osSettings.bigFontSize
color: Material.backgroundColor
text:"\u002b"
fontSize: 3*osSettings.bigFontSize
onClicked:{attach()}
}
}
Button{
id:uploadButton
height: 2*root.fontFactor*osSettings.bigFontSize
x: root.fontFactor*osSettings.bigFontSize
anchors.top:imageUploadView.bottom
anchors.topMargin: mm
text: qsTr("Upload")
font.pointSize: osSettings.bigFontSize
onClicked:{
{newimageProgress.visible=true;
if (imageUploadModel.count>0){
uploadImage(imageNo)
}}
}
}
ProgressBar{
id: newimageProgress
width: 5*root.fontFactor*osSettings.bigFontSize
height: root.fontFactor*osSettings.systemFontSize//buttonRow.height
anchors.top: parent.top
visible: false
value: imageNo/imageUploadModel.count
}
}

View file

@ -38,20 +38,20 @@ import "qrc:/js/helper.js" as Helperjs
import "qrc:/js/smiley.js" as Smileyjs
import "qrc:/js/news.js" as Newsjs
import "qrc:/qml/genericqml"
import "qrc:/qml/newsqml"
Rectangle{
color:Material.dialogColor
width:parent.width
height: conversation || (newsSwipeview.stacktype!="Notifications")?messageColumn.height+2*mm:0
height: messageColumn.height+2*mm
id:messageSend
visible:conversation || (newsSwipeview.stacktype!="Notifications")||(newstab.newstabstatus!="Search")?true:false
visible:conversation || (newstab.newstabstatus!="Search")?true:false
property string parentId: ""
property bool textfocus: false
property bool conversation: false
property string reply_to_user:""
property alias bodyMessage: bodyField.text
property var attachImageURLs: [];
property var media_ids:[]
property var contacts: []
property var groups: []
property var contact_allow:login.hasOwnProperty("permissions")?login.permissions[0]:[]
@ -66,11 +66,8 @@ Rectangle{
}
function sendUrls(urls){
if((urls.length==1 && attachImageURLs.length==0)){
attachImage(urls);
attachImageURLs.push(urls);
messageSend.state="active";
}
}
function sendtext(text){
@ -84,48 +81,36 @@ Rectangle{
}
function attachImage(url){
imageAttachment.source=url.toString();
if(url!=""){
imageUploadDialog.visible=true;
imageUploadDialog.attachImage(url)
}
}
function statusUpdate(title,status,in_reply_to_status_id,attachImageURL) {
function statusUpdate(title,status,in_reply_to_status_id) {
//xhr.url= login.server + "/api/statuses/update.json";
try{newsBusy.running=true;conversationBusy.running=true}catch(e){}
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
//if (in_reply_to_status_id==""){
xhr.setApi("/api/statuses/update");
xhr.clearParams();
xhr.setParam("source", "Friendiqa");
xhr.setParam("htmlstatus", status);
if (parentId!="") {xhr.setParam("in_reply_to_status_id", parentId)};
if (title!=="") {xhr.setParam("title", title)};
if (group_allow.length>0) {xhr.setParam("group_allow", Helperjs.cleanArray(group_allow))};
if (group_deny.length>0) {xhr.setParam("group_deny", Helperjs.cleanArray(group_deny))};
if (contact_allow.length>0) {xhr.setParam("contact_allow", Helperjs.cleanArray(contact_allow))};
if (contact_deny.length>0) {xhr.setParam("contact_deny", Helperjs.cleanArray(contact_deny))};
if (attachImageURL.length>0) {
for (var image in attachImageURL){
xhr.setImageFileParam("media", attachImageURL[image]);
xhr.setImageFileParam("angle", rotator.angle.toString());
}
}
xhr.post();
Newsjs.storeHashtags(login,db,status,root)
// }else {
// xhr.setApi("/api/v1/statuses");
// xhr.clearParams();
// xhr.setParam("status", status);
// xhr.setParam("in_reply_to_id", in_reply_to_status_id);
// xhr.post();
// Newsjs.storeHashtags(login,db,status,root)
// messageSend.destroy()
// }
messageSend.destroy()
xhr.setApi("/api/statuses/update");
xhr.clearParams();
xhr.setParam("source", "Friendiqa");
xhr.setParam("htmlstatus", status);
if (parentId!="") {xhr.setParam("in_reply_to_status_id", parentId)};
if (title!=="") {xhr.setParam("title", title)};
if (group_allow.length>0) {xhr.setParam("group_allow", Helperjs.cleanArray(group_allow))};
if (group_deny.length>0) {xhr.setParam("group_deny", Helperjs.cleanArray(group_deny))};
if (contact_allow.length>0) {xhr.setParam("contact_allow", Helperjs.cleanArray(contact_allow))};
if (contact_deny.length>0) {xhr.setParam("contact_deny", Helperjs.cleanArray(contact_deny))};
if (media_ids.length>0) {
xhr.setParam("media_ids", media_ids.join());
}
xhr.post();
Newsjs.storeHashtags(login,db,status,root)
}
function dmUpdate(title,text,replyto,screen_name,attachImageURL) {
function dmUpdate(title,text,replyto,screen_name) {
newsBusy.running=true;
//xhr.url= login.server + "/api/direct_messages/new.json";
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/direct_messages/new");
@ -133,7 +118,6 @@ Rectangle{
xhr.setParam("text", text);
xhr.setParam("screen_name", screen_name);
if (parentId!="") {xhr.setParam("replyto", replyto)};
//if (title!=="") {xhr.setParam("title", title)};
xhr.post();
}
@ -147,8 +131,6 @@ Rectangle{
messageSend.reply_to_user="";
messageSend.parentId="";
bodyField.text="";
attachImageURLs.pop();
imageAttachment.source=""
}
}
@ -183,9 +165,9 @@ Rectangle{
onDropped: {
if (messageSend.state==""){messageSend.state="active"}
if (drop.keys.includes('text/uri-list')){
var droptext = drop.text.replace(/(\r\n|\n|\r)/gm, "");
attachImageURLs.push(droptext);
attachImage(droptext)}
var droptext = drop.text.replace(/(\r\n|\n|\r)/gm, ",");
imageUploadDialog.visible=true;
attachImage(droptext)}
else if (drop.keys.includes('text/html')){
bodyField.append(drop.html)}
else if (drop.keys.includes('text/plain')){
@ -204,7 +186,35 @@ Rectangle{
horizontalAlignment:Text.AlignHCenter
text: !conversation &&newsSwipeview.stacktype?qsTr(newsSwipeview.stacktype):""
font.pointSize: osSettings.bigFontSize
}
BlueButton{
width: root.fontFactor*osSettings.bigFontSize
height:stackTypeDescription.height
anchors.left: stackTypeDescription.left
anchors.leftMargin: 2*root.fontFactor*osSettings.bigFontSize
visible: newsSwipeview.currentIndex!=0
text:"\uf053"
fontColor: Material.hintTextColor
border.color: "transparent"
color:"transparent"
radius:0
onClicked: {newsSwipeview.currentIndex=newsSwipeview.currentIndex-1}
}
BlueButton{
width: root.fontFactor*osSettings.bigFontSize
height:stackTypeDescription.height
anchors.right: stackTypeDescription.right
anchors.rightMargin: 2*root.fontFactor*osSettings.bigFontSize
visible: newsSwipeview.currentIndex!=newsSwipeview.length-1
text:"\uf054"
fontColor: Material.hintTextColor
border.color: "transparent"
color:"transparent"
radius:0
onClicked: {newsSwipeview.currentIndex=newsSwipeview.currentIndex+1}
}
}
TextArea{
id:receiverLabel
width: messageColumn.width
@ -222,7 +232,7 @@ Rectangle{
width: parent.width-mm
font.pointSize: osSettings.systemFontSize
placeholderText: qsTr("Title (optional)")
visible: false//(parentId === "") && (bodyField.length>1)
visible: false
onVisibleChanged: if ((visible==true)&&(conversation==true)){
conversationView.contentY=conversationView.contentY+titleField.height
}
@ -263,8 +273,9 @@ Rectangle{
onActiveFocusChanged:{
if (activeFocus==true){
if (messageSend.ListView.view==null){
if (newsitem.ListView.view==null){}
else {newsitem.ListView.view.contentY=newsitem.ListView.view.contentY+newsitem.height/2}
if ((typeof newsitem == 'undefined') || (newsitem.ListView.view==null)){}
else {
newsitem.ListView.view.contentY=newsitem.ListView.view.contentY+newsitem.height/2}
}
else if (conversation==true){
if(parentId==""){setParent(conversationModel.get(0).newsitemobject);}
@ -272,7 +283,7 @@ Rectangle{
try{conversationView.contentY=conversationView.contentY+20*mm}catch(e){}
} else if (textfocus==false){
messageSend.state="active";
newsView.positionViewAtBeginning();
messageSend.ListView.view.positionViewAtBeginning();
}
else{
messageSend.ListView.view.contentY=messageSend.ListView.view.contentY+8*mm
@ -301,8 +312,8 @@ Rectangle{
id:contactSelector
visible: false
z:3
x:2*root.fontFactor*osSettings.bigFontSize//8*mm
width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize//9*mm
x:2*root.fontFactor*osSettings.bigFontSize
width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize
height: messageSend.height/2
model:contactModel
function processContactSelection(contact){
@ -328,8 +339,8 @@ Rectangle{
id: tagSelector
visible: false
z:3
x:2*root.fontFactor*osSettings.bigFontSize//8*mm
width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize//9*mm
x:2*root.fontFactor*osSettings.bigFontSize
width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize
height: messageSend.height/2
model:tagModel
clip: true
@ -343,52 +354,11 @@ Rectangle{
}
ListModel{id:tagModel}
Item{
id:imageAttachment;
property alias source:realimage.source
//property alias angle:rotator.angle
visible: source!=""
width: 45*mm
height: 45*mm;
MouseArea{
anchors.fill: parent
onClicked: {
attachImageURLs.splice(attachImageURLs.indexOf(source),1);
imageAttachment.source=""
}
}
Image{id:realimage
source:"";
x:2*mm;
width: 45*mm;
height: source==""?0:45*mm;
fillMode: Image.PreserveAspectFit;
transform: Rotation {id:rotator; origin.x: 22.5*mm; origin.y: 22.5*mm; angle: 0}
}
Rectangle{
width: 5*mm
height: 5*mm
visible: imageAttachment.source!=""
anchors.bottom: imageAttachment.bottom
anchors.right: imageAttachment.right
color: "black"
opacity: 0.5
Text{anchors.centerIn:parent;text: "\uf01e";color: "white"}
MouseArea{
anchors.fill:parent;
onClicked:{
rotator.angle+=90;
}
}
}
}
Row{
id:buttonRow
visible:false //(bodyField.length>1)||(attachImageURLs.length>0)
visible:false
spacing: mm
height: 2.5*root.fontFactor*osSettings.bigFontSize//12*mm
height: 2.5*root.fontFactor*osSettings.bigFontSize
x: 0.5*mm
// MButton{id:permButton //Permissions not working in Friendica 02/2022
@ -398,25 +368,6 @@ Rectangle{
// text: ((contact_allow.length==0)&&(contact_deny.length==0)&&(group_allow.length==0)&&(group_deny.length==0))?"\uf09c":"\uf023"
// onClicked: { if (permissionDialog.visible==false){permissionDialog.visible=true} else{permissionDialog.visible=false}}
// }
MButton {
id: attachButton
height: 2*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
text: "\uf03e"
visible:(newsSwipeview.stacktype!="DirectMessages")
onClicked: {
if (attachImageURLs.length>0){//Server currently accepts only one attachment
Helperjs.showMessage( qsTr("Error"),qsTr("Only one attachment supported at the moment.\n Remove other attachment first!"), messageColumn)
}
else{
root.imagePicking=false;
var imagePicker = Qt.createQmlObject('import QtQuick 2.0; import "qrc:/qml/genericqml";'+
osSettings.imagePickQml+'{multiple : false;onReady: {attachImageURLs.push(imageUrl);'+
'attachImage(imageUrl)}}',root,"imagePicker");
imagePicker.pickImage()
}
}
}
MButton{
id:smileyButton
@ -433,6 +384,19 @@ Rectangle{
width: 2*root.fontFactor*osSettings.bigFontSize
onClicked: {if (tagSelector.visible==false){hashtagmenu()} else{tagSelector.visible=false}}
}
MButton{
id:imagesButton
visible:(newsSwipeview.stacktype!="DirectMessages")
text: "\uf03e"
height: 2*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
onClicked: {
if (imageUploadDialog.visible==false){
imageUploadDialog.visible=true;
imageUploadDialog.attach()
}
else{imageUploadDialog.visible=false}}
}
MButton {
id: cancelButton
@ -445,10 +409,11 @@ Rectangle{
bodyField.text="";
messageSend.state="";
permissionDialog.visible=false;
smileyDialog.visible=false;
imageUploadDialog.visible=false;
receiverLabel.visible=false;
reply_to_user="";
attachImage("");
attachImageURLs.pop();
media_ids=[]
}
}
}
@ -463,9 +428,9 @@ Rectangle{
var dmbody=bodyField.getText(0,bodyField.length);
if (conversation || newsSwipeview.stacktype!=="DirectMessages"){
if (parentId!=""){
statusUpdate(title,dmbody,parentId,attachImageURLs)
statusUpdate(title,dmbody,parentId)
}else{
statusUpdate(title,body,parentId,attachImageURLs)}
statusUpdate(title,body,parentId)}
}else {
if (reply_to_user!=""){dmUpdate(title,dmbody,parentId,reply_to_user)}
else{Helperjs.showMessage(qsTr("Error"),qsTr("No receiver supplied!"),root)}
@ -478,6 +443,7 @@ Rectangle{
}
PermissionDialog{id:permissionDialog;x:mm;visible: false}
SmileyDialog{id:smileyDialog;x:mm;visible: false}
MessageImageUploadDialog{id:imageUploadDialog;visible: false}
}
Component.onCompleted:{
root.replySignal.connect(setParent);
@ -497,7 +463,7 @@ Rectangle{
target: buttonRow; visible:true
}
PropertyChanges {
target: titleField; visible:(newsSwipeview.stacktype!="DirectMessages")//true
target: titleField; visible:(newsSwipeview.stacktype!="DirectMessages")
}
PropertyChanges {
target: receiverLabel; visible:(newsSwipeview.stacktype=="DirectMessages");

View file

@ -29,7 +29,7 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.11
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/js/news.js" as Newsjs
@ -51,9 +51,9 @@ Rectangle{
id: newsBusy
anchors.horizontalCenter: parent.horizontalCenter
anchors.top:parent.top
anchors.topMargin: 2*mm
width:10*mm
height: 10*mm
anchors.topMargin: mm
width: 2*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
z:2
running: false
}
@ -67,7 +67,8 @@ Rectangle{
try{ Newsjs.newsfromdb(root.db,root.login,0, function(dbnews,lastid){
lastnewsid=lastid;
showNews(dbnews)
})}catch(e){Helperjs.showMessage("Error",e,root)};
})}catch(e){//Helperjs.showMessage("Error",e,root)
};
break;
case "conversation":
newsStack.updateMethodNews="conversation";
@ -219,13 +220,30 @@ Rectangle{
Connections{
target:xhr
function onError(data,url,api,code){
if (data !="contactlist"){Helperjs.showMessage(qsTr("Network Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root);}
//if (data !="contactlist"){Helperjs.showMessage(qsTr("Network Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root);}
newsBusy.running=false;
}
function onSuccess(data,api){
// downloadNotice.text=downloadNotice.text+ "\n xhr finished "+Date.now();
Service.processNews(api,data)
replySignal("")
const newsApiArray=["/api/statuses/friends_timeline",
"/api/direct_messages/all",
"/api/direct_messages/conversation",
"/api/direct_messages/new",
"/api/friendica/notification",
"/api/statuses/user_timeline",
"/api/conversation/show",
"/api/search",
"/api/statuses/public_timeline",
"/api/favorites",
"/api/statuses/replies",
"/api/lists/statuses",
"/api/statuses/update",
"/api/direct_messages/new"
];
if(newsApiArray.includes(api)){
Service.processNews(api,data)
replySignal("")
}
}
}
@ -301,9 +319,7 @@ Rectangle{
anchors.margins: 0.5*mm
clip: true
spacing: 0
header:
MessageSend{id:messagesend;onHeightChanged: newsView.positionViewAtBeginning()}
header:MessageSend{id:messagesend;onHeightChanged: {if(state=="active"){newsView.positionViewAtBeginning()}}}
footer: footerComponent
model: newsModel
delegate: Newsitem{}
@ -349,6 +365,7 @@ Rectangle{
if (newsSwipeview.stacktype=="Home"){
Newsjs.getLastNews(root.login,root.db,function(currentlastnews){
//print("currentlastnews "+currentlastnews+ " lastnewsid "+lastnewsid)
if (currentlastnews>lastnewsid){
if(currentnewstabstatus=="Timeline"){
try{ Newsjs.newsfromdb(root.db,root.login,0, function(dbnews,lastid){
@ -361,7 +378,7 @@ Rectangle{
lastnewsid=lastid;
showNews(news)});
}
} else {
} else {
Service.updateView(currentnewstabstatus)
}
});

View file

@ -273,7 +273,7 @@ Item {
//Bottom row for buttons
Row{id:controlrow
anchors.top:friendicaActivities.bottom
height: root.fontFactor*osSettings.bigFontSize
height: 1.5*root.fontFactor*osSettings.bigFontSize
CheckBox{
id:likeCheckbox
width:newsitem.width/5
@ -281,12 +281,13 @@ Item {
visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false
checked:(model.newsitemobject.friendica_activities_view.self.liked==1)?true:false
indicator: Rectangle{
height: parent.height
implicitWidth: newsitem.width/5
implicitHeight:root.fontFactor*osSettings.bigFontSize
color:"transparent"
Text{
anchors.centerIn: parent
font.pointSize: osSettings.systemFontSize
font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name
color:likeCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor
text:likeCheckbox.checked?"\uf118"+"!":"\uf118"
@ -309,12 +310,13 @@ Item {
visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false
checked: (newsitemobject.friendica_activities_view.self.disliked==1)?true:false
indicator: Rectangle{
height: parent.height
implicitWidth: newsitem.width/5
implicitHeight:root.fontFactor*osSettings.bigFontSize
color:"transparent"
Text{
anchors.centerIn: parent
font.pointSize: osSettings.systemFontSize
font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name
color:dislikeCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor
text: dislikeCheckbox.checked?"\uf119"+"!":"\uf119"
@ -337,12 +339,13 @@ Item {
width: newsitem.width/5
height: parent.height
indicator:Rectangle{
height: parent.height
implicitWidth: newsitem.width/5
implicitHeight:root.fontFactor*osSettings.bigFontSize
color:"transparent"
Text{
anchors.centerIn: parent
font.pointSize: osSettings.systemFontSize
font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name
color: favoritedCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor
text:"\uf005"
@ -365,7 +368,7 @@ Item {
id:replysymbol
color: Material.secondaryTextColor
anchors.centerIn: parent
font.pointSize: osSettings.systemFontSize
font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name
text: "\uf112"
}
@ -398,7 +401,7 @@ Item {
id:newsmenusymbol
color: Material.secondaryTextColor
anchors.centerIn: parent
font.pointSize: osSettings.systemFontSize
font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name
text: "\uf142"
}
@ -429,6 +432,27 @@ Item {
})
}
}
Action {
text: qsTr("Block contact")
onTriggered: {
var component = Qt.createComponent("qrc:/qml/newsqml/BlockUser.qml");
var userblockdialog = component.createObject(root,{"newsitem": newsitemobject});
userblockdialog.open()
// try{
// var msg = {'deleteId': index, 'model': newsitem.ListView.view.model};
// conversationWorker.sendMessage(msg);
// }catch(e){print("block "+e)
// }
}
}
Action {
text: qsTr("Report contact")
onTriggered: {
var component = Qt.createComponent("qrc:/qml/newsqml/ReportUser.qml");
var userreportdialog = component.createObject(root,{"newsitem": newsitemobject});
userreportdialog.open()
}
}
Action {
text: qsTr("Conversation")
onTriggered: {
@ -450,6 +474,15 @@ Item {
Newsjs.favorite(login,false,newsitemobject.id,root);model.newsitemobject.favorited=0}
}
}
Action{
text:qsTr("Calendar Entry")
onTriggered:{
rootstack.currentIndex=3;
bar.currentIndex=3;
eventcreateSignal(newsitemobject);
}
}
Menu{
title: qsTr("Attending")
width: 10*root.fontFactor*osSettings.systemFontSize
@ -481,7 +514,7 @@ Item {
text: qsTr("Delete")
onTriggered: {
Newsjs.deleteNews(root.login,root.db,newsitemobject.id,newsitemobject.messagetype,root,function(reply){
var msg = {'deleteId': index, 'model': newsModel};
var msg = {'deleteId': index, 'model': newsitem.ListView.view.model};
newsWorker.sendMessage(msg);
})
}

View file

@ -0,0 +1,77 @@
// This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// In addition, as a special exception, the copyright holders give
// permission to link the code of portions of this program with the
// OpenSSL library under certain conditions as described in each
// individual source file, and distribute linked combinations including
// the two.
//
// You must obey the GNU General Public License in all respects for all
// of the code used other than OpenSSL. If you modify file(s) with this
// exception, you may extend this exception to your version of the
// file(s), but you are not obligated to do so. If you do not wish to do
// so, delete this exception statement from your version. If you delete
// this exception statement from all source files in the program, then
// also delete it here.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0
import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.12
import "qrc:/js/helper.js" as Helperjs
Dialog {
id: userReportkDialog
anchors.centerIn: parent
property var newsitem:({})
title: qsTr("Report contact?")
standardButtons: Dialog.Ok | Dialog.Cancel
modal: true
onAccepted: {
let statusArray=[];statusArray.push(newsitem.id.toString());
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setApi("/api/v1/reports");
xhr.clearParams();
xhr.setParam("account_id",newsitem.user.id);
//xhr.setParam("status_ids",JSON.stringify(statusArray));
xhr.setParam("comment",comment.text);
xhr.setParam("category",categoryCombo.currentText);
xhr.post();
}
onRejected: {close()}
Column{
height: nameLabel.height+comment.height+categoryCombo.height
Label {id:nameLabel;text: newsitem.user.name}
TextField {
id: comment
font.pointSize: osSettings.systemFontSize
selectByMouse: true
placeholderText: qsTr("comment")
}
ComboBox{
id: categoryCombo
width: 6*root.fontFactor*osSettings.bigFontSize
height: 1.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
model: [qsTr("illegal"),qsTr("spam"), qsTr("violation")]
}
}
}

View file

@ -79,9 +79,15 @@ Page{
function attachImage(url){
imageUploadModel.append({"imageUrl":url,"description":""})
if (url.indexOf(",")>0){
let urlArray=url.split(",");
for (let file in urlArray){attachImage(urlArray[file])}
} else{
if(url!=""){
imageUploadModel.append({"imageUrl":url,"description":"","imageUploaded":false,"imageRotation":0})
}
}
}
//border.color: "grey"
y:1
width:root.width-mm
@ -277,23 +283,18 @@ Page{
}
Component{
id: imageFooter
Image{
id: footerImage
height: root.width/4
width: root.width/4 //15*mm
//15*mm
fillMode: Image.PreserveAspectFit
source:"qrc:/images/addImage.png"
MouseArea{
anchors.fill: parent
onClicked:{
imagePicking=true;
var imagePicker = Qt.createQmlObject('import QtQuick 2.0; import "qrc:/qml/genericqml";'+
osSettings.imagePickQml+'{multiple : false;onReady: {attachImageURLs.push(imageUrl);'+
'attachImage(imageUrl)}}',imageDialog,"imagePicker");
imagePicker.pickImage()
}
}
BlueButton{
width: 5*root.fontFactor*osSettings.bigFontSize
height:imageUploadView.height-3*root.fontFactor*osSettings.bigFontSize
color: Material.backgroundColor
text:"\u002b"
fontSize: 3*osSettings.bigFontSize
onClicked:{
imagePicking=true;
var imagePicker = Qt.createQmlObject('import QtQuick 2.0; import "qrc:/qml/genericqml";'+
osSettings.imagePickQml+'{multiple : false;onReady: {'+
'attachImage(imageUrl)}}',imageDialog,"imagePicker");
imagePicker.pickImage()}
}
}

View file

@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="de">
<context>
<name>AcceptRules</name>
<message>
<source>Accept instance rules</source>
<translation>Bitte Instanzregeln akzeptieren</translation>
</message>
</context>
<context>
<name>AccountPage</name>
<message>
@ -57,7 +64,7 @@
</message>
<message>
<source>Wrong password!</source>
<translation>Falsches Passwort!</translation>
<translation type="vanished">Falsches Passwort!</translation>
</message>
<message>
<source>Success</source>
@ -75,6 +82,21 @@
<source>Conversations</source>
<translation type="vanished">Unterhaltungen</translation>
</message>
<message>
<source>Instance rules</source>
<translation>Server-Verhaltensregeln</translation>
</message>
<message>
<source>Wrong password or 2FA enabled!</source>
<translation>Falsches Passwort bzw. 2FA eingeschaltet!</translation>
</message>
</context>
<context>
<name>BlockUser</name>
<message>
<source>Block contact?</source>
<translation>Kontakt blockieren?</translation>
</message>
</context>
<context>
<name>CalendarTab</name>
@ -451,6 +473,14 @@
<source>Following</source>
<translation>Folgt</translation>
</message>
<message>
<source>Block</source>
<translation>Blockieren</translation>
</message>
<message>
<source>Unblock</source>
<translation>Entblocken</translation>
</message>
</context>
<context>
<name>ContactsSearchPage</name>
@ -661,6 +691,10 @@
<source>Location</source>
<translation type="vanished">Ort</translation>
</message>
<message>
<source>Delete Event?</source>
<translation>Termin löschen?</translation>
</message>
</context>
<context>
<name>EventListItem</name>
@ -683,6 +717,10 @@
<source>All</source>
<translation>Alle</translation>
</message>
<message>
<source>Blocked</source>
<translation>Geblockte</translation>
</message>
</context>
<context>
<name>FriendsTab</name>
@ -764,6 +802,17 @@
<translation>Schliessen</translation>
</message>
</context>
<context>
<name>MessageImageUploadDialog</name>
<message>
<source>Description</source>
<translation>Beschreibung</translation>
</message>
<message>
<source>Upload</source>
<translation>Hochladen</translation>
</message>
</context>
<context>
<name>MessageSend</name>
<message>
@ -789,7 +838,7 @@
<message>
<source>Only one attachment supported at the moment.
Remove other attachment first!</source>
<translation>Nur ein Anhang derzeit unterstützt.
<translation type="vanished">Nur ein Anhang derzeit unterstützt.
Lösche zuerst den anderen Anhang!</translation>
</message>
<message>
@ -808,7 +857,7 @@
<name>NewsStack</name>
<message>
<source>Network Error</source>
<translation>Netzwerk-Fehler</translation>
<translation type="vanished">Netzwerk-Fehler</translation>
</message>
<message>
<source>More</source>
@ -1032,6 +1081,18 @@
<source>External</source>
<translation>Webseite</translation>
</message>
<message>
<source>Block contact</source>
<translation>Kontakt blockieren</translation>
</message>
<message>
<source>Report contact</source>
<translation>Kontakt melden</translation>
</message>
<message>
<source>Calendar Entry</source>
<translation>Kalendereintrag</translation>
</message>
</context>
<context>
<name>PermissionDialog</name>
@ -1250,6 +1311,29 @@
<translation>Sonstige</translation>
</message>
</context>
<context>
<name>ReportUser</name>
<message>
<source>Report contact?</source>
<translation>Kontakt melden?</translation>
</message>
<message>
<source>comment</source>
<translation>Kommentar</translation>
</message>
<message>
<source>illegal</source>
<translation>illegal</translation>
</message>
<message>
<source>spam</source>
<translation>Spam</translation>
</message>
<message>
<source>violation</source>
<translation>Regelverletzung</translation>
</message>
</context>
<context>
<name>SmileyDialog</name>
<message>

View file

@ -1,12 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="es">
<context>
<name>AcceptRules</name>
<message>
<location filename="../qml/configqml/AcceptRules.qml" line="41"/>
<source>Accept instance rules</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AccountPage</name>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="64"/>
<location filename="../qml/configqml/AccountPage.qml" line="362"/>
<location filename="../qml/configqml/AccountPage.qml" line="383"/>
<location filename="../qml/configqml/AccountPage.qml" line="206"/>
<location filename="../qml/configqml/AccountPage.qml" line="228"/>
<location filename="../qml/configqml/AccountPage.qml" line="245"/>
<location filename="../qml/configqml/AccountPage.qml" line="306"/>
<location filename="../qml/configqml/AccountPage.qml" line="385"/>
<location filename="../qml/configqml/AccountPage.qml" line="406"/>
<source>User</source>
<translation>Usuario</translation>
</message>
@ -15,17 +27,17 @@
<translation type="vanished">Servidor</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="206"/>
<location filename="../qml/configqml/AccountPage.qml" line="229"/>
<source>Nickname</source>
<translation>Usuario</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="224"/>
<location filename="../qml/configqml/AccountPage.qml" line="248"/>
<source>Password</source>
<translation>Contraseña</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="231"/>
<location filename="../qml/configqml/AccountPage.qml" line="255"/>
<source>Image dir.</source>
<translation>Dir. de imágenes</translation>
</message>
@ -34,56 +46,65 @@
<translation type="vanished">Noticias como</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="210"/>
<location filename="../qml/configqml/AccountPage.qml" line="297"/>
<location filename="../qml/configqml/AccountPage.qml" line="328"/>
<location filename="../qml/configqml/AccountPage.qml" line="331"/>
<location filename="../qml/configqml/AccountPage.qml" line="208"/>
<source>Instance rules</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="233"/>
<location filename="../qml/configqml/AccountPage.qml" line="322"/>
<location filename="../qml/configqml/AccountPage.qml" line="351"/>
<location filename="../qml/configqml/AccountPage.qml" line="354"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="210"/>
<location filename="../qml/configqml/AccountPage.qml" line="233"/>
<source>Nicknames containing @ symbol currently not supported</source>
<translation>No se admiten los apodos que contienen el símbolo @ actualmente</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="280"/>
<location filename="../qml/configqml/AccountPage.qml" line="304"/>
<source>Confirm</source>
<translation>Confirmar</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="286"/>
<location filename="../qml/configqml/AccountPage.qml" line="311"/>
<source>No server given! </source>
<translation>¡Servidor no encontrado!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="287"/>
<location filename="../qml/configqml/AccountPage.qml" line="312"/>
<source>No nickname given! </source>
<translation>¡Usuario incorrecto!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="288"/>
<location filename="../qml/configqml/AccountPage.qml" line="313"/>
<source>No password given! </source>
<translation>¡Contraseña incorrecta!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="289"/>
<location filename="../qml/configqml/AccountPage.qml" line="314"/>
<source>No image directory given!</source>
<translation>¡No se ha encontrado el directorio de imágenes!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="297"/>
<location filename="../qml/configqml/AccountPage.qml" line="328"/>
<source>Wrong password!</source>
<translation>¡Contraseña incorrecta!</translation>
<location filename="../qml/configqml/AccountPage.qml" line="322"/>
<location filename="../qml/configqml/AccountPage.qml" line="351"/>
<source>Wrong password or 2FA enabled!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="325"/>
<source>Wrong password!</source>
<translation type="vanished">¡Contraseña incorrecta!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<source>Success</source>
<translation>éxito!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="325"/>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<source>Name</source>
<translation>Nombre</translation>
</message>
@ -96,20 +117,28 @@
<translation type="vanished">Conversaciones</translation>
</message>
</context>
<context>
<name>BlockUser</name>
<message>
<location filename="../qml/newsqml/BlockUser.qml" line="41"/>
<source>Block contact?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CalendarTab</name>
<message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="150"/>
<location filename="../qml/calendarqml/CalendarTab.qml" line="154"/>
<source>Delete Event?</source>
<translation>¿Borrar la cita?</translation>
</message>
<message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="198"/>
<location filename="../qml/calendarqml/CalendarTab.qml" line="201"/>
<source>Events</source>
<translation>Eventos</translation>
</message>
<message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="203"/>
<location filename="../qml/calendarqml/CalendarTab.qml" line="206"/>
<source>Own Calendar</source>
<translation>Calendario propio</translation>
</message>
@ -444,67 +473,77 @@
<translation type="vanished">Conectar</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="218"/>
<location filename="../qml/newsqml/ContactPage.qml" line="219"/>
<source>Approve</source>
<translation>Aprobar</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="232"/>
<location filename="../qml/newsqml/ContactPage.qml" line="234"/>
<source>Reject</source>
<translation>Rechazar</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="246"/>
<location filename="../qml/newsqml/ContactPage.qml" line="249"/>
<source>Ignore</source>
<translation>Ignorar</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="260"/>
<location filename="../qml/newsqml/ContactPage.qml" line="264"/>
<source>Follow</source>
<translation>Seguir</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="276"/>
<location filename="../qml/newsqml/ContactPage.qml" line="281"/>
<source>Unfollow</source>
<translation>Dejar de seguir</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="315"/>
<location filename="../qml/newsqml/ContactPage.qml" line="298"/>
<source>Block</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="313"/>
<source>Unblock</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<source>Description</source>
<translation>Descripción</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="315"/>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<source>Location</source>
<translation>Localización</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="315"/>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<source>Posts</source>
<translation>Mensajes</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="316"/>
<location filename="../qml/newsqml/ContactPage.qml" line="351"/>
<source>URL</source>
<translation>URL</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="317"/>
<location filename="../qml/newsqml/ContactPage.qml" line="352"/>
<source>Created at</source>
<translation>Creado en</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="318"/>
<location filename="../qml/newsqml/ContactPage.qml" line="353"/>
<source>Followers</source>
<translation>Seguidores</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="319"/>
<location filename="../qml/newsqml/ContactPage.qml" line="354"/>
<source>Following</source>
<translation>Siguiente</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="329"/>
<location filename="../qml/newsqml/ContactPage.qml" line="364"/>
<source>Network Error</source>
<translation>Fallo de red</translation>
</message>
@ -708,53 +747,53 @@
<context>
<name>EventCreate</name>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="73"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="78"/>
<source>Start</source>
<translation>Iniciar</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="140"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="143"/>
<source>End</source>
<translation>Finalizar</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="204"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="267"/>
<source>no end</source>
<translation>sin fin</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="289"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="292"/>
<source>Title (required)</source>
<translation>título (obligatorio)</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="304"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="307"/>
<source>Event description (optional)</source>
<translation>Descripción del evento (opcional)</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="314"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="318"/>
<source>Location (optional)</source>
<translation>Ubicación (opcional)</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="322"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="327"/>
<source>Publish event?</source>
<translation>¿Publicar el fecha?</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="341"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="342"/>
<source>Create event</source>
<translation>crear fecha</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="349"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="392"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="348"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="385"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="349"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="348"/>
<source>No event name supplied</source>
<translation>No se ha nombre de la fecha</translation>
</message>
@ -765,6 +804,11 @@
<source>Location</source>
<translation type="vanished">Localización</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventList.qml" line="73"/>
<source>Delete Event?</source>
<translation type="unfinished">¿Borrar la cita?</translation>
</message>
</context>
<context>
<name>EventListItem</name>
@ -777,21 +821,26 @@
<context>
<name>FriendsListTab</name>
<message>
<location filename="../qml/contactqml/FriendsListTab.qml" line="61"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="62"/>
<source>Friend Requests</source>
<translation>Solicitudes de contacto</translation>
</message>
<message>
<location filename="../qml/contactqml/FriendsListTab.qml" line="71"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="162"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="72"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="176"/>
<source>Friends</source>
<translation>Amigos</translation>
</message>
<message>
<location filename="../qml/contactqml/FriendsListTab.qml" line="162"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="176"/>
<source>All</source>
<translation>Todos</translation>
</message>
<message>
<location filename="../qml/contactqml/FriendsListTab.qml" line="176"/>
<source>Blocked</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FriendsTab</name>
@ -818,7 +867,7 @@
<context>
<name>ImageUploadDialog</name>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="127"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="133"/>
<source>Upload to album</source>
<translation>Subir álbum</translation>
</message>
@ -831,27 +880,27 @@
<translation type="vanished">imagen</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="271"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="277"/>
<source>Description</source>
<translation>Descripción</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="308"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="309"/>
<source>Upload</source>
<translation>Subir</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="308"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="309"/>
<source>Change</source>
<translation>Cambiar</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="311"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="312"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="311"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="312"/>
<source> No album name given</source>
<translation>¡Nombre del álbum no encontrado!</translation>
</message>
@ -874,43 +923,54 @@
<translation>Salida</translation>
</message>
</context>
<context>
<name>MessageImageUploadDialog</name>
<message>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="258"/>
<source>Description</source>
<translation type="unfinished">Descripción</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="284"/>
<source>Upload</source>
<translation type="unfinished">Subir</translation>
</message>
</context>
<context>
<name>MessageSend</name>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="211"/>
<location filename="../qml/newsqml/MessageSend.qml" line="219"/>
<source>to:</source>
<translation>a:</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="223"/>
<location filename="../qml/newsqml/MessageSend.qml" line="231"/>
<source>Title (optional)</source>
<translation>Título (opcional)</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="241"/>
<location filename="../qml/newsqml/MessageSend.qml" line="249"/>
<source> Drop your Content here.</source>
<translation> Deje caer su contenido aquí.</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="247"/>
<location filename="../qml/newsqml/MessageSend.qml" line="255"/>
<source>What&apos;s on your mind?</source>
<translation>¿Qué tienes en mente?</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="408"/>
<location filename="../qml/newsqml/MessageSend.qml" line="470"/>
<location filename="../qml/newsqml/MessageSend.qml" line="431"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="408"/>
<source>Only one attachment supported at the moment.
Remove other attachment first!</source>
<translation>Solo se admite adjuntar un solo archivo en este momento.
<translation type="vanished">Solo se admite adjuntar un solo archivo en este momento.
¡Elimine y deje un archivo adjunto!</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="470"/>
<location filename="../qml/newsqml/MessageSend.qml" line="431"/>
<source>No receiver supplied!</source>
<translation>No se ha suministrado ningún receptor!</translation>
</message>
@ -926,12 +986,11 @@
<context>
<name>NewsStack</name>
<message>
<location filename="../qml/newsqml/NewsStack.qml" line="222"/>
<source>Network Error</source>
<translation>Fallo de red</translation>
<translation type="vanished">Fallo de red</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsStack.qml" line="268"/>
<location filename="../qml/newsqml/NewsStack.qml" line="286"/>
<source>More</source>
<translation>Mas</translation>
</message>
@ -1132,57 +1191,72 @@
<translation type="vanished">Respuesta</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="439"/>
<location filename="../qml/newsqml/Newsitem.qml" line="463"/>
<source>DM</source>
<translation>Mensaje directo</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="425"/>
<location filename="../qml/newsqml/Newsitem.qml" line="428"/>
<source>Repost</source>
<translation>Volver a publicar</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="428"/>
<location filename="../qml/newsqml/Newsitem.qml" line="431"/>
<source>Success!</source>
<translation>éxito!</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="433"/>
<location filename="../qml/newsqml/Newsitem.qml" line="436"/>
<source>Block contact</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="449"/>
<source>Report contact</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="457"/>
<source>Conversation</source>
<translation>Conversación</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="445"/>
<location filename="../qml/newsqml/Newsitem.qml" line="469"/>
<source>Bookmark</source>
<translation>marca</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="454"/>
<location filename="../qml/newsqml/Newsitem.qml" line="478"/>
<source>Calendar Entry</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="487"/>
<source>Attending</source>
<translation>Asistiendo</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="464"/>
<location filename="../qml/newsqml/Newsitem.qml" line="497"/>
<source>yes</source>
<translation>si</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="469"/>
<location filename="../qml/newsqml/Newsitem.qml" line="502"/>
<source>maybe</source>
<translation>quizás</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="474"/>
<location filename="../qml/newsqml/Newsitem.qml" line="507"/>
<source>no</source>
<translation>no</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="481"/>
<location filename="../qml/newsqml/Newsitem.qml" line="514"/>
<source>Delete</source>
<translation>Borrar</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="497"/>
<location filename="../qml/newsqml/Newsitem.qml" line="530"/>
<source>External</source>
<translation>sitio web</translation>
</message>
@ -1203,28 +1277,28 @@
<context>
<name>PhotoTab</name>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="133"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="132"/>
<source>&apos;s images</source>
<translation>s Imágenes</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="220"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="219"/>
<source>All Images</source>
<translation>Todas las imagenes</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="226"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="225"/>
<source>Only new</source>
<translation>Solo nueva</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="242"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="247"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="241"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="246"/>
<source>Own Images</source>
<translation>Mis imágenes</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="289"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="288"/>
<source>More</source>
<translation>Mas</translation>
</message>
@ -1457,6 +1531,34 @@
<translation>Creado en</translation>
</message>
</context>
<context>
<name>ReportUser</name>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="41"/>
<source>Report contact?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="65"/>
<source>comment</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<source>illegal</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<source>spam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<source>violation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SmileyDialog</name>
<message>
@ -1553,14 +1655,14 @@
<translation type="vanished">Salida</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="176"/>
<location filename="../qml/friendiqa.qml" line="177"/>
<source>Background Sync
Rightclick or Middleclick to Quit</source>
<translation>Sincronización de fondo
Haga clic con el botón derecho del ratón o con el botón central para salir.</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="290"/>
<location filename="../qml/friendiqa.qml" line="294"/>
<source>Click to open Friendiqa</source>
<translation>Haga clic para abrir Friendiqa</translation>
</message>

View file

@ -1,12 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="hu">
<context>
<name>AcceptRules</name>
<message>
<location filename="../qml/configqml/AcceptRules.qml" line="41"/>
<source>Accept instance rules</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AccountPage</name>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="64"/>
<location filename="../qml/configqml/AccountPage.qml" line="362"/>
<location filename="../qml/configqml/AccountPage.qml" line="383"/>
<location filename="../qml/configqml/AccountPage.qml" line="206"/>
<location filename="../qml/configqml/AccountPage.qml" line="228"/>
<location filename="../qml/configqml/AccountPage.qml" line="245"/>
<location filename="../qml/configqml/AccountPage.qml" line="306"/>
<location filename="../qml/configqml/AccountPage.qml" line="385"/>
<location filename="../qml/configqml/AccountPage.qml" line="406"/>
<source>User</source>
<translation>Felhasználó</translation>
</message>
@ -15,17 +27,17 @@
<translation type="vanished">Kiszolgáló</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="206"/>
<location filename="../qml/configqml/AccountPage.qml" line="229"/>
<source>Nickname</source>
<translation>Becenév</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="224"/>
<location filename="../qml/configqml/AccountPage.qml" line="248"/>
<source>Password</source>
<translation>Jelszó</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="231"/>
<location filename="../qml/configqml/AccountPage.qml" line="255"/>
<source>Image dir.</source>
<translation>Képkönyvtár</translation>
</message>
@ -34,56 +46,65 @@
<translation type="vanished">Hírek mint</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="210"/>
<location filename="../qml/configqml/AccountPage.qml" line="297"/>
<location filename="../qml/configqml/AccountPage.qml" line="328"/>
<location filename="../qml/configqml/AccountPage.qml" line="331"/>
<location filename="../qml/configqml/AccountPage.qml" line="208"/>
<source>Instance rules</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="233"/>
<location filename="../qml/configqml/AccountPage.qml" line="322"/>
<location filename="../qml/configqml/AccountPage.qml" line="351"/>
<location filename="../qml/configqml/AccountPage.qml" line="354"/>
<source>Error</source>
<translation>Hiba</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="210"/>
<location filename="../qml/configqml/AccountPage.qml" line="233"/>
<source>Nicknames containing @ symbol currently not supported</source>
<translation>A @ szimbólumot tartalmazó becenevek jelenleg nem támogatottak</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="280"/>
<location filename="../qml/configqml/AccountPage.qml" line="304"/>
<source>Confirm</source>
<translation>Megerősítés</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="286"/>
<location filename="../qml/configqml/AccountPage.qml" line="311"/>
<source>No server given! </source>
<translation>Nincs kiszolgáló megadva! </translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="287"/>
<location filename="../qml/configqml/AccountPage.qml" line="312"/>
<source>No nickname given! </source>
<translation>Nincs becenév megadva! </translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="288"/>
<location filename="../qml/configqml/AccountPage.qml" line="313"/>
<source>No password given! </source>
<translation>Nincs jelszó megadva! </translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="289"/>
<location filename="../qml/configqml/AccountPage.qml" line="314"/>
<source>No image directory given!</source>
<translation>Nincs képkönyvtár megadva!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="297"/>
<location filename="../qml/configqml/AccountPage.qml" line="328"/>
<source>Wrong password!</source>
<translation>Hibás jelszó!</translation>
<location filename="../qml/configqml/AccountPage.qml" line="322"/>
<location filename="../qml/configqml/AccountPage.qml" line="351"/>
<source>Wrong password or 2FA enabled!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="325"/>
<source>Wrong password!</source>
<translation type="vanished">Hibás jelszó!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<source>Success</source>
<translation>Sikeres</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="325"/>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<source>Name</source>
<translation>Név</translation>
</message>
@ -96,20 +117,28 @@
<translation type="vanished">Beszélgetések</translation>
</message>
</context>
<context>
<name>BlockUser</name>
<message>
<location filename="../qml/newsqml/BlockUser.qml" line="41"/>
<source>Block contact?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CalendarTab</name>
<message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="150"/>
<location filename="../qml/calendarqml/CalendarTab.qml" line="154"/>
<source>Delete Event?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="198"/>
<location filename="../qml/calendarqml/CalendarTab.qml" line="201"/>
<source>Events</source>
<translation>Események</translation>
</message>
<message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="203"/>
<location filename="../qml/calendarqml/CalendarTab.qml" line="206"/>
<source>Own Calendar</source>
<translation>Saját naptár</translation>
</message>
@ -460,67 +489,77 @@
<translation type="vanished">Kapcsolódás</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="218"/>
<location filename="../qml/newsqml/ContactPage.qml" line="219"/>
<source>Approve</source>
<translation>Jóváhagyás</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="232"/>
<location filename="../qml/newsqml/ContactPage.qml" line="234"/>
<source>Reject</source>
<translation>Visszautasítás</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="246"/>
<location filename="../qml/newsqml/ContactPage.qml" line="249"/>
<source>Ignore</source>
<translation>Mellőzés</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="260"/>
<location filename="../qml/newsqml/ContactPage.qml" line="264"/>
<source>Follow</source>
<translation>Követés</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="276"/>
<location filename="../qml/newsqml/ContactPage.qml" line="281"/>
<source>Unfollow</source>
<translation>Követés megszüntetése</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="315"/>
<location filename="../qml/newsqml/ContactPage.qml" line="298"/>
<source>Block</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="313"/>
<source>Unblock</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<source>Description</source>
<translation>Leírás</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="315"/>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<source>Location</source>
<translation>Hely</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="315"/>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<source>Posts</source>
<translation>Bejegyzések</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="316"/>
<location filename="../qml/newsqml/ContactPage.qml" line="351"/>
<source>URL</source>
<translation>URL</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="317"/>
<location filename="../qml/newsqml/ContactPage.qml" line="352"/>
<source>Created at</source>
<translation>Létrehozva</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="318"/>
<location filename="../qml/newsqml/ContactPage.qml" line="353"/>
<source>Followers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="319"/>
<location filename="../qml/newsqml/ContactPage.qml" line="354"/>
<source>Following</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="329"/>
<location filename="../qml/newsqml/ContactPage.qml" line="364"/>
<source>Network Error</source>
<translation>Hálózati hiba</translation>
</message>
@ -724,53 +763,53 @@
<context>
<name>EventCreate</name>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="73"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="78"/>
<source>Start</source>
<translation type="unfinished">Indítás</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="140"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="143"/>
<source>End</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="204"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="267"/>
<source>no end</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="289"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="292"/>
<source>Title (required)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="304"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="307"/>
<source>Event description (optional)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="314"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="318"/>
<source>Location (optional)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="322"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="327"/>
<source>Publish event?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="341"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="342"/>
<source>Create event</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="349"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="392"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="348"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="385"/>
<source>Error</source>
<translation type="unfinished">Hiba</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="349"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="348"/>
<source>No event name supplied</source>
<translation type="unfinished"></translation>
</message>
@ -781,6 +820,11 @@
<source>Location</source>
<translation type="vanished">Hely</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventList.qml" line="73"/>
<source>Delete Event?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EventListItem</name>
@ -793,21 +837,26 @@
<context>
<name>FriendsListTab</name>
<message>
<location filename="../qml/contactqml/FriendsListTab.qml" line="61"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="62"/>
<source>Friend Requests</source>
<translation>Barátkérések</translation>
</message>
<message>
<location filename="../qml/contactqml/FriendsListTab.qml" line="71"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="162"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="72"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="176"/>
<source>Friends</source>
<translation>Ismerősök</translation>
</message>
<message>
<location filename="../qml/contactqml/FriendsListTab.qml" line="162"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="176"/>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/contactqml/FriendsListTab.qml" line="176"/>
<source>Blocked</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FriendsTab</name>
@ -845,7 +894,7 @@
<context>
<name>ImageUploadDialog</name>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="127"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="133"/>
<source>Upload to album</source>
<translation>Feltöltés albumba</translation>
</message>
@ -858,27 +907,27 @@
<translation type="vanished">Kép</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="271"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="277"/>
<source>Description</source>
<translation>Leírás</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="308"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="309"/>
<source>Upload</source>
<translation>Feltöltés</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="308"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="309"/>
<source>Change</source>
<translation>Változtatás</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="311"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="312"/>
<source>Error</source>
<translation>Hiba</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="311"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="312"/>
<source> No album name given</source>
<translation> Nincs albumnév megadva</translation>
</message>
@ -901,43 +950,54 @@
<translation>Kilépés</translation>
</message>
</context>
<context>
<name>MessageImageUploadDialog</name>
<message>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="258"/>
<source>Description</source>
<translation type="unfinished">Leírás</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="284"/>
<source>Upload</source>
<translation type="unfinished">Feltöltés</translation>
</message>
</context>
<context>
<name>MessageSend</name>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="211"/>
<location filename="../qml/newsqml/MessageSend.qml" line="219"/>
<source>to:</source>
<translation>címzett:</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="223"/>
<location filename="../qml/newsqml/MessageSend.qml" line="231"/>
<source>Title (optional)</source>
<translation>Cím (elhagyható)</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="241"/>
<location filename="../qml/newsqml/MessageSend.qml" line="249"/>
<source> Drop your Content here.</source>
<translation> Ejtse ide a tartalmat.</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="247"/>
<location filename="../qml/newsqml/MessageSend.qml" line="255"/>
<source>What&apos;s on your mind?</source>
<translation>Mire gondol?</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="408"/>
<location filename="../qml/newsqml/MessageSend.qml" line="470"/>
<location filename="../qml/newsqml/MessageSend.qml" line="431"/>
<source>Error</source>
<translation>Hiba</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="408"/>
<source>Only one attachment supported at the moment.
Remove other attachment first!</source>
<translation>Csak egyetlen melléklet támogatott jelenleg.
<translation type="vanished">Csak egyetlen melléklet támogatott jelenleg.
Először távolítsa el a másik mellékletet.</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="470"/>
<location filename="../qml/newsqml/MessageSend.qml" line="431"/>
<source>No receiver supplied!</source>
<translation>Nincs fogadó megadva!</translation>
</message>
@ -953,12 +1013,11 @@
<context>
<name>NewsStack</name>
<message>
<location filename="../qml/newsqml/NewsStack.qml" line="222"/>
<source>Network Error</source>
<translation>Hálózati hiba</translation>
<translation type="vanished">Hálózati hiba</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsStack.qml" line="268"/>
<location filename="../qml/newsqml/NewsStack.qml" line="286"/>
<source>More</source>
<translation>Több</translation>
</message>
@ -1163,57 +1222,72 @@
<translation type="vanished">Válasz</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="439"/>
<location filename="../qml/newsqml/Newsitem.qml" line="463"/>
<source>DM</source>
<translation>DM</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="425"/>
<location filename="../qml/newsqml/Newsitem.qml" line="428"/>
<source>Repost</source>
<translation>Újraküldés</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="428"/>
<location filename="../qml/newsqml/Newsitem.qml" line="431"/>
<source>Success!</source>
<translation>Sikeres!</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="433"/>
<location filename="../qml/newsqml/Newsitem.qml" line="436"/>
<source>Block contact</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="449"/>
<source>Report contact</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="457"/>
<source>Conversation</source>
<translation>Beszélgetés</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="445"/>
<location filename="../qml/newsqml/Newsitem.qml" line="469"/>
<source>Bookmark</source>
<translation>könyvjelző</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="454"/>
<location filename="../qml/newsqml/Newsitem.qml" line="478"/>
<source>Calendar Entry</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="487"/>
<source>Attending</source>
<translation>Részvétel</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="464"/>
<location filename="../qml/newsqml/Newsitem.qml" line="497"/>
<source>yes</source>
<translation>igen</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="469"/>
<location filename="../qml/newsqml/Newsitem.qml" line="502"/>
<source>maybe</source>
<translation>talán</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="474"/>
<location filename="../qml/newsqml/Newsitem.qml" line="507"/>
<source>no</source>
<translation>nem</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="481"/>
<location filename="../qml/newsqml/Newsitem.qml" line="514"/>
<source>Delete</source>
<translation>Törlés</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="497"/>
<location filename="../qml/newsqml/Newsitem.qml" line="530"/>
<source>External</source>
<translation>weboldal</translation>
</message>
@ -1234,28 +1308,28 @@
<context>
<name>PhotoTab</name>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="133"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="132"/>
<source>&apos;s images</source>
<translation> képei</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="220"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="219"/>
<source>All Images</source>
<translation>Összes kép</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="226"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="225"/>
<source>Only new</source>
<translation>Csak újak</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="242"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="247"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="241"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="246"/>
<source>Own Images</source>
<translation>Saját képek</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="289"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="288"/>
<source>More</source>
<translation>Több</translation>
</message>
@ -1488,6 +1562,34 @@
<translation>Létrehozva</translation>
</message>
</context>
<context>
<name>ReportUser</name>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="41"/>
<source>Report contact?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="65"/>
<source>comment</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<source>illegal</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<source>spam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<source>violation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SmileyDialog</name>
<message>
@ -1584,14 +1686,14 @@
<translation type="vanished">Kilépés</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="176"/>
<location filename="../qml/friendiqa.qml" line="177"/>
<source>Background Sync
Rightclick or Middleclick to Quit</source>
<translation>Háttérszinkronizálás
Kilépéshez kattintson a jobb gombbal vagy középső gombbal</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="290"/>
<location filename="../qml/friendiqa.qml" line="294"/>
<source>Click to open Friendiqa</source>
<translation>Kattintson a Friendiqa megnyitásához</translation>
</message>

View file

@ -1,12 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="it">
<context>
<name>AcceptRules</name>
<message>
<location filename="../qml/configqml/AcceptRules.qml" line="41"/>
<source>Accept instance rules</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AccountPage</name>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="64"/>
<location filename="../qml/configqml/AccountPage.qml" line="362"/>
<location filename="../qml/configqml/AccountPage.qml" line="383"/>
<location filename="../qml/configqml/AccountPage.qml" line="206"/>
<location filename="../qml/configqml/AccountPage.qml" line="228"/>
<location filename="../qml/configqml/AccountPage.qml" line="245"/>
<location filename="../qml/configqml/AccountPage.qml" line="306"/>
<location filename="../qml/configqml/AccountPage.qml" line="385"/>
<location filename="../qml/configqml/AccountPage.qml" line="406"/>
<source>User</source>
<translation>Utente</translation>
</message>
@ -15,17 +27,17 @@
<translation type="vanished">Server</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="206"/>
<location filename="../qml/configqml/AccountPage.qml" line="229"/>
<source>Nickname</source>
<translation>Utente</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="224"/>
<location filename="../qml/configqml/AccountPage.qml" line="248"/>
<source>Password</source>
<translation>Password</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="231"/>
<location filename="../qml/configqml/AccountPage.qml" line="255"/>
<source>Image dir.</source>
<translation>Directory immagini</translation>
</message>
@ -34,56 +46,65 @@
<translation type="vanished">News come</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="210"/>
<location filename="../qml/configqml/AccountPage.qml" line="297"/>
<location filename="../qml/configqml/AccountPage.qml" line="328"/>
<location filename="../qml/configqml/AccountPage.qml" line="331"/>
<location filename="../qml/configqml/AccountPage.qml" line="208"/>
<source>Instance rules</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="233"/>
<location filename="../qml/configqml/AccountPage.qml" line="322"/>
<location filename="../qml/configqml/AccountPage.qml" line="351"/>
<location filename="../qml/configqml/AccountPage.qml" line="354"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="210"/>
<location filename="../qml/configqml/AccountPage.qml" line="233"/>
<source>Nicknames containing @ symbol currently not supported</source>
<translation>I soprannomi contenenti il simbolo @ attualmente non sono supportati</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="280"/>
<location filename="../qml/configqml/AccountPage.qml" line="304"/>
<source>Confirm</source>
<translation>Conferma</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="286"/>
<location filename="../qml/configqml/AccountPage.qml" line="311"/>
<source>No server given! </source>
<translation>Nessun server inserito!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="287"/>
<location filename="../qml/configqml/AccountPage.qml" line="312"/>
<source>No nickname given! </source>
<translation>Nessun utente inserito!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="288"/>
<location filename="../qml/configqml/AccountPage.qml" line="313"/>
<source>No password given! </source>
<translation>Nessuna password inserita!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="289"/>
<location filename="../qml/configqml/AccountPage.qml" line="314"/>
<source>No image directory given!</source>
<translation>Nessuna directory immagini inserita!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="297"/>
<location filename="../qml/configqml/AccountPage.qml" line="328"/>
<source>Wrong password!</source>
<translation>Password sbagliata!</translation>
<location filename="../qml/configqml/AccountPage.qml" line="322"/>
<location filename="../qml/configqml/AccountPage.qml" line="351"/>
<source>Wrong password or 2FA enabled!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="325"/>
<source>Wrong password!</source>
<translation type="vanished">Password sbagliata!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<source>Success</source>
<translation>Ha funzionato!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="325"/>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<source>Name</source>
<translation>Nome</translation>
</message>
@ -96,20 +117,28 @@
<translation type="vanished">Conversazioni</translation>
</message>
</context>
<context>
<name>BlockUser</name>
<message>
<location filename="../qml/newsqml/BlockUser.qml" line="41"/>
<source>Block contact?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CalendarTab</name>
<message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="150"/>
<location filename="../qml/calendarqml/CalendarTab.qml" line="154"/>
<source>Delete Event?</source>
<translation>Cancellare la data?</translation>
</message>
<message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="198"/>
<location filename="../qml/calendarqml/CalendarTab.qml" line="201"/>
<source>Events</source>
<translation>Eventi</translation>
</message>
<message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="203"/>
<location filename="../qml/calendarqml/CalendarTab.qml" line="206"/>
<source>Own Calendar</source>
<translation>Calendario</translation>
</message>
@ -432,67 +461,77 @@
<translation type="vanished">Connetti</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="218"/>
<location filename="../qml/newsqml/ContactPage.qml" line="219"/>
<source>Approve</source>
<translation>Approvare</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="232"/>
<location filename="../qml/newsqml/ContactPage.qml" line="234"/>
<source>Reject</source>
<translation>Rifiutare</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="246"/>
<location filename="../qml/newsqml/ContactPage.qml" line="249"/>
<source>Ignore</source>
<translation>Ignorare</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="260"/>
<location filename="../qml/newsqml/ContactPage.qml" line="264"/>
<source>Follow</source>
<translation>Seguire</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="276"/>
<location filename="../qml/newsqml/ContactPage.qml" line="281"/>
<source>Unfollow</source>
<translation>Non seguire</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="315"/>
<location filename="../qml/newsqml/ContactPage.qml" line="298"/>
<source>Block</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="313"/>
<source>Unblock</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<source>Description</source>
<translation>Descrizione</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="315"/>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<source>Location</source>
<translation>Località</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="315"/>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<source>Posts</source>
<translation>Messaggi</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="316"/>
<location filename="../qml/newsqml/ContactPage.qml" line="351"/>
<source>URL</source>
<translation>URL</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="317"/>
<location filename="../qml/newsqml/ContactPage.qml" line="352"/>
<source>Created at</source>
<translation>Creato il</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="318"/>
<location filename="../qml/newsqml/ContactPage.qml" line="353"/>
<source>Followers</source>
<translation>Seguaci</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="319"/>
<location filename="../qml/newsqml/ContactPage.qml" line="354"/>
<source>Following</source>
<translation>Seguente</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="329"/>
<location filename="../qml/newsqml/ContactPage.qml" line="364"/>
<source>Network Error</source>
<translation>Errore di rete</translation>
</message>
@ -696,53 +735,53 @@
<context>
<name>EventCreate</name>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="73"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="78"/>
<source>Start</source>
<translation>Avviare</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="140"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="143"/>
<source>End</source>
<translation>Fine</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="204"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="267"/>
<source>no end</source>
<translation>senza fine</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="289"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="292"/>
<source>Title (required)</source>
<translation>Titolo (obbligatorio)</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="304"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="307"/>
<source>Event description (optional)</source>
<translation>descrizione della data (opzionale)</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="314"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="318"/>
<source>Location (optional)</source>
<translation>Posizione (opzionale)</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="322"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="327"/>
<source>Publish event?</source>
<translation>Pubblicare l&apos;evento?</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="341"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="342"/>
<source>Create event</source>
<translation>Creare l&apos;evento</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="349"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="392"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="348"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="385"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="349"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="348"/>
<source>No event name supplied</source>
<translation>Nessun nome di evento</translation>
</message>
@ -753,6 +792,11 @@
<source>Location</source>
<translation type="vanished">Località</translation>
</message>
<message>
<location filename="../qml/calendarqml/EventList.qml" line="73"/>
<source>Delete Event?</source>
<translation type="unfinished">Cancellare la data?</translation>
</message>
</context>
<context>
<name>EventListItem</name>
@ -765,21 +809,26 @@
<context>
<name>FriendsListTab</name>
<message>
<location filename="../qml/contactqml/FriendsListTab.qml" line="61"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="62"/>
<source>Friend Requests</source>
<translation>Richieste di contatto</translation>
</message>
<message>
<location filename="../qml/contactqml/FriendsListTab.qml" line="71"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="162"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="72"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="176"/>
<source>Friends</source>
<translation>Amici</translation>
</message>
<message>
<location filename="../qml/contactqml/FriendsListTab.qml" line="162"/>
<location filename="../qml/contactqml/FriendsListTab.qml" line="176"/>
<source>All</source>
<translation>Tutti</translation>
</message>
<message>
<location filename="../qml/contactqml/FriendsListTab.qml" line="176"/>
<source>Blocked</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FriendsTab</name>
@ -806,7 +855,7 @@
<context>
<name>ImageUploadDialog</name>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="127"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="133"/>
<source>Upload to album</source>
<translation>Carica su album</translation>
</message>
@ -819,27 +868,27 @@
<translation type="vanished">Immagine</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="271"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="277"/>
<source>Description</source>
<translation>Descrizione</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="308"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="309"/>
<source>Upload</source>
<translation>Carica</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="308"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="309"/>
<source>Change</source>
<translation>Modifica</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="311"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="312"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="311"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="312"/>
<source> No album name given</source>
<translation>Nessun nome album inserito!</translation>
</message>
@ -862,43 +911,54 @@
<translation>Chiudi</translation>
</message>
</context>
<context>
<name>MessageImageUploadDialog</name>
<message>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="258"/>
<source>Description</source>
<translation type="unfinished">Descrizione</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="284"/>
<source>Upload</source>
<translation type="unfinished">Carica</translation>
</message>
</context>
<context>
<name>MessageSend</name>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="211"/>
<location filename="../qml/newsqml/MessageSend.qml" line="219"/>
<source>to:</source>
<translation>a:</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="223"/>
<location filename="../qml/newsqml/MessageSend.qml" line="231"/>
<source>Title (optional)</source>
<translation>Titolo (opzionale)</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="241"/>
<location filename="../qml/newsqml/MessageSend.qml" line="249"/>
<source> Drop your Content here.</source>
<translation> Lascia qui il tuo contenuto.</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="247"/>
<location filename="../qml/newsqml/MessageSend.qml" line="255"/>
<source>What&apos;s on your mind?</source>
<translation>A cosa stai pensando?</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="408"/>
<location filename="../qml/newsqml/MessageSend.qml" line="470"/>
<location filename="../qml/newsqml/MessageSend.qml" line="431"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="408"/>
<source>Only one attachment supported at the moment.
Remove other attachment first!</source>
<translation>Solo un allegato è attualmente supportato.
<translation type="vanished">Solo un allegato è attualmente supportato.
Rimuovere prima gli altri allegati!</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="470"/>
<location filename="../qml/newsqml/MessageSend.qml" line="431"/>
<source>No receiver supplied!</source>
<translation>Nessun ricevitore in dotazione!</translation>
</message>
@ -914,12 +974,11 @@
<context>
<name>NewsStack</name>
<message>
<location filename="../qml/newsqml/NewsStack.qml" line="222"/>
<source>Network Error</source>
<translation>Errore di rete</translation>
<translation type="vanished">Errore di rete</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsStack.qml" line="268"/>
<location filename="../qml/newsqml/NewsStack.qml" line="286"/>
<source>More</source>
<translation>Ancora</translation>
</message>
@ -1108,57 +1167,72 @@
<translation type="vanished">Risposta</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="439"/>
<location filename="../qml/newsqml/Newsitem.qml" line="463"/>
<source>DM</source>
<translation>Messaggio diretto</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="425"/>
<location filename="../qml/newsqml/Newsitem.qml" line="428"/>
<source>Repost</source>
<translation>Condividi</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="428"/>
<location filename="../qml/newsqml/Newsitem.qml" line="431"/>
<source>Success!</source>
<translation>Ha funzionato!</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="433"/>
<location filename="../qml/newsqml/Newsitem.qml" line="436"/>
<source>Block contact</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="449"/>
<source>Report contact</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="457"/>
<source>Conversation</source>
<translation>Conversazione</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="445"/>
<location filename="../qml/newsqml/Newsitem.qml" line="469"/>
<source>Bookmark</source>
<translation>Segnalibro</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="454"/>
<location filename="../qml/newsqml/Newsitem.qml" line="478"/>
<source>Calendar Entry</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="487"/>
<source>Attending</source>
<translation>Attendi</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="464"/>
<location filename="../qml/newsqml/Newsitem.qml" line="497"/>
<source>yes</source>
<translation>si</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="469"/>
<location filename="../qml/newsqml/Newsitem.qml" line="502"/>
<source>maybe</source>
<translation>potrebbe</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="474"/>
<location filename="../qml/newsqml/Newsitem.qml" line="507"/>
<source>no</source>
<translation>no</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="481"/>
<location filename="../qml/newsqml/Newsitem.qml" line="514"/>
<source>Delete</source>
<translation>Cancella</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="497"/>
<location filename="../qml/newsqml/Newsitem.qml" line="530"/>
<source>External</source>
<translation>Sito web</translation>
</message>
@ -1179,28 +1253,28 @@
<context>
<name>PhotoTab</name>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="133"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="132"/>
<source>&apos;s images</source>
<translation> Immagini</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="220"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="219"/>
<source>All Images</source>
<translation>Tutte immagini</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="226"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="225"/>
<source>Only new</source>
<translation>Solo nuovo</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="242"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="247"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="241"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="246"/>
<source>Own Images</source>
<translation>Mie immagini</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="289"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="288"/>
<source>More</source>
<translation>Ancora</translation>
</message>
@ -1433,6 +1507,34 @@
<translation>Creato il</translation>
</message>
</context>
<context>
<name>ReportUser</name>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="41"/>
<source>Report contact?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="65"/>
<source>comment</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<source>illegal</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<source>spam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<source>violation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SmileyDialog</name>
<message>
@ -1529,14 +1631,14 @@
<translation type="vanished">Chiudi</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="176"/>
<location filename="../qml/friendiqa.qml" line="177"/>
<source>Background Sync
Rightclick or Middleclick to Quit</source>
<translation>Sincronizzazione dello sfondo
Fare clic con il tasto destro del mouse o con il tasto centrale per uscire</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="290"/>
<location filename="../qml/friendiqa.qml" line="294"/>
<source>Click to open Friendiqa</source>
<translation>Clicca per aprire Friendiqa</translation>
</message>