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 ## v0.6.6
* Create event * Create event

View file

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

View file

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

View file

@ -1,5 +1,5 @@
<?xml version="1.0"?> <?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"/> <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. <!-- 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 newstypeSignal(var type)
signal friendsSignal(var username) signal friendsSignal(var username)
signal contactdetailsSignal(var contact) signal contactdetailsSignal(var contact)
signal contactRefreshSignal()
signal searchSignal (var searchterm) signal searchSignal (var searchterm)
signal eventSignal(var contact) signal eventSignal(var contact)
signal eventcreateSignal(var event)
signal uploadSignal(var urls) signal uploadSignal(var urls)
signal sendtextSignal(var intenttext) signal sendtextSignal(var intenttext)
signal changeimage(var method, var type, var id) signal changeimage(var method, var type, var id)

View file

@ -252,5 +252,9 @@
<file>qml/contactqml/ContactsSearchPage.qml</file> <file>qml/contactqml/ContactsSearchPage.qml</file>
<file>images/Friendiqa.ico</file> <file>images/Friendiqa.ico</file>
<file>qml/calendarqml/EventCreate.qml</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> </qresource>
</RCC> </RCC>

View file

@ -307,7 +307,10 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname)
query.bindValue(5,newsitem["source"]); query.bindValue(5,newsitem["source"]);
query.bindValue(6,newsitem["id"].toInt()); 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());} 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( 9, newsitem["favorited"].toInt());
query.bindValue(10, newsitem["user"]["id"].toInt()); query.bindValue(10, newsitem["user"]["id"].toInt());
//if (newsitem["friendica_title"]!="") { //if (newsitem["friendica_title"]!="") {

View file

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

View file

