From d81ad52031310bc04909e15552201ac7d6640d45 Mon Sep 17 00:00:00 2001 From: LubuWest Date: Sun, 7 Jun 2020 20:12:43 +0200 Subject: [PATCH 01/35] Link to AUR --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0fef74b..b09cb3b 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,7 @@ ToDo # Install # * F-Droid binary repository: [https://www.ma-nic.de/fdroid/repo](https://www.ma-nic.de/fdroid/repo) or for those who get the "error getting index file" from F-Droid client due to outdated crypto libraries the url without encryption: [http://www.ma-nic.de/fdroid/repo](http://www.ma-nic.de/fdroid/repo) To include repo in Fdroid: Open config --> package sources --> plus symbol --> paste url * [Google Playstore](https://play.google.com/store/apps/details?id=org.qtproject.friendiqa) +* Arch User Repository: [https://aur.archlinux.org/packages/friendiqa/](https://aur.archlinux.org/packages/friendiqa/) ## License ## From 56bdb80ea0421ab6ea15297193c232b89a46d70d Mon Sep 17 00:00:00 2001 From: LubuWest Date: Wed, 25 Nov 2020 21:40:17 +0100 Subject: [PATCH 02/35] new version with hashtags --- CHANGELOG.md | 6 + README.md | 1 + source-android/android/AndroidManifest.xml | 13 +- source-android/android/build.gradle.backup | 69 ++++ source-android/android/gradle.properties | 3 + .../androidnative/AndroidNativeActivity.java | 17 +- .../java/src/androidnative/ImagePicker.java | 22 +- source-android/common/filesystemandroid.cpp | 115 ++++++ source-android/common/friendiqa.cpp | 4 - source-android/friendiqa.pro | 7 +- source-linux/application.qrc | 1 + ...ux (conflicted copy 2019-06-23 133538).cpp | 73 ++++ source-linux/common/filesystem.cpp | 24 +- source-linux/common/filesystem.h | 3 + ...qa (conflicted copy 2019-06-24 214903).cpp | 97 +++++ source-linux/common/updatenews.cpp | 16 +- ...ge (conflicted copy 2017-12-15 232034).cpp | 121 ++++++ ...mage (conflicted copy 2017-12-15 232034).h | 71 ++++ ...hr (conflicted copy 2019-06-24 214813).cpp | 369 ++++++++++++++++++ source-linux/common/xhr.cpp | 18 - source-linux/common/xhr.h | 8 +- source-linux/js/image.js | 8 +- source-linux/js/news.js | 111 ++---- source-linux/js/newsworker.js | 1 + source-linux/js/service.js | 48 ++- source-linux/qml/calendarqml/CalendarDay.qml | 1 + source-linux/qml/calendarqml/CalendarTab.qml | 2 +- source-linux/qml/calendarqml/EventList.qml | 2 + source-linux/qml/configqml/AccountPage.qml | 172 +++----- source-linux/qml/configqml/InfoBox.qml | 2 +- .../contactqml/ContactDetailsComponent.qml | 45 +-- source-linux/qml/contactqml/FriendsTab.qml | 40 +- .../qml/contactqml/GroupComponent.qml | 3 +- .../qml/contactqml/ProfileComponent.qml | 13 +- source-linux/qml/friendiqa.qml | 56 ++- .../qml/genericqml/ContactComponent.qml | 1 + source-linux/qml/genericqml/Search.qml | 22 +- source-linux/qml/newsqml/ContactPage.qml | 2 +- source-linux/qml/newsqml/Conversation.qml | 105 +---- source-linux/qml/newsqml/MessageSend.qml | 218 ++++------- source-linux/qml/newsqml/NewsStack.qml | 12 +- source-linux/qml/newsqml/NewsVideo.qml | 16 - source-linux/qml/newsqml/NewsVideoLarge.qml | 7 - source-linux/qml/newsqml/NewsYplayer.qml | 5 +- source-linux/qml/newsqml/Newsitem.qml | 272 ++++++------- source-linux/qml/newsqml/SmileyDialog.qml | 21 +- source-linux/qml/photoqml/PhotoTab.qml | 6 +- 47 files changed, 1424 insertions(+), 825 deletions(-) create mode 100644 source-android/android/build.gradle.backup create mode 100644 source-android/common/filesystemandroid.cpp create mode 100644 source-linux/common/alarmlinux (conflicted copy 2019-06-23 133538).cpp create mode 100644 source-linux/common/friendiqa (conflicted copy 2019-06-24 214903).cpp create mode 100644 source-linux/common/uploadableimage (conflicted copy 2017-12-15 232034).cpp create mode 100644 source-linux/common/uploadableimage (conflicted copy 2017-12-15 232034).h create mode 100644 source-linux/common/xhr (conflicted copy 2019-06-24 214813).cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 5119886..06a5b1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## v0.5.4 ## +* More Simplification of account page (images are stored in the private app directory, no permission required) +* Image attachment for Android 10 repaired +* Hashtags are saved after message is sent and can be used in later messages +* Bugfixes + ## v0.5.3 ## * Implementation of new events API (incl. sync and notification) for Friendica version >= 20.03 * Indentation to see replied to newsitem for conversation view diff --git a/README.md b/README.md index b09cb3b..e1fd95d 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ Currently supported: * Update fetches new posts (up to last 50) since last in local DB * More shows older posts from local DB * Create new Message with images or direct messages, Contact/Group access rights (can be stored), smileys +* Hashtags are saved after message is sent and can be used in later messages * Send image from Android gallery * Send text or urls from other apps to Friendiqa * Native Android image dialog diff --git a/source-android/android/AndroidManifest.xml b/source-android/android/AndroidManifest.xml index 22426df..3bfe2cd 100644 --- a/source-android/android/AndroidManifest.xml +++ b/source-android/android/AndroidManifest.xml @@ -1,5 +1,5 @@ - + private holiday pictures have finally arrived! -* For friends calendar button shows private events thanks to new remoteAuth API (Friendica 3.6 server required) -* News button for forum accounts shows news published via that forum +* Fix for [issue 4](https://github.com/LubuWest/Friendiqa/issues/4) +* Fix for Friendica [issue 4689](https://github.com/friendica/friendica/issues/4689) +* Long posts are automatically truncated +* Intents for pictures (Send one image from gallery: attach to message, send multiple images: upload to album) -# Images # -* Complete rework of image download, fixes bug with private images -* Download all or only new images +## v0.2 -# Config # -* Check if nickname exist on server -* Check if password is correct -* Account deletion now also removes news, image data and events from local db +# News -# Translations # -* Italian thanks to Davide de Prisco +* Profile image download completely reworked, resulting in speed improvement +# Contacts + +* New profile tab, data of public and private profiles shown +* Change profile picture +* For friends image button shows private images thanks to new remoteAuth API (Friendica 3.6 server required) --> private holiday pictures have finally arrived! +* For friends calendar button shows private events thanks to new remoteAuth API (Friendica 3.6 server required) +* News button for forum accounts shows news published via that forum + +# Images + +* Complete rework of image download, fixes bug with private images +* Download all or only new images + +# Config + +* Check if nickname exist on server +* Check if password is correct +* Account deletion now also removes news, image data and events from local db + +# Translations + +* Italian thanks to Davide de Prisco ## v0.1.2## -* FIX: Include openssl v1.0.2m for SSL connections in Android v7 and above +* FIX: Include openssl v1.0.2m for SSL connections in Android v7 and above ## v0.1.1## -* FIX: Spanish translation -* FIX: Empty Newsview after deletion of first newsitem +* FIX: Spanish translation +* FIX: Empty Newsview after deletion of first newsitem ## v0.1## -# News # +# News -* Native Android image selector for new message -* Click on contacts shows contact details on news page -* Fix problem with news list after deletion of item +* Native Android image selector for new message +* Click on contacts shows contact details on news page +* Fix problem with news list after deletion of item -# Contacts # -* Clean contacts with no news +# Contacts -# Images # -* Upload pictures with description to album (permissions cannot be set due to API problems) -* Delete pictures or albums from client and server (long press on picture in overview) -* Fix problem when enlarging photo +* Clean contacts with no news -# Translations # -* German, Spanish +# Images + +* Upload pictures with description to album (permissions cannot be set due to API problems) +* Delete pictures or albums from client and server (long press on picture in overview) +* Fix problem when enlarging photo + +# Translations + +* German, Spanish \ No newline at end of file diff --git a/README.md b/README.md index e1fd95d..9ce7ddc 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Currently supported: * Android notifications or Dbus notification (Linux) for new items in friends timeline, replies and DMs * Search for news * Click on hashtag in newsitem starts search for news with that word -* Click on image shows image fullscreen +* Only first photo attachment in post is shown, click for more images and fullscreen image * Click on video or youtube video shows video fullscreen * For news containing urls ending with mp3, mp4, avi, webm, ogg or to a Peertube instance: media can be played in the app * Open links in external browser @@ -36,7 +36,6 @@ Currently supported: * Update fetches new posts (up to last 50) since last in local DB * More shows older posts from local DB * Create new Message with images or direct messages, Contact/Group access rights (can be stored), smileys -* Hashtags are saved after message is sent and can be used in later messages * Send image from Android gallery * Send text or urls from other apps to Friendiqa * Native Android image dialog @@ -52,6 +51,7 @@ Currently supported: * Tabs for own profiles, friends, other contacts and groups * Show profile(s) of user and change profile picture * List of all known contacts with locally downloaded pictures +* Show follow requests; approve, deny, ignore requests * Additional information, last messages and other functionality shown in news tab * Show public and private pictures of contact (screenscraping of contact's website, works only with certain theme) * Show public and private events of contact @@ -96,7 +96,7 @@ Currently supported: * Multiple accounts * View mode for news (tree or timeline) * Maximum news (deleted after use of Quit button) -* Sync home timeline, replies, DM, Notify yes/no +* Sync home timeline, replies, DM, Events, friend requests; Notify yes/no * Hide #nsfw ToDo @@ -111,8 +111,8 @@ ToDo # Translations # -* German, Spanish, Italian -* To contribute translations: Have a look at linux-sources/translations/friendiqa-de.ts and open it with an editor. It's an xml file. Change values and send me the file/do pull request. +* German, Spanish, Italian, Hungarian +* To contribute translations: Have a look at linux-sources/translations/friendiqa-de.ts and open it with an editor. It's an xml file. Change values and send me the file to thomasschmidt45 at gmx.net / do pull request. # Install # * F-Droid binary repository: [https://www.ma-nic.de/fdroid/repo](https://www.ma-nic.de/fdroid/repo) or for those who get the "error getting index file" from F-Droid client due to outdated crypto libraries the url without encryption: [http://www.ma-nic.de/fdroid/repo](http://www.ma-nic.de/fdroid/repo) To include repo in Fdroid: Open config --> package sources --> plus symbol --> paste url diff --git a/source-android/android/AndroidManifest.xml b/source-android/android/AndroidManifest.xml index 3bfe2cd..67fcf88 100644 --- a/source-android/android/AndroidManifest.xml +++ b/source-android/android/AndroidManifest.xml @@ -1,5 +1,5 @@ - + - + @@ -16,11 +16,13 @@ android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="Friendiqa" android:extractNativeLibs="true" - android:requestLegacyExternalStorage="true" + android:icon="@drawable/friendiqa" android:theme="@android:style/Theme.Holo.Light" android:logo="@drawable/friendiqa"> - + diff --git a/source-android/android/arm/libcrypto_1_1.so b/source-android/android/arm/libcrypto_1_1.so old mode 100755 new mode 100644 diff --git a/source-android/android/arm/libssl_1_1.so b/source-android/android/arm/libssl_1_1.so old mode 100755 new mode 100644 diff --git a/source-android/android/arm64/libcrypto_1_1.so b/source-android/android/arm64/libcrypto_1_1.so old mode 100755 new mode 100644 diff --git a/source-android/android/arm64/libssl_1_1.so b/source-android/android/arm64/libssl_1_1.so old mode 100755 new mode 100644 diff --git a/source-android/android/gradle.properties b/source-android/android/gradle.properties index bedc041..82755ae 100644 --- a/source-android/android/gradle.properties +++ b/source-android/android/gradle.properties @@ -1,7 +1,4 @@ -# androidBuildToolsVersion=25.0.3 -# androidCompileSdkVersion=26 buildDir=.build -# qt5AndroidDir=/home/pankraz/Qt/5.11.1/android_armv7/src/android/java android.useAndroidX=true android.enableJetifier=true android.enforceUniquePackageName=false diff --git a/source-android/android/gradlew b/source-android/android/gradlew old mode 100755 new mode 100644 diff --git a/source-android/androidnative.pri/java/src/androidnative/AndroidNativeActivity.java b/source-android/androidnative.pri/java/src/androidnative/AndroidNativeActivity.java index dabee61..ae44267 100644 --- a/source-android/androidnative.pri/java/src/androidnative/AndroidNativeActivity.java +++ b/source-android/androidnative.pri/java/src/androidnative/AndroidNativeActivity.java @@ -8,8 +8,6 @@ import java.util.HashMap; import android.content.pm.PackageManager; import android.content.Context; import android.Manifest.permission; -//import android.support.v4.app.ActivityCompat; -//import android.support.v4.content.ContextCompat; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; @@ -43,6 +41,7 @@ public class AndroidNativeActivity extends org.qtproject.qt5.android.bindings.Qt //} else { System.loadLibrary("friendiqa_arm64-v8a"); + //System.loadLibrary("friendiqa_armeabi-v7a"); if((getIntent().getFlags() == (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)) || (getIntent().getFlags() == Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) || (getIntent().getFlags() == Intent.FLAG_ACTIVITY_NEW_TASK) || (getIntent().getFlags() == Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) || (getIntent().getFlags() == (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED))) { SystemDispatcher.onActivityResume(); } else { @@ -94,6 +93,7 @@ public class AndroidNativeActivity extends org.qtproject.qt5.android.bindings.Qt protected void onNewIntent(Intent data) { System.loadLibrary("friendiqa_arm64-v8a"); + //System.loadLibrary("friendiqa_armeabi-v7a"); super.onNewIntent(data); if ((data!=null) && (data.getType() != null) && !(data.getBooleanExtra("used",false))){ String type = data.getType(); diff --git a/source-android/androidnative.pri/java/src/androidnative/ImagePicker.java b/source-android/androidnative.pri/java/src/androidnative/ImagePicker.java index 48b0a90..9b9b0e5 100644 --- a/source-android/androidnative.pri/java/src/androidnative/ImagePicker.java +++ b/source-android/androidnative.pri/java/src/androidnative/ImagePicker.java @@ -112,7 +112,6 @@ public class ImagePicker { return; int requestCode = (Integer) message.get("requestCode"); Intent data = (Intent) message.get("data"); - if (requestCode == PICK_IMAGE_ACTION) { importImage(data); } else if (requestCode == TAKE_PHOTO_ACTION) { @@ -127,8 +126,8 @@ public class ImagePicker { static private void importImage(Intent data) { Uri uri = data.getData(); - Log.d(TAG,"importImage: uri:" + uri); - Log.d(TAG,"importImage: type: " + data.getType()); + //Log.d(TAG,"importImage: uri:" + uri); + //Log.d(TAG,"importImage: type: " + data.getType()); if (data.getClipData() != null) { importImageFromClipData(data); diff --git a/source-android/androidnative.pri/java/src/androidnative/SystemDispatcher.java b/source-android/androidnative.pri/java/src/androidnative/SystemDispatcher.java index a8f0015..616fce5 100644 --- a/source-android/androidnative.pri/java/src/androidnative/SystemDispatcher.java +++ b/source-android/androidnative.pri/java/src/androidnative/SystemDispatcher.java @@ -140,6 +140,7 @@ public class SystemDispatcher { waitingIntent=null; isIntentPending=false; } else { //onIntent start + Log.e(TAG,"notInitialized: onIntentStart "+data); message.put("text",data.getStringExtra(Intent.EXTRA_TEXT)); message.put("subject",data.getStringExtra(Intent.EXTRA_SUBJECT)); waitingIntent = message; diff --git a/source-android/common/friendiqa.cpp b/source-android/common/friendiqa.cpp index 96526ae..8193d70 100644 --- a/source-android/common/friendiqa.cpp +++ b/source-android/common/friendiqa.cpp @@ -67,13 +67,13 @@ Q_DECL_EXPORT int main(int argc, char *argv[]) { } else{ QApplication app(argc, argv); - QQuickView view; + QQmlApplicationEngine view; //qDebug()<<"FriendiqaMain started"; QTranslator qtTranslator; qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations"); app.installTranslator(&qtTranslator); RemoteAuthAsyncImageProvider *imageProvider = new RemoteAuthAsyncImageProvider; - view.engine()->addImageProvider("remoteauthimage",imageProvider); + view.addImageProvider("remoteauthimage",imageProvider); view.rootContext()->setContextProperty("remoteauth", imageProvider); XHR* xhr = XHR::instance(); view.rootContext()->setContextProperty("xhr", xhr); @@ -83,8 +83,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[]) { view.rootContext()->setContextProperty("alarm", alarm); UPDATENEWS* updatenews = UPDATENEWS::instance(); view.rootContext()->setContextProperty("updatenews", updatenews); - view.setSource(QUrl("qrc:/qml/friendiqa.qml")); - view.show(); + view.load(QUrl("qrc:/qml/friendiqa.qml")); view.connect(view.rootContext()->engine(), SIGNAL(quit()), &app, SLOT(quit())); return app.exec(); diff --git a/source-android/friendiqa.pro b/source-android/friendiqa.pro index c009772..40f7006 100644 --- a/source-android/friendiqa.pro +++ b/source-android/friendiqa.pro @@ -52,7 +52,8 @@ OTHER_FILES += qml/friendiqa.qml \ TRANSLATIONS += translations/friendiqa-de.ts \ translations/friendiqa-es.ts \ - translations/friendiqa-it.ts + translations/friendiqa-it.ts \ + translations/friendiqa-hu.ts HEADERS += \ common/uploadableimage.h \ @@ -85,5 +86,3 @@ DISTFILES += \ ANDROID_EXTRA_LIBS = $$PWD/android/arm/libcrypto_1_1.so $$PWD/android/arm/libssl_1_1.so $$PWD/android/arm64/libcrypto_1_1.so $$PWD/android/arm64/libssl_1_1.so -ANDROID_ABIS = arm64-v8a -android: include(/home/pankraz/git/android_openssl/openssl.pri) diff --git a/source-android/qml/friendiqa.qml b/source-android/qml/friendiqa.qml index 9f4955e..41558a7 100644 --- a/source-android/qml/friendiqa.qml +++ b/source-android/qml/friendiqa.qml @@ -36,47 +36,52 @@ import QtQuick.Controls 2.4 import QtQuick.Layouts 1.11 import "qrc:/js/news.js" as Newsjs import "qrc:/js/service.js" as Service +import "qrc:/qml/genericqml" -StackView{ +ApplicationWindow{ id:root + title: "Friendiqa" + property var globaloptions: Service.readGO(db) property QtObject osSettings: {var tmp=Qt.createComponent("qrc:/qml/configqml/OSSettingsAndroid.qml");return tmp.createObject(root)} - width: osSettings.appWidth - height:osSettings.appHeight + visible: true property var db: ["Friendiqa", "1.0", "Stores Friendica data", 100000000] property var login: Service.readActiveConfig(db) - property var globaloptions: Service.readGO(db) + property real fontFactor: root.font.pixelSize/root.font.pointSize property var contactlist: [] property real mm: osSettings.osType=="Android"?Screen.pixelDensity:Screen.pixelDensity*1.5 - signal messageSignal(var friend) + property bool wideScreen : width>height signal fotoSignal(var username, var friend) signal directmessageSignal(var friend) signal newsSignal(var news) signal newstypeSignal(var type) signal friendsSignal(var username) signal contactdetailsSignal(var contact) + signal searchSignal (var searchterm) signal eventSignal(var contact) signal uploadSignal(var urls) signal sendtextSignal(var intenttext) signal changeimage(var method, var type, var id) signal updateSyncinterval(int interval) + signal replySignal(var newsobject) property var news:[] property var newContacts:[] + property var contactposts:[] //property string contactLoadType: "" property bool imagePicking: false - onLoginChanged:{ - if(login==""){root.push("qrc:/qml/configqml/AccountPage.qml")} - else{root.push(rootStackItem) + function onLoginChanged(login){ + if(login==""){rootstackView.push("qrc:/qml/configqml/AccountPage.qml")} + else{//rootstackView.push(rootstack) if (login.newsViewType!="" || login.newsViewType!=null){newstab.newstabstatus=login.newsViewType;} Newsjs.getCurrentContacts(login,db,function(contacts){ contactlist=contacts})} } - onNewContactsChanged:{ + function onNewContactsChanged(newContacts){ if(newContacts.length>0){// download contact images and update db var contacturls=[]; var contactnames=[]; - for (var link in newContacts){ + for (var link in newContacts){//print("new contact " +newContacts[link].screen_name); contacturls.push(newContacts[link].profile_image_url); contactnames.push(newContacts[link].screen_name); Service.updateContactInDB(login,db,newContacts[link].isFriend,newContacts[link]) @@ -91,9 +96,32 @@ StackView{ } + Connections { + target: root + function onWidthChanged(appWidth) { + if(osSettings.osType=="Linux" && Math.abs(appWidth-(globaloptions.appWidth||0))>50){ + Service.updateglobaloptions(db,"appWidth",appWidth) + } + } + } + Connections { + target: root + function onHeightChanged(appHeight) { + if(osSettings.osType=="Linux" && Math.abs(appHeight-(globaloptions.appHeight||0))>50){ + Service.updateglobaloptions(db,"appHeight",appHeight) + } + } + } + + + function showContact(contact){ //print(JSON.stringify(contact)); + rootstackView.push("qrc:/qml/newsqml/ContactPage.qml",{"contact": contact}) + } + + Connections{ target:xhr - onDownloaded:{ + function onDownloaded(type,url,filename,i){ if(type=="contactlist"){ var database=LocalStorage.openDatabaseSync(root.db[0],root.db[1],root.db[2],root.db[3]); var result; @@ -104,10 +132,12 @@ StackView{ } } + FontLoader{id: fontAwesome; source: "qrc:/images/fontawesome-webfont.ttf"} - Keys.onReleased: {//print(event.key + "Backkey"+newstab.conversation.length+" "+root.depth) - if (event.key === osSettings.backKey) { + //Keys.onReleased: {//print(event.key + "Backkey"+newstab.conversation.length+" "+root.depth) + onClosing: { + //if (event.key === osSettings.backKey) { if (rootstack.currentIndex==0){ newstab.active=true; if (newstab.newstabstatus!=globaloptions.newsViewType){ @@ -119,278 +149,147 @@ StackView{ Newsjs.chatsfromdb(db,login.username,function(dbnews){ newsSignal(dbnews) })} + close.accepted=false; } - else if (newstab.conversation.length>0){newstab.conversation=[]} - else if (root.depth>1){root.pop()} - else{Service.cleanNews(root.db,function(){ - Service.cleanContacts(root.login,root.db,function(){ - Qt.quit()}) - })} + else if (newstab.conversation.length>0){ + newstab.conversation=[]; + close.accepted=false + } + else if (root.depth>1){ + root.pop(); + close.accepted=false + } + else{ + Service.cleanNews(root.db,function(){ + Service.cleanHashtags(root.db,function(){ + Service.cleanContacts(root.login,root.db,function(){ + Qt.quit()}) + })}) + close.accepted=true + } } else if (rootstack.currentIndex==2){fotoSignal("backButton")} else {rootstack.currentIndex=0} - event.accepted = true - }} - - Drawer{ - id: leftDrawer - width: 0.66* root.width - height: root.height - edge: Qt.LeftEdge - position: 1.0 - Column{ - x:mm - width:parent.width-mm - Label{ - text: login.hasOwnProperty("username")?login.username:"" - font.pixelSize: 4*mm - width: parent.width - height: 6*mm - } -// Label{ -// text:login.hasOwnProperty("server")?"@"+login.server:"" -// font.pixelSize: 5*mm -// width: parent.width -// } - - Label{ - text: "\uf021 " + qsTr("Refresh") - font.pixelSize: 4*mm - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); -// newstypeSignal("refresh") - updatenews.setDatabase(); - updatenews.login(); - updatenews.startsync(); - } - } - } - - - Label{ - text: "\uf1da " + qsTr("Timeline") - font.pixelSize: 4*mm - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("timeline") - } - } - } - - Label{ - text: "\uf086 " + qsTr("Conversations") - width: parent.width - font.pixelSize: 4*mm - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("conversation") - } - } - } - - Label{ - text: "\uf005 " + qsTr("Favorites") - font.pixelSize: 4*mm - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("favorites") - } - } - } - Label{ - text: "\uf0ec " + qsTr("Replies") - font.pixelSize: 4*mm - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("replies") - } - } - } - - - Label{ - text: "\uf0ac " + qsTr("Public Timeline") - font.pixelSize: 4*mm - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("publictimeline") - } - } - } - - Label{ - text: "\uf0c0 " + qsTr("Group news") - font.pixelSize: 4*mm - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("groupnews") - } - } - } - - Label{ - text: "\uf002 " + qsTr("Search") - font.pixelSize: 4*mm - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("search") - } - } - } - - Label{ - text: "\uf085 "+ qsTr("Settings") - font.pixelSize: 4*mm - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked: {root.push("qrc:qml/configqml/ConfigPage.qml"); - leftDrawer.close() - } - } - } - Label{ - text: "\uf2bb " + qsTr("Accounts") - font.pixelSize: 4*mm - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked: {root.push("qrc:qml/configqml/AccountPage.qml"); - leftDrawer.close() - } - } - } - - Label{ - text: "\uf08b " +qsTr("Quit") - font.pixelSize: 4*mm - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - Service.cleanNews(root.db,function(){ - Service.cleanContacts(root.login,root.db,function(){ - Qt.quit()}) - }) - } - } - } - - } + //event.accepted = true + //} } - Item{ - id:rootStackItem - width:parent.width - height: parent.height - //anchors.fill:parent - states: State { - name: "fullscreen"; - PropertyChanges { target: bar; height:0 } - PropertyChanges { target: rootstack; height:parent.height } - } - transitions: Transition { - PropertyAnimation { properties: "height"; - easing.type: Easing.InOutQuad - duration: 1000 + + + footer:ToolBar{ + //position: ToolBar.Footer + background: Rectangle{ + anchors.fill: parent + color: "#EEEEEE"//"#F8F8F8" + } + //RowLayout{ + // anchors.fill: parent + + TabBar { + id: bar + width:parent.width + // Layout.fillWidth: true + //width: wideScreen?contentWidth:parent.width-10*mm + //x: 7*mm + onCurrentIndexChanged: rootstack.currentIndex=bar.currentIndex + TabButton { + text: "\uf03a" + font.pointSize: osSettings.bigFontSize + background:Rectangle{ + anchors.fill: parent + color: "#EEEEEE" + } + } + TabButton { + text: "\uf0c0" + font.pointSize: osSettings.bigFontSize + background:Rectangle{ + anchors.fill: parent + color: "#EEEEEE" + } + } + TabButton { + text: "\uf03e" + font.pointSize: osSettings.bigFontSize + background:Rectangle{ + anchors.fill: parent + color: "#EEEEEE" + } + } + TabButton { + text: "\uf073" + font.pointSize: osSettings.bigFontSize + background:Rectangle{ + anchors.fill: parent + color: "#EEEEEE" + } + } } - } - TabBar { - id: bar - width: parent.width - height: 7*mm - position:TabBar.Footer - anchors.top: rootstack.bottom - onCurrentIndexChanged: rootstack.currentIndex=bar.currentIndex - TabButton { - text: "\uf03a" - font.pixelSize: 3*mm - height: 6*mm - } - TabButton { - text: "\uf0c0" - font.pixelSize: 3*mm - height: 6*mm - } - TabButton { - text: "\uf03e" - font.pixelSize: 3*mm - height: 6*mm - } + // } + } - TabButton { - text: "\uf073" - font.pixelSize: 3*mm - height: 6*mm - } - } - StackLayout{ + + // states: State { + // name: "fullscreen"; + // PropertyChanges { target: bar; height:0 } + // PropertyChanges { target: rootstack; height:parent.height } + // } + + // transitions: Transition { + // PropertyAnimation { properties: "height"; + // easing.type: Easing.InOutQuad + // duration: 1000 + // } + // } + StackView{id:rootstackView + width:root.width + height: root.height + initialItem: StackLayout{ id:rootstack - width:parent.width - height: parent.height-7*mm + width:rootstackView.width + height: rootstackView.height//-7*mm + //y:wideScreen?7*mm:0 currentIndex:bar.currentIndex - Loader{ id: newstab Layout.fillWidth:true Layout.fillHeight: true property string newstabstatus property var conversation:[] - property var contactposts:[] + source:(rootstack.currentIndex==0)? "qrc:/qml/newsqml/NewsTab.qml":"" } Loader{ id: friendstab - Layout.fillWidth:true - Layout.fillHeight: true + // Layout.fillWidth:true + // Layout.fillHeight: true source: (rootstack.currentIndex==1)?"qrc:/qml/contactqml/FriendsTab.qml":"" } Loader{ id: fotostab property string phototabstatus:"Images" - Layout.fillWidth:true - Layout.fillHeight: true + // Layout.fillWidth:true + // Layout.fillHeight: true source: (rootstack.currentIndex==2)?"qrc:/qml/photoqml/PhotoTab.qml":"" } Loader{ id: calendartab property string calendartabstatus:"Events" - Layout.fillWidth:true - Layout.fillHeight: true + // Layout.fillWidth:true + // Layout.fillHeight: true source: (rootstack.currentIndex==3)?"qrc:/qml/calendarqml/CalendarTab.qml":"" } - } + } + //} Component.onCompleted: { - forceActiveFocus(); - //print(xhr.networktype()); + onLoginChanged(login); + globaloptions=Service.readGO(db); + //forceActiveFocus(); if(osSettings.osType=="Android"){ var component = Qt.createComponent("qrc:/qml/genericqml/IntentReceiver.qml"); var IntentReceiverQml = component.createObject(root); @@ -400,5 +299,5 @@ StackView{ var LinuxSyncQml = component.createObject(root); } } -} + //} } diff --git a/source-linux/CMakeLists.txt b/source-linux/CMakeLists.txt new file mode 100644 index 0000000..5569c2d --- /dev/null +++ b/source-linux/CMakeLists.txt @@ -0,0 +1,47 @@ +cmake_minimum_required(VERSION 3.1.0) + +project(friendiqa VERSION 0.6 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) + +if(CMAKE_VERSION VERSION_LESS "3.7.0") + set(CMAKE_INCLUDE_CURRENT_DIR ON) +endif() + +find_package(Qt5 COMPONENTS Widgets Quick Sql DBus WebView REQUIRED) + +set(MOC_SOURCES common/uploadableimage.h + common/xhr.h + common/filesystem.h + common/remoteauthasyncimageprovider.h + common/updatenews.h + common/alarm.h) + +set(SOURCES common/friendiqa.cpp + common/uploadableimage.cpp + common/xhr.cpp + common/filesystem.cpp + common/remoteauthasyncimageprovider.cpp + common/updatenews.cpp + common/alarmlinux.cpp) + +include_directories(common) + +add_executable(friendiqa ${SOURCES} ${MOC_SOURCES} application.qrc) + +target_link_libraries(friendiqa Qt::Core) +target_link_libraries(friendiqa Qt::Widgets) +target_link_libraries(friendiqa Qt::Quick) +target_link_libraries(friendiqa Qt::Sql) +target_link_libraries(friendiqa Qt::WebView) +target_link_libraries(friendiqa Qt::DBus) +# target_link_libraries(friendiqa Qt::Webengine) + +# qt5_use_modules(friendiqa Core Widgets Quick Sql DBus) + +install(TARGETS friendiqa DESTINATION bin) diff --git a/source-linux/application.qrc b/source-linux/application.qrc index c4d4cd8..091eb8a 100644 --- a/source-linux/application.qrc +++ b/source-linux/application.qrc @@ -19,7 +19,6 @@ qml/contactqml/FriendsTab.qml qml/contactqml/GroupComponent.qml qml/contactqml/ProfileComponent.qml - qml/contactqml/ContactDetailsComponent.qml qml/contactqml/Contactlist.qml qml/photoqml/PhotoComponent.qml qml/photoqml/PhotogroupComponent.qml @@ -237,6 +236,16 @@ common/xhr.cpp common/xhr.h qml/newsqml/MoreComments.qml - common/filesystemandroid.cpp + qml/newsqml/NewsPhotolist.qml + qml/genericqml/DrawerAccountComponent.qml + qml/configqml/LeftDrawerScrollview.qml + qml/genericqml/LeftDrawerLinux.qml + qml/genericqml/LeftDrawerAndroid.qml + qml/genericqml/DrawerAccountComponentContacts.qml + qml/contactqml/ProfileTab.qml + qml/contactqml/FriendsListTab.qml + qml/contactqml/ContactsListTab.qml + qml/contactqml/GroupsListTab.qml + qml/calendarqml/EventListItem.qml diff --git a/source-linux/common/alarm.h b/source-linux/common/alarm.h index 9d35fd0..9edea0b 100644 --- a/source-linux/common/alarm.h +++ b/source-linux/common/alarm.h @@ -40,7 +40,6 @@ class ALARM : public QObject //Q_PROPERTY(int alarmtime READ alarmtime WRITE setAlarm NOTIFY alarmChanged) public: static ALARM *instance(); - explicit ALARM(QObject *parent = 0); //int alarmtime() const; diff --git a/source-linux/common/friendiqa.cpp b/source-linux/common/friendiqa.cpp index 52ef822..794697c 100644 --- a/source-linux/common/friendiqa.cpp +++ b/source-linux/common/friendiqa.cpp @@ -31,7 +31,7 @@ #include #include -#include +//#include //#include //#include #include @@ -39,7 +39,7 @@ #include "updatenews.h" #include "filesystem.h" #include "remoteauthasyncimageprovider.h" -//#include "alarm.h" +#include "alarm.h" //#include "AndroidNative/systemdispatcher.h" //#include "AndroidNative/environment.h" //#include "AndroidNative/debug.h" @@ -73,15 +73,16 @@ int main(int argc, char *argv[]) { //return app.exec(); } else{ - QtWebEngine::initialize(); + //QtWebEngine::initialize(); QApplication app(argc, argv); - QQuickView view; - view.setResizeMode(QQuickView::SizeRootObjectToView); + QQmlApplicationEngine view; + //QQuickView view; + //view.setResizeMode(QQuickView::SizeRootObjectToView); QTranslator qtTranslator; qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations"); app.installTranslator(&qtTranslator); RemoteAuthAsyncImageProvider *imageProvider = new RemoteAuthAsyncImageProvider; - view.engine()->addImageProvider("remoteauthimage",imageProvider); + view.addImageProvider("remoteauthimage",imageProvider); view.rootContext()->setContextProperty("remoteauth", imageProvider); XHR* xhr = XHR::instance(); view.rootContext()->setContextProperty("xhr", xhr); @@ -92,8 +93,8 @@ int main(int argc, char *argv[]) { UPDATENEWS* updatenews = UPDATENEWS::instance(); view.rootContext()->setContextProperty("updatenews", updatenews); - view.setSource(QUrl("qrc:/qml/friendiqa.qml")); - view.show(); + view.load(QUrl("qrc:/qml/friendiqa.qml")); + //view.show(); view.connect(view.rootContext()->engine(), SIGNAL(quit()), &app, SLOT(quit())); return app.exec(); } diff --git a/source-linux/common/updatenews.cpp b/source-linux/common/updatenews.cpp index 5441f10..77d607a 100644 --- a/source-linux/common/updatenews.cpp +++ b/source-linux/common/updatenews.cpp @@ -61,11 +61,11 @@ UPDATENEWS::UPDATENEWS(QObject *parent) : QObject(parent) void UPDATENEWS::setUrl(QString url) { - if (url!=m_url) { - m_url = url; - xhr.setUrl(url); - emit urlChanged(m_url); - } + if (url!=m_url) { + m_url = url; + xhr.setUrl(url); + emit urlChanged(m_url); + } } @@ -77,10 +77,10 @@ void UPDATENEWS::setDatabase() m_db.setDatabaseName(QUrl("file://"+db_url+".sqlite").toLocalFile()); //qDebug() << db_url; - if (!m_db.open()) - { - qDebug() << "Error: connection with database fail " << m_db.lastError(); - } + if (!m_db.open()) + { + qDebug() << "Error: connection with database fail " << m_db.lastError(); + } } @@ -89,23 +89,23 @@ void UPDATENEWS::login() QSqlQuery query("SELECT * FROM config WHERE isActive=0",m_db); while (query.next()) { - username = query.value(1).toString(); - QByteArray bpassword=query.value(2).toByteArray(); - QString password=QByteArray::fromBase64(bpassword); - m_login=username+":"+password ; - xhr.setLogin(m_login); - m_url=query.value(0).toString(); - xhr.setUrl(m_url); - m_imagedir=query.value(3).toString(); - xhr.setImagedir(m_imagedir); - QString isActive=query.value(7).toString(); + username = query.value(1).toString(); + QByteArray bpassword=query.value(2).toByteArray(); + QString password=QByteArray::fromBase64(bpassword); + m_login=username+":"+password ; + xhr.setLogin(m_login); + m_url=query.value(0).toString(); + xhr.setUrl(m_url); + m_imagedir=query.value(3).toString(); + xhr.setImagedir(m_imagedir); + QString isActive=query.value(7).toString(); } - //m_updateInterval=query.value(5).toInt(); + //m_updateInterval=query.value(5).toInt(); QSqlQuery syncquery("SELECT * FROM globaloptions",m_db); -// QSqlQuery delquery("DELETE FROM globaloptions WHERE k='sync_interval'",m_db); -// delquery.exec(); + // QSqlQuery delquery("DELETE FROM globaloptions WHERE k='sync_interval'",m_db); + // delquery.exec(); m_updateInterval=0; syncindex=0; synclist.clear(); @@ -136,33 +136,35 @@ void UPDATENEWS::login() void UPDATENEWS::startsync() { qDebug()<<"Friendiqa start syncing "<

"+newsitem["friendica_html"].toString(); query.bindValue(11, friendicaHtml.toUtf8().toBase64());} else{query.bindValue(11, newsitem["friendica_html"].toString().toUtf8().toBase64());} - query.bindValue(12, newsitem["statusnet_conversation_id"].toInt()); + if (newsitem["statusnet_conversation_id"].isDouble()){ + query.bindValue(12, newsitem["statusnet_conversation_id"].toInt()); + }else{query.bindValue(12, newsitem["statusnet_conversation_id"].toString());} QJsonArray likeArray;QJsonArray dislikeArray;QJsonArray attendyesArray;QJsonArray attendnoArray;QJsonArray attendmaybeArray; if (newsitem.toObject().contains("friendica_activities")){ for (int a=0; a < newsitem["friendica_activities"]["like"].toArray().count();a++){ @@ -310,7 +327,7 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname) for (int e = 0; e < newsitem["friendica_activities"]["attendmaybe"].toArray().count();e++){ attendmaybeArray.append(newsitem["friendica_activities"]["attendmaybe"][e]["url"].toString()); } - } + } QJsonArray friendica_activities; friendica_activities={likeArray,dislikeArray,attendyesArray,attendnoArray,attendmaybeArray}; QJsonDocument activities; activities.setArray(friendica_activities); query.bindValue(13,activities.toJson(QJsonDocument::Compact).toBase64()); @@ -326,7 +343,7 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname) query.bindValue(16, newsitem["friendica_author"]["url"]); }else { query.bindValue(16, newsitem["user"]["url"]); - } + } if (apiname=="/api/statuses/replies"){ query.bindValue(1,"3"); @@ -382,7 +399,7 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname) QList newcontacts=findNewContacts(news); if (newcontacts.size()>0){ updateContacts(newcontacts); - startImagedownload(); + startImagedownload("contactlist"); } else { if(m_updateInterval!=0){ @@ -404,6 +421,7 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname) void UPDATENEWS::updateImageLocation(QString downloadtype,QString imageurl, QString filename, int index){ + //qDebug()<< "update Imagelocation " << downloadtype << " " << imageurl << " " << filename; if (downloadtype=="contactlist"){ QSqlQuery testquery("SELECT profile_image FROM contacts WHERE profile_image_url ='"+imageurl+ "' AND username = '" +username+"'",m_db); testquery.first(); @@ -413,6 +431,22 @@ void UPDATENEWS::updateImageLocation(QString downloadtype,QString imageurl, QStr newcontactnames.clear(); newcontactimagelinks.clear(); if(m_updateInterval!=0){ + qDebug()<< "contactdownload finished!"; + syncindex+=1; + startsync(); + } + } + } + else if (downloadtype=="friendrequests"){ + QSqlQuery testquery("SELECT avatar_static FROM friendshiprequests WHERE avatar ='"+imageurl+ "' AND username = '" +username+"'",m_db); + testquery.first(); + QSqlQuery query("UPDATE friendshiprequests SET avatar_static='"+ filename +"' WHERE avatar ='"+imageurl+ "' AND username = '" +username+"'",m_db); + if(!(query.exec())) {qDebug()<< "update friendrequests Imagelocation " << query.lastError();} + if (index==(newcontactnames.length()-1)){ + newcontactnames.clear(); + newcontactimagelinks.clear(); + if(m_updateInterval!=0){ + qDebug()<< "friendrequests finished!"; syncindex+=1; startsync(); } @@ -421,6 +455,7 @@ void UPDATENEWS::updateImageLocation(QString downloadtype,QString imageurl, QStr } QJsonObject UPDATENEWS::findNotificationContact(QString contacturl){ + //qDebug()<< "findNotificationContact "< UPDATENEWS::findNewContacts(QJsonDocument news){ //main contacts if (news[i].toObject().contains("sender") ){ if(imageurls.contains(news[i]["sender"]["profile_image_url"].toString().section('?',0,0)) || newcontactimagelinks.contains(news[i]["sender"]["profile_image_url"].toString().section('?',0,0))){ - } + } else{ newcontacts.append(news[i]["sender"]); newcontactimagelinks.append(news[i]["sender"]["profile_image_url"].toString().section('?',0,0)); @@ -462,7 +497,7 @@ QList UPDATENEWS::findNewContacts(QJsonDocument news){ if (news[i].toObject().contains("friendica_activities") ){ for (int a=0; a < news[i]["friendica_activities"]["like"].toArray().count();a++){ if(imageurls.contains(news[i]["friendica_activities"]["like"][a]["profile_image_url"].toString().section('?',0,0)) || newcontactimagelinks.contains(news[i]["friendica_activities"]["like"][a]["profile_image_url"].toString().section('?',0,0))){ - } + } else{ newcontacts.append(news[i]["friendica_activities"]["like"][a]); newcontactimagelinks.append(news[i]["friendica_activities"]["like"][a]["profile_image_url"].toString().section('?',0,0)); @@ -471,7 +506,7 @@ QList UPDATENEWS::findNewContacts(QJsonDocument news){ } for (int b=0; b < news[i]["friendica_activities"]["dislike"].toArray().count();b++){ if(imageurls.contains(news[i]["friendica_activities"]["dislike"][b]["profile_image_url"].toString().section('?',0,0)) || newcontactimagelinks.contains(news[i]["friendica_activities"]["dislike"][b]["profile_image_url"].toString().section('?',0,0))){ - } + } else{ newcontacts.append(news[i]["friendica_activities"]["dislike"][b]); newcontactimagelinks.append(news[i]["friendica_activities"]["dislike"][b]["profile_image_url"].toString().section('?',0,0)); @@ -482,13 +517,13 @@ QList UPDATENEWS::findNewContacts(QJsonDocument news){ //owner contacts if (news[i].toObject().contains("friendica_author") ){ if(imageurls.contains(news[i]["friendica_author"]["profile_image_url"].toString().section('?',0,0)) || newcontactimagelinks.contains(news[i]["friendica_owner"]["profile_image_url"].toString().section('?',0,0))){ - } + } else{ newcontacts.append(news[i]["friendica_author"]); newcontactimagelinks.append(news[i]["friendica_author"]["profile_image_url"].toString().section('?',0,0)); newcontactnames.append(news[i]["friendica_author"]["screen_name"].toString()); } - } + } } return newcontacts; } @@ -585,9 +620,110 @@ void UPDATENEWS::updateContacts(QList contacts){ } } +void UPDATENEWS::storeFriendrequests(QByteArray serverreply,QString apiname) +{ if (apiname!=m_api || xhr.downloadtype()!=""){} else { + QJsonDocument friendrequests; + QJsonParseError jsonerror; + friendrequests=QJsonDocument::fromJson(serverreply,&jsonerror); + if (friendrequests.isArray()){ + + QSqlQuery imagequery("SELECT avatar FROM friendshiprequests",m_db); + QList imageurls; + while (imagequery.next()){ + imageurls.append(imagequery.value(0).toString()); + } + + for (int i=0; i < friendrequests.array().count();i++){ + QJsonValue friendrequestitem=friendrequests[i]; + try{ + QSqlQuery testquery("SELECT url FROM friendshiprequests WHERE username='"+ username +"' AND url='" + friendrequestitem["url"].toString() +"'",m_db); + QSqlQuery query(m_db); + if (testquery.first()){ + query.prepare("UPDATE friendshiprequests SET id=?, usernamef=?, acct=?, display_name=?,locked=?," + "bot=?, discoverable=?, groupf=?, created_at=?," + "note=?, avatar=?, header=?, header_static=?, followers_count=?," + "following_count=?, statuses_count=?, last_status_at=?, emojis=?, fields=? " + " WHERE username='"+ username +"' AND url='" + friendrequestitem["url"].toString() +"'"); + + query.bindValue(0, friendrequestitem["id"].toInt()); + query.bindValue(1, friendrequestitem["username"]); + query.bindValue(2, friendrequestitem["acct"]); + query.bindValue(3, friendrequestitem["display_name"].toString().toUtf8().toBase64()); + query.bindValue(4, friendrequestitem["locked"].toBool()); + query.bindValue(5, friendrequestitem["bot"].toBool()); + query.bindValue(6, friendrequestitem["discoverable"].toBool()); + query.bindValue(7, friendrequestitem["group"].toBool()); + query.bindValue(8, QDateTime::fromString(friendrequestitem["created_at"].toString(),Qt::ISODate).toMSecsSinceEpoch() ); + query.bindValue(9, friendrequestitem["note"].toString().toUtf8().toBase64()); + query.bindValue(10, friendrequestitem["avatar"]); + query.bindValue(11, friendrequestitem["header"]); + query.bindValue(12, friendrequestitem["header_static"]); + query.bindValue(13, friendrequestitem["followers_count"].toInt()); + query.bindValue(14, friendrequestitem["following_count"].toInt()); + query.bindValue(15, friendrequestitem["statuses_count"].toInt()); + query.bindValue(16, QDateTime::fromString(friendrequestitem["last_status_at"].toString(),Qt::ISODate).toMSecsSinceEpoch() ); + query.bindValue(17, friendrequestitem["emojis"].toString().toUtf8().toBase64()); + query.bindValue(18, friendrequestitem["fields"].toString().toUtf8().toBase64()); + } + else{ + + query.prepare("INSERT INTO friendshiprequests (username, id, usernamef, acct, display_name, locked," + " created_at, followers_count, following_count, statuses_count, note, url, avatar, avatar_static, " + "header, header_static, emojis, moved, fields, bot, groupf, discoverable, last_status_at) " + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + query.bindValue(0, username); + query.bindValue(1, friendrequestitem["id"].toInt()); + query.bindValue(2, friendrequestitem["username"].toString()); + query.bindValue(3, friendrequestitem["acct"].toString()); + query.bindValue(4, friendrequestitem["display_name"].toString().toUtf8().toBase64()); + query.bindValue(5, friendrequestitem["locked"].toBool()); + query.bindValue(6, QDateTime::fromString(friendrequestitem["created_at"].toString(),Qt::ISODate).toMSecsSinceEpoch()); + query.bindValue(7, friendrequestitem["followers_count"].toInt()); + query.bindValue(8, friendrequestitem["following_count"].toInt()); + query.bindValue(9, friendrequestitem["statuses_count"].toInt()); + query.bindValue(10, friendrequestitem["note"].toString().toUtf8().toBase64()); + query.bindValue(11, friendrequestitem["url"].toString()); + query.bindValue(12, friendrequestitem["avatar"].toString()); + query.bindValue(13, ""); + query.bindValue(14, friendrequestitem["header"].toString()); + query.bindValue(15, friendrequestitem["header_static"].toString()); + query.bindValue(16, friendrequestitem["emojis"].toString().toUtf8().toBase64()); + query.bindValue(17, "false"); + query.bindValue(18, friendrequestitem["fields"].toString().toUtf8().toBase64()); + query.bindValue(19, friendrequestitem["bot"].toBool()); + query.bindValue(20, friendrequestitem["group"].toBool()); + query.bindValue(21, friendrequestitem["discoverable"].toBool()); + query.bindValue(22, QDateTime::fromString(friendrequestitem["last_status_at"].toString(),Qt::ISODate).toMSecsSinceEpoch()); + + if(notifylist.contains("notify_FriendRequests")){ + alarm.notify("Friend Request: "+ friendrequestitem["acct"].toString(),friendrequestitem["note"].toString(),0); + } + + } + if(!(query.exec())) {qDebug()<< "friendrequestitem error " << query.lastError() << " " << query.lastQuery();} + } catch(...){ + qDebug() << "Friendiqasync Error inserting friendrequestitem" << friendrequestitem["acct"] << " " ; + } + + if(imageurls.contains(friendrequestitem["avatar"].toString() )){ + } + else{ + newcontactimagelinks.append(friendrequestitem["avatar"].toString()); + newcontactnames.append(friendrequestitem["username"].toString()); + } + + } + if (newcontactimagelinks.length()>0){ + qDebug() << "start Friendrequests imagedownload"; + startImagedownload("friendrequests"); + } + } + } + QObject::disconnect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(storeFriendrequests(QByteArray,QString))); +} void UPDATENEWS::storeEvents(QByteArray serverreply,QString apiname) -{ if (apiname!=m_api || xhr.downloadtype()!=""){} else { +{ if (apiname!=m_api || xhr.downloadtype()!=""){} else { QJsonDocument events; QJsonParseError jsonerror; events=QJsonDocument::fromJson(serverreply,&jsonerror); @@ -616,18 +752,18 @@ void UPDATENEWS::storeEvents(QByteArray serverreply,QString apiname) QJsonDocument permissionDocument; permissionDocument.setArray(permissions); query.bindValue(13,permissionDocument.toJson(QJsonDocument::Compact)); if(!(query.exec())) {qDebug()<< "store events " << query.lastError();} - } catch(...){ - qDebug() << "Friendiqasync Error event" << eventitem["name"]; - } + } catch(...){ + qDebug() << "Friendiqasync Error event" << eventitem["name"]; + } } - emit this->success(m_api); + emit this->success(m_api); } } if(notifylist.contains("notify_Events")){ QSqlQuery eventnotifyquery("SELECT start,title FROM events WHERE (start BETWEEN " + QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch()) + " AND "+QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch()+(m_updateInterval*60*1000))+") AND username='"+ username +"'",m_db); - while (eventnotifyquery.next()) { - alarm.notify("Event: "+ QDateTime::fromMSecsSinceEpoch(eventnotifyquery.value(0).toLongLong()).toString("dd.MM.yyyy hh:mm"),eventnotifyquery.value(1).toString(),1); - } + while (eventnotifyquery.next()) { + alarm.notify("Event: "+ QDateTime::fromMSecsSinceEpoch(eventnotifyquery.value(0).toLongLong()).toString("dd.MM.yyyy hh:mm"),eventnotifyquery.value(1).toString(),1); + } } if(m_updateInterval!=0){ syncindex+=1; @@ -641,9 +777,9 @@ QString UPDATENEWS::url() const return m_url; } -void UPDATENEWS::startImagedownload() +void UPDATENEWS::startImagedownload(QString downloadtype) { - xhr.setDownloadtype("contactlist"); + xhr.setDownloadtype(downloadtype ); xhr.setFilelist(newcontactimagelinks); xhr.setContactlist(newcontactnames); xhr.setImagedir(m_imagedir); diff --git a/source-linux/common/updatenews.h b/source-linux/common/updatenews.h index b44b558..4fe6741 100644 --- a/source-linux/common/updatenews.h +++ b/source-linux/common/updatenews.h @@ -68,11 +68,13 @@ public slots: void startsync(); void directmessages(); void notifications(); + void friendrequests(); void events(); //void startservice(QString type,QVariantMap map); - void startImagedownload(); + void startImagedownload(QString downloadtype); void updateImageLocation(QString downloadtype,QString imageurl, QString filename, int index); void store(QByteArray serverreply,QString apiname); + void storeFriendrequests(QByteArray serverreply,QString apiname); void storeEvents(QByteArray serverreply,QString apiname); void showError(QString data, QString url,QString api, int code); diff --git a/source-linux/common/xhr.cpp b/source-linux/common/xhr.cpp index d098037..27b31d6 100644 --- a/source-linux/common/xhr.cpp +++ b/source-linux/common/xhr.cpp @@ -218,7 +218,7 @@ void XHR::getlist() { if(dlindex < m_filelist.size()) { QString cleanfilename; - if (m_downloadtype=="contactlist"){cleanfilename = m_contactlist.at(dlindex)+"-"+ m_filelist.at(dlindex).section('/',-1).section('?',0,0); + if (m_downloadtype=="contactlist" || m_downloadtype=="friendrequests" ){cleanfilename = m_contactlist.at(dlindex)+"-"+ m_filelist.at(dlindex).section('/',-1).section('?',0,0); XHR::setFilename(imagedir()+"contacts/"+cleanfilename); XHR::setUrl(m_filelist.at(dlindex));} else { @@ -329,7 +329,7 @@ void XHR::onRequestFinished() buffer.clear(); file.close(); emit this->downloaded(m_downloadtype,m_url,m_filename,dlindex); - if(downloadtype()=="contactlist"){dlindex=dlindex+1;XHR::getlist();} + if(downloadtype()=="contactlist" || downloadtype()=="friendrequests"){dlindex=dlindex+1;XHR::getlist();} //reply->deleteLater(); } diff --git a/source-linux/js/helper.js b/source-linux/js/helper.js index c69d524..e22ccbe 100644 --- a/source-linux/js/helper.js +++ b/source-linux/js/helper.js @@ -60,12 +60,12 @@ function friendicaPostRequest(login,api,data,method,rootwindow,callback) { } else if(xhrequest.readyState === XMLHttpRequest.DONE) { try{ if (xhrequest.responseText!=""){ callback(xhrequest.responseText) - }else{ + }else{print("API:\n" +api+" NO RESPONSE"); showMessage("Error","API:\n" +api+" NO RESPONSE",rootwindow) callback(xhrequest.responseText) } } - catch (e){showMessage("Error", "API:\n" + api+" "+e+"\n Return:"+xhrequest.responseText,rootwindow)} + catch (e){print("API:\n" + api+" "+e+"\n Return:"+xhrequest.responseText);showMessage("Error", "API:\n" + api+" "+e+"\n Return:"+xhrequest.responseText,rootwindow)} } } xhrequest.open(method, login.server+api,true,login.username,Qt.atob(login.password)); @@ -166,6 +166,20 @@ var where = " AND "+ filter +" = '" + filtervalue+"'"; }); } + +function deleteData(database,table, username, callback,filter,filtervalue) { // reads and applies data from DB +if (filter){ +var where = " AND "+ filter +" = '" + filtervalue+"'"; +} else { var where="";} + var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); + if(!db) { return; } + db.transaction( function(tx) { + var rsArray=[]; + var rs = tx.executeSql('DELETE from '+table+' WHERE username="'+username+'"'+where); + callback(); + }); +} + function showMessage(header,message,rootwindow){//print(message); var cleanmessage=message.replace(/"/g,"-"); if(cleanmessage.length>200){cleanmessage=cleanmessage.slice(0,200)+'...'} diff --git a/source-linux/js/image.js b/source-linux/js/image.js index 2a5fdb0..b05bf08 100644 --- a/source-linux/js/image.js +++ b/source-linux/js/image.js @@ -177,7 +177,7 @@ function newRequestFriendsAlbumPictures(login,friend,rootwindow,callback){//prin //commented out for broken remoteauth Helperjs.friendicaRemoteAuthRequest(login,friend.url.replace("profile","photos"),friend.url,rootwindow,function(photohtml){ //Helperjs.friendicaWebRequest(friend.url.replace("profile","photos"),rootwindow,function(photohtml){ - try {var obj=JSON.parse(photohtml);print ("Photohtml: "+photohtml) + try {var obj=JSON.parse(photohtml);//print ("Photohtml: "+photohtml) if (obj.hasOwnProperty('status')){ Helperjs.friendicaWebRequest(friend.url.replace("profile","photos"),rootwindow,function(photohtml){ getAlbumFromHtml(photohtml,false,rootwindow,callback)}) diff --git a/source-linux/js/news.js b/source-linux/js/news.js index 637449c..fd3524c 100644 --- a/source-linux/js/news.js +++ b/source-linux/js/news.js @@ -334,7 +334,7 @@ function favorite(login,favorited,newsid,rootwindow){ } function likerequest(login,database,verb,newsid,rootwindow){ - Helperjs.friendicaPostRequest(login,"/api/friendica/activity/"+verb+"?id="+newsid, "","POST",rootwindow,function (obj){ + Helperjs.friendicaPostRequest(login,"/api/friendica/activity/"+verb+"?id="+newsid, "","POST",rootwindow,function (obj){print("like "+ obj); if (obj=='"ok"'){ var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); db.transaction( function(tx) { @@ -461,14 +461,16 @@ function chatsfromdb(database,login,messagetype,callback,stop_time){ helpernews.currentconversation=[]; for (var h = 0;h-1){ @@ -112,11 +113,11 @@ function beautify(newsitemobject,msg){ var ythelper={mimetype:"video/youtube"} ythelper.url=yttext.substring(ythelperstringposition+8,ytposend); yttext=yttext.substring(ytposend,yttext.length); - if ((attachmentList.length==0) || (attachmentList[attachmentList.length-1].url!=ythelper.url)){attachmentList.push(ythelper)} + if ((videoAttachmentList.length==0) || (videoAttachmentList[videoAttachmentList.length-1].url!=ythelper.url)){videoAttachmentList.push(ythelper)} } } - newsitemobject.attachmentList=attachmentList; - + newsitemobject.videoAttachmentList=videoAttachmentList; + newsitemobject.imageAttachmentList=imageAttachmentList; if ((msg.options.hasOwnProperty("hide_nsfw"))&&(msg.options.hide_nsfw==1)&&(newsitemobject.text.indexOf("#nsfw")>-1)){ newsitemobject.nsfw=true } else{newsitemobject.nsfw=false} @@ -152,9 +153,9 @@ else{ if (j==0){newsitemobject.indent=0}else{ for (var k=msg.model.count-1;k>-1;k--){ if (newsitemobject.in_reply_to_status_id==msg.model.get(k).newsitemobject.id){ - newsitemobject.indent=msg.model.get(k).newsitemobject.indent+1; + newsitemobject.indent=(msg.model.get(k).newsitemobject.indent||0)+1; if (newsitemobject.indent>6){newsitemobject.indent=6}; - break} + } } }} diff --git a/source-linux/js/service.js b/source-linux/js/service.js index 2c71591..b15338b 100644 --- a/source-linux/js/service.js +++ b/source-linux/js/service.js @@ -46,7 +46,7 @@ function initDatabase(database) { // initialize the database object tx.executeSql('CREATE TABLE IF NOT EXISTS news(username TEXT, messagetype INT, text TEXT, created_at INT, in_reply_to_status_id INT, source TEXT, status_id INT, in_reply_to_user_id INT, geo TEXT,favorited TEXT, uid INT, statusnet_html TEXT, statusnet_conversation_id TEXT,friendica_activities TEXT, friendica_activities_self TEXT, attachments TEXT, friendica_owner TEXT)'); tx.executeSql('CREATE TABLE IF NOT EXISTS contacts(username TEXT, id INT, name TEXT, screen_name TEXT, location TEXT,imageAge INT, profile_image_url TEXT, description TEXT, profile_image BLOB, url TEXT, protected TEXT, followers_count INT, friends_count INT, created_at INT, favourites_count TEXT, utc_offset TEXT, time_zone TEXT, statuses_count INT, following TEXT, verified TEXT, statusnet_blocking TEXT, notifications TEXT, statusnet_profile_url TEXT, cid INT, network TEXT, isFriend INT, timestamp INT)'); // tx.executeSql('CREATE INDEX IF NOT EXISTS contact_id ON contacts(id)'); - tx.executeSql('CREATE TABLE IF NOT EXISTS profiles(username TEXT, id INT, profiledata TEXT)'); + tx.executeSql('CREATE TABLE IF NOT EXISTS profiles(username TEXT, id INT, profiledata TEXT)'); tx.executeSql('CREATE TABLE IF NOT EXISTS groups(username TEXT, groupname TEXT, gid INT, members TEXT)'); tx.executeSql('CREATE TABLE IF NOT EXISTS events(username TEXT, id INT, start INT, end INT, allday INT, title TEXT, j INT, d TEXT, isFirst INT, uid INT, cid INT, uri TEXT, created INT, edited INT, desc TEXT, location TEXT, type TEXT, nofinish TEXT, adjust INT, ignore INT, permissions TEXT, guid INT, itemid INT, plink TEXT, authorName TEXT, authorAvatar TEXT, authorLink TEXT, html TEXT)'); tx.executeSql('CREATE TABLE IF NOT EXISTS globaloptions(k TEXT, v TEXT)'); @@ -277,10 +277,12 @@ try {Helperjs.friendicaRequest(login,"/api/statusnet/config",rootwindow, functio function readConfig(database,callback,filter,filtervalue) { // reads config if (filter){var where = " WHERE "+ filter +" = '" + filtervalue+"'"} else { var where=""} + //print("readConfig"); var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3],initDatabase(database)); db.transaction( function(tx) { var tables = tx.executeSql("SELECT * FROM sqlite_master WHERE type='table'"); if (tables.rows.length==0){print("no database");callback("")} else { + var rs = tx.executeSql('select * from config'+where); var rsArray=[]; if (rs.rows.length>0){ @@ -289,11 +291,29 @@ function readConfig(database,callback,filter,filtervalue) { // reads config } var rsObject={server:rsArray[0].server,username:rsArray[0].username, password:rsArray[0].password,imagestore:rsArray[0].imagestore,isActive:rsArray[0].isActive, newsViewType:rsArray[0].newsViewType,permissions:JSON.parse(rsArray[0].permissions),maxContactAge:rsArray[0].maxContactAge,APIVersion:rsArray[0].APIVersion,addons:rsArray[0].addons}; if (rsObject.newsViewType!="" && rsObject.newsViewType!=null){updateNewsviewtype(database,rsObject.newsViewType)} - } else {var rsObject=""} + } else {print("config empty");var rsObject=""} callback(rsObject)}} ) } +function readAllLogins(database,callback) { // reads config + var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3],initDatabase(database)); + db.transaction( function(tx) { + var tables = tx.executeSql("SELECT * FROM sqlite_master WHERE type='table'"); + if (tables.rows.length==0){print("no database");callback("")} else { + var rs = tx.executeSql('select * from config'); + var rsArray=[]; + if (rs.rows.length>0){ + for(var i = 0; i < rs.rows.length; i++) { + rsArray.push(rs.rows.item(i)); + rsArray[i].permissions=JSON.parse(rsArray[i].permissions) + } + } + } + callback(rsArray)} + ) +} + function readActiveConfig(database){ var obj=""; readConfig(database,function(config){obj=config},"isActive", 0); @@ -312,7 +332,7 @@ function readGlobaloptions(database,callback){ var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); var go=({}); db.transaction( function(tx) { - var rs = tx.executeSql('select * from globaloptions'); + var rs = tx.executeSql('select * from globaloptions'); for (var r=0; r

"+newslist[n].friendica_html;} - else{newslist[n].statusnet_html=newslist[n].friendica_html} + if (newslist[n]!=null){ + newslist[n].created_at=Date.parse(Newsjs.cleanDate(newslist[n].created_at)); + if (api=="/api/statuses/replies"){newslist[n].messagetype=3}else{newslist[n].messagetype=0;} + newslist[n].friendica_author=cleanUser(newslist[n].friendica_author); + newslist[n].user=cleanUser(newslist[n].user); + if (newslist[n].friendica_title!="") {newslist[n].statusnet_html=""+newslist[n].friendica_title +"

"+newslist[n].friendica_html;} + else{newslist[n].statusnet_html=newslist[n].friendica_html} - if(newslist[n].in_reply_to_user_id){newslist[n].reply_user=Newsjs.objFromArray(allcontacts,"id",newslist[n].in_reply_to_user_id)} - if(newslist[n].hasOwnProperty('friendica_activities')){ - for (var m in newslist[n].friendica_activities.like){ - newslist[n].friendica_activities.like[m]=cleanUser(newslist[n].friendica_activities.like[m]); - } - for (var o in newslist[n].friendica_activities.dislike){ - newslist[n].friendica_activities.dislike[o]=cleanUser(newslist[n].friendica_activities.dislike[o]); - } - for (var p in newslist[n].friendica_activities.attendyes){ - newslist[n].friendica_activities.attendyes[p]=cleanUser(newslist[n].friendica_activities.attendyes[p]); - } - for (var q in newslist[n].friendica_activities.attendno){ - newslist[n].friendica_activities.attendno[q]=cleanUser(newslist[n].friendica_activities.attendno[q]); - } - for (var r in newslist[n].friendica_activities.attendmaybe){ - newslist[n].friendica_activities.attendmaybe[r]=cleanUser(newslist[n].friendica_activities.attendmaybe[r]); - } - } - if(!(newslist[n].hasOwnProperty('friendica_author'))){ - newslist[n].friendica_author=newslist[n].user - } - var conversationindex=conversationIds.indexOf(newslist[n].statusnet_conversation_id); + if(newslist[n].in_reply_to_user_id){newslist[n].reply_user=Newsjs.objFromArray(allcontacts,"id",newslist[n].in_reply_to_user_id)} + if(newslist[n].hasOwnProperty('friendica_activities')){ + for (var m in newslist[n].friendica_activities.like){ + newslist[n].friendica_activities.like[m]=cleanUser(newslist[n].friendica_activities.like[m]); + } + for (var o in newslist[n].friendica_activities.dislike){ + newslist[n].friendica_activities.dislike[o]=cleanUser(newslist[n].friendica_activities.dislike[o]); + } + for (var p in newslist[n].friendica_activities.attendyes){ + newslist[n].friendica_activities.attendyes[p]=cleanUser(newslist[n].friendica_activities.attendyes[p]); + } + for (var q in newslist[n].friendica_activities.attendno){ + newslist[n].friendica_activities.attendno[q]=cleanUser(newslist[n].friendica_activities.attendno[q]); + } + for (var r in newslist[n].friendica_activities.attendmaybe){ + newslist[n].friendica_activities.attendmaybe[r]=cleanUser(newslist[n].friendica_activities.attendmaybe[r]); + } + } + if(!(newslist[n].hasOwnProperty('friendica_author'))){ + newslist[n].friendica_author=newslist[n].user + } + var conversationindex=conversationIds.indexOf(newslist[n].statusnet_conversation_id); - //fill chatlist - if (conversationindex==-1){ - chatlist.push(newslist[n]); - conversationIds.push(newslist[n].statusnet_conversation_id); - commentCount.push(1); - } else{ - commentCount[conversationindex]=commentCount[conversationindex]+1; - chatlist[conversationindex]=newslist[n]; + //fill chatlist + if (conversationindex==-1){ + chatlist.push(newslist[n]); + conversationIds.push(newslist[n].statusnet_conversation_id); + commentCount.push(1); + } else{ + commentCount[conversationindex]=commentCount[conversationindex]+1; + chatlist[conversationindex]=newslist[n]; + } } } //enrich chatlist with old entries @@ -541,8 +572,8 @@ function processNews(api,data){ newslist.reverse(); newstab.conversation=newslist } - else if (api=="/api/statuses/user_timeline"){ - newstab.contactposts=newslist + else if (api=="/api/statuses/user_timeline" || api=="/api/users/show"){ + root.contactposts=newslist } else if ((api!="/api/direct_messages/all")&&(api!="/api/friendica/notifications")&&(newstab.newstabstatus==="Conversations")){ showNews(chatlist);root.news=newslist diff --git a/source-linux/qml/calendarqml/CalendarDay.qml b/source-linux/qml/calendarqml/CalendarDay.qml index 18232f9..6033099 100644 --- a/source-linux/qml/calendarqml/CalendarDay.qml +++ b/source-linux/qml/calendarqml/CalendarDay.qml @@ -34,12 +34,15 @@ import QtQuick 2.11 Item { id: calendarDay - width:7*mm - height: 7*mm + width: root.fontFactor*osSettings.bigFontSize*2//5*mm + height: root.fontFactor*osSettings.bigFontSize*2//5*mm property int dateInt: Math.floor(Date.parse(model.date)/86400000) //Math.floor((Date.parse(model.date)-(new Date().getTimezoneOffset() * 60 * 1000))/86400000) Rectangle { id: placeHolder - color: 'lightblue'; antialiasing: true + color: model.today?'lightblue':'transparent'; + border.color: 'lightblue' + border.width: 2 + antialiasing: true anchors.fill:parent radius: 0.5*mm } @@ -51,7 +54,7 @@ Item { wrapMode: Text.WrapAnywhere text: model.day font.bold: model.today - font.pixelSize: 4*mm + font.pointSize: 1.2*osSettings.systemFontSize } Rectangle { id:eventRect @@ -59,15 +62,15 @@ Item { anchors.margins: 0.5*mm anchors.bottom: calendarDay.bottom width: parent.width-mm - height: mm + height: 0.5*osSettings.systemFontSize//mm visible: eventdays.indexOf(dateInt)>-1 } MouseArea { anchors.fill: calendarDay - onClicked: { - var component = Qt.createComponent("qrc:/qml/calendarqml/EventList.qml"); - if (component.status== Component.Ready){ - var eventlist = component.createObject(calendartab,{"dayint": dateInt})} + onClicked: {rootstackView.push("qrc:/qml/calendarqml/EventList.qml",{"dayint": dateInt,"events":events}); +// var component = Qt.createComponent("qrc:/qml/calendarqml/EventList.qml"); +// if (component.status== Component.Ready){ +// var eventlist = component.createObject(calendartab,{"dayint": dateInt})} } } } diff --git a/source-linux/qml/calendarqml/CalendarTab.qml b/source-linux/qml/calendarqml/CalendarTab.qml index 67efd8a..57dffc8 100644 --- a/source-linux/qml/calendarqml/CalendarTab.qml +++ b/source-linux/qml/calendarqml/CalendarTab.qml @@ -33,8 +33,7 @@ import QtQuick 2.0 import QtQuick.Controls 2.12 import QtQml 2.2 import Qt.labs.calendar 1.0 -//import QtQuick.Controls 1.2 as Oldcontrol -import QtQuick.Layouts 1.3 +//import QtQuick.Layouts 1.3 import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/calendarqml" @@ -43,9 +42,9 @@ import "qrc:/qml/genericqml" Rectangle { id:calendarrectangle // y:1 -// width:root.width-mm -// height:root.height-5*mm - anchors.fill: parent + width:parent.width//-mm + height:parent.height//-5*mm +// anchors.fill: parent color: '#fff' property date currentTime: new Date() property int offsetTime: currentTime.getTimezoneOffset() * 60 * 1000 @@ -69,6 +68,12 @@ Rectangle { events=eventArray; eventdays=dayArray; calBusy.running=false + + var currentevents=events.filter(event=>(currentTime<=event.end)); + for (var i=0; i(dayint>=event.startday)&&(dayint<=event.endday)); for (var i=0; i0?new Date(event.end).toLocaleString(Qt.locale(),Locale.NarrowFormat):" ")+": "+event.title //+calendarrectangle.offsetTime - font.pixelSize: 3*mm - wrapMode:Text.Wrap - } - - Text { - id:eventDetailsText - x:8*mm - z:4 - width: parent.width-8*mm - height: contentHeight - textFormat: Text.RichText - text: status==""?"":Qt.atob(event.desc) + (event.location==""?"":"

"+qsTr("Location")+": "+event.location)//Qt.atob(event.html) - anchors.top: eventNameText.bottom - font.pixelSize: 3*mm - wrapMode:Text.Wrap - onLinkActivated:{Qt.openUrlExternally(link)} - } - MouseArea{ - anchors.fill: parent - onClicked:{if (status==""){status="large"} else {status=""} - } - } - } } } diff --git a/source-linux/qml/calendarqml/EventListItem.qml b/source-linux/qml/calendarqml/EventListItem.qml new file mode 100644 index 0000000..3d5347f --- /dev/null +++ b/source-linux/qml/calendarqml/EventListItem.qml @@ -0,0 +1,90 @@ +// This file is part of Friendiqa +// https://git.friendi.ca/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + +import QtQuick 2.0 +import QtQuick.Controls 2.12 +import "qrc:/js/service.js" as Service +import "qrc:/js/helper.js" as Helperjs +import "qrc:/qml/genericqml" +import "qrc:/qml/calendarqml" + +Rectangle{ + id:eventItem + property string status: eventstatus + property var currEvent: event + width:parent.width + height:eventNameText.height+eventDetailsText.height+mm + border.color: "light grey" + border.width: 1 + radius: 0.5*mm + Image { + id:profileImage + source: ((event.eventOwner.profile_image!="") && (typeof(event.eventOwner.profile_image)=="string"))? "file://"+event.eventOwner.profile_image : event.eventOwner.profile_image_url + x:1 + y:1 + width: 7*mm + height: 7*mm + //radius:mm + + onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} + } + Text { + id:eventNameText + x: 8*mm + width:parent.width-8*mm + height:contentHeight + font.pointSize: osSettings.systemFontSize + text: new Date(event.start).toLocaleString(Qt.locale(),Locale.NarrowFormat)+ " - " +((event.end>0)&&(event.end!=null)?new Date(event.end).toLocaleString(Qt.locale(),Locale.NarrowFormat):"\u221E")+":\n"+event.title //+calendarrectangle.offsetTime + wrapMode:Text.Wrap + } + + Text { + id:eventDetailsText + x:8*mm + z:4 + width: parent.width-8*mm + height: contentHeight + textFormat: Text.RichText + text: status!="large"?"":Qt.atob(event.desc) + (event.location==""?"":"

"+qsTr("Location")+": "+event.location)//Qt.atob(event.html) + anchors.top: eventNameText.bottom + font.pointSize: osSettings.systemFontSize + wrapMode:Text.Wrap + onLinkActivated:{Qt.openUrlExternally(link)} + } + MouseArea{ + anchors.fill: parent + onClicked:{ + if (status==""){ + rootstackView.push("qrc:/qml/calendarqml/EventList.qml",{"dayint": event.startday, "events":[event]}); + } else {rootstackView.pop()} + } + } +} diff --git a/source-linux/qml/configqml/AccountPage.qml b/source-linux/qml/configqml/AccountPage.qml index 39e59ef..6363511 100644 --- a/source-linux/qml/configqml/AccountPage.qml +++ b/source-linux/qml/configqml/AccountPage.qml @@ -32,7 +32,7 @@ import QtQuick 2.7 import QtQuick.Dialogs 1.2 import QtQuick.Controls 2.12 - +import QtQuick.Layouts 1.12 import "qrc:/js/service.js" as Service import "qrc:/js/layout.js" as Layoutjs import "qrc:/js/helper.js" as Helperjs @@ -55,22 +55,21 @@ Page{ servericon.source=serverdata.site.logo})} catch(e){print(e)} } - Button{ + MButton{ id:userButton - height: 8*mm text:qsTr("User") - //font.pixelSize: 3*mm - font.pointSize: 16 - x: mm - y: mm - width: root.width/2 + font.pointSize: osSettings.bigFontSize + x: root.fontFactor*osSettings.bigFontSize + y: root.fontFactor*osSettings.bigFontSize + width: root.width/2 - 2*mm + height: 2*root.fontFactor*osSettings.bigFontSize visible: users.length>0 onClicked:{ var useritems=""; for (var i=0;i-1){ - Helperjs.showMessage(qsTr("Error"),qsTr("Nicknames containing @ symbol currently not supported"),accountPage) + TextField { + id: servername + x: 4*root.fontFactor*osSettings.bigFontSize; y: 4*root.fontFactor*osSettings.bigFontSize; width: root.width-18*mm; //height: 5*mm; + placeholderText: qsTr("Server") + font.pointSize: osSettings.systemFontSize + onEditingFinished: { + if ((servername.text)==""){} + else if((servername.text).substring(0,7) !=="https://"){ + servername.text= "https://"+text//(serverstring.text).substring(8) } - imagestoredir=filesystem.homePath+"/"+username.text+"/" - //if (imagestore.text==filesystem.homePath+"/.friendiqa/"){imagestore.text=filesystem.homePath+"/.friendiqa/"+username.text+"/"} - } - } + accountPage.setServericon(servername.text)} } -// Button { -// x: root.width-9*mm; y: 23.5*mm; width:5*mm; height:5*mm -// text: "\uf234" -// font.pixelSize: 3*mm -// onClicked: { -// root.push("qrc:/qml/configqml/RegisterPage.qml",{url:servername.text+"/register?nickname="+username.getText(0,username.length)}) -// } -// } - Rectangle{ - color: "light grey" - x: 4*mm; y: 33.5*mm; width: root.width-6*mm; height: 5*mm; - TextInput { - id: password - anchors.fill: parent - //font.pixelSize:3*mm - font.pointSize: 16 - selectByMouse: true - echoMode: TextInput.PasswordEchoOnEdit + TextField { + id: username + x: root.fontFactor*osSettings.bigFontSize; y: 6*root.fontFactor*osSettings.bigFontSize; width: root.width-9*mm; //height: 5*mm; + font.pointSize: osSettings.systemFontSize + placeholderText: qsTr("Nickname") + selectByMouse: true + onEditingFinished: { + if (username.text.indexOf('@')>-1){ + Helperjs.showMessage(qsTr("Error"),qsTr("Nicknames containing @ symbol currently not supported"),accountPage) + } + imagestoredir=filesystem.homePath+"/"+username.text+"/" + //if (imagestore.text==filesystem.homePath+"/.friendiqa/"){imagestore.text=filesystem.homePath+"/.friendiqa/"+username.text+"/"} } + } + + + TextField { + id: password + x: root.fontFactor*osSettings.bigFontSize; y: 9*root.fontFactor*osSettings.bigFontSize; width: root.width-9*mm; //height: 5*mm; + //font.pixelSize:3*mm + font.pointSize: osSettings.systemFontSize + selectByMouse: true + echoMode: TextInput.Password + placeholderText: qsTr("Password") + inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText | Qt.ImhSensitiveData + } + + Text { + id: imagedirlabel + visible: imagestore.text!="" + text: qsTr("Image dir.") + font.pointSize: osSettings.systemFontSize + x: root.fontFactor*osSettings.bigFontSize; y: 12*root.fontFactor*osSettings.bigFontSize + } + + TextField { + id: imagestore + x: root.fontFactor*osSettings.bigFontSize; y: 13*root.fontFactor*osSettings.bigFontSize; width: root.width-17*mm; //height: 5*mm; + visible:imagestore.text!="" + font.pointSize: osSettings.systemFontSize + selectByMouse: true + text: "" //filesystem.homePath+"/.friendiqa/"+username.text+"/" //(osSettings.osType=="Android") && (filesystem.fileexist("/storage/emulated/0/Pictures/"))?"/storage/emulated/0/Pictures/":"" + wrapMode: TextEdit.NoWrap + onTextChanged: imagestoredir=imagestore.text + } + MButton { + x: root.width-3*root.fontFactor*osSettings.bigFontSize; y: 13*root.fontFactor*osSettings.bigFontSize; + height: 2*root.fontFactor*osSettings.bigFontSize; + visible:imagestore.text!="" + text: "..." + font.pointSize: osSettings.bigFontSize + onClicked:{imagestoreDialog.open()} } - Rectangle{color: "light grey"; x: 4*mm; y: 43.5*mm; width: root.width-14*mm; height: 5*mm;visible:imagestore.text!=""} - Flickable { - id: imagestoreFlickable - visible:imagestore.text!="" //filesystem.homePath+"/"+username.text+"/"" - x: 4*mm; y: 43.5*mm; width: root.width-14*mm; height: 5*mm; - clip: true - TextInput { - id: imagestore - width: imagestoreFlickable.width - height: imagestoreFlickable.height - //font.pixelSize:3*mm - font.pointSize: 16 - text: "" //filesystem.homePath+"/.friendiqa/"+username.text+"/" //(osSettings.osType=="Android") && (filesystem.fileexist("/storage/emulated/0/Pictures/"))?"/storage/emulated/0/Pictures/":"" - wrapMode: TextEdit.NoWrap - onCursorRectangleChanged: Layoutjs.ensureVisibility(cursorRectangle,imagestoreFlickable) - onTextChanged: imagestoredir=imagestore.text - } - } FileDialog { id: imagestoreDialog @@ -238,76 +196,66 @@ Page{ } } - Button { - x: root.width-9*mm; y: 43.5*mm; width: 5*mm; height: 5*mm; - visible:imagestore.text!="" - text: "..." - //font.pixelSize: 3*mm - font.pointSize: 16 - onClicked:{imagestoreDialog.open()} - } - BusyIndicator{ id: accountBusy anchors.horizontalCenter: parent.horizontalCenter - y: 53.5*mm + y: 16*root.fontFactor*osSettings.bigFontSize width:10*mm height: 10*mm running: false } - Button { - x: 4*mm; y: 53.5*mm - height: 8*mm + MButton { + x: root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize text: qsTr("Confirm") - //font.pixelSize: 3*mm - font.pointSize: 16 + font.pointSize: osSettings.bigFontSize onClicked:{ accountBusy.running=true; - var userconfig={server: servername.text, username: username.text, password:Qt.btoa(password.text), imagestore:imagestoredir, maxnews:"",interval: ""}; - var errormessage=""; - if (servername.text==""){errormessage=qsTr("No server given! ")} - else if (username.text==""){errormessage+=qsTr("No nickname given! ")} - else if (password.text=="") {errormessage+=qsTr("No password given! ")} - else if (imagestoredir=="") {errormessage+=qsTr("No image directory given!")} - //else if (imagestore.text=="") {errormessage+=qsTr("No image directory given!")} + var userconfig={server: servername.text, username: username.text, password:Qt.btoa(password.text), imagestore:imagestoredir, maxnews:"",interval: ""}; + var errormessage=""; + if (servername.text==""){errormessage=qsTr("No server given! ")} + else if (username.text==""){errormessage+=qsTr("No nickname given! ")} + else if (password.text=="") {errormessage+=qsTr("No password given! ")} + else if (imagestoredir=="") {errormessage+=qsTr("No image directory given!")} + //else if (imagestore.text=="") {errormessage+=qsTr("No image directory given!")} //else if (maxNewsText.text=="") {errormessage+=qsTr("No maximum news number given!")} - else {errormessage=""} - if (errormessage=="") { - Helperjs.friendicaRequest(userconfig,"/api/account/verify_credentials?skip_status=true",root,function(obj){ + else {errormessage=""} + if (errormessage=="") { + Helperjs.friendicaRequest(userconfig,"/api/account/verify_credentials?skip_status=true",root,function(obj){ accountBusy.running=false; - var credentials=JSON.parse(obj); - if (credentials.hasOwnProperty('status')){ - Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password!"),root) - } - else{ - if (users.length==0){Service.setDefaultOptions(db);} - print("imagestore" + userconfig.imagestore + " path "+ filesystem.homePath+"/"+username.text) - if(userconfig.imagestore == filesystem.homePath+"/"+username.text+"/") - {//filesystem.Directory=filesystem.homePath; - filesystem.makePath(filesystem.homePath+"/"+username.text); - } - filesystem.Directory=imagestoredir //userconfig.imagestore; - filesystem.makeDir("contacts"); - filesystem.makeDir("albums"); - Service.storeConfig(db,userconfig); - Service.readConfig(db,function(userconfig){ - Helperjs.readData(db,"config","",function(storedUsers){ - storedUsers.sort(function(obj1, obj2) { - return obj1.isActive - obj2.isActive; - }); - accountPage.users=storedUsers}); + var credentials=JSON.parse(obj); + if (credentials.hasOwnProperty('status')){ + Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password!"),root) + } + else{ + if (users.length==0){Service.setDefaultOptions(db);} + //print("imagestore" + userconfig.imagestore + " path "+ filesystem.homePath+"/"+username.text) + if(userconfig.imagestore == filesystem.homePath+"/"+username.text+"/") + {//filesystem.Directory=filesystem.homePath; + filesystem.makePath(filesystem.homePath+"/"+username.text); + } + filesystem.Directory=imagestoredir //userconfig.imagestore; + filesystem.makeDir("contacts"); + filesystem.makeDir("albums"); + Service.storeConfig(db,userconfig); + Service.readConfig(db,function(userconfig){ + Helperjs.readData(db,"config","",function(storedUsers){ + storedUsers.sort(function(obj1, obj2) { + return obj1.isActive - obj2.isActive; + }); + accountPage.users=storedUsers}); //reset values - root.login=userconfig; - root.news=[]; - rootstack.currentIndex=0; - root.newstypeSignal("refresh"); - },"isActive",0); + login=userconfig; + news=[]; + rootstack.currentIndex=0; + newstypeSignal("refresh"); + },"isActive",0); //Service.requestProfile(userconfig,db,root,function(nc){root.newContacts=nc}); Helperjs.showMessage(qsTr("Success"),qsTr("Name")+": "+credentials.name+"\nScreen Name: "+credentials.screen_name,root) + rootstackView.pop() } }); @@ -316,79 +264,82 @@ Page{ }} - - Button { - x: parent.width/2+2*mm; y: mm; width: 5*mm; height: 8*mm; - visible: users.length>0 - text: "-" - //font.pixelSize: 3*mm - font.pointSize: 16 - onClicked:{ - var userconfig={server: servername.text, username: username.text, password: Qt.btoa(password.text)}; - Service.deleteConfig(db,userconfig,function(){ - filesystem.Directory=imagestore.text+"contacts"; - filesystem.rmDir(); - filesystem.Directory=imagestore.text+"albums"; - filesystem.rmDir(); - servername.text="https://"; - servericon.visible=false; - servericon.source=""; - username.text=""; - password.text=""; - imagestore.text=""; - //maxNews.value=0; - //newsTypeField.text="Conversations"; - //messageIntervalSlider.value=30; - userButton.text=qsTr("User"); - Helperjs.readData(db,"config","",function(storedUsers){ - storedUsers.sort(function(obj1, obj2) { - return obj1.isActive - obj2.isActive; - }) - accountPage.users=storedUsers;}) - }) - }} - - Button { - x: parent.width/2+8*mm; y: mm; width: 5*mm; height: 8*mm; - visible: users.length>0 - text: "+" - //font.pixelSize: 3*mm - font.pointSize: 16 - onClicked:{ - servername.text="https://" - servericon.visible=false; - servericon.source=""; - username.text="" - password.text="" - imagestore.text="" //filesystem.homePath+"/.friendiqa/"+username.text//"" - userButton.text=qsTr("User") - } - } - - Button { - x: parent.width/2+14*mm; y: mm; width: 5*mm; height: 8*mm; - text: "?" - //font.pixelSize: 3*mm - font.pointSize: 16 - onClicked:{ - root.push("qrc:/qml/configqml/InfoBox.qml"); - } - } - Button{ - id:closeButton - height: 8*mm - width: 5*mm - visible: users.length>0 + Row{ + spacing:0.5*mm anchors.top: parent.top - anchors.topMargin: 1*mm + anchors.topMargin: root.fontFactor*osSettings.bigFontSize anchors.right: parent.right anchors.rightMargin: 1*mm - text: "\uf057" - //font.pixelSize: 3*mm - font.pointSize: 16 - onClicked:{root.pop()} - } + MButton { + //x: parent.width/2+4*mm; y: mm; + width: 5*mm; + //height: 3*root.fontFactor*osSettings.bigFontSize + visible: users.length>0 + text: "-" + font.pointSize: osSettings.bigFontSize + onClicked:{ + var userconfig={server: servername.text, username: username.text, password: Qt.btoa(password.text)}; + Service.deleteConfig(db,userconfig,function(){ + filesystem.Directory=imagestore.text+"contacts"; + filesystem.rmDir(); + filesystem.Directory=imagestore.text+"albums"; + filesystem.rmDir(); + servername.text="https://"; + servericon.visible=false; + servericon.source=""; + username.text=""; + password.text=""; + imagestore.text=""; + //maxNews.value=0; + //newsTypeField.text="Conversations"; + //messageIntervalSlider.value=30; + userButton.text=qsTr("User"); + Helperjs.readData(db,"config","",function(storedUsers){ + storedUsers.sort(function(obj1, obj2) { + return obj1.isActive - obj2.isActive; + }) + accountPage.users=storedUsers;}) + }) + }} + MButton { + //x: parent.width/2+10*mm; y: mm; //width: 5*mm; height: 8*mm; + //height: 3*root.fontFactor*osSettings.bigFontSize + width: 5*mm; + visible: users.length>0 + text: "+" + font.pointSize: osSettings.bigFontSize + onClicked:{ + servername.text="https://" + servericon.visible=false; + servericon.source=""; + username.text="" + password.text="" + imagestore.text="" //filesystem.homePath+"/.friendiqa/"+username.text//"" + userButton.text=qsTr("User") + } + } + + MButton { + //x: parent.width-12*mm; y: mm; //width: 5*mm; height: 8*mm; + //height: 3*root.fontFactor*osSettings.bigFontSize + width: 5*mm; + text: "?" + font.pointSize: osSettings.bigFontSize + onClicked:{ + rootstackView.push("qrc:/qml/configqml/InfoBox.qml"); + } + } + MButton{ + id:closeButton + //height: 3*root.fontFactor*osSettings.bigFontSize + width: 5*mm; + visible: users.length>0 + text: "\uf057" + font.pointSize: osSettings.bigFontSize + onClicked:{rootstackView.pop()} + } + } Component.onCompleted: { try{Helperjs.readData(db,"config","",function(storedUsers){ diff --git a/source-linux/qml/configqml/ConfigPage.qml b/source-linux/qml/configqml/ConfigPage.qml index f95662b..0d9e1ea 100644 --- a/source-linux/qml/configqml/ConfigPage.qml +++ b/source-linux/qml/configqml/ConfigPage.qml @@ -38,40 +38,42 @@ import "qrc:/qml/configqml" import "qrc:/qml/genericqml" Page{ - //anchors.fill: parent + //anchors.fill: parent width:root.width height:root.height Rectangle{ - x: 4*mm; y:13.5*mm; width: parent.width - 14*mm; height: 5*mm; - color:"light grey" + x: root.fontFactor*osSettings.bigFontSize; y:4*root.fontFactor*osSettings.bigFontSize; + width: parent.width - 6*root.fontFactor*osSettings.bigFontSize; height: 2*root.fontFactor*osSettings.bigFontSize + color:"#F3F3F3" radius: 0.5*mm Text{ anchors.fill: parent - font.pixelSize:3*mm + font.pointSize: osSettings.bigFontSize text:qsTr("Sync") } MouseArea{ anchors.fill:parent - onClicked:root.push("qrc:qml/configqml/SyncConfig.qml"); + onClicked:rootstackView.push("qrc:qml/configqml/SyncConfig.qml"); } } Text { text: qsTr("News as") - font.pixelSize:3*mm - x: 4*mm; y: 20*mm + font.pointSize:osSettings.systemFontSize + x: root.fontFactor*osSettings.bigFontSize; y: 8*root.fontFactor*osSettings.bigFontSize } Rectangle{ - x: 4*mm; y: 23.5*mm; width: newsTypeField.contentWidth+2*mm; height: 5*mm; - color:"light grey" - radius: 0.5*mm - Text{ - id: newsTypeField - anchors.fill: parent - font.pixelSize:3*mm - text:qsTr("Conversations") + x: root.fontFactor*osSettings.bigFontSize; y: 10*root.fontFactor*osSettings.bigFontSize; + width: newsTypeField.contentWidth+2*mm; height: 2*root.fontFactor*osSettings.bigFontSize + color:"#F3F3F3" + radius: 0.5*mm + Text{ + id: newsTypeField + anchors.fill: parent + font.pointSize:osSettings.bigFontSize + text:qsTr("Conversations") } MouseArea{ anchors.fill:parent @@ -80,38 +82,43 @@ Page{ } Menu { id:newstypemenu + width:8*root.fontFactor*osSettings.bigFontSize MenuItem { - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize text: qsTr("Timeline") onTriggered: {newsTypeField.text=qsTr("Timeline"); Service.updateglobaloptions(root.db,"newsViewType","Timeline");} - } + } MenuItem { - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize text: qsTr("Conversations") onTriggered: {newsTypeField.text=qsTr("Conversations"); Service.updateglobaloptions(root.db,"newsViewType","Conversations");} - } + } } Text { text: qsTr("Max. News") - font.pixelSize:3*mm - x: 4*mm; y:30*mm + font.pointSize: osSettings.systemFontSize + x: root.fontFactor*osSettings.bigFontSize; y:14*root.fontFactor*osSettings.bigFontSize } Slider{ id: maxNews - x:19*mm; y: 33.5*mm;width: root.width/2;height:5*mm + x:6*root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize; + width: root.width/2;height:2*root.fontFactor*osSettings.bigFontSize from: 0;to:2000; stepSize: 100 value: root.globaloptions.hasOwnProperty("max_news")?root.globaloptions.max_news:1000 } - Rectangle{color: "light grey"; x: 4*mm; y: 33.5*mm; width: 9*mm; height: 5*mm; + Rectangle{ + color: "#F3F3F3"; + x: root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize; + width: 4*root.fontFactor*osSettings.bigFontSize; height: 2*root.fontFactor*osSettings.bigFontSize; radius: 0.5*mm TextEdit{id:maxNewsText; anchors.fill: parent - font.pixelSize:3*mm + font.pointSize: osSettings.bigFontSize verticalAlignment:TextEdit.AlignRight text:maxNews.value selectByMouse: true @@ -125,10 +132,9 @@ Page{ CheckBox{ id: nsfwCheckbox - x: 4*mm - y: 43.5*mm - font.pixelSize: 3*mm - //width:5*mm + x: root.fontFactor*osSettings.bigFontSize + y: 20*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.bigFontSize text: qsTr("Hide #nsfw?") checked:(globaloptions["hide_nsfw"]==1)?true:false onClicked: { @@ -146,24 +152,24 @@ Page{ MButton { anchors.right: closeButton.left; anchors.rightMargin: mm; anchors.top: parent.top - anchors.topMargin: 1*mm - width: 8*mm; height: 6*mm; + anchors.topMargin:root.fontFactor*osSettings.bigFontSize + width: 2*root.fontFactor*osSettings.bigFontSize; text: "?" - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize onClicked:{ - root.push("qrc:/qml/configqml/InfoBox.qml"); - } - } + rootstackView.push("qrc:/qml/configqml/InfoBox.qml"); + } + } MButton{ - id:closeButton - height: 6*mm - width :8*mm - anchors.top: parent.top - anchors.topMargin: 1*mm - anchors.right: parent.right - anchors.rightMargin: 1*mm - text: "\uf057" - font.pixelSize: 3*mm - onClicked:{root.pop()} + id:closeButton + // height: 2*root.fontFactor*osSettings.bigFontSize + width: 2*root.fontFactor*osSettings.bigFontSize; + anchors.top: parent.top + anchors.topMargin:root.fontFactor*osSettings.bigFontSize + anchors.right: parent.right + anchors.rightMargin: 1*mm + text: "\uf057" + font.pointSize: osSettings.bigFontSize + onClicked:{rootstackView.pop()} } } diff --git a/source-linux/qml/configqml/InfoBox.qml b/source-linux/qml/configqml/InfoBox.qml index 6414010..2037435 100644 --- a/source-linux/qml/configqml/InfoBox.qml +++ b/source-linux/qml/configqml/InfoBox.qml @@ -33,39 +33,38 @@ import QtQuick 2.0 import QtQuick.Controls 2.12 import "qrc:/qml/genericqml" -Rectangle{ - color:"white" - width:infoBoxText.contentWidth - height:infoBoxText.contentHeight +Page{ + //color:"white" + // width:infoBoxText.contentWidth + // height:infoBoxText.contentHeight Text{id:infoBoxText anchors.top:closeButton.bottom anchors.topMargin: mm textFormat: Text.RichText width: root.width-mm + font.pointSize: osSettings.systemFontSize wrapMode: Text.WrapAtWordBoundaryOrAnywhere - text: "Friendiqa v0.5.4
Licensed under GPL 3 with the exception of OpenSSL
"+ + text: "Friendiqa v0.6
Licensed under GPL 3 with the exception of OpenSSL
"+ "Website https://friendiqa.ma-nic.de
"+ "Sourcecode: https://git.friendi.ca/LubuWest/Friendiqa
"+ "Privacy Policy: http://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md
"+ - "Code by Marco
"+ - "Qt Framework www.qt.io
"+ - "Icons by FontAwesome
"+ - "Folder Icon by KDE Breeze Icons
"+ - "AndroidNative by Ben Lau
"+ - "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/)" - onLinkActivated:{ + "Code by Marco
"+ + "Qt Framework www.qt.io
"+ + "Icons by FontAwesome
"+ + "Folder Icon by KDE Breeze Icons
"+ + "AndroidNative by Ben Lau
"+ + "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/)" + onLinkActivated:{ Qt.openUrlExternally(link)} - } - Button{ - id:closeButton - height: 6*mm - width: 8*mm - anchors.top: parent.top - anchors.topMargin: 1*mm - anchors.right: parent.right - anchors.rightMargin: 1*mm - text: "\uf057" - font.pixelSize: 3*mm - onClicked:{root.pop()} - } + } + MButton{ + id:closeButton + anchors.top: parent.top + anchors.topMargin: root.fontFactor*osSettings.bigFontSize + anchors.right: parent.right + anchors.rightMargin: 1*mm + text: "\uf057" + font.pointSize: osSettings.bigFontSize + onClicked:{rootstackView.pop()} + } } diff --git a/source-linux/qml/configqml/LeftDrawerScrollview.qml b/source-linux/qml/configqml/LeftDrawerScrollview.qml new file mode 100644 index 0000000..f7f0f62 --- /dev/null +++ b/source-linux/qml/configqml/LeftDrawerScrollview.qml @@ -0,0 +1,113 @@ +// This file is part of Friendiqa +// https://git.friendi.ca/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + +import QtQuick 2.0 +import QtQuick.Controls 2.12 +import "qrc:/qml/genericqml" +import "qrc:/js/service.js" as Service + +ScrollView{ + id:leftDrawerScrollviewId + clip: true + width:parent.width-mm + height: parent.height + contentHeight: leftDrawerColumn.height + property string currentnewstabstatus:root.globaloptions.hasOwnProperty("newsViewType")?root.globaloptions.newsViewType:"Conversations"; + + Column{ + id:leftDrawerColumn + x:mm + y:0.5*root.fontFactor*osSettings.bigFontSize + width:parent.width-2*mm + height: 4*root.fontFactor*osSettings.bigFontSize + spacing: 0.7*root.fontFactor*osSettings.bigFontSize + Label{ + width:implicitWidth + font.pointSize: osSettings.systemFontSize + text: "\uf085 "+ qsTr("Settings") + MouseArea{ + anchors.fill:parent + onClicked:{rootstackView.push("qrc:qml/configqml/ConfigPage.qml"); + if(!wideScreen){leftDrawerAndroid.close()} + } + } + } + + Label{y: 2*root.fontFactor*osSettings.bigFontSize + width:implicitWidth + font.pointSize: osSettings.systemFontSize + text: "\uf2bb " + qsTr("Accounts") + MouseArea{ + anchors.fill:parent + onClicked:{rootstackView.push("qrc:qml/configqml/AccountPage.qml"); + if(!wideScreen){leftDrawerAndroid.close()} + } + } + } + + Label{y: 4*root.fontFactor*osSettings.bigFontSize + width:implicitWidth + font.pointSize: osSettings.systemFontSize + text: "\uf08b " +qsTr("Quit") + MouseArea{ + anchors.fill:parent + onClicked:{ + Service.cleanNews(root.db,function(){ + Service.cleanHashtags(root.db,function(){ + Service.cleanContacts(root.login,root.db,function(){ + Qt.quit()}) + })}) + } + } + } + } + Component.onCompleted:{ + Service.readAllLogins(db,function(accounts){ + if (accounts.length>0 && bar.currentIndex==0){ + leftDrawerColumn.height=4.5*root.fontFactor*osSettings.bigFontSize+accounts.length*13*root.fontFactor*osSettings.bigFontSize + for(var i = 0; i < accounts.length; i++) { + var accountComponent = Qt.createComponent("qrc:/qml/genericqml/DrawerAccountComponent.qml"); + var accountQml = accountComponent.createObject(leftDrawerColumn,{ + "y":4.5*root.fontFactor*osSettings.bigFontSize+i*13*root.fontFactor*osSettings.bigFontSize, + "currentnewstabstatus":currentnewstabstatus, + "account":accounts[i]}); + } + }else if(accounts.length>0 && bar.currentIndex==1){ + leftDrawerColumn.height=4.5*root.fontFactor*osSettings.bigFontSize+accounts.length*6.5*root.fontFactor*osSettings.bigFontSize + for(var i = 0; i < accounts.length; i++) { + var accountComponent = Qt.createComponent("qrc:/qml/genericqml/DrawerAccountComponentContacts.qml"); + var accountQml = accountComponent.createObject(leftDrawerColumn,{ + "y":4.5*root.fontFactor*osSettings.bigFontSize+i*6.5*root.fontFactor*osSettings.bigFontSize, + "account":accounts[i]}); + } + } + })} +} diff --git a/source-linux/qml/configqml/OSSettingsAndroid.qml b/source-linux/qml/configqml/OSSettingsAndroid.qml index 4ef254d..4c5b9de 100644 --- a/source-linux/qml/configqml/OSSettingsAndroid.qml +++ b/source-linux/qml/configqml/OSSettingsAndroid.qml @@ -37,6 +37,8 @@ QtObject{ property int backKey: Qt.Key_Back //property string attachImageDir:filesystem.cameraPath+"/" property string osType: "Android" + property int systemFontSize: root.font.pointSize*1.1 + property int bigFontSize: systemFontSize*1.3 property string imagePickQml: "ImagePicker" property string imagePicker:'import QtQuick 2.0; import "qrc:/qml/genericqml";'+ imagePickQml+'{multiple : true;onReady: {attachImageURLs.push(imageUrl);'+ diff --git a/source-linux/qml/configqml/OSSettingsLinux.qml b/source-linux/qml/configqml/OSSettingsLinux.qml index 20440a7..a758b26 100644 --- a/source-linux/qml/configqml/OSSettingsLinux.qml +++ b/source-linux/qml/configqml/OSSettingsLinux.qml @@ -32,10 +32,12 @@ import QtQuick.Window 2.0 import QtQuick 2.0 QtObject{ - property real appWidth: Screen.desktopAvailableWidth/3 - property real appHeight: Screen.desktopAvailableHeight/3*2 + property real appWidth: Screen.desktopAvailableWidth/4*3 + property real appHeight: Screen.desktopAvailableHeight/4*3 property int backKey: Qt.Key_Escape property string osType: "Linux" + property int systemFontSize: root.font.pointSize*1.1 + property int bigFontSize: systemFontSize*1.5 //property string attachImageDir:filesystem.homePath+"/Pictures/" property string imagePickQml: "ImagePickerLinux" } diff --git a/source-linux/qml/configqml/RegisterPage.qml b/source-linux/qml/configqml/RegisterPage.qml index 3dcbc8d..90eb809 100644 --- a/source-linux/qml/configqml/RegisterPage.qml +++ b/source-linux/qml/configqml/RegisterPage.qml @@ -36,10 +36,7 @@ import "qrc:/qml/genericqml" Rectangle{ color:"white" - //border.color: "light grey" property alias url:htmlview.url -// width:root.width-5*mm -// height:root.height-12*mm WebView {id:htmlview; height:parent.height-7*mm @@ -55,13 +52,13 @@ Rectangle{ } Button{ id:closeButton - height:6*mm + height: 3*root.fontFactor*osSettings.bigFontSize anchors.top: parent.top anchors.topMargin: 1*mm anchors.right: parent.right anchors.rightMargin: 1*mm text: "\uf057" - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize onClicked:{root.pop()} } } diff --git a/source-linux/qml/configqml/SyncComponent.qml b/source-linux/qml/configqml/SyncComponent.qml index b8cd30c..c20055f 100644 --- a/source-linux/qml/configqml/SyncComponent.qml +++ b/source-linux/qml/configqml/SyncComponent.qml @@ -39,22 +39,22 @@ Rectangle{ color: "#EEEEEE" //Material.Grey property string adapter: "" width: parent.width - height: 12*mm + height: 4*root.fontFactor*osSettings.bigFontSize Label{ x: mm y: 0.5*mm - font.pixelSize:3*mm + font.pointSize: osSettings.systemFontSize text: qsTr(adapter) } CheckBox{ id: syncCheckbox x: mm - y: 5*mm - width:20*mm + y: root.fontFactor*osSettings.bigFontSize + width: 10*root.fontFactor*osSettings.bigFontSize checked:(globaloptions["sync_"+adapter]==1)?true:false //style: CheckBoxStyle { text: qsTr("sync") - font.pixelSize:3*mm + font.pointSize: osSettings.bigFontSize onClicked: { toggle(); if(syncCheckbox.checked==true){ @@ -67,13 +67,13 @@ Rectangle{ } CheckBox{ id: notifyCheckbox - x:25*mm - y: 5*mm - width:25*mm + x: 10*root.fontFactor*osSettings.bigFontSize + y: root.fontFactor*osSettings.bigFontSize + width: 10*root.fontFactor*osSettings.bigFontSize enabled: adapter!="Notifications" checked:(globaloptions["notify_"+adapter]==1)?true:false text: qsTr("notify") - font.pixelSize:3*mm + font.pointSize: osSettings.bigFontSize onClicked: { toggle(); if(notifyCheckbox.checked==true){ diff --git a/source-linux/qml/configqml/SyncConfig.qml b/source-linux/qml/configqml/SyncConfig.qml index ef7ebf6..65686b1 100644 --- a/source-linux/qml/configqml/SyncConfig.qml +++ b/source-linux/qml/configqml/SyncConfig.qml @@ -43,44 +43,50 @@ Rectangle{ //height:root.height Text { text: qsTr("Sync Interval (0=None)") - font.pixelSize:3*mm + font.pointSize: osSettings.bigFontSize //visible: false - x: 4*mm; y: 10*mm; //width:35*mm;wrapMode: Text.Wrap + x: root.fontFactor*osSettings.bigFontSize; y: root.fontFactor*osSettings.bigFontSize; //width:35*mm;wrapMode: Text.Wrap } Slider{ id: messageIntervalSlider - x:22*mm; y: 13.5*mm;width: root.width/2;height:5*mm + x:8*root.fontFactor*osSettings.bigFontSize; y: 4*root.fontFactor*osSettings.bigFontSize; + width: root.width-10*root.fontFactor*osSettings.bigFontSize; + height:2*root.fontFactor*osSettings.bigFontSize value: globaloptions.hasOwnProperty("syncinterval")?globaloptions.syncinterval:0 from: 0;to:120; stepSize: 15 } Rectangle{ - x: 4*mm; y: 13.5*mm; width: 9*mm; height: 5*mm; - TextEdit{ - id: messageIntervalField - anchors.fill: parent - font.pixelSize:3*mm - verticalAlignment:TextEdit.AlignRight - text:messageIntervalSlider.value - focus: true - selectByMouse: true - onTextChanged: { - Service.updateglobaloptions(root.db,"syncinterval",text); - if(osSettings.osType=="Android"){ + x: root.fontFactor*osSettings.bigFontSize; y:4*root.fontFactor*osSettings.bigFontSize; + width: 4*root.fontFactor*osSettings.bigFontSize; height: 2*root.fontFactor*osSettings.bigFontSize; + TextEdit{ + id: messageIntervalField + anchors.fill: parent + font.pointSize: osSettings.bigFontSize + verticalAlignment:TextEdit.AlignRight + text:messageIntervalSlider.value + focus: true + selectByMouse: true + onTextChanged: { + Service.updateglobaloptions(root.db,"syncinterval",text); + if(osSettings.osType=="Android"){ + //print("setalarm") alarm.setAlarm(text); - } else if(osSettings.osType=="Linux" && text !=0){ - root.updateSyncinterval(parseInt(text)) - } - } + } else if(osSettings.osType=="Linux" && text !=0){ + root.updateSyncinterval(parseInt(text)) + } + } } } - Text{x: 14*mm; y: 13.5*mm; width: 5*mm; height: 5*mm; - font.pixelSize:3*mm + Text{x: 6*root.fontFactor*osSettings.bigFontSize; y: 4*root.fontFactor*osSettings.bigFontSize; + width: 2*root.fontFactor*osSettings.bigFontSize; height: 1.5*root.fontFactor*osSettings.bigFontSize; + font.pointSize: osSettings.bigFontSize text:qsTr("Min.") } ScrollView{ width: root.width - height: root.height - 25*mm;y:22*mm + height: root.height - 10*root.fontFactor*osSettings.bigFontSize; + y:7*root.fontFactor*osSettings.bigFontSize clip:true Column{ //height: implicitHeight @@ -92,19 +98,19 @@ Rectangle{ SyncComponent{ adapter:"DirectMessages"} SyncComponent{ adapter:"Notifications"} SyncComponent{ adapter: "Events"} + SyncComponent{adapter: "FriendRequests"} } } - MButton{ - id:closeButton - anchors.top: parent.top - anchors.topMargin: 1*mm - anchors.right: parent.right - anchors.rightMargin: 1*mm - height: 6*mm - width: 8*mm - text: "\uf057" - font.pixelSize: 3*mm - onClicked:{root.pop()} - } + MButton{ + id:closeButton + anchors.top: parent.top + anchors.topMargin: osSettings.bigFontSize + anchors.right: parent.right + anchors.rightMargin: 1*mm + width: 2*root.fontFactor*osSettings.bigFontSize; + text: "\uf057" + font.pointSize: osSettings.bigFontSize + onClicked:{rootstackView.pop()} + } } diff --git a/source-linux/qml/contactqml/Contactlist.qml b/source-linux/qml/contactqml/Contactlist.qml index 045930b..576d990 100644 --- a/source-linux/qml/contactqml/Contactlist.qml +++ b/source-linux/qml/contactqml/Contactlist.qml @@ -47,41 +47,41 @@ Rectangle { height:groupListView.height ListView { - id: contactView - x:mm - y:6*mm - width: contactlistRectangle.width-2*mm - height: contactlistRectangle.height-10*mm - clip: true - spacing: 0 - model: contactModel - delegate: listContact - } + id: contactView + x:mm + y:6*mm + width: contactlistRectangle.width-2*mm + height: contactlistRectangle.height-10*mm + clip: true + spacing: 0 + model: contactModel + delegate: listContact + } - ListModel{id: contactModel} + ListModel{id: contactModel} - Component { id:listContact - Rectangle{ - border.color: "#EEEEEE" - border.width: 1 - radius:0.5*mm - width:contactView.width - height:6*mm - Image { - id: contactImage - x:1 - y:1 - width: 5*mm - height:5*mm - source:(contact.profile_image!="")? "file://"+contact.profile_image : contact.profile_image_url - onStatusChanged: if (contactImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} - } - Text{ - font.pixelSize: 3*mm - anchors.left: contactImage.right - anchors.margins: 1*mm - text:Qt.atob(contact.name) - } + Component { id:listContact + Rectangle{ + border.color: "#EEEEEE" + border.width: 1 + radius:0.5*mm + width:contactView.width + height:6*mm + Image { + id: contactImage + x:1 + y:1 + width: 5*mm + height:5*mm + source:(contact.profile_image!="")? "file://"+contact.profile_image : contact.profile_image_url + onStatusChanged: if (contactImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} + } + Text{ + font.pointSize: osSettings.bigFontSize + anchors.left: contactImage.right + anchors.margins: 1*mm + text:Qt.atob(contact.name) + } Text { id:selected anchors.right:parent.right @@ -91,40 +91,38 @@ Rectangle { width: 5*mm anchors.top: parent.top color: "green" - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize } - MouseArea{ + MouseArea{ anchors.fill: parent onClicked:{ if(selected.visible==true){ - contacts.splice(Helperjs.inArray(contacts,"id",contact.id),1); - selected.visible=false - } - else{ - contacts.push(contact); - selected.visible=true; - } - } - } + contacts.splice(Helperjs.inArray(contacts,"id",contact.id),1); + selected.visible=false + } + else{ + contacts.push(contact); + selected.visible=true; + } + } } - } + } + } - MButton { - id: closeButton - height:6* mm - width: 8*mm - anchors.top: parent.top - anchors.topMargin: 1*mm - anchors.right: parent.right - anchors.rightMargin: 1*mm - //color:"white" - text: "\uf057" - onClicked: { - groupModelAppend(contacts,function(){ - contactlistRectangle.destroy() - }); - } + MButton { + id: closeButton + anchors.top: parent.top + anchors.topMargin: 1*mm + anchors.right: parent.right + anchors.rightMargin: 1*mm + //color:"white" + text: "\uf057" + onClicked: { + groupModelAppend(contacts,function(){ + contactlistRectangle.destroy() + }); + } } Component.onCompleted: { diff --git a/source-linux/qml/contactqml/ContactsListTab.qml b/source-linux/qml/contactqml/ContactsListTab.qml new file mode 100644 index 0000000..b8f0d2a --- /dev/null +++ b/source-linux/qml/contactqml/ContactsListTab.qml @@ -0,0 +1,96 @@ +// This file is part of Friendiqa +// https://git.friendi.ca/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + +import QtQuick 2.11 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.11 +import QtQuick.LocalStorage 2.0 +import "qrc:/js/helper.js" as Helperjs +//import "qrc:/js/news.js" as Newsjs +import "qrc:/js/service.js" as Service +import "qrc:/qml/contactqml" +import "qrc:/qml/genericqml" + +Item{ + id: contactsGridTab + Layout.fillWidth:true + Layout.fillHeight: true + function showContacts(contact){ + try {contactsModel.clear()} catch(e){print(e)}; + Helperjs.readData(db, "contacts",root.login.username,function(contactsobject){ + for (var j=0;j +// +// 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 . + +import QtQuick 2.11 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.11 +import QtQuick.LocalStorage 2.0 +import "qrc:/js/helper.js" as Helperjs +import "qrc:/js/news.js" as Newsjs +import "qrc:/qml/contactqml" +import "qrc:/qml/genericqml" + +Item{ + id: friendsGridTab + Layout.fillWidth:true + Layout.fillHeight: true + property int currentContact: 0 + + function showFriends(contact){ + try {friendsModel.clear()} catch(e){print(e)}; + Helperjs.readData(root.db,"friendshiprequests",login.username,function(friendrequestsobject){ + for (var i=0;i1){ + friendsobject[i].screen_name=friendsobject[i].screen_name+"+"+friendsobject[i].cid + } + friendsModel.append({"contact":friendsobject[i],"contactType":qsTr("Friends")}); + } + },"isFriend",1,"screen_name ASC"); + } + Connections{ + target:xhr + function onDownloaded(type,url,filename,i){ + if(type=="contactlist"){ + //print(url+" "+filename+" "+i) + friendsGridTab.currentContact=i+1; + if(friendsGridTab.currentContact==root.newContacts.length){ + friendsGridTab.showFriends(root.login.username) + } + } + } + } + MButton { + id: updateFriendsButton + text: "\uf021" + anchors.top: parent.top + anchors.topMargin: mm + anchors.right: parent.right + onClicked: { + try {friendsModel.clear()} catch(e){print(e)}; + Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){}); + updatenews.setDatabase(); + updatenews.login(); + updatenews.friendrequests(); + //root.contactLoadType="friends"; + Newsjs.requestFriends(root.login,db,root,function(nc){ + root.newContacts=nc + root.onNewContactsChanged(nc); + }) + } + } + + ProgressBar{ + id: newContactsProgress + width: 15*mm + height: updateFriendsButton.height + anchors.top: parent.top + anchors.right:updateFriendsButton.left + anchors.rightMargin:mm + visible: (friendsGridTab.currentContact!=(root.newContacts.length))?true:false + value: friendsGridTab.currentContact/root.newContacts.length + } + + Component { + id: sectionHeading + Rectangle { + width: friendsView.width + height: childrenRect.height + //color: "lightsteelblue" + required property string section + Text { + text: parent.section + font.bold: true + font.pointSize: osSettings.bigFontSize + } + } + } + //GridView { + ListView{ + id: friendsView + x:mm + y:updateFriendsButton.height+mm + width:friendsGridTab.width-2*mm + height:friendsGridTab.height-(updateFriendsButton.height+5*mm) + clip: true + spacing: 2 + function processContactSelection(contactobject){showContactdetails(contactobject)} + //add: Transition { + // NumberAnimation { properties: "x,y"; from: 300; duration: 1000 } + // } + model: friendsModel + delegate: ContactComponent { } + section.property: "contactType" + section.criteria: ViewSection.FullString + section.delegate: sectionHeading + } + ListModel{id:friendsModel} + + Component.onCompleted: { + root.friendsSignal.connect(showFriends); + friendsTabView.contactsSignal.connect(showFriends); + showFriends(root.login.username); + root.newContacts=[] + } +} diff --git a/source-linux/qml/contactqml/FriendsTab.qml b/source-linux/qml/contactqml/FriendsTab.qml index 8b27dfd..dbf794c 100644 --- a/source-linux/qml/contactqml/FriendsTab.qml +++ b/source-linux/qml/contactqml/FriendsTab.qml @@ -31,7 +31,6 @@ import QtQuick 2.11 import QtQuick.Controls 2.12 -//import QtQuick.Controls.Styles 1.4 import QtQuick.Layouts 1.11 import QtQuick.LocalStorage 2.0 import "qrc:/js/helper.js" as Helperjs @@ -45,60 +44,72 @@ Rectangle { color: "white" function showContactdetails(contact){ - rootstack.currentIndex=0; - bar.currentIndex=0; +// rootstack.currentIndex=0; +// bar.currentIndex=0; root.contactdetailsSignal(contact) } - function showProfile(callback){ - var profile=({}); - Helperjs.readData(db,"profiles",login.username,function(profileobject){ - var profilearray=[]; - for (var i in profileobject){ - profilearray.push(JSON.parse(Qt.atob(profileobject[i].profiledata))); - } - profile.profiles=profilearray; - }); - Helperjs.readData(db,"contacts",login.username,function(owner){ - profile.friendica_owner=owner[0]; - },"isFriend",2); - callback(profile) + BlueButton{ + x:mm + y:mm + z:2 + visible: !wideScreen + fontColor: "grey" + border.color: "transparent" + text: "\uf0c9" + font.pointSize: osSettings.bigFontSize + onClicked:{ + leftDrawerAndroid.visible?leftDrawerAndroid.close():leftDrawerAndroid.open()} } TabBar { id: friendsbar - width: parent.width + width: osSettings.osType=="Android"?parent.width-2*osSettings.bigFontSize:parent.width height: 9*mm + x: osSettings.osType=="Android"?2*osSettings.bigFontSize:0 + visible: !wideScreen position:TabBar.Header currentIndex: 1 TabButton { text: qsTr("Me") - font.pixelSize: 2*mm + font.pointSize: osSettings.systemFontSize height: 7*mm } TabButton { text: qsTr("Friends") - font.pixelSize: 2*mm + font.pointSize: osSettings.systemFontSize height: 7*mm } TabButton { text: qsTr("Contacts") - font.pixelSize: 2*mm + font.pointSize: osSettings.systemFontSize height: 7*mm } TabButton { text: qsTr("Groups") - font.pixelSize: 2*mm + font.pointSize: osSettings.systemFontSize height: 7*mm } - } + } + + LeftDrawerLinux{ + id:leftDrawer + visible: wideScreen&&rootstackView.depth<2 + width: visible?osSettings.systemFontSize*15:0 + height: root.height-bar.height + } + + LeftDrawerAndroid{ + id: leftDrawerAndroid + } + StackLayout{ id:friendsTabView //anchors.fill: parent - x:mm - y:10*mm - width: parent.width-2*mm - height: parent.height-10*mm + width: wideScreen&&rootstackView.depth<2?parent.width-leftDrawer.width-mm:parent.width-mm//newstabitem.width/3*2:newstabitem.width + x: leftDrawer.width + y: friendsbar.visible?friendsbar.height:0 + height: friendsbar.visible?parent.height-friendsbar.height-mm:parent.height-mm currentIndex: friendsbar.currentIndex signal contactsSignal(var contact) signal groupsSignal(var username) @@ -113,267 +124,26 @@ Rectangle { else if (currentIndex==3){groupsSignal(root.login.username)} } - - Item{ - id:profileGridTab - Layout.fillWidth:true - Layout.fillHeight: true - Component.onCompleted:{ - showProfile(function(profile){ - var component = Qt.createComponent("qrc:/qml/contactqml/ProfileComponent.qml"); - var profilecomp = component.createObject(profileGridTab,{"profile": profile}); - }); - } - } - - Item{ - id: friendsGridTab - Layout.fillWidth:true - Layout.fillHeight: true - property int currentContact: 0 - - function showFriends(contact){ - try {friendsModel.clear()} catch(e){print(e)}; - Helperjs.readData(root.db,"contacts",login.username,function(friendsobject){ - for (var i=0;i1){ - friendsobject[i].screen_name=friendsobject[i].screen_name+"+"+friendsobject[i].cid - } - friendsModel.append({"contact":friendsobject[i]}); - } - },"isFriend",1,"screen_name ASC"); - } - Connections{ - target:xhr - function onDownloaded(type,url,filename,i){ - if(type=="contactlist"){ - //print(url+" "+filename+" "+i) - friendsGridTab.currentContact=i+1; - if(friendsGridTab.currentContact==root.newContacts.length){ - friendsGridTab.showFriends(root.login.username) - } - } - } - } - MButton { - id: updateFriendsButton - text: "\uf021" - anchors.top: parent.top - anchors.topMargin: mm - anchors.right: parent.right - height: 6*mm - width: 8*mm - onClicked: { - try {friendsModel.clear()} catch(e){print(e)}; - //root.contactLoadType="friends"; - Newsjs.requestFriends(root.login,db,root,function(nc){ - root.newContacts=nc - }) - } + Loader{ + id: profileLoader + source:(friendsTabView.currentIndex==0)? "qrc:/qml/contactqml/ProfileTab.qml":"" } - ProgressBar{ - id: newContactsProgress - width: 15*mm - height: updateFriendsButton.height - anchors.top: parent.top - anchors.right:updateFriendsButton.left - anchors.rightMargin:mm - visible: (friendsGridTab.currentContact!=(root.newContacts.length))?true:false - value: friendsGridTab.currentContact/root.newContacts.length - } - - //GridView { - ListView{ - id: friendsView - x:mm - y:updateFriendsButton.height+2*mm - width:friendsGridTab.width-2*mm - height:friendsGridTab.height-updateFriendsButton.height-2*mm - clip: true - spacing: 2 - function processContactSelection(contactobject){showContactdetails(contactobject)} - //add: Transition { - // NumberAnimation { properties: "x,y"; from: 300; duration: 1000 } - // } - model: friendsModel - delegate: ContactComponent { } - } - - ListModel{id:friendsModel} - - Component.onCompleted: { - root.friendsSignal.connect(showFriends); - friendsTabView.contactsSignal.connect(showFriends); - showFriends(root.login.username); - root.newContacts=[] - } + Loader{ + id: friendsListLoader + source:(friendsTabView.currentIndex==1)? "qrc:/qml/contactqml/FriendsListTab.qml":"" } - Item{ - id: contactsGridTab - Layout.fillWidth:true - Layout.fillHeight: true - function showContacts(contact){ - try {contactsModel.clear()} catch(e){print(e)}; - Helperjs.readData(db, "contacts",root.login.username,function(contactsobject){ - for (var j=0;j +// +// 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 . + +import QtQuick 2.11 +import QtQuick.Controls 2.12 +//import QtQuick.Layouts 1.11 +import QtQuick.LocalStorage 2.0 +import "qrc:/js/helper.js" as Helperjs +import "qrc:/js/news.js" as Newsjs +import "qrc:/js/service.js" as Service +import "qrc:/qml/contactqml" +import "qrc:/qml/genericqml" + +Item{ + id: groupsGridTab + + function showGroups(username){ + try {groupsModel.clear()} catch(e){print(e)}; + Helperjs.readData(db, "groups",root.login.username,function(groupsobject){ + for (var j=0;j"+qsTr("profile id")+": "+profileid+"
" color:"black" } @@ -222,7 +220,7 @@ Rectangle { y:4.5*mm width:parent.width-2.5*mm wrapMode: Text.Wrap - font.pixelSize: 3*mm + font.pointSize: osSettings.systemFontSize text:profiletext color:"black" } @@ -234,7 +232,7 @@ Rectangle { id:namelabeltext width: namelabelflickable.width height: implicitHeight - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize textFormat:Text.RichText wrapMode: Text.Wrap text:""+qsTr("Description")+": "+(Qt.atob(profile.friendica_owner.description))+"
"+qsTr("Location")+": "+profile.friendica_owner.location+"
"+qsTr("Posts")+": "+profile.friendica_owner.statuses_count+ diff --git a/source-linux/qml/contactqml/ProfileTab.qml b/source-linux/qml/contactqml/ProfileTab.qml new file mode 100644 index 0000000..e13cbf9 --- /dev/null +++ b/source-linux/qml/contactqml/ProfileTab.qml @@ -0,0 +1,65 @@ +// This file is part of Friendiqa +// https://git.friendi.ca/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + +import QtQuick 2.11 +import QtQuick.Controls 2.12 +//import QtQuick.Controls.Styles 1.4 +//import QtQuick.Layouts 1.11 +//import QtQuick.LocalStorage 2.0 +import "qrc:/js/helper.js" as Helperjs +import "qrc:/js/news.js" as Newsjs +import "qrc:/js/service.js" as Service +import "qrc:/qml/contactqml" +import "qrc:/qml/genericqml" + +Item{ + id:profileTab + function showProfile(callback){ + var profile=({}); + Helperjs.readData(db,"profiles",login.username,function(profileobject){ + var profilearray=[]; + for (var i in profileobject){ + profilearray.push(JSON.parse(Qt.atob(profileobject[i].profiledata))); + } + profile.profiles=profilearray; + }); + Helperjs.readData(db,"contacts",login.username,function(owner){ + profile.friendica_owner=owner[0]; + },"isFriend",2); + callback(profile) + } + Component.onCompleted:{ + showProfile(function(profile){ + var component = Qt.createComponent("qrc:/qml/contactqml/ProfileComponent.qml"); + var profilecomp = component.createObject(profileTab,{"profile": profile}); + }); + } +} diff --git a/source-linux/qml/friendiqa.qml b/source-linux/qml/friendiqa.qml index 6f9df43..1844b81 100644 --- a/source-linux/qml/friendiqa.qml +++ b/source-linux/qml/friendiqa.qml @@ -36,47 +36,56 @@ import QtQuick.Controls 2.4 import QtQuick.Layouts 1.11 import "qrc:/js/news.js" as Newsjs import "qrc:/js/service.js" as Service +import "qrc:/qml/genericqml" -StackView{ +ApplicationWindow{ id:root + title: "Friendiqa" + property var globaloptions: Service.readGO(db) property QtObject osSettings: {var tmp=Qt.createComponent("qrc:/qml/configqml/OSSettingsLinux.qml");return tmp.createObject(root)} - width: osSettings.appWidth - height:osSettings.appHeight + width: globaloptions.hasOwnProperty("appWidth")?globaloptions.appWidth:osSettings.appWidth + height:globaloptions.hasOwnProperty("appHeight")?globaloptions.appHeight:osSettings.appHeight + visible: true property var db: ["Friendiqa", "1.0", "Stores Friendica data", 100000000] property var login: Service.readActiveConfig(db) - property var globaloptions: Service.readGO(db) + property real fontFactor: root.font.pixelSize/root.font.pointSize property var contactlist: [] property real mm: osSettings.osType=="Android"?Screen.pixelDensity:Screen.pixelDensity*1.5 - signal messageSignal(var friend) + property bool wideScreen : width>height signal fotoSignal(var username, var friend) signal directmessageSignal(var friend) signal newsSignal(var news) signal newstypeSignal(var type) signal friendsSignal(var username) signal contactdetailsSignal(var contact) + signal searchSignal (var searchterm) signal eventSignal(var contact) signal uploadSignal(var urls) signal sendtextSignal(var intenttext) signal changeimage(var method, var type, var id) signal updateSyncinterval(int interval) + signal replySignal(var newsobject) property var news:[] property var newContacts:[] + property var contactposts:[] //property string contactLoadType: "" property bool imagePicking: false - onLoginChanged:{ - if(login==""){root.push("qrc:/qml/configqml/AccountPage.qml")} - else{root.push(rootStackItem) - if (login.newsViewType!="" || login.newsViewType!=null){newstab.newstabstatus=login.newsViewType;} + function onLoginChanged(login){ + if(login==""){rootstackView.push("qrc:/qml/configqml/AccountPage.qml")} + else{//rootstackView.push(rootstack) + if (login.newsViewType!="" || login.newsViewType!=null){ + newstab.newstabstatus=login.newsViewType;} Newsjs.getCurrentContacts(login,db,function(contacts){ - contactlist=contacts})} + contactlist=contacts}) + } } - onNewContactsChanged:{ + function onNewContactsChanged(newContacts){ if(newContacts.length>0){// download contact images and update db var contacturls=[]; var contactnames=[]; - for (var link in newContacts){ + for (var link in newContacts){//print("new contact " +newContacts[link].screen_name); contacturls.push(newContacts[link].profile_image_url); contactnames.push(newContacts[link].screen_name); Service.updateContactInDB(login,db,newContacts[link].isFriend,newContacts[link]) @@ -91,6 +100,29 @@ StackView{ } + Connections { + target: root + function onWidthChanged(appWidth) { + if(osSettings.osType=="Linux" && Math.abs(appWidth-(globaloptions.appWidth||0))>50){ + Service.updateglobaloptions(db,"appWidth",appWidth) + } + } + } + Connections { + target: root + function onHeightChanged(appHeight) { + if(osSettings.osType=="Linux" && Math.abs(appHeight-(globaloptions.appHeight||0))>50){ + Service.updateglobaloptions(db,"appHeight",appHeight) + } + } + } + + + function showContact(contact){ //print(JSON.stringify(contact)); + rootstackView.push("qrc:/qml/newsqml/ContactPage.qml",{"contact": contact}) + } + + Connections{ target:xhr function onDownloaded(type,url,filename,i){ @@ -104,10 +136,12 @@ StackView{ } } + FontLoader{id: fontAwesome; source: "qrc:/images/fontawesome-webfont.ttf"} - Keys.onReleased: {//print(event.key + "Backkey"+newstab.conversation.length+" "+root.depth) - if (event.key === osSettings.backKey) { + //Keys.onReleased: {//print(event.key + "Backkey"+newstab.conversation.length+" "+root.depth) + onClosing: { + //if (event.key === osSettings.backKey) { if (rootstack.currentIndex==0){ newstab.active=true; if (newstab.newstabstatus!=globaloptions.newsViewType){ @@ -119,294 +153,149 @@ StackView{ Newsjs.chatsfromdb(db,login.username,function(dbnews){ newsSignal(dbnews) })} + close.accepted=false; } - else if (newstab.conversation.length>0){newstab.conversation=[]} - else if (root.depth>1){root.pop()} + else if (newstab.conversation.length>0){ + newstab.conversation=[]; + close.accepted=false + } + else if (root.depth>1){ + root.pop(); + close.accepted=false + } else{ Service.cleanNews(root.db,function(){ Service.cleanHashtags(root.db,function(){ Service.cleanContacts(root.login,root.db,function(){ Qt.quit()}) })}) + close.accepted=true } } else if (rootstack.currentIndex==2){fotoSignal("backButton")} else {rootstack.currentIndex=0} - event.accepted = true - }} + //event.accepted = true + //} + } - Drawer{ - id: leftDrawer - width: 0.66* root.width - height: root.height - edge: Qt.LeftEdge - position: 1.0 - Column{ - x:mm - width:parent.width-mm - Label{ - text: login.hasOwnProperty("username")?login.username:"" - //font.pixelSize: 4*mm - font.pointSize: 16 - width: parent.width - height: 6*mm + + + + header: ToolBar{ + position: wideScreen?ToolBar.Header:ToolBar.Footer + background: Rectangle{ + anchors.fill: parent + color: "#EEEEEE"//"#F8F8F8" + } + RowLayout{ + anchors.fill: parent + ToolButton{ + visible: !wideScreen + text: "\uf0c9" + onClicked:{ + leftDrawer.visible?leftDrawer.close():leftDrawer.open()} } -// Label{ -// text:login.hasOwnProperty("server")?"@"+login.server:"" -// font.pixelSize: 5*mm -// width: parent.width -// } - - Label{ - text: "\uf021 " + qsTr("Refresh") - //font.pixelSize: 4*mm - font.pointSize: 16 - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); -// newstypeSignal("refresh") - updatenews.setDatabase(); - updatenews.login(); - updatenews.startsync(); + TabBar { + id: bar + Layout.fillWidth: true + //width: wideScreen?contentWidth:parent.width-10*mm + //x: 7*mm + onCurrentIndexChanged: rootstack.currentIndex=bar.currentIndex + TabButton { + text: "\uf03a" + background:Rectangle{ + anchors.fill: parent + color: "#EEEEEE" + } + } + TabButton { + text: "\uf0c0" + background:Rectangle{ + anchors.fill: parent + color: "#EEEEEE" + } + } + TabButton { + text: "\uf03e" + background:Rectangle{ + anchors.fill: parent + color: "#EEEEEE" + } + } + TabButton { + text: "\uf073" + background:Rectangle{ + anchors.fill: parent + color: "#EEEEEE" } } } - - - Label{ - text: "\uf1da " + qsTr("Timeline") - //font.pixelSize: 4*mm - font.pointSize: 16 - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("timeline") - } - } - } - - Label{ - text: "\uf086 " + qsTr("Conversations") - width: parent.width - //font.pixelSize: 4*mm - font.pointSize: 16 - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("conversation") - } - } - } - - Label{ - text: "\uf005 " + qsTr("Favorites") - //font.pixelSize: 4*mm - font.pointSize: 16 - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("favorites") - } - } - } - Label{ - text: "\uf0ec " + qsTr("Replies") - //font.pixelSize: 4*mm - font.pointSize: 16 - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("replies") - } - } - } - - - Label{ - text: "\uf0ac " + qsTr("Public Timeline") - //font.pixelSize: 4*mm - font.pointSize: 16 - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("publictimeline") - } - } - } - - Label{ - text: "\uf0c0 " + qsTr("Group news") - //font.pixelSize: 4*mm - font.pointSize: 16 - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("groupnews") - } - } - } - - Label{ - text: "\uf002 " + qsTr("Search") - //font.pixelSize: 4*mm - font.pointSize: 16 - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.close(); - newstypeSignal("search") - } - } - } - - Label{ - text: "\uf085 "+ qsTr("Settings") - //font.pixelSize: 4*mm - font.pointSize: 16 - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked: {root.push("qrc:qml/configqml/ConfigPage.qml"); - leftDrawer.close() - } - } - } - Label{ - text: "\uf2bb " + qsTr("Accounts") - //font.pixelSize: 4*mm - font.pointSize: 16 - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked: {root.push("qrc:qml/configqml/AccountPage.qml"); - leftDrawer.close() - } - } - } - - Label{ - text: "\uf08b " +qsTr("Quit") - //font.pixelSize: 4*mm - font.pointSize: 16 - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - Service.cleanNews(root.db,function(){ - Service.cleanHashtags(root.db,function(){ - Service.cleanContacts(root.login,root.db,function(){ - Qt.quit()}) - })}) - } - } - } - } } - Item{ - id:rootStackItem - width:parent.width - height: parent.height - //anchors.fill:parent - states: State { - name: "fullscreen"; - PropertyChanges { target: bar; height:0 } - PropertyChanges { target: rootstack; height:parent.height } - } + LeftDrawerAndroid{ + id: leftDrawer + visible:!wideScreen + } - transitions: Transition { - PropertyAnimation { properties: "height"; - easing.type: Easing.InOutQuad - duration: 1000 - } - } - TabBar { - id: bar - width: parent.width - height: 7*mm - position:TabBar.Footer - anchors.top: rootstack.bottom - onCurrentIndexChanged: rootstack.currentIndex=bar.currentIndex - TabButton { - text: "\uf03a" - font.pixelSize: 3*mm - height: 6*mm - } - TabButton { - text: "\uf0c0" - font.pixelSize: 3*mm - height: 6*mm - } - TabButton { - text: "\uf03e" - font.pixelSize: 3*mm - height: 6*mm - } +// states: State { +// name: "fullscreen"; +// PropertyChanges { target: bar; height:0 } +// PropertyChanges { target: rootstack; height:parent.height } +// } - TabButton { - text: "\uf073" - font.pixelSize: 3*mm - height: 6*mm - } - } - - StackLayout{ +// transitions: Transition { +// PropertyAnimation { properties: "height"; +// easing.type: Easing.InOutQuad +// duration: 1000 +// } +// } +StackView{id:rootstackView + width:root.width + height: root.height + initialItem: StackLayout{ id:rootstack - width:parent.width - height: parent.height-7*mm + width:rootstackView.width + height: rootstackView.height//-7*mm + //y:wideScreen?7*mm:0 currentIndex:bar.currentIndex - Loader{ id: newstab Layout.fillWidth:true Layout.fillHeight: true property string newstabstatus property var conversation:[] - property var contactposts:[] + source:(rootstack.currentIndex==0)? "qrc:/qml/newsqml/NewsTab.qml":"" } Loader{ id: friendstab - Layout.fillWidth:true - Layout.fillHeight: true +// Layout.fillWidth:true +// Layout.fillHeight: true source: (rootstack.currentIndex==1)?"qrc:/qml/contactqml/FriendsTab.qml":"" } Loader{ id: fotostab property string phototabstatus:"Images" - Layout.fillWidth:true - Layout.fillHeight: true +// Layout.fillWidth:true +// Layout.fillHeight: true source: (rootstack.currentIndex==2)?"qrc:/qml/photoqml/PhotoTab.qml":"" } Loader{ id: calendartab property string calendartabstatus:"Events" - Layout.fillWidth:true - Layout.fillHeight: true +// Layout.fillWidth:true +// Layout.fillHeight: true source: (rootstack.currentIndex==3)?"qrc:/qml/calendarqml/CalendarTab.qml":"" } - } +} + //} Component.onCompleted: { - forceActiveFocus(); - //print(xhr.networktype()); + onLoginChanged(login); + globaloptions=Service.readGO(db); if(osSettings.osType=="Android"){ var component = Qt.createComponent("qrc:/qml/genericqml/IntentReceiver.qml"); var IntentReceiverQml = component.createObject(root); @@ -416,5 +305,5 @@ StackView{ var LinuxSyncQml = component.createObject(root); } } -} +//} } diff --git a/source-linux/qml/genericqml/BlueButton.qml b/source-linux/qml/genericqml/BlueButton.qml index 96bd887..0e1e14d 100644 --- a/source-linux/qml/genericqml/BlueButton.qml +++ b/source-linux/qml/genericqml/BlueButton.qml @@ -32,12 +32,12 @@ import QtQuick 2.0 Rectangle{ id: blueButton - width: Math.max(mainText.width+2*mm,8*mm) + width: Math.max(mainText.width+2*mm,5*mm) height: 5*mm - color:"light blue"//"#EFEAEA" "sky blue" + border.color: "light blue" + color:"transparent"//"#EFEAEA" "sky blue" property alias fontColor: mainText.color -// border.color:"grey" -// border.width:1 + border.width:1 radius: mm property alias text: mainText.text property alias font: mainText.font @@ -51,8 +51,9 @@ Rectangle{ width: contentWidth height: contentHeight font.family:fontAwesome.name - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize text: "" + elide: Text.ElideNone } MouseArea{ id:buttonArea diff --git a/source-linux/qml/genericqml/ContactComponent.qml b/source-linux/qml/genericqml/ContactComponent.qml index a6926e4..e652156 100644 --- a/source-linux/qml/genericqml/ContactComponent.qml +++ b/source-linux/qml/genericqml/ContactComponent.qml @@ -35,15 +35,15 @@ import "qrc:/qml/genericqml" Item { id: contactComponent - height: 8*mm - width: parent.width + height: 5*root.fontFactor*osSettings.systemFontSize//8*mm + width: contactComponent.ListView.view.width//parent.width property var createdAtDate: new Date(contact.created_at) property string connectUrl: (contact.network!=="dfrn")||(contact.isFriend==1)?"":( ""+qsTr("Connect")+"
") Rectangle { id: wrapper width:parent.width - height: 8*mm + height: parent.height//8*mm radius: 0.5*mm border.color: "grey" color:"white" @@ -51,34 +51,45 @@ Item { id: photoImage x:0.5*mm y:0.5*mm - width: 7*mm - height:7*mm + width: 4*root.fontFactor*osSettings.systemFontSize//7*mm + height:4*root.fontFactor*osSettings.systemFontSize//7*mm source:((contact.profile_image!="") && (typeof(contact.profile_image)=="string"))? "file://"+contact.profile_image : contact.profile_image_url onStatusChanged: {if (photoImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"}} } - Column{ - width: wrapper.width-8*mm + Flow{ + width: wrapper.width-4*root.fontFactor*osSettings.systemFontSize//8*mm + height: wrapper.height-mm anchors.left: photoImage.right anchors.margins: 1*mm - spacing: mm + //spacing: mm + clip: true Label { id: namelabel - width: wrapper.width-4 - height: 3*mm + width: Math.min(wrapper.width-(photoImage.width+mm),contentWidth)//wrapper.width-4 + height: 1.1*root.fontFactor*osSettings.bigFontSize//3*mm text: contact.name - elide:Text.ElideRight + elide: contentWidth>wrapper.width-4*osSettings.systemFontSize?Text.ElideRight:Text.ElideNone color: "#303030" - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize } Label { id: screennamelabel - width: wrapper.width-8*mm - height: 2.5*mm - text: "@"+contact.screen_name - elide:Text.ElideRight + width: Math.min(wrapper.width-4*root.fontFactor*osSettings.systemFontSize,contentWidth)//contentWidth+2*mm//wrapper.width-8*mm + height: 1.1*root.fontFactor*osSettings.bigFontSize//3*mm + text: "(@"+contact.screen_name+")" + elide: contentWidth>wrapper.width-4*root.fontFactor*osSettings.systemFontSize?Text.ElideRight:Text.ElideNone color: "#303030" - font.pixelSize: 2.5*mm + font.pointSize: osSettings.bigFontSize + } + Label { + id: descriptionlabel + width: Math.min(wrapper.width-4*root.fontFactor*osSettings.systemFontSize,contentWidth)//contentWidth+2*mm//wrapper.width-8*mm + height: 2*root.fontFactor*osSettings.systemFontSize//2.5*mm + text: contact.description + elide:contentWidth>wrapper.width-4*root.fontFactor*osSettings.systemFontSize?Text.ElideRight:Text.ElideNone + color: "#303030" + font.pointSize: osSettings.systemFontSize } } MouseArea{ diff --git a/source-linux/qml/genericqml/DrawerAccountComponent.qml b/source-linux/qml/genericqml/DrawerAccountComponent.qml new file mode 100644 index 0000000..2736acd --- /dev/null +++ b/source-linux/qml/genericqml/DrawerAccountComponent.qml @@ -0,0 +1,235 @@ +// This file is part of Friendiqa +// https://git.friendi.ca/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + +import QtQuick 2.0 +import QtQuick.Controls 2.12 +import "qrc:/qml/genericqml" + +Item { + id: drawerAccountComponent + property var account: ({}) + width: parent.width + + Label{ + + y:0.5*root.fontFactor*osSettings.bigFontSize + width:parent.width + height: 1.5*osSettings.bigFontSize*root.fontFactor + verticalAlignment:Text.AlignBottom + font.pointSize: osSettings.bigFontSize + text: account.username + } + // Label{ + // text:login.hasOwnProperty("server")?"@"+login.server:"" + // font.pixelSize: 5*mm + // width: parent.width + // } + + Label{ + y:2*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + text: "\uf021 " + qsTr("Refresh") + MouseArea{ + anchors.fill:parent + onClicked: { + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + newstypeSignal("refresh") +// updatenews.setDatabase(); +// updatenews.login(); +// updatenews.startsync(); + } + } + } + + Label{ + y:3.5*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && currentnewstabstatus=="Timeline" + text: "\uf1da " + qsTr("Timeline") + MouseArea{ + anchors.fill:parent + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + newsSwipeview.currentIndex=0; + currentnewstabstatus="Timeline"; + newstypeSignal("timeline") + } + } + } + + Label{ + y:5*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && currentnewstabstatus=="Conversations" + text: "\uf086 " + qsTr("Conversations") + MouseArea{ + anchors.fill:parent + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + newsSwipeview.currentIndex=0; + currentnewstabstatus="Conversations"; + newstypeSignal("conversation") + } + } + } + + + + Label{ + y:6.5*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && currentnewstabstatus=="Replies" + text: "\uf0ec " + qsTr("Replies") + MouseArea{ + anchors.fill:parent + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + newsSwipeview.currentIndex=1 + currentnewstabstatus="Replies"; + newstypeSignal("replies") + } + } + } + + Label{ + y:8*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && currentnewstabstatus=="DirectMessages" + text: "\uf0e0 " + qsTr("Direct Messages") + MouseArea{ + anchors.fill:parent + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + newsSwipeview.currentIndex=2//newstypeSignal("replies") + currentnewstabstatus="DirectMessages"; + } + } + } + Label{ + y:9.5*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && currentnewstabstatus=="Favorites" + text: "\uf005 " + qsTr("Favorites") + MouseArea{ + anchors.fill:parent + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + newsSwipeview.currentIndex=0; + currentnewstabstatus="Favorites"; + newstypeSignal("favorites") + } + } + } + + Label{ + y:11*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && currentnewstabstatus=="Public Timeline" + text: "\uf0ac " + qsTr("Public Timeline") + MouseArea{ + anchors.fill:parent + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + newsSwipeview.currentIndex=0; + currentnewstabstatus="Public Timeline"; + newstypeSignal("publictimeline") + } + } + } + + Label{ + y:12.5*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && currentnewstabstatus=="Groupnews" + text: "\uf0c0 " + qsTr("Group news") + MouseArea{ + anchors.fill:parent + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + newsSwipeview.currentIndex=0; + currentnewstabstatus="Groupnews"; + newstypeSignal("groupnews") + } + } + } + + Label{ + y:14*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && currentnewstabstatus=="Search" + text: "\uf002 " + qsTr("Search") + MouseArea{ + anchors.fill:parent + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + newsSwipeview.currentIndex=0; + currentnewstabstatus="Search"; + newstypeSignal("search") + } + } + } + + Label{ + y:15.5*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && currentnewstabstatus=="Notifications" + text: "\uf0f3 " + qsTr("Notifications") + MouseArea{ + anchors.fill:parent + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + newsSwipeview.currentIndex=3; + currentnewstabstatus="Notifications"; + newstypeSignal("notifications") + } + } + } +} diff --git a/source-linux/qml/genericqml/DrawerAccountComponentContacts.qml b/source-linux/qml/genericqml/DrawerAccountComponentContacts.qml new file mode 100644 index 0000000..da545e0 --- /dev/null +++ b/source-linux/qml/genericqml/DrawerAccountComponentContacts.qml @@ -0,0 +1,126 @@ +// This file is part of Friendiqa +// https://git.friendi.ca/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + +import QtQuick 2.0 +import QtQuick.Controls 2.12 +import "qrc:/qml/genericqml" + +Item { + id: drawerAccountComponent + property var account: ({}) + width: parent.width + + Label{ + + y:0.5*osSettings.bigFontSize + width:parent.width + height: 1.5*root.fontFactor*osSettings.bigFontSize + verticalAlignment:Text.AlignBottom + font.pointSize: osSettings.bigFontSize + text: account.username + } + // Label{ + // text:login.hasOwnProperty("server")?"@"+login.server:"" + // font.pixelSize: 5*mm + // width: parent.width + // } + + Label{ + y:2*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && friendsTabView.currentIndex==0 + text: " "+qsTr("Profile") + MouseArea{ + anchors.fill:parent + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + friendsTabView.currentIndex=0; + profileLoader.source=""; + profileLoader.source="qrc:/qml/contactqml/ProfileTab.qml" + } + } + } + + Label{ + y:3.5*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && friendsTabView.currentIndex==1 + text: " "+qsTr("Friends") + MouseArea{ + anchors.fill:parent + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + friendsTabView.currentIndex=1 + friendsListLoader.source=""; + friendsListLoader.source="qrc:/qml/contactqml/FriendsListTab.qml" + } + } + } + + Label{ + y:5*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && friendsTabView.currentIndex==2 + text: " "+qsTr("Contacts") + MouseArea{ + anchors.fill:parent + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + friendsTabView.currentIndex=2 + } + } + } + + + + Label{ + y:6.5*root.fontFactor*osSettings.bigFontSize + width:parent.width + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && friendsTabView.currentIndex==3 + text: " "+qsTr("Groups") + MouseArea{ + anchors.fill:parent + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + friendsTabView.currentIndex=3 + } + } + } + } + diff --git a/source-linux/qml/genericqml/ImagePickerLinux.qml b/source-linux/qml/genericqml/ImagePickerLinux.qml index ddb0045..2e77f79 100644 --- a/source-linux/qml/genericqml/ImagePickerLinux.qml +++ b/source-linux/qml/genericqml/ImagePickerLinux.qml @@ -62,7 +62,7 @@ Rectangle{ } Button{ id:closeButton - height: 8*mm + height: 3*root.fontFactor*osSettings.bigFontSize anchors.top: parent.top anchors.topMargin: 0.5*mm anchors.right: parent.right @@ -126,7 +126,7 @@ Rectangle{ width: fileIsDir?parent.width - 12*mm :imageView.width-mm anchors.bottom: folderImage.bottom color: fileIsDir?"black":"white" - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize wrapMode:Text.Wrap } Text { @@ -138,7 +138,7 @@ Rectangle{ width: 10*mm anchors.top: folderImage.top color: "green" - font.pixelSize: 10*mm + font.pointSize: 3*osSettings.bigFontSize } Image{id:folderImage diff --git a/source-linux/qml/genericqml/IntentReceiver.qml b/source-linux/qml/genericqml/IntentReceiver.qml index 8c3a007..062ab36 100644 --- a/source-linux/qml/genericqml/IntentReceiver.qml +++ b/source-linux/qml/genericqml/IntentReceiver.qml @@ -15,7 +15,7 @@ Item { Connections { target: SystemDispatcher - onDispatched: { + function onDispatched (type, message) { if ((type === m_IMAGE_MESSAGE)&& (root.imagePicking==false)) { var h=[]; for (var n in message.imageUrls){ diff --git a/source-linux/qml/genericqml/LeftDrawerAndroid.qml b/source-linux/qml/genericqml/LeftDrawerAndroid.qml new file mode 100644 index 0000000..cdcdea9 --- /dev/null +++ b/source-linux/qml/genericqml/LeftDrawerAndroid.qml @@ -0,0 +1,41 @@ +// This file is part of Friendiqa +// https://git.friendi.ca/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + +import QtQuick 2.0 +import QtQuick.Controls 2.12 +import "qrc:/qml/configqml" + +Drawer{ + id: leftDrawer + width: root.fontFactor*osSettings.systemFontSize*10 + height: root.height + LeftDrawerScrollview{} +} diff --git a/source-linux/qml/genericqml/LeftDrawerLinux.qml b/source-linux/qml/genericqml/LeftDrawerLinux.qml new file mode 100644 index 0000000..68166b3 --- /dev/null +++ b/source-linux/qml/genericqml/LeftDrawerLinux.qml @@ -0,0 +1,55 @@ +// This file is part of Friendiqa +// https://git.friendi.ca/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + +import QtQuick 2.0 +import QtQuick.Controls 2.12 +import "qrc:/qml/configqml" + +Rectangle{ +// id: leftDrawer +// width: osSettings.systemFontSize*30 +// height: root.height-bar.height + //y: bar.height + signal opened() + + LeftDrawerScrollview{ + width:parent.width-mm + height:parent.height + x:mm + } + Rectangle{ + width: 1 + height: leftDrawer.height + anchors.right: leftDrawer.right + color: "#EEEEEE" + } + Component.onCompleted: {opened();} +} diff --git a/source-linux/qml/genericqml/MButton.qml b/source-linux/qml/genericqml/MButton.qml index b6cb841..74c1803 100644 --- a/source-linux/qml/genericqml/MButton.qml +++ b/source-linux/qml/genericqml/MButton.qml @@ -32,10 +32,11 @@ import QtQuick 2.6 import QtQuick.Controls 2.12 Button{ id: mButton - width: Math.max(text.width+2*mm,8*mm) + property alias color: bg.color + width: Math.max(text.width+2*mm,2*root.fontFactor*osSettings.bigFontSize) //radius: mm - height: 6*mm + height: 2*root.fontFactor*osSettings.bigFontSize //color: Material.grey - font.pixelSize: 3*mm - background: Rectangle{color:"#F8F8F8";radius: 0.5*mm} + font.pointSize: osSettings.bigFontSize + background: Rectangle{id:bg;color:"#F3F3F3";radius: 0.5*mm} } diff --git a/source-linux/qml/genericqml/Search.qml b/source-linux/qml/genericqml/Search.qml index 6046ad1..eafa617 100644 --- a/source-linux/qml/genericqml/Search.qml +++ b/source-linux/qml/genericqml/Search.qml @@ -41,7 +41,7 @@ Rectangle { id:searchComponent Rectangle{ - color: "white" + color: "#EEEEEE" radius:0.5*mm anchors.left: parent.left anchors.leftMargin:mm @@ -53,7 +53,7 @@ Rectangle { TextInput { id: searchText focus: true - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize wrapMode: Text.Wrap anchors.fill: parent selectByMouse: true diff --git a/source-linux/qml/newsqml/ContactPage.qml b/source-linux/qml/newsqml/ContactPage.qml index 778682c..e0b3bcb 100644 --- a/source-linux/qml/newsqml/ContactPage.qml +++ b/source-linux/qml/newsqml/ContactPage.qml @@ -33,154 +33,290 @@ import QtQuick 2.0 import QtQuick.Controls 2.12 import "qrc:/js/helper.js" as Helperjs +import "qrc:/js/news.js" as Newsjs +import "qrc:/js/service.js" as Service import "qrc:/qml/genericqml" -Rectangle { + +Page { id:contactList - color: "white" property var contact:({}) property string profileimagesource:contact.profile_image - ListView { - id: contactView - x:mm - y:9*mm - width: contactList.width-4*mm - height:contactList.height-10*mm - clip: true - spacing: 0 - header: contactHeader - model: contactModel - delegate: Newsitem{} - } + + //function backRequested(){pageStack.pop()} + + function getDateDiffString (seconds){ + var timestring=""; + if (seconds<60) {timestring= Math.round(seconds) + " " +qsTr("seconds");} + else if (seconds<90){timestring= Math.round(seconds/60) + " " +qsTr("minute") ;} + else if (seconds<3600){timestring= Math.round(seconds/60) + " " +qsTr("minutes");} + else if (seconds<5400){timestring= Math.round(seconds/3600) + " " +qsTr("hour");} + else if (seconds<86400){timestring= Math.round(seconds/3600) + " " +qsTr("hours");} + else if (seconds<129600){timestring= Math.round(seconds/86400) + " " +qsTr("day");} + else if (seconds<3888000){timestring= Math.round(seconds/86400) + " " +qsTr("days");} + else if (seconds<5832000){timestring= Math.round(seconds/3888000) + " " +qsTr("month");} + else if (seconds<69984000){timestring= Math.round(seconds/3888000) + " " +qsTr("months");} + else {timestring= Math.round(seconds/46656000) + " " + qsTr("years");} + + return timestring; + } + + function getActivitiesView(newsitemobject){ + var likeText="";var dislikeText="";var attendyesText="";var attendnoText="";var attendmaybeText=""; var self={}; + try{if (newsitemobject.messagetype==0&&newsitemobject.hasOwnProperty('friendica_activities')){ + if (newsitemobject.friendica_activities.like.length>0){ + if (newsitemobject.friendica_activities.like.length==1){likeText= newsitemobject.friendica_activities.like[0].name+" "+ qsTr("likes this.")} + else {likeText= newsitemobject.friendica_activities.like.length+" "+ qsTr("like this.")} + } + if (newsitemobject.friendica_activities.dislike.length>0){ + if (newsitemobject.friendica_activities.dislike.length==1){dislikeText= newsitemobject.friendica_activities.dislike[0].name+" "+ qsTr("doesn't like this.")} + else {dislikeText= newsitemobject.friendica_activities.dislike.length+" "+ qsTr("don't like this.")} + } + if (newsitemobject.friendica_activities.attendyes.length>0){ + if (newsitemobject.friendica_activities.attendyes.length==1){attendyesText=newsitemobject.friendica_activities.attendyes[0].name+" "+ qsTr("will attend.")} + else {attendyesText= newsitemobject.friendica_activities.attendyes.length+" "+ qsTr("persons will attend.")} + } + if (newsitemobject.friendica_activities.attendno.length>0){ + if (newsitemobject.friendica_activities.attendno.length==1){attendnoText= newsitemobject.friendica_activities.attendno[0].name+" "+ qsTr("will not attend.")} + else {attendnoText= newsitemobject.friendica_activities.attendno.length+" "+ qsTr("persons will not attend.")} + } + if (newsitemobject.friendica_activities.attendmaybe.length>0){ + if (newsitemobject.friendica_activities.attendmaybe.length==1){attendmaybeText= newsitemobject.friendica_activities.attendmaybe[0].name+" "+ qsTr("may attend.")} + else {attendmaybeText= newsitemobject.friendica_activities.attendmaybe.length+" "+ qsTr("persons may attend.")} + } + //var friendica_activities_self=JSON.parse(newsitemobject.friendica_activities_self); + }} catch(e){print("Activities "+e+ " "+JSON.stringify(newsitemobject.friendica_activities))} + return {likeText:likeText,dislikeText:dislikeText,attendyesText:attendyesText,attendnoText:attendnoText,attendmaybeText:attendmaybeText} + } + + function showConversation(conversationIndex,newsitemobject){ + if(newsitemobject.messagetype==0 || newsitemobject.messagetype==3){ + xhr.clearParams(); + xhr.setLogin(login.username+":"+Qt.atob(login.password)); + xhr.setUrl(login.server); + xhr.setApi("/api/conversation/show"); + xhr.setParam("id",newsitemobject.id) + xhr.get(); + } + else{ + xhr.clearParams(); + xhr.setLogin(login.username+":"+Qt.atob(login.password)); + xhr.setUrl(login.server); + xhr.setApi("/api/direct_messages/conversation"); + xhr.setParam("uri",newsitemobject.statusnet_conversation_id) + xhr.get(); + } + } + + Timer {id:contacttimer; interval: 50; running: false; repeat: false + onTriggered: { + root.newContacts=Newsjs.findNewContacts(root.news,root.contactlist); + root.onNewContactsChanged(root.newContacts); + Newsjs.storeNews(login,db,root.news,root) + } + } + + ListView { + id: contactView + x:mm + y:4*root.fontFactor*osSettings.bigFontSize + width: contactList.width-2*mm + height:contactList.height-7*root.fontFactor*osSettings.bigFontSize + clip: true + spacing: 0 + property string viewtype: "conversation" + header: contactHeader + model: contactModel + delegate: Newsitem{} + } + BusyIndicator{ - id: contactBusy - anchors.centerIn:parent - width:10*mm - height: 10*mm - running: true - } + id: contactBusy + anchors.centerIn:parent + width:10*mm + height: 10*mm + running: true + } - Component { id: contactHeader - Rectangle{ - border.color: "#EEEEEE" - border.width: 1 - color:"white" - width:contactView.width - height: profileImage.height+namelabel.height+detailtext.height+7*mm - //height: wrapper.height - property var createdAtDate: new Date(contact.created_at) - property string connectUrl: (contact.network!=="dfrn")||(contact.isFriend!=0)?"":( ""+qsTr("Connect")+"
") + Component { id: contactHeader + Rectangle{ + border.color: "#EEEEEE" + border.width: 1 + color:"white" + width:contactView.width + height: contactView.width<35*root.fontFactor*osSettings.systemFontSize?(profileImage.height+namelabel.height+detailtext.height+7*mm):Math.max(profileImage.height,(buttonflow.height+namelabel.height+detailtext.height))+7*mm + //height: wrapper.height + property var createdAtDate: new Date(contact.created_at) + property string connectUrl: (contact.network!=="dfrn")||(contact.isFriend!=0)?"":( ""+qsTr("Connect")+"
") - Image { - id: profileImage - x:mm - y:mm - width: contactView.width/2 - height:width - source:(contact.profile_image!="")? "file://"+contact.profile_image : contact.profile_image_url - onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} - Connections{ - target:contactList - onProfileimagesourceChanged:profileImage.source=profileimagesource - } - } - Column{id:buttoncolumn - anchors.right: parent.right - anchors.rightMargin: mm - y: mm - spacing:4 + Image { + id: profileImage + x:mm + y:mm + width: Math.min(15*root.fontFactor*osSettings.bigFontSize,contactView.width/2) //contactView.width/2 + height:width + source:(contact.profile_image!="")? "file://"+contact.profile_image : contact.profile_image_url + onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} + Connections{ + target:contactList + onProfileimagesourceChanged:profileImage.source=profileimagesource + } + } + Flow{id:buttonflow + anchors.right: parent.right + anchors.rightMargin: mm + width: contactView.width - (profileImage.width+3*mm) + height: (contact.hasOwnProperty("acct"))?21*mm:15*mm//profileImage.height + y: mm + spacing:4 - MButton{ - id:photobutton - height: 6*mm - width: 8*mm - text: "\uf03e" // "Photos" - //font.pixelSize: 3*mm - visible:(contact.network=="dfrn") - onClicked:{ - rootstack.currentIndex=2; - bar.currentIndex=2; - fotostab.phototabstatus="Contact"; + BlueButton{ + id:photobutton + height: 6*mm + width: 8*mm + text: "\uf03e" // "Photos" + visible:(contact.network=="dfrn") + onClicked:{ + rootstack.currentIndex=2; + bar.currentIndex=2; + fotostab.phototabstatus="Contact"; - //fotostab.active=true; - fotoSignal(root.login,contact) ; - newsStack.pop(); - } - } + //fotostab.active=true; + fotoSignal(root.login,contact) ; + rootstackView.pop(); + } + } - MButton{ - id:dmbutton - height: 6*mm - width: 8*mm - visible: (contact.following=="true") - text: "\uf040" //"DM" - //font.pixelSize: 3*mm - onClicked:{ - rootstack.currentIndex=0; - newsSwipeview.currentIndex=2; - directmessageSignal(contact) - } - } + BlueButton{ + id:dmbutton + height: 6*mm + width: 8*mm + visible: (contact.following=="true") + text: "\uf040" //"DM" + onClicked:{ + rootstack.currentIndex=0; + newsSwipeview.currentIndex=2; + directmessageSignal(contact) + } + } - MButton{ - id:eventbutton - visible:(contact.network=="dfrn") - height: 6*mm - width: 8*mm - text:"\uf073" - //font.pixelSize: 3*mm - onClicked:{ - rootstack.currentIndex=3; - bar.currentIndex=3; - calendartab.calendartabstatus="Friend" - eventSignal(contact); - newsStack.pop() - } - } + BlueButton{ + id:eventbutton + visible:(contact.network=="dfrn") + height: 6*mm + width: 8*mm + text:"\uf073" + onClicked:{ + rootstack.currentIndex=3; + bar.currentIndex=3; + calendartab.calendartabstatus="Friend" + eventSignal(contact); + rootstackView.pop() + } + } + BlueButton{ + id:approvebutton + visible:(contact.hasOwnProperty("acct")) + height: 6*mm + //width: implicitContentWidth+2*mm//8*mm + text:qsTr("Approve") + onClicked:{ - }//Column end - Label { - id: namelabel - x:mm - width: contactView.width-2*mm - height: implicitHeight - text:contact.name+" (@"+contact.screen_name+")" - wrapMode: Text.Wrap//elide:Text.ElideRight - color: "#303030" - font.pixelSize: 4*mm - anchors.top: profileImage.bottom - anchors.topMargin: mm - } - Text{ - id:detailtext - anchors.top: namelabel.bottom - anchors.topMargin: 2*mm - x:mm - width: contactView.width-2*mm - height: implicitHeight - font.pixelSize: 2.5*mm - textFormat:Text.RichText - wrapMode: Text.Wrap - text:""+qsTr("Description")+": "+contact.description+"
"+qsTr("Location")+": "+contact.location+"
"+qsTr("Posts")+": "+contact.statuses_count+ - "
"+qsTr("URL")+": "+contact.url+"
"+ - connectUrl+ ""+qsTr("Created at")+": "+createdAtDate.toLocaleString(Qt.locale()) - onLinkActivated: { + Helperjs.friendicaPostRequest(login,"/api/v1/follow_requests/" + contact.id + "/authorize",'',"POST",root,function(returnvalue){ + Helperjs.deleteData(db,"friendshiprequests",login.username,function(){},"id", contact.id) + }) + root.friendsSignal(); + rootstackView.pop() + } + } + BlueButton{ + id:rejectbutton + visible:(contact.hasOwnProperty("acct")) + height: 6*mm + //width: implicitContentWidth+2*mm//8*mm + text:qsTr("Reject") + onClicked:{ + Helperjs.friendicaPostRequest(login,"/api/v1/follow_requests/" + contact.id + "/reject",'',"POST",root,function(returnvalue){ + Helperjs.deleteData(db,"friendshiprequests",login.username,function(){},"id", contact.id) + }) + root.friendsSignal(); + rootstackView.pop() + } + } + BlueButton{ + id:ignorebutton + visible:(contact.hasOwnProperty("acct")) + height: 6*mm + //width: implicitContentWidth+2*mm//8*mm + text:qsTr("Ignore") + onClicked:{ + Helperjs.friendicaPostRequest(login,"/api/v1/follow_requests/" + contact.id + "/ignore",'',"POST",root,function(returnvalue){ + Helperjs.deleteData(db,"friendshiprequests",login.username,function(){},"id", contact.id) + }); + root.friendsSignal(); + rootstackView.pop() + } + } + }//Flow end + Label { + id: namelabel + //x:mm + width: contactView.width<35*root.fontFactor*osSettings.systemFontSize?contactView.width-2*mm:contactView.width-17*root.fontFactor*osSettings.bigFontSize + height: implicitHeight + text:contact.name+" (@"+contact.screen_name+")" + wrapMode: Text.Wrap//elide:Text.ElideRight + color: "#303030" + font.pointSize: 1.2*osSettings.bigFontSize + font.family: "Noto Sans" + anchors.top: contactView.width<35*root.fontFactor*osSettings.systemFontSize?profileImage.bottom:buttonflow.bottom + anchors.margins: mm + anchors.left: contactView.width<35*root.fontFactor*osSettings.systemFontSize?contactView.left:profileImage.right + } + Text{ + id:detailtext + anchors.top: namelabel.bottom + anchors.left: contactView.width<35*root.fontFactor*osSettings.systemFontSize?contactView.left:profileImage.right + anchors.margins: 2*mm + //x:mm + width: contactView.width<35*root.fontFactor*osSettings.systemFontSize?contactView.width-2*mm:contactView.width-17*root.fontFactor*osSettings.bigFontSize + height: implicitHeight + font.pointSize: osSettings.systemFontSize + font.family: "Noto Sans" + textFormat:Text.RichText + wrapMode: Text.Wrap + text:""+qsTr("Description")+": "+contact.description+"
"+qsTr("Location")+": "+contact.location+"
"+qsTr("Posts")+": "+contact.statuses_count+ + "
"+qsTr("URL")+": "+contact.url+"
"+ + connectUrl+ ""+qsTr("Created at")+": "+createdAtDate.toLocaleString(Qt.locale()) + onLinkActivated: { Qt.openUrlExternally(link)} - } + } - //} - } + //} + } + + }//Component end - }//Component end Connections{ - target:newstab + target:xhr + function onError(data,url,api,code){ + if (data !="contactlist"){Helperjs.showMessage(qsTr("Network Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root);} + contactBusy.running=false; + } + function onSuccess(data,api){ + Service.processNews(api,data) + replySignal("") + } + } + + Connections{ + target:root function onContactpostsChanged(){ - if (newstab.contactposts.length>0){profileimagesource=newstab.contactposts[0].user.profile_image_url_large} + if (root.contactposts.length>0&&root.contactposts[0]!=null){profileimagesource=root.contactposts[0].user.profile_image_url_large} contactBusy.running=false; contactModel.clear(); var currentTime= new Date(); - var msg = {'currentTime': currentTime, 'model': contactModel,'news':newstab.contactposts, 'options':globaloptions}; + var msg = {'currentTime': currentTime, 'model': contactModel,'news':root.contactposts, 'options':globaloptions}; contactWorker.sendMessage(msg) } } @@ -193,25 +329,26 @@ Rectangle { } MButton { - id: closeButton - height: 6*mm - width: 8*mm - anchors.top: parent.top - anchors.topMargin: 1*mm - anchors.right: parent.right - anchors.rightMargin: 1*mm - text: "\uf057" - //font.pixelSize: 3*mm - onClicked: { - newsStack.pop() - } + id: closeButton + anchors.top: parent.top + anchors.topMargin: 0.5*root.fontFactor*osSettings.bigFontSize + anchors.right: parent.right + anchors.rightMargin: 1*mm + width: 2*root.fontFactor*osSettings.bigFontSize; + text: "\uf057" + //font.pixelSize: 3*mm + onClicked: { + rootstackView.pop() + } } Component.onCompleted: { - xhr.clearParams(); - xhr.setLogin(login.username+":"+Qt.atob(login.password)); - xhr.setUrl(login.server); - xhr.setApi("/api/statuses/user_timeline"); - xhr.setParam("user_id",contact.id) - xhr.get(); + xhr.clearParams(); + xhr.setLogin(login.username+":"+Qt.atob(login.password)); + xhr.setUrl(login.server); + if(contact.isFriend==1 || contact.hasOwnProperty("acct")){ + xhr.setApi("/api/statuses/user_timeline");} + else{xhr.setApi("/api/users/show");} + xhr.setParam("user_id",contact.id) + xhr.get(); } } diff --git a/source-linux/qml/newsqml/Conversation.qml b/source-linux/qml/newsqml/Conversation.qml index 9b4fff5..a511617 100644 --- a/source-linux/qml/newsqml/Conversation.qml +++ b/source-linux/qml/newsqml/Conversation.qml @@ -36,19 +36,66 @@ import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" import "qrc:/qml/newsqml" -Rectangle { +Page { id:conversationList property var news:[] - color: "white" +// color: "white" + //function backRequested(){pageStack.pop()} +// width:root.width +// height: root.height-7*mm + + function getDateDiffString (seconds){ + var timestring=""; + if (seconds<60) {timestring= Math.round(seconds) + " " +qsTr("seconds");} + else if (seconds<90){timestring= Math.round(seconds/60) + " " +qsTr("minute") ;} + else if (seconds<3600){timestring= Math.round(seconds/60) + " " +qsTr("minutes");} + else if (seconds<5400){timestring= Math.round(seconds/3600) + " " +qsTr("hour");} + else if (seconds<86400){timestring= Math.round(seconds/3600) + " " +qsTr("hours");} + else if (seconds<129600){timestring= Math.round(seconds/86400) + " " +qsTr("day");} + else if (seconds<3888000){timestring= Math.round(seconds/86400) + " " +qsTr("days");} + else if (seconds<5832000){timestring= Math.round(seconds/3888000) + " " +qsTr("month");} + else if (seconds<69984000){timestring= Math.round(seconds/3888000) + " " +qsTr("months");} + else {timestring= Math.round(seconds/46656000) + " " + qsTr("years");} + + return timestring; + } + + function getActivitiesView(newsitemobject){ + var likeText="";var dislikeText="";var attendyesText="";var attendnoText="";var attendmaybeText=""; var self={}; + try{if (newsitemobject.messagetype==0&&newsitemobject.hasOwnProperty('friendica_activities')){ + if (newsitemobject.friendica_activities.like.length>0){ + if (newsitemobject.friendica_activities.like.length==1){likeText= newsitemobject.friendica_activities.like[0].name+" "+ qsTr("likes this.")} + else {likeText= newsitemobject.friendica_activities.like.length+" "+ qsTr("like this.")} + } + if (newsitemobject.friendica_activities.dislike.length>0){ + if (newsitemobject.friendica_activities.dislike.length==1){dislikeText= newsitemobject.friendica_activities.dislike[0].name+" "+ qsTr("doesn't like this.")} + else {dislikeText= newsitemobject.friendica_activities.dislike.length+" "+ qsTr("don't like this.")} + } + if (newsitemobject.friendica_activities.attendyes.length>0){ + if (newsitemobject.friendica_activities.attendyes.length==1){attendyesText=newsitemobject.friendica_activities.attendyes[0].name+" "+ qsTr("will attend.")} + else {attendyesText= newsitemobject.friendica_activities.attendyes.length+" "+ qsTr("persons will attend.")} + } + if (newsitemobject.friendica_activities.attendno.length>0){ + if (newsitemobject.friendica_activities.attendno.length==1){attendnoText= newsitemobject.friendica_activities.attendno[0].name+" "+ qsTr("will not attend.")} + else {attendnoText= newsitemobject.friendica_activities.attendno.length+" "+ qsTr("persons will not attend.")} + } + if (newsitemobject.friendica_activities.attendmaybe.length>0){ + if (newsitemobject.friendica_activities.attendmaybe.length==1){attendmaybeText= newsitemobject.friendica_activities.attendmaybe[0].name+" "+ qsTr("may attend.")} + else {attendmaybeText= newsitemobject.friendica_activities.attendmaybe.length+" "+ qsTr("persons may attend.")} + } + //var friendica_activities_self=JSON.parse(newsitemobject.friendica_activities_self); + }} catch(e){print("Activities "+e+ " "+JSON.stringify(newsitemobject.friendica_activities))} + return {likeText:likeText,dislikeText:dislikeText,attendyesText:attendyesText,attendnoText:attendnoText,attendmaybeText:attendmaybeText} + } ListView { id: conversationView property string viewtype: "conversation" - x:3*mm - y:8*mm - width: conversationList.width-4*mm - height:conversationList.height-10*mm + //x:3*mm + //y:8*mm + width: conversationList.width//-4*mm + height:conversationList.height//-20*mm clip: true spacing: 0 footer: MessageSend{conversation:true} @@ -58,7 +105,7 @@ Rectangle { BusyIndicator{ id: conversationBusy anchors.horizontalCenter: conversationView.horizontalCenter - anchors.top:conversationList.top + anchors.top:conversationView.top anchors.topMargin: 2*mm width:10*mm height: 10*mm @@ -69,7 +116,7 @@ Rectangle { target:newstab onConversationChanged:{ if(newstab.conversation.length==0){ - newsStack.pop() + rootstackView.pop() } else { conversationBusy.running=false; conversationModel.clear(); var currentTime= new Date(); @@ -88,16 +135,16 @@ Rectangle { MButton { id: closeButton - height: 6*mm - width: 8*mm anchors.top: parent.top anchors.topMargin: 1*mm anchors.right: parent.right anchors.rightMargin: 1*mm + width: 2*root.fontFactor*osSettings.bigFontSize; text: "\uf057" onClicked: { //newsView.positionViewAtIndex(newsStack.conversationIndex,ListView.Beginning); newstab.conversation=[]; + if (rootstackView.depth>1){ rootstackView.pop()} } } diff --git a/source-linux/qml/newsqml/FriendicaActivities.qml b/source-linux/qml/newsqml/FriendicaActivities.qml index f39063e..0fdc91e 100644 --- a/source-linux/qml/newsqml/FriendicaActivities.qml +++ b/source-linux/qml/newsqml/FriendicaActivities.qml @@ -74,7 +74,7 @@ Rectangle { onStatusChanged: if (contactImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} } Text{ - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize anchors.left: contactImage.right anchors.margins: 1*mm text:contact.name @@ -86,9 +86,8 @@ Rectangle { } }} - BlueButton { + MButton { id: closeButton - //width:10*mm anchors.top: parent.top anchors.topMargin: 1*mm anchors.right: parent.right diff --git a/source-linux/qml/newsqml/Hashtag.qml b/source-linux/qml/newsqml/Hashtag.qml index 711a10c..47602c5 100644 --- a/source-linux/qml/newsqml/Hashtag.qml +++ b/source-linux/qml/newsqml/Hashtag.qml @@ -46,6 +46,6 @@ Rectangle { } MouseArea{ anchors.fill: parent - onClicked:{search(hashtagText.text.replace("#",""))} + onClicked:{root.searchSignal(hashtagText.text.replace("#",""))} } } diff --git a/source-linux/qml/newsqml/MessageSend.qml b/source-linux/qml/newsqml/MessageSend.qml index 9be7e66..1cd98bb 100644 --- a/source-linux/qml/newsqml/MessageSend.qml +++ b/source-linux/qml/newsqml/MessageSend.qml @@ -43,9 +43,9 @@ import "qrc:/qml/genericqml" Rectangle{ color:"#EEEEEE" width:parent.width - height: (newsSwipeview.stacktype!="Notifications")?messageColumn.height+mm:0 + height: conversation || (newsSwipeview.stacktype!="Notifications")?messageColumn.height+mm:0 id:messageSend - visible:(newsSwipeview.stacktype!="Notifications")?true:false + visible:conversation || (newsSwipeview.stacktype!="Notifications")||(newstab.newstabstatus!="Search")?true:false property string parentId: "" property bool textfocus: false //property var parentObject:({}) @@ -61,14 +61,12 @@ Rectangle{ property var group_allow:login.hasOwnProperty("permissions")?login.permissions[2]:[] property var group_deny:login.hasOwnProperty("permissions")?login.permissions[3]:[] - function directmessagePrepare(friend){ messageSend.state="active"; reply_to_user=friend.screen_name; receiverLabel.text=friend.screen_name; } - function sendUrls(urls){ if((urls.length==1 && attachImageURLs.length==0)){ attachImage(urls); @@ -87,15 +85,13 @@ Rectangle{ } } - - function attachImage(url){ imageAttachment.source=url.toString(); } function statusUpdate(title,status,in_reply_to_status_id,attachImageURL) { //xhr.url= login.server + "/api/statuses/update.json"; - newsBusy.running=true; + try{newsBusy.running=true;}catch(e){conversationBusy.running=true} xhr.setLogin(login.username+":"+Qt.atob(login.password)); xhr.setUrl(login.server); xhr.setApi("/api/statuses/update"); @@ -116,7 +112,7 @@ Rectangle{ }; xhr.post(); Newsjs.storeHashtags(login,db,status,root) - } + } function dmUpdate(title,text,replyto,screen_name,attachImageURL) { newsBusy.running=true; @@ -139,7 +135,7 @@ Rectangle{ reply_to_user=newsitemobject.user.screen_name; parentId=newsitemobject.id } else { - messageSend.state=""; + messageSend.state=null; reply_to_user=""; parentId=""; bodyField.text=""; @@ -152,6 +148,9 @@ Rectangle{ Newsjs.listFriends(login,db,function(contacts){ contactModel.clear(); for (var i=0;i1) onVisibleChanged: if ((visible==true)&&(conversation==true)){ @@ -211,21 +229,22 @@ Rectangle{ TextArea { id: bodyField property string contactprefix:"" + property string placeholder: osSettings.osType=="Linux"? qsTr(" Drop your Content here."):"" anchors.fill: parent - font.pixelSize: 3*mm + font.pointSize: osSettings.systemFontSize font.family: "Noto Sans" wrapMode: Text.Wrap selectByMouse: true - placeholderText: conversation?"": qsTr("What's on your mind?") + placeholderText: conversation?"": (qsTr("What's on your mind?")+placeholder) textFormat: TextEdit.RichText //TextEdit.PlainText onLineCountChanged: (conversation==true)?conversationView.contentY=conversationView.contentY+3*mm:newsView.contentY=newsView.contentY+3*mm onLinkActivated:{Qt.openUrlExternally(link)} - onActiveFocusChanged:{ + onActiveFocusChanged:{//print(placeholder) if (activeFocus==true){ if (conversation==true){ - setParent(conversationModel.get(0).newsitemobject); + if(parentId==""){setParent(conversationModel.get(0).newsitemobject);} messageSend.state="conversation"; - conversationView.contentY=conversationView.contentY+20*mm + try{conversationView.contentY=conversationView.contentY+20*mm}catch(e){} } else if (textfocus==false){ messageSend.state="active"; newsView.positionViewAtBeginning(); @@ -347,18 +366,18 @@ Rectangle{ height: 12*mm x: 0.5*mm MButton{id:permButton - visible: (newsSwipeview.stacktype!=="DirectMessages") - height: 6*mm - width: 7*mm + visible: !conversation && (newsSwipeview.stacktype!=="DirectMessages") + height: 2*root.fontFactor*osSettings.bigFontSize + width: 2*root.fontFactor*osSettings.bigFontSize text: ((contact_allow.length==0)&&(contact_deny.length==0)&&(group_allow.length==0)&&(group_deny.length==0))?"\uf09c":"\uf023" onClicked: { if (permissionDialog.visible==false){permissionDialog.visible=true} else{permissionDialog.visible=false}} } MButton { id: attachButton - height: 6*mm - width: 7*mm + height: 2*root.fontFactor*osSettings.bigFontSize + width: 2*root.fontFactor*osSettings.bigFontSize text: "\uf03e" - visible:(newsSwipeview.stacktype!="DirectMessages") + visible:!conversation?(newsSwipeview.stacktype!="DirectMessages"):true 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) @@ -376,23 +395,23 @@ Rectangle{ MButton{ id:smileyButton text: "\uf118" - height: 6*mm - width: 7*mm + height: 2*root.fontFactor*osSettings.bigFontSize + width: 2*root.fontFactor*osSettings.bigFontSize onClicked: {if (smileyDialog.visible==false){smileyDialog.visible=true} else{smileyDialog.visible=false}} } MButton{ id:hastagButton text: "\uf292" - height: 6*mm - width: 7*mm + height: 2*root.fontFactor*osSettings.bigFontSize + width: 2*root.fontFactor*osSettings.bigFontSize onClicked: {if (tagSelector.visible==false){hashtagmenu()} else{tagSelector.visible=false}} } MButton { id: cancelButton - height: 6*mm - width: 7*mm + height: 2*root.fontFactor*osSettings.bigFontSize + width: 2*root.fontFactor*osSettings.bigFontSize text: "\uf057" onClicked: { if (textfocus==true){messageSend.destroy()} @@ -409,21 +428,21 @@ Rectangle{ } MButton { id: sendButton - height: 6*mm - width: 7*mm + height: 2*root.fontFactor*osSettings.bigFontSize + width: 2*root.fontFactor*osSettings.bigFontSize text: "\uf1d9" onClicked: { var title=titleField.text.replace("\"","\'"); var body=bodyField.getFormattedText(0,bodyField.length); var dmbody=bodyField.getText(0,bodyField.length); - if (newsSwipeview.stacktype!=="DirectMessages"){ + if (conversation || newsSwipeview.stacktype!=="DirectMessages"){ statusUpdate(title,body,parentId,attachImageURLs)} else { if (reply_to_user!=""){dmUpdate(title,dmbody,parentId,reply_to_user)} else{Helperjs.showMessage(qsTr("Error"),qsTr("No receiver supplied!"),root)} } if (conversation==true){ - newstab.newstabstatus=root.globaloptions.newsViewType; newsStack.pop(null) + newstab.newstabstatus=root.globaloptions.newsViewType; rootstackView.pop(null) } } } @@ -432,7 +451,7 @@ Rectangle{ SmileyDialog{id:smileyDialog;x:mm;visible: false} } Component.onCompleted:{ - newsStack.replySignal.connect(setParent); + root.replySignal.connect(setParent); root.directmessageSignal.connect(directmessagePrepare); root.uploadSignal.connect(sendUrls); root.sendtextSignal.connect(sendtext); @@ -464,7 +483,7 @@ Rectangle{ target: buttonRow; visible:true } PropertyChanges { - target: titleField; visible:(newsSwipeview.stacktype!="DirectMessages") + target: titleField; visible:(!conversation&&newsSwipeview.stacktype!="DirectMessages") } }, @@ -482,6 +501,9 @@ Rectangle{ PropertyChanges { target: bodyField; placeholderText:"";focus:true } + PropertyChanges { + target: stackTypeDescription; visible:false + } } ] } diff --git a/source-linux/qml/newsqml/MoreComments.qml b/source-linux/qml/newsqml/MoreComments.qml index d7b8d86..9a7f03c 100644 --- a/source-linux/qml/newsqml/MoreComments.qml +++ b/source-linux/qml/newsqml/MoreComments.qml @@ -49,7 +49,6 @@ Rectangle{ width: contentWidth height: contentHeight font.family:fontAwesome.name - //font.pixelSize: 3*mm text: qsTr("Show all comments")+" (" +comments + ")" //"\uf0dc" } MouseArea{ diff --git a/source-linux/qml/newsqml/NewsImage.qml b/source-linux/qml/newsqml/NewsImage.qml index ebfe6f9..e754d57 100644 --- a/source-linux/qml/newsqml/NewsImage.qml +++ b/source-linux/qml/newsqml/NewsImage.qml @@ -32,19 +32,26 @@ import QtQuick 2.9 AnimatedImage {id:gif; width:toprow.width; - property string mimetype:"" + //property string mimetype:"" fillMode: Image.PreserveAspectFit; - onStatusChanged: playing = (status == AnimatedImage.Ready); - MouseArea {anchors.fill:parent; - onClicked:{ - if (mimetype!="image/gif"){ - var attachcomponent = Qt.createQmlObject('import QtQuick 2.0; '+ - 'Rectangle{id:recfullscreen;color:"white";width:root.width;height:root.height;'+ - 'MouseArea {anchors.fill:parent;onClicked:{recfullscreen.destroy()}}'+ - 'AnimatedImage {id:giffullscreen;source: "'+gif.source+ - '";anchors.centerIn:parent; width:root.width;height:root.height;fillMode: Image.PreserveAspectFit; onStatusChanged: playing = (status == AnimatedImage.Ready);'+ - '}}',root,"Attachmentlarge") - } + onStatusChanged: playing = (status == AnimatedImage.Ready) + Rectangle{ + visible: (model.newsitemobject.imageAttachmentList.length>1)&&(gif.status==Image.Ready) + opacity: 0.5 + color: "black" + width:imageCountText.contentWidth+mm + height: imageCountText.contentHeight+mm + x: (gif.width-gif.paintedWidth)/2+gif.paintedWidth-width + anchors.bottom: parent.bottom + Text { + anchors.centerIn: parent + id: imageCountText + text: "+ " + (model.newsitemobject.imageAttachmentList.length-1).toString() + color: "white" } } + MouseArea {anchors.fill:parent; + onClicked:{ + rootstackView.push("qrc:/qml/newsqml/NewsPhotolist.qml",{"photolistarray": model.newsitemobject.imageAttachmentList})} + } } diff --git a/source-linux/qml/newsqml/NewsPhotolist.qml b/source-linux/qml/newsqml/NewsPhotolist.qml new file mode 100644 index 0000000..62ca124 --- /dev/null +++ b/source-linux/qml/newsqml/NewsPhotolist.qml @@ -0,0 +1,134 @@ +// This file is part of Friendiqa +// https://git.friendi.ca/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + + +import QtQuick 2.9 +import QtQuick.Controls 2.12 +import "qrc:/qml/genericqml" + +Page{ + id:photolistview + width:root.width; + height:root.height//-7*mm + property var photolistarray: [] + + Rectangle{ + anchors.fill: newsphotolistView + color: "black" + } + ListView{ + id: newsphotolistView + anchors.fill: parent + orientation: Qt.Horizontal + highlightRangeMode: ListView.StrictlyEnforceRange; snapMode: ListView.SnapOneItem + model:photolistModel + delegate: photoWrapper + } + + ListModel{ + id: photolistModel + } + + MButton { + id: closeButton + z:2 + anchors.top: parent.top + anchors.topMargin: 1*mm + anchors.right: parent.right + anchors.rightMargin: 1*mm + text: "\uf057" + onClicked: {if (rootstackView.depth>1){ rootstackView.pop()} + } + } + Component { + id: photoWrapper + + AnimatedImage { + id: realImage; + width: photolistview.width; height: photolistview.height + antialiasing: true; + asynchronous: true + autoTransform:true + cache: false + fillMode: Image.PreserveAspectFit; + onStatusChanged: playing = (status == AnimatedImage.Ready); + source: url + BusyIndicator{ + running: realImage.status==Image.Loading + anchors.centerIn: parent + } + } + +// PinchArea { +// id:imagePinch +// pinch.target: realImage +// anchors.fill: realImage +// pinch.minimumScale: 0.1 +// pinch.maximumScale: 10 +// enabled: false +// } + } + + + BlueButton{ + width: 5*mm + height:photolistview.height + anchors.left: newsphotolistView.left + visible: newsphotolistView.currentIndex!=0 + text:"\uf053" + fontColor:"grey" + border.color: "transparent" + color:"transparent" + radius:0 + onClicked: {newsphotolistView.currentIndex=newsphotolistView.currentIndex-1} + } + + BlueButton{ + width: 5*mm + height:photolistview.height + anchors.right: newsphotolistView.right + visible: newsphotolistView.currentIndex!=photolistarray.length-1 + text:"\uf054" + fontColor:"grey" + border.color: "transparent" + color:"transparent" + radius:0 + onClicked: {newsphotolistView.currentIndex=newsphotolistView.currentIndex+1} + } + + Component.onCompleted: { + if (photolistarray.length>0){ + photolistarray.forEach(function(photo){ + photolistModel.append(photo) + }) + } + } +} diff --git a/source-linux/qml/newsqml/NewsStack.qml b/source-linux/qml/newsqml/NewsStack.qml index 12facca..fc3d4ad 100644 --- a/source-linux/qml/newsqml/NewsStack.qml +++ b/source-linux/qml/newsqml/NewsStack.qml @@ -35,292 +35,315 @@ import "qrc:/js/news.js" as Newsjs import "qrc:/js/helper.js" as Helperjs import "qrc:/js/service.js" as Service -StackView{ +Rectangle{ id: newsStack - anchors.fill: parent + //anchors.fill: parent + width: parent.width + height: parent.height property string updateMethodNews: "refresh" property var allchats: ({}) - signal replySignal(var newsobject) property int lastnewsid:0 + property string newstabstatus: "" - function newstypeHandling(newstype){ - newsBusy.running=true; - replySignal(""); - //messagesend.state=""; - newsModel.clear(); - switch(newstype){ - case "timeline": - newstab.newstabstatus="Timeline"; - try{ Newsjs.newsfromdb(root.db,root.login,0, function(dbnews,lastid){ - lastnewsid=lastid; - showNews(dbnews) - })}catch(e){Helperjs.showMessage("Error",e,root)}; - break; - case "conversation": - newstab.newstabstatus="Conversations"; - Newsjs.chatsfromdb(root.db,root.login,0,function(news,lastid){ - lastnewsid=lastid; - showNews(news)}); - break; - case "favorites": - newsStack.updateMethodNews="refresh"; - newstab.newstabstatus="Favorites"; - Service.updateView("Favorites"); - break; - case "replies": - newsStack.updateMethodNews="refresh"; - newstab.newstabstatus="Replies"; - Service.updateView("Replies"); - break; - case "publictimeline": - newsStack.updateMethodNews="refresh"; - newstab.newstabstatus="Public Timeline"; - Service.updateView("Public Timeline"); - break; - case "groupnews": - newsStack.updateMethodNews="refresh"; - Service.showGroups(); - break; - case "search": - newsView.anchors.topMargin=7*mm; - newsBusy.running=false; - var component = Qt.createComponent("qrc:/qml/genericqml/Search.qml"); - var searchItem = component.createObject(newsStack,{y:mm,width:root.width,height: 5*mm}); - break; - case "refresh": - if (newstab.newstabstatus=="Timeline"){ - newsStack.updateMethodNews="append" - } else {newsStack.updateMethodNews="refresh"} - //root.contactLoadType="news"; - if (newsSwipeview.stacktype=="Home"){ - Service.updateView(newstab.newstabstatus) - } - else if (newsSwipeview.stacktype=="DirectMessage"){ - Service.updateView("Direct Messages") - } - else if (newsSwipeview.stacktype=="Notifications"){ - Service.updateView("Notifications") - } - break; - default: - if (newstab.newstabstatus=="Timeline"){ - newsStack.updateMethodNews="append" - } else {newsStack.updateMethodNews="refresh"} - //root.contactLoadType="news"; - if (newsSwipeview.stacktype=="Home"){ - Service.updateView(newstab.newstabstatus) - } - else if (newsSwipeview.stacktype=="Directmessage"){ - Service.updateView("Direct Messages") - } - else if (newsSwipeview.stacktype=="Notifications"){ - Service.updateView("Notifications") - } - } - } + BusyIndicator{ + id: newsBusy + //visible: false + anchors.horizontalCenter: parent.horizontalCenter + anchors.top:parent.top + anchors.topMargin: 2*mm + width:10*mm + height: 10*mm + z:2 + running: false + } + + function newstypeHandling(newstype){ + newsBusy.running=true; + replySignal(""); + //messagesend.state=""; + newsModel.clear(); + switch(newstype){ + case "timeline": + newstab.newstabstatus="Timeline"; + try{ Newsjs.newsfromdb(root.db,root.login,0, function(dbnews,lastid){ + lastnewsid=lastid; + showNews(dbnews) + })}catch(e){Helperjs.showMessage("Error",e,root)}; + break; + case "conversation": + newstab.newstabstatus="Conversations"; + Newsjs.chatsfromdb(root.db,root.login,0,function(news,lastid){ + lastnewsid=lastid; + showNews(news)}); + break; + case "favorites": + newsStack.updateMethodNews="refresh"; + newstab.newstabstatus="Favorites"; + Service.updateView("Favorites"); + break; + case "replies": + newsStack.updateMethodNews="refresh"; + newstab.newstabstatus="Replies"; + Service.updateView("Replies"); + break; + case "publictimeline": + newsStack.updateMethodNews="refresh"; + newstab.newstabstatus="Public Timeline"; + Service.updateView("Public Timeline"); + break; + case "groupnews": + newsStack.updateMethodNews="refresh"; + newstab.newstabstatus="Groupnews"; + Service.showGroups(); + break; + case "search": + newsView.anchors.topMargin=7*mm; + newstab.newstabstatus="Search"; + newsBusy.running=false; + var leftoffset=osSettings.osType=="Android"?3*osSettings.bigFontSize:0 + var component = Qt.createComponent("qrc:/qml/genericqml/Search.qml"); + var searchItem = component.createObject(newsStack,{y:mm,x:leftoffset,width:root.width-leftoffset,height: 5*mm}); + break; + case "refresh": + if (newstab.newstabstatus=="Timeline"){ + newsStack.updateMethodNews="append" + } else {newsStack.updateMethodNews="refresh"} + //print("Refresh "+newsSwipeview.stacktype+newstab.newstabstatus) + if (newsSwipeview.stacktype=="Home"){ + Service.updateView(newstab.newstabstatus) + } + else if (newsSwipeview.stacktype=="DirectMessage"){ + Service.updateView("Direct Messages") + } + else if (newsSwipeview.stacktype=="Notifications"){ + Service.updateView("Notifications") + } + break; + default: + if (newstab.newstabstatus=="Timeline"){ + newsStack.updateMethodNews="append" + } else {newsStack.updateMethodNews="refresh"} + //root.contactLoadType="news"; + if (newsSwipeview.stacktype=="Home"){ + Service.updateView(newstab.newstabstatus) + } + else if (newsSwipeview.stacktype=="Directmessage"){ + Service.updateView("Direct Messages") + } + else if (newsSwipeview.stacktype=="Notifications"){ + Service.updateView("Notifications") + } + } + } - function showNews(newsToShow){ - try{if (newsStack.depth>1){newsStack.pop()}}catch(e){} - newsBusy.running=false; - var currentTime= new Date(); - // downloadNotice.text=downloadNotice.text + "\n shownews start "+ Date.now(); - //print("appendnews "+JSON.stringify(newsToShow)) - if (newsToShow.length==1){var method="refresh"}else{var method = newsStack.updateMethodNews} - var msg = {'currentTime': currentTime, 'model': newsModel,'news':newsToShow,'method':method, 'options':globaloptions}; - newsWorker.sendMessage(msg); - //newsStack.appendNews=false - } + function showNews(newsToShow){ + try{if (rootstackView.depth>1){rootstackView.pop()}}catch(e){} + newsBusy.running=false; + var currentTime= new Date(); + // downloadNotice.text=downloadNotice.text + "\n shownews start "+ Date.now(); + //print("appendnews "+JSON.stringify(newsToShow)) + if (newsToShow.length==1){var method="refresh"}else{var method = newsStack.updateMethodNews} + var msg = {'currentTime': currentTime, 'model': newsModel,'news':newsToShow,'method':method, 'options':globaloptions}; + newsWorker.sendMessage(msg); + //newsStack.appendNews=false + } - function showContact(contact){ //print(JSON.stringify(contact)); - //newstab.newstabstatus="Contact"; - newsStack.push("qrc:/qml/newsqml/ContactPage.qml",{"contact": contact}); - } - function search(term){//print("Search "+term) - if (term!=""){ - newstab.newstabstatus="Search"; - newsBusy.running=true; - newsStack.updateMethodNews="refresh"; - xhr.setLogin(login.username+":"+Qt.atob(login.password)); - xhr.setUrl(login.server); - xhr.setApi("/api/search"); - xhr.clearParams(); - xhr.setParam("q",term) - xhr.get();} - newsView.anchors.topMargin=mm - } - function getOldNews(){ + function search(term){//print("Search "+term) + if (term!=""){ + //newstab.newstabstatus="Search"; + newstabstatus="Search"; + newsBusy.running=true; + newsStack.updateMethodNews="refresh"; + xhr.setLogin(login.username+":"+Qt.atob(login.password)); + xhr.setUrl(login.server); + xhr.setApi("/api/search"); + xhr.clearParams(); + xhr.setParam("q",term) + xhr.get();} + newsView.anchors.topMargin=mm + } + + function getOldNews(){print("newstab.newstabstatus" +newstab.newstabstatus) var currentTime= new Date(); try{var lastnews_id=newsModel.get(newsModel.count-1).newsitemobject.created_at;} catch(e){var lastnews_id=99999999999999 } - var messagetype=0; - switch(newsSwipeview.stacktype){ - case "Home":messagetype=0;break; - case "DirectMessages": messagetype=1;break; - case "Notifications":messagetype=2;break; - case "Replies":messagetype=3;break; - default:messagetype=0; - } - if(newstab.newstabstatus=="Timeline"){//print("lastnewsid "+lastnews_id); + var messagetype=0; + switch(newsSwipeview.stacktype){ + case "Home":messagetype=0;break; + case "DirectMessages": messagetype=1;break; + case "Notifications":messagetype=2;break; + case "Replies":messagetype=3;break; + default:messagetype=0; + } + //if(newstab.newstabstatus=="Timeline"){//print("lastnewsid "+lastnews_id); + if(newstabstatus=="Timeline"){ Newsjs.newsfromdb(root.db,root.login, messagetype,function(news){ var msg = {'currentTime': currentTime, 'model': newsModel,'news':news,'method':"", 'options':globaloptions}; newsWorker.sendMessage(msg); },false,lastnews_id)} - else if(newstab.newstabstatus=="Conversations"){ + //else if(newstab.newstabstatus=="Conversations"){ + else if(newstabstatus=="Conversations"){ Newsjs.chatsfromdb(root.db,root.login, messagetype,function(news){ var msg = {'currentTime': currentTime, 'model': newsModel,'news':news,'method':"", 'options':globaloptions}; newsWorker.sendMessage(msg); },lastnews_id)} - else if (newstab.newstabstatus=="Notifications"){} + //else if (newstab.newstabstatus=="Notifications"){} + else if (newstabstatus=="Notifications"){} else{ + switch(newsSwipeview.stacktype){ + case "Home":messagetype=0;break; + case "DirectMessages": messagetype=1;break; + case "Notifications":messagetype=2;break; + case "Replies":messagetype=3;break; + default:messagetype=0; + } //newsStack.appendNews=true; try{xhr.setParam("max_id",newsModel.get(newsModel.count-1).newsitemobject.id-1);}catch(e){} xhr.get() } } Connections{ - target:xhr - function onError(data,url,api,code){ - if (data !="contactlist"){Helperjs.showMessage(qsTr("Network Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root);} - newsBusy.running=false; - } - function onSuccess(data,api){ - // downloadNotice.text=downloadNotice.text+ "\n xhr finished "+Date.now(); - Service.processNews(api,data) - replySignal("") - } - } - - Timer {id:replytimer; interval: 1000; running: false; repeat: false - onTriggered: {"replytimer triggered"; - newsBusy.running=true; - if(newstab.newstabstatus=="Conversation"){ - showConversation(newsStack.timelineIndex-1,newsModel.get(0).newsitemobject)} - else{ - if (newstab.newstabstatus=="Timeline"){ - newsStack.updateMethodNews="append" - } else {newsStack.updateMethodNews="refresh"} - if (newsSwipeview.stacktype=="Home"){ - Service.updateView(newstab.newstabstatus) - } - else if (newsSwipeview.stacktype=="DirectMessages"){ - Service.updateView("Direct Messages") - } - else if (newsSwipeview.stacktype=="Replies"){ - Service.updateView("Replies") - } - replySignal("") - //Service.updateView(newstab.newstabstatus) - } - } - } - - initialItem: Rectangle { - id:newslistRectangle - y:1 - color: "white" - //anchors.fill:parent - - Component { id:footerComponent - Rectangle{ - border.color: "#EEEEEE" - border.width: 1 - width:newsView.width - height:6*mm - Text{ - font.pixelSize: 1.5*mm - anchors.centerIn: parent - text:qsTr("More") - } - MouseArea{ - anchors.fill:parent - onClicked:{ - if (newsModel.count==0){ - if (newsSwipeview.stacktype=="Home"){ - Service.updateView(newstab.newstabstatus) - } - else if (newsSwipeview.stacktype=="DirectMessages"){ - Service.updateView("Direct Messages") - } - else if (newsSwipeview.stacktype=="Notifications"){ - Service.updateView("Notifications") - } - else if (newsSwipeview.stacktype=="Replies"){ - Service.updateView("Replies") - } - } - else {getOldNews();} - } - } - } + target:xhr + function onError(data,url,api,code){ + if (data !="contactlist"){Helperjs.showMessage(qsTr("Network Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root);} + newsBusy.running=false; } + function onSuccess(data,api){ + // downloadNotice.text=downloadNotice.text+ "\n xhr finished "+Date.now(); + Service.processNews(api,data) + replySignal("") + } + } - ListView { - id: newsView - property real oldContentY:0 - property bool viewdragged: false - property bool viewdraggedpositive: false - property string viewtype: "news" - anchors.fill: parent - anchors.margins: mm - clip: true - spacing: 0 - header: MessageSend{id:messagesend;onHeightChanged: newsView.positionViewAtBeginning()} - footer: footerComponent - model: newsModel - delegate: Newsitem{} - onDragStarted: oldContentY=contentY - onDragEnded: { - if(verticalOvershoot<-5*mm){ + Timer {id:replytimer; interval: 1000; running: false; repeat: false + onTriggered: {"replytimer triggered"; + newsBusy.running=true; + if(newstab.newstabstatus=="Conversation"){ + showConversation(newsStack.timelineIndex-1,newsModel.get(0).newsitemobject)} + else{ + if (newstab.newstabstatus=="Timeline"){ + newsStack.updateMethodNews="append" + } else {newsStack.updateMethodNews="refresh"} + if (newsSwipeview.stacktype=="Home"){ + Service.updateView(newstab.newstabstatus) + } + else if (newsSwipeview.stacktype=="DirectMessages"){ + Service.updateView("Direct Messages") + } + else if (newsSwipeview.stacktype=="Replies"){ + Service.updateView("Replies") + } + replySignal("") + //Service.updateView(newstab.newstabstatus) + } + } + } + + Component { id:footerComponent + Rectangle{ + border.color: "#EEEEEE" + border.width: 1 + width:newsView.width + height:6*mm + Text{ + font.pointSize: osSettings.systemFontSize + anchors.centerIn: parent + text:qsTr("More") + } + MouseArea{ + anchors.fill:parent + onClicked:{ + if (newsModel.count==0){ + if (newsSwipeview.stacktype=="Home"){ + Service.updateView(newstab.newstabstatus) + } + else if (newsSwipeview.stacktype=="DirectMessages"){ + Service.updateView("Direct Messages") + } + else if (newsSwipeview.stacktype=="Notifications"){ + Service.updateView("Notifications") + } + else if (newsSwipeview.stacktype=="Replies"){ + Service.updateView("Replies") + } + } + else {print("Footer newstab.newstabstatus "+newstab.newstabstatus);getOldNews();} + } + } + } + } + + ListView { + id: newsView + property real oldContentY:0 + property bool viewdragged: false + property bool viewdraggedpositive: false + property string viewtype: "news" + width: parent.width + height: parent.height-3*mm + //anchors.fill: parent + anchors.margins: 0.5*mm + clip: true + spacing: 0 + header: + MessageSend{id:messagesend;onHeightChanged: newsView.positionViewAtBeginning()} + + footer: footerComponent + model: newsModel + delegate: Newsitem{} + onDragStarted: oldContentY=contentY + onDragEnded: { + if(verticalOvershoot<-5*mm){ viewdragged=true - } - else if (verticalOvershoot>5*mm){ + } + else if (verticalOvershoot>5*mm){ viewdraggedpositive=true - } - else{ + } + else{ if((contentY-oldContentY)>15*mm){ - swipeIndicator.visible=false; - newsSwipeview.height=rootStackItem.height; - newsSwipeview.y=0; - rootStackItem.state="fullscreen" + //swipeIndicator.visible=false; + //newsSwipeview.height=rootstack.height; + //newsSwipeview.y=0; + //rootStackItem.state="fullscreen" } else if ((contentY-oldContentY)<-15*mm){ - swipeIndicator.visible=true; - newsSwipeview.height=rootStackItem.height-12*mm; - newsSwipeview.y=5*mm; - rootStackItem.state="" + //swipeIndicator.visible=true; + //newsSwipeview.height=rootstack.height-12*mm; + //newsSwipeview.y=5*mm; + //rootStackItem.state="" } - } - } - onViewdraggedChanged: { - if (viewdragged){ - var onlynew=true; - newsBusy.running=true; - viewdragged=false - if (newstab.newstabstatus=="Timeline"){ - newsStack.updateMethodNews="append" - } else {newsStack.updateMethodNews="refresh"} + } + } + onViewdraggedChanged: { + if (viewdragged){ + var onlynew=true; + newsBusy.running=true; + viewdragged=false + if (newstab.newstabstatus=="Timeline"){ + newsStack.updateMethodNews="append" + } else {newsStack.updateMethodNews="refresh"} //root.contactLoadType="news"; - if (newsSwipeview.stacktype=="Home"){ - Newsjs.getLastNews(root.login,root.db,function(currentlastnews){ - if (currentlastnews>lastnewsid){ - if(newstab.newstabstatus=="Timeline"){ - try{ Newsjs.newsfromdb(root.db,root.login,0, function(dbnews,lastid){ - lastnewsid=lastid; - showNews(dbnews) - })}catch(e){Helperjs.showMessage("Error",e,root)}; - } - if(newstab.newstabstatus=="Conversations"){ - Newsjs.chatsfromdb(db,root.login,0,function(news,lastid){ - lastnewsid=lastid; - showNews(news)}); - } - } else { - Service.updateView(newstab.newstabstatus) + if (newsSwipeview.stacktype=="Home"){ + Newsjs.getLastNews(root.login,root.db,function(currentlastnews){ + if (currentlastnews>lastnewsid){ + if(newstab.newstabstatus=="Timeline"){ + try{ Newsjs.newsfromdb(root.db,root.login,0, function(dbnews,lastid){ + lastnewsid=lastid; + showNews(dbnews) + })}catch(e){Helperjs.showMessage("Error",e,root)}; } - }); - } + if(newstab.newstabstatus=="Conversations"){ + Newsjs.chatsfromdb(db,root.login,0,function(news,lastid){ + lastnewsid=lastid; + showNews(news)}); + } + } else { + Service.updateView(newstab.newstabstatus) + } + }); + } else if (newsSwipeview.stacktype=="DirectMessages"){ Service.updateView("Direct Messages") } @@ -331,87 +354,82 @@ StackView{ Service.updateView("Replies") } - } - } - onViewdraggedpositiveChanged: { - if (viewdraggedpositive){ + } + } + onViewdraggedpositiveChanged: { + if (viewdraggedpositive){print("listview dragged newstab.newstabstatus "+newstab.newstabstatus) getOldNews(); viewdraggedpositive=false - } - } - } - - ListModel{id: newsModel} - - WorkerScript { - id: newsWorker - source: "qrc:/js/newsworker.js" - } - - BusyIndicator{ - id: newsBusy - anchors.horizontalCenter: parent.horizontalCenter - anchors.top:parent.top - anchors.topMargin: 2*mm - width:10*mm - height: 10*mm - running: false - } - Rectangle{ - id:downloadNotice - property alias text: noticeText.text - color:"white" - border.color:"grey" - z:1 - anchors.horizontalCenter: parent.horizontalCenter - anchors.bottom:parent.bottom - anchors.bottomMargin: 2*mm - width: noticeText.width+2*mm - height: noticeText.height+2*mm - visible: (downloadNotice.text!="") - - Text{ - id:noticeText - color: "grey" - anchors.centerIn: parent - width: contentWidth - height: contentHeight - font.pixelSize: 2*mm - text:"" - } - } - - Component.onCompleted: { - root.newstypeSignal.connect(newstypeHandling); - root.messageSignal.connect(onFriendsMessages); - root.contactdetailsSignal.connect(showContact); - root.newsSignal.connect(showNews); - - try{newsModel.clear()} catch(e){} - swipeIndicator.visible=true; - newsSwipeview.height=rootStackItem.height-12*mm; - newsSwipeview.y=5*mm; - rootStackItem.state="" - root.globaloptions.hasOwnProperty("newsViewType")?newstab.newstabstatus=root.globaloptions.newsViewType:newstab.newstabstatus="Conversations"; - var messagetype=0; - switch(newsSwipeview.stacktype){ - case "Home":messagetype=0;break; - case "DirectMessages": messagetype=1;break; - case "Notifications":messagetype=2;break; - case "Replies":messagetype=3;break; - default:messagetype=0; } - if((newstab.newstabstatus=="Conversations")&&(newsSwipeview.stacktype=="Home")){ - Newsjs.chatsfromdb(db,login,messagetype,function(dbnews,lastid){ - lastnewsid=lastid; - showNews(dbnews); - }) - } - else{ - Newsjs.newsfromdb(db,login,messagetype,function(dbnews,lastid){ - lastnewsid=lastid; - showNews(dbnews) - })} + } + ScrollBar.vertical: ScrollBar { } + } + + ListModel{id: newsModel} + + WorkerScript { + id: newsWorker + source: "qrc:/js/newsworker.js" + } + + + Rectangle{ + id:downloadNotice + property alias text: noticeText.text + color:"white" + border.color:"grey" + z:1 + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom:parent.bottom + anchors.bottomMargin: 2*mm + width: noticeText.width+2*mm + height: noticeText.height+2*mm + visible: (downloadNotice.text!="") + + Text{ + id:noticeText + color: "grey" + anchors.centerIn: parent + width: contentWidth + height: contentHeight + font.pointSize: osSettings.systemFontSize + text:"" } } + + Component.onCompleted: { + root.newstypeSignal.connect(newstypeHandling); + root.contactdetailsSignal.connect(showContact); + root.newsSignal.connect(showNews); + root.searchSignal.connect(search); + try{newsModel.clear()} catch(e){} + swipeIndicator.visible=true; + //newsSwipeview.height=rootstack.height//-12*mm; + //newsSwipeview.y=5*mm; + //rootStackItem.state="" + root.globaloptions.hasOwnProperty("newsViewType")?newstab.newstabstatus=root.globaloptions.newsViewType:newstab.newstabstatus="Conversations"; + newstabstatus=newstab.newstabstatus; + var messagetype=0; + switch(newsSwipeview.stacktype){ + case "Home":messagetype=0;break; + case "DirectMessages": messagetype=1;break; + case "Notifications":messagetype=2;break; + case "Replies":messagetype=3;break; + default:messagetype=0; + } + + //if((newstab.newstabstatus=="Conversations")&&(newsSwipeview.stacktype=="Home")){ + if((newstabstatus=="Conversations")&&(newsSwipeview.stacktype=="Home")){ + Newsjs.chatsfromdb(db,login,messagetype,function(dbnews,lastid){ + lastnewsid=lastid; + showNews(dbnews); + }) + } + else{ + Newsjs.newsfromdb(db,login,messagetype,function(dbnews,lastid){ + lastnewsid=lastid; + showNews(dbnews) + })} + } + //} } diff --git a/source-linux/qml/newsqml/NewsTab.qml b/source-linux/qml/newsqml/NewsTab.qml index ec7c8fa..f7b4cb6 100644 --- a/source-linux/qml/newsqml/NewsTab.qml +++ b/source-linux/qml/newsqml/NewsTab.qml @@ -31,20 +31,23 @@ import QtQuick 2.11 import QtQuick.Controls 2.12 -//import QtQuick.Controls.Styles 2.3 -//import QtQuick.Dialogs 1.3 import "qrc:/qml/newsqml" +import "qrc:/qml/genericqml" import "qrc:/js/news.js" as Newsjs import "qrc:/js/helper.js" as Helperjs import "qrc:/js/service.js" as Service -Item { +Rectangle{ + id:newstabitem + width:rootstack.width//-5*mm + height: rootstack.height-8*mm//rootstack.height-100*mm - onHeightChanged: {newsSwipeview.height=height-6*mm} + //anchors.fill: parent + //onHeightChanged: {newsSwipeview.height=height-5*mm} Timer {id:contacttimer; interval: 50; running: false; repeat: false onTriggered: { - // downloadNotice.text=downloadNotice.text + "\n contactTimer start "+ Date.now() root.newContacts=Newsjs.findNewContacts(root.news,root.contactlist); + root.onNewContactsChanged(root.newContacts); Newsjs.storeNews(login,db,root.news,root) } } @@ -56,6 +59,7 @@ Item { xhr.setUrl(login.server); xhr.setApi("/api/conversation/show"); xhr.setParam("id",newsitemobject.id) + xhr.setParam("count","200") xhr.get(); } else{ @@ -113,51 +117,101 @@ Item { } - function onFriendsMessages(friend){ - newstab.newstabstatus="Contact" - Newsjs.newsfromdb(db,root.login.username, 0,function(dbnews){ - if (dbnews.length==0){ - Newsjs.newsfromdb(db,login.username,0,function(forumnews){ - showNews(forumnews) - },friend.url) - } - else showNews(dbnews) - },friend.id) + +// CalendarTab{ +// visible: wideScreen&&rootstackView.depth<2 +// width: newstabitem.width/3 +// x: newsSwipeview.width +// //anchors.left: newsSwipeview.right +// //anchors.fill: null +// } +// Rectangle{ +// color: "#F8F8F8" +// height: parent.height +// width: 0.5*mm +// anchors.left: newsSwipeview.right +// } + BlueButton{ + x:mm + y:mm + z:2 + visible: !wideScreen + fontColor: "grey" + border.color: "transparent" + text: "\uf0c9" + font.pointSize: osSettings.bigFontSize + onClicked:{ + leftDrawerAndroid.visible?leftDrawerAndroid.close():leftDrawerAndroid.open()} } - Label{ - text:"\uf0c9 " - font.pixelSize: 5* mm - anchors.left: parent.left - anchors.margins: mm - color: "#B0BEC5" - MouseArea{ - anchors.fill: parent - onClicked:{ - leftDrawer.open() - } - } + LeftDrawerLinux{ + id:leftDrawer + property var newstabstatus: newstab.newstabstatus + visible: wideScreen&&rootstackView.depth<2 + width: visible?root.fontFactor*osSettings.systemFontSize*15:0 + height: root.height-bar.height } - Label{ - text:qsTr(newsSwipeview.stacktype) - font.pixelSize: 3* mm - anchors.horizontalCenter: parent.horizontalCenter - anchors.margins: 2*mm + + LeftDrawerAndroid{ + id: leftDrawerAndroid } +// BlueButton{ +// z:2 +// anchors.left: newsSwipeview.left +// anchors.verticalCenter: newsSwipeview.verticalCenter//anchors.bottom: newsSwipeview.bottom +// anchors.margins: mm +// visible: wideScreen && newsSwipeview.currentIndex!=0 +// text:"\uf053" +// fontColor:"grey" +// border.color: "transparent" +// color:"transparent" +// radius:0 +// onClicked: {newsSwipeview.currentIndex=newsSwipeview.currentIndex-1} +// } + +// BlueButton{ +// z:2 +// anchors.right: newsSwipeview.right +// anchors.verticalCenter: newsSwipeview.verticalCenter//anchors.bottom: newsSwipeview.bottom +// anchors.margins: mm +// visible: wideScreen && newsSwipeview.currentIndex!=3 +// text:"\uf054" +// fontColor:"grey" +// border.color: "transparent" +// color:"transparent" +// radius:0 +// onClicked: {newsSwipeview.currentIndex=newsSwipeview.currentIndex+1} +// } + SwipeView{ id: newsSwipeview property string stacktype:"Home" currentIndex: 0 - width: parent.width - height: parent.height-6*mm - y: 5*mm + width: wideScreen&&rootstackView.depth<2?newstabitem.width-leftDrawer.width-mm:newstabitem.width-mm//newstabitem.width/3*2:newstabitem.width + height: newstabitem.height-4*mm + x: leftDrawer.width function onDirectMessage(friend){currentIndex=2} - transitions: Transition { - PropertyAnimation { properties: "height"; - easing.type: Easing.InOutQuad - duration: 1000 - } - } +// transitions: Transition { +// PropertyAnimation { properties: "height"; +// easing.type: Easing.InOutQuad +// duration: 1000 +// } +// } + + +// Label{ +// text:"\uf0c9 " +// font.pixelSize: 5* mm +// anchors.left: parent.left +// anchors.margins: mm +// color: "#B0BEC5" +// MouseArea{ +// anchors.fill: parent +// onClicked:{ +// leftDrawer.open() +// } +// } +// } onCurrentIndexChanged: { switch(currentIndex){ @@ -168,6 +222,7 @@ Item { default: stacktype="Home"; } } + //anchors.fill: parent Loader{ id: friendstimeline @@ -192,16 +247,17 @@ Item { source:(newsSwipeview.currentIndex==3)? "qrc:/qml/newsqml/NewsStack.qml":"" //onLoaded: newsSwipeview.stacktype="Notifications" } - Component.onCompleted: {root.directmessageSignal.connect(onDirectMessage)} } - PageIndicator { id: swipeIndicator + z:5 + height: root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize count: newsSwipeview.count currentIndex: newsSwipeview.currentIndex - anchors.bottom: newsSwipeview.bottom anchors.horizontalCenter: parent.horizontalCenter } + Component.onCompleted: {root.directmessageSignal.connect(newsSwipeview.onDirectMessage)} } diff --git a/source-linux/qml/newsqml/NewsVideo.qml b/source-linux/qml/newsqml/NewsVideo.qml index cffd63c..2e7d899 100644 --- a/source-linux/qml/newsqml/NewsVideo.qml +++ b/source-linux/qml/newsqml/NewsVideo.qml @@ -50,9 +50,9 @@ Rectangle{ MouseArea {anchors.fill:parent; onClicked:{ if(attachment.mimetype=="video/youtube"){ - root.push("qrc:/qml/newsqml/NewsYplayer.qml",{"ytcode":attachment.url,"mimetype":attachment.mimetype}); + rootstackView.push("qrc:/qml/newsqml/NewsYplayer.qml",{"ytcode":attachment.url,"mimetype":attachment.mimetype}); } else { - root.push("qrc:/qml/newsqml/NewsVideoLarge.qml",{"source": attachment.url,"mimetype": attachment.mimetype}); + rootstackView.push("qrc:/qml/newsqml/NewsVideoLarge.qml",{"source": attachment.url,"mimetype": attachment.mimetype}); } } } diff --git a/source-linux/qml/newsqml/NewsVideoLarge.qml b/source-linux/qml/newsqml/NewsVideoLarge.qml index a78e5a0..e6cdda6 100644 --- a/source-linux/qml/newsqml/NewsVideoLarge.qml +++ b/source-linux/qml/newsqml/NewsVideoLarge.qml @@ -33,12 +33,13 @@ import QtMultimedia 5.8 import QtQuick 2.9 import QtQuick.Controls 2.12 -Rectangle{ + +Page{ id:newsvideofullscreen - color:"black" + //color:"black" //border.color: "light grey" width:root.width; - height:root.height + height:root.height-3*root.fontFactor*osSettings.bigFontSize property alias source:video.source Text{ id:noticeText @@ -46,7 +47,7 @@ Rectangle{ color:"light grey" width:parent.width/2 wrapMode: Text.Wrap - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize x:parent.width/2-parent.height/4 y:parent.height/5 visible: video.playbackState!=MediaPlayer.PlayingState @@ -55,7 +56,7 @@ Rectangle{ Video {id:video; anchors.fill:parent property string mimetype:"" - onErrorChanged:{noticeText.font.pixelSize=3*mm;noticeText.text=errorString;} + onErrorChanged:{noticeText.font.pointSize=osSettings.bigFontSize;noticeText.text=errorString;} fillMode: Image.PreserveAspectFit; autoLoad: true autoPlay: true @@ -63,7 +64,7 @@ Rectangle{ MouseArea { anchors.fill:parent; onClicked:{ - root.pop() + rootstackView.pop() } } } @@ -76,6 +77,7 @@ Rectangle{ z:2 visible:video.playbackState!=MediaPlayer.StoppedState value: video.position/video.duration + MouseArea { anchors.fill:parent; onClicked:{ diff --git a/source-linux/qml/newsqml/NewsYplayer.qml b/source-linux/qml/newsqml/NewsYplayer.qml index 2657862..fff2b1f 100644 --- a/source-linux/qml/newsqml/NewsYplayer.qml +++ b/source-linux/qml/newsqml/NewsYplayer.qml @@ -32,14 +32,16 @@ // along with this program. If not, see . import QtQuick 2.8 +import QtQuick.Controls 2.12 import "qrc:/js/helper.js" as Helperjs import QtWebView 1.1 -Rectangle{ + +Page { id:newsYplayer - color:"black" + //color:"black" width:root.width; - height:root.height + height:root.height-7*mm property string url:"" property string ytcode:"" diff --git a/source-linux/qml/newsqml/Newsitem.qml b/source-linux/qml/newsqml/Newsitem.qml index f56b520..3ae3431 100644 --- a/source-linux/qml/newsqml/Newsitem.qml +++ b/source-linux/qml/newsqml/Newsitem.qml @@ -37,7 +37,7 @@ import "qrc:/qml/genericqml" Item { id: newsitem - width: newsView.width //parent.width + width: newsitemobject.hasOwnProperty("indent")&&newsitemobject.indent>0?parent.width:newsitem.ListView.view.width//parent.width//newsView.width // height:toprow.height+friendicaActivities.height+controlrow.height+conversationColumn.height+1//Math.max((itemMessage.height+topFlow.height+friendicaActivities.height+4*mm),profileImage.height+user_name.height+mm) property int itemindex: index property var newsitemobject:model.newsitemobject @@ -45,7 +45,7 @@ Item { property var friendica_activities_view: getActivitiesView(model.newsitemobject) onAttendingChanged: {attendLabel.visible=true; - attendLabel.text= qsTr("attending")+": "+ qsTr(attending)} + attendLabel.text= qsTr("attending")+": "+ qsTr(attending)} signal replyto(string parent_id) @@ -54,425 +54,416 @@ Item { var imagedialog = component.createObject(friendicaActivities,{"activitymembers": contacts}); } - - function pushConversation(){ if (model.newsitemobject.hasOwnProperty("currentconversation")){ - newsStack.push("qrc:/qml/newsqml/Conversation.qml",{"news": model.newsitemobject.currentconversation})} - else{newsStack.push("qrc:/qml/newsqml/Conversation.qml")}; + rootstackView.push("qrc:/qml/newsqml/Conversation.qml",{"news": model.newsitemobject.currentconversation})} + //newsStack.push("qrc:/qml/newsqml/Conversation.qml",{"news": model.newsitemobject.currentconversation})} + //else{newsStack.push("qrc:/qml/newsqml/Conversation.qml")}; + else{rootstackView.push("qrc:/qml/newsqml/Conversation.qml")}; showConversation(index,newsitemobject) } - Rectangle{width:newsitem.width; height: 1; anchors.bottom: newsitem.bottom; color:"light grey"} Rectangle{ - width:newsitem.width - height:newsitem.height-1 - color: "white"//(newsitemobject.messagetype==1)?"#ffe6e6" : "white" + width:newsitem.width + height:newsitem.height-1 + color: "white" - Column { - id:toprow //newscolumn - width: newsitemobject.hasOwnProperty("indent")?newsitem.width-(newsitem.width/20 *(newsitemobject.indent+1)):newsitem.width//-8*mm - x:newsitemobject.hasOwnProperty("indent")?newsitem.width/20*(newsitemobject.indent):0 - Item{ - height: Math.max(profileImage.height+mm,topFlow.implicitHeight+mm) - width: parent.width - MouseArea{ - anchors.fill: parent - onClicked:{ - showContact(newsitemobject.user)} - } - Image { - id:profileImage - source: ((newsitemobject.user.profile_image!="") && (typeof(newsitemobject.user.profile_image)=="string"))? "file://"+newsitemobject.user.profile_image : newsitemobject.user.profile_image_url - x:1 - y:1 - width: 7*mm - height: 7*mm - //radius:mm - onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} - } - Flow{ - id:topFlow - spacing: mm - width:parent.width-8*mm - anchors.left: profileImage.right - anchors.margins: mm - Label { - id:user_name - //color: "grey" - width:parent.width - font.bold: true - font.pixelSize: 2.5*mm - wrapMode: Text.WrapAtWordBoundaryOrAnywhere - text: newsitemobject.user.name+" (@"+newsitemobject.user.screen_name+")"+newsitemobject.forumname + Column { + id:toprow //newscolumn + width: newsitemobject.hasOwnProperty("indent")?newsitem.width-(newsitem.width/20 *(newsitemobject.indent+1)):newsitem.width//-8*mm + x:newsitemobject.hasOwnProperty("indent")?newsitem.width/20*(newsitemobject.indent):0 + height: newsitemobject.nsfw?5*mm:Math.min(itemHeader.height+itemBody.height,3/4*root.height) + clip: true + Item{id:itemHeader + height: Math.max(profileImage.height+mm,topFlow.implicitHeight+mm) + width: parent.width + MouseArea{ + anchors.fill: parent + onClicked:{ + showContact(newsitemobject.user)} } + Image { + id:profileImage + source: ((newsitemobject.user.profile_image!="") && (typeof(newsitemobject.user.profile_image)=="string"))? "file://"+newsitemobject.user.profile_image : newsitemobject.user.profile_image_url + x:1 + y:1 + width: 2*root.fontFactor*osSettings.bigFontSize + height: 2*root.fontFactor*osSettings.bigFontSize + //radius:mm + onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} + } + Flow{ + id:topFlow + spacing: 0.5*mm + width:parent.width-8*mm + anchors.left: profileImage.right + anchors.margins: mm + Label { + id:user_name + //color: "grey" + width:parent.width + font.bold: true + font.pointSize: osSettings.systemFontSize + wrapMode: Text.WrapAtWordBoundaryOrAnywhere + text: newsitemobject.user.name+" (@"+newsitemobject.user.screen_name+")"+newsitemobject.forumname + } - Label { - id:messageTypeLabel - color: "grey" - text: if (newsitemobject.messagetype==1){ qsTr("Direct Message")} else if(newsitemobject.messagetype==2) {" Notification"} else {qsTr("Source: ")+newsitemobject.source} - font.pixelSize: 1.5*mm - } - Label { - id:createdAtLabel - color: "grey" - font.pixelSize: 1.5*mm - horizontalAlignment: Label.AlignRight - text: getDateDiffString(newsitemobject.dateDiff) + " " +qsTr("ago") - } - Label { - id:replytoLabel - color: "grey" - font.pixelSize: 1.5*mm - font.family: "Noto Sans" - horizontalAlignment: Label.AlignRight - text: try {qsTr("In reply to ")+newsitemobject.reply_user.screen_name - }catch(e){" "} + Label { + id:messageTypeLabel + color: "grey" + text: if (newsitemobject.messagetype==1){ qsTr("Direct Message")} else if(newsitemobject.messagetype==2) {" Notification"} else {qsTr("Source: ")+newsitemobject.source} + font.pointSize: 0.6*osSettings.systemFontSize + } + Label { + id:createdAtLabel + color: "grey" + font.pointSize: 0.6*osSettings.systemFontSize + horizontalAlignment: Label.AlignRight + text: " \u00B7 "+getDateDiffString(newsitemobject.dateDiff) + " " +qsTr("ago") + } + Label { + id:replytoLabel + color: "grey" + font.pointSize: 0.6*osSettings.systemFontSize + font.family: "Noto Sans" + horizontalAlignment: Label.AlignRight + text: try {" \u00B7 "+qsTr("In reply to ")+newsitemobject.reply_user.screen_name + }catch(e){" "} + } } + //Component.onCompleted:print("Newsitemwidth "+newsitem.width+ " Indent "+newsitemobject.indent) } - } - MouseArea{ - width: toprow.width-2 - height: itemMessage.height - onPressAndHold: { - pushConversation(); - } - Text { - color: "#404040" - linkColor: "light green" - id: itemMessage - textFormat: Text.RichText - font.family: "Noto Sans" - text: newsitemobject.statusnet_html//newsitemobject.attachmentList.length>0?newsitemobject.text : newsitemobject.statusnet_html + MouseArea{id: itemBody width: toprow.width-2 - height:newsitemobject.nsfw?5*mm:Math.min(implicitHeight,3/4*root.height) - //height: implicitHeight - wrapMode: Text.Wrap - clip:true - onLinkActivated:{ - Qt.openUrlExternally(link)} - Component.onCompleted:{ - if (newsitemobject.messagetype==0){ - var hashtags=[]; - hashtags=Newsjs.findTags(newsitemobject.text); - var component = Qt.createComponent("qrc:/qml/newsqml/Hashtag.qml"); - for (var tags in hashtags){ - var hashtagQml = component.createObject(friendicaActivities,{"text":hashtags[tags].trim()}); - }} - - if (newsitemobject.attachmentList.length>0){ - for(var attachments in newsitemobject.attachmentList){// (newsitemobject.attachmentList[attachments].url); - if(newsitemobject.attachmentList[attachments].mimetype.substring(0,5)=="image"){ - var component = Qt.createComponent("qrc:/qml/newsqml/NewsImage.qml"); - var imageQml = component.createObject(toprow,{"source":newsitemobject.attachmentList[attachments].url,"mimetype":newsitemobject.attachmentList[attachments].mimetype}); - } - else if(newsitemobject.attachmentList[attachments].mimetype=="text/html"){ - var component = Qt.createComponent("qrc:/qml/newsqml/NewsLink.qml"); - var linkQml = component.createObject(toprow,{"url":newsitemobject.attachmentList[attachments].url}); - } - else { - var component = Qt.createComponent("qrc:/qml/newsqml/NewsVideo.qml"); - //var videoQml = component.createObject(messageColumn,{"source":newsitemobject.attachmentList[attachments].url,"mimetype":newsitemobject.attachmentList[attachments].mimetype}); - var videoQml = component.createObject(toprow,{"attachment":newsitemobject.attachmentList[attachments]}); + height: itemMessage.height + onPressAndHold: {pushConversation()} + Text { + color: "#404040" + linkColor: "light green" + id: itemMessage + textFormat: Text.RichText + font.family: "Noto Sans" + font.pointSize: osSettings.systemFontSize + text: newsitemobject.statusnet_html + width: toprow.width-2 + //height:newsitemobject.nsfw?5*mm:Math.min(implicitHeight,3/4*root.height) + height: implicitHeight + wrapMode: Text.Wrap + clip:true + onLinkActivated:{Qt.openUrlExternally(link)} + Component.onCompleted:{ + if (newsitemobject.messagetype==0){ + var hashtags=[]; + hashtags=Newsjs.findTags(newsitemobject.text); + var component = Qt.createComponent("qrc:/qml/newsqml/Hashtag.qml"); + for (var tags in hashtags){ + var hashtagQml = component.createObject(friendicaActivities,{"text":hashtags[tags].trim()}); } } - } - if (newsitemobject.hasOwnProperty("lastcomment")){ - var moreComponent = Qt.createComponent("qrc:/qml/newsqml/MoreComments.qml"); - var conversationQml = moreComponent.createObject(conversationColumn,{"comments":newsitemobject.newscount-1}); + if (newsitemobject.imageAttachmentList.length>0){ + if(newsitemobject.imageAttachmentList[0].mimetype.substring(0,5)=="image"){ + var component = Qt.createComponent("qrc:/qml/newsqml/NewsImage.qml"); + var imageQml = component.createObject(toprow,{"source":newsitemobject.imageAttachmentList[0].url}); + } + } - var commentComponent = Qt.createComponent("qrc:/qml/newsqml/Newsitem.qml"); - var conversationQml = commentComponent.createObject(conversationColumn,{"newsitemobject":newsitemobject.lastcomment}); + if (newsitemobject.videoAttachmentList.length>0){ + var component = Qt.createComponent("qrc:/qml/newsqml/NewsVideo.qml"); + //var videoQml = component.createObject(messageColumn,{"source":newsitemobject.attachmentList[attachments].url,"mimetype":newsitemobject.attachmentList[attachments].mimetype}); + var videoQml = component.createObject(toprow,{"attachment":newsitemobject.videoAttachmentList[0]}); + } + + if (newsitemobject.hasOwnProperty("lastcomment")){ + var moreComponent = Qt.createComponent("qrc:/qml/newsqml/MoreComments.qml"); + var conversationQml = moreComponent.createObject(conversationColumn,{"comments":newsitemobject.newscount-1}); + + var commentComponent = Qt.createComponent("qrc:/qml/newsqml/Newsitem.qml"); + var conversationQml = commentComponent.createObject(conversationColumn,{"newsitemobject":newsitemobject.lastcomment}); + } } - } - }} + }} + + } + BlueButton{ - width: newsitem.width-8*mm-2 + width: newsitem.width-2 height:5*mm - //anchors.bottom: messageColumn.bottom//itemMessage.bottom - visible: itemMessage.implicitHeight>3/4*root.height || newsitemobject.nsfw//messageColumn.implicitHeight>3/4*root.height || newsitemobject.nsfw//itemMessage.implicitHeight>3/4*root.height + anchors.bottom: toprow.bottom//itemMessage.bottom + visible: toprow.implicitHeight>3/4*root.height || newsitemobject.nsfw//messageColumn.implicitHeight>3/4*root.height || newsitemobject.nsfw//itemMessage.implicitHeight>3/4*root.height text:"\uf078" fontColor:"grey" border.color: "transparent" color:"white" -// gradient: Gradient { -// GradientStop { position: 0.0; color: "transparent" } -// GradientStop { position: 0.5; color: "white" } -// } + // gradient: Gradient { + // GradientStop { position: 0.0; color: "transparent" } + // GradientStop { position: 0.5; color: "white" } + // } radius:0 onClicked: { if (text=="\uf078"){ - itemMessage.height=itemMessage.implicitHeight+10*mm;text="\uf077" + toprow.height=toprow.implicitHeight+6*mm;text="\uf077" } else { - itemMessage.height=Math.min(itemMessage.implicitHeight,3/4*root.height); + toprow.height=Math.min(toprow.implicitHeight,3/4*root.height); text="\uf078"; newsView.positionViewAtIndex(index,ListView.Beginning); } } } - } - // Bottom row for activities - Flow{ - id:friendicaActivities - anchors.top:toprow.bottom - width:parent.width - spacing:mm + // Bottom row for activities + Flow{ + id:friendicaActivities + anchors.top:toprow.bottom + width:parent.width + spacing:mm - Label{color: "grey" - height:3.5*mm - font.pixelSize: 1.5*mm - text: friendica_activities_view.likeText - MouseArea{ - anchors.fill: parent - onClicked: { showActivityContacts(newsitemobject.friendica_activities.like)} - } - } - Label{color: "grey" - height:3.5*mm - font.pixelSize: 1.5*mm - text: friendica_activities_view.dislikeText - MouseArea{ - anchors.fill: parent - onClicked: { showActivityContacts(newsitemobject.friendica_activities.dislike)} - } - } - Label{color: "grey" - height:3.5*mm - font.pixelSize: 1.5*mm - text: friendica_activities_view.attendyesText - MouseArea{ - anchors.fill: parent - onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendyes)} - }} - Label{color: "grey" - height:3.5*mm - font.pixelSize: 1.5*mm - text: friendica_activities_view.attendnoText - MouseArea{ - anchors.fill: parent - onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendno)} - } - } - Label{color: "grey" - height:3.5*mm - font.pixelSize: 1.5*mm - text: friendica_activities_view.attendmaybeText - MouseArea{ - anchors.fill: parent - onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendmaybe)} - } - } - Label{ - id:attendLabel - color: "grey" - height:3.5*mm - font.pixelSize: 1.5*mm - horizontalAlignment: Label.AlignRight - text: (newsitemobject.friendica_activities_view.self.attending)?(qsTr("Attending: ")+ qsTr(newsitemobject.friendica_activities_view.self.attending)):"" - } - } - - //Bottom row for buttons - Row{id:controlrow - anchors.top:friendicaActivities.bottom - height: 4*mm - CheckBox{ - id:likeCheckbox - width:newsitem.width/5 //10*mm - height: parent.height - visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false - checked:(model.newsitemobject.friendica_activities_view.self.liked==1)?true:false - indicator: Rectangle{ - implicitWidth: newsitem.width/5 //10*mm - implicitHeight:4*mm - Text{ - anchors.centerIn: parent - font.pixelSize: 3*mm - font.family:fontAwesome.name - color:likeCheckbox.checked?"black": "grey" - text:likeCheckbox.checked?"\uf118"+"!":"\uf118" + Label{color: "grey" + height:3.5*mm + font.pointSize: 0.75*osSettings.systemFontSize + text: friendica_activities_view.likeText + MouseArea{ + anchors.fill: parent + onClicked: { showActivityContacts(newsitemobject.friendica_activities.like)} } } - onClicked: { - if(likeCheckbox.checked==true){Newsjs.like(root.login,root.db,1,"like",newsitemobject.id,root);dislikeCheckbox.checked=false; - newsitemobject.friendica_activities_view.self.liked=1; - newsitem.ListView.view.model.set(index,{"newsitemobject":newsitemobject}); + Label{color: "grey" + height:3.5*mm + font.pointSize: 0.75*osSettings.systemFontSize + text: friendica_activities_view.dislikeText + MouseArea{ + anchors.fill: parent + onClicked: { showActivityContacts(newsitemobject.friendica_activities.dislike)} } - else{Newsjs.like(root.login,root.db,0,"like",newsitemobject.id,root); - newsitemobject.friendica_activities_view.self.liked=0; - newsitem.ListView.view.model.set(index,{"newsitemobject":newsitemobject}); - }} + } + Label{color: "grey" + height:3.5*mm + font.pointSize: 0.75*osSettings.systemFontSize + text: friendica_activities_view.attendyesText + MouseArea{ + anchors.fill: parent + onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendyes)} + }} + Label{color: "grey" + height:3.5*mm + font.pointSize: 0.75*osSettings.systemFontSize + text: friendica_activities_view.attendnoText + MouseArea{ + anchors.fill: parent + onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendno)} + } + } + Label{color: "grey" + height:3.5*mm + font.pointSize: 0.75*osSettings.systemFontSize + text: friendica_activities_view.attendmaybeText + MouseArea{ + anchors.fill: parent + onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendmaybe)} + } + } + Label{ + id:attendLabel + color: "grey" + height:3.5*mm + font.pointSize: 0.75*osSettings.systemFontSize + horizontalAlignment: Label.AlignRight + text: (newsitemobject.friendica_activities_view.self.attending)?(qsTr("Attending: ")+ qsTr(newsitemobject.friendica_activities_view.self.attending)):"" + } } - CheckBox{ - id: dislikeCheckbox - width:newsitem.width/5 //10*mm - height: parent.height - visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false - checked: (newsitemobject.friendica_activities_view.self.disliked==1)?true:false - indicator: Rectangle{ - implicitWidth: newsitem.width/5 //10*mm - implicitHeight:4*mm - Text{ - anchors.centerIn: parent - font.pixelSize: 3*mm - font.family:fontAwesome.name - color:dislikeCheckbox.checked?"black": "grey" - text: dislikeCheckbox.checked?"\uf119"+"!":"\uf119" + + //Bottom row for buttons + Row{id:controlrow + anchors.top:friendicaActivities.bottom + height: root.fontFactor*osSettings.bigFontSize + CheckBox{ + id:likeCheckbox + width:newsitem.width/5 //10*mm + height: parent.height + visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false + checked:(model.newsitemobject.friendica_activities_view.self.liked==1)?true:false + indicator: Rectangle{ + implicitWidth: newsitem.width/5 //10*mm + implicitHeight:root.fontFactor*osSettings.bigFontSize + Text{ + anchors.centerIn: parent + font.pointSize: osSettings.systemFontSize + font.family:fontAwesome.name + color:likeCheckbox.checked?"black": "grey" + text:likeCheckbox.checked?"\uf118"+"!":"\uf118" } } - onClicked: { - if (dislikeCheckbox.checked==true){Newsjs.like(root.login,root.db,1,"dislike",newsitemobject.id,root);likeCheckbox.checked=false; - newsitemobject.friendica_activities_view.self.disliked=1; - newsitem.ListView.view.model.set(index,{"newsitemobject":newsitemobject}); + onClicked: { + if(likeCheckbox.checked==true){Newsjs.like(root.login,root.db,1,"like",newsitemobject.id,root);dislikeCheckbox.checked=false; + newsitemobject.friendica_activities_view.self.liked=1; + newsitem.ListView.view.model.set(index,{"newsitemobject":newsitemobject}); + } + else{Newsjs.like(root.login,root.db,0,"like",newsitemobject.id,root); + newsitemobject.friendica_activities_view.self.liked=0; + newsitem.ListView.view.model.set(index,{"newsitemobject":newsitemobject}); + }} + } + CheckBox{ + id: dislikeCheckbox + width:newsitem.width/5 //10*mm + height: parent.height + visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false + checked: (newsitemobject.friendica_activities_view.self.disliked==1)?true:false + indicator: Rectangle{ + implicitWidth: newsitem.width/5 //10*mm + implicitHeight:root.fontFactor*osSettings.bigFontSize + Text{ + anchors.centerIn: parent + font.pointSize: osSettings.systemFontSize + font.family:fontAwesome.name + color:dislikeCheckbox.checked?"black": "grey" + text: dislikeCheckbox.checked?"\uf119"+"!":"\uf119" + } } - else {Newsjs.like(root.login,root.db,0,"dislike",newsitemobject.id,root); - newsitemobject.friendica_activities_view.self.disliked=0; - newsitem.ListView.view.model.set(index,{"newsitemobject":newsitemobject}); - }} - } + onClicked: { + if (dislikeCheckbox.checked==true){Newsjs.like(root.login,root.db,1,"dislike",newsitemobject.id,root);likeCheckbox.checked=false; + newsitemobject.friendica_activities_view.self.disliked=1; + newsitem.ListView.view.model.set(index,{"newsitemobject":newsitemobject}); + } + else {Newsjs.like(root.login,root.db,0,"dislike",newsitemobject.id,root); + newsitemobject.friendica_activities_view.self.disliked=0; + newsitem.ListView.view.model.set(index,{"newsitemobject":newsitemobject}); + }} + } - CheckBox { - id:favoritedCheckbox - visible:((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3)) - width: newsitem.width/5 // 10*mm - height: parent.height - indicator:Rectangle{ - implicitWidth: newsitem.width/5 //10*mm - implicitHeight:4*mm + CheckBox { + id:favoritedCheckbox + visible:((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3)) + width: newsitem.width/5 // 10*mm + height: parent.height + indicator:Rectangle{ + implicitWidth: newsitem.width/5 //10*mm + implicitHeight:root.fontFactor*osSettings.bigFontSize + Text{ + anchors.centerIn: parent + font.pointSize: osSettings.systemFontSize + font.family:fontAwesome.name + color: favoritedCheckbox.checked?"black":"grey" + text:"\uf005" + } + } + checked:(newsitemobject.favorited>0) + onClicked:{ + if(favoritedCheckbox.checkState==Qt.Checked){ + Newsjs.favorite(login,true,newsitemobject.id,root); model.newsitemobject.favorited=1} + else if(favoritedCheckbox.checkState==Qt.Unchecked){ + Newsjs.favorite(login,false,newsitemobject.id,root);model.newsitemobject.favorited=0} + } + } + Rectangle{ + width: newsitem.width/5 //10*mm + height: parent.height + visible:(newsitemobject.messagetype!==2) + color:"transparent" Text{ + id:newsmenusymbol + color: "grey" anchors.centerIn: parent - font.pixelSize: 3*mm + font.pointSize: osSettings.systemFontSize font.family:fontAwesome.name - color: favoritedCheckbox.checked?"black":"grey" - text:"\uf005" + text: "\uf142" } - } - checked:(newsitemobject.favorited>0) - onClicked:{ - if(favoritedCheckbox.checkState==Qt.Checked){ - Newsjs.favorite(login,true,newsitemobject.id,root); model.newsitemobject.favorited=1} - else if(favoritedCheckbox.checkState==Qt.Unchecked){ - Newsjs.favorite(login,false,newsitemobject.id,root);model.newsitemobject.favorited=0} - } - } - Rectangle{ - width: newsitem.width/5 //10*mm - height: parent.height - visible:(newsitemobject.messagetype!==2) - color:"transparent" - Text{ - id:newsmenusymbol - color: "grey" - anchors.centerIn: parent - font.pixelSize: 3*mm - font.family:fontAwesome.name - text: "\uf142" - } - MouseArea{ - anchors.fill:parent - onClicked: {newsmenu.popup()}} - } - } - - Menu { - id:newsmenu - width: 30*mm - delegate: MenuItem{ - contentItem: Text{ - font.pixelSize: 3*mm - text: parent.text - } - } - Action{ - text: qsTr("Reply") - onTriggered: { - var directmessage=0; - if (newsitemobject.messagetype==1){ directmessage=1} - var replycomp=Qt.createComponent("qrc:/qml/newsqml/MessageSend.qml"); - var conversation;newsitem.ListView.view.viewtype=="conversation"?true:false; - var reply=replycomp.createObject(friendicaActivities,{parentId:newsitemobject.id,reply_to_user:newsitemobject.user.screen_name, state:"reply",conversation:conversation,textfocus:true}) - } - } - Action { - text: qsTr("DM") - onTriggered: { - root.directmessageSignal(newsitemobject.user.screen_name); - } - } - Action { - text: qsTr("Repost") - onTriggered: { - Newsjs.retweetNews(root.login,db,newsitemobject.id,root,function(reply){ - Helperjs.showMessage("Repost",qsTr("Success!"),root) - }) - } - } - Action { - text: qsTr("Conversation") - onTriggered: { - pushConversation(); + MouseArea{ + anchors.fill:parent + onClicked: {newsmenu.popup()}} } } - Menu{ - title: qsTr("Attending") - width: 20*mm + Menu { + id:newsmenu + width: 18*osSettings.FontSize delegate: MenuItem{ contentItem: Text{ - font.pixelSize: 3*mm + font.pointSize: osSettings.systemFontSize text: parent.text } } Action{ - text:qsTr("yes") - onTriggered: {Newsjs.attend(root.login,db,"yes",newsitemobject.id,root,function(){ - model.newsitemobject.friendica_activities_view.self.attending="yes";attending="yes"}) + text: qsTr("Reply") + onTriggered: { + var directmessage=0; + if (newsitemobject.messagetype==1){ directmessage=1} + var replycomp=Qt.createComponent("qrc:/qml/newsqml/MessageSend.qml"); + var conversation; + if (newsitem.ListView.view.viewtype=="conversation"){conversation=true} + else{conversation=false}; + var reply=replycomp.createObject(friendicaActivities,{parentId:newsitemobject.id,reply_to_user:newsitemobject.user.screen_name, state:"reply",conversation:conversation,textfocus:true}) } } - Action{text:qsTr("maybe") - onTriggered: {Newsjs.attend(root.login,db,"maybe",newsitemobject.id,root,function(){ - model.newsitemobject.friendica_activities_view.self.attending="maybe";attending="maybe"}) + Action { + text: qsTr("DM") + onTriggered: { + root.directmessageSignal(newsitemobject.user.screen_name); } } - Action{text:qsTr("no") - onTriggered: {Newsjs.attend(root.login,db,"no",newsitemobject.id,root,function(){ - model.newsitemobject.friendica_activities_view.self.attending="no";attending="no"})} + Action { + text: qsTr("Repost") + onTriggered: { + Newsjs.retweetNews(root.login,db,newsitemobject.id,root,function(reply){ + Helperjs.showMessage("Repost",qsTr("Success!"),root) + }) + } } - } - - Action { - text: qsTr("Delete") - onTriggered: { - Newsjs.deleteNews(root.login,root.db,newsitemobject.id,newsitemobject.messagetype,root,function(reply){ - var msg = {'deleteId': index, 'model': newsModel}; - newsWorker.sendMessage(msg); - }) + Action { + text: qsTr("Conversation") + onTriggered: { + pushConversation(); + } } - } - Action { - text: qsTr("Show height") - onTriggered: { - Helperjs.showMessage("Height",itemMessage.height + "toprow: "+ toprow.height,root) + Menu{ + title: qsTr("Attending") + width: 10*osSettings.systemFontSize + delegate: MenuItem{ + contentItem: Text{ + font.pointSize: osSettings.systemFontSize + text: parent.text + } + } + Action{ + text:qsTr("yes") + onTriggered: {Newsjs.attend(root.login,db,"yes",newsitemobject.id,root,function(){ + model.newsitemobject.friendica_activities_view.self.attending="yes";attending="yes"}) + } + } + Action{text:qsTr("maybe") + onTriggered: {Newsjs.attend(root.login,db,"maybe",newsitemobject.id,root,function(){ + model.newsitemobject.friendica_activities_view.self.attending="maybe";attending="maybe"}) + } + } + Action{text:qsTr("no") + onTriggered: {Newsjs.attend(root.login,db,"no",newsitemobject.id,root,function(){ + model.newsitemobject.friendica_activities_view.self.attending="no";attending="no"})} + } } + + Action { + text: qsTr("Delete") + onTriggered: { + Newsjs.deleteNews(root.login,root.db,newsitemobject.id,newsitemobject.messagetype,root,function(reply){ + var msg = {'deleteId': index, 'model': newsModel}; + newsWorker.sendMessage(msg); + }) + } + } + + //MenuItem{ + // text:qsTr("Show on website") + // onTriggered:Qt.openUrlExternally(login.server+"/display/"+newsitemobject + //} + } + Column{ + id:conversationColumn + anchors.top:controlrow.bottom + width: newsitem.width } - - - //MenuItem{ - // text:qsTr("Show on website") - // onTriggered:Qt.openUrlExternally(login.server+"/display/"+newsitemobject - //} - } - Column{ - id:conversationColumn - anchors.top:controlrow.bottom - //anchors.right: parent.right - width: newsitem.width } } -} diff --git a/source-linux/qml/newsqml/SmileyDialog.qml b/source-linux/qml/newsqml/SmileyDialog.qml index 22e88da..d2ca2a9 100644 --- a/source-linux/qml/newsqml/SmileyDialog.qml +++ b/source-linux/qml/newsqml/SmileyDialog.qml @@ -42,10 +42,8 @@ Rectangle{ width: messageColumn.width-5*mm height:root.height/2 - Button{ + MButton{ id:closeButton - height: 6*mm - width: 8*mm anchors.top: parent.top anchors.topMargin: 1*mm anchors.right: parent.right @@ -62,20 +60,20 @@ Rectangle{ position:TabBar.Header TabButton { text:qsTr("Unicode") - font.pixelSize: 2*mm + font.pointSize: osSettings.systemFontSize } TabButton { text: qsTr("Standard") - font.pixelSize: 2*mm + font.pointSize: osSettings.systemFontSize } TabButton { text: qsTr("Addon") - font.pixelSize: 2*mm + font.pointSize: osSettings.systemFontSize } TabButton { text: qsTr("Adult") - font.pixelSize: 2*mm + font.pointSize: osSettings.systemFontSize } } @@ -86,7 +84,7 @@ Rectangle{ anchors.top: closeButton.bottom anchors.topMargin: 1*mm width: smileyDialog.width-2*mm - height: smileyDialog.height-7*mm + height: smileyDialog.height-4*root.fontFactor*osSettings.bigFontSize Rectangle{ id: htmlGridTab GridView { @@ -177,10 +175,6 @@ Rectangle{ } } } - - - - } Component{ id:smileyItem @@ -207,7 +201,7 @@ Rectangle{ width:4.5*mm height: 4.5*mm textFormat:Text.RichText - font.pixelSize: 4*mm + font.pointSize: 1.2*osSettings.systemFontSize text: emoji MouseArea{ diff --git a/source-linux/qml/photoqml/ImageUploadDialog.qml b/source-linux/qml/photoqml/ImageUploadDialog.qml index 56a5a56..0208641 100644 --- a/source-linux/qml/photoqml/ImageUploadDialog.qml +++ b/source-linux/qml/photoqml/ImageUploadDialog.qml @@ -63,7 +63,7 @@ Rectangle{ } -function updateImage(){ + function updateImage(){ xhr.url= login.server + "/api/friendica/photo/update.json"; xhr.setLogin(login.username+":"+Qt.atob(login.password)); xhr.clearParams(); @@ -119,7 +119,7 @@ function updateImage(){ anchors.rightMargin: 1*mm spacing:5*mm Text{ - font.pixelSize: 3.5*mm + font.pointSize: osSettings.bigFontSize font.bold: true text:qsTr("Upload to album") } @@ -132,17 +132,46 @@ function updateImage(){ // } // } - Button{ + MButton{ id:closeButton - height: 8*mm text: "\uf057" - font.pixelSize: 3*mm - onClicked:{photoStack.pop(); - //imageDialog.destroy() + width: 2.5*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.bigFontSize + onClicked:{photoStack.pop()} + } + } + + ComboBox{ + id: album + x: 3*mm + y: 3*root.fontFactor*osSettings.bigFontSize + width: root.width/2; + height: 2.5*root.fontFactor*osSettings.bigFontSize//5*mm; + font.pointSize: osSettings.bigFontSize + editable:true + model: albumModel + +// delegate: ItemDelegate { +// width: album.width +// contentItem: Text { +// //text: modelData +// color: "white" +// font: album.font +// font.pixelSize: album.font.pixelSize +// elide: Text.ElideRight +// verticalAlignment: Text.AlignVCenter +// } +// //highlighted: album.highlightedIndex === index +// } + onAccepted: { + if (find(currentText) === -1) { + albumModel.append({text: editText}) + currentIndex = find(editText) } } } + ListModel{id:albumModel} // Text { // text: qsTr("Album") // x: 4*mm; y: 10*mm @@ -161,16 +190,28 @@ function updateImage(){ ListView{ id: imageUploadView x:3*mm //23*mm - y:17*mm + y: 11*mm + album.height width: imageDialog.width-5*mm //25*mm - height: root.width/2 //25*mm + height: parent.height -(9*root.fontFactor*osSettings.bigFontSize)//root.width/2 //25*mm model: imageUploadModel delegate: imageDelegate footer: imageId==""?imageFooter:null 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++){ + attachImage(urllist[i]) + } + } + } + } } + BusyIndicator{ id: uploadBusy running: false @@ -180,6 +221,7 @@ function updateImage(){ width:10*mm height: 10*mm } + ListModel{ id: imageUploadModel } @@ -192,7 +234,7 @@ function updateImage(){ Image{ id: uploadImage width: root.width/2-mm //20*mm - height: imageUploadView.height-6*mm//height: 14*mm + height: imageUploadView.height-(3*root.fontFactor*osSettings.bigFontSize+2*mm) fillMode: Image.PreserveAspectFit source:imageUrl onVisibleChanged: descriptionInput.focus=true; @@ -207,18 +249,19 @@ function updateImage(){ } Rectangle{ - color: "light grey" + //color: "light grey" border.color: "grey" anchors.top: uploadImage.bottom anchors.topMargin: mm //x: mm; y: 15*mm; width: root.width/2-mm //Math.max(root.width/2-mm, descriptionInput.contentWidth); - height: 5*mm; + height: 2.5*root.fontFactor*osSettings.bigFontSize +2*mm //5*mm; TextField{ //TextInput { id: descriptionInput anchors.fill: parent - font.pixelSize: 3*mm + anchors.margins: mm + font.pointSize: osSettings.systemFontSize selectByMouse: true placeholderText: qsTr("Description") text:description!=""?description:"" @@ -248,44 +291,17 @@ function updateImage(){ } } } - ComboBox{ - id: album - x: 3*mm - y: 10*mm - width: root.width/2; - height: 5*mm; - font.pixelSize: 3*mm - editable:true - model: albumModel -// delegate: ItemDelegate { -// width: album.width -// contentItem: Text { -// //text: modelData -// color: "white" -// font: album.font -// font.pixelSize: album.font.pixelSize -// elide: Text.ElideRight -// verticalAlignment: Text.AlignVCenter -// } -// //highlighted: album.highlightedIndex === index -// } - onAccepted: { - if (find(currentText) === -1) { - albumModel.append({text: editText}) - currentIndex = find(editText) - } - } - } - - ListModel{id:albumModel} Button{ id:uploadButton - height: 8*mm - x:4*mm; y:root.width/2+18*mm //40*mm + height: 2*root.fontFactor*osSettings.bigFontSize + x:4*mm; + anchors.top:imageUploadView.bottom + anchors.topMargin: mm + //y:root.width/2+18*mm //40*mm text: imageId==""?qsTr("Upload"):qsTr("Change") - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize onClicked:{ if(album.currentText==""){Helperjs.showMessage(qsTr("Error"),qsTr(" No album name given"), imageDialog)} else if (imageId!=""){uploadBusy.running=true; updateImage()} diff --git a/source-linux/qml/photoqml/PhotoComponent.qml b/source-linux/qml/photoqml/PhotoComponent.qml index dd3e95c..5e67fe4 100644 --- a/source-linux/qml/photoqml/PhotoComponent.qml +++ b/source-linux/qml/photoqml/PhotoComponent.qml @@ -78,7 +78,7 @@ Package { width:15*mm anchors.bottom: photoWrapper.bottom color: "white" - font.pixelSize: 2*mm + font.pointSize: osSettings.systemFontSize wrapMode:Text.Wrap } MouseArea { diff --git a/source-linux/qml/photoqml/PhotoTab.qml b/source-linux/qml/photoqml/PhotoTab.qml index d556678..ff78708 100644 --- a/source-linux/qml/photoqml/PhotoTab.qml +++ b/source-linux/qml/photoqml/PhotoTab.qml @@ -152,6 +152,31 @@ StackView{ photoStack.push("qrc:/qml/photoqml/ImageUploadDialog.qml",{"attachImageURLs":urls}) } + BlueButton{ + x:mm + y:mm + z:2 + visible: !wideScreen + fontColor: "grey" + border.color: "transparent" + text: "\uf0c9" + font.pointSize: osSettings.bigFontSize + onClicked:{ + leftDrawerAndroid.visible?leftDrawerAndroid.close():leftDrawerAndroid.open()} + } + + LeftDrawerLinux{ + id:leftDrawer + property var newstabstatus: newstab.newstabstatus + visible: wideScreen&&rootstackView.depth<2 + width: visible?osSettings.systemFontSize*15:0 + height: root.height-bar.height + } + + LeftDrawerAndroid{ + id: leftDrawerAndroid + } + ProgressBar{ id: newImagesProgress width: 15*mm @@ -169,8 +194,6 @@ StackView{ anchors.topMargin: 0.5*mm anchors.right:updatePhotolist.left anchors.rightMargin:mm - height: 6*mm - width: 8*mm text:"\uf0ee" onClicked: { photoStack.push("qrc:/qml/photoqml/ImageUploadDialog.qml"); @@ -184,22 +207,20 @@ StackView{ anchors.topMargin: 0.5*mm anchors.right:phototabstatusButton.left anchors.rightMargin:mm - height: 6*mm - width: 8*mm text:"\uf0ed" Menu { id:photoupdatemenu - width:40*mm + width:8*root.fontFactor*osSettings.bigFontSize MenuItem { text: qsTr("All Images") - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize onTriggered: { Imagejs.requestList(root.login,root.db, false, fotostab,function(obj){fotorectangle.newimages=obj})} } MenuItem { text: qsTr("Only new") - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize onTriggered: { Imagejs.requestList(root.login,root.db, true,fotostab,function(obj){fotorectangle.newimages=obj})} } @@ -213,15 +234,14 @@ StackView{ anchors.topMargin: 0.5*mm anchors.right: parent.right anchors.rightMargin:2*mm - height: 6*mm - width: Math.max(10*mm,implicitWidth) + width: Math.max(8*root.fontFactor*osSettings.bigFontSize,implicitWidth) text: fotostab.phototabstatus=="Images"?qsTr("Own Images"):fotostab.phototabstatus Menu { id:phototabmenu - width: 40*mm + width: 20*root.fontFactor*osSettings.bigFontSize MenuItem { text: qsTr("Own Images") - font.pixelSize: 3*mm + font.pointSize: osSettings.bigFontSize onTriggered: { fotostab.phototabstatus="Images"; // phototabstatusButton.text=qsTr("Own images"); @@ -246,8 +266,10 @@ StackView{ id: albumgridview cellWidth: 17*mm cellHeight: 17*mm - x: mm;y:8*mm - width: parent.width-2*mm; height: parent.height-9*mm + x: leftDrawer.width//mm; + y:8*mm + width: wideScreen&&rootstackView.depth<2?parent.width-leftDrawer.width-mm:parent.width-mm //parent.width-2*mm; + height: parent.height-9*mm clip: true model: visualphotoModel.parts.album footer:Rectangle{ @@ -256,7 +278,7 @@ StackView{ width:12*mm height:6*mm Text{ - font.pixelSize: 1.5*mm + font.pointSize: 0.75*osSettings.systemFontSize anchors.centerIn: parent text:qsTr("More") } @@ -282,11 +304,9 @@ StackView{ MButton { id: backButton - height: 6*mm - width: 8*mm text: "\uf057" - x: parent.width - backButton.width - 3*mm - y: -backButton.height - 4*mm + x: parent.width - backButton.width - root.fontFactor*osSettings.bigFontSize + y: -backButton.height - root.fontFactor*osSettings.bigFontSize z:2 onClicked: {photoBackground.opacity=0} } diff --git a/source-linux/qml/photoqml/PhotogroupComponent.qml b/source-linux/qml/photoqml/PhotogroupComponent.qml index eb948f4..8796627 100644 --- a/source-linux/qml/photoqml/PhotogroupComponent.qml +++ b/source-linux/qml/photoqml/PhotogroupComponent.qml @@ -93,7 +93,7 @@ Package { wrapMode:Text.Wrap color: "white" font.family: "Monospace" - font.pixelSize: 2*mm + font.pointSize: osSettings.systemFontSize anchors.bottom: albumWrapper.bottom } @@ -125,7 +125,7 @@ Package { MouseArea { anchors.fill: parent onPressAndHold:{ - var menuString="import QtQuick.Controls 1.4; Menu {MenuItem{text:qsTr('Delete on client and server'); onTriggered: {deletepics('album',albumname);photogroupModel.remove(index)}}}"; + var menuString="import QtQuick.Controls 2.12; Menu {MenuItem{text:qsTr('Delete on client and server'); onTriggered: {deletepics('album',albumname);photogroupModel.remove(index)}}}"; var albummenuObject=Qt.createQmlObject(menuString,albumWrapper,"albummenuOutput") albummenuObject.popup() } diff --git a/source-linux/translations/friendiqa-de.qm b/source-linux/translations/friendiqa-de.qm index 173db705df65d8e4e8429494d10578a6381b1b50..41284529f29c1ed1fcee91a5e446266d6262d814 100644 GIT binary patch delta 3419 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 G)Bgb%@;|o# diff --git a/source-linux/translations/friendiqa-de.ts b/source-linux/translations/friendiqa-de.ts index ecd9fd8..41e100b 100644 --- a/source-linux/translations/friendiqa-de.ts +++ b/source-linux/translations/friendiqa-de.ts @@ -4,29 +4,29 @@ AccountPage - - - + + + User Name - + Server Server - + Nickname Kurzname - + Password Passwort - + Image dir. Bildverz. @@ -35,54 +35,54 @@ Anzeige - - - + + + Error Fehler - + Nicknames containing @ symbol currently not supported Kurznamen mit @ Zeichen werden derzeit nicht unterstützt. - + Confirm Bestätigen - + No server given! Kein Server angegeben! - + No nickname given! Kein Kurzname angegeben! - + No password given! Kein Passwort angegeben! - + No image directory given! Kein Verzeichnis für Bilder angegeben! - + Wrong password! Falsches Passwort! - + Success Bestätigt - + Name Name @@ -98,12 +98,12 @@ CalendarTab - + Events Termine - + Own Calendar Eigener Kalender @@ -134,7 +134,7 @@ Max. Nachr. - + Hide #nsfw? #nsfw minimieren? @@ -262,96 +262,409 @@ ContactDetailsComponent - Connect - Kontaktanfrage + Kontaktanfrage - Description - Beschreibung + Beschreibung - Location - Ort + Ort - Posts - Beiträge + Beiträge - URL - Profilseite + Profilseite - Created at - Erstellt + Erstellt ContactPage + + + seconds + Sekunden + + + + minute + Minute + + + + minutes + Minuten + + + + hour + Stunde + + + + hours + Stunden + + + + day + Tag + + + + days + Tage + + + + month + Monat + + + + months + Monate + + + + years + Jahre + + + + likes this. + mag das. + + + + like this. + mögen das. + + doesn't like this. + mag das nicht. + + + + don't like this. + mögen das nicht. + + + + will attend. + nehmen teil. + + + + persons will attend. + Personen nehmen teil. + + + + will not attend. + nimmt nicht teil. + + + + persons will not attend. + Personen nehmen nicht teil. + + + + may attend. + nimmt vielleicht teil. + + + + persons may attend. + Personen nehmen vielleicht teil. + + + Connect Kontaktanfrage - + + Approve + Erlauben + + + + Reject + Ablehnen + + + + Ignore + Ignorieren + + + Description Beschreibung - + Location Ort - + Posts Beiträge - + URL Profilseite - + Created at Erstellt + + + Network Error + Netzwerk-Fehler + + + + Conversation + + + seconds + Sekunden + + + + minute + Minute + + + + minutes + Minuten + + + + hour + Stunde + + + + hours + Stunden + + + + day + Tag + + + + days + Tage + + + + month + Monat + + + + months + Monate + + + + years + Jahre + + + + likes this. + mag das. + + + + like this. + mögen das. + + + + doesn't like this. + mag das nicht. + + + + don't like this. + mögen das nicht. + + + + will attend. + nehmen teil. + + + + persons will attend. + Personen nehmen teil. + + + + will not attend. + nimmt nicht teil. + + + + persons will not attend. + Personen nehmen nicht teil. + + + + may attend. + nimmt vielleicht teil. + + + + persons may attend. + Personen nehmen vielleicht teil. + + + + DrawerAccountComponent + + + Refresh + Aktualisieren + + + + Timeline + Chronologisch + + + + Conversations + Unterhaltungen + + + + Replies + Interaktionen + + + + Direct Messages + Direktnachrichten + + + + Favorites + Markierte News + + + + Public Timeline + öff. Timeline + + + + Group news + News Gruppe + + + + Search + Suche + + + + Notifications + Meldungen + + + + DrawerAccountComponentContacts + + + Profile + Profil + + + + Friends + Freunde + + + + Contacts + Kontakte + + + + Groups + Gruppen + EventList - + Location + Ort + + + + EventListItem + + Location Ort + + FriendsListTab + + + Friend Requests + Kontaktanfragen + + + + Friends + Kontakte + + FriendsTab - + Me Ich - + Friends Freunde - + Contacts Kontakte - + Groups Gruppen @@ -383,63 +696,86 @@ Bild - + Description Beschreibung - + Upload Hochladen - + Change Ändern - + Error Fehler - + No album name given Kein Albumname angegeben + + LeftDrawerScrollview + + + Settings + Einstellungen + + + + Accounts + Konten + + + + Quit + Schliessen + + MessageSend - + to: an: - + Title (optional) Überschrift (optional) - + + Drop your Content here. + Legen Sie Ihren Inhalt per Drag & Drop hier ab. + + + What's on your mind? Woran denkst du gerade? - - + + Error Fehler - + Only one attachment supported at the moment. Remove other attachment first! Nur ein Anhang derzeit unterstützt. Lösche zuerst den anderen Anhang! - + No receiver supplied! Kein Empfänger angegeben! @@ -447,7 +783,7 @@ MoreComments - + Show all comments Alle Kommentare @@ -455,12 +791,12 @@ NewsStack - + Network Error Netzwerk-Fehler - + More Mehr @@ -520,102 +856,102 @@ Schliessen - + seconds Sekunden - + minute Minute - + minutes Minuten - + hour Stunde - + hours Stunden - + day Tag - + days Tage - + month Monat - + months Monate - + years Jahre - + likes this. mag das. - + like this. mögen das. - + doesn't like this. mag das nicht. - + don't like this. mögen das nicht. - + will attend. nehmen teil. - + persons will attend. Personen nehmen teil. - + will not attend. nimmt nicht teil. - + persons will not attend. Personen nehmen nicht teil. - + may attend. nimmt vielleicht teil. - + persons may attend. Personen nehmen vielleicht teil. @@ -627,17 +963,17 @@ Teilnahme - + Source: Quelle: - + Direct Message Direktnachricht - + In reply to Antwort an @@ -651,65 +987,70 @@ partecipare - + ago her - + Attending: Teilnahme: - + Reply Antworten - + DM Direktnachricht - + Repost Teilen - + Success! Erledigt! - + Conversation Unterhaltung - + Attending Teilnahme - + yes ja - + maybe vielleicht - + no nein - + Delete Löschen + + + Show height + + PermissionDialog @@ -732,23 +1073,23 @@ s Bilder - + All Images Alle Bilder - + Only new Nur neue - - + + Own Images Eigene Bilder - + More Mehr @@ -941,37 +1282,37 @@ Homepage - + Update Aktualisieren - + profile id Profil-Nummer - + Description Beschreibung - + Location Ort - + Posts Beiträge - + URL Profilseite - + Created at Erstellt @@ -979,22 +1320,22 @@ SmileyDialog - + Unicode Unicode - + Standard Standard - + Addon Addon - + Adult XXX @@ -1028,59 +1369,48 @@ friendiqa - Refresh - Aktualisieren + Aktualisieren - Timeline - Chronologisch + Chronologisch - Conversations - Unterhaltungen + Unterhaltungen - Favorites - Markierte News + Markierte News - Replies - Interaktionen + Interaktionen - Public Timeline - öff. Timeline + öff. Timeline - Group news - News Gruppe + News Gruppe - Search - Suche + Suche - Settings - Einstellungen + Einstellungen - Accounts - Konten + Konten - Quit - Schliessen + Schliessen @@ -1188,22 +1518,20 @@ Fehler - Changelog - Änderungen + Änderungen - Setting view type of news has moved from account page to config page. - Die Einstellung der Ansichtsart von Nachrichten wurde von der Kontoseite auf die Konfigurationsseite verschoben. + Die Einstellung der Ansichtsart von Nachrichten wurde von der Kontoseite auf die Konfigurationsseite verschoben. - + Undefined Array Error Antwort-Array ungültig - + JSON status Error Server-Antwort: Fehler diff --git a/source-linux/translations/friendiqa-es.qm b/source-linux/translations/friendiqa-es.qm index eed8306999fb2bb9c843c4cacaa2f942e7fbbe0d..6918aee9c922d3c22c755a0a0ce60bac8354c553 100644 GIT binary patch delta 4992 zcma)Adw3Mp6+g+oH~YwQcS*wTB)dEkLU;z0m-1*(L{Je*u^^k>AsN{0Y-VN?sn(?e zY6YdABYtRsqChL6MTsa>{CpIA)#3wNwJjEmTC5)eMXiq(`@3_=ChTXle=NV9bI(2Z zoZtDKI~zWmdCLu%347y#mrrh7|HrDzrx)M%)REs1QNE~7A+kO~WWJp!(n(}#APRg) zWSdPiD9CZl&A`WrMu&+OB#0biIM$pcYW_RXz&nVR{v7seIeO-C3|&cdeJxRN8Br$l zdjy<}FTgQ7$#SuWs9`Tz8dt;NLym)gM3zgC0PQBrS~F4k*JOEQDiT!5^3roiavE9h zzJ{o_i>zDr5e@N?b%zND-^$Umf@7$itgj6vs@p==&#})rg{&FH3gb3MK;D+1C z_Td^-Hj5?<`3wi`=IC?N^qq@fUrp2Zj|T3cnfEjyu?sntTRB#IKtEgx*6e@aSaX2p zzi=VZfL+vl_W>l@Msh+&0!hjkU%X4XL6}Ku9+;??NL>d82A<+LW*%wc14IRHb1eJ| z$EwYwy>y0X*iR|57Xdvr97{%V48KZSZ7M46PdgGwprMPp8owbLF@jFkA@LEJOy19~ z+e$QiT>gmSg`l=Af5(RV(Tdme530`)nI`3T-M9giX7WE~J+*8yO&%j5TWU>mWS40!_Y3v^ADiH+B(Y%4H{Z9-g0Wq zTxjAGYj{QpdUnJ*`~g%ptkXInIspC)trH%p2X3}5xDo5Vt2qW{SYO<<7#bREJv0UD z?qeK_|H(1D#`?Dz&t)KvcWkCPI>zu#TUk90Dm`wiy$K^(x!!j1kC8}08^^+PSap%D zalsk%)WosK%CYL8ZQibTAhIiLKRt@pI5%n17A>gVZri&L;u>?-wr}`xY`DnYarbImHZ^v=s)nflllBL@-Unm9 zvhO;CF|@7cIQR?uQ)^!&Dr>aAFboBit+l^2+k*mXITqG%6#irX*Lx^D=yp_O29=_R z0Y}Ac$k_1}N6)7mLq{E#H=o4;uXF78G{>3?9Sh%H0kz-ch^_hniO+DfGQS~jIc~}9 zMz3$?81gu7KY+OX3LL+F7KN4Xcl<66bSF3#s}8SW2nU_MJzt~J>-AQXKeNc0xaLcQ zyUe-j;RvpoW6pgWLAbfd`Q*B*p@g9Gz>EJzXCHSSI1UVdQ9wKD(U4Ibi^g)SI$dB1 z#W0Lr1&hOnp^(CY4F^9#!xtCa^Xh5rUs&+`NTgSxy29I6qVaQF!`^upckw8;8+a!>knGlorZ zON~>p?slu4lQ4ZP?sW&?@4Jsf!nS%BJm{ed$j!e{@lL});VZrO zPlZzGJ@0RQ$k_21N6*6?Lz^X{vBNsYnTOg04^5^NDI`-9MM<$^8(HzOO-`j0xn0zc zy8XJzy*uQgOR1TXa8%B7v|ierloe6m;-0J5m5$cmcQ*zL=_(Q_MlJCC$@$(_iA#0C z9nfn%HM(3H(6_mZ^t(zc4BTJZ04%w)j6sn;rHq@GmIaOH_2=wwm5ni;%Y7Ud`l^iQ zHNJ>}`+emGcKJdEdi@IwZ1-Pj;G6zykY$NJDZu^Zz);vr^izJH{%nBnIT5Hde37Et zHC0Zwi;5c6Bsr}o_E%SW? zb9`?0)#O;7@P%?L@A@J+7N`H(97~&jUXJBe|Kc3W*uan+%hJHelJgkLGeJ%P{iNT| z*v;`i9;nK(+~Jt$_f1ox9ilQh7L(ISZK~Xwl9OUm(_iT~bclDFq=+$1xLj1#XtSu= z5WO$|0oB9$jJ2q`Hq*yGBjZY%1+8l&(Gq-OP;m?>V**4{vt#0(C2P_WDQ0NnyK*sN zMrf)rYHW%UBcCkN@duh)P}Va zRG+OeAWT!_l(1Y*D+22`xD#4LMXYD^7hvA(Y~bdAhR(BvGd=EdygFhAhfzxC&p7=y z>)cd4s)_pWPg*1}FO`6#Y02nO@w`to38un!v;xe06)Ac8bVfS9tG z+2fL$kd}$8wCZ9w#o^L@xAdmKA;#0OsGbQ1Lxre8M8p$tOaptOnK2u!EQ|gwob?gT zW+T+YleHPW5*6k#vJ!dm{Y>17A%Je7_ORn>k>aAT#Lzm+5x@6RbPT~I1dn1<2aag! zDW^ql6;lueJ7P${;O$&9;LCQf!+Pe~&ipmGBgy=$JVsQ_Ncy8*EwW3{9{O(xWke;` z*?gu@085+AEALwG&NwAih>J_2>4dQhr1jMTOE>?+14d+)A)g4=^>%!E^7XVv6-kRG z1XYV_X+{V(v39B1P5k=6zgbe;*aQOOf+{6rjG4-s^S2mxOxE4i?cO1ANmaU_y{~YD z@z%-uSz6Po6l26yGexi$$O+JUzLPyACnODSEY)(PdIq)e+lVu0$gx+21t}S|C4`t9 zH=1}!Jz}F}_^{Dsm9p!EJ-34{7DPe7c09A0>rqZ&N|D;xbSx8>cgRYdWuVUp-Q}o6 zx7d4B*6$7V_qg$+lHKS+szughR?W1!ZijQtWoKkx1;&Y@aaDr?WUYCw07`F|TycBpbL9m;hO$!qW zEImxBa!i7nx{HGbip=PJd)6agYiIHLdthbqVt;htzjLzd=5A6t-wnN5QW1(e#}b%m~XTf5E| z)Bp8JT$w0voqM5<@05lk0BA|)U;n!UfI|%-9^WF3M&N<)t zt$O-;d1P{j$9(j1>#N7IZJ#dMdZ2$Q5hLPTLzJNqu?0lB%S2oyQPzNpVkS|QpNL

z&Ok%jLu@lcG-3y_@0Jj0gTx*=grQ1F+pYoeJktIFJCz|W7Pqz07m1uh%(oa?1u`e<0!Ze z17`KAX#a&m(pyBPWfbW^JbgE{`;l)ONX$1aBr-gi*uG&Kk@#FCn}mFOIdANC!}v-xf`Q!qf4xCWivKzVNY;$-! z2Iyor?8Ke<1QmrQ6?GXZS{`LLuHHaopUJki;#8Vb?BRkClquC#Ela}ybF@917U4Z) z@!I24F?sqDPBTZr0DHL%$6Vb0VQ%d5DMU$)T=4>IXtHxl(jT#D z>U^$aKcpO~;VTULpn!{4vU7-%H}X5qoJHf;_}$0x1~|Wp{9h^#>*EhJ_fUjJ^znyt z(b%5KAE`_R;dlJ+rz0S^C|K`K$L40i`T`oI9291I2SBt}Md3ab^*t(Dh6xM%p1~=X z3#%e~aH>nfnl9Ao(}g!agTlk>g%3Tzv;m!`_ZV(LI%(EfG}2y-{eU<}MZQzF^6k-( z{%_s>R&30q>biRV#N%79>pBNa@6%Je14^9GvvxP$%o%;lS62{s8b-CPfO2CD&WiUS z^)*9f+jS^aVE8B@hy@=v{9IfQzHkz2#0jm2q@rt6aqEl+lYC_*nD9bUFj|DcYLeD< zp|P%6Me{Uc)eb0=o^RY%(unwJ<2#u#MV9%X`^4x8?RZX^kbIXpt3(cjT<%b*6mt3e z!4kQ)P7X+ckkXTzXS^l&a$eD`E~PBbd7JOWynAo+b?5z0FGuoz#cC{8wipW(eM%1g zb9KVBFvckN1w&Dby(v*SC60*pjm$|_8t#83T2*)=L3t^Aj83R-@JRuWuimBPTb%J` zzXcrsMQa^arO0ZGcXe2&$D3bdkB&DpZA0o83^ljeh9om1$Hv$8+w$VggX702vz$_< zP*URxcqPB=QLgLF76VdKP^@tU#acNm ldBo}lxmFZiZnxYR2#IwruOx AccountPage - - - + + + User Usuario - + Server Servidor - + Nickname Usuario - + Password Contraseña - + Image dir. Dir. de imágenes @@ -35,54 +35,54 @@ Noticias como - - - + + + Error Error - + Nicknames containing @ symbol currently not supported No se admiten los apodos que contienen el símbolo @ actualmente - + Confirm Confirmar - + No server given! ¡Servidor no encontrado! - + No nickname given! ¡Usuario incorrecto! - + No password given! ¡Contraseña incorrecta! - + No image directory given! ¡No se ha encontrado el directorio de imágenes! - + Wrong password! ¡Contraseña incorrecta! - + Success éxito! - + Name Nombre @@ -98,12 +98,12 @@ CalendarTab - + Events Eventos - + Own Calendar Calendario propio @@ -134,7 +134,7 @@ Nº Max. de noticias. - + Hide #nsfw? Ocultar #nsfw? @@ -246,96 +246,409 @@ ContactDetailsComponent - Connect - Conectar + Conectar - Description - Descripción + Descripción - Location - Localización + Localización - Posts - Mensajes + Mensajes - URL - URL + URL - Created at - Creado en + Creado en ContactPage + + + seconds + Segundos + + + + minute + Minuto + + + + minutes + Minutos + + + + hour + Hora + + + + hours + Horas + + + + day + Dia + + + + days + Dias + + + + month + Mes + + + + months + Meses + + + + years + Años + + + + likes this. + le gusta esto. + + + + like this. + me gusta esto. + + doesn't like this. + no de ése. + + + + don't like this. + no me gusta. + + + + will attend. + asistirá. + + + + persons will attend. + Personas que asistirán. + + + + will not attend. + no asistirá. + + + + persons will not attend. + Personas que no asistirán. + + + + may attend. + Puede asistir. + + + + persons may attend. + Personas que pueden asistir. + + + Connect Conectar - + + Approve + Aprobar + + + + Reject + Rechazar + + + + Ignore + Ignorar + + + Description Descripción - + Location Localización - + Posts Mensajes - + URL URL - + Created at Creado en + + + Network Error + Fallo de red + + + + Conversation + + + seconds + Segundos + + + + minute + Minuto + + + + minutes + Minutos + + + + hour + Hora + + + + hours + Horas + + + + day + Dia + + + + days + Dias + + + + month + Mes + + + + months + Meses + + + + years + Años + + + + likes this. + le gusta esto. + + + + like this. + me gusta esto. + + + + doesn't like this. + no de ése. + + + + don't like this. + no me gusta. + + + + will attend. + asistirá. + + + + persons will attend. + Personas que asistirán. + + + + will not attend. + no asistirá. + + + + persons will not attend. + Personas que no asistirán. + + + + may attend. + Puede asistir. + + + + persons may attend. + Personas que pueden asistir. + + + + DrawerAccountComponent + + + Refresh + Actualizar + + + + Timeline + Cronología + + + + Conversations + Conversaciones + + + + Replies + Respuestas + + + + Direct Messages + Mensaje directo + + + + Favorites + Favoritos + + + + Public Timeline + Cronología pública + + + + Group news + Grupos + + + + Search + Busca + + + + Notifications + Notificaciones + + + + DrawerAccountComponentContacts + + + Profile + Perfil + + + + Friends + Amigos + + + + Contacts + Contactos + + + + Groups + Grupos + EventList - + Location + Localización + + + + EventListItem + + Location Localización + + FriendsListTab + + + Friend Requests + Solicitudes de contacto + + + + Friends + Amigos + + FriendsTab - + Me Yo - + Friends Amigos - + Contacts Contactos - + Groups Grupos @@ -356,63 +669,86 @@ imagen - + Description Descripción - + Upload Subir - + Change Cambiar - + Error Error - + No album name given ¡Nombre del álbum no encontrado! + + LeftDrawerScrollview + + + Settings + Ajustes + + + + Accounts + Cuentas + + + + Quit + Salida + + MessageSend - + to: a: - + Title (optional) Título (opcional) - + + Drop your Content here. + Deje caer su contenido aquí. + + + What's on your mind? ¿Qué tienes en mente? - - + + Error Error - + Only one attachment supported at the moment. Remove other attachment first! Solo se admite adjuntar un solo archivo en este momento. ¡Elimine y deje un archivo adjunto! - + No receiver supplied! No se ha suministrado ningún receptor! @@ -420,7 +756,7 @@ MoreComments - + Show all comments todos comentarios @@ -428,12 +764,12 @@ NewsStack - + Network Error Fallo de red - + More Mas @@ -489,102 +825,102 @@ Salida - + seconds Segundos - + minute Minuto - + minutes Minutos - + hour Hora - + hours Horas - + day Dia - + days Dias - + month Mes - + months Meses - + years Años - + likes this. le gusta esto. - + like this. me gusta esto. - + doesn't like this. no de ése. - + don't like this. no me gusta. - + will attend. asistirá. - + persons will attend. Personas que asistirán. - + will not attend. no asistirá. - + persons will not attend. Personas que no asistirán. - + may attend. Puede asistir. - + persons may attend. Personas que pueden asistir. @@ -596,17 +932,17 @@ Asistiendo: - + Source: Fuente: - + Direct Message Mensaje directo - + In reply to En respuesta a @@ -620,62 +956,62 @@ asistencia - + ago hace - + Attending: Asistiendo: - + Reply Respuesta - + DM Mensaje directo - + Repost Volver a publicar - + Success! éxito! - + Conversation Conversación - + Attending Asistiendo - + yes si - + maybe quizás - + no no - + Delete Borrar @@ -701,23 +1037,23 @@ s Imágenes - + All Images Todas las imagenes - + Only new Solo nueva - - + + Own Images Mis imágenes - + More Mas @@ -732,215 +1068,215 @@ is default - + es por defecto hide friends - + ocultar amigos profile photo - + foto de perfil profile thumb - + foto de perfil pequeña publish - + publicar publish in network - + publicar en la red description - + descripción date of birth - + fecha de nacimiento address - + dirección city - + ciudad region - + región postal code - + código postal country - + país hometown - + ciudad natal gender - + género marital status - + estado civil married with - + casado con married since - + casado desde sexual - + orientación sexual politics - + política religion - + religión public keywords - + palabras clave públicas private keywords - + palabras clave privadas likes - + le gusta dislikes - + no le gusta about - + sobre music - + música book - + libro tv - + tv film - + película interest - + interés romance - + romance work - + trabajo education - + educación social networks - + redes sociales homepage - + página web - + Update - + Actualización - + profile id profile id - + Description Descripción - + Location Localización - + Posts Mensajes - + URL URL - + Created at Creado en @@ -948,22 +1284,22 @@ SmileyDialog - + Unicode Unicode - + Standard Standard - + Addon Addon - + Adult XXX @@ -997,59 +1333,48 @@ friendiqa - Refresh - Actualizar + Actualizar - Timeline - Cronología + Cronología - Conversations - Conversaciones + Conversaciones - Favorites - Favoritos + Favoritos - Replies - Respuestas + Respuestas - Public Timeline - Cronología pública + Cronología pública - Group news - Grupos + Grupos - Search - Busca + Busca - Settings - Ajustes + Ajustes - Accounts - Cuentas + Cuentas - Quit - Salida + Salida @@ -1161,22 +1486,16 @@ Error - - Changelog - - - - Setting view type of news has moved from account page to config page. - La configuración del tipo de vista de las noticias se ha movido de la página de la cuenta a la página de configuración. + La configuración del tipo de vista de las noticias se ha movido de la página de la cuenta a la página de configuración. - + Undefined Array Error - + JSON status Error diff --git a/source-linux/translations/friendiqa-hu.qm b/source-linux/translations/friendiqa-hu.qm new file mode 100644 index 0000000000000000000000000000000000000000..8045dabf315733671fdd7c17516fdf94bb133976 GIT binary patch literal 15758 zcmcIr36LD+b$;5NduI=gR;$&)s)axoVi8z!5t&050txL(XeB|oLhnrPZfj?{hwh$T zR<;4#P}o5(Y$y{bWC|N&E*s-ec0n-44&ro-sgR^hhywycp-KoQ8|1{scE0!jGd

  • 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 literal 0 HcmV?d00001 diff --git a/source-linux/translations/friendiqa-hu.ts b/source-linux/translations/friendiqa-hu.ts new file mode 100644 index 0000000..a1a88a0 --- /dev/null +++ b/source-linux/translations/friendiqa-hu.ts @@ -0,0 +1,1534 @@ + + + + + AccountPage + + + + + User + Felhasználó + + + + Server + Kiszolgáló + + + + Nickname + Becenév + + + + Password + Jelszó + + + + Image dir. + Képkönyvtár + + + News as + Hírek mint + + + + + + Error + Hiba + + + + Nicknames containing @ symbol currently not supported + A @ szimbólumot tartalmazó becenevek jelenleg nem támogatottak + + + + Confirm + Megerősítés + + + + No server given! + Nincs kiszolgáló megadva! + + + + No nickname given! + Nincs becenév megadva! + + + + No password given! + Nincs jelszó megadva! + + + + No image directory given! + Nincs képkönyvtár megadva! + + + + Wrong password! + Hibás jelszó! + + + + Success + Sikeres + + + + Name + Név + + + Timeline + Idővonal + + + Conversations + Beszélgetések + + + + CalendarTab + + + Events + Események + + + + Own Calendar + Saját naptár + + + + ConfigPage + + + News as + Hírek mint + + + + + + Conversations + Beszélgetések + + + + + Timeline + Idővonal + + + + Max. News + Legtöbb hír + + + + Hide #nsfw? + A #NSFW elrejtése? + + + + Sync + Szinkronizálás + + + + ConfigTab + + User + Felhasználó + + + Server + Kiszolgáló + + + Nickname + Becenév + + + Password + Jelszó + + + Image dir. + Képkönyvtár + + + Max. News + Legtöbb hír + + + News as + Hírek mint + + + Interval (0=None) + Időköz (0 = nincs) + + + Error + Hiba + + + Nickname not registered at given server! + A becenév nincs regisztrálva a megadott kiszolgálón! + + + Confirm + Megerősítés + + + No server given! + Nincs kiszolgáló megadva! + + + No nickname given! + Nincs becenév megadva! + + + Nickname not registered at given server! + A becenév nincs regisztrálva a megadott kiszolgálón! + + + No username given! + Nincs felhasználónév megadva! + + + Sync Interval (0=None) + Szinkronizálási időköz (0 = nincs) + + + Nicknames containing @ symbol currently not supported + A @ szimbólumot tartalmazó becenevek jelenleg nem támogatottak + + + Min. + Legkisebb + + + No password given! + Nincs jelszó megadva! + + + No image directory given! + Nincs képkönyvtár megadva! + + + No maximum news number given! + Nincs legtöbb hír szám megadva! + + + Wrong password! + Hibás jelszó! + + + Success + Sikeres + + + Name + Név + + + Timeline + Idővonal + + + Conversations + Beszélgetések + + + + ContactComponent + + + Connect + Kapcsolódás + + + + ContactDetailsComponent + + Connect + Kapcsolódás + + + Description + Leírás + + + Location + Hely + + + Posts + Bejegyzések + + + URL + URL + + + Created at + Létrehozva + + + + ContactPage + + + seconds + másodperc + + + + minute + perc + + + + minutes + perc + + + + hour + óra + + + + hours + óra + + + + day + nap + + + + days + nap + + + + month + hónap + + + + months + hónap + + + + years + év + + + + likes this. + kedveli ezt. + + + + like this. + kedveli ezt. + + + + doesn't like this. + nem kedveli ezt. + + + + don't like this. + nem kedveli ezt. + + + + will attend. + részt vesz. + + + + persons will attend. + személy részt vesz. + + + + will not attend. + nem vesz részt. + + + + persons will not attend. + személy nem vesz részt. + + + + may attend. + talán részt vesz. + + + + persons may attend. + személy talán részt vesz. + + + + Connect + Kapcsolódás + + + + Approve + Jóváhagyja + + + + Reject + Visszautasítás + + + + Ignore + Ne törődj a + + + + Description + Leírás + + + + Location + Hely + + + + Posts + Bejegyzések + + + + URL + URL + + + + Created at + Létrehozva + + + + Network Error + Hálózati hiba + + + + Conversation + + + seconds + másodperc + + + + minute + perc + + + + minutes + perc + + + + hour + óra + + + + hours + óra + + + + day + nap + + + + days + nap + + + + month + hónap + + + + months + hónap + + + + years + év + + + + likes this. + kedveli ezt. + + + + like this. + kedveli ezt. + + + + doesn't like this. + nem kedveli ezt. + + + + don't like this. + nem kedveli ezt. + + + + will attend. + részt vesz. + + + + persons will attend. + személy részt vesz. + + + + will not attend. + nem vesz részt. + + + + persons will not attend. + személy nem vesz részt. + + + + may attend. + talán részt vesz. + + + + persons may attend. + személy talán részt vesz. + + + + DrawerAccountComponent + + + Refresh + Frissítés + + + + Timeline + Idővonal + + + + Conversations + Beszélgetések + + + + Replies + Válaszok + + + + Direct Messages + Közvetlen üzenetek + + + + Favorites + Kedvencek + + + + Public Timeline + Nyilvános idővonal + + + + Group news + Csoporthírek + + + + Search + Keresés + + + + Notifications + Értesítések + + + + DrawerAccountComponentContacts + + + Profile + Profil + + + + Friends + Ismerősök + + + + Contacts + Partnerek + + + + Groups + Csoportok + + + + EventList + + Location + Hely + + + + EventListItem + + + Location + Hely + + + + FriendsListTab + + + Friend Requests + Barátkérések + + + + Friends + Ismerősök + + + + FriendsTab + + + Me + Én + + + + Friends + Ismerősök + + + + Contacts + Partnerek + + + + Groups + Csoportok + + + + GroupComponent + + Error + Hiba + + + No name given + Nincs név megadva + + + + ImageUploadDialog + + + Upload to album + Feltöltés albumba + + + Album + Album + + + Image + Kép + + + + Description + Leírás + + + + Upload + Feltöltés + + + + Change + Változtatás + + + + Error + Hiba + + + + No album name given + Nincs albumnév megadva + + + + LeftDrawerScrollview + + + Settings + Beállítások + + + + Accounts + Fiókok + + + + Quit + Kilépés + + + + MessageSend + + + to: + címzett: + + + + Title (optional) + Cím (elhagyható) + + + + Drop your Content here. + Tegye le itt a Tartalmát. + + + + What's on your mind? + Mire gondol? + + + + + Error + Hiba + + + + Only one attachment supported at the moment. + Remove other attachment first! + Csak egyetlen melléklet támogatott jelenleg. + Először távolítsa el a másik mellékletet. + + + + No receiver supplied! + Nincs fogadó megadva! + + + + MoreComments + + + Show all comments + Összes hozzászólás megjelenítése + + + + NewsStack + + + Network Error + Hálózati hiba + + + + More + Több + + + + NewsTab + + Download profile image for + Profilkép letöltése ennél: + + + More + Több + + + Timeline + Idővonal + + + Error + Hiba + + + Favorites + Kedvencek + + + Conversations + Beszélgetések + + + Network Error + Hálózati hiba + + + Replies + Válaszok + + + Public timeline + Nyilvános idővonal + + + Direct Messages + Közvetlen üzenetek + + + Notifications + Értesítések + + + Group news + Csoporthírek + + + Quit + Kilépés + + + + seconds + másodperc + + + + minute + perc + + + + minutes + perc + + + + hour + óra + + + + hours + óra + + + + day + nap + + + + days + nap + + + + month + hónap + + + + months + hónap + + + + years + év + + + + likes this. + kedveli ezt. + + + + like this. + kedveli ezt. + + + + doesn't like this. + nem kedveli ezt. + + + + don't like this. + nem kedveli ezt. + + + + will attend. + részt vesz. + + + + persons will attend. + személy részt vesz. + + + + will not attend. + nem vesz részt. + + + + persons will not attend. + személy nem vesz részt. + + + + may attend. + talán részt vesz. + + + + persons may attend. + személy talán részt vesz. + + + + Newsitem + + attending: + részvétel: + + + + Source: + Forrás: + + + + Direct Message + Közvetlen üzenet + + + + In reply to + Válaszul erre: + + + comments + hozzászólás + + + + attending + részvétel + + + + ago + óta + + + + Attending: + Részvétel: + + + + Reply + Válasz + + + + DM + DM + + + + Repost + Újraküldés + + + + Success! + Sikeres! + + + + Conversation + Beszélgetés + + + + Attending + Részvétel + + + + yes + igen + + + + maybe + talán + + + + no + nem + + + + Delete + Törlés + + + + PermissionDialog + + + Friends + Ismerősök + + + + Groups + Csoportok + + + + PhotoTab + + + 's images + képei + + + + All Images + Összes kép + + + + Only new + Csak újak + + + + + Own Images + Saját képek + + + + More + Több + + + + ProfileComponent + + + profile name + profilnév + + + + is default + alapértelmezett + + + + hide friends + ismerősök elrejtése + + + + profile photo + profilfénykép + + + + profile thumb + profilbélyegkép + + + + publish + közzététel + + + + publish in network + közzététel hálózaton + + + + description + leírás + + + + date of birth + születési dátum + + + + address + cím + + + + city + település + + + + region + régió + + + + postal code + irányítószám + + + + country + ország + + + + hometown + szülőváros + + + + gender + nem + + + + marital status + családi állapot + + + + married with + házas vele + + + + married since + házas ekkortól + + + + sexual + szexuális + + + + politics + politika + + + + religion + vallás + + + + public keywords + nyilvános kulcsszavak + + + + private keywords + személyes kulcsszavak + + + + likes + kedvelések + + + + dislikes + nem kedvelések + + + + about + névjegy + + + + music + zene + + + + book + könyv + + + + tv + TV + + + + film + film + + + + interest + érdeklődés + + + + romance + romantika + + + + work + munka + + + + education + oktatás + + + + social networks + közösségi hálózatok + + + + homepage + honlap + + + + Update + Frissítés + + + + profile id + profilazonosító + + + + Description + Leírás + + + + Location + Hely + + + + Posts + Bejegyzések + + + + URL + URL + + + + Created at + Létrehozva + + + + SmileyDialog + + + Unicode + Unicode + + + + Standard + Szabványos + + + + Addon + Bővítmény + + + + Adult + Felnőtt + + + + SyncComponent + + + sync + szinkronizálás + + + + notify + értesítés + + + + SyncConfig + + + Sync Interval (0=None) + Szinkronizálási időköz (0 = nincs) + + + + Min. + Legkisebb + + + + friendiqa + + Refresh + Frissítés + + + Timeline + Idővonal + + + Conversations + Beszélgetések + + + Favorites + Kedvencek + + + Replies + Válaszok + + + Public Timeline + Nyilvános idővonal + + + Group news + Csoporthírek + + + Search + Keresés + + + Settings + Beállítások + + + Accounts + Fiókok + + + Quit + Kilépés + + + + newsworker + + likes this. + kedveli ezt. + + + like this. + kedveli ezt. + + + doesn't like this. + nem kedveli ezt. + + + don't like this. + nem kedveli ezt. + + + will attend. + részt vesz. + + + persons will attend. + személy részt vesz. + + + will not attend. + nem vesz részt. + + + persons will not attend. + személy nem vesz részt. + + + may attend. + talán részt vesz. + + + persons may attend. + személy talán részt vesz. + + + + yes + igen + + + + no + nem + + + + maybe + talán + + + seconds + másodperc + + + ago + óta + + + minute + perc + + + minutes + perc + + + hour + óra + + + hours + óra + + + day + nap + + + days + nap + + + month + hónap + + + months + hónap + + + + service + + Error + Hiba + + + Changelog + Változásnapló + + + Setting view type of news has moved from account page to config page. + A hírek nézettípusának beállítása át lett helyezve a fiókoldalról a beállítási oldalra. + + + + Undefined Array Error + Meghatározatlan tömbhiba + + + + JSON status Error + JSON-állapothiba + + + diff --git a/source-linux/translations/friendiqa-it.qm b/source-linux/translations/friendiqa-it.qm index eca65731c8315da0d3ae8932da533fb81481f01e..b61cd3cd47c02c032f172e119aa94a1418a3abe1 100644 GIT binary patch literal 15773 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 delta 1821 zcmaJ<4{Q^46#i)M+Pkh@VIBL|vR(Nj3~-ysKw+DM!2rR5Ab&C$p|rQIq`Q{&HV}jY zg9v5>l7k3g5J84+{8JZkhzlSaj70{7pcq66YJ!1;O+aD<=DQxz;*7c6efQq){oeQ9 z_uj4*)lmZ!(DR6w|)12(S%gzHX&^%z36`&Sg@jA9Jgd1c=|w{OS+U zNP`+Cg)OYXb{a??#2UK?&jU(<$Btd{A^GpHHC6jaky-5a0}}1Q z1r7P!r+8Vz5#4Q;y?Ql1Tlj`37**!G7} zKT9Ek3C6w|vuWm2j6>Is11xFA{Q1;bpF_sN;(MgTi^e%ez9Wg>G_Jfs9rk``Y&u2~ zI-OjR`E%;Lgj1a9v~1~I!%sgG@lNhY2hH9%MnmqThRGhTxu%VH+PSlt3c~2u&7GSb zOGIVdZ#Tn~U?p!K98aAm@b-6AA`kzX_X#Cht0DJD!SjW&PKovOhDghwn~ib`M{A)`%WHch++~d|i$ND&nxx6+21^TC|hf= zv5HEV<_pP30*wFuhrSZ|2Q@xbAPN#`4t?-GG$G60#Sj}Uj%|j{AN1I(K z3_9@ZkCg;Ft^S*spv^mQ0jJeG5Oz;`!OVPnIELqWJQ_h-fl0FUvD1!?Uyb$3> z0A7yVFwn~vl({6Y=nr^}WEn$ZMU~GjDx-5VX{+!A(=Zr5lp{#DLXauTaG`jF{zwjqvZ?pgylT!{^r}o=SAXojzFxX2Jv~ty6yT1ODAQN?pIEh2x6C>I2m+a0KsWFhGCih>*v+ySZ7=Z%;d%Dmi(e*w)4?V$hw diff --git a/source-linux/translations/friendiqa-it.ts b/source-linux/translations/friendiqa-it.ts index 4cd39a1..0c14705 100644 --- a/source-linux/translations/friendiqa-it.ts +++ b/source-linux/translations/friendiqa-it.ts @@ -4,29 +4,29 @@ AccountPage - - - + + + User Utente - + Server Server - + Nickname Utente - + Password Password - + Image dir. Directory immagini @@ -35,54 +35,54 @@ News come - - - + + + Error Errore - + Nicknames containing @ symbol currently not supported I soprannomi contenenti il simbolo @ attualmente non sono supportati - + Confirm Conferma - + No server given! Nessun server inserito! - + No nickname given! Nessun utente inserito! - + No password given! Nessuna password inserita! - + No image directory given! Nessuna directory immagini inserita! - + Wrong password! Password sbagliata! - + Success Ha funzionato! - + Name Nome @@ -98,12 +98,12 @@ CalendarTab - + Events Eventi - + Own Calendar Calendario @@ -134,7 +134,7 @@ Nº Max. di notizie - + Hide #nsfw? Nascondere #nsfw? @@ -234,96 +234,409 @@ ContactDetailsComponent - Connect - Connetti + Connetti - Description - Descrizione + Descrizione - Location - Località + Località - Posts - Messaggi + Messaggi - URL - URL + URL - Created at - Creato il + Creato il ContactPage + + + seconds + secondi + + + + minute + minuti + + + + minutes + minuti + + + + hour + ora + + + + hours + ore + + + + day + giorno + + + + days + giorni + + + + month + mese + + + + months + mesi + + + + years + anni + + + + likes this. + mi piace. + + + + like this. + mi piace. + + doesn't like this. + non mi piace. + + + + don't like this. + non mi piace. + + + + will attend. + attendere. + + + + persons will attend. + Persone che attendono. + + + + will not attend. + non aspettare. + + + + persons will not attend. + Persone che non aspettano. + + + + may attend. + puoi attendere. + + + + persons may attend. + Persone che possono attendere. + + + Connect Connetti - + + Approve + Approvare + + + + Reject + Rifiutare + + + + Ignore + Ignorare + + + Description Descrizione - + Location Località - + Posts Messaggi - + URL URL - + Created at Creato il + + + Network Error + Errore di rete + + + + Conversation + + + seconds + secondi + + + + minute + minuti + + + + minutes + minuti + + + + hour + ora + + + + hours + ore + + + + day + giorno + + + + days + giorni + + + + month + mese + + + + months + mesi + + + + years + anni + + + + likes this. + mi piace. + + + + like this. + mi piace. + + + + doesn't like this. + non mi piace. + + + + don't like this. + non mi piace. + + + + will attend. + attendere. + + + + persons will attend. + Persone che attendono. + + + + will not attend. + non aspettare. + + + + persons will not attend. + Persone che non aspettano. + + + + may attend. + puoi attendere. + + + + persons may attend. + Persone che possono attendere. + + + + DrawerAccountComponent + + + Refresh + Aggiorna + + + + Timeline + Cronologia + + + + Conversations + Conversazioni + + + + Replies + Risposte + + + + Direct Messages + Messaggio diretto + + + + Favorites + Favoriti + + + + Public Timeline + Cronologia pubblica + + + + Group news + Notizie del gruppo + + + + Search + Cerca + + + + Notifications + Notifiche + + + + DrawerAccountComponentContacts + + + Profile + Profilo + + + + Friends + Amici + + + + Contacts + Contatti + + + + Groups + Gruppi + EventList - + Location + Località + + + + EventListItem + + Location Località + + FriendsListTab + + + Friend Requests + Richieste di contatto + + + + Friends + Amici + + FriendsTab - + Me Me - + Friends Amici - + Contacts Contatti - + Groups Gruppi @@ -344,63 +657,86 @@ Immagine - + Description Descrizione - + Upload Carica - + Change Modifica - + Error Errore - + No album name given Nessun nome album inserito! + + LeftDrawerScrollview + + + Settings + Configurazione + + + + Accounts + Conti + + + + Quit + Chiudi + + MessageSend - + to: a: - + Title (optional) Titolo (opzionale) - + + Drop your Content here. + Lascia qui il tuo contenuto. + + + What's on your mind? A cosa stai pensando? - - + + Error Errore - + Only one attachment supported at the moment. Remove other attachment first! Solo un allegato è attualmente supportato. Rimuovere prima gli altri allegati! - + No receiver supplied! Nessun ricevitore in dotazione! @@ -408,7 +744,7 @@ MoreComments - + Show all comments Tutti commenti @@ -416,12 +752,12 @@ NewsStack - + Network Error Errore di rete - + More Ancora @@ -465,102 +801,102 @@ Gruppi - + seconds secondi - + minute minuti - + minutes minuti - + hour ora - + hours ore - + day giorno - + days giorni - + month mese - + months mesi - + years anni - + likes this. mi piace. - + like this. mi piace. - + doesn't like this. non mi piace. - + don't like this. non mi piace. - + will attend. attendere. - + persons will attend. Persone che attendono. - + will not attend. non aspettare. - + persons will not attend. Persone che non aspettano. - + may attend. puoi attendere. - + persons may attend. Persone che possono attendere. @@ -572,17 +908,17 @@ attendere: - + Source: Codice: - + Direct Message Messaggio diretto - + In reply to In risposta a @@ -596,62 +932,62 @@ partecipare - + ago fa - + Attending: Attendi: - + Reply Risposta - + DM Messaggio diretto - + Repost Condividi - + Success! Ha funzionato! - + Conversation Conversazione - + Attending Attendi - + yes si - + maybe potrebbe - + no no - + Delete Cancella @@ -677,23 +1013,23 @@ Immagini - + All Images Tutte immagini - + Only new Solo nuovo - - + + Own Images Mie immagini - + More Ancora @@ -703,220 +1039,220 @@ profile name - + nome del profilo is default - + è predefinito hide friends - + nascondere gli amici profile photo - + foto del profilo profile thumb - + piccola foto di profilo publish - + pubblicare publish in network - + pubblicare in rete description - + descrizione date of birth - + data di nascita address - + indirizzo city - + città region - + regione postal code - + codice postale country - + paese hometown - + città natale gender - + genere marital status - + stato civile married with - + sposato con married since - + sposato da quando sexual - + orientamento sessuale politics - + politica religion - + religione public keywords - + parole chiave pubbliche private keywords - + parole chiave private likes - + ama dislikes - + non piace about - + su music - + musica book - + libro tv - + tv film - + film interest - + interesse romance - + romanticismo work - + lavoro education - + educazione social networks - + reti sociali homepage - + homepage - + Update - + Aggiornare - + profile id - + profilo id - + Description Descrizione - + Location Località - + Posts Messaggi - + URL URL - + Created at Creato il @@ -924,22 +1260,22 @@ SmileyDialog - + Unicode Unicode - + Standard Standard - + Addon Addon - + Adult XXX @@ -973,59 +1309,48 @@ friendiqa - Refresh - Aggiorna + Aggiorna - Timeline - Cronologia + Cronologia - Conversations - Conversazioni + Conversazioni - Favorites - Favoriti + Favoriti - Replies - Risposte + Risposte - Public Timeline - Cronologia pubblica + Cronologia pubblica - Group news - Notizie del gruppo + Notizie del gruppo - Search - Cerca + Cerca - Settings - Configurazione + Configurazione - Accounts - Conti + Conti - Quit - Chiudi + Chiudi @@ -1137,22 +1462,20 @@ Errore - Changelog - Changelog + Changelog - Setting view type of news has moved from account page to config page. - L'impostazione del tipo di visualizzazione delle notizie è stata spostata dalla pagina del conto alla pagina di configurazione. + L'impostazione del tipo di visualizzazione delle notizie è stata spostata dalla pagina del conto alla pagina di configurazione. - + Undefined Array Error - + JSON status Error From 8b587855172e6a5d515429744c8883d57f8293ca Mon Sep 17 00:00:00 2001 From: LubuWest Date: Tue, 18 May 2021 21:01:32 +0200 Subject: [PATCH 06/35] version v0.6 bugfixes --- source-android/android/gradle.properties | 3 + source-android/qml/friendiqa.qml | 4 +- source-linux/application.qrc | 2 + source-linux/common/updatenews.cpp | 12 ++-- source-linux/js/newsworker.js | 4 +- .../qml/configqml/LeftDrawerScrollview.qml | 8 +-- .../qml/genericqml/ContactComponent.qml | 2 +- source-linux/qml/newsqml/MessageSend.qml | 10 ++-- source-linux/qml/newsqml/NewsImage.qml | 2 +- source-linux/qml/newsqml/NewsTab.qml | 56 +----------------- source-linux/qml/newsqml/Newsitem.qml | 2 +- source-linux/translations/friendiqa-hu.qm | Bin 15758 -> 15746 bytes source-linux/translations/friendiqa-hu.ts | 6 +- 13 files changed, 36 insertions(+), 75 deletions(-) diff --git a/source-android/android/gradle.properties b/source-android/android/gradle.properties index 82755ae..bedc041 100644 --- a/source-android/android/gradle.properties +++ b/source-android/android/gradle.properties @@ -1,4 +1,7 @@ +# androidBuildToolsVersion=25.0.3 +# androidCompileSdkVersion=26 buildDir=.build +# qt5AndroidDir=/home/pankraz/Qt/5.11.1/android_armv7/src/android/java android.useAndroidX=true android.enableJetifier=true android.enforceUniquePackageName=false diff --git a/source-android/qml/friendiqa.qml b/source-android/qml/friendiqa.qml index 41558a7..5bea20f 100644 --- a/source-android/qml/friendiqa.qml +++ b/source-android/qml/friendiqa.qml @@ -256,8 +256,8 @@ ApplicationWindow{ Loader{ id: newstab - Layout.fillWidth:true - Layout.fillHeight: true +// Layout.fillWidth:true +// Layout.fillHeight: true property string newstabstatus property var conversation:[] diff --git a/source-linux/application.qrc b/source-linux/application.qrc index 091eb8a..3e62eeb 100644 --- a/source-linux/application.qrc +++ b/source-linux/application.qrc @@ -247,5 +247,7 @@ qml/contactqml/ContactsListTab.qml qml/contactqml/GroupsListTab.qml qml/calendarqml/EventListItem.qml + translations/friendiqa-hu.qm + translations/friendiqa-hu.ts diff --git a/source-linux/common/updatenews.cpp b/source-linux/common/updatenews.cpp index 77d607a..5da6b54 100644 --- a/source-linux/common/updatenews.cpp +++ b/source-linux/common/updatenews.cpp @@ -135,7 +135,7 @@ void UPDATENEWS::login() } void UPDATENEWS::startsync() -{ qDebug()<<"Friendiqa start syncing "<0){ - qDebug() << "start Friendrequests imagedownload"; + //qDebug() << "start Friendrequests imagedownload"; startImagedownload("friendrequests"); + }else{ + if(m_updateInterval!=0){ + syncindex+=1; + startsync(); + } } } } diff --git a/source-linux/js/newsworker.js b/source-linux/js/newsworker.js index 4e4558d..21f5a25 100644 --- a/source-linux/js/newsworker.js +++ b/source-linux/js/newsworker.js @@ -72,11 +72,13 @@ function beautify(newsitemobject,msg){ else if (attachArray[image].mimetype=="image/png"){attachhelper.url=attachhelper.url+".png"} } else {attachhelper.url=attachArray[image].url} - imageAttachmentList.push(attachhelper) + //print("Attachhelper "+attachhelper.url) newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(attachhelper.url,"") newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(attachhelper.url.substring(0,attachhelper.url.length-4)+".jpeg","") newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(attachhelper.url.substring(0,attachhelper.url.length-4),"") + + imageAttachmentList.push(attachhelper) } } }catch(e){print("attachment "+e)} diff --git a/source-linux/qml/configqml/LeftDrawerScrollview.qml b/source-linux/qml/configqml/LeftDrawerScrollview.qml index f7f0f62..8a11dce 100644 --- a/source-linux/qml/configqml/LeftDrawerScrollview.qml +++ b/source-linux/qml/configqml/LeftDrawerScrollview.qml @@ -92,20 +92,20 @@ ScrollView{ Component.onCompleted:{ Service.readAllLogins(db,function(accounts){ if (accounts.length>0 && bar.currentIndex==0){ - leftDrawerColumn.height=4.5*root.fontFactor*osSettings.bigFontSize+accounts.length*13*root.fontFactor*osSettings.bigFontSize + leftDrawerColumn.height=4.5*root.fontFactor*osSettings.bigFontSize+accounts.length*17*root.fontFactor*osSettings.bigFontSize for(var i = 0; i < accounts.length; i++) { var accountComponent = Qt.createComponent("qrc:/qml/genericqml/DrawerAccountComponent.qml"); var accountQml = accountComponent.createObject(leftDrawerColumn,{ - "y":4.5*root.fontFactor*osSettings.bigFontSize+i*13*root.fontFactor*osSettings.bigFontSize, + "y":4.5*root.fontFactor*osSettings.bigFontSize+i*17*root.fontFactor*osSettings.bigFontSize, "currentnewstabstatus":currentnewstabstatus, "account":accounts[i]}); } }else if(accounts.length>0 && bar.currentIndex==1){ - leftDrawerColumn.height=4.5*root.fontFactor*osSettings.bigFontSize+accounts.length*6.5*root.fontFactor*osSettings.bigFontSize + leftDrawerColumn.height=4.5*root.fontFactor*osSettings.bigFontSize+accounts.length*8*root.fontFactor*osSettings.bigFontSize for(var i = 0; i < accounts.length; i++) { var accountComponent = Qt.createComponent("qrc:/qml/genericqml/DrawerAccountComponentContacts.qml"); var accountQml = accountComponent.createObject(leftDrawerColumn,{ - "y":4.5*root.fontFactor*osSettings.bigFontSize+i*6.5*root.fontFactor*osSettings.bigFontSize, + "y":4.5*root.fontFactor*osSettings.bigFontSize+i*8*root.fontFactor*osSettings.bigFontSize, "account":accounts[i]}); } } diff --git a/source-linux/qml/genericqml/ContactComponent.qml b/source-linux/qml/genericqml/ContactComponent.qml index e652156..9688b1a 100644 --- a/source-linux/qml/genericqml/ContactComponent.qml +++ b/source-linux/qml/genericqml/ContactComponent.qml @@ -35,7 +35,7 @@ import "qrc:/qml/genericqml" Item { id: contactComponent - height: 5*root.fontFactor*osSettings.systemFontSize//8*mm + height: 4.5*root.fontFactor*osSettings.systemFontSize//8*mm width: contactComponent.ListView.view.width//parent.width property var createdAtDate: new Date(contact.created_at) property string connectUrl: (contact.network!=="dfrn")||(contact.isFriend==1)?"":( ""+qsTr("Connect")+"
    ") diff --git a/source-linux/qml/newsqml/MessageSend.qml b/source-linux/qml/newsqml/MessageSend.qml index 1cd98bb..d72f109 100644 --- a/source-linux/qml/newsqml/MessageSend.qml +++ b/source-linux/qml/newsqml/MessageSend.qml @@ -132,12 +132,12 @@ Rectangle{ //print("Newsobject "+newsitemobject.id+ " "+JSON.stringify(newsitemobject.user)); if (newsitemobject!=""){ messageSend.state="conversation" - reply_to_user=newsitemobject.user.screen_name; - parentId=newsitemobject.id + messageSend.reply_to_user=newsitemobject.user.screen_name; + messageSend.parentId=newsitemobject.id } else { - messageSend.state=null; - reply_to_user=""; - parentId=""; + //messageSend.state=null; + messageSend.reply_to_user=""; + messageSend.parentId=""; bodyField.text=""; attachImageURLs.pop(); imageAttachment.source="" diff --git a/source-linux/qml/newsqml/NewsImage.qml b/source-linux/qml/newsqml/NewsImage.qml index e754d57..9527959 100644 --- a/source-linux/qml/newsqml/NewsImage.qml +++ b/source-linux/qml/newsqml/NewsImage.qml @@ -34,7 +34,7 @@ AnimatedImage {id:gif; width:toprow.width; //property string mimetype:"" fillMode: Image.PreserveAspectFit; - onStatusChanged: playing = (status == AnimatedImage.Ready) + onStatusChanged: {playing = (status == AnimatedImage.Ready)} Rectangle{ visible: (model.newsitemobject.imageAttachmentList.length>1)&&(gif.status==Image.Ready) opacity: 0.5 diff --git a/source-linux/qml/newsqml/NewsTab.qml b/source-linux/qml/newsqml/NewsTab.qml index f7b4cb6..7257bfe 100644 --- a/source-linux/qml/newsqml/NewsTab.qml +++ b/source-linux/qml/newsqml/NewsTab.qml @@ -39,11 +39,9 @@ import "qrc:/js/service.js" as Service Rectangle{ id:newstabitem - width:rootstack.width//-5*mm - height: rootstack.height-8*mm//rootstack.height-100*mm + width:rootstack.width + height: rootstack.height-8*mm - //anchors.fill: parent - //onHeightChanged: {newsSwipeview.height=height-5*mm} Timer {id:contacttimer; interval: 50; running: false; repeat: false onTriggered: { root.newContacts=Newsjs.findNewContacts(root.news,root.contactlist); @@ -155,63 +153,15 @@ Rectangle{ LeftDrawerAndroid{ id: leftDrawerAndroid } -// BlueButton{ -// z:2 -// anchors.left: newsSwipeview.left -// anchors.verticalCenter: newsSwipeview.verticalCenter//anchors.bottom: newsSwipeview.bottom -// anchors.margins: mm -// visible: wideScreen && newsSwipeview.currentIndex!=0 -// text:"\uf053" -// fontColor:"grey" -// border.color: "transparent" -// color:"transparent" -// radius:0 -// onClicked: {newsSwipeview.currentIndex=newsSwipeview.currentIndex-1} -// } - -// BlueButton{ -// z:2 -// anchors.right: newsSwipeview.right -// anchors.verticalCenter: newsSwipeview.verticalCenter//anchors.bottom: newsSwipeview.bottom -// anchors.margins: mm -// visible: wideScreen && newsSwipeview.currentIndex!=3 -// text:"\uf054" -// fontColor:"grey" -// border.color: "transparent" -// color:"transparent" -// radius:0 -// onClicked: {newsSwipeview.currentIndex=newsSwipeview.currentIndex+1} -// } SwipeView{ id: newsSwipeview property string stacktype:"Home" currentIndex: 0 - width: wideScreen&&rootstackView.depth<2?newstabitem.width-leftDrawer.width-mm:newstabitem.width-mm//newstabitem.width/3*2:newstabitem.width + width: wideScreen&&rootstackView.depth<2?newstabitem.width-leftDrawer.width:newstabitem.width//newstabitem.width/3*2:newstabitem.width height: newstabitem.height-4*mm x: leftDrawer.width function onDirectMessage(friend){currentIndex=2} -// transitions: Transition { -// PropertyAnimation { properties: "height"; -// easing.type: Easing.InOutQuad -// duration: 1000 -// } -// } - - -// Label{ -// text:"\uf0c9 " -// font.pixelSize: 5* mm -// anchors.left: parent.left -// anchors.margins: mm -// color: "#B0BEC5" -// MouseArea{ -// anchors.fill: parent -// onClicked:{ -// leftDrawer.open() -// } -// } -// } onCurrentIndexChanged: { switch(currentIndex){ diff --git a/source-linux/qml/newsqml/Newsitem.qml b/source-linux/qml/newsqml/Newsitem.qml index 3ae3431..a7c4c9f 100644 --- a/source-linux/qml/newsqml/Newsitem.qml +++ b/source-linux/qml/newsqml/Newsitem.qml @@ -74,7 +74,7 @@ Item { id:toprow //newscolumn width: newsitemobject.hasOwnProperty("indent")?newsitem.width-(newsitem.width/20 *(newsitemobject.indent+1)):newsitem.width//-8*mm x:newsitemobject.hasOwnProperty("indent")?newsitem.width/20*(newsitemobject.indent):0 - height: newsitemobject.nsfw?5*mm:Math.min(itemHeader.height+itemBody.height,3/4*root.height) + height: newsitemobject.nsfw?5*mm:Math.min(implicitHeight,3/4*root.height) clip: true Item{id:itemHeader height: Math.max(profileImage.height+mm,topFlow.implicitHeight+mm) diff --git a/source-linux/translations/friendiqa-hu.qm b/source-linux/translations/friendiqa-hu.qm index 8045dabf315733671fdd7c17516fdf94bb133976..a9599bd9d858317406d06c46009aa81806878f6f 100644 GIT binary patch delta 1815 zcmXYxdr*{R6viLe{l0JSyRdQ(SXj9upnzk7j^>DnB4&xq8YOufm_ zL>$S?OL8l<9ThZZG(pr-DXS50p=OFUsd<~Cv?v4Yb zbRcjQpyUD3a|F}BBKHHSp@72)Xl@I}B?5DQ0irGeC946gRnX)u81@rT9uI^b1>DDY zUZr4q7o<@pAnj*JSu26CIfCw(&5*Jw0F98U)Ijh?NPETratNf8-vDY0a}bcw0{Job=`@0-UcvB#Q2NeI`xwe^6qTBd%!Eg9Lw58J z;Ma2(SlAsDn?FvN{%B_29bDj54a3Ob&rBSy@vX#?UmV!pGQ z0)_~hqXome;qsy*gBHWJmJUP@@1q+?uRz)CdO%+#Xjvr~5s9*s4}hf2aJTS4W0#=s zML~NWwks}1oQeh~1*Ge7J?j~eG8%UiDLiG3*Sl|R2a>0F5B4pjvnua~+HJs4m3O=A z2%yq-?!H5fL=@j?r3k5Ctg0?4WYwiQUI!zt8kHSJ9sx#cGPF{Fiy`_Q| z2U*q4i97i{QGII1Bp%!-=uI{)o1e0QOH&Gt$WOny;DIk?lEF=IpYZQqRbePRp4^QQWXV&fJqkHp-4= zocH@jFyM-O;*%K^uuwkp0_TmDg1%LPc1gaJ!;2Go6xB=B3?NDIOX58PYLxipqk-r2 z%BWW;MDI=(151pc?X;5Rc)*E6f|mV)5xGkK?k={ELwUQKsnHb*nx_cb6s5A8-81-t zvfeDwL7lRpa}iV0t_0H#o<4f%kAwJn0CM#1oT+T6KM+5gJw{sDrf3dWXe3(vp9YR}frthhnt+1gSr zMEn!&dv3mpnrOkWb=oy;JUFmP`}t8u7VOX-oJATfg1%)(?_9w) z>@_5Jxvwxnvth)fy_{$^W7Gn+Uye~S zvzn9l8b?0dLP58U#aUx`;69_vGm-(87}vIOz5jT@fNg?-0fNyU^Y8>K13O@LWHg#+ z*?6;~kG}sivctS>42uUpn!og?V(lD3(=@?wTQMtWujhNYM^;^htNO6BzDr)?<4tbP`8T!tbn?EiJ56h)q>$l{Ry07n$kk^lez delta 1827 zcmXYxdr*{R6viLe{l0JS3oKVRuB!;La#3(hkx(0OFku{#2*gBG24=O9r7P*G$)G{0 zFd2@>n23U!VmmsJ;wAB3N>MX1R*Dw}r;8eim8m`O_6PfWKi=DOo^#H-uHxg0%{EsO zAn`A-22iqq$TGpC6Xa1~Vl(p^ZYCLr+^q_j#Pq)gB?b}yt^6o7q@YSh4}9gx~)0>>(I>4$APki94b6S2M6|B*#303v%Ab z0DdQtzJDPns*rv>kvxf4wk@WxX@WuZg4SxhTI!}FPQj?ZkbC|`IueB9tzAHL6W(yt zQNUzDvt2OsS2#WB$oNV)H_?H}v|+k{q|GQ_+5+fn1-)tn!(&l?aS({z3s*Z2G~N*O z=@Yc&qe*cx;+N3spn#+R+)jHA#LvNfJB7z@^H}>%6A-u1Gr^~T&T2hd>vsW@%${eR zrvR14^Y&_2JuP*6{xY0XX})TD;t#;+Dpgvh53Rqf%DUwS0v4)%TCo%GY*pRQ_<-xo zf)>5%sU`(5ECuSoBNP?_^;DOtn-_kkZd}ic zgM!ot?9KenRbSej$%ESjy$=dTB&)wZ%Y)T*>MJ=t6w;?2U|qu2uD<7R0{+_t1Lq4y zK2<-o5=yx;s2c?>~$T8_s{r(la;9tQ2yI|BAY5N8`>$gT~Xkam_K9deq zbG`ksbgqQ~MlX}jCzUhc%P#3b^?c^oSGHwXc=0_szJ-y+_R7hHW4K|JoZJ>m9+mS} zbKc)mFyM}SVaFm0SS??f!Fl5rL7!Sdo45R91}~0zq^RcAF@PzGUo7wOZBWLon-07X zprkIK5WOo&47|n*hV?3Gd4rrdE$DSzF#I(o=TI-(XPL6do*?7 zd~AXfH2ZGfp=HZ8hpw;RGzI} z&V`6kX{%gcF!y%BkOu8XT|7AOuy)UBMmB1Z_RA%t(O=NVPcWiU=YQl0ovG3->E^3Q z$xCN5KzYkBsZ=rP9Ql8<4J&l(KOfD9XHeJCz!a#i>yB;8=7TX=*LC4B9}JVOYk;(^ z(W5n%DS9aA^_yULrCtgxVplZj7ukAPGm-lGv%gdL2K~0H4_Pa2{kaJgYz;Nonm?eE z9)`GH*Uya5YM7RJm=o=Wtma3|alGO6+*}snV#6^HCnLLNxH*b~d@~JqQ&+P6GK`X$ z)g0GpO!>2sf`*JGX*1c^$Ba&Q3Ii-PZtCKC|180P7Qw(^!N`;5DKQoXcE+4Hb)Sir zWtsDa>GMA$dd$0KvUu>l`Jg`)YaN270>Myw2`i}6{jGdYR+XZ#uG4rez#o}diZGO8 z2xT5~u>__3Ds=BL&9WpUa+uBOV!S)D$T9L;!o}soi$-P(QO2)AIItXj?x2Vg>wo@E B(is2% diff --git a/source-linux/translations/friendiqa-hu.ts b/source-linux/translations/friendiqa-hu.ts index a1a88a0..6afd3d0 100644 --- a/source-linux/translations/friendiqa-hu.ts +++ b/source-linux/translations/friendiqa-hu.ts @@ -396,7 +396,7 @@ Approve - Jóváhagyja + Jóváhagyás @@ -406,7 +406,7 @@ Ignore - Ne törődj a + Mellőzés @@ -754,7 +754,7 @@ Drop your Content here. - Tegye le itt a Tartalmát. + Ejtse ide a tartalmat. From 8d388af6b9714b9d326ed31d813b34a0b59be576 Mon Sep 17 00:00:00 2001 From: LubuWest Date: Wed, 19 May 2021 21:29:26 +0200 Subject: [PATCH 07/35] version v0.6 changelog and Android drawer width --- CHANGELOG.md | 4 ++-- source-linux/qml/genericqml/LeftDrawerAndroid.qml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c119362..a7fec6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ## v0.6 -* New language: Hungarian +* New language: Hungarian thank to urbalasz (https://www.urbalazs.hu) * Multiple photos in post open in separate slideshow * Layout redesign * Adaptive sidebar @@ -154,4 +154,4 @@ # Translations -* German, Spanish \ No newline at end of file +* German, Spanish diff --git a/source-linux/qml/genericqml/LeftDrawerAndroid.qml b/source-linux/qml/genericqml/LeftDrawerAndroid.qml index cdcdea9..5545836 100644 --- a/source-linux/qml/genericqml/LeftDrawerAndroid.qml +++ b/source-linux/qml/genericqml/LeftDrawerAndroid.qml @@ -35,7 +35,7 @@ import "qrc:/qml/configqml" Drawer{ id: leftDrawer - width: root.fontFactor*osSettings.systemFontSize*10 + width: root.fontFactor*osSettings.systemFontSize*13 height: root.height LeftDrawerScrollview{} } From 30bc7df431e84db868166b59b68de2a72062a421 Mon Sep 17 00:00:00 2001 From: LubuWest Date: Tue, 25 May 2021 19:46:17 +0200 Subject: [PATCH 08/35] version v0.6.1 requestLegacyExternalStorage in AndroidManifest and changelog typo --- CHANGELOG.md | 6 +++++- source-android/android/AndroidManifest.xml | 4 ++-- source-linux/qml/configqml/InfoBox.qml | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7fec6c..92e7806 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ +## v0.6.1 +* Add requestLegacyExternalStorage in AndroidManifest for attachment permissions + + ## v0.6 -* New language: Hungarian thank to urbalasz (https://www.urbalazs.hu) +* New language: Hungarian thank to urbalazs (https://www.urbalazs.hu) * Multiple photos in post open in separate slideshow * Layout redesign * Adaptive sidebar diff --git a/source-android/android/AndroidManifest.xml b/source-android/android/AndroidManifest.xml index 67fcf88..0508782 100644 --- a/source-android/android/AndroidManifest.xml +++ b/source-android/android/AndroidManifest.xml @@ -1,5 +1,5 @@ - + package sources --> plus symbol --> paste url * [Google Playstore](https://play.google.com/store/apps/details?id=org.qtproject.friendiqa) * Arch User Repository: [https://aur.archlinux.org/packages/friendiqa/](https://aur.archlinux.org/packages/friendiqa/) - +* Flatpak: [https://friendiqa.ma-nic.de/friendiqa.flatpakref](https://friendiqa.ma-nic.de/friendiqa.flatpakref) ## License ## Pubished under the [GPL v3](http://gplv3.fsf.org) with the exception of the Openssl library, which is published under OpenSSL License. From 66e5c33b0071298b3692105725b7b195cec90e30 Mon Sep 17 00:00:00 2001 From: LubuWest Date: Thu, 28 Oct 2021 21:56:00 +0200 Subject: [PATCH 16/35] v0.6.3 Dark Mode --- CHANGELOG.md | 12 +- README.md | 262 ++++++------ source-android/android/AndroidManifest.xml | 2 +- source-android/qml/friendiqa.qml | 31 +- source-linux/application.qrc | 2 + source-linux/common/filesystem.cpp | 52 +++ source-linux/common/filesystem.h | 9 + source-linux/common/filesystemandroid.cpp | 45 ++ source-linux/common/friendiqa.cpp | 5 + .../images/de.ma-nic.Friendiqa.desktop | 2 +- source-linux/js/newsworker.js | 45 +- source-linux/js/service.js | 4 +- source-linux/qml/calendarqml/CalendarDay.qml | 3 +- source-linux/qml/calendarqml/CalendarTab.qml | 5 +- source-linux/qml/calendarqml/EventList.qml | 3 +- .../qml/calendarqml/EventListItem.qml | 6 +- source-linux/qml/configqml/AccountPage.qml | 203 ++++++--- .../qml/configqml/ConfigAppearancePage.qml | 220 ++++++++++ source-linux/qml/configqml/ConfigPage.qml | 174 +++----- .../qml/configqml/ConfigStartPage.qml | 82 ++++ source-linux/qml/configqml/InfoBox.qml | 4 +- source-linux/qml/configqml/SyncComponent.qml | 3 +- source-linux/qml/configqml/SyncConfig.qml | 34 +- .../qml/contactqml/FriendsListTab.qml | 8 +- source-linux/qml/contactqml/FriendsTab.qml | 3 +- .../qml/contactqml/GroupComponent.qml | 19 +- .../qml/contactqml/ProfileComponent.qml | 11 +- source-linux/qml/friendiqa.qml | 51 ++- source-linux/qml/genericqml/BlueButton.qml | 3 +- .../qml/genericqml/ContactComponent.qml | 11 +- .../qml/genericqml/ImagePickerLinux.qml | 2 + .../qml/genericqml/LeftDrawerLinux.qml | 4 +- source-linux/qml/genericqml/MButton.qml | 5 +- .../qml/genericqml/PermissionDialog.qml | 32 +- source-linux/qml/genericqml/Search.qml | 49 +-- source-linux/qml/newsqml/ContactPage.qml | 29 +- .../qml/newsqml/FriendicaActivities.qml | 79 ++-- source-linux/qml/newsqml/Hashtag.qml | 10 +- source-linux/qml/newsqml/MessageSend.qml | 7 +- source-linux/qml/newsqml/MoreComments.qml | 3 +- source-linux/qml/newsqml/NewsImage.qml | 4 +- source-linux/qml/newsqml/NewsPhotolist.qml | 27 +- source-linux/qml/newsqml/NewsStack.qml | 13 +- source-linux/qml/newsqml/NewsVideoLarge.qml | 28 +- source-linux/qml/newsqml/Newsitem.qml | 64 +-- source-linux/qml/newsqml/SmileyDialog.qml | 8 +- .../qml/photoqml/ImageUploadDialog.qml | 12 +- source-linux/qml/photoqml/PhotoTab.qml | 7 +- source-linux/translations/friendiqa-de.qm | Bin 16506 -> 17002 bytes source-linux/translations/friendiqa-de.ts | 285 +++---------- source-linux/translations/friendiqa-es.qm | Bin 16422 -> 16934 bytes source-linux/translations/friendiqa-es.ts | 390 ++++++++++-------- source-linux/translations/friendiqa-hu.qm | Bin 16273 -> 16803 bytes source-linux/translations/friendiqa-hu.ts | 390 ++++++++++-------- source-linux/translations/friendiqa-it.qm | Bin 16314 -> 16838 bytes source-linux/translations/friendiqa-it.ts | 390 ++++++++++-------- 56 files changed, 1869 insertions(+), 1283 deletions(-) create mode 100644 source-linux/qml/configqml/ConfigAppearancePage.qml create mode 100644 source-linux/qml/configqml/ConfigStartPage.qml diff --git a/CHANGELOG.md b/CHANGELOG.md index b74dda5..f390b9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,14 +1,24 @@ +## v0.6.3 + +* Dark theme +* Account Page: list of largest servers for server field +* Settings page: Tabs for different settings +* Conversation opens on short click on news item +* Linux: Option to Autostart on System start + ## v0.6.2 + * Follow and Unfollow contacts (Friendica 2021.07 required) * Linux: App stays in systemtray after close, syncs in background * bugfix for bulk image upload and download of public images * bugfix for conversations in timeline ## v0.6.1 + * Add requestLegacyExternalStorage in AndroidManifest for attachment permissions * Refresh timeline on start for Linux -* DropArea bugfix for Flatpak +* DropArea bugfix for Flatpak ## v0.6 diff --git a/README.md b/README.md index 52f037d..9cd1126 100644 --- a/README.md +++ b/README.md @@ -1,128 +1,134 @@ -## Friendiqa ## - -QML based client for the Friendica Social Network. - Tabs for news (incl. Direct Messages), friends, photos and events. - OS: currently Linux and Android (4.3 Jelly Bean, 5.1 for background sync). - Source code is a QtCreator project. - -## Screenshots ## - -![Newstab](Screenshots/NewsTab.jpg) -![Friendstab](Screenshots/FriendsTab.jpg) -![Photostab](Screenshots/PhotoTab.jpg) -![Eventstab](Screenshots/EventsTab.jpg) -![Configtab](Screenshots/ConfigTab.jpg) - - -## Features ## - -# News # -Currently supported: -* Shows Posts from friends, replies, Direct Messages and notifications (in swipe view), selected group, replies, favorited messages, public timeline -* Background sync with configurable interval of 15 min to 2h for active user for friends timeline, replies and DMs (Android 5.1 required) -* Android notifications or Dbus notification (Linux) for new items in friends timeline, replies and DMs -* Search for news -* Click on hashtag in newsitem starts search for news with that word -* Only first photo attachment in post is shown, click for more images and fullscreen image -* Click on video or youtube video shows video fullscreen -* For news containing urls ending with mp3, mp4, avi, webm, ogg or to a Peertube instance: media can be played in the app -* Open links in external browser -* Click on contact photo for contact details and last news -* Click on like text for additional contact info -* Deletion, Reposting, Answering of Posts -* Expand truncated news items -* Liking, disliking, favoriting -* Attending for event posts -* Update fetches new posts (up to last 50) since last in local DB -* More shows older posts from local DB -* Create new Message with images or direct messages, Contact/Group access rights (can be stored), smileys -* Send image from Android gallery -* Send text or urls from other apps to Friendiqa -* Native Android image dialog - -ToDo: -* Videos and other binary data as attachment (sending, not supported in API) -* More than one attachment -* Attachments for Direct messages (currently not supported in API) - - -# Friends # -Currently supported: -* Tabs for own profiles, friends, other contacts and groups -* Show profile(s) of user and change profile picture -* List of all known contacts with locally downloaded pictures -* Follow or unfoolow contacts -* Show follow requests; approve, deny, ignore requests -* Additional information, last messages and other functionality shown in news tab -* Show public and private pictures of contact (screenscraping of contact's website, works only with certain theme) -* Show public and private events of contact -* Show members of groups -* Open website of contact or connect page (for other contacts) -* Clean other contacts with no news - -ToDo: -* More information for contact from description page, possibly private information for friends - (needs API change) -* Groups: create, change, delete - (needs API change) - - -# Images # -Currently supported: -* Download public own images to local directory -* Upload public picture to album with descriptions, send from gallery -* Delete own pictures and albums on client and server -* Change name or album of existing picture -* Show albums in grid, show images in album in grid and fullscreen -* Show public albums and images of contacts -* Pinch to zoom, swipe to scroll - -ToDo: -* Upload private images - - -# Events # -Currently supported: -* Show own events -* Show public events of Friendica contacts -* List view of events of selected date -* Click on event to show details - -ToDo -* Create events (needs API) - - -# Config/Accounts # -Currently supported: -* Multiple accounts -* View mode for news (tree or timeline) -* Maximum news (deleted after use of Quit button) -* Sync home timeline, replies, DM, Events, friend requests; Notify yes/no -* Hide #nsfw - -ToDo -* OAuth? - - -# Other # -* on Linux: App stays in systemtray and syncs in background - -ToDo -* Video tab -* Translation -* Blingbling - - -# Translations # -* German, Spanish, Italian, Hungarian -* To contribute translations: Have a look at linux-sources/translations/friendiqa-de.ts and open it with an editor. It's an xml file. Change values and send me the file to thomasschmidt45 at gmx.net / do pull request. - -# Install # -* F-Droid binary repository: [https://www.ma-nic.de/fdroid/repo](https://www.ma-nic.de/fdroid/repo) or for those who get the "error getting index file" from F-Droid client due to outdated crypto libraries the url without encryption: [http://www.ma-nic.de/fdroid/repo](http://www.ma-nic.de/fdroid/repo) To include repo in Fdroid: Open config --> package sources --> plus symbol --> paste url -* [Google Playstore](https://play.google.com/store/apps/details?id=org.qtproject.friendiqa) -* Arch User Repository: [https://aur.archlinux.org/packages/friendiqa/](https://aur.archlinux.org/packages/friendiqa/) -* Flatpak: [https://friendiqa.ma-nic.de/friendiqa.flatpakref](https://friendiqa.ma-nic.de/friendiqa.flatpakref) - -## License ## -Pubished under the [GPL v3](http://gplv3.fsf.org) with the exception of the Openssl library, which is published under OpenSSL License. - +## Friendiqa + +QML based client for the Friendica Social Network. Tabs for news (incl. Direct Messages), friends, photos and events. OS: currently Linux and Android (4.3 Jelly Bean, 5.1 for background sync). Source code is a QtCreator project. + +## Screenshots + +![Newstab](Screenshots/NewsTab.jpg) ![Friendstab](Screenshots/FriendsTab.jpg) ![Photostab](Screenshots/PhotoTab.jpg) ![Eventstab](Screenshots/EventsTab.jpg) ![Configtab](Screenshots/ConfigTab.jpg) + +## Features + +# News + +Currently supported: + +* Shows Posts from friends, replies, Direct Messages and notifications (in swipe view), selected group, replies, favorited messages, public timeline +* Background sync with configurable interval of 15 min to 2h for active user for friends timeline, replies and DMs (Android 5.1 required) +* Android notifications or Dbus notification (Linux) for new items in friends timeline, replies and DMs +* Search for news +* Click on hashtag in newsitem starts search for news with that word +* Only first photo attachment in post is shown, click for more images and fullscreen image +* Click on video or youtube video shows video fullscreen +* For news containing urls ending with mp3, mp4, avi, webm, ogg or to a Peertube instance: media can be played in the app +* Open links in external browser +* Click on contact photo for contact details and last news +* Click on like text for additional contact info +* Click on post text opens conversation +* Deletion, Reposting, Answering of Posts +* Expand truncated news items +* Liking, disliking, favoriting +* Attending for event posts +* Update fetches new posts (up to last 50) since last in local DB +* More shows older posts from local DB +* Create new Message with images or direct messages, Contact/Group access rights (can be stored), smileys +* Send image from Android gallery +* Send text or urls from other apps to Friendiqa +* Native Android image dialog + +ToDo: + +* Videos and other binary data as attachment (sending, not supported in API) +* More than one attachment +* Attachments for Direct messages (currently not supported in API) + +# Friends + +Currently supported: + +* Tabs for own profiles, friends, other contacts and groups +* Show profile(s) of user and change profile picture +* List of all known contacts with locally downloaded pictures +* Follow or unfoolow contacts +* Show follow requests; approve, deny, ignore requests +* Additional information, last messages and other functionality shown in news tab +* Show public and private pictures of contact (screenscraping of contact's website, works only with certain theme) +* Show public and private events of contact +* Show members of groups +* Open website of contact or connect page (for other contacts) +* Clean other contacts with no news + +ToDo: + +* More information for contact from description page, possibly private information for friends (needs API change) +* Groups: create, change, delete (needs API change) + +# Images + +Currently supported: + +* Download public own images to local directory +* Upload public picture to album with descriptions, send from gallery +* Delete own pictures and albums on client and server +* Change name or album of existing picture +* Show albums in grid, show images in album in grid and fullscreen +* Show public albums and images of contacts +* Pinch to zoom, swipe to scroll + +ToDo: + +* Upload private images + +# Events + +Currently supported: + +* Show own events +* Show public events of Friendica contacts +* List view of events of selected date +* Click on event to show details + +ToDo + +* Create events (needs API) + +# Config/Accounts + +Currently supported: + +* Multiple accounts +* Dark Mode +* View mode for news (conversation tree or timeline) +* Maximum news (deleted after use of Quit button) +* Sync home timeline, replies, DM, Events, friend requests; Notify yes/no +* Hide #nsfw + +ToDo + +* OAuth? + +# Other + +* on Linux: App stays in systemtray and syncs in background +* Autostart minimized in systray possible + +ToDo + +* Video tab +* Translation +* Blingbling + +# Translations + +* German, Spanish, Italian, Hungarian +* To contribute translations: Have a look at linux-sources/translations/friendiqa-de.ts and open it with an editor. It's an xml file. Change values and send me the file to thomasschmidt45 at gmx.net / do pull request. + +# Install + +* F-Droid binary repository: or for those who get the "error getting index file" from F-Droid client due to outdated crypto libraries the url without encryption: To include repo in Fdroid: Open config --> package sources --> plus symbol --> paste url +* [Google Playstore](https://play.google.com/store/apps/details?id=org.qtproject.friendiqa) +* Arch User Repository: +* Flatpak: + +## License + +Pubished under the [GPL v3](http://gplv3.fsf.org) with the exception of the Openssl library, which is published under OpenSSL License. diff --git a/source-android/android/AndroidManifest.xml b/source-android/android/AndroidManifest.xml index a2cca92..ad2452f 100644 --- a/source-android/android/AndroidManifest.xml +++ b/source-android/android/AndroidManifest.xml @@ -1,5 +1,5 @@ - + @@ -22,7 +22,7 @@ android:logo="@drawable/friendiqa"> + android:label="Friendiqa" android:screenOrientation="unspecified" android:launchMode="singleTask" android:taskAffinity=""> diff --git a/source-android/friendiqa.pro b/source-android/friendiqa.pro index 40f7006..24663b3 100644 --- a/source-android/friendiqa.pro +++ b/source-android/friendiqa.pro @@ -13,7 +13,7 @@ TEMPLATE = app TARGET = friendiqa CONFIG += release -QT += qml quick gui widgets androidextras sql webview #webengine +QT += core core-private qml quick gui widgets sql androidextras #webengine webview include(androidnative.pri/androidnative.pri) @@ -64,6 +64,7 @@ HEADERS += \ common/alarm.h DISTFILES += \ + android/gradle.properties \ qml/calendarqml/*.qml \ android/AndroidManifest.xml \ android/gradle/wrapper/gradle-wrapper.jar \ @@ -72,6 +73,7 @@ DISTFILES += \ android/build.gradle \ android/gradle/wrapper/gradle-wrapper.properties \ android/gradlew.bat \ + qml/configqml/ConfigAppearancePage.qml \ translations/*.ts \ translations/*.qm \ qml/*.qml \ @@ -86,3 +88,6 @@ DISTFILES += \ ANDROID_EXTRA_LIBS = $$PWD/android/arm/libcrypto_1_1.so $$PWD/android/arm/libssl_1_1.so $$PWD/android/arm64/libcrypto_1_1.so $$PWD/android/arm64/libssl_1_1.so +#ANDROID_ABIS = arm64-v8a +#android: include(/home/pankraz/git/android_openssl/openssl.pri) +android: include(/home/pankraz/android-sdk/android_openssl/openssl.pri) diff --git a/source-android/qml/friendiqa.qml b/source-android/qml/friendiqa.qml index 3c1421e..2f4aabb 100644 --- a/source-android/qml/friendiqa.qml +++ b/source-android/qml/friendiqa.qml @@ -75,7 +75,7 @@ ApplicationWindow{ function onLoginChanged(login){ if(login==""){rootstackView.push("qrc:/qml/configqml/AccountPage.qml")} - else{//rootstackView.push(rootstack) + else{ if (login.newsViewType!="" || login.newsViewType!=null){newstab.newstabstatus=login.newsViewType;} Newsjs.getCurrentContacts(login,db,function(contacts){ contactlist=contacts})} @@ -117,7 +117,7 @@ ApplicationWindow{ } - function showContact(contact){ //print(JSON.stringify(contact)); + function showContact(contact){ rootstackView.push("qrc:/qml/newsqml/ContactPage.qml",{"contact": contact}) } @@ -182,7 +182,7 @@ ApplicationWindow{ footer:ToolBar{id:roottoolbar background: Rectangle{ anchors.fill: parent - color: Material.backgroundDimColor//"#EEEEEE"//"#F8F8F8" + color: Material.backgroundDimColor } TabBar { @@ -224,18 +224,6 @@ ApplicationWindow{ } } - // states: State { - // name: "fullscreen"; - // PropertyChanges { target: bar; height:0 } - // PropertyChanges { target: rootstack; height:parent.height } - // } - - // transitions: Transition { - // PropertyAnimation { properties: "height"; - // easing.type: Easing.InOutQuad - // duration: 1000 - // } - // } StackView{id:rootstackView width:root.width height: root.height @@ -250,6 +238,7 @@ ApplicationWindow{ property string newstabstatus property var conversation:[] source:(rootstack.currentIndex==0)? "qrc:/qml/newsqml/NewsTab.qml":"" + //onDoubleClicked:{newstypeSignal("refresh")} } Loader{ id: friendstab diff --git a/source-linux/CMakeLists.txt b/source-linux/CMakeLists.txt index 8276e56..880ef34 100644 --- a/source-linux/CMakeLists.txt +++ b/source-linux/CMakeLists.txt @@ -1,9 +1,3 @@ -# TEMPLATE = app -# TARGET = friendiqa -# CONFIG += release -# QT += qml quick gui widgets sql webview dbus webengine - - cmake_minimum_required(VERSION 3.1.0) project(friendiqa VERSION 0.6 LANGUAGES CXX) @@ -19,9 +13,7 @@ if(CMAKE_VERSION VERSION_LESS "3.7.0") set(CMAKE_INCLUDE_CURRENT_DIR ON) endif() -find_package(Qt5 COMPONENTS Widgets Quick Sql DBus WebView REQUIRED) #QuickWidgets - -#Webview Webengine +find_package(Qt5 COMPONENTS Widgets Quick Sql DBus REQUIRED) set(MOC_SOURCES common/uploadableimage.h common/xhr.h @@ -37,7 +29,7 @@ set(SOURCES common/friendiqa.cpp common/remoteauthasyncimageprovider.cpp common/updatenews.cpp common/alarmlinux.cpp) - + include_directories(common) add_executable(friendiqa ${SOURCES} ${MOC_SOURCES} application.qrc) @@ -46,52 +38,8 @@ target_link_libraries(friendiqa Qt::Core) target_link_libraries(friendiqa Qt::Widgets) target_link_libraries(friendiqa Qt::Quick) target_link_libraries(friendiqa Qt::Sql) -target_link_libraries(friendiqa Qt::WebView) target_link_libraries(friendiqa Qt::DBus) -#target_link_libraries(friendiqa Qt::QuickWidgets) -# target_link_libraries(friendiqa Qt::Webengine) -# qt5_use_modules(friendiqa Core Widgets Quick Sql DBus) - -install(TARGETS friendiqa DESTINATION bin) - -#RESOURCES = application.qrc - -# OTHER_FILES += qml/friendiqa.qml \ -# translations/*.ts \ -# qml/*.qml -# qml/newsqml/*.qml -# qml/contactqml/*.qml -# qml/photoqml/*.qml -# qml/configqml/*.qml -# js/*.js - -#TRANSLATIONS += translations/friendiqa-de.ts \ -# translations/friendiqa-es.ts \ -# translations/friendiqa-it.ts -# HEADERS += \ -# common/uploadableimage.h \ -# common/xhr.h \ -# common/filesystem.h \ -# common/remoteauthasyncimageprovider.h \ -# common/updatenews.h \ -# common/alarm.h - -#DISTFILES += \ -# qml/calendarqml/*.qml \ -# translations/*.ts \ -# translations/*.qm \ -# qml/*.qml \ -# qml/newsqml/*.qml \ -# qml/contactqml/*.qml \ -# qml/photoqml/*.qml \ -# qml/configqml/*.qml \ -# js/*.js \ - - -# target.path=/usr/bin -# desktop.path = /usr/share/applications -# desktop.files = images/de.ma-nic.Friendiqa.desktop -# icon.path = /usr/share/icons/hicolor/scalable/apps -# icon.files = images/Friendiqa.svg -# INSTALLS+=target desktop icon +install(TARGETS friendiqa DESTINATION ${CMAKE_INSTALL_BINDIR}) +install(FILES images/de.manic.Friendiqa.desktop DESTINATION share/applications) +install(FILES images/de.manic.Friendiqa.svg DESTINATION share/icons/hicolor/scalable/apps) diff --git a/source-linux/application.qrc b/source-linux/application.qrc index ceaba37..17e10d2 100644 --- a/source-linux/application.qrc +++ b/source-linux/application.qrc @@ -13,7 +13,6 @@ qml/newsqml/NewsVideo.qml qml/newsqml/ContactPage.qml qml/newsqml/NewsVideoLarge.qml - qml/newsqml/NewsYplayer.qml qml/newsqml/SmileyDialog.qml qml/contactqml/FriendsTab.qml qml/contactqml/GroupComponent.qml @@ -35,7 +34,6 @@ qml/calendarqml/CalendarTab.qml qml/calendarqml/CalendarDay.qml qml/calendarqml/EventList.qml - qml/configqml/RegisterPage.qml qml/configqml/AccountPage.qml qml/configqml/SyncConfig.qml qml/configqml/SyncComponent.qml @@ -252,5 +250,7 @@ images/Friendica_monochrome.png qml/configqml/ConfigAppearancePage.qml qml/configqml/ConfigStartPage.qml + qml/contactqml/ContactsSearchPage.qml + images/Friendiqa.ico diff --git a/source-linux/common/filesystem.cpp b/source-linux/common/filesystem.cpp index 5a5a489..e2bdbea 100644 --- a/source-linux/common/filesystem.cpp +++ b/source-linux/common/filesystem.cpp @@ -154,10 +154,8 @@ bool FILESYSTEM::isAutostart() { QFileInfo check_file(QDir::homePath() + "/.config/autostart/friendiqa.desktop"); if (check_file.exists() && check_file.isFile()) { - qDebug()<<"autostart "<setDatabase(); updatenews->login(); + updatenews->setSyncAll(true); updatenews->startsync(); //app.connect (updatenews,SIGNAL(quitapp()),&app,SLOT(quit())); @@ -86,6 +87,7 @@ int main(int argc, char *argv[]) { QQmlApplicationEngine view; //QQuickView view; //view.setResizeMode(QQuickView::SizeRootObjectToView); + app.setWindowIcon(QIcon(":/images/Friendiqa.ico")); QTranslator qtTranslator; qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations"); app.installTranslator(&qtTranslator); @@ -108,6 +110,7 @@ int main(int argc, char *argv[]) { qmlRegisterType("QSystemTrayIcon", 1, 0, "QSystemTrayIcon"); qRegisterMetaType("ActivationReason"); view.rootContext()->setContextProperty("iconTray", QIcon(":/images/Friendica_monochrome.png")); + view.rootContext()->setContextProperty("iconTrayAvailable", QSystemTrayIcon::isSystemTrayAvailable()); view.load(QUrl("qrc:/qml/friendiqa.qml")); //view.show(); diff --git a/source-linux/common/updatenews.cpp b/source-linux/common/updatenews.cpp index b5fe4cd..64aa4a1 100644 --- a/source-linux/common/updatenews.cpp +++ b/source-linux/common/updatenews.cpp @@ -32,7 +32,7 @@ #include "updatenews.h" #include -#include +//#include #include #include #include @@ -68,6 +68,10 @@ void UPDATENEWS::setUrl(QString url) } } +void UPDATENEWS::setSyncAll(bool syncAll) +{ + m_syncAll=syncAll; +} void UPDATENEWS::setDatabase() { @@ -75,7 +79,6 @@ void UPDATENEWS::setDatabase() QString db_url=qe.offlineStorageDatabaseFilePath("Friendiqa"); m_db = QSqlDatabase::addDatabase("QSQLITE"); m_db.setDatabaseName(QUrl("file://"+db_url+".sqlite").toLocalFile()); - //qDebug() << db_url; if (!m_db.open()) { @@ -86,26 +89,8 @@ void UPDATENEWS::setDatabase() void UPDATENEWS::login() { - QSqlQuery query("SELECT * FROM config WHERE isActive=0",m_db); - while (query.next()) - { - username = query.value(1).toString(); - QByteArray bpassword=query.value(2).toByteArray(); - QString password=QByteArray::fromBase64(bpassword); - m_login=username+":"+password ; - xhr.setLogin(m_login); - m_url=query.value(0).toString(); - xhr.setUrl(m_url); - m_imagedir=query.value(3).toString(); - xhr.setImagedir(m_imagedir); - QString isActive=query.value(7).toString(); - } - //m_updateInterval=query.value(5).toInt(); - QSqlQuery syncquery("SELECT * FROM globaloptions",m_db); - // QSqlQuery delquery("DELETE FROM globaloptions WHERE k='sync_interval'",m_db); - // delquery.exec(); m_updateInterval=0; syncindex=0; synclist.clear(); @@ -132,39 +117,61 @@ void UPDATENEWS::login() if(!(synctimequery3.exec())) {qDebug() << " synctimequery3 " << synctimequery3.lastError();} } + QSqlQuery query("SELECT * FROM config ORDER BY isActive ASC, username ASC",m_db); + query.last(); + usernamelength=query.at()+1; + + if (query.isActive()&&(usernameindex

    "+newsitem["friendica_html"].toString(); - query.bindValue(11, friendicaHtml.toUtf8().toBase64());} - else{query.bindValue(11, newsitem["friendica_html"].toString().toUtf8().toBase64());} + //if (newsitem["friendica_title"]!="") { + // QString friendicaHtml="" + newsitem["friendica_title"].toString() +"

    "+newsitem["friendica_html"].toString(); + // query.bindValue(11, friendicaHtml.toUtf8().toBase64());} + //else{ + query.bindValue(11, newsitem["friendica_html"].toString().toUtf8().toBase64());//} if (newsitem["statusnet_conversation_id"].isDouble()){ query.bindValue(12, newsitem["statusnet_conversation_id"].toInt()); }else{query.bindValue(12, newsitem["statusnet_conversation_id"].toString());} @@ -351,14 +359,14 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname) if (apiname == "/api/direct_messages/all"){ query.bindValue(1,"1"); query.bindValue(5,"Friendica"); - query.bindValue(6,newsitem["id"].toString().toInt()); + query.bindValue(6,newsitem["id"].toInt()); if(newsitem["recipient"]["id"]!=QJsonValue::Null){ query.bindValue(7,newsitem["recipient"]["id"].toInt());} query.bindValue(10, newsitem["sender_id"].toInt()); query.bindValue(11, newsitem["text"].toString().toUtf8().toBase64()); if(newsitem["friendica_parent_uri"]!=QJsonValue::Null){ query.bindValue(12,newsitem["friendica_parent_uri"]);} query.bindValue(16, newsitem["sender"]["url"]); } - if (apiname == "/api/friendica/notifications"){ + if (apiname == "/api/friendica/notification"){ query.bindValue(1,"2"); query.bindValue(3,QDateTime::fromString(newsitem["date"].toString(),"yyyy-MM-dd hh:mm:ss").toMSecsSinceEpoch()); query.bindValue(5,"Friendica"); @@ -387,7 +395,7 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname) alarm.notify("DirectMessage: "+newsitem["sender"]["name"].toString(),newsitem["text"].toString(),2); } } - if (apiname=="/api/friendica/notifications"){ + if (apiname=="/api/friendica/notification"){ if(notifylist.contains("notify_Notifications")){ alarm.notify("Notification: "+newsitem["name"].toString(),newsitem["text"].toString(),3); } @@ -403,7 +411,7 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname) startImagedownload("contactlist"); } else { - if(m_updateInterval!=0){ + if((m_updateInterval!=0) && m_syncAll){ syncindex+=1; startsync(); } @@ -411,9 +419,12 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname) } else { qDebug()<< "Friendiqa updatenews error " << serverreply; - emit this->error(m_api,QTextCodec::codecForName("utf-8")->toUnicode(serverreply)); - syncindex+=1; - startsync(); + //emit this->error(m_api,QTextCodec::codecForName("utf-8")->toUnicode(serverreply)); + emit this->error(m_api,QString(serverreply)); + if(m_syncAll){ + syncindex+=1; + startsync(); + } } } @@ -428,10 +439,11 @@ void UPDATENEWS::updateImageLocation(QString downloadtype,QString imageurl, QStr testquery.first(); QSqlQuery query("UPDATE contacts SET profile_image='"+ filename +"' WHERE profile_image_url ='"+imageurl+ "' AND username = '" +username+"'",m_db); if(!(query.exec())) {qDebug()<< "updateImagelocation " << query.lastError();} + //qDebug()<< "index " << index << " " << newcontactnames.length()-1 << " " << m_syncAll; if (index==(newcontactnames.length()-1)){ newcontactnames.clear(); newcontactimagelinks.clear(); - if(m_updateInterval!=0){ + if((m_updateInterval!=0) && m_syncAll){ syncindex+=1; startsync(); } @@ -445,7 +457,7 @@ void UPDATENEWS::updateImageLocation(QString downloadtype,QString imageurl, QStr if (index==(newcontactnames.length()-1)){ newcontactnames.clear(); newcontactimagelinks.clear(); - if(m_updateInterval!=0){ + if((m_updateInterval!=0) && m_syncAll){ syncindex+=1; startsync(); } @@ -537,10 +549,10 @@ void UPDATENEWS::updateContacts(QList contacts){ QSqlQuery testquery("SELECT url FROM contacts WHERE username='"+ username +"' AND url='" + contact["url"].toString() +"'",m_db); if (testquery.first()){ query.prepare("UPDATE contacts SET id=?, name=?, screen_name=?, location=?,imageAge=?," - "profile_image_url=?, description=?, protected=?, followers_count=?," - "friends_count=?, created_at=?, favourites_count=?, utc_offset=?, time_zone=?, statuses_count=?," - "following=?, verified=?, statusnet_blocking=?, notifications=?, statusnet_profile_url=?, cid=?, network=?, timestamp=? " - " WHERE username='"+ username +"' AND url='" + contact["url"].toString() +"'"); + "profile_image_url=?, description=?, protected=?, followers_count=?," + "friends_count=?, created_at=?, favourites_count=?, utc_offset=?, time_zone=?, statuses_count=?," + "following=?, verified=?, statusnet_blocking=?, notifications=?, statusnet_profile_url=?, cid=?, network=?, timestamp=? " + " WHERE username='"+ username +"' AND url='" + contact["url"].toString() +"'"); query.bindValue(0, contact["id"].toInt()); query.bindValue(1, contact["name"].toString().toUtf8().toBase64()); query.bindValue(2, contact["screen_name"]); @@ -573,10 +585,10 @@ void UPDATENEWS::updateContacts(QList contacts){ else{ query.prepare("INSERT INTO contacts (username, id, name, screen_name, location,imageAge," - "profile_image_url, description, profile_image, url, protected, followers_count," - "friends_count, created_at, favourites_count, utc_offset, time_zone, statuses_count," - "following, verified, statusnet_blocking, notifications, statusnet_profile_url, cid, network, isFriend, timestamp)" - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + "profile_image_url, description, profile_image, url, protected, followers_count," + "friends_count, created_at, favourites_count, utc_offset, time_zone, statuses_count," + "following, verified, statusnet_blocking, notifications, statusnet_profile_url, cid, network, isFriend, timestamp)" + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); query.bindValue(0,username); query.bindValue(1, contact["id"].toInt()); @@ -628,6 +640,7 @@ void UPDATENEWS::storeFriendrequests(QByteArray serverreply,QString apiname) QSqlQuery imagequery("SELECT avatar FROM friendshiprequests",m_db); QList imageurls; + while (imagequery.next()){ imageurls.append(imagequery.value(0).toString()); } @@ -639,10 +652,10 @@ void UPDATENEWS::storeFriendrequests(QByteArray serverreply,QString apiname) QSqlQuery query(m_db); if (testquery.first()){ query.prepare("UPDATE friendshiprequests SET id=?, usernamef=?, acct=?, display_name=?,locked=?," - "bot=?, discoverable=?, groupf=?, created_at=?," - "note=?, avatar=?, header=?, header_static=?, followers_count=?," - "following_count=?, statuses_count=?, last_status_at=?, emojis=?, fields=? " - " WHERE username='"+ username +"' AND url='" + friendrequestitem["url"].toString() +"'"); + "bot=?, discoverable=?, groupf=?, created_at=?," + "note=?, avatar=?, header=?, header_static=?, followers_count=?," + "following_count=?, statuses_count=?, last_status_at=?, emojis=?, fields=? " + " WHERE username='"+ username +"' AND url='" + friendrequestitem["url"].toString() +"'"); query.bindValue(0, friendrequestitem["id"].toInt()); query.bindValue(1, friendrequestitem["username"]); @@ -667,9 +680,9 @@ void UPDATENEWS::storeFriendrequests(QByteArray serverreply,QString apiname) else{ query.prepare("INSERT INTO friendshiprequests (username, id, usernamef, acct, display_name, locked," - " created_at, followers_count, following_count, statuses_count, note, url, avatar, avatar_static, " - "header, header_static, emojis, moved, fields, bot, groupf, discoverable, last_status_at) " - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + " created_at, followers_count, following_count, statuses_count, note, url, avatar, avatar_static, " + "header, header_static, emojis, moved, fields, bot, groupf, discoverable, last_status_at) " + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); query.bindValue(0, username); query.bindValue(1, friendrequestitem["id"].toInt()); query.bindValue(2, friendrequestitem["username"].toString()); @@ -710,13 +723,12 @@ void UPDATENEWS::storeFriendrequests(QByteArray serverreply,QString apiname) newcontactimagelinks.append(friendrequestitem["avatar"].toString()); newcontactnames.append(friendrequestitem["username"].toString()); } - } + if (newcontactimagelinks.length()>0){ - //qDebug() << "start Friendrequests imagedownload"; startImagedownload("friendrequests"); }else{ - if(m_updateInterval!=0){ + if((m_updateInterval!=0) && m_syncAll){ syncindex+=1; startsync(); } @@ -769,7 +781,7 @@ void UPDATENEWS::storeEvents(QByteArray serverreply,QString apiname) alarm.notify("Event: "+ QDateTime::fromMSecsSinceEpoch(eventnotifyquery.value(0).toLongLong()).toString("dd.MM.yyyy hh:mm"),eventnotifyquery.value(1).toString(),1); } } - if(m_updateInterval!=0){ + if((m_updateInterval!=0) && m_syncAll){ syncindex+=1; startsync(); } @@ -795,7 +807,7 @@ void UPDATENEWS::showError(QString data, QString url,QString api, int code ) //qDebug() << "showerror " << api << " data " << data; emit this->error(api,data); if (api!=m_api || xhr.downloadtype()!=""){} else{ - if(m_updateInterval!=0){ + if((m_updateInterval!=0) && m_syncAll){ syncindex+=1; startsync(); } diff --git a/source-linux/common/updatenews.h b/source-linux/common/updatenews.h index 4fe6741..4b2ad9b 100644 --- a/source-linux/common/updatenews.h +++ b/source-linux/common/updatenews.h @@ -61,6 +61,7 @@ signals: public slots: void setUrl(QString url); + void setSyncAll(bool syncAll); void setDatabase(); void login(); void timeline(); @@ -84,7 +85,10 @@ private: QString m_imagedir; QString m_login; QString username; + bool m_syncAll; int syncindex; + int usernameindex; + int usernamelength; QSqlDatabase m_db; QList synclist; QList notifylist; diff --git a/source-linux/common/xhr.cpp b/source-linux/common/xhr.cpp index bd4193e..be669a4 100644 --- a/source-linux/common/xhr.cpp +++ b/source-linux/common/xhr.cpp @@ -32,10 +32,11 @@ #include "xhr.h" #include -#include +//#include #include #include #include +#include #include #include #include "uploadableimage.h" @@ -223,7 +224,7 @@ void XHR::getlist() XHR::setUrl(m_filelist.at(dlindex));} else { XHR::setUrl(m_filelist.at(dlindex));} - qDebug() << "start download" << m_url; + //qDebug() << "start download" << m_url; XHR::download(); } else {dlindex=0;m_downloadtype="";m_contactlist.clear();m_filelist.clear();} } @@ -291,7 +292,6 @@ void XHR::onReplySuccess() void XHR::onRequestFinished() { - qDebug()<<"download requestFinished "; // Save the file here if (buffer.isNull()){qDebug() << "File empty"<error(m_downloadtype,m_url,m_api,1);} else if (m_downloadtype=="picturelist") { @@ -359,5 +359,6 @@ void XHR::onSSLError(const QList &errors) QString XHR::bufferToString() { - return QTextCodec::codecForName("utf-8")->toUnicode(buffer); + //return QTextCodec::codecForName("utf-8")->toUnicode(buffer); + return QString(buffer); } diff --git a/source-linux/common/xhr.h b/source-linux/common/xhr.h index 6cec7ee..a8ddd13 100644 --- a/source-linux/common/xhr.h +++ b/source-linux/common/xhr.h @@ -37,7 +37,7 @@ #include #include #include -#include +//#include class XHR : public QObject { diff --git a/source-linux/images/Friendiqa.ico b/source-linux/images/Friendiqa.ico new file mode 100644 index 0000000000000000000000000000000000000000..e5b516e17beefb7a5c03297112924a2977738bc2 GIT binary patch literal 2086 zcmd_rUr19?90%|_=eD~ovsOq#&iQ0Tl$d5r!-9zYduv9I)e3~1K3Nmp)7oMtJ#4fh z=uID1Vf&Lw8Z@H^jf%w{lAu6(iQe6G-E+U4BQ5536k9#jy?pLD{2spd+;h&oR}d8R ztg92~)g?z(3kGGDt*mcaF3v0TE6rtN zXfm0W)rY#ILRNA6C%K(wGZ8y%*nK|@!>#8q+mc%|NAAlat-u5>J2M6-mlv!DF{sH_T=CVsjy$=;2aUt7JC5N^*J6QK+f3 zI_ZDO-RX~Gd+#WhQmrAC%mdrY8c{0;Zv?=Tn4ILU8C%EA_5;h+>Gd1#CEh+L)c&8h0`8J(jo!J579MJf3J!6Vs*BQ4|+kT2mtKUXm%+7MN9d;X9&h_H>Yn17t zHJ;7|fH`ouMS3-tg0zw=g{;c9GSUGFJx&$>nR_ z+`tE*pTkXSrTS=%Iq!0jOgascUoA7_@#Ka_Mo8e@H#zVbDCMWMQrABL%&^x>J}xeT ze9y1*Wob$FcswMN$vlZfBJ#b7X#Vb_q2lg8p~nu^3{p am^?8)o)3jWEc3A-DCzI>ud)2hvitzu1XqCo literal 0 HcmV?d00001 diff --git a/source-linux/images/de.ma-nic.Friendiqa.desktop b/source-linux/images/de.manic.Friendiqa.desktop similarity index 86% rename from source-linux/images/de.ma-nic.Friendiqa.desktop rename to source-linux/images/de.manic.Friendiqa.desktop index 79aa07d..2a7d480 100644 --- a/source-linux/images/de.ma-nic.Friendiqa.desktop +++ b/source-linux/images/de.manic.Friendiqa.desktop @@ -2,7 +2,7 @@ Version=1.0 Type=Application Exec=friendiqa %u -Icon=Friendiqa.svg +Icon=de.manic.Friendiqa.svg Terminal=false Name=Friendiqa GenericName=Social Media diff --git a/source-linux/images/Friendiqa.svg b/source-linux/images/de.manic.Friendiqa.svg similarity index 100% rename from source-linux/images/Friendiqa.svg rename to source-linux/images/de.manic.Friendiqa.svg diff --git a/source-linux/js/helper.js b/source-linux/js/helper.js index df05f13..b99caef 100644 --- a/source-linux/js/helper.js +++ b/source-linux/js/helper.js @@ -62,11 +62,13 @@ function friendicaPostRequest(login,api,data,method,rootwindow,callback) { try{ if (xhrequest.responseText!=""){ callback(xhrequest.responseText) }else{//print("API:\n" +api+" NO RESPONSE"); - showMessage("Error","API:\n" +api+" NO RESPONSE",rootwindow) + //showMessage("Error","API:\n" +api+" NO RESPONSE",rootwindow) callback(xhrequest.responseText) } } - catch (e){print("API:\n" + api+" "+e+"\n Return:"+xhrequest.responseText);showMessage("Error", "API:\n" + api+" "+e+"\n Return:"+xhrequest.responseText,rootwindow)} + catch (e){ + print("API:\n" + api+" "+e+"\n Return:"+xhrequest.responseText); + showMessage("Error", "API:\n" + api+" "+e+"\n Return:"+xhrequest.responseText,rootwindow)} } } xhrequest.open(method, login.server+api,true,login.username,Qt.atob(login.password)); diff --git a/source-linux/js/news.js b/source-linux/js/news.js index 1c97c63..d908855 100644 --- a/source-linux/js/news.js +++ b/source-linux/js/news.js @@ -34,51 +34,77 @@ .import "qrc:/js/helper.js" as Helperjs function requestFriends(login,database,rootwindow,callback){ -// return array of friends + // return array of friends var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); db.transaction( function(tx) { - var result = tx.executeSql('UPDATE contacts SET isFriend=0 where username="'+login.username+'"')}); // clean old friends - Helperjs.friendicaRequest(login,"/api/statuses/friends?count=9999", rootwindow,function (obj){ - var friends=JSON.parse(obj); - for (var i=0;i0'+filtertext); - var result = tx.executeSql('SELECT * from contacts WHERE username="'+login.username+'" AND isFriend>0'); + var result = tx.executeSql('SELECT * from contacts WHERE username="'+login.username+'" AND isFriend>'+isFriend+' ORDER BY screen_name'); // check for friends var contactlist=[]; for (var i=0;i 0) {// use update result = tx.executeSql('UPDATE hashtags SET tag="'+'", date='+curDate+', ownership=0 where username="'+login.username+'" AND tag="'+Qt.btoa(hashtags[tag])+'"'); } else {// use insert result = tx.executeSql('INSERT INTO hashtags (username,tag,date,statuses,ownership) VALUES (?,?,?,?,?)', [login.username,Qt.btoa(hashtags[tag]),curDate,"[]",0]) @@ -122,20 +148,20 @@ function deleteGroup(login,database,rootwindow,group, callback){ Helperjs.friendicaPostRequest(login,"/api/friendica/group_delete?gid="+group.gid+"&name="+group.groupname,"","POST",rootwindow, function (obj){ var deletereturn=JSON.parse(obj); if(deletereturn.success){ - db.transaction( function(tx) { - var result = tx.executeSql('DELETE from groups where username="'+login.username+'" AND groupname="'+group.name+'"'); // delete group - callback() - }); -}})} + db.transaction( function(tx) { + var result = tx.executeSql('DELETE from groups where username="'+login.username+'" AND groupname="'+group.name+'"'); // delete group + callback() + }); + }})} function getLastNews(login,database,callback){ var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); var lastnewsid=0; db.transaction( function(tx) { - var result = tx.executeSql('SELECT status_id from news WHERE username="'+login.username+'" AND messagetype=0 ORDER BY status_id DESC LIMIT 1'); - try{lastnewsid=result.rows.item(0).status_id;}catch(e){lastnewsid=0}; - callback(lastnewsid) - }) + var result = tx.executeSql('SELECT status_id from news WHERE username="'+login.username+'" AND messagetype=0 ORDER BY status_id DESC LIMIT 1'); + try{lastnewsid=result.rows.item(0).status_id;}catch(e){lastnewsid=0}; + callback(lastnewsid) + }) } @@ -163,15 +189,15 @@ function getCurrentContacts(login,database,callback){ db.transaction( function(tx) { var result = tx.executeSql('SELECT url from contacts WHERE username="'+login.username+'" AND isFriend=1'); // check for friends for (var i=0;i'+lastDate); - var result2 = tx.executeSql('SELECT url from contacts WHERE username="'+login.username+'" AND isFriend=0 AND imageAge > '+lastDate); - for (var j=0;j'+lastDate); + var result2 = tx.executeSql('SELECT url from contacts WHERE username="'+login.username+'" AND isFriend=0 AND imageAge > '+lastDate); + for (var j=0;j0){ for (var j=0;j0){ + } + if (news[i].hasOwnProperty('friendica_activities') && news[i].friendica_activities.dislike.length>0){ for (var k=0;j

    "+news[i].friendica_html;} - else{news[i].statusnet_html=news[i].friendica_html} + //if (news[i].friendica_title!="") {news[i].statusnet_html=""+news[i].friendica_title +"

    "+news[i].friendica_html;} + //else{ + news[i].statusnet_html=news[i].friendica_html//} db.transaction( function(tx) { var result = tx.executeSql('SELECT * from news where username="'+login.username+'" AND status_id = "'+news[i].id+'" AND messagetype='+news[i].messagetype); // check for news id @@ -241,20 +268,20 @@ function storeNews(login,database,news,rootwindow){ result = tx.executeSql('UPDATE news SET username="'+login.username+'", messagetype='+news[i].messagetype+', text="'+Qt.btoa(news[i].text)+'", created_at="'+news[i].created_at+'", in_reply_to_status_id="'+news[i].in_reply_to_status_id+'", source="'+news[i].source+'", status_id="'+news[i].id+'", in_reply_to_user_id="'+news[i].in_reply_to_user_id+'", geo="'+news[i].geo+'", favorited="'+news[i].favorited+'", uid="'+news[i].user.id+'", statusnet_html="'+Qt.btoa(news[i].statusnet_html)+'", statusnet_conversation_id="'+news[i].statusnet_conversation_id+'",friendica_activities="'+Qt.btoa(JSON.stringify(friendica_activities))+'",attachments="'+attachments+'",friendica_owner="'+news[i].friendica_author.url+'" where username="'+login.username+'" AND status_id="'+news[i].status_id+'" AND messagetype=0'); } else {// use insert result = tx.executeSql('INSERT INTO news (username,messagetype,text,created_at,in_reply_to_status_id,source,status_id,in_reply_to_user_id,geo,favorited,uid,statusnet_html,statusnet_conversation_id,friendica_activities,friendica_activities_self,attachments,friendica_owner) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [login.username,news[i].messagetype,Qt.btoa(news[i].text),news[i].created_at, news[i].in_reply_to_status_id, news[i].source, news[i].id,news[i].in_reply_to_user_id,news[i].geo,news[i].favorited, news[i].user.id,Qt.btoa(news[i].statusnet_html),news[i].statusnet_conversation_id, Qt.btoa(JSON.stringify(friendica_activities)),"[]",attachments,news[i].friendica_author.url])}}) - } + } } function getActivitiesUserData(allcontacts,userUrlArray){//print(JSON.stringify(userUrlArray)); var helpArray=[]; for (var i=0;i0){conversationfilter="AND statusnet_conversation_id NOT IN ("+currentconversations.toString()+") "} - for(var j = 0; j< conversations.length; j++) { - var newsrs=tx.executeSql('select * from news WHERE username="'+login.username+'" AND statusnet_conversation_id="'+conversations[j] +'" AND messagetype="'+messagetype+'" ORDER BY created_at ASC'); - //print(JSON.stringify(newsrs.rows.item(0))+JSON.stringify(newsrs.rows.item(1))) - var helpernews=newsrs.rows.item(0); - helpernews=cleanhelpernews(database,login.username,helpernews,allcontacts) - helpernews.currentconversation=[]; - for (var h = 0;h0){ - var helpernews=newsrs.rows.item(0); - var helpernews=cleanhelpernews(database,user,helpernews,allcontacts) - helpernews.currentconversation=[]; - for (var h = 0;h0){ + //helpernews=newsrs.rows.item(0); + //helpernews=cleanhelpernews(database,user,helpernews,allcontacts) + //helpernews.currentconversation=[]; + for (var h = 0;h-1){attachhelper.url=newsitemobject.statusnet_html.substring(newsitemobject.statusnet_html.lastIndexOf("http",helperstringposition),helperstringposition+attachhelperstring.length); -// if (attachArray[image].mimetype=="image/jpeg"){attachhelper.url=attachhelper.url+".jpg"} -// else if (attachArray[image].mimetype=="image/gif"){attachhelper.url=attachhelper.url+".gif"} -// else if (attachArray[image].mimetype=="image/png"){attachhelper.url=attachhelper.url+".png"} -// } -// else { + var attachArray=newsitemobject.attachments; + for (var image in attachArray){ + var attachhelper={mimetype:attachArray[image].mimetype} + var attachhelperstring="-1){var removeme=newsitemobject.statusnet_html.substring(helperstringposition,newsitemobject.statusnet_html.indexOf('">',helperstringposition)+2);} - //print("Attachhelper "+attachhelper.url) - newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(removeme,"") - //newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(attachhelper.url.substring(0,attachhelper.url.length-4)+".jpeg","") - //newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(attachhelper.url.substring(0,attachhelper.url.length-4),"") - - imageAttachmentList.push(attachhelper) + if (helperstringposition>-1){var removeme=newsitemobject.statusnet_html.substring(helperstringposition,newsitemobject.statusnet_html.indexOf('">',helperstringposition)+2);} + newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(removeme,"") + imageAttachmentList.push(attachhelper) + } } - } }catch(e){print("attachment "+e)} + newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(/class=\"attachment-image\"/g,"width=\"600\" "); + for (var format in videoformats){ if (newsitemobject.text.indexOf("."+videoformats[format])>-1){ - var videohelper={mimetype:"video/"+videoformats[format]} - var videotext=newsitemobject.text; - while (videotext.indexOf("."+videoformats[format])>-1){ - var videohelperstringposition=videotext.indexOf("."+videoformats[format]); - videohelper.url=videotext.substring(videotext.lastIndexOf("http",videohelperstringposition),videohelperstringposition+4); - videotext=videotext.substring(videohelperstringposition+4,videotext.length) - if ((videoAttachmentList.length==0) || (videoAttachmentList[videoAttachmentList.length-1].url!=videohelper.url)){videoAttachmentList.push(videohelper)} - } - } + var videohelper={mimetype:"video/"+videoformats[format]} + var videotext=newsitemobject.text; + while (videotext.indexOf("."+videoformats[format])>-1){ + var videohelperstringposition=videotext.indexOf("."+videoformats[format]); + videohelper.url=videotext.substring(videotext.lastIndexOf("http",videohelperstringposition),videohelperstringposition+4); + videotext=videotext.substring(videohelperstringposition+4,videotext.length) + if ((videoAttachmentList.length==0) || (videoAttachmentList[videoAttachmentList.length-1].url!=videohelper.url)){videoAttachmentList.push(videohelper)} + } + } } if (newsitemobject.text.indexOf("/videos/watch/")>-1){ - var ptvideohelper={mimetype:"video/mp4"} - var ptvideotext=newsitemobject.text; - while (ptvideotext.indexOf("/videos/watch/")>-1){ - var ptvideohelperstringposition=ptvideotext.indexOf("/videos/watch/"); - var ptposend=findend(ptvideotext,ptvideohelperstringposition); - if(ptposend==-1){ptposend=ptvideotext.length}; - ptvideohelper.url=ptvideotext.substring(ptvideotext.lastIndexOf("http",ptvideohelperstringposition),ptposend)+"-480.mp4"; - ptvideohelper.url=ptvideohelper.url.replace("/videos/watch","/static/webseed"); - ptvideotext=ptvideotext.substring(ptposend,ptvideotext.length) - if ((videoAttachmentList.length==0) || (videoAttachmentList[videoAttachmentList.length-1].url!=ptvideohelper.url)){videoAttachmentList.push(ptvideohelper)} - } - } - if (newsitemobject.text.indexOf("youtube.com/watch?v")>-1){ - var yttext=newsitemobject.text; - while (yttext.indexOf("youtube.com/watch?v")>-1){ - var ythelperstringposition=yttext.indexOf("watch?v="); - var ytposend=findend(yttext,ythelperstringposition); - var ythelper={mimetype:"video/youtube"} - ythelper.url=yttext.substring(ythelperstringposition+8,ytposend); - yttext=yttext.substring(ytposend,yttext.length); - if ((videoAttachmentList.length==0) || (videoAttachmentList[videoAttachmentList.length-1].url!=ythelper.url)){videoAttachmentList.push(ythelper)} - } + var ptvideohelper={mimetype:"video/mp4"} + var ptvideotext=newsitemobject.text; + while (ptvideotext.indexOf("/videos/watch/")>-1){ + var ptvideohelperstringposition=ptvideotext.indexOf("/videos/watch/"); + var ptposend=findend(ptvideotext,ptvideohelperstringposition); + if(ptposend==-1){ptposend=ptvideotext.length}; + ptvideohelper.url=ptvideotext.substring(ptvideotext.lastIndexOf("http",ptvideohelperstringposition),ptposend)+"-480.mp4"; + ptvideohelper.url=ptvideohelper.url.replace("/videos/watch","/static/webseed"); + ptvideotext=ptvideotext.substring(ptposend,ptvideotext.length) + if ((videoAttachmentList.length==0) || (videoAttachmentList[videoAttachmentList.length-1].url!=ptvideohelper.url)){videoAttachmentList.push(ptvideohelper)} + } } + newsitemobject.videoAttachmentList=videoAttachmentList; newsitemobject.imageAttachmentList=imageAttachmentList; if ((msg.options.hasOwnProperty("hide_nsfw"))&&(msg.options.hide_nsfw==1)&&(newsitemobject.text.indexOf("#nsfw")>-1)){ @@ -132,48 +113,42 @@ function beautify(newsitemobject,msg){ return newsitemobject; } - - WorkerScript.onMessage = function(msg) { -if(msg.deleteId!==undefined) + if(msg.deleteId!==undefined) {msg.model.remove(msg.deleteId); - msg.model.sync() -} -else{ - if(msg.method=="refresh" || msg.method=="contact" ||(msg.method=="conversation"&&msg.news.length>0)){msg.model.clear()}; - msg.model.sync() - - //for (var j=0;j0)){ - newsitemobject.lastcomment=beautify(newsitemobject.currentconversation[newsitemobject.currentconversation.length-1],msg); - newsitemobject.lastcomment.indent=1 - } - - if (msg.method=="conversation"){ - if (j==0){newsitemobject.indent=0}else{ - for (var k=msg.model.count-1;k>-1;k--){ - if (newsitemobject.in_reply_to_status_id==msg.model.get(k).newsitemobject.id){ - newsitemobject.indent=(msg.model.get(k).newsitemobject.indent||0)+1; - if (newsitemobject.indent>6){newsitemobject.indent=6}; - } - } - }} - data=({"newsitemobject": newsitemobject}) - } - if(msg.method=="append") { - msg.model.insert(j, data)} - else{ - msg.model.append(data) - } - } - - //if (j==msg.news.length){ msg.model.sync() - //} -} + } + else{ + if(msg.method=="refresh" || msg.method=="contact" ||(msg.method=="conversation"&&msg.news.length>0)){msg.model.clear()}; + msg.model.sync() + for (var j in msg.news){ + let data=({}); + if (typeof(msg.news[j])=='object') { + var newsitemobject=msg.news[j]; + newsitemobject=beautify(newsitemobject,msg); + if (!(typeof(newsitemobject.currentconversation)=='undefined') && (newsitemobject.currentconversation.length>0)){ + newsitemobject.lastcomment=beautify(newsitemobject.currentconversation[newsitemobject.currentconversation.length-1],msg); + newsitemobject.lastcomment.indent=1 + newsitemobject.lastcomment.isLastComment=true + } + + if (msg.method=="conversation"){ + if (j==0){newsitemobject.indent=0}else{ + for (var k=msg.model.count-1;k>-1;k--){ + if (newsitemobject.in_reply_to_status_id==msg.model.get(k).newsitemobject.id){ + newsitemobject.indent=(msg.model.get(k).newsitemobject.indent||0)+1; + if (newsitemobject.indent>6){newsitemobject.indent=6}; + } + } + }} + data=({"newsitemobject": newsitemobject}) + } + if(msg.method=="append") { + msg.model.insert(j, data)} + else{ + msg.model.append(data) + } + } + msg.model.sync() + } } diff --git a/source-linux/js/service.js b/source-linux/js/service.js index 544db02..28798a8 100644 --- a/source-linux/js/service.js +++ b/source-linux/js/service.js @@ -45,7 +45,7 @@ function initDatabase(database) { // initialize the database object tx.executeSql('CREATE TABLE IF NOT EXISTS config(server TEXT, username TEXT, password TEXT, imagestore TEXT, maxnews INT, timerInterval INT, newsViewType TEXT,isActive INT, permissions TEXT,maxContactAge INT,APIVersion TEXT,layout TEXT, addons TEXT)'); tx.executeSql('CREATE TABLE IF NOT EXISTS news(username TEXT, messagetype INT, text TEXT, created_at INT, in_reply_to_status_id INT, source TEXT, status_id INT, in_reply_to_user_id INT, geo TEXT,favorited TEXT, uid INT, statusnet_html TEXT, statusnet_conversation_id TEXT,friendica_activities TEXT, friendica_activities_self TEXT, attachments TEXT, friendica_owner TEXT)'); tx.executeSql('CREATE TABLE IF NOT EXISTS contacts(username TEXT, id INT, name TEXT, screen_name TEXT, location TEXT,imageAge INT, profile_image_url TEXT, description TEXT, profile_image BLOB, url TEXT, protected TEXT, followers_count INT, friends_count INT, created_at INT, favourites_count TEXT, utc_offset TEXT, time_zone TEXT, statuses_count INT, following TEXT, verified TEXT, statusnet_blocking TEXT, notifications TEXT, statusnet_profile_url TEXT, cid INT, network TEXT, isFriend INT, timestamp INT)'); -// tx.executeSql('CREATE INDEX IF NOT EXISTS contact_id ON contacts(id)'); + // tx.executeSql('CREATE INDEX IF NOT EXISTS contact_id ON contacts(id)'); tx.executeSql('CREATE TABLE IF NOT EXISTS profiles(username TEXT, id INT, profiledata TEXT)'); tx.executeSql('CREATE TABLE IF NOT EXISTS groups(username TEXT, groupname TEXT, gid INT, members TEXT)'); tx.executeSql('CREATE TABLE IF NOT EXISTS events(username TEXT, id INT, start INT, end INT, allday INT, title TEXT, j INT, d TEXT, isFirst INT, uid INT, cid INT, uri TEXT, created INT, edited INT, desc TEXT, location TEXT, type TEXT, nofinish TEXT, adjust INT, ignore INT, permissions TEXT, guid INT, itemid INT, plink TEXT, authorName TEXT, authorAvatar TEXT, authorLink TEXT, html TEXT)'); @@ -59,99 +59,99 @@ function initDatabase(database) { // initialize the database object function cleanPermissions(oldperms){ var newperms=oldperms.replace("<","");newperms=newperms.replace(">","");newperms="["+newperms+"]"; var newpermArray=JSON.parse(newperms); -return (newpermArray) + return (newpermArray) } function getEvents(database,login,rootwindow,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]); Helperjs.friendicaWebRequest(login.server+"/cal/"+login.username+"/json",rootwindow,function(obj){ - //Helperjs.friendicaRemoteAuthRequest(login,login.server+"/cal/"+login.username+"/json",login.server+"/profile/"+login.username,rootwindow,function(obj){ - var events = JSON.parse(obj); - db.transaction( function(tx) { - for (var i=0;istartday){ - for (var j=startday+1;jstartday){ + for (var j=startday+1;j0){ - for(var i = 0; i < rs.rows.length; i++) { - rsArray.push(rs.rows.item(i)) - } - var rsObject={server:rsArray[0].server,username:rsArray[0].username, password:rsArray[0].password,imagestore:rsArray[0].imagestore,isActive:rsArray[0].isActive, newsViewType:rsArray[0].newsViewType,permissions:JSON.parse(rsArray[0].permissions),maxContactAge:rsArray[0].maxContactAge,APIVersion:rsArray[0].APIVersion,addons:rsArray[0].addons}; - if (rsObject.newsViewType!="" && rsObject.newsViewType!=null){updateNewsviewtype(database,rsObject.newsViewType)} - } else {var rsObject=""} - callback(rsObject)}} + var rs = tx.executeSql('select * from config'+where); + var rsArray=[]; + if (rs.rows.length>0){ + for(var i = 0; i < rs.rows.length; i++) { + rsArray.push(rs.rows.item(i)) + } + var rsObject={server:rsArray[0].server,username:rsArray[0].username, password:rsArray[0].password,imagestore:rsArray[0].imagestore,isActive:rsArray[0].isActive, newsViewType:rsArray[0].newsViewType,accountId:rsArray[0].maxnews,permissions:JSON.parse(rsArray[0].permissions),maxContactAge:rsArray[0].maxContactAge,APIVersion:rsArray[0].APIVersion,addons:rsArray[0].addons}; + if (rsObject.newsViewType!="" && rsObject.newsViewType!=null &&!typeof(rsObject.newsViewType)=='undefined'){updateNewsviewtype(database,rsObject.newsViewType)} + } else {var rsObject=""} + callback(rsObject)}} ) } @@ -315,9 +314,9 @@ function readAllLogins(database,callback) { // reads config } function readActiveConfig(database){ - var obj=""; - readConfig(database,function(config){obj=config},"isActive", 0); - return obj; + var obj=""; + readConfig(database,function(config){obj=config},"isActive", 0); + return obj; } function setDefaultOptions(database){ @@ -332,7 +331,7 @@ function readGlobaloptions(database,callback){ var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); var go=({}); db.transaction( function(tx) { - var rs = tx.executeSql('select * from globaloptions'); + var rs = tx.executeSql('select * from globaloptions'); for (var r=0; r 0) {// use update result = tx.executeSql('UPDATE globaloptions SET v="'+value+'" WHERE k="'+key+'"') } else {// use insert - result = tx.executeSql('INSERT INTO globaloptions (k,v) VALUES (?,?)', [key,value]) + result = tx.executeSql('INSERT INTO globaloptions (k,v) VALUES (?,?)', [key,value]) } }) root.globaloptions[key]=value; - } +} function deleteConfig(database,userobj,callback) { // delete user data from DB if (userobj){var where = " WHERE username='"+ userobj.username+"' and server='"+userobj.server+"'";} else { return "no user selected!";} @@ -370,7 +369,7 @@ function deleteConfig(database,userobj,callback) { // delete user data from DB var rs4 = tx.executeSql("delete from imageData WHERE username='"+ userobj.username+"'"); var rs5 = tx.executeSql("delete from groups WHERE username='"+ userobj.username+"'"); var rs5 = tx.executeSql("delete from events WHERE username='"+ userobj.username+"'"); - callback(); + callback(); }) } @@ -386,33 +385,31 @@ function updateNewsviewtype(database, newsViewtype){ function cleanNews(database,callback){ - var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); - db.transaction( function(tx) { - var maxnewsrs = tx.executeSql("SELECT v FROM globaloptions WHERE k='max_news'"); - var maxnews=1000; if(maxnewsrs.rows.length>0){ maxnews=maxnewsrs.rows.item(0).v}; - for (var i=0; i<6;i++){ - if (i!=0){var maxnewsa=maxnews/5}else{maxnewsa=maxnews} - var newscountrs = tx.executeSql('SELECT COUNT(*) from news WHERE messagetype='+i); - var newscount = 0; - if (newscountrs.rows.length>0){newscount=newscountrs.rows.item(0)["COUNT(*)"]};//print(i+" "+maxnewsa+" newscount "+newscount) - if (newscount>maxnewsa){ - var lastvalidtimers= tx.executeSql('SELECT DISTINCT created_at FROM news WHERE messagetype='+i+' ORDER BY created_at ASC LIMIT ' +(newscount-maxnewsa)); - var lastvalidtime=lastvalidtimers.rows.item(newscount-maxnewsa-1).created_at; - var deleters = tx.executeSql('DELETE from news WHERE messagetype='+i+' AND created_at<='+lastvalidtime)} - } - callback() - }) - } + var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); + db.transaction( function(tx) { + var maxnewsrs = tx.executeSql("SELECT v FROM globaloptions WHERE k='max_news'"); + var maxnews=1000; if(maxnewsrs.rows.length>0){ maxnews=maxnewsrs.rows.item(0).v}; + for (var i=0; i<6;i++){ + if (i!=0){var maxnewsa=maxnews/5}else{maxnewsa=maxnews} + var newscountrs = tx.executeSql('SELECT COUNT(*) from news WHERE messagetype='+i); + var newscount = 0; + if (newscountrs.rows.length>0){newscount=newscountrs.rows.item(0)["COUNT(*)"]}; + if (newscount>maxnewsa){ + var lastvalidtimers= tx.executeSql('SELECT DISTINCT created_at FROM news WHERE messagetype='+i+' ORDER BY created_at ASC LIMIT ' +(newscount-maxnewsa)); + var lastvalidtime=lastvalidtimers.rows.item(newscount-maxnewsa-1).created_at; + var deleters = tx.executeSql('DELETE from news WHERE messagetype='+i+' AND created_at<='+lastvalidtime)} + } + callback() + }) +} function cleanContacts(login,database,callback){ var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); db.transaction( function(tx) { var oldestnewsrs= tx.executeSql('SELECT created_at FROM news WHERE username="'+login.username+'" AND messagetype=0 ORDER BY created_at ASC LIMIT 1'); if (oldestnewsrs.rows.length>0){ var oldestnewsTime=oldestnewsrs.rows.item(0).created_at- 604800000;} else{var oldestnewsTime=0} //contacts can be 7 days old - //print(login.username+" älteste news: "+ oldestnewsTime); var result = tx.executeSql('SELECT * from contacts WHERE username="'+login.username+'" AND isFriend=0 AND imageAge<'+oldestnewsTime); // check for friends - //print ("Contact result length: "+ result.rows.length) - for (var i=0;i0){tagcount=tagcountrs.rows.item(0)["COUNT(*)"]}; - if (tagcount>50){ - var lastvaliddaters= tx.executeSql('SELECT DISTINCT date FROM hashtags ORDER BY date ASC LIMIT ' +(tagcount-50)); - var lastvaliddate=lastvaliddaters.rows.item(tagcount-49).date; - var deleters = tx.executeSql('DELETE from hashtags WHERE date<='+lastvaliddate)} - callback() - }) - } + var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); + db.transaction( function(tx) { + var tagcountrs = tx.executeSql('SELECT COUNT(*) from hashtags'); + var tagcount = 0; + if (tagcountrs.rows.length>0){tagcount=tagcountrs.rows.item(0)["COUNT(*)"]}; + if (tagcount>50){ + var lastvaliddaters= tx.executeSql('SELECT DISTINCT date FROM hashtags ORDER BY date ASC LIMIT ' +(tagcount-50)); + var lastvaliddate=lastvaliddaters.rows.item(tagcount-49).date; + var deleters = tx.executeSql('DELETE from hashtags WHERE date<='+lastvaliddate)} + callback() + }) +} function updateContactInDB(login,database,isFriend,contact){// for newstab and friendstab var currentTime=Date.now(); var image_timestamp=0; - var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); - db.transaction( function(tx) { - var imagename_helper=[]; - imagename_helper=contact.profile_image_url.split('?');//print("substring: "+JSON.stringify(imagename_helper)+imagename_helper[0].substring(imagename_helper[0].lastIndexOf("/")+1, imagename_helper[0].length)) - try {parseInt(image_timestamp=imagename_helper[1].substring(imagename_helper[1].indexOf("ts=")+3,imagename_helper[1].length))} catch(e){}; + var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); + db.transaction( function(tx) { + var imagename_helper=[]; + imagename_helper=contact.profile_image_url.split('?'); + try {parseInt(image_timestamp=imagename_helper[1].substring(imagename_helper[1].indexOf("ts=")+3,imagename_helper[1].length))} catch(e){}; var result; result = tx.executeSql('SELECT * from contacts where username="'+login.username+'" AND url = "'+contact.url+'"'); // check for news url if(result.rows.length === 1) {// use update result = tx.executeSql('UPDATE contacts SET id='+contact.id+', name="'+Qt.btoa(contact.name)+'", screen_name="'+contact.screen_name+'", location="'+contact.location+'",imageAge='+currentTime+', profile_image_url="'+contact.profile_image_url+'", description="'+Qt.btoa(contact.description)+'", protected="'+contact.protected+'", followers_count='+contact.followers_count+', friends_count='+contact.friends_count+', created_at="'+ contact.created_at+'", favourites_count="'+contact.favorites_count+'", utc_offset="'+contact.utc_offset+'", time_zone="'+contact.time_zone+'", statuses_count='+contact.statuses_count+', following="'+contact.following+'", verified ="'+contact.verified+'", statusnet_blocking="'+contact.statusnet_blocking+'", notifications="'+contact.notifictions+'", statusnet_profile_url="'+contact.statusnet_profile_url+'", cid='+contact.cid+', network="'+contact.network+'", isFriend='+isFriend+', timestamp='+ currentTime+' where username="'+login.username+'" AND url="'+contact.url+'"'); } else {// use insert - result = tx.executeSql('INSERT INTO contacts VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [login.username,contact.id,Qt.btoa(contact.name),contact.screen_name,contact.location,currentTime,contact.profile_image_url, Qt.btoa(contact.description),"",contact.url,contact.protected,contact.followers_count, contact.friends_count,contact.created_at,contact.favorites_count,contact.utc_offset,contact.time_zone,contact.statuses_count,contact.following,contact.verfied,contact.statusnet_blocking,contact.notifications,contact.statusnet_profile_url,contact.cid,contact.network,isFriend,image_timestamp]);} + result = tx.executeSql('INSERT INTO contacts VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [login.username,contact.id,Qt.btoa(contact.name),contact.screen_name,contact.location,currentTime,contact.profile_image_url, Qt.btoa(contact.description),"",contact.url,contact.protected,contact.followers_count, contact.friends_count,contact.created_at,contact.favorites_count,contact.utc_offset,contact.time_zone,contact.statuses_count,contact.following,contact.verfied,contact.statusnet_blocking,contact.notifications,contact.statusnet_profile_url,contact.cid,contact.network,isFriend,image_timestamp]);} }); } function processNews(api,data){ - try{var newslist=JSON.parse(data)} catch(e){newsBusy.running=false;}; + try{var newslist=JSON.parse(data)} catch(e){print("processnews "+e+ " api "+ api + " data "+data);newsBusy.running=false;}; if (api=="/api/users/show"){ var usermessages=[]; usermessages.push(newslist.status); newslist=usermessages; } - if (data==""){} + if (data==""){newsBusy.running=false} 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) + } else if (newslist.hasOwnProperty('status')){ Helperjs.showMessage(qsTr("JSON status Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root) } - else if (!(Array.isArray(newslist))){ - replytimer.restart() - } + else { var allcontacts=[]; allcontacts=Newsjs.getAllContacts(db,login.username); - if (api=="/api/direct_messages/all" || api=="/api/direct_messages/conversation"){ + + if (!(Array.isArray(newslist)) && (typeof(newslist)==='object')){//answers return object, not array + newslist=[];newslist.push(JSON.parse(data)); + } + + if (api=="/api/direct_messages/all" || api=="/api/direct_messages/conversation" ||api=="/api/direct_messages/new"){ for (var n in newslist){ - newslist[n].created_at=Date.parse(Newsjs.cleanDate(newslist[n].created_at)); + try{newslist[n].created_at=Date.parse(Newsjs.cleanDate(newslist[n].created_at));}catch(e){ + newslist[n].created_at=Date.parse(newslist[n].created_at) + } newslist[n].messagetype=1; newslist[n].source=" Friendica"; newslist[n].status_id=newslist[n].id; @@ -486,7 +488,7 @@ function processNews(api,data){ newslist[n].in_reply_to_user_id=newslist[n].recipient_id if(newslist[n].in_reply_to_user_id){newslist[n].reply_user=Newsjs.objFromArray(allcontacts,"id",newslist[n].in_reply_to_user_id)} }} - else if (api=="/api/friendica/notifications"){ + else if (api=="/api/friendica/notification"){ for (var n in newslist){ newslist[n].created_at=Date.parse(newslist[n].date); newslist[n].messagetype=2; @@ -502,38 +504,42 @@ function processNews(api,data){ } } - else {//if(api!="/api/statuses/user_timeline"){ var chatlist=[]; + var chatlistclean=[]; var conversationIds=[]; var commentCount=[]; for (var n in newslist){ if (newslist[n]!=null){ newslist[n].created_at=Date.parse(Newsjs.cleanDate(newslist[n].created_at)); + newslist[n].messagetype=5; + newslist[n].status_id=newslist[n].id; if (api=="/api/statuses/replies"){newslist[n].messagetype=3}else{newslist[n].messagetype=0;} newslist[n].friendica_author=cleanUser(newslist[n].friendica_author); newslist[n].user=cleanUser(newslist[n].user); - if (newslist[n].friendica_title!="") {newslist[n].statusnet_html=""+newslist[n].friendica_title +"

    "+newslist[n].friendica_html;} - else{newslist[n].statusnet_html=newslist[n].friendica_html} + //if (newslist[n].friendica_title!="") {newslist[n].statusnet_html=""+newslist[n].friendica_title +"

    "+newslist[n].friendica_html;} + //else{ //friendica_title also included in html + newslist[n].statusnet_html=newslist[n].friendica_html + //} if(newslist[n].in_reply_to_user_id){newslist[n].reply_user=Newsjs.objFromArray(allcontacts,"id",newslist[n].in_reply_to_user_id)} if(newslist[n].hasOwnProperty('friendica_activities')){ for (var m in newslist[n].friendica_activities.like){ - newslist[n].friendica_activities.like[m]=cleanUser(newslist[n].friendica_activities.like[m]); - } + newslist[n].friendica_activities.like[m]=cleanUser(newslist[n].friendica_activities.like[m]); + } for (var o in newslist[n].friendica_activities.dislike){ - newslist[n].friendica_activities.dislike[o]=cleanUser(newslist[n].friendica_activities.dislike[o]); - } + newslist[n].friendica_activities.dislike[o]=cleanUser(newslist[n].friendica_activities.dislike[o]); + } for (var p in newslist[n].friendica_activities.attendyes){ - newslist[n].friendica_activities.attendyes[p]=cleanUser(newslist[n].friendica_activities.attendyes[p]); - } + newslist[n].friendica_activities.attendyes[p]=cleanUser(newslist[n].friendica_activities.attendyes[p]); + } for (var q in newslist[n].friendica_activities.attendno){ - newslist[n].friendica_activities.attendno[q]=cleanUser(newslist[n].friendica_activities.attendno[q]); - } + newslist[n].friendica_activities.attendno[q]=cleanUser(newslist[n].friendica_activities.attendno[q]); + } for (var r in newslist[n].friendica_activities.attendmaybe){ - newslist[n].friendica_activities.attendmaybe[r]=cleanUser(newslist[n].friendica_activities.attendmaybe[r]); - } + newslist[n].friendica_activities.attendmaybe[r]=cleanUser(newslist[n].friendica_activities.attendmaybe[r]); + } } if(!(newslist[n].hasOwnProperty('friendica_author'))){ newslist[n].friendica_author=newslist[n].user @@ -542,29 +548,50 @@ function processNews(api,data){ //fill chatlist if (conversationindex==-1){ - chatlist.push(newslist[n]); + let conversation=[];conversation.push(newslist[n]); + let firstmessage={currentconversation:conversation}; + chatlist.push(firstmessage); conversationIds.push(newslist[n].statusnet_conversation_id); commentCount.push(1); } else{ commentCount[conversationindex]=commentCount[conversationindex]+1; - chatlist[conversationindex]=newslist[n]; + chatlist[conversationindex].currentconversation.push(newslist[n]); } } } - //enrich chatlist with old entries - for (var count in chatlist){ //print("chat "+JSON.stringify(chatlist[count])+" count: "+commentCount[count]) - //chatlist[count].newscount=commentCount[count] - if (chatlist[count].id_str!==chatlist[count].statusnet_conversation_id){ - try{ - Newsjs.oldchatfromdb(db,login.username,chatlist[count].statusnet_conversation_id,chatlist[count].id,allcontacts,function(oldpost,oldcount){ - chatlist[count]=oldpost; - chatlist[count].newscount=oldcount+commentCount[count]; - //print("JSON "+chatlist[count].statusnet_conversation_id+" "+chatlist[count].id+JSON.stringify(oldpost)) - }) - }catch(e){print(e)} + if ((newstab.newstabstatus=="Conversations")&&!(api=="/api/conversation/show"|| api=="/api/direct_messages/conversation")){ + //enrich chatlist with old entries + for (var count in chatlist){ + chatlist[count].currentconversation.reverse(); + if (chatlist[count].currentconversation[0].id_str!==chatlist[count].currentconversation[0].statusnet_conversation_id){ + try{ + Newsjs.oldchatfromdb(db,login.username,chatlist[count].currentconversation[0].statusnet_conversation_id,chatlist[count].currentconversation[0].id,allcontacts,function(oldpost,oldcount){ + let completeChat=oldpost.currentconversation.concat(chatlist[count].currentconversation); + let newChat=completeChat[0]; + newChat.currentconversation=[]; + for (let c in completeChat){ + if (completeChat[c].status_id!=newChat.status_id){ + newChat["currentconversation"].push(completeChat[c]) + } + } + newChat.newscount=oldcount+commentCount[count]; + chatlistclean.push(newChat); + }) + }catch(e){print(e)} + } + else{ + let newChat=chatlist[count].currentconversation[0]; + newChat["currentconversation"]=[]; + for (let c in chatlist[count].currentconversation){ + if (chatlist[count].currentconversation[c].status_id!=newChat.status_id){ + newChat["currentconversation"].push(chatlist[count].currentconversation[c]) + } + } + newChat.newscount=commentCount[count]; + chatlistclean.push(newChat); + } } - else{chatlist[count].newscount=commentCount[count]} } } @@ -575,8 +602,8 @@ function processNews(api,data){ else if (api=="/api/statuses/user_timeline" || api=="/api/users/show"){ root.contactposts=newslist } - else if ((api!="/api/direct_messages/all")&&(api!="/api/friendica/notifications")&&(newstab.newstabstatus==="Conversations")){ - showNews(chatlist);root.news=newslist + else if ((api!="/api/direct_messages/all")&&(api!="/api/friendica/notification")&&(api!="/api/direct_messages/new")&&(newstab.newstabstatus==="Conversations")){ + showNews(chatlistclean);root.news=newslist } else { showNews(newslist);root.news=newslist @@ -585,7 +612,6 @@ function processNews(api,data){ var newstabarray=["Conversations","Favorites","Timeline","DirectMessage","Replies"]; if (newstabarray.indexOf(newstab.newstabstatus)>-1){contacttimer.start()} } - } @@ -603,70 +629,70 @@ function updateView(viewtype){ //newsBusy.running=true; //downloadNotice.text="xhr start "+Date.now() switch(viewtype){ - case "Conversations": - Newsjs.getLastNews(login,db,function(lastnews){ - xhr.setLogin(login.username+":"+Qt.atob(login.password)); - xhr.setUrl(login.server); - xhr.setApi("/api/statuses/friends_timeline"); - xhr.clearParams(); - xhr.setParam("since_id",lastnews); - xhr.setParam("count",50)}); - break; - case "Timeline": - var lastnews=Newsjs.getLastNews(login,db,function(lastnews){ - xhr.setLogin(login.username+":"+Qt.atob(login.password)); - xhr.setUrl(login.server); - xhr.setApi("/api/statuses/friends_timeline"); - xhr.clearParams(); - xhr.setParam("since_id",lastnews); - xhr.setParam("count",50) - }); - break; - case "Search": + case "Conversations": + Newsjs.getLastNews(login,db,function(lastnews){ xhr.setLogin(login.username+":"+Qt.atob(login.password)); xhr.setUrl(login.server); - xhr.setApi("/api/search"); - break; - case "Notifications": - xhr.setLogin(login.username+":"+Qt.atob(login.password)); - xhr.setUrl(login.server); - xhr.setApi("/api/friendica/notifications"); + xhr.setApi("/api/statuses/friends_timeline"); xhr.clearParams(); - break; - case "Direct Messages": + xhr.setParam("since_id",lastnews); + xhr.setParam("count",50)}); + break; + case "Timeline": + var lastnews=Newsjs.getLastNews(login,db,function(lastnews){ xhr.setLogin(login.username+":"+Qt.atob(login.password)); xhr.setUrl(login.server); - xhr.setApi("/api/direct_messages/all"); + xhr.setApi("/api/statuses/friends_timeline"); xhr.clearParams(); - break; - case "Public Timeline": + xhr.setParam("since_id",lastnews); + xhr.setParam("count",50) + }); + break; + case "Search": + xhr.setLogin(login.username+":"+Qt.atob(login.password)); + xhr.setUrl(login.server); + xhr.setApi("/api/search"); + break; + case "Notifications": + xhr.setLogin(login.username+":"+Qt.atob(login.password)); + xhr.setUrl(login.server); + xhr.setApi("/api/friendica/notification"); + xhr.clearParams(); + break; + case "Direct Messages": + xhr.setLogin(login.username+":"+Qt.atob(login.password)); + xhr.setUrl(login.server); + xhr.setApi("/api/direct_messages/all"); + xhr.clearParams(); + break; + case "Public Timeline": + xhr.setLogin(login.username+":"+Qt.atob(login.password)); + xhr.setUrl(login.server); + xhr.setApi("/api/statuses/public_timeline"); + xhr.clearParams(); + break; + case "Favorites": + xhr.setLogin(login.username+":"+Qt.atob(login.password)); + xhr.setUrl(login.server); + xhr.setApi("/api/favorites"); + xhr.clearParams(); + break; + case "Replies": + xhr.setLogin(login.username+":"+Qt.atob(login.password)); + xhr.setUrl(login.server); + xhr.setApi("/api/statuses/replies"); + xhr.clearParams(); + break; + default: + Newsjs.getLastNews(login,db,function(lastnews){ xhr.setLogin(login.username+":"+Qt.atob(login.password)); xhr.setUrl(login.server); - xhr.setApi("/api/statuses/public_timeline"); + xhr.setApi("/api/statuses/friends_timeline"); xhr.clearParams(); - break; - case "Favorites": - xhr.setLogin(login.username+":"+Qt.atob(login.password)); - xhr.setUrl(login.server); - xhr.setApi("/api/favorites"); - xhr.clearParams(); - break; - case "Replies": - xhr.setLogin(login.username+":"+Qt.atob(login.password)); - xhr.setUrl(login.server); - xhr.setApi("/api/statuses/replies"); - xhr.clearParams(); - break; - default: - Newsjs.getLastNews(login,db,function(lastnews){ - xhr.setLogin(login.username+":"+Qt.atob(login.password)); - xhr.setUrl(login.server); - xhr.setApi("/api/statuses/friends_timeline"); - xhr.clearParams(); - xhr.setParam("since_id",lastnews); - xhr.setParam("count",50) - newstab.newstabstatus="Conversations"; - }); + xhr.setParam("since_id",lastnews); + xhr.setParam("count",50) + newstab.newstabstatus="Conversations"; + }); } xhr.get(); @@ -682,12 +708,12 @@ function updateView(viewtype){ function showGroups(){ Helperjs.readData(db,"groups",login.username,function(groups){ var groupitems=""; - for (var i=0;iFriendiqa v0.6.3
    Licensed under GPL 3 with the exception of OpenSSL
    "+ + text: "Friendiqa v0.6.4
    Licensed under GPL 3 with the exception of OpenSSL
    "+ "Website https://friendiqa.ma-nic.de
    "+ "Sourcecode: https://git.friendi.ca/LubuWest/Friendiqa
    "+ "Privacy Policy: http://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md
    "+ diff --git a/source-linux/qml/configqml/RegisterPage.qml b/source-linux/qml/configqml/RegisterPage.qml deleted file mode 100644 index 87a27cd..0000000 --- a/source-linux/qml/configqml/RegisterPage.qml +++ /dev/null @@ -1,57 +0,0 @@ -// This file is part of Friendiqa -// https://git.friendi.ca/lubuwest/Friendiqa -// Copyright (C) 2020 Marco R. -// -// 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 . - -import QtQuick 2.9 -import QtQuick.Controls 2.12 -import QtWebView 1.1 -import "qrc:/qml/genericqml" - -Rectangle{ - color:"white" - property alias url:htmlview.url - - WebView {id:htmlview; - height:parent.height-7*mm - width:parent.width - y:7*mm - } - Button{ - id:closeButton - height: 3*root.fontFactor*osSettings.bigFontSize - anchors.top: parent.top - anchors.topMargin: 1*mm - anchors.right: parent.right - anchors.rightMargin: 1*mm - text: "\uf057" - font.pointSize: osSettings.bigFontSize - onClicked:{root.pop()} - } -} diff --git a/source-linux/qml/contactqml/ContactDetailsComponent.qml b/source-linux/qml/contactqml/ContactDetailsComponent.qml deleted file mode 100644 index 768a653..0000000 --- a/source-linux/qml/contactqml/ContactDetailsComponent.qml +++ /dev/null @@ -1,177 +0,0 @@ -// This file is part of Friendiqa -// https://git.friendi.ca/lubuwest/Friendiqa -// Copyright (C) 2020 Marco R. -// -// 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 . - -import QtQuick 2.0 -import QtQuick.Controls 2.12 -import "qrc:/qml/genericqml" - -Item { -id: contactLargeComponent -x:mm -y:mm -property var contact:({}) -property var createdAtDate: new Date(contact.created_at) -property string connectUrl: (contact.network!=="dfrn")||(contact.isFriend!=0)?"":( ""+qsTr("Connect")+"
    ") - -Rectangle { - id: wrapper - - width:root.width-2*mm //friendsTabView.width; - height:root.height-20*mm// friendsTabView.height-15*mm - border.color: "grey" - color:"white" - radius: 0.5*mm - Image { - id: photoImage - x:mm - y:mm - width: 15*mm - height:15*mm - source:(contact.profile_image!="")? "file://"+contact.profile_image : contact.profile_image_url - onStatusChanged: if (photoImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} - } - - Label { - id: namelabel - x: mm - width: root.width-6*mm //friendsTabView.width-4*mm - height: 3*mm - text:contact.name+" (@"+contact.screen_name+")" - elide:Text.ElideRight - anchors.topMargin: 0 - anchors.left: photoImage.left - color: "#303030" - font.pixelSize: 4*mm - anchors.top: photoImage.bottom - } - Rectangle{ - id: detailsrectangle - anchors.top: namelabel.bottom - anchors.topMargin: 2*mm - - ScrollView{ - ScrollBar.horizontal.policy: ScrollBar.AlwaysOff - //frameVisible: true - id:namelabelflickable - width: root.width-10*mm - height:root.height-50*mm - x: mm - clip:true - Text{ - id:namelabeltext - width: namelabelflickable.width - height: implicitHeight - font.pixelSize: 3*mm - textFormat:Text.RichText - wrapMode: Text.Wrap - text:""+qsTr("Description")+": "+contact.description+"
    "+qsTr("Location")+": "+contact.location+"
    "+qsTr("Posts")+": "+contact.statuses_count+ - "
    "+qsTr("URL")+": "+contact.url+"
    "+ - connectUrl+ ""+qsTr("Created at")+": "+createdAtDate.toLocaleString(Qt.locale()) - onLinkActivated: { - Qt.openUrlExternally(link)} - } - } - - Row{ - anchors.top: namelabelflickable.bottom - anchors.topMargin: 2*mm - x: mm - spacing:4 - - MButton{ - id:photobutton - height: 6*mm - width: 8*mm - text: "\uf03e" // "Photos" - visible:(contact.network=="dfrn") - onClicked:{ - fotostab.phototabstatus="Contact"; - root.currentIndex=2; - fotostab.active=true; - root.fotoSignal(contact) ; - contactLargeComponent.destroy(); - } - } - - MButton{ - id:messagebutton - height: 6*mm - width: 8*mm - text: "\uf0e6" //"Messages" - onClicked:{ - root.currentIndex=0; - //newstab.active=true; - root.messageSignal(contact) ; - contactLargeComponent.destroy(); - } - } - - MButton{ - id:dmbutton - visible: (contact.following=="true") - height: 6*mm - width: 8*mm - text: "\uf040" //"DM" - onClicked:{ - root.currentIndex=0; - root.directmessageSignal(contact.screen_name); - contactLargeComponent.destroy(); - } - } - - - MButton{ - id:eventbutton - visible:(contact.network=="dfrn") - height: 6*mm - width: 8*mm - text:"\uf073" //Events - onClicked:{ - root.currentIndex=3; - calendartab.active=true; - calendartab.calendartabstatus="Friend" - root.eventSignal(contact); - contactLargeComponent.destroy(); - } - } - - MButton{ - id: closeButton - height: 6*mm - width: 8*mm - text: "\uf057" //"close" - onClicked:{contactLargeComponent.destroy(); - } - } - } - } -} -} diff --git a/source-linux/qml/contactqml/ContactsListTab.qml b/source-linux/qml/contactqml/ContactsListTab.qml index b8f0d2a..5dceccb 100644 --- a/source-linux/qml/contactqml/ContactsListTab.qml +++ b/source-linux/qml/contactqml/ContactsListTab.qml @@ -31,11 +31,12 @@ import QtQuick 2.11 import QtQuick.Controls 2.12 +import QtQuick.Controls.Material 2.12 import QtQuick.Layouts 1.11 import QtQuick.LocalStorage 2.0 import "qrc:/js/helper.js" as Helperjs -//import "qrc:/js/news.js" as Newsjs import "qrc:/js/service.js" as Service +import "qrc:/js/news.js" as Newsjs import "qrc:/qml/contactqml" import "qrc:/qml/genericqml" @@ -44,14 +45,16 @@ Item{ Layout.fillWidth:true Layout.fillHeight: true function showContacts(contact){ - try {contactsModel.clear()} catch(e){print(e)}; - Helperjs.readData(db, "contacts",root.login.username,function(contactsobject){ + try {contactsModel.clear()} catch(e){}; + Newsjs.listFriends(login,db,function(contactsobject){ for (var j=0;j1){ + contactsobject[j].screen_name=contactsobject[j].screen_name+"+"+contactsobject[j].cid + } contactsModel.append({"contact":contactsobject[j]}); } - },"isFriend",0,"screen_name ASC"); + },searchText.text,-1); } MButton { id: cleanButton @@ -61,17 +64,40 @@ Item{ anchors.right: parent.right onClicked: { Service.cleanContacts(root.login,root.db,function(){ - try {contactsModel.clear()} catch(e){print(e)}; - Helperjs.readData(db, "contacts",root.login.username,function(contactsobject){ - for (var j=0;j +// +// 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 . + +import QtQuick 2.11 +import QtQuick.Controls 2.12 +import QtQuick.Controls.Material 2.12 +import QtQuick.Layouts 1.11 +import QtQuick.LocalStorage 2.0 +import "qrc:/js/helper.js" as Helperjs +import "qrc:/js/service.js" as Service +import "qrc:/js/news.js" as Newsjs +import "qrc:/qml/contactqml" +import "qrc:/qml/genericqml" + +Page{ + id: contactsSearchPage + + + function search(term){ + contactSearchBusy.running=true; + try {contactsSearchModel.clear()} catch(e){}; + xhr.clearParams(); + xhr.setLogin(login.username+":"+Qt.atob(login.password)); + xhr.setUrl(login.server); + xhr.setApi("/api/v1/accounts/search"); + xhr.setParam("q",term); + xhr.setParam("limit",99) + xhr.get(); + } + + Connections{ + target:xhr + function onError(data,url,api,code){ + if (data !="contactlist"){Helperjs.showMessage(qsTr("Network Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root);} + contactSearchBusy.running=false; + } + function onSuccess(data,api){ + if (api=="/api/v1/accounts/search" && data!=""){ + try{var searchlist = JSON.parse(data);}catch(e){print("Error "+e)} + contactSearchBusy.running=false; + if (Array.isArray(searchlist)){ + searchlist.sort(function(a,b){ + if (a.group > b.group) { + return -1; + } + if (a.group < b.group) { + return 1; + } + return 0 + }) + for (let i=0;i1){ friendsobject[i].screen_name=friendsobject[i].screen_name+"+"+friendsobject[i].cid } friendsModel.append({"contact":friendsobject[i],"contactType":qsTr("Friends")}); } - },"isFriend",1,"screen_name ASC"); + },(searchText.text==""?searchText.preeditText:searchText.text)); } + Connections{ target:xhr function onDownloaded(type,url,filename,i){ @@ -84,6 +84,7 @@ Item{ } } } + MButton { id: updateFriendsButton text: "\uf021" @@ -95,6 +96,7 @@ Item{ Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){}); updatenews.setDatabase(); updatenews.login(); + updatenews.setSyncAll(false); updatenews.friendrequests(); //root.contactLoadType="friends"; Newsjs.requestFriends(root.login,db,root,function(nc){ @@ -115,12 +117,34 @@ Item{ value: friendsGridTab.currentContact/root.newContacts.length } + Rectangle { + id:searchComponent + x: mm; y:mm + color: Material.backgroundColor + radius:0.5*mm + width: 10*root.fontFactor*osSettings.bigFontSize + height: 2*root.fontFactor*osSettings.bigFontSize + TextField { + id: searchText + color: Material.primaryTextColor + focus: true + font.pointSize: osSettings.systemFontSize + wrapMode: Text.Wrap + anchors.fill:parent + selectByMouse: true + cursorVisible: false + placeholderText: "\uf0b0" + onTextChanged: if (text.length>0){showFriends(root.login.username)} + onPreeditTextChanged: {if (preeditText.length>0){showFriends(root.login.username)}} + } + } + Component { id: sectionHeading Rectangle { width: friendsView.width height: childrenRect.height - color: Material.dialogColor //color: "lightsteelblue" + color: Material.backgroundColor required property string section Text { color: Material.secondaryTextColor @@ -131,6 +155,28 @@ Item{ } } //GridView { + + + Component { id:headerComponent + Rectangle{ + color: Material.dialogColor + width:friendsView.width + height:6*mm + Text{ + color: Material.primaryTextColor + font.pointSize: osSettings.bigFontSize + anchors.centerIn: parent + text:"\uf234" + } + MouseArea{ + anchors.fill:parent + onClicked:{ + rootstackView.push("qrc:/qml/contactqml/ContactsSearchPage.qml") + } + } + } + } + ListView{ id: friendsView x:mm @@ -145,6 +191,7 @@ Item{ // } model: friendsModel delegate: ContactComponent { } + header:headerComponent section.property: "contactType" section.criteria: ViewSection.FullString section.delegate: sectionHeading diff --git a/source-linux/qml/contactqml/FriendsTab.qml b/source-linux/qml/contactqml/FriendsTab.qml index 061ed19..48bdd86 100644 --- a/source-linux/qml/contactqml/FriendsTab.qml +++ b/source-linux/qml/contactqml/FriendsTab.qml @@ -65,38 +65,38 @@ Rectangle { TabBar { id: friendsbar - width: osSettings.osType=="Android"?parent.width-2*osSettings.bigFontSize:parent.width - height: 9*mm - x: osSettings.osType=="Android"?2*osSettings.bigFontSize:0 + width: osSettings.osType=="Android"?parent.width-2*root.fontFactor*osSettings.bigFontSize:parent.width + height: 2*root.fontFactor*osSettings.bigFontSize + x: osSettings.osType=="Android"?2*root.fontFactor*osSettings.bigFontSize:0 visible: !wideScreen position:TabBar.Header currentIndex: 1 TabButton { text: qsTr("Me") font.pointSize: osSettings.systemFontSize - height: 7*mm + height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm } TabButton { text: qsTr("Friends") font.pointSize: osSettings.systemFontSize - height: 7*mm + height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm } TabButton { text: qsTr("Contacts") font.pointSize: osSettings.systemFontSize - height: 7*mm + height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm } TabButton { text: qsTr("Groups") font.pointSize: osSettings.systemFontSize - height: 7*mm + height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm } } LeftDrawerLinux{ id:leftDrawer visible: wideScreen&&rootstackView.depth<2 - width: visible?osSettings.systemFontSize*15:0 + width: visible?root.fontFactor*osSettings.systemFontSize*15:0 height: root.height-bar.height } diff --git a/source-linux/qml/contactqml/GroupComponent.qml b/source-linux/qml/contactqml/GroupComponent.qml index 19947a7..b7bc434 100644 --- a/source-linux/qml/contactqml/GroupComponent.qml +++ b/source-linux/qml/contactqml/GroupComponent.qml @@ -56,16 +56,8 @@ Item { height: parent.height-mm radius: 0.5*mm border.color: "grey" - color:Material.backgroundColor//"white" + color:Material.backgroundColor -// Image { -// id: photoImage -// x:1 -// y:1 -// width: 10*mm -// height:10*mm -// source:"qrc:/images/defaultcontact.jpg" -// } Rectangle{ id:namelabelRect x: 1 @@ -147,112 +139,7 @@ Item { delegate: ContactComponent { }// groupMember function processContactSelection(contactobject){showContactdetails(contactobject)} } - ListModel{id: groupModel} - -// Component { -// id:groupMember -// Rectangle{ -// width:parent.width -// height:6*mm -// Rectangle{id:memberrectangle -// border.color: "#EEEEEE" -// border.width: 1 -// width:parent.width-12*mm -// height:6*mm -// Image { -// id: memberImage -// x:1 -// y:1 -// width: 5*mm -// height:5*mm -// source:(groupmember.isFriend==1)? "file://"+groupmember.profile_image :groupmember.profile_image_url -// onStatusChanged: if (photoImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} -// } -// Text{ -// font.pixelSize: 3*mm -// anchors.left: memberImage.right -// anchors.margins: 1*mm -// width:parent.width-1 -// text:groupmember.name -// } -// MouseArea{ -// anchors.fill: parent -// onClicked:{ -//// root.currentIndex=1; -//// friendstab.active=true; -//// root.contactdetailsSignal(groupmember) -// root.currentIndex=0; -// root.contactdetailsSignal(groupmember) -// } -// } -// // BlueButton{ -// // anchors.left: memberrectangle.right -// // anchors.margins: 1*mm -// // text: "\uf056" -// // onClicked:{ -// // groupModel.remove(index) -// // } -// // } -// } -// } -// } - - - -// Row{ -// anchors.top: groupListView.bottom -// anchors.topMargin: mm -// spacing: mm -// } - -// BlueButton{ -// id: addMembers -// text:"\uf234" -// onClicked: { -// Newsjs.listFriends(root.login,root.db,function(userdata){ -// var newlistcontacts=[]; -// for (var n in userdata){ -// if (groupmembers.indexOf(userdata[n].id)==-1){ -// newlistcontacts.push(userdata[n]) -// } -// } -// var component = Qt.createComponent("qrc:/qml/contactqml/Contactlist.qml"); -// var contactlistobject = component.createObject(groupListView,{"possibleUsers":newlistcontacts}); - -// }) -// } -// } - -// BlueButton{ -// id: updateButton -// text: "\uf0ee" -// onClicked:{ -// var groupobject={}; -// var groupmembers=[]; -// for (var i=0;i"+qsTr("Connect")+"
    ") Rectangle { id: wrapper width:parent.width - height: parent.height//8*mm + height: parent.height radius: 0.5*mm - border.color: Material.backgroundDimColor// "grey" - color: Material.backgroundColor//"white" + border.color: Material.backgroundDimColor + color: Material.backgroundColor Image { id: photoImage x:0.5*mm y:0.5*mm - width: 4*root.fontFactor*osSettings.systemFontSize//7*mm - height:4*root.fontFactor*osSettings.systemFontSize//7*mm + width: 4*root.fontFactor*osSettings.systemFontSize + height:4*root.fontFactor*osSettings.systemFontSize source:((contact.profile_image!="") && (typeof(contact.profile_image)=="string"))? "file://"+contact.profile_image : contact.profile_image_url onStatusChanged: {if (photoImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"}} } Flow{ - width: wrapper.width-4*root.fontFactor*osSettings.systemFontSize//8*mm + width: wrapper.width-4*root.fontFactor*osSettings.systemFontSize height: wrapper.height-mm anchors.left: photoImage.right - anchors.margins: 1*mm - //spacing: mm + anchors.margins: 0.5*mm clip: true Label { id: namelabel - width: Math.min(wrapper.width-(photoImage.width+mm),contentWidth)//wrapper.width-4 - height: 1.1*root.fontFactor*osSettings.bigFontSize//3*mm + width: Math.min(wrapper.width-(photoImage.width+mm),contentWidth) + height: 1.1*root.fontFactor*osSettings.bigFontSize text: contact.name elide: contentWidth>wrapper.width-4*osSettings.systemFontSize?Text.ElideRight:Text.ElideNone - color: Material.secondaryTextColor//"#303030" + color: Material.secondaryTextColor font.pointSize: osSettings.bigFontSize } Label { id: screennamelabel - width: Math.min(wrapper.width-4*root.fontFactor*osSettings.systemFontSize,contentWidth)//contentWidth+2*mm//wrapper.width-8*mm - height: 1.1*root.fontFactor*osSettings.bigFontSize//3*mm + width: Math.min(wrapper.width-4*root.fontFactor*osSettings.systemFontSize,contentWidth) + height: 1.1*root.fontFactor*osSettings.bigFontSize text: "(@"+contact.screen_name+")" elide: contentWidth>wrapper.width-4*root.fontFactor*osSettings.systemFontSize?Text.ElideRight:Text.ElideNone - color: Material.secondaryTextColor//"#303030" + color: Material.secondaryTextColor font.pointSize: osSettings.bigFontSize } Label { id: descriptionlabel - width: Math.min(wrapper.width-4*root.fontFactor*osSettings.systemFontSize,contentWidth)//contentWidth+2*mm//wrapper.width-8*mm - height: 2*root.fontFactor*osSettings.systemFontSize//2.5*mm + width: wrapper.width-5*root.fontFactor*osSettings.systemFontSize + height: wrapper.height-mm-1.1*root.fontFactor*osSettings.bigFontSize + maximumLineCount:2 text: Qt.atob(contact.description)!=""?contact.description:"" - elide:contentWidth>wrapper.width-4*root.fontFactor*osSettings.systemFontSize?Text.ElideRight:Text.ElideNone - color: Material.secondaryTextColor//"#303030" + elide:Text.ElideRight + color: Material.secondaryTextColor font.pointSize: osSettings.systemFontSize } } diff --git a/source-linux/qml/genericqml/LeftDrawerLinux.qml b/source-linux/qml/genericqml/LeftDrawerLinux.qml index 46cf4e5..dae1e0f 100644 --- a/source-linux/qml/genericqml/LeftDrawerLinux.qml +++ b/source-linux/qml/genericqml/LeftDrawerLinux.qml @@ -53,5 +53,5 @@ Rectangle{ anchors.right: leftDrawer.right color: Material.dialogColor//"#EEEEEE" } - Component.onCompleted: {opened();} + //Component.onCompleted: {opened();} } diff --git a/source-linux/qml/genericqml/LinuxSync.qml b/source-linux/qml/genericqml/LinuxSync.qml index 9abc6e9..2c201df 100644 --- a/source-linux/qml/genericqml/LinuxSync.qml +++ b/source-linux/qml/genericqml/LinuxSync.qml @@ -8,6 +8,7 @@ Item { onTriggered: { updatenews.setDatabase(); updatenews.login(); + updatenews.setSyncAll(true) updatenews.startsync(); } } diff --git a/source-linux/qml/genericqml/PermissionDialog.qml b/source-linux/qml/genericqml/PermissionDialog.qml index e0e7c13..3e71ffe 100644 --- a/source-linux/qml/genericqml/PermissionDialog.qml +++ b/source-linux/qml/genericqml/PermissionDialog.qml @@ -38,67 +38,68 @@ import "qrc:/qml/genericqml" Rectangle{ id:permissionDialog color: Material.backgroundColor -// x: mm + // x: mm width: parent.width-5*mm height:root.height/3 function updatePerms(){ for (var i=0;i-1){contactstatus="positive"} - else if (contact_deny.indexOf(contacts[name].cid)>-1){contactstatus="negative"} - contactModel.append({"contact":contacts[name],"contactstatus":contactstatus}) - }},"isFriend",1,"name"); + var contactstatus="neutral"; + if (contact_allow.indexOf(contacts[name].cid)>-1){contactstatus="positive"} + else if (contact_deny.indexOf(contacts[name].cid)>-1){contactstatus="negative"} + contactModel.append({"contact":contacts[name],"contactstatus":contactstatus}) + }},"isFriend",1,"name"); - Helperjs.readData(db,"groups",login.username,function(owngroups){ + Helperjs.readData(db,"groups",login.username,function(owngroups){ for (var number in owngroups){ - var groupstatus= "neutral"; - if (group_allow.indexOf(owngroups[number].gid)>-1){groupstatus="positive"} - else if (group_deny.indexOf(owngroups[number].gid)>-1){groupstatus="negative"} - groupModel.append({"group":owngroups[number],"groupstatus":groupstatus}) - }}); - } + var groupstatus= "neutral"; + if (group_allow.indexOf(owngroups[number].gid)>-1){groupstatus="positive"} + else if (group_deny.indexOf(owngroups[number].gid)>-1){groupstatus="negative"} + groupModel.append({"group":owngroups[number],"groupstatus":groupstatus}) + }}); + } } diff --git a/source-linux/qml/genericqml/Search.qml b/source-linux/qml/genericqml/Search.qml index be8ddb6..93b85f0 100644 --- a/source-linux/qml/genericqml/Search.qml +++ b/source-linux/qml/genericqml/Search.qml @@ -38,6 +38,7 @@ Rectangle { id:searchComponent color: Material.backgroundColor radius:0.5*mm + property bool selfdestroying:false /* anchors.left: parent.left anchors.leftMargin:mm anchors.top:parent.top @@ -54,7 +55,10 @@ Rectangle { anchors.fill: parent selectByMouse: true cursorVisible: false - onEditingFinished:{ if (displayText!=""){search(displayText)};searchComponent.destroy()} + onAccepted:{ + if (displayText!=""){search(displayText)}; + if(selfdestroying){searchComponent.destroy()} + } } Component.onCompleted: searchText.forceActiveFocus() } diff --git a/source-linux/qml/newsqml/ContactPage.qml b/source-linux/qml/newsqml/ContactPage.qml index 0f49d78..8bd1459 100644 --- a/source-linux/qml/newsqml/ContactPage.qml +++ b/source-linux/qml/newsqml/ContactPage.qml @@ -44,8 +44,6 @@ Page { property var contact:({}) property string profileimagesource:contact.profile_image - //function backRequested(){pageStack.pop()} - function getDateDiffString (seconds){ var timestring=""; if (seconds<60) {timestring= Math.round(seconds) + " " +qsTr("seconds");} @@ -141,14 +139,12 @@ Page { Component { id: contactHeader Rectangle{ - border.color: Material.backgroundDimColor//"#EEEEEE" + border.color: Material.backgroundDimColor border.width: 1 - color: Material.backgroundColor//"white" + color: Material.backgroundColor width:contactView.width height: contactView.width<35*root.fontFactor*osSettings.systemFontSize?(profileImage.height+namelabel.height+detailtext.height+7*mm):Math.max(profileImage.height,(buttonflow.height+namelabel.height+detailtext.height))+7*mm - //height: wrapper.height property var createdAtDate: new Date(contact.created_at) - property string connectUrl: (contact.network!=="dfrn")||(contact.isFriend!=0)?"":( ""+qsTr("Connect")+"
    ") Image { id: profileImage @@ -160,7 +156,7 @@ Page { onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} Connections{ target:contactList - onProfileimagesourceChanged:profileImage.source=profileimagesource + function onProfileimagesourceChanged(){profileImage.source=profileimagesource} } } Flow{id:buttonflow @@ -175,7 +171,7 @@ Page { id:photobutton height: 6*mm width: 8*mm - text: "\uf03e" // "Photos" + text: "\uf03e" visible:(contact.network=="dfrn") onClicked:{ rootstack.currentIndex=2; @@ -193,7 +189,7 @@ Page { height: 6*mm width: 8*mm visible: (contact.following=="true") - text: "\uf040" //"DM" + text: "\uf040" onClicked:{ rootstack.currentIndex=0; newsSwipeview.currentIndex=2; @@ -217,9 +213,8 @@ Page { } MButton{ id:approvebutton - visible:(contact.hasOwnProperty("acct")) + visible:(contact.hasOwnProperty("acct")&&!contact.searchContact) height: 6*mm - //width: implicitContentWidth+2*mm//8*mm text:qsTr("Approve") onClicked:{ @@ -232,9 +227,8 @@ Page { } MButton{ id:rejectbutton - visible:(contact.hasOwnProperty("acct")) + visible:(contact.hasOwnProperty("acct")&&!contact.searchContact) height: 6*mm - //width: implicitContentWidth+2*mm//8*mm text:qsTr("Reject") onClicked:{ Helperjs.friendicaPostRequest(login,"/api/v1/follow_requests/" + contact.id + "/reject",'',"POST",root,function(returnvalue){ @@ -246,9 +240,8 @@ Page { } MButton{ id:ignorebutton - visible:(contact.hasOwnProperty("acct")) + visible:(contact.hasOwnProperty("acct")&&!contact.searchContact) height: 6*mm - //width: implicitContentWidth+2*mm//8*mm text:qsTr("Ignore") onClicked:{ Helperjs.friendicaPostRequest(login,"/api/v1/follow_requests/" + contact.id + "/ignore",'',"POST",root,function(returnvalue){ @@ -260,9 +253,8 @@ Page { } MButton{ id:followbutton - visible:(contact.isFriend==0) + visible:(contact.isFriend==0 || !contact.hasOwnProperty("isFriend")) height: 6*mm - //width: implicitContentWidth+2*mm//8*mm text:qsTr("Follow") onClicked:{ contactBusy.running=true; @@ -281,7 +273,6 @@ Page { id:unfollowbutton visible:(contact.isFriend==1) height: 6*mm - //width: implicitContentWidth+2*mm//8*mm text:qsTr("Unfollow") onClicked:{ Helperjs.friendicaPostRequest(login,"/api/v1/accounts/" + contact.id + "/unfollow",'',"POST",root,function(returnvalue){ @@ -297,12 +288,11 @@ Page { }//Flow end Label { id: namelabel - //x:mm width: contactView.width<35*root.fontFactor*osSettings.systemFontSize?contactView.width-2*mm:contactView.width-17*root.fontFactor*osSettings.bigFontSize height: implicitHeight text:contact.name+" (@"+contact.screen_name+")" - wrapMode: Text.Wrap//elide:Text.ElideRight - color: Material.primaryTextColor//"#303030" + wrapMode: Text.Wrap + color: Material.primaryTextColor font.pointSize: 1.2*osSettings.bigFontSize font.family: "Noto Sans" anchors.top: contactView.width<35*root.fontFactor*osSettings.systemFontSize?profileImage.bottom:buttonflow.bottom @@ -314,7 +304,6 @@ Page { anchors.top: namelabel.bottom anchors.left: contactView.width<35*root.fontFactor*osSettings.systemFontSize?contactView.left:profileImage.right anchors.margins: 2*mm - //x:mm width: contactView.width<35*root.fontFactor*osSettings.systemFontSize?contactView.width-2*mm:contactView.width-17*root.fontFactor*osSettings.bigFontSize height: implicitHeight font.pointSize: osSettings.systemFontSize @@ -324,15 +313,11 @@ Page { color: Material.primaryTextColor text:""+qsTr("Description")+": "+(Qt.atob(contact.description)!=""?contact.description:"")+"
    "+qsTr("Location")+": "+contact.location+"
    "+qsTr("Posts")+": "+contact.statuses_count+ "
    "+qsTr("URL")+": "+contact.url+"
    "+ - connectUrl+ ""+qsTr("Created at")+": "+createdAtDate.toLocaleString(Qt.locale()) + ""+qsTr("Created at")+": "+createdAtDate.toLocaleString(Qt.locale()) onLinkActivated: { Qt.openUrlExternally(link)} } - - - //} } - }//Component end Connections{ @@ -342,8 +327,9 @@ Page { contactBusy.running=false; } function onSuccess(data,api){ - Service.processNews(api,data) - //replySignal("") + if (api=="/api/statuses/user_timeline"){ + Service.processNews(api,data) + } } } @@ -373,7 +359,6 @@ Page { anchors.rightMargin: 1*mm width: 2*root.fontFactor*osSettings.bigFontSize; text: "\uf057" - //font.pixelSize: 3*mm onClicked: { rootstackView.pop() } @@ -382,9 +367,10 @@ Page { xhr.clearParams(); xhr.setLogin(login.username+":"+Qt.atob(login.password)); xhr.setUrl(login.server); - if(contact.isFriend==1 || contact.hasOwnProperty("acct")){ - xhr.setApi("/api/statuses/user_timeline");} - else{xhr.setApi("/api/users/show");} + // if(contact.isFriend==1 || contact.hasOwnProperty("acct")){ + // xhr.setApi("/api/statuses/user_timeline");} + // else{xhr.setApi("/api/users/show");} + xhr.setApi("/api/statuses/user_timeline") xhr.setParam("user_id",contact.id) xhr.get(); } diff --git a/source-linux/qml/newsqml/MessageSend.qml b/source-linux/qml/newsqml/MessageSend.qml index b7023e7..5159d0b 100644 --- a/source-linux/qml/newsqml/MessageSend.qml +++ b/source-linux/qml/newsqml/MessageSend.qml @@ -34,7 +34,6 @@ import QtQuick 2.4 import QtQuick.Controls 2.12 import QtQuick.Controls.Material 2.12 -//import QtQuick.Dialogs 1.2 import "qrc:/js/helper.js" as Helperjs import "qrc:/js/smiley.js" as Smileyjs import "qrc:/js/news.js" as Newsjs @@ -42,19 +41,17 @@ import "qrc:/qml/genericqml" Rectangle{ - color:Material.dialogColor//"#EEEEEE" + color:Material.dialogColor width:parent.width - height: conversation || (newsSwipeview.stacktype!="Notifications")?messageColumn.height+mm:0 + height: conversation || (newsSwipeview.stacktype!="Notifications")?messageColumn.height+2*mm:0 id:messageSend visible:conversation || (newsSwipeview.stacktype!="Notifications")||(newstab.newstabstatus!="Search")?true:false property string parentId: "" property bool textfocus: false - //property var parentObject:({}) property bool conversation: false property string reply_to_user:"" property alias bodyMessage: bodyField.text property var attachImageURLs: []; - //property int directmessage: 0; property var contacts: [] property var groups: [] property var contact_allow:login.hasOwnProperty("permissions")?login.permissions[0]:[] @@ -130,13 +127,12 @@ Rectangle{ } function setParent(newsitemobject){ - //print("Newsobject "+newsitemobject.id+ " "+JSON.stringify(newsitemobject.user)); if (newsitemobject!=""){ messageSend.state="conversation" messageSend.reply_to_user=newsitemobject.user.screen_name; messageSend.parentId=newsitemobject.id } else { - //messageSend.state=null; + messageSend.state=null; messageSend.reply_to_user=""; messageSend.parentId=""; bodyField.text=""; @@ -145,7 +141,7 @@ Rectangle{ } } - function contactmenu(letter){//print("letter "+letter) + function contactmenu(letter){ Newsjs.listFriends(login,db,function(contacts){ contactModel.clear(); for (var i=0;i1)||(attachImageURLs.length>0) spacing: mm - height: 12*mm + height: 2.5*root.fontFactor*osSettings.bigFontSize//12*mm x: 0.5*mm - MButton{id:permButton - visible: !conversation && (newsSwipeview.stacktype!=="DirectMessages") - height: 2*root.fontFactor*osSettings.bigFontSize - width: 2*root.fontFactor*osSettings.bigFontSize - text: ((contact_allow.length==0)&&(contact_deny.length==0)&&(group_allow.length==0)&&(group_deny.length==0))?"\uf09c":"\uf023" - onClicked: { if (permissionDialog.visible==false){permissionDialog.visible=true} else{permissionDialog.visible=false}} - } +// MButton{id:permButton //Permissions not working in Friendica 02/2022 +// visible: !conversation && (newsSwipeview.stacktype!=="DirectMessages") +// height: 2*root.fontFactor*osSettings.bigFontSize +// width: 2*root.fontFactor*osSettings.bigFontSize +// text: ((contact_allow.length==0)&&(contact_deny.length==0)&&(group_allow.length==0)&&(group_deny.length==0))?"\uf09c":"\uf023" +// onClicked: { if (permissionDialog.visible==false){permissionDialog.visible=true} else{permissionDialog.visible=false}} +// } MButton { id: attachButton height: 2*root.fontFactor*osSettings.bigFontSize @@ -440,8 +450,8 @@ Rectangle{ var body=bodyField.getFormattedText(0,bodyField.length); var dmbody=bodyField.getText(0,bodyField.length); if (conversation || newsSwipeview.stacktype!=="DirectMessages"){ - statusUpdate(title,body,parentId,attachImageURLs)} - else { + statusUpdate(title,body,parentId,attachImageURLs) + }else { if (reply_to_user!=""){dmUpdate(title,dmbody,parentId,reply_to_user)} else{Helperjs.showMessage(qsTr("Error"),qsTr("No receiver supplied!"),root)} } diff --git a/source-linux/qml/newsqml/NewsImage.qml b/source-linux/qml/newsqml/NewsImage.qml index 1bba645..0a7c71e 100644 --- a/source-linux/qml/newsqml/NewsImage.qml +++ b/source-linux/qml/newsqml/NewsImage.qml @@ -55,7 +55,7 @@ AnimatedImage {id:gif; MouseArea {anchors.fill:parent; onClicked:{ rootstackView.push("qrc:/qml/newsqml/NewsPhotolist.qml",{"photolistarray": model.newsitemobject.imageAttachmentList}) - roottoolbar.visible=false + //roottoolbar.visible=false } } } diff --git a/source-linux/qml/newsqml/NewsPhotolist.qml b/source-linux/qml/newsqml/NewsPhotolist.qml index 929ed67..b51dd10 100644 --- a/source-linux/qml/newsqml/NewsPhotolist.qml +++ b/source-linux/qml/newsqml/NewsPhotolist.qml @@ -69,7 +69,7 @@ Page{ text: "\uf057" onClicked: { if (rootstackView.depth>1){ - roottoolbar.visible=true; + //roottoolbar.visible=true; rootstackView.pop()} } } diff --git a/source-linux/qml/newsqml/NewsStack.qml b/source-linux/qml/newsqml/NewsStack.qml index 582eb66..bcbd5fe 100644 --- a/source-linux/qml/newsqml/NewsStack.qml +++ b/source-linux/qml/newsqml/NewsStack.qml @@ -49,7 +49,6 @@ Rectangle{ BusyIndicator{ id: newsBusy - //visible: false anchors.horizontalCenter: parent.horizontalCenter anchors.top:parent.top anchors.topMargin: 2*mm @@ -60,10 +59,8 @@ Rectangle{ } function newstypeHandling(newstype){ - newsBusy.running=true; + try{newsBusy.running=true}catch(e){print(e)}; replySignal(""); - //messagesend.state=""; - //newsModel.clear(); switch(newstype){ case "timeline": newstab.newstabstatus="Timeline"; @@ -75,7 +72,7 @@ Rectangle{ case "conversation": newsStack.updateMethodNews="conversation"; newstab.newstabstatus="Conversations"; - Newsjs.chatsfromdb(root.db,root.login,0,function(news,lastid){ + Newsjs.chatsfromdb(root.db,root.login,0,[],function(news,lastid){ lastnewsid=lastid; showNews(news)}); break; @@ -105,7 +102,7 @@ Rectangle{ newsBusy.running=false; var leftoffset=(osSettings.osType=="Android")?2*root.fontFactor*osSettings.bigFontSize:0 var component = Qt.createComponent("qrc:/qml/genericqml/Search.qml"); - var searchItem = component.createObject(newsStack,{y:mm,x:leftoffset,width:root.width-(leftoffset+mm),height: 1.5*root.fontFactor*osSettings.systemFontSize}); + var searchItem = component.createObject(newsStack,{y:mm,x:leftoffset,width:root.width-(leftoffset+mm),height: 1.5*root.fontFactor*osSettings.systemFontSize,selfdestroying:true}); break; case "refresh": if (newstab.newstabstatus=="Timeline" || newstabstatus=="Timeline"){ @@ -147,20 +144,19 @@ Rectangle{ function showNews(newsToShow){ try{if (rootstackView.depth>1){rootstackView.pop()}}catch(e){} newsBusy.running=false; - var currentTime= new Date(); - // downloadNotice.text=downloadNotice.text + "\n shownews start "+ Date.now(); - //print("appendnews "+JSON.stringify(newsToShow)) - if (newsToShow.length==1){var method="refresh"}else{var method = newsStack.updateMethodNews} - var msg = {'currentTime': currentTime, 'model': newsModel,'news':newsToShow,'method':method, 'options':globaloptions}; - newsWorker.sendMessage(msg); - //newsStack.appendNews=false + if(newsToShow.length>0){ + var currentTime= new Date() + // downloadNotice.text=downloadNotice.text + "\n shownews start "+ Date.now(); + if (newsToShow.length==1){var method="refresh"}else{var method = newsStack.updateMethodNews} + var msg = {'currentTime': currentTime, 'model': newsModel,'news':newsToShow,'method':method, 'options':globaloptions}; + newsWorker.sendMessage(msg); + } } function search(term){ if (term!=""){ - //newstab.newstabstatus="Search"; newstabstatus="Search"; newsBusy.running=true; newsStack.updateMethodNews="refresh"; @@ -179,10 +175,12 @@ Rectangle{ try{var oldnewsitemobject=newsModel.get(newsModel.count-1).newsitemobject; if(oldnewsitemobject.hasOwnProperty("lastcomment")){ var lastnews_id=oldnewsitemobject.lastcomment.created_at; + //var lastconv_id=oldnewsitemobject.lastcomment.statusnet_conversation_id }else{ var lastnews_id=oldnewsitemobject.created_at; + //var lastconv_id=oldnewsitemobject.statusnet_conversation_id } - } catch(e){print(e);var lastnews_id=99999999999999 } + } catch(e){print(e);var lastnews_id=99999999999999} var messagetype=0; switch(newsSwipeview.stacktype){ case "Home":messagetype=0;break; @@ -192,14 +190,19 @@ Rectangle{ default:messagetype=0; } - if(newstab.newstabstatus=="Timeline" || newstabstatus=="Timeline" ){ + if(newsSwipeview.stacktype!="Home"|| newstab.newstabstatus=="Timeline" || newstabstatus=="Timeline" ){ Newsjs.newsfromdb(root.db,root.login, messagetype,function(news){ var msg = {'currentTime': currentTime, 'model': newsModel,'news':news,'method':"", 'options':globaloptions}; newsWorker.sendMessage(msg); },false,lastnews_id)} else if(newstab.newstabstatus=="Conversations" || newstabstatus=="Conversations"){ - Newsjs.chatsfromdb(root.db,root.login, messagetype,function(news){ + var currentconversations=[]; + for (let c=0;c -// -// 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 . - -import QtQuick 2.8 -import QtQuick.Controls 2.12 -import "qrc:/js/helper.js" as Helperjs -import QtWebView 1.1 - - -Page { - id:newsYplayer - //color:"black" - width:root.width; - height:root.height-7*mm - property string url:"" - property string ytcode:"" - - WebView { - id: webView - anchors.fill: parent - z:1 - opacity: 0 - - url: root.osSettings.osType=="Android"?"https://youtube.com/watch?v="+ytcode:"qrc:/js/yplayer.html?" + ytcode - - Behavior on opacity { NumberAnimation { duration: 200 } } - - onLoadingChanged: { - switch (loadRequest.status) - { - case WebView.LoadSucceededStatus: - opacity = 1 - return - case WebView.LoadStartedStatus: - case WebView.LoadStoppedStatus: - break - case WebView.LoadFailedStatus: - print("Failed to load the requested video" + url) - break - } - opacity = 0 - } - onTitleChanged: { - if (title==2){root.pop()} - } - } -} diff --git a/source-linux/qml/newsqml/Newsitem.qml b/source-linux/qml/newsqml/Newsitem.qml index decc707..5dfddc3 100644 --- a/source-linux/qml/newsqml/Newsitem.qml +++ b/source-linux/qml/newsqml/Newsitem.qml @@ -58,23 +58,21 @@ Item { function pushConversation(){ if (model.newsitemobject.hasOwnProperty("currentconversation")){ rootstackView.push("qrc:/qml/newsqml/Conversation.qml",{"news": model.newsitemobject.currentconversation})} - //newsStack.push("qrc:/qml/newsqml/Conversation.qml",{"news": model.newsitemobject.currentconversation})} - //else{newsStack.push("qrc:/qml/newsqml/Conversation.qml")}; else{rootstackView.push("qrc:/qml/newsqml/Conversation.qml")}; showConversation(index,newsitemobject) } Rectangle{width:newsitem.width; height: 1; anchors.bottom: newsitem.bottom; - color: Material.backgroundDimColor//"light grey" + color: Material.backgroundDimColor } Rectangle{ width:newsitem.width height:newsitem.height-1 - color: Material.background//"white" + color: Material.background Column { - id:toprow //newscolumn + id:toprow width: newsitemobject.hasOwnProperty("indent")?newsitem.width-(newsitem.width/20 *(newsitemobject.indent+1)):newsitem.width//-8*mm x:newsitemobject.hasOwnProperty("indent")?newsitem.width/20*(newsitemobject.indent):0 height: newsitemobject.nsfw?5*mm:Math.min(implicitHeight,3/4*root.height) @@ -105,7 +103,6 @@ Item { anchors.margins: mm Label { id:user_name - //color: "grey" width:parent.width font.bold: true font.pointSize: osSettings.systemFontSize @@ -115,25 +112,24 @@ Item { Label { id:messageTypeLabel - color: Material.secondaryTextColor//"grey" + color: Material.secondaryTextColor text: if (newsitemobject.messagetype==1){ qsTr("Direct Message")} else if(newsitemobject.messagetype==2) {" Notification"} else {qsTr("Source: ")+newsitemobject.source} font.pointSize: 0.6*osSettings.systemFontSize } Label { id:createdAtLabel - color: Material.secondaryTextColor//"grey" + color: Material.secondaryTextColor font.pointSize: 0.6*osSettings.systemFontSize horizontalAlignment: Label.AlignRight text: " \u00B7 "+getDateDiffString(newsitemobject.dateDiff) + " " +qsTr("ago") } Label { id:replytoLabel - color: Material.secondaryTextColor//"grey" + color: Material.secondaryTextColor font.pointSize: 0.6*osSettings.systemFontSize font.family: "Noto Sans" horizontalAlignment: Label.AlignRight - text: try {" \u00B7 "+qsTr("In reply to ")+newsitemobject.reply_user.screen_name - }catch(e){" "} + text: (newsitemobject.in_reply_to_status_id!="null"&&newsitemobject.in_reply_to_status_id!=null)?" \u00B7 "+qsTr("In reply to ")+newsitemobject.reply_user.screen_name:" " } } } @@ -141,32 +137,27 @@ Item { MouseArea{id: itemBody width: toprow.width-2 height: itemMessage.height - //onPressAndHold: {pushConversation()} onClicked: {pushConversation()} Text { - color: Material.primaryTextColor//"#404040" - linkColor: Material.accentColor//"light green" + color: Material.primaryTextColor + linkColor: Material.accentColor id: itemMessage textFormat: Text.RichText font.family: "Noto Sans" font.pointSize: osSettings.systemFontSize text: newsitemobject.statusnet_html width: toprow.width-2 - //height:newsitemobject.nsfw?5*mm:Math.min(implicitHeight,3/4*root.height) height: implicitHeight wrapMode: Text.Wrap clip:true - onLinkActivated:{Qt.openUrlExternally(link)} - Component.onCompleted:{ - if (newsitemobject.messagetype==0){ - var hashtags=[]; - hashtags=Newsjs.findTags(newsitemobject.text); - var component = Qt.createComponent("qrc:/qml/newsqml/Hashtag.qml"); - for (var tags in hashtags){ - var hashtagQml = component.createObject(friendicaActivities,{"text":hashtags[tags].trim()}); - } + onLinkActivated:{ + if(link.startsWith(root.login.server+"\/search\?tag=")){ + newstab.newstabstatus="Search"; + root.searchSignal(link.substring(root.login.server.length+12,link.length)) } - + else{Qt.openUrlExternally(link)} + } + Component.onCompleted:{ if (newsitemobject.imageAttachmentList.length>0){ if(newsitemobject.imageAttachmentList[0].mimetype.substring(0,5)=="image"){ var component = Qt.createComponent("qrc:/qml/newsqml/NewsImage.qml"); @@ -195,16 +186,16 @@ Item { BlueButton{ width: newsitem.width-2 height:5*mm - anchors.bottom: toprow.bottom//itemMessage.bottom - visible: toprow.implicitHeight>3/4*root.height || newsitemobject.nsfw//messageColumn.implicitHeight>3/4*root.height || newsitemobject.nsfw//itemMessage.implicitHeight>3/4*root.height + anchors.bottom: toprow.bottom + visible: toprow.implicitHeight>3/4*root.height || newsitemobject.nsfw text:"\uf078" - fontColor: Material.secondaryTextColor//"grey" + fontColor: Material.secondaryTextColor border.color: "transparent" - color: Material.backgroundColor//"white" - // gradient: Gradient { - // GradientStop { position: 0.0; color: "transparent" } - // GradientStop { position: 0.5; color: "white" } - // } + color: Material.backgroundColor +// gradient: Gradient { +// GradientStop { position: 0.0; color: "transparent" } +// GradientStop { position: 0.5; color: Material.backgroundDimColor} +// } radius:0 onClicked: { if (text=="\uf078"){ @@ -224,45 +215,45 @@ Item { width:parent.width spacing:mm - Label{color: Material.secondaryTextColor//"grey" + Label{color: Material.secondaryTextColor height:3.5*mm font.pointSize: 0.75*osSettings.systemFontSize - text: friendica_activities_view.likeText + text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.likeText MouseArea{ anchors.fill: parent onClicked: { showActivityContacts(newsitemobject.friendica_activities.like)} } } - Label{color: Material.secondaryTextColor//"grey" + Label{color: Material.secondaryTextColor height:3.5*mm font.pointSize: 0.75*osSettings.systemFontSize - text: friendica_activities_view.dislikeText + text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.dislikeText MouseArea{ anchors.fill: parent onClicked: { showActivityContacts(newsitemobject.friendica_activities.dislike)} } } - Label{color: Material.secondaryTextColor//"grey" + Label{color: Material.secondaryTextColor height:3.5*mm font.pointSize: 0.75*osSettings.systemFontSize - text: friendica_activities_view.attendyesText + text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.attendyesText MouseArea{ anchors.fill: parent onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendyes)} }} - Label{color: Material.secondaryTextColor//"grey" + Label{color: Material.secondaryTextColor height:3.5*mm font.pointSize: 0.75*osSettings.systemFontSize - text: friendica_activities_view.attendnoText + text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.attendnoText MouseArea{ anchors.fill: parent onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendno)} } } - Label{color: Material.secondaryTextColor//"grey" + Label{color: Material.secondaryTextColor height:3.5*mm font.pointSize: 0.75*osSettings.systemFontSize - text: friendica_activities_view.attendmaybeText + text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.attendmaybeText MouseArea{ anchors.fill: parent onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendmaybe)} @@ -270,7 +261,7 @@ Item { } Label{ id:attendLabel - color: Material.secondaryTextColor//"grey" + color: Material.secondaryTextColor height:3.5*mm font.pointSize: 0.75*osSettings.systemFontSize horizontalAlignment: Label.AlignRight @@ -284,12 +275,12 @@ Item { height: root.fontFactor*osSettings.bigFontSize CheckBox{ id:likeCheckbox - width:newsitem.width/5 //10*mm + width:newsitem.width/5 height: parent.height visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false checked:(model.newsitemobject.friendica_activities_view.self.liked==1)?true:false indicator: Rectangle{ - implicitWidth: newsitem.width/5 //10*mm + implicitWidth: newsitem.width/5 implicitHeight:root.fontFactor*osSettings.bigFontSize color:"transparent" Text{ @@ -312,12 +303,12 @@ Item { } CheckBox{ id: dislikeCheckbox - width:newsitem.width/5 //10*mm + width:newsitem.width/5 height: parent.height visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false checked: (newsitemobject.friendica_activities_view.self.disliked==1)?true:false indicator: Rectangle{ - implicitWidth: newsitem.width/5 //10*mm + implicitWidth: newsitem.width/5 implicitHeight:root.fontFactor*osSettings.bigFontSize color:"transparent" Text{ @@ -339,39 +330,72 @@ Item { }} } - CheckBox { - id:favoritedCheckbox - visible:((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3)) - width: newsitem.width/5 // 10*mm +// CheckBox { +// id:favoritedCheckbox +// visible:((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3)) +// width: newsitem.width/5 +// height: parent.height +// indicator:Rectangle{ +// implicitWidth: newsitem.width/5 +// implicitHeight:root.fontFactor*osSettings.bigFontSize +// color:"transparent" +// Text{ +// anchors.centerIn: parent +// font.pointSize: osSettings.systemFontSize +// font.family:fontAwesome.name +// color: favoritedCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor +// text:"\uf005" +// } +// } +// checked:(newsitemobject.favorited>0) +// onClicked:{ +// if(favoritedCheckbox.checkState==Qt.Checked){ +// Newsjs.favorite(login,true,newsitemobject.id,root); model.newsitemobject.favorited=1} +// else if(favoritedCheckbox.checkState==Qt.Unchecked){ +// Newsjs.favorite(login,false,newsitemobject.id,root);model.newsitemobject.favorited=0} +// } +// } + Rectangle{ + width: newsitem.width/5 height: parent.height - indicator:Rectangle{ - implicitWidth: newsitem.width/5 //10*mm - implicitHeight:root.fontFactor*osSettings.bigFontSize - color:"transparent" - Text{ - anchors.centerIn: parent - font.pointSize: osSettings.systemFontSize - font.family:fontAwesome.name - color: favoritedCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor - text:"\uf005" - } + visible:(newsitemobject.messagetype!==2) + color:"transparent" + Text{ + id:replysymbol + color: Material.secondaryTextColor + anchors.centerIn: parent + font.pointSize: osSettings.systemFontSize + font.family:fontAwesome.name + text: "\uf112" } - checked:(newsitemobject.favorited>0) - onClicked:{ - if(favoritedCheckbox.checkState==Qt.Checked){ - Newsjs.favorite(login,true,newsitemobject.id,root); model.newsitemobject.favorited=1} - else if(favoritedCheckbox.checkState==Qt.Unchecked){ - Newsjs.favorite(login,false,newsitemobject.id,root);model.newsitemobject.favorited=0} + MouseArea{ + anchors.fill:parent + onClicked: { + var directmessage=0; + if (newsitemobject.messagetype==1){ directmessage=1} + var replycomp=Qt.createComponent("qrc:/qml/newsqml/MessageSend.qml"); + var conversation; + if (newsitem.ListView.view==null){conversation=true} + else if (newsitem.ListView.view.viewtype=="conversation"){ + conversation=true + newsitem.ListView.view.currentIndex=itemindex + } + else{ + conversation=false; + newsitem.ListView.view.currentIndex=itemindex + }; + var reply=replycomp.createObject(friendicaActivities,{parentId:newsitemobject.id,reply_to_user:newsitemobject.user.screen_name, state:"reply",conversation:conversation,textfocus:true}) + } } } Rectangle{ - width: newsitem.width/5 //10*mm + width: newsitem.width/5 height: parent.height visible:(newsitemobject.messagetype!==2) color:"transparent" Text{ id:newsmenusymbol - color: Material.secondaryTextColor//"grey" + color: Material.secondaryTextColor anchors.centerIn: parent font.pointSize: osSettings.systemFontSize font.family:fontAwesome.name @@ -393,30 +417,8 @@ Item { text: parent.text } } - Action{ - text: qsTr("Reply") - onTriggered: { - var directmessage=0; - if (newsitemobject.messagetype==1){ directmessage=1} - var replycomp=Qt.createComponent("qrc:/qml/newsqml/MessageSend.qml"); - var conversation; - if (newsitem.ListView.view==null){conversation=true} - else if (newsitem.ListView.view.viewtype=="conversation"){ - conversation=true - newsitem.ListView.view.currentIndex=itemindex - } - else{ - conversation=false; - newsitem.ListView.view.currentIndex=itemindex - }; - var reply=replycomp.createObject(friendicaActivities,{parentId:newsitemobject.id,reply_to_user:newsitemobject.user.screen_name, state:"reply",conversation:conversation,textfocus:true}) - } - } - Action { - text: qsTr("DM") - onTriggered: { - root.directmessageSignal(newsitemobject.user.screen_name); - } + onAboutToShow:{if(newsitemobject.hasOwnProperty("external_url")){ + insertAction(4,externalAction)} } Action { text: qsTr("Repost") @@ -432,7 +434,21 @@ Item { pushConversation(); } } - + Action { + text: qsTr("DM") + onTriggered: { + root.directmessageSignal(newsitemobject.user.screen_name); + } + } + Action { + text: qsTr("Bookmark") + onTriggered: { + if(model.newsitemobject.favorited==0){ + Newsjs.favorite(login,true,newsitemobject.id,root); model.newsitemobject.favorited=1} + else if(model.newsitemobject.favorited==1){ + Newsjs.favorite(login,false,newsitemobject.id,root);model.newsitemobject.favorited=0} + } + } Menu{ title: qsTr("Attending") width: 10*root.fontFactor*osSettings.systemFontSize @@ -469,11 +485,6 @@ Item { }) } } - - //MenuItem{ - // text:qsTr("Show on website") - // onTriggered:Qt.openUrlExternally(login.server+"/display/"+newsitemobject - //} } Column{ id:conversationColumn @@ -481,4 +492,8 @@ Item { width: newsitem.width } } + Action{id:externalAction + text: qsTr("External") + onTriggered: {Qt.openUrlExternally(newsitemobject.external_url)} + } } diff --git a/source-linux/qml/newsqml/SmileyDialog.qml b/source-linux/qml/newsqml/SmileyDialog.qml index 0e19dbb..4cac895 100644 --- a/source-linux/qml/newsqml/SmileyDialog.qml +++ b/source-linux/qml/newsqml/SmileyDialog.qml @@ -207,7 +207,7 @@ Rectangle{ width:4.5*mm height: 4.5*mm textFormat:Text.RichText - font.pointSize: 1.2*osSettings.systemFontSize + font.pointSize: osSettings.osType=="Linux"?1.7*osSettings.systemFontSize:1.2*osSettings.systemFontSize text: emoji MouseArea{ diff --git a/source-linux/qml/photoqml/ImageUploadDialog.qml b/source-linux/qml/photoqml/ImageUploadDialog.qml index 3a5b68d..db22dd7 100644 --- a/source-linux/qml/photoqml/ImageUploadDialog.qml +++ b/source-linux/qml/photoqml/ImageUploadDialog.qml @@ -88,7 +88,7 @@ Page{ Connections{ target:xhr - onError:{print(data)}//if (data=="image"){Helperjs.showMessage()}} + //onError:{print(data)}//if (data=="image"){Helperjs.showMessage()}} onSuccess:{ if (imageId==""){ imageNo=imageNo+1; diff --git a/source-linux/qml/photoqml/PhotoTab.qml b/source-linux/qml/photoqml/PhotoTab.qml index 40dc907..4a1c854 100644 --- a/source-linux/qml/photoqml/PhotoTab.qml +++ b/source-linux/qml/photoqml/PhotoTab.qml @@ -41,298 +41,293 @@ import "qrc:/qml/genericqml" StackView{ id: photoStack - //anchors.fill:parent initialItem:Rectangle { - id:fotorectangle - anchors.fill:parent -// y:1 -// width:root.width-mm -// height:root.height-5*mm - color: Material.backgroundColor//'#fff' - property var newimages:[] - property int currentimageno: 0 - property bool remoteContact: false + id:fotorectangle + anchors.fill:parent + color: Material.backgroundColor + property var newimages:[] + property int currentimageno: 0 + property bool remoteContact: false - onNewimagesChanged:{ - if(fotorectangle.newimages.length>0){ - var ownimagelist=[]; - Helperjs.readField("album",root.db,"imageData",root.login.username,function(albums){ - for (var i=0;i0){ + var ownimagelist=[]; + Helperjs.readField("album",root.db,"imageData",root.login.username,function(albums){ + for (var i=0;i 1){photoStack.pop()} - else if(albumgridview.currentItem==null){rootstack.currentIndex=0} - else if(albumgridview.currentItem.state=='fullscreen'){ - albumgridview.currentItem.state = 'inGrid'} - else if (albumgridview.currentItem.state == 'inGrid'){albumgridview.currentItem.state=''} - else{rootstack.currentIndex=0} - } - else{ - try {photogroupModel.clear()}catch (e){print(e)} - if (friend){ - Imagejs.newRequestFriendsAlbumPictures(login,friend,fotorectangle,function(albums,remoteAuthBool){ - remoteContact=remoteAuthBool; - var msg = {'model': photogroupModel,'albums':albums,'firstalbum':0,'foreignPicture':true,'friend':friend} - photoWorker.sendMessage(msg); - }) - phototabstatusButton.text=friend.screen_name+qsTr("\'s images") - - } - else { - Helperjs.readField("album", db, "imageData",login.username,function(albums){ - if (albums[0]) { - var msg = { 'model': photogroupModel,'albums':albums,'firstalbum':0,'foreignPicture': false}; - photoWorker.sendMessage(msg); + //ownimagelist.push(root.login.server+"/api/friendica/photo?scale='0'&photo_id="+fotorectangle.newimages[i].id); } + Imagejs.dataRequest(login,fotorectangle.newimages[0],db,xhr,fotorectangle); }) + // xhr.setLogin(login.username+":"+Qt.atob(login.password)); + // xhr.setImagedir(login.imagestore); + // xhr.setFilelist(ownimagelist); + // xhr.setDownloadtype("picturelist"); + // xhr.getlist(); + newImagesProgress.visible=true } } - } - function deletepics(method, type,id){ + onCurrentimagenoChanged:{ + if(fotorectangle.currentimageno==fotorectangle.newimages.length){ + newImagesProgress.visible=false;showFotos(root.login,""); + fotorectangle.newimages=[];fotorectangle.currentimageno=0 + }else{ + // download next image + Imagejs.dataRequest(login,fotorectangle.newimages[currentimageno],db,xhr,fotorectangle) + } + } + + Connections{ + target:xhr + function onDownloadedjson(type,url,filename,i,jsonObject){ + if(type=="picturelist"){ + fotorectangle.currentimageno=fotorectangle.currentimageno+1 + Imagejs.storeImagedata(login,db,jsonObject,fotorectangle) + } + } + function onDownloaded(type,url,filename,i){ + if(type=="picture"){fotorectangle.currentimageno=fotorectangle.currentimageno+1} + } + function onError(data,url,api,code){ + if(data=="picturelist"){ + var requestid=url.substring(url.lastIndexOf("=")+1); + Imagejs.dataRequest(login,requestid,db,xhr,fotorectangle); + fotorectangle.currentimageno=fotorectangle.currentimageno+1 + } else if (data=="picture"){ + Helperjs.deleteData(root.db,"imageData",root.login.username,function(){ + fotorectangle.currentimageno=fotorectangle.currentimageno+1 + },"link",url) + }else{ + fotorectangle.currentimageno=fotorectangle.currentimageno+1} + } + } + // Connections{ + // target:filesystem + // onError:{print("Error deleting"); + // } + // onSuccess:print("Success deleting"); + // } + + function showFotos(login,friend){ + if(friend=="backButton"){ + if (photoStack.depth > 1){photoStack.pop()} + else if(albumgridview.currentItem==null){rootstack.currentIndex=0} + else if(albumgridview.currentItem.state=='fullscreen'){ + albumgridview.currentItem.state = 'inGrid'} + else if (albumgridview.currentItem.state == 'inGrid'){albumgridview.currentItem.state=''} + else{rootstack.currentIndex=0} + } + else{ + try {photogroupModel.clear()}catch (e){print(e)} + if (friend){ + Imagejs.newRequestFriendsAlbumPictures(login,friend,fotorectangle,function(albums,remoteAuthBool){ + remoteContact=remoteAuthBool; + var msg = {'model': photogroupModel,'albums':albums,'firstalbum':0,'foreignPicture':true,'friend':friend} + photoWorker.sendMessage(msg); + }) + phototabstatusButton.text=friend.screen_name+qsTr("\'s images") + + } + else { + Helperjs.readField("album", db, "imageData",login.username,function(albums){ + if (albums[0]) { + var msg = { 'model': photogroupModel,'albums':albums,'firstalbum':0,'foreignPicture': false}; + photoWorker.sendMessage(msg); + } + }) + } + } + } + + function deletepics(method, type,id){ if(method=="delete"){Imagejs.deleteImage(db,login,type, id,filesystem,root,function(){//showFotos("") })} - } - function updatepic(method,type,id){ + } + function updatepic(method,type,id){ if(method=="update"){ Helperjs.readData(db,"imageData",login.username,function(url){ - photoStack.push( - "qrc:/qml/photoqml/ImageUploadDialog.qml",{"attachImageURLs":[url[0].location+url[0].filename],"imageId":id,"currentAlbum":url[0].album} + photoStack.push( + "qrc:/qml/photoqml/ImageUploadDialog.qml",{"attachImageURLs":[url[0].location+url[0].filename],"imageId":id,"currentAlbum":url[0].album} ) - },"id",id)} - } - - function uploadUrls(urls){ - photoStack.push("qrc:/qml/photoqml/ImageUploadDialog.qml",{"attachImageURLs":urls}) - } - - BlueButton{ - x:mm - y:mm - z:2 - visible: !wideScreen - fontColor: Material.secondaryTextColor//"grey" - border.color: "transparent" - text: "\uf0c9" - font.pointSize: osSettings.bigFontSize - onClicked:{ - leftDrawerAndroid.visible?leftDrawerAndroid.close():leftDrawerAndroid.open()} - } - - LeftDrawerLinux{ - id:leftDrawer - property var newstabstatus: newstab.newstabstatus - visible: wideScreen&&rootstackView.depth<2 - width: visible?osSettings.systemFontSize*15:0 - height: root.height-bar.height - } - - LeftDrawerAndroid{ - id: leftDrawerAndroid - } - - ProgressBar{ - id: newImagesProgress - width: 15*mm - height: updatePhotolist.height - anchors.top: parent.top - anchors.right:uploadPhoto.left - anchors.rightMargin:mm - visible: false - value: fotorectangle.currentimageno/fotorectangle.newimages.length - } - - MButton{ - id: uploadPhoto - anchors.top: parent.top - anchors.topMargin: 0.5*mm - anchors.right:updatePhotolist.left - anchors.rightMargin:mm - text:"\uf0ee" - onClicked: { - photoStack.push("qrc:/qml/photoqml/ImageUploadDialog.qml"); -// var component = Qt.createComponent("qrc:/qml/photoqml/ImageUploadDialog.qml"); -// var imageUpload = component.createObject(fotorectangle); - }} - - MButton{ - id: updatePhotolist - anchors.top: parent.top - anchors.topMargin: 0.5*mm - anchors.right:phototabstatusButton.left - anchors.rightMargin:mm - text:"\uf0ed" - - Menu { - id:photoupdatemenu - width:8*root.fontFactor*osSettings.bigFontSize - MenuItem { - text: qsTr("All Images") - font.pointSize: osSettings.bigFontSize - onTriggered: { - Imagejs.requestList(root.login,root.db, false, fotostab,function(obj){fotorectangle.newimages=obj})} - } - MenuItem { - text: qsTr("Only new") - font.pointSize: osSettings.bigFontSize - onTriggered: { - Imagejs.requestList(root.login,root.db, true,fotostab,function(obj){fotorectangle.newimages=obj})} - } + },"id",id)} } - onClicked: {photoupdatemenu.popup()} - } - MButton{ - id: phototabstatusButton - anchors.top: parent.top - anchors.topMargin: 0.5*mm - anchors.right: parent.right - anchors.rightMargin:2*mm - width: Math.max(8*root.fontFactor*osSettings.bigFontSize,implicitWidth) - text: fotostab.phototabstatus=="Images"?qsTr("Own Images"):fotostab.phototabstatus - Menu { - id:phototabmenu - width: 20*root.fontFactor*osSettings.bigFontSize - MenuItem { - text: qsTr("Own Images") - font.pointSize: osSettings.bigFontSize - onTriggered: { - fotostab.phototabstatus="Images"; - // phototabstatusButton.text=qsTr("Own images"); - showFotos(root.login,"")} - } + function uploadUrls(urls){ + photoStack.push("qrc:/qml/photoqml/ImageUploadDialog.qml",{"attachImageURLs":urls}) } - onClicked: {phototabmenu.popup()} - } + BlueButton{ + x:mm + y:mm + z:2 + visible: !wideScreen + fontColor: Material.secondaryTextColor//"grey" + border.color: "transparent" + text: "\uf0c9" + font.pointSize: osSettings.bigFontSize + onClicked:{ + leftDrawerAndroid.visible?leftDrawerAndroid.close():leftDrawerAndroid.open()} + } - DelegateModel{ - id: visualphotoModel - delegate: PhotogroupComponent{} - model: photogroupModel - } + LeftDrawerLinux{ + id:leftDrawer + property var newstabstatus: newstab.newstabstatus + visible: wideScreen&&rootstackView.depth<2 + width: visible?root.fontFactor*osSettings.systemFontSize*15:0 + height: root.height-bar.height + } - ListModel{ - id: photogroupModel - } + LeftDrawerAndroid{ + id: leftDrawerAndroid + } - GridView { - id: albumgridview - cellWidth: 17*mm - cellHeight: 17*mm - x: leftDrawer.width//mm; - y:8*mm - width: wideScreen&&rootstackView.depth<2?parent.width-leftDrawer.width-mm:parent.width-mm //parent.width-2*mm; - height: parent.height-9*mm - clip: true - model: visualphotoModel.parts.album - footer:Rectangle{ - border.color: Material.backgroundDimColor//"#EEEEEE" - border.width: 1 - width:12*mm - height:6*mm - Text{ - font.pointSize: 0.75*osSettings.systemFontSize - anchors.centerIn: parent - text:qsTr("More") + ProgressBar{ + id: newImagesProgress + width: 15*mm + height: updatePhotolist.height + anchors.top: parent.top + anchors.right:uploadPhoto.left + anchors.rightMargin:mm + visible: false + value: fotorectangle.currentimageno/fotorectangle.newimages.length + } + + MButton{ + id: uploadPhoto + anchors.top: parent.top + anchors.topMargin: 0.5*mm + anchors.right:updatePhotolist.left + anchors.rightMargin:mm + text:"\uf0ee" + onClicked: {photoStack.push("qrc:/qml/photoqml/ImageUploadDialog.qml")} + } + + MButton{ + id: updatePhotolist + anchors.top: parent.top + anchors.topMargin: 0.5*mm + anchors.right:phototabstatusButton.left + anchors.rightMargin:mm + text:"\uf0ed" + + Menu { + id:photoupdatemenu + width:8*root.fontFactor*osSettings.bigFontSize + MenuItem { + text: qsTr("All Images") + font.pointSize: osSettings.bigFontSize + onTriggered: { + Imagejs.requestList(root.login,root.db, false, fotostab,function(obj){fotorectangle.newimages=obj})} + } + MenuItem { + text: qsTr("Only new") + font.pointSize: osSettings.bigFontSize + onTriggered: { + Imagejs.requestList(root.login,root.db, true,fotostab,function(obj){fotorectangle.newimages=obj})} + } } - MouseArea{anchors.fill:parent - onClicked:{//print(photogroupModel.get(0).foreignPicture); - var lastalbum_id=photogroupModel.count-1; - if(photogroupModel.get(photogroupModel.count-1).foreignPicture==true){ - Imagejs.newRequestFriendsAlbumPictures(login,photogroupModel.get(0).friend,fotorectangle,function(albums,remoteAuthBool){ - remoteContact=remoteAuthBool; - var msg = {'model': photogroupModel,'albums':albums,'firstalbum':lastalbum_id+1,'foreignPicture':true,'friend':photogroupModel.get(0).friend} - photoWorker.sendMessage(msg) - }) - } - else{Helperjs.readField("album",root.db, "imageData",root.login.username,function(albums){ - var msg = { 'model': photogroupModel,'albums':albums,'foreignPicture': false,'firstalbum':lastalbum_id+1}; - photoWorker.sendMessage(msg)})} - }}} + onClicked: {photoupdatemenu.popup()} + } + + MButton{ + id: phototabstatusButton + anchors.top: parent.top + anchors.topMargin: 0.5*mm + anchors.right: parent.right + anchors.rightMargin:2*mm + width: Math.max(8*root.fontFactor*osSettings.bigFontSize,implicitWidth) + text: fotostab.phototabstatus=="Images"?qsTr("Own Images"):fotostab.phototabstatus + Menu { + id:phototabmenu + width: 20*root.fontFactor*osSettings.bigFontSize + MenuItem { + text: qsTr("Own Images") + font.pointSize: osSettings.bigFontSize + onTriggered: { + fotostab.phototabstatus="Images"; + // phototabstatusButton.text=qsTr("Own images"); + showFotos(root.login,"")} + } + } + onClicked: {phototabmenu.popup()} + } + + + DelegateModel{ + id: visualphotoModel + delegate: PhotogroupComponent{} + model: photogroupModel + } + + ListModel{ + id: photogroupModel + } + + GridView { + id: albumgridview + cellWidth: 17*mm + cellHeight: 17*mm + x: leftDrawer.width + y:8*mm + width: wideScreen&&rootstackView.depth<2?parent.width-leftDrawer.width-mm:parent.width-mm + height: parent.height-9*mm + clip: true + model: visualphotoModel.parts.album + footer:Rectangle{ + border.color: Material.backgroundDimColor + border.width: 1 + color: Material.dialogColor + width:12*mm + height:6*mm + Text{ + color: Material.primaryTextColor + font.pointSize: 0.75*osSettings.systemFontSize + anchors.centerIn: parent + text:qsTr("More") + } + MouseArea{anchors.fill:parent + onClicked:{ + var lastalbum_id=photogroupModel.count-1; + if(photogroupModel.get(photogroupModel.count-1).foreignPicture==true){ + Imagejs.newRequestFriendsAlbumPictures(login,photogroupModel.get(0).friend,fotorectangle,function(albums,remoteAuthBool){ + remoteContact=remoteAuthBool; + var msg = {'model': photogroupModel,'albums':albums,'firstalbum':lastalbum_id+1,'foreignPicture':true,'friend':photogroupModel.get(0).friend} + photoWorker.sendMessage(msg) + }) + } + else{Helperjs.readField("album",root.db, "imageData",root.login.username,function(albums){ + var msg = { 'model': photogroupModel,'albums':albums,'foreignPicture': false,'firstalbum':lastalbum_id+1}; + photoWorker.sendMessage(msg)})} + }}} + } + + Rectangle { id: photoBackground; color: 'black'; width: parent.width; height: parent.height; opacity: 0; visible: opacity != 0.0 } + + ListView { width: parent.width; height:parent.height; model: visualphotoModel.parts.browser; interactive: false } + + MButton { + id: backButton + text: "\uf057" + x: parent.width - backButton.width - root.fontFactor*osSettings.bigFontSize + y: -backButton.height - root.fontFactor*osSettings.bigFontSize + z:2 + onClicked: {photoBackground.opacity=0} + } + + ListView {anchors.fill: parent; model: visualphotoModel.parts.fullscreen; interactive: false } + WorkerScript{id: photoWorker;source: "qrc:/js/photoworker.js"} + + Component.onCompleted: { + root.fotoSignal.connect(showFotos); + root.uploadSignal.connect(uploadUrls); + root.changeimage.connect(deletepics); + root.changeimage.connect(updatepic); + if (fotostab.phototabstatus=="Images"){showFotos(root.login,"")} + } } - - Rectangle { id: photoBackground; color: 'black'; width: parent.width; height: parent.height; opacity: 0; visible: opacity != 0.0 } - - ListView { width: parent.width; height:parent.height; model: visualphotoModel.parts.browser; interactive: false } - - MButton { - id: backButton - text: "\uf057" - x: parent.width - backButton.width - root.fontFactor*osSettings.bigFontSize - y: -backButton.height - root.fontFactor*osSettings.bigFontSize - z:2 - onClicked: {photoBackground.opacity=0} - } - - ListView {anchors.fill: parent; model: visualphotoModel.parts.fullscreen; interactive: false } - WorkerScript{id: photoWorker;source: "qrc:/js/photoworker.js"} - - Component.onCompleted: { - root.fotoSignal.connect(showFotos); - root.uploadSignal.connect(uploadUrls); - root.changeimage.connect(deletepics); - root.changeimage.connect(updatepic); - if (fotostab.phototabstatus=="Images"){showFotos(root.login,"")} - } - } } diff --git a/source-linux/translations/friendiqa-de.qm b/source-linux/translations/friendiqa-de.qm index 4212bcc5da0ff42fa7a0d296171ad79acde86657..04194122e542def748affca281b6fd3003d55baa 100644 GIT binary patch delta 2075 zcmZvddr*{R6vm%rzxVt02D>aE#O7sLKwuH@LMmSJN{)tj1wzeGcMx6KWU-vIwhL(m z4kqc4nbV{sq9wU%kvf&4sZ&PbC1$#iR$69?w}vsTXM3BbKl)?mw{!Nq=RD`~zWYm+ z?s}DOZFE2^@XQ@Iehi=iP}Tr_7Xcz0aHP0vM7Gk^4O0%#uv&hL}Jh zXoRRyfS%(annNNy5XTPz`d^`Lm<9A(0ria*vKi`jJq2_~+FB)@$Dp?L12Pk#-r_m) z7Rkt$$p8%rtDuDf555cSr)pMs6vN#&0d=orTpb?R@i6VT@xXyW^mF6ESLadKFv)v! zBzu)1uk0XT?ZC7*^$(Bk~wBndK!W75t2~@Boh@>9={F@=!wAljALz*jM*lcJQZ6sKakOY z?cSm6bRo{?{s|2H5P>V{tYnbTJ+piZ1Dp!$Z=VC)yDMya{hL6}y09bukJ##7VdtN! zXMotSOQBhdarz;X_b|`_{pdlbxieqs^Uno=c<8?=e**~HufH<34D^#3ni11m6HYS9A%nvW?(5`xU8HRvW+|Pm~!zdCzu@Aqx|gk z1NZnP<8Ml)pOY2xHe~z%owKo-OHe2%96DEqy|y+am#8 zyBM~ViQEZd(yf8qo$5x?_nwz*(>Oyg}k(H*O5T9gMazsnT)#{l*|COq1ViZR>Q_X5*r30p_!%LF5?HAPH z%^5tOs1`rP-{U$Z<6lze4R^5eYwEGrA3*>qt?J1!bhH*p#>|jR)~jDn{dR?Mo$H(+sC;*+QWjuAQU6J~NGuzR{ei#prm6%FWXyBS%Rl>7#w8)Yj5)^Df!!SWYBKc2W|anKv2jf+6FBmXZ+*;4 zdm4-%EFdGkk&HeonY7l_WAANN-fddY_8He0CeI{RtaX{Zv%1-#^QNk|6WQuQQ_Cif zLLW5kubshNXf(AR`ze&Pef8;k-a?$+i=Uu#x-R7eMD7@zv7FWY_ytZd8nH}G<;yTNS$?pQa zHd^u3e`DIbiuaAD=v59}X4^2TP~>(ubF z+_4O}I@})|$wIy1wXO8O$1NE@pMND+$KGs)WSu(%UKiyMOF@NEdl2T9I&XoHn{EuCyr@sYL;9)dBW0wCLPo3ha z@cYXDCtzKz-5KnNoooyiIC%tozfx+rQ{HmR+e)u=toG5_k1o!|M+cg}mB=Y8MvZJ;jX z*Se6`BE6xN&U`=xAguy=I{`Ttu$6JH2jlG)2qydu<#alb83*My_Zeph zT6}`u#Jy01fd|}y`V$rPKZqfzw|G#lVDuV{**1;yw=iaZ4%a1N{JIJX8!Q;>5{!Ej z6Yt&xlo(8&=?C;{1k=W&^yna<&lHq3z0SBFp=xa#1?w=&<%1W-wOs>P+5{6X!5zX> z_4^s_24G>~3SIPOXEac(r75VSsccF0o1gaFVjU5egKfeBVA_va8`&}wP0<}_0pD{ZKw z0NYh*d)ihC*(4p`QV5u{1S4k(CY4Gj4>P{>taPg63`^7^eU)7W=ypk8c?Z7BrWqt% zxz3U%|0Mn5asxf)2-5udjR(cx0|(9~%MW6e<0h=rn7b zGNe3--G4zDvMYo8`E@7_;B2w7)f-0zOer<#R!}O)#oNFgaKGZY-}&X0fVy z!biso)u;>})V)?sSv(Txm936=ib7251g$3o?O&?}WdYVYQ!t`Z&{3|I?CjtzI;g&U zo~1H+kBNchj-Wk4U3q>QkXxdzHp_IdOkHz&4ok9MUH{KZOkJ3|t)3-FAFS?eWz*$d zR$KdBp<};x-rA*rwpHs(=*tgIs>T2zQ`gR&Pq&=ERL*D2x z?XjXTI>;Bax&`fZ+H(y|oxDu@M<;Jd{BoVGcO+|R)Y)DQD(@y}$rns?=_XX&<3Tlo zv39}KFLhJDS;*T^s(YsHGL0SA)dbgNOx7*;e!%;$AKNuRLcMNP8w1-G>E8L24twV5 zKCUFq8wDdf1d|TwyY2pmjsyD2)1R|zp?8j>Q|;^rysmdm`HLC)USIc~gQ+gox2|U? zG=BZQhDq#!P5QR>KlxpGT;F!(PdZE9VL)>RYgH~7@rIzI!65f~hRs%Cm~KDA9(c_# z^E?A+vka>=xA-MnXlOkAJDqeI)_rk4GtfA21-8VlwBYM(_Z;xvV9O8T?u>$|9I_%e-k6dkSaG zJ8a#k*wAj?5oCBkFfp;3-}ijKL!Bjg!!QX>JdYYwqZUqWFyl(_H+rtK*5eNTa~ejK zyPUO^<CalendarTab Events - Termine + Termine Own Calendar - Eigener Kalender + Eigener Kalender
    @@ -393,7 +393,7 @@ Connect - Kontaktanfrage + Kontaktanfrage Approve @@ -440,6 +440,21 @@ Netzwerk-Fehler + + ContactsSearchPage + + Network Error + Netzwerk-Fehler + + + Forum + Forum + + + Person + Person + + Conversation @@ -596,7 +611,7 @@ EventListItem Location - Ort + Ort @@ -912,7 +927,7 @@ Reply - Antworten + Antworten DM @@ -950,6 +965,14 @@ Delete Löschen + + Bookmark + Markieren + + + External + Webseite + PermissionDialog diff --git a/source-linux/translations/friendiqa-es.qm b/source-linux/translations/friendiqa-es.qm index 25d1fab1512307563000475c1cc7c911dc9d329f..ecfce5c2954b64579cba8932347772d45160cd53 100644 GIT binary patch delta 2061 zcmZvdc~F#P9LK-QzSrKc%Oyv-uBgBYf{=>Dm?RjcGHM=JDdL95$`-q7Wx1(19^l|e zd0%-Dh?TW!;+cx)j7QUic9@Q4S&m1UI*p_DrKf3{ra#{Kyzg(H=XZU7&$IPax>Z%W z#gReT;~&#+XkS1DAT0tq{Q}6@K-^8*1_Q|>1#=3?oxoEs0VQ6*7!-8(1j;W0U5*2j z7SPUpZ46&8=o|&iNCDdWf#6~Kn<1Fvh15_@C(oLtZycZp)~3NQ;cBvNkQjKC}+C@Y2QG($9<+R z1S95=K^i)^p|&~h(E|0yYF0QOxv6&Wi9x{A09eWe9UTQ-^$47}17v)L;4b>H?GlW7TQKPyHmZJhU<4Yy zy?~yHxKi*K=sp?2TW(g;y;(Qw^^HJgAS}a9eG}dYYh1no$XOD0#Q!;<&kMUUb2(ew z9Cp1;YdN6rIcPf_E!IDi^%c;0xPI{E5YTR~{z3(H54)hhRWyeZtr3iB(m&Ml0Bcu4 z#|^=bV}p`>k{d0Vg7%w&uBnn^;2j|9u@t+5iM3xTW&fmO$Lpou`m+q!Dy^+z;P^$- zR`+Ipca~0W8pHs#f|1379rsJ8hkpquUa7TvIbcYZT6=y#NgAYUx2a&KV2<>&*U!u| z1mpGzCZCfY4QJ~Oqh-ZGDN^pp>SGt#UpD-@7BE)|+EWEP9F)W3v)Rcw*=>&ibl2tH zuQ5={Zh64H?wlEm>|Mzj3irr0rcF%XIk{#U8SIiMFK?<~pjyGyW_i_owmLRJ-dfEC z-4f+(TR2q8PWfm9D|NpjAIlC^t57W{xkLLBK}WHm>y$eD#V(nNu3yNvgP7DrO znMpHWNV{LqC23#PvW4$)WQJq4nzGxR+`Xa z*gc-KJ`jxDCz#a97`@{GE8k%pfA$o|7)H+kR;=|ldPo1kV>;JZ^JL z1NEM1k^U~(-?aS5O;)nfwBpRKbhylPG?R%Z&M><+&jF&>nA5-ho)s6GpC0rHXC=Wr zcr*9)7-k+blK&?emF7J?Bg`PFrq|n0fUTUg_0{Bn~pVroOg^yg| ztDHJT<(oa5}a9JP`ptKD5Vl#v1oe X46Wbm0Z(N`skiQM+Ne-*daM0UF8dQD delta 2056 zcmZXUdr(wm7{;Gv&)KtA7M6<$sK5dW%S{9WGKZwlv|vVs95NGiC2d7fo zT=ROM>f>}z02Bby1|aq>Ag2RiN!-f^;^qrx6_6hRW1j(vT!1ML-9i2XtGT$yv}fY8gO>pkJF{jc#(7nA|R_k9hen-Ptz#yH0jqQR7X3S{K1V-LLQNtz*P*76c0wgqJvC9h;=8py!@ZT#KwFzzwQYF=9L4v@OWXSD4}AiUY9vF2^oXsgdL_h*21yw80??_S)pNJU>D(s8QReA5Q_@ zf&smx%8lr)l6;aEExm%aUj^;^rGUq706~3H$bJSG@tu_Zvxb@9C*7~@pyNGKT{!~? zYnOH<)blw*I{9uMV4Wlwm?s$BFP%C@`_h}z>B2KC(N*c(m=eIyDVJv7nhp~k_AKi1mn7-{z8_*7%1xkSQ>{$R{pjF@rAPCIy>Fs5VXY!+BLFYSUNL1 zN=~r(1Dam>{xbTBZX3AlPgW{(yx!KRxaaWltZrBSxN_!1cx3JbhOHwUuNn< zLgif*JeT5-_v|>#=FE_fH&AhcM{Z5`uw-lH-zy5(17mge$pJuGj4q{tN=M(-jVq1; zlIwNj_Hd+=yLCmY_&#KdVCY6w*Y@UY2CzhTdIAsl#R&$b3dWq#U6{*skl4~NFT0jw90JC4CRfEXIT=DvgPgz+&`u4tYiriep3!Kv+1(hmFAQl zDqgQ&UcHXv^{3t&8OL7H>UUiEiOu_#{)5wLthH0nk*z;m*+v1c>06U2NFDNx{zSen z6)Y9Bl?mD((x0tj>f{6ZKRP)j5e0^@k%6pbh#~CNfygHa`i~Qg8fAE_q@Rwq35F|z zj+YEie!H5}u*NXAyo&-h8Ws(lOB!KVukPji8($t=AhOV~p@oLSrWv+>PKCoH!@+r^ zb)R71A;FmW#^C+@Os5?+&g*Dr*TU$WLZ$k{f`%lc>xn-(u3lsL?r5eu&e*(#rO?>Dye+@Z4AY!e!jSgVzS0jgkhrb!+#m*cX@G~0fLJut(x@G=eP zSC}?vZ?Oqanre<+rIH3y?U&bSu-&wxGTZCd0>PWj$>)Ed;sWync^|S@W}5Ts zdGEeC=BH-NU~{fEAJV99UUGfskOeH!=6H?_5HA5 zMr``a`u+g@ZV5(qFJNc&H$^MkB-IxWV;P(%g$Ik_)(>P{H}HFSnX}a6R=70f6uX?I z^NN>FFP@{(aw7^kD28kB);zA3Vgc_)U AccountPage - - - + + + User Usuario @@ -15,17 +15,17 @@ Servidor - + Nickname Usuario - + Password Contraseña - + Image dir. Dir. de imágenes @@ -34,54 +34,54 @@ Noticias como - - - + + + Error Error - + Nicknames containing @ symbol currently not supported No se admiten los apodos que contienen el símbolo @ actualmente - + Confirm Confirmar - + No server given! ¡Servidor no encontrado! - + No nickname given! ¡Usuario incorrecto! - + No password given! ¡Contraseña incorrecta! - + No image directory given! ¡No se ha encontrado el directorio de imágenes! - + Wrong password! ¡Contraseña incorrecta! - + Success éxito! - + Name Nombre @@ -97,14 +97,12 @@ CalendarTab - Events - Eventos + Eventos - Own Calendar - Calendario propio + Calendario propio @@ -333,166 +331,183 @@ ContactPage - + seconds Segundos - + minute Minuto - + minutes Minutos - + hour Hora - + hours Horas - + day Dia - + days Dias - + month Mes - + months Meses - + years Años - + likes this. le gusta esto. - + like this. me gusta esto. - + doesn't like this. no de ése. - + don't like this. no me gusta. - + will attend. asistirá. - + persons will attend. Personas que asistirán. - + will not attend. no asistirá. - + persons will not attend. Personas que no asistirán. - + may attend. Puede asistir. - + persons may attend. Personas que pueden asistir. - Connect - Conectar + Conectar - + Approve Aprobar - + Reject Rechazar - + Ignore Ignorar - + Follow Seguir - + Unfollow Dejar de seguir - + Description Descripción - + Location Localización - + Posts Mensajes - + URL URL - + Created at Creado en - + Network Error Fallo de red + + ContactsSearchPage + + + Network Error + Fallo de red + + + + Forum + Foro + + + + Person + Persona + + Conversation @@ -682,9 +697,8 @@ EventListItem - Location - Localización + Localización @@ -695,7 +709,7 @@ Solicitudes de contacto - + Friends Amigos @@ -785,40 +799,40 @@ MessageSend - + to: a: - + Title (optional) Título (opcional) - + Drop your Content here. Deje caer su contenido aquí. - + What's on your mind? ¿Qué tienes en mente? - - + + Error Error - + Only one attachment supported at the moment. Remove other attachment first! Solo se admite adjuntar un solo archivo en este momento. ¡Elimine y deje un archivo adjunto! - + No receiver supplied! No se ha suministrado ningún receptor! @@ -834,12 +848,12 @@ NewsStack - + Network Error Fallo de red - + More Mas @@ -1002,17 +1016,17 @@ Asistiendo: - + Source: Fuente: - + Direct Message Mensaje directo - + In reply to En respuesta a @@ -1026,75 +1040,86 @@ asistencia - + ago hace - + Attending: Asistiendo: - Reply - Respuesta + Respuesta - + DM Mensaje directo - + Repost Volver a publicar - + Success! éxito! - + Conversation Conversación - + + Bookmark + marca + + + Attending Asistiendo - + yes si - + maybe quizás - + no no - + Delete Borrar + + + External + sitio web + PermissionDialog - + + Friends Amigos - + + Groups Grupos @@ -1102,28 +1127,28 @@ PhotoTab - + 's images s Imágenes - + All Images Todas las imagenes - + Only new Solo nueva - - + + Own Images Mis imágenes - + More Mas @@ -1447,14 +1472,14 @@ Salida - + Background Sync Rightclick or Middleclick to Quit Sincronización de fondo Haga clic con el botón derecho del ratón o con el botón central para salir. - + Click to open Friendiqa Haga clic para abrir Friendiqa @@ -1572,12 +1597,12 @@ Haga clic con el botón derecho del ratón o con el botón central para salir.La configuración del tipo de vista de las noticias se ha movido de la página de la cuenta a la página de configuración. - + Undefined Array Error - + JSON status Error diff --git a/source-linux/translations/friendiqa-hu.qm b/source-linux/translations/friendiqa-hu.qm index 690bead3a9df7d5de16b7e8a17e69cef2733498f..05e37cd745b84393fb2df34c934f64f8c7727547 100644 GIT binary patch delta 2190 zcmZvddsLKl8pprGyqCGpFo4L#WEc>+gNT9}i59tRrU(;?18mG_)|PJtoXrKp z!@KLDmi1Wb2FR}L&dN&Ko-Sb6o($Kr?XoSUw6^W3$jhFNN9#NL+f(Q4=?~85<(cPw ze$V%LzQ36REruss411zAdGodn%hoOdQ~=U$V3r?{3xW7OjFkhk2L+3LG1S98@8UvmYsNur%K7{&7I~8_eQRWpuX%URQg4++@$M`62KQWiQ zjys;-#KvwGOz07uu?s7=ya+fotiFDkQ+x#X)Q13bw_xTxRQ3LX0t~3zI|5{WgeJ|e zv!f$u3Nvz(pyyu*7&xljR}tvsL}s@N7SBh}*9+Lqg6>xYy;%sJx&-7+LOaGf&I-Yp zSi#gv98d#5_M_p5zBL|^xFK=Dw- zXy7G|+7xkqXE#SY74cbk*K&%nXw@HC=(MqPF84X>&&KkPLqOansf?&!5>2$?et`gF@0vgx!C+S?#^YloG zbn#1WFjX6pKJ^EH>1PDvD+SXRN;fJvdedjJ62(jBD@%;YJ2L zf|&;SS5I=(u|x7eI}>sX<-vZMO1V`&*-NFF2j$lagH-;e{AK%E?tHc4T^EO4Uw&KD|gV?xM13Q391;R>pq45gO7?D5sY&(P6Khl|M?3vZG-8^>A8$A5zKhP^kT;t zC!1$_Eti5~gQipEnu7{9@PTy42qr&edb^V&lqO7Hear@DYUYHrXztWvPWXAa^Fl$_ zCxV_G=9P6fc+g{l2^$16M$PO0_84!&GILGqBn5Pt8^U?nrRJY$f8fgRBEt{Pqau*> zjCuD64~Rc%{>{r&npkUop_X*)7K~mYn9^gJcJvyRk6LQS-=K|Q@vWd@b=2a&_iIjQ z*wXsj6plLIGTg&e7@xHq@4TB{+HM&c`wzcQ?y!tpBvW@Wt3OY+hUbx z*6^Mmvu^aBr3Y%Q^%E?hHd}Wauh5Jm*6z{IspO>f={Ki%9jB}(=dke^UYqw&3q3O5 zmiz99R9tDhdDZV3AF`Dn;(PNNZ5!6DqiOfsjvE3L_T5XeyAK=JccG*eS z=U=mzT;9ifoo(Mzwv^ukQ}#fpghK1>og>Vj-X<6~AQw7@Sr84o>c* zV04>c${FW#OX(@RoBe&X~}@9q9&rG(TI{T&v~q0fEpt*RYap!Tqe-jBRKzh4-xRPcCa}-qxV< z$-T6xF<4y_46N~0H`i>|*G1m4{QqKiR@eCqM&>&HcWwiV`|;3s)s#DZ&4H%IA1e2f zJ5C>Tn?ldW+RUNJq%IpT!B!5S5f5QI>M6pHhYfdqSIV@cscCCNb@Nu;m;Jfdg$J3z fUo>Xbq8k41^KRP_^ffnD`}NYC%FtNO`|fW6u?IC8 delta 2216 zcmZvddvH|c8OEQ@p37d&W-r-5$b#8q6ESyg5rV)#Qo=KuycQu znLB{0zjELAfZ%hqZxD0^1(PQO8!`ZYI$->k`>qM*w?S&z#RkIIatN1_T4oqwW;TI@%25a2Rk+6O1nuOnV#6 zst#oDLTiXZ#_Q-Wx&w@9#aCHn1{XI>&py@607qg*dzP`(D`Hxk_5t~y#B}TLv(%QD z{*6rx;EefuwAb=M^MrYCG0>OhY2(gtX8O%V^E{lN7tO^Nnfb8y&7aop1!7vwU(K$k z{fuCIjro>k3J`l(Fs_3%Xh|xFwkQwqW`r((T1;g|$~!;@Fyua#_6-0Mbv&*01+a zxGLzrC7ANM?DFNYvQNla9yeh6v;5GLJSQVde)#5C&Qhk_z(IxWm~1qxf0bIPRl9Qu2dl8tlXPRKjmzFb)ES(&*{No~TNz$iQ-$*ZeX|wvCk1F>I zx;=u)z1F!^w|USCLEllqjDG8~vp?o-m}xEF{5cb7x7I}WWiPk>#P~Juziras0{(wm zw|6nHFV6bQ518TbfQMZ*4<5zGKGywu;lg=hVVh`7krJ=y!S57JBqw ztk55An_o|5sf%r$yV(l!tG0I<7jg!6*t$-B!|zJa)^+I{W|nr|j@BIZYJp%}v0$Lj zE+>_9*yh+D4}8oS*kli0U;vBXzTJF-U$T(Bse6E#d}e?74_`B&)BfQYCNSbzEwI0y zGg7YQp8E?kUZ+i-cZjp%)r$Ai@4*Ib`I03Z)??Z`CPSygMD0Q%6%J|FKA-v|@2Sfn zJ2~xRhB>BO-@|J;-%(vu$oC^0dSnU{4mujUxIf{LV503V4Z(Dub7E#34@h#Bw8gT5 zhXlQMnU?F^SIC*dC(bu~L#Wu^<9s7Z*L#A=TdO%)n AccountPage - - - + + + User Felhasználó @@ -15,17 +15,17 @@ Kiszolgáló - + Nickname Becenév - + Password Jelszó - + Image dir. Képkönyvtár @@ -34,54 +34,54 @@ Hírek mint - - - + + + Error Hiba - + Nicknames containing @ symbol currently not supported A @ szimbólumot tartalmazó becenevek jelenleg nem támogatottak - + Confirm Megerősítés - + No server given! Nincs kiszolgáló megadva! - + No nickname given! Nincs becenév megadva! - + No password given! Nincs jelszó megadva! - + No image directory given! Nincs képkönyvtár megadva! - + Wrong password! Hibás jelszó! - + Success Sikeres - + Name Név @@ -97,14 +97,12 @@ CalendarTab - Events - Események + Események - Own Calendar - Saját naptár + Saját naptár @@ -140,22 +138,22 @@ Dark Mode - Tervezés + Sötét mód System - Szabványos kivitel + Rendszer Dark - Sötét design + Sötét Light - Fényes design + Világos @@ -193,7 +191,7 @@ Start - Indítsd el + Indítás @@ -349,166 +347,183 @@ ContactPage - + seconds másodperc - + minute perc - + minutes perc - + hour óra - + hours óra - + day nap - + days nap - + month hónap - + months hónap - + years év - + likes this. kedveli ezt. - + like this. kedveli ezt. - + doesn't like this. nem kedveli ezt. - + don't like this. nem kedveli ezt. - + will attend. részt vesz. - + persons will attend. személy részt vesz. - + will not attend. nem vesz részt. - + persons will not attend. személy nem vesz részt. - + may attend. talán részt vesz. - + persons may attend. személy talán részt vesz. - Connect - Kapcsolódás + Kapcsolódás - + Approve Jóváhagyás - + Reject Visszautasítás - + Ignore Mellőzés - + Follow - Kövesse + Követés - + Unfollow Követés megszüntetése - + Description Leírás - + Location Hely - + Posts Bejegyzések - + URL URL - + Created at Létrehozva - + Network Error Hálózati hiba + + ContactsSearchPage + + + Network Error + Hálózati hiba + + + + Forum + fórum + + + + Person + személy + + Conversation @@ -698,9 +713,8 @@ EventListItem - Location - Hely + Hely @@ -711,7 +725,7 @@ Barátkérések - + Friends Ismerősök @@ -812,40 +826,40 @@ MessageSend - + to: címzett: - + Title (optional) Cím (elhagyható) - + Drop your Content here. Ejtse ide a tartalmat. - + What's on your mind? Mire gondol? - - + + Error Hiba - + Only one attachment supported at the moment. Remove other attachment first! Csak egyetlen melléklet támogatott jelenleg. Először távolítsa el a másik mellékletet. - + No receiver supplied! Nincs fogadó megadva! @@ -861,12 +875,12 @@ NewsStack - + Network Error Hálózati hiba - + More Több @@ -1033,17 +1047,17 @@ részvétel: - + Source: Forrás: - + Direct Message Közvetlen üzenet - + In reply to Válaszul erre: @@ -1057,75 +1071,86 @@ részvétel - + ago óta - + Attending: Részvétel: - Reply - Válasz + Válasz - + DM DM - + Repost Újraküldés - + Success! Sikeres! - + Conversation Beszélgetés - + + Bookmark + könyvjelző + + + Attending Részvétel - + yes igen - + maybe talán - + no nem - + Delete Törlés + + + External + weboldal + PermissionDialog - + + Friends Ismerősök - + + Groups Csoportok @@ -1133,28 +1158,28 @@ PhotoTab - + 's images képei - + All Images Összes kép - + Only new Csak újak - - + + Own Images Saját képek - + More Több @@ -1478,14 +1503,14 @@ Kilépés - + Background Sync Rightclick or Middleclick to Quit Háttérszinkronizálás Kilépéshez kattintson a jobb gombbal vagy középső gombbal - + Click to open Friendiqa Kattintson a Friendiqa megnyitásához @@ -1603,12 +1628,12 @@ Kilépéshez kattintson a jobb gombbal vagy középső gombbal A hírek nézettípusának beállítása át lett helyezve a fiókoldalról a beállítási oldalra. - + Undefined Array Error Meghatározatlan tömbhiba - + JSON status Error JSON-állapothiba diff --git a/source-linux/translations/friendiqa-it.qm b/source-linux/translations/friendiqa-it.qm index bfff3d67a389794a013bf462b18ab6e773b48357..8928dd41b39210279163f3455cef42bb9204fca3 100644 GIT binary patch delta 2074 zcmZvdc~I147{|ZM{*Jw1mt8;t4`4y%Mg&nLM`eP<`))9^RS7X))4D{a$%zuma zc0o(EU}QY7G!BRu0eHS!4n#Vu$(2ith%LZo$w|$ldz_?X}1~oJM|*G3#fuunfWQUj=*pg0V%P z0p^pK^zbgH*n;Wvy_|@jVEhT>H@?jVmZET73kxrW(^Fi}in`(SF|bK6Y7kr+jw)pa zT(z7?ECh#~gS(&+@Xr;r=>+Wy;Xd943@C-?5aXCP3kDYo#_Ym&)x`;zvAcK(>%NK3 zoX5aGJ3KcN*vY^}n&peP1F0!~1FSPS>KT5!8@2(N`F`KHz5ujYex1u2IN~LKH+;L6 zOSFT>eFzMmpdFFc2J}nPj=$&yp4z9qP(mH}wP|nWRd7Wc1%uaWAL@ny0fBkoqV5t40e7Z7|^3jK(MMa+}ZuWEoH3#FmjRwitcHm_jf@FHnn!cL0z zfplWWI3_3+3>qXDy-GSY?F?7>lGHx15YYFK+6V9AN*bhVx46N+9!a`h>|*781jDuq z#vYU&P2=eGqh-a$Rm2^Y)yH1ohGEpN7LP0kzKx3HI*7^SL}HX=JAZb}3no7@nJ`WHlv`tCjp^ zd>&dS7?!2X&I)Je!<1w1ya*5a$0?^q($PFgFgQ#wW|ne3kGCV~OI16$o+7-W1}8CL zk2p2%4c_J6mFn>4S&-?Xp!HoryG_l>@8U|`g0?||_VwztgJ&teeD$>suF4eQBkzCU zd0~i}saADxL}{nhHD;NeTvFGzF5+tDs+%6X$`P(s_f~Ti30u@d%~pzYrP`cwjs6+B z@^zJf&Y`Q1sZite-OV{BlR?r1U_>hZ1a_;^nMD_PGk zq;E*O|87lRLpV+a{^z^v*sTHef{7#6C1Y?(&GvjUSw91^nCxD{13I?4OjIo=yWm8kQXx>+MnD3F^ zOU(yDSh+D>(DIvL$NDH96H zT+WjJ3Focr5v%uhMXWJVkdt}1(035UD8g(8ay|*68|ieuyueZRve%UuqOn`(Tm(1s dM4+6%wl&zS&5^#zC3CA2gygQe*v|a68-=H delta 2051 zcmZvdX-t$?6o%j7+h%2kVRaA$MpTAPkVTPNkOHlWG}bD?y0C>}SSm9vP1Uc8+A0`Z z#|5KB<5B@pv7;755*HLOiZlj;X={mFZEGtEVjH9OjMw_BKPJ!3oqO&%=f3Zmxm}^S zSfTjJLv|^$O$HC!=crgOh}-4>Vdo+4X(kRqtmCMFBaDXqjDgD_c83EIOCSzWoYuzZ zR>CL;MMH949KRgWJ*p@!35lW3ZVMTGqL6-Q9_=qi`so zARxwJ_Cg1sKExQ>h^+Pr!00+;*KVPE|3u-oHY#{F%8Kofp{;qffLk?VP!_BTdaAL> zux_Fk8FPluJcbh*8>B*66) zqkAh+rj3#B^TH(x)U`4iPcxeHc=wC}!1F5abAk#C*ucmBssJX;;wN(5lsKQSSwjW* zR`LyD2gtm4_)Ghz19}sqhd<-U2LAE|x}V?4cg?y+67}-e#}xvqGyHXV{6R8JGJn6H zBpo%1|E<_c9Y~C(3ydLK`4_WD3e}(>x|1}P!-DkEOymXCqZ%q)U^FTigT5CGzOnS8 zO+uK_4NwdS6Bkh)i%pn1G!BUE6sk1)$s>J&T(yK2qkj~t50%n}g>l#x#!#!U^GkYq z?;)X~lFmgo3yt-yWFnJrv6eax^AXx(Z6sN$&|mo>dFHfep5jiDwuobEsne*9Vq#7( z#l?$>jS)nfn7xv|_gThhnkS1L-z*@L8N{y1bU^=%(bI)7c$N6m6dId|gA(_Fo#ywl z> zKjqSGYw7pln$jK^0*pAOtiOGS%)3*0v@3?BOJTG;P_|ZePy^-4_DE_-_CBuc%ygv= zCNmn}W(?|A_H3f36ZR?}-=ZlA5LCXSJxEJ0mG1^;cgY1PGZ{-FdR>NST)(ht@T>gHV}1$Rx| zvS}uH;BR$X$5WELUfp*8DRmb7ScAF<(rPNBdj_NVu0|MjYtjl6M_3Voz~Yx*(rN{lx1 z0L8_twez#GNLquoMIl=$;2mwBi7NE!(B4g2M01*^6ZGWv=*7B8gEcgk3v@+kDfE4) z&gz&%4S%fL)JErh&NG@Uuep^mWWGKj)Saebkv_ZLm0qxg(c>&*aH@W93V8~*^hbQX zsAA1c{ShY(J&b|-i^y3uj*-%CUe+QNOHhDP*ifW&zPIT7q%J8awOO72o0^oI;)2rr zobs7DxeAUpJdlDM6u*ker&T$MQ1&KLo4K?!;J=XnjW;pT7We2k7e-u+7ZiRjU;x>v AccountPage - - - + + + User Utente @@ -15,17 +15,17 @@ Server - + Nickname Utente - + Password Password - + Image dir. Directory immagini @@ -34,54 +34,54 @@ News come - - - + + + Error Errore - + Nicknames containing @ symbol currently not supported I soprannomi contenenti il simbolo @ attualmente non sono supportati - + Confirm Conferma - + No server given! Nessun server inserito! - + No nickname given! Nessun utente inserito! - + No password given! Nessuna password inserita! - + No image directory given! Nessuna directory immagini inserita! - + Wrong password! Password sbagliata! - + Success Ha funzionato! - + Name Nome @@ -97,14 +97,12 @@ CalendarTab - Events - Eventi + Eventi - Own Calendar - Calendario + Calendario @@ -321,166 +319,183 @@ ContactPage - + seconds secondi - + minute minuti - + minutes minuti - + hour ora - + hours ore - + day giorno - + days giorni - + month mese - + months mesi - + years anni - + likes this. mi piace. - + like this. mi piace. - + doesn't like this. non mi piace. - + don't like this. non mi piace. - + will attend. attendere. - + persons will attend. Persone che attendono. - + will not attend. non aspettare. - + persons will not attend. Persone che non aspettano. - + may attend. puoi attendere. - + persons may attend. Persone che possono attendere. - Connect - Connetti + Connetti - + Approve Approvare - + Reject Rifiutare - + Ignore Ignorare - + Follow Seguire - + Unfollow Non seguire - + Description Descrizione - + Location Località - + Posts Messaggi - + URL URL - + Created at Creato il - + Network Error Errore di rete + + ContactsSearchPage + + + Network Error + Errore di rete + + + + Forum + Forum + + + + Person + Persona + + Conversation @@ -670,9 +685,8 @@ EventListItem - Location - Località + Località @@ -683,7 +697,7 @@ Richieste di contatto - + Friends Amici @@ -773,40 +787,40 @@ MessageSend - + to: a: - + Title (optional) Titolo (opzionale) - + Drop your Content here. Lascia qui il tuo contenuto. - + What's on your mind? A cosa stai pensando? - - + + Error Errore - + Only one attachment supported at the moment. Remove other attachment first! Solo un allegato è attualmente supportato. Rimuovere prima gli altri allegati! - + No receiver supplied! Nessun ricevitore in dotazione! @@ -822,12 +836,12 @@ NewsStack - + Network Error Errore di rete - + More Ancora @@ -978,17 +992,17 @@ attendere: - + Source: Codice: - + Direct Message Messaggio diretto - + In reply to In risposta a @@ -1002,75 +1016,86 @@ partecipare - + ago fa - + Attending: Attendi: - Reply - Risposta + Risposta - + DM Messaggio diretto - + Repost Condividi - + Success! Ha funzionato! - + Conversation Conversazione - + + Bookmark + Segnalibro + + + Attending Attendi - + yes si - + maybe potrebbe - + no no - + Delete Cancella + + + External + Sito web + PermissionDialog - + + Friends Amici - + + Groups Gruppi @@ -1078,28 +1103,28 @@ PhotoTab - + 's images Immagini - + All Images Tutte immagini - + Only new Solo nuovo - - + + Own Images Mie immagini - + More Ancora @@ -1423,14 +1448,14 @@ Chiudi - + Background Sync Rightclick or Middleclick to Quit Sincronizzazione dello sfondo Fare clic con il tasto destro del mouse o con il tasto centrale per uscire - + Click to open Friendiqa Clicca per aprire Friendiqa @@ -1552,12 +1577,12 @@ Fare clic con il tasto destro del mouse o con il tasto centrale per uscireL'impostazione del tipo di visualizzazione delle notizie è stata spostata dalla pagina del conto alla pagina di configurazione. - + Undefined Array Error - + JSON status Error From 4ffae4ac31138a3623b20ae1f8a334db280144b2 Mon Sep 17 00:00:00 2001 From: LubuWest Date: Thu, 3 Mar 2022 21:39:41 +0100 Subject: [PATCH 18/35] bugfixes timeline refresh and screenshots --- LinuxWebview.patch | 40 ------------ Screenshots/ConfigTab.jpg | Bin 10922 -> 11706 bytes Screenshots/EventsTab.jpg | Bin 17798 -> 13895 bytes Screenshots/FriendsTab.jpg | Bin 15309 -> 14484 bytes Screenshots/NewsTab.jpg | Bin 13566 -> 13844 bytes source-android/common/friendiqa.cpp | 1 + source-linux/qml/calendarqml/CalendarTab.qml | 17 ++--- source-linux/qml/configqml/AccountPage.qml | 1 + source-linux/qml/contactqml/FriendsTab.qml | 63 +++++++++---------- source-linux/qml/newsqml/MessageSend.qml | 2 +- source-linux/qml/newsqml/NewsStack.qml | 19 +++--- source-linux/qml/newsqml/NewsTab.qml | 2 - source-linux/qml/photoqml/PhotoTab.qml | 2 - 13 files changed, 46 insertions(+), 101 deletions(-) delete mode 100644 LinuxWebview.patch diff --git a/LinuxWebview.patch b/LinuxWebview.patch deleted file mode 100644 index 0fb4a2d..0000000 --- a/LinuxWebview.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- source-linux/CMakeLists.txt 2021-05-12 21:27:38.172988268 +0200 -+++ source-linux/CMakeLists.txt 2021-06-22 21:57:17.487089044 +0200 -@@ -13,7 +13,7 @@ - set(CMAKE_INCLUDE_CURRENT_DIR ON) - endif() - --find_package(Qt5 COMPONENTS Widgets Quick Sql DBus WebView REQUIRED) -+find_package(Qt5 COMPONENTS Widgets Quick Sql DBus REQUIRED) - - set(MOC_SOURCES common/uploadableimage.h - common/xhr.h -@@ -38,7 +38,6 @@ - target_link_libraries(friendiqa Qt::Widgets) - target_link_libraries(friendiqa Qt::Quick) - target_link_libraries(friendiqa Qt::Sql) --target_link_libraries(friendiqa Qt::WebView) - target_link_libraries(friendiqa Qt::DBus) - # target_link_libraries(friendiqa Qt::Webengine) - ---- source-linux/js/newsworker.js 2021-06-22 21:40:46.938247380 +0200 -+++ source-linux/js/newsworker.js 2021-06-22 22:00:10.789922846 +0200 -@@ -107,17 +107,7 @@ - if ((videoAttachmentList.length==0) || (videoAttachmentList[videoAttachmentList.length-1].url!=ptvideohelper.url)){videoAttachmentList.push(ptvideohelper)} - } - } -- if (newsitemobject.text.indexOf("youtube.com/watch?v")>-1){ -- var yttext=newsitemobject.text; -- while (yttext.indexOf("youtube.com/watch?v")>-1){ -- var ythelperstringposition=yttext.indexOf("watch?v="); -- var ytposend=findend(yttext,ythelperstringposition); -- var ythelper={mimetype:"video/youtube"} -- ythelper.url=yttext.substring(ythelperstringposition+8,ytposend); -- yttext=yttext.substring(ytposend,yttext.length); -- if ((videoAttachmentList.length==0) || (videoAttachmentList[videoAttachmentList.length-1].url!=ythelper.url)){videoAttachmentList.push(ythelper)} -- } -- } -+ - newsitemobject.videoAttachmentList=videoAttachmentList; - newsitemobject.imageAttachmentList=imageAttachmentList; - if ((msg.options.hasOwnProperty("hide_nsfw"))&&(msg.options.hide_nsfw==1)&&(newsitemobject.text.indexOf("#nsfw")>-1)){ diff --git a/Screenshots/ConfigTab.jpg b/Screenshots/ConfigTab.jpg index 0754a37658591b5849901f27bf3f2fccb1a5e347..ca61dc343a961e2a218359117bef310e450cae2c 100644 GIT binary patch literal 11706 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 IjrQFC0`rtbUjP6A literal 10922 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 e=)1b)ayiNLh3WRqOSyjRXA2>i+@OFH)WW literal 17798 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 literal 15309 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 X5DKjYHck*4kY#}QYV;%E_sV|*#=X0H diff --git a/Screenshots/NewsTab.jpg b/Screenshots/NewsTab.jpg index e8227fcf1e5a8fe6cb89d86a0b50715eab04dbe9..dc0817d1617aa8b3f1fc68ba50bb45276f3b372a 100644 GIT binary patch literal 13844 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

    U-7_ah2*#0Y3LC~e`>RFx(U6Xz&6VG=kfI5E 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 ZOI2~;>#L6Oq7D;W#T;YZ-=g>P{{!A`dtLwl diff --git a/source-android/common/friendiqa.cpp b/source-android/common/friendiqa.cpp index 8193d70..75cf416 100644 --- a/source-android/common/friendiqa.cpp +++ b/source-android/common/friendiqa.cpp @@ -61,6 +61,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[]) { UPDATENEWS* updatenews= UPDATENEWS::instance(); updatenews->setDatabase(); updatenews->login(); + updatenews->setSyncAll(true); updatenews->startsync(); app.connect (updatenews,SIGNAL(quitapp()),&app,SLOT(quit())); return app.exec(); diff --git a/source-linux/qml/calendarqml/CalendarTab.qml b/source-linux/qml/calendarqml/CalendarTab.qml index 283995c..de5a701 100644 --- a/source-linux/qml/calendarqml/CalendarTab.qml +++ b/source-linux/qml/calendarqml/CalendarTab.qml @@ -43,16 +43,14 @@ import "qrc:/qml/genericqml" Rectangle { id:calendarrectangle // y:1 - width:parent.width//-mm - height:parent.height//-5*mm -// anchors.fill: parent - color: Material.backgroundColor//'#fff' + width:parent.width + height:parent.height + color: Material.backgroundColor property date currentTime: new Date() property int offsetTime: currentTime.getTimezoneOffset() * 60 * 1000 property var events:[] property var eventdays:[] - function showEvents(friend){ if(friend=="backButton"){Service.eventsfromdb(db,login.username,function(eventArray,dayArray){ events=eventArray; @@ -90,8 +88,6 @@ Rectangle { } BlueButton{ - x:mm - y:mm z:2 visible: !wideScreen fontColor: "grey" @@ -128,9 +124,6 @@ Rectangle { updatenews.login(); updatenews.setSyncAll(false); updatenews.events(); -// Service.getEvents(db,login, calendartab,function(){ -// showEvents("") -// }) }} Connections{ @@ -140,8 +133,7 @@ Rectangle { calBusy.running=false; showEvents("") } - } - + } MButton{ id: calendartabstatusButton @@ -167,7 +159,6 @@ Rectangle { onClicked: {calendartabmenu.popup()} } - ListView{ id: calendarView y:2*root.fontFactor*osSettings.bigFontSize//8*mm diff --git a/source-linux/qml/configqml/AccountPage.qml b/source-linux/qml/configqml/AccountPage.qml index 8a434f7..7ef3b12 100644 --- a/source-linux/qml/configqml/AccountPage.qml +++ b/source-linux/qml/configqml/AccountPage.qml @@ -316,6 +316,7 @@ Page{ //reset values login=userconfig; news=[]; + contactlist=[]; rootstack.currentIndex=0; newstypeSignal("refresh"); },"isActive",0); diff --git a/source-linux/qml/contactqml/FriendsTab.qml b/source-linux/qml/contactqml/FriendsTab.qml index 48bdd86..1391dc4 100644 --- a/source-linux/qml/contactqml/FriendsTab.qml +++ b/source-linux/qml/contactqml/FriendsTab.qml @@ -45,14 +45,12 @@ Rectangle { color: Material.backgroundColor//"white" function showContactdetails(contact){ -// rootstack.currentIndex=0; -// bar.currentIndex=0; + // rootstack.currentIndex=0; + // bar.currentIndex=0; root.contactdetailsSignal(contact) } BlueButton{ - x:mm - y:mm z:2 visible: !wideScreen fontColor: "grey" @@ -64,33 +62,33 @@ Rectangle { } TabBar { - id: friendsbar - width: osSettings.osType=="Android"?parent.width-2*root.fontFactor*osSettings.bigFontSize:parent.width - height: 2*root.fontFactor*osSettings.bigFontSize - x: osSettings.osType=="Android"?2*root.fontFactor*osSettings.bigFontSize:0 - visible: !wideScreen - position:TabBar.Header - currentIndex: 1 - TabButton { - text: qsTr("Me") - font.pointSize: osSettings.systemFontSize - height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm - } - TabButton { - text: qsTr("Friends") - font.pointSize: osSettings.systemFontSize - height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm - } - TabButton { - text: qsTr("Contacts") - font.pointSize: osSettings.systemFontSize - height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm - } - TabButton { - text: qsTr("Groups") - font.pointSize: osSettings.systemFontSize - height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm - } + id: friendsbar + width: osSettings.osType=="Android"?parent.width-2*root.fontFactor*osSettings.bigFontSize:parent.width + height: 2*root.fontFactor*osSettings.bigFontSize + x: osSettings.osType=="Android"?2*root.fontFactor*osSettings.bigFontSize:0 + visible: !wideScreen + position:TabBar.Header + currentIndex: 1 + TabButton { + text: qsTr("Me") + font.pointSize: osSettings.systemFontSize + height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm + } + TabButton { + text: qsTr("Friends") + font.pointSize: osSettings.systemFontSize + height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm + } + TabButton { + text: qsTr("Contacts") + font.pointSize: osSettings.systemFontSize + height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm + } + TabButton { + text: qsTr("Groups") + font.pointSize: osSettings.systemFontSize + height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm + } } LeftDrawerLinux{ @@ -145,7 +143,4 @@ Rectangle { source:(friendsTabView.currentIndex==3)? "qrc:/qml/contactqml/GroupsListTab.qml":"" } } - Component.onCompleted: { - //root.contactdetailsSignal.connect(showContactdetails); - } } diff --git a/source-linux/qml/newsqml/MessageSend.qml b/source-linux/qml/newsqml/MessageSend.qml index 5159d0b..73587b3 100644 --- a/source-linux/qml/newsqml/MessageSend.qml +++ b/source-linux/qml/newsqml/MessageSend.qml @@ -220,7 +220,7 @@ Rectangle{ Rectangle{ color: Material.backgroundColor radius: 0.5*mm - visible:(newsSwipeview.stacktype!="Notifications") + visible:(conversation || (newsSwipeview.stacktype!="Notifications")) x:mm width: parent.width-2*mm height:Math.max(bodyField.contentHeight+4*mm,2.5*root.fontFactor*osSettings.bigFontSize) diff --git a/source-linux/qml/newsqml/NewsStack.qml b/source-linux/qml/newsqml/NewsStack.qml index bcbd5fe..995d6bd 100644 --- a/source-linux/qml/newsqml/NewsStack.qml +++ b/source-linux/qml/newsqml/NewsStack.qml @@ -140,7 +140,6 @@ Rectangle{ } } - function showNews(newsToShow){ try{if (rootstackView.depth>1){rootstackView.pop()}}catch(e){} newsBusy.running=false; @@ -153,8 +152,6 @@ Rectangle{ } } - - function search(term){ if (term!=""){ newstabstatus="Search"; @@ -175,10 +172,8 @@ Rectangle{ try{var oldnewsitemobject=newsModel.get(newsModel.count-1).newsitemobject; if(oldnewsitemobject.hasOwnProperty("lastcomment")){ var lastnews_id=oldnewsitemobject.lastcomment.created_at; - //var lastconv_id=oldnewsitemobject.lastcomment.statusnet_conversation_id }else{ var lastnews_id=oldnewsitemobject.created_at; - //var lastconv_id=oldnewsitemobject.statusnet_conversation_id } } catch(e){print(e);var lastnews_id=99999999999999} var messagetype=0; @@ -345,23 +340,29 @@ Rectangle{ } else if (newstab.newstabstatus=="Conversations" || newstabstatus=="Conversations"){ newsStack.updateMethodNews="conversation"} else {newsStack.updateMethodNews="refresh"} + let currentnewstabstatus="Conversations"; + if (newstab.newstabstatus!=""){ + currentnewstabstatus=newstab.newstabstatus + }else if (newstabstatus!=""){ + currentnewstabstatus=newstabstatus + } if (newsSwipeview.stacktype=="Home"){ Newsjs.getLastNews(root.login,root.db,function(currentlastnews){ if (currentlastnews>lastnewsid){ - if(newstab.newstabstatus=="Timeline"){ + if(currentnewstabstatus=="Timeline"){ try{ Newsjs.newsfromdb(root.db,root.login,0, function(dbnews,lastid){ lastnewsid=lastid; showNews(dbnews) })}catch(e){Helperjs.showMessage("Error",e,root)}; } - if(newstab.newstabstatus=="Conversations"){ + if(currentnewstabstatus=="Conversations"){ Newsjs.chatsfromdb(db,root.login,0,[],function(news,lastid){ lastnewsid=lastid; showNews(news)}); } - } else {print("newstab.newstabstatus "+newstab.newstabstatus) - Service.updateView(newstab.newstabstatus) + } else { + Service.updateView(currentnewstabstatus) } }); } diff --git a/source-linux/qml/newsqml/NewsTab.qml b/source-linux/qml/newsqml/NewsTab.qml index 7257bfe..74df437 100644 --- a/source-linux/qml/newsqml/NewsTab.qml +++ b/source-linux/qml/newsqml/NewsTab.qml @@ -130,8 +130,6 @@ Rectangle{ // anchors.left: newsSwipeview.right // } BlueButton{ - x:mm - y:mm z:2 visible: !wideScreen fontColor: "grey" diff --git a/source-linux/qml/photoqml/PhotoTab.qml b/source-linux/qml/photoqml/PhotoTab.qml index 4a1c854..396fdf6 100644 --- a/source-linux/qml/photoqml/PhotoTab.qml +++ b/source-linux/qml/photoqml/PhotoTab.qml @@ -162,8 +162,6 @@ StackView{ } BlueButton{ - x:mm - y:mm z:2 visible: !wideScreen fontColor: Material.secondaryTextColor//"grey" From 48a904b8c0ae134f5ffc9f2af7d2513ed5e3930c Mon Sep 17 00:00:00 2001 From: LubuWest Date: Sun, 13 Mar 2022 21:22:08 +0100 Subject: [PATCH 19/35] bugfixes reply in Friendica 3/2022 and image download --- CHANGELOG.md | 6 +- source-android/android/AndroidManifest.xml | 2 +- source-linux/common/xhr.cpp | 3 +- source-linux/js/helper.js | 2 +- source-linux/js/image.js | 27 +- source-linux/js/news.js | 8 +- source-linux/js/service.js | 2 +- source-linux/js/smiley.js | 932 ++++++++++---------- source-linux/qml/configqml/InfoBox.qml | 2 +- source-linux/qml/newsqml/Conversation.qml | 2 +- source-linux/qml/newsqml/MessageSend.qml | 697 ++++++++------- source-linux/qml/newsqml/NewsVideo.qml | 2 +- source-linux/qml/newsqml/NewsVideoLarge.qml | 4 +- source-linux/qml/newsqml/Newsitem.qml | 53 +- source-linux/qml/photoqml/PhotoTab.qml | 22 +- 15 files changed, 909 insertions(+), 855 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4ca060..bffa2fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v0.6.5 + +* Fix reply in Friendica 3/2022 version due to API bug +* Image downloads work again +* Some additional emojis ## v0.6.4 @@ -5,7 +10,6 @@ * Filter contacts * many new emojis * Replaced Favorite button with Reply button due to buggy Favourite API -* View newsitem on website (works only in coversation view) * Rebuild contacts handling due to buggy Contacts API * Removed permissions for new messages due to buggy Contacts API * Sync all accounts in background (not only active) diff --git a/source-android/android/AndroidManifest.xml b/source-android/android/AndroidManifest.xml index 4e9e9e6..8747bc9 100644 --- a/source-android/android/AndroidManifest.xml +++ b/source-android/android/AndroidManifest.xml @@ -1,5 +1,5 @@ - + @@ -22,7 +22,7 @@ android:logo="@drawable/friendiqa"> + android:label="Friendiqa" android:screenOrientation="unspecified" android:launchMode="singleTask" android:taskAffinity="" android:exported="true"> diff --git a/source-android/friendiqa.pro b/source-android/friendiqa.pro index 24663b3..3fc047c 100644 --- a/source-android/friendiqa.pro +++ b/source-android/friendiqa.pro @@ -86,7 +86,7 @@ DISTFILES += \ android/src/FriendiqaActivity.java \ android/src/FriendiqaService.java -ANDROID_EXTRA_LIBS = $$PWD/android/arm/libcrypto_1_1.so $$PWD/android/arm/libssl_1_1.so $$PWD/android/arm64/libcrypto_1_1.so $$PWD/android/arm64/libssl_1_1.so +ANDROID_EXTRA_LIBS = /home/pankraz/android-sdk/android_openssl/latest/arm/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm64/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm64/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86_64/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86_64/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm64/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm64/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86_64/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86_64/libssl_1_1.so #ANDROID_ABIS = arm64-v8a #android: include(/home/pankraz/git/android_openssl/openssl.pri) From 48a70b83950bcec2b51f164239829a6b07c9135b Mon Sep 17 00:00:00 2001 From: LubuWest Date: Thu, 9 Feb 2023 21:39:43 +0100 Subject: [PATCH 23/35] version v0.6.7 with moderation --- CHANGELOG.md | 7 + Linuxmobile.patch | 2 +- README.md | 9 +- source-android/android/AndroidManifest.xml | 2 +- source-android/qml/friendiqa.qml | 2 + source-linux/application.qrc | 4 + source-linux/common/updatenews.cpp | 5 +- source-linux/common/xhr.cpp | 35 +- source-linux/common/xhr.h | 3 +- source-linux/js/helper.js | 7 +- source-linux/js/image.js | 9 +- source-linux/js/news.js | 16 + source-linux/js/newsworker.js | 19 +- source-linux/js/service.js | 8 +- source-linux/qml/calendarqml/CalendarTab.qml | 10 +- source-linux/qml/calendarqml/EventCreate.qml | 686 +++++++++--------- source-linux/qml/calendarqml/EventList.qml | 4 +- .../qml/calendarqml/EventListItem.qml | 2 +- source-linux/qml/configqml/AcceptRules.qml | 70 ++ source-linux/qml/configqml/AccountPage.qml | 129 ++-- source-linux/qml/configqml/InfoBox.qml | 2 +- .../qml/contactqml/FriendsListTab.qml | 22 +- source-linux/qml/contactqml/GroupsListTab.qml | 3 - source-linux/qml/friendiqa.qml | 7 +- source-linux/qml/genericqml/BlueButton.qml | 3 +- .../qml/genericqml/DrawerAccountComponent.qml | 8 +- .../qml/genericqml/ImagePickerLinux.qml | 293 ++++---- .../qml/genericqml/IntentReceiver.qml | 16 +- source-linux/qml/genericqml/LinuxSync.qml | 1 - source-linux/qml/newsqml/BlockUser.qml | 55 ++ source-linux/qml/newsqml/ContactPage.qml | 42 +- source-linux/qml/newsqml/Conversation.qml | 6 +- .../qml/newsqml/MessageImageUploadDialog.qml | 301 ++++++++ source-linux/qml/newsqml/MessageSend.qml | 210 +++--- source-linux/qml/newsqml/NewsStack.qml | 41 +- source-linux/qml/newsqml/Newsitem.qml | 47 +- source-linux/qml/newsqml/ReportUser.qml | 77 ++ .../qml/photoqml/ImageUploadDialog.qml | 39 +- source-linux/translations/friendiqa-de.qm | Bin 18217 -> 19283 bytes source-linux/translations/friendiqa-de.ts | 90 ++- source-linux/translations/friendiqa-es.qm | Bin 18173 -> 17933 bytes source-linux/translations/friendiqa-es.ts | 280 ++++--- source-linux/translations/friendiqa-hu.qm | Bin 16933 -> 16638 bytes source-linux/translations/friendiqa-hu.ts | 280 ++++--- source-linux/translations/friendiqa-it.qm | Bin 18097 -> 17897 bytes source-linux/translations/friendiqa-it.ts | 280 ++++--- 46 files changed, 2106 insertions(+), 1026 deletions(-) create mode 100644 source-linux/qml/configqml/AcceptRules.qml create mode 100644 source-linux/qml/newsqml/BlockUser.qml create mode 100644 source-linux/qml/newsqml/MessageImageUploadDialog.qml create mode 100644 source-linux/qml/newsqml/ReportUser.qml diff --git a/CHANGELOG.md b/CHANGELOG.md index 161cf0d..703baf5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## v0.6.7 + +* Upload multiple images for post and add image descriptions +* Block user +* Report user +* Create Calendar entry from post text + ## v0.6.6 * Create event diff --git a/Linuxmobile.patch b/Linuxmobile.patch index 0901e7d..4da903a 100644 --- a/Linuxmobile.patch +++ b/Linuxmobile.patch @@ -1,6 +1,6 @@ --- source-linux/qml/friendiqa.qml +++ source-linux/qml/friendiqa.qml -@@ -191,7 +191,7 @@ +@@ -193,7 +193,7 @@ color: Material.backgroundColor } diff --git a/README.md b/README.md index bf00e76..f13676f 100644 --- a/README.md +++ b/README.md @@ -31,14 +31,13 @@ Currently supported: * Update fetches new posts (up to last 50) since last in local DB * More shows older posts from local DB * Create new Message with images or direct messages,smileys -* Send image from Android gallery +* Send image(s) from Android gallery * Send text or urls from other apps to Friendiqa * Native Android image dialog ToDo: * Videos and other binary data as attachment (sending, not supported in API) -* More than one attachment * Attachments for Direct messages (currently not supported in API) # Friends @@ -48,7 +47,7 @@ Currently supported: * Tabs for own profiles, friends, other contacts and groups * Show profile(s) of user and change profile picture * List of all known contacts with locally downloaded pictures -* Follow or unfollow contacts +* Follow/unfollow or block/unblock contacts * Search for new contacts according to topic * Show follow requests; approve, deny, ignore requests * Additional information, last messages and other functionality shown in news tab @@ -92,7 +91,7 @@ Currently supported: ToDo -* Create events (needs API) +* Show more details and attendance of events (needs API) # Config/Accounts @@ -107,7 +106,7 @@ Currently supported: ToDo -* OAuth? +* OAuth # Other diff --git a/source-android/android/AndroidManifest.xml b/source-android/android/AndroidManifest.xml index 30e1f87..5fcbd9e 100644 --- a/source-android/android/AndroidManifest.xml +++ b/source-android/android/AndroidManifest.xml @@ -1,5 +1,5 @@ - + - - - - - - + @@ -138,4 +130,7 @@ + + + diff --git a/source-android/common/oauth.cpp b/source-android/common/oauth.cpp index 52faaff..7e5af5f 120000 --- a/source-android/common/oauth.cpp +++ b/source-android/common/oauth.cpp @@ -1 +1 @@ -/home/pankraz/ownCloud/clientsync/Friendiqa/v0.6/source-linux/common/oauth.cpp \ No newline at end of file +../../source-linux/common/oauth.cpp \ No newline at end of file diff --git a/source-android/common/oauth.h b/source-android/common/oauth.h index 5c2bab8..607b211 120000 --- a/source-android/common/oauth.h +++ b/source-android/common/oauth.h @@ -1 +1 @@ -/home/pankraz/ownCloud/clientsync/Friendiqa/v0.6/source-linux/common/oauth.h \ No newline at end of file +../../source-linux/common/oauth.h \ No newline at end of file diff --git a/source-android/friendiqa.pro b/source-android/friendiqa.pro index ec7451e..20ff216 100644 --- a/source-android/friendiqa.pro +++ b/source-android/friendiqa.pro @@ -13,7 +13,7 @@ TEMPLATE = app TARGET = friendiqa CONFIG += release -QT += core core-private qml quick gui widgets sql androidextras network networkauth #webengine webview +QT += core core-private qml quick gui widgets sql androidextras network networkauth include(androidnative.pri/androidnative.pri) @@ -88,8 +88,6 @@ DISTFILES += \ android/src/FriendiqaActivity.java \ android/src/FriendiqaService.java -ANDROID_EXTRA_LIBS = /home/pankraz/android-sdk/android_openssl/latest/arm/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm64/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm64/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86_64/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86_64/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm64/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/arm64/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86/libssl_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86_64/libcrypto_1_1.so /home/pankraz/android-sdk/android_openssl/latest/x86_64/libssl_1_1.so - #ANDROID_ABIS = arm64-v8a -#android: include(/home/pankraz/git/android_openssl/openssl.pri) + android: include(/home/pankraz/android-sdk/android_openssl/openssl.pri) diff --git a/source-linux/common/oauth.cpp b/source-linux/common/oauth.cpp index 75b77a5..c2d0d4d 100644 --- a/source-linux/common/oauth.cpp +++ b/source-linux/common/oauth.cpp @@ -1,6 +1,6 @@ // This file is part of Friendiqa // https://github.com/lubuwest/Friendiqa -// Copyright (C) 2020 Marco R. +// Copyright (C) 2023 Marco R. // // 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 diff --git a/source-linux/common/updatenews.cpp b/source-linux/common/updatenews.cpp index 91edf12..454320e 100644 --- a/source-linux/common/updatenews.cpp +++ b/source-linux/common/updatenews.cpp @@ -161,6 +161,7 @@ void UPDATENEWS::login() QJsonObject currentAccount =acc[usernameindex].toObject(); xhr.setAccount(currentAccount.toVariantMap()); username = currentAccount["username"].toString(); + m_url=currentAccount["server"].toString(); } } @@ -206,7 +207,7 @@ void UPDATENEWS::timeline() { m_api="/api/statuses/friends_timeline"; xhr.clearParams(); - //xhr.setUrl(m_url); + xhr.setUrl(m_url); xhr.setApi(m_api); QSqlQuery query("SELECT status_id FROM news WHERE messagetype=0 AND username='"+ username +"' ORDER BY status_id DESC LIMIT 1",m_db); if (query.isActive() && query.isSelect()){ @@ -226,6 +227,7 @@ void UPDATENEWS::replies() { m_api="/api/statuses/replies"; xhr.clearParams(); + xhr.setUrl(m_url); xhr.setApi(m_api); QSqlQuery query("SELECT status_id FROM news WHERE messagetype=3 AND username='"+ username +"' ORDER BY status_id DESC LIMIT 1",m_db); if (query.isActive() && query.isSelect()){ @@ -245,6 +247,7 @@ void UPDATENEWS::directmessages() { m_api="/api/direct_messages/all"; xhr.clearParams(); + xhr.setUrl(m_url); xhr.setApi(m_api); QSqlQuery query("SELECT status_id FROM news WHERE messagetype=1 AND username='"+ username +"' ORDER BY status_id DESC LIMIT 1",m_db); if (query.isActive() && query.isSelect()){ @@ -263,6 +266,7 @@ void UPDATENEWS::notifications() { m_api="/api/friendica/notification"; xhr.clearParams(); + xhr.setUrl(m_url); xhr.setApi(m_api); xhr.get(); QObject::connect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(store(QByteArray,QString))); @@ -273,6 +277,7 @@ void UPDATENEWS::notifications() void UPDATENEWS::events() { m_api="/api/friendica/events"; xhr.clearParams(); + xhr.setUrl(m_url); xhr.setApi(m_api); QSqlQuery query("SELECT id FROM events WHERE username='"+ username +"' ORDER BY id DESC LIMIT 1",m_db); if (query.isActive() && query.isSelect()){ @@ -291,6 +296,7 @@ void UPDATENEWS::events() void UPDATENEWS::friendrequests() { m_api="/api/v1/follow_requests"; xhr.clearParams(); + xhr.setUrl(m_url); xhr.setApi(m_api); xhr.get(); QObject::disconnect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(store(QByteArray,QString))); @@ -300,7 +306,6 @@ void UPDATENEWS::friendrequests() } - void UPDATENEWS::store(QByteArray serverreply,QString apiname) { if (apiname!=m_api || xhr.downloadtype()!=""){} else { QJsonDocument news; @@ -430,6 +435,7 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname) } } QList newcontacts=findNewContacts(news); + emit this->success(m_api); if (newcontacts.size()>0){ updateContacts(newcontacts); startImagedownload("contactlist"); @@ -442,7 +448,7 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname) } } else { - qDebug()<< m_api << "Friendiqa updatenews error " << serverreply <error(m_api,QTextCodec::codecForName("utf-8")->toUnicode(serverreply)); emit this->error(m_api,QString(serverreply)); if(m_syncAll){ @@ -454,8 +460,6 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname) } - - void UPDATENEWS::updateImageLocation(QString downloadtype,QString imageurl, QString filename, int index){ if (downloadtype=="contactlist"){ QSqlQuery testquery("SELECT profile_image FROM contacts WHERE profile_image_url ='"+imageurl+ "' AND username = '" +username+"'",m_db); @@ -812,7 +816,7 @@ void UPDATENEWS::storeEvents(QByteArray serverreply,QString apiname) } } if(notifylist.contains("notify_Events")){ - QSqlQuery eventnotifyquery("SELECT start,title FROM events WHERE (start BETWEEN " + QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch()) + " AND "+QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch()+(m_updateInterval*60*1000))+") AND username='"+ username +"'",m_db); + QSqlQuery eventnotifyquery("SELECT start,title FROM events WHERE (start BETWEEN " + QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch()) + " AND "+QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch()+(m_updateInterval*119*1000))+") AND username='"+ username +"'",m_db); while (eventnotifyquery.next()) { alarm.notify("Event: "+ QDateTime::fromMSecsSinceEpoch(eventnotifyquery.value(0).toLongLong()).toString("dd.MM.yyyy hh:mm"),eventnotifyquery.value(1).toString(),1); } diff --git a/source-linux/common/updatenews.h b/source-linux/common/updatenews.h index 5db6237..9f857d7 100644 --- a/source-linux/common/updatenews.h +++ b/source-linux/common/updatenews.h @@ -75,6 +75,7 @@ public slots: private: QString m_api; + QString m_url; QString username; bool m_syncAll; int syncindex; diff --git a/source-linux/common/xhr.cpp b/source-linux/common/xhr.cpp index 7e4b695..ace30a0 100644 --- a/source-linux/common/xhr.cpp +++ b/source-linux/common/xhr.cpp @@ -363,7 +363,10 @@ void XHR::onRequestFinished() { // Save the file here //qDebug() << "buffer " << buffer; - if (buffer.isNull()){qDebug() << "File empty"<error(m_downloadtype,m_url,m_api,1);} + if (buffer.isNull()){qDebug() << "File empty"<error(m_downloadtype,m_url,m_api,1); + } else if (m_downloadtype=="picturelist") { QJsonDocument jsonResponse = QJsonDocument::fromJson(buffer); QJsonObject jsonObject = jsonResponse.object(); @@ -391,7 +394,6 @@ void XHR::onRequestFinished() jsonObject["data"]=""; jsonObject["filename"]=helpfile+filesuffix; emit this->downloadedjson(m_downloadtype,m_url,m_filename,dlindex,jsonObject); - if(downloadtype()=="picturelist"){dlindex=dlindex+1;XHR::getlist();} } else { QFile file(m_filename); @@ -400,10 +402,11 @@ void XHR::onRequestFinished() buffer.clear(); file.close(); emit this->downloaded(m_downloadtype,m_url,m_filename,dlindex); - if(downloadtype()=="contactlist" || downloadtype()=="friendrequests"){dlindex=dlindex+1;XHR::getlist();} - //reply->deleteLater(); } + if(downloadtype()=="contactlist" || downloadtype()=="friendrequests" || downloadtype()=="picturelist"){ + dlindex=dlindex+1;XHR::getlist(); + } } void XHR::onReadyRead() diff --git a/source-linux/qml/configqml/AcceptRules.qml b/source-linux/qml/configqml/AcceptRules.qml index 66442a0..1036802 100644 --- a/source-linux/qml/configqml/AcceptRules.qml +++ b/source-linux/qml/configqml/AcceptRules.qml @@ -43,11 +43,9 @@ Dialog { standardButtons: Dialog.Yes | Dialog.No modal: true onAccepted: { -// username.visible=true; -// password.visible=true; + username.visible=true; ruleButton.visible=false; -// confirmation.visible=true - accountPage.state="oauth" + confirmationOAuth.visible=true } onRejected: {close()} ScrollView{ diff --git a/source-linux/qml/configqml/AccountPage.qml b/source-linux/qml/configqml/AccountPage.qml index efd337d..a1ab175 100644 --- a/source-linux/qml/configqml/AccountPage.qml +++ b/source-linux/qml/configqml/AccountPage.qml @@ -67,10 +67,13 @@ Page{ else{ if (users.length==0){Service.setDefaultOptions(db);} if (userconfig.APIVersion!=""){userconfig.password=""} - if (imagestoredir==""){imagestoredir=filesystem.homePath+"/"+credentials.username+"/"; - userconfig.imagestore=imagestoredir} - if(userconfig.imagestore == filesystem.homePath+"/"+username.text+"/") - {filesystem.makePath(filesystem.homePath+"/"+username.text);} + if (imagestoredir==""){ + imagestoredir=filesystem.homePath+"/"+credentials.username+"/"; + userconfig.imagestore=imagestoredir + } + if(userconfig.imagestore == filesystem.homePath+"/"+credentials.username+"/") + {filesystem.makePath(filesystem.homePath+"/"+credentials.username);} + print("imagestoredir "+imagestoredir) filesystem.Directory=imagestoredir; filesystem.makeDir("contacts"); filesystem.makeDir("albums"); @@ -373,7 +376,7 @@ Page{ rulestext=rulestext+rulesarray[rule].text+"\n" } var component = Qt.createComponent("qrc:/qml/configqml/AcceptRules.qml"); - var rulesdialog = component.createObject(root,{"rules": rulestext}); + var rulesdialog = component.createObject(accountPage,{"rules": rulestext}); rulesdialog.open(); } else if(api=="/api/statusnet/config"){ @@ -385,7 +388,7 @@ Page{ catch(e){print(e)} } - else if (api=="/api/v1/apps"){ + else if (api=="/api/v1/apps"){print("/api/v1/apps text "+text) let app=JSON.parse(text); accountPage.appdata=app; oauth2.setClientId(app.client_id); @@ -537,23 +540,23 @@ Page{ states: [ State { name: "new_oauth" - PropertyChanges { target: username; visible: false } - PropertyChanges { target: password; visible: false} - PropertyChanges { target: ruleButton; visible: true} + PropertyChanges {target: username; visible: false } + PropertyChanges {target: password; visible: false} + PropertyChanges {target: ruleButton; visible: true} }, State { name:"oauth" PropertyChanges {target: username; visible: true} - PropertyChanges { target: password; visible: false} + PropertyChanges {target: password; visible: false} PropertyChanges {target: confirmationOAuth; visible: true} PropertyChanges {target: setDefault; visible: true} - PropertyChanges { target: confirmation; visible: false} + PropertyChanges {target: confirmation; visible: false} }, State{ name:"password" - PropertyChanges { target: username; visible: true } - PropertyChanges { target: password; visible: true} - PropertyChanges { target: confirmation; visible: true} + PropertyChanges {target: username; visible: true } + PropertyChanges {target: password; visible: true} + PropertyChanges {target: confirmation; visible: true} PropertyChanges {target: confirmationOAuth; visible: false} } ] @@ -565,18 +568,24 @@ Page{ }) accountPage.users=storedUsers; Service.readConfig(db,function(obj){ - userButton.text=obj.username; - servername.text=obj.server; - serverModel.insert(0,{text:obj.server}) - accountPage.setServericon(obj.server); - username.text= obj.username; - password.text=Qt.atob(obj.password); - imagestore.text=obj.imagestore; - imagestoredir=obj.imagestore; - if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'} - if(obj.password!=""){accountPage.state="password"} - else if (obj.token!=""){accountPage.state="oauth"} - else {accountPage.state="new_oauth"} + if (obj==null){ + accountPage.state="new_oauth" + } + else{ + userButton.text=obj.username; + servername.text=obj.server; + serverModel.insert(0,{text:obj.server}) + accountPage.setServericon(obj.server); + username.text= obj.username; + password.text=Qt.atob(obj.password); + imagestore.text=obj.imagestore; + imagestoredir=obj.imagestore; + if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'} + if(obj.password!=""){accountPage.state="password"} + else if (obj.token!=""){accountPage.state="oauth"} + else {accountPage.state="new_oauth"} + } + },"isActive",0) })} catch (e){//print("onCompleted" +users.count +e) diff --git a/source-linux/qml/friendiqa.qml b/source-linux/qml/friendiqa.qml index e09bf64..3893f30 100644 --- a/source-linux/qml/friendiqa.qml +++ b/source-linux/qml/friendiqa.qml @@ -80,7 +80,7 @@ ApplicationWindow{ color: Material.backgroundColor function onLoginChanged(login){ - if(login==""){rootstackView.push("qrc:/qml/configqml/AccountPage.qml")} + if(login=="" || login==null){rootstackView.push("qrc:/qml/configqml/AccountPage.qml")} else{ // if (login.newsViewType!="" || login.newsViewType!=null){ // newstab.newstabstatus=login.newsViewType;} diff --git a/source-linux/qml/genericqml/DrawerAccountComponent.qml b/source-linux/qml/genericqml/DrawerAccountComponent.qml index db47c58..c01ced0 100644 --- a/source-linux/qml/genericqml/DrawerAccountComponent.qml +++ b/source-linux/qml/genericqml/DrawerAccountComponent.qml @@ -39,7 +39,6 @@ Item { width: parent.width Label{ - y:0.5*root.fontFactor*osSettings.bigFontSize width:parent.width height: 1.5*osSettings.bigFontSize*root.fontFactor @@ -47,11 +46,6 @@ Item { font.pointSize: osSettings.bigFontSize text: account.username } - // Label{ - // text:login.hasOwnProperty("server")?"@"+login.server:"" - // font.pixelSize: 5*mm - // width: parent.width - // } Label{ y:2*root.fontFactor*osSettings.bigFontSize @@ -64,6 +58,7 @@ Item { login=account; if(!wideScreen){leftDrawerAndroid.close()} // newstypeSignal("refresh") + newsBusy.running=true; updatenews.setDatabase(); updatenews.login(); updatenews.startsync(); diff --git a/source-linux/qml/newsqml/MessageSend.qml b/source-linux/qml/newsqml/MessageSend.qml index 2589b78..af087d6 100644 --- a/source-linux/qml/newsqml/MessageSend.qml +++ b/source-linux/qml/newsqml/MessageSend.qml @@ -124,7 +124,7 @@ Rectangle{ messageSend.reply_to_user=newsitemobject.user.screen_name; messageSend.parentId=newsitemobject.id } else { - messageSend.state=""; + messageSend.state=null; messageSend.reply_to_user=""; messageSend.parentId=""; bodyField.text=""; diff --git a/source-linux/qml/newsqml/NewsStack.qml b/source-linux/qml/newsqml/NewsStack.qml index 187abe8..82aeed8 100644 --- a/source-linux/qml/newsqml/NewsStack.qml +++ b/source-linux/qml/newsqml/NewsStack.qml @@ -38,7 +38,6 @@ import "qrc:/js/service.js" as Service Rectangle{ id: newsStack - //anchors.fill: parent width: parent.width height: parent.height color: Material.backgroundColor @@ -47,17 +46,6 @@ Rectangle{ property int lastnewsid:0 property string newstabstatus: "" - BusyIndicator{ - id: newsBusy - anchors.horizontalCenter: parent.horizontalCenter - anchors.top:parent.top - anchors.topMargin: mm - width: 2*root.fontFactor*osSettings.bigFontSize - height: 2*root.fontFactor*osSettings.bigFontSize - z:2 - running: false - } - function newstypeHandling(newstype){ try{newsBusy.running=true}catch(e){print(e)}; root.replySignal(""); @@ -215,14 +203,37 @@ Rectangle{ xhr.get() } } + + + function loadDBNews(){ + var messagetype=0; + switch(newsSwipeview.stacktype){ + case "Home":messagetype=0;break; + case "DirectMessages": messagetype=1;break; + case "Notifications":messagetype=2;break; + case "Replies":messagetype=3;break; + default:messagetype=0; + } + if((newstabstatus=="Conversations")&&(newsSwipeview.stacktype=="Home")){ + Newsjs.chatsfromdb(db,login,messagetype,[],function(dbnews,lastid){ + lastnewsid=lastid; + showNews(dbnews); + }) + } + else{ + Newsjs.newsfromdb(db,login,messagetype,function(dbnews,lastid){ + lastnewsid=lastid; + showNews(dbnews) + }) + } + } + Connections{ target:xhr function onError(data,url,api,code){ - //if (data !="contactlist"){Helperjs.showMessage(qsTr("Network Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root);} newsBusy.running=false; } function onSuccess(data,api){ - // downloadNotice.text=downloadNotice.text+ "\n xhr finished "+Date.now(); const newsApiArray=["/api/statuses/friends_timeline", "/api/direct_messages/all", "/api/direct_messages/conversation", @@ -244,6 +255,16 @@ Rectangle{ } } } + Connections{ + target:updatenews + function onError(api,data){print("updatnews error "+api); + newsBusy.running=false; + } + function onSuccess(api){ + loadDBNews(); + newsBusy.running=false; + } + } Timer {id:replytimer; interval: 1000; running: false; repeat: false onTriggered: { @@ -440,30 +461,8 @@ Rectangle{ root.searchSignal.connect(search); try{newsModel.clear()} catch(e){} swipeIndicator.visible=true; - //newsSwipeview.height=rootstack.height - //newsSwipeview.y=5*mm; - //rootStackItem.state="" root.globaloptions.hasOwnProperty("newsViewType")?newstab.newstabstatus=root.globaloptions.newsViewType:newstab.newstabstatus="Conversations"; newstabstatus=newstab.newstabstatus; - var messagetype=0; - switch(newsSwipeview.stacktype){ - case "Home":messagetype=0;break; - case "DirectMessages": messagetype=1;break; - case "Notifications":messagetype=2;break; - case "Replies":messagetype=3;break; - default:messagetype=0; - } - - if((newstabstatus=="Conversations")&&(newsSwipeview.stacktype=="Home")){ - Newsjs.chatsfromdb(db,login,messagetype,[],function(dbnews,lastid){ - lastnewsid=lastid; - showNews(dbnews); - }) - } - else{ - Newsjs.newsfromdb(db,login,messagetype,function(dbnews,lastid){ - lastnewsid=lastid; - showNews(dbnews) - })} + loadDBNews() } } diff --git a/source-linux/qml/newsqml/NewsTab.qml b/source-linux/qml/newsqml/NewsTab.qml index 67031de..36254f0 100644 --- a/source-linux/qml/newsqml/NewsTab.qml +++ b/source-linux/qml/newsqml/NewsTab.qml @@ -192,6 +192,7 @@ Rectangle{ //onLoaded: newsSwipeview.stacktype="Notifications" } } + PageIndicator { id: swipeIndicator z:5 @@ -203,5 +204,16 @@ Rectangle{ anchors.horizontalCenter: parent.horizontalCenter } + BusyIndicator{ + id: newsBusy + anchors.horizontalCenter: newsSwipeview.horizontalCenter + anchors.top:parent.top + anchors.topMargin: mm + width: 2*root.fontFactor*osSettings.bigFontSize + height: 2*root.fontFactor*osSettings.bigFontSize + z:2 + running: false + } + Component.onCompleted: {root.directmessageSignal.connect(newsSwipeview.onDirectMessage)} } From 17f25d68095a8fd73df4e6cbf5ebc8f2893e3512 Mon Sep 17 00:00:00 2001 From: LubuWest Date: Mon, 5 Jun 2023 21:36:53 +0200 Subject: [PATCH 27/35] Android bugfix --- source-android/common/oauth.cpp | 2 +- source-android/common/oauth.h | 2 +- source-android/qml/friendiqa.qml | 4 ++-- source-linux/qml/newsqml/NewsStack.qml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source-android/common/oauth.cpp b/source-android/common/oauth.cpp index 7e5af5f..52faaff 120000 --- a/source-android/common/oauth.cpp +++ b/source-android/common/oauth.cpp @@ -1 +1 @@ -../../source-linux/common/oauth.cpp \ No newline at end of file +/home/pankraz/ownCloud/clientsync/Friendiqa/v0.6/source-linux/common/oauth.cpp \ No newline at end of file diff --git a/source-android/common/oauth.h b/source-android/common/oauth.h index 607b211..5c2bab8 120000 --- a/source-android/common/oauth.h +++ b/source-android/common/oauth.h @@ -1 +1 @@ -../../source-linux/common/oauth.h \ No newline at end of file +/home/pankraz/ownCloud/clientsync/Friendiqa/v0.6/source-linux/common/oauth.h \ No newline at end of file diff --git a/source-android/qml/friendiqa.qml b/source-android/qml/friendiqa.qml index 000aa0e..e9c5227 100644 --- a/source-android/qml/friendiqa.qml +++ b/source-android/qml/friendiqa.qml @@ -43,11 +43,11 @@ import "qrc:/qml/genericqml" ApplicationWindow{ id:root title: "Friendiqa" - property var globaloptions: Service.readGO(db) property QtObject osSettings: {var tmp=Qt.createComponent("qrc:/qml/configqml/OSSettingsAndroid.qml");return tmp.createObject(root)} visible: true property var db: ["Friendiqa", "1.0", "Stores Friendica data", 100000000] property var login: Service.readActiveConfig(db) + property var globaloptions: Service.readGO(db) property real fontFactor: root.font.pixelSize/root.font.pointSize property var contactlist: [] property real mm: osSettings.osType=="Android"?Screen.pixelDensity:Screen.pixelDensity*1.5 @@ -76,7 +76,7 @@ ApplicationWindow{ Material.theme: Material.System function onLoginChanged(login){ - if(login==""){rootstackView.push("qrc:/qml/configqml/AccountPage.qml")} + if(login=="" || login==null){rootstackView.push("qrc:/qml/configqml/AccountPage.qml")} else{ Newsjs.getCurrentContacts(login,db,function(contacts){ contactlist=contacts})} diff --git a/source-linux/qml/newsqml/NewsStack.qml b/source-linux/qml/newsqml/NewsStack.qml index 82aeed8..239b6a4 100644 --- a/source-linux/qml/newsqml/NewsStack.qml +++ b/source-linux/qml/newsqml/NewsStack.qml @@ -257,7 +257,7 @@ Rectangle{ } Connections{ target:updatenews - function onError(api,data){print("updatnews error "+api); + function onError(api,data){ newsBusy.running=false; } function onSuccess(api){ From 2debd8f2ab177951f449f5107facc1801c627e8a Mon Sep 17 00:00:00 2001 From: LubuWest Date: Thu, 27 Jul 2023 21:52:16 +0200 Subject: [PATCH 28/35] Native colors and new message create window --- CHANGELOG.md | 6 +- README.md | 3 +- source-android/android/AndroidManifest.xml | 6 +- source-android/android/build.gradle | 16 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../android/src/FriendiqaService.java | 6 +- .../androidnativeexample/Components.qml | 62 -- .../examples/androidnativeexample/README.md | 25 - .../android-sources/AndroidManifest.xml | 56 - .../android-sources/androidnative.gradle | 34 - .../android-sources/build.gradle | 60 -- .../android-sources/gradle.properties | 9 - .../gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - .../android-sources/gradlew | 160 --- .../android-sources/gradlew.bat | 90 -- .../android-sources/local.properties | 6 - .../android-sources/res/drawable/icon.png | Bin 4627 -> 0 bytes .../android-sources/res/drawable/splash.xml | 12 - .../android-sources/res/values/apptheme.xml | 6 - .../android-sources/res/values/libs.xml | 25 - .../android-sources/src/ExampleActivity.java | 16 - .../android-sources/src/ExampleService.java | 96 -- .../androidnativeexample.pro | 38 - .../androidnativeexample.pro.user | 392 ------- .../androidnativeexample/debugwrapper.cpp | 17 - .../androidnativeexample/debugwrapper.h | 20 - .../androidnativeexample/deployment.pri | 27 - .../dialog/DialogDemo.qml | 38 - .../imagePicker/ImagePickerDemo.qml | 77 -- .../androidnativeexample/info/InfoDemo.qml | 55 - .../examples/androidnativeexample/main.cpp | 72 -- .../examples/androidnativeexample/main.qml | 76 -- .../notification/NotificationDemo.qml | 30 - .../examples/androidnativeexample/qml.qrc | 31 - .../examples/androidnativeexample/qpm.json | 10 - .../drawable-hdpi/ic_android_black_48dp.png | Bin 519 -> 0 bytes .../res/drawable-hdpi/ic_done_black_24dp.png | Bin 177 -> 0 bytes .../res/drawable-hdpi/icon.png | Bin 4627 -> 0 bytes .../drawable-mdpi/ic_android_black_48dp.png | Bin 343 -> 0 bytes .../res/drawable-mdpi/ic_done_black_24dp.png | Bin 130 -> 0 bytes .../drawable-xhdpi/ic_android_black_48dp.png | Bin 641 -> 0 bytes .../res/drawable-xhdpi/ic_done_black_24dp.png | Bin 188 -> 0 bytes .../drawable-xxhdpi/ic_android_black_48dp.png | Bin 975 -> 0 bytes .../res/drawable-xxhdpi/ic_arrow_back.png | Bin 287 -> 0 bytes .../res/drawable-xxhdpi/ic_camera.png | Bin 1866 -> 0 bytes .../drawable-xxhdpi/ic_done_black_24dp.png | Bin 227 -> 0 bytes .../res/drawable-xxhdpi/ic_image.png | Bin 1056 -> 0 bytes .../drawable-xxhdpi/ic_keyboard_backspace.png | Bin 267 -> 0 bytes .../res/drawable-xxhdpi/ic_menu.png | Bin 127 -> 0 bytes .../ic_android_black_48dp.png | Bin 1295 -> 0 bytes .../drawable-xxxhdpi/ic_done_black_24dp.png | Bin 277 -> 0 bytes .../statusbar/StatusBarDemo.qml | 47 - .../theme/ActionBarBackground.qml | 17 - .../androidnativeexample/theme/AppTheme.qml | 33 - .../androidnativeexample/theme/qmldir | 2 - .../androidnativeexample/toast/ToastDemo.qml | 33 - .../androidnative/AndroidNativeActivity.java | 31 +- .../androidnative/AndroidNativeService.java | 11 +- .../java/src/androidnative/Util.java | 68 +- source-android/common/oauth.cpp | 2 +- source-android/common/oauth.h | 2 +- source-linux/CMakeLists.txt | 31 +- source-linux/common/alarmandroid.cpp | 1 + source-linux/common/documenthandler.cpp | 262 +++++ source-linux/common/documenthandler.h | 114 ++ source-linux/common/filesystem.cpp | 8 +- source-linux/common/friendiqa.cpp | 89 +- source-linux/common/updatenews.cpp | 11 + source-linux/common/updatenews.h | 1 + source-linux/common/xhr.cpp | 6 +- source-linux/images/friendica-tray-black.svg | 707 +++++++++++++ source-linux/images/friendica-tray-white.svg | 707 +++++++++++++ source-linux/js/helper.js | 2 +- source-linux/js/news.js | 3 + source-linux/qml/calendarqml/CalendarDay.qml | 3 +- source-linux/qml/calendarqml/CalendarTab.qml | 19 +- source-linux/qml/calendarqml/EventCreate.qml | 11 +- source-linux/qml/calendarqml/EventList.qml | 4 +- .../qml/calendarqml/EventListItem.qml | 9 +- source-linux/qml/configqml/AcceptRules.qml | 5 +- source-linux/qml/configqml/AccountPage.qml | 994 +++++++++--------- .../qml/configqml/ConfigAppearancePage.qml | 341 +++--- source-linux/qml/configqml/ConfigPage.qml | 5 +- .../qml/configqml/ConfigStartPage.qml | 2 - source-linux/qml/configqml/InfoBox.qml | 5 +- .../qml/configqml/LeftDrawerScrollview.qml | 3 + .../qml/configqml/OSSettingsAndroid.qml | 24 + .../qml/configqml/OSSettingsLinux.qml | 25 +- source-linux/qml/configqml/SyncComponent.qml | 3 +- source-linux/qml/configqml/SyncConfig.qml | 5 +- .../qml/contactqml/ContactsSearchPage.qml | 7 +- .../qml/contactqml/FriendsListTab.qml | 15 +- source-linux/qml/contactqml/FriendsTab.qml | 3 +- .../qml/contactqml/GroupComponent.qml | 9 +- .../qml/contactqml/ProfileComponent.qml | 14 +- source-linux/qml/friendiqa.qml | 52 +- source-linux/qml/genericqml/BlueButton.qml | 5 +- .../qml/genericqml/ContactComponent.qml | 11 +- .../qml/genericqml/DrawerAccountComponent.qml | 14 +- source-linux/qml/genericqml/ImagePicker.qml | 3 +- .../qml/genericqml/ImagePickerLinux.qml | 14 +- .../qml/genericqml/LeftDrawerLinux.qml | 5 +- source-linux/qml/genericqml/MButton.qml | 14 +- .../qml/genericqml/PermissionDialog.qml | 23 +- source-linux/qml/genericqml/Search.qml | 5 +- source-linux/qml/newsqml/BlockUser.qml | 1 - source-linux/qml/newsqml/ContactPage.qml | 9 +- .../qml/newsqml/FriendicaActivities.qml | 11 +- source-linux/qml/newsqml/Hashtag.qml | 5 +- .../qml/newsqml/MessageImageUploadDialog.qml | 15 +- source-linux/qml/newsqml/MessageSend.qml | 738 +++++++------ source-linux/qml/newsqml/MoreComments.qml | 4 +- source-linux/qml/newsqml/NewsPhotolist.qml | 3 +- source-linux/qml/newsqml/NewsStack.qml | 41 +- source-linux/qml/newsqml/NewsTab.qml | 185 +++- source-linux/qml/newsqml/Newsitem.qml | 79 +- source-linux/qml/newsqml/ReportUser.qml | 1 - source-linux/qml/newsqml/SmileyDialog.qml | 109 +- .../qml/photoqml/ImageUploadDialog.qml | 7 +- source-linux/qml/photoqml/PhotoTab.qml | 11 +- source-linux/qtquickcontrols2.conf | 3 +- 122 files changed, 3525 insertions(+), 3122 deletions(-) delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/Components.qml delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/README.md delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/AndroidManifest.xml delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/androidnative.gradle delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/build.gradle delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradle.properties delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradle/wrapper/gradle-wrapper.jar delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradle/wrapper/gradle-wrapper.properties delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradlew delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradlew.bat delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/local.properties delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/drawable/icon.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/drawable/splash.xml delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/values/apptheme.xml delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/values/libs.xml delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/src/ExampleActivity.java delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/android-sources/src/ExampleService.java delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/androidnativeexample.pro delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/androidnativeexample.pro.user delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/debugwrapper.cpp delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/debugwrapper.h delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/deployment.pri delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/dialog/DialogDemo.qml delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/imagePicker/ImagePickerDemo.qml delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/info/InfoDemo.qml delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/main.cpp delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/main.qml delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/notification/NotificationDemo.qml delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/qml.qrc delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/qpm.json delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-hdpi/ic_android_black_48dp.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-hdpi/ic_done_black_24dp.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-hdpi/icon.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-mdpi/ic_android_black_48dp.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-mdpi/ic_done_black_24dp.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xhdpi/ic_android_black_48dp.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xhdpi/ic_done_black_24dp.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_android_black_48dp.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_arrow_back.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_camera.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_done_black_24dp.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_image.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_keyboard_backspace.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_menu.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxxhdpi/ic_android_black_48dp.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxxhdpi/ic_done_black_24dp.png delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/statusbar/StatusBarDemo.qml delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/theme/ActionBarBackground.qml delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/theme/AppTheme.qml delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/theme/qmldir delete mode 100644 source-android/androidnative.pri/examples/androidnativeexample/toast/ToastDemo.qml create mode 100644 source-linux/common/documenthandler.cpp create mode 100644 source-linux/common/documenthandler.h create mode 100644 source-linux/images/friendica-tray-black.svg create mode 100644 source-linux/images/friendica-tray-white.svg diff --git a/CHANGELOG.md b/CHANGELOG.md index d8d791e..491a5e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ ## v0.6.8 -* OAuth -* New translation: netherland +* OAuth2 as signup method +* New translation: Dutch ## v0.6.7 @@ -210,4 +210,4 @@ # Translations -* German, Spanish \ No newline at end of file +* German, Spanish diff --git a/README.md b/README.md index feb79cb..e09c9ba 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,8 @@ ToDo * [Google Playstore](https://play.google.com/store/apps/details?id=org.qtproject.friendiqa) * Arch User Repository: * Flatpak: +* Flatpak for Mobile Linux: ## License -Pubished under the [GPL v3](http://gplv3.fsf.org) with the exception of the Openssl library, which is published under OpenSSL License. \ No newline at end of file +Pubished under the [GPL v3](http://gplv3.fsf.org) with the exception of the Openssl library, which is published under OpenSSL License. diff --git a/source-android/android/AndroidManifest.xml b/source-android/android/AndroidManifest.xml index cbfb09a..277b677 100644 --- a/source-android/android/AndroidManifest.xml +++ b/source-android/android/AndroidManifest.xml @@ -1,6 +1,6 @@ - + @@ -132,5 +132,9 @@ + + + + diff --git a/source-android/android/build.gradle b/source-android/android/build.gradle index 9f47fcd..01264a5 100644 --- a/source-android/android/build.gradle +++ b/source-android/android/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.5.2' + classpath "com.android.tools.build:gradle:4.1.0" } } @@ -25,7 +25,7 @@ dependencies { } dependencies { - compile 'androidx.appcompat:appcompat:1.1.0' + compile 'androidx.appcompat:appcompat:1.4.2' } android { @@ -44,8 +44,14 @@ android { compileSdkVersion androidCompileSdkVersion.toInteger() - buildToolsVersion '28.0.3' + buildToolsVersion '31.0.0' + compileSdkVersion 33 + defaultConfig { + minSdkVersion 26 + targetSdkVersion 31 + resConfigs "en" + } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' @@ -67,10 +73,6 @@ android { aaptOptions { noCompress 'rcc' } - - defaultConfig { - resConfigs "en" - } } apply from: "androidnative.gradle" setAndroidNativePath("/../androidnative.pri"); diff --git a/source-android/android/gradle/wrapper/gradle-wrapper.properties b/source-android/android/gradle/wrapper/gradle-wrapper.properties index 4b7e1f3..186b715 100644 --- a/source-android/android/gradle/wrapper/gradle-wrapper.properties +++ b/source-android/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/source-android/android/src/FriendiqaService.java b/source-android/android/src/FriendiqaService.java index 9115a03..4dc2dda 100644 --- a/source-android/android/src/FriendiqaService.java +++ b/source-android/android/src/FriendiqaService.java @@ -10,15 +10,15 @@ import org.qtproject.qt5.android.QtNative; //import androidnative.friendiqa.FriendiqaQtService; public class FriendiqaService extends JobService{ - private static String TAG = "AndroidNative"; + private static String TAG = "FriendiqaService"; //Log.e(TAG,"Service"); @Override public boolean onStartJob(JobParameters params) { - //Log.d(TAG,"Friendiqa JobService"); + Log.d(TAG,"Friendiqa JobService"); Context context = this.getApplicationContext(); - AndroidNativeService fs = new AndroidNativeService(); + AndroidNativeService fs = new AndroidNativeService(); fs.startQtService(context); jobFinished(params,false); //Intent serviceIntent = new Intent(this, AndroidNativeService.class); diff --git a/source-android/androidnative.pri/examples/androidnativeexample/Components.qml b/source-android/androidnative.pri/examples/androidnativeexample/Components.qml deleted file mode 100644 index cdd7880..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/Components.qml +++ /dev/null @@ -1,62 +0,0 @@ -import QtQuick 2.2 -import QtQuick.Window 2.1 -import QuickAndroid 0.1 -import QuickAndroid.Styles 0.1 -import "./theme" - -Page { - objectName: "ComponentPage"; - - property var pages: [ - { - name: "Image Picker", - demo: "imagePicker/ImagePickerDemo.qml", - description: "Pick photo via Java language binding" - },{ - name: "Toast", - demo: "toast/ToastDemo.qml", - description: "Toast Demonstration" - },{ - name: "Notification", - demo: "notification/NotificationDemo.qml", - description: "Demonstrate how to use SystemDispatcher to send notification" - },{ - name: "Information", - demo: "info/InfoDemo.qml", - description: "Android System Information" - },{ - name: "Status Bar", - demo: "statusbar/StatusBarDemo.qml", - description: "Config Status Bar" - } - - ]; - - actionBar: ActionBar { - id : actionBar - iconSource: A.drawable("ic_menu",Constants.black87) - title: "AndroidNative Component List" - showIcon: false - actionButtonEnabled: false - } - - VisualDataModel { - id: visualDataModel - delegate: ListItem { - title: modelData.name - subtitle: modelData.description - onClicked: { - present(Qt.resolvedUrl(modelData.demo)); - } - } - - model: pages; - } - - ListView { - anchors.fill: parent - - model : visualDataModel - } - -} diff --git a/source-android/androidnative.pri/examples/androidnativeexample/README.md b/source-android/androidnative.pri/examples/androidnativeexample/README.md deleted file mode 100644 index e3a9f38..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/README.md +++ /dev/null @@ -1,25 +0,0 @@ -AndroidNative Example Program -===================== - -Prerequisites -------------- - - * Qt Android SDK >= 5.6 - * Android SDK - -Check this article for how to setup Qt and Android SDK: - -[Getting Started with Qt for Android](http://qt-project.org/doc/qt-5/androidgs.html) - -Build Instruction ------------------ - - 1. Run `qpm install` to get required packages - 1. Open androidnativeexample.pro by Qt Creator - 1. Press the "Projects" tab. Make sure the "Android for xxx" kit has been selected - 1. Plug a Android device to your computer - 1. Press "Build" -> "Run" - 1. The program will be deployed to your device. It is so easy! - -![Screenshot](https://raw.githubusercontent.com/benlau/androidnative.pri/master/docs/screenshots/example1.png) - diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/AndroidManifest.xml b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/AndroidManifest.xml deleted file mode 100644 index 5ecf270..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/AndroidManifest.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/androidnative.gradle b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/androidnative.gradle deleted file mode 100644 index 8fe9786..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/androidnative.gradle +++ /dev/null @@ -1,34 +0,0 @@ - -// Obtain androidPackageSourceDir -// androidPackageSourceDir is the absolute path of the folder containing build.gradle and AndroidManifests.xml -// This code also works with androiddeployqt. - -import groovy.json.JsonSlurper - -String getAndroidPackageSourceDir() { - String res = System.getProperty("user.dir"); - - FileTree tree = fileTree(dir: res + "/..").include("android*deployment-settings.json"); - - if (tree.getFiles().size() > 0) { - def inputFile = tree.getFiles().toArray()[0]; - def InputJSON = new JsonSlurper().parseText(inputFile.text); - res = InputJSON["android-package-source-directory"] - } else { - println("android*deployment-settings.json not found. Set androidPackageSourceDir to user.dir"); - } - - return res; -} - -String setAndroidNativePath(String path) { - String androidPackageSourceDir = getAndroidPackageSourceDir(); - String androidNativePath = androidPackageSourceDir + path + "/java/src"; - LinkedHashSet hash = android.sourceSets.main.java.srcDirs; - hash.add(androidNativePath); - android.sourceSets.main.java.srcDirs = hash; -} - -ext { - setAndroidNativePath = this.&setAndroidNativePath; -} diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/build.gradle b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/build.gradle deleted file mode 100644 index 4ce7902..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/build.gradle +++ /dev/null @@ -1,60 +0,0 @@ - -buildscript { - repositories { - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:1.3.0' - } -} - -allprojects { - repositories { - jcenter() - } -} - -apply plugin: 'com.android.application' - -dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) -} - -android { - /******************************************************* - * The following variables: - * - androidBuildToolsVersion, - * - androidCompileSdkVersion - * - qt5AndroidDir - holds the path to qt android files - * needed to build any Qt application - * on Android. - * - * are defined in gradle.properties file. This file is - * updated by QtCreator and androiddeployqt tools. - * Changing them manually might break the compilation! - *******************************************************/ - - compileSdkVersion androidCompileSdkVersion.toInteger() - - buildToolsVersion androidBuildToolsVersion - - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java'] - aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl'] - res.srcDirs = [qt5AndroidDir + '/res', 'res'] - resources.srcDirs = ['src'] - renderscript.srcDirs = ['src'] - assets.srcDirs = ['assets'] - jniLibs.srcDirs = ['libs'] - } - } - lintOptions { - abortOnError false - } -} - -apply from: "androidnative.gradle" -setAndroidNativePath("/../../.."); diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradle.properties b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradle.properties deleted file mode 100644 index 798b77d..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradle.properties +++ /dev/null @@ -1,9 +0,0 @@ -## This file is automatically generated by QtCreator. -# -# This file must *NOT* be checked into Version Control Systems, -# as it contains information specific to your local configuration. - -androidBuildToolsVersion=25.0.3 -androidCompileSdkVersion=25 -buildDir=.build -qt5AndroidDir=/home/pankraz/Qt/5.9.1/android_armv7/src/android/java diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradle/wrapper/gradle-wrapper.jar b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 13372aef5e24af05341d49695ee84e5f9b594659..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53636 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ⅅ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 H-+%o-(+5aQ diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradle/wrapper/gradle-wrapper.properties b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9f2bca4..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Thu Feb 16 01:04:18 HKT 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2-all.zip diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradlew b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradlew deleted file mode 100644 index 9d82f78..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradlew.bat b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradlew.bat deleted file mode 100644 index aec9973..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/local.properties b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/local.properties deleted file mode 100644 index 4277a61..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/local.properties +++ /dev/null @@ -1,6 +0,0 @@ -## This file is automatically generated by QtCreator. -# -# This file must *NOT* be checked into Version Control Systems, -# as it contains information specific to your local configuration. - -sdk.dir=/home/pankraz/android-sdk_alt diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/drawable/icon.png b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/drawable/icon.png deleted file mode 100644 index 156243d7b7199fecc70e9313537f5f39efb7261f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4627 zcmV+u6721XP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2i*x5 z4GRz1IsXp;01=Z(L_t(|+U=Zqa9qWm$3NZg&5UL=x-83m?SKfR8nEL*i^Q5vm}*lg}_2$lZ0$IHa8e2kPwo9jS1KoFt#Kc-?C-N z@}X-+(#*VhuYdc;%;>OYB-xgX*`%vfHJW*^U-!4azwhtYzwXyCSXniVGbtO|uIIWR zUe0^HsI1?9dNODW9^KmusHq`D3W<98#J&8BFE0u$n_ZM&7`6&Uuq{Q@HPY0Tkj95T zyy*jLCmiX|D zoHj6ngC>B=0-ON28M95BZqoCl0jLG49am~QVy0%z4X-q2tAF*nMf~9ASI-ilPfvya z*$bMHri;*+`D~0diqP2Un8yG9P;Relr-vsW_+T2Y6nhL*jt>y_=4Qqn#I>|?0LSmMoUgrnO~M#C3e*^(#z{(TH0Et??{p(}`YCz9j6SRq zp{&S%7uDdt`t~ zb==Yl+txImbl6=VA=0H-G*GAT`8Xk~od3Ati+t{yPoS0V*O^>(Oevnnl;U|D>)g+)4Zon~ z#7nrw$;l|K6>S|ZP0dNV9EXq0c|V2(F*izAGD6&olJpX11k|trq?E!K;jO)0JiF-_ z(KCg ziYGtuReZLE5f6o8=gEz%-}`OUU`~6a0Lp02o+ELd-FSkEG2?mQi)IE_in}NGU~2#O2o;oAHN2 z+_mgeeDKmGgPP*uXf=P?w}qOzHpUf~vvTHAE-anUS5wm0&K!Fkoo+iX99YxWyc9IG zCTWj);3il(a~YP_!=|fxIM`!p_}%6<+=R!hiPO2~y3gcfgHnp5mtbT4V?18{C3Z#s zmpvW7;w!(pkJI;BE$S@I(wI*>Qah6@QkZ@l92u9Lpz#gBaczH(zEJaztC~jNykpaax z=0N`ENPWxk5?aIA)YB2Rtkd&Cvw=jl% zk}!y{yQz+idp76vatp@Y$~S&m$M>FYWrF?$+y8Y7n;+c7XRrAre%sgYzIZie1#Y>Bu!%EMOtgvQ=h;yf~9S4oV|QN_6WkE$PSd!{XCIp;G&5^egkwlG5)mk zRhCR!m{rHhLX{K;DroQQ!dCf|h07=lmv#RxN>KEK43$MQSv~8KK5c1;?&6VccVcOK zfYj(z=NnM_9tLYjiGO(N;A?eMOg9#bpD^_MNh@se48 zS3`)PJ>!n7iDf*A=rX?iu_>&7?bm$g$?vja+28T#?cZc^%hA;Affo&rx1Nv75%hB9$IE0K;lJ@G_oxMYyzt-^?hYmx(a zIS8cl;GXBvm5dEgpC;rh?2f7#^yzeia;g^{Aq|40E8SVzf+0k(N#hJ?UeL2pV8oDg z-2tAj30R>ttmi5xeR>deZ(slj`tpY0`Me>Ce`={7%m5xqp|G`|kdKm*Nc=Wtp>T)oX-G(&+6Hi(dl#z9(k+5 zO~RPeo&W{t0a+;+Nsjo+ojx1$3ix`u5b5d|H1bZZROkUs$8{xbYC7x0vxhxG!tG+D z7dOuepkQ9cT`HQQCk7W^NPC`K!V8X@Su(N+`tt_hk4M~%j`$kdnF9obgH}pZ71XyJ z8`6D2Um=3YiBK%PgU!|!;VikG-ue?wwwzHS{+uzWDBr@;DF*F5c5qP7qfiw1M-O;S zXFL@O1Z+Pgp`x7Ec_v9Dabm#t0XV4Wu?n8^gvuTLzsGjVqXr5ie`ZD5Mhbme0>c6_fi+a(lB!L^#y` zHd@)|H$a|&DdY0+`4pZQe)IN=1L}}cnu_o=0#>k}nJER0%}GpB2>JrdubkOun%SF$ zj)`%g?JX>2pT<-}oqK>%%f5<>CI%5>*znHlB;3S+I+SOJnL26#p17yznWB1sCnyN{ z^SEKw@|<<-ZhnQN7f+{GQ=ONL=g1b&>Hq;Ngdk`ImIkHFkg|_w1&~q-*9Z$PDFA`y z&UT)7ZQXz@%Co}E8M^}MUVcfft#!sc-q_QL(u!N=e~8iHQ90{)t>M>L+J{nLTPcX* z$pl^wZ7U5<a9tm}>V!9TYP^maBSo~L+vQwvT<7mMDvh;M!Lo_-!NbMLO^O*D4w#@2qc zhQg2qT63iJ7+p@h&$XG)qk`jDS@q9M^zVjoKBkYYq`bJ42ey8kSTZtT3T7CBh?F7K$awn0-OAjJl;N7!^vn%)=)!4D9S5g$+U$mnLd~D;?g1J7KVXA>DM_Z z%(uAds#2bL=@>uQ_)D&sGKVXx=Jp%W%>N-@5!X$+o5kZ+^B>FFsVExL zxt=`b8EVq6B1|mpPu1zqy&J@<}}P`G>h| z!bPX;9W$MZxlx|m_W-pgH>4ux9D9viPl(1m4mUX{6Xwzh)0tm+8AZVY5?&|Gu_GMs zs-r6zA!%YHz4(BM`?zC1nMlgdhjoWp#$7MIG|aeCAJ1)RVD8s%;Qm{`%B}NOFgjd< z)&p-CxMEDa@Ln^9A3v@#f}Wy`VZ)N|4?m_qkr z@zCUVSVPeaNJ$SSRRp+mWjXsB;{0&Sef*~8XG|ZxkSnX^aK+?VRF0mQQy2EMZ03an z-{*K&9hSDSE&tGR+38Tola&9lls@Zp(XhwrnTEQapp|0UgdkPp$KiT0zQ6uwtbOU{ ztemxkb$6}JL2pIKS4cz0ZbH67-t97Cxq|KyO@H?LG&3gU<2erRG}Upa`AF8emQso_ zp-IdrTTap>dIgj+?Cb71(m0Zi?~<-3=yNp^A~35eAGG2~OB27{{$fr~n`ehvQT0XU zSKP$d{ArBJt0Z9M=iHh%yaStF>r?7LV{<~zAwWV=*kVRiJ{^%Zp4+j3_E;q6?u?SW z3a+pE5}&^8e(sw4D3!%C&rwU2G9t%)7L8Bc_WHSFkWvb*VdudUDO z+Pm#vS>)MaEUo+ONE=z6gE9Qvb%~6q2Ia~Jm4q!mx}+4>#QFMf*YezsmxhpuJSPkn zP|6r-HX@IG>)MT7=NzDnTfg{%AfH)Lfj_U6n;yEGd!N1^$4w6GO-3;HoO1_pSueCoHD4_6k+^mKcBs!g5#}8HXnSPE5G|V*Iu%OD<;okLP-U-w(0Vs zw8fifjWuvMQqAyhROsFYqeR5@jNJG3!L~>Cf4!Q|tzXPTD>j{5fO-REL=X>3i)@z9 z83jPn+s5lB-eB`_)5|P1N@*-*0h%+l#PmD*s&C|&@`^@y*)u%&jino&2KdS!ujaq5 zeR*U8#nWdKxL&5YHnz5h$z=LMsT9f>g%N20c8E}IjMNz6HLW=M&E*?A0q*(Z)qFb* z&btcG@GzkJtwsS7q)uo^0FLWPi-^lb%_?hQ^4K%%L?uMzpfOTyglgB5ngflo zny3C@YvgPP;8bwVY&M@dP{{z#aYxlP>2rgYq`?^wq-?s7VLcdK7N@0>&54)+G? zQuAM=9NF1&$FM|%6qvCc!t@^ zM=!tP;tNBT2n~DdyBeOkW2?j83UEgiBDZJ#>0^&A_^X2A{{U!gmROb6b$kE-002ov JPDHLkV1j6B1l#}s diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/drawable/splash.xml b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/drawable/splash.xml deleted file mode 100644 index c1bd6fc..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/drawable/splash.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/values/apptheme.xml b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/values/apptheme.xml deleted file mode 100644 index 455b965..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/values/apptheme.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/values/libs.xml b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/values/libs.xml deleted file mode 100644 index 4d68673..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/res/values/libs.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - https://download.qt-project.org/ministro/android/qt5/qt-5.4 - - - - - - - - - - - - - - - - - - - - diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/src/ExampleActivity.java b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/src/ExampleActivity.java deleted file mode 100644 index ffa8952..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/src/ExampleActivity.java +++ /dev/null @@ -1,16 +0,0 @@ -package androidnative.example; - -import androidnative.AndroidNativeActivity; - -/** - * Created by benlau on 8/3/2017. - */ - -public class ExampleActivity extends AndroidNativeActivity { - public ExampleActivity() { - super(); - - QT_ANDROID_THEMES = new String[] {""}; - QT_ANDROID_DEFAULT_THEME = ""; - } -} diff --git a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/src/ExampleService.java b/source-android/androidnative.pri/examples/androidnativeexample/android-sources/src/ExampleService.java deleted file mode 100644 index 082ff10..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/android-sources/src/ExampleService.java +++ /dev/null @@ -1,96 +0,0 @@ -package androidnative.example; -import androidnative.SystemDispatcher; -import android.app.Notification; -import android.app.NotificationManager; -import android.util.Log; -import android.os.Handler; -import android.app.Activity; -import android.view.View; -import android.content.Context; -import java.util.Map; -import org.qtproject.qt5.android.QtNative; - -public class ExampleService { - - static { - - SystemDispatcher.addListener(new SystemDispatcher.Listener() { - - NotificationManager m_notificationManager; - Notification.Builder m_builder; - - private void notificationManagerNotify(Map data) { - - final Activity activity = QtNative.activity(); - final Map messageData = data; - - Runnable runnable = new Runnable () { - public void run() { - try { - String title = (String) messageData.get("title"); - - String message = (String) messageData.get("message"); - - if (m_notificationManager == null) { - m_notificationManager = (NotificationManager) activity.getSystemService(Context.NOTIFICATION_SERVICE); - m_builder = new Notification.Builder(activity); - - // Small Icon is a must to make notification works. - // And that is why you need to inherit QtActivity - m_builder.setSmallIcon(R.drawable.icon); - } - - m_builder.setContentTitle(title); - m_builder.setContentText(message); - m_notificationManager.notify(1, m_builder.build()); - - // Test function. Remove it later. - SystemDispatcher.dispatch("Notifier.notifyFinished"); - } catch (Exception e) { - Log.d("",e.getMessage()); - } - - }; - }; - activity.runOnUiThread(runnable); - } - - private void hapticFeedbackPerform(Map data) { - - final Activity activity = QtNative.activity(); - final Map messageData = data; - Runnable runnable = new Runnable () { - public void run() { - int feedbackConstant = (Integer) messageData.get("feedbackConstant"); - int flags = (Integer) messageData.get("flags"); - - Log.d("",String.format("hapticFeedbackPerform(%d,%d)",feedbackConstant,flags)); - - View rootView = activity.getWindow().getDecorView().getRootView(); - rootView.performHapticFeedback(feedbackConstant, flags); - - // Test function. Remove it later. - SystemDispatcher.dispatch("hapticFeedbackPerformFinished"); - }; - }; - activity.runOnUiThread(runnable); - } - - public void onDispatched(String name , Map data) { - - if (name.equals("Notifier.notify")) { - notificationManagerNotify(data); - return; - } else if (name.equals("hapticFeedbackPerform")) { - hapticFeedbackPerform(data); - return; - } - - return; - } - }); - - } - -} - diff --git a/source-android/androidnative.pri/examples/androidnativeexample/androidnativeexample.pro b/source-android/androidnative.pri/examples/androidnativeexample/androidnativeexample.pro deleted file mode 100644 index cec26e5..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/androidnativeexample.pro +++ /dev/null @@ -1,38 +0,0 @@ -TEMPLATE = app - -QT += qml quick - -SOURCES += main.cpp \ - debugwrapper.cpp - -RESOURCES += qml.qrc - -# Additional import path used to resolve QML modules in Qt Creator's code model -QML_IMPORT_PATH += ../.. - -android { - ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources -} - -# include(vendor/vendor.pri) -# Default rules for deployment. -include(deployment.pri) -include(../../androidnative.pri) -include(../../../../../../quickandroid/quickandroid.pri) - -DISTFILES += \ - android-sources/AndroidManifest.xml \ - android-sources/src/quickandroid/example/ExampleService.java \ - README.md \ - android-sources/gradle/wrapper/gradle-wrapper.jar \ - android-sources/gradlew \ - android-sources/res/values/libs.xml \ - android-sources/build.gradle \ - android-sources/gradle/wrapper/gradle-wrapper.properties \ - android-sources/gradlew.bat \ - android-sources/settings.gradle \ - android-sources/src/androidnative/example/ExampleService.java - -HEADERS += \ - ../../README.md \ - debugwrapper.h diff --git a/source-android/androidnative.pri/examples/androidnativeexample/androidnativeexample.pro.user b/source-android/androidnative.pri/examples/androidnativeexample/androidnativeexample.pro.user deleted file mode 100644 index 1693b53..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/androidnativeexample.pro.user +++ /dev/null @@ -1,392 +0,0 @@ - - - - - - EnvironmentId - {8825bc46-5cad-4a59-be78-bf9eeaa7217a} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - true - false - 0 - true - true - 0 - 8 - true - 1 - true - true - true - false - - - - ProjectExplorer.Project.PluginSettings - - - - ProjectExplorer.Project.Target.0 - - Android - Android - {8e3757e7-5698-4d0f-9f13-55359b1a832e} - 0 - 0 - 0 - - /home/pankraz/build/debug - - - true - qmake - - QtProjectManager.QMakeBuildStep - true - - false - false - false - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - - true - Anwendungsdaten kopieren - - Qt4ProjectManager.AndroidPackageInstallationStep - - - android-25 - - true - Android-APK erstellen - - QmakeProjectManager.AndroidBuildApkStep - 2 - true - false - - 4 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Bereinigen - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Debug - - Qt4ProjectManager.Qt4BuildConfiguration - 2 - true - - - /home/pankraz/ownCloud/clientsync/Friendiqa/v0.005/source-android/androidnative.pri/examples/build-androidnativeexample-Android-Release - - - true - qmake - - QtProjectManager.QMakeBuildStep - false - - false - false - false - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - - true - Anwendungsdaten kopieren - - Qt4ProjectManager.AndroidPackageInstallationStep - - - android-25 - - true - Android-APK erstellen - - QmakeProjectManager.AndroidBuildApkStep - 2 - true - false - - 4 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Bereinigen - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - true - - - /home/pankraz/ownCloud/clientsync/Friendiqa/v0.005/source-android/androidnative.pri/examples/build-androidnativeexample-Android-Profile - - - true - qmake - - QtProjectManager.QMakeBuildStep - true - - false - true - false - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - - true - Anwendungsdaten kopieren - - Qt4ProjectManager.AndroidPackageInstallationStep - - - android-25 - - true - Android-APK erstellen - - QmakeProjectManager.AndroidBuildApkStep - 2 - true - false - - 4 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Bereinigen - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Profile - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - true - - 3 - - - - true - Deployment auf Android-Gerät - - Qt4ProjectManager.AndroidDeployQtStep - false - - 1 - Deployment - - ProjectExplorer.BuildSteps.Deploy - - 1 - Deployment auf Android-Gerät - Deployment auf Android-Gerät - Qt4ProjectManager.AndroidDeployConfiguration2 - - 1 - - CB5A22HSB9 - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - - - - androidnativeexample - - Qt4ProjectManager.AndroidRunConfiguration:/home/pankraz/ownCloud/clientsync/Friendiqa/v0.005/source-android/androidnative.pri/examples/androidnativeexample/androidnativeexample.pro - androidnativeexample.pro - 3768 - false - true - false - false - true - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 18 - - - Version - 18 - - diff --git a/source-android/androidnative.pri/examples/androidnativeexample/debugwrapper.cpp b/source-android/androidnative.pri/examples/androidnativeexample/debugwrapper.cpp deleted file mode 100644 index 8aaf024..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/debugwrapper.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "debugwrapper.h" -#include "AndroidNative/debug.h" - -DebugWrapper::DebugWrapper(QObject *parent) : QObject(parent) -{ - -} - -long DebugWrapper::getNativeHeapSize() const -{ - return AndroidNative::Debug::getNativeHeapSize(); -} - -long DebugWrapper::getNativeHeapAllocatedSize() const -{ - return AndroidNative::Debug::getNativeHeapAllocatedSize(); -} diff --git a/source-android/androidnative.pri/examples/androidnativeexample/debugwrapper.h b/source-android/androidnative.pri/examples/androidnativeexample/debugwrapper.h deleted file mode 100644 index 80c3424..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/debugwrapper.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef DEBUGWRAPPER_H -#define DEBUGWRAPPER_H - -#include - -class DebugWrapper : public QObject -{ - Q_OBJECT -public: - explicit DebugWrapper(QObject *parent = 0); - -signals: - -public slots: - long getNativeHeapSize() const; - - long getNativeHeapAllocatedSize() const; -}; - -#endif // DEBUGWRAPPER_H diff --git a/source-android/androidnative.pri/examples/androidnativeexample/deployment.pri b/source-android/androidnative.pri/examples/androidnativeexample/deployment.pri deleted file mode 100644 index 5441b63..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/deployment.pri +++ /dev/null @@ -1,27 +0,0 @@ -android-no-sdk { - target.path = /data/user/qt - export(target.path) - INSTALLS += target -} else:android { - x86 { - target.path = /libs/x86 - } else: armeabi-v7a { - target.path = /libs/armeabi-v7a - } else { - target.path = /libs/armeabi - } - export(target.path) - INSTALLS += target -} else:unix { - isEmpty(target.path) { - qnx { - target.path = /tmp/$${TARGET}/bin - } else { - target.path = /opt/$${TARGET}/bin - } - export(target.path) - } - INSTALLS += target -} - -export(INSTALLS) diff --git a/source-android/androidnative.pri/examples/androidnativeexample/dialog/DialogDemo.qml b/source-android/androidnative.pri/examples/androidnativeexample/dialog/DialogDemo.qml deleted file mode 100644 index 8ee22be..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/dialog/DialogDemo.qml +++ /dev/null @@ -1,38 +0,0 @@ -import QtQuick 2.0 -import QuickAndroid 0.1 -import QuickAndroid.Styles 0.1 -import "../theme" - -Page { - actionBar: ActionBar { - id: actionBar - upEnabled: true - title: qsTr("Dialog Demo") - showTitle: true - - onActionButtonClicked: back(); - z: 10 - - } - - Button { - id: label - text : "Press to launch dialog" - anchors.centerIn: parent - onClicked: { - dialog.open(); - } - } - - Dialog { - id: dialog - anchors.centerIn: parent - title: "Dialog" - Text { - text: "Demo" - } - z: 20 - - acceptButtonText: "OK" - } -} diff --git a/source-android/androidnative.pri/examples/androidnativeexample/imagePicker/ImagePickerDemo.qml b/source-android/androidnative.pri/examples/androidnativeexample/imagePicker/ImagePickerDemo.qml deleted file mode 100644 index e38c7a3..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/imagePicker/ImagePickerDemo.qml +++ /dev/null @@ -1,77 +0,0 @@ -import QtQuick 2.0 -import QuickAndroid 0.1 -import AndroidNative 1.0 as AN -import "../theme" - -Page { - id: demo - actionBar: ActionBar { - title: "Image Picker Demo" - onActionButtonClicked: back(); - } - - AN.ImagePicker { - id: imagePicker; - multiple : true - } - - Rectangle { - anchors.fill: parent - color: Constants.black100 - - Image { - id: image - anchors.fill: parent - source: imagePicker.imageUrl - fillMode: Image.PreserveAspectFit - visible: imagePicker.imageUrls.length <= 1 - } - - Grid { - columns: 3 - spacing: 0 - visible: !image.visible - - Repeater { - model: imagePicker.imageUrls - delegate: Image { - width: demo.width / 3 - height: width / 4 * 3 - source: modelData - asynchronous: true - fillMode: Image.PreserveAspectCrop - } - } - } - - Column { - anchors.right: parent.right - anchors.rightMargin: 16 * A.dp - anchors.bottom: parent.bottom - anchors.bottomMargin: 32 * A.dp - - spacing: 16 * A.dp - - FloatingActionButton { - iconSource: A.drawable("ic_camera",Constants.black87); - size: Constants.small - backgroundColor: Constants.white100 - onClicked: { - imagePicker.takePhoto(); - } - } - - FloatingActionButton { - iconSource: A.drawable("ic_image",Constants.black87); - size: Constants.small - backgroundColor: Constants.white100 - onClicked: { - imagePicker.pickImage(); - } - } - - } - - } -} - diff --git a/source-android/androidnative.pri/examples/androidnativeexample/info/InfoDemo.qml b/source-android/androidnative.pri/examples/androidnativeexample/info/InfoDemo.qml deleted file mode 100644 index d86a319..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/info/InfoDemo.qml +++ /dev/null @@ -1,55 +0,0 @@ -import QtQuick 2.0 -import QuickAndroid 0.1 -import QuickAndroid.Styles 0.1 -import "../theme" - -Page { - id: page - actionBar: ActionBar { - id: actionBar - upEnabled: true - title: qsTr("Information") - showTitle: true - - onActionButtonClicked: back(); - z: 10 - } - - VisualItemModel { - id: itemModel - - ListItem { - title: "Environment.DIRECTORY_DCIM" - subtitle: Environment.DIRECTORY_DCIM - interactive: false - width: page.width - } - - ListItem { - title: "Debug.getNativeHeapSize" - subtitle: (Debug.getNativeHeapSize() / 1024 / 1024).toFixed(2) + "MB"; - interactive: false - width: page.width - } - - ListItem { - title: "Debug.getNativeHeapAllocatedSize" - subtitle: (Debug.getNativeHeapAllocatedSize() / 1024 / 1024).toFixed(2) + "MB"; - interactive: false - width: page.width - } - - ListItem { - title: "QThread.idealThreadCount" - subtitle: Misc.idealThreadCount; - interactive: false - width: page.width - } - } - - - ListView { - anchors.fill: parent - model: itemModel - } -} diff --git a/source-android/androidnative.pri/examples/androidnativeexample/main.cpp b/source-android/androidnative.pri/examples/androidnativeexample/main.cpp deleted file mode 100644 index 062572b..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/main.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include -#include -#include -#include -#include -//#include "qadrawableprovider.h" -#include "AndroidNative/systemdispatcher.h" -#include "AndroidNative/environment.h" -#include "AndroidNative/debug.h" -#include "AndroidNative/mediascannerconnection.h" -#include "debugwrapper.h" - -using namespace AndroidNative; - -#ifdef Q_OS_ANDROID -#include -#include - -JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) { - Q_UNUSED(vm); - qDebug("NativeInterface::JNI_OnLoad()"); - - // It must call this function within JNI_OnLoad to enable System Dispatcher - SystemDispatcher::registerNatives(); - return JNI_VERSION_1_6; -} -#endif - -int main(int argc, char *argv[]) -{ -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); -#endif - - QGuiApplication app(argc, argv); - app.setApplicationName("Android Native Example"); - app.setOrganizationDomain("com.github.benlau.androidnative"); - - QSettings settings; - - settings.setValue("firstTimeLoading", false); - settings.sync(); - - QVariantMap env; - env["DIRECTORY_DCIM"] = Environment::getExternalStoragePublicDirectory(Environment::DIRECTORY_DCIM); - - QVariantMap misc; - misc["idealThreadCount"] = QThread::idealThreadCount(); - - MediaScannerConnection::scanFile(""); - - SystemDispatcher::instance()->loadClass("androidnative.example.ExampleService"); - - QQmlApplicationEngine engine; - - /* QuickAndroid Initialization */ - engine.addImportPath("qrc:///"); // Add QuickAndroid into the import path - engine.rootContext()->setContextProperty("Environment", env); - engine.rootContext()->setContextProperty("Misc", misc); - engine.rootContext()->setContextProperty("Debug", new DebugWrapper(&engine)); - - /* End of QuickAndroid Initialization */ - - // Extra features: - //QADrawableProvider* provider = new QADrawableProvider(); - //provider->setBasePath("qrc://res"); - //engine.addImageProvider("drawable",provider); - engine.load(QUrl(QStringLiteral("qrc:///main.qml"))); - - return app.exec(); -} diff --git a/source-android/androidnative.pri/examples/androidnativeexample/main.qml b/source-android/androidnative.pri/examples/androidnativeexample/main.qml deleted file mode 100644 index 9a08956..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/main.qml +++ /dev/null @@ -1,76 +0,0 @@ -import QtQuick 2.2 -import QtQuick.Window 2.2 -import QuickAndroid 0.1 -import QuickAndroid.Styles 0.1 -import "./theme" - -Window { - id: window; - width: 480 - height: 640 - - color: "#FFFFFF" - - visible: false; - - /* Fast Splash Screen Setup Instruction - - 1. Create a custom theme (apptheme.qml) and set windowBackground to @drawable/splash.xml (Your splash screen drawable) - - 2. Within AndroidManifest.xml, set android.app.splash_screen_drawable to @drawable/splash.xml - - - - - - That will show a splash screen while Qt is loading. However, screen flicker will happen when your Window - item is shown. To prevent screen flicker completely, you could setup your main.qml accoroding to step 3. - - 3. In your main.qml (the one with Window component) - - 3.1. Set Window.color to a color which is similar to splash screen / Theme.windowBackground - - 3.2. Set visible of Window to false until your content is loaded. (Keep Android splash screen while loading) - - 3.3. Use an asynchronous Loader for your content. Set opacity to 0. - - 3.4. Once everything is ready, set Window.visible to true and perform a fade-in animation on Loader - - */ - - Loader { - id: loader - parent: null - width: window.width - height: window.height - asynchronous: true - opacity: 0 - focus: true; - - sourceComponent: PageStack { - id: stack - objectName: "PageStack"; - initialPage: Components { - - onPresented: { - window.visible = true; - A.setTimeout(function() { - loader.parent = window.contentItem; - loader.opacity = 1; - }, 34); - } - } - } - - Behavior on opacity { - NumberAnimation { - duration: 200 - easing.type: Easing.OutQuad; - } - } - } - - Component.onCompleted: { - ThemeManager.currentTheme = AppTheme - } -} diff --git a/source-android/androidnative.pri/examples/androidnativeexample/notification/NotificationDemo.qml b/source-android/androidnative.pri/examples/androidnativeexample/notification/NotificationDemo.qml deleted file mode 100644 index 174a5a0..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/notification/NotificationDemo.qml +++ /dev/null @@ -1,30 +0,0 @@ -import QtQuick 2.2 -import QtQuick.Window 2.1 -import QuickAndroid 0.1 -import QuickAndroid.Styles 0.1 -import AndroidNative 1.0 as AN -import "../theme" - -Page { - - actionBar: ActionBar { - id : actionBar - title: "Notification" - z: 10 - upEnabled: true - onActionButtonClicked: back(); - } - - Button { - id: label - text : "Press to send notification" - anchors.centerIn: parent - onClicked: { - AN.SystemDispatcher.dispatch("Notifier.notify",{ - title: "Quick Android Example", - message: "Hello!" - }); - } - } - -} diff --git a/source-android/androidnative.pri/examples/androidnativeexample/qml.qrc b/source-android/androidnative.pri/examples/androidnativeexample/qml.qrc deleted file mode 100644 index 225e836..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/qml.qrc +++ /dev/null @@ -1,31 +0,0 @@ - - - main.qml - res/drawable-hdpi/icon.png - Components.qml - res/drawable-xxhdpi/ic_menu.png - dialog/DialogDemo.qml - notification/NotificationDemo.qml - theme/AppTheme.qml - theme/qmldir - res/drawable-hdpi/ic_android_black_48dp.png - res/drawable-xxhdpi/ic_android_black_48dp.png - res/drawable-mdpi/ic_android_black_48dp.png - res/drawable-xhdpi/ic_android_black_48dp.png - res/drawable-xxxhdpi/ic_android_black_48dp.png - res/drawable-hdpi/ic_done_black_24dp.png - res/drawable-mdpi/ic_done_black_24dp.png - res/drawable-xhdpi/ic_done_black_24dp.png - res/drawable-xxhdpi/ic_done_black_24dp.png - res/drawable-xxxhdpi/ic_done_black_24dp.png - theme/ActionBarBackground.qml - res/drawable-xxhdpi/ic_keyboard_backspace.png - res/drawable-xxhdpi/ic_arrow_back.png - res/drawable-xxhdpi/ic_image.png - res/drawable-xxhdpi/ic_camera.png - imagePicker/ImagePickerDemo.qml - info/InfoDemo.qml - toast/ToastDemo.qml - statusbar/StatusBarDemo.qml - - diff --git a/source-android/androidnative.pri/examples/androidnativeexample/qpm.json b/source-android/androidnative.pri/examples/androidnativeexample/qpm.json deleted file mode 100644 index 9ff04fd..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/qpm.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "", - "description": "", - "dependencies": [ - "com.github.benlau.quickandroid@0.1.7" - ], - "license": "NONE", - "pri_filename": "", - "webpage": "" -} \ No newline at end of file diff --git a/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-hdpi/ic_android_black_48dp.png b/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-hdpi/ic_android_black_48dp.png deleted file mode 100644 index 6006b1207e3c1471237ada0e1b334b1e3b2bafee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 519 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXoKNzmJMD1F8*dI zU@ZM$bMDLs$+yA`S1!$~Thgu_9lki4^_QD#q@^y?D`1@n9+ zG`}xQ?vnY_C0%{uVEi9`mE#d*`u z;mu6jyPrTJCTo}X=1B_eWY^eb#NVZA2e)rds%jPHUByGA|k0wldT1B8K8g{O;SNCo5DGlpDEh5{}R!&SuQ zX|-?oV07r-F(+5sYxQj19uA4F0*7@nHs;@YsQf$gW>+px@zP|&GZEd1Z}?}-I>Y|V z=y1-BV5J$-bD3R}6Ta_|*W@zZWWK6sUb;=`BCRvpTf-#$b)_C_PW(7UG2P#7{m0nI aGWJPksgEnI&wc~Cfx*+&&t;ucLK6Uc3_uP5 diff --git a/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-hdpi/icon.png b/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-hdpi/icon.png deleted file mode 100644 index 156243d7b7199fecc70e9313537f5f39efb7261f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4627 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 JPDHLkV1j6B1l#}s diff --git a/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-mdpi/ic_android_black_48dp.png b/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-mdpi/ic_android_black_48dp.png deleted file mode 100644 index 41558f251fd6babe4e97b5c54ca1c26cb13508c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 343 zcmV-d0jU0oP)+BViG|2@UF_*Oo3z=fL znJX-A-*mIfd)=TixWP%EZ$g8qIK#zLQ~*+YuzSS81>44fnsdzL z1jFQ*DNKO^GoPlw2WEaufnPenF%vdajOhUoj3XTqCh_aY8xRh`CO)p+0qKZHp)VjE zDUbpwkOEx{RPkx$4G4!|93O|?fN%(Uj99Z`$dNlB9V$zcevX-I76$zlUJgXsE(KEH p9|Q8f$ejcIM#-H6^+s85&L4HEN0QEFeg^;m002ovPDHLkV1k-liMs#* diff --git a/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-mdpi/ic_done_black_24dp.png b/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-mdpi/ic_done_black_24dp.png deleted file mode 100644 index 5e5e7cf2b14732802095661e2de6a8c6eac3e8b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130 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 diff --git a/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_done_black_24dp.png b/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_done_black_24dp.png deleted file mode 100644 index c9c017410928bb4c9ee56d705130377537886c81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhawR(ZNOhEy=Vy}Xh4P=JVY;Pow> z)eh4Z*LH7YPT^1c;c>xMY3CR5UF8g~O~MqEfWRtq)wx@t#f5EcS$cj=DHe>A9+n8m zSQI=s(8$bw&b3_ExG+wt$|R_#_-}!m@==T1(=U4%_LXEm_Sb!xepO%dfZ-C;lZ8td zj!$Hgapx-N^Vofj<@f|98RxE|K99&g#i>rA^B#LHEf9Sw5tKPe>yY6RAwfaGi}hdF Y%FU*83Z;v716|GF>FVdQ&MBb@0A~SHegFUf diff --git a/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_image.png b/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_image.png deleted file mode 100644 index b32fafffd65497b53aba10fed5a238f557b03505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1056 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE(}8pX7+2iB`GtXjd9|mDV@SoVw{v~Hr2|FU&d+2ETA{FI^{$mA z!ZCdp=H`A@e{(7RLj7gmT>`s;4(9F-H)K(HoS^W+Xh(p6&X3m4;O8X^w=Fz2t9sJT zbf0_alF#Gb@8!3A-r5qQ1hfVU4D>!M5N=7dIC`eo#pLjr^)5>?_O8@PeAd??BYbgP zN6xXr8iNZpw;G=o?JOuNGCF@oo_*%?PGzM{c9xbqcWvAD&D;2(@!17MJ7X+tZU3G* z^FE`7e||^D%*tJtU+&SJ>h(2j_0(N{0vZ2a|NQyWM(}LJdpq|tbLP&iy~I-@CeZe9 zN=MCxdxd=R<0D0C{Gpkd4ZxW?=plgpE(U-dqBJb>LhXET?4<*bQ8wC`ULX}oUu3s$9`kJ*O!Jeb(Y1!_xN0SO? zb;L#Mub3TJ&mJSf)#@eU>bd#mo}_2%T}o2-uE=wXY>0`E*U!t%mA$`L!1dz74xLE- zHM0Z7J|w57FaP14@4c9KgG!011iBzw0 z+B$>Hr{C+nVRziHCbFf}-azm}gjeUH41M3rQ|*?&)=SpX`Q2E~_;-nj(jtq#>%TqR zzMq;Qwz}>?w8MSP){YhZDOWc4WNv)H9>=<4naD4HqpCGMnHyfP-($%L_FA8EC13LL zgWd8!gckT|x_qBBF&N0*EdN8mpukJ<*X$mVRG-%MbrZHWEL>Xx7@XWzY@X|Z^h z^Rla1OP2<%yqC8<-r%#e)cxv|cX}UxF57#A{d$C@(VOfwunfe&aNx%W>7Ily!cP=r Qu7X58UHx3vIVCg!0Og^^MgRZ+ diff --git a/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_keyboard_backspace.png b/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_keyboard_backspace.png deleted file mode 100644 index a49c20c1d59742c35ca6ef8c73680cbd18a87ab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q1xWh(YZ(KnOP(%{Ar*{oZ=c=RvLV^ec$G#;;%MIUHIhX&L=NjK6!{#YE87+ zJK1KdedUvh?sAyKbL~$jl>2Rt&$OwYyj=bKy(ceEDo=1f<9#dro@1awIPdhU@jfaO zU4%SK=COJ}7&Db8cqnzMO!8RtdW|25aU%br&|Ni;DU~X_{3mF9_V_YGA@JG67nY7n fl`zLKF#M}!$iLt>-Jr2Y1SII`>gTe~DWM4fKxSi3 diff --git a/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_menu.png b/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxhdpi/ic_menu.png deleted file mode 100644 index ab83be5891b038ab4b387fcf3700159e5646eb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^6F``e8A#skDEJMe*aCb)T!AzYEKT2e9!N2k1o;Is zI6S+N2IQ!Fx;TbZFeXb_C5ZGe{r>Oq;QR++CH|hKi&Kox9LzW+>1(+-L4<)pMeWv_ Tg1t}YgUs=C^>bP0l+XkK;QA$* diff --git a/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxxhdpi/ic_android_black_48dp.png b/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxxhdpi/ic_android_black_48dp.png deleted file mode 100644 index ded531fc556e77087c7a6d939e0550e6cfd32017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1295 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE1xWt5x}=AJf#sT~i(^Oy1z&`=+wJ|F)^L8#wG+#4e!XZ6_;?1p#V>${` z&OWv|ckcLEy=$KHQa}CKxBvdy1udWPhgp2UzuM~-)ozt4ikk$wWjz5hqf64vnOF?6JNI=mU!*i9pPNaU;|J!6b=aF3M7xAM#myT&KPx&mpLt*y)KdeB`tDUX? zik+`aVob2r58%4HbRtjmkDj1a2iTad`?dtF@nC1P_K{o~bHtCSw8ip?gZ&NP1}jZv z_pTdW3AZ{XIM*(n*|6rRa?u(lUY14k(oY z2Or+a%lIlf)5{ct**p057$v=H(5_fAannxbq_D@mmro=d|8R^sWrKBvlE0*+j#|5T z)r5oJ*vM-h^j}lh6 zp`2&->Vd0gLrwpJ*MaQMRT)3oHcea1r>DjAq?+X@e+;+6eP$K`2L?u(69>e%oBe-u zZ8gvpR~atZ{`-D<_jzxSE8g~7?FbiAxUZZsx9-EvYBg7o8_%)H+cYi$`rc7?d-J)! zPeKzxUYP61zI~yI!#?*5$KB8GZT|$4f4?L0#ufY%-hT|yoi*=&-?QHrO%AA@{k}7^L3!4D-TkxY?oaP#k~QZp z@aT;Du=eE7^fiG?rpuUr6AwJEm_6kc@BAOgL1qhgV3Wtvj3$|{I-5zF7Tn_N4~-FVdQ&MBb@0A~n0 ALI3~& diff --git a/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxxhdpi/ic_done_black_24dp.png b/source-android/androidnative.pri/examples/androidnativeexample/res/drawable-xxxhdpi/ic_done_black_24dp.png deleted file mode 100644 index 2f6d6386de9510fa6dd8c83cbb61a6f2e0fab9b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcg?s&R5hEy=VJ?|UH<|x2&QEUS@ zUqF*g%NA{xn*DVG1~S@B-uDxXPUtYNKXnEQ>b^wD=lt6oW;%QS1o1=daUAyI8~(&3 zd|u96v#;i-{{JTZcp&}h>FMeJ8GvN{`tw#N{;ZEGUD<;p)-Lh7=#>`kZ6pLOOe=>Nw L`njxgN@xNAv*3Ko diff --git a/source-android/androidnative.pri/examples/androidnativeexample/statusbar/StatusBarDemo.qml b/source-android/androidnative.pri/examples/androidnativeexample/statusbar/StatusBarDemo.qml deleted file mode 100644 index 0d82d01..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/statusbar/StatusBarDemo.qml +++ /dev/null @@ -1,47 +0,0 @@ -import QtQuick 2.2 -import QtQuick.Window 2.1 -import QtQuick.Controls 2.1 as QQC2 -import QuickAndroid 0.1 -import QuickAndroid.Styles 0.1 -import AndroidNative 1.0 as AN -import "../theme" - -Page { - - actionBar: ActionBar { - id : actionBar - title: "Status Bar" - z: 10 - upEnabled: true - onActionButtonClicked: back(); - } - - Column { - anchors.centerIn: parent - - QQC2.Switch { - text: "Translucent Status Bar" - checked: false - - onCheckedChanged: { - AN.SystemDispatcher.dispatch("androidnative.Util.setTranslucentStatusBar", {value: checked}); - } - } - - QQC2.Switch { - text: "Status Bar Visible" - checked: true - - onCheckedChanged: { - AN.SystemDispatcher.dispatch("androidnative.Util.setFullScreen", {value: checked}); - } - } - - } - - Component.onCompleted: { - AN.SystemDispatcher.loadClass("androidnative.Util"); - } - - -} diff --git a/source-android/androidnative.pri/examples/androidnativeexample/theme/ActionBarBackground.qml b/source-android/androidnative.pri/examples/androidnativeexample/theme/ActionBarBackground.qml deleted file mode 100644 index 1adb0f1..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/theme/ActionBarBackground.qml +++ /dev/null @@ -1,17 +0,0 @@ -import QtQuick 2.0 -import QuickAndroid 0.1 - -Item { - - MaterialShadow { - asynchronous: true - anchors.fill: parent - depth: 1 - } - - Rectangle { - color: "#cddc39" // Lime 500 - anchors.fill: parent - } -} - diff --git a/source-android/androidnative.pri/examples/androidnativeexample/theme/AppTheme.qml b/source-android/androidnative.pri/examples/androidnativeexample/theme/AppTheme.qml deleted file mode 100644 index 9ee92c2..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/theme/AppTheme.qml +++ /dev/null @@ -1,33 +0,0 @@ -import QtQuick 2.0 -import QuickAndroid 0.1 -import QuickAndroid.Styles 0.1 -pragma Singleton - -Theme { - mediumText.textSize: 18 * A.dp - smallText.textSize : 14 * A.dp - - colorPrimary: "#cddc39" // Lime 500 - textColorPrimary: Constants.black87 - windowBackground: "#eeeeee"; - - // The default icon of ActionBar is a "back" image - actionBar.iconSource: A.drawable("ic_arrow_back",Constants.black87) - - // Background with shadow - actionBar.background: ActionBarBackground { - } - - // actionBar.title.textSize is not allowed in QML. You should declare your own TextMaterial and assign directly. - // or modify text , smallText , mediumText and largetText - actionBar.title : customTextMaterial1; - actionBar.iconSourceSize: Qt.size(24 * A.dp , 24 * A.dp) - - // Custom Style object. - TextMaterial { - id : customTextMaterial1 - textSize: 18 * A.dp - textColor : Constants.black87 - } -} - diff --git a/source-android/androidnative.pri/examples/androidnativeexample/theme/qmldir b/source-android/androidnative.pri/examples/androidnativeexample/theme/qmldir deleted file mode 100644 index 5a1f2f4..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/theme/qmldir +++ /dev/null @@ -1,2 +0,0 @@ -module theme -singleton AppTheme 0.1 AppTheme.qml diff --git a/source-android/androidnative.pri/examples/androidnativeexample/toast/ToastDemo.qml b/source-android/androidnative.pri/examples/androidnativeexample/toast/ToastDemo.qml deleted file mode 100644 index f5e23bd..0000000 --- a/source-android/androidnative.pri/examples/androidnativeexample/toast/ToastDemo.qml +++ /dev/null @@ -1,33 +0,0 @@ -import QtQuick 2.2 -import QtQuick.Window 2.1 -import QuickAndroid 0.1 -import QuickAndroid.Styles 0.1 -import AndroidNative 1.0 as AN -import "../theme" - -Page { - - actionBar: ActionBar { - id : actionBar - title: "Toast" - z: 10 - upEnabled: true - onActionButtonClicked: back(); - } - - AN.Toast { - id: toast - text: "Toast" - longDuration: true - } - - Button { - id: label - text : "Press to show toast" - anchors.centerIn: parent - onClicked: { - toast.show(); - } - } - -} diff --git a/source-android/androidnative.pri/java/src/androidnative/AndroidNativeActivity.java b/source-android/androidnative.pri/java/src/androidnative/AndroidNativeActivity.java index ae44267..01833c2 100644 --- a/source-android/androidnative.pri/java/src/androidnative/AndroidNativeActivity.java +++ b/source-android/androidnative.pri/java/src/androidnative/AndroidNativeActivity.java @@ -10,6 +10,7 @@ import android.content.Context; import android.Manifest.permission; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; +import androidnative.AndroidNativeService; /** An alternative Activity class for Qt applicaiton. @@ -18,7 +19,8 @@ import androidx.core.content.ContextCompat; public class AndroidNativeActivity extends org.qtproject.qt5.android.bindings.QtActivity { public static final int MY_PERMISSIONS_REQUEST_READ_STORAGE = 0x245285a8; - + public static final int MY_PERMISSIONS_REQUEST_POST_NOTIFICATIONS = 0x245285a9; + private static final String TAG = "AndroidNativeActivity"; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { @@ -29,6 +31,11 @@ public class AndroidNativeActivity extends org.qtproject.qt5.android.bindings.Qt protected void onResume() { super.onResume(); + + + + AndroidNativeService fs = new AndroidNativeService(); + fs.startQtService(this); //if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) { // Permission is not granted @@ -75,19 +82,29 @@ public class AndroidNativeActivity extends org.qtproject.qt5.android.bindings.Qt @Override public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) { + Log.d(TAG,"onRequestPermissionsResult"); switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_STORAGE: { // If request is cancelled, the result arrays are empty. - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - Map message = new HashMap(); - message.put("multiple",false); - SystemDispatcher.dispatch("androidnative.ImagePicker.pickImage",message); - } else { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Map message = new HashMap(); + message.put("multiple",false); + SystemDispatcher.dispatch("androidnative.ImagePicker.pickImage",message); + } else { + } } + case MY_PERMISSIONS_REQUEST_POST_NOTIFICATIONS: { + // If request is cancelled, the result arrays are empty. + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Map message = new HashMap(); + message.put("multiple",false); + SystemDispatcher.dispatch("androidnative.Util.setPostNotification",message); + } else { + } + } return; } } -} diff --git a/source-android/androidnative.pri/java/src/androidnative/AndroidNativeService.java b/source-android/androidnative.pri/java/src/androidnative/AndroidNativeService.java index 55ef5db..eeca21e 100644 --- a/source-android/androidnative.pri/java/src/androidnative/AndroidNativeService.java +++ b/source-android/androidnative.pri/java/src/androidnative/AndroidNativeService.java @@ -20,14 +20,14 @@ public class AndroidNativeService extends QtService private static String TAG = "AndroidNative"; public void startQtService(Context ctx) { - //Log.d(TAG, "QtActivity active "+String.valueOf(QtNative.activity()!=null)); + Log.d(TAG, "QtActivity active "+String.valueOf(QtNative.activity()!=null)); if (QtNative.activity()==null){ - //Log.d(TAG,"Friendiqasync Stop existing QtService"); + Log.d(TAG,"Friendiqasync Stop existing QtService"); ctx.stopService(new Intent(ctx, AndroidNativeService.class)); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - //Log.d(TAG,"Friendiqasync startForegroundService"); + Log.d(TAG,"Friendiqasync startForegroundService"); ctx.startForegroundService(new Intent(ctx, AndroidNativeService.class)); } else { ctx.startService(new Intent(ctx, AndroidNativeService.class)); @@ -35,7 +35,7 @@ public class AndroidNativeService extends QtService } public static void stopQtService(Context ctx) { - //Log.d(TAG,"Friendiqasync QtServiceStop"); + Log.d(TAG,"Friendiqasync QtServiceStop"); ctx.stopService(new Intent(ctx, AndroidNativeService.class)); } @@ -44,11 +44,12 @@ public class AndroidNativeService extends QtService { Context context; context = this.getApplicationContext(); + Log.d(TAG,"Friendiqa onCreate"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Intent intent = new Intent(context,FriendiqaActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE); String CHANNEL_ID = "channel_02"; NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "Sync Channel", diff --git a/source-android/androidnative.pri/java/src/androidnative/Util.java b/source-android/androidnative.pri/java/src/androidnative/Util.java index 6ea90cf..3d77096 100644 --- a/source-android/androidnative.pri/java/src/androidnative/Util.java +++ b/source-android/androidnative.pri/java/src/androidnative/Util.java @@ -25,6 +25,11 @@ import android.content.Intent; import java.util.Map; import org.qtproject.friendiqa.R; +import android.content.pm.PackageManager; +import android.Manifest; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + public class Util { private static final String TAG = "androidnative.Util"; @@ -33,7 +38,8 @@ public class Util { public static final String SET_FULL_SCREEN = "androidnative.Util.setFullScreen"; public static final String SET_SCHEDULE = "androidnative.Util.setSchedule"; public static final String SET_NOTIFICATION = "androidnative.Util.setNotification"; - + public static final String SET_POST_NOTIFICATION = "androidnative.Util.setPostNotification"; + public static final int MY_PERMISSIONS_REQUEST_POST_NOTIFICATIONS = 0x245285a9; static { SystemDispatcher.addListener(new SystemDispatcher.Listener() { @@ -46,6 +52,8 @@ public class Util { setSchedule(message); } else if (type.equals(SET_NOTIFICATION)) { setNotification(message); + } else if (type.equals(SET_POST_NOTIFICATION)) { + setPostNotification(message); } } }); @@ -110,14 +118,14 @@ public class Util { } static void setNotification(Map message) { - //Log.d(TAG,"setNotification"); + Log.d(TAG,"setNotification"); Context context; //Context appcontext; context = QtNative.service().getApplicationContext(); //appcontext = QtNative.activity().getApplicationContext(); Intent intent = new Intent(context,FriendiqaActivity.class); //intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE); final String textTitle = (String) message.get("title"); final String textContent = (String) message.get("message"); @@ -171,14 +179,23 @@ public class Util { } else { context = QtNative.activity().getApplicationContext(); } + + + + //AndroidNativeService fs = new AndroidNativeService(); + //fs.startQtService(context); + + if (value==0){ JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.cancelAll(); - //Log.d(TAG,"Friendiqasync deleting Androidnative jobscheduler"); + Log.d(TAG,"Friendiqasync deleting Androidnative jobscheduler"); } else { - //Log.d(TAG,"Friendiqasync schedule Androidnative jobscheduler"); + Log.d(TAG,"Friendiqasync schedule Androidnative jobscheduler"); ComponentName component = new ComponentName(context, FriendiqaService.class); JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + + //Log.d(TAG,"Jobinfolist size " + String.valueOf(jobScheduler.getAllPendingJobs().size())); if (jobScheduler.getAllPendingJobs().size()==0){ JobInfo.Builder builder = new JobInfo.Builder(2, component) @@ -186,7 +203,7 @@ public class Util { .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setPersisted(true) .setPrefetch(true); - //Log.d(TAG,"Friendiqa schedule Androidnative sync schedule"+ (value * ONE_MIN)); + Log.d(TAG,"1 Friendiqa schedule Androidnative sync schedule"+ (value * ONE_MIN)); jobScheduler.schedule(builder.build()); } else { for ( JobInfo jobInfo : jobScheduler.getAllPendingJobs() ) { @@ -197,23 +214,42 @@ public class Util { .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setPersisted(true) .setPrefetch(true); - //Log.d(TAG,"Friendiqa schedule Androidnative sync schedule"+ (value * ONE_MIN)); + Log.d(TAG,"2 Friendiqa schedule Androidnative sync schedule"+ (value * ONE_MIN)); jobScheduler.schedule(builder.build()); } } } //Log.d(TAG,"Active service " + String.valueOf(QtNative.service()!=null)); - if (QtNative.service() != null){ - //Log.d(TAG,"Schedule Stopping Friendiqa Androidnative service"); - ComponentName componentStopper = new ComponentName(context, FriendiqaStopService.class); - JobInfo.Builder stopbuilder = new JobInfo.Builder(1, componentStopper) - .setMinimumLatency(50) - .setOverrideDeadline(100); + //if (QtNative.service() != null){ + // Log.d(TAG,"Schedule Stopping Friendiqa Androidnative service"); + // ComponentName componentStopper = new ComponentName(context, FriendiqaStopService.class); + // JobInfo.Builder stopbuilder = new JobInfo.Builder(1, componentStopper) + // .setMinimumLatency(50) + // .setOverrideDeadline(100); - JobScheduler jobStopScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); - jobStopScheduler.schedule(stopbuilder.build()); - } + // JobScheduler jobStopScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + // jobStopScheduler.schedule(stopbuilder.build()); + //} } + NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); + notificationManager.cancelAll(); //context.stopService(new Intent(context, AndroidNativeService.class)); } + + static void setPostNotification(Map message) { + Log.d(TAG,"setPostNotification"); + Context context; + if (QtNative.activity() == null){ + context = QtNative.service().getApplicationContext(); + } else { + context = QtNative.activity().getApplicationContext(); + } + Activity activity = org.qtproject.qt5.android.QtNative.activity(); + Log.d(TAG,String.valueOf(ContextCompat.checkSelfPermission(context,Manifest.permission.POST_NOTIFICATIONS))); + if (ContextCompat.checkSelfPermission(context,Manifest.permission.POST_NOTIFICATIONS)!= PackageManager.PERMISSION_GRANTED) { + // Permission is not granted + Log.d(TAG,String.valueOf(PackageManager.PERMISSION_GRANTED)); + ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.POST_NOTIFICATIONS},MY_PERMISSIONS_REQUEST_POST_NOTIFICATIONS); + } + } } diff --git a/source-android/common/oauth.cpp b/source-android/common/oauth.cpp index 52faaff..7e5af5f 120000 --- a/source-android/common/oauth.cpp +++ b/source-android/common/oauth.cpp @@ -1 +1 @@ -/home/pankraz/ownCloud/clientsync/Friendiqa/v0.6/source-linux/common/oauth.cpp \ No newline at end of file +../../source-linux/common/oauth.cpp \ No newline at end of file diff --git a/source-android/common/oauth.h b/source-android/common/oauth.h index 5c2bab8..607b211 120000 --- a/source-android/common/oauth.h +++ b/source-android/common/oauth.h @@ -1 +1 @@ -/home/pankraz/ownCloud/clientsync/Friendiqa/v0.6/source-linux/common/oauth.h \ No newline at end of file +../../source-linux/common/oauth.h \ No newline at end of file diff --git a/source-linux/CMakeLists.txt b/source-linux/CMakeLists.txt index 6477d1b..6a79957 100644 --- a/source-linux/CMakeLists.txt +++ b/source-linux/CMakeLists.txt @@ -1,8 +1,8 @@ -cmake_minimum_required(VERSION 3.1.0) +cmake_minimum_required(VERSION 3.16.0) project(friendiqa VERSION 0.6 LANGUAGES CXX) -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) @@ -13,35 +13,38 @@ if(CMAKE_VERSION VERSION_LESS "3.7.0") set(CMAKE_INCLUDE_CURRENT_DIR ON) endif() -find_package(Qt5 COMPONENTS Widgets Quick Sql DBus NetworkAuth REQUIRED) +find_package(Qt6 REQUIRED COMPONENTS Core Widgets Quick QuickControls2 Sql DBus NetworkAuth REQUIRED) + +qt_standard_project_setup() set(MOC_SOURCES common/uploadableimage.h common/xhr.h common/filesystem.h - common/remoteauthasyncimageprovider.h common/updatenews.h common/alarm.h - common/oauth.h) + common/oauth.h + common/documenthandler.h) set(SOURCES common/friendiqa.cpp common/uploadableimage.cpp common/xhr.cpp common/filesystem.cpp - common/remoteauthasyncimageprovider.cpp common/updatenews.cpp common/alarmlinux.cpp - common/oauth.cpp) + common/oauth.cpp + common/documenthandler.cpp) include_directories(common) -add_executable(friendiqa ${SOURCES} ${MOC_SOURCES} application.qrc) +qt_add_executable(friendiqa ${SOURCES} ${MOC_SOURCES} application.qrc) -target_link_libraries(friendiqa Qt::Core) -target_link_libraries(friendiqa Qt::Widgets) -target_link_libraries(friendiqa Qt::Quick) -target_link_libraries(friendiqa Qt::Sql) -target_link_libraries(friendiqa Qt::DBus) -target_link_libraries(friendiqa Qt::NetworkAuth) +target_link_libraries(friendiqa PRIVATE Qt6::Core) +target_link_libraries(friendiqa PRIVATE Qt6::Widgets) +target_link_libraries(friendiqa PRIVATE Qt6::Quick) +target_link_libraries(friendiqa PRIVATE Qt6::QuickControls2) +target_link_libraries(friendiqa PRIVATE Qt6::Sql) +target_link_libraries(friendiqa PRIVATE Qt6::DBus) +target_link_libraries(friendiqa PRIVATE Qt6::NetworkAuth) install(TARGETS friendiqa DESTINATION ${CMAKE_INSTALL_BINDIR}) install(FILES images/de.manic.Friendiqa.desktop DESTINATION share/applications) diff --git a/source-linux/common/alarmandroid.cpp b/source-linux/common/alarmandroid.cpp index 1bbc515..0c7c36d 100644 --- a/source-linux/common/alarmandroid.cpp +++ b/source-linux/common/alarmandroid.cpp @@ -47,6 +47,7 @@ void ALARM::setAlarm(int interval) QVariantMap message; message["value"] = interval; AndroidNative::SystemDispatcher::instance()->loadClass("androidnative.Util"); + AndroidNative::SystemDispatcher::instance()->dispatch("androidnative.Util.setPostNotification", message); AndroidNative::SystemDispatcher::instance()->dispatch("androidnative.Util.setSchedule", message); AndroidNative::SystemDispatcher::instance()->dispatch("androidnative.Util.stopService", message); } diff --git a/source-linux/common/documenthandler.cpp b/source-linux/common/documenthandler.cpp new file mode 100644 index 0000000..f2e8163 --- /dev/null +++ b/source-linux/common/documenthandler.cpp @@ -0,0 +1,262 @@ +// This file is part of Friendiqa +// https://github.com/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + +#include +#include +#include +#include +#include +#include +#include +#include "documenthandler.h" + +DocumentHandler::DocumentHandler(QObject *parent) + : QObject(parent) + , m_document(nullptr) + , m_cursorPosition(-1) + , m_selectionStart(0) + , m_selectionEnd(0) +{ +} + +QQuickTextDocument *DocumentHandler::document() const +{ + return m_document; +} + +void DocumentHandler::setDocument(QQuickTextDocument *document) +{ + if (document == m_document) + return; + + if (m_document) + disconnect(m_document->textDocument(), &QTextDocument::modificationChanged, this, &DocumentHandler::modifiedChanged); + m_document = document; + if (m_document) + connect(m_document->textDocument(), &QTextDocument::modificationChanged, this, &DocumentHandler::modifiedChanged); + emit documentChanged(); +} + +int DocumentHandler::cursorPosition() const +{ + return m_cursorPosition; +} + +void DocumentHandler::setCursorPosition(int position) +{ + if (position == m_cursorPosition) + return; + + m_cursorPosition = position; + emit cursorPositionChanged(); +} + +int DocumentHandler::selectionStart() const +{ + return m_selectionStart; +} + +void DocumentHandler::setSelectionStart(int position) +{ + if (position == m_selectionStart) + return; + + m_selectionStart = position; + emit selectionStartChanged(); +} + +int DocumentHandler::selectionEnd() const +{ + return m_selectionEnd; +} + +void DocumentHandler::setSelectionEnd(int position) +{ + if (position == m_selectionEnd) + return; + + m_selectionEnd = position; + emit selectionEndChanged(); +} + +QTextCursor DocumentHandler::textCursor() const +{ + QTextDocument *doc = textDocument(); + if (!doc) + return QTextCursor(); + QTextCursor cursor = QTextCursor(doc); + if (m_selectionStart != m_selectionEnd) { + cursor.setPosition(m_selectionStart); + cursor.setPosition(m_selectionEnd, QTextCursor::KeepAnchor); + } else { + cursor.setPosition(m_cursorPosition); + } + return cursor; +} + +QTextDocument *DocumentHandler::textDocument() const +{ + if (!m_document) + return nullptr; + + return m_document->textDocument(); +} + +void DocumentHandler::mergeFormatOnWordOrSelection(const QTextCharFormat &format) +{ + QTextCursor cursor = textCursor(); + if (!cursor.hasSelection()) + cursor.select(QTextCursor::WordUnderCursor); + cursor.mergeCharFormat(format); +} + +bool DocumentHandler::modified() const +{ + return m_document && m_document->textDocument()->isModified(); +} + +void DocumentHandler::setModified(bool m) +{ + if (m_document) + m_document->textDocument()->setModified(m); +} + +QFont DocumentHandler::font() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return m_document->textDocument()->defaultFont(); + QTextCharFormat format = cursor.charFormat(); + return format.font(); +} + +void DocumentHandler::setFont(const QFont & font){ + + QTextCursor cursor = textCursor(); + if (!cursor.isNull() && cursor.charFormat().font() == font) + return; + + QTextCharFormat format; + format.setFont(font); + mergeFormatOnWordOrSelection(format); + + emit fontChanged(); +} + +bool DocumentHandler::bold() const +{ + const QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return m_document->textDocument()->defaultFont().bold(); + return cursor.charFormat().font().bold(); +} + +void DocumentHandler::setBold(bool bold) +{ + const QTextCursor cursor = textCursor(); + if (!cursor.isNull() && cursor.charFormat().font().bold() == bold) + return; + + QFont font = cursor.charFormat().font(); + font.setBold(bold); + QTextCharFormat format; + format.setFont(font); + mergeFormatOnWordOrSelection(format); + + emit boldChanged(); +} + +bool DocumentHandler::italic() const +{ + const QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return m_document->textDocument()->defaultFont().italic(); + return cursor.charFormat().font().italic(); +} + +void DocumentHandler::setItalic(bool italic) +{ + const QTextCursor cursor = textCursor(); + if (!cursor.isNull() && cursor.charFormat().font().italic() == italic) + return; + + QFont font = cursor.charFormat().font(); + font.setItalic(italic); + QTextCharFormat format; + format.setFont(font); + mergeFormatOnWordOrSelection(format); + + emit italicChanged(); +} + +bool DocumentHandler::liststyle() const +{ + const QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return false; + return bool(cursor.currentList()); +} + +void DocumentHandler::setListstyle(bool liststyle) +{ + QTextCursor cursor = textCursor(); + if (!cursor.isNull() && !liststyle){ + cursor.currentList()->remove(cursor.block()); + emit liststyleChanged(); + }else{ + cursor.createList(QTextListFormat::ListDisc); + emit liststyleChanged(); + } +} + +bool DocumentHandler::codeblock() const +{ + const QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return false; + qDebug()<< QTextDocumentFragment(cursor).toPlainText(); + return bool(QTextDocumentFragment(cursor).toMarkdown().contains("```")); +} + +void DocumentHandler::setCodeblock(bool codeblock) +{ + QTextCursor cursor = textCursor(); + if (!cursor.isNull() && !codeblock){ + qDebug()<< "!codeblock ```\n" + QTextDocumentFragment(cursor).toMarkdown() + "\n```"; + cursor.insertMarkdown("```\n" + QTextDocumentFragment(cursor).toMarkdown() + "\n```"); + emit codeblockChanged(); + } + else{ + qDebug()<< "```\n" + QTextDocumentFragment(cursor).toMarkdown() + "\n```"; + cursor.insertMarkdown(QTextDocumentFragment(cursor).toMarkdown().remove("```")); + emit codeblockChanged(); + } +} diff --git a/source-linux/common/documenthandler.h b/source-linux/common/documenthandler.h new file mode 100644 index 0000000..d74c6b9 --- /dev/null +++ b/source-linux/common/documenthandler.h @@ -0,0 +1,114 @@ +// This file is part of Friendiqa +// https://github.com/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + +#ifndef DOCUMENTHANDLER_H +#define DOCUMENTHANDLER_H + +//#include +#include +#include +#include +#include +//QT_BEGIN_NAMESPACE +//class QTextDocument; +//class QQuickTextDocument; +//QT_END_NAMESPACE + +class DocumentHandler : public QObject{ + Q_OBJECT + Q_PROPERTY(QQuickTextDocument *document READ document WRITE setDocument NOTIFY documentChanged) + Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition NOTIFY cursorPositionChanged) + Q_PROPERTY(int selectionStart READ selectionStart WRITE setSelectionStart NOTIFY selectionStartChanged) + Q_PROPERTY(int selectionEnd READ selectionEnd WRITE setSelectionEnd NOTIFY selectionEndChanged) + Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged) + Q_PROPERTY(bool bold READ bold WRITE setBold NOTIFY boldChanged) + Q_PROPERTY(bool italic READ italic WRITE setItalic NOTIFY italicChanged) + Q_PROPERTY(bool liststyle READ liststyle WRITE setListstyle NOTIFY liststyleChanged) + Q_PROPERTY(bool codeblock READ codeblock WRITE setCodeblock NOTIFY codeblockChanged) + Q_PROPERTY(bool modified READ modified WRITE setModified NOTIFY modifiedChanged) + +public: + explicit DocumentHandler(QObject *parent = nullptr); + + QQuickTextDocument *document() const; + void setDocument(QQuickTextDocument *document); + + int cursorPosition() const; + void setCursorPosition(int position); + + int selectionStart() const; + void setSelectionStart(int position); + + int selectionEnd() const; + void setSelectionEnd(int position); + + QFont font() const; + void setFont(const QFont & font); + + bool bold() const; + void setBold(bool bold); + + bool italic() const; + void setItalic(bool italic); + + bool liststyle() const; + void setListstyle(bool liststyle); + + bool modified() const; + void setModified(bool m); + + bool codeblock() const; + void setCodeblock(bool codeblock); + +signals: + void documentChanged(); + void cursorPositionChanged(); + void selectionStartChanged(); + void selectionEndChanged(); + void fontChanged(); + void boldChanged(); + void italicChanged(); + void liststyleChanged(); + void codeblockChanged(); + void error(const QString &message); + void modifiedChanged(); + +private: + QTextCursor textCursor() const; + QTextDocument *textDocument() const; + void mergeFormatOnWordOrSelection(const QTextCharFormat &format); + QQuickTextDocument *m_document; + int m_cursorPosition; + int m_selectionStart; + int m_selectionEnd; +}; + +#endif // DOCUMENTHANDLER_H diff --git a/source-linux/common/filesystem.cpp b/source-linux/common/filesystem.cpp index 560dc72..2ce9919 100644 --- a/source-linux/common/filesystem.cpp +++ b/source-linux/common/filesystem.cpp @@ -177,7 +177,13 @@ void FILESYSTEM::setAutostart(bool autostart) { QString FILESYSTEM::osType() const { - return QSysInfo::productType(); + QString m_osType; + if(QSysInfo::productType()==QString("android")){ + m_osType="Android"; + }else{ + m_osType="Linux"; + } + return m_osType; } QString FILESYSTEM::hostname() const diff --git a/source-linux/common/friendiqa.cpp b/source-linux/common/friendiqa.cpp index 0fb235e..465aae3 100644 --- a/source-linux/common/friendiqa.cpp +++ b/source-linux/common/friendiqa.cpp @@ -31,6 +31,7 @@ #include #include +#include //#include //#include //#include @@ -38,9 +39,10 @@ #include "xhr.h" #include "updatenews.h" #include "filesystem.h" -#include "remoteauthasyncimageprovider.h" +//#include "remoteauthasyncimageprovider.h" #include "alarm.h" #include "oauth.h" +#include "documenthandler.h" //#include "AndroidNative/systemdispatcher.h" //#include "AndroidNative/environment.h" //#include "AndroidNative/debug.h" @@ -48,6 +50,7 @@ //#include #include #include +#include // Declare a user-defined data type to work with an icon in QML Q_DECLARE_METATYPE(QSystemTrayIcon::ActivationReason) @@ -59,11 +62,11 @@ Q_DECLARE_METATYPE(QSystemTrayIcon::ActivationReason) #include JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) { Q_UNUSED(vm); - qDebug("NativeInterface::JNI_OnLoad()"); // It must call this function within JNI_OnLoad to enable System Dispatcher + qDebug("NativeInterface::JNI_OnLoad()"); // It must call this function within JNI_OnLoad to enable System Dispatcher - AndroidNative::SystemDispatcher::registerNatives(); - return JNI_VERSION_1_6; - } + AndroidNative::SystemDispatcher::registerNatives(); + return JNI_VERSION_1_6; +} #endif @@ -83,45 +86,47 @@ int main(int argc, char *argv[]) { //return app.exec(); } else{ - //QtWebEngine::initialize(); - QApplication app(argc, argv); - QQmlApplicationEngine view; - //QQuickView view; - //view.setResizeMode(QQuickView::SizeRootObjectToView); - app.setWindowIcon(QIcon(":/images/Friendiqa.ico")); - QTranslator qtTranslator; - qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations"); - app.installTranslator(&qtTranslator); - RemoteAuthAsyncImageProvider *imageProvider = new RemoteAuthAsyncImageProvider; - view.addImageProvider("remoteauthimage",imageProvider); - view.rootContext()->setContextProperty("remoteauth", imageProvider); - XHR* xhr = XHR::instance(); - view.rootContext()->setContextProperty("xhr", xhr); - FILESYSTEM* filesystem = FILESYSTEM::instance(); - if (qstrcmp(argv[1],"-background")==0){ - filesystem->setVisibility(false); - } else{filesystem->setVisibility(true);} + //QtWebEngine::initialize(); + QGuiApplication::setApplicationName("Friendiqa"); + QGuiApplication::setOrganizationName("Friendiqa"); + QApplication app(argc, argv); + QQmlApplicationEngine view; + //view.setResizeMode(QQuickView::SizeRootObjectToView); + app.setWindowIcon(QIcon(":/images/Friendiqa.ico")); + QTranslator qtTranslator; + qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations"); + app.installTranslator(&qtTranslator); + // RemoteAuthAsyncImageProvider *imageProvider = new RemoteAuthAsyncImageProvider; + // view.addImageProvider("remoteauthimage",imageProvider); + // view.rootContext()->setContextProperty("remoteauth", imageProvider); + XHR* xhr = XHR::instance(); + view.rootContext()->setContextProperty("xhr", xhr); + FILESYSTEM* filesystem = FILESYSTEM::instance(); + if (qstrcmp(argv[1],"-background")==0){ + filesystem->setVisibility(false); + } else{filesystem->setVisibility(true);} - view.rootContext()->setContextProperty("filesystem", filesystem); - ALARM* alarm = ALARM::instance(); - view.rootContext()->setContextProperty("alarm", alarm); - UPDATENEWS* updatenews = UPDATENEWS::instance(); - view.rootContext()->setContextProperty("updatenews", updatenews); + view.rootContext()->setContextProperty("filesystem", filesystem); + ALARM* alarm = ALARM::instance(); + view.rootContext()->setContextProperty("alarm", alarm); + UPDATENEWS* updatenews = UPDATENEWS::instance(); + view.rootContext()->setContextProperty("updatenews", updatenews); + updatenews->setDatabase(); + OAuthWrapper* oauth2 = OAuthWrapper::instance(); + view.rootContext()->setContextProperty("oauth2", oauth2); + qmlRegisterType("io.qt.examples.texteditor", 1, 0, "DocumentHandler"); + qmlRegisterType("QSystemTrayIcon", 1, 0, "QSystemTrayIcon"); + qRegisterMetaType("ActivationReason"); + view.rootContext()->setContextProperty("iconTrayBlack", QIcon(QPixmap(":/images/friendica-tray-black.svg"))); + view.rootContext()->setContextProperty("iconTrayWhite", QIcon(QPixmap(":/images/friendica-tray-white.svg"))); - OAuthWrapper* oauth2 = OAuthWrapper::instance(); - view.rootContext()->setContextProperty("oauth2", oauth2); - - qmlRegisterType("QSystemTrayIcon", 1, 0, "QSystemTrayIcon"); - qRegisterMetaType("ActivationReason"); - view.rootContext()->setContextProperty("iconTray", QIcon(":/images/Friendica_monochrome.png")); - view.rootContext()->setContextProperty("iconTrayAvailable", QSystemTrayIcon::isSystemTrayAvailable()); - - view.load(QUrl("qrc:/qml/friendiqa.qml")); - //view.show(); - - view.connect(view.rootContext()->engine(), SIGNAL(quit()), &app, SLOT(quit())); - return app.exec(); + view.rootContext()->setContextProperty("iconTrayAvailable", QSystemTrayIcon::isSystemTrayAvailable()); + if(updatenews->getStyle() != 0){ + QQuickStyle::setStyle("Material"); + } + view.load(QUrl("qrc:/qml/friendiqa.qml")); + view.connect(view.rootContext()->engine(), SIGNAL(quit()), &app, SLOT(quit())); + return app.exec(); } } - diff --git a/source-linux/common/updatenews.cpp b/source-linux/common/updatenews.cpp index 454320e..8dae238 100644 --- a/source-linux/common/updatenews.cpp +++ b/source-linux/common/updatenews.cpp @@ -89,6 +89,17 @@ void UPDATENEWS::setDatabase() } } +int UPDATENEWS::getStyle() +{ + QSqlQuery syncquery("SELECT * FROM globaloptions",m_db); + while (syncquery.next()){ + if (syncquery.value(0).toString()=="view_darkmode"){ + return syncquery.value(1).toInt(); + } + } + return 0; +} + QJsonArray UPDATENEWS::getAccounts(QString filtername, QString filtervalue){ QString filterstring=""; diff --git a/source-linux/common/updatenews.h b/source-linux/common/updatenews.h index 9f857d7..d046aa1 100644 --- a/source-linux/common/updatenews.h +++ b/source-linux/common/updatenews.h @@ -57,6 +57,7 @@ signals: public slots: void setSyncAll(bool syncAll); void setDatabase(); + int getStyle(); void login(); void timeline(); void replies(); diff --git a/source-linux/common/xhr.cpp b/source-linux/common/xhr.cpp index ace30a0..adaba69 100644 --- a/source-linux/common/xhr.cpp +++ b/source-linux/common/xhr.cpp @@ -227,7 +227,7 @@ void XHR::download() //connect(reply,SIGNAL(downloadProgress(qint64,qint64)), this,SLOT(updateDownloadProgress(qint64,qint64))); connect(reply, &QNetworkReply::finished,this, &XHR::onRequestFinished); connect(reply, &QNetworkReply::sslErrors, this, &XHR::onSSLError); - connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError))); + connect(reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError))); } void XHR::get() @@ -254,7 +254,7 @@ void XHR::get() reply = manager.get(request); connect(reply, &QNetworkReply::finished, this, &XHR::onReplySuccess); //connect(reply,SIGNAL(downloadProgress(qint64,qint64)), this,SLOT(updateDownloadProgress(qint64,qint64))); - connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError))); + connect(reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError))); connect(reply, &QNetworkReply::readyRead, this, &XHR::onReadyRead); connect(reply, &QNetworkReply::sslErrors, this, &XHR::onSSLError); } @@ -312,7 +312,7 @@ void XHR::post() reply = manager.post(request, multiPart); qDebug() << "\t request sent"; connect(reply, &QNetworkReply::finished, this, &XHR::onReplySuccess); - connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError))); + connect(reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError))); connect(reply, &QNetworkReply::readyRead, this, &XHR::onReadyRead); connect(reply, &QNetworkReply::sslErrors, this, &XHR::onSSLError); } diff --git a/source-linux/images/friendica-tray-black.svg b/source-linux/images/friendica-tray-black.svg new file mode 100644 index 0000000..b9b9428 --- /dev/null +++ b/source-linux/images/friendica-tray-black.svg @@ -0,0 +1,707 @@ + + + + + + Friendiqa/friendica-tray-black.svg an master - Friendiqa - Friendica + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + + + + + + +
    +
    + +
    +
    +
    +
    + + +
    + + + + + +
    + + + MorsMortium +
    /
    + Friendiqa + + + +
    + + + + + + +
    +
    + +
    geforkt von lubuwest/Friendiqa
    + +
    + +
    + +
    + +
    + + + 1 + +
    +
    + +
    + +
    + + + 0 + +
    +
    + + +
    + + Fork + + + + 0 + +
    + +
    + +
    +
    + +
    + + + +
    +
    +
    + +
    + + + + + + + +
    + Du kannst nicht mehr als 25 Themen auswählen + Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein. +
    + + + +
    +
    + + + + +
    + +
    + + + + + + + + + Friendiqa/source-linux/images/friendica-tray-black.svg + +
    +
    + + + +
    +
    + +
    +

    +
    + +
    + + +
    + 42 Zeilen +
    + + +
    + 1.7 KiB +
    + + + +
    + XML +
    + +
    + + +
    +
    + +
    + + +
    + + +
    + Originalformat + + Permalink + + + Blame + + Verlauf + +
    + + + + + + + + + + + +
    +

    +
    + + + + + + +
    + +
    + + + +
    + +
    +
    +
    + + +
    +
    + + + + +
    + + + + + + + + + + + + + diff --git a/source-linux/images/friendica-tray-white.svg b/source-linux/images/friendica-tray-white.svg new file mode 100644 index 0000000..2abd781 --- /dev/null +++ b/source-linux/images/friendica-tray-white.svg @@ -0,0 +1,707 @@ + + + + + + Friendiqa/friendica-tray-white.svg an master - Friendiqa - Friendica + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    + +
    +
    +
    +
    + + +
    + + + + + +
    + + + MorsMortium +
    /
    + Friendiqa + + + +
    + + + + + + +
    +
    + +
    geforkt von lubuwest/Friendiqa
    + +
    + +
    + +
    + +
    + + + 1 + +
    +
    + +
    + +
    + + + 0 + +
    +
    + + +
    + + Fork + + + + 0 + +
    + +
    + +
    +
    + +
    + + + +
    +
    +
    + +
    + + + + + + + +
    + Du kannst nicht mehr als 25 Themen auswählen + Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein. +
    + + + +
    +
    + + + + +
    + +
    + + + + + + + + + Friendiqa/source-linux/images/friendica-tray-white.svg + +
    +
    + + + +
    +
    + +
    +

    +
    + +
    + + +
    + 42 Zeilen +
    + + +
    + 1.7 KiB +
    + + + +
    + XML +
    + +
    + + +
    +
    + +
    + + +
    + + +
    + Originalformat + + Permalink + + + Blame + + Verlauf + +
    + + + + + + + + + + + +
    +

    +
    + + + + + + +
    + +
    + + + +
    + +
    +
    +
    + + +
    +
    + + + + +
    + + + + + + + + + + + + + diff --git a/source-linux/js/helper.js b/source-linux/js/helper.js index ff662da..e8fea06 100644 --- a/source-linux/js/helper.js +++ b/source-linux/js/helper.js @@ -180,7 +180,7 @@ function updateData(database,table, username, key, value, callback,filter,filter function showMessage(header,message,rootwindow){//print(message); var cleanmessage=message.replace(/"/g,"-"); if(cleanmessage.length>200){cleanmessage=cleanmessage.slice(0,200)+'...'} - var messageString='import QtQuick 2.0; import QtQuick.Controls 2.15; import QtQuick.Controls.Material 2.12; Dialog{ visible: true; title:"'+header+'";standardButtons: Dialog.Ok;anchors.centerIn: parent;Label{text:" '+cleanmessage+'"}}'; + var messageString='import QtQuick 2.0; import QtQuick.Controls 2.15; Dialog{ visible: true; title:"'+header+'";standardButtons: Dialog.Ok;anchors.centerIn: parent;Label{text:" '+cleanmessage+'"}}'; var messageObject=Qt.createQmlObject(messageString,rootwindow,"messageOutput"); } diff --git a/source-linux/js/news.js b/source-linux/js/news.js index 992aae7..bbaa08f 100644 --- a/source-linux/js/news.js +++ b/source-linux/js/news.js @@ -313,6 +313,9 @@ function newsfromdb(database,login,messagetype,callback,contact,stop_time){ for(var i = 0; i < newsrs.rows.length; i++) { newsArray.push(newsrs.rows.item(i)); + if(newsArray[i].statusnet_html==""){ + newsArray[i].statusnet_html=newsArray[i].text + } newsArray[i].statusnet_html=Qt.atob(newsArray[i].statusnet_html); newsArray[i].text=Qt.atob(newsArray[i].text); newsArray[i].id=newsArray[i].status_id; diff --git a/source-linux/qml/calendarqml/CalendarDay.qml b/source-linux/qml/calendarqml/CalendarDay.qml index 9265845..b13d785 100644 --- a/source-linux/qml/calendarqml/CalendarDay.qml +++ b/source-linux/qml/calendarqml/CalendarDay.qml @@ -30,7 +30,6 @@ // along with this program. If not, see . import QtQuick 2.11 -import QtQuick.Controls.Material 2.12 //import QtQuick.Controls 2.4 Item { @@ -51,7 +50,7 @@ Item { id:daytext anchors.right: parent.right anchors.margins: 0.5*mm - color:(model.month==monthgrid.month)?Material.primaryTextColor:Material.secondaryTextColor + color:(model.month==monthgrid.month)?osSettings.primaryTextColor:osSettings.secondaryTextColor wrapMode: Text.WrapAnywhere text: model.day font.bold: model.today diff --git a/source-linux/qml/calendarqml/CalendarTab.qml b/source-linux/qml/calendarqml/CalendarTab.qml index 7ee5421..b19f11f 100644 --- a/source-linux/qml/calendarqml/CalendarTab.qml +++ b/source-linux/qml/calendarqml/CalendarTab.qml @@ -29,11 +29,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.15 -import QtQuick.Controls.Material 2.12 -import QtQml 2.2 -import Qt.labs.calendar 1.0 +import QtQuick 2.15 +import QtQuick.Controls 6.3 + +//import Qt.labs.calendar 1.0 //import QtQuick.Layouts 1.3 import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs @@ -45,7 +44,7 @@ Rectangle { // y:1 width:parent.width height:parent.height - color: Material.backgroundColor + color: osSettings.backgroundColor property date currentTime: new Date() property int offsetTime: currentTime.getTimezoneOffset() * 60 * 1000 property var events:[] @@ -128,7 +127,7 @@ Rectangle { anchors.topMargin: 0.5*mm anchors.right:calendartabstatusButton.left anchors.rightMargin:mm - width: 2*root.fontFactor*osSettings.bigFontSize; + //width: 2*root.fontFactor*osSettings.bigFontSize; text:"\uf021" onClicked: { calBusy.running=true; @@ -223,7 +222,7 @@ Rectangle { orientation: ListView.Horizontal highlightRangeMode: ListView.StrictlyEnforceRange - model: CalendarModel {id:calendarModel + model: CalendarModel {id:calendarModel from: new Date() to: new Date(new Date().valueOf()+93312000000) } @@ -236,7 +235,7 @@ Rectangle { //Layout.fillWidth: true width: parent.width-root.fontFactor*osSettings.bigFontSize horizontalAlignment:Text.AlignHCenter - color: Material.primaryTextColor + color: osSettings.primaryTextColor text: model.year font.pointSize: osSettings.systemFontSize } @@ -244,7 +243,7 @@ Rectangle { width: parent.width-osSettings.bigFontSize text: Qt.locale().standaloneMonthName(model.month) //Layout.fillWidth: true - color: Material.primaryTextColor + color: osSettings.primaryTextColor horizontalAlignment:Text.AlignHCenter font.pointSize: osSettings.systemFontSize } diff --git a/source-linux/qml/calendarqml/EventCreate.qml b/source-linux/qml/calendarqml/EventCreate.qml index 7459209..0c40c6a 100644 --- a/source-linux/qml/calendarqml/EventCreate.qml +++ b/source-linux/qml/calendarqml/EventCreate.qml @@ -31,7 +31,6 @@ import QtQuick 2.0 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import QtQuick.Controls 1.4 as Oldcontrols import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs @@ -56,7 +55,7 @@ Flickable{ id: eventRect width: root.width height: textColumn.height + 6*root.fontFactor*osSettings.bigFontSize - color: Material.backgroundColor + color: osSettings.backgroundColor MButton{ id:closeButton anchors.top: parent.top @@ -74,7 +73,7 @@ Flickable{ height: root.fontFactor*osSettings.bigFontSize font.pointSize: osSettings.systemFontSize //verticalAlignment: TextInput.AlignBottom - color: Material.primaryTextColor + color: osSettings.primaryTextColor text:qsTr("Start") } @@ -139,7 +138,7 @@ Flickable{ width: 3*root.fontFactor*osSettings.bigFontSize height: root.fontFactor*osSettings.bigFontSize font.pointSize: osSettings.systemFontSize - color: Material.primaryTextColor + color: osSettings.primaryTextColor text:qsTr("End") } TextField { @@ -293,7 +292,7 @@ Flickable{ } Rectangle{ - color: Material.backgroundColor + color: osSettings.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) @@ -391,7 +390,7 @@ Flickable{ Label { text: formatText(Tumbler.tumbler.count, modelData) opacity: 1.0 - Math.abs(Tumbler.displacement) / (Tumbler.tumbler.visibleItemCount / 2) - color:Material.primaryTextColor + color: osSettings.primaryTextColor horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter font.pointSize: osSettings.systemFontSize diff --git a/source-linux/qml/calendarqml/EventList.qml b/source-linux/qml/calendarqml/EventList.qml index 4fe00b8..aa17a10 100644 --- a/source-linux/qml/calendarqml/EventList.qml +++ b/source-linux/qml/calendarqml/EventList.qml @@ -31,7 +31,6 @@ import QtQuick 2.0 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -39,7 +38,7 @@ import "qrc:/qml/calendarqml" Rectangle{ id:eventList - color: Material.backgroundColor + color: osSettings.backgroundColor property var daylist:[] property int dayint: 0 property var events:[] @@ -50,6 +49,7 @@ Rectangle{ anchors.topMargin: 1*mm anchors.right: parent.right anchors.rightMargin: 1*mm + width: 2*root.fontFactor*osSettings.bigFontSize; text: "\uf057" onClicked:{rootstackView.pop()} } diff --git a/source-linux/qml/calendarqml/EventListItem.qml b/source-linux/qml/calendarqml/EventListItem.qml index b7248f8..4db3d2d 100644 --- a/source-linux/qml/calendarqml/EventListItem.qml +++ b/source-linux/qml/calendarqml/EventListItem.qml @@ -31,7 +31,6 @@ import QtQuick 2.0 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -43,8 +42,8 @@ Rectangle{ property var currEvent: event width:parent.width height:Math.max(eventNameText.height+eventDetailsText.height,profileImage.height)+mm - border.color: Material.backgroundDimColor - color: Material.backgroundColor + //border.color: osSettings.backgroundDimColor + color: osSettings.backgroundColor border.width: 1 radius: 0.5*mm Image { @@ -61,7 +60,7 @@ Rectangle{ x: 8*mm width:parent.width-8*mm height:contentHeight - color: Material.primaryTextColor + color: osSettings.primaryTextColor textFormat: Text.RichText font.pointSize: osSettings.systemFontSize text: new Date(event.start).toLocaleString(Qt.locale(),Locale.NarrowFormat)+ " - " +((event.end>0)&&(event.end!=null)?new Date(event.end).toLocaleString(Qt.locale(),Locale.NarrowFormat):"\u221E")+":
    "+(status=="large"?""+event.title+"":event.title) @@ -74,7 +73,7 @@ Rectangle{ z:4 width: parent.width-8*mm height: contentHeight - color: Material.primaryTextColor + color: osSettings.primaryTextColor textFormat: Text.RichText text: status!="large"?"":Qt.atob(event.desc) + (event.location==""?"":"

    "+qsTr("Location")+": "+event.location) anchors.top: eventNameText.bottom diff --git a/source-linux/qml/configqml/AcceptRules.qml b/source-linux/qml/configqml/AcceptRules.qml index 1036802..ef96842 100644 --- a/source-linux/qml/configqml/AcceptRules.qml +++ b/source-linux/qml/configqml/AcceptRules.qml @@ -31,7 +31,6 @@ import QtQuick 2.0 import QtQuick.Controls 2.15 -import QtQuick.Controls.Material 2.12 Dialog { id: rulesDialog @@ -57,8 +56,8 @@ Dialog { x:1; y:1 width: root.width-4*root.fontFactor*osSettings.bigFontSize wrapMode: TextEdit.Wrap - color: Material.primaryTextColor - linkColor: Material.accentColor + color: osSettings.primaryTextColor + linkColor: osSettings.secondaryTextColor textFormat: Text.PlainText font.family: "Noto Sans" font.pointSize: osSettings.systemFontSize diff --git a/source-linux/qml/configqml/AccountPage.qml b/source-linux/qml/configqml/AccountPage.qml index a1ab175..d076d37 100644 --- a/source-linux/qml/configqml/AccountPage.qml +++ b/source-linux/qml/configqml/AccountPage.qml @@ -29,11 +29,12 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.7 -import QtQuick.Dialogs 1.2 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtCore 6.3 +import QtQuick.Dialogs 6.3 +import QtQuick.Controls 6.3 import QtQuick.Layouts 1.12 -import QtQml.Models 2.15 +import QtQml.Models 6.3 import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/configqml" @@ -55,495 +56,494 @@ Page{ xhr.clearParams(); xhr.get(); } - } + } function verify(userconfig){ Helperjs.friendicaRequest(userconfig,"/api/v1/accounts/verify_credentials",root,function(obj){ - accountBusy.running=false; - try{var credentials=JSON.parse(obj); - if (credentials.hasOwnProperty('error')){ - Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root) - } - else{ - if (users.length==0){Service.setDefaultOptions(db);} - if (userconfig.APIVersion!=""){userconfig.password=""} - if (imagestoredir==""){ - imagestoredir=filesystem.homePath+"/"+credentials.username+"/"; - userconfig.imagestore=imagestoredir + accountBusy.running=false; + try{var credentials=JSON.parse(obj); + if (credentials.hasOwnProperty('error')){ + Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root) } - if(userconfig.imagestore == filesystem.homePath+"/"+credentials.username+"/") + else{ + if (users.length==0){Service.setDefaultOptions(db);} + if (userconfig.APIVersion!=""){userconfig.password=""} + if (imagestoredir==""){ + imagestoredir=filesystem.homePath+"/"+credentials.username+"/"; + userconfig.imagestore=imagestoredir + } + if(userconfig.imagestore == filesystem.homePath+"/"+credentials.username+"/") {filesystem.makePath(filesystem.homePath+"/"+credentials.username);} - print("imagestoredir "+imagestoredir) - filesystem.Directory=imagestoredir; - filesystem.makeDir("contacts"); - filesystem.makeDir("albums"); - userconfig.accountId=credentials.id; - userconfig.username=credentials.username; - Service.storeConfig(db,userconfig); + print("imagestoredir "+imagestoredir) + filesystem.Directory=imagestoredir; + filesystem.makeDir("contacts"); + filesystem.makeDir("albums"); + userconfig.accountId=credentials.id; + userconfig.username=credentials.username; + Service.storeConfig(db,userconfig); + Service.readConfig(db,function(userconfig){ + Helperjs.readData(db,"config","",function(storedUsers){ + storedUsers.sort(function(obj1, obj2) { + return obj1.isActive - obj2.isActive; + }); + accountPage.users=storedUsers}); + //reset values + login=userconfig; + news=[]; + contactlist=[]; + rootstack.currentIndex=0; + newstypeSignal("refresh"); + },"isActive",0); + Helperjs.showMessage(qsTr("Success"),qsTr("Name")+": "+credentials.display_name+"\nScreen Name: "+credentials.username,root) + rootstackView.pop() + } + }catch(e){Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root)}; + }) + } + + BusyIndicator{ + id: accountBusy + anchors.centerIn: parent + width: 5*root.fontFactor*osSettings.bigFontSize + height: 5*root.fontFactor*osSettings.bigFontSize + running: false + } + + ColumnLayout{ + x: root.fontFactor*osSettings.bigFontSize + width: root.width - 2*mm + y: root.fontFactor*osSettings.bigFontSize + spacing: root.fontFactor*osSettings.bigFontSize + + Row{ + spacing:0.5*mm + height: userButton.height + width: parent.width + + MButton{ + id:userButton + text:qsTr("User") + font.pointSize: osSettings.bigFontSize + visible: users.length>0 + onClicked:{ + var useritems=""; + for (var i=0;i0 + text: "-" + font.pointSize: osSettings.bigFontSize + onClicked:{ + var userconfig={server: servername.text, username: username.text, password: Qt.btoa(password.text)}; + + Service.readConfig(db,function(user){ + if(userdata.token!=""){xhr.setUrl(servername.text); + xhr.setApi("/oauth/revoke"); + xhr.clearParams(); + xhr.setParam("client_id",user.client.client_id); + xhr.setParam("client_secret",user.client.client_secret); + xhr.setParam("token",user.token); + xhr.post(); + } + },"username",username.text); + + + Service.deleteConfig(db,userconfig,function(){ + filesystem.Directory=imagestore.text+"contacts"; + filesystem.rmDir(); + filesystem.Directory=imagestore.text+"albums"; + filesystem.rmDir(); + servername.text="https://"; + servericon.visible=false; + servericon.source=""; + username.text=""; + password.text=""; + imagestore.text=""; + userButton.text=qsTr("User"); + Helperjs.readData(db,"config","",function(storedUsers){ + storedUsers.sort(function(obj1, obj2) { + return obj1.isActive - obj2.isActive; + }) + accountPage.users=storedUsers;}) + accountPage.state="new_oauth" + }) + }} + + MButton { + visible: users.length>0 + text: "+" + font.pointSize: osSettings.bigFontSize + onClicked:{ + servername.text="https://" + servericon.visible=false; + servericon.source=""; + username.text="" + password.text="" + imagestore.text="" + userButton.text=qsTr("User") + accountPage.state="new_oauth" + } + } + + MButton { + text: "?" + font.pointSize: osSettings.bigFontSize + onClicked:{ + rootstackView.push("qrc:/qml/configqml/InfoBox.qml"); + } + } + MButton{ + id:closeButton + visible: users.length>0 + text: "\uf057" + font.pointSize: osSettings.bigFontSize + onClicked:{rootstackView.pop()} + } + } + Row{ + spacing:0.5*mm + height: 3*root.fontFactor*osSettings.bigFontSize + width: parent.width + Image{ + id:servericon + width:2.5*root.fontFactor*osSettings.bigFontSize; height: 2.5*root.fontFactor*osSettings.bigFontSize + visible: false + source:"" + property var serverconfig:({}) + MouseArea{ + anchors.fill:parent + onClicked:{ + let serverConfigString="import QtQuick 2.0; import QtQuick.Dialogs 6.3; MessageDialog{ visible: true; title:'Server';buttons: MessageDialog.Ok;text: 'Name: "+ + servericon.serverconfig.site.name+"\nLanguage: "+servericon.serverconfig.site.language+ + "\nEmail: "+servericon.serverconfig.site.email+"\nTimezone: "+servericon.serverconfig.site.timezone+"\nClosed: "+servericon.serverconfig.site.closed+ + "\nText limit: "+servericon.serverconfig.site.textlimit+"\nShort Url length: "+servericon.serverconfig.site.shorturllength+ + "\nFriendica version: "+servericon.serverconfig.site.friendica.FRIENDICA_VERSION+ + "\nDB Update version: "+servericon.serverconfig.site.friendica.DB_UPDATE_VERSION+"'}"; + + var serverconfigObject=Qt.createQmlObject(serverConfigString,accountPage,"serverconfigOutput"); + } + } + } + FontLoader{id: fontAwesome; source: "qrc:/images/fontawesome-webfont.ttf"} + MButton{ + id:serverSearchButton + width: 3*root.fontFactor*osSettings.bigFontSize; height: 2.5*root.fontFactor*osSettings.bigFontSize + text:"\uf002" + icon.name: "search" + font.pointSize: osSettings.bigFontSize + visible: servericon.visible?false:true + onClicked:{Qt.openUrlExternally(Qt.resolvedUrl("https://dir.friendica.social/servers"))} + } + + // ComboBox{ + // id: servername + // x: 4*root.fontFactor*osSettings.bigFontSize + // y: 3.5*root.fontFactor*osSettings.bigFontSize + // width: root.width-5*root.fontFactor*osSettings.bigFontSize + // height: 2.5*root.fontFactor*osSettings.bigFontSize//5*mm; + // font.pointSize: osSettings.systemFontSize + // editable:true + // model: serverModel + // onAccepted: { + // let cleanText =currentText;if(currentText==""){cleanText=editText} + // if((cleanText).substring(0,8) !=="https://"){ + // cleanText="https://"+cleanText + // } + // if (find(cleanText) === -1) { + // serverModel.append({text: cleanText}) + // currentIndex = find(cleanText) + // displayText=cleanText + // } + // if (cleanText!=""){accountPage.setServericon(cleanText)} + // } + // onFocusChanged: { + // if(focus==false){ + // onAccepted() + // } + // } + // } + TextField { + id: servername + width: root.width-5*root.fontFactor*osSettings.bigFontSize + height: 2.5*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize + text:"https://" + onFocusChanged:{ + if (focus){servermenu.open()} + else{ + if((servername.text).substring(0,11) =="https://http"){ + servername.text= (servername.text).substring(8) + } + if (servername.text!="https://"){ + accountPage.setServericon(servername.text)} + } + } + } + Menu { + id:servermenu + width: 13*root.fontFactor*osSettings.bigFontSize + Instantiator{ + model:serverModel + MenuItem{ + text: modelData + onTriggered: {servername.text=modelData} + } + onObjectAdded:{servermenu.insertItem(index,object)} + onObjectRemoved:{servermenu.removeItem(object)} + } + } + + ListModel{id:serverModel + ListElement{text:"https://anonsys.net"} + ListElement{text:"https://asaps-sm.lafayettegroup.com"} + ListElement{text:"https://f.freinetz.ch"} + ListElement{text:"https://friendica.chilemasto.casa"} + ListElement{text:"https://friendica.eskimo.com"} + ListElement{text:"https://friendica.me"} + ListElement{text:"https://friendica.opensocial.space"} + ListElement{text:"https://friendica.utzer.de"} + ListElement{text:"https://friendica.vrije-mens.org"} + ListElement{text:"https://libranet.de"} + ListElement{text:"https://loma.ml"} + ListElement{text:"https://nerdica.net"} + ListElement{text:"https://nsfw.wnymathguy.com"} + ListElement{text:"https://opensocial.at"} + ListElement{text:"https://poliverso.org"} + ListElement{text:"https://social.isurf.ca"} + ListElement{text:"https://social.trom.tf"} + ListElement{text:"https://squeet.me"} + ListElement{text:"https://venera.social"} + } + } + MButton { + id: ruleButton + width: parent.width + visible: (osSettings.osType=="Android") && (userButton.text== qsTr("User")) + height: 2*root.fontFactor*osSettings.bigFontSize; + text: qsTr("Instance rules") + font.pointSize: osSettings.bigFontSize + onClicked:{ + xhr.setUrl(servername.text); + xhr.setApi("/api/v1/instance/rules"); + xhr.clearParams(); + xhr.get(); + } + } + + TextField { + id: username + width: root.width-5*root.fontFactor*osSettings.bigFontSize + height: servername.height + Layout.leftMargin: 3*root.fontFactor*osSettings.bigFontSize; + font.pointSize: osSettings.systemFontSize + visible: (osSettings.osType=="Android")?(text!= ""):true + placeholderText: qsTr("Nickname") + selectByMouse: true + onEditingFinished: { + if (username.text.indexOf('@')>-1){ + Helperjs.showMessage(qsTr("Error"),qsTr("Nicknames containing @ symbol currently not supported"),accountPage) + } + imagestoredir=filesystem.homePath+"/"+username.text+"/" + } + } + + TextField { + id: password + width: root.width-9*mm; height: 2.5*root.fontFactor*osSettings.bigFontSize; + font.pointSize: osSettings.systemFontSize + visible: (osSettings.osType=="Android")?(userButton.text!= qsTr("User")):true + selectByMouse: true + echoMode: TextInput.Password + placeholderText: qsTr("Password") + inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText | Qt.ImhSensitiveData + } + + Row{ + spacing:0.5*mm + height: 3*root.fontFactor*osSettings.bigFontSize + width: parent.width + Label { + id: imagedirlabel + visible: imagestore.text!="" + text: qsTr("Image dir.") + font.pointSize: osSettings.systemFontSize + } + + TextField { + id: imagestore + width: root.width-17*mm; + height: 2.5*root.fontFactor*osSettings.bigFontSize; + visible:imagestore.text!="" + font.pointSize: osSettings.systemFontSize + selectByMouse: true + text: "" + wrapMode: TextEdit.NoWrap + onTextChanged: imagestoredir=imagestore.text + } + + MButton { + visible:imagestore.text!="" + text: "..." + font.pointSize: osSettings.bigFontSize + onClicked:{imagestoreDialog.open()} + } + + FolderDialog { + id: imagestoreDialog + title: "Please choose a directory" + currentFolder: StandardPaths.standardLocations(StandardPaths.PicturesLocation)[0] + //selectFolder: true + onAccepted: { + var imagestoreString=imagestoreDialog.selectedFolder.toString(); + imagestoreString=imagestoreString.replace(/^(file:\/{2})/,"")+"/" + imagestore.text=imagestoreString + } + } + } + + + MButton { + id:confirmationOAuth + width: parent.width + text: qsTr("Connect") + font.pointSize: osSettings.bigFontSize + visible: (osSettings.osType=="Android")?userButton.text!= qsTr("User"):true + onClicked:{ + if (servername.text==""){Helperjs.showMessage(qsTr("Error"), qsTr("No server given!"),root)} + else{ + xhr.setUrl(servername.text); + xhr.setApi("/api/v1/apps"); + xhr.clearParams(); + if (osSettings.osType=="Android"){ + xhr.setParam("client_name","Friendiqa-Android"); + } else { + xhr.setParam("client_name","Friendiqa-"+filesystem.hostname); + } + xhr.setParam("redirect_uris","http://127.0.0.1:1337/"); + xhr.setParam("scopes","read write follow push"); + xhr.setParam("website","https://friendiqa.ma-nic.de"); + xhr.post(); + } + } + } + + Connections{ + target: xhr + function onSuccess(text,api){ + if(api=="/api/v1/instance/rules"){ + let rulestext=""; + let rulesarray=JSON.parse(text) + for (let rule in rulesarray){ + rulestext=rulestext+rulesarray[rule].text+"\n" + } + var component = Qt.createComponent("qrc:/qml/configqml/AcceptRules.qml"); + var rulesdialog = component.createObject(accountPage,{"rules": rulestext}); + rulesdialog.open(); + } + else if(api=="/api/statusnet/config"){ + try{let serverdata = JSON.parse(text); + servericon.visible=true; + servericon.source=serverdata.site.logo; + servericon.serverconfig=serverdata; + } + catch(e){print(e)} + } + + else if (api=="/api/v1/apps"){print("/api/v1/apps text "+text) + let app=JSON.parse(text); + accountPage.appdata=app; + oauth2.setClientId(app.client_id); + oauth2.setClientSecret(app.client_secret); + oauth2.setServer(servername.text); + oauth2.grant(); + } + } + function onError(text,api){ + print(api + " Error "+ text) + } + } + + Connections{ + target: oauth2 + function onSuccess(text){ + var userconfig={server: servername.displayText, username:"", password:"", imagestore: imagestoredir,interval:"",token: text,client:Qt.btoa(JSON.stringify(appdata))} + verify(userconfig) + } + function onError(text){ + Helperjs.showMessage(qsTr("Error"), qsTr("Couldn't connect to server"),root) + print ("oauth2 onerror "+text) + } + } + + MButton { + id:confirmation + width: 10*root.fontFactor*osSettings.bigFontSize; + text: qsTr("Confirm") + font.pointSize: osSettings.bigFontSize + visible: false// (osSettings.osType=="Android")?userButton.text!= qsTr("User"):true + onClicked:{ + accountBusy.running=true; + var userconfig={server: servername.displayText, username: username.text, password:Qt.btoa(password.text), imagestore:imagestoredir,interval:""}; + var errormessage=""; + if (servername.text==""){errormessage=qsTr("No server given! ")} + else if (username.text==""){errormessage+=qsTr("No nickname given! ")} + else if (password.text=="") {errormessage+=qsTr("No password given! ")} + else if (imagestoredir=="") {errormessage+=qsTr("No image directory given!")} + else {errormessage=""} + if (errormessage=="") {verify(userconfig)} + else {Helperjs.showMessage(qsTr("Error"), errormessage,root)} + }} + + MButton { + id: setDefault + width: 10*root.fontFactor*osSettings.bigFontSize; + text: qsTr("Set as default") + font.pointSize: osSettings.bigFontSize + visible: false + onClicked:{ + accountBusy.running=true; + let users=updatenews.getAccounts("username",username.text) + Service.storeConfig(db,users[0]); Service.readConfig(db,function(userconfig){ - Helperjs.readData(db,"config","",function(storedUsers){ - storedUsers.sort(function(obj1, obj2) { - return obj1.isActive - obj2.isActive; - }); - accountPage.users=storedUsers}); - //reset values + //reset values login=userconfig; news=[]; contactlist=[]; rootstack.currentIndex=0; newstypeSignal("refresh"); },"isActive",0); - Helperjs.showMessage(qsTr("Success"),qsTr("Name")+": "+credentials.display_name+"\nScreen Name: "+credentials.username,root) + Helperjs.showMessage(qsTr("Success"),"Screen Name: "+users[0].username,root) rootstackView.pop() - } - }catch(e){Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root)}; - })} - - MButton{ - id:userButton - text:qsTr("User") - font.pointSize: osSettings.bigFontSize - x: root.fontFactor*osSettings.bigFontSize - y: root.fontFactor*osSettings.bigFontSize - width: root.width/2 - 2*mm - height: 2*root.fontFactor*osSettings.bigFontSize - visible: users.length>0 - onClicked:{ - var useritems=""; - for (var i=0;i-1){ - Helperjs.showMessage(qsTr("Error"),qsTr("Nicknames containing @ symbol currently not supported"),accountPage) - } - imagestoredir=filesystem.homePath+"/"+username.text+"/" - //if (imagestore.text==filesystem.homePath+"/.friendiqa/"){imagestore.text=filesystem.homePath+"/.friendiqa/"+username.text+"/"} - } - } - - TextField { - id: password - x: root.fontFactor*osSettings.bigFontSize; y: 9*root.fontFactor*osSettings.bigFontSize; width: root.width-9*mm; //height: 5*mm; - font.pointSize: osSettings.systemFontSize - visible: (osSettings.osType=="Android")?(userButton.text!= qsTr("User")):true - selectByMouse: true - echoMode: TextInput.Password - placeholderText: qsTr("Password") - inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText | Qt.ImhSensitiveData - } - - Label { - id: imagedirlabel - visible: imagestore.text!="" - text: qsTr("Image dir.") - font.pointSize: osSettings.systemFontSize - x: root.fontFactor*osSettings.bigFontSize; y: 12*root.fontFactor*osSettings.bigFontSize - } - - TextField { - id: imagestore - x: root.fontFactor*osSettings.bigFontSize; y: 13*root.fontFactor*osSettings.bigFontSize; width: root.width-17*mm; //height: 5*mm; - visible:imagestore.text!="" - font.pointSize: osSettings.systemFontSize - selectByMouse: true - text: "" //filesystem.homePath+"/.friendiqa/"+username.text+"/" //(osSettings.osType=="Android") && (filesystem.fileexist("/storage/emulated/0/Pictures/"))?"/storage/emulated/0/Pictures/":"" - wrapMode: TextEdit.NoWrap - onTextChanged: imagestoredir=imagestore.text - } - - MButton { - x: root.width-3*root.fontFactor*osSettings.bigFontSize; y: 13*root.fontFactor*osSettings.bigFontSize; - height: 2*root.fontFactor*osSettings.bigFontSize; - visible:imagestore.text!="" - text: "..." - font.pointSize: osSettings.bigFontSize - onClicked:{imagestoreDialog.open()} - } - - FileDialog { - id: imagestoreDialog - title: "Please choose a directory" - folder: shortcuts.pictures - selectFolder: true - onAccepted: { - var imagestoreString=imagestoreDialog.folder.toString(); - imagestoreString=imagestoreString.replace(/^(file:\/{2})/,"")+"/" - imagestore.text=imagestoreString - } - } - - BusyIndicator{ - id: accountBusy - anchors.horizontalCenter: parent.horizontalCenter - y: 16*root.fontFactor*osSettings.bigFontSize - width:10*mm - height: 10*mm - running: false - } - - MButton { - id:confirmationOAuth - x: root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize - text: qsTr("Connect") - font.pointSize: osSettings.bigFontSize - visible: (osSettings.osType=="Android")?userButton.text!= qsTr("User"):true - onClicked:{ - if (servername.text==""){Helperjs.showMessage(qsTr("Error"), qsTr("No server given!"),root)} - else{ - xhr.setUrl(servername.text); - xhr.setApi("/api/v1/apps"); - xhr.clearParams(); - if (osSettings.osType=="Android"){ - xhr.setParam("client_name","Friendiqa-Android"); - } else { - xhr.setParam("client_name","Friendiqa-"+filesystem.hostname); - } - xhr.setParam("redirect_uris","http://127.0.0.1:1337/"); - xhr.setParam("scopes","read write follow push"); - xhr.setParam("website","https://friendiqa.ma-nic.de"); - xhr.post(); - } - } - } - - Connections{ - target: xhr - function onSuccess(text,api){ - if(api=="/api/v1/instance/rules"){ - let rulestext=""; - let rulesarray=JSON.parse(text) - for (let rule in rulesarray){ - rulestext=rulestext+rulesarray[rule].text+"\n" - } - var component = Qt.createComponent("qrc:/qml/configqml/AcceptRules.qml"); - var rulesdialog = component.createObject(accountPage,{"rules": rulestext}); - rulesdialog.open(); - } - else if(api=="/api/statusnet/config"){ - try{let serverdata = JSON.parse(text); - servericon.visible=true; - servericon.source=serverdata.site.logo; - servericon.serverconfig=serverdata; - } - catch(e){print(e)} - } - - else if (api=="/api/v1/apps"){print("/api/v1/apps text "+text) - let app=JSON.parse(text); - accountPage.appdata=app; - oauth2.setClientId(app.client_id); - oauth2.setClientSecret(app.client_secret); - oauth2.setServer(servername.text); - oauth2.grant(); - } - } - function onError(text,api){ - print(api + " Error "+ text) - } - } - - Connections{ - target: oauth2 - function onSuccess(text){ - var userconfig={server: servername.displayText, username:"", password:"", imagestore: imagestoredir,interval:"",token: text,client:Qt.btoa(JSON.stringify(appdata))} - verify(userconfig) - } - function onError(text){ - Helperjs.showMessage(qsTr("Error"), qsTr("Couldn't connect to server"),root) - print ("oauth2 onerror "+text) - } - } - - MButton { - id:confirmation - x: root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize - text: qsTr("Confirm") - font.pointSize: osSettings.bigFontSize - visible: false// (osSettings.osType=="Android")?userButton.text!= qsTr("User"):true - onClicked:{ - accountBusy.running=true; - var userconfig={server: servername.displayText, username: username.text, password:Qt.btoa(password.text), imagestore:imagestoredir,interval:""}; - var errormessage=""; - if (servername.text==""){errormessage=qsTr("No server given! ")} - else if (username.text==""){errormessage+=qsTr("No nickname given! ")} - else if (password.text=="") {errormessage+=qsTr("No password given! ")} - else if (imagestoredir=="") {errormessage+=qsTr("No image directory given!")} - else {errormessage=""} - if (errormessage=="") {verify(userconfig)} - else {Helperjs.showMessage(qsTr("Error"), errormessage,root)} - }} - - MButton { - id: setDefault - x: 10*root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize - text: qsTr("Set as default") - font.pointSize: osSettings.bigFontSize - visible: false - onClicked:{ - accountBusy.running=true; - let users=updatenews.getAccounts("username",username.text) - Service.storeConfig(db,users[0]); - Service.readConfig(db,function(userconfig){ - //reset values - login=userconfig; - news=[]; - contactlist=[]; - rootstack.currentIndex=0; - newstypeSignal("refresh"); - },"isActive",0); - Helperjs.showMessage(qsTr("Success"),"Screen Name: "+users[0].username,root) - rootstackView.pop() - }} - - Row{ - spacing:0.5*mm - anchors.top: parent.top - anchors.topMargin: root.fontFactor*osSettings.bigFontSize - anchors.right: parent.right - anchors.rightMargin: 1*mm - MButton { - width: 5*mm; - visible: users.length>0 - text: "-" - font.pointSize: osSettings.bigFontSize - onClicked:{ - var userconfig={server: servername.text, username: username.text, password: Qt.btoa(password.text)}; - - Service.readConfig(db,function(user){ - if(userdata.token!=""){xhr.setUrl(servername.text); - xhr.setApi("/oauth/revoke"); - xhr.clearParams(); - xhr.setParam("client_id",user.client.client_id); - xhr.setParam("client_secret",user.client.client_secret); - xhr.setParam("token",user.token); - xhr.post(); - } - },"username",username.text); - - - Service.deleteConfig(db,userconfig,function(){ - filesystem.Directory=imagestore.text+"contacts"; - filesystem.rmDir(); - filesystem.Directory=imagestore.text+"albums"; - filesystem.rmDir(); - servername.text="https://"; - servericon.visible=false; - servericon.source=""; - username.text=""; - password.text=""; - imagestore.text=""; - userButton.text=qsTr("User"); - Helperjs.readData(db,"config","",function(storedUsers){ - storedUsers.sort(function(obj1, obj2) { - return obj1.isActive - obj2.isActive; - }) - accountPage.users=storedUsers;}) - accountPage.state="new_oauth" - }) - }} - - MButton { - width: 5*mm; - visible: users.length>0 - text: "+" - font.pointSize: osSettings.bigFontSize - onClicked:{ - servername.text="https://" - servericon.visible=false; - servericon.source=""; - username.text="" - password.text="" - imagestore.text="" - userButton.text=qsTr("User") - accountPage.state="new_oauth" - } - } - - MButton { - width: 5*mm; - text: "?" - font.pointSize: osSettings.bigFontSize - onClicked:{ - rootstackView.push("qrc:/qml/configqml/InfoBox.qml"); - } - } - MButton{ - id:closeButton - width: 5*mm; - visible: users.length>0 - text: "\uf057" - font.pointSize: osSettings.bigFontSize - onClicked:{rootstackView.pop()} - } - } - states: [ State { name: "new_oauth" PropertyChanges {target: username; visible: false } PropertyChanges {target: password; visible: false} PropertyChanges {target: ruleButton; visible: true} - }, + }, State { name:"oauth" PropertyChanges {target: username; visible: true} @@ -561,34 +561,34 @@ Page{ } ] - Component.onCompleted: { //print("filesystem.osType " +filesystem.osType) - try{Helperjs.readData(db,"config","",function(storedUsers){ - storedUsers.sort(function(obj1, obj2) { - return obj1.isActive - obj2.isActive; - }) - accountPage.users=storedUsers; - Service.readConfig(db,function(obj){ - if (obj==null){ - accountPage.state="new_oauth" - } - else{ - userButton.text=obj.username; - servername.text=obj.server; - serverModel.insert(0,{text:obj.server}) - accountPage.setServericon(obj.server); - username.text= obj.username; - password.text=Qt.atob(obj.password); - imagestore.text=obj.imagestore; - imagestoredir=obj.imagestore; - if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'} - if(obj.password!=""){accountPage.state="password"} - else if (obj.token!=""){accountPage.state="oauth"} - else {accountPage.state="new_oauth"} - } + Component.onCompleted: { //print("filesystem.osType " +filesystem.osType) + try{Helperjs.readData(db,"config","",function(storedUsers){ + storedUsers.sort(function(obj1, obj2) { + return obj1.isActive - obj2.isActive; + }) + accountPage.users=storedUsers; + Service.readConfig(db,function(obj){ + if (obj==null){ + accountPage.state="new_oauth" + } + else{ + userButton.text=obj.username; + servername.text=obj.server; + serverModel.insert(0,{text:obj.server}) + accountPage.setServericon(obj.server); + username.text= obj.username; + password.text=Qt.atob(obj.password); + imagestore.text=obj.imagestore; + imagestoredir=obj.imagestore; + if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'} + if(obj.password!=""){accountPage.state="password"} + else if (obj.token!=""){accountPage.state="oauth"} + else {accountPage.state="new_oauth"} + } - },"isActive",0) + },"isActive",0) })} catch (e){//print("onCompleted" +users.count +e) - } + } } } diff --git a/source-linux/qml/configqml/ConfigAppearancePage.qml b/source-linux/qml/configqml/ConfigAppearancePage.qml index 462df2d..c6a0ee0 100644 --- a/source-linux/qml/configqml/ConfigAppearancePage.qml +++ b/source-linux/qml/configqml/ConfigAppearancePage.qml @@ -30,179 +30,218 @@ // along with this program. If not, see . import QtQuick 2.11 -import QtQuick.Dialogs 1.2 +//import QtQuick.Dialogs 1.2 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/js/service.js" as Service import "qrc:/qml/configqml" import "qrc:/qml/genericqml" Page{ - //anchors.fill: parent - width:root.width - height:root.height + width: parent.width + height: parent.height + ScrollView{ + anchors.fill: parent + contentHeight: 40*root.fontFactor*osSettings.bigFontSize + contentWidth: root.width + clip:true - Label { - text: qsTr("News as") - font.pointSize:osSettings.systemFontSize - x: root.fontFactor*osSettings.bigFontSize; y: 2*root.fontFactor*osSettings.bigFontSize - } - - Rectangle{ - x: root.fontFactor*osSettings.bigFontSize; y: 4*root.fontFactor*osSettings.bigFontSize; - width: newsTypeField.contentWidth+2*mm; height: 2*root.fontFactor*osSettings.bigFontSize - color: Material.dialogColor//"#F3F3F3" - radius: 0.5*mm - Label{ - id: newsTypeField - anchors.fill: parent - font.pointSize:osSettings.bigFontSize - text:qsTr("Conversations") + Label { + text: qsTr("News as") + font.pointSize:osSettings.systemFontSize + x: root.fontFactor*osSettings.bigFontSize; y: 2*root.fontFactor*osSettings.bigFontSize } - MouseArea{ - anchors.fill:parent - onClicked:newstypemenu.popup() - } - } - Menu { - id:newstypemenu - width:12*root.fontFactor*osSettings.bigFontSize - MenuItem { - font.pointSize: osSettings.bigFontSize - text: qsTr("Timeline") - onTriggered: {newsTypeField.text=qsTr("Timeline"); - Service.updateglobaloptions(root.db,"newsViewType","Timeline");} - } - MenuItem { - font.pointSize: osSettings.bigFontSize - text: qsTr("Conversations") - onTriggered: {newsTypeField.text=qsTr("Conversations"); - Service.updateglobaloptions(root.db,"newsViewType","Conversations");} - } - } - - Label { - text: qsTr("Max. News") - font.pointSize: osSettings.systemFontSize - x: root.fontFactor*osSettings.bigFontSize; y:8*root.fontFactor*osSettings.bigFontSize - } - - Slider{ id: maxNews - x:6*root.fontFactor*osSettings.bigFontSize; y: 10*root.fontFactor*osSettings.bigFontSize; - width: root.width/2;height:2*root.fontFactor*osSettings.bigFontSize - from: 0;to:2000; stepSize: 100 - value: root.globaloptions.hasOwnProperty("max_news")?root.globaloptions.max_news:1000 - } - - Rectangle{ - color: Material.dialogColor - x: root.fontFactor*osSettings.bigFontSize; y: 10*root.fontFactor*osSettings.bigFontSize; - width: 4*root.fontFactor*osSettings.bigFontSize; height: 2*root.fontFactor*osSettings.bigFontSize; - radius: 0.5*mm - TextEdit{id:maxNewsText; - anchors.fill: parent - font.pointSize: osSettings.bigFontSize - verticalAlignment:TextEdit.AlignRight - color: Material.primaryTextColor - text:maxNews.value - selectByMouse: true - onTextChanged: { - Service.updateglobaloptions(root.db,"max_news",text); + Rectangle{ + x: root.fontFactor*osSettings.bigFontSize; y: 4*root.fontFactor*osSettings.bigFontSize; + width: newsTypeField.contentWidth+2*mm; height: 2*root.fontFactor*osSettings.bigFontSize + color: osSettings.backgroundDimColor//"#F3F3F3" + radius: 0.5*mm + Label{ + id: newsTypeField + anchors.fill: parent + font.pointSize:osSettings.bigFontSize + text:qsTr("Conversations") + } + MouseArea{ + anchors.fill:parent + onClicked:newstypemenu.popup() } } - } - - CheckBox{ - id: nsfwCheckbox - x: root.fontFactor*osSettings.bigFontSize - y: 14*root.fontFactor*osSettings.bigFontSize - font.pointSize: osSettings.bigFontSize - text: qsTr("Hide #nsfw?") - checked:(globaloptions["hide_nsfw"]==1)?true:false - onClicked: { - toggle(); - if(nsfwCheckbox.checked==true){ - Service.updateglobaloptions(root.db,"hide_nsfw",0);nsfwCheckbox.checked=false; + Menu { + id:newstypemenu + width:12*root.fontFactor*osSettings.bigFontSize + MenuItem { + font.pointSize: osSettings.bigFontSize + text: qsTr("Timeline") + onTriggered: {newsTypeField.text=qsTr("Timeline"); + Service.updateglobaloptions(root.db,"newsViewType","Timeline");} } - else{ - Service.updateglobaloptions(root.db,"hide_nsfw",1);nsfwCheckbox.checked=true; + MenuItem { + font.pointSize: osSettings.bigFontSize + text: qsTr("Conversations") + onTriggered: {newsTypeField.text=qsTr("Conversations"); + Service.updateglobaloptions(root.db,"newsViewType","Conversations");} } } - } -// CheckBox{ -// id: darkmodeCheckbox -// tristate:true -// x: root.fontFactor*osSettings.bigFontSize -// y: 24*root.fontFactor*osSettings.bigFontSize -// font.pointSize: osSettings.bigFontSize -// text: qsTr("Dark Mode") -// checked:(globaloptions["view_darkmode"]==1)?true:false -// onClicked: { -// toggle(); -// if(darkmodeCheckbox.checked==true){ -// Service.updateglobaloptions(root.db,"view_darkmode",0);darkmodeCheckbox.checked=false; -// root.Material.theme=Material.Light -// } -// else{ -// Service.updateglobaloptions(root.db,"view_darkmode",1);darkmodeCheckbox.checked=true; -// root.Material.theme=Material.Dark -// } -// } -// } - Column{ - x: root.fontFactor*osSettings.bigFontSize - y: 18*root.fontFactor*osSettings.bigFontSize - Label{ - text: qsTr("Dark Mode") - font.pointSize: osSettings.systemFontSize} + Label { + text: qsTr("Max. News") + font.pointSize: osSettings.systemFontSize + x: root.fontFactor*osSettings.bigFontSize; y:8*root.fontFactor*osSettings.bigFontSize + } - RadioButton{ - text: qsTr("System") - checked: (globaloptions["view_darkmode"]==0 || globaloptions["view_darkmode"]==undefined)?true:false + Slider{ id: maxNews + x:6*root.fontFactor*osSettings.bigFontSize; y: 10*root.fontFactor*osSettings.bigFontSize; + width: root.width/2;height:2*root.fontFactor*osSettings.bigFontSize + from: 0;to:2000; stepSize: 100 + value: root.globaloptions.hasOwnProperty("max_news")?root.globaloptions.max_news:1000 + } + + Rectangle{ + color: osSettings.backgroundDimColor + x: root.fontFactor*osSettings.bigFontSize; y: 10*root.fontFactor*osSettings.bigFontSize; + width: 4*root.fontFactor*osSettings.bigFontSize; height: 2*root.fontFactor*osSettings.bigFontSize; + radius: 0.5*mm + TextEdit{id:maxNewsText; + anchors.fill: parent + font.pointSize: osSettings.bigFontSize + verticalAlignment:TextEdit.AlignRight + color: osSettings.primaryTextColor + text:maxNews.value + selectByMouse: true + onTextChanged: { + Service.updateglobaloptions(root.db,"max_news",text); + } + } + } + + CheckBox{ + id: nsfwCheckbox + x: root.fontFactor*osSettings.bigFontSize + y: 14*root.fontFactor*osSettings.bigFontSize font.pointSize: osSettings.bigFontSize + text: qsTr("Hide #nsfw?") + checked:(globaloptions["hide_nsfw"]==1)?true:false onClicked: { - if(checked==true){ - Service.updateglobaloptions(root.db,"view_darkmode",0); - root.Material.theme=Material.System - } + toggle(); + if(nsfwCheckbox.checked==true){ + Service.updateglobaloptions(root.db,"hide_nsfw",0);nsfwCheckbox.checked=false; + } + else{ + Service.updateglobaloptions(root.db,"hide_nsfw",1);nsfwCheckbox.checked=true; + } } } - RadioButton{ - text: qsTr("Dark") - checked: (globaloptions["view_darkmode"]==1)?true:false - font.pointSize: osSettings.bigFontSize - onClicked: { - if(checked==true){ - Service.updateglobaloptions(root.db,"view_darkmode",1); - root.Material.theme=Material.Dark - } - } - } - RadioButton{ - text: qsTr("Light") - checked: (globaloptions["view_darkmode"]==2)?true:false - font.pointSize: osSettings.bigFontSize - onClicked: { - if(checked==true){ - Service.updateglobaloptions(root.db,"view_darkmode",2); - root.Material.theme=Material.Light - } - } - } - } - MButton { - anchors.right: parent.right; //anchors.rightMargin: mm; - anchors.top: parent.top - anchors.topMargin: 2*root.fontFactor*osSettings.bigFontSize - width: 2*root.fontFactor*osSettings.bigFontSize; - text: "?" - font.pointSize: osSettings.bigFontSize - onClicked:{ - rootstackView.push("qrc:/qml/configqml/InfoBox.qml"); + + // CheckBox{ + // id: darkmodeCheckbox + // tristate:true + // x: root.fontFactor*osSettings.bigFontSize + // y: 24*root.fontFactor*osSettings.bigFontSize + // font.pointSize: osSettings.bigFontSize + // text: qsTr("Dark Mode") + // checked:(globaloptions["view_darkmode"]==1)?true:false + // onClicked: { + // toggle(); + // if(darkmodeCheckbox.checked==true){ + // Service.updateglobaloptions(root.db,"view_darkmode",0);darkmodeCheckbox.checked=false; + // root.Material.theme=Material.Light + // } + // else{ + // Service.updateglobaloptions(root.db,"view_darkmode",1);darkmodeCheckbox.checked=true; + // root.Material.theme=Material.Dark + // } + // } + // } + Column{ + visible: osSettings.osType=="Android" + x: root.fontFactor*osSettings.bigFontSize + y: 18*root.fontFactor*osSettings.bigFontSize + Label{ + text: qsTr("Dark Mode") + font.pointSize: osSettings.systemFontSize} + + RadioButton{ + text: qsTr("System") + checked: (globaloptions["view_darkmode"]==0 || globaloptions["view_darkmode"]==undefined)?true:false + font.pointSize: osSettings.bigFontSize + onClicked: { + if(checked==true){ + Service.updateglobaloptions(root.db,"view_darkmode",0); + root.Material.theme=Material.System + } + } + } + RadioButton{ + text: qsTr("Dark") + checked: (globaloptions["view_darkmode"]==1)?true:false + font.pointSize: osSettings.bigFontSize + onClicked: { + if(checked==true){ + Service.updateglobaloptions(root.db,"view_darkmode",1); + root.Material.theme=Material.Dark + } + } + } + RadioButton{ + text: qsTr("Light") + checked: (globaloptions["view_darkmode"]==2)?true:false + font.pointSize: osSettings.bigFontSize + onClicked: { + if(checked==true){ + Service.updateglobaloptions(root.db,"view_darkmode",2); + root.Material.theme=Material.Light + } + } + } + } + + Column{ + x: root.fontFactor*osSettings.bigFontSize + y: 28*root.fontFactor*osSettings.bigFontSize + Label{ + text: qsTr("Toolbar Postion") + font.pointSize: osSettings.systemFontSize} + + RadioButton{ + text: qsTr("Top") + checked: (globaloptions["toolbarposition"]==0 || globaloptions["toolbarposition"]==undefined)?true:false + font.pointSize: osSettings.bigFontSize + onClicked: { + if(checked==true){ + Service.updateglobaloptions(root.db,"roottoolbarposition",0); + globaloptions.toolbarposition=0; + root.roottoolbar.position=ToolBar.Header + } + } + } + RadioButton{ + text: qsTr("Bottom") + checked: (globaloptions["toolbarposition"]==1)?true:false + font.pointSize: osSettings.bigFontSize + onClicked: { + if(checked==true){ + Service.updateglobaloptions(root.db,"roottoolbarposition",1); + globaloptions.toolbarposition=1; + root.roottoolbar.position=ToolBar.Footer + } + } + } + } + + + MButton { + anchors.right: parent.right; anchors.rightMargin: mm; + anchors.top: parent.top + anchors.topMargin: 3*root.fontFactor*osSettings.bigFontSize + //width: 2*root.fontFactor*osSettings.bigFontSize; + text: "?" + font.pointSize: osSettings.bigFontSize + onClicked:{ + rootstackView.push("qrc:/qml/configqml/InfoBox.qml"); + } } } // MButton{ diff --git a/source-linux/qml/configqml/ConfigPage.qml b/source-linux/qml/configqml/ConfigPage.qml index 9b2fdd8..7b762fb 100644 --- a/source-linux/qml/configqml/ConfigPage.qml +++ b/source-linux/qml/configqml/ConfigPage.qml @@ -30,10 +30,9 @@ // along with this program. If not, see . import QtQuick 2.11 -import QtQuick.Dialogs 1.2 +//import QtQuick.Dialogs 1.2 import QtQuick.Layouts 1.11 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/js/service.js" as Service import "qrc:/qml/configqml" import "qrc:/qml/genericqml" @@ -119,7 +118,7 @@ Page{ MButton{ id:closeButton // height: 2*root.fontFactor*osSettings.bigFontSize - width: 2*root.fontFactor*osSettings.bigFontSize; + //width: 2*root.fontFactor*osSettings.bigFontSize; anchors.top: parent.top anchors.topMargin:2*root.fontFactor*osSettings.bigFontSize anchors.right: parent.right diff --git a/source-linux/qml/configqml/ConfigStartPage.qml b/source-linux/qml/configqml/ConfigStartPage.qml index e0ca51c..ac56145 100644 --- a/source-linux/qml/configqml/ConfigStartPage.qml +++ b/source-linux/qml/configqml/ConfigStartPage.qml @@ -31,8 +31,6 @@ import QtQuick 2.11 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 - Page{ //anchors.fill: parent diff --git a/source-linux/qml/configqml/InfoBox.qml b/source-linux/qml/configqml/InfoBox.qml index 4677d96..010b346 100644 --- a/source-linux/qml/configqml/InfoBox.qml +++ b/source-linux/qml/configqml/InfoBox.qml @@ -31,7 +31,6 @@ import QtQuick 2.0 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/qml/genericqml" Page{ @@ -41,9 +40,9 @@ Page{ textFormat: Text.RichText width: root.width-mm font.pointSize: osSettings.systemFontSize - color:Material.primaryTextColor + color: osSettings.primaryTextColor wrapMode: Text.WrapAtWordBoundaryOrAnywhere - text: "Friendiqa v0.6.8
    Licensed under GPL 3 with the exception of OpenSSL
    "+ + text: "Friendiqa v0.6.9
    Licensed under GPL 3 with the exception of OpenSSL
    "+ "Website https://friendiqa.ma-nic.de
    "+ "Sourcecode: https://git.friendi.ca/LubuWest/Friendiqa
    "+ "Privacy Policy: http://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md
    "+ diff --git a/source-linux/qml/configqml/LeftDrawerScrollview.qml b/source-linux/qml/configqml/LeftDrawerScrollview.qml index 8a11dce..674f8db 100644 --- a/source-linux/qml/configqml/LeftDrawerScrollview.qml +++ b/source-linux/qml/configqml/LeftDrawerScrollview.qml @@ -51,6 +51,7 @@ ScrollView{ spacing: 0.7*root.fontFactor*osSettings.bigFontSize Label{ width:implicitWidth + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize text: "\uf085 "+ qsTr("Settings") MouseArea{ @@ -63,6 +64,7 @@ ScrollView{ Label{y: 2*root.fontFactor*osSettings.bigFontSize width:implicitWidth + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize text: "\uf2bb " + qsTr("Accounts") MouseArea{ @@ -75,6 +77,7 @@ ScrollView{ Label{y: 4*root.fontFactor*osSettings.bigFontSize width:implicitWidth + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize text: "\uf08b " +qsTr("Quit") MouseArea{ diff --git a/source-linux/qml/configqml/OSSettingsAndroid.qml b/source-linux/qml/configqml/OSSettingsAndroid.qml index 4c5b9de..8777672 100644 --- a/source-linux/qml/configqml/OSSettingsAndroid.qml +++ b/source-linux/qml/configqml/OSSettingsAndroid.qml @@ -31,16 +31,40 @@ import QtQuick.Window 2.0 import QtQuick 2.0 +import QtQuick.Controls.Material 2.12 + QtObject{ property int appWidth: Screen.desktopAvailableWidth property int appHeight: Screen.desktopAvailableHeight property int backKey: Qt.Key_Back //property string attachImageDir:filesystem.cameraPath+"/" property string osType: "Android" + property int systemFontSize: root.font.pointSize*1.1 property int bigFontSize: systemFontSize*1.3 property string imagePickQml: "ImagePicker" property string imagePicker:'import QtQuick 2.0; import "qrc:/qml/genericqml";'+ imagePickQml+'{multiple : true;onReady: {attachImageURLs.push(imageUrl);'+ 'attachImage(imageUrl)}}' + + Material.theme: Material.System + property color backgroundColor: Material.backgroundColor + property color backgroundDimColor:Material.backgroundDimColor + property color primaryTextColor: Material.primaryTextColor + property color secondaryTextColor: Material.secondaryTextColor + property color dialogColor: Material.dialogColor + property color accentColor: Material.accentColor + property color buttonColor: Material.buttonColor + + function setTheme(theme){ + if (theme=="system"){ + Material.theme=Material.System + } + else if (theme=="dark"){ + Material.theme=Material.Dark + } + else if (theme=="light"){ + Material.theme=Material.Light + } + } } diff --git a/source-linux/qml/configqml/OSSettingsLinux.qml b/source-linux/qml/configqml/OSSettingsLinux.qml index a758b26..1c1a8ea 100644 --- a/source-linux/qml/configqml/OSSettingsLinux.qml +++ b/source-linux/qml/configqml/OSSettingsLinux.qml @@ -30,7 +30,9 @@ // along with this program. If not, see . import QtQuick.Window 2.0 -import QtQuick 2.0 +import QtQuick 6.3 +import QtQuick.Controls 6.3 + QtObject{ property real appWidth: Screen.desktopAvailableWidth/4*3 property real appHeight: Screen.desktopAvailableHeight/4*3 @@ -40,4 +42,25 @@ QtObject{ property int bigFontSize: systemFontSize*1.5 //property string attachImageDir:filesystem.homePath+"/Pictures/" property string imagePickQml: "ImagePickerLinux" + //SystemPalette { id: sysPalette; colorGroup: SystemPalette.Active } + //property SystemPalette name: value + property color backgroundColor: palette.window + property color backgroundDimColor: palette.button + property color primaryTextColor: palette.windowText + property color secondaryTextColor: palette.buttonText + property color dialogColor: palette.base + property color accentColor: palette.highlightedText + property color buttonColor: palette.button + + function setTheme(theme){ + if (theme=="system"){ + //Material.theme=Material.System + } + else if (theme=="dark"){ + //Material.theme=Material.Dark + } + else if (theme=="light"){ + //Material.theme=Material.Light + } + } } diff --git a/source-linux/qml/configqml/SyncComponent.qml b/source-linux/qml/configqml/SyncComponent.qml index 473a04d..388d72e 100644 --- a/source-linux/qml/configqml/SyncComponent.qml +++ b/source-linux/qml/configqml/SyncComponent.qml @@ -32,12 +32,11 @@ import QtQuick 2.11 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/qml/configqml" import "qrc:/js/service.js" as Service Rectangle{ - color: Material.dialogColor + color: osSettings.dialogColor property string adapter: "" width: parent.width height: 4*root.fontFactor*osSettings.bigFontSize diff --git a/source-linux/qml/configqml/SyncConfig.qml b/source-linux/qml/configqml/SyncConfig.qml index e01dff9..7e0378d 100644 --- a/source-linux/qml/configqml/SyncConfig.qml +++ b/source-linux/qml/configqml/SyncConfig.qml @@ -31,7 +31,6 @@ import QtQuick 2.11 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/qml/configqml" import "qrc:/qml/genericqml" import "qrc:/js/service.js" as Service @@ -59,14 +58,14 @@ Page{ Rectangle{ x: root.fontFactor*osSettings.bigFontSize; y:4*root.fontFactor*osSettings.bigFontSize; width: 4*root.fontFactor*osSettings.bigFontSize; height: 2*root.fontFactor*osSettings.bigFontSize; - color: Material.dialogColor + color: osSettings.dialogColor radius: 0.5*mm TextEdit{ id: messageIntervalField anchors.fill: parent font.pointSize: osSettings.bigFontSize verticalAlignment:TextEdit.AlignRight - color: Material.primaryTextColor + color: osSettings.primaryTextColor text:messageIntervalSlider.value focus: true selectByMouse: true diff --git a/source-linux/qml/contactqml/ContactsSearchPage.qml b/source-linux/qml/contactqml/ContactsSearchPage.qml index 3096fbc..85dce63 100644 --- a/source-linux/qml/contactqml/ContactsSearchPage.qml +++ b/source-linux/qml/contactqml/ContactsSearchPage.qml @@ -31,7 +31,6 @@ import QtQuick 2.11 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import QtQuick.Layouts 1.11 import QtQuick.LocalStorage 2.0 import "qrc:/js/helper.js" as Helperjs @@ -115,7 +114,7 @@ Page{ x:1.5*root.fontFactor*osSettings.systemFontSize; width:root.width-(7*root.fontFactor*osSettings.systemFontSize+mm); height: 2.5*root.fontFactor*osSettings.systemFontSize; - color:Material.dialogColor + color:osSettings.dialogColor selfdestroying:false } @@ -132,10 +131,10 @@ Page{ Rectangle { width: contactsSearchView.width height: childrenRect.height - color: Material.backgroundColor + color: osSettings.backgroundColor required property string section Text { - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor text: parent.section font.bold: true font.pointSize: osSettings.bigFontSize diff --git a/source-linux/qml/contactqml/FriendsListTab.qml b/source-linux/qml/contactqml/FriendsListTab.qml index 71c562e..b7be66c 100644 --- a/source-linux/qml/contactqml/FriendsListTab.qml +++ b/source-linux/qml/contactqml/FriendsListTab.qml @@ -31,7 +31,6 @@ import QtQuick 2.11 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import QtQuick.Layouts 1.11 import QtQuick.LocalStorage 2.0 import "qrc:/js/helper.js" as Helperjs @@ -146,14 +145,15 @@ Item{ Rectangle { id:searchComponent x: mm; y:mm - color: Material.backgroundColor + color: osSettings.backgroundColor radius:0.5*mm width: 10*root.fontFactor*osSettings.bigFontSize height: 2*root.fontFactor*osSettings.bigFontSize TextField { id: searchText - color: Material.primaryTextColor + color: osSettings.primaryTextColor focus: true + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize wrapMode: Text.Wrap anchors.fill:parent @@ -193,10 +193,10 @@ Item{ Rectangle { width: friendsView.width height: childrenRect.height - color: Material.backgroundColor + color: osSettings.backgroundColor required property string section Text { - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor text: parent.section font.bold: true font.pointSize: osSettings.bigFontSize @@ -208,11 +208,12 @@ Item{ Component { id:headerComponent Rectangle{ - color: Material.dialogColor + color: osSettings.dialogColor width:friendsView.width height:6*mm Text{ - color: Material.primaryTextColor + color: osSettings.primaryTextColor + font.family: fontAwesome.name font.pointSize: osSettings.bigFontSize anchors.centerIn: parent text:"\uf234" diff --git a/source-linux/qml/contactqml/FriendsTab.qml b/source-linux/qml/contactqml/FriendsTab.qml index d8b7e9e..d163c73 100644 --- a/source-linux/qml/contactqml/FriendsTab.qml +++ b/source-linux/qml/contactqml/FriendsTab.qml @@ -31,7 +31,6 @@ import QtQuick 2.11 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import QtQuick.Layouts 1.11 import QtQuick.LocalStorage 2.0 import "qrc:/js/helper.js" as Helperjs @@ -42,7 +41,7 @@ import "qrc:/qml/genericqml" Rectangle { y:1 - color: Material.backgroundColor//"white" + color: osSettings.backgroundColor function showContactdetails(contact){ // rootstack.currentIndex=0; diff --git a/source-linux/qml/contactqml/GroupComponent.qml b/source-linux/qml/contactqml/GroupComponent.qml index b7bc434..99d4e81 100644 --- a/source-linux/qml/contactqml/GroupComponent.qml +++ b/source-linux/qml/contactqml/GroupComponent.qml @@ -31,7 +31,6 @@ import QtQuick 2.11 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/js/helper.js" as Helperjs import "qrc:/js/news.js" as Newsjs import "qrc:/qml/genericqml" @@ -56,7 +55,7 @@ Item { height: parent.height-mm radius: 0.5*mm border.color: "grey" - color:Material.backgroundColor + color:osSettings.backgroundColor Rectangle{ id:namelabelRect @@ -65,13 +64,13 @@ Item { width: wrapper.width-2 height: 3*root.fontFactor*osSettings.bigFontSize //border.color: "light grey" - color:Material.backgroundColor + color: osSettings.backgroundColor TextInput { id: namelabel anchors.fill: parent readOnly: true text: group.new?"":group.groupname - color: Material.secondaryTextColor//"#303030" + color: osSettings.secondaryTextColor//"#303030" font.pointSize: osSettings.bigFontSize } } @@ -122,7 +121,7 @@ Item { Rectangle{ id: detailsrectangle anchors.top: namelabelRect.bottom - color: Material.backgroundColor + color: osSettings.backgroundColor //anchors.topMargin: mm x:mm width: parent.width-2*mm diff --git a/source-linux/qml/contactqml/ProfileComponent.qml b/source-linux/qml/contactqml/ProfileComponent.qml index afe5c36..3eaded9 100644 --- a/source-linux/qml/contactqml/ProfileComponent.qml +++ b/source-linux/qml/contactqml/ProfileComponent.qml @@ -31,7 +31,6 @@ import QtQuick 2.0 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/qml/genericqml" import "qrc:/js/service.js" as Service @@ -39,7 +38,7 @@ Rectangle { // width:parent.width-2*mm // height:parent.height-14*mm anchors.fill:parent - color: Material.backgroundColor//color:"white" + color: osSettings.backgroundColor property var profile:({}) property var attachImageURLs:[] property var createdAtDate: new Date(profile.friendica_owner.created_at) @@ -176,6 +175,7 @@ Rectangle { Text { id:phototext z:4 + font.family: fontAwesome.name text: "\uf040" width:5*mm anchors.top: photoImage.top @@ -206,7 +206,7 @@ Rectangle { anchors.topMargin: 0 anchors.left: photoImage.left wrapMode: Text.Wrap - color: Material.secondaryTextColor//"#303030" + color: osSettings.secondaryTextColor font.pointSize: osSettings.bigFontSize anchors.top: photoImage.bottom } @@ -217,13 +217,13 @@ Rectangle { Rectangle{ id:profileRect width:profileView.width - color: Material.backgroundColor + color: osSettings.backgroundColor height: 5*mm+profiletextfield.height Text{ y:mm font.pointSize: osSettings.systemFontSize text:""+qsTr("profile id")+": "+profileid+"
    " - color:Material.primaryTextColor//"black" + color:osSettings.primaryTextColor } Text{ id:profiletextfield @@ -233,7 +233,7 @@ Rectangle { wrapMode: Text.Wrap font.pointSize: osSettings.systemFontSize text:profiletext - color:Material.primaryTextColor + color: osSettings.primaryTextColor onLinkActivated: Qt.openUrlExternally(link) } } @@ -242,7 +242,7 @@ Rectangle { id:textcomponent Text{ id:namelabeltext - color:Material.primaryTextColor + color: osSettings.primaryTextColor width: namelabelflickable.width height: implicitHeight font.pointSize: osSettings.bigFontSize diff --git a/source-linux/qml/friendiqa.qml b/source-linux/qml/friendiqa.qml index 3893f30..c47c75c 100644 --- a/source-linux/qml/friendiqa.qml +++ b/source-linux/qml/friendiqa.qml @@ -33,7 +33,7 @@ import QtQuick 2.5 import QtQuick.LocalStorage 2.0 import QtQuick.Window 2.0 import QtQuick.Controls 2.4 -import QtQuick.Controls.Material 2.12 + import QtQuick.Layouts 1.11 import QSystemTrayIcon 1.0 import "qrc:/js/news.js" as Newsjs @@ -45,7 +45,7 @@ ApplicationWindow{ id:root title: "Friendiqa" property var globaloptions: Service.readGO(db) - property QtObject osSettings: {var tmp=Qt.createComponent("qrc:/qml/configqml/OSSettingsLinux.qml");return tmp.createObject(root)} + property QtObject osSettings: {var tmp=Qt.createComponent("qrc:/qml/configqml/OSSettings"+filesystem.osType+".qml");return tmp.createObject(root)} width: globaloptions.hasOwnProperty("appWidth")?globaloptions.appWidth:osSettings.appWidth height:globaloptions.hasOwnProperty("appHeight")?globaloptions.appHeight:osSettings.appHeight visible: filesystem.Visibility// true @@ -75,10 +75,6 @@ ApplicationWindow{ property var contactposts:[] property bool imagePicking: false - - Material.theme: Material.System - color: Material.backgroundColor - function onLoginChanged(login){ if(login=="" || login==null){rootstackView.push("qrc:/qml/configqml/AccountPage.qml")} else{ @@ -187,16 +183,18 @@ ApplicationWindow{ else {rootstack.currentIndex=0;close.accepted=false} } - Rectangle{ anchors.fill: parent - color: Material.backgroundColor + color: osSettings.backgroundColor } - header: ToolBar{ + footer: ToolBar{ + id: roottoolbar + //position: ToolBar.Footer//globaloptions.roottoolbarposition==0 || globaloptions.roottoolbarposition==undefined?ToolBar.Header:ToolBar.Footer + width:root.width background: Rectangle{ anchors.fill: parent - color: Material.backgroundDimColor + color: osSettings.backgroundDimColor } RowLayout{ anchors.fill: parent @@ -209,38 +207,42 @@ ApplicationWindow{ try{while(rootstackView.depth>1){rootstackView.pop()}}catch(e){} } TabButton { + font.family: fontAwesome.name text: "\uf03a" background:Rectangle{ anchors.fill: parent - color: Material.backgroundDimColor + color: osSettings.backgroundDimColor } ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Posts") onDoubleClicked: {newstypeSignal("refresh")} } TabButton { + font.family: fontAwesome.name text: "\uf0c0" background:Rectangle{ anchors.fill: parent - color: Material.backgroundDimColor + color: osSettings.backgroundDimColor } ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Contacts") } TabButton { + font.family: fontAwesome.name text: "\uf03e" background:Rectangle{ anchors.fill: parent - color: Material.backgroundDimColor + color: osSettings.backgroundDimColor } ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Photos") } TabButton { + font.family: fontAwesome.name text: "\uf073" background:Rectangle{ anchors.fill: parent - color: Material.backgroundDimColor + color: osSettings.backgroundDimColor } ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Calendar") @@ -249,11 +251,12 @@ ApplicationWindow{ } } - -StackView{id:rootstackView - width:root.width - height: root.height - initialItem: StackLayout{ + StackView{id:rootstackView + //y:roottoolbar.height + //anchors.fill: parent + width:root.width + height: root.height-roottoolbar.contentHeight + initialItem: StackLayout{ id:rootstack width:rootstackView.width height: rootstackView.height @@ -283,7 +286,6 @@ StackView{id:rootstackView } } - QSystemTrayIcon { id: systemTray visible: false @@ -299,7 +301,7 @@ StackView{id:rootstackView } } Component.onCompleted: { - icon = iconTray + icon = root.color. import QtQuick 2.0 -import QtQuick.Controls.Material 2.12 Rectangle{ id: blueButton width: Math.max(mainText.width+2*mm,5*mm) @@ -48,7 +47,7 @@ Rectangle{ Text{ id:mainText - color: Material.primaryTextColor//"black" + color: osSettings.primaryTextColor anchors.centerIn: parent width: contentWidth height: contentHeight @@ -67,7 +66,7 @@ Rectangle{ states: [ State { name: "Pressed" - PropertyChanges { target: blueButton; color: Material.buttonColor} } + PropertyChanges { target: blueButton; color: osSettings.buttonColor} } ] transitions: [ Transition { to:"*" diff --git a/source-linux/qml/genericqml/ContactComponent.qml b/source-linux/qml/genericqml/ContactComponent.qml index e9542a6..2342ef5 100644 --- a/source-linux/qml/genericqml/ContactComponent.qml +++ b/source-linux/qml/genericqml/ContactComponent.qml @@ -31,7 +31,6 @@ import QtQuick 2.0 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/qml/genericqml" Item { @@ -46,8 +45,8 @@ Item { width:parent.width height: parent.height radius: 0.5*mm - border.color: Material.backgroundDimColor - color: Material.backgroundColor + border.color: osSettings.backgroundDimColor + color: osSettings.backgroundColor Image { id: photoImage x:0.5*mm @@ -70,7 +69,7 @@ Item { height: 1.1*root.fontFactor*osSettings.bigFontSize text: contact.name elide: contentWidth>wrapper.width-4*osSettings.systemFontSize?Text.ElideRight:Text.ElideNone - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor font.pointSize: osSettings.bigFontSize } Label { @@ -79,7 +78,7 @@ Item { height: 1.1*root.fontFactor*osSettings.bigFontSize text: "(@"+contact.screen_name+")" elide: contentWidth>wrapper.width-4*root.fontFactor*osSettings.systemFontSize?Text.ElideRight:Text.ElideNone - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor font.pointSize: osSettings.bigFontSize } Label { @@ -89,7 +88,7 @@ Item { maximumLineCount:2 text: Qt.atob(contact.description)!=""?contact.description:"" elide:Text.ElideRight - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor font.pointSize: osSettings.systemFontSize } } diff --git a/source-linux/qml/genericqml/DrawerAccountComponent.qml b/source-linux/qml/genericqml/DrawerAccountComponent.qml index c01ced0..a8c9f1a 100644 --- a/source-linux/qml/genericqml/DrawerAccountComponent.qml +++ b/source-linux/qml/genericqml/DrawerAccountComponent.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.12 +import QtQuick 2.15 +import QtQuick.Controls 6.3 import "qrc:/qml/genericqml" Item { @@ -50,6 +50,7 @@ Item { Label{ y:2*root.fontFactor*osSettings.bigFontSize width:parent.width + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize text: "\uf021 " + qsTr("Refresh") MouseArea{ @@ -69,6 +70,7 @@ Item { Label{ y:3.5*root.fontFactor*osSettings.bigFontSize width:parent.width + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize font.bold: account.username==login.username && currentnewstabstatus=="Timeline" text: "\uf1da " + qsTr("Timeline") @@ -87,6 +89,7 @@ Item { Label{ y:5*root.fontFactor*osSettings.bigFontSize width:parent.width + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize font.bold: account.username==login.username && currentnewstabstatus=="Conversations" text: "\uf086 " + qsTr("Conversations") @@ -107,6 +110,7 @@ Item { Label{ y:6.5*root.fontFactor*osSettings.bigFontSize width:parent.width + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize font.bold: account.username==login.username && currentnewstabstatus=="Replies" text: "\uf0ec " + qsTr("Replies") @@ -125,6 +129,7 @@ Item { Label{ y:8*root.fontFactor*osSettings.bigFontSize width:parent.width + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize font.bold: account.username==login.username && currentnewstabstatus=="DirectMessages" text: "\uf0e0 " + qsTr("Direct Messages") @@ -141,6 +146,7 @@ Item { Label{ y:9.5*root.fontFactor*osSettings.bigFontSize width:parent.width + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize font.bold: account.username==login.username && currentnewstabstatus=="Favorites" text: "\uf005 " + qsTr("Favorites") @@ -159,6 +165,7 @@ Item { Label{ y:11*root.fontFactor*osSettings.bigFontSize width:parent.width + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize font.bold: account.username==login.username && currentnewstabstatus=="Public Timeline" text: "\uf0ac " + qsTr("Public Timeline") @@ -177,6 +184,7 @@ Item { Label{ y:12.5*root.fontFactor*osSettings.bigFontSize width:parent.width + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize font.bold: account.username==login.username && currentnewstabstatus=="Groupnews" text: "\uf0c0 " + qsTr("Group news") @@ -195,6 +203,7 @@ Item { Label{ y:14*root.fontFactor*osSettings.bigFontSize width:parent.width + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize font.bold: account.username==login.username && currentnewstabstatus=="Search" text: "\uf002 " + qsTr("Search") @@ -213,6 +222,7 @@ Item { Label{ y:15.5*root.fontFactor*osSettings.bigFontSize width:parent.width + font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize font.bold: account.username==login.username && currentnewstabstatus=="Notifications" text: "\uf0f3 " + qsTr("Notifications") diff --git a/source-linux/qml/genericqml/ImagePicker.qml b/source-linux/qml/genericqml/ImagePicker.qml index d414c1f..f408c82 100644 --- a/source-linux/qml/genericqml/ImagePicker.qml +++ b/source-linux/qml/genericqml/ImagePicker.qml @@ -37,7 +37,8 @@ Item { Connections { target: SystemDispatcher - onDispatched: { + //onDispatched: { + function onDispatched(type, message){ if ((type === m_CHOSEN_MESSAGE) && (root.imagePicking==true)) { var h=[]; for (var n in message.imageUrls){ diff --git a/source-linux/qml/genericqml/ImagePickerLinux.qml b/source-linux/qml/genericqml/ImagePickerLinux.qml index 50aa4aa..5bbf6e8 100644 --- a/source-linux/qml/genericqml/ImagePickerLinux.qml +++ b/source-linux/qml/genericqml/ImagePickerLinux.qml @@ -30,9 +30,8 @@ // along with this program. If not, see . import QtQuick 2.12 -import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 -import QtQuick.Dialogs 1.2 +import QtQuick.Controls 6.3 +import QtQuick.Dialogs 6.3 import Qt.labs.folderlistmodel 2.12 import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs @@ -81,11 +80,12 @@ Item{ FileDialog { id: imageFileDialog title: "Please choose a file" - folder: shortcuts.pictures - selectFolder: false - selectMultiple: true + currentFolder: StandardPaths.standardLocations(StandardPaths.PicturesLocation)[0] + fileMode: FileDialog.OpenFiles + //selectMultiple: true onAccepted: { - imageUrl=imageFileDialog.fileUrls.toString(); + //imageUrl=imageFileDialog.fileUrls.toString(); + imageUrl=imageFileDialog.selectedFiles.toString(); ready(); } } diff --git a/source-linux/qml/genericqml/LeftDrawerLinux.qml b/source-linux/qml/genericqml/LeftDrawerLinux.qml index dae1e0f..cf6917b 100644 --- a/source-linux/qml/genericqml/LeftDrawerLinux.qml +++ b/source-linux/qml/genericqml/LeftDrawerLinux.qml @@ -31,7 +31,6 @@ import QtQuick 2.0 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/qml/configqml" Rectangle{ @@ -40,7 +39,7 @@ Rectangle{ // height: root.height-bar.height //y: bar.height signal opened() - color: Material.backgroundColor + color: osSettings.backgroundColor LeftDrawerScrollview{ width:parent.width-mm @@ -51,7 +50,7 @@ Rectangle{ width: 1 height: leftDrawer.height anchors.right: leftDrawer.right - color: Material.dialogColor//"#EEEEEE" + color: osSettings.dialogColor } //Component.onCompleted: {opened();} } diff --git a/source-linux/qml/genericqml/MButton.qml b/source-linux/qml/genericqml/MButton.qml index 6999941..c4e4e7b 100644 --- a/source-linux/qml/genericqml/MButton.qml +++ b/source-linux/qml/genericqml/MButton.qml @@ -28,18 +28,18 @@ // // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.6 -import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 +import QtQuick 2.9 +import QtQuick.Controls 6.3 Button{ id: mButton property alias color: bg.color - width: Math.max(text.width+2*mm,2*root.fontFactor*osSettings.bigFontSize) + width: Math.max(implicitContentWidth+2*mm,3*root.fontFactor*osSettings.bigFontSize) //radius: mm - height: 2*root.fontFactor*osSettings.bigFontSize - //color: Material.grey + height: 2.5*root.fontFactor*osSettings.bigFontSize + //color: Material.foreground + font.family: fontAwesome.name font.pointSize: osSettings.bigFontSize //highlighted:true - background: Rectangle{id:bg;color: Material.dialogColor//"#F3F3F3"; + background: Rectangle{id:bg;color: osSettings.dialogColor; radius: 0.5*mm} } diff --git a/source-linux/qml/genericqml/PermissionDialog.qml b/source-linux/qml/genericqml/PermissionDialog.qml index b215956..cf0ad98 100644 --- a/source-linux/qml/genericqml/PermissionDialog.qml +++ b/source-linux/qml/genericqml/PermissionDialog.qml @@ -30,14 +30,13 @@ // along with this program. If not, see . import QtQuick 2.11 -import QtQuick.Controls.Material 2.12 import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" Rectangle{ id:permissionDialog - color: Material.backgroundColor + color: osSettings.backgroundColor // x: mm width: parent.width-5*mm height:root.height/3 @@ -66,7 +65,7 @@ Rectangle{ Text{ //cid not working in Friendica 02/2022 x:0.5*mm y:0.5*mm - color: Material.primaryTextColor + color: osSettings.primaryTextColor text: qsTr("Friends") } ListView { @@ -86,7 +85,7 @@ Rectangle{ id:contactItem Rectangle{ id:contactitemRect - color: Material.backgroundColor + color: osSettings.backgroundColor width:contactView.width height: 5*mm radius: 0.5*mm @@ -94,10 +93,10 @@ Rectangle{ onContactstatusChanged:{ if(contactstatus=="positive"){contactitemRect.color="light green"} else if (contactstatus=="negative"){contactitemRect.color= "red"} - else{contactitemRect.color= Material.backgroundColor}} - border.color:Material.frameColor + else{contactitemRect.color= osSettings.backgroundColor}} + //border.color:Material.frameColor Text{ - color: Material.primaryTextColor + color: osSettings.primaryTextColor text:contact.screen_name } MouseArea{ @@ -126,7 +125,7 @@ Rectangle{ } } Text{ - color: Material.primaryTextColor + color: osSettings.primaryTextColor x:contactView.width+2*mm y:0.5*mm text: qsTr("Groups") @@ -155,11 +154,11 @@ Rectangle{ onGroupstatusChanged: {if(groupstatus=="positive"){groupitemRect.color="light green"} else if (groupstatus=="negative"){groupitemRect.color= "red"} - else{groupitemRect.color= Material.backgroundColor}} - color: Material.backgroundColor - border.color: Material.frameColor + else{groupitemRect.color= osSettings.backgroundColor}} + color: osSettings.backgroundColor + //border.color: Material.frameColor Text{ - color: Material.primaryTextColor + color: osSettings.primaryTextColor text:group.groupname } MouseArea{ diff --git a/source-linux/qml/genericqml/Search.qml b/source-linux/qml/genericqml/Search.qml index 93b85f0..5fc13d6 100644 --- a/source-linux/qml/genericqml/Search.qml +++ b/source-linux/qml/genericqml/Search.qml @@ -31,12 +31,11 @@ import QtQuick 2.7 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/qml/genericqml" Rectangle { id:searchComponent - color: Material.backgroundColor + color: osSettings.backgroundColor radius:0.5*mm property bool selfdestroying:false /* anchors.left: parent.left @@ -48,7 +47,7 @@ Rectangle { TextInput { id: searchText - color: Material.primaryTextColor + color: osSettings.primaryTextColor focus: true font.pointSize: osSettings.bigFontSize wrapMode: Text.Wrap diff --git a/source-linux/qml/newsqml/BlockUser.qml b/source-linux/qml/newsqml/BlockUser.qml index db5cd4d..e3acfac 100644 --- a/source-linux/qml/newsqml/BlockUser.qml +++ b/source-linux/qml/newsqml/BlockUser.qml @@ -31,7 +31,6 @@ import QtQuick 2.0 import QtQuick.Controls 2.15 -import QtQuick.Controls.Material 2.12 import "qrc:/js/helper.js" as Helperjs Dialog { diff --git a/source-linux/qml/newsqml/ContactPage.qml b/source-linux/qml/newsqml/ContactPage.qml index da4173c..3151d8d 100644 --- a/source-linux/qml/newsqml/ContactPage.qml +++ b/source-linux/qml/newsqml/ContactPage.qml @@ -32,7 +32,6 @@ import QtQuick 2.0 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/js/helper.js" as Helperjs import "qrc:/js/news.js" as Newsjs import "qrc:/js/service.js" as Service @@ -134,9 +133,9 @@ Page { Component { id: contactHeader Rectangle{ - border.color: Material.backgroundDimColor + border.color: osSettings.backgroundDimColor border.width: 1 - color: Material.backgroundColor + color: osSettings.backgroundColor width:contactView.width height: contactView.width<35*root.fontFactor*osSettings.systemFontSize?(profileImage.height+namelabel.height+detailtext.height+7*mm):Math.max(profileImage.height,(buttonflow.height+namelabel.height+detailtext.height))+7*mm property var createdAtDate: new Date(contact.created_at) @@ -319,7 +318,7 @@ Page { height: implicitHeight text:contact.name+" (@"+contact.screen_name+")" wrapMode: Text.Wrap - color: Material.primaryTextColor + color: osSettings.primaryTextColor font.pointSize: 1.2*osSettings.bigFontSize font.family: "Noto Sans" anchors.top: contactView.width<35*root.fontFactor*osSettings.systemFontSize?profileImage.bottom:buttonflow.bottom @@ -337,7 +336,7 @@ Page { font.family: "Noto Sans" textFormat:Text.RichText wrapMode: Text.Wrap - color: Material.primaryTextColor + color: osSettings.primaryTextColor text:""+qsTr("Description")+": "+(Qt.atob(contact.description)!=""?contact.description:"")+"
    "+qsTr("Location")+": "+contact.location+"
    "+qsTr("Posts")+": "+contact.statuses_count+ "
    "+qsTr("URL")+": "+contact.url+"
    "+ ""+qsTr("Created at")+": "+createdAtDate.toLocaleString(Qt.locale())+"
    "+ diff --git a/source-linux/qml/newsqml/FriendicaActivities.qml b/source-linux/qml/newsqml/FriendicaActivities.qml index 9551137..78538f6 100644 --- a/source-linux/qml/newsqml/FriendicaActivities.qml +++ b/source-linux/qml/newsqml/FriendicaActivities.qml @@ -31,15 +31,14 @@ // List of people from Friendica Activities import QtQuick 2.0 -import QtQuick.Controls.Material 2.12 import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" Rectangle { id:activitiesRectangle property var activitymembers - color: Material.dialogColor - border.color: Material.frameColor + color: osSettings.dialogColor + //border.color: osSettings.frameColor radius:0.5*mm width:root.width/2 height:Math.min(root.height/2,(10*mm+6*activitymembers.length*mm)) @@ -61,8 +60,8 @@ Rectangle { Component { id:activitiesContact Rectangle{ - border.color: Material.frameColor - color: Material.backgroundColor + //border.color: Material.frameColor + color: osSettings.backgroundColor border.width: 1 radius:0.5*mm width:parent.width @@ -77,7 +76,7 @@ Rectangle { onStatusChanged: if (contactImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} } Text{ - color: Material.primaryTextColor + color: osSettings.primaryTextColor font.pointSize: osSettings.bigFontSize anchors.left: contactImage.right anchors.margins: 1*mm diff --git a/source-linux/qml/newsqml/Hashtag.qml b/source-linux/qml/newsqml/Hashtag.qml index 8490d7c..a171e7c 100644 --- a/source-linux/qml/newsqml/Hashtag.qml +++ b/source-linux/qml/newsqml/Hashtag.qml @@ -30,11 +30,10 @@ // along with this program. If not, see . import QtQuick 2.0 -import QtQuick.Controls.Material 2.12 Rectangle { id:hashtagRectangle - color:Material.dialogColor + color: osSettings.dialogColor property alias text: hashtagText.text radius:0.3*mm width:hashtagText.contentWidth+mm @@ -42,7 +41,7 @@ Rectangle { Text{ id:hashtagText font.pointSize: osSettings.systemFontSize - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor anchors.centerIn: parent anchors.margins: 0.5*mm } diff --git a/source-linux/qml/newsqml/MessageImageUploadDialog.qml b/source-linux/qml/newsqml/MessageImageUploadDialog.qml index 74e7b7f..99f12ab 100644 --- a/source-linux/qml/newsqml/MessageImageUploadDialog.qml +++ b/source-linux/qml/newsqml/MessageImageUploadDialog.qml @@ -29,9 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.5 -import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 +import QtQuick 2.12 +import QtQuick.Controls 6.3 import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -177,7 +176,7 @@ Page{ Rectangle{ width: Math.max(10*root.fontFactor*osSettings.bigFontSize,uploadImage.width) height:imageUploadView.height-4*root.fontFactor*osSettings.bigFontSize - color: Material.backgroundColor + color: osSettings.backgroundColor Image{ id: uploadImage width: parent.width //root.width/2-mm @@ -196,7 +195,7 @@ Page{ anchors.right: uploadImage.right color: "black" opacity: 0.5 - Text{anchors.centerIn:parent;text: "\uf01e";color: "white"} + Text{anchors.centerIn:parent;font.family: fontAwesome.name;text: "\uf01e";color: "white"} MouseArea{ anchors.fill:parent; onClicked:{ @@ -215,7 +214,7 @@ Page{ anchors.left: uploadImage.left color: "black" opacity: 0.5 - Text{anchors.centerIn:parent;text: "\uf00d";color: "white"} + Text{anchors.centerIn:parent;font.family: fontAwesome.name; text: "\uf00d";color: "white"} MouseArea{ anchors.fill:parent; onClicked:{ @@ -238,7 +237,7 @@ Page{ Rectangle{ id:descriptionRectangle - color: Material.backgroundColor + color: osSettings.backgroundColor border.color: "grey" anchors.top: uploadImage.bottom anchors.topMargin: mm @@ -262,7 +261,7 @@ Page{ BlueButton{ width: 5*root.fontFactor*osSettings.bigFontSize height:imageUploadView.height-3*root.fontFactor*osSettings.bigFontSize - color: Material.backgroundColor + color: osSettings.backgroundColor border.color: "transparent" text:"\u002b" fontSize: 3*osSettings.bigFontSize diff --git a/source-linux/qml/newsqml/MessageSend.qml b/source-linux/qml/newsqml/MessageSend.qml index af087d6..6b7ca44 100644 --- a/source-linux/qml/newsqml/MessageSend.qml +++ b/source-linux/qml/newsqml/MessageSend.qml @@ -31,25 +31,30 @@ // message.qml // message with buttons -import QtQuick 2.4 -import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Window 2.0; +import QtQuick.Dialogs 6.4; +//import Qt.labs.platform 6.3 as Platform +import io.qt.examples.texteditor 1.0; import "qrc:/js/helper.js" as Helperjs import "qrc:/js/smiley.js" as Smileyjs import "qrc:/js/news.js" as Newsjs import "qrc:/qml/genericqml" import "qrc:/qml/newsqml" -Rectangle{ - color:Material.dialogColor - width:parent.width - height: messageColumn.height+2*mm - id:messageSend - visible:conversation || (newstab.newstabstatus!="Search")?true:false +Window{ + color: osSettings.backgroundColor + width: parent.width + height: parent.height//messageColumn.height+2*mm + id: messageSend + property bool wideScreen : width>height + // visible: conversation || (newstab.newstabstatus!="Search")?true:false property string parentId: "" - property bool textfocus: false - property bool conversation: false + //property bool textfocus: false + //property bool conversation: false property string reply_to_user:"" + property string windowstate:"" property alias bodyMessage: bodyField.text property var media_ids:[] property var contacts: [] @@ -59,15 +64,15 @@ Rectangle{ property var group_allow:login.hasOwnProperty("permissions")?login.permissions[2]:[] property var group_deny:login.hasOwnProperty("permissions")?login.permissions[3]:[] - function directmessagePrepare(friend){ - messageSend.state="active"; - reply_to_user=friend.screen_name; - receiverLabel.text=friend.screen_name; - } + // function directmessagePrepare(friend){ + // messageSend.state="active"; + // reply_to_user=friend.screen_name; + // receiverLabel.text=friend.screen_name; + // } function sendUrls(urls){ - attachImage(urls); - messageSend.state="active"; + attachImage(urls); + messageSend.state="active"; } function sendtext(text){ @@ -88,24 +93,26 @@ Rectangle{ } function statusUpdate(title,status,in_reply_to_status_id) { + print("status: "+status); //xhr.url= login.server + "/api/statuses/update.json"; try{newsBusy.running=true;conversationBusy.running=true}catch(e){} xhr.setAccount(login); xhr.setApi("/api/statuses/update"); xhr.setParam("source", "Friendiqa"); - xhr.setParam("htmlstatus", status); - if (parentId!="") {xhr.setParam("in_reply_to_status_id", parentId)}; + xhr.setParam("status", status); + if (parentId!="") {xhr.setParam("in_reply_to_status_id", in_reply_to_status_id)}; if (title!=="") {xhr.setParam("title", title)}; -// if (group_allow.length>0) {xhr.setParam("group_allow", Helperjs.cleanArray(group_allow))}; -// if (group_deny.length>0) {xhr.setParam("group_deny", Helperjs.cleanArray(group_deny))}; -// if (contact_allow.length>0) {xhr.setParam("contact_allow", Helperjs.cleanArray(contact_allow))}; -// if (contact_deny.length>0) {xhr.setParam("contact_deny", Helperjs.cleanArray(contact_deny))}; + // if (group_allow.length>0) {xhr.setParam("group_allow", Helperjs.cleanArray(group_allow))}; + // if (group_deny.length>0) {xhr.setParam("group_deny", Helperjs.cleanArray(group_deny))}; + // if (contact_allow.length>0) {xhr.setParam("contact_allow", Helperjs.cleanArray(contact_allow))}; + // if (contact_deny.length>0) {xhr.setParam("contact_deny", Helperjs.cleanArray(contact_deny))}; if (media_ids.length>0) { xhr.setParam("media_ids", media_ids.join()); } xhr.post(); Newsjs.storeHashtags(login,db,status,root); media_ids=[] + messageSend.close() } function dmUpdate(title,text,replyto,screen_name) { @@ -116,20 +123,21 @@ Rectangle{ xhr.setParam("screen_name", screen_name); if (parentId!="") {xhr.setParam("replyto", replyto)}; xhr.post(); + messageSend.close() } - function setParent(newsitemobject){ - if (newsitemobject!=""){ - messageSend.state="conversation" - messageSend.reply_to_user=newsitemobject.user.screen_name; - messageSend.parentId=newsitemobject.id - } else { - messageSend.state=null; - messageSend.reply_to_user=""; - messageSend.parentId=""; - bodyField.text=""; - } - } + // function setParent(newsitemobject){ + // if (newsitemobject!=""){ + // messageSend.state="conversation" + // messageSend.reply_to_user=newsitemobject.user.screen_name; + // messageSend.parentId=newsitemobject.id + // } else { + // messageSend.state=null; + // messageSend.reply_to_user=""; + // messageSend.parentId=""; + // bodyField.text=""; + // } + // } function contactmenu(letter){ Newsjs.listFriends(login,db,function(contacts){ @@ -153,18 +161,51 @@ Rectangle{ tagSelector.visible=true }); } - // Flickable{ - // anchors.fill: parent - // contentHeight: messageColumn.height - // boundsBehavior: Flickable.StopAtBounds + + Action { + id: quitAction + shortcut: StandardKey.Quit + onTriggered: messageSend.close() + } + + Action { + id: copyAction + shortcut: StandardKey.Copy + onTriggered: bodyField.copy() + } + + Action { + id: cutAction + shortcut: StandardKey.Cut + onTriggered: bodyField.cut() + } + + Action { + id: pasteAction + shortcut: StandardKey.Paste + onTriggered: bodyField.paste() + } + + Action { + id: boldAction + shortcut: StandardKey.Bold + onTriggered: document.bold = !document.bold + } + + Action { + id: italicAction + shortcut: StandardKey.Italic + onTriggered: document.italic = !document.italic + } + DropArea{ anchors.fill: parent onDropped: { - if (messageSend.state==""){messageSend.state="active"} + //if (messageSend.state==""){messageSend.state="active"} if (drop.keys.includes('text/uri-list')){ var droptext = drop.text.replace(/(\r\n|\n|\r)/gm, ","); imageUploadDialog.visible=true; - attachImage(droptext)} + attachImage(droptext)} else if (drop.keys.includes('text/html')){ bodyField.append(drop.html)} else if (drop.keys.includes('text/plain')){ @@ -172,121 +213,71 @@ Rectangle{ } } } - Column { - y:0.5*mm - id:messageColumn - spacing: 0.5*mm - width: parent.width - height: 2.6*root.fontFactor*osSettings.bigFontSize+stackTypeDescription.height - Label{id:stackTypeDescription - width: parent.width - horizontalAlignment:Text.AlignHCenter - text: !conversation &&newsSwipeview.stacktype?qsTr(newsSwipeview.stacktype):"" - font.pointSize: osSettings.bigFontSize - BlueButton{ - width: root.fontFactor*osSettings.bigFontSize - height:stackTypeDescription.height - anchors.left: stackTypeDescription.left - anchors.leftMargin: 2*root.fontFactor*osSettings.bigFontSize - visible: newsSwipeview.currentIndex!=0 - text:"\uf053" - fontColor: Material.hintTextColor - border.color: "transparent" - color:"transparent" - radius:0 - onClicked: {newsSwipeview.currentIndex=newsSwipeview.currentIndex-1} + ScrollView{ + width: messageSend.width-root.fontFactor*osSettings.bigFontSize + height: parent.height + clip:true + Column { + y:0.5*mm + id:messageColumn + spacing: 0.5*mm + width: messageSend.width-2*root.fontFactor*osSettings.bigFontSize + TextArea{ + id:receiverLabel + x: mm + width: parent.width-2*mm + font.pointSize: osSettings.bigFontSize + placeholderText:qsTr("to:") + text: "" + visible:false + onTextChanged: { + if (text!=""){contactmenu(text)} else {var receiver=getText(0,cursorPosition);contactmenu(receiver+preeditText)}} } - BlueButton{ - width: root.fontFactor*osSettings.bigFontSize - height:stackTypeDescription.height - anchors.right: stackTypeDescription.right - anchors.rightMargin: 2*root.fontFactor*osSettings.bigFontSize - visible: newsSwipeview.currentIndex!=newsSwipeview.count-1 - text:"\uf054" - fontColor: Material.hintTextColor - border.color: "transparent" - color:"transparent" - radius:0 - onClicked: {newsSwipeview.currentIndex=newsSwipeview.currentIndex+1} + TextField { + id: titleField + x: mm + width: parent.width + font.pointSize: osSettings.systemFontSize + placeholderText: qsTr("Title (optional)") + placeholderTextColor: osSettings.secondaryTextColor + visible: false + background: Rectangle{ + color: osSettings.backgroundDimColor + radius: 0.5*mm + } } - } - TextArea{ - id:receiverLabel - width: messageColumn.width - font.pointSize: osSettings.bigFontSize - placeholderText:qsTr("to:") - text: "" - visible:false - onTextChanged: { - if (text!=""){contactmenu(text)} else {var receiver=getText(0,cursorPosition);contactmenu(receiver+preeditText)}} - } - TextField { - id: titleField - x: 0.5*mm - width: parent.width-mm - font.pointSize: osSettings.systemFontSize - placeholderText: qsTr("Title (optional)") - visible: false - onVisibleChanged: if ((visible==true)&&(conversation==true)){ - conversationView.contentY=conversationView.contentY+titleField.height - } - } - - Rectangle{ - color: Material.backgroundColor - radius: 0.5*mm - visible:(conversation || (newsSwipeview.stacktype!="Notifications")) - x:mm - width: parent.width-2*mm - height:Math.max(bodyField.contentHeight+4*mm,2.5*root.fontFactor*osSettings.bigFontSize) + // Rectangle{ + // color: osSettings.backgroundColor + // radius: 0.5*mm + // x:mm + // width: parent.width-2*mm + // height:Math.max(bodyField.contentHeight+4*mm,2.5*root.fontFactor*osSettings.bigFontSize) TextArea { id: bodyField property string contactprefix:"" property string placeholder: osSettings.osType=="Linux"? qsTr(" Drop your Content here."):"" - anchors.fill: parent + //anchors.fill: parent + x:mm + height:Math.max(bodyField.contentHeight+4*mm,2.5*root.fontFactor*osSettings.bigFontSize) + width: parent.width + background: Rectangle{ + color: osSettings.backgroundDimColor + radius: 0.5*mm + } font.pointSize: osSettings.systemFontSize font.family: "Noto Sans" wrapMode: Text.Wrap selectByMouse: true - placeholderText: conversation?"": (qsTr("What's on your mind?")+placeholder) - textFormat: TextEdit.RichText - onLineCountChanged: { - if (messageSend.ListView.view==null){ - if (newsitem.ListView.view==null){} - else {newsitem.ListView.view.contentY=newsitem.ListView.view.contentY+root.fontFactor*osSettings.systemFontSize} - } - if(conversation==true){ - conversationView.contentY=conversationView.contentY+root.fontFactor*osSettings.systemFontSize - } - else{ - messageSend.ListView.view.contentY=messageSend.ListView.view.contentY+root.fontFactor*osSettings.systemFontSize - } - } + persistentSelection: true + placeholderText: (qsTr("What's on your mind?")+placeholder) + placeholderTextColor: osSettings.secondaryTextColor + textFormat: TextEdit.MarkdownText onLinkActivated:{Qt.openUrlExternally(link)} - onActiveFocusChanged:{ - if (activeFocus==true){ - if (messageSend.ListView.view==null){ - if ((typeof newsitem == 'undefined') || (newsitem.ListView.view==null)){} - else { - newsitem.ListView.view.contentY=newsitem.ListView.view.contentY+newsitem.height/2} - } - else if (conversation==true){ - if(parentId==""){setParent(conversationModel.get(0).newsitemobject);} - messageSend.state="conversation"; - try{conversationView.contentY=conversationView.contentY+20*mm}catch(e){} - } else if (textfocus==false){ - messageSend.state="active"; - messageSend.ListView.view.positionViewAtBeginning(); - } - else{ - messageSend.ListView.view.contentY=messageSend.ListView.view.contentY+8*mm - }; - } - } + onTextChanged:{ if (text!=""){ var plaintext=getText(0,cursorPosition) @@ -302,200 +293,317 @@ Rectangle{ }else {contactSelector.visible=false} }else{contactSelector.visible=false} } - } - } - - ListView{ - id:contactSelector - visible: false - z:3 - x:2*root.fontFactor*osSettings.bigFontSize - width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize - height: messageSend.height/2 - model:contactModel - function processContactSelection(contact){ - if(Helperjs.getCount(db,login,"contacts","screen_name",contact.screen_name)>1){ - contact.screen_name=contact.screen_name+"+"+contacts.cid + MouseArea { + acceptedButtons: Qt.RightButton + anchors.fill: parent + onClicked: contextMenu.open() } - if (newsSwipeview.stacktype=='DirectMessages'){ - receiverLabel.text=contact.screen_name; - reply_to_user=contact.screen_name - } else { - bodyField.remove(bodyField.getText(0,bodyField.cursorPosition).lastIndexOf(bodyField.contactprefix,bodyField.cursorPosition),bodyField.cursorPosition); - bodyField.insert(bodyField.cursorPosition, bodyField.contactprefix+contact.screen_name+" "); - bodyField.cursorPosition=bodyField.cursorPosition+contact.screen_name.length+1 + } + Menu { + id: contextMenu + MenuItem { + text: qsTr("Copy") + enabled: bodyField.selectedText + action: copyAction + //onTriggered: bodyField.copy() + } + MenuItem { + text: qsTr("Cut") + enabled: bodyField.selectedText + action: cutAction + //onTriggered: bodyField.cut() + } + MenuItem { + text: qsTr("Paste") + enabled: bodyField.canPaste + action: pasteAction + //onTriggered: bodyField.paste() + } + MenuItem { + text: qsTr("Text") + enabled: bodyField.selectedText + onTriggered: print(bodyField.getFormattedText(bodyField.selectionStart,bodyField.selectionEnd)) } - //receiverLabel.text=contact.screen_name; - contactSelector.visible=false } - delegate: ContactComponent { } - } - ListModel{id:contactModel} - - ListView{ - id: tagSelector - visible: false - z:3 - x:2*root.fontFactor*osSettings.bigFontSize - width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize - height: messageSend.height/2 - model:tagModel - clip: true - spacing: 0 - function processTagSelection(hashtag){ - bodyField.insert(bodyField.cursorPosition, hashtag+" "); - bodyField.cursorPosition=bodyField.cursorPosition+hashtag.length+1 - tagSelector.visible=false - } - delegate: MButton {text:tag;onClicked: tagSelector.processTagSelection(tag)} - } - ListModel{id:tagModel} - - Row{ - id:buttonRow - visible:false - spacing: mm - height: 2.5*root.fontFactor*osSettings.bigFontSize - x: 0.5*mm - -// MButton{id:permButton //Permissions not working in Friendica 02/2022 -// visible: !conversation && (newsSwipeview.stacktype!=="DirectMessages") -// height: 2*root.fontFactor*osSettings.bigFontSize -// width: 2*root.fontFactor*osSettings.bigFontSize -// text: ((contact_allow.length==0)&&(contact_deny.length==0)&&(group_allow.length==0)&&(group_deny.length==0))?"\uf09c":"\uf023" -// onClicked: { if (permissionDialog.visible==false){permissionDialog.visible=true} else{permissionDialog.visible=false}} -// } - - MButton{ - id:smileyButton - text: "\uf118" - height: 2*root.fontFactor*osSettings.bigFontSize - width: 2*root.fontFactor*osSettings.bigFontSize - onClicked: {if (smileyDialog.visible==false){smileyDialog.visible=true} else{smileyDialog.visible=false}} + DocumentHandler { id: document + document: bodyField.textDocument + cursorPosition: bodyField.cursorPosition + selectionStart: bodyField.selectionStart + selectionEnd: bodyField.selectionEnd + property alias bold: document.font.bold + property alias italic: document.font.italic + property alias strikeout: document.font.strikeout + //onError: function (message) { errorDialog.text = message errorDialog.open() } } - MButton{ - id:hastagButton - text: "\uf292" - height: 2*root.fontFactor*osSettings.bigFontSize - width: 2*root.fontFactor*osSettings.bigFontSize - onClicked: {if (tagSelector.visible==false){hashtagmenu()} else{tagSelector.visible=false}} - } - MButton{ - id:imagesButton - visible:(newsSwipeview.stacktype!="DirectMessages") - text: "\uf03e" - height: 2*root.fontFactor*osSettings.bigFontSize - width: 2*root.fontFactor*osSettings.bigFontSize - onClicked: { - if (imageUploadDialog.visible==false){ - imageUploadDialog.visible=true; - imageUploadDialog.attach() + + ListView{ + id:contactSelector + visible: false + z:3 + x:2*root.fontFactor*osSettings.bigFontSize + width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize + height: messageSend.height/2 + model:contactModel + function processContactSelection(contact){ + if(Helperjs.getCount(db,login,"contacts","screen_name",contact.screen_name)>1){ + contact.screen_name=contact.screen_name+"+"+contacts.cid } - else{imageUploadDialog.visible=false}} + if (newsSwipeview.stacktype=='DirectMessages'){ + receiverLabel.text=contact.screen_name; + reply_to_user=contact.screen_name + } else { + bodyField.remove(bodyField.getText(0,bodyField.cursorPosition).lastIndexOf(bodyField.contactprefix,bodyField.cursorPosition),bodyField.cursorPosition); + bodyField.insert(bodyField.cursorPosition, bodyField.contactprefix+contact.screen_name+" "); + bodyField.cursorPosition=bodyField.cursorPosition+contact.screen_name.length+1 + } + //receiverLabel.text=contact.screen_name; + contactSelector.visible=false + } + delegate: ContactComponent { } } + ListModel{id:contactModel} - MButton { - id: cancelButton - height: 2*root.fontFactor*osSettings.bigFontSize - width: 2*root.fontFactor*osSettings.bigFontSize - text: "\uf057" - onClicked: { - if (textfocus==true){messageSend.destroy()} - else{ - bodyField.text=""; - messageSend.state=""; - permissionDialog.visible=false; - smileyDialog.visible=false; - imageUploadDialog.visible=false; - receiverLabel.visible=false; - reply_to_user=""; - media_ids=[] + ListView{ + id: tagSelector + visible: false + z:3 + x:2*root.fontFactor*osSettings.bigFontSize + width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize + height: messageSend.height/2 + model:tagModel + clip: true + spacing: 0 + function processTagSelection(hashtag){ + bodyField.insert(bodyField.cursorPosition, hashtag+" "); + bodyField.cursorPosition=bodyField.cursorPosition+hashtag.length+1 + tagSelector.visible=false + } + delegate: MButton {text:tag;onClicked: tagSelector.processTagSelection(tag)} + } + ListModel{id:tagModel} + Row{ + id:formatRow + visible: wideScreen + spacing: mm + height: 3.5*root.fontFactor*osSettings.bigFontSize + x: 0.5*mm + MButton { + id: boldButton + text: "\uf032" // icon-bold + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Bold") + focusPolicy: Qt.NoFocus + // Don't want to close the virtual keyboard when this is clicked. + // focusPolicy: Qt.NoFocus + // checkable: true + // checked: document.bold + onClicked: { + document.bold = !document.bold; + bodyField.forceActiveFocus() + } + } + MButton { + id: italicButton + text: "\uf033" // icon-italic + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Italic") + focusPolicy: Qt.NoFocus + // focusPolicy: Qt.NoFocus + // checkable: true + // checked: document.italic + onClicked: {document.italic = !document.italic;bodyField.forceActiveFocus()} + } + + MButton { + id: liststyleButton + text: "\uf03a" // icon-align-justify + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Create list") + // focusPolicy: Qt.NoFocus + // checkable: true + // checked: document.alignment == Qt.AlignJustify + onClicked: {document.liststyle = !document.liststyle;bodyField.forceActiveFocus()} + } + MButton { + id: codeblockButton + text: "\uf121" // icon-code + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Format as code") + // focusPolicy: Qt.NoFocus + // checkable: true + // checked: document.alignment == Qt.AlignJustify + onClicked: {document.codeblock = !document.codeblock;bodyField.forceActiveFocus()} + } + MButton { + id: plainButton + text: bodyField.textFormat==TextEdit.PlainText?qsTr("Rendered"):qsTr("MD") // icon-code + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Show Markdown code") + // focusPolicy: Qt.NoFocus + // checkable: true + // checked: document.alignment == Qt.AlignJustify + onClicked: { + if(bodyField.textFormat==TextEdit.PlainText){ + bodyField.textFormat=TextEdit.MarkdownText;} + else {bodyField.textFormat=TextEdit.PlainText} + bodyField.forceActiveFocus() } } } - MButton { - id: sendButton - height: 2*root.fontFactor*osSettings.bigFontSize - width: 2*root.fontFactor*osSettings.bigFontSize - text: "\uf1d9" - onClicked: { - var title=titleField.text.replace("\"","\'"); - var body=bodyField.getFormattedText(0,bodyField.length); - var dmbody=bodyField.getText(0,bodyField.length); - if (conversation || newsSwipeview.stacktype!=="DirectMessages"){ - if (parentId!=""){ - statusUpdate(title,dmbody,parentId) - }else{ - statusUpdate(title,body,parentId)} - }else { - if (reply_to_user!=""){dmUpdate(title,dmbody,parentId,reply_to_user)} - else{Helperjs.showMessage(qsTr("Error"),qsTr("No receiver supplied!"),root)} - } - if (conversation==true){ - newstab.newstabstatus=root.globaloptions.newsViewType; rootstackView.pop(null) + PermissionDialog{id:permissionDialog;x:mm;visible: false} + SmileyDialog{id:smileyDialog;x:mm;visible: false} + MessageImageUploadDialog{id:imageUploadDialog;visible: false} + Row{ + id:buttonRow + visible: true + spacing: mm + height: 3.5*root.fontFactor*osSettings.bigFontSize + x: 0.5*mm + + // MButton{id:permButton //Permissions not working in Friendica 02/2022 + // visible: !conversation && (newsSwipeview.stacktype!=="DirectMessages") + // height: 2*root.fontFactor*osSettings.bigFontSize + // width: 2*root.fontFactor*osSettings.bigFontSize + // text: ((contact_allow.length==0)&&(contact_deny.length==0)&&(group_allow.length==0)&&(group_deny.length==0))?"\uf09c":"\uf023" + // onClicked: { if (permissionDialog.visible==false){permissionDialog.visible=true} else{permissionDialog.visible=false}} + // } + + MButton{ + id:smileyButton + text: "\uf118" + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Insert smiley") + height: 3*root.fontFactor*osSettings.bigFontSize + width: 3*root.fontFactor*osSettings.bigFontSize + onClicked: {if (smileyDialog.visible==false){smileyDialog.visible=true} else{smileyDialog.visible=false}} + } + + MButton{ + id:hastagButton + text: "\uf292" + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Insert previous hashtag") + height: 3*root.fontFactor*osSettings.bigFontSize + width: 3*root.fontFactor*osSettings.bigFontSize + onClicked: {if (tagSelector.visible==false){hashtagmenu()} else{tagSelector.visible=false}} + } + MButton{ + id:imagesButton + visible:(newsSwipeview.stacktype!="DirectMessages") + text: "\uf03e" + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Insert images") + height: 3*root.fontFactor*osSettings.bigFontSize + width: 3*root.fontFactor*osSettings.bigFontSize + onClicked: { + if (imageUploadDialog.visible==false){ + imageUploadDialog.visible=true; + imageUploadDialog.attach() + } + else{imageUploadDialog.visible=false}} + } + + MButton { + id: cancelButton + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Cancel message") + height: 3*root.fontFactor*osSettings.bigFontSize + width: 3*root.fontFactor*osSettings.bigFontSize + text: "\uf057" + onClicked: {messageSend.close()} + } + MButton { + id: formatButton + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Format message") + height: 3*root.fontFactor*osSettings.bigFontSize + width: 3*root.fontFactor*osSettings.bigFontSize + text: "\uf031" + onClicked: {formatRow.visible?formatRow.visible=false:formatRow.visible=true} + } + MButton { + id: sendButton + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Send message") + height: 3*root.fontFactor*osSettings.bigFontSize + width: 3*root.fontFactor*osSettings.bigFontSize + text: "\uf1d9" + onClicked: { + var title=titleField.text.replace("\"","\'"); + var body=bodyField.getFormattedText(0,bodyField.length); + var dmbody=bodyField.getText(0,bodyField.length); + if (windowstate=="directmessage"){ + if (reply_to_user!=""){dmUpdate(title,dmbody,parentId,reply_to_user)} + else{Helperjs.showMessage(qsTr("Error"),qsTr("No receiver supplied!"),root)} + + }else { + body=body.replace(/\*\*/g,"__") + statusUpdate(title,body,parentId) + } } } } + } - PermissionDialog{id:permissionDialog;x:mm;visible: false} - SmileyDialog{id:smileyDialog;x:mm;visible: false} - MessageImageUploadDialog{id:imageUploadDialog;visible: false} } Component.onCompleted:{ - root.replySignal.connect(setParent); - root.directmessageSignal.connect(directmessagePrepare); + if(parentId!="" &&reply_to_user!=""){ + receiverLabel.text=reply_to_user; + } + // root.replySignal.connect(setParent); + // root.directmessageSignal.connect(directmessagePrepare); root.uploadSignal.connect(sendUrls); root.sendtextSignal.connect(sendtext); - if (textfocus==true){bodyField.forceActiveFocus()} + // if (textfocus==true){bodyField.forceActiveFocus()} } - states: [ - State { - name: "active" - PropertyChanges { - target: messageColumn; height: implicitHeight - } - PropertyChanges { - target: buttonRow; visible:true - } - PropertyChanges { - target: titleField; visible:(newsSwipeview.stacktype!="DirectMessages") - } - PropertyChanges { - target: receiverLabel; visible:(newsSwipeview.stacktype=="DirectMessages"); - } - }, - State { - name: "conversation" - PropertyChanges { - target: messageColumn; height: implicitHeight - } - PropertyChanges { - target: buttonRow; visible:true - } - PropertyChanges { - target: titleField; visible:(!conversation&&newsSwipeview.stacktype!="DirectMessages") - } - }, + StateGroup{ + state: windowstate + states: [ + State { + name: "active" + PropertyChanges { + target: messageColumn; height: implicitHeight + } + PropertyChanges { + target: titleField; visible: true + } - State { - name: "reply" - PropertyChanges { - target: messageColumn; height: implicitHeight + }, + State { + name: "directmessage" + PropertyChanges { + target: messageColumn; height: implicitHeight + } + PropertyChanges { + target: formatRow; visible: false + } + PropertyChanges { + target: titleField; visible: false + } + PropertyChanges { + target: receiverLabel; visible: true; + } + PropertyChanges { + target: imagesButton; visible: false + } + PropertyChanges { + target: formatButton; visible: false + } }, + + State { + name: "reply" + PropertyChanges { + target: messageColumn; height: implicitHeight + } + PropertyChanges { + target: titleField; visible: false + } + PropertyChanges { + target: bodyField; placeholderText:"";focus:true + } } - PropertyChanges { - target: buttonRow; visible:true - } - PropertyChanges { - target: titleField; visible:false - } - PropertyChanges { - target: bodyField; placeholderText:"";focus:true - } - PropertyChanges { - target: stackTypeDescription; visible:false - } - } - ] + ] + } } diff --git a/source-linux/qml/newsqml/MoreComments.qml b/source-linux/qml/newsqml/MoreComments.qml index 89c08f7..375874d 100644 --- a/source-linux/qml/newsqml/MoreComments.qml +++ b/source-linux/qml/newsqml/MoreComments.qml @@ -30,12 +30,12 @@ // along with this program. If not, see . import QtQuick 2.0 -import QtQuick.Controls.Material 2.12 + Rectangle{ id: moreComments width: parent.width height: 5*mm - color:Material.background//"white" + color:osSettings.backgroundColor property int comments:0 // border.color:"grey" // border.width:1 diff --git a/source-linux/qml/newsqml/NewsPhotolist.qml b/source-linux/qml/newsqml/NewsPhotolist.qml index 14f6cac..4c47334 100644 --- a/source-linux/qml/newsqml/NewsPhotolist.qml +++ b/source-linux/qml/newsqml/NewsPhotolist.qml @@ -32,7 +32,6 @@ import QtQuick 2.15 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/qml/genericqml" Page{ @@ -66,7 +65,7 @@ Page{ anchors.topMargin: 1*mm anchors.right: parent.right anchors.rightMargin: 1*mm - color: Material.dialogColor + color: osSettings.dialogColor text: "\uf057" onClicked: { if (rootstackView.depth>1){ diff --git a/source-linux/qml/newsqml/NewsStack.qml b/source-linux/qml/newsqml/NewsStack.qml index 239b6a4..906dcf5 100644 --- a/source-linux/qml/newsqml/NewsStack.qml +++ b/source-linux/qml/newsqml/NewsStack.qml @@ -31,7 +31,6 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/js/news.js" as Newsjs import "qrc:/js/helper.js" as Helperjs import "qrc:/js/service.js" as Service @@ -40,11 +39,12 @@ Rectangle{ id: newsStack width: parent.width height: parent.height - color: Material.backgroundColor + color: osSettings.backgroundColor property string updateMethodNews: "refresh" property var allchats: ({}) property int lastnewsid:0 property string newstabstatus: "" + property bool expectScreenUpdate: false function newstypeHandling(newstype){ try{newsBusy.running=true}catch(e){print(e)}; @@ -69,21 +69,25 @@ Rectangle{ newsStack.updateMethodNews="refresh"; newstab.newstabstatus="Favorites"; Service.updateView("Favorites"); + expectScreenUpdate=true; break; case "replies": newsStack.updateMethodNews="refresh"; newstab.newstabstatus="Replies"; Service.updateView("Replies"); + expectScreenUpdate=true; break; case "publictimeline": newsStack.updateMethodNews="refresh"; newstab.newstabstatus="Public Timeline"; Service.updateView("Public Timeline"); + expectScreenUpdate=true; break; case "groupnews": newsStack.updateMethodNews="refresh"; newstab.newstabstatus="Groupnews"; Service.showGroups(); + expectScreenUpdate=true; break; case "search": newsView.anchors.topMargin=7*mm; @@ -109,6 +113,7 @@ Rectangle{ else if (newsSwipeview.stacktype=="Notifications"){ Service.updateView("Notifications") } + expectScreenUpdate=true; break; default: if (newstab.newstabstatus=="Timeline" || newstabstatus=="Timeline"){ @@ -126,6 +131,7 @@ Rectangle{ else if (newsSwipeview.stacktype=="Notifications"){ Service.updateView("Notifications") } + expectScreenUpdate=true; } } @@ -149,7 +155,9 @@ Rectangle{ xhr.setAccount(login); xhr.setApi("/api/search"); xhr.setParam("q",term) - xhr.get();} + xhr.get(); + expectScreenUpdate=true; + } newsView.anchors.topMargin=mm } @@ -201,6 +209,7 @@ Rectangle{ try{xhr.setParam("max_id",newsModel.get(newsModel.count-1).newsitemobject.id-1);}catch(e){} xhr.get() + expectScreenUpdate=true; } } @@ -232,6 +241,7 @@ Rectangle{ target:xhr function onError(data,url,api,code){ newsBusy.running=false; + expectScreenUpdate=false; } function onSuccess(data,api){ const newsApiArray=["/api/statuses/friends_timeline", @@ -249,9 +259,11 @@ Rectangle{ "/api/statuses/update", "/api/direct_messages/new" ]; - if(newsApiArray.includes(api)){ + if(newsApiArray.includes(api) && expectScreenUpdate==true){ + expectScreenUpdate=false; Service.processNews(api,data) root.replySignal("") + expectScreenUpdate=false; } } } @@ -261,8 +273,11 @@ Rectangle{ newsBusy.running=false; } function onSuccess(api){ - loadDBNews(); - newsBusy.running=false; + if(expectScreenUpdate){ + loadDBNews(); + newsBusy.running=false; + expectScreenUpdate=false; + } } } @@ -286,6 +301,7 @@ Rectangle{ else if (newsSwipeview.stacktype=="Replies"){ Service.updateView("Replies") } + expectScreenUpdate=true; root.replySignal("") } } @@ -294,12 +310,12 @@ Rectangle{ Component { id:footerComponent Rectangle{ border.color: "#EEEEEE" - color: Material.dialogColor + color: osSettings.dialogColor border.width: 1 width:newsView.width height:6*mm Text{ - color: Material.primaryTextColor + color: osSettings.primaryTextColor font.pointSize: osSettings.systemFontSize anchors.centerIn: parent text:qsTr("More") @@ -308,6 +324,7 @@ Rectangle{ anchors.fill:parent onClicked:{ if (newsModel.count==0){ + expectScreenUpdate=true; if (newsSwipeview.stacktype=="Home"){ Service.updateView(newstab.newstabstatus) } @@ -334,11 +351,11 @@ Rectangle{ property bool viewdraggedpositive: false property string viewtype: "news" width: parent.width - height: parent.height-3*mm + height: parent.height//-3*mm anchors.margins: 0.5*mm clip: true spacing: 0 - header:MessageSend{id:messagesend;onHeightChanged: {if(state=="active"){newsView.positionViewAtBeginning()}}} + //header:MessageSend{id:messagesend;onHeightChanged: {if(state=="active"){newsView.positionViewAtBeginning()}}} footer: footerComponent model: newsModel delegate: Newsitem{} @@ -397,18 +414,22 @@ Rectangle{ showNews(news)}); } } else { + expectScreenUpdate=true; Service.updateView(currentnewstabstatus,currentlastnews) } }); } else if (newsSwipeview.stacktype=="DirectMessages"){ Service.updateView("Direct Messages") + expectScreenUpdate=true; } else if (newsSwipeview.stacktype=="Notifications"){ Service.updateView("Notifications") + expectScreenUpdate=true; } else if (newsSwipeview.stacktype=="Replies"){ Service.updateView("Replies") + expectScreenUpdate=true; } } diff --git a/source-linux/qml/newsqml/NewsTab.qml b/source-linux/qml/newsqml/NewsTab.qml index 36254f0..45e61c1 100644 --- a/source-linux/qml/newsqml/NewsTab.qml +++ b/source-linux/qml/newsqml/NewsTab.qml @@ -29,18 +29,18 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.11 -import QtQuick.Controls 2.12 +import QtQuick 2.15 +import QtQuick.Controls 6.3 import "qrc:/qml/newsqml" import "qrc:/qml/genericqml" import "qrc:/js/news.js" as Newsjs import "qrc:/js/helper.js" as Helperjs import "qrc:/js/service.js" as Service -Rectangle{ +Page{ id:newstabitem width:rootstack.width - height: rootstack.height-8*mm + height: rootstack.height Timer {id:contacttimer; interval: 50; running: false; repeat: false onTriggered: { @@ -85,48 +85,66 @@ Rectangle{ function getActivitiesView(newsitemobject){ var likeText="";var dislikeText="";var attendyesText="";var attendnoText="";var attendmaybeText=""; var self={}; try{if (newsitemobject.messagetype==0&&newsitemobject.hasOwnProperty('friendica_activities')){ - if (newsitemobject.friendica_activities.like.length>0){ - if (newsitemobject.friendica_activities.like.length==1){likeText= newsitemobject.friendica_activities.like[0].name+" "+ qsTr("likes this.")} - else {likeText= newsitemobject.friendica_activities.like.length+" "+ qsTr("like this.")} - } - if (newsitemobject.friendica_activities.dislike.length>0){ - if (newsitemobject.friendica_activities.dislike.length==1){dislikeText= newsitemobject.friendica_activities.dislike[0].name+" "+ qsTr("doesn't like this.")} - else {dislikeText= newsitemobject.friendica_activities.dislike.length+" "+ qsTr("don't like this.")} - } - if (newsitemobject.friendica_activities.attendyes.length>0){ - if (newsitemobject.friendica_activities.attendyes.length==1){attendyesText=newsitemobject.friendica_activities.attendyes[0].name+" "+ qsTr("will attend.")} - else {attendyesText= newsitemobject.friendica_activities.attendyes.length+" "+ qsTr("persons will attend.")} - } - if (newsitemobject.friendica_activities.attendno.length>0){ - if (newsitemobject.friendica_activities.attendno.length==1){attendnoText= newsitemobject.friendica_activities.attendno[0].name+" "+ qsTr("will not attend.")} - else {attendnoText= newsitemobject.friendica_activities.attendno.length+" "+ qsTr("persons will not attend.")} - } - if (newsitemobject.friendica_activities.attendmaybe.length>0){ - if (newsitemobject.friendica_activities.attendmaybe.length==1){attendmaybeText= newsitemobject.friendica_activities.attendmaybe[0].name+" "+ qsTr("may attend.")} - else {attendmaybeText= newsitemobject.friendica_activities.attendmaybe.length+" "+ qsTr("persons may attend.")} - } - //var friendica_activities_self=JSON.parse(newsitemobject.friendica_activities_self); + if (newsitemobject.friendica_activities.like.length>0){ + if (newsitemobject.friendica_activities.like.length==1){likeText= newsitemobject.friendica_activities.like[0].name+" "+ qsTr("likes this.")} + else {likeText= newsitemobject.friendica_activities.like.length+" "+ qsTr("like this.")} + } + if (newsitemobject.friendica_activities.dislike.length>0){ + if (newsitemobject.friendica_activities.dislike.length==1){dislikeText= newsitemobject.friendica_activities.dislike[0].name+" "+ qsTr("doesn't like this.")} + else {dislikeText= newsitemobject.friendica_activities.dislike.length+" "+ qsTr("don't like this.")} + } + if (newsitemobject.friendica_activities.attendyes.length>0){ + if (newsitemobject.friendica_activities.attendyes.length==1){attendyesText=newsitemobject.friendica_activities.attendyes[0].name+" "+ qsTr("will attend.")} + else {attendyesText= newsitemobject.friendica_activities.attendyes.length+" "+ qsTr("persons will attend.")} + } + if (newsitemobject.friendica_activities.attendno.length>0){ + if (newsitemobject.friendica_activities.attendno.length==1){attendnoText= newsitemobject.friendica_activities.attendno[0].name+" "+ qsTr("will not attend.")} + else {attendnoText= newsitemobject.friendica_activities.attendno.length+" "+ qsTr("persons will not attend.")} + } + if (newsitemobject.friendica_activities.attendmaybe.length>0){ + if (newsitemobject.friendica_activities.attendmaybe.length==1){attendmaybeText= newsitemobject.friendica_activities.attendmaybe[0].name+" "+ qsTr("may attend.")} + else {attendmaybeText= newsitemobject.friendica_activities.attendmaybe.length+" "+ qsTr("persons may attend.")} + } + //var friendica_activities_self=JSON.parse(newsitemobject.friendica_activities_self); }} catch(e){print("Activities "+e+ " "+JSON.stringify(newsitemobject.friendica_activities))} return {likeText:likeText,dislikeText:dislikeText,attendyesText:attendyesText,attendnoText:attendnoText,attendmaybeText:attendmaybeText} } + function openMessageSend(messageState,newsitemobject){ + var parentId="" + var replyUser="" + if(newsitemobject!=""){ + parentId=newsitemobject.id + replyUser=newsitemobject.user.screen_name; + } +// var messageString='import QtQuick 2.15; import QtQuick.Window 2.0; import "qrc:/qml/newsqml";'+ +// ' Window{id:messageWindow; title:"Message"; width:root.width; height:root.height; '+ +// 'MessageSend{state:"'+messageState+'"} Component.onCompleted: {x=Screen.width/2-width/2; y=Screen.height/2-height/2}}'; +// var messageObject=Qt.createQmlObject(messageString,root,"messageOutput"); + var messageObject = Qt.createComponent("qrc:/qml/newsqml/MessageSend.qml"); + var messageWindow=messageObject.createObject(root, { parentId: parentId, reply_to_user: replyUser, windowstate: messageState }); + messageWindow.show(); + } + // CalendarTab{ + // visible: wideScreen&&rootstackView.depth<2 + // width: newstabitem.width/3 + // x: newsSwipeview.width + // //anchors.left: newsSwipeview.right + // //anchors.fill: null + // } + // Rectangle{ + // color: "#F8F8F8" + // height: parent.height + // width: 0.5*mm + // anchors.left: newsSwipeview.right + // } + + MessageSend{} -// CalendarTab{ -// visible: wideScreen&&rootstackView.depth<2 -// width: newstabitem.width/3 -// x: newsSwipeview.width -// //anchors.left: newsSwipeview.right -// //anchors.fill: null -// } -// Rectangle{ -// color: "#F8F8F8" -// height: parent.height -// width: 0.5*mm -// anchors.left: newsSwipeview.right -// } BlueButton{ z:2 + anchors.right: parent.right visible: !wideScreen fontColor: "grey" border.color: "transparent" @@ -136,6 +154,20 @@ Rectangle{ leftDrawerAndroid.visible?leftDrawerAndroid.close():leftDrawerAndroid.open()} } + MButton{ + z:2 + anchors.right: parent.right + anchors.bottom: parent.bottom + // fontColor: "grey" + // border.color: "transparent" + text: "\uf040" + font.pointSize: osSettings.bigFontSize + onClicked:{ + if (newsSwipeview.stacktype=="DirectMessages"){openMessageSend("directmessage","")} + else {openMessageSend("active","")} + } + } + LeftDrawerLinux{ id:leftDrawer property var newstabstatus: newstab.newstabstatus @@ -148,22 +180,87 @@ Rectangle{ id: leftDrawerAndroid } + TabBar { + id: newstabbar + x: leftDrawer.width + width: newsSwipeview.width + spacing: 1 + position: TabBar.Header + onCurrentIndexChanged: { + newsSwipeview.currentIndex=newstabbar.currentIndex; + } + TabButton { + font.family: fontAwesome.name + font.pointSize : osSettings.bigFontSize + width: newstabbar.width/5 + text: "\uf015" + background:Rectangle{ + anchors.fill: parent + color: osSettings.backgroundDimColor + border.color: newsSwipeview.currentIndex==0?osSettings.accentColor:color + } + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Home") + onDoubleClicked: {newstypeSignal("refresh")} + } + TabButton { + font.family: fontAwesome.name + font.pointSize: osSettings.bigFontSize + width: newstabbar.width/5 + text: "\uf0ec" + background:Rectangle{ + anchors.fill: parent + color: osSettings.backgroundDimColor + border.color: newsSwipeview.currentIndex==1?osSettings.accentColor:color + } + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Replies") + } + TabButton { + font.family: fontAwesome.name + font.pointSize: osSettings.bigFontSize + width: newstabbar.width/5 + text: "\uf0e0" + background:Rectangle{ + anchors.fill: parent + color: osSettings.backgroundDimColor + border.color: newsSwipeview.currentIndex==2?osSettings.accentColor:color + } + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Direct Messages") + } + TabButton { + font.family: fontAwesome.name + font.pointSize: osSettings.bigFontSize + width: newstabbar.width/5 + text: "\uf0f3" + background:Rectangle{ + anchors.fill: parent + color: osSettings.backgroundDimColor + border.color: newsSwipeview.currentIndex==3?osSettings.accentColor:color + } + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Notifications") + } + } + SwipeView{ id: newsSwipeview property string stacktype:"Home" currentIndex: 0 width: wideScreen&&rootstackView.depth<2?newstabitem.width-leftDrawer.width:newstabitem.width//newstabitem.width/3*2:newstabitem.width - height: newstabitem.height-4*mm + height: newstabitem.height-newstabbar.height x: leftDrawer.width + y: newstabbar.height function onDirectMessage(friend){currentIndex=2} onCurrentIndexChanged: { switch(currentIndex){ - case 0: stacktype="Home";break; - case 1: stacktype="Replies";break; - case 2: stacktype="DirectMessages";break; - case 3: stacktype="Notifications";break; - default: stacktype="Home"; + case 0: stacktype="Home";break; + case 1: stacktype="Replies";break; + case 2: stacktype="DirectMessages";break; + case 3: stacktype="Notifications";break; + default: stacktype="Home"; } } diff --git a/source-linux/qml/newsqml/Newsitem.qml b/source-linux/qml/newsqml/Newsitem.qml index a748b99..616aef2 100644 --- a/source-linux/qml/newsqml/Newsitem.qml +++ b/source-linux/qml/newsqml/Newsitem.qml @@ -31,7 +31,6 @@ import QtQuick 2.0 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/js/news.js" as Newsjs import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -59,17 +58,18 @@ Item { if (model.newsitemobject.hasOwnProperty("currentconversation")){ rootstackView.push("qrc:/qml/newsqml/Conversation.qml",{"news": model.newsitemobject.currentconversation})} else{rootstackView.push("qrc:/qml/newsqml/Conversation.qml")}; + expectScreenUpdate=true; showConversation(index,newsitemobject) } Rectangle{width:newsitem.width; height: 1; anchors.bottom: newsitem.bottom; - color: Material.backgroundDimColor + color: osSettings.backgroundDimColor } Rectangle{ width:newsitem.width height:newsitem.height-1 - color: Material.background + color: osSettings.backgroundColor Column { id:toprow @@ -112,20 +112,20 @@ Item { Label { id:messageTypeLabel - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor text: if (newsitemobject.messagetype==1){ qsTr("Direct Message")} else if(newsitemobject.messagetype==2) {" Notification"} else {qsTr("Source: ")+newsitemobject.source} font.pointSize: 0.6*osSettings.systemFontSize } Label { id:createdAtLabel - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor font.pointSize: 0.6*osSettings.systemFontSize horizontalAlignment: Label.AlignRight text: " \u00B7 "+getDateDiffString(newsitemobject.dateDiff) + " " +qsTr("ago") } Label { id:replytoLabel - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor font.pointSize: 0.6*osSettings.systemFontSize font.family: "Noto Sans" horizontalAlignment: Label.AlignRight @@ -139,8 +139,8 @@ Item { height: itemMessage.height onClicked: {pushConversation()} Text { - color: Material.primaryTextColor - linkColor: Material.accentColor + color: osSettings.primaryTextColor + linkColor: osSettings.accentColor id: itemMessage textFormat: Text.RichText font.family: "Noto Sans" @@ -189,12 +189,12 @@ Item { anchors.bottom: toprow.bottom visible: toprow.implicitHeight>3/4*root.height || newsitemobject.nsfw text:"\uf078" - fontColor: Material.secondaryTextColor + fontColor: osSettings.secondaryTextColor border.color: "transparent" - color: Material.backgroundColor + color: osSettings.backgroundColor // gradient: Gradient { // GradientStop { position: 0.0; color: "transparent" } -// GradientStop { position: 0.5; color: Material.backgroundDimColor} +// GradientStop { position: 0.5; color: osSettings.backgroundDimColor} // } radius:0 onClicked: { @@ -215,7 +215,7 @@ Item { width:parent.width spacing:mm - Label{color: Material.secondaryTextColor + Label{color: osSettings.secondaryTextColor height:3.5*mm font.pointSize: 0.75*osSettings.systemFontSize text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.likeText @@ -224,7 +224,7 @@ Item { onClicked: { showActivityContacts(newsitemobject.friendica_activities.like)} } } - Label{color: Material.secondaryTextColor + Label{color: osSettings.secondaryTextColor height:3.5*mm font.pointSize: 0.75*osSettings.systemFontSize text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.dislikeText @@ -233,7 +233,7 @@ Item { onClicked: { showActivityContacts(newsitemobject.friendica_activities.dislike)} } } - Label{color: Material.secondaryTextColor + Label{color: osSettings.secondaryTextColor height:3.5*mm font.pointSize: 0.75*osSettings.systemFontSize text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.attendyesText @@ -241,7 +241,7 @@ Item { anchors.fill: parent onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendyes)} }} - Label{color: Material.secondaryTextColor + Label{color: osSettings.secondaryTextColor height:3.5*mm font.pointSize: 0.75*osSettings.systemFontSize text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.attendnoText @@ -250,7 +250,7 @@ Item { onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendno)} } } - Label{color: Material.secondaryTextColor + Label{color: osSettings.secondaryTextColor height:3.5*mm font.pointSize: 0.75*osSettings.systemFontSize text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.attendmaybeText @@ -261,7 +261,7 @@ Item { } Label{ id:attendLabel - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor height:3.5*mm font.pointSize: 0.75*osSettings.systemFontSize horizontalAlignment: Label.AlignRight @@ -288,7 +288,7 @@ Item { anchors.centerIn: parent font.pointSize: osSettings.bigFontSize font.family:fontAwesome.name - color:likeCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor + color:likeCheckbox.checked?osSettings.primaryTextColor: osSettings.secondaryTextColor text:likeCheckbox.checked?"\uf118"+"!":"\uf118" } } @@ -317,7 +317,7 @@ Item { anchors.centerIn: parent font.pointSize: osSettings.bigFontSize font.family:fontAwesome.name - color:dislikeCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor + color:dislikeCheckbox.checked?osSettings.primaryTextColor: osSettings.secondaryTextColor text: dislikeCheckbox.checked?"\uf119"+"!":"\uf119" } } @@ -346,7 +346,7 @@ Item { anchors.centerIn: parent font.pointSize: osSettings.bigFontSize font.family:fontAwesome.name - color: favoritedCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor + color: favoritedCheckbox.checked?osSettings.primaryTextColor: osSettings.secondaryTextColor text:"\uf005" } } @@ -365,7 +365,7 @@ Item { color:"transparent" Text{ id:replysymbol - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor anchors.centerIn: parent font.pointSize: osSettings.bigFontSize font.family:fontAwesome.name @@ -374,21 +374,24 @@ Item { MouseArea{ anchors.fill:parent onClicked: { - var directmessage=0; - if (newsitemobject.messagetype==1){ directmessage=1} - var replycomp=Qt.createComponent("qrc:/qml/newsqml/MessageSend.qml"); - var conversation; - if (newsitem.ListView.view==null){conversation=true} - else if (newsitem.ListView.view.viewtype=="conversation"){ - conversation=true - newsitem.ListView.view.currentIndex=itemindex - } - else{ - conversation=false; - newsitem.ListView.view.currentIndex=itemindex - }; - var reply=replycomp.createObject(friendicaActivities,{parentId:newsitemobject.id,reply_to_user:newsitemobject.user.screen_name, state:"reply",conversation:conversation,textfocus:true}) + openMessageSend("reply",newsitemobject) } + +// var directmessage=0; +// if (newsitemobject.messagetype==1){ directmessage=1} +// var replycomp=Qt.createComponent("qrc:/qml/newsqml/MessageSend.qml"); +// var conversation; +// if (newsitem.ListView.view==null){conversation=true} +// else if (newsitem.ListView.view.viewtype=="conversation"){ +// conversation=true +// newsitem.ListView.view.currentIndex=itemindex +// } +// else{ +// conversation=false; +// newsitem.ListView.view.currentIndex=itemindex +// }; +// var reply=replycomp.createObject(friendicaActivities,{parentId:newsitemobject.id,reply_to_user:newsitemobject.user.screen_name, state:"reply",conversation:conversation,textfocus:true}) +// } } } Rectangle{ @@ -398,7 +401,7 @@ Item { color:"transparent" Text{ id:newsmenusymbol - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor anchors.centerIn: parent font.pointSize: osSettings.bigFontSize font.family:fontAwesome.name @@ -416,7 +419,7 @@ Item { delegate: MenuItem{ contentItem: Text{ font.pointSize: osSettings.systemFontSize - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor text: parent.text } } @@ -483,7 +486,7 @@ Item { delegate: MenuItem{ contentItem: Text{ font.pointSize: osSettings.systemFontSize - color: Material.secondaryTextColor + color: osSettings.secondaryTextColor text: parent.text } } diff --git a/source-linux/qml/newsqml/ReportUser.qml b/source-linux/qml/newsqml/ReportUser.qml index a70ad94..4b5884f 100644 --- a/source-linux/qml/newsqml/ReportUser.qml +++ b/source-linux/qml/newsqml/ReportUser.qml @@ -31,7 +31,6 @@ import QtQuick 2.0 import QtQuick.Controls 2.15 -import QtQuick.Controls.Material 2.12 import "qrc:/js/helper.js" as Helperjs Dialog { diff --git a/source-linux/qml/newsqml/SmileyDialog.qml b/source-linux/qml/newsqml/SmileyDialog.qml index 9bfc635..bd95561 100644 --- a/source-linux/qml/newsqml/SmileyDialog.qml +++ b/source-linux/qml/newsqml/SmileyDialog.qml @@ -32,7 +32,6 @@ import QtQuick 2.11 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.11 -import QtQuick.Controls.Material 2.12 import "qrc:/js/smiley.js" as Smileyjs import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -42,7 +41,7 @@ Rectangle{ x: mm width: messageColumn.width-5*mm height:root.height/2 - color: Material.backgroundColor + color: osSettings.backgroundColor MButton{ id:closeButton @@ -64,22 +63,8 @@ Rectangle{ text:qsTr("Unicode") font.pointSize: osSettings.systemFontSize } - TabButton { - text: qsTr("Standard") - font.pointSize: osSettings.systemFontSize - } - TabButton { - text: qsTr("Addon") - font.pointSize: osSettings.systemFontSize - } - - TabButton { - text: qsTr("Adult") - font.pointSize: osSettings.systemFontSize - } } - StackLayout{ id:smileyTabView currentIndex: smileybar.currentIndex @@ -89,7 +74,7 @@ Rectangle{ height: smileyDialog.height-4*root.fontFactor*osSettings.bigFontSize Rectangle{ id: htmlGridTab - color: Material.backgroundColor + color: osSettings.backgroundColor GridView { id:htmlView anchors.fill: parent @@ -109,97 +94,7 @@ Rectangle{ } } } - - Rectangle{ - id: coreGridTab - color: Material.backgroundColor - GridView { - id: coreSmileyView - anchors.fill: parent - cellWidth: 5*mm - cellHeight: 5*mm - clip: true - model: coreSmileyModel - delegate: smileyItem - } - - ListModel{ - id: coreSmileyModel - } - - Component.onCompleted:{ - var smileyarray=Smileyjs.core - for (var icon in smileyarray){ - coreSmileyModel.append({"emoji":smileyarray[icon]}) - } - } - } - - Rectangle{ - id: addonGridTab - color: Material.backgroundColor - GridView { - id: addonView - anchors.fill: parent - cellWidth: 5*mm - cellHeight: 5*mm - clip: true - model: addonModel - delegate: smileyItem - } - - ListModel{ - id: addonModel - } - Component.onCompleted:{ - for (var icon in Smileyjs.addon){ - addonModel.append({"emoji":Smileyjs.addon[icon]}) - } - } - } - - - Rectangle{ - id: adultGridTab - color: Material.backgroundColor - GridView { - id: adultView - anchors.fill: parent - cellWidth: 5*mm - cellHeight: 5*mm - clip: true - model: adultModel - delegate: smileyItem - } - - ListModel{ - id: adultModel - } - Component.onCompleted:{ - for (var icon in Smileyjs.adult){ - adultModel.append({"emoji":Smileyjs.adult[icon]}) - } - } - } } - Component{ - id:smileyItem - AnimatedImage{id:smileyImage - width:4.5*mm - height: 4.5*mm - fillMode:Image.PreserveAspectFit - source:emoji.url - - MouseArea{ - anchors.fill: parent - onClicked:{ - //bodyField.append(emoji.name+" ") - bodyField.insert(bodyField.cursorPosition,emoji.name+" "); - smileyDialog.visible=false - } - } - } - } Component{ id:htmlItem diff --git a/source-linux/qml/photoqml/ImageUploadDialog.qml b/source-linux/qml/photoqml/ImageUploadDialog.qml index 813f07f..0412489 100644 --- a/source-linux/qml/photoqml/ImageUploadDialog.qml +++ b/source-linux/qml/photoqml/ImageUploadDialog.qml @@ -31,7 +31,6 @@ import QtQuick 2.5 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import "qrc:/js/helper.js" as Helperjs import "qrc:/js/image.js" as Imagejs import "qrc:/qml/genericqml" @@ -237,7 +236,7 @@ Page{ Rectangle{ width:root.width/2 //Math.max(20*mm,descriptionInput.contentWidth) height:imageUploadView.height-3*root.fontFactor*osSettings.bigFontSize// 20*mm - color: Material.backgroundColor + color: osSettings.backgroundColor Image{ id: uploadImage width: root.width/2-mm //20*mm @@ -256,7 +255,7 @@ Page{ } Rectangle{ - color: Material.backgroundColor + color: osSettings.backgroundColor border.color: "grey" anchors.top: uploadImage.bottom anchors.topMargin: mm @@ -282,7 +281,7 @@ Page{ BlueButton{ width: 5*root.fontFactor*osSettings.bigFontSize height:imageUploadView.height-3*root.fontFactor*osSettings.bigFontSize - color: Material.backgroundColor + color: osSettings.backgroundColor text:"\u002b" fontSize: 3*osSettings.bigFontSize onClicked:{ diff --git a/source-linux/qml/photoqml/PhotoTab.qml b/source-linux/qml/photoqml/PhotoTab.qml index bd5dafa..1addf00 100644 --- a/source-linux/qml/photoqml/PhotoTab.qml +++ b/source-linux/qml/photoqml/PhotoTab.qml @@ -31,7 +31,6 @@ import QtQuick 2.5 import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 import QtQml.Models 2.1 import "qrc:/js/image.js" as Imagejs import "qrc:/js/helper.js" as Helperjs @@ -44,7 +43,7 @@ StackView{ initialItem:Rectangle { id:fotorectangle anchors.fill:parent - color: Material.backgroundColor + color: osSettings.backgroundColor property var newimages:[] property int currentimageno: 0 property bool remoteContact: false @@ -174,7 +173,7 @@ StackView{ BlueButton{ z:2 visible: !wideScreen - fontColor: Material.secondaryTextColor//"grey" + fontColor: osSettings.secondaryTextColor//"grey" border.color: "transparent" text: "\uf0c9" font.pointSize: osSettings.bigFontSize @@ -287,13 +286,13 @@ StackView{ clip: true model: visualphotoModel.parts.album footer:Rectangle{ - border.color: Material.backgroundDimColor + border.color: osSettings.backgroundDimColor border.width: 1 - color: Material.dialogColor + color: osSettings.dialogColor width:12*mm height:6*mm Text{ - color: Material.primaryTextColor + color: osSettings.primaryTextColor font.pointSize: 0.75*osSettings.systemFontSize anchors.centerIn: parent text:qsTr("More") diff --git a/source-linux/qtquickcontrols2.conf b/source-linux/qtquickcontrols2.conf index 15e32c4..2f6842c 100644 --- a/source-linux/qtquickcontrols2.conf +++ b/source-linux/qtquickcontrols2.conf @@ -1,5 +1,6 @@ [Controls] -Style=Material +Style=Fusion +#Style=Material [Default] Font\Family=Noto Sans From 3c1c97d489748da084f138da573a7998a904702f Mon Sep 17 00:00:00 2001 From: LubuWest Date: Sat, 4 Nov 2023 18:04:55 +0100 Subject: [PATCH 29/35] Dynamic news tabs --- source-android/application.qrc | 1 - source-android/common/alarm.h | 1 - source-android/common/alarmandroid.cpp | 1 - source-android/common/alarmlinux.cpp | 1 - source-android/common/filesystem.cpp | 1 - source-android/common/filesystem.h | 1 - source-android/common/filesystemandroid.cpp | 1 - source-android/common/oauth.cpp | 1 - source-android/common/oauth.h | 1 - .../common/remoteauthasyncimageprovider.cpp | 1 - .../common/remoteauthasyncimageprovider.h | 1 - source-android/common/updatenews.cpp | 1 - source-android/common/updatenews.h | 1 - source-android/common/uploadableimage.cpp | 1 - source-android/common/uploadableimage.h | 1 - source-android/common/xhr.cpp | 1 - source-android/common/xhr.h | 1 - source-android/images | 1 - source-android/js | 1 - source-android/qml/calendarqml | 1 - source-android/qml/configqml | 1 - source-android/qml/contactqml | 1 - source-android/qml/genericqml | 1 - source-android/qml/newsqml | 1 - source-android/qml/photoqml | 1 - source-android/qtquickcontrols2.conf | 1 - source-android/translations | 1 - source-linux/application.qrc | 2 + source-linux/common/xhr.cpp | 8 +- source-linux/js/service.js | 43 ++- source-linux/qml/configqml/AccountPage.qml | 38 ++- .../qml/configqml/ConfigAppearancePage.qml | 61 ++-- .../qml/configqml/LeftDrawerScrollview.qml | 34 ++- source-linux/qml/friendiqa.qml | 7 - source-linux/qml/genericqml/BlueButton.qml | 2 +- .../qml/genericqml/DrawerAccountComponent.qml | 84 +++--- .../DrawerAccountComponentContacts.qml | 5 +- source-linux/qml/genericqml/SearchDialog.qml | 78 ++++++ source-linux/qml/newsqml/Conversation.qml | 14 +- source-linux/qml/newsqml/MessageSend.qml | 13 +- source-linux/qml/newsqml/NewsStack.qml | 264 +++++++++++------- source-linux/qml/newsqml/NewsTab.qml | 122 +++----- source-linux/qml/newsqml/NewsTabbutton.qml | 51 ++++ 43 files changed, 526 insertions(+), 327 deletions(-) delete mode 120000 source-android/application.qrc delete mode 120000 source-android/common/alarm.h delete mode 120000 source-android/common/alarmandroid.cpp delete mode 120000 source-android/common/alarmlinux.cpp delete mode 120000 source-android/common/filesystem.cpp delete mode 120000 source-android/common/filesystem.h delete mode 120000 source-android/common/filesystemandroid.cpp delete mode 120000 source-android/common/oauth.cpp delete mode 120000 source-android/common/oauth.h delete mode 120000 source-android/common/remoteauthasyncimageprovider.cpp delete mode 120000 source-android/common/remoteauthasyncimageprovider.h delete mode 120000 source-android/common/updatenews.cpp delete mode 120000 source-android/common/updatenews.h delete mode 120000 source-android/common/uploadableimage.cpp delete mode 120000 source-android/common/uploadableimage.h delete mode 120000 source-android/common/xhr.cpp delete mode 120000 source-android/common/xhr.h delete mode 120000 source-android/images delete mode 120000 source-android/js delete mode 120000 source-android/qml/calendarqml delete mode 120000 source-android/qml/configqml delete mode 120000 source-android/qml/contactqml delete mode 120000 source-android/qml/genericqml delete mode 120000 source-android/qml/newsqml delete mode 120000 source-android/qml/photoqml delete mode 120000 source-android/qtquickcontrols2.conf delete mode 120000 source-android/translations create mode 100644 source-linux/qml/genericqml/SearchDialog.qml create mode 100644 source-linux/qml/newsqml/NewsTabbutton.qml diff --git a/source-android/application.qrc b/source-android/application.qrc deleted file mode 120000 index 4607047..0000000 --- a/source-android/application.qrc +++ /dev/null @@ -1 +0,0 @@ -../source-linux/application.qrc \ No newline at end of file diff --git a/source-android/common/alarm.h b/source-android/common/alarm.h deleted file mode 120000 index b5e49ca..0000000 --- a/source-android/common/alarm.h +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/alarm.h \ No newline at end of file diff --git a/source-android/common/alarmandroid.cpp b/source-android/common/alarmandroid.cpp deleted file mode 120000 index adb6cb0..0000000 --- a/source-android/common/alarmandroid.cpp +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/alarmandroid.cpp \ No newline at end of file diff --git a/source-android/common/alarmlinux.cpp b/source-android/common/alarmlinux.cpp deleted file mode 120000 index af9de81..0000000 --- a/source-android/common/alarmlinux.cpp +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/alarmlinux.cpp \ No newline at end of file diff --git a/source-android/common/filesystem.cpp b/source-android/common/filesystem.cpp deleted file mode 120000 index 94a7237..0000000 --- a/source-android/common/filesystem.cpp +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/filesystem.cpp \ No newline at end of file diff --git a/source-android/common/filesystem.h b/source-android/common/filesystem.h deleted file mode 120000 index 0ee6500..0000000 --- a/source-android/common/filesystem.h +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/filesystem.h \ No newline at end of file diff --git a/source-android/common/filesystemandroid.cpp b/source-android/common/filesystemandroid.cpp deleted file mode 120000 index dbfaf68..0000000 --- a/source-android/common/filesystemandroid.cpp +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/filesystemandroid.cpp \ No newline at end of file diff --git a/source-android/common/oauth.cpp b/source-android/common/oauth.cpp deleted file mode 120000 index 7e5af5f..0000000 --- a/source-android/common/oauth.cpp +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/oauth.cpp \ No newline at end of file diff --git a/source-android/common/oauth.h b/source-android/common/oauth.h deleted file mode 120000 index 607b211..0000000 --- a/source-android/common/oauth.h +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/oauth.h \ No newline at end of file diff --git a/source-android/common/remoteauthasyncimageprovider.cpp b/source-android/common/remoteauthasyncimageprovider.cpp deleted file mode 120000 index e13424b..0000000 --- a/source-android/common/remoteauthasyncimageprovider.cpp +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/remoteauthasyncimageprovider.cpp \ No newline at end of file diff --git a/source-android/common/remoteauthasyncimageprovider.h b/source-android/common/remoteauthasyncimageprovider.h deleted file mode 120000 index 9a79dbe..0000000 --- a/source-android/common/remoteauthasyncimageprovider.h +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/remoteauthasyncimageprovider.h \ No newline at end of file diff --git a/source-android/common/updatenews.cpp b/source-android/common/updatenews.cpp deleted file mode 120000 index 4d79e7e..0000000 --- a/source-android/common/updatenews.cpp +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/updatenews.cpp \ No newline at end of file diff --git a/source-android/common/updatenews.h b/source-android/common/updatenews.h deleted file mode 120000 index f506bd0..0000000 --- a/source-android/common/updatenews.h +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/updatenews.h \ No newline at end of file diff --git a/source-android/common/uploadableimage.cpp b/source-android/common/uploadableimage.cpp deleted file mode 120000 index 069ff8f..0000000 --- a/source-android/common/uploadableimage.cpp +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/uploadableimage.cpp \ No newline at end of file diff --git a/source-android/common/uploadableimage.h b/source-android/common/uploadableimage.h deleted file mode 120000 index 32396a1..0000000 --- a/source-android/common/uploadableimage.h +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/uploadableimage.h \ No newline at end of file diff --git a/source-android/common/xhr.cpp b/source-android/common/xhr.cpp deleted file mode 120000 index 660c2c7..0000000 --- a/source-android/common/xhr.cpp +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/xhr.cpp \ No newline at end of file diff --git a/source-android/common/xhr.h b/source-android/common/xhr.h deleted file mode 120000 index d383456..0000000 --- a/source-android/common/xhr.h +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/common/xhr.h \ No newline at end of file diff --git a/source-android/images b/source-android/images deleted file mode 120000 index f6e087d..0000000 --- a/source-android/images +++ /dev/null @@ -1 +0,0 @@ -../source-linux/images \ No newline at end of file diff --git a/source-android/js b/source-android/js deleted file mode 120000 index d7539d8..0000000 --- a/source-android/js +++ /dev/null @@ -1 +0,0 @@ -../source-linux/js \ No newline at end of file diff --git a/source-android/qml/calendarqml b/source-android/qml/calendarqml deleted file mode 120000 index efa5132..0000000 --- a/source-android/qml/calendarqml +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/qml/calendarqml \ No newline at end of file diff --git a/source-android/qml/configqml b/source-android/qml/configqml deleted file mode 120000 index 1d9fc92..0000000 --- a/source-android/qml/configqml +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/qml/configqml \ No newline at end of file diff --git a/source-android/qml/contactqml b/source-android/qml/contactqml deleted file mode 120000 index 3e93dac..0000000 --- a/source-android/qml/contactqml +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/qml/contactqml \ No newline at end of file diff --git a/source-android/qml/genericqml b/source-android/qml/genericqml deleted file mode 120000 index 5fdbcc3..0000000 --- a/source-android/qml/genericqml +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/qml/genericqml \ No newline at end of file diff --git a/source-android/qml/newsqml b/source-android/qml/newsqml deleted file mode 120000 index f6ab73f..0000000 --- a/source-android/qml/newsqml +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/qml/newsqml \ No newline at end of file diff --git a/source-android/qml/photoqml b/source-android/qml/photoqml deleted file mode 120000 index 4528ee0..0000000 --- a/source-android/qml/photoqml +++ /dev/null @@ -1 +0,0 @@ -../../source-linux/qml/photoqml \ No newline at end of file diff --git a/source-android/qtquickcontrols2.conf b/source-android/qtquickcontrols2.conf deleted file mode 120000 index 4fb6470..0000000 --- a/source-android/qtquickcontrols2.conf +++ /dev/null @@ -1 +0,0 @@ -../source-linux/qtquickcontrols2.conf \ No newline at end of file diff --git a/source-android/translations b/source-android/translations deleted file mode 120000 index d630c0b..0000000 --- a/source-android/translations +++ /dev/null @@ -1 +0,0 @@ -../source-linux/translations \ No newline at end of file diff --git a/source-linux/application.qrc b/source-linux/application.qrc index 4d944a4..ad823aa 100644 --- a/source-linux/application.qrc +++ b/source-linux/application.qrc @@ -256,5 +256,7 @@ qml/configqml/AcceptRules.qml translations/friendiqa-nl.qm translations/friendiqa-nl.ts + qml/genericqml/SearchDialog.qml + qml/newsqml/NewsTabbutton.qml diff --git a/source-linux/common/xhr.cpp b/source-linux/common/xhr.cpp index adaba69..42042e3 100644 --- a/source-linux/common/xhr.cpp +++ b/source-linux/common/xhr.cpp @@ -233,10 +233,11 @@ void XHR::download() void XHR::get() { QUrlQuery query; - + qDebug() << "get"; QHashIterator i(params); while(i.hasNext()) { i.next(); + qDebug() << "value" << i.value(); query.addQueryItem(i.key(), i.value()); } QUrl requrl(m_url+m_api); @@ -354,6 +355,11 @@ void XHR::onReplyError(QNetworkReply::NetworkError code) void XHR::onReplySuccess() { qDebug() << "!"; + QHashIterator i(params); + while(i.hasNext()) { + i.next(); + qDebug() << i.key()<< " " << i.value(); + } emit this->success(buffer, m_api); buffer.clear(); // reply->deleteLater(); diff --git a/source-linux/js/service.js b/source-linux/js/service.js index bab8db9..daf7fac 100644 --- a/source-linux/js/service.js +++ b/source-linux/js/service.js @@ -34,6 +34,10 @@ .import "qrc:/js/helper.js" as Helperjs .import "qrc:/js/news.js" as Newsjs + +const newsViewType = 'Conversations' +const defaultNewsTypes = encodeURI(JSON.stringify(["Home","Replies","DirectMessages","Notifications"])) //'[\"Home\",\"Replies\",\"DirectMessages\",\"Notifications\"]' + // CONFIG FUNCTIONS function initDatabase(database) { // initialize the database object @@ -171,7 +175,8 @@ function readActiveConfig(database){ function setDefaultOptions(database){ var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); db.transaction( function(tx) { - var rs = tx.executeSql('INSERT INTO globaloptions (k,v) VALUES ("newsViewType","Conversations")'); + let rs = tx.executeSql('INSERT INTO globaloptions (k,v) VALUES ("newsViewType","'+ newsViewType+'")'); + let rs2 = tx.executeSql('INSERT INTO globaloptions (k,v) VALUES ("defaultNewsTypes","'+ defaultNewsTypes+'")'); }) } @@ -180,8 +185,18 @@ function readGlobaloptions(database,callback){ var go=({}); db.transaction( function(tx) { var rs = tx.executeSql('select * from globaloptions'); - for (var r=0; r 0) {// use update - result = tx.executeSql('UPDATE globaloptions SET v="'+value+'" WHERE k="'+key+'"') + result = tx.executeSql('UPDATE globaloptions SET v="'+dbValue+'" WHERE k="'+key+'"') } else {// use insert - result = tx.executeSql('INSERT INTO globaloptions (k,v) VALUES (?,?)', [key,value]) + result = tx.executeSql('INSERT INTO globaloptions (k,v) VALUES (?,?)', [key,dbValue]) } }) root.globaloptions[key]=value; @@ -221,14 +238,14 @@ function deleteConfig(database,userobj,callback) { // delete user data from DB }) } -function updateNewsviewtype(database, newsViewtype){ - var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); - if(!db) { return; } - db.transaction( function(tx) { - var rs1 = tx.executeSql('INSERT INTO globaloptions (k,v) VALUES (?,?)', ["newsViewType",newsViewtype]) - var rs2 = tx.executeSql('UPDATE config SET newsViewType=""'); - }) -} +//function updateNewsviewtype(database, newsViewtype){ +// var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); +// if(!db) { return; } +// db.transaction( function(tx) { +// var rs1 = tx.executeSql('INSERT INTO globaloptions (k,v) VALUES (?,?)', ["newsViewType",newsViewtype]) +// var rs2 = tx.executeSql('UPDATE config SET newsViewType=""'); +// }) +//} function cleanNews(database,callback){ var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); diff --git a/source-linux/qml/configqml/AccountPage.qml b/source-linux/qml/configqml/AccountPage.qml index d076d37..886d1f3 100644 --- a/source-linux/qml/configqml/AccountPage.qml +++ b/source-linux/qml/configqml/AccountPage.qml @@ -62,19 +62,18 @@ Page{ Helperjs.friendicaRequest(userconfig,"/api/v1/accounts/verify_credentials",root,function(obj){ accountBusy.running=false; try{var credentials=JSON.parse(obj); - if (credentials.hasOwnProperty('error')){ + if (credentials.hasOwnProperty('error')){print("error "+credentials.error); Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root) } else{ if (users.length==0){Service.setDefaultOptions(db);} - if (userconfig.APIVersion!=""){userconfig.password=""} + if (userconfig.hasOwnProperty("APIVersion")){userconfig.password=""} if (imagestoredir==""){ imagestoredir=filesystem.homePath+"/"+credentials.username+"/"; userconfig.imagestore=imagestoredir } if(userconfig.imagestore == filesystem.homePath+"/"+credentials.username+"/") {filesystem.makePath(filesystem.homePath+"/"+credentials.username);} - print("imagestoredir "+imagestoredir) filesystem.Directory=imagestoredir; filesystem.makeDir("contacts"); filesystem.makeDir("albums"); @@ -97,7 +96,7 @@ Page{ Helperjs.showMessage(qsTr("Success"),qsTr("Name")+": "+credentials.display_name+"\nScreen Name: "+credentials.username,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 or 2FA enabled!"+e),root)}; }) } @@ -212,6 +211,28 @@ Page{ rootstackView.push("qrc:/qml/configqml/InfoBox.qml"); } } + MButton { + text: "\uf150" + font.family: fontAwesome.name + font.pointSize: osSettings.bigFontSize + Menu { + id:authMethodMenu + width: 10*root.fontFactor*osSettings.systemFontSize + MenuItem { + text: qsTr("OAuth") + font.pointSize: osSettings.systemFontSize + font.bold:accountPage.state=="oauth" + onTriggered: {accountPage.state="oauth"} + } + MenuItem { + text: qsTr("Password") + font.pointSize: osSettings.systemFontSize + font.bold:accountPage.state=="password" + onTriggered: {accountPage.state="password"} + } + } + onClicked: {authMethodMenu.popup()} + } MButton{ id:closeButton visible: users.length>0 @@ -248,7 +269,7 @@ Page{ MButton{ id:serverSearchButton width: 3*root.fontFactor*osSettings.bigFontSize; height: 2.5*root.fontFactor*osSettings.bigFontSize - text:"\uf002" + //text:"\uf002" icon.name: "search" font.pointSize: osSettings.bigFontSize visible: servericon.visible?false:true @@ -353,7 +374,7 @@ Page{ TextField { id: username width: root.width-5*root.fontFactor*osSettings.bigFontSize - height: servername.height + height: 2.5*root.fontFactor*osSettings.bigFontSize; Layout.leftMargin: 3*root.fontFactor*osSettings.bigFontSize; font.pointSize: osSettings.systemFontSize visible: (osSettings.osType=="Android")?(text!= ""):true @@ -370,6 +391,7 @@ Page{ TextField { id: password width: root.width-9*mm; height: 2.5*root.fontFactor*osSettings.bigFontSize; + Layout.leftMargin: 3*root.fontFactor*osSettings.bigFontSize; font.pointSize: osSettings.systemFontSize visible: (osSettings.osType=="Android")?(userButton.text!= qsTr("User")):true selectByMouse: true @@ -469,7 +491,7 @@ Page{ catch(e){print(e)} } - else if (api=="/api/v1/apps"){print("/api/v1/apps text "+text) + else if (api=="/api/v1/apps"){ let app=JSON.parse(text); accountPage.appdata=app; oauth2.setClientId(app.client_id); @@ -546,7 +568,7 @@ Page{ }, State { name:"oauth" - PropertyChanges {target: username; visible: true} + PropertyChanges {target: username; visible: false} PropertyChanges {target: password; visible: false} PropertyChanges {target: confirmationOAuth; visible: true} PropertyChanges {target: setDefault; visible: true} diff --git a/source-linux/qml/configqml/ConfigAppearancePage.qml b/source-linux/qml/configqml/ConfigAppearancePage.qml index c6a0ee0..a758a2f 100644 --- a/source-linux/qml/configqml/ConfigAppearancePage.qml +++ b/source-linux/qml/configqml/ConfigAppearancePage.qml @@ -33,6 +33,7 @@ import QtQuick 2.11 //import QtQuick.Dialogs 1.2 import QtQuick.Controls 2.12 import "qrc:/js/service.js" as Service +import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/configqml" import "qrc:/qml/genericqml" @@ -155,10 +156,37 @@ Page{ // } // } // } + + Column{ - visible: osSettings.osType=="Android" x: root.fontFactor*osSettings.bigFontSize y: 18*root.fontFactor*osSettings.bigFontSize + Label{ + text: qsTr("Default News Tabs") + font.pointSize: osSettings.systemFontSize + } + + Repeater{id:newstypeRepeater + model: 4 + delegate:ComboBox{ + required property int index + model: ["Home", "Replies", "DirectMessages","Favorites","Public Timeline","Notifications"] + currentIndex: model.indexOf(globaloptions.defaultNewsTypes[index]) + onCurrentTextChanged: { + if (currentText !== globaloptions.defaultNewsTypes[index]){ + globaloptions.defaultNewsTypes.splice(index,1,currentText); + Service.updateglobaloptions(root.db,"defaultNewsTypes",globaloptions.defaultNewsTypes) + root.globaloptionsChanged() + } + } + } + } + } + + Column{ + //visible: osSettings.osType=="Android" + x: root.fontFactor*osSettings.bigFontSize + y: 26*root.fontFactor*osSettings.bigFontSize Label{ text: qsTr("Dark Mode") font.pointSize: osSettings.systemFontSize} @@ -198,38 +226,7 @@ Page{ } } - Column{ - x: root.fontFactor*osSettings.bigFontSize - y: 28*root.fontFactor*osSettings.bigFontSize - Label{ - text: qsTr("Toolbar Postion") - font.pointSize: osSettings.systemFontSize} - RadioButton{ - text: qsTr("Top") - checked: (globaloptions["toolbarposition"]==0 || globaloptions["toolbarposition"]==undefined)?true:false - font.pointSize: osSettings.bigFontSize - onClicked: { - if(checked==true){ - Service.updateglobaloptions(root.db,"roottoolbarposition",0); - globaloptions.toolbarposition=0; - root.roottoolbar.position=ToolBar.Header - } - } - } - RadioButton{ - text: qsTr("Bottom") - checked: (globaloptions["toolbarposition"]==1)?true:false - font.pointSize: osSettings.bigFontSize - onClicked: { - if(checked==true){ - Service.updateglobaloptions(root.db,"roottoolbarposition",1); - globaloptions.toolbarposition=1; - root.roottoolbar.position=ToolBar.Footer - } - } - } - } MButton { diff --git a/source-linux/qml/configqml/LeftDrawerScrollview.qml b/source-linux/qml/configqml/LeftDrawerScrollview.qml index 674f8db..cd635d2 100644 --- a/source-linux/qml/configqml/LeftDrawerScrollview.qml +++ b/source-linux/qml/configqml/LeftDrawerScrollview.qml @@ -91,25 +91,33 @@ ScrollView{ } } } + ListModel{id:accountModel} + Component{id:accountLoader + Loader{ + source: bar.currentIndex==0?"qrc:/qml/genericqml/DrawerAccountComponent.qml":"qrc:/qml/genericqml/DrawerAccountComponentContacts.qml" + } + } + ListView{ + id:accountList + y: 6.5*root.fontFactor*osSettings.bigFontSize + width:parent.width + height: contentHeight + model: accountModel + delegate: accountLoader + } } + Component.onCompleted:{ Service.readAllLogins(db,function(accounts){ if (accounts.length>0 && bar.currentIndex==0){ - leftDrawerColumn.height=4.5*root.fontFactor*osSettings.bigFontSize+accounts.length*17*root.fontFactor*osSettings.bigFontSize - for(var i = 0; i < accounts.length; i++) { - var accountComponent = Qt.createComponent("qrc:/qml/genericqml/DrawerAccountComponent.qml"); - var accountQml = accountComponent.createObject(leftDrawerColumn,{ - "y":4.5*root.fontFactor*osSettings.bigFontSize+i*17*root.fontFactor*osSettings.bigFontSize, - "currentnewstabstatus":currentnewstabstatus, - "account":accounts[i]}); + leftDrawerColumn.height=6.5*root.fontFactor*osSettings.bigFontSize+accounts.length*17*root.fontFactor*osSettings.bigFontSize + for(var account in accounts) { + accountModel.append({"account":accounts[account]}) } }else if(accounts.length>0 && bar.currentIndex==1){ - leftDrawerColumn.height=4.5*root.fontFactor*osSettings.bigFontSize+accounts.length*8*root.fontFactor*osSettings.bigFontSize - for(var i = 0; i < accounts.length; i++) { - var accountComponent = Qt.createComponent("qrc:/qml/genericqml/DrawerAccountComponentContacts.qml"); - var accountQml = accountComponent.createObject(leftDrawerColumn,{ - "y":4.5*root.fontFactor*osSettings.bigFontSize+i*8*root.fontFactor*osSettings.bigFontSize, - "account":accounts[i]}); + leftDrawerColumn.height=6.5*root.fontFactor*osSettings.bigFontSize+accounts.length*8*root.fontFactor*osSettings.bigFontSize + for(var account in accounts) { + accountModel.append({"account":accounts[account]}) } } })} diff --git a/source-linux/qml/friendiqa.qml b/source-linux/qml/friendiqa.qml index c47c75c..8dc4ca3 100644 --- a/source-linux/qml/friendiqa.qml +++ b/source-linux/qml/friendiqa.qml @@ -113,10 +113,6 @@ ApplicationWindow{ Service.updateglobaloptions(db,"appWidth",appWidth) } } - } - - Connections { - target: root function onHeightChanged(appHeight) { if(osSettings.osType=="Linux" && Math.abs(appHeight-(globaloptions.appHeight||0))>50){ Service.updateglobaloptions(db,"appHeight",appHeight) @@ -190,7 +186,6 @@ ApplicationWindow{ footer: ToolBar{ id: roottoolbar - //position: ToolBar.Footer//globaloptions.roottoolbarposition==0 || globaloptions.roottoolbarposition==undefined?ToolBar.Header:ToolBar.Footer width:root.width background: Rectangle{ anchors.fill: parent @@ -307,7 +302,6 @@ ApplicationWindow{ } } - Component.onCompleted: { onLoginChanged(login); globaloptions=Service.readGO(db); @@ -326,7 +320,6 @@ ApplicationWindow{ var IntentReceiverQml = component.createObject(root); } else if (osSettings.osType=="Linux"){ - //if (login!=""){newstypeSignal("refresh")} var component = Qt.createComponent("qrc:/qml/genericqml/LinuxSync.qml"); var LinuxSyncQml = component.createObject(root); } diff --git a/source-linux/qml/genericqml/BlueButton.qml b/source-linux/qml/genericqml/BlueButton.qml index b1bc5f0..2375717 100644 --- a/source-linux/qml/genericqml/BlueButton.qml +++ b/source-linux/qml/genericqml/BlueButton.qml @@ -34,7 +34,7 @@ Rectangle{ id: blueButton width: Math.max(mainText.width+2*mm,5*mm) height: 5*mm - border.color: "light blue" + //border.color: "light blue" color:"transparent"//"#EFEAEA" "sky blue" property alias fontColor: mainText.color border.width:1 diff --git a/source-linux/qml/genericqml/DrawerAccountComponent.qml b/source-linux/qml/genericqml/DrawerAccountComponent.qml index a8c9f1a..3833bd2 100644 --- a/source-linux/qml/genericqml/DrawerAccountComponent.qml +++ b/source-linux/qml/genericqml/DrawerAccountComponent.qml @@ -32,11 +32,28 @@ import QtQuick 2.15 import QtQuick.Controls 6.3 import "qrc:/qml/genericqml" +import "qrc:/qml/newsqml" Item { id: drawerAccountComponent - property var account: ({}) - width: parent.width + width: accountList.width + height: 17*root.fontFactor*osSettings.bigFontSize + function changeNews(typeRequest){ + newsSwipeview.stacktype=typeRequest; + if (newstabitem.newstypes.indexOf(typeRequest)<0){ + var component = Qt.createComponent("qrc:/qml/newsqml/NewsStack.qml"); + var newscomp = component.createObject(newsSwipeview,{"expectScreenUpdate":true}); + newsSwipeview.addItem(newscomp); + newstabitem.newstypes.push(typeRequest); + newsSwipeview.currentIndex=newsSwipeview.count; + addToolbutton(typeRequest) + newstabbar.currentIndex=newsSwipeview.count + }else{ + newsSwipeview.currentIndex=newstabitem.newstypes.indexOf(typeRequest); + newstabbar.currentIndex=newstabitem.newstypes.indexOf(typeRequest); + } + } + Label{ y:0.5*root.fontFactor*osSettings.bigFontSize @@ -58,11 +75,10 @@ Item { onClicked: { login=account; if(!wideScreen){leftDrawerAndroid.close()} -// newstypeSignal("refresh") - newsBusy.running=true; - updatenews.setDatabase(); - updatenews.login(); - updatenews.startsync(); + newstypeSignal("") +// updatenews.setDatabase(); +// updatenews.login(); +// updatenews.startsync(); } } } @@ -72,14 +88,14 @@ Item { width:parent.width font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && currentnewstabstatus=="Timeline" + font.bold: account.username==login.username && newsSwipeview.stacktype=="Home" && newstab.newstabstatus=="Timeline" text: "\uf1da " + qsTr("Timeline") MouseArea{ anchors.fill:parent onClicked:{ login=account; if(!wideScreen){leftDrawerAndroid.close()} - newsSwipeview.currentIndex=0; + changeNews("Home"); currentnewstabstatus="Timeline"; newstypeSignal("timeline") } @@ -91,36 +107,34 @@ Item { width:parent.width font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && currentnewstabstatus=="Conversations" + font.bold: account.username==login.username && newsSwipeview.stacktype=="Home" && newstab.newstabstatus=="Conversations" text: "\uf086 " + qsTr("Conversations") MouseArea{ anchors.fill:parent onClicked:{ login=account; if(!wideScreen){leftDrawerAndroid.close()} - newsSwipeview.currentIndex=0; + changeNews("Home"); currentnewstabstatus="Conversations"; newstypeSignal("conversation") } } } - - Label{ y:6.5*root.fontFactor*osSettings.bigFontSize width:parent.width font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && currentnewstabstatus=="Replies" + font.bold: account.username==login.username && newsSwipeview.stacktype=="Replies" text: "\uf0ec " + qsTr("Replies") MouseArea{ anchors.fill:parent onClicked:{ login=account; if(!wideScreen){leftDrawerAndroid.close()} - newsSwipeview.currentIndex=1 - currentnewstabstatus="Replies"; + changeNews("Replies"); + //urrentnewstabstatus="Replies"; newstypeSignal("replies") } } @@ -131,32 +145,33 @@ Item { width:parent.width font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && currentnewstabstatus=="DirectMessages" + font.bold: account.username==login.username && newsSwipeview.stacktype=="DirectMessages" text: "\uf0e0 " + qsTr("Direct Messages") MouseArea{ anchors.fill:parent onClicked:{ login=account; if(!wideScreen){leftDrawerAndroid.close()} - newsSwipeview.currentIndex=2//newstypeSignal("replies") - currentnewstabstatus="DirectMessages"; + changeNews("DirectMessages") + //currentnewstabstatus="DirectMessages"; } } } + Label{ y:9.5*root.fontFactor*osSettings.bigFontSize width:parent.width font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && currentnewstabstatus=="Favorites" + font.bold: account.username==login.username && newsSwipeview.stacktype=="Favorites" text: "\uf005 " + qsTr("Favorites") MouseArea{ anchors.fill:parent onClicked:{ login=account; if(!wideScreen){leftDrawerAndroid.close()} - newsSwipeview.currentIndex=0; - currentnewstabstatus="Favorites"; + changeNews("Favorites") + //currentnewstabstatus="Favorites"; newstypeSignal("favorites") } } @@ -167,14 +182,14 @@ Item { width:parent.width font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && currentnewstabstatus=="Public Timeline" + font.bold: account.username==login.username && newsSwipeview.stacktype=="Public Timeline" text: "\uf0ac " + qsTr("Public Timeline") MouseArea{ anchors.fill:parent onClicked:{ login=account; if(!wideScreen){leftDrawerAndroid.close()} - newsSwipeview.currentIndex=0; + changeNews("Public Timeline") currentnewstabstatus="Public Timeline"; newstypeSignal("publictimeline") } @@ -186,15 +201,14 @@ Item { width:parent.width font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && currentnewstabstatus=="Groupnews" + font.bold: account.username==login.username && newsSwipeview.stacktype=="Groupnews" text: "\uf0c0 " + qsTr("Group news") MouseArea{ anchors.fill:parent onClicked:{ login=account; if(!wideScreen){leftDrawerAndroid.close()} - newsSwipeview.currentIndex=0; - currentnewstabstatus="Groupnews"; + changeNews("Group News") newstypeSignal("groupnews") } } @@ -205,16 +219,19 @@ Item { width:parent.width font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && currentnewstabstatus=="Search" + font.bold: account.username==login.username && newsSwipeview.stacktype=="Search" text: "\uf002 " + qsTr("Search") MouseArea{ anchors.fill:parent onClicked:{ login=account; if(!wideScreen){leftDrawerAndroid.close()} - newsSwipeview.currentIndex=0; - currentnewstabstatus="Search"; - newstypeSignal("search") +// newsSwipeview.currentIndex=0; +// currentnewstabstatus="Search"; +// newstypeSignal("search") + var component = Qt.createComponent("qrc:/qml/genericqml/SearchDialog.qml"); + var searchItem = component.createObject(newstab,{"selfdestroying":true}); + searchItem.open() } } } @@ -224,15 +241,14 @@ Item { width:parent.width font.family: fontAwesome.name font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && currentnewstabstatus=="Notifications" + font.bold: account.username==login.username && newsSwipeview.stacktype=="Notifications" text: "\uf0f3 " + qsTr("Notifications") MouseArea{ anchors.fill:parent onClicked:{ login=account; if(!wideScreen){leftDrawerAndroid.close()} - newsSwipeview.currentIndex=3; - currentnewstabstatus="Notifications"; + changeNews("Notifications") newstypeSignal("notifications") } } diff --git a/source-linux/qml/genericqml/DrawerAccountComponentContacts.qml b/source-linux/qml/genericqml/DrawerAccountComponentContacts.qml index d5f4f7e..3f8018c 100644 --- a/source-linux/qml/genericqml/DrawerAccountComponentContacts.qml +++ b/source-linux/qml/genericqml/DrawerAccountComponentContacts.qml @@ -35,11 +35,10 @@ import "qrc:/qml/genericqml" Item { id: drawerAccountComponent - property var account: ({}) - width: parent.width + width: accountList.width + height: 8*root.fontFactor*osSettings.bigFontSize Label{ - y:0.5*osSettings.bigFontSize width:parent.width height: 1.5*root.fontFactor*osSettings.bigFontSize diff --git a/source-linux/qml/genericqml/SearchDialog.qml b/source-linux/qml/genericqml/SearchDialog.qml new file mode 100644 index 0000000..8a57e30 --- /dev/null +++ b/source-linux/qml/genericqml/SearchDialog.qml @@ -0,0 +1,78 @@ +// This file is part of Friendiqa +// https://github.com/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + +import QtQuick 2.7 +import QtQuick.Controls 2.12 +import "qrc:/qml/genericqml" + +Dialog { + id: searchDialog +// width: 0.5*parent.width +// height: 0.5*parent.height + anchors.centerIn: parent + title: qsTr("Search") + standardButtons: Dialog.Ok | Dialog.Abort + modal: true + onAccepted: { + + } + onRejected: {close()} + property bool selfdestroying:true +/* anchors.left: parent.left + anchors.leftMargin:mm + anchors.top:parent.top + anchors.topMargin: 0.5*mm + width:parent.width-2*mm + height: 4*mm *///Math.max( searchText.contentHeight,5*mm) + + TextInput { + id: searchText + color: osSettings.primaryTextColor + focus: true + font.pointSize: osSettings.bigFontSize + wrapMode: Text.Wrap + anchors.fill: parent + selectByMouse: true + cursorVisible: false + onAccepted:{ + if (displayText!=""){ + var component = Qt.createComponent("qrc:/qml/newsqml/NewsStack.qml"); + var newscomp = component.createObject(newsSwipeview,{"expectScreenUpdate":true}); + newsSwipeview.addItem(newscomp); + newsSwipeview.currentIndex=newsSwipeview.count; + currentnewstabstatus="Public Timeline"; + newscomp.search(displayText) + }; + if(selfdestroying){close()} + } + } + Component.onCompleted: searchText.forceActiveFocus() +} diff --git a/source-linux/qml/newsqml/Conversation.qml b/source-linux/qml/newsqml/Conversation.qml index c51dccb..5104c4c 100644 --- a/source-linux/qml/newsqml/Conversation.qml +++ b/source-linux/qml/newsqml/Conversation.qml @@ -32,7 +32,7 @@ // ConversationView with button import QtQuick 2.0 import QtQuick.Controls 2.12 -import "qrc:/js/helper.js" as Helperjs +//import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" import "qrc:/qml/newsqml" @@ -88,6 +88,17 @@ Page { return {likeText:likeText,dislikeText:dislikeText,attendyesText:attendyesText,attendnoText:attendnoText,attendmaybeText:attendmaybeText} } + function openMessageSend(messageState,newsitemobject){ + var parentId="" + var replyUser="" + if(newsitemobject!=""){ + parentId=newsitemobject.id + replyUser=newsitemobject.user.screen_name; + } + var messageObject = Qt.createComponent("qrc:/qml/newsqml/MessageSend.qml"); + var messageWindow=messageObject.createObject(root, { parentId: parentId, reply_to_user: replyUser, windowstate: messageState }); + messageWindow.show(); + } ListView { id: conversationView @@ -140,7 +151,6 @@ Page { width: 2*root.fontFactor*osSettings.bigFontSize; text: "\uf057" onClicked: { - //newsView.positionViewAtIndex(newsStack.conversationIndex,ListView.Beginning); newstab.conversation=[]; if (rootstackView.depth>1){ rootstackView.pop()} } diff --git a/source-linux/qml/newsqml/MessageSend.qml b/source-linux/qml/newsqml/MessageSend.qml index 6b7ca44..96988e2 100644 --- a/source-linux/qml/newsqml/MessageSend.qml +++ b/source-linux/qml/newsqml/MessageSend.qml @@ -46,7 +46,7 @@ import "qrc:/qml/newsqml" Window{ color: osSettings.backgroundColor width: parent.width - height: parent.height//messageColumn.height+2*mm + height: 2/3*parent.height//messageColumn.height+2*mm id: messageSend property bool wideScreen : width>height // visible: conversation || (newstab.newstabstatus!="Search")?true:false @@ -391,6 +391,7 @@ Window{ MButton { id: boldButton text: "\uf032" // icon-bold + ToolTip.delay: 500 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Bold") focusPolicy: Qt.NoFocus @@ -406,6 +407,7 @@ Window{ MButton { id: italicButton text: "\uf033" // icon-italic + ToolTip.delay: 500 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Italic") focusPolicy: Qt.NoFocus @@ -418,6 +420,7 @@ Window{ MButton { id: liststyleButton text: "\uf03a" // icon-align-justify + ToolTip.delay: 500 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Create list") // focusPolicy: Qt.NoFocus @@ -428,6 +431,7 @@ Window{ MButton { id: codeblockButton text: "\uf121" // icon-code + ToolTip.delay: 500 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Format as code") // focusPolicy: Qt.NoFocus @@ -438,6 +442,7 @@ Window{ MButton { id: plainButton text: bodyField.textFormat==TextEdit.PlainText?qsTr("Rendered"):qsTr("MD") // icon-code + ToolTip.delay: 500 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Show Markdown code") // focusPolicy: Qt.NoFocus @@ -472,6 +477,7 @@ Window{ MButton{ id:smileyButton text: "\uf118" + ToolTip.delay: 500 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Insert smiley") height: 3*root.fontFactor*osSettings.bigFontSize @@ -482,6 +488,7 @@ Window{ MButton{ id:hastagButton text: "\uf292" + ToolTip.delay: 500 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Insert previous hashtag") height: 3*root.fontFactor*osSettings.bigFontSize @@ -492,6 +499,7 @@ Window{ id:imagesButton visible:(newsSwipeview.stacktype!="DirectMessages") text: "\uf03e" + ToolTip.delay: 500 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Insert images") height: 3*root.fontFactor*osSettings.bigFontSize @@ -506,6 +514,7 @@ Window{ MButton { id: cancelButton + ToolTip.delay: 500 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Cancel message") height: 3*root.fontFactor*osSettings.bigFontSize @@ -515,6 +524,7 @@ Window{ } MButton { id: formatButton + ToolTip.delay: 500 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Format message") height: 3*root.fontFactor*osSettings.bigFontSize @@ -524,6 +534,7 @@ Window{ } MButton { id: sendButton + ToolTip.delay: 500 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Send message") height: 3*root.fontFactor*osSettings.bigFontSize diff --git a/source-linux/qml/newsqml/NewsStack.qml b/source-linux/qml/newsqml/NewsStack.qml index 906dcf5..7781190 100644 --- a/source-linux/qml/newsqml/NewsStack.qml +++ b/source-linux/qml/newsqml/NewsStack.qml @@ -34,11 +34,12 @@ import QtQuick.Controls 2.12 import "qrc:/js/news.js" as Newsjs import "qrc:/js/helper.js" as Helperjs import "qrc:/js/service.js" as Service +import "qrc:/qml/genericqml" Rectangle{ id: newsStack - width: parent.width - height: parent.height + // width: parent.width + // height: parent.height color: osSettings.backgroundColor property string updateMethodNews: "refresh" property var allchats: ({}) @@ -46,92 +47,109 @@ Rectangle{ property string newstabstatus: "" property bool expectScreenUpdate: false - function newstypeHandling(newstype){ - try{newsBusy.running=true}catch(e){print(e)}; - root.replySignal(""); - switch(newstype){ - case "timeline": - newstab.newstabstatus="Timeline"; - try{ Newsjs.newsfromdb(root.db,root.login,0, function(dbnews,lastid){ - lastnewsid=lastid; - showNews(dbnews) - })}catch(e){//Helperjs.showMessage("Error",e,root) - }; - break; - case "conversation": - newsStack.updateMethodNews="conversation"; - newstab.newstabstatus="Conversations"; - Newsjs.chatsfromdb(root.db,root.login,0,[],function(news,lastid){ - lastnewsid=lastid; - showNews(news)}); - break; - case "favorites": - newsStack.updateMethodNews="refresh"; - newstab.newstabstatus="Favorites"; - Service.updateView("Favorites"); - expectScreenUpdate=true; - break; - case "replies": - newsStack.updateMethodNews="refresh"; - newstab.newstabstatus="Replies"; - Service.updateView("Replies"); - expectScreenUpdate=true; - break; - case "publictimeline": - newsStack.updateMethodNews="refresh"; - newstab.newstabstatus="Public Timeline"; - Service.updateView("Public Timeline"); - expectScreenUpdate=true; - break; - case "groupnews": - newsStack.updateMethodNews="refresh"; - newstab.newstabstatus="Groupnews"; - Service.showGroups(); - expectScreenUpdate=true; - break; - case "search": - newsView.anchors.topMargin=7*mm; - newstab.newstabstatus="Search"; - newsBusy.running=false; - var leftoffset=(osSettings.osType=="Android")?2*root.fontFactor*osSettings.bigFontSize:0 - var component = Qt.createComponent("qrc:/qml/genericqml/Search.qml"); - var searchItem = component.createObject(newsStack,{y:mm,x:leftoffset,width:root.width-(leftoffset+mm),height: 1.5*root.fontFactor*osSettings.systemFontSize,selfdestroying:true}); - break; - case "refresh": - if (newstab.newstabstatus=="Timeline" || newstabstatus=="Timeline"){ - newsStack.updateMethodNews="append" - } else if (newstab.newstabstatus=="Conversations" || newstabstatus=="Conversations"){ - newsStack.updateMethodNews="conversation"} - else {newsStack.updateMethodNews="refresh"} - - if (newsSwipeview.stacktype=="Home"){ - Service.updateView(newstab.newstabstatus) + function newstypeHandling(newstype){print("newstype "+newstype) + if (!newsBusy.running) { + try{newsBusy.running=true}catch(e){print(e)}; + //root.replySignal(""); + switch(newstype){ + case "timeline": + newstab.newstabstatus="Timeline"; + try{ Newsjs.newsfromdb(root.db,root.login,0, function(dbnews,lastid){ + lastnewsid=lastid; + showNews(dbnews) + })}catch(e){//Helperjs.showMessage("Error",e,root) + }; + break; + case "conversation": + newsStack.updateMethodNews="conversation"; + newstab.newstabstatus="Conversations"; + Newsjs.chatsfromdb(root.db,root.login,0,[],function(news,lastid){ + lastnewsid=lastid; + showNews(news)}); + break; + case "favorites": + newsStack.updateMethodNews="refresh"; + newstab.newstabstatus="Favorites"; + Service.updateView("Favorites"); + expectScreenUpdate=true; + break; + case "replies": + newsStack.updateMethodNews="refresh"; + newstab.newstabstatus="Replies"; + Service.updateView("Replies"); + expectScreenUpdate=true; + break; + case "publictimeline": + newsStack.updateMethodNews="refresh"; + newstab.newstabstatus="Public Timeline"; + Service.updateView("Public Timeline"); + expectScreenUpdate=true; + break; + case "groupnews": + newsStack.updateMethodNews="refresh"; + newstab.newstabstatus="Groupnews"; + Service.showGroups(); + expectScreenUpdate=true; + break; + case "search": + newsView.anchors.topMargin=7*mm; + newstab.newstabstatus="Search"; + newsBusy.running=false; + var leftoffset=(osSettings.osType=="Android")?2*root.fontFactor*osSettings.bigFontSize:0 + var component = Qt.createComponent("qrc:/qml/genericqml/Search.qml"); + var searchItem = component.createObject(newsStack,{y:mm,x:leftoffset,width:root.width-(leftoffset+mm),height: 1.5*root.fontFactor*osSettings.systemFontSize,selfdestroying:true}); + break; + case "refresh": + if (newstab.newstabstatus=="Timeline" || newstabstatus=="Timeline"){ + newsStack.updateMethodNews="append" + } else if (newstab.newstabstatus=="Conversations" || newstabstatus=="Conversations"){ + newsStack.updateMethodNews="conversation"} + else {newsStack.updateMethodNews="refresh"} + //root.contactLoadType="news"; + if (newsSwipeview.stacktype=="Home"){ + Service.updateView(newstab.newstabstatus,lastnewsid) + } + else if (newsSwipeview.stacktype=="Directmessage"){ + Service.updateView("Direct Messages",lastnewsid) + } + else if (newsSwipeview.stacktype=="Notifications"){ + Service.updateView("Notifications") + } + expectScreenUpdate=true; + break; + default: + if (newstab.newstabstatus=="Timeline" || newstabstatus=="Timeline"){ + newsStack.updateMethodNews="append" + } else if (newstab.newstabstatus=="Conversations" || newstabstatus=="Conversations"){ + newsStack.updateMethodNews="conversation"} + else {newsStack.updateMethodNews="refresh"} + //root.contactLoadType="news"; + if (newsSwipeview.stacktype=="Home"){ + Service.updateView(newstab.newstabstatus,lastnewsid) + } + else if (newsSwipeview.stacktype=="Directmessage"){ + Service.updateView("Direct Messages",lastnewsid) + } + else if (newsSwipeview.stacktype=="Notifications"){ + Service.updateView("Notifications",lastnewsid) + } + else if (newsSwipeview.stacktype=="Favorites"){ + Service.updateView("Favorites",lastnewsid) + } + else if (newsSwipeview.stacktype=="Replies"){ + Service.updateView("Replies",lastnewsid) + } + else if (newsSwipeview.stacktype=="Public Timeline"){ + Service.updateView("Public Timeline",lastnewsid) + } + else if (newsSwipeview.stacktype=="Search"){ + Service.updateView("Search",lastnewsid) + } + else{ + Service.updateView(newstab.newstabstatus,lastnewsid) + } + expectScreenUpdate=true; } - else if (newsSwipeview.stacktype=="DirectMessage"){ - Service.updateView("Direct Messages") - } - else if (newsSwipeview.stacktype=="Notifications"){ - Service.updateView("Notifications") - } - expectScreenUpdate=true; - break; - default: - if (newstab.newstabstatus=="Timeline" || newstabstatus=="Timeline"){ - newsStack.updateMethodNews="append" - } else if (newstab.newstabstatus=="Conversations" || newstabstatus=="Conversations"){ - newsStack.updateMethodNews="conversation"} - else {newsStack.updateMethodNews="refresh"} - //root.contactLoadType="news"; - if (newsSwipeview.stacktype=="Home"){ - Service.updateView(newstab.newstabstatus) - } - else if (newsSwipeview.stacktype=="Directmessage"){ - Service.updateView("Direct Messages") - } - else if (newsSwipeview.stacktype=="Notifications"){ - Service.updateView("Notifications") - } - expectScreenUpdate=true; } } @@ -161,7 +179,7 @@ Rectangle{ newsView.anchors.topMargin=mm } - function getOldNews(){ + function getOldNews(){print("getoldnews") var currentTime= new Date(); try{var oldnewsitemobject=newsModel.get(newsModel.count-1).newsitemobject; @@ -199,13 +217,13 @@ Rectangle{ else if (newstab.newstabstatus=="Notifications" || newstabstatus=="Notifications"){} else{ - switch(newsSwipeview.stacktype){ - case "Home":messagetype=0;break; - case "DirectMessages": messagetype=1;break; - case "Notifications":messagetype=2;break; - case "Replies":messagetype=3;break; - default:messagetype=0; - } + // switch(newsSwipeview.stacktype){ + // case "Home":messagetype=0;break; + // case "DirectMessages": messagetype=1;break; + // case "Notifications":messagetype=2;break; + // case "Replies":messagetype=3;break; + // default:messagetype=0; + // } try{xhr.setParam("max_id",newsModel.get(newsModel.count-1).newsitemobject.id-1);}catch(e){} xhr.get() @@ -215,20 +233,24 @@ Rectangle{ function loadDBNews(){ - var messagetype=0; + var messagetype=99; switch(newsSwipeview.stacktype){ case "Home":messagetype=0;break; case "DirectMessages": messagetype=1;break; case "Notifications":messagetype=2;break; case "Replies":messagetype=3;break; - default:messagetype=0; + default:messagetype=99; } + print("messagetype " + messagetype); if((newstabstatus=="Conversations")&&(newsSwipeview.stacktype=="Home")){ Newsjs.chatsfromdb(db,login,messagetype,[],function(dbnews,lastid){ lastnewsid=lastid; showNews(dbnews); }) } + else if (messagetype==99){ + newstypeHandling() + } else{ Newsjs.newsfromdb(db,login,messagetype,function(dbnews,lastid){ lastnewsid=lastid; @@ -243,7 +265,7 @@ Rectangle{ newsBusy.running=false; expectScreenUpdate=false; } - function onSuccess(data,api){ + function onSuccess(data,api){print("newsstack api "+api); const newsApiArray=["/api/statuses/friends_timeline", "/api/direct_messages/all", "/api/direct_messages/conversation", @@ -258,12 +280,11 @@ Rectangle{ "/api/lists/statuses", "/api/statuses/update", "/api/direct_messages/new" - ]; + ]; if(newsApiArray.includes(api) && expectScreenUpdate==true){ expectScreenUpdate=false; Service.processNews(api,data) - root.replySignal("") - expectScreenUpdate=false; + //root.replySignal("") } } } @@ -282,7 +303,7 @@ Rectangle{ } Timer {id:replytimer; interval: 1000; running: false; repeat: false - onTriggered: { + onTriggered: {print("replytimer") newsBusy.running=true; if(newstab.newstabstatus=="Conversation"){ showConversation(newsStack.timelineIndex-1,newsModel.get(0).newsitemobject)} @@ -344,6 +365,17 @@ Rectangle{ } } + BusyIndicator{ + id: newsBusy + anchors.horizontalCenter: newsStack.horizontalCenter + anchors.top:parent.top + anchors.topMargin: mm + width: 2*root.fontFactor*osSettings.bigFontSize + height: 2*root.fontFactor*osSettings.bigFontSize + z:2 + running: false + } + ListView { id: newsView property real oldContentY:0 @@ -450,6 +482,33 @@ Rectangle{ source: "qrc:/js/newsworker.js" } + Text { + id: closeButton + //Svisible: !(globaloptions.defaultNewsTypes.indexOf(newsSwipeview.stacktype)>-1) + anchors.top: parent.top + anchors.topMargin: 1*mm + anchors.right: parent.right + anchors.rightMargin: 1*mm + width: root.fontFactor*osSettings.bigFontSize*2 + height: root.fontFactor*osSettings.bigFontSize*2 + font.bold: true + font.family: fontAwesome.name + font.pointSize: osSettings.bigFontSize + HoverHandler{id:closehover} + ToolTip.visible: closehover.hovered + ToolTip.text: qsTr("Close this timeline") + text: "\uf057" + MouseArea{ + anchors.fill: parent + onClicked: { + newstabitem.newstypes.splice(newsSwipeview.currentIndex,1) + newstabbar.removeItem(newstabbar.contentChildren[newstabbar.currentIndex]); + newstabbar.currentIndex=0; + newsSwipeview.removeItem(newsStack) + newsSwipeview.currentIndex=0; + } + } + } Rectangle{ id:downloadNotice @@ -476,6 +535,7 @@ Rectangle{ } Component.onCompleted: { + print("globaloptions.defaultNewsTypes.indexOf(newsSwipeview.stacktype)>-1 " +(globaloptions.defaultNewsTypes.indexOf(newsSwipeview.stacktype)>-1)) root.newstypeSignal.connect(newstypeHandling); root.contactdetailsSignal.connect(showContact); root.newsSignal.connect(showNews); diff --git a/source-linux/qml/newsqml/NewsTab.qml b/source-linux/qml/newsqml/NewsTab.qml index 45e61c1..65a92db 100644 --- a/source-linux/qml/newsqml/NewsTab.qml +++ b/source-linux/qml/newsqml/NewsTab.qml @@ -41,6 +41,7 @@ Page{ id:newstabitem width:rootstack.width height: rootstack.height + property var newstypes: globaloptions.hasOwnProperty("defaultNewsTypes")?globaloptions.defaultNewsTypes:["Home","Replies","DirectMessages","Notifications"] Timer {id:contacttimer; interval: 50; running: false; repeat: false onTriggered: { @@ -126,6 +127,24 @@ Page{ messageWindow.show(); } + function getIcon(typerequest){ + switch (typerequest){ + case "Home": return "\uf015" + case "Favorites": return "\uf005"; + case "Replies": return "\uf0ec"; + case "DirectMessages": return "\uf0e0"; + case "Public Timeline": return "\uf0ac"; + case "Group News": return "\uf0c0"; + case "Search": return "\uf002"; + case "Notifications": return "\uf0f3"; + } + } + + function addToolbutton(buttontype){ + var component = Qt.createComponent("qrc:/qml/newsqml/NewsTabbutton.qml"); + var tabcomp = component.createObject(newstabbar,{"buttontype":buttontype}); + newstabbar.addItem(tabcomp); + } // CalendarTab{ // visible: wideScreen&&rootstackView.depth<2 // width: newstabitem.width/3 @@ -140,7 +159,7 @@ Page{ // anchors.left: newsSwipeview.right // } - MessageSend{} + //MessageSend{} BlueButton{ z:2 @@ -184,64 +203,13 @@ Page{ id: newstabbar x: leftDrawer.width width: newsSwipeview.width + height: contentHeight+2 spacing: 1 position: TabBar.Header onCurrentIndexChanged: { newsSwipeview.currentIndex=newstabbar.currentIndex; } - TabButton { - font.family: fontAwesome.name - font.pointSize : osSettings.bigFontSize - width: newstabbar.width/5 - text: "\uf015" - background:Rectangle{ - anchors.fill: parent - color: osSettings.backgroundDimColor - border.color: newsSwipeview.currentIndex==0?osSettings.accentColor:color - } - ToolTip.visible: pressed || hovered - ToolTip.text: qsTr("Home") - onDoubleClicked: {newstypeSignal("refresh")} - } - TabButton { - font.family: fontAwesome.name - font.pointSize: osSettings.bigFontSize - width: newstabbar.width/5 - text: "\uf0ec" - background:Rectangle{ - anchors.fill: parent - color: osSettings.backgroundDimColor - border.color: newsSwipeview.currentIndex==1?osSettings.accentColor:color - } - ToolTip.visible: pressed || hovered - ToolTip.text: qsTr("Replies") - } - TabButton { - font.family: fontAwesome.name - font.pointSize: osSettings.bigFontSize - width: newstabbar.width/5 - text: "\uf0e0" - background:Rectangle{ - anchors.fill: parent - color: osSettings.backgroundDimColor - border.color: newsSwipeview.currentIndex==2?osSettings.accentColor:color - } - ToolTip.visible: pressed || hovered - ToolTip.text: qsTr("Direct Messages") - } - TabButton { - font.family: fontAwesome.name - font.pointSize: osSettings.bigFontSize - width: newstabbar.width/5 - text: "\uf0f3" - background:Rectangle{ - anchors.fill: parent - color: osSettings.backgroundDimColor - border.color: newsSwipeview.currentIndex==3?osSettings.accentColor:color - } - ToolTip.visible: pressed || hovered - ToolTip.text: qsTr("Notifications") - } + clip: true } SwipeView{ @@ -255,38 +223,22 @@ Page{ function onDirectMessage(friend){currentIndex=2} onCurrentIndexChanged: { - switch(currentIndex){ - case 0: stacktype="Home";break; - case 1: stacktype="Replies";break; - case 2: stacktype="DirectMessages";break; - case 3: stacktype="Notifications";break; - default: stacktype="Home"; - } + if(newstypes[currentIndex]){stacktype=newstypes[currentIndex]} + else{stacktype="Home"} } - //anchors.fill: parent Loader{ - id: friendstimeline source:(newsSwipeview.currentIndex==0)? "qrc:/qml/newsqml/NewsStack.qml":"" - //onLoaded: newsSwipeview.stacktype="Home" } Loader{ - id: replies - //property string stacktype:"Replies" source:(newsSwipeview.currentIndex==1)? "qrc:/qml/newsqml/NewsStack.qml":"" - //onLoaded: newsSwipeview.stacktype="Replies" } Loader{ - id: directmessages - property var friend:({}) + //property var friend:({}) source:(newsSwipeview.currentIndex==2)? "qrc:/qml/newsqml/NewsStack.qml":"" - //onLoaded: newsSwipeview.stacktype="DirectMessages" } Loader{ - id: notifications - //property string stacktype:"Notifications" source:(newsSwipeview.currentIndex==3)? "qrc:/qml/newsqml/NewsStack.qml":"" - //onLoaded: newsSwipeview.stacktype="Notifications" } } @@ -301,16 +253,20 @@ Page{ anchors.horizontalCenter: parent.horizontalCenter } - BusyIndicator{ - id: newsBusy - anchors.horizontalCenter: newsSwipeview.horizontalCenter - anchors.top:parent.top - anchors.topMargin: mm - width: 2*root.fontFactor*osSettings.bigFontSize - height: 2*root.fontFactor*osSettings.bigFontSize - z:2 - running: false + Connections{ + target: root + function onGlobaloptionsChanged(){ + newstypes=globaloptions.defaultNewsTypes; + while (newstabbar.count>0){ + newstabbar.removeItem(newstabbar.contentData[0]); + } + for (let view in newstypes){ + addToolbutton(newstypes[view]) + } + } } - Component.onCompleted: {root.directmessageSignal.connect(newsSwipeview.onDirectMessage)} + Component.onCompleted: { + root.directmessageSignal.connect(newsSwipeview.onDirectMessage) + } } diff --git a/source-linux/qml/newsqml/NewsTabbutton.qml b/source-linux/qml/newsqml/NewsTabbutton.qml new file mode 100644 index 0000000..cbde67c --- /dev/null +++ b/source-linux/qml/newsqml/NewsTabbutton.qml @@ -0,0 +1,51 @@ +// This file is part of Friendiqa +// https://git.friendi.ca/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + +import QtQuick 2.15 +import QtQuick.Controls 6.3 + +TabButton { + id: tabbutton + font.family: fontAwesome.name + font.pointSize : osSettings.bigFontSize + width: newstabbar.width/5 + property string buttontype: "" + text: getIcon(buttontype) + background:Rectangle{ + anchors.fill: parent + color: osSettings.backgroundDimColor + border.color: newstypes[newsSwipeview.currentIndex]==buttontype?osSettings.accentColor:color + } + ToolTip.delay: 500 + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr(buttontype) + onDoubleClicked: {newstypeSignal(buttontype)} +} From 8391b028f492e656503f78ea41378c355b0d10e2 Mon Sep 17 00:00:00 2001 From: LubuWest Date: Fri, 5 Apr 2024 19:28:47 +0200 Subject: [PATCH 30/35] button icons and dynamic news tabs --- source-linux/application.qrc | 262 -------------- source-linux/friendiqa.pro | 65 ---- source-linux/images/addImage.png | Bin 371 -> 0 bytes source-linux/images/fontawesome-webfont.ttf | Bin 165548 -> 0 bytes source-linux/images/smileys/adult/bong.gif | Bin 1864 -> 0 bytes source-linux/images/smileys/adult/drunk.gif | Bin 648 -> 0 bytes source-linux/images/smileys/adult/finger.gif | Bin 115 -> 0 bytes source-linux/images/smileys/adult/sperm.gif | Bin 2908 -> 0 bytes source-linux/images/smileys/adult/tits.gif | Bin 696 -> 0 bytes source-linux/images/smileys/animals/bee.gif | Bin 4506 -> 0 bytes .../images/smileys/animals/bigspider.gif | Bin 25978 -> 0 bytes source-linux/images/smileys/animals/bunny.gif | Bin 1482 -> 0 bytes .../images/smileys/animals/bunnyflowers.gif | Bin 6640 -> 0 bytes source-linux/images/smileys/animals/cat.gif | Bin 864 -> 0 bytes source-linux/images/smileys/animals/chick.gif | Bin 3667 -> 0 bytes source-linux/images/smileys/animals/cow.gif | Bin 780 -> 0 bytes source-linux/images/smileys/animals/crab.gif | Bin 2718 -> 0 bytes source-linux/images/smileys/animals/dog.gif | Bin 5371 -> 0 bytes .../images/smileys/animals/dolphin.gif | Bin 1581 -> 0 bytes .../images/smileys/animals/dragonfly.gif | Bin 2545 -> 0 bytes .../images/smileys/animals/elephant.gif | Bin 951 -> 0 bytes source-linux/images/smileys/animals/fish.gif | Bin 4499 -> 0 bytes source-linux/images/smileys/animals/frog.gif | Bin 1580 -> 0 bytes .../images/smileys/animals/giraffe.gif | Bin 4896 -> 0 bytes .../images/smileys/animals/hamster.gif | Bin 1246 -> 0 bytes source-linux/images/smileys/animals/horse.gif | Bin 2464 -> 0 bytes .../images/smileys/animals/ladybird.gif | Bin 990 -> 0 bytes .../images/smileys/animals/monkey.gif | Bin 4901 -> 0 bytes .../images/smileys/animals/parrot.gif | Bin 1770 -> 0 bytes source-linux/images/smileys/animals/pig.gif | Bin 925 -> 0 bytes source-linux/images/smileys/animals/sheep.gif | Bin 7631 -> 0 bytes source-linux/images/smileys/animals/snail.gif | Bin 645 -> 0 bytes source-linux/images/smileys/animals/tux.gif | Bin 1573 -> 0 bytes source-linux/images/smileys/babies/baby.gif | Bin 334 -> 0 bytes .../images/smileys/babies/babycot.gif | Bin 3453 -> 0 bytes .../images/smileys/babies/pregnant.gif | Bin 1507 -> 0 bytes source-linux/images/smileys/babies/stork.gif | Bin 18986 -> 0 bytes .../images/smileys/confused/confused.gif | Bin 594 -> 0 bytes .../images/smileys/confused/dazed.gif | Bin 1614 -> 0 bytes .../images/smileys/confused/shrug.gif | Bin 184 -> 0 bytes .../images/smileys/confused/stupid.gif | Bin 10700 -> 0 bytes source-linux/images/smileys/cool/affro.gif | Bin 158 -> 0 bytes source-linux/images/smileys/cool/cool.gif | Bin 5140 -> 0 bytes source-linux/images/smileys/core/beer_mug.gif | Bin 1021 -> 0 bytes source-linux/images/smileys/core/coffee.gif | Bin 231 -> 0 bytes source-linux/images/smileys/core/dislike.gif | Bin 119 -> 0 bytes .../images/smileys/core/friendica-16.png | Bin 756 -> 0 bytes source-linux/images/smileys/core/like.gif | Bin 119 -> 0 bytes source-linux/images/smileys/core/rm-16.png | Bin 676 -> 0 bytes .../images/smileys/core/smiley-Oo.gif | Bin 1003 -> 0 bytes .../smileys/core/smiley-bangheaddesk.gif | Bin 885 -> 0 bytes .../smileys/core/smiley-brokenheart.gif | Bin 598 -> 0 bytes .../images/smileys/core/smiley-cool.gif | Bin 315 -> 0 bytes .../images/smileys/core/smiley-cry.gif | Bin 303 -> 0 bytes .../images/smileys/core/smiley-embarassed.gif | Bin 300 -> 0 bytes .../images/smileys/core/smiley-facepalm.gif | Bin 582 -> 0 bytes .../smileys/core/smiley-foot-in-mouth.gif | Bin 306 -> 0 bytes .../images/smileys/core/smiley-frown.gif | Bin 301 -> 0 bytes .../images/smileys/core/smiley-heart.gif | Bin 577 -> 0 bytes .../images/smileys/core/smiley-kiss.gif | Bin 299 -> 0 bytes .../images/smileys/core/smiley-laughing.gif | Bin 306 -> 0 bytes .../images/smileys/core/smiley-smile.gif | Bin 306 -> 0 bytes .../images/smileys/core/smiley-surprised.gif | Bin 303 -> 0 bytes .../images/smileys/core/smiley-thumbsup.gif | Bin 1350 -> 0 bytes .../images/smileys/core/smiley-tongue-out.gif | Bin 290 -> 0 bytes .../images/smileys/core/smiley-undecided.gif | Bin 299 -> 0 bytes .../images/smileys/core/smiley-wink.gif | Bin 312 -> 0 bytes .../images/smileys/devilangel/angel.gif | Bin 312 -> 0 bytes .../images/smileys/devilangel/blondedevil.gif | Bin 2957 -> 0 bytes .../images/smileys/devilangel/catdevil.gif | Bin 1965 -> 0 bytes .../images/smileys/devilangel/cherub.gif | Bin 1614 -> 0 bytes .../images/smileys/devilangel/daseesaw.gif | Bin 6780 -> 0 bytes .../images/smileys/devilangel/devil.gif | Bin 1996 -> 0 bytes .../images/smileys/devilangel/graveside.gif | Bin 8226 -> 0 bytes .../images/smileys/devilangel/saint.gif | Bin 1197 -> 0 bytes .../images/smileys/devilangel/turnevil.gif | Bin 636 -> 0 bytes .../images/smileys/disgust/fartblush.gif | Bin 29855 -> 0 bytes .../images/smileys/disgust/fartinbed.gif | Bin 23289 -> 0 bytes .../images/smileys/disgust/toilet.gif | Bin 8936 -> 0 bytes source-linux/images/smileys/disgust/vomit.gif | Bin 2727 -> 0 bytes source-linux/images/smileys/drink/tea.gif | Bin 9915 -> 0 bytes source-linux/images/smileys/drool/drool.gif | Bin 1379 -> 0 bytes .../images/smileys/fantasy/alienmonster.gif | Bin 7636 -> 0 bytes .../images/smileys/fantasy/barbarian.gif | Bin 454 -> 0 bytes .../images/smileys/fantasy/dinosaur.gif | Bin 2837 -> 0 bytes .../images/smileys/fantasy/dragon.gif | Bin 3431 -> 0 bytes .../images/smileys/fantasy/dragonwhelp.gif | Bin 2338 -> 0 bytes source-linux/images/smileys/fantasy/ghost.gif | Bin 1050 -> 0 bytes source-linux/images/smileys/fantasy/mummy.gif | Bin 6552 -> 0 bytes source-linux/images/smileys/fight/2guns.gif | Bin 810 -> 0 bytes source-linux/images/smileys/fight/acid.gif | Bin 70863 -> 0 bytes .../images/smileys/fight/alienfight.gif | Bin 26130 -> 0 bytes source-linux/images/smileys/fight/alpha.png | Bin 664 -> 0 bytes source-linux/images/smileys/fight/army.gif | Bin 3024 -> 0 bytes .../images/smileys/fight/arrowhead.gif | Bin 174 -> 0 bytes source-linux/images/smileys/fight/bfg.gif | Bin 2267 -> 0 bytes source-linux/images/smileys/fight/bowman.gif | Bin 1337 -> 0 bytes .../images/smileys/fight/chainsaw.gif | Bin 20364 -> 0 bytes .../images/smileys/fight/crossbow.gif | Bin 891 -> 0 bytes .../images/smileys/fight/crusader.gif | Bin 403 -> 0 bytes source-linux/images/smileys/fight/dead.gif | Bin 167 -> 0 bytes source-linux/images/smileys/fight/gangs.gif | Bin 1746 -> 0 bytes .../images/smileys/fight/hammersplat.gif | Bin 16839 -> 0 bytes .../images/smileys/fight/lasergun.gif | Bin 2070 -> 0 bytes .../images/smileys/fight/machinegun.gif | Bin 1708 -> 0 bytes source-linux/images/smileys/fight/marine.gif | Bin 5829 -> 0 bytes source-linux/images/smileys/fight/sabre.gif | Bin 664 -> 0 bytes source-linux/images/smileys/fight/samurai.gif | Bin 3286 -> 0 bytes source-linux/images/smileys/fight/tank.gif | Bin 11457 -> 0 bytes source-linux/images/smileys/fight/viking.gif | Bin 9650 -> 0 bytes source-linux/images/smileys/food/apple.gif | Bin 1689 -> 0 bytes source-linux/images/smileys/food/banana.gif | Bin 1545 -> 0 bytes .../images/smileys/food/birthdaycake.gif | Bin 6453 -> 0 bytes source-linux/images/smileys/food/broccoli.gif | Bin 4025 -> 0 bytes source-linux/images/smileys/food/cake.gif | Bin 668 -> 0 bytes source-linux/images/smileys/food/carrot.gif | Bin 583 -> 0 bytes source-linux/images/smileys/food/cooking.gif | Bin 3125 -> 0 bytes source-linux/images/smileys/food/fryegg.gif | Bin 6492 -> 0 bytes source-linux/images/smileys/food/popcorn.gif | Bin 1155 -> 0 bytes source-linux/images/smileys/food/tomato.gif | Bin 2632 -> 0 bytes source-linux/images/smileys/happy/cloud9.gif | Bin 265 -> 0 bytes .../images/smileys/happy/tearsofjoy.gif | Bin 1297 -> 0 bytes source-linux/images/smileys/laugh/hahaha.gif | Bin 8268 -> 0 bytes source-linux/images/smileys/laugh/loltv.gif | Bin 2335 -> 0 bytes source-linux/images/smileys/laugh/rofl.gif | Bin 1010 -> 0 bytes source-linux/images/smileys/love/iloveyou.gif | Bin 15681 -> 0 bytes source-linux/images/smileys/love/inlove.gif | Bin 1005 -> 0 bytes source-linux/images/smileys/love/love.gif | Bin 3451 -> 0 bytes source-linux/images/smileys/love/lovebear.gif | Bin 4491 -> 0 bytes source-linux/images/smileys/love/lovebed.gif | Bin 10249 -> 0 bytes .../images/smileys/love/loveheart.gif | Bin 652 -> 0 bytes source-linux/images/smileys/music/dj.gif | Bin 4446 -> 0 bytes source-linux/images/smileys/music/drums.gif | Bin 7596 -> 0 bytes source-linux/images/smileys/music/elvis.gif | Bin 1789 -> 0 bytes source-linux/images/smileys/music/guitar.gif | Bin 2070 -> 0 bytes source-linux/images/smileys/music/trumpet.gif | Bin 461 -> 0 bytes source-linux/images/smileys/music/violin.gif | Bin 1798 -> 0 bytes source-linux/images/smileys/oldcore/beard.png | Bin 1094 -> 0 bytes .../images/smileys/oldcore/headbang.gif | Bin 885 -> 0 bytes .../images/smileys/oldcore/laughing.gif | Bin 306 -> 0 bytes source-linux/images/smileys/oldcore/shaka.gif | Bin 2238 -> 0 bytes .../images/smileys/oldcore/surprised.gif | Bin 303 -> 0 bytes .../images/smileys/oldcore/whitebeard.png | Bin 1060 -> 0 bytes source-linux/images/smileys/respect/bow.gif | Bin 1778 -> 0 bytes source-linux/images/smileys/respect/bravo.gif | Bin 761 -> 0 bytes .../images/smileys/respect/hailking.gif | Bin 23733 -> 0 bytes .../images/smileys/respect/number1.gif | Bin 365 -> 0 bytes source-linux/images/smileys/sad/crying.png | Bin 1259 -> 0 bytes source-linux/images/smileys/sad/prisoner.gif | Bin 1961 -> 0 bytes source-linux/images/smileys/sad/sigh.gif | Bin 748 -> 0 bytes .../images/smileys/smoking/smoking.gif | Bin 2288 -> 0 bytes source-linux/images/smileys/sport/archery.gif | Bin 2793 -> 0 bytes .../images/smileys/sport/basketball.gif | Bin 8378 -> 0 bytes source-linux/images/smileys/sport/bowling.gif | Bin 3562 -> 0 bytes source-linux/images/smileys/sport/cycling.gif | Bin 1883 -> 0 bytes source-linux/images/smileys/sport/darts.gif | Bin 7103 -> 0 bytes source-linux/images/smileys/sport/fencing.gif | Bin 11247 -> 0 bytes .../images/smileys/sport/football.gif | Bin 1937 -> 0 bytes source-linux/images/smileys/sport/golf.gif | Bin 2399 -> 0 bytes .../images/smileys/sport/horseriding.gif | Bin 10489 -> 0 bytes .../images/smileys/sport/juggling.gif | Bin 4292 -> 0 bytes .../images/smileys/sport/skipping.gif | Bin 859 -> 0 bytes source-linux/images/smileys/sport/snooker.gif | Bin 11255 -> 0 bytes source-linux/images/smileys/sport/surfing.gif | Bin 1639 -> 0 bytes source-linux/images/smileys/sport/tennis.gif | Bin 1061 -> 0 bytes .../images/smileys/tired/countsheep.gif | Bin 1520 -> 0 bytes source-linux/images/smileys/tired/hammock.gif | Bin 8317 -> 0 bytes source-linux/images/smileys/tired/pillow.gif | Bin 467 -> 0 bytes source-linux/images/smileys/tired/yawn.gif | Bin 1745 -> 0 bytes source-linux/qml/configqml/SyncConfig.qml | 116 ------ .../qml/genericqml/DrawerAccountComponent.qml | 256 ------------- {source-linux => src}/CMakeLists.txt | 8 +- src/application.qrc | 141 ++++++++ .../assets}/Friendica_monochrome.png | Bin .../images => src/assets}/Friendiqa.ico | Bin .../images => src/assets}/Friendiqa.png | Bin .../assets}/de.manic.Friendiqa.desktop | 0 .../assets}/de.manic.Friendiqa.svg | 0 src/assets/de.manic.friendiqa.metainfo.xml | 35 ++ .../images => src/assets}/defaultcontact.jpg | Bin .../images => src/assets}/folder-blue.png | Bin .../assets}/friendica-tray-black.svg | 0 .../assets}/friendica-tray-white.svg | 0 src/assets/friendiqa-sync.service | 7 + src/assets/friendiqa-sync.timer | 10 + src/assets/icons/address-card.svg | 3 + src/assets/icons/angle-left.svg | 3 + src/assets/icons/angle-right.svg | 3 + src/assets/icons/bars.svg | 3 + src/assets/icons/bell.svg | 3 + src/assets/icons/bold.svg | 3 + src/assets/icons/calendar.svg | 3 + src/assets/icons/caret-down.svg | 3 + src/assets/icons/check.svg | 3 + src/assets/icons/chevron-down.svg | 9 + src/assets/icons/chevron-up.svg | 9 + src/assets/icons/cloud-download.svg | 9 + src/assets/icons/cloud-upload.svg | 9 + src/assets/icons/code.svg | 3 + src/assets/icons/cogs.svg | 3 + src/assets/icons/comments.svg | 3 + src/assets/icons/ellipsis-v.svg | 3 + src/assets/icons/envelope.svg | 3 + src/assets/icons/exchange.svg | 3 + src/assets/icons/filter.svg | 3 + src/assets/icons/floppy-o.svg | 9 + src/assets/icons/font.svg | 3 + src/assets/icons/frown-o.svg | 3 + src/assets/icons/globe.svg | 9 + src/assets/icons/hashtag.svg | 3 + src/assets/icons/history.svg | 3 + src/assets/icons/home.svg | 3 + src/assets/icons/italic.svg | 3 + src/assets/icons/list.svg | 3 + src/assets/icons/lock.svg | 3 + src/assets/icons/paper-plane-o.svg | 3 + src/assets/icons/pencil.svg | 3 + src/assets/icons/picture-o.svg | 3 + src/assets/icons/play.svg | 9 + src/assets/icons/plus.svg | 3 + src/assets/icons/refresh.svg | 3 + src/assets/icons/repeat.svg | 3 + src/assets/icons/reply.svg | 3 + src/assets/icons/search.svg | 3 + src/assets/icons/sign-out.svg | 3 + src/assets/icons/smile-o.svg | 3 + src/assets/icons/star-o.svg | 3 + src/assets/icons/star.svg | 3 + src/assets/icons/times-circle.svg | 3 + src/assets/icons/times.svg | 9 + src/assets/icons/trash.svg | 3 + src/assets/icons/unlock.svg | 9 + src/assets/icons/user-plus.svg | 9 + src/assets/icons/users.svg | 3 + {source-linux => src}/common/alarm.h | 0 {source-linux => src}/common/alarmandroid.cpp | 0 {source-linux => src}/common/alarmlinux.cpp | 18 +- .../common/documenthandler.cpp | 0 .../common/documenthandler.h | 0 {source-linux => src}/common/filesystem.cpp | 0 {source-linux => src}/common/filesystem.h | 3 +- .../common/filesystemandroid.cpp | 0 {source-linux => src}/common/friendiqa.cpp | 25 +- {source-linux => src}/common/oauth.cpp | 0 {source-linux => src}/common/oauth.h | 0 .../common/remoteauthasyncimageprovider.cpp | 0 .../common/remoteauthasyncimageprovider.h | 0 {source-linux => src}/common/updatenews.cpp | 108 +++--- {source-linux => src}/common/updatenews.h | 0 .../common/uploadableimage.cpp | 0 .../common/uploadableimage.h | 0 {source-linux => src}/common/xhr.cpp | 16 +- {source-linux => src}/common/xhr.h | 0 {source-linux => src}/js/friendworker.js | 0 {source-linux => src}/js/helper.js | 2 +- {source-linux => src}/js/image.js | 0 {source-linux => src}/js/news.js | 0 {source-linux => src}/js/newsworker.js | 0 {source-linux => src}/js/photoworker.js | 0 {source-linux => src}/js/service.js | 20 +- {source-linux => src}/js/smiley.js | 336 +++++++++--------- .../qml/calendarqml/CalendarDay.qml | 3 +- .../qml/calendarqml/CalendarTab.qml | 38 +- .../qml/calendarqml/EventCreate.qml | 131 +++++-- .../qml/calendarqml/EventList.qml | 13 +- .../qml/calendarqml/EventListItem.qml | 18 +- .../qml/configqml/AcceptRules.qml | 4 +- .../qml/configqml/AccountPage.qml | 21 +- .../qml/configqml/ConfigAppearancePage.qml | 6 +- .../qml/configqml/ConfigPage.qml | 15 +- .../qml/configqml/ConfigStartPage.qml | 4 +- .../qml/configqml/InfoBox.qml | 12 +- .../qml/configqml/LeftDrawerScrollview.qml | 155 ++++---- .../qml/configqml/OSSettingsAndroid.qml | 4 +- .../qml/configqml/OSSettingsLinux.qml | 21 +- .../qml/configqml/SyncComponent.qml | 4 +- .../qml/configqml/SyncConfig.qml | 79 ++-- .../qml/contactqml/Contactlist.qml | 12 +- .../qml/contactqml/ContactsSearchPage.qml | 45 ++- .../qml/contactqml/FriendsListTab.qml | 155 ++++---- .../qml/contactqml/FriendsTab.qml | 29 +- .../qml/contactqml/GroupComponent.qml | 14 +- .../qml/contactqml/GroupsListTab.qml | 111 +++--- .../qml/contactqml/ProfileComponent.qml | 58 +-- .../qml/contactqml/ProfileTab.qml | 7 +- {source-linux => src}/qml/friendiqa.qml | 215 ++++++----- .../qml/genericqml/BlueButton.qml | 4 +- .../qml/genericqml/ContactComponent.qml | 6 +- src/qml/genericqml/DrawerAccountComponent.qml | 242 +++++++++++++ .../DrawerAccountComponentContacts.qml | 4 +- .../qml/genericqml/ImagePicker.qml | 2 +- .../qml/genericqml/ImagePickerLinux.qml | 4 +- .../qml/genericqml/IntentReceiver.qml | 2 +- .../qml/genericqml/LeftDrawerAndroid.qml | 5 +- .../qml/genericqml/LeftDrawerLinux.qml | 9 +- .../qml/genericqml/LinuxSync.qml | 3 +- .../qml/genericqml/MButton.qml | 15 +- .../qml/genericqml/PermissionDialog.qml | 17 +- .../qml/genericqml/RootStack.qml | 56 +-- .../qml/newsqml/BlockUser.qml | 4 +- .../qml/newsqml/ContactPage.qml | 78 ++-- .../qml/newsqml/Conversation.qml | 29 +- .../qml/newsqml/FriendicaActivities.qml | 10 +- {source-linux => src}/qml/newsqml/Hashtag.qml | 2 +- .../qml/newsqml/MessageImageUploadDialog.qml | 44 ++- .../qml/newsqml/MessageSend.qml | 149 ++++---- .../qml/newsqml/MoreComments.qml | 10 +- .../qml/newsqml/NewsImage.qml | 2 +- .../qml/newsqml/NewsPhotolist.qml | 41 ++- .../qml/newsqml/NewsStack.qml | 155 ++++---- {source-linux => src}/qml/newsqml/NewsTab.qml | 100 +++--- .../qml/newsqml/NewsTabbutton.qml | 25 +- .../qml/newsqml/NewsVideo.qml | 26 +- .../qml/newsqml/NewsVideoLarge.qml | 22 +- .../qml/newsqml/Newsitem.qml | 178 ++++------ .../qml/newsqml/PermissionDialog.qml | 0 .../qml/newsqml/ReportUser.qml | 4 +- .../qml/newsqml/SmileyDialog.qml | 113 +++--- .../qml/photoqml/ImageUploadDialog.qml | 11 +- .../qml/photoqml/PhotoComponent.qml | 6 +- .../qml/photoqml/PhotoTab.qml | 40 ++- .../qml/photoqml/PhotogroupComponent.qml | 6 +- {source-linux => src}/qtquickcontrols2.conf | 0 .../translations/friendiqa-de.qm | Bin .../translations/friendiqa-de.ts | 0 .../translations/friendiqa-es.qm | Bin .../translations/friendiqa-es.ts | 0 .../translations/friendiqa-hu.qm | Bin .../translations/friendiqa-hu.ts | 0 .../translations/friendiqa-it.qm | Bin .../translations/friendiqa-it.ts | 0 .../translations/friendiqa-nl.qm | Bin .../translations/friendiqa-nl.ts | 0 333 files changed, 2193 insertions(+), 2040 deletions(-) delete mode 100644 source-linux/application.qrc delete mode 100644 source-linux/friendiqa.pro delete mode 100644 source-linux/images/addImage.png delete mode 100644 source-linux/images/fontawesome-webfont.ttf delete mode 100644 source-linux/images/smileys/adult/bong.gif delete mode 100644 source-linux/images/smileys/adult/drunk.gif delete mode 100644 source-linux/images/smileys/adult/finger.gif delete mode 100644 source-linux/images/smileys/adult/sperm.gif delete mode 100644 source-linux/images/smileys/adult/tits.gif delete mode 100644 source-linux/images/smileys/animals/bee.gif delete mode 100644 source-linux/images/smileys/animals/bigspider.gif delete mode 100644 source-linux/images/smileys/animals/bunny.gif delete mode 100644 source-linux/images/smileys/animals/bunnyflowers.gif delete mode 100644 source-linux/images/smileys/animals/cat.gif delete mode 100644 source-linux/images/smileys/animals/chick.gif delete mode 100644 source-linux/images/smileys/animals/cow.gif delete mode 100644 source-linux/images/smileys/animals/crab.gif delete mode 100644 source-linux/images/smileys/animals/dog.gif delete mode 100644 source-linux/images/smileys/animals/dolphin.gif delete mode 100644 source-linux/images/smileys/animals/dragonfly.gif delete mode 100644 source-linux/images/smileys/animals/elephant.gif delete mode 100644 source-linux/images/smileys/animals/fish.gif delete mode 100644 source-linux/images/smileys/animals/frog.gif delete mode 100644 source-linux/images/smileys/animals/giraffe.gif delete mode 100644 source-linux/images/smileys/animals/hamster.gif delete mode 100644 source-linux/images/smileys/animals/horse.gif delete mode 100644 source-linux/images/smileys/animals/ladybird.gif delete mode 100644 source-linux/images/smileys/animals/monkey.gif delete mode 100644 source-linux/images/smileys/animals/parrot.gif delete mode 100644 source-linux/images/smileys/animals/pig.gif delete mode 100644 source-linux/images/smileys/animals/sheep.gif delete mode 100644 source-linux/images/smileys/animals/snail.gif delete mode 100644 source-linux/images/smileys/animals/tux.gif delete mode 100644 source-linux/images/smileys/babies/baby.gif delete mode 100644 source-linux/images/smileys/babies/babycot.gif delete mode 100644 source-linux/images/smileys/babies/pregnant.gif delete mode 100644 source-linux/images/smileys/babies/stork.gif delete mode 100644 source-linux/images/smileys/confused/confused.gif delete mode 100644 source-linux/images/smileys/confused/dazed.gif delete mode 100644 source-linux/images/smileys/confused/shrug.gif delete mode 100644 source-linux/images/smileys/confused/stupid.gif delete mode 100644 source-linux/images/smileys/cool/affro.gif delete mode 100644 source-linux/images/smileys/cool/cool.gif delete mode 100644 source-linux/images/smileys/core/beer_mug.gif delete mode 100644 source-linux/images/smileys/core/coffee.gif delete mode 100644 source-linux/images/smileys/core/dislike.gif delete mode 100644 source-linux/images/smileys/core/friendica-16.png delete mode 100644 source-linux/images/smileys/core/like.gif delete mode 100644 source-linux/images/smileys/core/rm-16.png delete mode 100644 source-linux/images/smileys/core/smiley-Oo.gif delete mode 100644 source-linux/images/smileys/core/smiley-bangheaddesk.gif delete mode 100644 source-linux/images/smileys/core/smiley-brokenheart.gif delete mode 100644 source-linux/images/smileys/core/smiley-cool.gif delete mode 100644 source-linux/images/smileys/core/smiley-cry.gif delete mode 100644 source-linux/images/smileys/core/smiley-embarassed.gif delete mode 100644 source-linux/images/smileys/core/smiley-facepalm.gif delete mode 100644 source-linux/images/smileys/core/smiley-foot-in-mouth.gif delete mode 100644 source-linux/images/smileys/core/smiley-frown.gif delete mode 100644 source-linux/images/smileys/core/smiley-heart.gif delete mode 100644 source-linux/images/smileys/core/smiley-kiss.gif delete mode 100644 source-linux/images/smileys/core/smiley-laughing.gif delete mode 100644 source-linux/images/smileys/core/smiley-smile.gif delete mode 100644 source-linux/images/smileys/core/smiley-surprised.gif delete mode 100644 source-linux/images/smileys/core/smiley-thumbsup.gif delete mode 100644 source-linux/images/smileys/core/smiley-tongue-out.gif delete mode 100644 source-linux/images/smileys/core/smiley-undecided.gif delete mode 100644 source-linux/images/smileys/core/smiley-wink.gif delete mode 100644 source-linux/images/smileys/devilangel/angel.gif delete mode 100644 source-linux/images/smileys/devilangel/blondedevil.gif delete mode 100644 source-linux/images/smileys/devilangel/catdevil.gif delete mode 100644 source-linux/images/smileys/devilangel/cherub.gif delete mode 100644 source-linux/images/smileys/devilangel/daseesaw.gif delete mode 100644 source-linux/images/smileys/devilangel/devil.gif delete mode 100644 source-linux/images/smileys/devilangel/graveside.gif delete mode 100644 source-linux/images/smileys/devilangel/saint.gif delete mode 100644 source-linux/images/smileys/devilangel/turnevil.gif delete mode 100644 source-linux/images/smileys/disgust/fartblush.gif delete mode 100644 source-linux/images/smileys/disgust/fartinbed.gif delete mode 100644 source-linux/images/smileys/disgust/toilet.gif delete mode 100644 source-linux/images/smileys/disgust/vomit.gif delete mode 100644 source-linux/images/smileys/drink/tea.gif delete mode 100644 source-linux/images/smileys/drool/drool.gif delete mode 100644 source-linux/images/smileys/fantasy/alienmonster.gif delete mode 100644 source-linux/images/smileys/fantasy/barbarian.gif delete mode 100644 source-linux/images/smileys/fantasy/dinosaur.gif delete mode 100644 source-linux/images/smileys/fantasy/dragon.gif delete mode 100644 source-linux/images/smileys/fantasy/dragonwhelp.gif delete mode 100644 source-linux/images/smileys/fantasy/ghost.gif delete mode 100644 source-linux/images/smileys/fantasy/mummy.gif delete mode 100644 source-linux/images/smileys/fight/2guns.gif delete mode 100644 source-linux/images/smileys/fight/acid.gif delete mode 100644 source-linux/images/smileys/fight/alienfight.gif delete mode 100644 source-linux/images/smileys/fight/alpha.png delete mode 100644 source-linux/images/smileys/fight/army.gif delete mode 100644 source-linux/images/smileys/fight/arrowhead.gif delete mode 100644 source-linux/images/smileys/fight/bfg.gif delete mode 100644 source-linux/images/smileys/fight/bowman.gif delete mode 100644 source-linux/images/smileys/fight/chainsaw.gif delete mode 100644 source-linux/images/smileys/fight/crossbow.gif delete mode 100644 source-linux/images/smileys/fight/crusader.gif delete mode 100644 source-linux/images/smileys/fight/dead.gif delete mode 100644 source-linux/images/smileys/fight/gangs.gif delete mode 100644 source-linux/images/smileys/fight/hammersplat.gif delete mode 100644 source-linux/images/smileys/fight/lasergun.gif delete mode 100644 source-linux/images/smileys/fight/machinegun.gif delete mode 100644 source-linux/images/smileys/fight/marine.gif delete mode 100644 source-linux/images/smileys/fight/sabre.gif delete mode 100644 source-linux/images/smileys/fight/samurai.gif delete mode 100644 source-linux/images/smileys/fight/tank.gif delete mode 100644 source-linux/images/smileys/fight/viking.gif delete mode 100644 source-linux/images/smileys/food/apple.gif delete mode 100644 source-linux/images/smileys/food/banana.gif delete mode 100644 source-linux/images/smileys/food/birthdaycake.gif delete mode 100644 source-linux/images/smileys/food/broccoli.gif delete mode 100644 source-linux/images/smileys/food/cake.gif delete mode 100644 source-linux/images/smileys/food/carrot.gif delete mode 100644 source-linux/images/smileys/food/cooking.gif delete mode 100644 source-linux/images/smileys/food/fryegg.gif delete mode 100644 source-linux/images/smileys/food/popcorn.gif delete mode 100644 source-linux/images/smileys/food/tomato.gif delete mode 100644 source-linux/images/smileys/happy/cloud9.gif delete mode 100644 source-linux/images/smileys/happy/tearsofjoy.gif delete mode 100644 source-linux/images/smileys/laugh/hahaha.gif delete mode 100644 source-linux/images/smileys/laugh/loltv.gif delete mode 100644 source-linux/images/smileys/laugh/rofl.gif delete mode 100644 source-linux/images/smileys/love/iloveyou.gif delete mode 100644 source-linux/images/smileys/love/inlove.gif delete mode 100644 source-linux/images/smileys/love/love.gif delete mode 100644 source-linux/images/smileys/love/lovebear.gif delete mode 100644 source-linux/images/smileys/love/lovebed.gif delete mode 100644 source-linux/images/smileys/love/loveheart.gif delete mode 100644 source-linux/images/smileys/music/dj.gif delete mode 100644 source-linux/images/smileys/music/drums.gif delete mode 100644 source-linux/images/smileys/music/elvis.gif delete mode 100644 source-linux/images/smileys/music/guitar.gif delete mode 100644 source-linux/images/smileys/music/trumpet.gif delete mode 100644 source-linux/images/smileys/music/violin.gif delete mode 100644 source-linux/images/smileys/oldcore/beard.png delete mode 100644 source-linux/images/smileys/oldcore/headbang.gif delete mode 100644 source-linux/images/smileys/oldcore/laughing.gif delete mode 100644 source-linux/images/smileys/oldcore/shaka.gif delete mode 100644 source-linux/images/smileys/oldcore/surprised.gif delete mode 100644 source-linux/images/smileys/oldcore/whitebeard.png delete mode 100644 source-linux/images/smileys/respect/bow.gif delete mode 100644 source-linux/images/smileys/respect/bravo.gif delete mode 100644 source-linux/images/smileys/respect/hailking.gif delete mode 100644 source-linux/images/smileys/respect/number1.gif delete mode 100644 source-linux/images/smileys/sad/crying.png delete mode 100644 source-linux/images/smileys/sad/prisoner.gif delete mode 100644 source-linux/images/smileys/sad/sigh.gif delete mode 100644 source-linux/images/smileys/smoking/smoking.gif delete mode 100644 source-linux/images/smileys/sport/archery.gif delete mode 100644 source-linux/images/smileys/sport/basketball.gif delete mode 100644 source-linux/images/smileys/sport/bowling.gif delete mode 100644 source-linux/images/smileys/sport/cycling.gif delete mode 100644 source-linux/images/smileys/sport/darts.gif delete mode 100644 source-linux/images/smileys/sport/fencing.gif delete mode 100644 source-linux/images/smileys/sport/football.gif delete mode 100644 source-linux/images/smileys/sport/golf.gif delete mode 100644 source-linux/images/smileys/sport/horseriding.gif delete mode 100644 source-linux/images/smileys/sport/juggling.gif delete mode 100644 source-linux/images/smileys/sport/skipping.gif delete mode 100644 source-linux/images/smileys/sport/snooker.gif delete mode 100644 source-linux/images/smileys/sport/surfing.gif delete mode 100644 source-linux/images/smileys/sport/tennis.gif delete mode 100644 source-linux/images/smileys/tired/countsheep.gif delete mode 100644 source-linux/images/smileys/tired/hammock.gif delete mode 100644 source-linux/images/smileys/tired/pillow.gif delete mode 100644 source-linux/images/smileys/tired/yawn.gif delete mode 100644 source-linux/qml/configqml/SyncConfig.qml delete mode 100644 source-linux/qml/genericqml/DrawerAccountComponent.qml rename {source-linux => src}/CMakeLists.txt (83%) create mode 100644 src/application.qrc rename {source-linux/images => src/assets}/Friendica_monochrome.png (100%) rename {source-linux/images => src/assets}/Friendiqa.ico (100%) rename {source-linux/images => src/assets}/Friendiqa.png (100%) rename {source-linux/images => src/assets}/de.manic.Friendiqa.desktop (100%) rename {source-linux/images => src/assets}/de.manic.Friendiqa.svg (100%) create mode 100644 src/assets/de.manic.friendiqa.metainfo.xml rename {source-linux/images => src/assets}/defaultcontact.jpg (100%) rename {source-linux/images => src/assets}/folder-blue.png (100%) rename {source-linux/images => src/assets}/friendica-tray-black.svg (100%) rename {source-linux/images => src/assets}/friendica-tray-white.svg (100%) create mode 100644 src/assets/friendiqa-sync.service create mode 100644 src/assets/friendiqa-sync.timer create mode 100644 src/assets/icons/address-card.svg create mode 100644 src/assets/icons/angle-left.svg create mode 100644 src/assets/icons/angle-right.svg create mode 100644 src/assets/icons/bars.svg create mode 100644 src/assets/icons/bell.svg create mode 100644 src/assets/icons/bold.svg create mode 100644 src/assets/icons/calendar.svg create mode 100644 src/assets/icons/caret-down.svg create mode 100644 src/assets/icons/check.svg create mode 100644 src/assets/icons/chevron-down.svg create mode 100644 src/assets/icons/chevron-up.svg create mode 100644 src/assets/icons/cloud-download.svg create mode 100644 src/assets/icons/cloud-upload.svg create mode 100644 src/assets/icons/code.svg create mode 100644 src/assets/icons/cogs.svg create mode 100644 src/assets/icons/comments.svg create mode 100644 src/assets/icons/ellipsis-v.svg create mode 100644 src/assets/icons/envelope.svg create mode 100644 src/assets/icons/exchange.svg create mode 100644 src/assets/icons/filter.svg create mode 100644 src/assets/icons/floppy-o.svg create mode 100644 src/assets/icons/font.svg create mode 100644 src/assets/icons/frown-o.svg create mode 100644 src/assets/icons/globe.svg create mode 100644 src/assets/icons/hashtag.svg create mode 100644 src/assets/icons/history.svg create mode 100644 src/assets/icons/home.svg create mode 100644 src/assets/icons/italic.svg create mode 100644 src/assets/icons/list.svg create mode 100644 src/assets/icons/lock.svg create mode 100644 src/assets/icons/paper-plane-o.svg create mode 100644 src/assets/icons/pencil.svg create mode 100644 src/assets/icons/picture-o.svg create mode 100644 src/assets/icons/play.svg create mode 100644 src/assets/icons/plus.svg create mode 100644 src/assets/icons/refresh.svg create mode 100644 src/assets/icons/repeat.svg create mode 100644 src/assets/icons/reply.svg create mode 100644 src/assets/icons/search.svg create mode 100644 src/assets/icons/sign-out.svg create mode 100644 src/assets/icons/smile-o.svg create mode 100644 src/assets/icons/star-o.svg create mode 100644 src/assets/icons/star.svg create mode 100644 src/assets/icons/times-circle.svg create mode 100644 src/assets/icons/times.svg create mode 100644 src/assets/icons/trash.svg create mode 100644 src/assets/icons/unlock.svg create mode 100644 src/assets/icons/user-plus.svg create mode 100644 src/assets/icons/users.svg rename {source-linux => src}/common/alarm.h (100%) rename {source-linux => src}/common/alarmandroid.cpp (100%) rename {source-linux => src}/common/alarmlinux.cpp (78%) rename {source-linux => src}/common/documenthandler.cpp (100%) rename {source-linux => src}/common/documenthandler.h (100%) rename {source-linux => src}/common/filesystem.cpp (100%) rename {source-linux => src}/common/filesystem.h (96%) rename {source-linux => src}/common/filesystemandroid.cpp (100%) rename {source-linux => src}/common/friendiqa.cpp (88%) rename {source-linux => src}/common/oauth.cpp (100%) rename {source-linux => src}/common/oauth.h (100%) rename {source-linux => src}/common/remoteauthasyncimageprovider.cpp (100%) rename {source-linux => src}/common/remoteauthasyncimageprovider.h (100%) rename {source-linux => src}/common/updatenews.cpp (94%) rename {source-linux => src}/common/updatenews.h (100%) rename {source-linux => src}/common/uploadableimage.cpp (100%) rename {source-linux => src}/common/uploadableimage.h (100%) rename {source-linux => src}/common/xhr.cpp (97%) rename {source-linux => src}/common/xhr.h (100%) rename {source-linux => src}/js/friendworker.js (100%) rename {source-linux => src}/js/helper.js (99%) rename {source-linux => src}/js/image.js (100%) rename {source-linux => src}/js/news.js (100%) rename {source-linux => src}/js/newsworker.js (100%) rename {source-linux => src}/js/photoworker.js (100%) rename {source-linux => src}/js/service.js (97%) rename {source-linux => src}/js/smiley.js (51%) rename {source-linux => src}/qml/calendarqml/CalendarDay.qml (98%) rename {source-linux => src}/qml/calendarqml/CalendarTab.qml (90%) rename {source-linux => src}/qml/calendarqml/EventCreate.qml (75%) rename {source-linux => src}/qml/calendarqml/EventList.qml (91%) rename {source-linux => src}/qml/calendarqml/EventListItem.qml (92%) rename {source-linux => src}/qml/configqml/AcceptRules.qml (98%) rename {source-linux => src}/qml/configqml/AccountPage.qml (97%) rename {source-linux => src}/qml/configqml/ConfigAppearancePage.qml (99%) rename {source-linux => src}/qml/configqml/ConfigPage.qml (94%) rename {source-linux => src}/qml/configqml/ConfigStartPage.qml (98%) rename {source-linux => src}/qml/configqml/InfoBox.qml (92%) rename {source-linux => src}/qml/configqml/LeftDrawerScrollview.qml (61%) rename {source-linux => src}/qml/configqml/OSSettingsAndroid.qml (98%) rename {source-linux => src}/qml/configqml/OSSettingsLinux.qml (82%) rename {source-linux => src}/qml/configqml/SyncComponent.qml (98%) rename source-linux/qml/genericqml/SearchDialog.qml => src/qml/configqml/SyncConfig.qml (54%) rename {source-linux => src}/qml/contactqml/Contactlist.qml (94%) rename {source-linux => src}/qml/contactqml/ContactsSearchPage.qml (83%) rename {source-linux => src}/qml/contactqml/FriendsListTab.qml (73%) rename {source-linux => src}/qml/contactqml/FriendsTab.qml (87%) rename {source-linux => src}/qml/contactqml/GroupComponent.qml (93%) rename {source-linux => src}/qml/contactqml/GroupsListTab.qml (58%) rename {source-linux => src}/qml/contactqml/ProfileComponent.qml (90%) rename {source-linux => src}/qml/contactqml/ProfileTab.qml (94%) rename {source-linux => src}/qml/friendiqa.qml (61%) rename {source-linux => src}/qml/genericqml/BlueButton.qml (97%) rename {source-linux => src}/qml/genericqml/ContactComponent.qml (97%) create mode 100644 src/qml/genericqml/DrawerAccountComponent.qml rename {source-linux => src}/qml/genericqml/DrawerAccountComponentContacts.qml (98%) rename {source-linux => src}/qml/genericqml/ImagePicker.qml (98%) rename {source-linux => src}/qml/genericqml/ImagePickerLinux.qml (99%) rename {source-linux => src}/qml/genericqml/IntentReceiver.qml (98%) rename {source-linux => src}/qml/genericqml/LeftDrawerAndroid.qml (94%) rename {source-linux => src}/qml/genericqml/LeftDrawerLinux.qml (90%) rename {source-linux => src}/qml/genericqml/LinuxSync.qml (97%) rename {source-linux => src}/qml/genericqml/MButton.qml (83%) rename {source-linux => src}/qml/genericqml/PermissionDialog.qml (93%) rename source-linux/qml/genericqml/Search.qml => src/qml/genericqml/RootStack.qml (62%) rename {source-linux => src}/qml/newsqml/BlockUser.qml (97%) rename {source-linux => src}/qml/newsqml/ContactPage.qml (91%) rename {source-linux => src}/qml/newsqml/Conversation.qml (93%) rename {source-linux => src}/qml/newsqml/FriendicaActivities.qml (94%) rename {source-linux => src}/qml/newsqml/Hashtag.qml (99%) rename {source-linux => src}/qml/newsqml/MessageImageUploadDialog.qml (88%) rename {source-linux => src}/qml/newsqml/MessageSend.qml (83%) rename {source-linux => src}/qml/newsqml/MoreComments.qml (91%) rename {source-linux => src}/qml/newsqml/NewsImage.qml (99%) rename {source-linux => src}/qml/newsqml/NewsPhotolist.qml (83%) rename {source-linux => src}/qml/newsqml/NewsStack.qml (84%) rename {source-linux => src}/qml/newsqml/NewsTab.qml (78%) rename {source-linux => src}/qml/newsqml/NewsTabbutton.qml (73%) rename {source-linux => src}/qml/newsqml/NewsVideo.qml (82%) rename {source-linux => src}/qml/newsqml/NewsVideoLarge.qml (90%) rename {source-linux => src}/qml/newsqml/Newsitem.qml (81%) rename {source-linux => src}/qml/newsqml/PermissionDialog.qml (100%) rename {source-linux => src}/qml/newsqml/ReportUser.qml (98%) rename {source-linux => src}/qml/newsqml/SmileyDialog.qml (53%) rename {source-linux => src}/qml/photoqml/ImageUploadDialog.qml (97%) rename {source-linux => src}/qml/photoqml/PhotoComponent.qml (97%) rename {source-linux => src}/qml/photoqml/PhotoTab.qml (93%) rename {source-linux => src}/qml/photoqml/PhotogroupComponent.qml (96%) rename {source-linux => src}/qtquickcontrols2.conf (100%) rename {source-linux => src}/translations/friendiqa-de.qm (100%) rename {source-linux => src}/translations/friendiqa-de.ts (100%) rename {source-linux => src}/translations/friendiqa-es.qm (100%) rename {source-linux => src}/translations/friendiqa-es.ts (100%) rename {source-linux => src}/translations/friendiqa-hu.qm (100%) rename {source-linux => src}/translations/friendiqa-hu.ts (100%) rename {source-linux => src}/translations/friendiqa-it.qm (100%) rename {source-linux => src}/translations/friendiqa-it.ts (100%) rename {source-linux => src}/translations/friendiqa-nl.qm (100%) rename {source-linux => src}/translations/friendiqa-nl.ts (100%) diff --git a/source-linux/application.qrc b/source-linux/application.qrc deleted file mode 100644 index ad823aa..0000000 --- a/source-linux/application.qrc +++ /dev/null @@ -1,262 +0,0 @@ - - - qtquickcontrols2.conf - qml/friendiqa.qml - qml/newsqml/NewsStack.qml - qml/newsqml/NewsTab.qml - qml/newsqml/Newsitem.qml - qml/newsqml/MessageSend.qml - qml/newsqml/Conversation.qml - qml/newsqml/FriendicaActivities.qml - qml/newsqml/Hashtag.qml - qml/newsqml/NewsImage.qml - qml/newsqml/NewsVideo.qml - qml/newsqml/ContactPage.qml - qml/newsqml/NewsVideoLarge.qml - qml/newsqml/SmileyDialog.qml - qml/contactqml/FriendsTab.qml - qml/contactqml/GroupComponent.qml - qml/contactqml/ProfileComponent.qml - qml/contactqml/Contactlist.qml - qml/photoqml/PhotoComponent.qml - qml/photoqml/PhotogroupComponent.qml - qml/photoqml/PhotoTab.qml - qml/photoqml/ImageUploadDialog.qml - qml/genericqml/ImagePicker.qml - qml/genericqml/ImagePickerLinux.qml - qml/genericqml/Search.qml - qml/genericqml/IntentReceiver.qml - qml/genericqml/MButton.qml - qml/genericqml/LinuxSync.qml - qml/genericqml/BlueButton.qml - qml/genericqml/ContactComponent.qml - qml/genericqml/PermissionDialog.qml - qml/calendarqml/CalendarTab.qml - qml/calendarqml/CalendarDay.qml - qml/calendarqml/EventList.qml - qml/configqml/AccountPage.qml - qml/configqml/SyncConfig.qml - qml/configqml/SyncComponent.qml - qml/configqml/InfoBox.qml - qml/configqml/ConfigPage.qml - qml/configqml/OSSettingsAndroid.qml - qml/configqml/OSSettingsLinux.qml - js/image.js - js/photoworker.js - js/service.js - js/news.js - js/newsworker.js - js/helper.js - js/smiley.js - translations/friendiqa-it.ts - translations/friendiqa-it.qm - translations/friendiqa-de.qm - translations/friendiqa-de.ts - translations/friendiqa-es.qm - translations/friendiqa-es.ts - images/defaultcontact.jpg - images/fontawesome-webfont.ttf - images/folder-blue.png - images/smileys/animals/bee.gif - images/smileys/animals/bigspider.gif - images/smileys/animals/bunny.gif - images/smileys/animals/bunnyflowers.gif - images/smileys/animals/cat.gif - images/smileys/animals/chick.gif - images/smileys/animals/cow.gif - images/smileys/animals/crab.gif - images/smileys/animals/dog.gif - images/smileys/animals/dolphin.gif - images/smileys/animals/dragonfly.gif - images/smileys/animals/elephant.gif - images/smileys/animals/fish.gif - images/smileys/animals/frog.gif - images/smileys/animals/giraffe.gif - images/smileys/animals/hamster.gif - images/smileys/animals/horse.gif - images/smileys/animals/ladybird.gif - images/smileys/animals/monkey.gif - images/smileys/animals/parrot.gif - images/smileys/animals/pig.gif - images/smileys/animals/sheep.gif - images/smileys/animals/snail.gif - images/smileys/animals/tux.gif - images/smileys/babies/baby.gif - images/smileys/babies/babycot.gif - images/smileys/babies/pregnant.gif - images/smileys/babies/stork.gif - images/smileys/confused/confused.gif - images/smileys/confused/dazed.gif - images/smileys/confused/shrug.gif - images/smileys/confused/stupid.gif - images/smileys/cool/affro.gif - images/smileys/cool/cool.gif - images/smileys/devilangel/angel.gif - images/smileys/devilangel/blondedevil.gif - images/smileys/devilangel/catdevil.gif - images/smileys/devilangel/cherub.gif - images/smileys/devilangel/daseesaw.gif - images/smileys/devilangel/devil.gif - images/smileys/devilangel/graveside.gif - images/smileys/devilangel/saint.gif - images/smileys/devilangel/turnevil.gif - images/smileys/disgust/fartblush.gif - images/smileys/disgust/fartinbed.gif - images/smileys/disgust/toilet.gif - images/smileys/disgust/vomit.gif - images/smileys/drink/tea.gif - images/smileys/drool/drool.gif - images/smileys/fantasy/alienmonster.gif - images/smileys/fantasy/barbarian.gif - images/smileys/fantasy/dinosaur.gif - images/smileys/fantasy/dragon.gif - images/smileys/fantasy/dragonwhelp.gif - images/smileys/fantasy/ghost.gif - images/smileys/fantasy/mummy.gif - images/smileys/fight/2guns.gif - images/smileys/fight/acid.gif - images/smileys/fight/alienfight.gif - images/smileys/fight/alpha.png - images/smileys/fight/army.gif - images/smileys/fight/arrowhead.gif - images/smileys/fight/bfg.gif - images/smileys/fight/bowman.gif - images/smileys/fight/chainsaw.gif - images/smileys/fight/crossbow.gif - images/smileys/fight/crusader.gif - images/smileys/fight/dead.gif - images/smileys/fight/gangs.gif - images/smileys/fight/hammersplat.gif - images/smileys/fight/lasergun.gif - images/smileys/fight/machinegun.gif - images/smileys/fight/marine.gif - images/smileys/fight/sabre.gif - images/smileys/fight/samurai.gif - images/smileys/fight/tank.gif - images/smileys/fight/viking.gif - images/smileys/food/apple.gif - images/smileys/food/banana.gif - images/smileys/food/birthdaycake.gif - images/smileys/food/broccoli.gif - images/smileys/food/cake.gif - images/smileys/food/carrot.gif - images/smileys/food/cooking.gif - images/smileys/food/fryegg.gif - images/smileys/food/popcorn.gif - images/smileys/food/tomato.gif - images/smileys/happy/cloud9.gif - images/smileys/happy/tearsofjoy.gif - images/smileys/laugh/hahaha.gif - images/smileys/laugh/loltv.gif - images/smileys/laugh/rofl.gif - images/smileys/love/iloveyou.gif - images/smileys/love/inlove.gif - images/smileys/love/love.gif - images/smileys/love/lovebear.gif - images/smileys/love/lovebed.gif - images/smileys/love/loveheart.gif - images/smileys/music/dj.gif - images/smileys/music/drums.gif - images/smileys/music/elvis.gif - images/smileys/music/guitar.gif - images/smileys/music/trumpet.gif - images/smileys/music/violin.gif - images/smileys/oldcore/beard.png - images/smileys/oldcore/headbang.gif - images/smileys/oldcore/laughing.gif - images/smileys/oldcore/shaka.gif - images/smileys/oldcore/surprised.gif - images/smileys/oldcore/whitebeard.png - images/smileys/respect/bow.gif - images/smileys/respect/bravo.gif - images/smileys/respect/hailking.gif - images/smileys/respect/number1.gif - images/smileys/sad/crying.png - images/smileys/sad/prisoner.gif - images/smileys/sad/sigh.gif - images/smileys/smoking/smoking.gif - images/smileys/sport/archery.gif - images/smileys/sport/basketball.gif - images/smileys/sport/bowling.gif - images/smileys/sport/cycling.gif - images/smileys/sport/darts.gif - images/smileys/sport/fencing.gif - images/smileys/sport/football.gif - images/smileys/sport/golf.gif - images/smileys/sport/horseriding.gif - images/smileys/sport/juggling.gif - images/smileys/sport/skipping.gif - images/smileys/sport/snooker.gif - images/smileys/sport/surfing.gif - images/smileys/sport/tennis.gif - images/smileys/tired/countsheep.gif - images/smileys/tired/hammock.gif - images/smileys/tired/pillow.gif - images/smileys/tired/yawn.gif - images/smileys/core/beer_mug.gif - images/smileys/core/coffee.gif - images/smileys/core/dislike.gif - images/smileys/core/friendica-16.png - images/smileys/core/like.gif - images/smileys/core/rm-16.png - images/smileys/core/smiley-bangheaddesk.gif - images/smileys/core/smiley-brokenheart.gif - images/smileys/core/smiley-cool.gif - images/smileys/core/smiley-cry.gif - images/smileys/core/smiley-embarassed.gif - images/smileys/core/smiley-facepalm.gif - images/smileys/core/smiley-foot-in-mouth.gif - images/smileys/core/smiley-heart.gif - images/smileys/core/smiley-kiss.gif - images/smileys/core/smiley-laughing.gif - images/smileys/core/smiley-Oo.gif - images/smileys/core/smiley-smile.gif - images/smileys/core/smiley-surprised.gif - images/smileys/core/smiley-thumbsup.gif - images/smileys/core/smiley-tongue-out.gif - images/smileys/core/smiley-undecided.gif - images/smileys/core/smiley-wink.gif - images/smileys/core/smiley-frown.gif - images/smileys/adult/bong.gif - images/smileys/adult/drunk.gif - images/smileys/adult/finger.gif - images/smileys/adult/sperm.gif - images/smileys/adult/tits.gif - images/addImage.png - common/filesystem.cpp - common/filesystem.h - common/friendiqa.cpp - common/uploadableimage.cpp - common/uploadableimage.h - common/xhr.cpp - common/xhr.h - qml/newsqml/MoreComments.qml - qml/newsqml/NewsPhotolist.qml - qml/genericqml/DrawerAccountComponent.qml - qml/configqml/LeftDrawerScrollview.qml - qml/genericqml/LeftDrawerLinux.qml - qml/genericqml/LeftDrawerAndroid.qml - qml/genericqml/DrawerAccountComponentContacts.qml - qml/contactqml/ProfileTab.qml - qml/contactqml/FriendsListTab.qml - qml/contactqml/GroupsListTab.qml - qml/calendarqml/EventListItem.qml - translations/friendiqa-hu.qm - translations/friendiqa-hu.ts - images/Friendiqa.png - images/Friendica_monochrome.png - qml/configqml/ConfigAppearancePage.qml - qml/configqml/ConfigStartPage.qml - qml/contactqml/ContactsSearchPage.qml - images/Friendiqa.ico - qml/calendarqml/EventCreate.qml - qml/newsqml/BlockUser.qml - qml/newsqml/ReportUser.qml - qml/newsqml/MessageImageUploadDialog.qml - qml/configqml/AcceptRules.qml - translations/friendiqa-nl.qm - translations/friendiqa-nl.ts - qml/genericqml/SearchDialog.qml - qml/newsqml/NewsTabbutton.qml - - diff --git a/source-linux/friendiqa.pro b/source-linux/friendiqa.pro deleted file mode 100644 index a9313c9..0000000 --- a/source-linux/friendiqa.pro +++ /dev/null @@ -1,65 +0,0 @@ -# NOTICE: -# -# Application name defined in TARGET has a corresponding QML filename. -# If name defined in TARGET is changed, the following needs to be done -# to match new name: -# - corresponding QML filename must be changed -# - desktop icon filename must be changed -# - desktop filename must be changed -# - icon definition filename in desktop file must be changed -# - translation filenames have to be changed - -# The name of your application -TEMPLATE = app -TARGET = friendiqa -CONFIG += release -QT += qml quick gui widgets sql webview dbus webengine - -SOURCES += common/friendiqa.cpp \ - common/uploadableimage.cpp \ - common/xhr.cpp \ - common/filesystem.cpp \ - common/remoteauthasyncimageprovider.cpp \ - common/updatenews.cpp \ - common/alarmlinux.cpp - -RESOURCES = application.qrc - -OTHER_FILES += qml/friendiqa.qml \ - translations/*.ts \ - qml/*.qml - qml/newsqml/*.qml - qml/contactqml/*.qml - qml/photoqml/*.qml - qml/configqml/*.qml - js/*.js - -TRANSLATIONS += translations/friendiqa-de.ts \ - translations/friendiqa-es.ts \ - translations/friendiqa-it.ts -HEADERS += \ - common/uploadableimage.h \ - common/xhr.h \ - common/filesystem.h \ - common/remoteauthasyncimageprovider.h \ - common/updatenews.h \ - common/alarm.h - -DISTFILES += \ - qml/calendarqml/*.qml \ - translations/*.ts \ - translations/*.qm \ - qml/*.qml \ - qml/newsqml/*.qml \ - qml/contactqml/*.qml \ - qml/photoqml/*.qml \ - qml/configqml/*.qml \ - js/*.js \ - - -target.path=/usr/bin -desktop.path = /usr/share/applications -desktop.files = images/de.ma-nic.Friendiqa.desktop -icon.path = /usr/share/icons/hicolor/scalable/apps -icon.files = images/Friendiqa.svg -INSTALLS+=target desktop icon diff --git a/source-linux/images/addImage.png b/source-linux/images/addImage.png deleted file mode 100644 index 988f9f1e5f88a502c91848f15eecf13fe264e165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 zcmV-(0gV2MP)SGo8ze$r^i@>My7IXJQNvo+0fP>sqU+gHWSSnR4 zl`59XpFKu$;qJ?*P}1DYN0bBbDCvDt%-xsneiJpD1Aub?bE2n`*1tUdLtqzFu~e#9 zD#eP8t&73TUZX+)t)xYed6P6my~Z+Q3wCX0CsDJeX;x--8NBd<a{85q|Ht(nQ0m<)=IqDs3BA-h7W>H$7 RyW#)<002ovPDHLkV1nF@qiz5I diff --git a/source-linux/images/fontawesome-webfont.ttf b/source-linux/images/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2fa1196aad98c2adf4378a7611dd713aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165548 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 z 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 d0mons$Mudejat z5+TTekrq7XIhJw4P3w$!opH?%*EP^oP7E61=2FNH86Fy?9YKRsc)bSwN&E}k3op<6 ze)v4^`@{P@?*6B{d&cdsBT@$|LX`|vAY^r+(8|h6C=?>=oj?_^(5kEeQa}dC0VYtg ze%Nf(-cAfdte<$E1c5}6WSQb|N+v0trgVmKIWkQum8iT;Olzyx>GZo?+~6QTIx0*| zh=G8@^Qs_dqL@*XoT{3dwwX?sGnv*_#_9CBT>im9&f^KQY%~~@cwP|%RTMQ@*5h#_ znJlDI#cX!FooVm&_PYIUhGV>8uRrSNBrdFkqiR&rBt=(LL)8kJzNs7Ah8Tz_yqJh8 zDM`&Prt*nQF_jC5!koMiiC`yD-8pp; zC;$ea0~(+L3UC2f03rYna6kZH0WZJ+ZommNfl6g67Ac>nY?e}~9c4(;j!-y`SawG` zF4vBRY&MHAS{V?m%o6|+kbyXm{Fm}ZaCQ>X>sVgE4!nmFo>g#NCRNY}|zVVN03+nK&Ra+*pY+_-klDAEA z+a&)(lhj9 z@WM0w$NKCYZH|7|8Q=Jf@1*_7S$qHVIP065JYf%WP$%d$^U_37yzhR@h1x-0|Os} z4oD}+3j ze?BwQ%P(T%)RLn$e5HGI@-sBr;*@W+ZD15Q$C8uJerM6%N!>ur7ZW)*pFIKO<`)YgR1m{^t2YCIswyp%D+Dl+SqZS?7lMH7y$D_))7dS0%n;6`&R%Lygs7N06M KmrF{F4AubOrY>>- diff --git a/source-linux/images/smileys/adult/sperm.gif b/source-linux/images/smileys/adult/sperm.gif deleted file mode 100644 index 6ba921900f3a513c25295d9938dfaa99206e6b70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2908 zcmZ?wbhEHb)MVgiI3mRW1{@3w0t^fi3=E1444MoKh71f&3=Ccj92^WB0t_4y3>=CK z9GVOqh725*3>;1j99|q80vsHg90C&G|9}7f|Nnm{AO_Ju05K6l0=bI+x&2&2f}I@$ zT#fV$m>Gc*ia%L6`5B}bbU=zg&R}4jxj?NiC39Z#1_8dry<%GD7aPP_oMSO~JH2I& zfO^H>zU_+V0(R&msWg@psIX3*7{j=Vlcj~*@xh6JXFU8ep~{L?`(L%5am$#c&(EHx z^O0*&kOdcGy=G&18bh2hBbOx)^F&ML(hesEcP_I8Go`XLwhWf!&{!^!R+afq?CCK} zH9R|_H<)bl+Ol<9l@p8W`dvm`vnJR|0mB1}Yo|b6y9l3ad6L}YizH5pE(nx#o@s1T zzYCiY-CA#m#||;pT|?yiOLZROxi@+EgrB)9ZN8Z5IpyyWS5Nv z_jc#2yngGwnUx$IHuC@Y-_Xct#*$xJ5nX0GK)p9J_DrLj{lsktTZ!f!ADW1o|+}ha4pb`}o&)8e1+LzEuc5nZM8V!|UD~wk;^DbYz5)^=&HfwOjmEj7%84zba1}95>t@BEbpk!(I zc6u|=nJ@mJ zi35{mJ1ALJI@P-EGUh4_F;K#uDu+mz!qVgd^vr`L>TMPpwH5t5z-!WTFvTE40GK9c z*;ue|pWeq+3M@#DgsR2hzYm(Yv)&RSkxM~0Z diff --git a/source-linux/images/smileys/adult/tits.gif b/source-linux/images/smileys/adult/tits.gif deleted file mode 100644 index 4c1658c50ba7b7fad654c36efc4e504f1b561feb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 696 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 N2l`?#! diff --git a/source-linux/images/smileys/animals/bunny.gif b/source-linux/images/smileys/animals/bunny.gif deleted file mode 100644 index 402b2b31b5fb879b653d60f13bae95687e94e6f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1482 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 L>!g2d#+LpAV+UNd diff --git a/source-linux/images/smileys/animals/cat.gif b/source-linux/images/smileys/animals/cat.gif deleted file mode 100644 index a612c476589022d971813cdd9829936e147ad9b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 864 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 diff --git a/source-linux/images/smileys/animals/crab.gif b/source-linux/images/smileys/animals/crab.gif deleted file mode 100644 index db5b8ce3151dc7adb83db0bb514010c668ae8e9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2718 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 diff --git a/source-linux/images/smileys/animals/dog.gif b/source-linux/images/smileys/animals/dog.gif deleted file mode 100644 index 7b28477b58e5785cb943968a6f0198359936ec8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5371 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 H2=(}1oFISy diff --git a/source-linux/images/smileys/animals/dolphin.gif b/source-linux/images/smileys/animals/dolphin.gif deleted file mode 100644 index 672ebd72c66066e1a1d9422e7636a88c3e033429..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1581 zcmZ?wbhEHbG+Iv~X$JDgem3!Ly= zz1QNtfs20Jjou{BvPQQ;_97LIq%&L66}l#EX*Za^Fhngui;4F@isy<=ED}Ae#m>n- zjQ$!S1*Ka1?=(axDDdo(=zD&EZTEEF&KnOF-+aG$Mz^1R)dfFB?&g-(Hsh2O**5L~ zAiroM|c4?H#`_xA^HV|sE?wAW2vt|r0FsWn4fz*Y5EMA8a=!9eeF79EWy z_4yp34>o1a^qP85bCtj0#@na(1SNIfNEtdj)H|)kI{NKJz&xF0T zp{7Zqg1ME0gWZHJwRJ*nr&6`0ujXV0C#K(mi)PV2m-GBa28 zt(~XI#<7ueB|Fo6zh%M|D_8G2vX_hVK!4z+NoL0wwy#`sdftZf{f8eMNhrUw^Y+>e z2QNL`ov+7u`T4Fz?61GQJ=X2N`_s3F|J~Q!y!bu+wtfAUB|jvLo(QZ@W#{*rRG1>@ zYHs$<^-H>1iyk9)${dLniTA4Vl*)B5#jK$B~IcdDKVZOa2 z%Y>Z^Rs;%`GfBjr`m%yi&#_f(YbGzt)zwP#iVPJ**m(q8md}eY-@J-_PLltUFDhSN zTd&WWxNENW_I0tGf+Hp1Z7dAaK_So34-D@kXM1uP{$HH5$)oLn^PXv{J{p;UrriSX zegBv~J{P-pxTd>SGR>^>M#ml0`v-9mEgCvhR z9BEqYQJlrmxMk(#C1+S}$Sl0Ve06n%^A;_xVx zVFM_M2d|i9AaKPYI#)$NfX(KzzN-eueCESl1tKc;ryYf}l<)L}E}68AcUJmAZFTK} zdH4Olx-DzH-TH}V@7cY}H`dh#RH~b>w>Orzh?TU1(|B6@#HMZ$`#w+_pC9DVKVe$_ z3`-{V33KKxSg6_0HMf2KvTWv6?414U<^xmtCeEEq3ktJWa;({V>;M<%;R!*PCz~yw zHDS-01sg9+IQrn2iH(KA{KdETZrpkK;XZ4-4^I`ZynNNq{x;~#dzBJJ^O`RoQ_oKo zl?=P3*tz+5|6V0V2g3=0t53+A@y(Q-a%e&Fk)*59JUt5PFL+EFF54J!h))RAXXKuj z7QAmLyWgSq;=PmNn1H!TTRe9y$|>WU5_#Z_5%PknuH ZRnEt~OZK-YIHXs_p5C@Lnh%(=tpQSDpTPhC diff --git a/source-linux/images/smileys/animals/dragonfly.gif b/source-linux/images/smileys/animals/dragonfly.gif deleted file mode 100644 index 566e95c2795fae51dd377d1a05844100c2756571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2545 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 G4AuZwWU?m! diff --git a/source-linux/images/smileys/animals/fish.gif b/source-linux/images/smileys/animals/fish.gif deleted file mode 100644 index 3a7a584b36089868fa46d8a2699193e86be3297e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4499 zcmZ?wbhEHb)L>9xSj58c?_Jb?1`zlU24E(LQ2fvB=Nc01>=@u`q-Vg)2on0q!YRVQ z!k`0^2We+uZt&Q3=bynT&((V^UZ36lKSH7Jfyunol0})DC$0U>W@vo*s}YyYd~HU# z1dA_MS&pO_G8ZdMJ^J+N)e5coZl`?{_cF0GH!7687TWme;})L3Vu!PIrL*2t{6HSg&KTZV0%snzPMg5v!=BTIZ=#uOIqYbx)D>3ET>DRKiNp()RF= zGuGHT?|*3e`{}<$8!tuQ?K^g7hks3NadbnYM^U6UAJAD9YCa);R-KitzD#L$W+rpY z<}aLs)me?G&WcuGQ!wpYTGFMtWzyTv$IkiaFJAC^yU>eZ(Wb6tDl*I%i9e49nh7UoUQ%B{{zD^d&Lt_d&J-~~BL zSY6OTeL|(LyQMA9jM?+%FW|!JszDl9qX}y?VbLTPjwY<3matgS>YPDUVlgtXGpI0# z1FJ#}g@ax(WW zUEAw)-+xyuzk|v@1A~~t%oLVbosNdcIZP!xPo7Fljp}bv|8nhX9DDQf8y_D9u0K{{ zAf4HL>T1QU%&f<~q3+p6xrzA&p&sUKAr;NZ8r=20;@y+H)x#5N1NoiRXNyg=urX{| zwqoTfNvyTRBvkjotJJ9i>m0pzNa&n;Kg(|MgWm#C>JOMDdL7!lcL>VNKfyM+vCCrN zi4{|p7so8T{v_$;hPxv11`Y-iKFhg_`FFeRYW>hQ$Af?SXRWkM_jr3#GvkudmiE}r zh~|cv(2OqsNvVCw{_5FD!n1k5v2BKxtgiwWW>Ux2R}3q8U-xWn!p&b)-v9?;BC_O z$q%koKV@>5^^nOzZT4p0&PlGv=CL!Ix_GYL|GA34CM~YMQo6Y=wLmPVr8Ty($%eZ> zwN-D*)Y2IL^Mo>(O`7a2EV(Rd%|;Qo&57G~aAS4t1dwZ;j=HZ_Exxz6 z^;v>OU$6VTo0iLx9_(9Sxo->CrGl>$cdSm{Hm`rvA#rVX-7MzO5Rpe@JneH7f^Ovy$rCl-Z9zS*KzqiZBZ{-c9?s$zr0=(;=rU@UcuEGmmzD(qEyu4 z&|@{JW2!Izbi>(mpa~z%MY$+0YCqWCy2y3fl}@i$T)Tp~^_^nRZ((@zoA>n|1&0Sr ze5Iyxf~+DuY;!OpA8buDot~}tzE_yb}PqgZGo>Idv9)e{tvx3 zr6IvH%YSLd%QaRrRkglIvT|&)%NDhMd-q)0hl01Ue7%|5Z)*Qp_uz|#mVn1B)|zVd z^fH!4d1HOc?w(#ETrluqP=0VaBnKqbiAYm}q z^WrAYTs`m0%Z0fF5~@RAg`V0x^K|^eU8_aJF1{@?e-XR)c|nLmgAVt%D)qEdmIiqP e!48XVqGDm-!(cQWoZUS#(g7=4c`(3bq%{C}&N!|B diff --git a/source-linux/images/smileys/animals/frog.gif b/source-linux/images/smileys/animals/frog.gif deleted file mode 100644 index 85e4b56e783edb4a72975a7976f5d412ce073004..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1580 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 diff --git a/source-linux/images/smileys/animals/hamster.gif b/source-linux/images/smileys/animals/hamster.gif deleted file mode 100644 index 96c7323c5647ce33debb3651c32b873aa0aeb7be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1246 zcmZ?wbhEHbRA5kGXl4L{{~&zf!i0E+dFi|N9I7 z`}_YNSpWY*zv6#xKi808XU70nBRvCVMxbWJpDdgrKw1ZgfrctDIJ5j0IN`Z^Z$#Un z^A8uW7de`-dJ0)&TrxSiY0JytDUx%IYTke56wp%_xZ|ec7ieI@%5$Q{Nzi4I&#Wm~ zvz@lenJxVM?Qdgbl&D#NjEQ!m@5i~DZ>^8;bvOA`b0nLM&4|;+z(K~S$-FX-ub+`e zyFVkLLc+@0-Y#*vm^5n?|7@NFo~U^ulP4rBTgtyWLo=AGM5?fNN3Uy2;l6!d#g$TS z<;vSik9nM!U(MkmcfKK8v8?{GWwU}!uuT}-8FkKP?kN2zBW^a$o@}iNFZc0QiLVWm8aVc~_M3CCAxy%kv|nfgpoEA3OnmRF2vllbE2bJa2a zaNVSGl2Z^%@GwJzr=o4{LB3c~4ra!}rFF0EhYf5%)T4!>|@!|iy(c0#}B>P(z zYIo#lS)Y0Ku`^MQ@A&H}FLobmcTp+s4| zhq1R2H#cWJZzoR$YrBzWAtzfq=XBog>FwNX(F6 zEML8*N{VyihR)r4R`Rb|E4gyd-s3BI4j<9jvf;#qgJ;evEjo66cjuw3qpPOZKYVoh zZs@AVFPaL@J%9PA@2ZsDqIdQDy{~gVPyhbnQ1ARlCxfs0-?0y6Dpm2^nl)!b-1P-H z6`~Fij)@0CY7;(pEjn5!!DsEXCfVJSm)|sKRgNGdW(ooak!JJKACKmCbIJ&auu2p) zKA0(?xj}s@*ZkDz)(^*Cc>hxs?=hET?BB0=9vDRapdk7s3ko6)rC7n6%oZn2<2D{J zo^b1<*~KSI!9f&Mc5wqFh~!-u*=j&x)CCM9ZtiwfZ_W|L}&WtY+(z7vb~?&Dc=Wa{yar#9?6T&TEe z&#f)D&YnAeWAWnpCr{622RwTAy6L*~%^7c=^{;)e^7zx)zIVB+-|XnKySiEZ-9f8{ zM{H#q8crry#_V%zyfERQlTi%cURGi81Lr2BZV)uEI>Kr+`*^vz%bkdmm)Kf4aD);t zpOKf4oHKgkbbtw|s~(b&YO}o#6!>U}aAw9NNBoiCDQ|$Lqy}IpRkC&%c`7n;)^>7o z^7hQ^;AWdSIbbFy-;&v!9aER^FIo&rN%LlIs^H{bTW!U;X=B&keN%T9c<~l?J$U*0N&mVWyGI|+^u7JU zy5{xHzJ<>&a({QYyT5?RRV6ZXLd?4OB@P7%n;F9zVt99Ra*IFc6H47EU|@EJRcN+* Pm%PoDh?A3?SQxAU))E=% diff --git a/source-linux/images/smileys/animals/horse.gif b/source-linux/images/smileys/animals/horse.gif deleted file mode 100644 index 9103abfa6a9bf519db3c1a67ded7332c665071ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2464 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 diff --git a/source-linux/images/smileys/animals/monkey.gif b/source-linux/images/smileys/animals/monkey.gif deleted file mode 100644 index b9b338d2c3cea51d1da6d940ce2152fd4c07e482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4901 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 X4PmC%``rS^Ki+&U2l@XX$bJ6>qCXuZ diff --git a/source-linux/images/smileys/animals/parrot.gif b/source-linux/images/smileys/animals/parrot.gif deleted file mode 100644 index ae6faf66b83bc0fa155f096f24a0312e9b8a689c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1770 zcmZ?wbhEHbRA5kG*v!Dd!os4`!;-Vbre}@ImN_;oEPwt0@e!6gZ_fPr^M?TgDE{a6 za}5c0b_{Se(lcOY1S(Mc$-*hez{;QlQVcSdfo0={6P~O0TD(5H`~Lz{7De;ErDk(d zwAi#|wyYCb|0CvhMgOi1atsrgxr8~B)`-L~PVi8Dds)V2^2z3DFLyI-NeC!SFyLW- zpj#@YBVCZVN_r*j0$8kZKADRXo-N!PU+cXSmO)%HzjoK#)YR>s&l zy<4JpiqX811>&<-PFps4vEkC?k~ul+mntS(Zrg6Bym{j$JL4z@*26L^Cr+L^#m;cz z?CFb_E?>DK2=)a(vM-of&Ov-}S}^TJ)DG4dK@KL3H0I+AUuLbE{JL&q#j~wnmWg!@E=*k_LWxJRwO8LQ(_gOTW22DH*uJBj*H7~9N1Ivy zL?w9H{Fy6@ylOQK>Kp8VZXWERd` zxoYXM87qv`*R0*TZO4}NMnXB$*KKf`zjx7owPS}*%5UDKeeRh2mHh`D;CZ(X}0 zFUo%V&f}BM#93axdj00@yZ0YHe!${I29_;AFP`QweQo>xse*Y$M244KWw$R(2(EG%2Rwr+N_>D2Y>mP%!mZ{E^2-A=oFa$WfxyX`wy8Ow(^pYUKge*qLx zSFc^ahQ%WzAg-84<7zPHE0h9|d8ihEXujBlD8?1Uc!0%tY8hWj6zl7TU94yBCC`3V z?*Ey=!GGIsMj=kcbru#%llMBjbg;FWs-xL)YA@ebdA+Ti1`_)e-<_?QcJRPM=JPtj z98BMX7!pt4`dF`6%~4a=P+p)`-qLDNR^BLA(cIhL-YGS?N4YzmXrG{6{fW2<7a--Lq!F5NS3h96CH)oAnko;go+*&6dr;=8t$ zSj~4!y|(9R(cT5xZ9;6F)=}y!V+?w?-VnaE%cp(u>oh5)iv2CorsAx#_j*g*eELi5 zOuotQ>3NGEzWeE(Ui|o}oqDNQdV!g}t6FTjd6#OtS)_HJLzTOkL|4+pDKjTeGH{Vp zvQ?5?JV`~86XZNjE>!2qXY9K3&)}5j>b(}P&sxi~2J^&a&dXS}F6Z^W0-f{GOxW~v zg1vN9DQeFeJ1rCK1P-e?(@RA=*3I1!wfxk%6**ENp6^3@=eMudg0)R@m`XM|X$ z!Sl(f6S-W&dPQ7bRB@VV@%_>*pSr$q^;6v`cb{+NKWn%Dc9H+OYx|B@tCfhR<(t~M zsK%t3b*i+PMp*UQSGt*scP37lJY&*CeP;f`lu#j*O{vy4zBE)a5*We z`~N)Up6JiL8CplL0kw7;;2O;?%K@;w{&-lEZ7zsFER6h$+Q=pUNPBen_pZg znzu6i-R_lf9M6?+_1HgnbJ5dEo%K+Hm&-qu7LBh@=eTZd&MN;gwQc8Pjvqa8&a>a@ z@n`Dl^_2eJJB`oGrnb(!u}MV7-$tfg-$2=1PEH!h6>JO~49pBnz;wtGu`LX1c*!EC XfZw8VENv<96mUirTl^1f2wMXHCJAZH diff --git a/source-linux/images/smileys/animals/sheep.gif b/source-linux/images/smileys/animals/sheep.gif deleted file mode 100644 index 8fafc11d244b9e38a17b7ae741741752a154fec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7631 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 diff --git a/source-linux/images/smileys/babies/baby.gif b/source-linux/images/smileys/babies/baby.gif deleted file mode 100644 index d105afb3558569fd2765d038c4388e638b82f7cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334 zcmZ?wbhEHbN7w zY5$*sRDqN-Fev`#_Hzvhc6JPKHPSO+1{t9ElZ8`+fsa84Bo8u{fhFgHCui2&8&?&M zDTuQbxF*gy!sz3WKCfU`mUG}i^A()WYVUD~E@0E1C(wCn!HNK#gcGMuU&yiJ4Pk)W3|3A##j$Q3n{Gn)g-i~X%w*fC8!z!5-LWwsm7(zM ZBE!=kwpU0B^VT&rx3@KCHwiLW0{~?adDj2{ diff --git a/source-linux/images/smileys/babies/babycot.gif b/source-linux/images/smileys/babies/babycot.gif deleted file mode 100644 index 750f6df1ffadd91a9b652393a8fff444e8fcd44c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3453 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 diff --git a/source-linux/images/smileys/babies/stork.gif b/source-linux/images/smileys/babies/stork.gif deleted file mode 100644 index de2371d6611eb24b71918fb1efa73d48f724f3d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18986 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 diff --git a/source-linux/images/smileys/cool/affro.gif b/source-linux/images/smileys/cool/affro.gif deleted file mode 100644 index f06166b83256778476fd9edd3c9668e83936473a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 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 KCLA~fK>q>6*k9oQ diff --git a/source-linux/images/smileys/core/beer_mug.gif b/source-linux/images/smileys/core/beer_mug.gif deleted file mode 100644 index 9a3e0519224125a5ac596ca0ebe2706ddd09d8af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1021 zcmW+#U5M936g}!%Y8HYUgh4;;pT#oRD@(e_4R^sAS$mk=TPSmJI*`j9UX zMg`maqpI?tHiAJWK8OrqA2j`JV} zMWJD0{!Gl5iFTW~juXG0ICA<*hzwDoN9Zl|484LQxCLi$g@lkSB!;Ar5weBMkQFLI zwNM$Vf)Hdu43Yr`GteOGV4Yb<>tqoY%_1$zdRTAP(|Vc1+{|e%OR!{?Xi1h~*(}qt ztiq~UrB#_=G80X5z?&L$$UAsv-qAaGgh%s8kMbVgoA>ly?r=AEy2}$hnJ0RZXLvTx z^enINYF_D8F0`Rsbcq0A1PQSNJ7Y(7Vg#cxl2Poz-q@3U)3mXS&L(C8lQEG=%wRTV zGK&?g#!6OEpo}7=0u)#Q3sgFk&PvD9sYH}$C9*`79;LU^v-B#C;#Qo+RT4_Fl30>T zM#)w(OIE2U)kWT zhO#MBS*lPqRjNvAE8>|m(iyFno|8VfPMfD~Z3bsE7YRs)L?j^t*^r4WRG=CvQPpzP zEDu0{1vH}2A#@fxhE5?OMAO`r!Qj&tX|^9*x>ct)o*S&*cHovL zhIh=?dxn-wt=aqPmb2TPLtE#*fA^EYqAfSy|Imux-w)$wpSn=?ZF%OgL$5z_@9xLL z*d6iF$p(UZr_JRf2{6EQz`Hlbp diff --git a/source-linux/images/smileys/core/coffee.gif b/source-linux/images/smileys/core/coffee.gif deleted file mode 100644 index 7e20371741a6047a1e2bbe2548eee785de40d318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmZ?wbhEHb6krfwIKlt||NsB*NoJ^y5_tCP*{xf*wrtrlYt}4ZUtcpbGhJO>Sy@>r zDJe-wNpW#;0RaI(tABKuZEu<2AUW3WE6 zx%-&Yy4MG#r*FA=N=#WqLd~J^g3^>3txbtiyaEDx3?W{+5nF8wO0rg1%{+f#N49Os q_7vmOn$M=~)n({p=#4(CoK$C~!R1xRz$c)o%+1TmU)7_?U=0BKd_GJ7 diff --git a/source-linux/images/smileys/core/dislike.gif b/source-linux/images/smileys/core/dislike.gif deleted file mode 100644 index 77779423c8867509cc1f79102b31deeb7387567d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmZ?wbhEHb6krfwIK;s4|NsA)GtZ;}QQA!7w3$FI1StMwVPs%nXV75)0+3n;W}Av# zcWhO<7AQ$(H}E!XIJ8|LhEqV%aF&c#*qdjo3Vc`?YbPudP3-b_c~&q%?I@e)^pK1O OUv*=zwNbL14AuZ>EG^>z diff --git a/source-linux/images/smileys/core/friendica-16.png b/source-linux/images/smileys/core/friendica-16.png deleted file mode 100644 index 745b7ac6c5ab5c611182478b8de48950d125d4cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmVPx#24YJ`L;(K){{a7>y{D4^00NvzL_t(I%Vm+hYh+~@#ee7C_s)lt4`+6>K`<+R zv6Uj~RtsVyVx@Mrw)XxJ{sDG^D2pJ1*s53vf}(|sjX~okx&e3NZeo&|+`0F@?|Up} zHX=U7^EBri4!=hqUcbKn?Bm6|53b}la4d6*;OLw?IY*ol!(PXiKNajWTTY{iVmqff zKHQsbe|t4NHs1gE@@nzYu%F}D3$?=(2x9mRIz*VD2Yp?wszNcMUzH@Fgy5;JRF#wC6W$L6Fax2 zKDu*PMJaG%btUrS_ha@}uRw2$G@mNRM4UDb)5BlzrIE-5^kDDijQ77D>eui*Wp@fT z{VMZwv+k3%k&3gq91~8-sp}L(Hn|oqAe6p)aHt>lpJw}ow<+%J8ib9iD^^utnh40AuJExTgj=N)lcg z!hig;%(bf*`Qn*Q&YaIa5qtAZ748gB z^{sEVCo~s^pu9vWfd~b1$|xmK4#e)>86SMU>Fo=zi`jt|R843ujjat$Uwj4q_1pcQLCSL1*!3xraEeOJlyGCmzi&>oHCdCoBxX$@ zwvl{v8y(-nfSs4000F>0l~ET8UO$Q8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10wGC6K~y-6t&>4WlVKRgfA6Q$K3(ZS2r+6(&BfHV8B3u<-9$Q7 zC$Du&@DO;|B?mgu_~*VNAdvl?M=(5N<@DbIWL=_P;o8AcP3ungFH&mHMFp zo?#+hszAj6ui^9oGX{7dI*-lg1wge~aKsll`{ zUa}%fB>-Cb&ZG98Lq9kKKq5w~YEeSMVXewWX*q#vv(R?^G61Eo8C07E^H4tkdRC*k zyUXC24he@%aw&u>0f%`|sAt1~!a-S>eaE3v|}9^sPSQ*uLF?0^N`rcIK`c`f!7rDd8NAB9;4b~?*SmUnXJsi-hM$~(&geX5ik6QV-o**&OZUrpy2p%?SOXx0000< KMNUMnLSTY~YB7}n diff --git a/source-linux/images/smileys/core/smiley-Oo.gif b/source-linux/images/smileys/core/smiley-Oo.gif deleted file mode 100644 index a15d9742752549feb511ae1983c8e9fd6232b5cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1003 zcmZ?wbhEHb6krfwIL64}Y$EU<2%ahZd!l%Mli=%P;)4H-=9TER@QToSixnK9> z|2$Oq`&jY&O}W316hEGqe!fri?s|bK+3aUe?SJ>->H-*qr$B%eVU*1+QE_ zRg>*_c^=od8?wbw+}D=yk+jZI3N5y~LmH&E8_WKRl z51+qoTs7s{UeTX-;I1Yee6?dtVT%yKm=; zL;Kcc`f+yU@vd6fxu=uk#F6bcm-Fu1vHbE1fiG8O7L{{WX4t;JD06Uu$jUm-hg*ei zEa$zjPP8$?b%+DNo^^O$=shVNPoE^^YgAe zD9ph?@jthpYe=xOV}PrXo&hr>0|SHNPZrh_4D}2;KsGRv1Q;0D*EG~OHMg|3hUa>U zS%g#;x7EulYjbhQak8oyw#s{O^D{FuEM_%MZ%$NR%)rFJxSl~Uh^@(P-G=o$8H94` zD~z_U+rEJ%zFtP`@Zlp~^=!U!tJm(*P)e$2&*0={X1cdpK+j3ozCM}NRg;I8mq$N} zLrPY$$x4NlQ=N}bOMt^$VbK)HE6pA)focMGE;2BAOmm7^6-UYxDO`W#UoS;9>wO zWtuZbjjL-K6EB}y{gm#hJX*~gm)A5kf{jW+HA)#|6hmuE8v|n(Lw#p=*M!!tdd9x) hY16uUJ0>>IYwf9r=wn3HM~M^Aj2ZwZFp?7r)&TU(i4On( diff --git a/source-linux/images/smileys/core/smiley-bangheaddesk.gif b/source-linux/images/smileys/core/smiley-bangheaddesk.gif deleted file mode 100644 index 91ccb8bb4de286aef08a50464f969cc69da8fead..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 885 zcmZ?wbhEHbRAP{0Sj5J_z;H}}fkBajW2pqg|L=$MU}whwS0gq4eT$x3lTJivkBfjj>U zPI*S|*dFFn#V_?NCeE|rc7xWE$aTRBHZ^&3d|fGNG-I~~zs|B>H(RXdX%&d@Y1*a< zx2%j>AGknau}sDO2Om;1n-e#lE_{7B_lrV)YJzsx5qD!tkOy=sD>Q6@9?)sbt4xpJ zF7IkioD`?s-!QQ!tFLo53J7Eh37CEd-m3^-nHp~aiMad(jp&-`&ox}1pG7ANY+#^GB7YwNUBs&3eL^U r$xPLC|5j3xnWv;sQj}Ph%F9(=Uapssn3I#QTU?M>T&$Op%3uuu#0Y#5 diff --git a/source-linux/images/smileys/core/smiley-brokenheart.gif b/source-linux/images/smileys/core/smiley-brokenheart.gif deleted file mode 100644 index 971b57fd984d3be7d66b05f9107ffa089e5e0a38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 598 zcmZ?wbhEHb6k-r!IOf2>#>6DTz@WguAjZXO#lq^r#Kb8g9L>Ox!@wXZAyv-6*v!B% zlYuFZPhc?v!$tT2m?($YHG*24gBNFd7E#@frv)yKy%B*Zs3I4(N6proX=s3fzhs;sH0ed5GPQ>XMzpEhCE ztf}+n&0Mr_+KS~1HmqN_W%JHWn>Ov+yKV2@o%{CgK79DteUqNDh=f*?zG_=XQy(jzlo*$w>V!$G z%6;}ivI_DF3ZgtR^A%)g+l$M}t(99Szm{8irPRiC>lo$w)SEQKx33dmSL%~xZ8Bhz zT_Y#X%*NKVS%ITZnPs^gOW!WJGrY5fc@(%+nvSe}x@9(lWYYzOhzf?Qh~E1q2lWa3_KCEyWwQIOI9nUz&g;R8pOiL-sK KFiUVSSOWmJrbp`l diff --git a/source-linux/images/smileys/core/smiley-cool.gif b/source-linux/images/smileys/core/smiley-cool.gif deleted file mode 100644 index cee1c1aa3ddfb65e164b9d0d56d2617cd0208b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315 zcmV-B0mS}CNk%w1VG;lm0E8a^3ke00dJfFY%i+lrhK7V(RutUQJhPY;?(XfrsZKgL z7WLQ^zPO&zzav{)SL^9nBOw~z(=orMEH5uC-P_gr`uhCnASMa|$-iRw?m_(dUwU8) zq>Kx}s1_F$4gdfDA^8LW0018VEC2ui01^Na000HJ;3tk`X^zRkaYu5F*bzON_CyDE zN?o1(nOa9uN?{C<#xH4zxjqC4Kv7Tt0EL2QTJ?Ac1OUM?DNhtu2BGW#I6jaG!~>a2 zBJ_FOBieY-a{&tj9A0Q11tJ_b4FdxUgN_3o0}lrx2M-p6kev%0j~N{z2@x3!0UM8l z8-f`TPYgX43mX@=7aI!}8lxx;8Wt8E0RbJt8Vye)5)BU-!onF34MZjh9i~1J9m^&R N2|PpIFXba406QuU24qVoOvYXATLA^8LW0018VEC2ui01^Na000H7;3tk`X^sOU2+VMfnLr$#cMw8$ zGDS@|4nnQKC=D96!Uf24cp9#ez~g8F9Ym)9B@BAKKMx_wI2?c%3(&H3n2Vn&umJ!R z3U$HbaoEN+8x#`=8G98K6BHW?egy#%dy$e45&;Dw0}~FDlMWM69~}}2dk}RHdkGR9 z5hDQ&2MHGf4Gk9;2?q@UBnSnt4hg~uZVd$pB##3HGc`8_1C=KR%XiQQFWDv`06WJV Baj5_R diff --git a/source-linux/images/smileys/core/smiley-embarassed.gif b/source-linux/images/smileys/core/smiley-embarassed.gif deleted file mode 100644 index adc12e7c51488a4ad97edc07107a8186aa2d60be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmV+{0n`3RNk%w1VG;lm0E8a^Dh>j~yq&6%75dW~z^P39(NxsGDE{UkxtkIEq(S-a zRKlwv+S=Lr?>hbYY~sQ?c3T&ZcN_Nh_EU3s(>Io6B&>WW`@bsw**)Ocy1bht z{*G6|uwwqUQUCw{A^8LW0018VEC2ui01^Na000H4;3tk`X^zAu2pe&Z9r7rSqdZ7= zZi`(tjS6kCDG_>&MFc2VG#m@p2;pe3fWU>|i9iX15eP8+Q&gk~g(8!IOn{RKTV4E6 z3m(tKau`G`2?-bqU3PdJ9D)M_7zv081%(@ji5QEGj|FuE4+Vjii;RH<4^kfsYZw9( y000vg7#Ru+Bm@Qu2f4br3I?Vk3%3os4ZXA`9ScG=W(ztmA4dz*ztGknApko)MRhs= diff --git a/source-linux/images/smileys/core/smiley-facepalm.gif b/source-linux/images/smileys/core/smiley-facepalm.gif deleted file mode 100644 index 7243703698f3b93a9315bce9198d4b514e2c4ab7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 zcmc)H%S#gg0D$o?w$jFIwpM$!m&-NxXt_acNy|3(s@B%5tqw_vpvQSK@UXS$((tfJ zdeB4aO$Zr^7ZFBCV4@-hdhnol@gSliY6ms@EBf*M2VW=>bbH=cQ_auUNF+$5$YjXn zs8p!cXf$ZG=yd4y7!1_ZU^G%&i^+u9jKzZ0ip_@Ij>Cb|iOYq@gV&4Chu=>iKqy2w zOe8`yN-Rb^P9i}vNlOc@t+ch#-cCmc=`@|4bam0)O*TtU55*$Az4Z0b-_Otxqoa(C zQ7SP$&cpC5qo%eqj{s=FK$YA5#zb90TWHY&(SR|E*E`Q2r zE?R@HQmKU3{3S1R6bA;vH}dwu;neeMIZ>_L`f{ZB@Df*4k$ak_-&0kB>y7FM0i|y+ zZgE}}-!{I`xug0!g=b3lErHloZ%!EQC+oG3RQ|XuBfZ&l*VO!^7&1Oi)rm5d0Y$u_ sFx;%D$XP%9E`JsL&SR@5BAv-%C>6y>>#+D4e#&nz^qMDItlpp zTG728+|V&?R13PIEBW(C`uh6d*t-1sZ^XQv;oDD}iYLOV7uVO;{`xl4#4tJ{0;h@! z>)kfFn;iS@H~;_tA^8LW0018VEC2ui01^Na000HA;3tk`X^u#@Z5?usgppB_L}dnX zI+lV|98LwHusBMHg{0!(c%F`mWZ@baBo9s|^W1VC5(A2%z+f5)Guo_RR6B}?Ig!TD z%@0LKbTywF1p^HY1BD7=AAJ~sg^i65h;SZ`0|pHS8VLgrdmji4lN$mX4FCX^4IXYI zJqxC<8UhImMI=cIbQ>A~0u}-fR3#3yiwg?^4HOGUCI}V`d2tyQRVNb&JVw@~ diff --git a/source-linux/images/smileys/core/smiley-frown.gif b/source-linux/images/smileys/core/smiley-frown.gif deleted file mode 100644 index 9ff19850d983232a620844fbed3877e4cfcde31d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmV+|0n+|QNk%w1VG;lm0E8a^K_>;q#>Sw62=mns-On=0wransPVevT^YK{Dy(0YY zH)vE6x0?;Wqb>gZas1^OT0si>`ugD5y87}*#H$s=yq(wA*8cf7{`y+(+9J7|9QfT7 z`ROHiU=Y&6F#rGmA^8LW0018VEC2ui01^Na000H5;3tk`X^w^_2%2$@1>+%(gLq7F zHWY$Q3dID2pfpN`gk$3I1e+5_!Zl(n6$?l(D|9eW1kB|E0gTII41uaaOvarBTz;7# zG$QNxqR4PI1A!YG7+)WH7k`0^f)j>q3WF4701y;|4-r3>yk-BNP}J z0vivn4;um*7!)N52pq7m90*e-4Y-M~92dSvCI%D)Lq7x*R4)cRM$s?VBq0Dh*mrgX diff --git a/source-linux/images/smileys/core/smiley-heart.gif b/source-linux/images/smileys/core/smiley-heart.gif deleted file mode 100644 index 6a11e70652d32206d792fe00b8f0ec9fbfd6b759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 577 zcmZ?wbhEHb6k-r!IOf2>#>6DTz@WguAjZXO#lq^r#Kb8g9L>Ox!@wXZAyv-6*v!B% zlYuFZPhc?v!$tT2m?($YHG*24gBNFd7E#@frv)yKy%B*Zs3I4(N6proX=s3fzhs;sH0ed5GPQ>XMzpEhCE ztf}+n&0Mr_+KS~1HmqN_W%JHWn>Ov+yKV2@o%{CgK79DtXd1$$}K{&3i1jHqC7H-6lD3-n@q%I4yU%i5$UwQckM%?cb%8shs7Y?tM2 zGGN+q;vlzlvog!73km`Zt-?GCC*&m=wc8jZ@9$S&S8B7@Ws=#r=_cFTCMB-x3gXP) nnmNTnN);v?y05^rP;7#Mg~!oGc0matqm8~wielfG7#XYqo~%HP diff --git a/source-linux/images/smileys/core/smiley-kiss.gif b/source-linux/images/smileys/core/smiley-kiss.gif deleted file mode 100644 index cc356611ee2444debe1dc761bb05621f33c02a98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299 zcmV+`0o49SNk%w1VG;lm0E8a^QauaC#>Vb6G=_5=^YB^9wrc376Sb5I-qJGf@9vZ# z5WlKU(!eVB+7tfnDXp0zyB`?BZ5IChalob*`uh6d*t+@dKGHcU+L|83yq*5~IoH?L zy`?Gp<{bX|S^xk4A^8LW0018VEC2ui01^Na000H3;3tk`X^zWt9M5u&#eoo#L?B0T zaueYp77M~dm~cu9hGbx2Hk%TLYjluk9-K!I`_M=Zs3B(n0BAJj0p~aEozZ3u`CSxM z-x^1!!S8#(A9r~T27HBnfISX|3M&eS9TpQJ3qTDK3J{tQ3K0!LQy&u^9UT!60ss;1-69HWK?p_PpF=Pd8M1ss2Xhz|<_5Q9Vr7Lk&X2pEkb2O3xe3;`Dx0Sp9jY9k9C0u2`o z6B7&<4GJC$BuJSR<4C>Dj%C>6W(lWoQPVevT^YB^Fy&h6M z4YZgH{O~qtR1(Ci8T;lQ`uh6d*t-7xar*K{#Jrulo-Wtd*44u?{`oh#n;gQXGXDEo z_}UVAU=FH^0{{R2A^8LW0018VEC2ui01^Na000HA;3tk`X^uwbd6{vJ#Bw2$gj@@8 zRt~aF48~-Ga8yc$gk*BL1e+5{!Zlhf84X1+E0ioyg$)LyP>jptO@W$0OvarCT#lI_ zG9v33!+1P60|Oj`8($xKeS?aFf)j>q3Vl9SMU89ReH-Ya$d5 z8-5)CumBx?8xAB%tq%?Y0uHoOB^n6`e0~fV2niY|1`Y*7KLrj{F9sS84jR-i+$13Y EJInTR;{X5v diff --git a/source-linux/images/smileys/core/smiley-surprised.gif b/source-linux/images/smileys/core/smiley-surprised.gif deleted file mode 100644 index b074653260bf0697263d6a6c381ddac84f5dd56e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmV+~0nq+ONk%w1VG;lm0E8a^C=3F|#>SnDDC*4*{OcpiwransPVevTQacIr@mkQp zCf(06s)_=>r7UYx48o@u`uh6d*t-7rH~ji<`P&oj;5Wp)o!8ga`SV6TA_BIW5#ZWV z{`*+_zdOZ@34*&ofjvW{eA_fbSgb0=hjuLJo4;+CV z8I}MY9RwVlC<>~Aqp=)SB@GG*5(*g^T?qIMFh-d%XcRRip<*>2Wo0UPLNYZJQAm@P0lumI9jv1f8BHczwRDxbo)cbSc*|4%%D%lT6Yr0x^U7U zY;>v4OX08*?klii9jpw&G9Y)ZL+C0v8^dQUyo^Z3W^A#5$41iL6x&S+&&}X&0^1b6 zCUCF@*NnolB)D7QW($rD4q1Xlhob{*nFz4KaclV5gYAfTOYj&7um{Hx{tV&(1ACaH zj}sZV9j+|W(Uau3a-)cxSjznfl$=0z9J1o5`6uz4 zkVrX$bP-BoQ5c8(1YAE0Q5v$7aP2%4HVD#MHWkcuIxLic^V5kp#o&MIQ^E;_2wU4^bHwYOCm7o)!hU3F+~z;G=_ zYbbpZD8-OJLq`+F9%HCpMNx-Q3Ens0T_ZYL$v;}r+(8bsK=}kSPto6osYXKCfRR>w zl47_WiWb$rS9m8QKD|U+7kb}d;w1*E{+Q^3%ln3I77m$(}D&*DbXQEXb7vw|UZ!aRr)1 zYDG!4qM6wR+o@XfTPiv?*X7N+r|x5zCD@gWB@($cp;6%~lBpk9_K}+3ik!5qGYp$( zbgrV4@^QCfyE;s76xf z_xSQ9?Zsrra?;y5eGOCgAXP*ETeRzz@?@7(8pU-YjnS=`q!26a4LQ>aWY%o`bDDb3 zmq~qj?W*KQ#SR@aI#-80qp;TAD%HEHW%pDTq_Kw7vvJb$7#KR3PO;^tSv>UTX$5a6 pyb+|PQQpnwsw__!N;Aro30-KbdriijT;x_Ny56}~<4l48SU@3-{U*rx+Q^wrc$ABfqLn@9*x?z8(4X zSW-O=@){bmmI~g|GQXoP);cW-1&~o+KM#GlLcpmC5WF z2Kc<9`R?y8~4}{%C>6#>?OadPVevTr-=vi@LATn z4rERY-qJF+n+?CCE&B3D{{3Shh?>WT0o%`b%*Voqm`dL;(4F35y zc485^n;g!+B>(^aA^8LW0018VEC2ui01^Na000H3;3tk`X^uvRAf0iN4U<4n!ZgI` zP)YVwl}9E)ag+=m$PdVTKs>HdLn)XDfK`FBfnsDfngwSA){HZZXeaU5a4KXseDg?j zL{qZIQz%?03Ii7x8C)NE8wCT4jEoP4Yl@8s6AKN34|g913>AZa698ri7ZqtD78DtN x4IC7o7X=vSn03F^-g-qAA3wransPV?|t@9*x%vmQ`7 z4E*pcw3rOOq%3t@4*K#({N^40{c-yG`rz2Q!KfI-yq*61HrBop*VoqW<}&{JS@_x# zwwfH#!YTdnI{*LwA^8LW0018VEC2ui01^Na000HG;3tk`X^sXb2%K?_1w$NBbP!B& zHq@a#9?wH_pfpN`Lb@f^pIwj7lJFSPa*sk;N!IaA} zj2T}Y8SM@W@Em?oAQc}S$-u_Oz?CBu$;rdZ!{x82#t<@z$<~IsAd;JhBg()y&Czq= zLh+@HOIEJ(vb5sV6c5$xSexPQV;G+j(qN#>!qzRjgVpe$wwA_pW*+vVNBv4W&Q_dl z=HO+@tJjNV*JQt;U)a~ye`9jk)ENyi(VETOk=-n&E*v?hoqnx1kMVhwqnY@T`NRPc IK?VkE0EPH+nE(I) diff --git a/source-linux/images/smileys/devilangel/blondedevil.gif b/source-linux/images/smileys/devilangel/blondedevil.gif deleted file mode 100644 index 09e7e682283c5cffdc04ccaa53820c233a67f340..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2957 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 diff --git a/source-linux/images/smileys/devilangel/catdevil.gif b/source-linux/images/smileys/devilangel/catdevil.gif deleted file mode 100644 index 269d719bfb1fbcc75cc772eb5462a79e33b41537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1965 zcmah|Yfx2H6h2Ougur}4jx`yQcol|3LqwvT$n&Bi5+e$@L(K#u5DX!WeaU>33aP2_ zauf1UxQU<$5w=7gCWM5UifB6#-`){}tJh3+>-eWXHm#XE``k6_`@Z#k`yBs3zv&*) zT1BfolnR#q=}-Uk(BnV7{y5g9|rrVIi*0Upj6@%Q(KHt&L}V{7?q6T(m2F8<(vYif>X&U z+CUfs%7Fq<0aOA-V@SjV<${8sLQp9vT19FmDVG!^6_QFx31KM4RHF=36HF3DD5I)4 z<0>%|Dv03}_OLi(z?fi6B91d$5nG%y;7o8PIl~ZfX&mCf0GI$Kfnls@17Tb+5KIUr z1;e1x7!q;GKr$hjl#CFLR*{;kF>|3t$O+|?s$yI<%7toz6LmpVo~u$wj5G+s5p1Xh zoD0q+G6BcPa7AnZZ~T64Bo~rP$q4}r8jT?lsFw_q z0HHvsY89zLjTs~b!hkZ>Jc@y86m6jiTp1Ts_44tzirYrkJUH)^Mf<(M(Ms< zF}Li&p+D;;g}wIkfuM#drt0mb3o4?6c3Z3*nip}z<8r~_^Dp*XEcL5Ov{-b$to5*O z%1Ro z1Rq6lT)uVls;jfMzT}yvIaRUGe}m(!VxR9v6r9>Kd1`PH@&qsqRHnO74YywP^d$g5H1mbVTXzu0rLv)=p4m~&s6?=5NGmf9VsH5Ylc zPV1VJyg8)r+IMpZgc*h_mvTy`=A=cAs0u%0*N}bgQpnW17b<<1H?^%D_oFzz{^}iL zaLxTcDl(n?_pb9u=>BD&la1xGG8p(b1B>RsoALJeB8+WbINf!L_a>VOu|Ata?3*%% zyDvH$?rN_n&(D0-$79|yUHXKDi~848=IhqGzMuHY=p@JX+~Midah_Su8HrP z9~J9v2+vPEkm2T;694P2gsSW?gXu=-XX&Qvw$`>KJ*_j2+4*ca*!R96ucI^6dgt}) z?K=Wr_A;J}={fSX)r@s*DXSLN&ae+Y`sriW?&`#tcGHuWQ=%&iZL@v0y_GsoNe&Th zaTOnlI~PhGN8TE9;BMx``ZwZ--m4sc>i*zXHaInDnO}cb*T_bHNc+@mWxP|J$p!}G zLzDY3{h$|C{E=?9(ELw?>bEpG1Cw*mIgdUW-Sov^`?n1#t`5Fi#*9zQ{i(viTTyH_ zz7?2I=+CsFOMC*iN6*f(a%*nX_Bzhp;BIkHb2}-z<8%M$zam>!m&`BG8Uu?Sjnbwd=b=2iz(+l}|QQ0f5oG4o9Zn%)2YHV`$9PMjjtcorX$0whgyIXnYy}xJvWxmn%(l-DDPX^2n$Lck9DU07xJpTcS C!Rgij diff --git a/source-linux/images/smileys/devilangel/cherub.gif b/source-linux/images/smileys/devilangel/cherub.gif deleted file mode 100644 index 40872e03c9da699a70c350661ddd1ef3f5e8995a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1614 zcmdUveM}Q)9LG;8!dfcWX$Q5eSL+)_3oS2eVW@pM+A^)s7PmDnu^fkO`f9I;uKY3J z3auPa<{77+4%8+Us8M6*+{PwR3zJFQCI|+JbIv&9%uF_?%;~P^rr96M{@s)BUA}ql z`&@qCe3D0{DUnD`AOHeQ03he5>-cGS{2sL6}4D;e46pm2xQnE(9aFlvuR-7QB zxRoHtD312wa1{6U;b;`cB7`?WU@_bp!@VR)_7NCKMq-3FMqqs;7K;lXCb3}>kA_0S zA$&A0VmLxfhKN`+G#VjCqr_yCjP=DvM<*wr#24^CS^OsqEo9IuWMz<8m_wU!iw5u? z&U`5mPyx&172=rKNx#1*m#Z*eQ?nm~0=&jRdov^sKvFF6 zy^@leGIK^!Q`dnYFPtsl377IS<|fbDuj&$a2C8t3KNiI<_A`}fCHDMhOk#RZGL2CIXa zOI8}xu0vpRqcV;4XYlLu4kpo+J=v?dk{FULd@}E09TDeX)Ml>b{ zxzg(OV;gq}hW8Cr-%OipP{p#1j*3(;P0vIY3vh+zvjYz)7QX?_3p=q9TQC3;Cdo-``O; zapI@Kv?(R!2z3z&tKt~2;Yb@}d9&9mk;=+BhRFW4Si(@h*!%`3Af-ww>x4RjS$RE~7Z zgXIT7>gdK*tYnPhZjx$zp zAJc1=e&3`0@$R0woqOmFECq}#8l2VT-$%=y+Q|9lyIvppF4jHeXEGVSqe4%O&EB$% z_3KS*$G67QU$mS|=;gAaH!h@>x7-bL;~*XjOEhaBP@{yj294ouCSBo1Odg~Pbh<&i zv&vF!p?u{wYF{VQtC@7_#O(^L4pM3K21o}fLA_e0gWjYbCY?!_p(tXnv{6TDEgmzd z(v*M-rvvr4YhaJX=>YYJr*JxFgUyJ28@SfusH%0ktthB*z(OWn?%WFI=j2cZK|D^! za&VoNNnewr0!1=vQz6sJlrk#Dq?+={!*MCt$-Tb^rhX diff --git a/source-linux/images/smileys/devilangel/daseesaw.gif b/source-linux/images/smileys/devilangel/daseesaw.gif deleted file mode 100644 index 1c04b2eebec193e674fcf1226711184768ced6db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6780 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 diff --git a/source-linux/images/smileys/devilangel/devil.gif b/source-linux/images/smileys/devilangel/devil.gif deleted file mode 100644 index 2b567972c85c47b5e344478f0154789180178b59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1996 zcmZ?wbhEHb6lM@-I3mIT1YTZV$qWq1$(GgC)jbRhYk_EO^)Uv9W5?#4JGb^41H-+0 z$G(4m|DS>3f0V%gDFXk`N&Np0L_h(;K=D7fpKD04vtxj(k)8oFBT$FpPZmxt1`!4w zkZzDO7+7~Hu=a#x&QsDfV|c}s!)dT;_N7gWt~_6{UCH&4ftD11=Ukowi5{LdCr1M* zfyR}BOpH^5x-||YceizcfI3C=4{s#wGzxLQzP-TEk3L4Eat4pnpyX9OT>2znqcb1pk?{SN1bpxNzul&WYAL3@jJV-0y3h)=D@3FbJy(*McKR zL|90vWFp8<{USo`lYoBe7n(T{=qHtaK|zq8<}DBqQ0~Z`!?1RmzzPBW$lNI9T^n}u z^Y2`(EVT2;QGUK78{HTg4xc`9?li-tONUFY-K}F`ID7W~q>@<^vHNE}e!!>$@ zMY_TH2UHyN^>e397Mj)vN@{Z;NlkZ&ATX`9<<4YS$si=KM1X(lde;hu9cy>;^KW0S zyiM@%5q`eI>wu~4(5b^`PcdA)c&Owmury#ebLL)u$#nYV9$4WvAf>?&&poX4t9xjk G+N=TpGuZI} diff --git a/source-linux/images/smileys/devilangel/graveside.gif b/source-linux/images/smileys/devilangel/graveside.gif deleted file mode 100644 index 0e909357c200156dbbee1fc8c38408b8276c06af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8226 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 TlWkV}pYBB5x-?+#Htzod^!<2X diff --git a/source-linux/images/smileys/disgust/fartinbed.gif b/source-linux/images/smileys/disgust/fartinbed.gif deleted file mode 100644 index 55536499fd61bf3345b89ed7471dd0141434b9c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23289 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 L}5 diff --git a/source-linux/images/smileys/drink/tea.gif b/source-linux/images/smileys/drink/tea.gif deleted file mode 100644 index 474b98942216945652618469cd8778ffcd2f5907..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9915 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 S8CoXBk~l}A!C+uH7WHqTngh!K diff --git a/source-linux/images/smileys/drool/drool.gif b/source-linux/images/smileys/drool/drool.gif deleted file mode 100644 index 4093df65d7762244edce5ae52cb98191193a8201..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1379 zcmZ?wbhEHblw^=(c*+0*|A7dI85%&$|Nk2r8V(#d0OSt|p!lEL&ow02*)hP?NY8+o z5$I^epDc|04E78O3Eys7v?p(k-SWM9`>*x2(e-7G6#)%}{_fS8S=sd+eboWIeXiZp zX3m;DXYRcD3l=U~ykwdq!cI;GRt9zk4xpW)4hQlz{xI^fD;J%}v6_G3g}y^78zZtx z7NA;Aph^*tN*O+Ww>G-$3+ zYDQMc$-o4J3~a0i8a{}#pvtg-W!N1Y6F4N;nvmsKfKFxyIr+e0{tv=J^(U49&F7lX z_~f(rUsfb1a|2z0FhxTK**iQ)a*YqfC4`XN#lgS~lm!Kf)Pea48Y+DK9*hYqQ~u4n zu%g6ks?g#_^#`bq1%)9SP`Qu;gM)*J7_0Llpo8Q(8yOTh5bovxD&d5<+u`7QbrGR< zkh?>;dd?g$azJr6#C~p|fhq^&f%Y@;9ZvpK;b1n=CtWyTiCX=QHD#yYma*Pu5M9GN zV*ax?HiJaF|L-T085X59L;Kt78d`I;)esMk^`(#{J{JV z0vsIeEe9Ve$XLuj$(U$mE5~^V$w?eQ8$n5sflUmU^B#-ang&r+#y&*{@mMRYX%y0V-gzD`~(B2p$C%nnM>~?kNs$PgODUhrz%pd`_ zUm28@b)@Rs7YBJ7C``ZbFwsCkXpy~B&<@qI^>Lct(l6)%L-}8INJeI{LSkNKZemGl zih{eRn?hP?OFI^!tCp8hG$Pug~zeq=+EVDSX1SqeN zSfY?oQc_^0uU}qXu2%|Ds+XLft5A{;G%_zmA-}XlAveD$RgW<=I5@!BH-y0&0QaCw AWB>pF diff --git a/source-linux/images/smileys/fantasy/alienmonster.gif b/source-linux/images/smileys/fantasy/alienmonster.gif deleted file mode 100644 index e0ca7f65f58d5e1f7b58d4421508beb2f7b8e672..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7636 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 diff --git a/source-linux/images/smileys/fantasy/barbarian.gif b/source-linux/images/smileys/fantasy/barbarian.gif deleted file mode 100644 index de8a06861843e6264a155ef030098e98ed616ed7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 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 diff --git a/source-linux/images/smileys/fantasy/dragonwhelp.gif b/source-linux/images/smileys/fantasy/dragonwhelp.gif deleted file mode 100644 index dbc4555969ed0283ab9a09512323757e23965c1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2338 zcmZ?wbhEHbRA5kG_|5`ckln6p8rc3{x9wMf34^L ze}@16*Zv;`qaiT7LO}69x1VcBu(M-;tC5}oGb1oVDE^an&rEa7%gj|ss#NgHPb$sG zEXr5#NGvJIFUn+4{K>*8!obL&1Ijy~T;#yLnB^(Nk=jX66 zS_BvrX`Gp)rupy5&JP+VW^pC9)4tB-*~j^1-8HTS zj$zvi+NGanhm@V!9yOcG&0BD7!n!R7|81*c(D}-!zBbU#wr)nj;l;7*)XXwSxzcV>?v~P#kQuN|P|<;9!S%!wyBMS*db&kbFRf4!R^KMM&A@Ap zA-B)js-oAfto(6WJu5$Cxlf4F<^J-kNG)>a3g`PQE4P{WY+wjG%{TMg*4&-~!L}{A zRpl}5*(Z&7t7dBz%oP?lIk5VJQUklC@uiq^zcbD(_Smd_{%+aF=p!o0ne3+8Cdpx& z11ATit@-dLd6n7RS?&v_Xy2XOztfDxvY{yT1hZy?l=Du;ga%KIzv=R6dM{a~IWY?e zM7zyr?3kIh;ce-SoT#&AQJE`xpN2$b+Ag^g$#CVGLUhv7@@qL;&xXomX|8e&aA07t F1^^ic1U3Kw diff --git a/source-linux/images/smileys/fantasy/ghost.gif b/source-linux/images/smileys/fantasy/ghost.gif deleted file mode 100644 index 4c5d85d895a78df089c80dadccfa4ad3b45fddd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1050 zcmZ?wbhEHbRA5kGSj5h7^ytx>H*Y?B_H5g>ZRgIN`}FA(0|UeV|Nj;LbNji51Uowh zxEkphFf#&06@RjDiZHM<=m6P3%?b<*%&#kU-T7y5%5$};#qG>40T#oA+m}UGu=lAJ zFH_Xo@RnQHC~=FsxcH)j3fphbX*n#Y#;O(OCwax_>BZQf;8(sAF3#9;OMp*9Z?cqG zh)1X7pFG8M{WI^9I2hGD-fZc7lb4)eV8Yhq5Ev!j-NWc;-4fu1}x8 zegE`iaEryqm-sX3hlNZXw z$EA4sr16y*dgrCo&9gN9Z^$_o91PiX^SrONShrMA?j@rSH|@?gi(FYN%;eo)8MwIo zc5;HA5nH2eK%{I}H=}}9YlLN{cPayen}hTOwSrFB%HHWStY$Z9Fs_(inKZKq6x*HZ zz49wp*|)6UxM|LY`Et_^rLHw$p1%G7L;0y`GZyoRJ9Hms*b|&|&aIG(mCYe~QSL^A z4XFhxx9>mbUR4#MqIA#g`I@83pU=;HZDjl>*5urq3CaZv4mNWLJ9&U3oE0s>LnEB* z0B8(@1c0_QasceMY-C`(u;$|K+~i1EV0;^~HQ5Fz;fz7k diff --git a/source-linux/images/smileys/fantasy/mummy.gif b/source-linux/images/smileys/fantasy/mummy.gif deleted file mode 100644 index 50e1dfb9f9d6611c13c5b237d2473a0e581e6778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6552 zcmbW5c{tSl-p3g;6NQj8Gq%|*GfZX}V`*d=rooW0jQjBUu8eH%NIWG6dCh@yzf zPC}H5_9D?;=T6(LQ}^lVKIi%4KG*ehU*|dBe}CWW_s8q{T;KQW{W)SyH8f(YiQq&o z?h^TNWMo7v2r_<-gwiOBdsBknetY%(`}aRS{9gz0eUH7BvlGSK!AkcaUQG1I9mE%) z1XyI3i1r`%|M;y4@cX+N>kui!mHDrumNZ}QL68+}cO&;&`pLHOo-5%8Ze?AS9(WYw z>a?0>VQ*$xDGSaD#2c-)11DATSfD)o;#qhaojZ}f4Siel+QAfVZsOP4_*xFj5|f?+ zfip}%K>%%DIMhEi2ts9K6LkG-QiLVJwz{Ysf*pv-xAm`VD}dHDXg6t8R_B*CcJf_R z`{m)av9ODp4L-S3)tr zaZ34xr!>P)Q|bl@4m`&gGj9Xg__<0Wzv&gJl;!Bk>c+?4nK`RdG$-zmUNCp10q>|Z z8~>b2ReQZCOTYH}_RAXv_?bR*>ity#RNSKHY(CZ)>UR zIR(XO*p-}LFk85zD|$!8GY}g%OQ{pOA8pzn35d1kDNtE-3nNdRU?Z@ffPKu-!ZuhG zU04BjNIi+Qh<8kjS4pqb1{m5MjjAZBuu}F*?Jy#npTBYeNHkP8@5~Ab5nR0H9qbBI z^%>5;UQ|^-cM)eal5R7mIb91#97Tr^rVn4w^N7P}sW@>Pl{+56D-%#^Q6Bxv$hV)- z8^gJ`b;L%<*!7_1X?u{QM5Ul5G81Qa=T^s z?Nv`)kGIC4^-OQRbMI~Mo!n3Nhs2_0%=b?barORk*zrK?Af=n>1-oUP9Al{qG}wW? zA=oq8dXKSj3!CGPWTOVFTqNLU!~KKxFY}2~zR!x}Xth9Er1|qE$`x+<^CtvE?uWpq zS&w{2ez9W>n5UbeVJ8Il7xn!Wig3$CP-hcc@I!vb9>eSDUYljJUPl_uR=+)vDAjdM z!mQvVOk)8Ww&4o2)Ht!^Tso%EBl`$KgTgJ06b2niBgN-fA}9qx*kj3uzzk4f4u;!W z5bRb{doVMu1a5gT_yB^_IaIQ%b!tMrE;BL^g7nUTvu(Yq=JoUgl1|X?qi@GV4qcc~ zyxjpvg6Ef;=$k%l{ADph-%KMouIwcdRH}Ib*#GtOY`p{&-tw+_Y0Od_pE^8hy&dcb z)8b7q&dLU|cd_d1ZIZu~EzAl}=14X?Sl{-T@%%_dO3BW`QbUzYd4r&@&!~d|b?YJvme;g!`@5o7#_rid?U945!KV7E z7}SBmWzIHd0edl@wGWHUJ)#rMx=U2M_27i-{&Q4vOfUub)9E!qj0;{bm1I z2%oD6(KMD9;4i&Y-21_}$Iu?Ge@aUHdIR1vcfYW&<@WmwS=~vEAl4EvWjyfho^_iU zX6f4@-J^i}I-&4^-NIwF70y{EdqhbNenu25DwaV^chK~=VAIItLa1wcoC~N*)fZM8 zUFjWX3bw0pl#gJhLqkvofu(0+LR9@x-Gd&1;SsJeKJBWIfR1uk*6d9u z9Y5lYQ_Bh0R?f{1dM>sBp1^1e3E&h=jA;n$g}0Sogx%(gv^2Nl5oFR%Y3G9+H6hCI zc}G|NxCW&#?FBx1kOOK`blC*B5ASTy&K*}W(|Fyp|AH+Br`G;0x1<}Ln}8YGT!BPw zTq-@uzkGDz)~ctVK-ti3(}ipFh84e}+mcoK>WfpxFOorHyd(mI+_L0l?uazvIsDXk;_UF*X8Z9HSiCI z?bnQ{LlV48h7vaCpSB08v$Y}t`UFlY0~8l=l!-LqLUUvBw8C@^eG>~YltFM9Rnx3U zH5gh_ZU-Y|Hy8%dEqYN6`{21|RFeq5jz(w$r8`$|+{I0&7ZwB-nC2m_sVJfcOED-; ztc_5ul%ZuhZYFqkufW>O3tny1&V1Fudo^V4Y%#J5ULC(A zehO{4o%}xQy;`=x2U6t6tzZ0R>qrl~+GUqvPKsW|nniJzR+k;mEVlfeB^Gd3;e&tQ z+7~Nt?4JLSwu@9<`)kEf02n!*I((qBOyow$FJPVzo~nn}p4W2Suf)6*s25)R z(#5t%7ntrHLqn&8WMBkGlFXwlV~jwsB6n{(9wvbD^Fe@yl44b8#refs_BE=52jatb3&6MNe#T#nAiv=e+hcwPG#Hz{tr(HwVXq z&^=lYmd4sE%d%d2=*l?LWW@?{qMb{>u7Ly4hxhgtGgr|s6lrU6e7zZswf#9N_rvlj zRu%LZtEL^w2b;W`_($vb5dncHp$i=wSl*8F9F>`U2i{5 zId8P>bWy)&Bt7mp{qz1u7*}8Cu-k+{&sd%Rm*on50ZI_T_`4X7Dj&56{?_1!kxE*+$Cowuljksf0b%gE782GM_A-L zu-krdy}4c{E2g^Vie>Rr5xEinZ%&onRoOmY*&M;Zjz#vNv{9Nxp3{nZx}+y>4|Gk9IuqHB#OPRZgIQb-_o|H_dwUZ(7e z!J!@`cbgJ{C->6K3B_OSCw`aNWBc=L{9)11e_C`VJer*V1g%z|?EnE8kH#AI)+a3) zc%Ga3@cZuU`$a_f$HG%-qh@LSHuk)%mrDD4yl&ljCA$*M-P_BP-*w#QOc-mXh*HCIWeGc<2WSWmV3fQUzwY)cj}avemzme*j}T+zB!m* zYG+wq(Gno4QL3*W(`SmR(-<5W7;#<4qh5pHiPu(B|;Y-Qip; z2;UfZ{-Wph!p7hhgH%O;z8X_8EuuW~7}xsr_ZggxdGj(UHY{VNJ;Px!PhpuxoN&qj zpFrdL=xd_Qx7zabd}zcq2avZS@?Cd8x&@tM;Qmd)yv0BYWk>#+w6r4cG|^q>xFPZP z8^SD!isR*n}Vd+>M3=}f?)udl@s?l@B!g7x9o&p*>G-JOEhA%!F1scE)^7%CAS zN)7cos;ZF%Qw>cz?pYvuNWB8$6nESfZj5V;$nng_X!hdB*}=h75`oh|0QD&eF2e`P z+B-0v0~78sy_QV};NI?XU7FWNP8;{=6&i3C(UuSO?&5UtE0xi=XZD$GUVMI+O!f|c zqS^7ZkXU7qW+AHaQn|B>D<;P7Jz+^$>tL6sSq+vy;8f zcV}RlU=y|ct(tL9=*d_DM5@yzXLC#~tk*H@L2DO_y_@;he*Nb`{{dZ)*8%&g@UmgA zYVs=nPJ!j-7py2{5v15xctq&9k#E$vcz6IDb z22~Bg#yH*coFZFtf2hX!prGta;lA|NGVP*Sl;)so?Y_qOIg?4wb;UttvdV2xlHHQl zu-C(<&vD(*4YKDG`OeT6H#|K}=^ljDGOdgao#AK93ajc4VzIb_Gpd=QnpMaw!aL*Z zgo%S#8`QCznaV|4ZnW)-+r1q9pkmmSF95YXg8yNQvXK|ynTJMjh0jRaHefWSPnfFwg&r)y7;fB zd;Ig@_Q2m61eK8S) zDk!RSASQDdUILw?CN)}kH2ah>45ru86%fW~D+4j{@D@Y;{6S^-aD064wQ)_a`D0Nx z0!sHU-M$4$jn}w60@YqVd-3M7;p1T3K4zTLo#j`*suBpCHMgLN_Tcl8%V?|Y(>v)1 zgxE8c^eCqP%10>#SoTSR*FJHIB`!$%l>na3_CBP=bb@mrAA3(u%Gs|Nz47Bpmu7$4 z?0X~LuA&WZlWbo{=~SrH=+NeBQQhm(W}C*h^=t~g7ieEAcjT_H8?h%Gw+hGD{nL}w z_acwaPW4HwwkZ9lit_WwwEN%4TyOqYWVTEH5t&V*OC#xzARQP8bF*P5he4s~xZF^{m%m`fAd*wVdKIXtvaK2TZ2JO=#Go zO;2DN_i;QzCle zMq_!kGi>QjJwc}Ku)ZDdWj!X}FWS05qW!sH=zom&zcE0U9?K}w4+A`(Ajg#U?=Lev zQ{^W_=xW1`g3wVgAPouz@ZIV7JQxU?k8nqxRL=7*kNX} z80RcgfLRQy9CblHbj0KQkT%0vDewmKX5Ew#a=TVnwnA+Eo zxHBw2o~vnD7%OkQ^=@>WF+ZujVR3KUu>)OMW&-D;{dCr=m3Dhwlg|vPwj)#}?S3RT zKR1fI+_Xtd$E{c<*?;xS{dr^ja}ED58VrXxJc`BpR%uMp`(pP6KdBrWPEJ&a42J^= zq{u%Cj2+Kbke!RoSBHf_4Si{VRIL)%a+5q>N)9$FIKaoL7UqC;YmE(Vtn-a^0Oyz< zgX*1gC1pj@a<9aMA^cTGhMU|>ZS%0_&PIf?+=h_lh7HU15cbfECR-QyD;yP(Q^8fl z$t^Hn9=AuDo&FS&;BJui_x9t9V&c=(!dT$i>Htuuu|M;>((btm8KtrOhzP5R%}$xA z1&tX>zZVr7B)DwGwCRXG!@p}rhUWe*8+k`rfzv%TyllSErkpdn0<79< ztsX+*i&WK5Kwmd*x&>A0jaB603tqI2dEkCp#&qMe2l}X$-q1n zD6y36mk2+aoD6U(z>v+wgu>#Ylm4oK)g*6_ppivO;kNZg!H$-~g`7lHE%SEhQE*O? zn;xRcZb(>1$hhtsj3DRRK>{nzu_|j*K|G&Z)1<|NS{qqerA5ezYKSi{8NG@4W=TA_IofD@6@p8! zZFiQs)%{6nXWswkYW#1E{~v3k;{p9?rH5og@=4qIZ?5LE#YSD;-FZgrW9)#8lCA&1f@c49)Zy*EmX8oKqt2&8$dhfM$S5v^qJiX+luuIiYJL+%Leb zD=!w(>dF$9bqse84aZaT2lRsk!}XLTHs1tsN&PBVf0}bFGS@sS3G;+WpNmU@**$zc z`i!6AMsKuB?TMoZU%xE97suz53@@b5K2;73aFiTAlAWK9D1^ynRN8QM(ZRTG-3aT- zDf*x<(Xn?a|M|50BRWYiGs93mVZ&^bqr57yO1#SyS!;BpLCe=&3GJEEx32irm#+>h zH0L#G)-A)gtOI78jNA@OwzBRzwCp|BHYRUzM>RLdPlx}dy{VGsYh>m6De{M=9r_>Y C=!}s7 diff --git a/source-linux/images/smileys/fight/2guns.gif b/source-linux/images/smileys/fight/2guns.gif deleted file mode 100644 index 9e1b66383cb4e272c5979086bd72dbdadf4c70c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 810 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

    XyPEw8D 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 diff --git a/source-linux/images/smileys/fight/alpha.png b/source-linux/images/smileys/fight/alpha.png deleted file mode 100644 index 09e3f233c7fe958afb4032dcd064794d54f8284e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 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 VhFXxGhj6|{X?Jp;SOO=5H2`V8K#%|c diff --git a/source-linux/images/smileys/fight/bfg.gif b/source-linux/images/smileys/fight/bfg.gif deleted file mode 100644 index c2ba9d067b0a7ae81e3ea9e6e8a198a5d7ae7457..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2267 zcmZ?wbhEHb>}3#V_|Cxq0{|EUY3791J=jkAt!a1IIrGK@J&@4GRu7GYM(M%=ob2aJzuA z*Bpy*fQ>%2t07KU%|OcMswmq&wiEQRWUC=Jn`&c;y5vivnDwY)@@jb#=AfT(;g*rCLF25)Maw{Waya?|NIt z6`|VObg!*6PQ7NbTj;IZR`yTNQeSV&586@q{E}~GIRnGqDt>u}2irfo9WY_vyk)h- z$9so+WPi8ngcrrmlG2X$TT@wl=fJ$sMWVJ*h0pr9y|q<$o0j@rSfji98Rw7eh_zdD z{ikJDZ25TI&i^;ty?`CXbC34EHe0!8&F9y`qR;H&Hkf~Vuee<^o-N^m^^eb@M|bP3 zm)ZNf^O3l6&i{S?ocDBG-DZ-xfB)gFzkaGOaAafz1s*5cKnLEIhRAi=d%v+9n6~!D z_K4-@rf42m6T3z8YFW`dAUSJdef7e)5R}^d6}(v zerJ7o_q)Hd)gP`;+?wZ_cRAzO)4l(#=6i2l{AJdaiO#Q|%)Pta^PSq^)$3OXRF^TZ z&R;)Y{!(qqHnyji@5f*K_hkRig~#tV2>&#fbYc=(@xZy}C!4&}OI?kJj=2xbAGWfw zvVen?6-Tf(A=0F*SO+jo9_^M8g8p2Q>Sh5Ovt#nI%0F4%c%)VF0T(< zI%!E%=<1uBGqxA`W(mBxzO3MAn@YCn+Pk|mUK*9W4twXZD}s?jtY`a&$W0dcTm_j6 z4Dau&(`HiB`q7Yjx`j7et;^!$qhkxWE$Vp8HXS}G!x*z~%`b+Avm4k;&T;PAmV1oN zaGug&u`VtD=eGur}*;v{g~8N z^#>K)7q5q=_*h=Q-6U=(@}R=;V*5e|{g2-h-K2M^NjT0`d=VQV-p6sN?a9Iy3%gB@ zg(xxHuXJ17VVV?jGfQ2mB&gqIl}W?|S2f8X2S`bQD^`drDKy1AP6|CaIaz>JV1}n~ zs&~6~{;M?_#>&U%OT}}=?%2E{u*bNTDfZNsmkkSf`n^;&jaOa<#tK`jSIMgI#!ya; zt6tl5u5D1`efCF7NH>6?;Nh&ft4(#zF3Bn1b(iCNL;U`tmt1jK-`Aa;%_^jBwyT_> zVSha^u^a68bnK8R=ep3{VH=;HU*McC$8qan+{p=y_RDfA4bt{l+Z(T2DOmdI#M;>V zrgOrVN8jGAy7}D>1M}c5f!uxX&Q3P_aOF_Fm|XOof#UjkG7KgAah hTx%WKre|i_W+b{6`c^z_69J|8e+Hn!m=w%l4FC{*rSAX$ diff --git a/source-linux/images/smileys/fight/bowman.gif b/source-linux/images/smileys/fight/bowman.gif deleted file mode 100644 index 2f1f8f055456e5448bc6184b263cb96f434728db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1337 zcmZ?wbhEHb3}6svSi}GVno%5va~QG>IkK}ET3TApojV5=@u`q-Vg) z2on0q!YK))b%2-wq@98JFvqSt{|ruf9$abhdhfZX2`5z6V|`PSOV| zmYs7lxV%|9CD_CC4GpUi9eD-B= z)loCvE%`?k`|cfot&~?OR$G@@+aQ_B6~Nn_uG`+xDZ;M zc`unBzakvTr~8nH6XGu;RDT^L*|J)Na`%vDFJ2KO6yH-?+)zqff)Jx|#a_6V&wzYRiu(C2wn?8fNuVuo-Ng`b= ze948i#S`@Ai*_e9&z-w+mGHF1>rDGsY?6%RU9yzz09)(!T@pDxvg_M69^Jf%A;0R> znX~7jcn-H*Rk(gbR~P0hZ&Y9HB;8k09RW&{ULN7)Xl7D46&f0Uz0v8mCC5427vD>A zC!9^^xAKiGzLm!<#n*q^xq`3Aw6<8UUXqnLiC?#+wXUPHt9$CSv>Kq7M7vl7W)#jc zog>-EySRAvQsM3e)qShl*9b-Q&S2Zg)~dQibU8y*&93Gp`y>*%^H;SUmrhLKnzi?w zhVFHkZ@5r>bA)8y0Mi~T&a|g}YVH@yy-Bm#Zf%e3vs;o~rj%DzXj)fa+ZZjwQrRMw zuG`U2#>!eTV`d+3b2nFAdvS+eVu54@Pr-uP_QhR2vsX>tykx!T+)ZmH)o~1j~Snu2J_e>1^3TS zAs(yGtm7(Zlwhf>0w%u(pueWi=Em^@AQ?p=l!&1q<6|IZf)~*ws z+qFq|BG6+yR;~hiY_jUU?X#AEJa%GzfA^XWy$jnnbZ;uUc3r~%me}s&T##(VdIB}d z_E6VnIExEKmWoPU)1r30PN^m?U`a7y;$-P^-sz^T?e%jcyXRLeE^M2$RCsFi%2wSr x({++lr_W&9!?sm*yXd^;nS1viT-KAiY1Ot9JC>h5v--S@|D~!e2S6UO1^{z9Im!S4 diff --git a/source-linux/images/smileys/fight/chainsaw.gif b/source-linux/images/smileys/fight/chainsaw.gif deleted file mode 100644 index 71f757c3abcf08cae02f3bf5be09b9c7156e97a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20364 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 oK zx-a|G8Oah?>7^n4C*8CG#WHG-mmUOMDg}@!MEe9h3SP9|vn><0PFD?idJD)=4l=qSMen4U`BEh#na0gqQ| zpdX{U1PrCjdZi-ello=t$gusKZrj>Mxu+ihI-(jKvql0|CmyYphW$|L6d?8Z$F#*F z1Nu4xT{kiTw-hyak&i0(yC4-s&6f`Wf#rSy*o-z!#z!i@6LqP71q_H&DeU+ z+(8i|hoi+^8!?*+fD{A5!|%bzC2XFP(8m9$vaZccirb#Wds65ATbR8 zEM05_huo1X;W+(;FVauwW7raNKi3g-ICbUB9^DL(YlH6@2NcVIi4-)+>&->lOJejx zO1ebbHlnaM^Y^$LbxTZaM00BnYRomV3Qwz#}JghwZ(DQ3E8FOj9Th;w9CH@o5yz>pdYG}75D>cVGH`~+B=6vzi z?Mf4IaeOUWvrtU(OKsAV=1!bS$L2)L(HhOdtH$PBxMYHsG2WH4nidw*=0nj-Gt^UXvT}+RR{&a{ zXs|nm-7*#89mpP5fwqrYi;}}f$8#lV6=n00zIFX>RENvs3yj-%lTta~`^_Z<`hxX@ zJ4$VsF>C+9W2Lx5Zn5t&U&I!)I>i{;XIv;RITyEFaLa-?QO_(q%eD;nNHE^*&LdeZ>mngz%%c=Necrc?Q0d`ES+zB>Wx})sTQfoP z69?&1#{F~EQuSLF%TCRLDK#;#_Cjj(H!j=Vy+3V&=}TaZ+P>G8mdzf84LhVzx&r#^ zI$@F6fO4}G!8leJ($k{0OVV#vRBrE~mxVeJX5*`m5SLaz_Nkc%1$5!&bAIdG(AxQf zr6=a|dD!TGnDA}>Z=MSEFSz`!h3{JUu7&UV@LeCi>%(_h$}UU!pRtr5Sq8?Y`k=9% z{y7U{3mZO!ZUBiGL~;fF0ze->R}VK2cG@|V4`Jd*_67Ake0@E9-T4qkem*2V#DCLv z4h6NnUC1P#Q1GmWuj?hh0I$IPdM9Q2c9?5HrKaeZ$BTc z9T-URarR~x?~+Fl8T?m|()x$qujK-beO*-f5ITM#;1MjAogk5d{Ct(c-_P+OOtFTb znl>BM)jp@Kr_EOTUzYIaWec)LAjmGQ56L%(T@-I`(AO^rBvL3OVgTsj3%YrDlh_LX z^|k(^tVA$? z1JHk-voHNagX33#^H+fDR{-`a!2K%#{}tf*6+rw7@cs(y`4!;%72y9B5cm~9{tBRe S1q6Qugnk8t|2qIU{$Bthb+YLI diff --git a/source-linux/images/smileys/fight/crossbow.gif b/source-linux/images/smileys/fight/crossbow.gif deleted file mode 100644 index 20874f3c773d98da667993fb8a41fa141ccb05d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 891 zcmZ?wbhEHb)MZd(*v!WO0?7;vEes5E7?KScl9L(c7&06?cI$MU}whwS0g%)p}O1KrTJZ}*l%XNCb!(5) z_xVm!GD;6DD;AleY&I(@$igN&Q`TNBdSZf%!(y{_Gvw!UsqIiT-Rk7DLt)o$x$u~J zg98kQN;l+g6W??}E7y3rD%Z&yy0f$@bl4uS*_^t0lHuWTow>IkzTKqu_R)rW^FMz4 z@GXCSy7l+>&p&0E6qhepaIpC0iVUNQ2W+wttY2;K7;ap2w3|-}5*Tu*f$g;Ss>IP&zsEm&TLk0RuIZhWcWqm@)5U{3&0O!Daj;+#>YV(F&xL4Ke2B^uiR0YeY}@Wtv<77Qrn^ZDl4zg?bvj<{jA482$qRkOI-ijvZ@hX=!Kx@<3c5i3}8fvM@3*a53nB z1VLsvu>21=X(_yS#7e|8wiZgd_)UY6kE902JESDsP;V4*6v?_`i#`(3(GD`ELeOgF7R z=H=SD%z^5(o_X zd2O!4m${ODD|$RcXPysTIpuk2!=Ee-w@sQY?Fp4$FLiW}ylT7ivt{x#mzA7Cf#>IP z&-yvF$}%r>s%V#rYfJH*M}6_;W;fC*YdzJM|NYr^AkA>bEXCu;!!IAbbmi0WWhw1$ S&kWqfO*T$VHx6Q8um%A0*GR$u diff --git a/source-linux/images/smileys/fight/gangs.gif b/source-linux/images/smileys/fight/gangs.gif deleted file mode 100644 index 2c655b1fb656384ab28a8012dbdc65e9c59aa396..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1746 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 diff --git a/source-linux/images/smileys/fight/marine.gif b/source-linux/images/smileys/fight/marine.gif deleted file mode 100644 index 88fd2e09d301fa72e0a5edcc6bc391d79fe2ebbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5829 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 diff --git a/source-linux/images/smileys/fight/sabre.gif b/source-linux/images/smileys/fight/sabre.gif deleted file mode 100644 index e62396829fdd34850816c70f27cb2c54c8acc2b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 zcmZ?wbhEHbOlPoTSi}GUEkH2Gkm1;|WB>m%{0CwN2F3r}ey$16uR!N~N$z6zb@#XX zaaiB;QCDDT-85%Gh0CES$L17QB*-n>qIIxiY1HnMO5!q?y-w=C5S=Tw{^rWTNA=*dwuT|B+pXME9LKvik(@jQtl|`_2hl9=&|? z>{YJ0*Kh8>BiO>&%6RPIBmO7PUR-%~{=ui0AGTa>_;mZ~b#}IYY-e7r{ry#cfdl*c zeHX2NoRQFL<7jrAZGT~DyJ}V99f9*{5TpxRVy0l;K>Gj69vRT)k&HeuS%hdCprJrJ_+`s&| ztWLf(x~Za}s!h73v8%hGw@uU-m!vlCF9YHaaXP` ze*Ad4(;EI;ckb;;vSa#ibwc5juV0UUKlW=&r02)~3=hxFex7{5IEszes(Y%-{4GM? zPO#3=Sn$9piIZQ>;DGT(hTZMPN^VQGp1QZHPu`xlnr&gk;fVPyb9PVblifJONWJ&a X$<52p&v$6%lJ(lMBG8+Yfx#L81wcEu diff --git a/source-linux/images/smileys/fight/samurai.gif b/source-linux/images/smileys/fight/samurai.gif deleted file mode 100644 index 8b24385b45ea26d68d1f6c4e9cb92accbb1106e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3286 zcmd6pXHe5y8pi)5p#)G$C>BJ55Q88BA_Oc1DWYHi14tD^6{L%y2pSMVOF}P!P$YnX z1c;y!q=f*|q#Hp%ih%73DtfV8udI4!XLjz+?46z2ow;YuoG6jsVcO;@_DVr*lkqp1ZJ_+Ey8 zhCs~$D4_A<>W^mu$TzM2lgu{MFGDSx=aCdIzmf|zbpgM$hiHt1i_S*W(myW#)?6$J z`LsQ*Yq=`&$Oqa0L-6Aj<;p1!f(;~qdY087#v%5YgiMH_(4IkDTdH?+bMm){vWNbIB}2unyE zl&|)zaPWS0Y6aCTMmNWNJ@T~10<>uCsAk^~UG-F`Gdsv*!1*%|A#bV;7yW(e()qg@ z`r;PO{uVE7cN#qh95=%EHQv-?uW^m-!3Tm7EWDr#c-!N~3llYNgPhu#yCF*h#g=#L z+_p;n0bcZP0bcJr_mUsnRda8omB6m$RaO-yme<5K*1>OP<`RkWH!C=%Er3vW&;5?5 zR_=CQK6)rC7V6N!4GD1@iJT$#O$1B?CRL6;j&Yk^A=>v#w**a2da<5Bgf>2X1R$>V zuEejPeK5La5o~W>nCxq*{oB!TV;P8K?G)YQX|qTMok%_WY;?K;PA)>4yc^*zVsUJ@=RDjkCZc<_U z_<9S`&z6%1P4|g3l-Q}*GOH2(4+G_YgI|i*L>zLuFkWK@CM1sK1v=5f)K)b_D|Jt5 z8?WacaIy^UTL&vgtntqqsoBhM&Jrfe?0dKdB#h=0b9`goMc!j|D+S!F;_qGd_0LJ$ zjl@2~qrP{g`*Z{Y10T)NF)TG+$WpUAR5wTrr9=DJ+OFCdJPoAAY-I)Vc${iN7 ze(PR>C-;>iTQeGmO)*hZYHq~Uy_(v~w1UI-Vv6JbR@8mu0@9Ys`a|e7JoSOcF-Q(iQGkOz3=Frd1ci=e@!v|G3iA#Lx06QiM~G{q*8uk zEqP&w`lk4Ab9~$x41Hta&EB)%s69!Y7?<9ewW`h2rI)^f2?fR@gRj?$+g?`p$T=9r z#8yS|)@``*=<6Nyb#L9{6^hZHrL-Ztm9(?4)`Is&hoI+dY>jQV$i3^`VpV1f*DzwN z3ncEO*h&P+5Vk!{K~^!IrfP6rJWbQOk6a?{G5xEd@;^6GzduY=`-g{;DP&Y~iVr3| zFCzVjL+jnF#{+^$+mGgJ6} zZ#xyjchgngQQ zy+GZAG1+{2@u8)9WZI$;Lif;cYxDc(qjbwsOxwL*f0?p0`~S#nrPLJO`G`Gbdg1Qg zW$`9I2+Pb{A8t$h2n&)9y%dhYM<`v3NllIS0tH{Nvj-<7@4OOoHJw&07w9HqrJtLx zK#eV~sY#>Zd~;F8RWb|~vx!ytFTy9tV}Bt^Kw!A5)!7ja6i)A0^j-45uoFqtI9z@L@ysHODA~>JwR|YFx zX8|+ylBJP1=K?ep1ci?`F-}jo!KvZWfUuMYVV8>@iC-VwjX#>9BR1UZdwdvhb zU$(mYzsUTBBJxvX!M{f=`!Dh^7xg_43;i<>hlF<4j(Cr6bK?hkjgglkn->D6U(U{X zT^w2I>-!mp=jPwFLWI74`yCJospj=$aIbHG?%eV@y}RD?!|g?s<69fKB<_G;jNn#R zCIuHOt{jd(kkwBvvLH(O*)EaG9YI8Z?S9;4gwDU1A?FY!vFvP diff --git a/source-linux/images/smileys/fight/tank.gif b/source-linux/images/smileys/fight/tank.gif deleted file mode 100644 index f1d969dda319a5096bd9b2c0609b38d881db2874..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11457 zcmeI2c~DdLzxU5MNg$AbCxj&+OF~!@2qb~1fT$q^fe1CGXc4J~L<%<6B5}b+B^!It zP!X|E4InKlXh5;FqK4G~ih)|C7A=blwdfCUqe|18_IK~h{pZdzbLV;fcxF6#&-=X3 zH{Ub)Cnxis*C(;@tHZ+6)&oJnn-{>}2O0q2zYUGH2#tmHI^2o{G)mK743M1n~q0*OkZ63|ovOeGMgB$!IFIEhLn zP^ly)0nH>?L|~FgOe)Nz5}1}nDwWA3g;NRPR8qJlFsb3;R1Ou*VG=k@5+|I%3AZ?v z6VBvts5~ajV-k4bRGuYsn1XPUfMXF;z_Tb^z~iKFs3|;V3NJh*MIh!7#2k{CM-cNY zP8IW*VqUmdz!ax?)pk17!`C4z8CibWhria;XfNyGw)L?9KAqynZ?5H3w&N>eP( zk*4sZ;&7>$BNbbMKq}!$E!(6ivJ|Q;C0v%mk%^fyakxxu2|SrtAd_%p5}r(A2`MtE zKxWw~lc~i_wK!ZY=BULywOFi{aMTi>S|U(OQq)qOS}IUWEkUf7i8W%5M$FSlI2s90 zBjsqM78huwDH^F*Bjagg0*x$1W7#H?luJ0}Qj2)yQbD;irCi1mNUNp1YH3Qfj8`oaRLd+uTrHDSs|D5SlxnrOS}m#8h^sXgmsOX` z>SeronV?>lQm+=&t1T|BS4-+ODfJq0y~Yxx_2m}H>dQ6t)w23(b(1WmNiAqnTU^|v zmNaQnnl$1jjU~vM$|X(Z(x!4*Q?*6vR*kq-BWW$SNZML0X|1-ntktq!uf9?)xl(PB z^h&ktO1<<-y~Wj6>NQtdt9z?uz4hwedQESWy0=L)ST7l@mklDispa#ankPW z>}}$-9Ym^~?cTk6gVV%W(%`M>0O=2;jV%1469};e}7uUtr@wSg>>yCZ}>3H`e1f!huKn`uRa$Vrv3((@? z0V`oA(k5xBKL{;+cJET;C@*vD&h%*0Zr2Ztfl>cbTOIuC;Hmx`(&6@fzj_}0rLE;r zzrZEph?4}?x<&=`S@}lqf(ws59IsEsYvmZ64U#V!`)BE6fYkEgx z>($5chkT>=4kw*f`q_C0rSiv7o?ncm6-jYHNQ}>ku{m419trUxJ2YS)u`z6NF#K2U zk0{(JU^0QxviO9;KHtwH;K#P~8n(%2Z1zI-gKuFKcjG-E@T z6}w_9TL`!=jCVP~j`d`|?1N>=)z+nz=B6M#Ca^joZcZyTA$M4HSohCo zhOaxF!QRvOSFwlDzExULBCV9xRpNJn=Ypk~UgECf&$U8p0?!zRyO*4fD%;HPPI>Xv z{}h|kH}W!DRPo8vzPo|uTW6D-u%T5HRX?4b{DK~+C6@J(wfpD#yxRF8-G26e?H3U% z<{4aPp>cLi@Y%*MH9ulvH#h^G7NdmbtsW_ zm-eG3^rwdFn4p0!&c48)`cA1f*fuTaF-i9 zFze@eD=v?9)2y6IBG?nQ{e09P2Rlj<7L=)tiu@(^tt&II6WsR99-pN{*aCp)JYvib zz0~3P-RW3IvxW^t2%G(8+wC1}_vioQ*@3%XWVXV<-=w2(#%S0=PU9&bFbKH!@@6s7Rb)Cq{RINaj z=PxxX4pFL~I#n4BoX8sHH_eCLrbR-ssAC;pqjb6~%$r$=?|gy8=ZPcAS2fjOH*Q_G zc(*z~gfjlqt6g(R4}S9rGvE$=CKS7!##%2Gbr|xn2tpbfN&ca4aNP~+{?kU(zQ;~Q zsm4y*Dxp6js>74Vn800-xCO>F7fC45XpQmdyj5$-urk=?ki0u6!LM*@P38*kFU>Iw z&Q6>7kq!s#l$G0dw1zTfz-wWYkKa&XOk_}fW7tMJcyF_RA?Q$-^_BHW7#+ic9PF@M z5BD^cKcO?-9&NSDffL^UFk5y}*t+#ibmMguII`RiI zQN9nYiV~BQ4jM7amlai%zhno#v0*Fi9C}H?iivGyU-T&5cQQ9%m79-_^#tmQFn(uV zJ6$&9U8|fbTwf^KGjV`RTRL74!K%f4Lg3P{Y55DUIL-zj#&_wumbHwdPAxCg0qW_t zkGD2C)#h|lD0`Xc=34P#Q?d^y1ajh-FcDA3BKNI z!Gw-tiC`_GEB8kZdNQ@vF}EUyQv1T@46oQ_Xy_@O-GMo?q1NddyqLc9mtr1Ki$685 zc3(MUORCD)aEPFCcb+XwL_!W{ggv_zRrlIfD0eD|(T7~`qC>f9wtpbFR8ACTV=BkF zex6B9NvlqNDGHt7T%sMsVm`WI>v$?Fh8jS!-H^<2Zqi$R^=8qlD#x))DiE&U%&3`_ z<94+bDzArf)Xsq#oB~$6K7|YZ+)z`!ji_=^64lkTQ|N$95F=ohE(X%lIWXk#C0|WJ zE37#)9qxr}BoU56JKs|Der}i*j2f($Q6ShHW>8?cI+$RTqeAqcgPe$9#C8k>velSs zA&OD3uPQGW(a^Gq2Bm_%#VbG~5Raayu>?gc*N8hX4gp z2imP%1X!~eIq2!JnLsTFMle7$yb_(xUa*5q3M|V!n^_nMI{&rLIG_VgE#r)bdi{|X zsY4Z|#Ubta*=UBG@Q4@_zI6z6^pT_dgmUI^jcjA45QP#(VRoE+cmIv~O^1JP1iSg& zr2ne7-RD=%Da`bRZ2n1SH#QiZBq!#xbpS91EZ$&J3bmc?OooATdy&fdWvAmzhGF6E zuLl>d=l(VAf;E4e``h(gs51B6N4W;R?aW;m4+6^#z%m9vhHY-^t(LPfu?E;NQ$c7@ zxF;)I+7K;zBxy?F+NQt^DadGLAVn#Gk@Y&|4=sWF_W}qV^2ZtbaX!k?03)@kTngP=1JWag^eS=$D1?&_SgHgonI{3?s-ygog?I#t4y3V2}w6WfXoB zRzhY&zIQ<%Mj;(8X*PmOD&b@6G`%?*W2Q4`DXIV0J1RaP)u^xODuBSaYBW&WQ$nzF zgN5t|E{EqH#@~o*ImH2FueWa}-|D}vbxQ1K6@}C*NZe3 z@^?GN=L!RBqEcJ;9LWDVEbTn`#!V zeI|RpPQTlEdeZ9VMplMlbL=lmpS526rKv8a&Z=p>j(aKdC%4`hXUfKwHpjER8n+WY zu&=rJr%!JaqxM+!^@SJ*{WI>3nH61+8(q$CZmxKh^7!6yS;n0T)P>h?zw!^Sz}}Dl zu-^77R$*ob%4zdhjkRY5`?{8^XHVD!pPzx&5Ov-78w4%3vpDp5^@~K-$8eM_V-QJR zlQBpmpQOcV$36Fr(C~c>?nsuko3ufZ@9`_ z9AX0+)i2htX7rOcJibkJP}6R|6p0wm`(oA193<{W$WYFaL?4}DTc3YL7SvBF%=)s> zx7|30VVEeHT5f;X5$usc)+ENYn4gUz_qF%-2duw@I20O@nhn^UoEi2%-cd*`!76kxL(VpUtwLi5qxe|SxWS|`q-1v4%8)FYTnPWIqwiv zcXNrBqS6HXK$*O`Y-~Sdz0@cijtjY*dIaNpHY}9qTRPutLqDt!v8CL94Hc_)%$K34 z<6V*yov?zKjnD2h= zVM~8NANyt@UHo!l2P>erHi6!>%V8k!>@M$tB!_L2cDMSuM>L^T7azydist5eoHnp( z(6Rx_g+8CN+LrO6dl#WndX*tNGjy#mVS%!9zQdMwHm9YS@I7OA7tO?#-VC`J_Mx4u z-839YtN700!>i9?K5UR(o>IZ4W=y6W;dXJZo1EI!o*W6`kIIpuyobS(8IF@dbSpTF zS;Fb5wb!;OLz2?2Zkh4MUt=7T=+a8Lt+!lNaX5MkvnY{O=M5C1mbQ#*K5MhyVV=gJ z$XdC5^2MUaW)%`~QqdaAfU-FKSN#~0K8i0{eLT&j?!%Z+xuPT~NEJDx zTa=^gz|h(Xwx7@;=|0(ZKdb8w4X}y(+y?SmY*v4pQ*rKNR_E4q0q)2yMaeTN z*?sMlf_4H|`cAKO=`;L#Dzd|m9Wg0*`F-z_d=qDLl2S0JEo8lXq*>i=T+z?B^3pN$ z>H5JXFKd3njMrgP6F9D$64n(vAJ>TI>4)!~;j(&%uuMu9zR%bbSiVyezr8uHzfI)! zbrjb}NOqf2#L$Hu*XAlajy7(}bFZv#ORsJ?^4!Lc-q5B=WlhHAndiKQ4nERI4A)l- z39TI+JJ1f_54xhcV*!`Yt4=xIm>w&!*Em)%DSlXDy$>x4bQ$x)H=uNW)3lG2Vlp!k+r>AdN7uSZP{mM3praWcUv zXQhpOmRh`cq_Q`lOHrB}#`o?5RuiC(!q0z@I_`Gc5|EvC;)@t>mll1e-{@~_ep`Wq zCWrg%M6a!2`-EFR43RITT;)8QxL7-oM<(vXl-r0l27GE>RJ0YR;iqyO_UMs5KPar+ zA+l}Q4AO@S7R9qfxOJPTfr1T)p7d!Ok-VFtv+DFma&V>cZUkbTb?nHPO}^ZxHjzAHdOeksWBBUW86aK0Rq$R?Ix5bSQ05x$C2?mg~l>*Bfd=Q=)8sh!WwC>eQ3T zQ8tPEiL}GNAOnM4OK3bh(c!{-r#24}W4CIYRQiv6b7pO~O>`DD9_R_q0vY}hBB$C0 zk9}UalEnEM`_d_;s}&9tU7419MT=sv*A*pJPvbvGM?H(IvGtDL;j&4RNAYCZ4x}e= z8s|sIVa`SD9LQOx4+t!uwM}H#;`2t`d@SIjF^I#p<60%^1AHIbc*J_+k8eZa{D|(FYwN=@+>AOk5v}mY?~DQkT160zh#)gM06!wa(Kv>7Bt(H*XAlr$bR6~q z!L2Z|WZA;FBLxJ_BGatZC@_gTnFCu1v&$vblbB;2wj%9p5p4|EhcG~4u);clh`_b| zVapQQZ%nFzP-6g!$d=c*{5chW68Q1!9lK6Rg%Bz3iIR3oiDPVXUf|j`ZI7&luU1!0svtQfK^T=Y|FV05s0|qD$iGEma%_dll%5I zo&CD*+ZEFvt$KI&e3}Prxbpkjzuuwvr7(uh0K_0N8(W0bgVf5EuZ=*10nZ)ees*4&d5XnO}T+_0Ms7?%S%| zzviFhBF7Fc9Ls&RH}}u$Ndyoe=uxpk>~`Hwr+?SQF?lzvKr$3GBFaIoa7+HXM*1=! zLZ!7s9Fk5%EE6>e)*nXzUP|l`9Jc@LLGz`0$4x3;%|QW!FL9vGmNkxVju+F37qhJ zb&=lC30DEzB$E5@mH7^6 zK470I1l_{+Pq_R#-w^9LTbvPTO{4#DW0`sO*vabZ z?fik6ShE3kA{LVVDV;Dvs`V!L$-%|WdU&p?&e0IJYBAPio~!aE1o2nByS~NzV&J5C z;mtvVHuv|BavvAuKK*axGEfH^`1Un?`(6WVseX=?_T6#?E==JxqQI0Xh(?8HgMyT! zBqrN?Hw0du*lSHh1Zu6)4G1_3NvK3nv{soga*0Q#2flytZH;hWK&KJeya~W=nfC6zt z-oJb3p16FZ1ykbw#*r5I7{Y+!{rH7sZ9xzNbQM~PXd#UO1<4C7c(ROwAeq3U#$6R* zh!RSnas(u6L3b1ALxjjPP;nUKKBlzU>Dm%jaxuB&6CC`%MU<%jd5r!ZQNBl%?-AvD zMEM?3zDJbr5#|5ih%$g7$LSS>*bxq3;gbI#%41N8Mgrbj za;}H2ob_Q>OsLhHAgTh82oB{N)jIvD-70x4%fiV<>2axBXh2jW#9t;bK khBy>;TIGMWM0uVMU+r!P^e=PG4lCG|TwwjbY>CVN1JMa(p#T5? diff --git a/source-linux/images/smileys/fight/viking.gif b/source-linux/images/smileys/fight/viking.gif deleted file mode 100644 index 4908eddb881a5c08d4f5658e0076d5ce955df637..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9650 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 diff --git a/source-linux/images/smileys/food/banana.gif b/source-linux/images/smileys/food/banana.gif deleted file mode 100644 index d990d19d9954975fd9700e4a283d89cd1c49ddf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1545 zcmZ?wbhEHbRAf+QSj5Hv1cu2BbLKFdJIC;!f#LsuAOZo!|J;7AA;Hd$0j@@R2F#2= zb&5Y(IJp?u7<53IK-w9Y=Vt7>^UvUv=jy!{ug^*|#D1xL$jreMQRU>gjyvFtzRr2) z*n3AOtY6IUx14b$kJ0@?;SiO2+2l3sy=<9RU!3`RvZ#rL>A-K^?x|)Ui+_qfIx*#9 z$!ZfJMXgD{bIXqU%VFMe zl;QZPH+*J!HM8&P9x*&yq4r2U{Po7J?!})uYkcQ#IscVKMSvlC-S_S zbTyokHg#1%^}Y?98&AjH*-`Y{Zce(!8JD)c$H|h}3cZJ7)^XH0FbUnweai7is&T{Q zFa^Uy5xiBWlufQLGi`8K-mR20Q;BCKb3$d6rL~4>Q?dzjOuJ%Amu*#jr*Ds4--L;s z-BYLOYtJy6q&0gEzh?h}g#z=J`k800t>)gawy|;P7Pg&JckZ5OlQTv4kVo)BMHj_Y z@$1g;V)w%eXt;|qnCdIAToZlXctw>*UXsx{Fh;9nYo3(xn&|uIO7|MfQ*{-QN|^B^ zQ22-Ozp6sWne$wF$yEY1(c$`krnZcV%Pd(N)xKkg=W z`dkh5U%bY=(gzyOZ@s{4 z!If9FL+Zo~$5$1~3*VnyT~@`A6k>JC&@_T+Va8|1Bgr#9PuBaNu|)ahw`FL<^t68EG=^!i^QO5jTAUz1hp$}B zt8lWRgj<7-?{dSPI8yl{xPv2@CcM6P7nsV$ouUKh`A3PU?an#OeVWJMO1{qJz5V)2 zRv)!E?DH{A;9uF9WmA?iv)J!grR^olz`>GU_MKI|^MbF$@`yO=8)jFINuiD3f1lw197& zS0QhbxZTW|y>gq|_J}z-?-#@#&KrQvX3#x#vO!=%R@TRVeWoc296YWcr`&H|reZx; z^Nd|#>+01l+B4_nIi8ZNnvj$-)y7Kp$nps*SoE3?xF=XveduXBuwGE(HH)eA;yqV4 zY-YJ*k)t=$pP?y^zw-18lgb)~(s~zt>x6oBebX+Zo=mN_@ZPK`qSGeNm^rO~f=S;T zKIY!}3zkk_92vXZD5-cgS8n1a?$*}TTQ+aon!UQnwWuvPG;)IT@j&y#;Tw4%o?t~Q z6PH87UK*a#A3ms6DG@!|u#E4(Ht|0vHfKk_4t>uxh*;r<^RLC@hvMic-pjvDC)vr~(ZANZseRRk4GMM}Dx^~OIByqA NO5B|ma0HZYtN}u(V}bwx diff --git a/source-linux/images/smileys/food/birthdaycake.gif b/source-linux/images/smileys/food/birthdaycake.gif deleted file mode 100644 index 30ebceb35a73b124a055d6a61912e04faf9a6009..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6453 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 Je~scx{{jhS(G~yz diff --git a/source-linux/images/smileys/food/cake.gif b/source-linux/images/smileys/food/cake.gif deleted file mode 100644 index 22d0ebd99d80f6a5f4572b818151f50af3c1a459..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 668 zcmZ?wbh9u|RAA6%IKsg2|NsAc_wJoLckbA+V{6y0U9x1!?9ENrmR6jb9M`p|xUfCy zY+2dy)YPTLUOiEoUB<@Fi7xRWe#JqW#a^1_ehRLkmJE1-;=c&D%$!t(zvvbtxm$shs*ILLLVX`#Lv%H6rA#DRgXdPM~S`L4&CL^ z5u3j7`IqvGe3QL3uk5j_^Y`YjsjXKL65`7#<8NzWXy+5=4Grh#<>TvdY2)J+p5Ea* zZT^Ir+Ovfx@=lvJamA`R6Q&6*n?7&rhWU#oES|nuwSC*Jm8;inSiPim>%55@POm(> zZTAf2{+-9>t-m&X&EAuH&hHd?^k~mrrN?}aU(A2R{_dT~^j9L!-;2Ee_V^vgAC3#w2w(3 z!ZXO>WTgn(4jG38hXxL9B^Hgygk@)$RCBo)q(Tn(idkhct<~Io;M`niRt|*+pEAzP zWvMzf#p_CH_)3;Fvo7p3dUb7{UOSsdbnu&q6|5_Yrb;O=T-a)IcVDhn`HC~kf-b+( zomk@FzsKQn*4!-N^zJ1g7k~YoUGXg8kk;mFb8;*);*J|DWSg$3NQ=JEzftJznXmd+ wPtORSWELHwmvhEz`7vG3smlVdEPQ>9S9{KmQ@aj0yGNYcv$I%Ck%7S)02F2(f&c&j diff --git a/source-linux/images/smileys/food/carrot.gif b/source-linux/images/smileys/food/carrot.gif deleted file mode 100644 index 387b94c18381569a3f04179541092d00f912eb7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 583 zcmZ?wbhEHbRAx|S*v!E2|Nnpc`SJGk@%HoW&z?QIe*OCY^X>oF+uyIZ|3AOJe!hKt zy}gzTUqYM`0~jd&=k{|A33hf2a5d61U}gjgD*lsp&rEa7%gj|ss#NgHPb$sGEXr5# zNGvJIFUn+4{K>*82UMm5(hstgf#rh03D0zak_V@% zm&az`T(-OI!NUfPAdZ%J)rlNZZLTdWks2E6Y|DhTmPV~-NDKDp(K^R%ps-qXwrICW z#2#I7&VsMA-kCkSTH{~Fk&(rf!xPODSXks$kkr}K?bcS9liUG%i`qaWo-rAVeFBm3%q*!w$^6Fi8wpYO4u*LbuggM>gch+)KgZWvIT)H7pjCR z>#pBmsK0q<)v5b;9~^s_u<7{=`%RBuJ^lFUbGRTjPu>N3G8?NWMLsUNZk8_`D6+jv z?eJuQngb7x9I%lQxF8i|>8UbuU5Q$BJuN!_ s&h@G_U3Z0>0-rv6_3HJEw|Cz>Trpc@*0Z!7-@gC&`|rOwFfmvI0G(v>Jpcdz diff --git a/source-linux/images/smileys/food/cooking.gif b/source-linux/images/smileys/food/cooking.gif deleted file mode 100644 index e62fea067867e94925c529ce0c8a30d2484dc833..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3125 zcmeI!SyaDRNjr>_mLs(2Gkbny?RwgJie+W#IunPzlJ*6m!Vm%BXdu6M0vatvZ z1Of+C&=9EL)DaY9ujU{2MK(=`0>uEsCZ&job?h9O1PYw#!}vUNdSCB-x#x4fzk6NX zU0~a@`v4Wl?ZL_nu&}V0oo;%!0w%_4V`F3AE&)9~y<24|{{H?`&+5PJ1(R|B!!RC? zKY#xG+ROH~W-vYk7U#cdmEHJp3i$f^dU$wz`{d3)M!?!U2n`MGLqK15#r!yEz6Y)r zCawG^dsqt=W?KdxSFqXa!4A;bCQeLDY-%WMxC^9ppu0oT^$qB61wCC~H9W{49RR&j z(9%@o#X_x*fH#W(c~rdq609p1`1LYb*F5HY!q<`I<9x`HjzKB+P5y~h*9G?ABh^{e zHG$eX^G1~0M+P}v==6{VkEj?Agn{^4`a2W;(Ny!)VwD$AajPxXGAlDeA<$ew*ng{b8h3O*KQ+#Koa5Y9q&u`8e&_05|3;TU~@cEE`2)Q2b#nCdG}e z9qZ5A<)-6jetbpJUqUtQQUu9xY0z?ygE>bc<$vYnt1&H+gnw6&V=SJ3t7qmC#=!k; z^0}NhmLKi#yrd@Bk&9NhJn`k?=XflHrdM;gVkU$hqxXkmi_0 z<4odk8h^M@UKGv4qHsEF0aQQD8%xxQnbW5+xshn;t|4zrVz*=2({MWxJEDpzeNH^2=W%J-{aY8ztD zFx0AR*kne8qPtbw%=eYd;%()C*4rUfJIc8tJl+tB8=R46LvxpY@NWn%s4!~Fz!gDs z8p0yl{_9FTUz^U_$F>oN9G}qFHkh{ZBci5Lu=L;Olht2LRfr7r>0MG07dxPHuyx-E z)0&$?LWTAmeq+MZBJ4jMm9EGhagX=bdb6~3M zkrKGJPS~viek4Fb%C-{jAG8;WLfNWOeM>p29}iRxR|=?>og?2R_bDg!!Z6_-A)sR^ zJt)HUuClPiQIk89p-S&7Y?sZAbggsoOwaL8Wb;8PCWrLIe?L60}Dhl6-(O7w?=?HzkpTeOf+k zEUwO2D|5Rxk*A??V(qWEnmzIh#UDm>rlN7A(;RrXmjDs5K|v@C_bir1+T#|D#&Fe% z=1U1LXx!tuPu{U1D;`MQt!qABlzXm2orKl(gtTRv*^#iNwbX=^wix-J!}`NKf1bRC9ccNlDC;UBNlxelzU_LvZ8gd)WdjJjM0(duf6{~lODgecxDwszZdwo Vg#Ql`#{IYd)^88-|NcYF_&4*V1~~u# diff --git a/source-linux/images/smileys/food/fryegg.gif b/source-linux/images/smileys/food/fryegg.gif deleted file mode 100644 index bd1b4ff04393b42486e06ce9cba5a7561d2c6cce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6492 zcmeI02~bm6*2iBKNC1(9T?9>70wP{gkV{`^{^^a3~kFo{HX0CdLpfq`hE1;qv) zd~hEPpozd|iNN*30&PJA;A!A;0RX^V#YMw|4qzzI@`Zt2Q1f#S3~+U!xZB& zvPujafI)}rI-B8rO30f6&KM`ZS_!V)!@DYlaiY0@cK6)C7{XFs?Bwniz|r zl_u}WMaj^qbmxO2q9by#K0TF{)m>$y71*e=XxS;GmDn;Vl}zog&=HwU1`8h!!8N9H z%?4Vm`kPg{@-9IlT%c_bd4_lm*AsHel1+Ol@79V(i3*Hn}`8VdOl!J^K;879X>GKR!&;fQ`;2cDA7 zGK+;dugoW78OcA@`^#1(;-v3bgK=?xH--vT(`pk=wmhGij^4G)xBC^B-v1Lia`*Y( z#@F5i+xYO(LN-um{Z07xp>MWj!4~sTJlKu-SN)9FyAehXIA6V`gyj~~k|1kQd-J%y zw@-;i>b;ZzIKxL!5P^)_K7CMAqcumI7O3NLiE%Wnx@5n)WlFT*%x$_`+FVvaq@UVO zq>0(1#wjFQk5o%BIkhV58Z9A7Q)Mk>ifbg~VlXj=VNt_nCB@_DP+@B!a_ROR7s<<6 zoNC(D1Jj$*jKsymO9UoFQeh=yVs;hWVK8ZrdQH^|(&3tnYqDVmj${D;oK?Fou}Yz5 zePs2>|AW=g^eX5Cds|Oi8 z#H&)Y+-t6W7#<;-1e!1|qX4tht7xs8)s~YQPMqf^5iF9OikA7Z2$Qa@9n^0*Deg!6 zCFf=ETi8BPQ@5(dOPn1>Ug>ZxK-l#A9Wq)tEQj-6x=?MNcKPlbx-G+KK6o%s zR-8;!`YF~b%y+^G5@tg_m@_3qwetu{WHSftLkJ{x@3S{Yy z@nNaa0U7r22o{i+-aSNpztgH7EEcvhAEfpF!qw}8wEDLG7vZ`xHqonDf$P1TQBwu3rV)>= zsm;q!>uUYus@Z_M+F~M#gk0SIv%2GzqmCgaYEfF1c3g`FHxhs( zRtKFkoK|;07uncP?j1uy!Wnhy`n)ZAf+(5x8xCaDF+;+4jnp~_lDfh`b|_xvS-=;N zV(ygT1*hekkk)R^Q`(|qH>VD3;p$Db$W5-du+fzILun5;KI~rIifQ7PXzn-`#>{{> zA7Bg(Pu9~q-{EL>z`%US`Ufg;2H_p~rNP_tPOmlyC#5%RWhP!pLqME0pDd%jGxDIL zKFTWepE*77Z{*Yy`mqFX{cq*;N}ICN{0kEmgHrxJb9B>d-Dg`h;7`-ESdWlqSGFrN z=JrHnslz~7&8)b3W3{m=f*aCV*P>}DzI(*IJ4rP&y@j-UYv*s}Ov}-PN8dlMZkPAe zbu>Ypm-s!ob}sC~Q@8mR@!G#T}c}yU;Wzo5hma?V?nE{SEu-B;VXXTbOSYJkM>KO8QBPX<)dd={AoeS#|9_>_@AJ(6DWas0i2j-QTZvuON>#!WN|(DYNEJoubr@8pC{kMouMZ7huwWsXD zerT420q|ueegc!{;$9)5OU27MDyFo+JX*Ou^>H8%j_jE|rT?<-eR)Q=rjvf$%0Du{ zsbPCW^z|Yz^ZVa^8q6>B72&kP;m~b+xYXEEd1}2jkC$T#V0G0aQ4p* zw)u?|H*O{=9owSM4~0l>Q?A?}Y+S1{w|8rAU7G14r&LOfYeS+?)hK4~o73`J-)~f- zC3U|(J4_9RSkTMz+HT9Gu1uTK!V>9d3jJwUjP|^#w`{Pt!&A~M9cPu!HIIxT5LkFB zgg};bQ)!h*wt?aJG2LrQSYWyc_B08fZJbr(D2dQ3vcz6Y&*LjQtEuoKHY3lyZJl(w zo77&eSJz@;4B#r;_h*mKr_>nBAcTvA>3IiLzN0&_dfjL+aX2v2O_TgL<;Oo$3dnwY zflvyOyJ6qt_G1SlUN*I1X#=@K2FZm<_Ua`|cLt4@Unl3>!HqXPUYbsO_%P>Cg1_`Z zB=t#gJ=MQ&Xer~Y(q4^X{_)c2y*{WlZl7@aRZ9QT3KdNGU#0XfmeQ|P>0gcL*Q)g2 zQI&!j|DU?24J@Rd+|6(%A2XhZ<49?9=p_x_w}?KVct~Is>UF*`2{r-Pm5X-F*Fp-RwOF zB3!Z&Jr_DPGk0bJ&rFS&lLr%b&A@C zv0bO?6t&Ke$%&7Sb+V0Gw+4gRlpGUFi%*V?!Nh~JRM6rX7)S~CclU7jclQU481RHG zotYGCOXqM{F}6GCOg4vY%S}q7+e9;y{>RFUX4^(ZCdY8&V>omh7M-Ptj$tNa62Z`l M2o81%%ZLB)50(t&cmMzZ diff --git a/source-linux/images/smileys/food/popcorn.gif b/source-linux/images/smileys/food/popcorn.gif deleted file mode 100644 index b0ea69767feea192e6aa64f821e92ef5d75181cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1155 zcmZ?wbhEHb)L>9y_|5&SZUOra7+t z&tilc8n3Sx75irMJLlp4HFpo)la1EDxtIOJI=;TD71{UpNdIqpQ*D{`sJc`-fMfQr zl5_jBmGk88rha{Vd2OQh|5pIy#K79^xo}2Ko!cCdw&07<%v3l3vepr9s ztwa1#saT2p!9%v9Z{NQE`2NGUuRO_g5D6`8=^7eV#@ zvjOman7<2$7!W$F3Dy&_MTp;=l9m@t4bkLLA<$X@SzBF=F&z{_y~lb+5VZR^wJzH<*3 zyb@}faNxCQAM2#X4I*;$0-hMAtcYr7$tZcXv1;{=H)bb)&N}>vc~j26MMv-OY_4^+ zUn;dw@}aC!TX~^4dvRP%LY-e$wq#3nty6thk2r^aYiPUg#K|5UlGA(^dC$&ooG;0` zkcDflGbhUir?p(&94RX~IJmsow?=Zd?Ayz=YsX5~eOp<#M)`9^uAL&~e(H4Ajgwn0 zO9$P%U!m~eanqwGcT`pgzjAoP@J`!%$0vt`;BUuOoLE^rfB&`G!zi$0G{Q$_gpcq7 zP7bwzdxMa6rp<);W{F#rvAjrOW0rtPI-Bn~= zk3@z)zhW1#yeWU|&dB7(qqJvx-rY71Y{lGbijCDAiA5Lz&ooiD7%sx)`1N*vn?PlOQG3!(?=jl@?xOPf&IkIzk-0-*(b@4J+@b#NF zx$fM(ck$89<0n*)9yNVudQ9ZK_Qy{`j@1mme)!n`|2B0;V1t8D6Wh~7<_!hTEMWg@ zpeBGvDE?2$j5@3`N8};f;X;-}0e6->6l!v~ys?>=-AICY!~Fx{lkalLFa8*sY?j)d z?ryb|kIh6UZ1=-gWe4;hZiq`?DAiQCZ?*MFiR*V_?%#bVky9O1t5@G3-qajhTQA9B zRMgy>=g$fXfTp6k=~Jef&k&zAyOv|hiiL}2GMMLVn2@(|VmZTNu^H==CL|f{?c1?) zoqy!4$P?3NPunid#Wn5XrD^A7&R@91$$IP3b=iA2FEQLxIdoP>_}Me{S1(?QzE-tr g`1~T+;(LdR9xF@0pMMc9%5CaUZ=)4e|M~m>|DFE-KlUFLG#vP^ z_>+Z^fq|bv2c#2Z1_R5s4<~;%Y&ChE+5Y{;Hb&;8S@Re=Bs1sUU9d?eL5)*qy-DR` z%PZ@`ofw)sMEsxpo;%5T+Uu3KTTPZUzMZ*Mf~Pf=yX2+Zx%(eHK4dcUu`(&@E@KE0 z*R7Fbzy3BoU5vdry(YYYor{Y-zlD{Zt+=GDxw|o=h-JdWI-$N9>CM4{$rBQ(^%1Eif(#7S E030%UEdT%j diff --git a/source-linux/images/smileys/happy/tearsofjoy.gif b/source-linux/images/smileys/happy/tearsofjoy.gif deleted file mode 100644 index 5de31171f6421dc0f63291e97cce6f80cc4d17aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1297 zcmd6m`A^da0L8yjT4`x%kpYz;6p#tR5P_i`oj`$dNQ4O#ro$mxVq|7c$)cj+mU{v+ z5RD2rCkjTTIv8^vfKVcnBCI3ExdKu-%B4Ly`Ub!657_(d<^A$`$$O#Ug6-V>EP_R7 z`-l}8*>b)k2+>LQi6q~{u|cU9)}5|qMO+BhJ=5pctbP1rsHoq zB#wCDisznq;f=l>81Tga7jnWdLV}zIIURBah8Y;6LP3LqjtK%v5|m_&(=fhb%`naU zFviA|Ih59zU}K(y_e`j0P%)rlLuCWi1}Ge$bi|AUM!YfVjTvvKouGDx+68J?sNJF7 z0*x;;+oAak8b4@uK;!>nI7HvIOV=Hv?~c>;#6lK={sZVgh`)}^s)F&B4+S6Z5;2ho zO)%!7p%p?KkNLfr-v@0Xbji>igzgY@hoMh{J|pYePsR6}^Jn!XbGY$->E;LAS1&!( zpyy&v&!wDa)0G{nUwhT9v)Ure7C@hkg&(x~t5~SQLJbycv3MPex3SpVsfAqk97~;8 z>iVD_!g4>BWmp~>Sp*EDFib8OmJNoLIsEVB0MlI|u`xk`(IH+Qo}@J^fDU?NGL7gX z+*e^&Z$g;7C9YCW3kqXgqUwF})=Ta(?(AQQ7RQP!FNM*!OdpnU9GeST1l(6!qZ#gW zOGkG<3WsppbM@u+lN3R@o9Q~Cvzt|u(2e3@6L-=o%-TE7qQt?;s<%o^H?_OH-qD0z zz)TQVM1QOdG~)WpRC~%lZOo6q$8kxTZ;!g=A```to>!KE;p>q{sGD8zlx8n7T1Udo<#1WY;MX;Ex-9yLqwKW zu%Lp!^T-K?MVPXB%kImDadv|!UQ8hfPC7*{a|unj$eYThTAihtS8X7%GA(aMr61*y zRJ}ivsf`tu>B2@!l6C2=G?patPvZlU0e^k;&e|tYu$`}c{!a5>3QaP z|AKLgd_hqbx05$zZj?s#NlCFSzkau;bTdgjlv$T-m29@D>?7Cg?40&Yg7Etnro&c& diff --git a/source-linux/images/smileys/laugh/hahaha.gif b/source-linux/images/smileys/laugh/hahaha.gif deleted file mode 100644 index 37aa92a19b953272de9e32e1985d4d81d4ac041c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8268 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 A`Tzg` diff --git a/source-linux/images/smileys/laugh/loltv.gif b/source-linux/images/smileys/laugh/loltv.gif deleted file mode 100644 index 3de6f778fff71bede893fe95a8824949d24d43a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2335 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 diff --git a/source-linux/images/smileys/laugh/rofl.gif b/source-linux/images/smileys/laugh/rofl.gif deleted file mode 100644 index a3bb03d6525870aca7d516040912c89027c3c8f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1010 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 XFl#p{_@GDYEm!(hbL|2a3s(JqG&fSB diff --git a/source-linux/images/smileys/love/inlove.gif b/source-linux/images/smileys/love/inlove.gif deleted file mode 100644 index 30357af282cbf688453b636b63cf09517573b773..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1005 zcmchW&r8%{5XMK@B5%sl2GxdPQCMq-Ib=VGFk63M5K&ppm0}Q#Z4UckOwgF z8galsAm9+x5Cb$QaTOdG3~fk5%OkmHqsB2+k09X>V^Nu@IdX+vP@t)9>c|mEBLHyW zI)a8-ht{{$_2MOVvK*Y)kDtmN#<5+jY@m3C>L01-YMaRB8jGXnhUZ@%n5gU7`E-2AK=#vI>9@DzGk5DJ3u}H> O%|+u|J)}bTp=Xza0m(^5RMQ7NpnC9iW&p~(PB8P2?Pw9Vs%jy!jXa? zc(uCK21H$}6(~Zn+TFz9)wLEpvDywGTCBPSk1pCy-GrlMU$mKA^SpVIna_NG&$A#| z&Yzzf2GOAhkn=$SfIuM70AM1Kz7&e5rzgw9V-6A-4nP2f5=tP%01yuVk3bL*2pmt( zAO<6p!HDwp4Gsw4goX+@oZzUaP##afMJ6@3UZ$g+iVuMb> zX6(4sy8cn%!G&KvR5IQ@SZlfSN#_&aMeRP1n`yP1h0GJOx0eVGEc5x^n4Tg0xV{Ve zNU!Ecusq#h4qKO*#fxOaO2{o%I6ry^As{}18-`sg(y(y>26Zf(;+Dut5c0yqw}ixO z5=L_(*m!0e2N$kx!SU41?cpGCt%k#4dBf-8*#Y4Z;ixEK6nxDXhC8x{8{vzUg+_1U z-}V7rd|_N`+ymI}`Oq^BOji3-gA{{SRFiwxwNr+1qalpKQN`%0w%h7i5p?bIRFgf< z+n=YP1xgv%KOZC^X(-}Zq^CL`j&y4UgSu+!fKFJ(4!M9{jT@zn3YHAgU4L+ zP-Zfj>dxI%m!$QKQLXYZsxYZb$mW*I9c|cpsvm;{QEg^2E6fU>HQ!I-)SoLqD;8hh zOQI+@Ud`tY+rIG+)R*HT*wvYsSn0UMf7n`)w?`h-=(RBG-F?0VH@~6`m%0(buTLZf zDmBY4fw=AiCJKig1JE1Cudhz$TH7-uqE|0-d(q!L9WjxJ7jlFxl(`O4>>c}OS|AJH*1I`n}Hi;2_1`upf4&+i%A_uEvc zjyJKq1hL{(L(9@-ISX}TV?*a_w#14nM?36E6(v7x9-H_XCw@OYF1rU77hkL;KY{cU z&@kG(I$k}Z>a382<`t(<{F`d!b;<|t1nHVhR~r}+Ih87?ZlK=fUt5RGHgLGn?PB*o z)drgwV3@St4~KH=8|Z$#Us0D0OY5nDVy)U>QPeKlukN%U0`KBb(G6P*b^65(TZQV% zi9Qu%z$vt&SrXo!2Cp*-v@;FR5A(g5M^190hY_ey2Q}(ac6AmebW0z#RAu9)1kxsc z(Of-Jvp}S`+9{V#_}kgIiRV~^RBRw)5xoZDHcpI#+TWgLE+$24+tXdP8sSpJlH*Tx zFsa6!o06g3-Up#s+m$po&q~-t=HFAAg4pb8sw<^*NKadpc?Tw|u~<$)b(Ge&d5Tr4+}*VVRuSlP~O^A+%^1JLLNqM6+tI}u~D;rz~P-!qJ@ zDX_e$B+F5EmsOZ*Tp~pGjw1pRcd$6Lf)nRWcLSg~(5s&Qb7+J*K4XH9wb-%L2=Umr zlE9k%9;9A$1!6r8pB9s?C&UFBiLBDH8}E$=piCKECFOkYE7-c_vL)2xuUilpB%ZEQ zQ1h#6Vg%*o1Im;@Q$nnCJJivP08P8tr{9qvtGirr@8F)=0_Dn&H0wtmO9FdqFi0pd zGEa7~w(W@i?ASQS4}XNqyR~!3uF*sV`i?Q9q!+P2b>->Th<9Siu2@g%p_l-pNNK_U zGN$W7?qKz6u|)8CGH2<|obAT!C*teH#<%}_^D`Mq|D9~LUn09S)mV1^2`rPE+z}}n z{*xZL zYWMG}_i|gIE20)+Os?G%?->kZ1!vy8&qr^XXS3OBy!@Wsgj`!LQoQg5%+B+NR(kr+ zN%>AaRAD&93gcOjeM3mI7rgnYrOEU)0dpT^qvKV0r?PU|q_PcD%8;4eCFRO_Y)swq z%-ZE!`XQ4MMdAmUxpq5)#T98U-8qCY38$4+?A#OSRCd9sZ16?@F-c$k{E3$q*I}6n z0R_-In)9nN(*!vq!|E^r*wlV$bQ z(MaK{IseYbYDzlbzNLOB9KsmOL{UxQX)i4%7gD|0MhzN>yGh|*+4D{LHhO6)qHO+C z7%8iCcO}gzgK4fRNHsH>;&TZhsuz^j&+_h0j;3}7nm$B6 z32kaMcTYnrs&bB|cIFaI6dvwaP3<%^All2AXZ+cU9@A~A{wW;P0Vl;KYZr;pQc9I zv653diS^qC51#?V=oq4xNVS&rUGgtNn>JLbK4MA(JnB7Lu6(T+lwuFCVsp;oY;eX& zA3p=)ysPPaWk|@*(%IaQK2B~BW2fX}hQHh}&<9DH_I#0b!^y4N!7T_~mA)c)+wY?( zcZ_DLb2QJ29)8gPujP0%Kl$uuTVAiJStcKyfJK?xJ4jj2Ca=#5_Q``LurFQ{>AvrE zdAh{6V<_RcUnfV?;vCI(Qjwr%tPkgYPXe~xzIQ4U@zyJJUN8E4M3;%=!djoiJuwt1 zMY>yamwEgVv|a7iENP;eDy77aHkwFeO9;j_C~=CK!H_f&Idy&JmfqVj@`38w+(atm z|Jy=IiKaMLuUS_D=WT*zxy2f-HWyA>uPNHFVOX z2eCXYO(|QP?!4JhCQFvASdc7t+-yW97w4{BgZQ&|<(l=56Xa@P*}CH5H6?n)dMN&X D2E?wo diff --git a/source-linux/images/smileys/love/lovebear.gif b/source-linux/images/smileys/love/lovebear.gif deleted file mode 100644 index d13fd1852520f27f2ea3160bf1d40851a9a92e54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4491 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 diff --git a/source-linux/images/smileys/love/loveheart.gif b/source-linux/images/smileys/love/loveheart.gif deleted file mode 100644 index 541220a9026384750a7685a8338c019d36e41d67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652 zcmZ?wbhEHbsHp$R$v`!V|GE8KLxPTGw6T}0~yP}5>;@*b2ZD3 zBm+kQmU2O-1C>sR63?TiL}bZuFkNZ?m~^B^r7MAHA~$1*{n4bA60iJBR2LtN(CAQd zD7jc*vZk{+qhNB-TC-EUJ6M)q^?Vo|EPYP*R`ZQTCqtA#*0G{l=LfQGugHs42U(mF zD})k6m^eGwA2FUNT;(=fqhZpKj2;!Ma#TSZt%P(8`Gnv(}4=?-tvH*hAE0G zk|C~WYj0ubYV88L1893+69XqZ(-ekDyh42pLcG&wan2PMV-OQwIC(0k&~oujtAy50 v6%rE%+di*z2gve$!c+Qp?%unijbY>F6YUqou3hd}u=?c9?vDG-KzpqL8Vtb* diff --git a/source-linux/images/smileys/music/dj.gif b/source-linux/images/smileys/music/dj.gif deleted file mode 100644 index 66bc075f3589312135218139534c40f476d90f73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4446 zcmZ?wbhEHb)MQX$Sj5Hv0xkay4Gk?VEsq^L_WwUvgn>cvKewN2NU*bGfUA+70W%{| zSn;2rZ(>TSLQOcW-C;9ubJw1#lC8To zTu{BYfun}krRV;Rc^U0tn^@2Os6BXk%4=IWj~^>UYn`7=VC>;xv+_u^>Sdbeksvr_ zr;|U!svS{B%BCM=XP1`jR(-blTiB~Q#l|vG{`Kp(Io4^HGq$!0wzUfcNJlDW3w2KF z>TZ&?nO4rqFu5(!ZKskE1h%Bnz`vTt}(uK?W)CnpD4q7M?)T2r#v`#aQ4$@w}obhzT}(# zNySBg>G$uT*H^#UeS9pQ`rv>W!>_Bt6E-M1H**O))p$&N=+q&^+cfip^u%ztKKAy8 zH|!rCyA=NDx!_UBH|O+pgXAcW0T095@3i*pyT$es7=nxytb)yc4Zr|wZ|)H2pAg<9 zY|~ZFFlqMWDbmy3XXH+t6Vy51E2}psbarCZJQ=gqYubcDsyA&eE3eEKD69pA;D$8` zN7D@t#5*U4<+$j&>C~?@zF`(+ao6O|&C9wwfFWoZy2CL4%Ho%8huc0~b7cDVZCTa* z#6NA{nF9a)m2N%H*ig+b%%xLNpy*J;!E2SHA<%QU`?5xyjD>iL^1dPg8zvQ}rhD5a zJ=n7{=H#ZOttngs?0L>f~0#y>i7)1^_8v7EuPIl&*Q3ZAz_4YQy$1o3J07P#+=!EVCP##H=w|cU{W2sCiMgUx+^;poeXi+Qy6(P7C<8*N43|^Nw3u z&LcVd{0ozrEA2K%4cnt?8f$YHnrhoyTia@Vn+UoK5$I&b9eNU= zFzzUJ52SemGDeC)1egTsKxv7qiLryVZRP>XH*(IA)0Z{8VCr2GGUw%|uF&i|{4&pi zW6k;`RWwp!^CTBdy1rSF(UEhCxk1u|lTVe66Js~VENzQ!Z8#XT=1XbI98V0!UX6$7aQ zTQ2ijo_l`LX)V|KgKZO??sXl$zVOwanX{DL&;6V|ZS&PU;kpm2uIoxCh-Ef3*0spC zx9fEE_H}pmP3%vonh-E$s=H`iW#OclyhSaugB$7@m{zUw3TRYa=DwP#bLHmM8`iMx z*s^!~7McBP4(~d&ZF}yaQ_^^Rg-GlWU#){B_Le-sgn1Wde`Zn1oEpA3{UhnIM`rwP04G^&IQ) zMX8OG`I%O)_N=N{zHH5!4VyO$GpuD}+PQbnwp}|9>_4(+_kly(3J;%=A?PnqsuBVh zEa9MnuAo8SL9mJ6EW`C(TWVEUJX*u`ZUx6JXFA=ZX;mTXb!^hCt@k?Bk7)87Vie3| zQkc1Hc?nl((E1?lX}fL|NyaT)Y8lFLF5URo4d>mA?@F!p8q^7uBFGK^C+mexv2UV0 zR{s+Ut+;Pw^oWy*|CE(F%kjH8+uuo>|8S7pCCy;*Q!tl@`J#D$-*hn9M| zqFDcpbt0E#Jx(OP5ZcYM{C=WP4d3+3FMYn)uB&-7(ZRE+p(>WCz1^nCy@M%*p|@i~ rS0~%VKJn>&lO|1@C^li%EHOOUWoQ+`qoGROstu9HAyx1oPOH`c-wvhe diff --git a/source-linux/images/smileys/music/drums.gif b/source-linux/images/smileys/music/drums.gif deleted file mode 100644 index 27215f4d2588edb438749d89e96bcd3a75b5ed29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7596 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 I$N%lW09P5O(*OVf diff --git a/source-linux/images/smileys/music/elvis.gif b/source-linux/images/smileys/music/elvis.gif deleted file mode 100644 index ebcdcccc473a120cea8cc118d407dab75471cae6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1789 zcmZ?wbhEHblw^=*_{hNU|Ns932M+xI&j199|GE8KLxPnPSD!$=LVcAc0Q7A5>Gf5r$0A6V%yw*`-9_Et@k>g zYAP6!?POvQV-N@08Q#)wyx_&kMKuAp+@{|6y>5Bo+^L>(!~%UJIuAYHvN(L#BNo2( zwX1iXd;P;o?*V%;!#!Xc^e`{7MsM=vliIUCw(Pq- zkqOx@2B2M%K)WKr{@d`Vc;mT{w`Z&P8M*E*Zh6G6HT&c;VfM*SC!OO7-L|mnwc34$ zg%O9syIwTi5!!u%Pl!W@_wcn`0oI_^>MdToV^2&G=U?(>=Ayl?eWRDfv5H+8>J@Kv}{9uir6QQ>e_%$|MIH|_Z2H2dmf z_1RIi$zrSn7iGiNW3ZGTL3E7$EL$Icj&-MMkCUK^K!DV&HMbeK<^*kCwWdtbJI-dp zM)xeY1(&n7<;>leba#d;N|uI%q9Y`E?Bx$Hc8*xBal(4v%$P?S1~MIfJ+Ia-P&zcj zJM>AZ)sN0L3)H;&9FY9yRln@9hed)sdT|o;>kgl66slZkRFJ0wSa*bsNAIh&dwt2 SxUzF3EITv8YZ#iBz}5gfR_Y!A diff --git a/source-linux/images/smileys/music/guitar.gif b/source-linux/images/smileys/music/guitar.gif deleted file mode 100644 index 11eccdd0b05ad478174064b830f333f0480f8ace..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2070 zcmZ?wbhEHb)L_tHXlG>j|NlP&1H-@148Kn?{FuWaCnpEwj)Kt;7$G5`_@CR)H6+;C zF~HSG&w!Z`=xxQHESx+H{~2^ZK>*4o3>^O%{&UKB1SB*xvvX_3oG5tc$jHRz;d5g{ z(oqHhV=oy8g@&X3tlTLwniClsnG}M%WH>iIIXOk%H7O<1=z#YO-f*Qml^0aJ=J0Uy z2y7@m;5Xl)InQRt6}3zK9L0HaPF;L*xlPXY-{n;s92z=9eXV#uOisKqH*Kxe+ZERq zg>}V_UEO38`6v4+}ZnDxK3`Kdd0gJmsiK1-?#Vo z_YZ|^EQoMo28NR=gCZ=PEDRbPn^}Z`;dEgE10%DNQi{jKq=t40Wj+Og1&iF9SPi;* zJQ^Gt`{kXxYCJBfoa$24U#B8@;OXgBE&f*~5ucv;wz9HuT(ERVKR@5WR4OFu^NZun zo~B;9o>!M2t(V=XrX%3+$ZeG`b3`mhX!@aLG6$Q!&L~X^Ys%nXm#V$(LG+FcZ@)Df z*VIG0({74MoGH~0np1mRF3sb{hooc79QyZmntwcYJa*+PQ;UdK4JV~c)!*res-`k6 zG>!h66IJYaKJuk7^5F6NmP^*-ggn&<9))xx=q4-Rzh?^#{F`P0)yrS|`C z%DgFgbye2>*sVXmQcm5Q$i_ItLWP+_-p{h)anivccA0xSx92CXwBH?cHG9H_^C!%A zZ@co^a-rKUH`BarJ1z20o(O&4R_4p_EoRAxix3${G)lXR;h~o;c@1&@VK0C za@op-5?4;XZyz1yCx!0dUE5%n{IoKBb=`KeJ!>L_9 z#X@T%3pQL@YA`*_HX}0O$(fMLWoj!73w)Ut_I8=pT+;}?nqT~^bggCXqigZ{lee7R zwd&;2-Os=6dud&oGb5|e->>KD%bY96CqB9-6Z`AS`m2%g=j(Q-B|c+fW@1qM*BO$L zS*(zlmzkSblA5C6?&+qGmYI{PP@Y(&P!s z2r0@;%uxtSEh^5;&(l#T%Ph_;0jgF=EK$fPDJihh*Do(G*DD2S)Jx9KRVc{^T9B8b YkY8G&kegqWs>c`_930^68^T}>0B>9}^#A|> diff --git a/source-linux/images/smileys/music/trumpet.gif b/source-linux/images/smileys/music/trumpet.gif deleted file mode 100644 index 4595cccb72f8ee057e96573172a3bb51318f185c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 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 diff --git a/source-linux/images/smileys/oldcore/laughing.gif b/source-linux/images/smileys/oldcore/laughing.gif deleted file mode 100644 index 1bf29de795a9737ee78e6a492ba9ed50e931b721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmV-20nPqLNk%w1VG;lm0E8a^Qauf>s;1-69HWK?p_PpF=Pd8M1ss2Xhz|<_5Q9Vr7Lk&X2pEkb2O3xe3;`Dx0Sp9jY9k9C0u2`o z6B7&<4GJC$BuJpv3;1INbT_Pyi}ULF{R!XC_xC+caJI4z!~tM{^*;f7bFfso z;DQKrmM0P9!`#3DCsiZPD1;J`3FqXZd=b}tHE#ODFL~)jcpH9CQj8~|5`!@@L5HG9 zmN$ZJVlEzwzi1wN(Ka!{HZI(rd;v@eQKnpiriVdtBOpnkh}1B6`epU(NTuxWkR?$H zeAu$8Aw*93Oftkkb~i*C~z_$o%zcALM09r)}9Y*FGRK$YIYW*yNWQ}V)TPjcvm_0 zVYzxGMXxf=usY48`i>DZ6UWNYW90suNj0PAS#t{X+e`Gj>H3)zw~|adTCU%{T=$Ah zVsXK_(jve6MLtwY;N6Un!u0UMtgH9#M3j_-meZoxwA0nppt^gPYl^Sd7T>5UPOQ0~ z*jSO+UFFzaeSt|&XsWx_nG5VygWJK-x_gqVk1dVpT#A%z^zVSeoTWAutp zW3^XZBGix!U^WD(&3@Hwq1xu4`pc)7SA%LlJyn16RO8*4#@h+a_fwj`&R}=u_wCMU zeOTD{za{NICAh|l6c#JJtvQ>|PVHb9wX(}Qn@ag@_u882?JZRuE!EtP1|FBe?`nF) zYkt6Q?Q6e1+@0LZXFTRJ1%kT49`?vU=g45!n20?p>YkW*C=?2Y1_UCJaCmrlc6#{P z^ZDm9 z{}b>LtZ9^H4^+4&YwS0`S$YJ~WJHMc34;`flEuMnXS_QnP@D3B_e(I@`OdV`sLt8p z;ucbWx)eV(LqJGV!o#i)PUs)@?<^y72Z@dxk`z_;P_3n)$y1|z|2zfIBO?>9_Ih`0 zvcjYJ#IZLj+>6Q?zI2244W%~%C_YE;nR`7SLV3aU3{FK#g0Hl+$!i_sCEMYfxrCeJ z=TpUZSBUa&egkdK45rAkb9PpJOlBs)ZkoUHBzoq_Bl|NsVL;D~77v}e{Eh^Ne z?&>d_UMy8kx84Q^J-`AU3^1`Cg5))LNY`^6UM-%7%z$n~H5cBYvWsK#r9AC@8V*N^ zW#&~?{J4u8fPpW+*3dPCkVjxZtZfJ#qNxVYB2SOrgxzmElVn|y9$?%NJ)&Kb;oDI% z0GbV2vX_$jC#pynSEW>0ilOGXi?;Wq-c0HAuc= z1k$Q>Vig|_>d%A$qZJWJ1sYhg&Q9z4Nz%gz>%nvy&H~nx3G&tus7(O)9&AC+a&D_l z46oQbvMRS1`=9dPf^6=-Om?c$!sg@Gh)gs4+mm540qBuBx00P}s2~E%m!)06IUFvd zueUGy5OQ?u^>}&Qw>TRM=`&4dEv;_ZYiA3M~)syOcwK^m6sF8V1md3cZ(Lk6l0l^+Etk5AZiIMk31r)%ZLaXziy9mBTuv2>Mc_HoC75ko6o^8;aINqii?7hbenMAS z{R6YxLIXq3;a&~4c^_gT%4}cX7|IBism-E0amzg$~ybvgLsx#XC z+for#o92jxM^eKJ8@)b*-Ic6=309WT=Kz$p#Gg%pfMh;lmHIy#A*9J&f*lAQ_HH5d zkry62imM&uD$_gWXQ{BF?j{XH*mG@!* diff --git a/source-linux/images/smileys/oldcore/surprised.gif b/source-linux/images/smileys/oldcore/surprised.gif deleted file mode 100644 index b074653260bf0697263d6a6c381ddac84f5dd56e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 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 diff --git a/source-linux/images/smileys/respect/bravo.gif b/source-linux/images/smileys/respect/bravo.gif deleted file mode 100644 index 34f72abb7d0845cd65efb9d8a6f0811156eec4b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 761 zcmZ?wbhEHbG-1$XI3msf1_BHW{~0(W7&sI;7#M&Y2?hpB%m3BY|EG8vE)BBWn(Vao z-1EJA{~tT||5{7XwQJYz-Mjbv`SbVh-+%x9{r~^}5L2*{ivPL&TtkAL9RpmA^bD98 zfr=D=vaoV7h%@MbG=QAJ!20ijYF|nwlSbCMoY(6bHW?hqzOR4ajp@7p;s=x^YPPOW;hV(l(b&R2iZt}JFb&|R(*F2?>~O0MT}uUisXS3Yr^ zQFEBx!g1$?YVZle={wp}1ymd+WGvd&CH{|d+KXv9Dt0N)byOy7^J}oOeRgl>?vB8F zYjt@AH@xaNC%4s_sWVczK_Rte9&7AYEft=NyOYE!?aux*d(DfB-vs9ze64U){>{C)yV=)WwBvG!Ft{`2<9m%&%TH{&<30d)0-}-MI-nBm}w6cqlg= o%iMG%pLN0YWS0nVkQUeToL8gN!oXk+0PVLv{Qv*} diff --git a/source-linux/images/smileys/respect/hailking.gif b/source-linux/images/smileys/respect/hailking.gif deleted file mode 100644 index 07551e5026900d60fd1711f87d22473bfd54aff7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23733 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 E01nrdv;Y7A diff --git a/source-linux/images/smileys/sad/crying.png b/source-linux/images/smileys/sad/crying.png deleted file mode 100644 index 62b9646d2e195cfaa8512dc744f6105083d4b5b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1259 zcmV004R=004l4008;_004mK004C`008P>0026d000+nm#LZ5000DZ zNkl;JN%^#2D}ocX_D$EN=Wd(ZtpvTMWtEwxkr zv#<;PSJzhlkE{-TNCI%>Yaqi3i!|PW6KXGUQgQKDh!xsj2u(*+wCK!igdV~4bPV8mav*R#> zyM+UTmAeWE<9zp{pcV=dPoddDl^5M z;llH$3+Y^GlTH| zpA2koUoosczKwwsDEIl|D+bex*BPGug!o{?(KQSlosSqC^&%PAr2jMAdie=00G1VGRV}K zgF*BP6T|f{ybO~Hdl=Gt`x(r+J~Mm*8aUzeSFi;fKP?!>uU5GP%*^KG0U20rG&ogJ$=13&;V>8r_u10FeG|EUTxe3esVIQ{58!~c8h!D8Vl zv%v;|z@DSC8BSik%E07q#^7Pl0Cvb%Zw&^30Ak|z5n@y`wE%ko45a@td>7$kxOnCj z!zB?#un-qN6GL0QFN2z@I>VL|+Zi0k)gbY)0yU&bK+pOJx+^)E!xyRQu2 z_ZO diff --git a/source-linux/images/smileys/sad/prisoner.gif b/source-linux/images/smileys/sad/prisoner.gif deleted file mode 100644 index f2c3181dab37da9b35bfbd1365f72e9031dc0a53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1961 zcmciCc}$ac9LMqR)0X1_WIzEE@ZeO0g6Q0)Y%_oyD(K1~eX7oYgADJmxXlDy3bcR- zQff;pq5>YnMGA5WLQ7i?xeAnsP_(QqhsB{BqT<}v71*L=)A*OqA5WgYp6AK?mCrA5 zTfoLmQEOp2j8Z{64S!9+pOf(WW0-jev%kUQFgzcFS5M&OIH-C-R0(4Wc%p{dn=m~B zPandF9HbJ^+=qMZ(A5O(V(1V zKPI5N8D=z~=z*RV5LCiYKMdZ5&IY*O4XS%E+z;w|Fw_UF_0ZV}k{WoT0zn0|i$J3Q zSrgoC1%(VA$l!JLFkAILl5#Ur>=2f_-F>Ru~@M}wg11KAxI zSHb82R2PG=9G+=FR0X&Az~}R|S}g!9+;tBh^0L<&@AMB3+u}p^U+>|GM|9t|e@Q?s zfeNI#|CnO}11*i3luT!&q^6xpKb?_zCX1QPI?GPQxIB!L%>x97U(Gw8$;BZT5kmvp z72GT7Ts#gc5ogrQ37@O7$&3$KW2fLftvjE%>jwiag8v@)T@I@PE64=LAx9V z0>u7(BWkYF=p65GvSu%;_Ndb8L`epL@Kt`256RsUu$dEPmFZrP)HYvp!ovy7;1L7`BSd_clmN$Yn)QX@%nKAE!hiZtLkrzFRpr zVk-#I2;-x{B$UXE+(KM!?BOLTygAZrjVYR4!YhrBNV z#^zuw9+fjsz&V%2{+EDVn898|z~DK zD#y?koYBfUJ>n`mamuQl){)2QF_(kRIF`DMQM_r+B%Dz{d9p#=7U1q4cO~4hfe?Dt zD`bBpVVhS@L}{aL0ejGY!D7tXR??s_P*gE8xIs{T2qe(=-+m;J#;d8xBOyee8Hh#1;pM}%l6Jrs81hu zT=LbQ$ZH%P&a>fOv8pfmySs4 bPrevvvb{B-5HOAz^AoDagQUiKIQaZ;^dJBa diff --git a/source-linux/images/smileys/sad/sigh.gif b/source-linux/images/smileys/sad/sigh.gif deleted file mode 100644 index 686022664cdb9c64246fa055560cb159431487a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 748 zcmZ?wbhEHbbg`M$!g>bxOg z5n2pdV(hMb>Z(#cep(V*{35O@9Bh(o94bmOa%w`NuAE#vDm+}AGOP-+f*R!v%;L-p z5^@U4>|0#8S>;)|r8BiO4!EcZsEP3lZ9W~RCCn}&x+Tlg%k7SnBiOn8Am_3(Ff*_+ zZ~~nxabRkeYe;Ix>PZEiE^1-3mx-*D60&X&6+l+ZgrZooL%SEKSSzd>tk`ies$xc{ zVllAEiV%~H!diifSDA%E9H9(x1YD_uXr`;p+7S0elPvz|%=elqvP-MM3dOw$rR`a+ zGFoBWi#F|$(wl#TC5<_ERR~t45(hx0uIyN?oE++4)$hK1%88FNI?noG^_u7b(Ii(L kkmAg*jv&P%oK@?ZkOKi0VxkA8Cc0i(fiPCY5~R`^08feIga7~l diff --git a/source-linux/images/smileys/smoking/smoking.gif b/source-linux/images/smileys/smoking/smoking.gif deleted file mode 100644 index 77720b17322f4baecc60aed8c4696b99fe1de7fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2288 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 EUo0j+!2kdN diff --git a/source-linux/images/smileys/sport/basketball.gif b/source-linux/images/smileys/sport/basketball.gif deleted file mode 100644 index e9ad4b57b9901179137f01f284261b1aeb676852..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8378 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 diff --git a/source-linux/images/smileys/sport/bowling.gif b/source-linux/images/smileys/sport/bowling.gif deleted file mode 100644 index 0f8300c930372e9b3771edaf08a3ffed48f4da6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3562 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 diff --git a/source-linux/images/smileys/sport/cycling.gif b/source-linux/images/smileys/sport/cycling.gif deleted file mode 100644 index 332081e83fef0956bafe5e9a38b63c0c23b5541b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1883 zcmd^9Yfuwc6kZesgE8QXXw@!SO;rpF*4836#t_+11q&%VwUllMO9_NsCP`uG6eiS; ztAus}R$!!btw5opQfBU27?w&c{ zIp^N{?KgLCnr7X~XLV0P2@r!rf=MJ22(n70Qi+6-N^LTk%nCsWf-n+^Otu}uA)8c+ zAWbPLDGG%`Vvwj*DilSx%VY`#DdcVXQ)dR3Qd~1jlg< z>(uM@Z752TQU#;H@vh?HVv3?@T87r4ofuYCg_M_C+0)TMgY7bVkKN&LfF^`zS%+ibu+YFNoK7d}W{$?(XKe zi=Y#8cpRV$ce`1a%XN|CPMtdCa`^y9c{~oTp99BepUc(P*XJ5^0XM_*e7}(Fwe!4x zaM0!Fd9T+Cc$Oa$f&dtB1iap%A>QZnd568=A~!5}p9=uk@Am_+%%`{BX-jfF2R?K&(F@YwN1eOXS|};6pxL>=`cCBP+TSCm z{^+TjmGs^mI?3L*W(ijN<}B0-H770a|736axzo*$h5ce#yk>@#g_lpRGK?(zrZ&B4 zN>zGdhjyn{w&{zVQ%m|g7rU!3pWm^x{?JS=Sv=Yh3C)i^w@KU*Cco63-u6+htLb`r z4Y5~#$5yPw->SxDZ@H2*{QZfU>fQaeLuI;#=oM3PA($f0KycLAubuEuXV^s1^wmd) zdQXp+c%HN3!IHjkN_MtYdct@o3mP zhv~{UB(GSA%`aL;{#^WYbPSX#-{0C2N9OkYC0%K+C^r~8W9ZYB5!3R%j7`iqXCGP&t8z$Z;OFFCDNL}h5eGF z-|cHLPdxd#ri)y?vD`NyV)x_G%_+LF&F*b&4fE#Klm=v+c`ErDHRTs4}^pDit_heK8|T zou=?h{>}^5kb1dTw3edb6$l~( z1Yx1bcsMgdELxAG!HG&CsZwSrQSu?SR*Mwp~5u&%6(5X3T& zaG}9S2n~OV`;e;+HW9BG%of5VurDV}AuZ&Pa4`rUp~}p#nb=^#^hm-Vp!* diff --git a/source-linux/images/smileys/sport/darts.gif b/source-linux/images/smileys/sport/darts.gif deleted file mode 100644 index 09fb6ea99875a92b3cd753ab48263ea0f0eed7ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7103 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 YMf{&ROZwmbi7?)dzvt|P<*eoZ10<#4ssI20 diff --git a/source-linux/images/smileys/sport/fencing.gif b/source-linux/images/smileys/sport/fencing.gif deleted file mode 100644 index a4ec5cd3e9f1273817d8dfa01f41b56b4647bf60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11247 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 diff --git a/source-linux/images/smileys/sport/football.gif b/source-linux/images/smileys/sport/football.gif deleted file mode 100644 index c9fa6c5e21f99c8d384170786e960569a31efcf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1937 zcmZ?wbhEHb^k$G_*v!iS1RM+u0t^fiK*YhI$ibl~z~SWN)Y8&&?AWpY@8AFbuK54| ze~>ybQ2fvB=Nc01>=@u`q-Vg)2ozNO$-*hYz{{WmQUEfRf#u(Zlb);hTD(5Hd%9bq z1jnbj8CH^B+S3YRR&6;Ywl+w_^Zjq5;M|VHUJgs9_s8EH?6@#>oqNJojutgzF;%Jh zt0`gJHD$TMX+Nyg)OS3;9KJhDfGuzNPG^BHoX+Nzr4g0+)e^Pb-Q7$~CdJKRWfhej zqAWeLdNaK9I6@}3PBWe{dwIXcL>~r5rge5LQ|CJgGcD(~p0g^`e(mh_8yA(AM{VVu zxntLE`PG~ZJ*+!>m=eO+?3g2NMX-u&-*I5iyz|{k7ukBVxNb}nKKbynGmze@Xgc(#0Ts#)b>dvq#PNE<*^U}Iy9Pc!K^gA7$Zjc*j;Y zuFZ}yu9+I{7;rCHgz;->NvU@7j<}VVSQ^Eb33M@v6kAkX+Q@K1B5&2!gd0ZB7}Re( zJM!~q&u0JS#{S0`0yUebtg}7T*Za%aU7+63=vd|bK{sic_pL<{2{$CGlo{`BN)uZ+{F{k59puq}BbFNaCty%tDUWHq3zVu~inECmHl#1827Z+QtC7gIS zbm^Y8OEBFtNBi=+;DSb0-z6{J@-y(P)8d(MDzG7OR@lR+7r$RJH8RX+4k=KL`t)Si z^xJt?7R*@PX164H`nCXl(nzQFqREK4Em?-Pu{O6CSHVvMB4IEOt{Cpp?1O zvOopyCf=D_x9^Z&y~dW2iMb*hRNP(y7Pnir&R%(ZSLJCYo`+{SJuXZWK76z1w%iF{ zhQ7XsJblbf&xLNhI`;PNdv4|fjojkrV}%u8c6@v-pwPg`AfW8UV)4FVG4p3O4TJXe zjdn>B-t1yoV4)x9R)65a+h_r!Qzsh4eY&6~FIEc4-B z;ICz$lWB5i%VNgM%On?wHMlDJ11L8a30#}!U8Nt q|0!xDYbqES7#J!fRVpY2=Vs<)rs}$XD=Ep$Q&K1?N-Rrdum%9^EhS9= diff --git a/source-linux/images/smileys/sport/golf.gif b/source-linux/images/smileys/sport/golf.gif deleted file mode 100644 index 179fc52d11e2d94854105433f94d65a8d463873e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2399 zcmeIyX*3(?8VB$gl?35PY!O5fMZ^|c1VJK_NDxU=yGqp{wD#C(D7Ds7r`mC=XgamD z)v6wrc63>zuZrE=EMDVpY!|vob!L5|I1*~iMGLJ00+Rw z5`bi&GBQx$0Vq%g3X*{VfiMtI87u)(m6KJKms69MQ-{c_D?s3i3OcX@NEi^Q4AO)u zX~AIH%F0L;6{M<)4qP3rC~JrWp%EGw1md73;-I#czP6SDQd=LTV{Zn=VbC}X#zgO+ znSs6;4u{7Y;IUY92}7*8sfo3T3BkX-PE46V1(SEzIpKE$po?rmU_GA)?LLxa!I5@aCI?$XPX--Z|vK+@no=$cW z1Sn+2tCGoNI+@ILp}N!Q?hFZr2ZO<8y0V!}Po}FUi^Xww<9c}T*leDsrx%Cg#g*WC zA3EeC!Q=URd-;2N2m1O3`TGY21n>g_jvfg-#^;BHgoJ!HZ~zHE+IZ%n2?Yt6ecAmrX(k)rlh2%rlzH(rAwrzXQZcRW@Mbq%oK@4pk+K@ zk8r+F=}tZT`ytK!O>|aP*8cwfmv{RA{0|a9@5{4khj~;Ahh|}lmzI*OK<^xo#Q;hG z#$VQbsR;nQ2hfz&a&4)5m;+YE1wLuH{3u^ZmsRb0TijO+w~U;7a{J0a8H!q@#cchS zSqeNngr5&1ywC za}ca;J?H89%+#rdmp20Aj-8e#tc~2_u6Aa0jbgc#7N6Nm z0i5;u+aLuUZzImeVsGwCjQ%qG)@&E)jd#7h($?VBi&dp1)v3lmRMhyjpKIz|5|20X z??xM^w`b2b$2_Vj3~2jh=4SHN+R$cl_!OUK+8dR1Heo?6#*A;;wzG9>yvZkd7;Hy- zJ8?;=+{@3Z`%^DTN^@H=BbfYGMvDI=Bb-&w*(?3|z-pp-i{NZ_nF6)KI0ClhTx#rA zBdm(mdtPM)y}9;HLdf$PGtpPghQeh^1yLbsdl~kYD_ta}hh7_vph)N81+R)8a>k0i zLC)_Y8*lhE@{RIT!Cp|mJMemM>%u!xhauWOusrOcP2#GgHkPWf`U%Fp?Dw5sgX-cV zr6SFlN>-|w@3V4rS98YQ7TS<^ISc`$wKl zZJn59F+NV5Nj6-$oF5#5w`)mxy)<~mt(N^==lj*^JICJ)f7kW#*ZD`9#bv|eol^AW zIBAF4*Q7N1%1fU0Er-2NbSbGnPYUw4~+?*|KeNAmasT>1byu8{lW~i0ci0*GVp1gVU2Gew5!=VGVeg zFGd2v@Luvg3m`S55aDa}Gr9z2lzc|h!Z)&Vuad^T9WasCv9uv|wG$qE3vDnI!k zPoMGafaf7rUIwQEPfj2G_euW!jQ>Gxp&pXj9$PnTZ4g&ej`u?%w)KFO)Zkx!pPtZn zzwXu)RFZaX^>CR-a8ae)7}n=D_ra+|J3`cGv(3}{+C~?`eQO;iBm1tmhEBDLWDt{G z=dlmFNvpqE4_ejxKQ7!?tg%hO{aAI#>)E&NHltx(|58BxHn`bS1G*>MYgY5wSgJ_E~@mstZhQXFO{jI#p*9gY2@44ujO#Cg;8KPv*V8BV%*Y$e#Fa5oREd91PgmoNc|3 z^P>^>Kbx#xtmApVduMBT{5t=|{m;TT+=YSUT09DX-a}(U3{e(%yano5Dhk7kiZ~Gw UYQp#+6h=g2P{R1&q)>qU9~*&15dZ)H diff --git a/source-linux/images/smileys/sport/horseriding.gif b/source-linux/images/smileys/sport/horseriding.gif deleted file mode 100644 index 13ca45030d00cd71bb7275a6782aa63398398a53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10489 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 Uo+7UwHCIu`SaazzbwLJe0FJ>jBLDyZ diff --git a/source-linux/images/smileys/sport/snooker.gif b/source-linux/images/smileys/sport/snooker.gif deleted file mode 100644 index fa2e6a840c5d19d8f4582c6e7fbdd0e42b928b71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11255 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 ITg(dl7rmL(!vFvP diff --git a/source-linux/images/smileys/sport/surfing.gif b/source-linux/images/smileys/sport/surfing.gif deleted file mode 100644 index b75d74b95d5c917beb427048001495b1e1cf612b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1639 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 diff --git a/source-linux/images/smileys/tired/hammock.gif b/source-linux/images/smileys/tired/hammock.gif deleted file mode 100644 index 8639dd32e9bc81e9c493bb0a41a51dfafa2ff8bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8317 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 diff --git a/source-linux/images/smileys/tired/yawn.gif b/source-linux/images/smileys/tired/yawn.gif deleted file mode 100644 index d4514801c4f814c28b13de9c5bd192d700a2be9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1745 zcmd^ejs|7(X2!h|Q=6Nya{k+(s){DF13RJ3jy%Izx75c82okCpo#9hjX$a)pHCuAQp-Vpa#&Ppcz-|@oiXAs0Tlh z&~PMJ+I`K{ogAHbAHOhn;9}!D@5k{cd+QTkUGdP^&tIN}No7>Z^nfvZ8Q>C<#Ia%& zGlg(8j>;`&34xjAb~C~?;t1UuA>F)LN+Vw&4H(PNQOeW^Iz*~cb)L^qkqoo>at4z6 zZ7Lm>(ax~vJXc&le8a&wd48fCotS7qz4D4?iySl-PuF;1b1e$Pj(JeM@N{u$0RXZ9 zd$zg^o)DQ2ZW{ZGKoD`(Kp$9dfjEC#!fju@rW5)$zMuOKRFmtZ`H8x#$0p zdq;F#x7J3y^))t(FCy5fd88e1(BzCF=}$93%w&-j=0_?6i85BvlhCRzZ3-( zxnl42Y=yReRAhl&j+bfa$AJO3YvM;^zVk%C7(n>?0ZjjO06O}YfcU{tifAV-t_>dP z7E^WlrlYajH=4BH+arUPVW+a^r69Q+l~4?al^FA^cuA?zYPIB2x>>&Cb(pT~*bQmfD_9NCy7p6qU-2L$2b_iaQZsj*aY0y^Nn(k2aLf2>-D4| zlioY@BtgwkcSX&d4D(_?QRBBjiU##6mKD_e1Aso&xKw3ry0Sjx_tA(C5v9(Q1a?BP zziAN80%En${+@%IfGl(uK-RQd*Hf>*?vZrmfcAzGqhC2uTe+<-2tD`ShGP|{ABPFy zA0XwOWuoter<^hE@~urAmMcGrnhFh-CKJmPRhrR4lRck-CzzRxPxUQuS$?b2ka`4b+Xg@JDR6Ya-g&~9*N4(zAtG@BOKH*1t z>Mlk40JtJjQ;J85JCop$1{LIw6(jH*Ko`x{!(BS}Rb+LPPe+u_vJi?+hmOx$u=2Ur zo$gYVc5t7pJtnU6@2~s4|J=5u)A^@tcR==lTa-OK3`XG*c5FBe@r_N;K9agmO}&sk zHa&CO8*n|QSW-~G&I0s_=H9UKn6LCJSKp`RCMeFKyuBwF5?1V5yABBsUrCrxjvp|U RCz{0H-E$27Uw`6n{sHSew;2Ec diff --git a/source-linux/qml/configqml/SyncConfig.qml b/source-linux/qml/configqml/SyncConfig.qml deleted file mode 100644 index 7e0378d..0000000 --- a/source-linux/qml/configqml/SyncConfig.qml +++ /dev/null @@ -1,116 +0,0 @@ -// This file is part of Friendiqa -// https://git.friendi.ca/lubuwest/Friendiqa -// Copyright (C) 2020 Marco R. -// -// 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 . - -import QtQuick 2.11 -import QtQuick.Controls 2.12 -import "qrc:/qml/configqml" -import "qrc:/qml/genericqml" -import "qrc:/js/service.js" as Service - -Page{ - //color:"white" - width:root.width - height: root.height - - //height:root.height - Label { - text: qsTr("Sync Interval (0=None)") - font.pointSize: osSettings.bigFontSize - //visible: false - x: root.fontFactor*osSettings.bigFontSize; y: root.fontFactor*osSettings.bigFontSize; //width:35*mm;wrapMode: Text.Wrap - } - - Slider{ id: messageIntervalSlider - x:8*root.fontFactor*osSettings.bigFontSize; y: 4*root.fontFactor*osSettings.bigFontSize; - width: root.width-10*root.fontFactor*osSettings.bigFontSize; - height:2*root.fontFactor*osSettings.bigFontSize - value: globaloptions.hasOwnProperty("syncinterval")?globaloptions.syncinterval:0 - from: 0;to:120; stepSize: 15 - } - Rectangle{ - x: root.fontFactor*osSettings.bigFontSize; y:4*root.fontFactor*osSettings.bigFontSize; - width: 4*root.fontFactor*osSettings.bigFontSize; height: 2*root.fontFactor*osSettings.bigFontSize; - color: osSettings.dialogColor - radius: 0.5*mm - TextEdit{ - id: messageIntervalField - anchors.fill: parent - font.pointSize: osSettings.bigFontSize - verticalAlignment:TextEdit.AlignRight - color: osSettings.primaryTextColor - text:messageIntervalSlider.value - focus: true - selectByMouse: true - onTextChanged: { - Service.updateglobaloptions(root.db,"syncinterval",text); - if(osSettings.osType=="Android"){ - alarm.setAlarm(text); - } else if(osSettings.osType=="Linux" && text !=0){ - root.updateSyncinterval(parseInt(text)) - } - } - } - } - Label{x: 6*root.fontFactor*osSettings.bigFontSize; y: 4*root.fontFactor*osSettings.bigFontSize; - width: 2*root.fontFactor*osSettings.bigFontSize; height: 1.5*root.fontFactor*osSettings.bigFontSize; - font.pointSize: osSettings.bigFontSize - text:qsTr("Min.") - } - - ScrollView{ - width: root.width - height: root.height - 10*root.fontFactor*osSettings.bigFontSize; - y:7*root.fontFactor*osSettings.bigFontSize - clip:true - Column{ - width: parent.width - spacing:mm - SyncComponent{adapter:"Timeline"} - SyncComponent{adapter:"Replies"} - SyncComponent{ adapter:"DirectMessages"} - SyncComponent{ adapter:"Notifications"} - SyncComponent{ adapter: "Events"} - SyncComponent{adapter: "FriendRequests"} - } - } - -// MButton{ -// id:closeButton -// anchors.top: parent.top -// anchors.topMargin: osSettings.bigFontSize -// anchors.right: parent.right -// anchors.rightMargin: 1*mm -// width: 2*root.fontFactor*osSettings.bigFontSize; -// text: "\uf057" -// font.pointSize: osSettings.bigFontSize -// onClicked:{rootstackView.pop()} -// } -} diff --git a/source-linux/qml/genericqml/DrawerAccountComponent.qml b/source-linux/qml/genericqml/DrawerAccountComponent.qml deleted file mode 100644 index 3833bd2..0000000 --- a/source-linux/qml/genericqml/DrawerAccountComponent.qml +++ /dev/null @@ -1,256 +0,0 @@ -// This file is part of Friendiqa -// https://git.friendi.ca/lubuwest/Friendiqa -// Copyright (C) 2020 Marco R. -// -// 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 . - -import QtQuick 2.15 -import QtQuick.Controls 6.3 -import "qrc:/qml/genericqml" -import "qrc:/qml/newsqml" - -Item { - id: drawerAccountComponent - width: accountList.width - height: 17*root.fontFactor*osSettings.bigFontSize - function changeNews(typeRequest){ - newsSwipeview.stacktype=typeRequest; - if (newstabitem.newstypes.indexOf(typeRequest)<0){ - var component = Qt.createComponent("qrc:/qml/newsqml/NewsStack.qml"); - var newscomp = component.createObject(newsSwipeview,{"expectScreenUpdate":true}); - newsSwipeview.addItem(newscomp); - newstabitem.newstypes.push(typeRequest); - newsSwipeview.currentIndex=newsSwipeview.count; - addToolbutton(typeRequest) - newstabbar.currentIndex=newsSwipeview.count - }else{ - newsSwipeview.currentIndex=newstabitem.newstypes.indexOf(typeRequest); - newstabbar.currentIndex=newstabitem.newstypes.indexOf(typeRequest); - } - } - - - Label{ - y:0.5*root.fontFactor*osSettings.bigFontSize - width:parent.width - height: 1.5*osSettings.bigFontSize*root.fontFactor - verticalAlignment:Text.AlignBottom - font.pointSize: osSettings.bigFontSize - text: account.username - } - - Label{ - y:2*root.fontFactor*osSettings.bigFontSize - width:parent.width - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - text: "\uf021 " + qsTr("Refresh") - MouseArea{ - anchors.fill:parent - onClicked: { - login=account; - if(!wideScreen){leftDrawerAndroid.close()} - newstypeSignal("") -// updatenews.setDatabase(); -// updatenews.login(); -// updatenews.startsync(); - } - } - } - - Label{ - y:3.5*root.fontFactor*osSettings.bigFontSize - width:parent.width - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && newsSwipeview.stacktype=="Home" && newstab.newstabstatus=="Timeline" - text: "\uf1da " + qsTr("Timeline") - MouseArea{ - anchors.fill:parent - onClicked:{ - login=account; - if(!wideScreen){leftDrawerAndroid.close()} - changeNews("Home"); - currentnewstabstatus="Timeline"; - newstypeSignal("timeline") - } - } - } - - Label{ - y:5*root.fontFactor*osSettings.bigFontSize - width:parent.width - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && newsSwipeview.stacktype=="Home" && newstab.newstabstatus=="Conversations" - text: "\uf086 " + qsTr("Conversations") - MouseArea{ - anchors.fill:parent - onClicked:{ - login=account; - if(!wideScreen){leftDrawerAndroid.close()} - changeNews("Home"); - currentnewstabstatus="Conversations"; - newstypeSignal("conversation") - } - } - } - - Label{ - y:6.5*root.fontFactor*osSettings.bigFontSize - width:parent.width - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && newsSwipeview.stacktype=="Replies" - text: "\uf0ec " + qsTr("Replies") - MouseArea{ - anchors.fill:parent - onClicked:{ - login=account; - if(!wideScreen){leftDrawerAndroid.close()} - changeNews("Replies"); - //urrentnewstabstatus="Replies"; - newstypeSignal("replies") - } - } - } - - Label{ - y:8*root.fontFactor*osSettings.bigFontSize - width:parent.width - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && newsSwipeview.stacktype=="DirectMessages" - text: "\uf0e0 " + qsTr("Direct Messages") - MouseArea{ - anchors.fill:parent - onClicked:{ - login=account; - if(!wideScreen){leftDrawerAndroid.close()} - changeNews("DirectMessages") - //currentnewstabstatus="DirectMessages"; - } - } - } - - Label{ - y:9.5*root.fontFactor*osSettings.bigFontSize - width:parent.width - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && newsSwipeview.stacktype=="Favorites" - text: "\uf005 " + qsTr("Favorites") - MouseArea{ - anchors.fill:parent - onClicked:{ - login=account; - if(!wideScreen){leftDrawerAndroid.close()} - changeNews("Favorites") - //currentnewstabstatus="Favorites"; - newstypeSignal("favorites") - } - } - } - - Label{ - y:11*root.fontFactor*osSettings.bigFontSize - width:parent.width - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && newsSwipeview.stacktype=="Public Timeline" - text: "\uf0ac " + qsTr("Public Timeline") - MouseArea{ - anchors.fill:parent - onClicked:{ - login=account; - if(!wideScreen){leftDrawerAndroid.close()} - changeNews("Public Timeline") - currentnewstabstatus="Public Timeline"; - newstypeSignal("publictimeline") - } - } - } - - Label{ - y:12.5*root.fontFactor*osSettings.bigFontSize - width:parent.width - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && newsSwipeview.stacktype=="Groupnews" - text: "\uf0c0 " + qsTr("Group news") - MouseArea{ - anchors.fill:parent - onClicked:{ - login=account; - if(!wideScreen){leftDrawerAndroid.close()} - changeNews("Group News") - newstypeSignal("groupnews") - } - } - } - - Label{ - y:14*root.fontFactor*osSettings.bigFontSize - width:parent.width - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && newsSwipeview.stacktype=="Search" - text: "\uf002 " + qsTr("Search") - MouseArea{ - anchors.fill:parent - onClicked:{ - login=account; - if(!wideScreen){leftDrawerAndroid.close()} -// newsSwipeview.currentIndex=0; -// currentnewstabstatus="Search"; -// newstypeSignal("search") - var component = Qt.createComponent("qrc:/qml/genericqml/SearchDialog.qml"); - var searchItem = component.createObject(newstab,{"selfdestroying":true}); - searchItem.open() - } - } - } - - Label{ - y:15.5*root.fontFactor*osSettings.bigFontSize - width:parent.width - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - font.bold: account.username==login.username && newsSwipeview.stacktype=="Notifications" - text: "\uf0f3 " + qsTr("Notifications") - MouseArea{ - anchors.fill:parent - onClicked:{ - login=account; - if(!wideScreen){leftDrawerAndroid.close()} - changeNews("Notifications") - newstypeSignal("notifications") - } - } - } -} diff --git a/source-linux/CMakeLists.txt b/src/CMakeLists.txt similarity index 83% rename from source-linux/CMakeLists.txt rename to src/CMakeLists.txt index 6a79957..d4bde6d 100644 --- a/source-linux/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -13,7 +13,7 @@ if(CMAKE_VERSION VERSION_LESS "3.7.0") set(CMAKE_INCLUDE_CURRENT_DIR ON) endif() -find_package(Qt6 REQUIRED COMPONENTS Core Widgets Quick QuickControls2 Sql DBus NetworkAuth REQUIRED) +find_package(Qt6 REQUIRED COMPONENTS Core Widgets Quick QuickControls2 Sql DBus NetworkAuth Multimedia REQUIRED) qt_standard_project_setup() @@ -45,7 +45,9 @@ target_link_libraries(friendiqa PRIVATE Qt6::QuickControls2) target_link_libraries(friendiqa PRIVATE Qt6::Sql) target_link_libraries(friendiqa PRIVATE Qt6::DBus) target_link_libraries(friendiqa PRIVATE Qt6::NetworkAuth) +target_link_libraries(friendiqa PRIVATE Qt6::Multimedia) +#target_link_libraries(friendiqa PRIVATE Qt6::Svg) install(TARGETS friendiqa DESTINATION ${CMAKE_INSTALL_BINDIR}) -install(FILES images/de.manic.Friendiqa.desktop DESTINATION share/applications) -install(FILES images/de.manic.Friendiqa.svg DESTINATION share/icons/hicolor/scalable/apps) +install(FILES assets/de.manic.Friendiqa.desktop DESTINATION share/applications) +install(FILES assets/de.manic.Friendiqa.svg DESTINATION share/icons/hicolor/scalable/apps) diff --git a/src/application.qrc b/src/application.qrc new file mode 100644 index 0000000..a087343 --- /dev/null +++ b/src/application.qrc @@ -0,0 +1,141 @@ + + + qtquickcontrols2.conf + qml/friendiqa.qml + qml/newsqml/NewsStack.qml + qml/newsqml/NewsTab.qml + qml/newsqml/Newsitem.qml + qml/newsqml/MessageSend.qml + qml/newsqml/Conversation.qml + qml/newsqml/FriendicaActivities.qml + qml/newsqml/Hashtag.qml + qml/newsqml/NewsImage.qml + qml/newsqml/NewsVideo.qml + qml/newsqml/ContactPage.qml + qml/newsqml/NewsVideoLarge.qml + qml/newsqml/SmileyDialog.qml + qml/contactqml/FriendsTab.qml + qml/contactqml/GroupComponent.qml + qml/contactqml/ProfileComponent.qml + qml/contactqml/Contactlist.qml + qml/photoqml/PhotoComponent.qml + qml/photoqml/PhotogroupComponent.qml + qml/photoqml/PhotoTab.qml + qml/photoqml/ImageUploadDialog.qml + qml/genericqml/ImagePicker.qml + qml/genericqml/ImagePickerLinux.qml + qml/genericqml/IntentReceiver.qml + qml/genericqml/MButton.qml + qml/genericqml/LinuxSync.qml + qml/genericqml/BlueButton.qml + qml/genericqml/ContactComponent.qml + qml/genericqml/PermissionDialog.qml + qml/calendarqml/CalendarTab.qml + qml/calendarqml/CalendarDay.qml + qml/calendarqml/EventList.qml + qml/configqml/AccountPage.qml + qml/configqml/SyncConfig.qml + qml/configqml/SyncComponent.qml + qml/configqml/InfoBox.qml + qml/configqml/ConfigPage.qml + qml/configqml/OSSettingsAndroid.qml + qml/configqml/OSSettingsLinux.qml + js/image.js + js/photoworker.js + js/service.js + js/news.js + js/newsworker.js + js/helper.js + js/smiley.js + translations/friendiqa-it.ts + translations/friendiqa-it.qm + translations/friendiqa-de.qm + translations/friendiqa-de.ts + translations/friendiqa-es.qm + translations/friendiqa-es.ts + assets/defaultcontact.jpg + assets/folder-blue.png + common/filesystem.cpp + common/filesystem.h + common/friendiqa.cpp + common/uploadableimage.cpp + common/uploadableimage.h + common/xhr.cpp + common/xhr.h + qml/newsqml/MoreComments.qml + qml/newsqml/NewsPhotolist.qml + qml/genericqml/DrawerAccountComponent.qml + qml/configqml/LeftDrawerScrollview.qml + qml/genericqml/LeftDrawerLinux.qml + qml/genericqml/LeftDrawerAndroid.qml + qml/genericqml/DrawerAccountComponentContacts.qml + qml/contactqml/ProfileTab.qml + qml/contactqml/FriendsListTab.qml + qml/contactqml/GroupsListTab.qml + qml/calendarqml/EventListItem.qml + translations/friendiqa-hu.qm + translations/friendiqa-hu.ts + assets/Friendiqa.png + assets/Friendica_monochrome.png + qml/configqml/ConfigAppearancePage.qml + qml/configqml/ConfigStartPage.qml + qml/contactqml/ContactsSearchPage.qml + assets/Friendiqa.ico + qml/calendarqml/EventCreate.qml + qml/newsqml/BlockUser.qml + qml/newsqml/ReportUser.qml + qml/newsqml/MessageImageUploadDialog.qml + qml/configqml/AcceptRules.qml + translations/friendiqa-nl.qm + translations/friendiqa-nl.ts + qml/newsqml/NewsTabbutton.qml + qml/genericqml/RootStack.qml + assets/icons/bars.svg + assets/icons/bell.svg + assets/icons/calendar.svg + assets/icons/caret-down.svg + assets/icons/check.svg + assets/icons/envelope.svg + assets/icons/exchange.svg + assets/icons/globe.svg + assets/icons/home.svg + assets/icons/list.svg + assets/icons/pencil.svg + assets/icons/picture-o.svg + assets/icons/refresh.svg + assets/icons/search.svg + assets/icons/star.svg + assets/icons/times-circle.svg + assets/icons/trash.svg + assets/icons/users.svg + assets/icons/comments.svg + assets/icons/history.svg + assets/icons/sign-out.svg + assets/icons/address-card.svg + assets/icons/star-o.svg + assets/icons/cogs.svg + assets/icons/paper-plane-o.svg + assets/icons/font.svg + assets/icons/hashtag.svg + assets/icons/code.svg + assets/icons/italic.svg + assets/icons/bold.svg + assets/icons/smile-o.svg + assets/icons/frown-o.svg + assets/icons/chevron-down.svg + assets/icons/chevron-up.svg + assets/icons/user-plus.svg + assets/icons/filter.svg + assets/icons/plus.svg + assets/icons/cloud-upload.svg + assets/icons/cloud-download.svg + assets/icons/repeat.svg + assets/icons/times.svg + assets/icons/play.svg + assets/icons/angle-right.svg + assets/icons/angle-left.svg + assets/icons/floppy-o.svg + assets/icons/unlock.svg + assets/icons/lock.svg + + diff --git a/source-linux/images/Friendica_monochrome.png b/src/assets/Friendica_monochrome.png similarity index 100% rename from source-linux/images/Friendica_monochrome.png rename to src/assets/Friendica_monochrome.png diff --git a/source-linux/images/Friendiqa.ico b/src/assets/Friendiqa.ico similarity index 100% rename from source-linux/images/Friendiqa.ico rename to src/assets/Friendiqa.ico diff --git a/source-linux/images/Friendiqa.png b/src/assets/Friendiqa.png similarity index 100% rename from source-linux/images/Friendiqa.png rename to src/assets/Friendiqa.png diff --git a/source-linux/images/de.manic.Friendiqa.desktop b/src/assets/de.manic.Friendiqa.desktop similarity index 100% rename from source-linux/images/de.manic.Friendiqa.desktop rename to src/assets/de.manic.Friendiqa.desktop diff --git a/source-linux/images/de.manic.Friendiqa.svg b/src/assets/de.manic.Friendiqa.svg similarity index 100% rename from source-linux/images/de.manic.Friendiqa.svg rename to src/assets/de.manic.Friendiqa.svg diff --git a/src/assets/de.manic.friendiqa.metainfo.xml b/src/assets/de.manic.friendiqa.metainfo.xml new file mode 100644 index 0000000..9890464 --- /dev/null +++ b/src/assets/de.manic.friendiqa.metainfo.xml @@ -0,0 +1,35 @@ + + + de.manic.friendiqa + + Friendiqa + Qt client for the social network Friendica + + FSFAP + GPL-3.0-or-later + + + pointing + keyboard + touch + + + +

    + Qt based client for the Friendica Social Network. Tabs for news (incl. Direct Messages), friends, photos and events. +

    +
    + + de.manic.Friendiqa.desktop + + + https://friendiqa.ma-nic.de/ScreenshotsDesktop/Screenshot_Desktop_Timeline_small.png + + + https://friendiqa.ma-nic.de/Screenshots/PhotoTab.jpg + + + https://friendiqa.ma-nic.de/Screenshots/EventsTab.jpg + + +
    diff --git a/source-linux/images/defaultcontact.jpg b/src/assets/defaultcontact.jpg similarity index 100% rename from source-linux/images/defaultcontact.jpg rename to src/assets/defaultcontact.jpg diff --git a/source-linux/images/folder-blue.png b/src/assets/folder-blue.png similarity index 100% rename from source-linux/images/folder-blue.png rename to src/assets/folder-blue.png diff --git a/source-linux/images/friendica-tray-black.svg b/src/assets/friendica-tray-black.svg similarity index 100% rename from source-linux/images/friendica-tray-black.svg rename to src/assets/friendica-tray-black.svg diff --git a/source-linux/images/friendica-tray-white.svg b/src/assets/friendica-tray-white.svg similarity index 100% rename from source-linux/images/friendica-tray-white.svg rename to src/assets/friendica-tray-white.svg diff --git a/src/assets/friendiqa-sync.service b/src/assets/friendiqa-sync.service new file mode 100644 index 0000000..c736814 --- /dev/null +++ b/src/assets/friendiqa-sync.service @@ -0,0 +1,7 @@ +[Unit] +Description=Run friendiqa background sync + +[Service] +Type=oneshot +ExecStart=/usr/bin/friendiqa -service + diff --git a/src/assets/friendiqa-sync.timer b/src/assets/friendiqa-sync.timer new file mode 100644 index 0000000..c189795 --- /dev/null +++ b/src/assets/friendiqa-sync.timer @@ -0,0 +1,10 @@ +[Unit] +Description=Run background sync for Friendiqa periodically + +[Timer] +Unit=friendiqa-sync.service +OnBootSec=10min +OnUnitActiveSec=15min + +[Install] +WantedBy=timers.target diff --git a/src/assets/icons/address-card.svg b/src/assets/icons/address-card.svg new file mode 100644 index 0000000..dad3d3f --- /dev/null +++ b/src/assets/icons/address-card.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/angle-left.svg b/src/assets/icons/angle-left.svg new file mode 100644 index 0000000..a52814a --- /dev/null +++ b/src/assets/icons/angle-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/angle-right.svg b/src/assets/icons/angle-right.svg new file mode 100644 index 0000000..c19bd1a --- /dev/null +++ b/src/assets/icons/angle-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/bars.svg b/src/assets/icons/bars.svg new file mode 100644 index 0000000..e3a1572 --- /dev/null +++ b/src/assets/icons/bars.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/bell.svg b/src/assets/icons/bell.svg new file mode 100644 index 0000000..15114e5 --- /dev/null +++ b/src/assets/icons/bell.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/bold.svg b/src/assets/icons/bold.svg new file mode 100644 index 0000000..126b570 --- /dev/null +++ b/src/assets/icons/bold.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/calendar.svg b/src/assets/icons/calendar.svg new file mode 100644 index 0000000..1a57475 --- /dev/null +++ b/src/assets/icons/calendar.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/caret-down.svg b/src/assets/icons/caret-down.svg new file mode 100644 index 0000000..2fe29d6 --- /dev/null +++ b/src/assets/icons/caret-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/check.svg b/src/assets/icons/check.svg new file mode 100644 index 0000000..b9e3741 --- /dev/null +++ b/src/assets/icons/check.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/chevron-down.svg b/src/assets/icons/chevron-down.svg new file mode 100644 index 0000000..4ec5754 --- /dev/null +++ b/src/assets/icons/chevron-down.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/chevron-up.svg b/src/assets/icons/chevron-up.svg new file mode 100644 index 0000000..55b33d5 --- /dev/null +++ b/src/assets/icons/chevron-up.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/cloud-download.svg b/src/assets/icons/cloud-download.svg new file mode 100644 index 0000000..85f82ed --- /dev/null +++ b/src/assets/icons/cloud-download.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/cloud-upload.svg b/src/assets/icons/cloud-upload.svg new file mode 100644 index 0000000..ad5d266 --- /dev/null +++ b/src/assets/icons/cloud-upload.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/code.svg b/src/assets/icons/code.svg new file mode 100644 index 0000000..fa9d97c --- /dev/null +++ b/src/assets/icons/code.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/cogs.svg b/src/assets/icons/cogs.svg new file mode 100644 index 0000000..6ab59a3 --- /dev/null +++ b/src/assets/icons/cogs.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/comments.svg b/src/assets/icons/comments.svg new file mode 100644 index 0000000..1a001cd --- /dev/null +++ b/src/assets/icons/comments.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/ellipsis-v.svg b/src/assets/icons/ellipsis-v.svg new file mode 100644 index 0000000..0453758 --- /dev/null +++ b/src/assets/icons/ellipsis-v.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/envelope.svg b/src/assets/icons/envelope.svg new file mode 100644 index 0000000..9fc9706 --- /dev/null +++ b/src/assets/icons/envelope.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/exchange.svg b/src/assets/icons/exchange.svg new file mode 100644 index 0000000..26e717d --- /dev/null +++ b/src/assets/icons/exchange.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/filter.svg b/src/assets/icons/filter.svg new file mode 100644 index 0000000..545b4ae --- /dev/null +++ b/src/assets/icons/filter.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/floppy-o.svg b/src/assets/icons/floppy-o.svg new file mode 100644 index 0000000..728301b --- /dev/null +++ b/src/assets/icons/floppy-o.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/font.svg b/src/assets/icons/font.svg new file mode 100644 index 0000000..20ada19 --- /dev/null +++ b/src/assets/icons/font.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/frown-o.svg b/src/assets/icons/frown-o.svg new file mode 100644 index 0000000..4928c07 --- /dev/null +++ b/src/assets/icons/frown-o.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/globe.svg b/src/assets/icons/globe.svg new file mode 100644 index 0000000..5ddc3ab --- /dev/null +++ b/src/assets/icons/globe.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/hashtag.svg b/src/assets/icons/hashtag.svg new file mode 100644 index 0000000..2093029 --- /dev/null +++ b/src/assets/icons/hashtag.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/history.svg b/src/assets/icons/history.svg new file mode 100644 index 0000000..9fd8721 --- /dev/null +++ b/src/assets/icons/history.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/home.svg b/src/assets/icons/home.svg new file mode 100644 index 0000000..f9e993d --- /dev/null +++ b/src/assets/icons/home.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/italic.svg b/src/assets/icons/italic.svg new file mode 100644 index 0000000..bd6cf05 --- /dev/null +++ b/src/assets/icons/italic.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/list.svg b/src/assets/icons/list.svg new file mode 100644 index 0000000..0687a3d --- /dev/null +++ b/src/assets/icons/list.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/lock.svg b/src/assets/icons/lock.svg new file mode 100644 index 0000000..aa9a167 --- /dev/null +++ b/src/assets/icons/lock.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/paper-plane-o.svg b/src/assets/icons/paper-plane-o.svg new file mode 100644 index 0000000..dc8d6ef --- /dev/null +++ b/src/assets/icons/paper-plane-o.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/pencil.svg b/src/assets/icons/pencil.svg new file mode 100644 index 0000000..4138ff2 --- /dev/null +++ b/src/assets/icons/pencil.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/picture-o.svg b/src/assets/icons/picture-o.svg new file mode 100644 index 0000000..d287f37 --- /dev/null +++ b/src/assets/icons/picture-o.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/play.svg b/src/assets/icons/play.svg new file mode 100644 index 0000000..ab80037 --- /dev/null +++ b/src/assets/icons/play.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/plus.svg b/src/assets/icons/plus.svg new file mode 100644 index 0000000..deb2ca6 --- /dev/null +++ b/src/assets/icons/plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/refresh.svg b/src/assets/icons/refresh.svg new file mode 100644 index 0000000..e0548d5 --- /dev/null +++ b/src/assets/icons/refresh.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/repeat.svg b/src/assets/icons/repeat.svg new file mode 100644 index 0000000..f3ecc41 --- /dev/null +++ b/src/assets/icons/repeat.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/reply.svg b/src/assets/icons/reply.svg new file mode 100644 index 0000000..ac016c0 --- /dev/null +++ b/src/assets/icons/reply.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/search.svg b/src/assets/icons/search.svg new file mode 100644 index 0000000..35bb21b --- /dev/null +++ b/src/assets/icons/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/sign-out.svg b/src/assets/icons/sign-out.svg new file mode 100644 index 0000000..3e7d480 --- /dev/null +++ b/src/assets/icons/sign-out.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/smile-o.svg b/src/assets/icons/smile-o.svg new file mode 100644 index 0000000..6d4f680 --- /dev/null +++ b/src/assets/icons/smile-o.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/star-o.svg b/src/assets/icons/star-o.svg new file mode 100644 index 0000000..4152261 --- /dev/null +++ b/src/assets/icons/star-o.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/star.svg b/src/assets/icons/star.svg new file mode 100644 index 0000000..710cb95 --- /dev/null +++ b/src/assets/icons/star.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/times-circle.svg b/src/assets/icons/times-circle.svg new file mode 100644 index 0000000..d6787c1 --- /dev/null +++ b/src/assets/icons/times-circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/times.svg b/src/assets/icons/times.svg new file mode 100644 index 0000000..d02a36e --- /dev/null +++ b/src/assets/icons/times.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/trash.svg b/src/assets/icons/trash.svg new file mode 100644 index 0000000..8cb6ed0 --- /dev/null +++ b/src/assets/icons/trash.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/unlock.svg b/src/assets/icons/unlock.svg new file mode 100644 index 0000000..9cb4435 --- /dev/null +++ b/src/assets/icons/unlock.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/user-plus.svg b/src/assets/icons/user-plus.svg new file mode 100644 index 0000000..2575cf4 --- /dev/null +++ b/src/assets/icons/user-plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/users.svg b/src/assets/icons/users.svg new file mode 100644 index 0000000..96ceb0b --- /dev/null +++ b/src/assets/icons/users.svg @@ -0,0 +1,3 @@ + + + diff --git a/source-linux/common/alarm.h b/src/common/alarm.h similarity index 100% rename from source-linux/common/alarm.h rename to src/common/alarm.h diff --git a/source-linux/common/alarmandroid.cpp b/src/common/alarmandroid.cpp similarity index 100% rename from source-linux/common/alarmandroid.cpp rename to src/common/alarmandroid.cpp diff --git a/source-linux/common/alarmlinux.cpp b/src/common/alarmlinux.cpp similarity index 78% rename from source-linux/common/alarmlinux.cpp rename to src/common/alarmlinux.cpp index 5841543..b7b0846 100644 --- a/source-linux/common/alarmlinux.cpp +++ b/src/common/alarmlinux.cpp @@ -33,7 +33,7 @@ #include #include #include - +#include ALARM *ALARM::instance() { @@ -45,9 +45,19 @@ ALARM::ALARM(QObject *parent) : QObject(parent){} void ALARM::setAlarm(int interval) { - //qDebug() << interval; - QVariantMap message; - message["value"] = interval; + //QVariantMap message; + //message["value"] = interval; + if (interval==0){ + QProcess processDisable; + int intDisable = processDisable.execute("systemctl", QStringList() <<"--user"<<"disable"<<"--now"<<"friendiqa-sync.timer"); + qDebug() << " intEnable "<login(); updatenews->setSyncAll(true); updatenews->startsync(); - - //app.connect (updatenews,SIGNAL(quitapp()),&app,SLOT(quit())); + app.connect (updatenews,SIGNAL(quitapp()),&app,SLOT(quit())); //QtAndroid::androidService().callMethod("stopSelf"); - //return app.exec(); + return app.exec(); } else{ - //QtWebEngine::initialize(); - QGuiApplication::setApplicationName("Friendiqa"); - QGuiApplication::setOrganizationName("Friendiqa"); - QApplication app(argc, argv); QQmlApplicationEngine view; //view.setResizeMode(QQuickView::SizeRootObjectToView); - app.setWindowIcon(QIcon(":/images/Friendiqa.ico")); + app.setWindowIcon(QIcon(":/assets/Friendiqa.ico")); QTranslator qtTranslator; - qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations"); - app.installTranslator(&qtTranslator); + if(qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations")) + {app.installTranslator(&qtTranslator);} // RemoteAuthAsyncImageProvider *imageProvider = new RemoteAuthAsyncImageProvider; // view.addImageProvider("remoteauthimage",imageProvider); // view.rootContext()->setContextProperty("remoteauth", imageProvider); @@ -117,8 +116,8 @@ int main(int argc, char *argv[]) { qmlRegisterType("io.qt.examples.texteditor", 1, 0, "DocumentHandler"); qmlRegisterType("QSystemTrayIcon", 1, 0, "QSystemTrayIcon"); qRegisterMetaType("ActivationReason"); - view.rootContext()->setContextProperty("iconTrayBlack", QIcon(QPixmap(":/images/friendica-tray-black.svg"))); - view.rootContext()->setContextProperty("iconTrayWhite", QIcon(QPixmap(":/images/friendica-tray-white.svg"))); + view.rootContext()->setContextProperty("iconTrayBlack", QIcon(QPixmap(":/assets/friendica-tray-black.svg"))); + view.rootContext()->setContextProperty("iconTrayWhite", QIcon(QPixmap(":/assets/friendica-tray-white.svg"))); view.rootContext()->setContextProperty("iconTrayAvailable", QSystemTrayIcon::isSystemTrayAvailable()); if(updatenews->getStyle() != 0){ diff --git a/source-linux/common/oauth.cpp b/src/common/oauth.cpp similarity index 100% rename from source-linux/common/oauth.cpp rename to src/common/oauth.cpp diff --git a/source-linux/common/oauth.h b/src/common/oauth.h similarity index 100% rename from source-linux/common/oauth.h rename to src/common/oauth.h diff --git a/source-linux/common/remoteauthasyncimageprovider.cpp b/src/common/remoteauthasyncimageprovider.cpp similarity index 100% rename from source-linux/common/remoteauthasyncimageprovider.cpp rename to src/common/remoteauthasyncimageprovider.cpp diff --git a/source-linux/common/remoteauthasyncimageprovider.h b/src/common/remoteauthasyncimageprovider.h similarity index 100% rename from source-linux/common/remoteauthasyncimageprovider.h rename to src/common/remoteauthasyncimageprovider.h diff --git a/source-linux/common/updatenews.cpp b/src/common/updatenews.cpp similarity index 94% rename from source-linux/common/updatenews.cpp rename to src/common/updatenews.cpp index 8dae238..c894cd2 100644 --- a/source-linux/common/updatenews.cpp +++ b/src/common/updatenews.cpp @@ -91,10 +91,12 @@ void UPDATENEWS::setDatabase() int UPDATENEWS::getStyle() { - QSqlQuery syncquery("SELECT * FROM globaloptions",m_db); - while (syncquery.next()){ - if (syncquery.value(0).toString()=="view_darkmode"){ - return syncquery.value(1).toInt(); + if (m_db.open()){ + QSqlQuery syncquery("SELECT * FROM globaloptions",m_db); + while (syncquery.next()){ + if (syncquery.value(0).toString()=="view_darkmode"){ + return syncquery.value(1).toInt(); + } } } return 0; @@ -111,28 +113,28 @@ QJsonArray UPDATENEWS::getAccounts(QString filtername, QString filtervalue){ filterstring=" WHERE " + filtername + " = " + filtervalue; } else{ - filterstring=" WHERE " + filtername + " = '" + filtervalue +"'"; + filterstring=" WHERE " + filtername + " = '" + filtervalue +"'"; } } QSqlQuery query("SELECT * FROM config" + filterstring + " ORDER BY isActive ASC, username ASC",m_db); QJsonArray accountlist; while(query.next()){ { - QJsonObject accountData; - accountData.insert("server",query.value(0).toString()); - accountData.insert("username",query.value(1).toString()); - accountData.insert("password",query.value(2).toString()); - accountData.insert("imagestore",query.value(3).toString()); - accountData.insert("isActive",query.value(7).toString()); - QJsonArray m_permissions=query.value(7).toJsonArray(); - accountData.insert("permissions",m_permissions); - accountData.insert("token",QString(QByteArray::fromBase64(query.value(10).toByteArray()))); - QJsonDocument m_client; - if(query.value(12).toByteArray()!=""){ - m_client=QJsonDocument::fromJson(QByteArray::fromBase64(query.value(12).toByteArray())); - } - accountData.insert("client",m_client.object()); - accountlist.append(accountData); + QJsonObject accountData; + accountData.insert("server",query.value(0).toString()); + accountData.insert("username",query.value(1).toString()); + accountData.insert("password",query.value(2).toString()); + accountData.insert("imagestore",query.value(3).toString()); + accountData.insert("isActive",query.value(7).toString()); + QJsonArray m_permissions=query.value(7).toJsonArray(); + accountData.insert("permissions",m_permissions); + accountData.insert("token",QString(QByteArray::fromBase64(query.value(10).toByteArray()))); + QJsonDocument m_client; + if(query.value(12).toByteArray()!=""){ + m_client=QJsonDocument::fromJson(QByteArray::fromBase64(query.value(12).toByteArray())); + } + accountData.insert("client",m_client.object()); + accountlist.append(accountData); } } query.clear(); @@ -178,39 +180,39 @@ void UPDATENEWS::login() void UPDATENEWS::startsync() { - if (syncindex i(params); while(i.hasNext()) { i.next(); - qDebug() << "value" << i.value(); + //qDebug() << i.key() << "value" << i.value(); query.addQueryItem(i.key(), i.value()); } QUrl requrl(m_url+m_api); @@ -356,11 +356,13 @@ void XHR::onReplySuccess() { qDebug() << "!"; QHashIterator i(params); - while(i.hasNext()) { - i.next(); - qDebug() << i.key()<< " " << i.value(); - } - emit this->success(buffer, m_api); + // while(i.hasNext()) { + // i.next(); + // //qDebug() << i.key()<< " " << i.value(); + // } + //emit this->success(buffer, m_api); + emit success(buffer, m_api); + //emit this->error(m_downloadtype,m_url,m_api,1); buffer.clear(); // reply->deleteLater(); } diff --git a/source-linux/common/xhr.h b/src/common/xhr.h similarity index 100% rename from source-linux/common/xhr.h rename to src/common/xhr.h diff --git a/source-linux/js/friendworker.js b/src/js/friendworker.js similarity index 100% rename from source-linux/js/friendworker.js rename to src/js/friendworker.js diff --git a/source-linux/js/helper.js b/src/js/helper.js similarity index 99% rename from source-linux/js/helper.js rename to src/js/helper.js index e8fea06..2f030c1 100644 --- a/source-linux/js/helper.js +++ b/src/js/helper.js @@ -180,7 +180,7 @@ function updateData(database,table, username, key, value, callback,filter,filter function showMessage(header,message,rootwindow){//print(message); var cleanmessage=message.replace(/"/g,"-"); if(cleanmessage.length>200){cleanmessage=cleanmessage.slice(0,200)+'...'} - var messageString='import QtQuick 2.0; import QtQuick.Controls 2.15; Dialog{ visible: true; title:"'+header+'";standardButtons: Dialog.Ok;anchors.centerIn: parent;Label{text:" '+cleanmessage+'"}}'; + var messageString='import QtQuick 6.3; import QtQuick.Controls 2.15; Dialog{ visible: true; title:"'+header+'";standardButtons: Dialog.Ok;anchors.centerIn: parent;Label{text:" '+cleanmessage+'"}}'; var messageObject=Qt.createQmlObject(messageString,rootwindow,"messageOutput"); } diff --git a/source-linux/js/image.js b/src/js/image.js similarity index 100% rename from source-linux/js/image.js rename to src/js/image.js diff --git a/source-linux/js/news.js b/src/js/news.js similarity index 100% rename from source-linux/js/news.js rename to src/js/news.js diff --git a/source-linux/js/newsworker.js b/src/js/newsworker.js similarity index 100% rename from source-linux/js/newsworker.js rename to src/js/newsworker.js diff --git a/source-linux/js/photoworker.js b/src/js/photoworker.js similarity index 100% rename from source-linux/js/photoworker.js rename to src/js/photoworker.js diff --git a/source-linux/js/service.js b/src/js/service.js similarity index 97% rename from source-linux/js/service.js rename to src/js/service.js index daf7fac..a9b40d0 100644 --- a/source-linux/js/service.js +++ b/src/js/service.js @@ -312,7 +312,7 @@ function updateContactInDB(login,database,isFriend,contact){// for newstab and f } function processNews(api,data){ - try{var newslist=JSON.parse(data)} catch(e){print("processnews "+e+ " api "+ api + " data "+data);newsBusy.running=false;}; + try{var newslist=JSON.parse(data)} catch(e){print("processnews "+e+ " api "+ api + " data "+data)}; if (api=="/api/users/show"){ var usermessages=[]; usermessages.push(newslist.status); @@ -427,7 +427,7 @@ function processNews(api,data){ } } - if ((newstab.newstabstatus=="Conversations")&&!(api=="/api/conversation/show"|| api=="/api/direct_messages/conversation")){ + if ((root.globaloptions.hasOwnProperty("newsViewType") && (root.globaloptions.newsViewType=="Conversations"))&&!(api=="/api/conversation/show"|| api=="/api/direct_messages/conversation")){ //enrich chatlist with old entries for (var count in chatlist){ chatlist[count].currentconversation.reverse(); @@ -464,7 +464,7 @@ function processNews(api,data){ if (api=="/api/conversation/show"|| api=="/api/direct_messages/conversation"){ newslist.reverse(); - newstab.conversation=newslist + root.conversation=newslist } else if (api=="/api/statuses/user_timeline" || api=="/api/users/show"){ root.contactposts=newslist @@ -476,8 +476,10 @@ function processNews(api,data){ showNews(newslist);root.news=newslist }; - var newstabarray=["Conversations","Favorites","Timeline","DirectMessage","Replies"]; - if (newstabarray.indexOf(newstab.newstabstatus)>-1){contacttimer.start()} + //var newstabarray=["Conversations","Favorites","Timeline","DirectMessage","Replies"]; + //if (newstabarray.indexOf(newstab.newstabstatus)>-1){ + contacttimer.start() + //} } } @@ -546,10 +548,10 @@ function showGroups(){ Helperjs.readData(db,"groups",login.username,function(groups){ var groupitems=""; for (var i=0;i. -import QtQuick 2.11 -//import QtQuick.Controls 2.4 +import QtQuick 6.3 Item { id: calendarDay diff --git a/source-linux/qml/calendarqml/CalendarTab.qml b/src/qml/calendarqml/CalendarTab.qml similarity index 90% rename from source-linux/qml/calendarqml/CalendarTab.qml rename to src/qml/calendarqml/CalendarTab.qml index b19f11f..7daa5a1 100644 --- a/source-linux/qml/calendarqml/CalendarTab.qml +++ b/src/qml/calendarqml/CalendarTab.qml @@ -29,7 +29,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.15 +import QtQuick 6.3 import QtQuick.Controls 6.3 //import Qt.labs.calendar 1.0 @@ -98,13 +98,17 @@ Rectangle { running: false } - BlueButton{ + ToolButton{ z:2 + id:menuButton + anchors.right: parent.right + anchors.top: parent.top + //anchors.topMargin: friendsbar.height visible: !wideScreen - fontColor: "grey" - border.color: "transparent" - text: "\uf0c9" - font.pointSize: osSettings.bigFontSize + icon.name: "application-menu" + icon.source: "qrc:/assets/icons/bars.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize onClicked:{ leftDrawerAndroid.visible?leftDrawerAndroid.close():leftDrawerAndroid.open()} } @@ -127,8 +131,12 @@ Rectangle { anchors.topMargin: 0.5*mm anchors.right:calendartabstatusButton.left anchors.rightMargin:mm - //width: 2*root.fontFactor*osSettings.bigFontSize; - text:"\uf021" + display: AbstractButton.IconOnly + text: qsTr("refresh")//"\uf021" + icon.name: "view-refresh-symbolic" + icon.source: "qrc:/assets/icons/refresh.svg" + // background: Rectangle{color: osSettings.dialogColor; + // radius: 0.5*mm} onClicked: { calBusy.running=true; updatenews.setDatabase(); @@ -169,7 +177,12 @@ Rectangle { anchors.right:updateEvents.left anchors.rightMargin:mm width: 2*root.fontFactor*osSettings.bigFontSize; - text:"+" + display: AbstractButton.IconOnly + text: qsTr("add") + icon.name: "list-add" + icon.source: "qrc:/assets/icons/plus.svg" + // background: Rectangle{color: osSettings.dialogColor; + // radius: 0.5*mm} onClicked: { rootstackView.push("qrc:/qml/calendarqml/EventCreate.qml") } @@ -193,7 +206,7 @@ Rectangle { anchors.top: parent.top anchors.topMargin: 0.5*mm anchors.right: parent.right - anchors.rightMargin:2*mm + anchors.rightMargin:menuButton.width + mm width: Math.max(6*root.fontFactor*osSettings.bigFontSize,implicitWidth) text: calendartab.calendartabstatus=="Events"?qsTr("Events"):calendartabstatus Menu { @@ -229,10 +242,9 @@ Rectangle { delegate: Item{ width:Math.min(23*root.fontFactor*osSettings.bigFontSize,calendarView.width) - height: parent.height + height: calendarView.height Text{ font.bold: true - //Layout.fillWidth: true width: parent.width-root.fontFactor*osSettings.bigFontSize horizontalAlignment:Text.AlignHCenter color: osSettings.primaryTextColor @@ -242,7 +254,6 @@ Rectangle { Text{y:1.5*root.fontFactor*osSettings.bigFontSize width: parent.width-osSettings.bigFontSize text: Qt.locale().standaloneMonthName(model.month) - //Layout.fillWidth: true color: osSettings.primaryTextColor horizontalAlignment:Text.AlignHCenter font.pointSize: osSettings.systemFontSize @@ -250,7 +261,6 @@ Rectangle { DayOfWeekRow{y:3*root.fontFactor*osSettings.bigFontSize width: parent.width-root.fontFactor*osSettings.bigFontSize locale: monthgrid.locale - //Layout.fillWidth: true font.pointSize: osSettings.systemFontSize } diff --git a/source-linux/qml/calendarqml/EventCreate.qml b/src/qml/calendarqml/EventCreate.qml similarity index 75% rename from source-linux/qml/calendarqml/EventCreate.qml rename to src/qml/calendarqml/EventCreate.qml index 0c40c6a..8cb2b5e 100644 --- a/source-linux/qml/calendarqml/EventCreate.qml +++ b/src/qml/calendarqml/EventCreate.qml @@ -29,9 +29,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.12 -import QtQuick.Controls 1.4 as Oldcontrols +import QtQuick 6.3 +import QtQuick.Controls 6.3 +//import QtQuick.Controls 1.4 as Oldcontrols import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -41,7 +41,7 @@ Flickable{ id:eventCreateBox property date startDate: new Date() property var eventInformation: ({}) - anchors.fill: parent + //anchors.fill: parent contentWidth: eventRect.width; contentHeight: eventRect.height function formatText(count, modelData) { @@ -51,18 +51,23 @@ Flickable{ boundsBehavior:Flickable.StopAtBounds ScrollBar.vertical: ScrollBar { } + Rectangle{ id: eventRect width: root.width height: textColumn.height + 6*root.fontFactor*osSettings.bigFontSize color: osSettings.backgroundColor + MButton{ id:closeButton anchors.top: parent.top anchors.topMargin: 1*mm anchors.right: parent.right anchors.rightMargin: 1*mm - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" onClicked:{rootstackView.pop()} } @@ -89,7 +94,7 @@ Flickable{ 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])$ / } + validator: RegularExpressionValidator{regularExpression: /^([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 } @@ -99,7 +104,10 @@ Flickable{ y: root.fontFactor*osSettings.bigFontSize width: 2*root.fontFactor*osSettings.bigFontSize height: 2*root.fontFactor*osSettings.bigFontSize - text:"\uf0d7" + text: qsTr("Start date") + display: AbstractButton.IconOnly + icon.name: "expand" + icon.source: "qrc:/assets/icons/caret-down.svg" onClicked:{ cal.visible=true; cal.curSelection="start" @@ -116,7 +124,7 @@ Flickable{ 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])$ / } + validator: RegularExpressionValidator{regularExpression: /^([0-1\s]?[0-9\s]|2[0-3\s]):([0-5\s][0-9\s])$ / } font.bold: true } @@ -126,7 +134,10 @@ Flickable{ y: root.fontFactor*osSettings.bigFontSize width: 2*root.fontFactor*osSettings.bigFontSize height: 2*root.fontFactor*osSettings.bigFontSize - text:"\uf0d7" + text: qsTr("Start time") + display: AbstractButton.IconOnly + icon.name: "expand" + icon.source: "qrc:/assets/icons/caret-down.svg" onClicked:{ onClicked: {timeTumbler.visible=true;timeTumbler.curSelection="start"} } @@ -150,7 +161,7 @@ Flickable{ 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])$ / } + validator: RegularExpressionValidator{regularExpression: /^([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 } @@ -162,7 +173,10 @@ Flickable{ width: 2*root.fontFactor*osSettings.bigFontSize height: 2*root.fontFactor*osSettings.bigFontSize enabled: false - text:"\uf0d7" + text: qsTr("End date") + display: AbstractButton.IconOnly + icon.name: "expand" + icon.source: "qrc:/assets/icons/caret-down.svg" onClicked:{ cal.visible=true; cal.curSelection="end" @@ -179,7 +193,7 @@ Flickable{ 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])$ / } + validator: RegularExpressionValidator{regularExpression: /^([0-1\s]?[0-9\s]|2[0-3\s]):([0-5\s][0-9\s])$ / } font.bold: true } @@ -190,7 +204,10 @@ Flickable{ width: 2*root.fontFactor*osSettings.bigFontSize height: 2*root.fontFactor*osSettings.bigFontSize enabled: false - text:"\uf0d7" + text: qsTr("End time") + display: AbstractButton.IconOnly + icon.name: "expand" + icon.source: "qrc:/assets/icons/caret-down.svg" onClicked:{ onClicked: {timeTumbler.visible=true;timeTumbler.curSelection="end"} } @@ -201,21 +218,72 @@ Flickable{ 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 + + ListView{ + id: cal 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 + width: textColumn.width //12*root.fontFactor*osSettings.bigFontSize + height: 15*root.fontFactor*osSettings.bigFontSize + clip: true + snapMode: ListView.SnapOneItem + orientation: ListView.Horizontal + highlightRangeMode: ListView.StrictlyEnforceRange + property string curSelection: "start" + + model: CalendarModel {id:calendarModel + from: new Date() + to: new Date(new Date().valueOf()+93312000000) } + delegate: + Item{ + width:Math.min(23*root.fontFactor*osSettings.bigFontSize,cal.width) + height: parent.height + Text{ + font.bold: true + width: parent.width-root.fontFactor*osSettings.bigFontSize + horizontalAlignment:Text.AlignHCenter + color: osSettings.primaryTextColor + text: model.year + font.pointSize: osSettings.systemFontSize + } + Text{y:1.5*root.fontFactor*osSettings.bigFontSize + width: parent.width-osSettings.bigFontSize + text: Qt.locale().standaloneMonthName(model.month) + color: osSettings.primaryTextColor + horizontalAlignment:Text.AlignHCenter + font.pointSize: osSettings.systemFontSize + } + DayOfWeekRow{y:3*root.fontFactor*osSettings.bigFontSize + width: parent.width-root.fontFactor*osSettings.bigFontSize + locale: monthgrid.locale + font.pointSize: osSettings.systemFontSize + } + + MonthGrid {y:5*root.fontFactor*osSettings.bigFontSize + id: monthgrid + height: parent.height-5*root.fontFactor*osSettings.bigFontSize + width: parent.width-root.fontFactor*osSettings.bigFontSize + month: model.month + year: model.year + locale: Qt.locale() + delegate: Button{ + width: root.fontFactor*osSettings.bigFontSize*3 + height: root.fontFactor*osSettings.bigFontSize*2 + enabled: model.month==monthgrid.month + text: model.day + font.underline: model.today + font.pointSize: 1.2*osSettings.systemFontSize + highlighted: model.today + onClicked:{if (cal.curSelection=="start"){ + textStartDate.text=Qt.formatDate(model.date, "dd-MM-yyyy"); + }else{ + textEndDate.text=Qt.formatDate(model.date, "dd-MM-yyyy"); + } + cal.visible=false}} + } + } + ScrollIndicator.horizontal: ScrollIndicator { } + Component.onCompleted: positionViewAtBeginning() } Frame { @@ -244,8 +312,10 @@ Flickable{ height: 2*root.fontFactor*osSettings.bigFontSize anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - - text:"\uf00c" + text: qsTr("Accept time") + display: AbstractButton.IconOnly + icon.name: "checkbox" + icon.source: "qrc:/assets/icons/check.svg" onClicked:{ if (timeTumbler.curSelection=="start"){ textStartTime.text=formatText(24,hoursTumbler.currentIndex)+":"+formatText(60,minutesTumbler.currentIndex); @@ -328,8 +398,8 @@ Flickable{ BusyIndicator{ id: eventCreateBusy - anchors.horizontalCenter: eventCreateBox.horizontalCenter - anchors.top:eventCreateBox.top + anchors.horizontalCenter: eventRect.horizontalCenter + anchors.top: eventRect.top anchors.topMargin: 2*root.fontFactor*osSettings.bigFontSize width:3*root.fontFactor*osSettings.bigFontSize height: 3*root.fontFactor*osSettings.bigFontSize @@ -339,6 +409,7 @@ Flickable{ MButton{ id:createEventButton text: qsTr("Create event") + width:textColumn.width onClicked:{ let startdatetext=textStartDate.getText(0,textStartDate.length); let startdate=new Date(startdatetext.substring(6,10)+"-"+startdatetext.substring(3,5)+"-"+startdatetext.substring(0,2)+"T"+textStartTime.text) diff --git a/source-linux/qml/calendarqml/EventList.qml b/src/qml/calendarqml/EventList.qml similarity index 91% rename from source-linux/qml/calendarqml/EventList.qml rename to src/qml/calendarqml/EventList.qml index aa17a10..5e9c865 100644 --- a/source-linux/qml/calendarqml/EventList.qml +++ b/src/qml/calendarqml/EventList.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -50,7 +50,10 @@ Rectangle{ anchors.right: parent.right anchors.rightMargin: 1*mm width: 2*root.fontFactor*osSettings.bigFontSize; - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" onClicked:{rootstackView.pop()} } @@ -61,7 +64,9 @@ Rectangle{ anchors.right:closeButton.left anchors.rightMargin:mm width: 2*root.fontFactor*osSettings.bigFontSize; - text:"+" + display: AbstractButton.IconOnly + icon.name: "list-add" + icon.source: "qrc:/assets/icons/plus.svg" onClicked: { rootstackView.push("qrc:/qml/calendarqml/EventCreate.qml",{"startDate": new Date(dayint*86400000)}) } diff --git a/source-linux/qml/calendarqml/EventListItem.qml b/src/qml/calendarqml/EventListItem.qml similarity index 92% rename from source-linux/qml/calendarqml/EventListItem.qml rename to src/qml/calendarqml/EventListItem.qml index 4db3d2d..0c602bf 100644 --- a/source-linux/qml/calendarqml/EventListItem.qml +++ b/src/qml/calendarqml/EventListItem.qml @@ -29,8 +29,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 +import QtQml 6.3 import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -53,7 +54,7 @@ Rectangle{ y:1 width: 7*mm height: 7*mm - onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} + onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/assets/defaultcontact.jpg"} } Text { id:eventNameText @@ -91,24 +92,23 @@ Rectangle{ anchors.right:parent.right anchors.rightMargin:mm width: 2*root.fontFactor*osSettings.bigFontSize; - text:"\uf1f8" + icon.name: "user-trash-symbolic" + icon.source: "qrc:/assets/icons/trash.svg" + // background: Rectangle{color: osSettings.dialogColor; + // radius: 0.5*mm} onClicked: { deleteDialog.eventid=event.id deleteDialog.open() } } - onClicked:{ + onClicked:{print (JSON.stringify(event)) if (status==""){ rootstackView.push("qrc:/qml/calendarqml/EventList.qml",{"dayint": event.startday, "events":[event]}); } else {rootstackView.pop()} } } - - - - Connections{ target: xhr function onSuccess(text,api){ diff --git a/source-linux/qml/configqml/AcceptRules.qml b/src/qml/configqml/AcceptRules.qml similarity index 98% rename from source-linux/qml/configqml/AcceptRules.qml rename to src/qml/configqml/AcceptRules.qml index ef96842..68e4107 100644 --- a/source-linux/qml/configqml/AcceptRules.qml +++ b/src/qml/configqml/AcceptRules.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.15 +import QtQuick 6.3 +import QtQuick.Controls 6.3 Dialog { id: rulesDialog diff --git a/source-linux/qml/configqml/AccountPage.qml b/src/qml/configqml/AccountPage.qml similarity index 97% rename from source-linux/qml/configqml/AccountPage.qml rename to src/qml/configqml/AccountPage.qml index 886d1f3..ec150f6 100644 --- a/source-linux/qml/configqml/AccountPage.qml +++ b/src/qml/configqml/AccountPage.qml @@ -33,7 +33,7 @@ import QtQuick 6.3 import QtCore 6.3 import QtQuick.Dialogs 6.3 import QtQuick.Controls 6.3 -import QtQuick.Layouts 1.12 +import QtQuick.Layouts import QtQml.Models 6.3 import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs @@ -90,7 +90,7 @@ Page{ login=userconfig; news=[]; contactlist=[]; - rootstack.currentIndex=0; + if(rootstackView.depth>1){rootstackSignal(0)} newstypeSignal("refresh"); },"isActive",0); Helperjs.showMessage(qsTr("Success"),qsTr("Name")+": "+credentials.display_name+"\nScreen Name: "+credentials.username,root) @@ -142,7 +142,7 @@ Page{ else if (obj.token!=''){accountPage.state='oauth'} },'username','"+ accountPage.users[i].username+"')}}" } - var menuString="import QtQuick.Controls 2.15;import 'qrc:/js/service.js' as Service;"+ + var menuString="import QtQuick.Controls 6.3;import 'qrc:/js/service.js' as Service;"+ " Menu {width:8*root.fontFactor*osSettings.bigFontSize;"+useritems+"}"; var userlistObject=Qt.createQmlObject(menuString,accountPage,"usermenuOutput") userlistObject.popup() } @@ -212,8 +212,10 @@ Page{ } } MButton { - text: "\uf150" - font.family: fontAwesome.name + text: qsTr("Method") + display: AbstractButton.IconOnly + icon.name: "expand" + icon.source: "qrc:/assets/icons/caret-down.svg" font.pointSize: osSettings.bigFontSize Menu { id:authMethodMenu @@ -236,7 +238,10 @@ Page{ MButton{ id:closeButton visible: users.length>0 - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" font.pointSize: osSettings.bigFontSize onClicked:{rootstackView.pop()} } @@ -265,7 +270,7 @@ Page{ } } } - FontLoader{id: fontAwesome; source: "qrc:/images/fontawesome-webfont.ttf"} + //FontLoader{id: fontAwesome; source: "qrc:/assets/fontawesome-webfont.ttf"} MButton{ id:serverSearchButton width: 3*root.fontFactor*osSettings.bigFontSize; height: 2.5*root.fontFactor*osSettings.bigFontSize @@ -551,7 +556,7 @@ Page{ login=userconfig; news=[]; contactlist=[]; - rootstack.currentIndex=0; + rootstackSignal(0); newstypeSignal("refresh"); },"isActive",0); Helperjs.showMessage(qsTr("Success"),"Screen Name: "+users[0].username,root) diff --git a/source-linux/qml/configqml/ConfigAppearancePage.qml b/src/qml/configqml/ConfigAppearancePage.qml similarity index 99% rename from source-linux/qml/configqml/ConfigAppearancePage.qml rename to src/qml/configqml/ConfigAppearancePage.qml index a758a2f..9525972 100644 --- a/source-linux/qml/configqml/ConfigAppearancePage.qml +++ b/src/qml/configqml/ConfigAppearancePage.qml @@ -29,9 +29,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.11 +import QtQuick 6.3 //import QtQuick.Dialogs 1.2 -import QtQuick.Controls 2.12 +import QtQuick.Controls 6.3 import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/configqml" @@ -184,7 +184,7 @@ Page{ } Column{ - //visible: osSettings.osType=="Android" + visible: osSettings.osType=="Android" x: root.fontFactor*osSettings.bigFontSize y: 26*root.fontFactor*osSettings.bigFontSize Label{ diff --git a/source-linux/qml/configqml/ConfigPage.qml b/src/qml/configqml/ConfigPage.qml similarity index 94% rename from source-linux/qml/configqml/ConfigPage.qml rename to src/qml/configqml/ConfigPage.qml index 7b762fb..5c8cbf0 100644 --- a/source-linux/qml/configqml/ConfigPage.qml +++ b/src/qml/configqml/ConfigPage.qml @@ -29,10 +29,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.11 -//import QtQuick.Dialogs 1.2 -import QtQuick.Layouts 1.11 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Layouts +import QtQuick.Controls 6.3 import "qrc:/js/service.js" as Service import "qrc:/qml/configqml" import "qrc:/qml/genericqml" @@ -84,7 +83,6 @@ Page{ StackLayout{ id:configTabView - //anchors.fill: parent width: wideScreen&&rootstackView.depth<2?parent.width-leftDrawer.width-mm:parent.width-mm//newstabitem.width/3*2:newstabitem.width x: leftDrawer.width y: configbar.height @@ -117,13 +115,14 @@ Page{ } MButton{ id:closeButton - // height: 2*root.fontFactor*osSettings.bigFontSize - //width: 2*root.fontFactor*osSettings.bigFontSize; anchors.top: parent.top anchors.topMargin:2*root.fontFactor*osSettings.bigFontSize anchors.right: parent.right anchors.rightMargin: 1*mm - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" font.pointSize: osSettings.bigFontSize onClicked:{rootstackView.pop()} } diff --git a/source-linux/qml/configqml/ConfigStartPage.qml b/src/qml/configqml/ConfigStartPage.qml similarity index 98% rename from source-linux/qml/configqml/ConfigStartPage.qml rename to src/qml/configqml/ConfigStartPage.qml index ac56145..123b786 100644 --- a/source-linux/qml/configqml/ConfigStartPage.qml +++ b/src/qml/configqml/ConfigStartPage.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.11 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 Page{ //anchors.fill: parent diff --git a/source-linux/qml/configqml/InfoBox.qml b/src/qml/configqml/InfoBox.qml similarity index 92% rename from source-linux/qml/configqml/InfoBox.qml rename to src/qml/configqml/InfoBox.qml index 010b346..354b74b 100644 --- a/source-linux/qml/configqml/InfoBox.qml +++ b/src/qml/configqml/InfoBox.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/qml/genericqml" Page{ @@ -48,7 +48,7 @@ Page{ "Privacy Policy:
    http://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md
    "+ "Code by Marco
    "+ "Qt Framework www.qt.io
    "+ - "Icons by FontAwesome
    "+ + "Icons by Fork Awesome
    "+ "AndroidNative by Ben Lau
    "+ "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/)" onLinkActivated:{ @@ -60,8 +60,10 @@ Page{ anchors.topMargin: root.fontFactor*osSettings.bigFontSize anchors.right: parent.right anchors.rightMargin: 1*mm - text: "\uf057" - font.pointSize: osSettings.bigFontSize + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" onClicked:{rootstackView.pop()} } } diff --git a/source-linux/qml/configqml/LeftDrawerScrollview.qml b/src/qml/configqml/LeftDrawerScrollview.qml similarity index 61% rename from source-linux/qml/configqml/LeftDrawerScrollview.qml rename to src/qml/configqml/LeftDrawerScrollview.qml index cd635d2..708df04 100644 --- a/source-linux/qml/configqml/LeftDrawerScrollview.qml +++ b/src/qml/configqml/LeftDrawerScrollview.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/qml/genericqml" import "qrc:/js/service.js" as Service @@ -42,72 +42,8 @@ ScrollView{ contentHeight: leftDrawerColumn.height property string currentnewstabstatus:root.globaloptions.hasOwnProperty("newsViewType")?root.globaloptions.newsViewType:"Conversations"; - Column{ - id:leftDrawerColumn - x:mm - y:0.5*root.fontFactor*osSettings.bigFontSize - width:parent.width-2*mm - height: 4*root.fontFactor*osSettings.bigFontSize - spacing: 0.7*root.fontFactor*osSettings.bigFontSize - Label{ - width:implicitWidth - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - text: "\uf085 "+ qsTr("Settings") - MouseArea{ - anchors.fill:parent - onClicked:{rootstackView.push("qrc:qml/configqml/ConfigPage.qml"); - if(!wideScreen){leftDrawerAndroid.close()} - } - } - } - - Label{y: 2*root.fontFactor*osSettings.bigFontSize - width:implicitWidth - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - text: "\uf2bb " + qsTr("Accounts") - MouseArea{ - anchors.fill:parent - onClicked:{rootstackView.push("qrc:qml/configqml/AccountPage.qml"); - if(!wideScreen){leftDrawerAndroid.close()} - } - } - } - - Label{y: 4*root.fontFactor*osSettings.bigFontSize - width:implicitWidth - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - text: "\uf08b " +qsTr("Quit") - MouseArea{ - anchors.fill:parent - onClicked:{ - Service.cleanNews(root.db,function(){ - Service.cleanHashtags(root.db,function(){ - Service.cleanContacts(root.login,root.db,function(){ - Qt.quit()}) - })}) - } - } - } - ListModel{id:accountModel} - Component{id:accountLoader - Loader{ - source: bar.currentIndex==0?"qrc:/qml/genericqml/DrawerAccountComponent.qml":"qrc:/qml/genericqml/DrawerAccountComponentContacts.qml" - } - } - ListView{ - id:accountList - y: 6.5*root.fontFactor*osSettings.bigFontSize - width:parent.width - height: contentHeight - model: accountModel - delegate: accountLoader - } - } - - Component.onCompleted:{ + function initialize(){ + accountModel.clear(); Service.readAllLogins(db,function(accounts){ if (accounts.length>0 && bar.currentIndex==0){ leftDrawerColumn.height=6.5*root.fontFactor*osSettings.bigFontSize+accounts.length*17*root.fontFactor*osSettings.bigFontSize @@ -120,5 +56,86 @@ ScrollView{ accountModel.append({"account":accounts[account]}) } } - })} + }) + } + + Column{ + id:leftDrawerColumn + x:mm + y:0.5*root.fontFactor*osSettings.bigFontSize + width:leftDrawerScrollviewId.width-2*mm + height: 4*root.fontFactor*osSettings.bigFontSize + spacing: 0.7*root.fontFactor*osSettings.bigFontSize + + ToolButton{ + font.pointSize: osSettings.systemFontSize + text: qsTr("Settings") + icon.name: "settings-configure" + icon.source: "qrc:/assets/icons/cogs.svg" + icon.height: root.fontFactor*osSettings.systemFontSize + icon.width: root.fontFactor*osSettings.systemFontSize +// background: Rectangle{color: osSettings.dialogColor; +// radius: 0.5*mm} + onClicked:{ + rootstackView.push("qrc:qml/configqml/ConfigPage.qml"); + if(!wideScreen){leftDrawerAndroid.close()} + } + } + ToolButton{ + y:2*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize + text: qsTr("Accounts") + icon.name: "addressbook-details" + icon.source: "qrc:/assets/icons/address-card.svg" + icon.height: root.fontFactor*osSettings.systemFontSize + icon.width: root.fontFactor*osSettings.systemFontSize +// background: Rectangle{color: osSettings.dialogColor; +// radius: 0.5*mm} + onClicked:{ + rootstackView.push("qrc:qml/configqml/AccountPage.qml"); + if(!wideScreen){leftDrawerAndroid.close()} + } + } + ToolButton{ + y:4*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize + text: qsTr("Quit") + icon.name: "system-log-out" + icon.source: "qrc:/assets/icons/sign-out.svg" + icon.height: root.fontFactor*osSettings.systemFontSize + icon.width: root.fontFactor*osSettings.systemFontSize +// background: Rectangle{color: osSettings.dialogColor; +// radius: 0.5*mm} + onClicked:{ + Service.cleanNews(root.db,function(){ + Service.cleanHashtags(root.db,function(){ + Service.cleanContacts(root.login,root.db,function(){ + Qt.quit()}) + })}) + } + } + ListModel{id:accountModel} + Component{id:accountLoader + Loader{ + source: bar.currentIndex==0?"qrc:/qml/genericqml/DrawerAccountComponent.qml":"qrc:/qml/genericqml/DrawerAccountComponentContacts.qml" + } + } + ListView{ + id:accountList + y: 6.5*root.fontFactor*osSettings.bigFontSize + width:leftDrawerColumn.width + height: contentHeight + model: accountModel + delegate: accountLoader + } + } + + Connections{ + target: root + function onLoginChanged(){ + initialize() + } + } + + Component.onCompleted:{initialize()} } diff --git a/source-linux/qml/configqml/OSSettingsAndroid.qml b/src/qml/configqml/OSSettingsAndroid.qml similarity index 98% rename from source-linux/qml/configqml/OSSettingsAndroid.qml rename to src/qml/configqml/OSSettingsAndroid.qml index 8777672..0f2cb34 100644 --- a/source-linux/qml/configqml/OSSettingsAndroid.qml +++ b/src/qml/configqml/OSSettingsAndroid.qml @@ -30,8 +30,8 @@ // along with this program. If not, see . import QtQuick.Window 2.0 -import QtQuick 2.0 -import QtQuick.Controls.Material 2.12 +import QtQuick 6.3 +import QtQuick.Controls.Material 6.3 QtObject{ property int appWidth: Screen.desktopAvailableWidth diff --git a/source-linux/qml/configqml/OSSettingsLinux.qml b/src/qml/configqml/OSSettingsLinux.qml similarity index 82% rename from source-linux/qml/configqml/OSSettingsLinux.qml rename to src/qml/configqml/OSSettingsLinux.qml index 1c1a8ea..4b4a624 100644 --- a/source-linux/qml/configqml/OSSettingsLinux.qml +++ b/src/qml/configqml/OSSettingsLinux.qml @@ -33,7 +33,8 @@ import QtQuick.Window 2.0 import QtQuick 6.3 import QtQuick.Controls 6.3 -QtObject{ +//QtObject{ +Item{ property real appWidth: Screen.desktopAvailableWidth/4*3 property real appHeight: Screen.desktopAvailableHeight/4*3 property int backKey: Qt.Key_Escape @@ -42,15 +43,15 @@ QtObject{ property int bigFontSize: systemFontSize*1.5 //property string attachImageDir:filesystem.homePath+"/Pictures/" property string imagePickQml: "ImagePickerLinux" - //SystemPalette { id: sysPalette; colorGroup: SystemPalette.Active } - //property SystemPalette name: value - property color backgroundColor: palette.window - property color backgroundDimColor: palette.button - property color primaryTextColor: palette.windowText - property color secondaryTextColor: palette.buttonText - property color dialogColor: palette.base - property color accentColor: palette.highlightedText - property color buttonColor: palette.button + SystemPalette { id: myPalette; colorGroup: SystemPalette.Active } + property color backgroundColor: myPalette.window + property color backgroundDimColor: myPalette.button + property color primaryTextColor: myPalette.windowText + property color secondaryTextColor: myPalette.buttonText + property color dialogColor: myPalette.base + property color accentColor: myPalette.highlight + property color buttonColor: myPalette.button + property color buttonText: myPalette.buttonText function setTheme(theme){ if (theme=="system"){ diff --git a/source-linux/qml/configqml/SyncComponent.qml b/src/qml/configqml/SyncComponent.qml similarity index 98% rename from source-linux/qml/configqml/SyncComponent.qml rename to src/qml/configqml/SyncComponent.qml index 388d72e..f58fa14 100644 --- a/source-linux/qml/configqml/SyncComponent.qml +++ b/src/qml/configqml/SyncComponent.qml @@ -30,8 +30,8 @@ // along with this program. If not, see . -import QtQuick 2.11 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/qml/configqml" import "qrc:/js/service.js" as Service diff --git a/source-linux/qml/genericqml/SearchDialog.qml b/src/qml/configqml/SyncConfig.qml similarity index 54% rename from source-linux/qml/genericqml/SearchDialog.qml rename to src/qml/configqml/SyncConfig.qml index 8a57e30..d23542f 100644 --- a/source-linux/qml/genericqml/SearchDialog.qml +++ b/src/qml/configqml/SyncConfig.qml @@ -1,5 +1,5 @@ // This file is part of Friendiqa -// https://github.com/lubuwest/Friendiqa +// https://git.friendi.ca/lubuwest/Friendiqa // Copyright (C) 2020 Marco R. // // This program is free software: you can redistribute it and/or modify @@ -29,50 +29,47 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.7 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 +import "qrc:/qml/configqml" import "qrc:/qml/genericqml" +import "qrc:/js/service.js" as Service -Dialog { - id: searchDialog -// width: 0.5*parent.width -// height: 0.5*parent.height - anchors.centerIn: parent - title: qsTr("Search") - standardButtons: Dialog.Ok | Dialog.Abort - modal: true - onAccepted: { +Page{ + width:root.width + height: root.height - } - onRejected: {close()} - property bool selfdestroying:true -/* anchors.left: parent.left - anchors.leftMargin:mm - anchors.top:parent.top - anchors.topMargin: 0.5*mm - width:parent.width-2*mm - height: 4*mm *///Math.max( searchText.contentHeight,5*mm) - - TextInput { - id: searchText - color: osSettings.primaryTextColor - focus: true + Switch{ + x:root.fontFactor*osSettings.bigFontSize; + y: root.fontFactor*osSettings.bigFontSize; font.pointSize: osSettings.bigFontSize - wrapMode: Text.Wrap - anchors.fill: parent - selectByMouse: true - cursorVisible: false - onAccepted:{ - if (displayText!=""){ - var component = Qt.createComponent("qrc:/qml/newsqml/NewsStack.qml"); - var newscomp = component.createObject(newsSwipeview,{"expectScreenUpdate":true}); - newsSwipeview.addItem(newscomp); - newsSwipeview.currentIndex=newsSwipeview.count; - currentnewstabstatus="Public Timeline"; - newscomp.search(displayText) - }; - if(selfdestroying){close()} + checked: globaloptions.hasOwnProperty("syncinterval")?(globaloptions.syncinterval>0):0 + text: qsTr("Backgound Sync") + onToggled: { + if(checked){ + alarm.setAlarm(15); + Service.updateglobaloptions(root.db,"syncinterval",15); + } else { + alarm.setAlarm(0); + Service.updateglobaloptions(root.db,"syncinterval",0); + } + } + } + + ScrollView{ + width: root.width + height: root.height - 10*root.fontFactor*osSettings.bigFontSize; + y:4*root.fontFactor*osSettings.bigFontSize + clip:true + Column{ + width: parent.width + spacing:mm + SyncComponent{adapter:"Timeline"} + SyncComponent{adapter:"Replies"} + SyncComponent{ adapter:"DirectMessages"} + SyncComponent{ adapter:"Notifications"} + SyncComponent{ adapter: "Events"} + SyncComponent{adapter: "FriendRequests"} } } - Component.onCompleted: searchText.forceActiveFocus() } diff --git a/source-linux/qml/contactqml/Contactlist.qml b/src/qml/contactqml/Contactlist.qml similarity index 94% rename from source-linux/qml/contactqml/Contactlist.qml rename to src/qml/contactqml/Contactlist.qml index 576d990..8c0b2cb 100644 --- a/source-linux/qml/contactqml/Contactlist.qml +++ b/src/qml/contactqml/Contactlist.qml @@ -30,8 +30,8 @@ // along with this program. If not, see . // List of people -import QtQuick 2.0 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -74,7 +74,7 @@ Rectangle { width: 5*mm height:5*mm source:(contact.profile_image!="")? "file://"+contact.profile_image : contact.profile_image_url - onStatusChanged: if (contactImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} + onStatusChanged: if (contactImage.status == Image.Error) {source="qrc:/assets/defaultcontact.jpg"} } Text{ font.pointSize: osSettings.bigFontSize @@ -116,8 +116,10 @@ Rectangle { anchors.topMargin: 1*mm anchors.right: parent.right anchors.rightMargin: 1*mm - //color:"white" - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" onClicked: { groupModelAppend(contacts,function(){ contactlistRectangle.destroy() diff --git a/source-linux/qml/contactqml/ContactsSearchPage.qml b/src/qml/contactqml/ContactsSearchPage.qml similarity index 83% rename from source-linux/qml/contactqml/ContactsSearchPage.qml rename to src/qml/contactqml/ContactsSearchPage.qml index 85dce63..74657c9 100644 --- a/source-linux/qml/contactqml/ContactsSearchPage.qml +++ b/src/qml/contactqml/ContactsSearchPage.qml @@ -29,9 +29,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.11 -import QtQuick.Controls 2.12 -import QtQuick.Layouts 1.11 +import QtQuick 6.3 +import QtQuick.Controls 6.3 +import QtQuick.Layouts import QtQuick.LocalStorage 2.0 import "qrc:/js/helper.js" as Helperjs import "qrc:/js/service.js" as Service @@ -39,9 +39,9 @@ import "qrc:/js/news.js" as Newsjs import "qrc:/qml/contactqml" import "qrc:/qml/genericqml" -Page{ +Item{ id: contactsSearchPage - + //background: Rectangle{color: osSettings.dialogColor; radius: 0.5*mm} function search(term){ contactSearchBusy.running=true; @@ -103,26 +103,43 @@ Page{ anchors.right: parent.right anchors.rightMargin: 1*mm width: 2*root.fontFactor*osSettings.bigFontSize; - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" onClicked: { rootstackView.pop() } } - - Search{ + TextField{ + id:searchBox y:0.5*root.fontFactor*osSettings.bigFontSize; x:1.5*root.fontFactor*osSettings.systemFontSize; - width:root.width-(7*root.fontFactor*osSettings.systemFontSize+mm); - height: 2.5*root.fontFactor*osSettings.systemFontSize; - color:osSettings.dialogColor - selfdestroying:false + width: parent.width-root.fontFactor*osSettings.bigFontSize*7 + height: root.fontFactor*osSettings.bigFontSize*2 + font.pointSize: osSettings.bigFontSize + Component.onCompleted: {searchBox.forceActiveFocus()} + onAccepted: searchButton.onClicked() + } + + MButton { + id: searchButton + anchors.top: parent.top + anchors.topMargin: 0.5*root.fontFactor*osSettings.bigFontSize + anchors.left: searchBox.right + anchors.leftMargin: 0.5*root.fontFactor*osSettings.bigFontSize + icon.name: "search" + icon.source: "qrc:/assets/icons/search.svg" + text: qsTr("Close") + display: AbstractButton.IconOnly + onClicked: {search(searchBox.text);} } BusyIndicator{ id: contactSearchBusy anchors.centerIn:parent - width:10*mm - height: 10*mm + width: 2*root.fontFactor*osSettings.bigFontSize + height: 2*root.fontFactor*osSettings.bigFontSize running: false } diff --git a/source-linux/qml/contactqml/FriendsListTab.qml b/src/qml/contactqml/FriendsListTab.qml similarity index 73% rename from source-linux/qml/contactqml/FriendsListTab.qml rename to src/qml/contactqml/FriendsListTab.qml index b7be66c..ace40ad 100644 --- a/source-linux/qml/contactqml/FriendsListTab.qml +++ b/src/qml/contactqml/FriendsListTab.qml @@ -29,9 +29,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.11 -import QtQuick.Controls 2.12 -import QtQuick.Layouts 1.11 +import QtQuick 6.3 +import QtQuick.Controls 6.3 +import QtQuick.Layouts import QtQuick.LocalStorage 2.0 import "qrc:/js/helper.js" as Helperjs import "qrc:/js/news.js" as Newsjs @@ -50,7 +50,7 @@ Item{ Helperjs.readData(db,"friendshiprequests",username,function(friendrequestsobject){ for (var i=0;i1){ + friendsobject[i].screen_name=friendsobject[i].screen_name+"+"+friendsobject[i].cid } - }); - Newsjs.listFriends(login,db,function(friendsobject){ - for (var i=0;i1){ - friendsobject[i].screen_name=friendsobject[i].screen_name+"+"+friendsobject[i].cid - } - friendsModel.append({"contact":friendsobject[i],"contactType":qsTr("Friends")}); - } - },(searchText.text==""?searchText.preeditText:searchText.text)); + friendsModel.append({"contact":friendsobject[i],"contactType":qsTr("Friends")}); + } + },(searchText.text==""?searchText.preeditText:searchText.text)); } function showContacts(contact){ @@ -81,9 +81,9 @@ Item{ 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]}); - } - },searchText.text,-1); + friendsModel.append({"contact":contactsobject[j]}); + } + },searchText.text,-1); } function showBlocked(contact){ @@ -94,9 +94,9 @@ Item{ 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]}); - } - }); + friendsModel.append({"contact":contactsobject[j]}); + } + }); } Connections{ @@ -105,7 +105,7 @@ Item{ if(type=="contactlist"){ friendsGridTab.currentContact=i+1; if(friendsGridTab.currentContact==root.newContacts.length){ - friendsGridTab.showFriends(root.login.username) + friendsGridTab.showFriends(root.login.username) } } } @@ -113,10 +113,15 @@ Item{ MButton { id: updateFriendsButton - text: "\uf021" + height: friendsCombo.height + text: qsTr("refresh") + display: AbstractButton.IconOnly + icon.name: "view-refresh-symbolic" + icon.source: "qrc:/assets/icons/refresh.svg" anchors.top: parent.top anchors.topMargin: mm - anchors.right: parent.right + anchors.left: friendsCombo.right + anchors.leftMargin: root.fontFactor*osSettings.systemFontSize onClicked: { try {friendsModel.clear()} catch(e){print(e)}; Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){}); @@ -126,8 +131,8 @@ Item{ updatenews.friendrequests(); //root.contactLoadType="friends"; Newsjs.requestFriends(root.login,db,root,function(nc){ - root.newContacts=nc - root.onNewContactsChanged(nc); + root.newContacts=nc + root.onNewContactsChanged(nc); }) } } @@ -137,38 +142,14 @@ Item{ width: friendsView.width height: 2*mm x: mm - y: updateFriendsButton.height+mm + y: 3.5*root.fontFactor*osSettings.bigFontSize visible: (friendsGridTab.currentContact!=(root.newContacts.length))?true:false value: friendsGridTab.currentContact/root.newContacts.length } - Rectangle { - id:searchComponent - x: mm; y:mm - color: osSettings.backgroundColor - radius:0.5*mm - width: 10*root.fontFactor*osSettings.bigFontSize - height: 2*root.fontFactor*osSettings.bigFontSize - TextField { - id: searchText - color: osSettings.primaryTextColor - focus: true - font.family: fontAwesome.name - font.pointSize: osSettings.systemFontSize - wrapMode: Text.Wrap - anchors.fill:parent - selectByMouse: true - cursorVisible: false - placeholderText: "\uf0b0" - onTextChanged: {showFriends(root.login.username)}//if (text.length>0) - onPreeditTextChanged: {{showFriends(root.login.username)}}//if (preeditText.length>0) - } - } - ComboBox{ id: friendsCombo - anchors.left: searchComponent.right - anchors.leftMargin: root.fontFactor*osSettings.bigFontSize + x: mm y: mm width: 6*root.fontFactor*osSettings.bigFontSize height: 1.5*root.fontFactor*osSettings.bigFontSize @@ -178,15 +159,43 @@ Item{ if (currentIndex === 0) { showFriends(root.login.username); } else - if (currentIndex===1){ - showContacts() - } else if (currentIndex===2){ - showBlocked() - } + if (currentIndex===1){ + showContacts() + } else if (currentIndex===2){ + showBlocked() + } } Component.onCompleted: {root.contactRefreshSignal.connect(onCurrentIndexChanged)} } + Rectangle { + id:searchComponent + anchors.top: friendsCombo.bottom + anchors.topMargin: mm + x: mm + //color: osSettings.backgroundColor + radius:0.5*mm + width: 10*root.fontFactor*osSettings.bigFontSize + height: 2*root.fontFactor*osSettings.bigFontSize + TextField { + id: searchText + //color: osSettings.primaryTextColor + focus: true + font.pointSize: osSettings.systemFontSize + wrapMode: Text.Wrap + anchors.fill:parent + selectByMouse: true + cursorVisible: false + onTextChanged: {showFriends(root.login.username)}//if (text.length>0) + onPreeditTextChanged: {{showFriends(root.login.username)}}//if (preeditText.length>0) + Image{ + source: "qrc:/assets/icons/filter.svg" + width: root.fontFactor*osSettings.bigFontSize + height: root.fontFactor*osSettings.bigFontSize + visible: searchText.text=="" + } + } + } Component { id: sectionHeading @@ -203,26 +212,17 @@ Item{ } } } - //GridView { - Component { id:headerComponent - Rectangle{ - color: osSettings.dialogColor + ToolButton{ + height: 2*root.fontFactor*osSettings.bigFontSize width:friendsView.width - height:6*mm - Text{ - color: osSettings.primaryTextColor - font.family: fontAwesome.name - font.pointSize: osSettings.bigFontSize - anchors.centerIn: parent - text:"\uf234" - } - MouseArea{ - anchors.fill:parent - onClicked:{ - rootstackView.push("qrc:/qml/contactqml/ContactsSearchPage.qml") - } + icon.name:"list-add-user" + icon.source: "qrc:/assets/icons/user-plus.svg" + icon.width: 2*root.fontFactor*osSettings.bigFontSize + icon.height: 2*root.fontFactor*osSettings.bigFontSize + onClicked:{ + rootstackView.push("qrc:/qml/contactqml/ContactsSearchPage.qml") } } } @@ -230,15 +230,12 @@ Item{ ListView{ id: friendsView x:mm - y:updateFriendsButton.height+2*mm + y: 3.5*root.fontFactor*osSettings.bigFontSize+3*mm width:friendsGridTab.width-2*mm height:friendsGridTab.height-(updateFriendsButton.height+10*mm) clip: true spacing: 2 - function processContactSelection(contactobject){showContactdetails(contactobject)} - //add: Transition { - // NumberAnimation { properties: "x,y"; from: 300; duration: 1000 } - // } + function processContactSelection(contactobject){showContactdetails(contactobject)} model: friendsModel delegate: ContactComponent { } header:headerComponent diff --git a/source-linux/qml/contactqml/FriendsTab.qml b/src/qml/contactqml/FriendsTab.qml similarity index 87% rename from source-linux/qml/contactqml/FriendsTab.qml rename to src/qml/contactqml/FriendsTab.qml index d163c73..ba45217 100644 --- a/source-linux/qml/contactqml/FriendsTab.qml +++ b/src/qml/contactqml/FriendsTab.qml @@ -29,9 +29,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.11 -import QtQuick.Controls 2.12 -import QtQuick.Layouts 1.11 +import QtQuick 6.3 +import QtQuick.Controls 6.3 +import QtQuick.Layouts import QtQuick.LocalStorage 2.0 import "qrc:/js/helper.js" as Helperjs import "qrc:/js/news.js" as Newsjs @@ -44,18 +44,20 @@ Rectangle { color: osSettings.backgroundColor function showContactdetails(contact){ - // rootstack.currentIndex=0; - // bar.currentIndex=0; root.contactdetailsSignal(contact) } - BlueButton{ + ToolButton{ + id:menuButton z:2 + anchors.right: parent.right + anchors.top: parent.top + anchors.topMargin: friendsbar.height visible: !wideScreen - fontColor: "grey" - border.color: "transparent" - text: "\uf0c9" - font.pointSize: osSettings.bigFontSize + icon.name: "application-menu" + icon.source: "qrc:/assets/icons/bars.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize onClicked:{ leftDrawerAndroid.visible?leftDrawerAndroid.close():leftDrawerAndroid.open()} } @@ -71,17 +73,17 @@ Rectangle { TabButton { text: qsTr("Me") font.pointSize: osSettings.systemFontSize - height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm + height: 1.7*root.fontFactor*osSettings.bigFontSize } TabButton { text: qsTr("Friends") font.pointSize: osSettings.systemFontSize - height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm + height: 1.7*root.fontFactor*osSettings.bigFontSize } TabButton { text: qsTr("Groups") font.pointSize: osSettings.systemFontSize - height: 1.7*root.fontFactor*osSettings.bigFontSize//7*mm + height: 1.7*root.fontFactor*osSettings.bigFontSize } } @@ -98,7 +100,6 @@ Rectangle { StackLayout{ id:friendsTabView - //anchors.fill: parent width: wideScreen&&rootstackView.depth<2?parent.width-leftDrawer.width-mm:parent.width-mm//newstabitem.width/3*2:newstabitem.width x: leftDrawer.width y: friendsbar.visible?friendsbar.height:0 diff --git a/source-linux/qml/contactqml/GroupComponent.qml b/src/qml/contactqml/GroupComponent.qml similarity index 93% rename from source-linux/qml/contactqml/GroupComponent.qml rename to src/qml/contactqml/GroupComponent.qml index 99d4e81..5988610 100644 --- a/source-linux/qml/contactqml/GroupComponent.qml +++ b/src/qml/contactqml/GroupComponent.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.11 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/js/helper.js" as Helperjs import "qrc:/js/news.js" as Newsjs import "qrc:/qml/genericqml" @@ -81,7 +81,10 @@ Item { anchors.right: parent.right anchors.margins: mm anchors.top: parent.top - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" font.pointSize: osSettings.bigFontSize onClicked:{groupComponent.state=""; if (group.new){groupsModel.remove(index)} @@ -90,7 +93,10 @@ Item { MButton{ id:infobutton - text:"?" + text: qsTr("Members") + display: AbstractButton.IconOnly + icon.name: "usermenu-down" + icon.source: "qrc:/assets/icons/times-circle.svg" font.pointSize: osSettings.bigFontSize anchors.right: parent.right anchors.rightMargin: mm diff --git a/source-linux/qml/contactqml/GroupsListTab.qml b/src/qml/contactqml/GroupsListTab.qml similarity index 58% rename from source-linux/qml/contactqml/GroupsListTab.qml rename to src/qml/contactqml/GroupsListTab.qml index 66478f2..9767d68 100644 --- a/source-linux/qml/contactqml/GroupsListTab.qml +++ b/src/qml/contactqml/GroupsListTab.qml @@ -29,9 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.11 -import QtQuick.Controls 2.12 -//import QtQuick.Layouts 1.11 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import QtQuick.LocalStorage 2.0 import "qrc:/js/helper.js" as Helperjs import "qrc:/js/news.js" as Newsjs @@ -45,12 +44,12 @@ Item{ function showGroups(username){ try {groupsModel.clear()} catch(e){print(e)}; Helperjs.readData(db, "groups",root.login.username,function(groupsobject){ - for (var j=0;j. -import QtQuick 2.0 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/qml/genericqml" import "qrc:/js/service.js" as Service @@ -117,7 +117,11 @@ Rectangle { anchors.top: parent.top anchors.topMargin: mm anchors.right: parent.right - text: "\uf021" + anchors.rightMargin: menuButton.width + text: qsTr("refresh") + display: AbstractButton.IconOnly + icon.name: "view-refresh-symbolic" + icon.source: "qrc:/assets/icons/refresh.svg" font.pointSize: osSettings.bigFontSize onClicked: { Service.requestProfile(root.login,root.db,root,function(nc){ @@ -150,40 +154,48 @@ Rectangle { width: 15*mm height:15*mm source: "file://"+profile.friendica_owner.profile_image - onStatusChanged: if (photoImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} + onStatusChanged: if (photoImage.status == Image.Error) {source="qrc:/assets/defaultcontact.jpg"} MouseArea{ anchors.fill: parent onClicked:{ imagePicking=true; - var imagePicker = Qt.createQmlObject('import QtQuick 2.0; import "qrc:/qml/genericqml";'+ + var imagePicker = Qt.createQmlObject('import QtQuick 6.3; import "qrc:/qml/genericqml";'+ osSettings.imagePickQml+'{multiple: false;onReady: {photoImage.source=imageUrl;'+ '}}',profileTab,"imagePicker"); imagePicker.pickImage() } } } - Rectangle{ - id:phototextRectangle - color:"black" - z:3 - opacity: 0.5 - width:6*mm - height: phototext.contentHeight - anchors.top: photoImage.top - anchors.right: photoImage.right - } - Text { - id:phototext +// Rectangle{ +// id:phototextRectangle +// color:"black" +// z:3 +// opacity: 0.5 +// width:6*mm +// height: phototext.contentHeight +// anchors.top: photoImage.top +// anchors.right: photoImage.right +// } +// Text { +// id:phototext +// z:4 +// font.family: fontAwesome.name +// text: "\uf040" +// width:5*mm +// anchors.top: photoImage.top +// anchors.right:photoImage.right +// color: "white" +// font.pointSize: 1.2*osSettings.bigFontSize +// } + Image{ z:4 - font.family: fontAwesome.name - text: "\uf040" - width:5*mm + source: "qrc:/assets/icons/pencil.svg" + width: root.fontFactor*osSettings.systemFontSize + height: root.fontFactor*osSettings.systemFontSize anchors.top: photoImage.top anchors.right:photoImage.right - color: "white" - font.pointSize: 1.2*osSettings.bigFontSize - } + } MButton{ id:updatebutton width: 8*root.fontFactor*osSettings.bigFontSize diff --git a/source-linux/qml/contactqml/ProfileTab.qml b/src/qml/contactqml/ProfileTab.qml similarity index 94% rename from source-linux/qml/contactqml/ProfileTab.qml rename to src/qml/contactqml/ProfileTab.qml index e13cbf9..b16d7b5 100644 --- a/source-linux/qml/contactqml/ProfileTab.qml +++ b/src/qml/contactqml/ProfileTab.qml @@ -29,11 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.11 -import QtQuick.Controls 2.12 -//import QtQuick.Controls.Styles 1.4 -//import QtQuick.Layouts 1.11 -//import QtQuick.LocalStorage 2.0 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/js/helper.js" as Helperjs import "qrc:/js/news.js" as Newsjs import "qrc:/js/service.js" as Service diff --git a/source-linux/qml/friendiqa.qml b/src/qml/friendiqa.qml similarity index 61% rename from source-linux/qml/friendiqa.qml rename to src/qml/friendiqa.qml index 8dc4ca3..13cee29 100644 --- a/source-linux/qml/friendiqa.qml +++ b/src/qml/friendiqa.qml @@ -29,12 +29,11 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.5 +import QtQuick 6.3 import QtQuick.LocalStorage 2.0 import QtQuick.Window 2.0 -import QtQuick.Controls 2.4 - -import QtQuick.Layouts 1.11 +import QtQuick.Controls 6.3 +import QtQuick.Layouts import QSystemTrayIcon 1.0 import "qrc:/js/news.js" as Newsjs import "qrc:/js/service.js" as Service @@ -53,8 +52,10 @@ ApplicationWindow{ property var login: Service.readActiveConfig(db) property real fontFactor: root.font.pixelSize/root.font.pointSize property var contactlist: [] + property var conversation: [] property real mm: osSettings.osType=="Android"?Screen.pixelDensity:Screen.pixelDensity*1.5 property bool wideScreen : width>height + signal rootstackSignal(int pageindex) signal fotoSignal(var username, var friend) signal directmessageSignal(var friend) signal newsSignal(var news) @@ -75,19 +76,22 @@ ApplicationWindow{ property var contactposts:[] property bool imagePicking: false + SystemPalette { id: myPalette; colorGroup: SystemPalette.Active } + property color backgroundColor: myPalette.window + function onLoginChanged(login){ if(login=="" || login==null){rootstackView.push("qrc:/qml/configqml/AccountPage.qml")} - else{ -// if (login.newsViewType!="" || login.newsViewType!=null){ -// newstab.newstabstatus=login.newsViewType;} + else{if(rootstackView.depth<1){rootstackView.push("qrc:/qml/genericqml/RootStack.qml")} + // if (login.newsViewType!="" || login.newsViewType!=null){ + // newstab.newstabstatus=login.newsViewType;} Newsjs.getCurrentContacts(login,db,function(contacts){ contactlist=contacts}) } } function onNewContactsChanged(newContacts){ if(newContacts.length>0){// download contact images and update db - var contacturls=[]; - var contactnames=[]; + var contacturls=[]; + var contactnames=[]; for (var link in newContacts){//print("new contact " +newContacts[link].screen_name); contacturls.push(newContacts[link].profile_image_url); contactnames.push(newContacts[link].screen_name); @@ -133,50 +137,47 @@ ApplicationWindow{ } } - FontLoader{id: fontAwesome; source: "qrc:/images/fontawesome-webfont.ttf"} - onClosing: { - if (rootstack.currentIndex==0){ - newstab.active=true; - if (newstab.newstabstatus!=globaloptions.newsViewType){ - newstab.newstabstatus=globaloptions.newsViewType; - if(globaloptions.newsViewType=="Timeline"){Newsjs.newsfromdb(db,login.username,0,function(dbnews){ - newsSignal(dbnews) - })} - else{ - Newsjs.chatsfromdb(db,login.username,0,[],function(dbnews){ - newsSignal(dbnews) - })} - close.accepted=false; - } + if (rootstackView.depth>1){ + rootstackView.pop(); + close.accepted=false + } + else if (bar.currentIndex==0){ + //newstab.active=true; + // if (newstab.newstabstatus!=globaloptions.newsViewType){ + // newstab.newstabstatus=globaloptions.newsViewType; + // if(globaloptions.newsViewType=="Timeline"){Newsjs.newsfromdb(db,login.username,0,function(dbnews){ + // newsSignal(dbnews) + // })} + // else{ + // Newsjs.chatsfromdb(db,login.username,0,[],function(dbnews){ + // newsSignal(dbnews) + // })} + // close.accepted=false; + // } - else if (newstab.conversation.length>0){ - newstab.conversation=[]; - close.accepted=false - } - else if (root.depth>1){ - root.pop(); - close.accepted=false - } - else{ - Service.cleanNews(root.db,function(){ - Service.cleanHashtags(root.db,function(){ - Service.cleanContacts(root.login,root.db,function(){ - if (osSettings.osType=="Android" || !iconTrayAvailable){ - Qt.quit() - } - else{ - systemTray.show(); - systemTray.showMessage("",qsTr("Background Sync\n Rightclick or Middleclick to Quit"),"",5000) - root.hide() - } - }) - })}) - close.accepted=true - } - } - else if (rootstack.currentIndex==2){fotoSignal(login.username,"backButton");close.accepted=false} - else {rootstack.currentIndex=0;close.accepted=false} + // if (newstab.conversation.length>0){ + // newstab.conversation=[]; + // close.accepted=false + // } + + Service.cleanNews(root.db,function(){ + Service.cleanHashtags(root.db,function(){ + Service.cleanContacts(root.login,root.db,function(){ + if (osSettings.osType=="Android" || !iconTrayAvailable){ + Qt.quit() + } + else{ + systemTray.show(); + systemTray.showMessage("",qsTr("Background Sync\n Rightclick or Middleclick to Quit"),"",5000) + root.hide() + } + }) + })}) + close.accepted=true + } + //else if (bar.currentIndex==2){fotoSignal(login.username,"backButton");close.accepted=false} + else {rootstackSignal(0);bar.currentIndex=0;close.accepted=false} } Rectangle{ @@ -198,47 +199,71 @@ ApplicationWindow{ id: bar Layout.fillWidth: true onCurrentIndexChanged: { - rootstack.currentIndex=bar.currentIndex; + rootstackSignal(bar.currentIndex); try{while(rootstackView.depth>1){rootstackView.pop()}}catch(e){} } TabButton { - font.family: fontAwesome.name - text: "\uf03a" - background:Rectangle{ - anchors.fill: parent - color: osSettings.backgroundDimColor - } + width: bar.width/4 + icon.name: "format-list-unordered" + text: qsTr("Posts") + display: AbstractButton.IconOnly + icon.source: "qrc:/assets/icons/list.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + // background:Rectangle{ + // anchors.fill: parent + // color: osSettings.backgroundDimColor + // } + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Posts") onDoubleClicked: {newstypeSignal("refresh")} } TabButton { - font.family: fontAwesome.name - text: "\uf0c0" - background:Rectangle{ - anchors.fill: parent - color: osSettings.backgroundDimColor - } + width: bar.width/4 + icon.name: "group" + text: qsTr("Contacts") + display: AbstractButton.IconOnly + icon.source: "qrc:/assets/icons/users.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + // background:Rectangle{ + // anchors.fill: parent + // color: osSettings.backgroundDimColor + // } + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Contacts") } TabButton { - font.family: fontAwesome.name - text: "\uf03e" - background:Rectangle{ - anchors.fill: parent - color: osSettings.backgroundDimColor - } + width: bar.width/4 + icon.name: "viewimage" + text: qsTr("Images") + display: AbstractButton.IconOnly + icon.source: "qrc:/assets/icons/picture-o.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + // background:Rectangle{ + // anchors.fill: parent + // color: osSettings.backgroundDimColor + // } + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Photos") } TabButton { - font.family: fontAwesome.name - text: "\uf073" - background:Rectangle{ - anchors.fill: parent - color: osSettings.backgroundDimColor - } + width: bar.width/4 + icon.name: "view-calendar" + text: qsTr("Calendar") + display: AbstractButton.IconOnly + icon.source: "qrc:/assets/icons/calendar.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + // background:Rectangle{ + // anchors.fill: parent + // color: osSettings.backgroundDimColor + // } + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Calendar") } @@ -251,34 +276,6 @@ ApplicationWindow{ //anchors.fill: parent width:root.width height: root.height-roottoolbar.contentHeight - initialItem: StackLayout{ - id:rootstack - width:rootstackView.width - height: rootstackView.height - currentIndex:bar.currentIndex - - Loader{ - id: newstab - property string newstabstatus - property var conversation:[] - - source:(rootstack.currentIndex==0)? "qrc:/qml/newsqml/NewsTab.qml":"" - } - Loader{ - id: friendstab - source: (rootstack.currentIndex==1)?"qrc:/qml/contactqml/FriendsTab.qml":"" - } - Loader{ - id: fotostab - property string phototabstatus:"Images" - source: (rootstack.currentIndex==2)?"qrc:/qml/photoqml/PhotoTab.qml":"" - } - Loader{ - id: calendartab - property string calendartabstatus:"Events" - source: (rootstack.currentIndex==3)?"qrc:/qml/calendarqml/CalendarTab.qml":"" - } - } } QSystemTrayIcon { @@ -310,7 +307,7 @@ ApplicationWindow{ else {osSettings.setTheme("system")} if(!filesystem.Visibility){ systemTray.icon = iconTray; -// systemTray.toolTip = qsTr("Click to open Friendiqa"); + // systemTray.toolTip = qsTr("Click to open Friendiqa"); systemTray.visible=true systemTray.show(); } @@ -319,9 +316,9 @@ ApplicationWindow{ var component = Qt.createComponent("qrc:/qml/genericqml/IntentReceiver.qml"); var IntentReceiverQml = component.createObject(root); } - else if (osSettings.osType=="Linux"){ - var component = Qt.createComponent("qrc:/qml/genericqml/LinuxSync.qml"); - var LinuxSyncQml = component.createObject(root); - } + // else if (osSettings.osType=="Linux"){ + // var component = Qt.createComponent("qrc:/qml/genericqml/LinuxSync.qml"); + // var LinuxSyncQml = component.createObject(root); + // } } } diff --git a/source-linux/qml/genericqml/BlueButton.qml b/src/qml/genericqml/BlueButton.qml similarity index 97% rename from source-linux/qml/genericqml/BlueButton.qml rename to src/qml/genericqml/BlueButton.qml index 2375717..adbe394 100644 --- a/source-linux/qml/genericqml/BlueButton.qml +++ b/src/qml/genericqml/BlueButton.qml @@ -29,7 +29,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 +import QtQuick 6.3 Rectangle{ id: blueButton width: Math.max(mainText.width+2*mm,5*mm) @@ -51,7 +51,7 @@ Rectangle{ anchors.centerIn: parent width: contentWidth height: contentHeight - font.family:fontAwesome.name + //font.family:fontAwesome.name font.pointSize: osSettings.bigFontSize text: "" elide: Text.ElideNone diff --git a/source-linux/qml/genericqml/ContactComponent.qml b/src/qml/genericqml/ContactComponent.qml similarity index 97% rename from source-linux/qml/genericqml/ContactComponent.qml rename to src/qml/genericqml/ContactComponent.qml index 2342ef5..52a983c 100644 --- a/source-linux/qml/genericqml/ContactComponent.qml +++ b/src/qml/genericqml/ContactComponent.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/qml/genericqml" Item { @@ -54,7 +54,7 @@ Item { width: 4*root.fontFactor*osSettings.systemFontSize height:4*root.fontFactor*osSettings.systemFontSize source:((contact.profile_image!="") && (typeof(contact.profile_image)=="string"))? "file://"+contact.profile_image : contact.profile_image_url - onStatusChanged: {if (photoImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"}} + onStatusChanged: {if (photoImage.status == Image.Error) {source="qrc:/assets/defaultcontact.jpg"}} } Flow{ diff --git a/src/qml/genericqml/DrawerAccountComponent.qml b/src/qml/genericqml/DrawerAccountComponent.qml new file mode 100644 index 0000000..bfa7aa7 --- /dev/null +++ b/src/qml/genericqml/DrawerAccountComponent.qml @@ -0,0 +1,242 @@ +// This file is part of Friendiqa +// https://git.friendi.ca/lubuwest/Friendiqa +// Copyright (C) 2020 Marco R. +// +// 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 . + +import QtQuick 6.3 +import QtQuick.Controls 6.3 +import "qrc:/qml/genericqml" +import "qrc:/qml/newsqml" + +Item { + id: drawerAccountComponent + width: accountList.width + height: 17*root.fontFactor*osSettings.bigFontSize + function changeNews(typeRequest){ + newsSwipeview.stacktype=typeRequest; + if (newstabitem.newstypes.indexOf(typeRequest)<0){ + newsSwipeview.currentIndex=0; + newstabbar.currentIndex=0; +// let component =Qt.createQmlObject('import QtQuick 6.3; Loader{source:(newsSwipeview.currentIndex=='+(newsSwipeview.count)+')? "qrc:/qml/newsqml/NewsStack.qml":"qrc:/qml/newsqml/NewsStack.qml"}',newsSwipeview,"NewsstackLoader") +// newsSwipeview.addItem(component); +// newstabitem.newstypes.push(typeRequest); +// addToolbutton(typeRequest); +// newstabbar.currentIndex=newsSwipeview.count-1; + }else{ + newsSwipeview.currentIndex=newstabitem.newstypes.indexOf(typeRequest); + newstabbar.currentIndex=newstabitem.newstypes.indexOf(typeRequest); + } + } + + + Label{ + y:0.5*root.fontFactor*osSettings.bigFontSize + width:parent.width + height: 1.5*osSettings.bigFontSize*root.fontFactor + color: osSettings.primaryTextColor + verticalAlignment:Text.AlignBottom + font.pointSize: osSettings.bigFontSize + text: account.username + } + + ToolButton{ + y:2*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize + text: qsTr("Refresh") + icon.name: "view-refresh" + icon.source: "qrc:/assets/icons/refresh.svg" + icon.height: root.fontFactor*osSettings.systemFontSize + icon.width: root.fontFactor*osSettings.systemFontSize + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + newstypeSignal("") + } + } + + ToolButton{ + y:3.5*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && newsSwipeview.stacktype=="Home" && newstab.newstabstatus=="Timeline" + text: qsTr("Timeline") + icon.name: "chronometer" + icon.source: "qrc:/assets/icons/history.svg" + icon.height: root.fontFactor*osSettings.systemFontSize + icon.width: root.fontFactor*osSettings.systemFontSize + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + changeNews("Home"); + currentnewstabstatus="Timeline"; + newstypeSignal("timeline") + } + } + + ToolButton{ + y: 5*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && newsSwipeview.stacktype=="Home" && newstab.newstabstatus=="Conversations" + text: qsTr("Conversations") + icon.name: "view-conversation-balloon" + icon.source: "qrc:/assets/icons/comments.svg" + icon.height: root.fontFactor*osSettings.systemFontSize + icon.width: root.fontFactor*osSettings.systemFontSize + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + changeNews("Home"); + currentnewstabstatus="Conversations"; + newstypeSignal("conversation") + } + } + + ToolButton{ + y:6.5*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && newsSwipeview.stacktype=="Replies" + text: qsTr("Replies") + icon.name: "mail-reply-all" + icon.source: "qrc:/assets/icons/exchange.svg" + icon.height: root.fontFactor*osSettings.systemFontSize + icon.width: root.fontFactor*osSettings.systemFontSize + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + changeNews("Replies"); + //currentnewstabstatus="Replies"; + newstypeSignal("replies") + } + } + + ToolButton{ + y: 8*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && newsSwipeview.stacktype=="DirectMessages" + text: qsTr("Direct Messages") + icon.name: "mail-message" + icon.source: "qrc:/assets/icons/envelope.svg" + icon.height: root.fontFactor*osSettings.systemFontSize + icon.width: root.fontFactor*osSettings.systemFontSize + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + changeNews("DirectMessages") + } + } + + ToolButton{ + y: 9.5*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && newsSwipeview.stacktype=="Favorites" + text: qsTr("Favorites") + icon.name: "starred-symbolic" + icon.source: "qrc:/assets/icons/star.svg" + icon.height: root.fontFactor*osSettings.systemFontSize + icon.width: root.fontFactor*osSettings.systemFontSize + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + changeNews("Favorites") + newstypeSignal("favorites") + } + } + + ToolButton{ + y: 11*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && newsSwipeview.stacktype=="Public Timeline" + text: qsTr("Public Timeline") + icon.name: "globe" + icon.source: "qrc:/assets/icons/globe.svg" + icon.height: root.fontFactor*osSettings.systemFontSize + icon.width: root.fontFactor*osSettings.systemFontSize + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + changeNews("Public Timeline") + currentnewstabstatus="Public Timeline"; + newstypeSignal("publictimeline") + } + } + + ToolButton{ + y: 12.5*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && newsSwipeview.stacktype=="Groupnews" + text: qsTr("Group news") + icon.name: "group" + icon.source: "qrc:/assets/icons/users.svg" + icon.height: root.fontFactor*osSettings.systemFontSize + icon.width: root.fontFactor*osSettings.systemFontSize + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + newsSwipeview.currentIndex=0; + currentnewstabstatus="Groupnews"; + changeNews("Group News") + newstypeSignal("groupnews") + } + } + + ToolButton{ + y: 14*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && newsSwipeview.stacktype=="Search" + text: qsTr("Search") + icon.name: "search" + icon.source: "qrc:/assets/icons/search.svg" + icon.height: root.fontFactor*osSettings.systemFontSize + icon.width: root.fontFactor*osSettings.systemFontSize + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + newsSwipeview.currentIndex=0; + currentnewstabstatus="Search"; + newstypeSignal("search") + changeNews("Search"); + } + } + + ToolButton{ + y: 15.5*root.fontFactor*osSettings.bigFontSize + font.pointSize: osSettings.systemFontSize + font.bold: account.username==login.username && newsSwipeview.stacktype=="Notifications" + text: qsTr("Notifications") + icon.name: "notifications" + icon.source: "qrc:/assets/icons/bell.svg" + icon.height: root.fontFactor*osSettings.systemFontSize + icon.width: root.fontFactor*osSettings.systemFontSize + onClicked:{ + login=account; + if(!wideScreen){leftDrawerAndroid.close()} + changeNews("Notifications") + newstypeSignal("notifications") + } + } +} diff --git a/source-linux/qml/genericqml/DrawerAccountComponentContacts.qml b/src/qml/genericqml/DrawerAccountComponentContacts.qml similarity index 98% rename from source-linux/qml/genericqml/DrawerAccountComponentContacts.qml rename to src/qml/genericqml/DrawerAccountComponentContacts.qml index 3f8018c..82f7dfe 100644 --- a/source-linux/qml/genericqml/DrawerAccountComponentContacts.qml +++ b/src/qml/genericqml/DrawerAccountComponentContacts.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/qml/genericqml" Item { diff --git a/source-linux/qml/genericqml/ImagePicker.qml b/src/qml/genericqml/ImagePicker.qml similarity index 98% rename from source-linux/qml/genericqml/ImagePicker.qml rename to src/qml/genericqml/ImagePicker.qml index f408c82..2ac69a2 100644 --- a/source-linux/qml/genericqml/ImagePicker.qml +++ b/src/qml/genericqml/ImagePicker.qml @@ -1,4 +1,4 @@ -import QtQuick 2.0 +import QtQuick 6.3 import AndroidNative 1.0 Item { diff --git a/source-linux/qml/genericqml/ImagePickerLinux.qml b/src/qml/genericqml/ImagePickerLinux.qml similarity index 99% rename from source-linux/qml/genericqml/ImagePickerLinux.qml rename to src/qml/genericqml/ImagePickerLinux.qml index 5bbf6e8..e15dbde 100644 --- a/source-linux/qml/genericqml/ImagePickerLinux.qml +++ b/src/qml/genericqml/ImagePickerLinux.qml @@ -29,10 +29,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.12 +import QtQuick 6.3 +import QtCore 6.3 import QtQuick.Controls 6.3 import QtQuick.Dialogs 6.3 -import Qt.labs.folderlistmodel 2.12 import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" diff --git a/source-linux/qml/genericqml/IntentReceiver.qml b/src/qml/genericqml/IntentReceiver.qml similarity index 98% rename from source-linux/qml/genericqml/IntentReceiver.qml rename to src/qml/genericqml/IntentReceiver.qml index 02465bd..7cad83a 100644 --- a/source-linux/qml/genericqml/IntentReceiver.qml +++ b/src/qml/genericqml/IntentReceiver.qml @@ -1,4 +1,4 @@ -import QtQuick 2.0 +import QtQuick 6.3 import AndroidNative 1.0 Item { diff --git a/source-linux/qml/genericqml/LeftDrawerAndroid.qml b/src/qml/genericqml/LeftDrawerAndroid.qml similarity index 94% rename from source-linux/qml/genericqml/LeftDrawerAndroid.qml rename to src/qml/genericqml/LeftDrawerAndroid.qml index 5545836..8387fc1 100644 --- a/source-linux/qml/genericqml/LeftDrawerAndroid.qml +++ b/src/qml/genericqml/LeftDrawerAndroid.qml @@ -29,13 +29,14 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/qml/configqml" Drawer{ id: leftDrawer width: root.fontFactor*osSettings.systemFontSize*13 height: root.height + background: Rectangle{color: osSettings.backgroundColor} LeftDrawerScrollview{} } diff --git a/source-linux/qml/genericqml/LeftDrawerLinux.qml b/src/qml/genericqml/LeftDrawerLinux.qml similarity index 90% rename from source-linux/qml/genericqml/LeftDrawerLinux.qml rename to src/qml/genericqml/LeftDrawerLinux.qml index cf6917b..73f9267 100644 --- a/source-linux/qml/genericqml/LeftDrawerLinux.qml +++ b/src/qml/genericqml/LeftDrawerLinux.qml @@ -29,15 +29,11 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/qml/configqml" Rectangle{ -// id: leftDrawer -// width: osSettings.systemFontSize*30 -// height: root.height-bar.height - //y: bar.height signal opened() color: osSettings.backgroundColor @@ -52,5 +48,4 @@ Rectangle{ anchors.right: leftDrawer.right color: osSettings.dialogColor } - //Component.onCompleted: {opened();} } diff --git a/source-linux/qml/genericqml/LinuxSync.qml b/src/qml/genericqml/LinuxSync.qml similarity index 97% rename from source-linux/qml/genericqml/LinuxSync.qml rename to src/qml/genericqml/LinuxSync.qml index d90c03d..dde0210 100644 --- a/source-linux/qml/genericqml/LinuxSync.qml +++ b/src/qml/genericqml/LinuxSync.qml @@ -1,5 +1,4 @@ -import QtQuick 2.4 - +import QtQuick 6.3 Item { Timer{ diff --git a/source-linux/qml/genericqml/MButton.qml b/src/qml/genericqml/MButton.qml similarity index 83% rename from source-linux/qml/genericqml/MButton.qml rename to src/qml/genericqml/MButton.qml index c4e4e7b..b2c8cea 100644 --- a/source-linux/qml/genericqml/MButton.qml +++ b/src/qml/genericqml/MButton.qml @@ -28,18 +28,21 @@ // // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.9 +import QtQuick 6.3 import QtQuick.Controls 6.3 Button{ id: mButton - property alias color: bg.color + //property alias color: bg.color width: Math.max(implicitContentWidth+2*mm,3*root.fontFactor*osSettings.bigFontSize) //radius: mm - height: 2.5*root.fontFactor*osSettings.bigFontSize + height: 2*root.fontFactor*osSettings.bigFontSize //color: Material.foreground - font.family: fontAwesome.name + //font.family: fontAwesome.name font.pointSize: osSettings.bigFontSize //highlighted:true - background: Rectangle{id:bg;color: osSettings.dialogColor; - radius: 0.5*mm} + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + + // background: Rectangle{id:bg;color: osSettings.dialogColor; + // radius: 0.5*mm} } diff --git a/source-linux/qml/genericqml/PermissionDialog.qml b/src/qml/genericqml/PermissionDialog.qml similarity index 93% rename from source-linux/qml/genericqml/PermissionDialog.qml rename to src/qml/genericqml/PermissionDialog.qml index cf0ad98..fecef74 100644 --- a/source-linux/qml/genericqml/PermissionDialog.qml +++ b/src/qml/genericqml/PermissionDialog.qml @@ -29,7 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.11 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/js/service.js" as Service import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -57,8 +58,8 @@ Rectangle{ contact_deny.push(contactModel.get(j).contact.cid) } if ((contact_allow.length==0)&&(contact_deny.length==0)&&(group_allow.length==0)&&(group_deny.length==0)) - {permButton.text="\uf09c"} - else{permButton.text="\uf023"} + {permButton.icon.name="lock"; permButton.icon.source=icon.source= "qrc:/assets/icons/lock.svg"} + else{permButton.icon.name="unlock" ; permButton.icon.source=icon.source= "qrc:/assets/icons/unlock.svg"} } } @@ -186,7 +187,10 @@ Rectangle{ x:0.5*mm anchors.bottom: parent.bottom anchors.bottomMargin:1 - text:"\uf0c7" + text:qsTr("save") + display: AbstractButton.IconOnly + icon.name: "document-save" + icon.source: "qrc:/assets/icons/floppy-o.svg" onClicked:{ updatePerms(); var perms=[]; @@ -198,7 +202,10 @@ Rectangle{ x:contactView.width+2*mm anchors.bottom: parent.bottom anchors.bottomMargin:1 - text:"\u2713" + text:qsTr("apply") + display: AbstractButton.IconOnly + icon.name: "checkmark" + icon.source: "qrc:/assets/icons/check.svg" onClicked:{ updatePerms(); permissionDialog.visible=false; diff --git a/source-linux/qml/genericqml/Search.qml b/src/qml/genericqml/RootStack.qml similarity index 62% rename from source-linux/qml/genericqml/Search.qml rename to src/qml/genericqml/RootStack.qml index 5fc13d6..ee15add 100644 --- a/source-linux/qml/genericqml/Search.qml +++ b/src/qml/genericqml/RootStack.qml @@ -28,36 +28,36 @@ // // You should have received a copy of the GNU General Public License // along with this program. If not, see . +import QtQuick 6.3 +import QtQuick.Controls 6.3 +import QtQuick.Layouts -import QtQuick 2.7 -import QtQuick.Controls 2.12 -import "qrc:/qml/genericqml" +StackLayout{ + id:rootstack + width:rootstackView.width + height: rootstackView.height + currentIndex:bar.currentIndex -Rectangle { - id:searchComponent - color: osSettings.backgroundColor - radius:0.5*mm - property bool selfdestroying:false -/* anchors.left: parent.left - anchors.leftMargin:mm - anchors.top:parent.top - anchors.topMargin: 0.5*mm - width:parent.width-2*mm - height: 4*mm *///Math.max( searchText.contentHeight,5*mm) + function indexchange(pageindex){currentIndex=pageindex} - TextInput { - id: searchText - color: osSettings.primaryTextColor - focus: true - font.pointSize: osSettings.bigFontSize - wrapMode: Text.Wrap - anchors.fill: parent - selectByMouse: true - cursorVisible: false - onAccepted:{ - if (displayText!=""){search(displayText)}; - if(selfdestroying){searchComponent.destroy()} - } + Loader{ + id: newstab + property string newstabstatus + source:(rootstack.currentIndex==0)? "qrc:/qml/newsqml/NewsTab.qml":"" } - Component.onCompleted: searchText.forceActiveFocus() + Loader{ + id: friendstab + source: (rootstack.currentIndex==1)?"qrc:/qml/contactqml/FriendsTab.qml":"" + } + Loader{ + id: fotostab + property string phototabstatus:"Images" + source: (rootstack.currentIndex==2)?"qrc:/qml/photoqml/PhotoTab.qml":"" + } + Loader{ + id: calendartab + property string calendartabstatus:"Events" + source: (rootstack.currentIndex==3)?"qrc:/qml/calendarqml/CalendarTab.qml":"" + } + Component.onCompleted: {root.rootstackSignal.connect(indexchange);} } diff --git a/source-linux/qml/newsqml/BlockUser.qml b/src/qml/newsqml/BlockUser.qml similarity index 97% rename from source-linux/qml/newsqml/BlockUser.qml rename to src/qml/newsqml/BlockUser.qml index e3acfac..e559207 100644 --- a/source-linux/qml/newsqml/BlockUser.qml +++ b/src/qml/newsqml/BlockUser.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.15 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/js/helper.js" as Helperjs Dialog { diff --git a/source-linux/qml/newsqml/ContactPage.qml b/src/qml/newsqml/ContactPage.qml similarity index 91% rename from source-linux/qml/newsqml/ContactPage.qml rename to src/qml/newsqml/ContactPage.qml index 3151d8d..c993729 100644 --- a/source-linux/qml/newsqml/ContactPage.qml +++ b/src/qml/newsqml/ContactPage.qml @@ -30,8 +30,8 @@ // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/js/helper.js" as Helperjs import "qrc:/js/news.js" as Newsjs import "qrc:/js/service.js" as Service @@ -147,7 +147,7 @@ Page { width: Math.min(15*root.fontFactor*osSettings.bigFontSize,contactView.width/2) //contactView.width/2 height:width source:(contact.profile_image!="")? "file://"+contact.profile_image : contact.profile_image_url - onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} + onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/assets/defaultcontact.jpg"} Connections{ target:contactList function onProfileimagesourceChanged(){profileImage.source=profileimagesource} @@ -158,54 +158,57 @@ Page { anchors.right: parent.right anchors.rightMargin: mm width: contactView.width - (profileImage.width+3*mm) - height: (contact.hasOwnProperty("acct"))?21*mm:15*mm//profileImage.height + height: (contact.hasOwnProperty("acct"))?21*mm:15*mm y: mm spacing:4 - MButton{ - id:photobutton - height: 6*mm - width: 8*mm - text: "\uf03e" - visible:(contact.network=="dfrn") - onClicked:{ - rootstack.currentIndex=2; - bar.currentIndex=2; - fotostab.phototabstatus="Contact"; + // MButton{ + // id:photobutton + // height: 6*mm + // width: 8*mm + // text: qsTr("Photos") + // visible:(contact.network=="dfrn") + // onClicked:{ + // rootstackSignal(2); + // bar.currentIndex=2; + // fotostab.phototabstatus="Contact"; - //fotostab.active=true; - fotoSignal(root.login,contact) ; - rootstackView.pop(); - } - } + // //fotostab.active=true; + // fotoSignal(root.login,contact) ; + // rootstackView.pop(); + // } + // } MButton{ id:dmbutton height: 6*mm width: 8*mm visible: (contact.following=="true") - text: "\uf040" + text: qsTr("Direct Message") + display: AbstractButton.IconOnly + icon.name: "mail-message" + icon.source: "qrc:/assets/icons/envelope.svg" onClicked:{ - rootstack.currentIndex=0; + rootstackSignal(0); newsSwipeview.currentIndex=2; directmessageSignal(contact) } } - MButton{ - id:eventbutton - visible:(contact.network=="dfrn") - height: 6*mm - width: 8*mm - text:"\uf073" - onClicked:{ - rootstack.currentIndex=3; - bar.currentIndex=3; - calendartab.calendartabstatus="Friend" - eventSignal(contact); - rootstackView.pop() - } - } + // MButton{ + // id:eventbutton + // visible:(contact.network=="dfrn") + // height: 6*mm + // width: 8*mm + // text:qsTr("Events") + // onClicked:{ + // rootstackSignal(3); + // bar.currentIndex=3; + // calendartab.calendartabstatus="Friend" + // eventSignal(contact); + // rootstackView.pop() + // } + // } MButton{ id:approvebutton visible:(contact.hasOwnProperty("acct")&&!contact.searchContact) @@ -390,7 +393,10 @@ Page { anchors.right: parent.right anchors.rightMargin: 1*mm width: 2*root.fontFactor*osSettings.bigFontSize; - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" onClicked: { rootstackView.pop() } diff --git a/source-linux/qml/newsqml/Conversation.qml b/src/qml/newsqml/Conversation.qml similarity index 93% rename from source-linux/qml/newsqml/Conversation.qml rename to src/qml/newsqml/Conversation.qml index 5104c4c..645298b 100644 --- a/source-linux/qml/newsqml/Conversation.qml +++ b/src/qml/newsqml/Conversation.qml @@ -30,19 +30,14 @@ // along with this program. If not, see . // ConversationView with button -import QtQuick 2.0 -import QtQuick.Controls 2.12 -//import "qrc:/js/helper.js" as Helperjs +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/qml/genericqml" import "qrc:/qml/newsqml" Page { id:conversationList property var news:[] -// color: "white" - //function backRequested(){pageStack.pop()} -// width:root.width -// height: root.height-7*mm function getDateDiffString (seconds){ var timestring=""; @@ -122,16 +117,17 @@ Page { } Connections{ - target:newstab + target: root function onConversationChanged(){ - if(newstab.conversation.length==0){ - rootstackView.pop() - } else { conversationBusy.running=false; + // if(root.conversation.length==0){ + // rootstackView.pop() + // } else { + conversationBusy.running=false; conversationModel.clear(); var currentTime= new Date(); - var msg = {'currentTime': currentTime, 'model': conversationModel,'news':newstab.conversation, 'method':'conversation', 'options':globaloptions}; + var msg = {'currentTime': currentTime, 'model': conversationModel,'news':root.conversation, 'method':'conversation', 'options':globaloptions}; conversationWorker.sendMessage(msg) - } + //} } } @@ -149,9 +145,12 @@ Page { anchors.right: parent.right anchors.rightMargin: 1*mm width: 2*root.fontFactor*osSettings.bigFontSize; - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" onClicked: { - newstab.conversation=[]; + root.conversation=[]; if (rootstackView.depth>1){ rootstackView.pop()} } } diff --git a/source-linux/qml/newsqml/FriendicaActivities.qml b/src/qml/newsqml/FriendicaActivities.qml similarity index 94% rename from source-linux/qml/newsqml/FriendicaActivities.qml rename to src/qml/newsqml/FriendicaActivities.qml index 78538f6..9555d8c 100644 --- a/source-linux/qml/newsqml/FriendicaActivities.qml +++ b/src/qml/newsqml/FriendicaActivities.qml @@ -30,7 +30,7 @@ // along with this program. If not, see . // List of people from Friendica Activities -import QtQuick 2.0 +import QtQuick 6.3 import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -73,7 +73,7 @@ Rectangle { width: 5*mm height:5*mm source:(contact.profile_image!="")? "file://"+contact.profile_image : contact.profile_image_url - onStatusChanged: if (contactImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} + onStatusChanged: if (contactImage.status == Image.Error) {source="qrc:/assets/defaultcontact.jpg"} } Text{ color: osSettings.primaryTextColor @@ -96,8 +96,10 @@ Rectangle { anchors.topMargin: 1*mm anchors.right: parent.right anchors.rightMargin: 1*mm - //color:"white" - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" onClicked: { activitiesRectangle.destroy() } diff --git a/source-linux/qml/newsqml/Hashtag.qml b/src/qml/newsqml/Hashtag.qml similarity index 99% rename from source-linux/qml/newsqml/Hashtag.qml rename to src/qml/newsqml/Hashtag.qml index a171e7c..28aa64c 100644 --- a/source-linux/qml/newsqml/Hashtag.qml +++ b/src/qml/newsqml/Hashtag.qml @@ -29,7 +29,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 +import QtQuick 6.3 Rectangle { id:hashtagRectangle diff --git a/source-linux/qml/newsqml/MessageImageUploadDialog.qml b/src/qml/newsqml/MessageImageUploadDialog.qml similarity index 88% rename from source-linux/qml/newsqml/MessageImageUploadDialog.qml rename to src/qml/newsqml/MessageImageUploadDialog.qml index 99f12ab..510cd65 100644 --- a/source-linux/qml/newsqml/MessageImageUploadDialog.qml +++ b/src/qml/newsqml/MessageImageUploadDialog.qml @@ -29,7 +29,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.12 +import QtQuick 6.3 import QtQuick.Controls 6.3 import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -73,7 +73,7 @@ Page{ function attach(){ imagePicking=true; - var imagePicker = Qt.createQmlObject('import QtQuick 2.0; import "qrc:/qml/genericqml";'+ + var imagePicker = Qt.createQmlObject('import QtQuick 6.3; import "qrc:/qml/genericqml";'+ osSettings.imagePickQml+'{multiple : false;onReady: {'+ 'attachImage(imageUrl)}}',imageDialog,"imagePicker"); imagePicker.pickImage() @@ -193,9 +193,15 @@ Page{ visible: uploadImage.source!="" anchors.bottom: uploadImage.bottom anchors.right: uploadImage.right - color: "black" + color: "grey" opacity: 0.5 - Text{anchors.centerIn:parent;font.family: fontAwesome.name;text: "\uf01e";color: "white"} + Image{ + anchors.centerIn: parent + source: "qrc:/assets/icons/repeat.svg" + width: root.fontFactor*osSettings.bigFontSize + height: root.fontFactor*osSettings.bigFontSize + } + //Text{anchors.centerIn:parent;font.family: fontAwesome.name;text: "\uf01e";color: "white"} MouseArea{ anchors.fill:parent; onClicked:{ @@ -212,9 +218,15 @@ Page{ visible: uploadImage.source!="" anchors.bottom: uploadImage.bottom anchors.left: uploadImage.left - color: "black" + color: "grey" opacity: 0.5 - Text{anchors.centerIn:parent;font.family: fontAwesome.name; text: "\uf00d";color: "white"} + Image{ + anchors.centerIn: parent + source: "qrc:/assets/icons/times.svg" + width: root.fontFactor*osSettings.bigFontSize + height: root.fontFactor*osSettings.bigFontSize + } + //Text{anchors.centerIn:parent;font.family: fontAwesome.name; text: "\uf00d";color: "white"} MouseArea{ anchors.fill:parent; onClicked:{ @@ -223,16 +235,16 @@ Page{ } } - Text { + Image { id:uploadedArrow anchors.right:uploadImage.right visible: imageUploaded z:4 - text: "\u2713" + source: "qrc:/assets/icons/check.svg" width: root.fontFactor*osSettings.bigFontSize + height: root.fontFactor*osSettings.bigFontSize + //text: "\u2713" anchors.top: parent.top - color: "green" - font.pointSize: 3*osSettings.bigFontSize } Rectangle{ @@ -258,13 +270,15 @@ Page{ } Component{ id: imageFooter - BlueButton{ + Button{ width: 5*root.fontFactor*osSettings.bigFontSize height:imageUploadView.height-3*root.fontFactor*osSettings.bigFontSize - color: osSettings.backgroundColor - border.color: "transparent" - text:"\u002b" - fontSize: 3*osSettings.bigFontSize + text: qsTr("Add") + display: AbstractButton.IconOnly + icon.name: "list-add" + icon.source: "qrc:/assets/icons/plus.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize onClicked:{attach()} } } diff --git a/source-linux/qml/newsqml/MessageSend.qml b/src/qml/newsqml/MessageSend.qml similarity index 83% rename from source-linux/qml/newsqml/MessageSend.qml rename to src/qml/newsqml/MessageSend.qml index 96988e2..e63f066 100644 --- a/source-linux/qml/newsqml/MessageSend.qml +++ b/src/qml/newsqml/MessageSend.qml @@ -31,10 +31,10 @@ // message.qml // message with buttons -import QtQuick 2.15 -import QtQuick.Controls 2.15 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import QtQuick.Window 2.0; -import QtQuick.Dialogs 6.4; +import QtQuick.Dialogs 6.3; //import Qt.labs.platform 6.3 as Platform import io.qt.examples.texteditor 1.0; import "qrc:/js/helper.js" as Helperjs @@ -46,10 +46,9 @@ import "qrc:/qml/newsqml" Window{ color: osSettings.backgroundColor width: parent.width - height: 2/3*parent.height//messageColumn.height+2*mm + height: 2/3*parent.height id: messageSend property bool wideScreen : width>height - // visible: conversation || (newstab.newstabstatus!="Search")?true:false property string parentId: "" //property bool textfocus: false //property bool conversation: false @@ -93,8 +92,6 @@ Window{ } function statusUpdate(title,status,in_reply_to_status_id) { - print("status: "+status); - //xhr.url= login.server + "/api/statuses/update.json"; try{newsBusy.running=true;conversationBusy.running=true}catch(e){} xhr.setAccount(login); xhr.setApi("/api/statuses/update"); @@ -201,7 +198,7 @@ Window{ DropArea{ anchors.fill: parent onDropped: { - //if (messageSend.state==""){messageSend.state="active"} + if (drop.keys.includes('text/uri-list')){ var droptext = drop.text.replace(/(\r\n|\n|\r)/gm, ","); imageUploadDialog.visible=true; @@ -390,15 +387,15 @@ Window{ x: 0.5*mm MButton { id: boldButton - text: "\uf032" // icon-bold - ToolTip.delay: 500 + //text: "\uf032" // icon-bold + text: qsTr("Bold") + display: AbstractButton.IconOnly + icon.name: "format-text-bold" + icon.source: "qrc:/assets/icons/bold.svg" + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Bold") focusPolicy: Qt.NoFocus - // Don't want to close the virtual keyboard when this is clicked. - // focusPolicy: Qt.NoFocus - // checkable: true - // checked: document.bold onClicked: { document.bold = !document.bold; bodyField.forceActiveFocus() @@ -406,48 +403,48 @@ Window{ } MButton { id: italicButton - text: "\uf033" // icon-italic - ToolTip.delay: 500 + //text: "\uf033" // icon-italic + text: qsTr("Format") + display: AbstractButton.IconOnly + icon.name: "format-text-italic" + icon.source: "qrc:/assets/icons/italic.svg" + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Italic") focusPolicy: Qt.NoFocus - // focusPolicy: Qt.NoFocus - // checkable: true - // checked: document.italic onClicked: {document.italic = !document.italic;bodyField.forceActiveFocus()} } MButton { id: liststyleButton - text: "\uf03a" // icon-align-justify - ToolTip.delay: 500 + //text: "\uf03a" // icon-align-justify + text: qsTr("Format") + display: AbstractButton.IconOnly + icon.name: "format-list-unordered" + icon.source: "qrc:/assets/icons/list.svg" + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Create list") - // focusPolicy: Qt.NoFocus - // checkable: true - // checked: document.alignment == Qt.AlignJustify onClicked: {document.liststyle = !document.liststyle;bodyField.forceActiveFocus()} } MButton { id: codeblockButton - text: "\uf121" // icon-code - ToolTip.delay: 500 + //text: "\uf121" // icon-code + text: qsTr("Format") + display: AbstractButton.IconOnly + icon.name: "format-text-code" + icon.source: "qrc:/assets/icons/code.svg" + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Format as code") - // focusPolicy: Qt.NoFocus - // checkable: true - // checked: document.alignment == Qt.AlignJustify onClicked: {document.codeblock = !document.codeblock;bodyField.forceActiveFocus()} } MButton { id: plainButton text: bodyField.textFormat==TextEdit.PlainText?qsTr("Rendered"):qsTr("MD") // icon-code - ToolTip.delay: 500 + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Show Markdown code") - // focusPolicy: Qt.NoFocus - // checkable: true - // checked: document.alignment == Qt.AlignJustify onClicked: { if(bodyField.textFormat==TextEdit.PlainText){ bodyField.textFormat=TextEdit.MarkdownText;} @@ -455,8 +452,20 @@ Window{ bodyField.forceActiveFocus() } } + MButton { + id: menuButton + //text: "\uf044" + text: qsTr("Format") + display: AbstractButton.IconOnly + icon.name: "overflow-menu" + icon.source: "qrc:/assets/icons/ellipsis-v.svg" + ToolTip.delay: 800 + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Edit") + onClicked: { contextMenu.open()} + } } - PermissionDialog{id:permissionDialog;x:mm;visible: false} + //PermissionDialog{id:permissionDialog;x:mm;visible: false} SmileyDialog{id:smileyDialog;x:mm;visible: false} MessageImageUploadDialog{id:imageUploadDialog;visible: false} Row{ @@ -466,44 +475,50 @@ Window{ height: 3.5*root.fontFactor*osSettings.bigFontSize x: 0.5*mm - // MButton{id:permButton //Permissions not working in Friendica 02/2022 - // visible: !conversation && (newsSwipeview.stacktype!=="DirectMessages") - // height: 2*root.fontFactor*osSettings.bigFontSize - // width: 2*root.fontFactor*osSettings.bigFontSize - // text: ((contact_allow.length==0)&&(contact_deny.length==0)&&(group_allow.length==0)&&(group_deny.length==0))?"\uf09c":"\uf023" - // onClicked: { if (permissionDialog.visible==false){permissionDialog.visible=true} else{permissionDialog.visible=false}} - // } + // MButton{id:permButton //Permissions not working in Friendica 02/2022 + // visible: !conversation && (newsSwipeview.stacktype!=="DirectMessages") + // height: 2*root.fontFactor*osSettings.bigFontSize + // width: 2*root.fontFactor*osSettings.bigFontSize + // text: ((contact_allow.length==0)&&(contact_deny.length==0)&&(group_allow.length==0)&&(group_deny.length==0))?"\uf09c":"\uf023" + // onClicked: { if (permissionDialog.visible==false){permissionDialog.visible=true} else{permissionDialog.visible=false}} + // } MButton{ id:smileyButton - text: "\uf118" - ToolTip.delay: 500 + text: qsTr("emojies") + display: AbstractButton.IconOnly + icon.name: "smiley" + icon.source: "qrc:/assets/icons/smile-o.svg" + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Insert smiley") - height: 3*root.fontFactor*osSettings.bigFontSize - width: 3*root.fontFactor*osSettings.bigFontSize onClicked: {if (smileyDialog.visible==false){smileyDialog.visible=true} else{smileyDialog.visible=false}} } MButton{ id:hastagButton - text: "\uf292" - ToolTip.delay: 500 + text: "#" + // display: AbstractButton.IconOnly + // icon.name: "tag-symbolic" + // icon.source: "qrc:/assets/icons/hashtag.svg" + // icon.width: root.fontFactor*osSettings.bigFontSize + // icon.height: root.fontFactor*osSettings.bigFontSize + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Insert previous hashtag") - height: 3*root.fontFactor*osSettings.bigFontSize - width: 3*root.fontFactor*osSettings.bigFontSize onClicked: {if (tagSelector.visible==false){hashtagmenu()} else{tagSelector.visible=false}} } MButton{ id:imagesButton visible:(newsSwipeview.stacktype!="DirectMessages") - text: "\uf03e" - ToolTip.delay: 500 + //text: "\uf03e" + text: qsTr("Image") + display: AbstractButton.IconOnly + icon.name: "viewimage" + icon.source: "qrc:/assets/icons/picture-o.svg" + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Insert images") - height: 3*root.fontFactor*osSettings.bigFontSize - width: 3*root.fontFactor*osSettings.bigFontSize onClicked: { if (imageUploadDialog.visible==false){ imageUploadDialog.visible=true; @@ -514,32 +529,36 @@ Window{ MButton { id: cancelButton - ToolTip.delay: 500 + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Cancel message") - height: 3*root.fontFactor*osSettings.bigFontSize - width: 3*root.fontFactor*osSettings.bigFontSize - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" onClicked: {messageSend.close()} } MButton { id: formatButton - ToolTip.delay: 500 + visible: !wideScreen + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Format message") - height: 3*root.fontFactor*osSettings.bigFontSize - width: 3*root.fontFactor*osSettings.bigFontSize - text: "\uf031" + text: qsTr("Format") + display: AbstractButton.IconOnly + icon.name: "format-text-italic" + icon.source: "qrc:/assets/icons/font.svg" onClicked: {formatRow.visible?formatRow.visible=false:formatRow.visible=true} } MButton { id: sendButton - ToolTip.delay: 500 + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Send message") - height: 3*root.fontFactor*osSettings.bigFontSize - width: 3*root.fontFactor*osSettings.bigFontSize - text: "\uf1d9" + text: qsTr("Send") + display: AbstractButton.IconOnly + icon.name: "document-send" + icon.source: "qrc:/assets/icons/paper-plane-o.svg" onClicked: { var title=titleField.text.replace("\"","\'"); var body=bodyField.getFormattedText(0,bodyField.length); diff --git a/source-linux/qml/newsqml/MoreComments.qml b/src/qml/newsqml/MoreComments.qml similarity index 91% rename from source-linux/qml/newsqml/MoreComments.qml rename to src/qml/newsqml/MoreComments.qml index 375874d..ccb3510 100644 --- a/source-linux/qml/newsqml/MoreComments.qml +++ b/src/qml/newsqml/MoreComments.qml @@ -29,16 +29,14 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 +import QtQuick 6.3 Rectangle{ id: moreComments width: parent.width - height: 5*mm + height: root.fontFactor*osSettings.bigFontSize*2 color:osSettings.backgroundColor property int comments:0 -// border.color:"grey" -// border.width:1 signal clicked state:"" @@ -49,8 +47,8 @@ Rectangle{ anchors.margins: mm width: contentWidth height: contentHeight - font.family:fontAwesome.name - text: qsTr("Show all comments")+" (" +comments + ")" //"\uf0dc" + //font.family:fontAwesome.name + text: qsTr("Show all comments")+" (" +comments + ")" } MouseArea{ id:buttonArea diff --git a/source-linux/qml/newsqml/NewsImage.qml b/src/qml/newsqml/NewsImage.qml similarity index 99% rename from source-linux/qml/newsqml/NewsImage.qml rename to src/qml/newsqml/NewsImage.qml index 0a7c71e..c3a76c6 100644 --- a/source-linux/qml/newsqml/NewsImage.qml +++ b/src/qml/newsqml/NewsImage.qml @@ -29,7 +29,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.15 +import QtQuick 6.3 AnimatedImage {id:gif; width:toprow.width; cache:false diff --git a/source-linux/qml/newsqml/NewsPhotolist.qml b/src/qml/newsqml/NewsPhotolist.qml similarity index 83% rename from source-linux/qml/newsqml/NewsPhotolist.qml rename to src/qml/newsqml/NewsPhotolist.qml index 4c47334..831ecd4 100644 --- a/source-linux/qml/newsqml/NewsPhotolist.qml +++ b/src/qml/newsqml/NewsPhotolist.qml @@ -30,14 +30,14 @@ // along with this program. If not, see . -import QtQuick 2.15 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/qml/genericqml" Page{ id:photolistview width:root.width; - height:root.height//-7*mm + height:root.height property var photolistarray: [] Rectangle{ @@ -66,7 +66,10 @@ Page{ anchors.right: parent.right anchors.rightMargin: 1*mm color: osSettings.dialogColor - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" onClicked: { if (rootstackView.depth>1){ //roottoolbar.visible=true; @@ -104,29 +107,35 @@ Page{ } - BlueButton{ + MButton{ width: 5*mm height:photolistview.height anchors.left: newsphotolistView.left visible: newsphotolistView.currentIndex!=0 - text:"\uf053" - fontColor:"grey" - border.color: "transparent" - color:"transparent" - radius:0 + // text:"\uf053" + // fontColor:"grey" + // border.color: "transparent" + // color:"transparent" + // radius:0 + display: AbstractButton.IconOnly + icon.name: "arrow-left" + icon.source: "qrc:/assets/icons/angle-left.svg" onClicked: {newsphotolistView.currentIndex=newsphotolistView.currentIndex-1} } - BlueButton{ + MButton{ width: 5*mm height:photolistview.height anchors.right: newsphotolistView.right visible: newsphotolistView.currentIndex!=photolistarray.length-1 - text:"\uf054" - fontColor:"grey" - border.color: "transparent" - color:"transparent" - radius:0 + // text:"\uf054" + // fontColor:"grey" + // border.color: "transparent" + // color:"transparent" + // radius:0 + display: AbstractButton.IconOnly + icon.name: "arrow-right" + icon.source: "qrc:/assets/icons/angle-right.svg" onClicked: {newsphotolistView.currentIndex=newsphotolistView.currentIndex+1} } diff --git a/source-linux/qml/newsqml/NewsStack.qml b/src/qml/newsqml/NewsStack.qml similarity index 84% rename from source-linux/qml/newsqml/NewsStack.qml rename to src/qml/newsqml/NewsStack.qml index 7781190..a653219 100644 --- a/source-linux/qml/newsqml/NewsStack.qml +++ b/src/qml/newsqml/NewsStack.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.12 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/js/news.js" as Newsjs import "qrc:/js/helper.js" as Helperjs import "qrc:/js/service.js" as Service @@ -38,18 +38,15 @@ import "qrc:/qml/genericqml" Rectangle{ id: newsStack - // width: parent.width - // height: parent.height color: osSettings.backgroundColor property string updateMethodNews: "refresh" property var allchats: ({}) property int lastnewsid:0 property string newstabstatus: "" - property bool expectScreenUpdate: false - function newstypeHandling(newstype){print("newstype "+newstype) - if (!newsBusy.running) { - try{newsBusy.running=true}catch(e){print(e)}; + function newstypeHandling(newstype){ + //if (!newsBusy.running) { + try{newsBusy.running=true}catch(e){print("newsBusy.running=true " + e)}; //root.replySignal(""); switch(newstype){ case "timeline": @@ -61,50 +58,48 @@ Rectangle{ }; break; case "conversation": - newsStack.updateMethodNews="conversation"; + updateMethodNews="conversation"; newstab.newstabstatus="Conversations"; Newsjs.chatsfromdb(root.db,root.login,0,[],function(news,lastid){ lastnewsid=lastid; showNews(news)}); break; case "favorites": - newsStack.updateMethodNews="refresh"; + updateMethodNews="refresh"; newstab.newstabstatus="Favorites"; Service.updateView("Favorites"); expectScreenUpdate=true; break; case "replies": - newsStack.updateMethodNews="refresh"; + updateMethodNews="refresh"; newstab.newstabstatus="Replies"; Service.updateView("Replies"); expectScreenUpdate=true; break; case "publictimeline": - newsStack.updateMethodNews="refresh"; + updateMethodNews="refresh"; newstab.newstabstatus="Public Timeline"; Service.updateView("Public Timeline"); expectScreenUpdate=true; break; case "groupnews": - newsStack.updateMethodNews="refresh"; + updateMethodNews="refresh"; newstab.newstabstatus="Groupnews"; Service.showGroups(); expectScreenUpdate=true; break; case "search": - newsView.anchors.topMargin=7*mm; + newsView.anchors.topMargin=root.fontFactor*osSettings.bigFontSize*3; newstab.newstabstatus="Search"; newsBusy.running=false; - var leftoffset=(osSettings.osType=="Android")?2*root.fontFactor*osSettings.bigFontSize:0 - var component = Qt.createComponent("qrc:/qml/genericqml/Search.qml"); - var searchItem = component.createObject(newsStack,{y:mm,x:leftoffset,width:root.width-(leftoffset+mm),height: 1.5*root.fontFactor*osSettings.systemFontSize,selfdestroying:true}); + searchBox.visible=true; break; case "refresh": if (newstab.newstabstatus=="Timeline" || newstabstatus=="Timeline"){ - newsStack.updateMethodNews="append" + updateMethodNews="append" } else if (newstab.newstabstatus=="Conversations" || newstabstatus=="Conversations"){ - newsStack.updateMethodNews="conversation"} - else {newsStack.updateMethodNews="refresh"} + updateMethodNews="conversation"} + else {updateMethodNews="refresh"} //root.contactLoadType="news"; if (newsSwipeview.stacktype=="Home"){ Service.updateView(newstab.newstabstatus,lastnewsid) @@ -119,15 +114,15 @@ Rectangle{ break; default: if (newstab.newstabstatus=="Timeline" || newstabstatus=="Timeline"){ - newsStack.updateMethodNews="append" + updateMethodNews="append" } else if (newstab.newstabstatus=="Conversations" || newstabstatus=="Conversations"){ - newsStack.updateMethodNews="conversation"} - else {newsStack.updateMethodNews="refresh"} + updateMethodNews="conversation"} + else {updateMethodNews="refresh"} //root.contactLoadType="news"; if (newsSwipeview.stacktype=="Home"){ Service.updateView(newstab.newstabstatus,lastnewsid) } - else if (newsSwipeview.stacktype=="Directmessage"){ + else if (newsSwipeview.stacktype=="DirectMessages"){ Service.updateView("Direct Messages",lastnewsid) } else if (newsSwipeview.stacktype=="Notifications"){ @@ -149,7 +144,7 @@ Rectangle{ Service.updateView(newstab.newstabstatus,lastnewsid) } expectScreenUpdate=true; - } + //} } } @@ -159,7 +154,7 @@ Rectangle{ if(newsToShow.length>0){ var currentTime= new Date() // downloadNotice.text=downloadNotice.text + "\n shownews start "+ Date.now(); - if (newsToShow.length==1){var method="refresh"}else{var method = newsStack.updateMethodNews} + if (newsToShow.length==1){var method="refresh"}else{var method = updateMethodNews} var msg = {'currentTime': currentTime, 'model': newsModel,'news':newsToShow,'method':method, 'options':globaloptions}; newsWorker.sendMessage(msg); } @@ -167,11 +162,10 @@ Rectangle{ function search(term){ if (term!=""){ - newstabstatus="Search"; newsBusy.running=true; - newsStack.updateMethodNews="refresh"; + updateMethodNews="refresh"; xhr.setAccount(login); - xhr.setApi("/api/search"); + xhr.setApi("/api/search/tweets"); xhr.setParam("q",term) xhr.get(); expectScreenUpdate=true; @@ -241,7 +235,6 @@ Rectangle{ case "Replies":messagetype=3;break; default:messagetype=99; } - print("messagetype " + messagetype); if((newstabstatus=="Conversations")&&(newsSwipeview.stacktype=="Home")){ Newsjs.chatsfromdb(db,login,messagetype,[],function(dbnews,lastid){ lastnewsid=lastid; @@ -249,7 +242,7 @@ Rectangle{ }) } else if (messagetype==99){ - newstypeHandling() + //newstypeHandling() } else{ Newsjs.newsfromdb(db,login,messagetype,function(dbnews,lastid){ @@ -261,7 +254,7 @@ Rectangle{ Connections{ target:xhr - function onError(data,url,api,code){ + function onError(data,url,api,code){print("api "+api+" code "+code+"data"+data) newsBusy.running=false; expectScreenUpdate=false; } @@ -288,6 +281,7 @@ Rectangle{ } } } + Connections{ target:updatenews function onError(api,data){ @@ -302,6 +296,11 @@ Rectangle{ } } + Connections{ + target: root + function onNewstypeSignal(type){newstypeHandling(type)} + } + Timer {id:replytimer; interval: 1000; running: false; repeat: false onTriggered: {print("replytimer") newsBusy.running=true; @@ -309,10 +308,10 @@ Rectangle{ showConversation(newsStack.timelineIndex-1,newsModel.get(0).newsitemobject)} else{ if (newstab.newstabstatus=="Timeline" || newstabstatus=="Timeline"){ - newsStack.updateMethodNews="append" + updateMethodNews="append" } else if (newstab.newstabstatus=="Conversations" || newstabstatus=="Conversations"){ - newsStack.updateMethodNews="conversation"} - else {newsStack.updateMethodNews="refresh"} + updateMethodNews="conversation"} + else {updateMethodNews="refresh"} if (newsSwipeview.stacktype=="Home"){ Service.updateView(newstab.newstabstatus) } @@ -368,26 +367,63 @@ Rectangle{ BusyIndicator{ id: newsBusy anchors.horizontalCenter: newsStack.horizontalCenter - anchors.top:parent.top - anchors.topMargin: mm + anchors.top: newsStack.top + anchors.topMargin: 2*root.fontFactor*osSettings.bigFontSize width: 2*root.fontFactor*osSettings.bigFontSize height: 2*root.fontFactor*osSettings.bigFontSize z:2 running: false } + TextInput{ + id:searchBox + visible: false + anchors.top: parent.top + anchors.margins: 0.5*root.fontFactor*osSettings.bigFontSize + x: searchCloseButton.width+0.5*root.fontFactor*osSettings.bigFontSize + width: parent.width-root.fontFactor*osSettings.bigFontSize*7 + height: root.fontFactor*osSettings.bigFontSize*3 + font.pointSize: osSettings.bigFontSize + onVisibleChanged:{ + if (visible){searchBox.forceActiveFocus()} + else{newsView.anchors.topMargin=0.5*mm;}} + onAccepted: searchButton.onClicked() + } + + MButton { + id: searchButton + visible: searchBox.visible + anchors.left: searchBox.right + anchors.leftMargin: 0.5*root.fontFactor*osSettings.bigFontSize + icon.name: "search" + icon.source: "qrc:/assets/icons/search.svg" + text: qsTr("Close") + display: AbstractButton.IconOnly + onClicked: {search(searchBox.text); searchBox.visible=false} + } + MButton { + id: searchCloseButton + visible: searchBox.visible + anchors.right: searchBox.left + anchors.rightMargin: 0.5*root.fontFactor*osSettings.bigFontSize + font.bold: true + font.pointSize: osSettings.bigFontSize + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" + onClicked: {searchBox.text=""; searchBox.visible=false} + } ListView { id: newsView property real oldContentY:0 property bool viewdragged: false property bool viewdraggedpositive: false property string viewtype: "news" - width: parent.width - height: parent.height//-3*mm + anchors.fill:parent anchors.margins: 0.5*mm clip: true spacing: 0 - //header:MessageSend{id:messagesend;onHeightChanged: {if(state=="active"){newsView.positionViewAtBeginning()}}} footer: footerComponent model: newsModel delegate: Newsitem{} @@ -420,10 +456,10 @@ Rectangle{ newsBusy.running=true; viewdragged=false if (newstab.newstabstatus=="Timeline" || newstabstatus=="Timeline"){ - newsStack.updateMethodNews="append" + updateMethodNews="append" } else if (newstab.newstabstatus=="Conversations" || newstabstatus=="Conversations"){ - newsStack.updateMethodNews="conversation"} - else {newsStack.updateMethodNews="refresh"} + updateMethodNews="conversation"} + else {updateMethodNews="refresh"} let currentnewstabstatus="Conversations"; if (newstab.newstabstatus!=""){ currentnewstabstatus=newstab.newstabstatus @@ -482,34 +518,6 @@ Rectangle{ source: "qrc:/js/newsworker.js" } - Text { - id: closeButton - //Svisible: !(globaloptions.defaultNewsTypes.indexOf(newsSwipeview.stacktype)>-1) - anchors.top: parent.top - anchors.topMargin: 1*mm - anchors.right: parent.right - anchors.rightMargin: 1*mm - width: root.fontFactor*osSettings.bigFontSize*2 - height: root.fontFactor*osSettings.bigFontSize*2 - font.bold: true - font.family: fontAwesome.name - font.pointSize: osSettings.bigFontSize - HoverHandler{id:closehover} - ToolTip.visible: closehover.hovered - ToolTip.text: qsTr("Close this timeline") - text: "\uf057" - MouseArea{ - anchors.fill: parent - onClicked: { - newstabitem.newstypes.splice(newsSwipeview.currentIndex,1) - newstabbar.removeItem(newstabbar.contentChildren[newstabbar.currentIndex]); - newstabbar.currentIndex=0; - newsSwipeview.removeItem(newsStack) - newsSwipeview.currentIndex=0; - } - } - } - Rectangle{ id:downloadNotice property alias text: noticeText.text @@ -535,8 +543,6 @@ Rectangle{ } Component.onCompleted: { - print("globaloptions.defaultNewsTypes.indexOf(newsSwipeview.stacktype)>-1 " +(globaloptions.defaultNewsTypes.indexOf(newsSwipeview.stacktype)>-1)) - root.newstypeSignal.connect(newstypeHandling); root.contactdetailsSignal.connect(showContact); root.newsSignal.connect(showNews); root.searchSignal.connect(search); @@ -544,6 +550,7 @@ Rectangle{ swipeIndicator.visible=true; root.globaloptions.hasOwnProperty("newsViewType")?newstab.newstabstatus=root.globaloptions.newsViewType:newstab.newstabstatus="Conversations"; newstabstatus=newstab.newstabstatus; - loadDBNews() + if(newsSwipeview.stacktype=="Search"){searchBox.visible=true} //else if (newsSwipeview.stacktype=="Group News"){newstypeHandling("groupnews")} + if(["Home","DirectMessages","Notifications","Replies"].indexOf(newsSwipeview.stacktype)>-1){loadDBNews()} } } diff --git a/source-linux/qml/newsqml/NewsTab.qml b/src/qml/newsqml/NewsTab.qml similarity index 78% rename from source-linux/qml/newsqml/NewsTab.qml rename to src/qml/newsqml/NewsTab.qml index 65a92db..f80f3fb 100644 --- a/source-linux/qml/newsqml/NewsTab.qml +++ b/src/qml/newsqml/NewsTab.qml @@ -29,7 +29,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.15 +import QtQuick 6.3 import QtQuick.Controls 6.3 import "qrc:/qml/newsqml" import "qrc:/qml/genericqml" @@ -42,6 +42,7 @@ Page{ width:rootstack.width height: rootstack.height property var newstypes: globaloptions.hasOwnProperty("defaultNewsTypes")?globaloptions.defaultNewsTypes:["Home","Replies","DirectMessages","Notifications"] + property bool expectScreenUpdate: false Timer {id:contacttimer; interval: 50; running: false; repeat: false onTriggered: { @@ -118,31 +119,44 @@ Page{ parentId=newsitemobject.id replyUser=newsitemobject.user.screen_name; } -// var messageString='import QtQuick 2.15; import QtQuick.Window 2.0; import "qrc:/qml/newsqml";'+ -// ' Window{id:messageWindow; title:"Message"; width:root.width; height:root.height; '+ -// 'MessageSend{state:"'+messageState+'"} Component.onCompleted: {x=Screen.width/2-width/2; y=Screen.height/2-height/2}}'; -// var messageObject=Qt.createQmlObject(messageString,root,"messageOutput"); + // var messageString='import qtquick 6.3; import QtQuick.Window 2.0; import "qrc:/qml/newsqml";'+ + // ' Window{id:messageWindow; title:"Message"; width:root.width; height:root.height; '+ + // 'MessageSend{state:"'+messageState+'"} Component.onCompleted: {x=Screen.width/2-width/2; y=Screen.height/2-height/2}}'; + // var messageObject=Qt.createQmlObject(messageString,root,"messageOutput"); var messageObject = Qt.createComponent("qrc:/qml/newsqml/MessageSend.qml"); var messageWindow=messageObject.createObject(root, { parentId: parentId, reply_to_user: replyUser, windowstate: messageState }); messageWindow.show(); } +// function getIcon(typerequest){ +// switch (typerequest){ +// case "Home": return "\uf015" +// case "Favorites": return "\uf005"; +// case "Replies": return "\uf0ec"; +// case "DirectMessages": return "\uf0e0"; +// case "Public Timeline": return "\uf0ac"; +// case "Group News": return "\uf0c0"; +// case "Search": return "\uf002"; +// case "Notifications": return "\uf0f3"; +// } +// } + function getIcon(typerequest){ switch (typerequest){ - case "Home": return "\uf015" - case "Favorites": return "\uf005"; - case "Replies": return "\uf0ec"; - case "DirectMessages": return "\uf0e0"; - case "Public Timeline": return "\uf0ac"; - case "Group News": return "\uf0c0"; - case "Search": return "\uf002"; - case "Notifications": return "\uf0f3"; + case "Home": return {iconName:"user-home-symbolic",iconUrl:"qrc:/assets/icons/home.svg"}; + case "Favorites": return {iconName:"starred-symbolic",iconUrl:"qrc:/assets/icons/star.svg"}; + case "Replies": return {iconName:"mail-reply-all",iconUrl:"qrc:/assets/icons/exchange.svg"}; + case "DirectMessages": return {iconName:"mail-message",iconUrl:"qrc:/assets/icons/envelope.svg"}; + case "Public Timeline": return {iconName:"globe",iconUrl:"qrc:/assets/icons/globe.svg"}; + case "Group News": return {iconName:"group",iconUrl:"qrc:/assets/icons/users.svg"}; + case "Search": return {iconName:"search",iconUrl:"qrc:/assets/icons/search.svg"}; + case "Notifications": return {iconName:"notifications",iconUrl:"qrc:/assets/icons/bell.svg"}; } } function addToolbutton(buttontype){ var component = Qt.createComponent("qrc:/qml/newsqml/NewsTabbutton.qml"); - var tabcomp = component.createObject(newstabbar,{"buttontype":buttontype}); + var tabcomp = component.createObject(newstabbar,{buttontype:buttontype,"buttonIcon":getIcon(buttontype)}); newstabbar.addItem(tabcomp); } // CalendarTab{ @@ -161,26 +175,18 @@ Page{ //MessageSend{} - BlueButton{ - z:2 - anchors.right: parent.right - visible: !wideScreen - fontColor: "grey" - border.color: "transparent" - text: "\uf0c9" - font.pointSize: osSettings.bigFontSize - onClicked:{ - leftDrawerAndroid.visible?leftDrawerAndroid.close():leftDrawerAndroid.open()} - } + //BlueButton{ + MButton{ z:2 anchors.right: parent.right - anchors.bottom: parent.bottom + anchors.bottom: newsSwipeview.bottom // fontColor: "grey" // border.color: "transparent" - text: "\uf040" - font.pointSize: osSettings.bigFontSize + icon.name: "open-for-editing" + //text: "o \uf040" + //implicitHeight: root.fontFactor*osSettings.bigFontSize onClicked:{ if (newsSwipeview.stacktype=="DirectMessages"){openMessageSend("directmessage","")} else {openMessageSend("active","")} @@ -215,9 +221,8 @@ Page{ SwipeView{ id: newsSwipeview property string stacktype:"Home" - currentIndex: 0 width: wideScreen&&rootstackView.depth<2?newstabitem.width-leftDrawer.width:newstabitem.width//newstabitem.width/3*2:newstabitem.width - height: newstabitem.height-newstabbar.height + height: newstabitem.height-(newstabbar.height+root.fontFactor*osSettings.systemFontSize) x: leftDrawer.width y: newstabbar.height function onDirectMessage(friend){currentIndex=2} @@ -242,6 +247,20 @@ Page{ } } + ToolButton{ + z:2 + anchors.right: parent.right + anchors.top: parent.top + anchors.topMargin: newstabbar.height + visible: !wideScreen + icon.name: "application-menu" + icon.source: "qrc:/assets/icons/bars.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + onClicked:{ + leftDrawerAndroid.visible?leftDrawerAndroid.close():leftDrawerAndroid.open()} + } + PageIndicator { id: swipeIndicator z:5 @@ -254,19 +273,20 @@ Page{ } Connections{ - target: root - function onGlobaloptionsChanged(){ - newstypes=globaloptions.defaultNewsTypes; - while (newstabbar.count>0){ - newstabbar.removeItem(newstabbar.contentData[0]); + target: root + function onGlobaloptionsChanged(){ + newstypes=globaloptions.defaultNewsTypes; + while (newstabbar.count>0){ + newstabbar.removeItem(newstabbar.contentData[0]); + } + for (let view in newstypes){ + addToolbutton(newstypes[view]) + } } - for (let view in newstypes){ - addToolbutton(newstypes[view]) - } - } } Component.onCompleted: { - root.directmessageSignal.connect(newsSwipeview.onDirectMessage) + root.directmessageSignal.connect(newsSwipeview.onDirectMessage); + root.globaloptionsChanged(); } } diff --git a/source-linux/qml/newsqml/NewsTabbutton.qml b/src/qml/newsqml/NewsTabbutton.qml similarity index 73% rename from source-linux/qml/newsqml/NewsTabbutton.qml rename to src/qml/newsqml/NewsTabbutton.qml index cbde67c..d8c6e14 100644 --- a/source-linux/qml/newsqml/NewsTabbutton.qml +++ b/src/qml/newsqml/NewsTabbutton.qml @@ -29,22 +29,27 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.15 +import QtQuick 6.3 import QtQuick.Controls 6.3 TabButton { id: tabbutton - font.family: fontAwesome.name + //font.family: fontAwesome.name font.pointSize : osSettings.bigFontSize - width: newstabbar.width/5 + width: newstabbar.width/4 property string buttontype: "" - text: getIcon(buttontype) - background:Rectangle{ - anchors.fill: parent - color: osSettings.backgroundDimColor - border.color: newstypes[newsSwipeview.currentIndex]==buttontype?osSettings.accentColor:color - } - ToolTip.delay: 500 + property var buttonIcon: ({}) + icon.name: buttonIcon.iconName + icon.source: buttonIcon.iconUrl + //icon.color: newstypes[newsSwipeview.currentIndex]==buttontype?osSettings.accentColor:color + icon.height: root.fontFactor*osSettings.bigFontSize + icon.width: root.fontFactor*osSettings.bigFontSize + // background:Rectangle{ + // anchors.fill: parent + // color: osSettings.backgroundDimColor + // border.color: newstypes[newsSwipeview.currentIndex]==buttontype?osSettings.accentColor:color + // } + ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr(buttontype) onDoubleClicked: {newstypeSignal(buttontype)} diff --git a/source-linux/qml/newsqml/NewsVideo.qml b/src/qml/newsqml/NewsVideo.qml similarity index 82% rename from source-linux/qml/newsqml/NewsVideo.qml rename to src/qml/newsqml/NewsVideo.qml index 2d68034..f713c9b 100644 --- a/source-linux/qml/newsqml/NewsVideo.qml +++ b/src/qml/newsqml/NewsVideo.qml @@ -29,22 +29,26 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.9 +import QtQuick 6.3 Rectangle{ - color:"black" + color:"grey" width:toprow.width/2; - height:toprow.width/3//video.hasVideo?newscolumn.width/4*3:10*mm + height:toprow.width/3 property var attachment:({}) - Text{ - id:noticeText - text:"\uf144"; - color:"light grey" - width:parent.width - font.pixelSize: parent.height/2 - x: (parent.width-contentWidth)/2 - y:parent.height/5 + Image{ + anchors.fill: parent + source: "qrc:/assets/icons/play.svg" } + // Text{ + // id:noticeText + // text:"\uf144"; + // color:"light grey" + // width:parent.width + // font.pixelSize: parent.height/2 + // x: (parent.width-contentWidth)/2 + // y:parent.height/5 + // } MouseArea {anchors.fill:parent; onClicked:{ diff --git a/source-linux/qml/newsqml/NewsVideoLarge.qml b/src/qml/newsqml/NewsVideoLarge.qml similarity index 90% rename from source-linux/qml/newsqml/NewsVideoLarge.qml rename to src/qml/newsqml/NewsVideoLarge.qml index 6b3e581..6c1c4c2 100644 --- a/source-linux/qml/newsqml/NewsVideoLarge.qml +++ b/src/qml/newsqml/NewsVideoLarge.qml @@ -29,18 +29,17 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtMultimedia 5.15 -import QtQuick 2.11 -import QtQuick.Controls 2.12 +import QtMultimedia 6.3 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/qml/genericqml" Page{ id:newsvideofullscreen - //color:"black" - //border.color: "light grey" width:root.width; height:root.height-3*root.fontFactor*osSettings.bigFontSize property alias source:video.source + property string mimetype:"" Text{ id:noticeText text:"" @@ -56,12 +55,12 @@ Page{ Video { id:video; anchors.fill:parent - property string mimetype:"" + onErrorChanged:{noticeText.font.pointSize=osSettings.bigFontSize;noticeText.text=errorString;} fillMode: Image.PreserveAspectFit; - autoLoad: true - autoPlay: true - audioRole: MediaPlayer.VideoRole +// autoLoad: true +// autoPlay: true +// audioRole: MediaPlayer.VideoRole } ProgressBar{ @@ -99,7 +98,10 @@ Page{ anchors.topMargin: 1*mm anchors.right: parent.right anchors.rightMargin: 1*mm - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" onClicked: {if (rootstackView.depth>1){ rootstackView.pop()} } } diff --git a/source-linux/qml/newsqml/Newsitem.qml b/src/qml/newsqml/Newsitem.qml similarity index 81% rename from source-linux/qml/newsqml/Newsitem.qml rename to src/qml/newsqml/Newsitem.qml index 616aef2..a1522de 100644 --- a/source-linux/qml/newsqml/Newsitem.qml +++ b/src/qml/newsqml/Newsitem.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/js/news.js" as Newsjs import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -93,7 +93,7 @@ Item { width: 2*root.fontFactor*osSettings.bigFontSize height: 2*root.fontFactor*osSettings.bigFontSize //radius:mm - onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} + onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/assets/defaultcontact.jpg"} } Flow{ id:topFlow @@ -103,6 +103,7 @@ Item { anchors.margins: mm Label { id:user_name + color: osSettings.primaryTextColor width:parent.width font.bold: true font.pointSize: osSettings.systemFontSize @@ -183,26 +184,33 @@ Item { } - BlueButton{ + Button{ width: newsitem.width-2 height:5*mm anchors.bottom: toprow.bottom visible: toprow.implicitHeight>3/4*root.height || newsitemobject.nsfw - text:"\uf078" - fontColor: osSettings.secondaryTextColor - border.color: "transparent" - color: osSettings.backgroundColor + //text:"\uf078" +// fontColor: osSettings.secondaryTextColor +// border.color: "transparent" +// color: osSettings.backgroundColor // gradient: Gradient { // GradientStop { position: 0.0; color: "transparent" } // GradientStop { position: 0.5; color: osSettings.backgroundDimColor} // } - radius:0 + //radius:0 + icon.name:"arrow-down" + icon.source: "qrc:/assets/icons/chevron-down.svg" + icon.width: 2*root.fontFactor*osSettings.bigFontSize + icon.height: 2*root.fontFactor*osSettings.bigFontSize + background: Rectangle{color: "transparent"; + radius: 0.5*mm} onClicked: { - if (text=="\uf078"){ - toprow.height=toprow.implicitHeight+6*mm;text="\uf077" + if (icon.name=="arrow-down"){ + toprow.height=toprow.implicitHeight+6*mm; + icon.name=="arrow-up";icon.source="qrc:/assets/icons/chevron-up.svg"; } else { toprow.height=Math.min(toprow.implicitHeight,3/4*root.height); - text="\uf078"; + icon.name=="arrow-down";icon.source="qrc:/assets/icons/chevron-down.svg"; newsView.positionViewAtIndex(index,ListView.Beginning); } } @@ -273,25 +281,17 @@ Item { Row{id:controlrow anchors.top:friendicaActivities.bottom height: 1.5*root.fontFactor*osSettings.bigFontSize - CheckBox{ + ToolButton{ id:likeCheckbox width:newsitem.width/5 height: parent.height visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false checked:(model.newsitemobject.friendica_activities_view.self.liked==1)?true:false - indicator: Rectangle{ - height: parent.height - implicitWidth: newsitem.width/5 - implicitHeight:root.fontFactor*osSettings.bigFontSize - color:"transparent" - Text{ - anchors.centerIn: parent - font.pointSize: osSettings.bigFontSize - font.family:fontAwesome.name - color:likeCheckbox.checked?osSettings.primaryTextColor: osSettings.secondaryTextColor - text:likeCheckbox.checked?"\uf118"+"!":"\uf118" - } - } + icon.name:"smiley" + icon.source: "qrc:/assets/icons/smile-o.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + onClicked: { if(likeCheckbox.checked==true){Newsjs.like(root.login,root.db,1,"like",newsitemobject.id,root);dislikeCheckbox.checked=false; newsitemobject.friendica_activities_view.self.liked=1; @@ -302,25 +302,17 @@ Item { newsitem.ListView.view.model.set(index,{"newsitemobject":newsitemobject}); }} } - CheckBox{ + ToolButton{ id: dislikeCheckbox width:newsitem.width/5 height: parent.height visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false checked: (newsitemobject.friendica_activities_view.self.disliked==1)?true:false - indicator: Rectangle{ - height: parent.height - implicitWidth: newsitem.width/5 - implicitHeight:root.fontFactor*osSettings.bigFontSize - color:"transparent" - Text{ - anchors.centerIn: parent - font.pointSize: osSettings.bigFontSize - font.family:fontAwesome.name - color:dislikeCheckbox.checked?osSettings.primaryTextColor: osSettings.secondaryTextColor - text: dislikeCheckbox.checked?"\uf119"+"!":"\uf119" - } - } + //icon.name:"frown" + icon.source: favoritedCheckbox.checked?"qrc:/assets/icons/star.svg":"qrc:/assets/icons/frown-o.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + onClicked: { if (dislikeCheckbox.checked==true){Newsjs.like(root.login,root.db,1,"dislike",newsitemobject.id,root);likeCheckbox.checked=false; newsitemobject.friendica_activities_view.self.disliked=1; @@ -332,86 +324,56 @@ Item { }} } - CheckBox { + ToolButton{ + //CheckBox { id:favoritedCheckbox visible:((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3)) width: newsitem.width/5 height: parent.height - indicator:Rectangle{ - height: parent.height - implicitWidth: newsitem.width/5 - implicitHeight:root.fontFactor*osSettings.bigFontSize - color:"transparent" - Text{ - anchors.centerIn: parent - font.pointSize: osSettings.bigFontSize - font.family:fontAwesome.name - color: favoritedCheckbox.checked?osSettings.primaryTextColor: osSettings.secondaryTextColor - text:"\uf005" - } - } + icon.name: favoritedCheckbox.checked?"starred-symbolic":"non-starred-symbolic" + icon.source: favoritedCheckbox.checked?"qrc:/assets/icons/star.svg":"qrc:/assets/icons/star-o.svg" + icon.width: root.fontFactor*osSettings.systemFontSize + icon.height: root.fontFactor*osSettings.systemFontSize + icon.color: favoritedCheckbox.checked?osSettings.primaryTextColor: osSettings.secondaryTextColor checked:(newsitemobject.favorited>0) onClicked:{ - if(favoritedCheckbox.checkState==Qt.Checked){ - Newsjs.favorite(login,true,newsitemobject.id,root); model.newsitemobject.favorited=1} - else if(favoritedCheckbox.checkState==Qt.Unchecked){ - Newsjs.favorite(login,false,newsitemobject.id,root);model.newsitemobject.favorited=0} - } - } - Rectangle{ - width: newsitem.width/5 - height: parent.height - visible:(newsitemobject.messagetype!==2) - color:"transparent" - Text{ - id:replysymbol - color: osSettings.secondaryTextColor - anchors.centerIn: parent - font.pointSize: osSettings.bigFontSize - font.family:fontAwesome.name - text: "\uf112" - } - MouseArea{ - anchors.fill:parent - onClicked: { - openMessageSend("reply",newsitemobject) + if(!checked){ + Newsjs.favorite(login,true,newsitemobject.id,root); model.newsitemobject.favorited=1; + checked=true + } + else if(checked){ + Newsjs.favorite(login,false,newsitemobject.id,root);model.newsitemobject.favorited=0; + checked=false } - -// var directmessage=0; -// if (newsitemobject.messagetype==1){ directmessage=1} -// var replycomp=Qt.createComponent("qrc:/qml/newsqml/MessageSend.qml"); -// var conversation; -// if (newsitem.ListView.view==null){conversation=true} -// else if (newsitem.ListView.view.viewtype=="conversation"){ -// conversation=true -// newsitem.ListView.view.currentIndex=itemindex -// } -// else{ -// conversation=false; -// newsitem.ListView.view.currentIndex=itemindex -// }; -// var reply=replycomp.createObject(friendicaActivities,{parentId:newsitemobject.id,reply_to_user:newsitemobject.user.screen_name, state:"reply",conversation:conversation,textfocus:true}) -// } } } - Rectangle{ + + ToolButton{ + id: reply + visible: (newsitemobject.messagetype!==2) width: newsitem.width/5 height: parent.height - visible:(newsitemobject.messagetype!==2) - color:"transparent" - Text{ - id:newsmenusymbol - color: osSettings.secondaryTextColor - anchors.centerIn: parent - font.pointSize: osSettings.bigFontSize - font.family:fontAwesome.name - text: "\uf142" + icon.name: "comment-symbolic" + icon.source: "qrc:/assets/icons/reply.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + onClicked:{ + openMessageSend("reply",newsitemobject) + } + } + + ToolButton{ + id: menubutton + visible: (newsitemobject.messagetype!==2) + width: newsitem.width/5 + height: parent.height + icon.name: "overflow-menu" + icon.source: "qrc:/assets/icons/ellipsis-v.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + onClicked:{newsmenu.popup()} } - MouseArea{ - anchors.fill:parent - onClicked: {newsmenu.popup()}} } - } Menu { id:newsmenu @@ -474,7 +436,7 @@ Item { Action{ text:qsTr("Calendar Entry") onTriggered:{ - rootstack.currentIndex=3; + rootstackSignal(3); bar.currentIndex=3; eventcreateSignal(newsitemobject); } diff --git a/source-linux/qml/newsqml/PermissionDialog.qml b/src/qml/newsqml/PermissionDialog.qml similarity index 100% rename from source-linux/qml/newsqml/PermissionDialog.qml rename to src/qml/newsqml/PermissionDialog.qml diff --git a/source-linux/qml/newsqml/ReportUser.qml b/src/qml/newsqml/ReportUser.qml similarity index 98% rename from source-linux/qml/newsqml/ReportUser.qml rename to src/qml/newsqml/ReportUser.qml index 4b5884f..2583785 100644 --- a/source-linux/qml/newsqml/ReportUser.qml +++ b/src/qml/newsqml/ReportUser.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.0 -import QtQuick.Controls 2.15 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/js/helper.js" as Helperjs Dialog { diff --git a/source-linux/qml/newsqml/SmileyDialog.qml b/src/qml/newsqml/SmileyDialog.qml similarity index 53% rename from source-linux/qml/newsqml/SmileyDialog.qml rename to src/qml/newsqml/SmileyDialog.qml index bd95561..613b696 100644 --- a/source-linux/qml/newsqml/SmileyDialog.qml +++ b/src/qml/newsqml/SmileyDialog.qml @@ -29,9 +29,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.11 -import QtQuick.Controls 2.12 -import QtQuick.Layouts 1.11 +import QtQuick 6.3 +import QtQuick.Controls 6.3 +import QtQuick.Layouts import "qrc:/js/smiley.js" as Smileyjs import "qrc:/js/helper.js" as Helperjs import "qrc:/qml/genericqml" @@ -44,75 +44,60 @@ Rectangle{ color: osSettings.backgroundColor MButton{ - id:closeButton - anchors.top: parent.top - anchors.topMargin: 1*mm - anchors.right: parent.right - anchors.rightMargin: 1*mm - text: "\uf057" - onClicked:{smileyDialog.visible=false} - } - - - TabBar { - id: smileybar - width: parent.width - height: 9*mm - position:TabBar.Header - TabButton { - text:qsTr("Unicode") - font.pointSize: osSettings.systemFontSize - } - } - - StackLayout{ - id:smileyTabView - currentIndex: smileybar.currentIndex - anchors.top: closeButton.bottom + id:closeButton + anchors.top: parent.top anchors.topMargin: 1*mm - width: smileyDialog.width-2*mm - height: smileyDialog.height-4*root.fontFactor*osSettings.bigFontSize - Rectangle{ - id: htmlGridTab - color: osSettings.backgroundColor - GridView { - id:htmlView - anchors.fill: parent - cellWidth: 5*mm - cellHeight: 5*mm - clip: true - model: htmlModel - delegate: htmlItem - } - - ListModel{ - id:htmlModel - } - Component.onCompleted:{ - for (var icon in Smileyjs.html){ - htmlModel.append({"emoji":Smileyjs.html[icon]}) - } - } - } + anchors.right: parent.right + anchors.rightMargin: 1*mm + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" + onClicked:{smileyDialog.visible=false} } - + + Rectangle{ + id: htmlGridTab + color: osSettings.backgroundColor + width: smileyDialog.width-4*root.fontFactor*osSettings.bigFontSize//2*mm + height: smileyDialog.height//-4*root.fontFactor*osSettings.bigFontSize + + GridView { + id:htmlView + anchors.fill: parent + cellWidth: 5*mm + cellHeight: 5*mm + clip: true + model: htmlModel + delegate: htmlItem + } + + ListModel{ + id:htmlModel + } + Component.onCompleted:{ + for (var icon in Smileyjs.html){ + htmlModel.append({"emoji":Smileyjs.html[icon]}) + } + } + } + Component{ - id:htmlItem + id:htmlItem Label{id:smileText - width:4.5*mm - height: 4.5*mm - textFormat:Text.RichText - font.pointSize: osSettings.osType=="Linux"?1.7*osSettings.systemFontSize:1.4*osSettings.systemFontSize - text: emoji - + width:4.5*mm + height: 4.5*mm + textFormat:Text.RichText + font.pointSize: osSettings.osType=="Linux"?1.7*osSettings.systemFontSize:1.4*osSettings.systemFontSize + text: emoji + MouseArea{ anchors.fill: parent onClicked:{ - //bodyField.append(emoji.name+" ") bodyField.insert(bodyField.cursorPosition,emoji+" "); - smileyDialog.visible=false - } + smileyDialog.visible=false } } - } + } } +} diff --git a/source-linux/qml/photoqml/ImageUploadDialog.qml b/src/qml/photoqml/ImageUploadDialog.qml similarity index 97% rename from source-linux/qml/photoqml/ImageUploadDialog.qml rename to src/qml/photoqml/ImageUploadDialog.qml index 0412489..012a646 100644 --- a/source-linux/qml/photoqml/ImageUploadDialog.qml +++ b/src/qml/photoqml/ImageUploadDialog.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.5 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/js/helper.js" as Helperjs import "qrc:/js/image.js" as Imagejs import "qrc:/qml/genericqml" @@ -138,7 +138,10 @@ Page{ MButton{ id:closeButton - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" width: 2.5*root.fontFactor*osSettings.bigFontSize font.pointSize: osSettings.bigFontSize onClicked:{photoStack.pop()} @@ -286,7 +289,7 @@ Page{ fontSize: 3*osSettings.bigFontSize onClicked:{ imagePicking=true; - var imagePicker = Qt.createQmlObject('import QtQuick 2.0; import "qrc:/qml/genericqml";'+ + var imagePicker = Qt.createQmlObject('import QtQuick 6.3; import "qrc:/qml/genericqml";'+ osSettings.imagePickQml+'{multiple : false;onReady: {'+ 'attachImage(imageUrl)}}',imageDialog,"imagePicker"); imagePicker.pickImage()} diff --git a/source-linux/qml/photoqml/PhotoComponent.qml b/src/qml/photoqml/PhotoComponent.qml similarity index 97% rename from source-linux/qml/photoqml/PhotoComponent.qml rename to src/qml/photoqml/PhotoComponent.qml index 5e67fe4..1488dd3 100644 --- a/source-linux/qml/photoqml/PhotoComponent.qml +++ b/src/qml/photoqml/PhotoComponent.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.5 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import "qrc:/qml/photoqml" Package { @@ -84,7 +84,7 @@ Package { MouseArea { width: realImage.paintedWidth; height: realImage.paintedHeight; anchors.centerIn: realImage onPressAndHold:{ - var menuString="import QtQuick 2.5;import QtQuick.Controls 2.12; "+ + var menuString="import QtQuick 6.3;import QtQuick.Controls 6.3; "+ "Menu {MenuItem {text:qsTr('Delete on client and server'); onTriggered: {"+ "changeimage('delete','image','"+imageLocation+"');photoModel.remove(index)}}"+ "MenuItem {text:qsTr('Move to album'); onTriggered: {"+ diff --git a/source-linux/qml/photoqml/PhotoTab.qml b/src/qml/photoqml/PhotoTab.qml similarity index 93% rename from source-linux/qml/photoqml/PhotoTab.qml rename to src/qml/photoqml/PhotoTab.qml index 1addf00..6168800 100644 --- a/source-linux/qml/photoqml/PhotoTab.qml +++ b/src/qml/photoqml/PhotoTab.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.5 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import QtQml.Models 2.1 import "qrc:/js/image.js" as Imagejs import "qrc:/js/helper.js" as Helperjs @@ -42,7 +42,7 @@ StackView{ id: photoStack initialItem:Rectangle { id:fotorectangle - anchors.fill:parent + //anchors.fill:parent color: osSettings.backgroundColor property var newimages:[] property int currentimageno: 0 @@ -122,11 +122,11 @@ StackView{ function showFotos(login,friend){ if(friend=="backButton"){ if (photoStack.depth > 1){photoStack.pop()} - else if(albumgridview.currentItem==null){rootstack.currentIndex=0} + else if(albumgridview.currentItem==null){rootstackSignal(0)} else if(albumgridview.currentItem.state=='fullscreen'){ albumgridview.currentItem.state = 'inGrid'} else if (albumgridview.currentItem.state == 'inGrid'){albumgridview.currentItem.state=''} - else{rootstack.currentIndex=0} + else{rootstackSignal(0)} } else{ try {photogroupModel.clear()}catch (e){print(e)} @@ -170,13 +170,16 @@ StackView{ photoStack.push("qrc:/qml/photoqml/ImageUploadDialog.qml",{"attachImageURLs":urls}) } - BlueButton{ + ToolButton{ + id:menuButton z:2 + anchors.right: parent.right + anchors.top: parent.top visible: !wideScreen - fontColor: osSettings.secondaryTextColor//"grey" - border.color: "transparent" - text: "\uf0c9" - font.pointSize: osSettings.bigFontSize + icon.name: "application-menu" + icon.source: "qrc:/assets/icons/bars.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize onClicked:{ leftDrawerAndroid.visible?leftDrawerAndroid.close():leftDrawerAndroid.open()} } @@ -210,7 +213,10 @@ StackView{ anchors.topMargin: 0.5*mm anchors.right:updatePhotolist.left anchors.rightMargin:mm - text:"\uf0ee" + text: qsTr("upload") + display: AbstractButton.IconOnly + icon.name: "cloud-upload" + icon.source: "qrc:/assets/icons/cloud-upload.svg" onClicked: {photoStack.push("qrc:/qml/photoqml/ImageUploadDialog.qml")} } @@ -220,7 +226,10 @@ StackView{ anchors.topMargin: 0.5*mm anchors.right:phototabstatusButton.left anchors.rightMargin:mm - text:"\uf0ed" + text: qsTr("download") + display: AbstractButton.IconOnly + icon.name: "cloud-download" + icon.source: "qrc:/assets/icons/cloud-download.svg" Menu { id:photoupdatemenu @@ -245,7 +254,7 @@ StackView{ id: phototabstatusButton anchors.top: parent.top anchors.topMargin: 0.5*mm - anchors.right: parent.right + anchors.right: menuButton.left anchors.rightMargin:2*mm width: Math.max(8*root.fontFactor*osSettings.bigFontSize,implicitWidth) text: fotostab.phototabstatus=="Images"?qsTr("Own Images"):fotostab.phototabstatus @@ -319,7 +328,10 @@ StackView{ MButton { id: backButton - text: "\uf057" + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" x: parent.width - backButton.width - root.fontFactor*osSettings.bigFontSize y: -backButton.height - root.fontFactor*osSettings.bigFontSize z:2 diff --git a/source-linux/qml/photoqml/PhotogroupComponent.qml b/src/qml/photoqml/PhotogroupComponent.qml similarity index 96% rename from source-linux/qml/photoqml/PhotogroupComponent.qml rename to src/qml/photoqml/PhotogroupComponent.qml index f847088..96f6feb 100644 --- a/source-linux/qml/photoqml/PhotogroupComponent.qml +++ b/src/qml/photoqml/PhotogroupComponent.qml @@ -29,8 +29,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -import QtQuick 2.5 -import QtQuick.Controls 2.12 +import QtQuick 6.3 +import QtQuick.Controls 6.3 import QtQml.Models 2.1 //import "qrc:/js/service.js" as Service import "qrc:/js/image.js" as Imagejs @@ -135,7 +135,7 @@ Package { MouseArea { anchors.fill: parent onPressAndHold:{ - var menuString="import QtQuick.Controls 2.12; Menu {MenuItem{text:qsTr('Delete on client and server'); onTriggered: {deletepics('album',albumname);photogroupModel.remove(index)}}}"; + var menuString="import QtQuick.Controls 6.3; Menu {MenuItem{text:qsTr('Delete on client and server'); onTriggered: {deletepics('album',albumname);photogroupModel.remove(index)}}}"; var albummenuObject=Qt.createQmlObject(menuString,albumWrapper,"albummenuOutput") albummenuObject.popup() } diff --git a/source-linux/qtquickcontrols2.conf b/src/qtquickcontrols2.conf similarity index 100% rename from source-linux/qtquickcontrols2.conf rename to src/qtquickcontrols2.conf diff --git a/source-linux/translations/friendiqa-de.qm b/src/translations/friendiqa-de.qm similarity index 100% rename from source-linux/translations/friendiqa-de.qm rename to src/translations/friendiqa-de.qm diff --git a/source-linux/translations/friendiqa-de.ts b/src/translations/friendiqa-de.ts similarity index 100% rename from source-linux/translations/friendiqa-de.ts rename to src/translations/friendiqa-de.ts diff --git a/source-linux/translations/friendiqa-es.qm b/src/translations/friendiqa-es.qm similarity index 100% rename from source-linux/translations/friendiqa-es.qm rename to src/translations/friendiqa-es.qm diff --git a/source-linux/translations/friendiqa-es.ts b/src/translations/friendiqa-es.ts similarity index 100% rename from source-linux/translations/friendiqa-es.ts rename to src/translations/friendiqa-es.ts diff --git a/source-linux/translations/friendiqa-hu.qm b/src/translations/friendiqa-hu.qm similarity index 100% rename from source-linux/translations/friendiqa-hu.qm rename to src/translations/friendiqa-hu.qm diff --git a/source-linux/translations/friendiqa-hu.ts b/src/translations/friendiqa-hu.ts similarity index 100% rename from source-linux/translations/friendiqa-hu.ts rename to src/translations/friendiqa-hu.ts diff --git a/source-linux/translations/friendiqa-it.qm b/src/translations/friendiqa-it.qm similarity index 100% rename from source-linux/translations/friendiqa-it.qm rename to src/translations/friendiqa-it.qm diff --git a/source-linux/translations/friendiqa-it.ts b/src/translations/friendiqa-it.ts similarity index 100% rename from source-linux/translations/friendiqa-it.ts rename to src/translations/friendiqa-it.ts diff --git a/source-linux/translations/friendiqa-nl.qm b/src/translations/friendiqa-nl.qm similarity index 100% rename from source-linux/translations/friendiqa-nl.qm rename to src/translations/friendiqa-nl.qm diff --git a/source-linux/translations/friendiqa-nl.ts b/src/translations/friendiqa-nl.ts similarity index 100% rename from source-linux/translations/friendiqa-nl.ts rename to src/translations/friendiqa-nl.ts From ec102d8d6663f1b8c0eb42ca3124ec05ed5933df Mon Sep 17 00:00:00 2001 From: LubuWest Date: Mon, 15 Apr 2024 17:24:30 +0200 Subject: [PATCH 31/35] bugfixes and ts-files --- Linuxmobile.patch | 11 - src/common/friendiqa.cpp | 4 +- src/js/helper.js | 2 +- src/js/newsworker.js | 54 +- src/js/service.js | 2 +- src/qml/calendarqml/CalendarTab.qml | 2 +- src/qml/calendarqml/EventList.qml | 2 +- src/qml/configqml/AccountPage.qml | 8 +- src/qml/configqml/ConfigPage.qml | 22 +- src/qml/configqml/LeftDrawerScrollview.qml | 2 +- src/qml/contactqml/ContactsSearchPage.qml | 2 +- src/qml/contactqml/FriendsListTab.qml | 2 +- src/qml/contactqml/GroupsListTab.qml | 28 +- src/qml/friendiqa.qml | 222 +-- src/qml/genericqml/DrawerAccountComponent.qml | 24 +- src/qml/genericqml/RootStack.qml | 6 +- src/qml/newsqml/ContactPage.qml | 21 +- src/qml/newsqml/Conversation.qml | 6 +- src/qml/newsqml/MessageImageUploadDialog.qml | 2 +- src/qml/newsqml/MessageSend.qml | 46 +- src/qml/newsqml/NewsStack.qml | 22 +- src/qml/newsqml/NewsTab.qml | 12 +- src/qml/newsqml/NewsVideoLarge.qml | 6 +- src/qml/newsqml/Newsitem.qml | 42 +- src/translations/friendiqa-de.ts | 500 ++++- src/translations/friendiqa-es.ts | 1346 +++++++++++-- src/translations/friendiqa-hu.ts | 1520 +++++++++++++-- src/translations/friendiqa-it.ts | 1704 +++++++++++++++- src/translations/friendiqa-nl.ts | 1732 ++++++++++++++++- 29 files changed, 6611 insertions(+), 741 deletions(-) delete mode 100644 Linuxmobile.patch diff --git a/Linuxmobile.patch b/Linuxmobile.patch deleted file mode 100644 index 4da903a..0000000 --- a/Linuxmobile.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- source-linux/qml/friendiqa.qml -+++ source-linux/qml/friendiqa.qml -@@ -193,7 +193,7 @@ - color: Material.backgroundColor - } - -- header: ToolBar{ -+ footer: ToolBar{ - background: Rectangle{ - anchors.fill: parent - color: Material.backgroundDimColor diff --git a/src/common/friendiqa.cpp b/src/common/friendiqa.cpp index 1a7b466..4e144a0 100644 --- a/src/common/friendiqa.cpp +++ b/src/common/friendiqa.cpp @@ -73,7 +73,7 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) { int main(int argc, char *argv[]) { //qDebug()<< "argv Friendiqa"<< (qstrcmp(argv[1],"-service")==0) <<" argv2" <200){cleanmessage=cleanmessage.slice(0,200)+'...'} - var messageString='import QtQuick 6.3; import QtQuick.Controls 2.15; Dialog{ visible: true; title:"'+header+'";standardButtons: Dialog.Ok;anchors.centerIn: parent;Label{text:" '+cleanmessage+'"}}'; + var messageString='import QtQuick 6.3; import QtQuick.Controls 6.3; Dialog{ visible: true; title:"'+header+'";standardButtons: Dialog.Ok;anchors.centerIn: parent;Label{text:" '+cleanmessage+'"}}'; var messageObject=Qt.createQmlObject(messageString,rootwindow,"messageOutput"); } diff --git a/src/js/newsworker.js b/src/js/newsworker.js index e1a0966..8eab544 100644 --- a/src/js/newsworker.js +++ b/src/js/newsworker.js @@ -74,33 +74,33 @@ function beautify(newsitemobject,msg){ } }catch(e){print("attachment "+e)} newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(/class=\"attachment-image\"/g,"width=\"600\" "); - - for (var format in videoformats){ - if (newsitemobject.text.indexOf("."+videoformats[format])>-1){ - var videohelper={mimetype:"video/"+videoformats[format]} - var videotext=newsitemobject.text; - while (videotext.indexOf("."+videoformats[format])>-1){ - var videohelperstringposition=videotext.indexOf("."+videoformats[format]); - videohelper.url=videotext.substring(videotext.lastIndexOf("http",videohelperstringposition),videohelperstringposition+4); - videotext=videotext.substring(videohelperstringposition+4,videotext.length) - if ((videoAttachmentList.length==0) || (videoAttachmentList[videoAttachmentList.length-1].url!=videohelper.url)){videoAttachmentList.push(videohelper)} + try{ + for (var format in videoformats){ + if (newsitemobject.text.indexOf("."+videoformats[format])>-1){ + var videohelper={mimetype:"video/"+videoformats[format]} + var videotext=newsitemobject.text; + while (videotext.indexOf("."+videoformats[format])>-1){ + var videohelperstringposition=videotext.indexOf("."+videoformats[format]); + videohelper.url=videotext.substring(videotext.lastIndexOf("http",videohelperstringposition),videohelperstringposition+4); + videotext=videotext.substring(videohelperstringposition+4,videotext.length) + if ((videoAttachmentList.length==0) || (videoAttachmentList[videoAttachmentList.length-1].url!=videohelper.url)){videoAttachmentList.push(videohelper)} + } } } - } - if (newsitemobject.text.indexOf("/videos/watch/")>-1){ - var ptvideohelper={mimetype:"video/mp4"} - var ptvideotext=newsitemobject.text; - while (ptvideotext.indexOf("/videos/watch/")>-1){ - var ptvideohelperstringposition=ptvideotext.indexOf("/videos/watch/"); - var ptposend=findend(ptvideotext,ptvideohelperstringposition); - if(ptposend==-1){ptposend=ptvideotext.length}; - ptvideohelper.url=ptvideotext.substring(ptvideotext.lastIndexOf("http",ptvideohelperstringposition),ptposend)+"-480.mp4"; - ptvideohelper.url=ptvideohelper.url.replace("/videos/watch","/static/webseed"); - ptvideotext=ptvideotext.substring(ptposend,ptvideotext.length) - if ((videoAttachmentList.length==0) || (videoAttachmentList[videoAttachmentList.length-1].url!=ptvideohelper.url)){videoAttachmentList.push(ptvideohelper)} + if (newsitemobject.text.indexOf("/videos/watch/")>-1){ + var ptvideohelper={mimetype:"video/mp4"} + var ptvideotext=newsitemobject.text; + while (ptvideotext.indexOf("/videos/watch/")>-1){ + var ptvideohelperstringposition=ptvideotext.indexOf("/videos/watch/"); + var ptposend=findend(ptvideotext,ptvideohelperstringposition); + if(ptposend==-1){ptposend=ptvideotext.length}; + ptvideohelper.url=ptvideotext.substring(ptvideotext.lastIndexOf("http",ptvideohelperstringposition),ptposend)+"-480.mp4"; + ptvideohelper.url=ptvideohelper.url.replace("/videos/watch","/static/webseed"); + ptvideotext=ptvideotext.substring(ptposend,ptvideotext.length) + if ((videoAttachmentList.length==0) || (videoAttachmentList[videoAttachmentList.length-1].url!=ptvideohelper.url)){videoAttachmentList.push(ptvideohelper)} + } } - } - + }catch(e){print(e)} newsitemobject.videoAttachmentList=videoAttachmentList; newsitemobject.imageAttachmentList=imageAttachmentList; if ((msg.options.hasOwnProperty("hide_nsfw"))&&(msg.options.hide_nsfw==1)&&(newsitemobject.text.indexOf("#nsfw")>-1)){ @@ -129,7 +129,7 @@ WorkerScript.onMessage = function(msg) { if (!(typeof(newsitemobject.currentconversation)=='undefined') && (newsitemobject.currentconversation.length>0)){ let n=1; while ((n-1;k--){ - if (newsitemobject.in_reply_to_status_id==msg.model.get(k).newsitemobject.id){ + if (newsitemobject.in_reply_to_status_id==msg.model.get(k).newsitemobject.id){ newsitemobject.indent=(msg.model.get(k).newsitemobject.indent||0)+1; if (newsitemobject.indent>6){newsitemobject.indent=6}; firstReply=k; @@ -152,7 +152,7 @@ WorkerScript.onMessage = function(msg) { count+=1 } } - }} + }} data=({"newsitemobject": newsitemobject}) } if(data.newsitemobject.user.statusnet_blocking==true){break} diff --git a/src/js/service.js b/src/js/service.js index a9b40d0..8080a89 100644 --- a/src/js/service.js +++ b/src/js/service.js @@ -318,7 +318,7 @@ function processNews(api,data){ usermessages.push(newslist.status); newslist=usermessages; } - if (data=="" || api=="/api/v1/statuses"){newsBusy.running=false} + if (data=="" || api=="/api/v1/statuses"){showNews("")}//newsBusy.running=false} else if (typeof(newslist)=='undefined'){ Helperjs.showMessage(qsTr("Undefined Array Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root) } diff --git a/src/qml/calendarqml/CalendarTab.qml b/src/qml/calendarqml/CalendarTab.qml index 7daa5a1..9fa14c7 100644 --- a/src/qml/calendarqml/CalendarTab.qml +++ b/src/qml/calendarqml/CalendarTab.qml @@ -179,7 +179,7 @@ Rectangle { width: 2*root.fontFactor*osSettings.bigFontSize; display: AbstractButton.IconOnly text: qsTr("add") - icon.name: "list-add" + icon.name: "list-add-symbolic" icon.source: "qrc:/assets/icons/plus.svg" // background: Rectangle{color: osSettings.dialogColor; // radius: 0.5*mm} diff --git a/src/qml/calendarqml/EventList.qml b/src/qml/calendarqml/EventList.qml index 5e9c865..8fb4e58 100644 --- a/src/qml/calendarqml/EventList.qml +++ b/src/qml/calendarqml/EventList.qml @@ -65,7 +65,7 @@ Rectangle{ anchors.rightMargin:mm width: 2*root.fontFactor*osSettings.bigFontSize; display: AbstractButton.IconOnly - icon.name: "list-add" + icon.name: "list-add-symbolic" icon.source: "qrc:/assets/icons/plus.svg" onClicked: { rootstackView.push("qrc:/qml/calendarqml/EventCreate.qml",{"startDate": new Date(dayint*86400000)}) diff --git a/src/qml/configqml/AccountPage.qml b/src/qml/configqml/AccountPage.qml index ec150f6..98402c6 100644 --- a/src/qml/configqml/AccountPage.qml +++ b/src/qml/configqml/AccountPage.qml @@ -90,8 +90,8 @@ Page{ login=userconfig; news=[]; contactlist=[]; - if(rootstackView.depth>1){rootstackSignal(0)} - newstypeSignal("refresh"); + if(rootstackView.depth>1){rootstackSignal(0);newstypeSignal("refresh");} + else {rootstackView.replace("qrc:/qml/genericqml/RootStack.qml",StackView.PopTransition)}; },"isActive",0); Helperjs.showMessage(qsTr("Success"),qsTr("Name")+": "+credentials.display_name+"\nScreen Name: "+credentials.username,root) rootstackView.pop() @@ -259,7 +259,7 @@ Page{ MouseArea{ anchors.fill:parent onClicked:{ - let serverConfigString="import QtQuick 2.0; import QtQuick.Dialogs 6.3; MessageDialog{ visible: true; title:'Server';buttons: MessageDialog.Ok;text: 'Name: "+ + let serverConfigString="import QtQuick 6.3; import QtQuick.Dialogs 6.3; MessageDialog{ visible: true; title:'Server';buttons: MessageDialog.Ok;text: 'Name: "+ servericon.serverconfig.site.name+"\nLanguage: "+servericon.serverconfig.site.language+ "\nEmail: "+servericon.serverconfig.site.email+"\nTimezone: "+servericon.serverconfig.site.timezone+"\nClosed: "+servericon.serverconfig.site.closed+ "\nText limit: "+servericon.serverconfig.site.textlimit+"\nShort Url length: "+servericon.serverconfig.site.shorturllength+ @@ -275,7 +275,7 @@ Page{ id:serverSearchButton width: 3*root.fontFactor*osSettings.bigFontSize; height: 2.5*root.fontFactor*osSettings.bigFontSize //text:"\uf002" - icon.name: "search" + icon.name: "system-search" font.pointSize: osSettings.bigFontSize visible: servericon.visible?false:true onClicked:{Qt.openUrlExternally(Qt.resolvedUrl("https://dir.friendica.social/servers"))} diff --git a/src/qml/configqml/ConfigPage.qml b/src/qml/configqml/ConfigPage.qml index 5c8cbf0..003996c 100644 --- a/src/qml/configqml/ConfigPage.qml +++ b/src/qml/configqml/ConfigPage.qml @@ -61,13 +61,13 @@ Page{ height: 2*root.fontFactor*osSettings.bigFontSize width:10*root.fontFactor*osSettings.bigFontSize } - TabButton { - text: qsTr("Start") - visible:osSettings.osType=="Linux" - font.pointSize: osSettings.systemFontSize - height: 2*root.fontFactor*osSettings.bigFontSize - width:10*root.fontFactor*osSettings.bigFontSize - } +// TabButton { +// text: qsTr("Start") +// visible:osSettings.osType=="Linux" +// font.pointSize: osSettings.systemFontSize +// height: 2*root.fontFactor*osSettings.bigFontSize +// width:10*root.fontFactor*osSettings.bigFontSize +// } } LeftDrawerLinux{ @@ -108,10 +108,10 @@ Page{ source:(configTabView.currentIndex==1)? "qrc:/qml/configqml/SyncConfig.qml":"" } - Loader{ - id: startLoader - source:(configTabView.currentIndex==2)? "qrc:/qml/configqml/ConfigStartPage.qml":"" - } +// Loader{ +// id: startLoader +// source:(configTabView.currentIndex==2)? "qrc:/qml/configqml/ConfigStartPage.qml":"" +// } } MButton{ id:closeButton diff --git a/src/qml/configqml/LeftDrawerScrollview.qml b/src/qml/configqml/LeftDrawerScrollview.qml index 708df04..dd69727 100644 --- a/src/qml/configqml/LeftDrawerScrollview.qml +++ b/src/qml/configqml/LeftDrawerScrollview.qml @@ -100,7 +100,7 @@ ScrollView{ y:4*root.fontFactor*osSettings.bigFontSize font.pointSize: osSettings.systemFontSize text: qsTr("Quit") - icon.name: "system-log-out" + icon.name: "system-log-out-symbolic" icon.source: "qrc:/assets/icons/sign-out.svg" icon.height: root.fontFactor*osSettings.systemFontSize icon.width: root.fontFactor*osSettings.systemFontSize diff --git a/src/qml/contactqml/ContactsSearchPage.qml b/src/qml/contactqml/ContactsSearchPage.qml index 74657c9..d2a3689 100644 --- a/src/qml/contactqml/ContactsSearchPage.qml +++ b/src/qml/contactqml/ContactsSearchPage.qml @@ -128,7 +128,7 @@ Item{ anchors.topMargin: 0.5*root.fontFactor*osSettings.bigFontSize anchors.left: searchBox.right anchors.leftMargin: 0.5*root.fontFactor*osSettings.bigFontSize - icon.name: "search" + icon.name: "system-search" icon.source: "qrc:/assets/icons/search.svg" text: qsTr("Close") display: AbstractButton.IconOnly diff --git a/src/qml/contactqml/FriendsListTab.qml b/src/qml/contactqml/FriendsListTab.qml index ace40ad..427e126 100644 --- a/src/qml/contactqml/FriendsListTab.qml +++ b/src/qml/contactqml/FriendsListTab.qml @@ -217,7 +217,7 @@ Item{ ToolButton{ height: 2*root.fontFactor*osSettings.bigFontSize width:friendsView.width - icon.name:"list-add-user" + icon.name:"list-add-user-symbolic" icon.source: "qrc:/assets/icons/user-plus.svg" icon.width: 2*root.fontFactor*osSettings.bigFontSize icon.height: 2*root.fontFactor*osSettings.bigFontSize diff --git a/src/qml/contactqml/GroupsListTab.qml b/src/qml/contactqml/GroupsListTab.qml index 9767d68..10630dc 100644 --- a/src/qml/contactqml/GroupsListTab.qml +++ b/src/qml/contactqml/GroupsListTab.qml @@ -85,20 +85,20 @@ Item{ Newsjs.requestGroups(root.login,root.db,root,function(){ groupsGridTab.showGroups(root.login.username)})} } - MButton { - id: newGroupButton - text: "\uf234" - display: AbstractButton.IconOnly - icon.name:"list-add-user" - icon.source: "qrc:/assets/icons/user-plus.svg" - anchors.top: parent.top - anchors.topMargin: mm - anchors.right: updateGroupsButton.left - anchors.rightMargin: mm - onClicked: { - groupsModel.append({"group": {"new":true}}); - } - } +// MButton { +// id: newGroupButton +// text: "\uf234" +// display: AbstractButton.IconOnly +// icon.name:"list-add-user" +// icon.source: "qrc:/assets/icons/user-plus.svg" +// anchors.top: parent.top +// anchors.topMargin: mm +// anchors.right: updateGroupsButton.left +// anchors.rightMargin: mm +// onClicked: { +// groupsModel.append({"group": {"new":true}}); +// } +// } ListView { id: groupsView x:mm diff --git a/src/qml/friendiqa.qml b/src/qml/friendiqa.qml index 13cee29..bbd7240 100644 --- a/src/qml/friendiqa.qml +++ b/src/qml/friendiqa.qml @@ -57,7 +57,7 @@ ApplicationWindow{ property bool wideScreen : width>height signal rootstackSignal(int pageindex) signal fotoSignal(var username, var friend) - signal directmessageSignal(var friend) + signal sendmessageSignal(string type, var newsitemobject) signal newsSignal(var news) signal newstypeSignal(var type) signal friendsSignal(var username) @@ -161,20 +161,20 @@ ApplicationWindow{ // close.accepted=false // } - Service.cleanNews(root.db,function(){ - Service.cleanHashtags(root.db,function(){ - Service.cleanContacts(root.login,root.db,function(){ - if (osSettings.osType=="Android" || !iconTrayAvailable){ - Qt.quit() - } - else{ - systemTray.show(); - systemTray.showMessage("",qsTr("Background Sync\n Rightclick or Middleclick to Quit"),"",5000) - root.hide() - } - }) - })}) - close.accepted=true + Service.cleanNews(root.db,function(){ + Service.cleanHashtags(root.db,function(){ + Service.cleanContacts(root.login,root.db,function(){ + //if (osSettings.osType=="Android" || !iconTrayAvailable){ + Qt.quit() + //} +// else{ +// systemTray.show(); +// systemTray.showMessage("",qsTr("Background Sync\n Rightclick or Middleclick to Quit"),"",5000) +// root.hide() +// } + }) + })}) + close.accepted=true } //else if (bar.currentIndex==2){fotoSignal(login.username,"backButton");close.accepted=false} else {rootstackSignal(0);bar.currentIndex=0;close.accepted=false} @@ -192,112 +192,112 @@ ApplicationWindow{ anchors.fill: parent color: osSettings.backgroundDimColor } - RowLayout{ - anchors.fill: parent - TabBar { - id: bar - Layout.fillWidth: true - onCurrentIndexChanged: { - rootstackSignal(bar.currentIndex); - try{while(rootstackView.depth>1){rootstackView.pop()}}catch(e){} - } - TabButton { - width: bar.width/4 - icon.name: "format-list-unordered" - text: qsTr("Posts") - display: AbstractButton.IconOnly - icon.source: "qrc:/assets/icons/list.svg" - icon.width: root.fontFactor*osSettings.bigFontSize - icon.height: root.fontFactor*osSettings.bigFontSize - // background:Rectangle{ - // anchors.fill: parent - // color: osSettings.backgroundDimColor - // } - ToolTip.delay: 800 - ToolTip.visible: pressed || hovered - ToolTip.text: qsTr("Posts") - onDoubleClicked: {newstypeSignal("refresh")} - } - TabButton { - width: bar.width/4 - icon.name: "group" - text: qsTr("Contacts") - display: AbstractButton.IconOnly - icon.source: "qrc:/assets/icons/users.svg" - icon.width: root.fontFactor*osSettings.bigFontSize - icon.height: root.fontFactor*osSettings.bigFontSize - // background:Rectangle{ - // anchors.fill: parent - // color: osSettings.backgroundDimColor - // } - ToolTip.delay: 800 - ToolTip.visible: pressed || hovered - ToolTip.text: qsTr("Contacts") - } - TabButton { - width: bar.width/4 - icon.name: "viewimage" - text: qsTr("Images") - display: AbstractButton.IconOnly - icon.source: "qrc:/assets/icons/picture-o.svg" - icon.width: root.fontFactor*osSettings.bigFontSize - icon.height: root.fontFactor*osSettings.bigFontSize - // background:Rectangle{ - // anchors.fill: parent - // color: osSettings.backgroundDimColor - // } - ToolTip.delay: 800 - ToolTip.visible: pressed || hovered - ToolTip.text: qsTr("Photos") - } - TabButton { - width: bar.width/4 - icon.name: "view-calendar" - text: qsTr("Calendar") - display: AbstractButton.IconOnly - icon.source: "qrc:/assets/icons/calendar.svg" - icon.width: root.fontFactor*osSettings.bigFontSize - icon.height: root.fontFactor*osSettings.bigFontSize - // background:Rectangle{ - // anchors.fill: parent - // color: osSettings.backgroundDimColor - // } - ToolTip.delay: 800 - ToolTip.visible: pressed || hovered - ToolTip.text: qsTr("Calendar") - } + TabBar { + id: bar + width: parent.width + //Layout.fillWidth: true + onCurrentIndexChanged: { + rootstackSignal(bar.currentIndex); + try{while(rootstackView.depth>1){rootstackView.pop()}}catch(e){} + } + TabButton { + width: bar.width/4 + height: bar.height + icon.name: "format-list-unordered" + text: qsTr("Posts") + display: AbstractButton.IconOnly + icon.source: "qrc:/assets/icons/list.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + // background:Rectangle{ + // anchors.fill: parent + // color: osSettings.backgroundDimColor + // } + ToolTip.delay: 800 + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Posts") + onDoubleClicked: {newstypeSignal("refresh")} + } + TabButton { + width: bar.width/4 + height: bar.height + icon.name: "group" + text: qsTr("Contacts") + display: AbstractButton.IconOnly + icon.source: "qrc:/assets/icons/users.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + // background:Rectangle{ + // anchors.fill: parent + // color: osSettings.backgroundDimColor + // } + ToolTip.delay: 800 + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Contacts") + } + TabButton { + width: bar.width/4 + height: bar.height + icon.name: "viewimage" + text: qsTr("Images") + display: AbstractButton.IconOnly + icon.source: "qrc:/assets/icons/picture-o.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + // background:Rectangle{ + // anchors.fill: parent + // color: osSettings.backgroundDimColor + // } + ToolTip.delay: 800 + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Photos") + } + TabButton { + width: bar.width/4 + height: bar.height + icon.name: "view-calendar" + text: qsTr("Calendar") + display: AbstractButton.IconOnly + icon.source: "qrc:/assets/icons/calendar.svg" + icon.width: root.fontFactor*osSettings.bigFontSize + icon.height: root.fontFactor*osSettings.bigFontSize + // background:Rectangle{ + // anchors.fill: parent + // color: osSettings.backgroundDimColor + // } + ToolTip.delay: 800 + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Calendar") } } } StackView{id:rootstackView - //y:roottoolbar.height - //anchors.fill: parent width:root.width height: root.height-roottoolbar.contentHeight } - QSystemTrayIcon { - id: systemTray - visible: false - onActivated: { - if(reason === 3){ - root.show(); - bar.currentIndex=0; - root.globaloptions.hasOwnProperty("newsViewType")?newstab.newstabstatus=root.globaloptions.newsViewType:newstab.newstabstatus="Conversations"; - newstypeSignal(newstab.newstabstatus) - systemTray.hide() - } else { - Qt.quit() - } - } - Component.onCompleted: { - icon = root.colorheight property string parentId: "" - //property bool textfocus: false - //property bool conversation: false property string reply_to_user:"" property string windowstate:"" property alias bodyMessage: bodyField.text @@ -63,12 +62,6 @@ Window{ property var group_allow:login.hasOwnProperty("permissions")?login.permissions[2]:[] property var group_deny:login.hasOwnProperty("permissions")?login.permissions[3]:[] - // function directmessagePrepare(friend){ - // messageSend.state="active"; - // reply_to_user=friend.screen_name; - // receiverLabel.text=friend.screen_name; - // } - function sendUrls(urls){ attachImage(urls); messageSend.state="active"; @@ -123,19 +116,6 @@ Window{ messageSend.close() } - // function setParent(newsitemobject){ - // if (newsitemobject!=""){ - // messageSend.state="conversation" - // messageSend.reply_to_user=newsitemobject.user.screen_name; - // messageSend.parentId=newsitemobject.id - // } else { - // messageSend.state=null; - // messageSend.reply_to_user=""; - // messageSend.parentId=""; - // bodyField.text=""; - // } - // } - function contactmenu(letter){ Newsjs.listFriends(login,db,function(contacts){ contactModel.clear(); @@ -226,7 +206,7 @@ Window{ width: parent.width-2*mm font.pointSize: osSettings.bigFontSize placeholderText:qsTr("to:") - text: "" + text: reply_to_user visible:false onTextChanged: { if (text!=""){contactmenu(text)} else {var receiver=getText(0,cursorPosition);contactmenu(receiver+preeditText)}} @@ -257,7 +237,6 @@ Window{ id: bodyField property string contactprefix:"" property string placeholder: osSettings.osType=="Linux"? qsTr(" Drop your Content here."):"" - //anchors.fill: parent x:mm height:Math.max(bodyField.contentHeight+4*mm,2.5*root.fontFactor*osSettings.bigFontSize) width: parent.width @@ -302,19 +281,16 @@ Window{ text: qsTr("Copy") enabled: bodyField.selectedText action: copyAction - //onTriggered: bodyField.copy() } MenuItem { text: qsTr("Cut") enabled: bodyField.selectedText action: cutAction - //onTriggered: bodyField.cut() } MenuItem { text: qsTr("Paste") enabled: bodyField.canPaste action: pasteAction - //onTriggered: bodyField.paste() } MenuItem { text: qsTr("Text") @@ -346,7 +322,7 @@ Window{ if(Helperjs.getCount(db,login,"contacts","screen_name",contact.screen_name)>1){ contact.screen_name=contact.screen_name+"+"+contacts.cid } - if (newsSwipeview.stacktype=='DirectMessages'){ + if (windowstate=='directmessage'){ receiverLabel.text=contact.screen_name; reply_to_user=contact.screen_name } else { @@ -354,7 +330,7 @@ Window{ bodyField.insert(bodyField.cursorPosition, bodyField.contactprefix+contact.screen_name+" "); bodyField.cursorPosition=bodyField.cursorPosition+contact.screen_name.length+1 } - //receiverLabel.text=contact.screen_name; + contactSelector.visible=false } delegate: ContactComponent { } @@ -457,7 +433,7 @@ Window{ //text: "\uf044" text: qsTr("Format") display: AbstractButton.IconOnly - icon.name: "overflow-menu" + icon.name: "view-more-symbolic"//"overflow-menu" icon.source: "qrc:/assets/icons/ellipsis-v.svg" ToolTip.delay: 800 ToolTip.visible: pressed || hovered @@ -498,11 +474,11 @@ Window{ MButton{ id:hastagButton text: "#" - // display: AbstractButton.IconOnly - // icon.name: "tag-symbolic" - // icon.source: "qrc:/assets/icons/hashtag.svg" - // icon.width: root.fontFactor*osSettings.bigFontSize - // icon.height: root.fontFactor*osSettings.bigFontSize + // display: AbstractButton.IconOnly + // icon.name: "tag-symbolic" + // icon.source: "qrc:/assets/icons/hashtag.svg" + // icon.width: root.fontFactor*osSettings.bigFontSize + // icon.height: root.fontFactor*osSettings.bigFontSize ToolTip.delay: 800 ToolTip.visible: pressed || hovered ToolTip.text: qsTr("Insert previous hashtag") @@ -585,7 +561,7 @@ Window{ // root.directmessageSignal.connect(directmessagePrepare); root.uploadSignal.connect(sendUrls); root.sendtextSignal.connect(sendtext); - // if (textfocus==true){bodyField.forceActiveFocus()} + bodyField.forceActiveFocus() } StateGroup{ diff --git a/src/qml/newsqml/NewsStack.qml b/src/qml/newsqml/NewsStack.qml index a653219..7fc35b5 100644 --- a/src/qml/newsqml/NewsStack.qml +++ b/src/qml/newsqml/NewsStack.qml @@ -45,6 +45,7 @@ Rectangle{ property string newstabstatus: "" function newstypeHandling(newstype){ + newsModel.clear(); //if (!newsBusy.running) { try{newsBusy.running=true}catch(e){print("newsBusy.running=true " + e)}; //root.replySignal(""); @@ -173,7 +174,7 @@ Rectangle{ newsView.anchors.topMargin=mm } - function getOldNews(){print("getoldnews") + function getOldNews(){ var currentTime= new Date(); try{var oldnewsitemobject=newsModel.get(newsModel.count-1).newsitemobject; @@ -238,7 +239,12 @@ Rectangle{ if((newstabstatus=="Conversations")&&(newsSwipeview.stacktype=="Home")){ Newsjs.chatsfromdb(db,login,messagetype,[],function(dbnews,lastid){ lastnewsid=lastid; - showNews(dbnews); + if (dbnews.length==0){ + newstypeHandling() + } + else{ + showNews(dbnews); + } }) } else if (messagetype==99){ @@ -247,7 +253,12 @@ Rectangle{ else{ Newsjs.newsfromdb(db,login,messagetype,function(dbnews,lastid){ lastnewsid=lastid; - showNews(dbnews) + if (dbnews.length==0){ + newstypeHandling() + } + else{ + showNews(dbnews); + } }) } } @@ -258,7 +269,7 @@ Rectangle{ newsBusy.running=false; expectScreenUpdate=false; } - function onSuccess(data,api){print("newsstack api "+api); + function onSuccess(data,api){ const newsApiArray=["/api/statuses/friends_timeline", "/api/direct_messages/all", "/api/direct_messages/conversation", @@ -327,7 +338,8 @@ Rectangle{ } } - Component { id:footerComponent + Component { + id:footerComponent Rectangle{ border.color: "#EEEEEE" color: osSettings.dialogColor diff --git a/src/qml/newsqml/NewsTab.qml b/src/qml/newsqml/NewsTab.qml index f80f3fb..9400a2b 100644 --- a/src/qml/newsqml/NewsTab.qml +++ b/src/qml/newsqml/NewsTab.qml @@ -145,11 +145,11 @@ Page{ switch (typerequest){ case "Home": return {iconName:"user-home-symbolic",iconUrl:"qrc:/assets/icons/home.svg"}; case "Favorites": return {iconName:"starred-symbolic",iconUrl:"qrc:/assets/icons/star.svg"}; - case "Replies": return {iconName:"mail-reply-all",iconUrl:"qrc:/assets/icons/exchange.svg"}; + case "Replies": return {iconName:"mail-reply-all-symbolic",iconUrl:"qrc:/assets/icons/exchange.svg"}; case "DirectMessages": return {iconName:"mail-message",iconUrl:"qrc:/assets/icons/envelope.svg"}; case "Public Timeline": return {iconName:"globe",iconUrl:"qrc:/assets/icons/globe.svg"}; case "Group News": return {iconName:"group",iconUrl:"qrc:/assets/icons/users.svg"}; - case "Search": return {iconName:"search",iconUrl:"qrc:/assets/icons/search.svg"}; + case "Search": return {iconName:"system-search",iconUrl:"qrc:/assets/icons/search.svg"}; case "Notifications": return {iconName:"notifications",iconUrl:"qrc:/assets/icons/bell.svg"}; } } @@ -184,7 +184,7 @@ Page{ anchors.bottom: newsSwipeview.bottom // fontColor: "grey" // border.color: "transparent" - icon.name: "open-for-editing" + icon.name: "document-edit-symbolic" //"open-for-editing" //text: "o \uf040" //implicitHeight: root.fontFactor*osSettings.bigFontSize onClicked:{ @@ -225,11 +225,12 @@ Page{ height: newstabitem.height-(newstabbar.height+root.fontFactor*osSettings.systemFontSize) x: leftDrawer.width y: newstabbar.height - function onDirectMessage(friend){currentIndex=2} + //function onDirectMessage(friend){currentIndex=2} onCurrentIndexChanged: { if(newstypes[currentIndex]){stacktype=newstypes[currentIndex]} else{stacktype="Home"} + newstabbar.currentIndex=newsSwipeview.currentIndex; } Loader{ @@ -239,7 +240,6 @@ Page{ source:(newsSwipeview.currentIndex==1)? "qrc:/qml/newsqml/NewsStack.qml":"" } Loader{ - //property var friend:({}) source:(newsSwipeview.currentIndex==2)? "qrc:/qml/newsqml/NewsStack.qml":"" } Loader{ @@ -286,7 +286,7 @@ Page{ } Component.onCompleted: { - root.directmessageSignal.connect(newsSwipeview.onDirectMessage); + root.sendmessageSignal.connect(openMessageSend); root.globaloptionsChanged(); } } diff --git a/src/qml/newsqml/NewsVideoLarge.qml b/src/qml/newsqml/NewsVideoLarge.qml index 6c1c4c2..9b2ff5a 100644 --- a/src/qml/newsqml/NewsVideoLarge.qml +++ b/src/qml/newsqml/NewsVideoLarge.qml @@ -56,7 +56,11 @@ Page{ id:video; anchors.fill:parent - onErrorChanged:{noticeText.font.pointSize=osSettings.bigFontSize;noticeText.text=errorString;} + onErrorChanged:{ + noticeText.font.pointSize=osSettings.bigFontSize; + noticeText.text=errorString; + Qt.openUrlExternally(source) + } fillMode: Image.PreserveAspectFit; // autoLoad: true // autoPlay: true diff --git a/src/qml/newsqml/Newsitem.qml b/src/qml/newsqml/Newsitem.qml index a1522de..9bb926c 100644 --- a/src/qml/newsqml/Newsitem.qml +++ b/src/qml/newsqml/Newsitem.qml @@ -202,15 +202,19 @@ Item { icon.source: "qrc:/assets/icons/chevron-down.svg" icon.width: 2*root.fontFactor*osSettings.bigFontSize icon.height: 2*root.fontFactor*osSettings.bigFontSize - background: Rectangle{color: "transparent"; - radius: 0.5*mm} + background: Rectangle{ + gradient: Gradient { + GradientStop { position: 0.0; color: "transparent" } + GradientStop { position: 0.7; color: osSettings.backgroundColor} + } + } onClicked: { if (icon.name=="arrow-down"){ - toprow.height=toprow.implicitHeight+6*mm; - icon.name=="arrow-up";icon.source="qrc:/assets/icons/chevron-up.svg"; + toprow.height=toprow.implicitHeight+5*mm; + icon.name="arrow-up";icon.source="qrc:/assets/icons/chevron-up.svg"; } else { toprow.height=Math.min(toprow.implicitHeight,3/4*root.height); - icon.name=="arrow-down";icon.source="qrc:/assets/icons/chevron-down.svg"; + icon.name="arrow-down";icon.source="qrc:/assets/icons/chevron-down.svg"; newsView.positionViewAtIndex(index,ListView.Beginning); } } @@ -291,6 +295,9 @@ Item { icon.source: "qrc:/assets/icons/smile-o.svg" icon.width: root.fontFactor*osSettings.bigFontSize icon.height: root.fontFactor*osSettings.bigFontSize + ToolTip.delay: 800 + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Like") onClicked: { if(likeCheckbox.checked==true){Newsjs.like(root.login,root.db,1,"like",newsitemobject.id,root);dislikeCheckbox.checked=false; @@ -312,6 +319,9 @@ Item { icon.source: favoritedCheckbox.checked?"qrc:/assets/icons/star.svg":"qrc:/assets/icons/frown-o.svg" icon.width: root.fontFactor*osSettings.bigFontSize icon.height: root.fontFactor*osSettings.bigFontSize + ToolTip.delay: 800 + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Dislike") onClicked: { if (dislikeCheckbox.checked==true){Newsjs.like(root.login,root.db,1,"dislike",newsitemobject.id,root);likeCheckbox.checked=false; @@ -335,6 +345,10 @@ Item { icon.width: root.fontFactor*osSettings.systemFontSize icon.height: root.fontFactor*osSettings.systemFontSize icon.color: favoritedCheckbox.checked?osSettings.primaryTextColor: osSettings.secondaryTextColor + ToolTip.delay: 800 + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Favorite") + checked:(newsitemobject.favorited>0) onClicked:{ if(!checked){ @@ -353,10 +367,14 @@ Item { visible: (newsitemobject.messagetype!==2) width: newsitem.width/5 height: parent.height - icon.name: "comment-symbolic" + icon.name: "mail-reply-sender-symbolic" icon.source: "qrc:/assets/icons/reply.svg" icon.width: root.fontFactor*osSettings.bigFontSize icon.height: root.fontFactor*osSettings.bigFontSize + ToolTip.delay: 800 + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Reply") + onClicked:{ openMessageSend("reply",newsitemobject) } @@ -367,11 +385,16 @@ Item { visible: (newsitemobject.messagetype!==2) width: newsitem.width/5 height: parent.height - icon.name: "overflow-menu" + icon.name: "view-more-symbolic"//"overflow-menu" icon.source: "qrc:/assets/icons/ellipsis-v.svg" icon.width: root.fontFactor*osSettings.bigFontSize icon.height: root.fontFactor*osSettings.bigFontSize - onClicked:{newsmenu.popup()} + ToolTip.delay: 800 + ToolTip.visible: pressed || hovered + ToolTip.text: qsTr("Menu") + + onClicked:{ + newsmenu.popup()} } } @@ -421,7 +444,7 @@ Item { Action { text: qsTr("DM") onTriggered: { - root.directmessageSignal(newsitemobject.user.screen_name); + root.sendmessageSignal("directmessage",newsitemobject); } } Action { @@ -489,4 +512,5 @@ Item { text: qsTr("External") onTriggered: {Qt.openUrlExternally(newsitemobject.external_url)} } + } diff --git a/src/translations/friendiqa-de.ts b/src/translations/friendiqa-de.ts index 567b1b1..1903310 100644 --- a/src/translations/friendiqa-de.ts +++ b/src/translations/friendiqa-de.ts @@ -16,7 +16,7 @@ Server - Server + Server Nickname @@ -32,7 +32,7 @@ News as - Anzeige + Anzeige Error @@ -64,7 +64,7 @@ Wrong password! - Falsches Passwort! + Falsches Passwort! Success @@ -76,11 +76,11 @@ Timeline - Chronologisch + Chronologisch Conversations - Unterhaltungen + Unterhaltungen Instance rules @@ -106,6 +106,18 @@ Set as default Als Standard setzen + + Method + Verfahren + + + OAuth + OAuth + + + Close + Schließen + BlockUser @@ -128,6 +140,14 @@ Delete Event? Termin löschen? + + refresh + Aktualisieren + + + add + Neu + ConfigAppearancePage @@ -167,28 +187,32 @@ Light Helles Design + + Default News Tabs + + ConfigPage News as - Anzeige + Anzeige Conversations - Unterhaltungen + Unterhaltungen Timeline - Chronologisch + Chronologisch Max. News - Max. Nachr. + Max. Nachr. Hide #nsfw? - #nsfw minimieren? + #nsfw minimieren? Sync @@ -202,6 +226,10 @@ Start Start + + Close + + ConfigStartPage @@ -214,107 +242,107 @@ ConfigTab User - Name + Name Server - Server + Server Nickname - Kurzname + Kurzname Password - Passwort + Passwort Image dir. - Bildverz. + Bildverz. Max. News - Max. Nachr. + Max. Nachr. News as - Anzeige + Anzeige Interval (0=None) - Intervall (0=keins) + Intervall (0=keins) Error - Fehler + Fehler Nickname not registered at given server! - Name auf der Seite nicht registriert! + Name auf der Seite nicht registriert! Confirm - Bestätigen + Bestätigen No server given! - Kein Server angegeben! + Kein Server angegeben! No nickname given! - Kein Kurzname angegeben! + Kein Kurzname angegeben! Nickname not registered at given server! - Name auf der Seite nicht registriert! + Name auf der Seite nicht registriert! No username given! - Kein Nutzername angegeben! + Kein Nutzername angegeben! Sync Interval (0=None) - Akt.-intervall (0=keine) + Akt.-intervall (0=keine) Nicknames containing @ symbol currently not supported - Kurznamen mit @ Zeichen werden derzeit nicht unterstützt. + Kurznamen mit @ Zeichen werden derzeit nicht unterstützt. Min. - Min. + Min. No password given! - Kein Passwort angegeben! + Kein Passwort angegeben! No image directory given! - Kein Verzeichnis für Bilder angegeben! + Kein Verzeichnis für Bilder angegeben! No maximum news number given! - Maximale News-Anzahl nicht angegeben! + Maximale News-Anzahl nicht angegeben! Wrong password! - Falsches Passwort! + Falsches Passwort! Success - Bestätigt + Bestätigt Name - Name + Name Timeline - Chronologisch + Chronologisch Conversations - Unterhaltungen + Unterhaltungen @@ -328,27 +356,27 @@ ContactDetailsComponent Connect - Kontaktanfrage + Kontaktanfrage Description - Beschreibung + Beschreibung Location - Ort + Ort Posts - Beiträge + Beiträge URL - Profilseite + Profilseite Created at - Erstellt + Erstellt @@ -435,7 +463,7 @@ Connect - Kontaktanfrage + Kontaktanfrage Approve @@ -497,6 +525,21 @@ Unblock Entblocken + + Direct Message + Direktnachricht + + + Close + + + + + Contactlist + + Close + + ContactsSearchPage @@ -512,6 +555,10 @@ Person Person + + Close + + Conversation @@ -595,6 +642,10 @@ persons may attend. Personen nehmen vielleicht teil. + + Close + + DrawerAccountComponent @@ -651,7 +702,7 @@ Contacts - Kontakte + Kontakte Groups @@ -700,17 +751,45 @@ No event name supplied Kein Termintitel angegeben + + Close + + + + Start date + + + + Start time + + + + End date + + + + End time + + + + Accept time + + EventList Location - Ort + Ort Delete Event? Termin löschen? + + Close + + EventListItem @@ -719,6 +798,13 @@ Ort + + FriendicaActivities + + Close + + + FriendsListTab @@ -737,6 +823,10 @@ Blocked Geblockte + + refresh + + FriendsTab @@ -750,7 +840,7 @@ Contacts - Kontakte + Kontakte Groups @@ -761,11 +851,26 @@ GroupComponent Error - Fehler + Fehler No name given - Kein Name angegeben + Kein Name angegeben + + + Close + + + + Members + + + + + GroupsListTab + + refresh + @@ -776,11 +881,11 @@ Album - Album + Album Image - Bild + Bild Description @@ -802,6 +907,17 @@ No album name given Kein Albumname angegeben + + Close + + + + + InfoBox + + Close + + LeftDrawerScrollview @@ -828,6 +944,10 @@ Upload Hochladen + + Add + + MessageSend @@ -854,13 +974,113 @@ Only one attachment supported at the moment. Remove other attachment first! - Nur ein Anhang derzeit unterstützt. + Nur ein Anhang derzeit unterstützt. Lösche zuerst den anderen Anhang! No receiver supplied! Kein Empfänger angegeben! + + Answer to + + + + New message + + + + Copy + + + + Cut + + + + Paste + + + + Text + + + + Bold + + + + Format + + + + Italic + + + + Create list + + + + Format as code + + + + Rendered + + + + MD + + + + Show Markdown code + + + + Edit + + + + emojies + + + + Insert smiley + + + + Insert previous hashtag + + + + Image + Bild + + + Insert images + + + + Cancel message + + + + Close + + + + Format message + + + + Send message + + + + Send + + MoreComments @@ -869,70 +1089,81 @@ Alle Kommentare + + NewsPhotolist + + Close + + + NewsStack Network Error - Netzwerk-Fehler + Netzwerk-Fehler More Mehr + + Close + + NewsTab Download profile image for - Lade Profilbild für + Lade Profilbild für More - Mehr + Mehr Timeline - Chronologisch + Chronologisch Error - Fehler + Fehler Favorites - Markierte News + Markierte News Conversations - Unterhaltungen + Unterhaltungen Network Error - Netzwerk-Fehler + Netzwerk-Fehler Replies - Interaktionen + Interaktionen Public timeline - Gemeinschaft + Gemeinschaft Direct Messages - Direktnachrichten + Direktnachrichten Notifications - Meldungen + Meldungen Group news - News Gruppe + News Gruppe Quit - Schliessen + Schliessen seconds @@ -1015,11 +1246,18 @@ Personen nehmen vielleicht teil. + + NewsVideoLarge + + Close + + + Newsitem attending: - Teilnahme + Teilnahme Source: @@ -1035,7 +1273,7 @@ comments - Kommentare + Kommentare attending @@ -1051,7 +1289,7 @@ Reply - Antworten + Antworten DM @@ -1109,6 +1347,22 @@ Calendar Entry Kalendereintrag + + Like + + + + Dislike + + + + Favorite + + + + Menu + + PermissionDialog @@ -1120,12 +1374,20 @@ Groups Gruppen + + save + + + + apply + + PhotoTab 's images - s Bilder + s Bilder All Images @@ -1143,6 +1405,18 @@ More Mehr + + upload + + + + download + + + + Close + + ProfileComponent @@ -1326,6 +1600,10 @@ other Sonstige + + refresh + + ReportUser @@ -1368,6 +1646,10 @@ Adult XXX + + Close + + SyncComponent @@ -1390,52 +1672,56 @@ Min. Min. + + Backgound Sync + + friendiqa Refresh - Aktualisieren + Aktualisieren Timeline - Chronologisch + Chronologisch Conversations - Unterhaltungen + Unterhaltungen Favorites - Markierte News + Markierte News Replies - Interaktionen + Interaktionen Public Timeline - öff. Timeline + öff. Timeline Group news - News Gruppe + News Gruppe Search - Suche + Suche Settings - Einstellungen + Einstellungen Accounts - Konten + Konten Quit - Schliessen + Schliessen Background Sync @@ -1463,48 +1749,52 @@ Rechtsklick oder Mittelklick zum Schliessen Calendar Kalender + + Images + + newsworker likes this. - mag das. + mag das. like this. - mögen das. + mögen das. doesn't like this. - mag das nicht. + mag das nicht. don't like this. - mögen das nicht. + mögen das nicht. will attend. - nehmen teil. + nehmen teil. persons will attend. - Personen nehmen teil. + Personen nehmen teil. will not attend. - nimmt nicht teil. + nimmt nicht teil. persons will not attend. - Personen nehmen nicht teil. + Personen nehmen nicht teil. may attend. - nimmt vielleicht teil. + nimmt vielleicht teil. persons may attend. - Personen nehmen vielleicht teil. + Personen nehmen vielleicht teil. yes @@ -1520,58 +1810,62 @@ Rechtsklick oder Mittelklick zum Schliessen seconds - Sekunden + Sekunden ago - her + her minute - Minute + Minute minutes - Minuten + Minuten hour - Stunde + Stunde hours - Stunden + Stunden day - Tag + Tag days - Tage + Tage month - Monat + Monat months - Monate + Monate + + + years + Jahre service Error - Fehler + Fehler Changelog - Änderungen + Änderungen Setting view type of news has moved from account page to config page. - Die Einstellung der Ansichtsart von Nachrichten wurde von der Kontoseite auf die Konfigurationsseite verschoben. + Die Einstellung der Ansichtsart von Nachrichten wurde von der Kontoseite auf die Konfigurationsseite verschoben. Undefined Array Error diff --git a/src/translations/friendiqa-es.ts b/src/translations/friendiqa-es.ts index 12d0b0a..d34bbea 100644 --- a/src/translations/friendiqa-es.ts +++ b/src/translations/friendiqa-es.ts @@ -4,6 +4,8 @@ AcceptRules + + Accept instance rules @@ -12,137 +14,209 @@ AccountPage + + + + + + + - - - - - - + User Usuario Server - Servidor + Servidor + + + Nickname Usuario + + + + Password Contraseña + + + Image dir. Dir. de imágenes News as - Noticias como + Noticias como + + + Instance rules + + + + + + + - - - - - + Error Error + + + Method + + + + + + OAuth + + + + + + Close + + + + + + Nicknames containing @ symbol currently not supported No se admiten los apodos que contienen el símbolo @ actualmente + + Connect Conectar + + No server given! + + Couldn't connect to server + + + Confirm Confirmar + + + No server given! ¡Servidor no encontrado! + + + No nickname given! ¡Usuario incorrecto! + + + No password given! ¡Contraseña incorrecta! + + + No image directory given! ¡No se ha encontrado el directorio de imágenes! + + Set as default + + - + Wrong password or 2FA enabled! Wrong password! - ¡Contraseña incorrecta! + ¡Contraseña incorrecta! + + + - + Success éxito! + + + Name Nombre Timeline - Cronología + Cronología Conversations - Conversaciones + Conversaciones BlockUser + + Block contact? @@ -151,17 +225,37 @@ CalendarTab + + + refresh + + + + + Delete Event? ¿Borrar la cita? + + + add + + + + + + Events Eventos + + + Own Calendar Calendario propio @@ -169,49 +263,73 @@ ConfigAppearancePage + + News as Noticias como + + + + - - Conversations Conversaciones + + + - Timeline Cronología + + Max. News Nº Max. de noticias. + + Hide #nsfw? Ocultar #nsfw? + + + Default News Tabs + + + + + Dark Mode Diseño + + System diseño estándar + + Dark diseño oscuro + + Light diseño brillante @@ -221,36 +339,47 @@ ConfigPage News as - Noticias como + Noticias como Conversations - Conversaciones + Conversaciones Timeline - Cronología + Cronología Max. News - Nº Max. de noticias. + Nº Max. de noticias. Hide #nsfw? - Ocultar #nsfw? + Ocultar #nsfw? + + Appearance Apariencia + + Sync Sincronización + + + + Close + + + Start Iniciar @@ -258,6 +387,8 @@ ConfigStartPage + + Autostart Autoarranque @@ -267,96 +398,114 @@ ConfigTab User - Usuario + Usuario Server - Servidor + Servidor Nickname - Usuario + Usuario Password - Contraseña + Contraseña Image dir. - Dir. de imágenes + Dir. de imágenes Max. News - Nº Max. de noticias. + Nº Max. de noticias. News as - Noticias como + Noticias como Interval (0=None) - Intervalo (0=ningún) + Intervalo (0=ningún) Error - Error + Error Confirm - Confirmar + Confirmar No server given! - ¡Servidor no encontrado! + ¡Servidor no encontrado! No nickname given! - ¡Usuario incorrecto! + ¡Usuario incorrecto! Nickname not registered at given server! - ¡Usuario incorrecto! + ¡Usuario incorrecto! No username given! - ¡Usuario incorrecto! + ¡Usuario incorrecto! No password given! - ¡Contraseña incorrecta! + ¡Contraseña incorrecta! No image directory given! - ¡No se ha encontrado el directorio de imágenes! + ¡No se ha encontrado el directorio de imágenes! No maximum news number given! - ¡Nº máximo de noticias incorrecto! + ¡Nº máximo de noticias incorrecto! Wrong password! - ¡Contraseña incorrecta! + ¡Contraseña incorrecta! Success - éxito! + éxito! Name - Nombre + Nombre Timeline - Cronología + Cronología Conversations - Conversaciones + Conversaciones + + + Nickname not registered at given server! + + + + Sync Interval (0=None) + Intervalo de sincr. (0=Ninguno) + + + Nicknames containing @ symbol currently not supported + No se admiten los apodos que contienen el símbolo @ actualmente + + + Min. + min. ContactComponent + + Connect Conectar @@ -366,380 +515,568 @@ ContactDetailsComponent Connect - Conectar + Conectar Description - Descripción + Descripción Location - Localización + Localización Posts - Mensajes + Mensajes URL - URL + URL Created at - Creado en + Creado en ContactPage + + seconds Segundos + + minute Minuto + + minutes Minutos + + hour Hora + + hours Horas + + day Dia + + days Dias + + month Mes + + months Meses + + years Años + + likes this. le gusta esto. + + like this. me gusta esto. + + doesn't like this. no de ése. + + don't like this. no me gusta. + + will attend. asistirá. + + persons will attend. Personas que asistirán. + + will not attend. no asistirá. + + persons will not attend. Personas que no asistirán. + + may attend. Puede asistir. + + persons may attend. Personas que pueden asistir. - Connect - Conectar + + + Direct Message + Mensaje directo + + + Close + + + + Connect + Conectar + + + + + Approve Aprobar + + + Reject Rechazar + + + Ignore Ignorar + + + Follow Seguir + + + Unfollow Dejar de seguir + + + Block + + + Unblock + + + Description Descripción + + + Location Localización + + + Posts Mensajes + + + URL URL + + + Created at Creado en + + + Followers Seguidores + + + Following Siguiente + + + Network Error Fallo de red + + Contactlist + + + + Close + + + ContactsSearchPage + + + Network Error Fallo de red + + + Forum Foro + + + Person Persona + + + + + Close + + Conversation + + seconds Segundos + + minute Minuto + + minutes Minutos + + hour Hora + + hours Horas + + day Dia + + days Dias + + month Mes + + months Meses + + years Años + + likes this. le gusta esto. + + like this. me gusta esto. + + doesn't like this. no de ése. + + don't like this. no me gusta. + + will attend. asistirá. + + persons will attend. Personas que asistirán. + + will not attend. no asistirá. + + persons will not attend. Personas que no asistirán. + + may attend. Puede asistir. + + persons may attend. Personas que pueden asistir. + + + + Close + + DrawerAccountComponent + + Refresh Actualizar + + Timeline Cronología + + Conversations Conversaciones + + Replies Respuestas + + Direct Messages Mensaje directo + + Favorites Favoritos + + Public Timeline Cronología pública + + Group news Grupos + + Search Busca + + Notifications Notificaciones @@ -748,20 +1085,26 @@ DrawerAccountComponentContacts + + Profile Perfil + + Friends Amigos Contacts - Contactos + Contactos + + Groups Grupos @@ -770,52 +1113,108 @@ EventCreate + + + Close + + + + + Start Iniciar + + + Start date + + + + + + Start time + + + + + End Finalizar + + + End date + + + + + + End time + + + + + + Accept time + + + + + no end sin fin + + Title (required) título (obligatorio) + + Event description (optional) Descripción del evento (opcional) + + Location (optional) Ubicación (opcional) + + Publish event? ¿Publicar el fecha? + + Create event crear fecha + + + - Error Error + + No event name supplied No se ha nombre de la fecha @@ -825,9 +1224,17 @@ EventList Location - Localización + Localización + + + Close + + + + + Delete Event? ¿Borrar la cita? @@ -836,30 +1243,55 @@ EventListItem + + Location Localización + + FriendicaActivities + + + + Close + + + FriendsListTab + + Friend Requests Solicitudes de contacto + + + - Friends Amigos + + + refresh + + + + + All Todos + + Blocked @@ -868,79 +1300,156 @@ FriendsTab + + Me Yo + + Friends Amigos Contacts - Contactos + Contactos + + Groups Grupos + + GroupComponent + + + + Close + + + + + + Members + + + + Error + Error + + + No name given + + + + + GroupsListTab + + + + refresh + + + ImageUploadDialog + + + Upload to album Subir álbum Album - álbum + álbum Image - imagen + imagen + + + Close + + + + + + Description Descripción + + + Upload Subir + + + Change Cambiar + + + Error Error + + + No album name given ¡Nombre del álbum no encontrado! + + InfoBox + + + + Close + + + LeftDrawerScrollview + + Settings Ajustes + + Accounts Cuentas + + Quit Salida @@ -949,12 +1458,24 @@ MessageImageUploadDialog + + + Description Descripción + + + Add + + + + + + Upload Subir @@ -962,38 +1483,207 @@ MessageSend + + + Answer to + + + + + + New message + + + + + to: a: + + Title (optional) Título (opcional) + + Drop your Content here. Deje caer su contenido aquí. + + What's on your mind? ¿Qué tienes en mente? + + + Copy + + + + + + Cut + + + + + + Paste + + + + + + Text + + + + + + + Bold + + + + + + + + + + Format + + + + + + Italic + + + + + + Create list + + + + + + Format as code + + + + + + Rendered + + + + + + MD + + + + + + Show Markdown code + + + + + + Edit + + + + + + emojies + + + + + + Insert smiley + + + + + + Insert previous hashtag + + + + + + Image + imagen + + + + + Insert images + + + + + + Cancel message + + + + + + Close + + + + + + Format message + + + + + + Send message + + + + + + Send + + + + + + Error Error Only one attachment supported at the moment. Remove other attachment first! - Solo se admite adjuntar un solo archivo en este momento. + Solo se admite adjuntar un solo archivo en este momento. ¡Elimine y deje un archivo adjunto! + + + No receiver supplied! No se ha suministrado ningún receptor! @@ -1001,284 +1691,444 @@ MoreComments + + Show all comments todos comentarios + + NewsPhotolist + + + + Close + + + NewsStack Network Error - Fallo de red + Fallo de red + + + More Mas + + + + + Close + + NewsTab Download profile image for - Descargar la imagen del perfil para + Descargar la imagen del perfil para More - Mas + Mas Timeline - Cronología + Cronología Error - Error + Error Favorites - Favoritos + Favoritos Conversations - Conversaciones + Conversaciones Network Error - Fallo de red + Fallo de red Public timeline - Cronología pública + Cronología pública Direct Messages - Mensaje directo + Mensaje directo Notifications - Notificaciones + Notificaciones Group news - Grupos + Grupos Quit - Salida + Salida + + + seconds Segundos + + + minute Minuto + + + minutes Minutos + + + hour Hora + + + hours Horas + + + day Dia + + + days Dias + + + month Mes + + + months Meses + + + years Años + + + likes this. le gusta esto. + + + like this. me gusta esto. + + + doesn't like this. no de ése. + + + don't like this. no me gusta. + + + will attend. asistirá. + + + persons will attend. Personas que asistirán. + + + will not attend. no asistirá. + + + persons will not attend. Personas que no asistirán. + + + may attend. Puede asistir. + + + persons may attend. Personas que pueden asistir. + + Replies + Respuestas + + + + NewsVideoLarge + + + + Close + + Newsitem attending: - Asistiendo: + Asistiendo: + + Source: Fuente: + + Direct Message Mensaje directo + + In reply to En respuesta a comments - comentarios + comentarios + + attending asistencia + + ago hace + + Attending: Asistiendo: + + Reply - Respuesta + Respuesta + + DM Mensaje directo + + Repost Volver a publicar + + + Like + + + + + + Dislike + + + + + + Favorite + + + + + + Menu + + + + + Success! éxito! + + Block contact + + Report contact + + Conversation Conversación + + Bookmark marca + + Calendar Entry + + Attending Asistiendo + + yes si + + maybe quizás + + no no + + Delete Borrar + + External sitio web @@ -1287,268 +2137,459 @@ PermissionDialog + + + Friends Amigos + + + Groups Grupos + + + + save + + + + + + apply + + PhotoTab + + 's images - s Imágenes + s Imágenes + + + upload + + + + + + download + + + + + + All Images Todas las imagenes + + + Only new Solo nueva + + + - + Own Images Mis imágenes + + + More Mas + + + + Close + + ProfileComponent + + + profile name Nombre de perfil + + + is default es por defecto + + + hide friends ocultar amigos + + + profile photo foto de perfil + + + profile thumb foto de perfil pequeña + + + publish publicar + + + publish in network publicar en la red + + + description descripción + + + date of birth fecha de nacimiento + + + address dirección + + + city ciudad + + + region región + + + postal code código postal + + + country país + + + hometown ciudad natal + + + gender género + + + marital status estado civil + + + married with casado con + + + married since casado desde + + + sexual orientación sexual + + + politics política + + + religion religión + + + public keywords palabras clave públicas + + + private keywords palabras clave privadas + + + likes le gusta + + + dislikes no le gusta + + + about sobre + + + music música + + + book libro + + + tv tv + + + film película + + + interest interés + + + romance romance + + + work trabajo + + + education educación + + + social networks redes sociales + + + homepage página web + + + other otros + + + refresh + + + + + + Update Actualización + + + profile id profile id + + + Description Descripción + + + Location Localización + + + Posts Mensajes + + + URL URL + + + Created at Creado en @@ -1556,27 +2597,41 @@ ReportUser + + Report contact? + + + comment + + + illegal + + + spam + + + violation @@ -1585,33 +2640,47 @@ SmileyDialog + Unicode Unicode + Standard Standard + Addon Addon + Adult XXX + + + + Close + + SyncComponent + + sync sync + + notify notificar @@ -1621,90 +2690,119 @@ SyncConfig + Sync Interval (0=None) Intervalo de sincr. (0=Ninguno) + Min. min. + + + + Backgound Sync + + friendiqa Refresh - Actualizar + Actualizar Timeline - Cronología + Cronología Conversations - Conversaciones + Conversaciones Favorites - Favoritos + Favoritos Replies - Respuestas + Respuestas Public Timeline - Cronología pública + Cronología pública Group news - Grupos + Grupos Search - Busca + Busca Settings - Ajustes + Ajustes Accounts - Cuentas + Cuentas Quit - Salida + Salida + + Background Sync Rightclick or Middleclick to Quit Sincronización de fondo Haga clic con el botón derecho del ratón o con el botón central para salir. + + + Posts Mensajes + + + Contacts Contactos + + + Images + + + + + Photos + + + Calendar + + Click to open Friendiqa Haga clic para abrir Friendiqa @@ -1713,123 +2811,139 @@ Haga clic con el botón derecho del ratón o con el botón central para salir.newsworker likes this. - le gusta esto. + le gusta esto. like this. - me gusta esto. + me gusta esto. doesn't like this. - no de ése. + no de ése. don't like this. - no me gusta. + no me gusta. will attend. - asistirá. + asistirá. persons will attend. - Personas que asistirán. + Personas que asistirán. will not attend. - no asistirá. + no asistirá. persons will not attend. - Personas que no asistirán.. + Personas que no asistirán.. may attend. - Puede asistir. + Puede asistir. persons may attend. - Personas que pueden asistir. + Personas que pueden asistir. + + yes si + + no no + + maybe quizás seconds - Segundos + Segundos ago - hace + hace minute - Minuto + Minuto minutes - Minutos + Minutos hour - Hora + Hora hours - Horas + Horas day - Dia + Dia days - Dias + Dias month - Mes + Mes months - Meses + Meses years - Años + Años service Error - Error + Error Setting view type of news has moved from account page to config page. - La configuración del tipo de vista de las noticias se ha movido de la página de la cuenta a la página de configuración. + La configuración del tipo de vista de las noticias se ha movido de la página de la cuenta a la página de configuración. + + + Undefined Array Error + + + JSON status Error + + Changelog + + diff --git a/src/translations/friendiqa-hu.ts b/src/translations/friendiqa-hu.ts index 47f3fd2..7c2f3c9 100644 --- a/src/translations/friendiqa-hu.ts +++ b/src/translations/friendiqa-hu.ts @@ -4,6 +4,9 @@ AcceptRules + + + Accept instance rules @@ -12,137 +15,217 @@ AccountPage + + + + + + + + - - - - - - User Felhasználó Server - Kiszolgáló + Kiszolgáló + + + Nickname Becenév + + + + Password Jelszó + + + Image dir. Képkönyvtár News as - Hírek mint + Hírek mint + + + Instance rules + + + + + + + + - - - - - Error Hiba + + + + Method + + + + + + + OAuth + + + + + + + Close + + + + + + Nicknames containing @ symbol currently not supported A @ szimbólumot tartalmazó becenevek jelenleg nem támogatottak + + + Connect Kapcsolódás + + + No server given! + + + Couldn't connect to server + + + Confirm Megerősítés + + + No server given! Nincs kiszolgáló megadva! + + + No nickname given! Nincs becenév megadva! + + + No password given! Nincs jelszó megadva! + + + No image directory given! Nincs képkönyvtár megadva! + + + Set as default + + + - Wrong password or 2FA enabled! Wrong password! - Hibás jelszó! + Hibás jelszó! + + + + - Success Sikeres + + + Name Név Timeline - Idővonal + Idővonal Conversations - Beszélgetések + Beszélgetések BlockUser + + + Block contact? @@ -151,16 +234,39 @@ CalendarTab + + + + refresh + + + + + + Delete Event? + + + + add + + + + + + Events Események + + + Own Calendar Saját naptár @@ -169,49 +275,83 @@ ConfigAppearancePage + + + News as Hírek mint + + + + + - - Conversations Beszélgetések + + + + - Timeline Idővonal + + + Max. News Legtöbb hír + + + Hide #nsfw? A #NSFW elrejtése? + + + + Default News Tabs + + + + + + Dark Mode Sötét mód + + + System Rendszer + + + Dark Sötét + + + Light Világos @@ -221,36 +361,50 @@ ConfigPage News as - Hírek mint + Hírek mint Conversations - Beszélgetések + Beszélgetések Timeline - Idővonal + Idővonal Max. News - Legtöbb hír + Legtöbb hír Hide #nsfw? - A #NSFW elrejtése? + A #NSFW elrejtése? + + + Appearance Megjelenés + + + Sync Szinkronizálás + + + + + Close + + + Start Indítás @@ -258,6 +412,9 @@ ConfigStartPage + + + Autostart Automatikus indítás @@ -267,112 +424,115 @@ ConfigTab User - Felhasználó + Felhasználó Server - Kiszolgáló + Kiszolgáló Nickname - Becenév + Becenév Password - Jelszó + Jelszó Image dir. - Képkönyvtár + Képkönyvtár Max. News - Legtöbb hír + Legtöbb hír News as - Hírek mint + Hírek mint Interval (0=None) - Időköz (0 = nincs) + Időköz (0 = nincs) Error - Hiba + Hiba Nickname not registered at given server! - A becenév nincs regisztrálva a megadott kiszolgálón! + A becenév nincs regisztrálva a megadott kiszolgálón! Confirm - Megerősítés + Megerősítés No server given! - Nincs kiszolgáló megadva! + Nincs kiszolgáló megadva! No nickname given! - Nincs becenév megadva! + Nincs becenév megadva! Nickname not registered at given server! - A becenév nincs regisztrálva a megadott kiszolgálón! + A becenév nincs regisztrálva a megadott kiszolgálón! No username given! - Nincs felhasználónév megadva! + Nincs felhasználónév megadva! Sync Interval (0=None) - Szinkronizálási időköz (0 = nincs) + Szinkronizálási időköz (0 = nincs) Nicknames containing @ symbol currently not supported - A @ szimbólumot tartalmazó becenevek jelenleg nem támogatottak + A @ szimbólumot tartalmazó becenevek jelenleg nem támogatottak Min. - Legkisebb + Legkisebb No password given! - Nincs jelszó megadva! + Nincs jelszó megadva! No image directory given! - Nincs képkönyvtár megadva! + Nincs képkönyvtár megadva! No maximum news number given! - Nincs legtöbb hír szám megadva! + Nincs legtöbb hír szám megadva! Wrong password! - Hibás jelszó! + Hibás jelszó! Success - Sikeres + Sikeres Name - Név + Név Timeline - Idővonal + Idővonal Conversations - Beszélgetések + Beszélgetések ContactComponent + + + Connect Kapcsolódás @@ -382,380 +542,623 @@ ContactDetailsComponent Connect - Kapcsolódás + Kapcsolódás Description - Leírás + Leírás Location - Hely + Hely Posts - Bejegyzések + Bejegyzések URL - URL + URL Created at - Létrehozva + Létrehozva ContactPage + + + seconds másodperc + + + minute perc + + + minutes perc + + + hour óra + + + hours óra + + + day nap + + + days nap + + + month hónap + + + months hónap + + + years év + + + likes this. kedveli ezt. + + + like this. kedveli ezt. + + + doesn't like this. nem kedveli ezt. + + + don't like this. nem kedveli ezt. + + + will attend. részt vesz. + + + persons will attend. személy részt vesz. + + + will not attend. nem vesz részt. + + + persons will not attend. személy nem vesz részt. + + + may attend. talán részt vesz. + + + persons may attend. személy talán részt vesz. - Connect - Kapcsolódás + + + + Direct Message + Közvetlen üzenet + + + + Close + + + + Connect + Kapcsolódás + + + + + Approve Jóváhagyás + + + Reject Visszautasítás + + + Ignore Mellőzés + + + Follow Követés + + + Unfollow Követés megszüntetése + + + Block + + + Unblock + + + Description Leírás + + + Location Hely + + + Posts Bejegyzések + + + URL URL + + + Created at Létrehozva + + + Followers + + + Following + + + Network Error Hálózati hiba + + Contactlist + + + + + Close + + + ContactsSearchPage + + + Network Error Hálózati hiba + + + Forum fórum + + + Person személy + + + + + + Close + + Conversation + + + seconds másodperc + + + minute perc + + + minutes perc + + + hour óra + + + hours óra + + + day nap + + + days nap + + + month hónap + + + months hónap + + + years év + + + likes this. kedveli ezt. + + + like this. kedveli ezt. + + + doesn't like this. nem kedveli ezt. + + + don't like this. nem kedveli ezt. + + + will attend. részt vesz. + + + persons will attend. személy részt vesz. + + + will not attend. nem vesz részt. + + + persons will not attend. személy nem vesz részt. + + + may attend. talán részt vesz. + + + persons may attend. személy talán részt vesz. + + + + + Close + + DrawerAccountComponent + + + Refresh Frissítés + + + Timeline Idővonal + + + Conversations Beszélgetések + + + Replies Válaszok + + + Direct Messages Közvetlen üzenetek + + + Favorites Kedvencek + + + Public Timeline Nyilvános idővonal + + + Group news Csoporthírek + + + Search Keresés + + + Notifications Értesítések @@ -764,20 +1167,28 @@ DrawerAccountComponentContacts + + + Profile Profil + + Friends Ismerősök Contacts - Partnerek + Partnerek + + + Groups Csoportok @@ -786,52 +1197,124 @@ EventCreate + + + + Close + + + + + + Start Indítás + + + + Start date + + + + + + + Start time + + + + + + End + + + + End date + + + + + + + End time + + + + + + + Accept time + + + + + + no end + + + Title (required) + + + Event description (optional) + + + Location (optional) + + + Publish event? + + + Create event + + + + - Error Hiba + + + No event name supplied @@ -841,9 +1324,19 @@ EventList Location - Hely + Hely + + + + Close + + + + + + Delete Event? @@ -852,30 +1345,61 @@ EventListItem + + Location Hely + + FriendicaActivities + + + + + Close + + + FriendsListTab + + + Friend Requests Barátkérések + + + + - Friends Ismerősök + + + + refresh + + + + + + All + + + Blocked @@ -884,20 +1408,29 @@ FriendsTab + + + Me Én + + + Friends Ismerősök Contacts - Partnerek + Partnerek + + + Groups Csoportok @@ -907,67 +1440,135 @@ GroupComponent Error - Hiba + Hiba No name given - Nincs név megadva + Nincs név megadva + + + + + + Close + + + + + + + Members + + + + + GroupsListTab + + + + + refresh + ImageUploadDialog + + + Upload to album Feltöltés albumba Album - Album + Album Image - Kép + Kép + + + + Close + + + + + + Description Leírás + + + Upload Feltöltés + + + Change Változtatás + + + Error Hiba + + + No album name given Nincs albumnév megadva + + InfoBox + + + + + Close + + + LeftDrawerScrollview + + + Settings Beállítások + + + Accounts Fiókok + + + Quit Kilépés @@ -976,11 +1577,24 @@ MessageImageUploadDialog + + + Description Leírás + + + + Add + + + + + + Upload Feltöltés @@ -989,26 +1603,221 @@ MessageSend + + + + Answer to + + + + + + + New message + + + + + + to: címzett: + + + Title (optional) Cím (elhagyható) + + + Drop your Content here. Ejtse ide a tartalmat. + + + What's on your mind? Mire gondol? + + + + Copy + + + + + + + Cut + + + + + + + Paste + + + + + + + Text + + + + + + + + Bold + + + + + + + + + + + Format + + + + + + + Italic + + + + + + + Create list + + + + + + + Format as code + + + + + + + Rendered + + + + + + + MD + + + + + + + Show Markdown code + + + + + + + Edit + + + + + + + emojies + + + + + + + Insert smiley + + + + + + + Insert previous hashtag + + + + + + + Image + Kép + + + + + + Insert images + + + + + + + Cancel message + + + + + + + Close + + + + + + + Format message + + + + + + + Send message + + + + + + + Send + + + + + + Error Hiba @@ -1016,10 +1825,13 @@ Only one attachment supported at the moment. Remove other attachment first! - Csak egyetlen melléklet támogatott jelenleg. + Csak egyetlen melléklet támogatott jelenleg. Először távolítsa el a másik mellékletet. + + + No receiver supplied! Nincs fogadó megadva! @@ -1028,288 +1840,472 @@ MoreComments + + + Show all comments Összes hozzászólás megjelenítése + + NewsPhotolist + + + + + Close + + + NewsStack Network Error - Hálózati hiba + Hálózati hiba + + + More Több + + + + + + Close + + NewsTab Download profile image for - Profilkép letöltése ennél: + Profilkép letöltése ennél: More - Több + Több Timeline - Idővonal + Idővonal Error - Hiba + Hiba Favorites - Kedvencek + Kedvencek Conversations - Beszélgetések + Beszélgetések Network Error - Hálózati hiba + Hálózati hiba Replies - Válaszok + Válaszok Public timeline - Nyilvános idővonal + Nyilvános idővonal Direct Messages - Közvetlen üzenetek + Közvetlen üzenetek Notifications - Értesítések + Értesítések Group news - Csoporthírek + Csoporthírek Quit - Kilépés + Kilépés + + + seconds másodperc + + + minute perc + + + minutes perc + + + hour óra + + + hours óra + + + day nap + + + days nap + + + month hónap + + + months hónap + + + years év + + + likes this. kedveli ezt. + + + like this. kedveli ezt. + + + doesn't like this. nem kedveli ezt. + + + don't like this. nem kedveli ezt. + + + will attend. részt vesz. + + + persons will attend. személy részt vesz. + + + will not attend. nem vesz részt. + + + persons will not attend. személy nem vesz részt. + + + may attend. talán részt vesz. + + + persons may attend. személy talán részt vesz. + + NewsVideoLarge + + + + + Close + + + Newsitem attending: - részvétel: + részvétel: + + + Source: Forrás: + + + Direct Message Közvetlen üzenet + + In reply to Válaszul erre: comments - hozzászólás + hozzászólás + + + attending részvétel + + + ago óta + + + Attending: Részvétel: + + + Reply - Válasz + Válasz + + + DM DM + + + Repost Újraküldés + + + + Like + + + + + + + Dislike + + + + + + + Favorite + + + + + + + Menu + + + + + + Success! Sikeres! + + + Block contact + + + Report contact + + + Conversation Beszélgetés + + + Bookmark könyvjelző + + + Calendar Entry + + + Attending Részvétel + + + yes igen + + + maybe talán + + + no nem + + + Delete Törlés + + + External weboldal @@ -1318,267 +2314,464 @@ PermissionDialog + + + Friends Ismerősök + + + Groups Csoportok + + + + + save + + + + + + + apply + + PhotoTab + + 's images - képei + képei + + + + upload + + + + + + + download + + + + + + All Images Összes kép + + + Only new Csak újak + + + + - Own Images Saját képek + + + More Több + + + + + Close + + ProfileComponent + + + profile name profilnév + + + is default alapértelmezett + + + hide friends ismerősök elrejtése + + + profile photo profilfénykép + + + profile thumb profilbélyegkép + + + publish közzététel + + + publish in network közzététel hálózaton + + + description leírás + + + date of birth születési dátum + + + address cím + + + city település + + + region régió + + + postal code irányítószám + + + country ország + + + hometown szülőváros + + + gender nem + + + marital status családi állapot + + + married with házas vele + + + married since házas ekkortól + + + sexual szexuális + + + politics politika + + + religion vallás + + + public keywords nyilvános kulcsszavak + + + private keywords személyes kulcsszavak + + + likes kedvelések + + + dislikes nem kedvelések + + + about névjegy + + + music zene + + + book könyv + + + tv TV + + + film film + + + interest érdeklődés + + + romance romantika + + + work munka + + + education oktatás + + + social networks közösségi hálózatok + + + homepage honlap + + + other + + + + refresh + + + + + + Update Frissítés + + + profile id profilazonosító + + + Description Leírás + + + Location Hely + + + Posts Bejegyzések + + + URL URL + + + Created at Létrehozva @@ -1587,26 +2780,41 @@ ReportUser + + + Report contact? + + + comment + + + illegal + + + spam + + + violation @@ -1616,33 +2824,50 @@ SmileyDialog + Unicode Unicode + Standard Szabványos + Addon Bővítmény + Adult Felnőtt + + + + + Close + + SyncComponent + + + sync szinkronizálás + + + notify értesítés @@ -1652,90 +2877,123 @@ SyncConfig + Sync Interval (0=None) Szinkronizálási időköz (0 = nincs) + Min. Legkisebb + + + + + Backgound Sync + + friendiqa Refresh - Frissítés + Frissítés Timeline - Idővonal + Idővonal Conversations - Beszélgetések + Beszélgetések Favorites - Kedvencek + Kedvencek Replies - Válaszok + Válaszok Public Timeline - Nyilvános idővonal + Nyilvános idővonal Group news - Csoporthírek + Csoporthírek Search - Keresés + Keresés Settings - Beállítások + Beállítások Accounts - Fiókok + Fiókok Quit - Kilépés + Kilépés + Background Sync Rightclick or Middleclick to Quit Háttérszinkronizálás Kilépéshez kattintson a jobb gombbal vagy középső gombbal + + + + Posts Bejegyzések + + + + Contacts Partnerek + + + + Images + + + + + + Photos + + + + Calendar + Click to open Friendiqa Kattintson a Friendiqa megnyitásához @@ -1744,120 +3002,136 @@ Kilépéshez kattintson a jobb gombbal vagy középső gombbal newsworker likes this. - kedveli ezt. + kedveli ezt. like this. - kedveli ezt. + kedveli ezt. doesn't like this. - nem kedveli ezt. + nem kedveli ezt. don't like this. - nem kedveli ezt. + nem kedveli ezt. will attend. - részt vesz. + részt vesz. persons will attend. - személy részt vesz. + személy részt vesz. will not attend. - nem vesz részt. + nem vesz részt. persons will not attend. - személy nem vesz részt. + személy nem vesz részt. may attend. - talán részt vesz. + talán részt vesz. persons may attend. - személy talán részt vesz. + személy talán részt vesz. + + yes igen + + no nem + + maybe talán seconds - másodperc + másodperc ago - óta + óta minute - perc + perc minutes - perc + perc hour - óra + óra hours - óra + óra day - nap + nap days - nap + nap month - hónap + hónap months - hónap + hónap + + + years + év service Error - Hiba + Hiba Changelog - Változásnapló + Változásnapló Setting view type of news has moved from account page to config page. - A hírek nézettípusának beállítása át lett helyezve a fiókoldalról a beállítási oldalra. + A hírek nézettípusának beállítása át lett helyezve a fiókoldalról a beállítási oldalra. + + + Undefined Array Error Meghatározatlan tömbhiba + + + JSON status Error JSON-állapothiba diff --git a/src/translations/friendiqa-it.ts b/src/translations/friendiqa-it.ts index 0c4edb2..d087998 100644 --- a/src/translations/friendiqa-it.ts +++ b/src/translations/friendiqa-it.ts @@ -4,6 +4,9 @@ AcceptRules + + + Accept instance rules @@ -12,114 +15,232 @@ AccountPage + + + + + + + + + - - - - - - User Utente Server - Server + Server + + + + Nickname Utente + + + + + Password Password + + + + Image dir. Directory immagini News as - News come + News come + + + + Instance rules + + + + + + + + + - - - Error Errore + + + + Method + + + + + + + OAuth + + + + + + + Close + + + + + + + Nicknames containing @ symbol currently not supported I soprannomi contenenti il simbolo @ attualmente non sono supportati + + + + + Connect + Connetti + + + + + + + No server given! + + + + + + + + Couldn't connect to server + + + + + + + Confirm Conferma + + + + No server given! Nessun server inserito! + + + + No nickname given! Nessun utente inserito! + + + + No password given! Nessuna password inserita! + + + + No image directory given! Nessuna directory immagini inserita! + + + + + Set as default + + + + + + + - Wrong password or 2FA enabled! Wrong password! - Password sbagliata! + Password sbagliata! + + + + + Success Ha funzionato! + + + + Name Nome Timeline - Cronologia + Cronologia Conversations - Conversazioni + Conversazioni BlockUser + + + Block contact? @@ -128,16 +249,41 @@ CalendarTab + + + + refresh + + + + + + Delete Event? Cancellare la data? + + + + add + + + + + + + Events Eventi + + + + Own Calendar Calendario @@ -146,49 +292,83 @@ ConfigAppearancePage + + + News as News come + + + + + - - Conversations Conversazioni + + + + - Timeline Cronologia + + + Max. News Nº Max. di notizie + + + Hide #nsfw? Nascondere #nsfw? + + + + Default News Tabs + + + + + + Dark Mode design + + + System design standard + + + Dark design scuro + + + Light design luminoso @@ -198,36 +378,50 @@ ConfigPage News as - News come + News come Conversations - Conversazioni + Conversazioni Timeline - Cronologia + Cronologia Max. News - Nº Max. di notizie + Nº Max. di notizie Hide #nsfw? - Nascondere #nsfw? + Nascondere #nsfw? + + + Appearance Visualizzare + + + Sync Sync + + + + + Close + + + Start Avviare @@ -235,6 +429,9 @@ ConfigStartPage + + + Autostart Avvio automatico @@ -244,84 +441,115 @@ ConfigTab User - Utente + Utente Server - Server + Server Nickname - Utente + Utente Password - Password + Password Image dir. - Directory immagini + Directory immagini Max. News - Nº Max. di notizie + Nº Max. di notizie News as - News come + News come Interval (0=None) - Intervallo (0=nessuno) + Intervallo (0=nessuno) Error - Errore + Errore Confirm - Conferma + Conferma No server given! - Nessun server inserito! + Nessun server inserito! No nickname given! - Nessun utente inserito! + Nessun utente inserito! No username given! - Nessun utente inserito! + Nessun utente inserito! No password given! - Nessuna password inserita! + Nessuna password inserita! No image directory given! - Nessuna directory immagini inserita! + Nessuna directory immagini inserita! No maximum news number given! - Nessun numero massimo di news inserito! + Nessun numero massimo di news inserito! Success - Ha funzionato! + Ha funzionato! Timeline - Cronologia + Cronologia Conversations - Conversazioni + Conversazioni + + + Nickname not registered at given server! + + + + Nickname not registered at given server! + + + + Sync Interval (0=None) + Intervallo (0=nessuno) + + + Nicknames containing @ symbol currently not supported + I soprannomi contenenti il simbolo @ attualmente non sono supportati + + + Min. + Min. + + + Wrong password! + Password sbagliata! + + + Name + Nome ContactComponent + + + Connect Connetti @@ -331,380 +559,641 @@ ContactDetailsComponent Connect - Connetti + Connetti Description - Descrizione + Descrizione Location - Località + Località Posts - Messaggi + Messaggi URL - URL + URL Created at - Creato il + Creato il ContactPage + + + seconds secondi + + + minute minuti + + + minutes minuti + + + hour ora + + + hours ore + + + day giorno + + + days giorni + + + month mese + + + months mesi + + + years anni + + + likes this. mi piace. + + + like this. mi piace. + + + doesn't like this. non mi piace. + + + don't like this. non mi piace. + + + will attend. attendere. + + + persons will attend. Persone che attendono. + + + will not attend. non aspettare. + + + persons will not attend. Persone che non aspettano. + + + may attend. puoi attendere. + + + persons may attend. Persone che possono attendere. - Connect - Connetti + + + + Direct Message + Messaggio diretto + + + + Close + + + + Connect + Connetti + + + + + + Approve Approvare + + + + Reject Rifiutare + + + + Ignore Ignorare + + + + Follow Seguire + + + + Unfollow Non seguire + + + + Block + + + + Unblock + + + + Description Descrizione + + + + Location Località + + + + Posts Messaggi + + + + URL URL + + + + Created at Creato il + + + + Followers Seguaci + + + + Following Seguente + + + + Network Error Errore di rete + + Contactlist + + + + + Close + + + ContactsSearchPage + + + + Network Error Errore di rete + + + + Forum Forum + + + + Person Persona + + + + + + Close + + Conversation + + + seconds secondi + + + minute minuti + + + minutes minuti + + + hour ora + + + hours ore + + + day giorno + + + days giorni + + + month mese + + + months mesi + + + years anni + + + likes this. mi piace. + + + like this. mi piace. + + + doesn't like this. non mi piace. + + + don't like this. non mi piace. + + + will attend. attendere. + + + persons will attend. Persone che attendono. + + + will not attend. non aspettare. + + + persons will not attend. Persone che non aspettano. + + + may attend. puoi attendere. + + + persons may attend. Persone che possono attendere. + + + + + Close + + DrawerAccountComponent + + + Refresh Aggiorna + + + Timeline Cronologia + + + Conversations Conversazioni + + + Replies Risposte + + + Direct Messages Messaggio diretto + + + Favorites Favoriti + + + Public Timeline Cronologia pubblica + + + Group news Notizie del gruppo + + + Search Cerca + + + Notifications Notifiche @@ -713,20 +1202,28 @@ DrawerAccountComponentContacts + + + Profile Profilo + + Friends Amici Contacts - Contatti + Contatti + + + Groups Gruppi @@ -735,52 +1232,124 @@ EventCreate + + + + Close + + + + + + Start Avviare + + + + Start date + + + + + + + Start time + + + + + + End Fine + + + + End date + + + + + + + End time + + + + + + + Accept time + + + + + + no end senza fine + + + Title (required) Titolo (obbligatorio) + + + Event description (optional) descrizione della data (opzionale) + + + Location (optional) Posizione (opzionale) + + + Publish event? Pubblicare l'evento? + + + Create event Creare l'evento + + + + - Error Errore + + + No event name supplied Nessun nome di evento @@ -790,9 +1359,19 @@ EventList Location - Località + Località + + + + Close + + + + + + Delete Event? Cancellare la data? @@ -801,30 +1380,61 @@ EventListItem + + Location Località + + FriendicaActivities + + + + + Close + + + FriendsListTab + + + Friend Requests Richieste di contatto + + + + - Friends Amici + + + + refresh + + + + + + All Tutti + + + Blocked @@ -833,79 +1443,173 @@ FriendsTab + + + Me Me + + + Friends Amici Contacts - Contatti + Contatti + + + Groups Gruppi + + GroupComponent + + + + + Close + + + + + + + Members + + + + Error + Errore + + + No name given + + + + + GroupsListTab + + + + + refresh + + + ImageUploadDialog + + + + Upload to album Carica su album Album - Album + Album Image - Immagine + Immagine + + + + Close + + + + + + + Description Descrizione + + + + Upload Carica + + + + Change Modifica + + + + Error Errore + + + + No album name given Nessun nome album inserito! + + InfoBox + + + + + Close + + + LeftDrawerScrollview + + + Settings Configurazione + + + Accounts Conti + + + Quit Chiudi @@ -914,11 +1618,26 @@ MessageImageUploadDialog + + + + Description Descrizione + + + + Add + + + + + + + Upload Carica @@ -927,26 +1646,222 @@ MessageSend + + + + Answer to + + + + + + + New message + + + + + + to: a: + + + Title (optional) Titolo (opzionale) + + + Drop your Content here. Lascia qui il tuo contenuto. + + + What's on your mind? A cosa stai pensando? + + + + Copy + + + + + + + Cut + + + + + + + Paste + + + + + + + Text + + + + + + + + Bold + + + + + + + + + + + Format + + + + + + + Italic + + + + + + + Create list + + + + + + + Format as code + + + + + + + Rendered + + + + + + + MD + + + + + + + Show Markdown code + + + + + + + Edit + + + + + + + emojies + + + + + + + Insert smiley + + + + + + + Insert previous hashtag + + + + + + + Image + Immagine + + + + + + Insert images + + + + + + + Cancel message + + + + + + + Close + + + + + + + Format message + + + + + + + Send message + + + + + + + Send + + + + + + + Error Errore @@ -954,10 +1869,14 @@ Only one attachment supported at the moment. Remove other attachment first! - Solo un allegato è attualmente supportato. + Solo un allegato è attualmente supportato. Rimuovere prima gli altri allegati! + + + + No receiver supplied! Nessun ricevitore in dotazione! @@ -966,272 +1885,493 @@ MoreComments + + + Show all comments Tutti commenti + + NewsPhotolist + + + + + Close + + + NewsStack Network Error - Errore di rete + Errore di rete + + + + More Ancora + + + + + + Close + + NewsTab Download profile image for - Download immagine profilo per + Download immagine profilo per More - Ancora + Ancora Timeline - Cronologia + Cronologia Error - Errore + Errore Favorites - Favoriti + Favoriti Conversations - Conversazioni + Conversazioni Direct Messages - Messaggio diretto + Messaggio diretto Notifications - Notifiche + Notifiche Group news - Gruppi + Gruppi + + + + seconds secondi + + + + minute minuti + + + + minutes minuti + + + + hour ora + + + + hours ore + + + + day giorno + + + + days giorni + + + + month mese + + + + months mesi + + + + years anni + + + + likes this. mi piace. + + + + like this. mi piace. + + + + doesn't like this. non mi piace. + + + + don't like this. non mi piace. + + + + will attend. attendere. + + + + persons will attend. Persone che attendono. + + + + will not attend. non aspettare. + + + + persons will not attend. Persone che non aspettano. + + + + may attend. puoi attendere. + + + + persons may attend. Persone che possono attendere. + + Network Error + Errore di rete + + + Replies + Risposte + + + Public timeline + + + + Quit + Chiudi + + + + NewsVideoLarge + + + + + Close + + Newsitem attending: - attendere: + attendere: + + + Source: Codice: + + + Direct Message Messaggio diretto + + In reply to In risposta a comments - commenti + commenti + + + attending partecipare + + + ago fa + + + Attending: Attendi: + + + Reply - Risposta + Risposta + + + DM Messaggio diretto + + + Repost Condividi + + + + Like + + + + + + + Dislike + + + + + + + Favorite + + + + + + + Menu + + + + + + Success! Ha funzionato! + + + Block contact + + + Report contact + + + Conversation Conversazione + + + Bookmark Segnalibro + + + Calendar Entry + + + Attending Attendi + + + yes si + + + maybe potrebbe + + + no no + + + Delete Cancella + + + External Sito web @@ -1240,268 +2380,513 @@ PermissionDialog + + + Friends Amici + + + Groups Gruppi + + + + + save + + + + + + + apply + + PhotoTab + 's images Immagini + + + + upload + + + + + + + download + + + + + + + All Images Tutte immagini + + + + Only new Solo nuovo + + + + + - Own Images Mie immagini + + + + More Ancora + + + + + Close + + ProfileComponent + + + + profile name nome del profilo + + + + is default è predefinito + + + + hide friends nascondere gli amici + + + + profile photo foto del profilo + + + + profile thumb piccola foto di profilo + + + + publish pubblicare + + + + publish in network pubblicare in rete + + + + description descrizione + + + + date of birth data di nascita + + + + address indirizzo + + + + city città + + + + region regione + + + + postal code codice postale + + + + country paese + + + + hometown città natale + + + + gender genere + + + + marital status stato civile + + + + married with sposato con + + + + married since sposato da quando + + + + sexual orientamento sessuale + + + + politics politica + + + + religion religione + + + + public keywords parole chiave pubbliche + + + + private keywords parole chiave private + + + + likes ama + + + + dislikes non piace + + + + about su + + + + music musica + + + + book libro + + + + tv tv + + + + film film + + + + interest interesse + + + + romance romanticismo + + + + work lavoro + + + + education educazione + + + + social networks reti sociali + + + + homepage homepage + + + + other altri + + + + refresh + + + + + + + Update Aggiornare + + + + profile id profilo id + + + + Description Descrizione + + + + Location Località + + + + Posts Messaggi + + + + URL URL + + + + Created at Creato il @@ -1510,26 +2895,45 @@ ReportUser + + + Report contact? + + + + comment + + + + illegal + + + + spam + + + + violation @@ -1539,33 +2943,50 @@ SmileyDialog + Unicode Unicode + Standard Standard + Addon Addon + Adult XXX + + + + + Close + + SyncComponent + + + sync sync + + + notify notificare @@ -1575,62 +2996,73 @@ SyncConfig + Sync Interval (0=None) Intervallo (0=nessuno) + Min. Min. + + + + + Backgound Sync + + friendiqa Refresh - Aggiorna + Aggiorna Timeline - Cronologia + Cronologia Conversations - Conversazioni + Conversazioni Favorites - Favoriti + Favoriti Replies - Risposte + Risposte Public Timeline - Cronologia pubblica + Cronologia pubblica Group news - Notizie del gruppo + Notizie del gruppo Search - Cerca + Cerca Settings - Configurazione + Configurazione Accounts - Conti + Conti Quit - Chiudi + Chiudi + + Background Sync Rightclick or Middleclick to Quit @@ -1638,133 +3070,191 @@ Fare clic con il tasto destro del mouse o con il tasto centrale per uscire + + Click to open Friendiqa Clicca per aprire Friendiqa + + + + + + + Posts + Messaggi + + + + + + + + Contacts + Contatti + + + + + + Images + + + + + + + + Photos + + + + + + + + + Calendar + + newsworker likes this. - mi piace. + mi piace. like this. - mi piace. + mi piace. doesn't like this. - non mi piace. + non mi piace. don't like this. - non mi piace. + non mi piace. will attend. - attendere. + attendere. persons will attend. - Persone che attendono. + Persone che attendono. will not attend. - non aspettare. + non aspettare. persons will not attend. - Persone che non aspettano. + Persone che non aspettano. may attend. - puoi attendere. + puoi attendere. persons may attend. - Persone che possono attendere. + Persone che possono attendere. + + yes si + + no no + + maybe potrebbe seconds - secondi + secondi ago - fa + fa minute - minuti + minuti minutes - minuti + minuti hour - ora + ora hours - ore + ore day - giorno + giorno days - giorni + giorni month - mese + mese months - mesi + mesi years - anni + anni service Error - Errore + Errore Changelog - Changelog + Changelog Setting view type of news has moved from account page to config page. - L'impostazione del tipo di visualizzazione delle notizie è stata spostata dalla pagina del conto alla pagina di configurazione. + L'impostazione del tipo di visualizzazione delle notizie è stata spostata dalla pagina del conto alla pagina di configurazione. + + + + Undefined Array Error + + + + JSON status Error diff --git a/src/translations/friendiqa-nl.ts b/src/translations/friendiqa-nl.ts index 5ec5d18..4465ca6 100644 --- a/src/translations/friendiqa-nl.ts +++ b/src/translations/friendiqa-nl.ts @@ -4,6 +4,9 @@ AcceptRules + + + Accept instance rules Instantieregels aanvaarden @@ -12,117 +15,217 @@ AccountPage + + + + + + + + - - - - - - User Gebruiker + + + Instance rules Instantieregels + + + Nickname Bijnaam + + + + + + + + - - - - - Error Foutmelding + + + Nicknames containing @ symbol currently not supported Bijnamen met het @-symbool worden momenteel niet ondersteund + + + + Password Wachtwoord + + + + Method + + + + + + + OAuth + + + + + + + Close + + + + + + Image dir. Afbeeldingsmap + + + Connect Verbinden + + + No server given! + + + Couldn't connect to server + + + Confirm Oké + + + No server given! Geen server opgegeven! + + + No nickname given! Geen bijnaam opgegeven! + + + No password given! Geen wachtwoord opgegeven! + + + No image directory given! Geen afbeeldingsmap opgegeven! + + + Set as default + + + - Wrong password or 2FA enabled! Onjuist wachtwoord of 2FA ingeschakeld! + + + + - Success Voltooid + + + Name Naam + + Server + + + + News as + Nieuws als + + + Wrong password! + + + + Timeline + Tijdlijn + + + Conversations + Gesprekken + BlockUser + + + Block contact? Contactpersoon blokkeren? @@ -131,16 +234,39 @@ CalendarTab + + + + refresh + + + + + + Delete Event? Gebeurtenis verwijderen? + + + + add + + + + + + Events Gebeurtenissen + + + Own Calendar Eigen agenda @@ -149,49 +275,83 @@ ConfigAppearancePage + + + News as Nieuws als + + + + + - - Conversations Gesprekken + + + + - Timeline Tijdlijn + + + Max. News Max. aantal items + + + Hide #nsfw? #nsfw verbergen? + + + + Default News Tabs + + + + + + Dark Mode Donker thema + + + System Systeemthema + + + Dark Donker + + + Light Licht @@ -200,384 +360,805 @@ ConfigPage + + + Appearance Vormgeving + + + Sync Synchronisatie + + + + + Close + + + Start Starten + + News as + Nieuws als + + + Conversations + Gesprekken + + + Timeline + Tijdlijn + + + Max. News + Max. aantal items + + + Hide #nsfw? + #nsfw verbergen? + ConfigStartPage + + + Autostart Automatisch opstarten + + ConfigTab + + User + Gebruiker + + + Server + + + + Nickname + Bijnaam + + + Password + Wachtwoord + + + Image dir. + Afbeeldingsmap + + + Max. News + Max. aantal items + + + News as + Nieuws als + + + Interval (0=None) + + + + Error + Foutmelding + + + Nickname not registered at given server! + + + + Confirm + Oké + + + No server given! + Geen server opgegeven! + + + No nickname given! + Geen bijnaam opgegeven! + + + Nickname not registered at given server! + + + + No username given! + + + + Sync Interval (0=None) + Synchroniseren, elke (0=niet) + + + Nicknames containing @ symbol currently not supported + Bijnamen met het @-symbool worden momenteel niet ondersteund + + + Min. + min. + + + No password given! + Geen wachtwoord opgegeven! + + + No image directory given! + Geen afbeeldingsmap opgegeven! + + + No maximum news number given! + + + + Wrong password! + + + + Success + Voltooid + + + Name + Naam + + + Timeline + Tijdlijn + + + Conversations + Gesprekken + + ContactComponent + + + Connect Verbinden + + ContactDetailsComponent + + Connect + Verbinden + + + Description + Beschrijving + + + Location + Locatie + + + Posts + Berichten + + + URL + Url + + + Created at + Gemaakt op + + ContactPage + + + seconds seconden + + + minute minuut + + + minutes minuten + + + hour uur + + + hours uur + + + day dag + + + days dagen + + + month maand + + + months maanden + + + years jaar + + + likes this. vindt dit leuk. + + + like this. vinden dit leuk. + + + doesn't like this. vindt dit niet leuk. + + + don't like this. vinden dit niet leuk. + + + will attend. neemt deel. + + + persons will attend. personen nemen deel. + + + will not attend. neemt niet deel. + + + persons will not attend. personen nemen niet deel. + + + may attend. neemt mogelijk deel. + + + persons may attend. personen nemen mogelijk deel. + + + + Direct Message + Privébericht + + + + + Approve Goedkeuren + + + Reject Weigeren + + + Ignore Negeren + + + Follow Volgen + + + Unfollow Ontvolgen + + + Block Blokkeren + + + Unblock Deblokkeren + + + Description Beschrijving + + + Location Locatie + + + Posts Berichten + + + URL Url + + + Created at Gemaakt op + + + Followers Volgers + + + Following Volgend + + + Network Error Netwerkfout + + + + + Close + + + + Connect + Verbinden + + + + Contactlist + + + + + Close + + ContactsSearchPage + + + Network Error Netwerkfout + + + Forum Forum + + + Person Persoon + + + + + + Close + + Conversation + + + seconds seconden + + + minute minuut + + + minutes minuten + + + hour uur + + + hours uur + + + day dag + + + days dagen + + + month maand + + + months maanden + + + years jaar + + + likes this. vindt dit leuk. + + + like this. vinden dit leuk. + + + doesn't like this. vindt dit niet leuk. + + + don't like this. vinden dit niet leuk. + + + will attend. neemt deel. + + + persons will attend. personen nemen deel. + + + will not attend. neemt niet deel. + + + persons will not attend. personen nemen niet deel. + + + may attend. neemt mogelijk deel. + + + persons may attend. personen nemen mogelijk deel. + + + + + Close + + DrawerAccountComponent + + + Refresh Herladen + + + Timeline Tijdlijn + + + Conversations Gesprekken + + + Replies Antwoorden + + + Direct Messages Privéberichten + + + Favorites Favorieten + + + Public Timeline Openbare tijdlijn + + + Group news Groepsnieuws + + + Search Zoeken + + + Notifications Meldingen @@ -586,70 +1167,154 @@ DrawerAccountComponentContacts + + + Profile Profiel + + Friends Vrienden + + + Groups Groepen + + Contacts + + EventCreate + + + + Close + + + + + + Start Begint om + + + + Start date + + + + + + + Start time + + + + + + End Eindigt om + + + + End date + + + + + + + End time + + + + + + + Accept time + + + + + + no end oneindig + + + Title (required) Titel (vereist) + + + Event description (optional) Gebeurtenisbeschrijving (optioneel) + + + Location (optional) Locatie (optioneel) + + + Publish event? Gebeurtenis publiceren? + + + Create event Gebeurtenis aanmaken + + + + - Error Foutmelding + + + No event name supplied Geen gebeurtenisnaam ingevoerd @@ -658,38 +1323,83 @@ EventList + + + + Close + + + + + + Delete Event? Gebeurtenis verwijderen? + + Location + Locatie + EventListItem + + Location Locatie + + FriendicaActivities + + + + + Close + + + FriendsListTab + + + Friend Requests Vriendschapsverzoeken + + + + - Friends Vrienden + + + + refresh + + + + + + All Alle + + + Blocked Geblokkeerd @@ -698,67 +1408,167 @@ FriendsTab + + + Me Ik + + + Friends Vrienden + + + Groups Groepen + + Contacts + + + + + GroupComponent + + + + + Close + + + + + + + Members + + + + Error + Foutmelding + + + No name given + + + + + GroupsListTab + + + + + refresh + + ImageUploadDialog + + + Upload to album Uploaden naar album + + + + Close + + + + + + Description Beschrijving + + + Upload Uploaden + + + Change Wijzigen + + + Error Foutmelding + + + No album name given Geen albumnaam ingevoerd + + Album + + + + Image + + + + + InfoBox + + + + + Close + + LeftDrawerScrollview + + + Settings Instellingen + + + Accounts Accounts + + + Quit Afsluiten @@ -767,11 +1577,24 @@ MessageImageUploadDialog + + + Description Beschrijving + + + + Add + + + + + + Upload Uploaden @@ -780,522 +1603,1174 @@ MessageSend + + + + Answer to + + + + + + + New message + + + + + + to: aan: + + + Title (optional) Titel (optioneel) + + + Drop your Content here. Sleep inhoud hierheen. + + + What's on your mind? Waar denk je aan? + + + + Copy + + + + + + + Cut + + + + + + + Paste + + + + + + + Text + + + + + + + + Bold + + + + + + + + + + + Format + + + + + + + Italic + + + + + + + Create list + + + + + + + Format as code + + + + + + + Rendered + + + + + + + MD + + + + + + + Show Markdown code + + + + + + + Edit + + + + + + + emojies + + + + + + + Insert smiley + + + + + + + Insert previous hashtag + + + + + + + Image + + + + + + + Insert images + + + + + + + Cancel message + + + + + + + Close + + + + + + + Format message + + + + + + + Send message + + + + + + + Send + + + + + + Error Foutmelding + + + No receiver supplied! Geen ontvanger gekozen! + + Only one attachment supported at the moment. + Remove other attachment first! + + MoreComments + + + Show all comments Alle reacties tonen + + NewsPhotolist + + + + + Close + + + NewsStack + + + More Meer + + + + + + Close + + + + Network Error + Netwerkfout + NewsTab + + + seconds seconden + + + minute minuut + + + minutes minuten + + + hour uur + + + hours uur + + + day dag + + + days dagen + + + month maand + + + months maanden + + + years jaar + + + likes this. vindt dit leuk. + + + like this. vinden dit leuk. + + + doesn't like this. vindt dit niet leuk. + + + don't like this. vinden dit niet leuk. + + + will attend. neemt deel. + + + persons will attend. personen nemen deel. + + + will not attend. neemt niet deel. + + + persons will not attend. personen nemen niet deel. + + + may attend. neemt mogelijk deel. + + + persons may attend. personen nemen mogelijk deel. + + Download profile image for + + + + More + Meer + + + Timeline + Tijdlijn + + + Error + Foutmelding + + + Favorites + Favorieten + + + Conversations + Gesprekken + + + Network Error + Netwerkfout + + + Replies + Antwoorden + + + Public timeline + + + + Direct Messages + Privéberichten + + + Notifications + Meldingen + + + Group news + Groepsnieuws + + + Quit + Afsluiten + + + + NewsVideoLarge + + + + + Close + + Newsitem + + + attending neemt deel + + + Direct Message Privébericht + + + Source: Bron: + + + ago geleden + + In reply to Als antwoord op + + + Attending: Deelnemers: + + + + Like + + + + + + + Dislike + + + + + + + Favorite + + + + + + + Reply + + + + + + + Menu + + + + + + Repost Opnieuw plaatsen + + + Success! Voltooid! + + + Block contact Contactpersoon blokkeren + + + Report contact Contactpersoon melden + + + Conversation Gesprek + + + DM PB + + + Bookmark Bladwijzer + + + Calendar Entry Agenda-item + + + Attending Deelnemen + + + yes ja + + + maybe misschien + + + no nee + + + Delete Verwijderen + + + External Extern + + attending: + + + + comments + + PermissionDialog + + + Friends Vrienden + + + Groups Groepen + + + + + save + + + + + + + apply + + PhotoTab + + 's images - 's afbeeldingen + 's afbeeldingen + + + + upload + + + + + + + download + + + + + + All Images Alle afbeeldingen + + + Only new Alleen nieuwe + + + + - Own Images Eigen afbeeldingen + + + More Meer + + + + + Close + + ProfileComponent + + + profile name profielnaam + + + is default is standaard + + + hide friends vrienden verbergen + + + profile photo profielfoto + + + profile thumb profielminiatuur + + + publish publiceren + + + publish in network publiceren op netwerk + + + description beschrijving + + + date of birth geboortedatum + + + address adres + + + city plaatsnaam + + + region regio/provincie + + + postal code postcode + + + country land + + + hometown geboorteplaats + + + gender geslacht + + + marital status huwelijksstatus + + + married with gehuwd met + + + married since gehuwd sinds + + + sexual sekse + + + politics politiek + + + religion religie + + + public keywords openbare trefwoorden + + + private keywords privétrefwoorden + + + likes ik houd van + + + dislikes ik houd niet van + + + about over + + + music muziek + + + book boek + + + tv tv + + + film film + + + interest hobby + + + romance romantiek + + + work werk + + + education educatie + + + social networks sociale netwerken + + + homepage website + + + other overig + + + + refresh + + + + + + Update Bijwerken + + + profile id profiel-id + + + Description Beschrijving + + + Location Locatie + + + Posts Berichten + + + URL Url + + + Created at Gemaakt op @@ -1304,26 +2779,41 @@ ReportUser + + + Report contact? Contactpersoon melden? + + + comment reactie + + + illegal illegaal + + + spam spam + + + violation overtreding @@ -1333,33 +2823,50 @@ SmileyDialog + Unicode Unicode + Standard Standaard + Addon Uitbreiding + Adult 18+ + + + + + Close + + SyncComponent + + + sync synchronisatie + + + notify melden @@ -1369,79 +2876,264 @@ SyncConfig + Sync Interval (0=None) Synchroniseren, elke (0=niet) + Min. min. + + + + + Backgound Sync + + friendiqa + Background Sync Rightclick or Middleclick to Quit Achtergrondsynchronisatie Rechts- of middelklik om te stoppen + + + + Posts Berichten + + + + Contacts + + + + Images + + + + + + Photos + + + + Calendar + Click to open Friendiqa Klik om Friendiqa te openen + + Refresh + Herladen + + + Timeline + Tijdlijn + + + Conversations + Gesprekken + + + Favorites + Favorieten + + + Replies + Antwoorden + + + Public Timeline + Openbare tijdlijn + + + Group news + Groepsnieuws + + + Search + Zoeken + + + Settings + Instellingen + + + Accounts + Accounts + + + Quit + Afsluiten + newsworker + + yes ja + + no nee + + maybe misschien + + likes this. + vindt dit leuk. + + + like this. + vinden dit leuk. + + + doesn't like this. + vindt dit niet leuk. + + + don't like this. + vinden dit niet leuk. + + + will attend. + neemt deel. + + + persons will attend. + personen nemen deel. + + + will not attend. + neemt niet deel. + + + persons will not attend. + personen nemen niet deel. + + + may attend. + neemt mogelijk deel. + + + persons may attend. + personen nemen mogelijk deel. + + + seconds + seconden + + + ago + geleden + + + minute + minuut + + + minutes + minuten + + + hour + uur + + + hours + uur + + + day + dag + + + days + dagen + + + month + maand + + + months + maanden + + + years + jaar + service + + + Undefined Array Error Onbepaalde reeksfout + + + JSON status Error Json-statusfout + + Error + Foutmelding + + + Changelog + + + + Setting view type of news has moved from account page to config page. + + From b59513ab91112501dbc3024b0b201a64fc51dcfe Mon Sep 17 00:00:00 2001 From: LubuWest Date: Mon, 22 Apr 2024 22:01:01 +0200 Subject: [PATCH 32/35] Background sync changes --- BackgroundSync.patch | 11 ++ CHANGELOG.md | 6 + PrivacyPolicy.md | 3 +- src/CMakeLists.txt | 1 - src/assets/friendiqa-sync.service | 7 -- src/assets/friendiqa-sync.timer | 10 -- src/common/alarmlinux.cpp | 33 ++++++ src/qml/configqml/ConfigAppearancePage.qml | 2 +- src/qml/configqml/ConfigPage.qml | 2 +- src/qml/configqml/OSSettingsAndroid.qml | 2 +- src/qml/newsqml/NewsStack.qml | 1 + src/qml/newsqml/Newsitem.qml | 3 +- src/translations/friendiqa-de.ts | 130 ++++++++++----------- 13 files changed, 122 insertions(+), 89 deletions(-) create mode 100644 BackgroundSync.patch delete mode 100644 src/assets/friendiqa-sync.service delete mode 100644 src/assets/friendiqa-sync.timer diff --git a/BackgroundSync.patch b/BackgroundSync.patch new file mode 100644 index 0000000..263f528 --- /dev/null +++ b/BackgroundSync.patch @@ -0,0 +1,11 @@ +--- src/common/alarmlinux.cpp ++++ src/common/alarmlinux.cpp +@@ -67,7 +67,7 @@ + stream << "Description=Run friendiqa background sync" << Qt::endl << Qt::endl; + stream << "[Service]" << Qt::endl; + stream << "Type=oneshot" << Qt::endl; +- stream << "ExecStart=/usr/bin/friendiqa -service" << Qt::endl; ++ stream << "ExecStart=flatpak run de.manic.friendiqa -service" << Qt::endl; + } + + QString nameTimer ="friendiqa-sync.timer"; diff --git a/CHANGELOG.md b/CHANGELOG.md index 491a5e5..81cab7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## v0.6.9 + +* Separate window for new messages with more formatting options +* Replaced all Fontawesome icons with system icons +* Switch between OAuth2 and Basic Auth +* Background sync with systemd-timer and removal of system tray ## v0.6.8 diff --git a/PrivacyPolicy.md b/PrivacyPolicy.md index c15eb20..716bb9e 100644 --- a/PrivacyPolicy.md +++ b/PrivacyPolicy.md @@ -5,5 +5,4 @@ You have probably selected Friendica as your preferred social network because yo Storing some pieces of user data on the device is necessary for some app features, other apps on your device may not access this data (keeping app’s own database storage protected from other apps is guaranteed by Android). The app has been programmed so that stored information contain any personal data (only login data and id number of last seen post will be transferred to servers). Photos from the albums and contact images are stored in a public directory on the device. Other apps may access these files and the Friendiqa needs access to this directory. To send images from the Android gallery the app needs access to picture databases on the device. -This app don’t collect any usage statistics. In addition, no information is sent from your Smartphone to me as a developer or to a website associated with me. -On first start, the website https://dir.friendica.social/servers/surprise is contacted and the selected server shown in the app. +This app doesn’t collect any usage statistics. In addition, no information is sent from your smartphone to me as a developer or to a website associated with me. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d4bde6d..85914fb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -46,7 +46,6 @@ target_link_libraries(friendiqa PRIVATE Qt6::Sql) target_link_libraries(friendiqa PRIVATE Qt6::DBus) target_link_libraries(friendiqa PRIVATE Qt6::NetworkAuth) target_link_libraries(friendiqa PRIVATE Qt6::Multimedia) -#target_link_libraries(friendiqa PRIVATE Qt6::Svg) install(TARGETS friendiqa DESTINATION ${CMAKE_INSTALL_BINDIR}) install(FILES assets/de.manic.Friendiqa.desktop DESTINATION share/applications) diff --git a/src/assets/friendiqa-sync.service b/src/assets/friendiqa-sync.service deleted file mode 100644 index c736814..0000000 --- a/src/assets/friendiqa-sync.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Run friendiqa background sync - -[Service] -Type=oneshot -ExecStart=/usr/bin/friendiqa -service - diff --git a/src/assets/friendiqa-sync.timer b/src/assets/friendiqa-sync.timer deleted file mode 100644 index c189795..0000000 --- a/src/assets/friendiqa-sync.timer +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=Run background sync for Friendiqa periodically - -[Timer] -Unit=friendiqa-sync.service -OnBootSec=10min -OnUnitActiveSec=15min - -[Install] -WantedBy=timers.target diff --git a/src/common/alarmlinux.cpp b/src/common/alarmlinux.cpp index b7b0846..5b78567 100644 --- a/src/common/alarmlinux.cpp +++ b/src/common/alarmlinux.cpp @@ -52,6 +52,39 @@ void ALARM::setAlarm(int interval) int intDisable = processDisable.execute("systemctl", QStringList() <<"--user"<<"disable"<<"--now"<<"friendiqa-sync.timer"); qDebug() << " intEnable "< - + AcceptRules @@ -189,7 +189,7 @@ Default News Tabs - + Standard-Tabs für Posts @@ -228,7 +228,7 @@ Close - + Schließen @@ -527,18 +527,18 @@ Direct Message - Direktnachricht + Direktnachricht Close - + Schließen Contactlist Close - + Schließen @@ -557,7 +557,7 @@ Close - + Schließen @@ -644,7 +644,7 @@ Close - + Schließen @@ -753,27 +753,27 @@ Close - + Schließen Start date - + Veranstaltungsbeginn Start time - + Startzeit End date - + Veranstaltungsende End time - + Endzeitpunkt Accept time - + Zeitpunkt akzeptieren @@ -788,7 +788,7 @@ Close - + Schließen @@ -802,7 +802,7 @@ FriendicaActivities Close - + Schließen @@ -825,7 +825,7 @@ refresh - + Aktualisieren @@ -859,18 +859,18 @@ Close - + Schließen Members - + Mitglieder GroupsListTab refresh - + Aktualisieren @@ -909,14 +909,14 @@ Close - + Schließen InfoBox Close - + Schließen @@ -946,7 +946,7 @@ Add - + Neu @@ -983,103 +983,103 @@ Answer to - + Antwort an New message - + Neue Nachricht Copy - + Kopieren Cut - + Ausschneiden Paste - + Einfügen Text - + Text Bold - + Fett Format - + Formatieren Italic - + Kursiv Create list - + Liste erstellen Format as code - + Als Code formatieren Rendered - + gerendert MD - + MD Show Markdown code - + Zeige Markdown Text Edit - + Bearbeiten emojies - + Emojis Insert smiley - + Smiley einfügen Insert previous hashtag - + Bestehenden Hashtag einfügen Image - Bild + Bild Insert images - + Bild einfügen Cancel message - + Nachricht abbrechen Close - + Schließen Format message - + Nachricht Formatieren Send message - + Nachricht senden Send - + Senden @@ -1093,7 +1093,7 @@ NewsPhotolist Close - + Schließen @@ -1108,7 +1108,7 @@ Close - + Schließen @@ -1250,7 +1250,7 @@ NewsVideoLarge Close - + Schließen @@ -1349,19 +1349,19 @@ Like - + Ich mag das Dislike - + Ich mag das nicht Favorite - + Markieren Menu - + Menü @@ -1376,11 +1376,11 @@ save - + Speichern apply - + Anwenden @@ -1407,15 +1407,15 @@ upload - + Hochladen download - + Herunterladen Close - + Schließen @@ -1602,7 +1602,7 @@ refresh - + Aktualisieren @@ -1648,7 +1648,7 @@ Close - + Schließen @@ -1674,7 +1674,7 @@ Backgound Sync - + Hintergrund-Aktualisierung @@ -1751,7 +1751,7 @@ Rechtsklick oder Mittelklick zum Schliessen Images - + Bilder @@ -1850,7 +1850,7 @@ Rechtsklick oder Mittelklick zum Schliessen years - Jahre + Jahre From 0dc0ce7f352748ca9a9eac225428891b2238296e Mon Sep 17 00:00:00 2001 From: LubuWest Date: Wed, 1 May 2024 21:23:16 +0200 Subject: [PATCH 33/35] repair video playback --- src/CMakeLists.txt | 2 +- src/common/xhr.cpp | 2 +- src/js/news.js | 60 +++++++------- src/js/service.js | 4 +- src/qml/calendarqml/EventListItem.qml | 2 +- src/qml/configqml/AccountPage.qml | 14 ++-- src/qml/contactqml/FriendsTab.qml | 1 - src/qml/contactqml/GroupsListTab.qml | 2 +- src/qml/friendiqa.qml | 4 +- src/qml/newsqml/ContactPage.qml | 24 +++--- src/qml/newsqml/MessageSend.qml | 10 +-- src/qml/newsqml/NewsStack.qml | 5 +- src/qml/newsqml/NewsVideo.qml | 16 +--- src/qml/newsqml/NewsVideoLarge.qml | 113 +++++++++++++++----------- src/qml/newsqml/Newsitem.qml | 16 +--- src/qml/photoqml/PhotoComponent.qml | 1 - src/translations/friendiqa-de.qm | Bin 19833 -> 32950 bytes src/translations/friendiqa-es.qm | Bin 17933 -> 26280 bytes src/translations/friendiqa-hu.qm | Bin 16638 -> 25158 bytes src/translations/friendiqa-it.qm | Bin 17897 -> 26031 bytes src/translations/friendiqa-nl.qm | Bin 19380 -> 25508 bytes 21 files changed, 133 insertions(+), 143 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 85914fb..ea99547 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -13,7 +13,7 @@ if(CMAKE_VERSION VERSION_LESS "3.7.0") set(CMAKE_INCLUDE_CURRENT_DIR ON) endif() -find_package(Qt6 REQUIRED COMPONENTS Core Widgets Quick QuickControls2 Sql DBus NetworkAuth Multimedia REQUIRED) +find_package(Qt6 REQUIRED COMPONENTS Core Quick QuickControls2 Widgets Sql DBus NetworkAuth Multimedia REQUIRED) qt_standard_project_setup() diff --git a/src/common/xhr.cpp b/src/common/xhr.cpp index 6951b27..dba9c5d 100644 --- a/src/common/xhr.cpp +++ b/src/common/xhr.cpp @@ -355,7 +355,7 @@ void XHR::onReplyError(QNetworkReply::NetworkError code) void XHR::onReplySuccess() { qDebug() << "!"; - QHashIterator i(params); + //QHashIterator i(params); // while(i.hasNext()) { // i.next(); // //qDebug() << i.key()<< " " << i.value(); diff --git a/src/js/news.js b/src/js/news.js index bbaa08f..12f8743 100644 --- a/src/js/news.js +++ b/src/js/news.js @@ -41,40 +41,42 @@ function requestFriends(login,database,rootwindow,callback){ var result2 = tx.executeSql('DELETE from groups where username="'+login.username+'"'); // clean old groups }) // /api/statuses/friends not working in Friendica 2/2022 , switching to api/v1/lists and download of all list members - // Helperjs.friendicaRequest(login,"/api/statuses/friends?count=9999", rootwindow,function (obj){ - var allfriends=[]; - Helperjs.friendicaRequest(login,"/api/v1/lists",rootwindow,function(listsobj){ - var lists=JSON.parse(listsobj) - for (var list in lists){ - Helperjs.friendicaRequest(login,"/api/v1/lists/"+lists[list].id+"/accounts?limit=0", rootwindow,function (obj){ - var friends=JSON.parse(obj); - var memberarray=[]; + Helperjs.friendicaRequest(login,"/api/statuses/friends?count=9999", rootwindow,function (obj){ + //var allfriends=[]; + //Helperjs.friendicaRequest(login,"/api/v1/lists",rootwindow,function(listsobj){ + // var lists=JSON.parse(listsobj) + // for (var list in lists){ + // Helperjs.friendicaRequest(login,"/api/v1/lists/"+lists[list].id+"/accounts?limit=0", rootwindow,function (obj){ + let friendsobj=JSON.parse(obj); + let friends=friendsobj.users; + //var memberarray=[]; for (var i=0;i0){// download contact images and update db var contacturls=[]; var contactnames=[]; - for (var link in newContacts){//print("new contact " +newContacts[link].screen_name); + for (var link in newContacts){ contacturls.push(newContacts[link].profile_image_url); contactnames.push(newContacts[link].screen_name); Service.updateContactInDB(login,db,newContacts[link].isFriend,newContacts[link]) @@ -311,7 +311,7 @@ ApplicationWindow{ systemTray.visible=true systemTray.show(); } - + root.contactdetailsSignal.connect(showContact); if(osSettings.osType=="Android"){ var component = Qt.createComponent("qrc:/qml/genericqml/IntentReceiver.qml"); var IntentReceiverQml = component.createObject(root); diff --git a/src/qml/newsqml/ContactPage.qml b/src/qml/newsqml/ContactPage.qml index 83cdf6d..4f4e784 100644 --- a/src/qml/newsqml/ContactPage.qml +++ b/src/qml/newsqml/ContactPage.qml @@ -181,8 +181,6 @@ Page { MButton{ id:dmbutton -// height: 6*mm -// width: 8*mm visible: (contact.following=="true") text: qsTr("Direct Message") display: AbstractButton.IconOnly @@ -211,7 +209,7 @@ Page { MButton{ id:approvebutton visible:(contact.hasOwnProperty("acct")&&!contact.searchContact) - //height: 6*mm + width: implicitWidth text:qsTr("Approve") onClicked:{ xhr.setAccount(login); @@ -225,7 +223,7 @@ Page { MButton{ id:rejectbutton visible:(contact.hasOwnProperty("acct")&&!contact.searchContact) - //height: 6*mm + width: implicitWidth text:qsTr("Reject") onClicked:{ xhr.setAccount(login); @@ -239,7 +237,7 @@ Page { MButton{ id:ignorebutton visible:(contact.hasOwnProperty("acct")&&!contact.searchContact) - //height: 6*mm + width: implicitWidth text:qsTr("Ignore") onClicked:{ xhr.setAccount(login); @@ -253,7 +251,7 @@ Page { MButton{ id:followbutton visible:(contact.isFriend==0 || !contact.hasOwnProperty("isFriend")) - //height: 6*mm + width: implicitWidth text:qsTr("Follow") onClicked:{ contactBusy.running=true; @@ -269,7 +267,7 @@ Page { MButton{ id:unfollowbutton visible:(contact.isFriend==1) - //height: 6*mm + width: implicitWidth text:qsTr("Unfollow") onClicked:{ contactBusy.running=true; @@ -284,7 +282,7 @@ Page { MButton{ id: blockbutton visible:(contact.statusnet_blocking!=1) - //height: 6*mm + width: implicitWidth text:qsTr("Block") onClicked:{ contactBusy.running=true; @@ -300,7 +298,7 @@ Page { MButton{ id: unblockbutton visible:(contact.statusnet_blocking==1) - //height: 6*mm + width: implicitWidth text:qsTr("Unblock") onClicked:{ contactBusy.running=true; @@ -358,12 +356,10 @@ Page { } function onSuccess(data,api){ if (api=="/api/statuses/user_timeline"){ - Service.processNews(api,data) + if (data!=""){ + Service.processNews(api,data) + }else{contactBusy.running=false} } - else if (api=="/api/statuses/user_timeline"){ - Service.processNews(api,data) - } - } } diff --git a/src/qml/newsqml/MessageSend.qml b/src/qml/newsqml/MessageSend.qml index 12ed161..6dce620 100644 --- a/src/qml/newsqml/MessageSend.qml +++ b/src/qml/newsqml/MessageSend.qml @@ -292,11 +292,11 @@ Window{ enabled: bodyField.canPaste action: pasteAction } - MenuItem { - text: qsTr("Text") - enabled: bodyField.selectedText - onTriggered: print(bodyField.getFormattedText(bodyField.selectionStart,bodyField.selectionEnd)) - } +// MenuItem { +// text: qsTr("Text") +// enabled: bodyField.selectedText +// onTriggered: print(bodyField.getFormattedText(bodyField.selectionStart,bodyField.selectionEnd)) +// } } DocumentHandler { id: document document: bodyField.textDocument diff --git a/src/qml/newsqml/NewsStack.qml b/src/qml/newsqml/NewsStack.qml index 8349996..44b8608 100644 --- a/src/qml/newsqml/NewsStack.qml +++ b/src/qml/newsqml/NewsStack.qml @@ -266,7 +266,7 @@ Rectangle{ Connections{ target:xhr - function onError(data,url,api,code){print("api "+api+" code "+code+"data"+data) + function onError(data,url,api,code){print("api "+api+" code "+code) newsBusy.running=false; expectScreenUpdate=false; } @@ -314,7 +314,7 @@ Rectangle{ } Timer {id:replytimer; interval: 1000; running: false; repeat: false - onTriggered: {print("replytimer") + onTriggered: {//print("replytimer") newsBusy.running=true; if(newstab.newstabstatus=="Conversation"){ showConversation(newsStack.timelineIndex-1,newsModel.get(0).newsitemobject)} @@ -556,7 +556,6 @@ Rectangle{ } Component.onCompleted: { - root.contactdetailsSignal.connect(showContact); root.newsSignal.connect(showNews); root.searchSignal.connect(search); try{newsModel.clear()} catch(e){} diff --git a/src/qml/newsqml/NewsVideo.qml b/src/qml/newsqml/NewsVideo.qml index f713c9b..7a72ccc 100644 --- a/src/qml/newsqml/NewsVideo.qml +++ b/src/qml/newsqml/NewsVideo.qml @@ -32,24 +32,14 @@ import QtQuick 6.3 Rectangle{ - color:"grey" - width:toprow.width/2; - height:toprow.width/3 + color:"light grey" + width: 7*root.fontFactor*osSettings.bigFontSize + height: 7*root.fontFactor*osSettings.bigFontSize property var attachment:({}) Image{ anchors.fill: parent source: "qrc:/assets/icons/play.svg" } - // Text{ - // id:noticeText - // text:"\uf144"; - // color:"light grey" - // width:parent.width - // font.pixelSize: parent.height/2 - // x: (parent.width-contentWidth)/2 - // y:parent.height/5 - // } - MouseArea {anchors.fill:parent; onClicked:{ rootstackView.push("qrc:/qml/newsqml/NewsVideoLarge.qml",{"source": Qt.resolvedUrl(attachment.url),"mimetype": attachment.mimetype}); diff --git a/src/qml/newsqml/NewsVideoLarge.qml b/src/qml/newsqml/NewsVideoLarge.qml index 9b2ff5a..8f84683 100644 --- a/src/qml/newsqml/NewsVideoLarge.qml +++ b/src/qml/newsqml/NewsVideoLarge.qml @@ -38,8 +38,14 @@ Page{ id:newsvideofullscreen width:root.width; height:root.height-3*root.fontFactor*osSettings.bigFontSize - property alias source:video.source + property alias source: video.source property string mimetype:"" + + Rectangle{ + anchors.fill: newsvideofullscreen + color: "black" + } + Text{ id:noticeText text:"" @@ -52,72 +58,83 @@ Page{ visible: video.playbackState!=MediaPlayer.PlayingState } - Video { - id:video; - anchors.fill:parent - - onErrorChanged:{ - noticeText.font.pointSize=osSettings.bigFontSize; - noticeText.text=errorString; - Qt.openUrlExternally(source) - } - fillMode: Image.PreserveAspectFit; -// autoLoad: true -// autoPlay: true -// audioRole: MediaPlayer.VideoRole + MediaPlayer { + id: video + audioOutput: AudioOutput {} + videoOutput: videoOutput + Component.onCompleted: {play()} + onErrorChanged: {noticeText.text=errorString;Qt.openUrlExternally(source)} } - ProgressBar{ - id: videoProgress - width: parent.width - height: 2*mm - anchors.bottom: video.bottom - z:2 - visible:video.playbackState!=MediaPlayer.StoppedState - value: video.position/video.duration - + VideoOutput { + id: videoOutput + anchors.fill: parent MouseArea { anchors.fill:parent; onClicked:{ if(video.playbackState!=MediaPlayer.PlayingState){ video.play()} else{video.pause() } + if(Math.round(video.position/video.duration*1000) == 1000){ + video.position=0;video.play() + } + } + } + + Rectangle{ + color:"light grey" + visible: video.playbackState!=MediaPlayer.PlayingState || (Math.round(video.position/video.duration*1000) == 1000) + opacity: 0.5 + anchors.centerIn: videoOutput + width: 5*root.fontFactor*osSettings.bigFontSize + height: 5*root.fontFactor*osSettings.bigFontSize + Image{ + anchors.fill: parent + source: "qrc:/assets/icons/play.svg" } } } - ProgressBar{ id: videoBuffer - width: parent.width - height: 2*mm - anchors.bottom: video.bottom - visible:video.playbackState!=MediaPlayer.StoppedState + width: parent.width-4*mm + x: 2*mm + height: mm + contentItem: Item { + Rectangle { + width: videoBuffer.visualPosition * parent.width + height: parent.height + color: "light blue" + } + } + anchors.bottom: parent.bottom value: video.bufferProgress } - MButton { - id: closeButton - z:2 - anchors.top: parent.top - anchors.topMargin: 1*mm - anchors.right: parent.right - anchors.rightMargin: 1*mm - text: qsTr("Close") - display: AbstractButton.IconOnly - icon.name: "dialog-close" - icon.source: "qrc:/assets/icons/times-circle.svg" - onClicked: {if (rootstackView.depth>1){ rootstackView.pop()} - } - } - - Slider{ id: videoSlider - width: parent.width - height: 3*mm - anchors.top: video.bottom + x: 2*mm + width: parent.width-4*mm + height: 2*mm + z: 2 + anchors.bottom: parent.bottom visible:video.playbackState!=MediaPlayer.StoppedState && video.seekable value: video.position/video.duration - onMoved: video.seek(value*video.duration) + onMoved: video.position=value*video.duration + } + + MButton { + id: closeButton + z:2 + anchors.top: parent.top + anchors.topMargin: 1*mm + anchors.right: parent.right + anchors.rightMargin: 1*mm + opacity: 0.6 + text: qsTr("Close") + display: AbstractButton.IconOnly + icon.name: "dialog-close" + icon.source: "qrc:/assets/icons/times-circle.svg" + onClicked: {if (rootstackView.depth>1){ rootstackView.pop()} + } } } diff --git a/src/qml/newsqml/Newsitem.qml b/src/qml/newsqml/Newsitem.qml index e41ba48..a0e29cd 100644 --- a/src/qml/newsqml/Newsitem.qml +++ b/src/qml/newsqml/Newsitem.qml @@ -73,8 +73,8 @@ Item { Column { id:toprow - width: newsitemobject.hasOwnProperty("indent")?newsitem.width-(newsitem.width/20 *(newsitemobject.indent+1)):newsitem.width//-8*mm - x:newsitemobject.hasOwnProperty("indent")?newsitem.width/20*(newsitemobject.indent):0 + width: newsitemobject.hasOwnProperty("indent")?newsitem.width-(newsitem.width/20 *(newsitemobject.indent+1))-mm:newsitem.width-mm + x:newsitemobject.hasOwnProperty("indent")?newsitem.width/20*(newsitemobject.indent)+0.5*mm:0.5*mm height: newsitemobject.nsfw?5*mm:Math.min(implicitHeight,3/4*root.height) clip: true Item{id:itemHeader @@ -190,19 +190,11 @@ Item { height:5*mm anchors.bottom: toprow.bottom visible: toprow.implicitHeight>3/4*root.height || newsitemobject.nsfw - //text:"\uf078" -// fontColor: osSettings.secondaryTextColor -// border.color: "transparent" -// color: osSettings.backgroundColor -// gradient: Gradient { -// GradientStop { position: 0.0; color: "transparent" } -// GradientStop { position: 0.5; color: osSettings.backgroundDimColor} -// } - //radius:0 icon.name:"arrow-down" icon.source: "qrc:/assets/icons/chevron-down.svg" icon.width: 2*root.fontFactor*osSettings.bigFontSize icon.height: 2*root.fontFactor*osSettings.bigFontSize + icon.color:"transparent" background: Rectangle{ gradient: Gradient { GradientStop { position: 0.0; color: "transparent" } @@ -216,7 +208,7 @@ Item { } else { toprow.height=Math.min(toprow.implicitHeight,3/4*root.height); icon.name="arrow-down";icon.source="qrc:/assets/icons/chevron-down.svg"; - newsView.positionViewAtIndex(index,ListView.Beginning); + newsitem.ListView.view.positionViewAtIndex(index,ListView.Beginning); } } } diff --git a/src/qml/photoqml/PhotoComponent.qml b/src/qml/photoqml/PhotoComponent.qml index 1488dd3..347f9c3 100644 --- a/src/qml/photoqml/PhotoComponent.qml +++ b/src/qml/photoqml/PhotoComponent.qml @@ -113,7 +113,6 @@ Package { enabled: false } - // onStateChanged: print("State"+photoWrapper.state+index) states: [ State { name: 'stacked'; when: albumWrapper.state == '' diff --git a/src/translations/friendiqa-de.qm b/src/translations/friendiqa-de.qm index 00f226326b0fd3effbf334a20356b9c690e311c5..cf08a6889b7f6b5c9bacbe2f0e15ddc2fbe6c1d8 100644 GIT binary patch delta 9618 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 diff --git a/src/translations/friendiqa-es.qm b/src/translations/friendiqa-es.qm index 4ef4daeeee4d5699e2746c34b39a8b4fb27200e8..f034d6006c65ff17091728787841b074d38256df 100644 GIT binary patch delta 5676 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 delta 1980 zcmXYxc~DbV6vj`Ici+oOLc$&;0m2ReCDE`*u}pzMfoWBAqEuXwfVLEH>0-2Etpx__ zs}zM&E24l@(YQd>78P)5L1wJBR;{S5VzDk2M9U~W_WDQWmv{5-x!*b8chl7&c(GQn z$;-~E0GM(B|BC>`4B&MhfXe^~@}#u%AP)nWdI7BY0MZo7km~?B_zA24ux-TkQkLrS;DiGIrnGE_qD2h=ia1L35T)-HC_4KXATk~7tyoXFkYKjO>}M9b^u|c=t1f_TrZ<^ zEfPH!V;-D9WdHw*<``Y@OJm46+^A4csyiutZHy-EF@S3q<8cTD>Y5qz9RYyFkBJpw zFavfowIwJ(JBMiwtH&@uWzOwP#{;aCF7A|mb<9tlSf5cbJ((BK>L@#NDJlm*{1`Rg^(HnHQO8g~Xe%8nh;OFX2Z0kQyR+R0|-_pj0!I zKCMKhHRDA0lQ6Y2fZz&=Ex>bvSCA=BqA+vzBu4bIhw2e=b1VGatAU#C=8Qu-!vN!G_`X&$Ag^|L7#oz=Sur&2A81LEUlXYl^JFA$%Oz)swE zi_c~_p^(j#>J&%t}4Ko|56M+iK7X z(Kphg71Po3>(UPUnPK$$khG&8X}BYUMk9JvO{vMG^t~q|x&=6a0a>=+1@yjKX6wTO zT)nJZG=$+BmQ{7$$Mp!=*7J|Bo>kU09)*t`ko(oI18}p+BQF1r0#C{(rSC^eR?9Q$ zai94Yxqa@eS?H}qepFD18?^F1FI4DuL_w68?r{qh@q@J(%1T9UQX;M!6orm>Y|y5t z=)m_p@+iFwub534v{)Gvs=?ITl-4FEoY*r;msUzcjB-aJW(j`wS2k}thS%*qb zEOVn&by4d1TufFs|G9KBpDFv&5hU*x@)1fiU!#n1=u`#~pW#x#54+6ZE#4u#-rJ4u z(8cm``eMhZew~tEnH=C4iZluMnd7VZ(5TJ)Yo;aqRnq~-59W7;ywx(-aUnWSz<(0t w;pmFrz&J`1IU(Qv#;D_YQmWFiDl=EWUz=m(Ph|!2|IQ8J%d*q>yYsUC11pIbd;kCd diff --git a/src/translations/friendiqa-it.qm b/src/translations/friendiqa-it.qm index 189d88266812ed88c1bf96b73639094914c33b21..f6f68d88086346c0d4c6bc0f7604fb67c31967e4 100644 GIT binary patch delta 5788 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 delta 2101 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 Ic`mEte|-m>OaK4? delta 2163 zcmXYyc~DbV6vj_@TV7TrB%)Cf!X7|O2#X*hIHV)t?MH9_$oyXJd+*%yo%5ah8rn67-_xug zqDX%c@#}~Zee;^1Df_ollgqg2eh(a3_f^91^(7Xz65(X&|v9 zkto$g;yt`)`lye{D�zh<$;irk9DbuanfbLCzeKzDHuCej?XN1J?Iamh&!=_6DQ9 zmd5RUjA(QLjXRM7zCjZ_TZwc#Xwv2qBC2H^GKw+c55}l!np}30DEKFu{y^zPdC$|F za+J%^#ON-edCl)YVKHM^I4!9SK$%R-y(%)l%@}f>F}9w38k95bF8OLux#V)j+;XaT zqM4{)F{7=B5nZS_dxt2)O3y0$QHqR-q#Q%w;Ex$YPctTrrd^Vc$g`VTycwuSfNthL zA{yCEza~IoW|YP{F%DjMPV@B0HAD$LnpMy3LcE7TBZ3zaIhF^tY}!eb`*Tp6?-L^K zQczdk4774U(9KsiA+9Az`LWM5QYB|=>_jiSIrrEwlzIr4x&ayLtGHA(2KO7@k?oO}*iVDZ9Bq1u8lC5ZC<_49j`BUkg^_{vO8AUhaW5o2Y*> z;{X?9d_duaa|qDS$!LpXjJwENCL@7?Ieh35D2jf-dv0lvz#~4B>p%j>`R!|vNW?OJ zUqU1PoA~2JFz3)2{JDlH*r=LuKn_K zaabCoJ4V?07J6nc6!ul&xwJ~*;2yYGyHz;dj0(6v7ur1)=((FQ@}}@x)hwd)H$+E) z1zxEXW4rpM#ULg(qXHSLM0d(q%>Qs+%z8Wub9qP1I+%pONn%Ns9S71#@yxbjBvdC} z$i;f_a>me=jLtja)dH9|wN&C}sHnsOiEGB;B$P?kBy2orrIfP(iJ9*+TJJH&?U3^4 z-9gK1`iS|r{dYkW@06x_#}b7#NwW`Jf!iI@%RT6&*}`ZwGRC$`RXtFWRUvIO3sCZr z^lryWw5(jJ`{yN;HdWeNjTWV3O2=AZ(!6x3HTgCw(50=ceI4h+VyzmEsfmu)?zyRa z3)iP;4_rvWjjtJ9b=s5FXP}@{+ddr1>=y0WsU{@S#Aw~g7&l#esRosk619KafRN~y zWP3~q#;Z-XuSMdfMT{Zy8Dk@5&kjtB@f{xn><zcgq>sK*G zvRu06J1G52Ue@=Vr$~NNIRtN%GFl?!bpdP?p^=+Dg<{7!`NKtE|9gxB{$_N(rn4RS z2XQRAMOhG8{+QL<~gHSb5lB!_gZb?6cQwC;G#On73y zE^y{goNURuz-=&LsqU*&1JSCvdTL2RFHbSr0*vwV^+H%F%*p9PZaJ_K>5Cm*@XB_5 zc@N^ro%(g$UC^QEH?{o&Wxe{%7k`J@&g)ORpeQQZ;AmWp`Txc+{K_}T{G?&jln=1p zZkXUXk8#a1Ol?Gf(LWoC=FWx7I}A&$`06G4497J-e548tJ%b=%kkcrb8!(15jM=^0 zasRNf=p@B4XUDCeKqua#HrwiW6r+Z=VaK32Up*ru)<`iz<$w#xq~jI;VvJ&hXw qz_eEcb?CxS|Kp?U2KwEFX&N Date: Wed, 1 May 2024 21:49:13 +0200 Subject: [PATCH 34/35] README for 0.6.9 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e09c9ba..e80c04c 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Currently supported: * Attending for event posts * Update fetches new posts (up to last 50) since last in local DB * More shows older posts from local DB -* Create new Message with images or direct messages,smileys +* Create new Message with images or direct messages, smileys in new window * Send image(s) from Android gallery * Send text or urls from other apps to Friendiqa * Native Android image dialog @@ -101,14 +101,14 @@ Currently supported: * Dark Mode * View mode for news (conversation tree or timeline) * Maximum news (deleted after use of Quit button) +* Set default news tabs * Sync home timeline, replies, DM, Events, friend requests; Notify yes/no * Hide #nsfw * OAuth2 as authorization method # Other -* on Linux: App stays in systemtray and syncs in background -* Autostart minimized in systray possible +* on Linux: syncs in background via systemd-timer ToDo From a2cea6464cfe80d1b2799d9bc5b6872e9efc3f87 Mon Sep 17 00:00:00 2001 From: LubuWest Date: Fri, 3 May 2024 18:12:01 +0200 Subject: [PATCH 35/35] groups download --- src/js/news.js | 33 ++++++++++++------- src/qml/contactqml/FriendsTab.qml | 2 +- src/qml/contactqml/GroupsListTab.qml | 8 +++-- .../DrawerAccountComponentContacts.qml | 2 +- src/qml/newsqml/ContactPage.qml | 2 +- src/qml/newsqml/Conversation.qml | 2 +- src/qml/newsqml/NewsTab.qml | 1 + src/qml/newsqml/Newsitem.qml | 4 +-- 8 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/js/news.js b/src/js/news.js index 12f8743..298558d 100644 --- a/src/js/news.js +++ b/src/js/news.js @@ -83,17 +83,28 @@ function requestFriends(login,database,rootwindow,callback){ function requestGroups(login,database,rootwindow,callback){ // retrieve, save and return groups. Other features currently not implemented var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); - Helperjs.friendicaRequest(login,"/api/friendica/group_show",rootwindow, function (obj){ - var groups=JSON.parse(obj); - db.transaction( function(tx) { - var result = tx.executeSql('DELETE from groups where username="'+login.username+'"'); // clean old groups - for (var i=0;iparseInt(x.id)); + db.transaction( function(tx) { + var result2 = tx.executeSql('INSERT INTO groups VALUES (?,?,?,?)', [login.username,lists[list].title,lists[list].id,JSON.stringify(memberarray)]) + groups.push({groupname:lists[list].title,gid:lists[list].id,members:memberarray}) + }); + callback(groups) + }) + } + } + }) +} function listFriends(login,database,callback,filter,isFriend=0){ var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); diff --git a/src/qml/contactqml/FriendsTab.qml b/src/qml/contactqml/FriendsTab.qml index 8c3cd26..f964c4f 100644 --- a/src/qml/contactqml/FriendsTab.qml +++ b/src/qml/contactqml/FriendsTab.qml @@ -80,7 +80,7 @@ Rectangle { height: 1.7*root.fontFactor*osSettings.bigFontSize } TabButton { - text: qsTr("Groups") + text: qsTr("Circles") font.pointSize: osSettings.systemFontSize height: 1.7*root.fontFactor*osSettings.bigFontSize } diff --git a/src/qml/contactqml/GroupsListTab.qml b/src/qml/contactqml/GroupsListTab.qml index 3f3b52b..eaf754c 100644 --- a/src/qml/contactqml/GroupsListTab.qml +++ b/src/qml/contactqml/GroupsListTab.qml @@ -82,8 +82,12 @@ Item{ anchors.right: parent.right anchors.rightMargin:menuButton.width onClicked: { - Newsjs.requestGroups(root.login,root.db,root,function(){ - groupsGridTab.showGroups(root.login.username)})} + Newsjs.requestGroups(root.login,root.db,root,function(groups){ + for (let n in groups){ + groupsModel.append({"group":groups[n]}); + } + //groupsGridTab.showGroups(root.login.username)}) + })} } // MButton { // id: newGroupButton diff --git a/src/qml/genericqml/DrawerAccountComponentContacts.qml b/src/qml/genericqml/DrawerAccountComponentContacts.qml index 82f7dfe..544ade1 100644 --- a/src/qml/genericqml/DrawerAccountComponentContacts.qml +++ b/src/qml/genericqml/DrawerAccountComponentContacts.qml @@ -95,7 +95,7 @@ Item { width:parent.width font.pointSize: osSettings.systemFontSize font.bold: account.username==login.username && friendsTabView.currentIndex==2 - text: " "+qsTr("Groups") + text: " "+qsTr("Circles") MouseArea{ anchors.fill:parent onClicked:{ diff --git a/src/qml/newsqml/ContactPage.qml b/src/qml/newsqml/ContactPage.qml index 4f4e784..4ac2b3a 100644 --- a/src/qml/newsqml/ContactPage.qml +++ b/src/qml/newsqml/ContactPage.qml @@ -355,7 +355,7 @@ Page { contactBusy.running=false; } function onSuccess(data,api){ - if (api=="/api/statuses/user_timeline"){ + if (api=="/api/statuses/user_timeline" || api=="/api/conversation/show"|| api=="/api/direct_messages/conversation"){ if (data!=""){ Service.processNews(api,data) }else{contactBusy.running=false} diff --git a/src/qml/newsqml/Conversation.qml b/src/qml/newsqml/Conversation.qml index b26b4a2..65fc382 100644 --- a/src/qml/newsqml/Conversation.qml +++ b/src/qml/newsqml/Conversation.qml @@ -118,7 +118,7 @@ Page { Connections{ target: root - function onConversationChanged(){ + function onConversationChanged(){print(conversation+" conversation "+JSON.stringify(root.conversation)) // if(root.conversation.length==0){ // rootstackView.pop() // } else { diff --git a/src/qml/newsqml/NewsTab.qml b/src/qml/newsqml/NewsTab.qml index 9400a2b..61dfa98 100644 --- a/src/qml/newsqml/NewsTab.qml +++ b/src/qml/newsqml/NewsTab.qml @@ -53,6 +53,7 @@ Page{ } function showConversation(conversationIndex,newsitemobject){ + expectScreenUpdate=true; if(newsitemobject.messagetype==0 || newsitemobject.messagetype==3){ xhr.setAccount(login); xhr.setApi("/api/conversation/show"); diff --git a/src/qml/newsqml/Newsitem.qml b/src/qml/newsqml/Newsitem.qml index a0e29cd..91f2044 100644 --- a/src/qml/newsqml/Newsitem.qml +++ b/src/qml/newsqml/Newsitem.qml @@ -55,11 +55,11 @@ Item { } function pushConversation(){ + //expectScreenUpdate=true; + showConversation(index,newsitemobject) if (model.newsitemobject.hasOwnProperty("currentconversation")){ rootstackView.push("qrc:/qml/newsqml/Conversation.qml",{"news": model.newsitemobject.currentconversation})} else{rootstackView.push("qrc:/qml/newsqml/Conversation.qml")}; - expectScreenUpdate=true; - showConversation(index,newsitemobject) } Rectangle{width:newsitem.width; height: 1; anchors.bottom: newsitem.bottom;