@ -95,6 +95,7 @@ public slots:
void setImageFileParam(QString name, QString url); void setImageFileParam(QString name, QString url);
void clearParams(); void clearParams();
void post(); void post();
void postJSON();
void get(); void get();
void getlist(); void getlist();
void download(); void download();
@ -125,7 +126,7 @@ private:
int dlindex; int dlindex;
QNetworkAccessManager manager; QNetworkAccessManager manager;
QNetworkRequest request; //QNetworkRequest request;
QNetworkReply *reply; QNetworkReply *reply;
//QNetworkConfiguration nc; //QNetworkConfiguration nc;
QString bufferToString(); 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)); //print(api+JSON.stringify(login)+Qt.atob(login.password));
if (xhrequest.readyState === XMLHttpRequest.HEADERS_RECEIVED) { if (xhrequest.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
} else if(xhrequest.readyState === XMLHttpRequest.DONE) { } else if(xhrequest.readyState === XMLHttpRequest.DONE) {
try{ if (xhrequest.responseText!=""){print (xhrequest.responseText) try{ if (xhrequest.responseText!=""){//print (xhrequest.responseText)
callback(xhrequest.responseText) callback(xhrequest.responseText)
}else{//print("API:\n" +api+" NO RESPONSE"); }else{//print("API:\n" +api+" NO RESPONSE");
//showMessage("Error","API:\n" +api+" NO RESPONSE",rootwindow) //showMessage("Error","API:\n" +api+" NO RESPONSE",rootwindow)
@ -68,7 +68,8 @@ function friendicaPostRequest(login,api,data,method,rootwindow,callback) {
} }
catch (e){ catch (e){
print("API:\n" + api+" "+e+"\n Return:"+xhrequest.responseText); 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)); 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); function showMessage(header,message,rootwindow){//print(message);
var cleanmessage=message.replace(/"/g,"-"); var cleanmessage=message.replace(/"/g,"-");
if(cleanmessage.length>200){cleanmessage=cleanmessage.slice(0,200)+'...'} 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"); 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) { function dataRequest(login,photo,database,xhr,rootwindow) {
// check if image exist and call download function // check if image exist and call download function
Helperjs.friendicaRequest(login,"/api/friendica/photo?photo_id="+photo.id, rootwindow, function (image){ Helperjs.friendicaRequest(login,"/api/friendica/photo?photo_id="+photo.id, rootwindow, function (image){
if(image=="" || typeof(image)=="undefined"){currentimageno=currentimageno+1}else{ if(image=="" || typeof(image)=="undefined"){currentimageno=currentimageno+1}else{
try{ try{print("image "+ image)
var obj = JSON.parse(image); var obj = JSON.parse(image);
if (obj.hasOwnProperty('status')){ if (obj.hasOwnProperty('status')){
var helpfilename=photo.filename.substring(0,photo.filename.lastIndexOf(".")); var helpfilename=photo.filename.substring(0,photo.filename.lastIndexOf("."));
var filesuffix=""; 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 if (photo.type=="image/png"){filesuffix=".png"}
else {filesuffix=""} else {filesuffix=""}
if (helpfilename==""){// check if file has any filename if (helpfilename==""){// check if file has any filename
@ -86,7 +85,7 @@ function dataRequest(login,photo,database,xhr,rootwindow) {
}else{ }else{
var helpfilename=obj.filename.substring(0,obj.filename.lastIndexOf(".")); var helpfilename=obj.filename.substring(0,obj.filename.lastIndexOf("."));
var filesuffix=""; 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 if (obj.type=="image/png"){filesuffix=".png"}
else {filesuffix=""} else {filesuffix=""}
if (helpfilename==""){// check if file has any filename if (helpfilename==""){// check if file has any filename
@ -112,7 +111,7 @@ function dataRequest(login,photo,database,xhr,rootwindow) {
}} catch (e){ }} catch (e){
var helpfilename=photo.filename.substring(0,photo.filename.lastIndexOf(".")); var helpfilename=photo.filename.substring(0,photo.filename.lastIndexOf("."));
var filesuffix=""; 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 if (photo.type=="image/png"){filesuffix=".png"}
else {filesuffix=""} else {filesuffix=""}
if (helpfilename==""){// check if file has any filename if (helpfilename==""){// check if file has any filename

View file

@ -111,6 +111,21 @@ function listFriends(login,database,callback,filter,isFriend=0){
callback(contactlist) 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){ function listHashtags(login,database,callback){
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); 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.statusnet_html=Qt.atob(helpernews.statusnet_html);
helpernews.text=Qt.atob(helpernews.text); helpernews.text=Qt.atob(helpernews.text);
helpernews.id=helpernews.status_id; 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); helpernews.friendica_author=objFromArray(allcontacts,"url",helpernews.friendica_owner);
if (helpernews.attachments!="" && helpernews.attachments!==null){helpernews.attachments=JSON.parse(Qt.atob(helpernews.attachments))}; if (helpernews.attachments!="" && helpernews.attachments!==null){helpernews.attachments=JSON.parse(Qt.atob(helpernews.attachments))};
return helpernews return helpernews

View file

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

View file

@ -408,7 +408,7 @@ function cleanContacts(login,database,callback){
db.transaction( function(tx) { 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'); 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 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++){ for (var i=0;i<result.rows.length;i++){
filesystem.rmFile(result.rows.item(i).profile_image); 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+'"'); 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); usermessages.push(newslist.status);
newslist=usermessages; 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'){ else if (typeof(newslist)=='undefined'){
Helperjs.showMessage(qsTr("Undefined Array Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root) 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;} 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].friendica_author=cleanUser(newslist[n].friendica_author);
newslist[n].user=cleanUser(newslist[n].user); 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;} //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 //else{ //friendica_title also included in html
newslist[n].statusnet_html=newslist[n].friendica_html newslist[n].statusnet_html=newslist[n].friendica_html

View file

@ -85,6 +85,10 @@ Rectangle {
return events return events
} }
function createEvent(event){
rootstackView.push("qrc:/qml/calendarqml/EventCreate.qml",{"eventInformation": event})
}
BusyIndicator{ BusyIndicator{
id: calBusy id: calBusy
anchors.horizontalCenter: calendarView.horizontalCenter anchors.horizontalCenter: calendarView.horizontalCenter
@ -150,7 +154,7 @@ Rectangle {
title: qsTr("Delete Event?") title: qsTr("Delete Event?")
standardButtons: Dialog.Ok | Dialog.Cancel standardButtons: Dialog.Ok | Dialog.Cancel
modal: true modal: true
onAccepted: {//print("event.id"+event.id); onAccepted: {
xhr.setUrl(login.server); xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password)); xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setApi("/api/friendica/event_delete"); xhr.setApi("/api/friendica/event_delete");
@ -158,7 +162,7 @@ Rectangle {
xhr.setParam("id",eventid); xhr.setParam("id",eventid);
xhr.post(); xhr.post();
} }
onRejected: {print("eventid "+eventid);close()} onRejected: {close()}
} }
MButton{ MButton{
@ -200,7 +204,6 @@ Rectangle {
width: 20*root.fontFactor*osSettings.systemFontSize width: 20*root.fontFactor*osSettings.systemFontSize
MenuItem { MenuItem {
text: qsTr("Own Calendar") text: qsTr("Own Calendar")
//font.pixelSize: 3*mm
font.pointSize: osSettings.systemFontSize font.pointSize: osSettings.systemFontSize
onTriggered: { onTriggered: {
calendartab.calendartabstatus="Events"; calendartab.calendartabstatus="Events";
@ -284,6 +287,7 @@ Rectangle {
} }
Component.onCompleted: { Component.onCompleted: {
root.eventcreateSignal.connect(createEvent);
root.eventSignal.connect(showEvents); root.eventSignal.connect(showEvents);
if (calendartab.calendartabstatus=="Events"){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/genericqml"
import "qrc:/qml/calendarqml" import "qrc:/qml/calendarqml"
Rectangle{ Flickable{
id:eventCreateBox id:eventCreateBox
color: Material.backgroundColor
property date startDate: new Date() property date startDate: new Date()
property var eventInformation: ({})
anchors.fill: parent
contentWidth: eventRect.width; contentHeight: eventRect.height
function formatText(count, modelData) { function formatText(count, modelData) {
var data = count === 12 ? modelData + 1 : modelData; var data = count === 12 ? modelData + 1 : modelData;
return data.toString().length < 2 ? "0" + data : data; 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()}
} }
Label{ boundsBehavior:Flickable.StopAtBounds
x: 0.5*root.fontFactor*osSettings.bigFontSize ScrollBar.vertical: ScrollBar { }
y: 2*root.fontFactor*osSettings.bigFontSize Rectangle{
width: 3*root.fontFactor*osSettings.bigFontSize id: eventRect
height: root.fontFactor*osSettings.bigFontSize width: root.width
font.pointSize: osSettings.systemFontSize height: textColumn.height + 6*root.fontFactor*osSettings.bigFontSize
//verticalAlignment: TextInput.AlignBottom color: Material.backgroundColor
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
}
MButton{ MButton{
id:createEventButton id:closeButton
text: qsTr("Create event") anchors.top: parent.top
onClicked:{ anchors.topMargin: 1*mm
let startdatetext=textStartDate.getText(0,textStartDate.length); anchors.right: parent.right
let startdate=new Date(startdatetext.substring(6,10)+"-"+startdatetext.substring(3,5)+"-"+startdatetext.substring(0,2)+"T"+textStartTime.text) anchors.rightMargin: 1*mm
text: "\uf057"
onClicked:{rootstackView.pop()}
}
if (titleField.text==""){ Label{
Helperjs.showMessage(qsTr("Error"),qsTr("No event name supplied"),eventCreateBox) x: 0.5*root.fontFactor*osSettings.bigFontSize
}else{ 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 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) 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 { if (titleField.text==""){
id: tumblerDelegateComponent Helperjs.showMessage(qsTr("Error"),qsTr("No event name supplied"),eventCreateBox)
Label { }else{
text: formatText(Tumbler.tumbler.count, modelData) let startdatetext=textStartDate.getText(0,textStartDate.length);
opacity: 1.0 - Math.abs(Tumbler.displacement) / (Tumbler.tumbler.visibleItemCount / 2) let startdate=new Date(startdatetext.substring(6,10)+"-"+startdatetext.substring(3,5)+"-"+startdatetext.substring(0,2)+"T"+textStartTime.text)
color:Material.primaryTextColor eventCreateBusy.running=true;
horizontalAlignment: Text.AlignHCenter xhr.setLogin(login.username+":"+Qt.atob(login.password));
verticalAlignment: Text.AlignVCenter xhr.setUrl(login.server);
font.pointSize: osSettings.systemFontSize 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?") title: qsTr("Delete Event?")
standardButtons: Dialog.Ok | Dialog.Cancel standardButtons: Dialog.Ok | Dialog.Cancel
modal: true modal: true
onAccepted: {//print("event.id"+event.id); onAccepted: {
xhr.setUrl(login.server); xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password)); xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setApi("/api/friendica/event_delete"); xhr.setApi("/api/friendica/event_delete");
@ -81,7 +81,7 @@ Rectangle{
xhr.setParam("id",eventid); xhr.setParam("id",eventid);
xhr.post(); xhr.post();
} }
onRejected: {print("eventid "+eventid);close()} onRejected: {close()}
} }
ListView { ListView {

View file

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

View file

@ -43,7 +43,7 @@ Page{
font.pointSize: osSettings.systemFontSize font.pointSize: osSettings.systemFontSize
color:Material.primaryTextColor color:Material.primaryTextColor
wrapMode: Text.WrapAtWordBoundaryOrAnywhere 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>"+ "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>"+ "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>"+ "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.fillWidth:true
Layout.fillHeight: true Layout.fillHeight: true
property int currentContact: 0 property int currentContact: 0
signal contactRefreshSignal()
function showFriends(username){ function showFriends(username){
try {friendsModel.clear()} catch(e){}; try {friendsModel.clear()} catch(e){};
@ -86,6 +87,19 @@ Item{
},searchText.text,-1); },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{ Connections{
target:xhr target:xhr
function onDownloaded(type,url,filename,i){ function onDownloaded(type,url,filename,i){
@ -159,14 +173,18 @@ Item{
width: 6*root.fontFactor*osSettings.bigFontSize width: 6*root.fontFactor*osSettings.bigFontSize
height: 1.5*root.fontFactor*osSettings.bigFontSize height: 1.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize font.pointSize: osSettings.systemFontSize
model: [qsTr("Friends"), qsTr("All")] model: [qsTr("Friends"), qsTr("All"), qsTr("Blocked")]
onCurrentIndexChanged:{ onCurrentIndexChanged:{
if (currentIndex === 0) { if (currentIndex === 0) {
showFriends(root.login.username); showFriends(root.login.username);
} else{ } else
if (currentIndex===1){
showContacts() showContacts()
} else if (currentIndex===2){
showBlocked()
} }
} }
Component.onCompleted: {root.contactRefreshSignal.connect(onCurrentIndexChanged)}
} }

View file

@ -51,9 +51,6 @@ Item{
function updateGroup(login,database,group){ function updateGroup(login,database,group){
// update groups // 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=""; var api="";
if (group.new){api="/api/friendica/group_create.json?name="+group.name}else{api="/api/friendica/group_update.json?gid="+group.id} 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); xhr.setUrl(login.server);

View file

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

View file

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

View file

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

View file

@ -29,161 +29,180 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>. // 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 2.12
import QtQuick.Controls.Material 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/service.js" as Service
import "qrc:/js/helper.js" as Helperjs import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"
Rectangle{ Item{
id:imageDialog id:imageDialog
z:2 z:2
border.color: "grey" // border.color: "grey"
color: Material.backgroundColor // color: Material.backgroundColor
width: parent.width-4*mm // width: parent.width-root.fontFactor*osSettings.bigFontSize
height:parent.height-12*mm // height: parent.height-3*root.fontFactor*osSettings.bigFontSize
x:2*mm // x: 0.5*root.fontFactor*osSettings.bigFontSize
y:10*mm // y: 2*root.fontFactor*osSettings.bigFontSize
property string directory: "" property string directory: ""
property bool multiple: false property bool multiple: false
property string imageUrl: "" property string imageUrl: ""
property var imageUrls: [] //property var imageUrls: []
signal ready(); signal ready();
function pickImage() {} function pickImage() {imageFileDialog.open()}
Text{ // Text{
id:directoryText // id:directoryText
x:0.5*mm // anchors.bottom: parent.bottom
y:0.5*mm //// x:0.5*mm
width: imageDialog.width-15*mm //// y:0.5*mm
height:contentHeight // width: imageDialog.width-3.5*root.fontFactor*osSettings.bigFontSize
wrapMode: Text.Wrap // height:contentHeight
text: directory // font.pointSize: osSettings.bigFontSize
} // wrapMode: Text.Wrap
Button{ // text: directory
id:closeButton // color: Material.primaryTextColor
height: 3*root.fontFactor*osSettings.bigFontSize // }
anchors.top: parent.top // Button{
anchors.topMargin: 0.5*mm // id:closeButton
anchors.right: parent.right // height: 2*root.fontFactor*osSettings.bigFontSize
anchors.rightMargin: 1*mm // anchors.top: parent.top
text: "\uf057" // anchors.topMargin: 0.5*mm
onClicked:{ready();imageDialog.destroy()} // 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 { // FolderListModel{
id: imageView // id: imageModel
x:0.5*mm // nameFilters: ["*.png", "*.jpg",".jpeg","*.JPG","*.gif"]
y: Math.max(directoryText.height, closeButton.height)+mm // sortField: FolderListModel.Time
width: imageDialog.width-2*mm // sortReversed:false
height: imageDialog.height-imageView.y-4*mm // showDotAndDotDot: true
clip: true // showDirs: true
model: imageModel // showDirsFirst: true
delegate: imageItem // folder:directory
} // }
FolderListModel{ // BusyIndicator{
id: imageModel // id: imageBusy
nameFilters: ["*.png", "*.jpg",".jpeg","*.JPG","*.gif"] // anchors.horizontalCenter: imageView.horizontalCenter
sortField: FolderListModel.Time // anchors.top:imageView.top
sortReversed:false // anchors.topMargin: 2*mm
showDotAndDotDot: true // width: 2*root.fontFactor*osSettings.bigFontSize
showDirs: true // height: 2*root.fontFactor*osSettings.bigFontSize
showDirsFirst: true // running:false
folder:directory // }
}
BusyIndicator{ // Component{
id: imageBusy // id:imageItem
anchors.horizontalCenter: imageView.horizontalCenter // Item{
anchors.top:imageView.top // width:imageView.width
anchors.topMargin: 2*mm // height: Math.max(fileImage.height,1.5*root.fontFactor*osSettings.bigFontSize)+2*mm
width:10*mm // Rectangle{
height: 10*mm // id:imagetextRectangle
running:false // 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{ // Image{id:fileImage
id:imageItem // width: imageView.width-mm
Item{ // fillMode:Image.PreserveAspectFit
width:imageView.width // source:fileIsDir?"":fileURL
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:folderImage // MouseArea{
width: fileIsDir?10*mm: imageView.width-mm // anchors.fill: parent
fillMode:Image.PreserveAspectFit // onClicked:{
source:fileIsDir?"qrc:/images/folder-blue.png":fileURL // 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 // imageUrl=fileURL
onClicked:{ // }
if (fileName==".."){ // }
imageModel.folder=imageModel.parentFolder; // }
directory=imageModel.parentFolder // }
} // }
else if (fileIsDir){ // }
imageModel.folder=fileURL; // Component.onCompleted: imageFileDialog.open()
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
}
}
}
}
}
}
} }

View file

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

View file

@ -15,7 +15,6 @@ Item {
function startSyncTimer(interval){ function startSyncTimer(interval){
syncTimer.interval=interval*60000; syncTimer.interval=interval*60000;
//print("synctimer interval "+syncTimer.interval)
syncTimer.start() 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{ BusyIndicator{
id: contactBusy id: contactBusy
anchors.centerIn:parent anchors.centerIn:parent
width:10*mm width: 1.5*root.fontFactor*osSettings.bigFontSize
height: 10*mm height: 1.5*root.fontFactor*osSettings.bigFontSize
running: true running: true
} }
@ -159,6 +159,7 @@ Page {
function onProfileimagesourceChanged(){profileImage.source=profileimagesource} function onProfileimagesourceChanged(){profileImage.source=profileimagesource}
} }
} }
Flow{id:buttonflow Flow{id:buttonflow
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: mm anchors.rightMargin: mm
@ -222,6 +223,7 @@ Page {
}) })
Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){},"id", contact.id) Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){},"id", contact.id)
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)} //if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop() rootstackView.pop()
} }
} }
@ -236,6 +238,7 @@ Page {
}) })
Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){},"id", contact.id) Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){},"id", contact.id)
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)} //if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop() rootstackView.pop()
} }
} }
@ -250,6 +253,7 @@ Page {
}); });
Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){},"id", contact.id) Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){},"id", contact.id)
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)} //if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop() rootstackView.pop()
} }
} }
@ -264,6 +268,7 @@ Page {
}); });
Helperjs.updateData(root.db,"contacts",root.login.username,"isFriend",1,function(){},"id",contact.id) 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)} //if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
rootstackView.pop() rootstackView.pop()
} }
@ -281,10 +286,40 @@ Page {
}); });
Helperjs.updateData(root.db,"contacts",root.login.username,"isFriend",0,function(){},"id",contact.id) Helperjs.updateData(root.db,"contacts",root.login.username,"isFriend",0,function(){},"id",contact.id)
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)} //if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop() 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 }//Flow end
Label { Label {
@ -370,9 +405,6 @@ Page {
xhr.clearParams(); xhr.clearParams();
xhr.setLogin(login.username+":"+Qt.atob(login.password)); xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server); 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.setApi("/api/statuses/user_timeline")
xhr.setParam("user_id",contact.id) xhr.setParam("user_id",contact.id)
xhr.get(); xhr.get();

View file

@ -104,9 +104,9 @@ Page {
id: conversationBusy id: conversationBusy
anchors.horizontalCenter: conversationView.horizontalCenter anchors.horizontalCenter: conversationView.horizontalCenter
anchors.top:conversationView.top anchors.top:conversationView.top
anchors.topMargin: 2*mm anchors.topMargin: mm
width:10*mm width: 2*root.fontFactor*osSettings.bigFontSize
height: 10*mm height: 2*root.fontFactor*osSettings.bigFontSize
running: true 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/smiley.js" as Smileyjs
import "qrc:/js/news.js" as Newsjs import "qrc:/js/news.js" as Newsjs
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"
import "qrc:/qml/newsqml"
Rectangle{ Rectangle{
color:Material.dialogColor color:Material.dialogColor
width:parent.width width:parent.width
height: conversation || (newsSwipeview.stacktype!="Notifications")?messageColumn.height+2*mm:0 height: messageColumn.height+2*mm
id:messageSend id:messageSend
visible:conversation || (newsSwipeview.stacktype!="Notifications")||(newstab.newstabstatus!="Search")?true:false visible:conversation || (newstab.newstabstatus!="Search")?true:false
property string parentId: "" property string parentId: ""
property bool textfocus: false property bool textfocus: false
property bool conversation: false property bool conversation: false
property string reply_to_user:"" property string reply_to_user:""
property alias bodyMessage: bodyField.text property alias bodyMessage: bodyField.text
property var attachImageURLs: []; property var media_ids:[]
property var contacts: [] property var contacts: []
property var groups: [] property var groups: []
property var contact_allow:login.hasOwnProperty("permissions")?login.permissions[0]:[] property var contact_allow:login.hasOwnProperty("permissions")?login.permissions[0]:[]
@ -66,11 +66,8 @@ Rectangle{
} }
function sendUrls(urls){ function sendUrls(urls){
if((urls.length==1 && attachImageURLs.length==0)){
attachImage(urls); attachImage(urls);
attachImageURLs.push(urls);
messageSend.state="active"; messageSend.state="active";
}
} }
function sendtext(text){ function sendtext(text){
@ -84,48 +81,36 @@ Rectangle{
} }
function attachImage(url){ 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"; //xhr.url= login.server + "/api/statuses/update.json";
try{newsBusy.running=true;conversationBusy.running=true}catch(e){} try{newsBusy.running=true;conversationBusy.running=true}catch(e){}
xhr.setLogin(login.username+":"+Qt.atob(login.password)); xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server); xhr.setUrl(login.server);
//if (in_reply_to_status_id==""){ xhr.setApi("/api/statuses/update");
xhr.setApi("/api/statuses/update"); xhr.clearParams();
xhr.clearParams(); xhr.setParam("source", "Friendiqa");
xhr.setParam("source", "Friendiqa"); xhr.setParam("htmlstatus", status);
xhr.setParam("htmlstatus", status); if (parentId!="") {xhr.setParam("in_reply_to_status_id", parentId)};
if (parentId!="") {xhr.setParam("in_reply_to_status_id", parentId)}; if (title!=="") {xhr.setParam("title", title)};
if (title!=="") {xhr.setParam("title", title)}; if (group_allow.length>0) {xhr.setParam("group_allow", Helperjs.cleanArray(group_allow))};
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 (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_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 (contact_deny.length>0) {xhr.setParam("contact_deny", Helperjs.cleanArray(contact_deny))}; if (media_ids.length>0) {
if (attachImageURL.length>0) { xhr.setParam("media_ids", media_ids.join());
for (var image in attachImageURL){ }
xhr.setImageFileParam("media", attachImageURL[image]); xhr.post();
xhr.setImageFileParam("angle", rotator.angle.toString()); Newsjs.storeHashtags(login,db,status,root)
}
}
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()
} }
function dmUpdate(title,text,replyto,screen_name,attachImageURL) { function dmUpdate(title,text,replyto,screen_name) {
newsBusy.running=true; newsBusy.running=true;
//xhr.url= login.server + "/api/direct_messages/new.json";
xhr.setLogin(login.username+":"+Qt.atob(login.password)); xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server); xhr.setUrl(login.server);
xhr.setApi("/api/direct_messages/new"); xhr.setApi("/api/direct_messages/new");
@ -133,7 +118,6 @@ Rectangle{
xhr.setParam("text", text); xhr.setParam("text", text);
xhr.setParam("screen_name", screen_name); xhr.setParam("screen_name", screen_name);
if (parentId!="") {xhr.setParam("replyto", replyto)}; if (parentId!="") {xhr.setParam("replyto", replyto)};
//if (title!=="") {xhr.setParam("title", title)};
xhr.post(); xhr.post();
} }
@ -147,8 +131,6 @@ Rectangle{
messageSend.reply_to_user=""; messageSend.reply_to_user="";
messageSend.parentId=""; messageSend.parentId="";
bodyField.text=""; bodyField.text="";
attachImageURLs.pop();
imageAttachment.source=""
} }
} }
@ -183,9 +165,9 @@ Rectangle{
onDropped: { onDropped: {
if (messageSend.state==""){messageSend.state="active"} if (messageSend.state==""){messageSend.state="active"}
if (drop.keys.includes('text/uri-list')){ if (drop.keys.includes('text/uri-list')){
var droptext = drop.text.replace(/(\r\n|\n|\r)/gm, ""); var droptext = drop.text.replace(/(\r\n|\n|\r)/gm, ",");
attachImageURLs.push(droptext); imageUploadDialog.visible=true;
attachImage(droptext)} attachImage(droptext)}
else if (drop.keys.includes('text/html')){ else if (drop.keys.includes('text/html')){
bodyField.append(drop.html)} bodyField.append(drop.html)}
else if (drop.keys.includes('text/plain')){ else if (drop.keys.includes('text/plain')){
@ -204,7 +186,35 @@ Rectangle{
horizontalAlignment:Text.AlignHCenter horizontalAlignment:Text.AlignHCenter
text: !conversation &&newsSwipeview.stacktype?qsTr(newsSwipeview.stacktype):"" text: !conversation &&newsSwipeview.stacktype?qsTr(newsSwipeview.stacktype):""
font.pointSize: osSettings.bigFontSize 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{ TextArea{
id:receiverLabel id:receiverLabel
width: messageColumn.width width: messageColumn.width
@ -222,7 +232,7 @@ Rectangle{
width: parent.width-mm width: parent.width-mm
font.pointSize: osSettings.systemFontSize font.pointSize: osSettings.systemFontSize
placeholderText: qsTr("Title (optional)") placeholderText: qsTr("Title (optional)")
visible: false//(parentId === "") && (bodyField.length>1) visible: false
onVisibleChanged: if ((visible==true)&&(conversation==true)){ onVisibleChanged: if ((visible==true)&&(conversation==true)){
conversationView.contentY=conversationView.contentY+titleField.height conversationView.contentY=conversationView.contentY+titleField.height
} }
@ -263,8 +273,9 @@ Rectangle{
onActiveFocusChanged:{ onActiveFocusChanged:{
if (activeFocus==true){ if (activeFocus==true){
if (messageSend.ListView.view==null){ if (messageSend.ListView.view==null){
if (newsitem.ListView.view==null){} if ((typeof newsitem == 'undefined') || (newsitem.ListView.view==null)){}
else {newsitem.ListView.view.contentY=newsitem.ListView.view.contentY+newsitem.height/2} else {
newsitem.ListView.view.contentY=newsitem.ListView.view.contentY+newsitem.height/2}
} }
else if (conversation==true){ else if (conversation==true){
if(parentId==""){setParent(conversationModel.get(0).newsitemobject);} if(parentId==""){setParent(conversationModel.get(0).newsitemobject);}
@ -272,7 +283,7 @@ Rectangle{
try{conversationView.contentY=conversationView.contentY+20*mm}catch(e){} try{conversationView.contentY=conversationView.contentY+20*mm}catch(e){}
} else if (textfocus==false){ } else if (textfocus==false){
messageSend.state="active"; messageSend.state="active";
newsView.positionViewAtBeginning(); messageSend.ListView.view.positionViewAtBeginning();
} }
else{ else{
messageSend.ListView.view.contentY=messageSend.ListView.view.contentY+8*mm messageSend.ListView.view.contentY=messageSend.ListView.view.contentY+8*mm
@ -301,8 +312,8 @@ Rectangle{
id:contactSelector id:contactSelector
visible: false visible: false
z:3 z:3
x:2*root.fontFactor*osSettings.bigFontSize//8*mm x:2*root.fontFactor*osSettings.bigFontSize
width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize//9*mm width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize
height: messageSend.height/2 height: messageSend.height/2
model:contactModel model:contactModel
function processContactSelection(contact){ function processContactSelection(contact){
@ -328,8 +339,8 @@ Rectangle{
id: tagSelector id: tagSelector
visible: false visible: false
z:3 z:3
x:2*root.fontFactor*osSettings.bigFontSize//8*mm x:2*root.fontFactor*osSettings.bigFontSize
width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize//9*mm width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize
height: messageSend.height/2 height: messageSend.height/2
model:tagModel model:tagModel
clip: true clip: true
@ -343,52 +354,11 @@ Rectangle{
} }
ListModel{id:tagModel} 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{ Row{
id:buttonRow id:buttonRow
visible:false //(bodyField.length>1)||(attachImageURLs.length>0) visible:false
spacing: mm spacing: mm
height: 2.5*root.fontFactor*osSettings.bigFontSize//12*mm height: 2.5*root.fontFactor*osSettings.bigFontSize
x: 0.5*mm x: 0.5*mm
// MButton{id:permButton //Permissions not working in Friendica 02/2022 // 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" // 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}} // 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{ MButton{
id:smileyButton id:smileyButton
@ -433,6 +384,19 @@ Rectangle{
width: 2*root.fontFactor*osSettings.bigFontSize width: 2*root.fontFactor*osSettings.bigFontSize
onClicked: {if (tagSelector.visible==false){hashtagmenu()} else{tagSelector.visible=false}} 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 { MButton {
id: cancelButton id: cancelButton
@ -445,10 +409,11 @@ Rectangle{
bodyField.text=""; bodyField.text="";
messageSend.state=""; messageSend.state="";
permissionDialog.visible=false; permissionDialog.visible=false;
smileyDialog.visible=false;
imageUploadDialog.visible=false;
receiverLabel.visible=false; receiverLabel.visible=false;
reply_to_user=""; reply_to_user="";
attachImage(""); media_ids=[]
attachImageURLs.pop();
} }
} }
} }
@ -463,9 +428,9 @@ Rectangle{
var dmbody=bodyField.getText(0,bodyField.length); var dmbody=bodyField.getText(0,bodyField.length);
if (conversation || newsSwipeview.stacktype!=="DirectMessages"){ if (conversation || newsSwipeview.stacktype!=="DirectMessages"){
if (parentId!=""){ if (parentId!=""){
statusUpdate(title,dmbody,parentId,attachImageURLs) statusUpdate(title,dmbody,parentId)
}else{ }else{
statusUpdate(title,body,parentId,attachImageURLs)} statusUpdate(title,body,parentId)}
}else { }else {
if (reply_to_user!=""){dmUpdate(title,dmbody,parentId,reply_to_user)} if (reply_to_user!=""){dmUpdate(title,dmbody,parentId,reply_to_user)}
else{Helperjs.showMessage(qsTr("Error"),qsTr("No receiver supplied!"),root)} else{Helperjs.showMessage(qsTr("Error"),qsTr("No receiver supplied!"),root)}
@ -478,6 +443,7 @@ Rectangle{
} }
PermissionDialog{id:permissionDialog;x:mm;visible: false} PermissionDialog{id:permissionDialog;x:mm;visible: false}
SmileyDialog{id:smileyDialog;x:mm;visible: false} SmileyDialog{id:smileyDialog;x:mm;visible: false}
MessageImageUploadDialog{id:imageUploadDialog;visible: false}
} }
Component.onCompleted:{ Component.onCompleted:{
root.replySignal.connect(setParent); root.replySignal.connect(setParent);
@ -497,7 +463,7 @@ Rectangle{
target: buttonRow; visible:true target: buttonRow; visible:true
} }
PropertyChanges { PropertyChanges {
target: titleField; visible:(newsSwipeview.stacktype!="DirectMessages")//true target: titleField; visible:(newsSwipeview.stacktype!="DirectMessages")
} }
PropertyChanges { PropertyChanges {
target: receiverLabel; visible:(newsSwipeview.stacktype=="DirectMessages"); target: receiverLabel; visible:(newsSwipeview.stacktype=="DirectMessages");

View file

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

View file

@ -273,7 +273,7 @@ Item {
//Bottom row for buttons //Bottom row for buttons
Row{id:controlrow Row{id:controlrow
anchors.top:friendicaActivities.bottom anchors.top:friendicaActivities.bottom
height: root.fontFactor*osSettings.bigFontSize height: 1.5*root.fontFactor*osSettings.bigFontSize
CheckBox{ CheckBox{
id:likeCheckbox id:likeCheckbox
width:newsitem.width/5 width:newsitem.width/5
@ -281,12 +281,13 @@ Item {
visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false
checked:(model.newsitemobject.friendica_activities_view.self.liked==1)?true:false checked:(model.newsitemobject.friendica_activities_view.self.liked==1)?true:false
indicator: Rectangle{ indicator: Rectangle{
height: parent.height
implicitWidth: newsitem.width/5 implicitWidth: newsitem.width/5
implicitHeight:root.fontFactor*osSettings.bigFontSize implicitHeight:root.fontFactor*osSettings.bigFontSize
color:"transparent" color:"transparent"
Text{ Text{
anchors.centerIn: parent anchors.centerIn: parent
font.pointSize: osSettings.systemFontSize font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name font.family:fontAwesome.name
color:likeCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor color:likeCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor
text:likeCheckbox.checked?"\uf118"+"!":"\uf118" text:likeCheckbox.checked?"\uf118"+"!":"\uf118"
@ -309,12 +310,13 @@ Item {
visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false
checked: (newsitemobject.friendica_activities_view.self.disliked==1)?true:false checked: (newsitemobject.friendica_activities_view.self.disliked==1)?true:false
indicator: Rectangle{ indicator: Rectangle{
height: parent.height
implicitWidth: newsitem.width/5 implicitWidth: newsitem.width/5
implicitHeight:root.fontFactor*osSettings.bigFontSize implicitHeight:root.fontFactor*osSettings.bigFontSize
color:"transparent" color:"transparent"
Text{ Text{
anchors.centerIn: parent anchors.centerIn: parent
font.pointSize: osSettings.systemFontSize font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name font.family:fontAwesome.name
color:dislikeCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor color:dislikeCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor
text: dislikeCheckbox.checked?"\uf119"+"!":"\uf119" text: dislikeCheckbox.checked?"\uf119"+"!":"\uf119"
@ -337,12 +339,13 @@ Item {
width: newsitem.width/5 width: newsitem.width/5
height: parent.height height: parent.height
indicator:Rectangle{ indicator:Rectangle{
height: parent.height
implicitWidth: newsitem.width/5 implicitWidth: newsitem.width/5
implicitHeight:root.fontFactor*osSettings.bigFontSize implicitHeight:root.fontFactor*osSettings.bigFontSize
color:"transparent" color:"transparent"
Text{ Text{
anchors.centerIn: parent anchors.centerIn: parent
font.pointSize: osSettings.systemFontSize font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name font.family:fontAwesome.name
color: favoritedCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor color: favoritedCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor
text:"\uf005" text:"\uf005"
@ -365,7 +368,7 @@ Item {
id:replysymbol id:replysymbol
color: Material.secondaryTextColor color: Material.secondaryTextColor
anchors.centerIn: parent anchors.centerIn: parent
font.pointSize: osSettings.systemFontSize font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name font.family:fontAwesome.name
text: "\uf112" text: "\uf112"
} }
@ -398,7 +401,7 @@ Item {
id:newsmenusymbol id:newsmenusymbol
color: Material.secondaryTextColor color: Material.secondaryTextColor
anchors.centerIn: parent anchors.centerIn: parent
font.pointSize: osSettings.systemFontSize font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name font.family:fontAwesome.name
text: "\uf142" 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 { Action {
text: qsTr("Conversation") text: qsTr("Conversation")
onTriggered: { onTriggered: {
@ -450,6 +474,15 @@ Item {
Newsjs.favorite(login,false,newsitemobject.id,root);model.newsitemobject.favorited=0} 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{ Menu{
title: qsTr("Attending") title: qsTr("Attending")
width: 10*root.fontFactor*osSettings.systemFontSize width: 10*root.fontFactor*osSettings.systemFontSize
@ -481,7 +514,7 @@ Item {
text: qsTr("Delete") text: qsTr("Delete")
onTriggered: { onTriggered: {
Newsjs.deleteNews(root.login,root.db,newsitemobject.id,newsitemobject.messagetype,root,function(reply){ 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); 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){ 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" //border.color: "grey"
y:1 y:1
width:root.width-mm width:root.width-mm
@ -277,23 +283,18 @@ Page{
} }
Component{ Component{
id: imageFooter id: imageFooter
Image{ BlueButton{
id: footerImage width: 5*root.fontFactor*osSettings.bigFontSize
height: root.width/4 height:imageUploadView.height-3*root.fontFactor*osSettings.bigFontSize
width: root.width/4 //15*mm color: Material.backgroundColor
//15*mm text:"\u002b"
fillMode: Image.PreserveAspectFit fontSize: 3*osSettings.bigFontSize
source:"qrc:/images/addImage.png" onClicked:{
MouseArea{ imagePicking=true;
anchors.fill: parent var imagePicker = Qt.createQmlObject('import QtQuick 2.0; import "qrc:/qml/genericqml";'+
onClicked:{ osSettings.imagePickQml+'{multiple : false;onReady: {'+
imagePicking=true; 'attachImage(imageUrl)}}',imageDialog,"imagePicker");
var imagePicker = Qt.createQmlObject('import QtQuick 2.0; import "qrc:/qml/genericqml";'+ imagePicker.pickImage()}
osSettings.imagePickQml+'{multiple : false;onReady: {attachImageURLs.push(imageUrl);'+
'attachImage(imageUrl)}}',imageDialog,"imagePicker");
imagePicker.pickImage()
}
}
} }
} }

View file

@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS> <!DOCTYPE TS>
<TS version="2.1" language="de"> <TS version="2.1" language="de">
<context>
<name>AcceptRules</name>
<message>
<source>Accept instance rules</source>
<translation>Bitte Instanzregeln akzeptieren</translation>
</message>
</context>
<context> <context>
<name>AccountPage</name> <name>AccountPage</name>
<message> <message>
@ -57,7 +64,7 @@
</message> </message>
<message> <message>
<source>Wrong password!</source> <source>Wrong password!</source>
<translation>Falsches Passwort!</translation> <translation type="vanished">Falsches Passwort!</translation>
</message> </message>
<message> <message>
<source>Success</source> <source>Success</source>
@ -75,6 +82,21 @@
<source>Conversations</source> <source>Conversations</source>
<translation type="vanished">Unterhaltungen</translation> <translation type="vanished">Unterhaltungen</translation>
</message> </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>
<context> <context>
<name>CalendarTab</name> <name>CalendarTab</name>
@ -451,6 +473,14 @@
<source>Following</source> <source>Following</source>
<translation>Folgt</translation> <translation>Folgt</translation>
</message> </message>
<message>
<source>Block</source>
<translation>Blockieren</translation>
</message>
<message>
<source>Unblock</source>
<translation>Entblocken</translation>
</message>
</context> </context>
<context> <context>
<name>ContactsSearchPage</name> <name>ContactsSearchPage</name>
@ -661,6 +691,10 @@
<source>Location</source> <source>Location</source>
<translation type="vanished">Ort</translation> <translation type="vanished">Ort</translation>
</message> </message>
<message>
<source>Delete Event?</source>
<translation>Termin löschen?</translation>
</message>
</context> </context>
<context> <context>
<name>EventListItem</name> <name>EventListItem</name>
@ -683,6 +717,10 @@
<source>All</source> <source>All</source>
<translation>Alle</translation> <translation>Alle</translation>
</message> </message>
<message>
<source>Blocked</source>
<translation>Geblockte</translation>
</message>
</context> </context>
<context> <context>
<name>FriendsTab</name> <name>FriendsTab</name>
@ -764,6 +802,17 @@
<translation>Schliessen</translation> <translation>Schliessen</translation>
</message> </message>
</context> </context>
<context>
<name>MessageImageUploadDialog</name>
<message>
<source>Description</source>
<translation>Beschreibung</translation>
</message>
<message>
<source>Upload</source>
<translation>Hochladen</translation>
</message>
</context>
<context> <context>
<name>MessageSend</name> <name>MessageSend</name>
<message> <message>
@ -789,7 +838,7 @@
<message> <message>
<source>Only one attachment supported at the moment. <source>Only one attachment supported at the moment.
Remove other attachment first!</source> 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> Lösche zuerst den anderen Anhang!</translation>
</message> </message>
<message> <message>
@ -808,7 +857,7 @@
<name>NewsStack</name> <name>NewsStack</name>
<message> <message>
<source>Network Error</source> <source>Network Error</source>
<translation>Netzwerk-Fehler</translation> <translation type="vanished">Netzwerk-Fehler</translation>
</message> </message>
<message> <message>
<source>More</source> <source>More</source>
@ -1032,6 +1081,18 @@
<source>External</source> <source>External</source>
<translation>Webseite</translation> <translation>Webseite</translation>
</message> </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>
<context> <context>
<name>PermissionDialog</name> <name>PermissionDialog</name>
@ -1250,6 +1311,29 @@
<translation>Sonstige</translation> <translation>Sonstige</translation>
</message> </message>
</context> </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> <context>
<name>SmileyDialog</name> <name>SmileyDialog</name>
<message> <message>

View file

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

View file

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

View file

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