v0.5.3 events and indentation

This commit is contained in:
LubuWest 2020-05-24 21:14:23 +02:00
parent 575c1b0e1e
commit 18c7255b91
103 changed files with 1601 additions and 1906 deletions

View File

@ -1,3 +1,11 @@
## 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
* News view type config moved from account page to config page
* Simplification of account page on first start
* Bugfixes
## v0.5.2 ## ## v0.5.2 ##
* Redesign of news item * Redesign of news item
* Background sync for Android >8.0 * Background sync for Android >8.0

View File

@ -23,7 +23,7 @@ Currently supported:
* Android notifications or Dbus notification (Linux) for new items in friends timeline, replies and DMs * Android notifications or Dbus notification (Linux) for new items in friends timeline, replies and DMs
* Search for news * Search for news
* Click on hashtag in newsitem starts search for news with that word * Click on hashtag in newsitem starts search for news with that word
* Click on image shows image fullscree * Click on image shows image fullscreen
* Click on video or youtube video shows video fullscreen * 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 * 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 * Open links in external browser
@ -81,13 +81,12 @@ ToDo:
# Events # # Events #
Currently supported: Currently supported:
* Download own public events * Show own events
* Show public of Friendica contacts * Show public events of Friendica contacts
* List view of events of selected date * List view of events of selected date
* Click on event to show details * Click on event to show details
ToDo ToDo
* Show own private events (needs API)
* Create events (needs API) * Create events (needs API)
@ -97,6 +96,7 @@ Currently supported:
* View mode for news (tree or timeline) * View mode for news (tree or timeline)
* Maximum news (deleted after use of Quit button) * Maximum news (deleted after use of Quit button)
* Sync home timeline, replies, DM, Notify yes/no * Sync home timeline, replies, DM, Notify yes/no
* Hide #nsfw
ToDo ToDo
* OAuth? * OAuth?

View File

@ -1,7 +1,19 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<manifest package="org.qtproject.friendiqa" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.5.2" android:versionCode="19" android:installLocation="auto"> <manifest package="org.qtproject.friendiqa" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.5.3" android:versionCode="21" android:installLocation="auto">
<application android:hardwareAccelerated="true" android:vmSafeMode="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="Friendiqa" android:icon="@drawable/friendiqa" android:logo="@drawable/friendiqa" android:theme="@android:style/Theme.Holo.Light"> <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29"/>
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="androidnative.friendiqa.FriendiqaActivity" android:label="Friendiqa" android:screenOrientation="unspecified" android:launchMode="singleTask" android:taskAffinity="">
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
Remove the comment if you do not require these default permissions. -->
<!-- %%INSERT_PERMISSIONS -->
<!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
Remove the comment if you do not require these default features. -->
<!-- %%INSERT_FEATURES -->
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
<application android:hardwareAccelerated="false" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="Friendiqa" android:extractNativeLibs="true" android:icon="@drawable/friendiqa" android:theme="@android:style/Theme.Holo.Light" android:logo="@drawable/friendiqa">
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:name="androidnative.friendiqa.FriendiqaActivity" android:label="Friendiqa" android:screenOrientation="unspecified" android:launchMode="singleTask" android:taskAffinity="">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER"/>
@ -17,6 +29,10 @@
<category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/*"/> <data android:mimeType="text/*"/>
</intent-filter> </intent-filter>
<!-- Application arguments -->
<!-- meta-data android:name="android.app.arguments" android:value="arg1 arg2 arg3"/ -->
<!-- Application arguments -->
<meta-data android:name="android.app.lib_name" android:value="friendiqa"/> <meta-data android:name="android.app.lib_name" android:value="friendiqa"/>
<meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/> <meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
<meta-data android:name="android.app.repository" android:value="default"/> <meta-data android:name="android.app.repository" android:value="default"/>
@ -24,22 +40,33 @@
<meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/> <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
<!-- Deploy Qt libs as part of package --> <!-- Deploy Qt libs as part of package -->
<meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/> <meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
<meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
<meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
<!-- Run with local libs --> <!-- Run with local libs -->
<meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/> <meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
<meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/> <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
<meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/> <meta-data android:name="android.app.load_local_libs_resource_id" android:resource="@array/load_local_libs"/>
<meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/> <meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
<meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/> <meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
<!-- Used to specify custom system library path to run with local system libs -->
<!-- <meta-data android:name="android.app.system_libs_prefix" android:value="/system/lib/"/> -->
<!-- Messages maps --> <!-- Messages maps -->
<meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/> <meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
<meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/> <meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
<meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/> <meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
<meta-data android:value="@string/unsupported_android_version" android:name="android.app.unsupported_android_version"/>
<!-- Messages maps --> <!-- Messages maps -->
<!-- Splash screen -->
<!-- Orientation-specific (portrait/landscape) data is checked first. If not available for current orientation,
then android.app.splash_screen_drawable. For best results, use together with splash_screen_sticky and
use hideSplashScreen() with a fade-out animation from Qt Android Extras to hide the splash screen when you
are done populating your window with content. -->
<!-- meta-data android:name="android.app.splash_screen_drawable_portrait" android:resource="@drawable/logo_portrait" / -->
<!-- meta-data android:name="android.app.splash_screen_drawable_landscape" android:resource="@drawable/logo_landscape" / -->
<!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ -->
<!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/> <meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/>
<!-- Splash screen -->
<!-- Background running --> <!-- Background running -->
<!-- Warning: changing this value to true may cause unexpected crashes if the <!-- Warning: changing this value to true may cause unexpected crashes if the
@ -48,9 +75,23 @@
signal is sent! --> signal is sent! -->
<meta-data android:name="android.app.background_running" android:value="false"/> <meta-data android:name="android.app.background_running" android:value="false"/>
<!-- Background running --> <!-- Background running -->
</activity>
<!-- auto screen scale factor -->
<meta-data android:name="android.app.auto_screen_scale_factor" android:value="false"/>
<!-- auto screen scale factor -->
<!-- extract android style -->
<!-- available android:values :
* default - In most cases this will be the same as "full", but it can also be something else if needed, e.g., for compatibility reasons
* full - useful QWidget & Quick Controls 1 apps
* minimal - useful for Quick Controls 2 apps, it is much faster than "full"
* none - useful for apps that don't use any of the above Qt modules
-->
<meta-data android:name="android.app.extract_android_style" android:value="default"/>
<!-- extract android style -->
</activity>
<!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->
<service android:name="androidnative.friendiqa.FriendiqaService" android:permission="android.permission.BIND_JOB_SERVICE"> <service android:name="androidnative.friendiqa.FriendiqaService" android:permission="android.permission.BIND_JOB_SERVICE">
<meta-data android:name="android.app.background_running" android:value="true"/> <meta-data android:name="android.app.background_running" android:value="true"/>
</service> </service>
@ -64,12 +105,14 @@
<meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/> <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
<meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/> <meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
<!--
<meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/> <meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
<meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/> <meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
-->
<meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/> <meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
<meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/> <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
<meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/> <meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/>
<meta-data android:name="android.app.load_local_libs_resource_id" android:resource="@array/load_local_libs"/>
<meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/> <meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
<meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/> <meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
@ -83,20 +126,7 @@
<service android:process=":qt" android:name="androidnative.friendiqa.FriendiqaStopService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true"> <service android:process=":qt" android:name="androidnative.friendiqa.FriendiqaStopService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true">
<meta-data android:name="android.app.background_running" android:value="true"/> <meta-data android:name="android.app.background_running" android:value="true"/>
</service> </service>
</application> </application>
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28"/>
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
Remove the comment if you do not require these default permissions. -->
<!-- %%INSERT_PERMISSIONS -->
<!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
Remove the comment if you do not require these default features. -->
<!-- %%INSERT_FEATURES -->
</manifest> </manifest>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -4,37 +4,26 @@ buildscript {
jcenter() jcenter()
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.5.2' classpath 'com.android.tools.build:gradle:3.5.2'
} }
} }
allprojects { repositories {
repositories { google()
google() jcenter()
jcenter()
maven { maven {
url "https://maven.google.com" url "https://maven.google.com"
} }
}
} }
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
dependencies { dependencies {
compile fileTree(dir: 'libs', include: ['*.jar']) implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
} }
//apply plugin: 'android-library'
//dependencies {
// compile 'com.android.support:support-v4:25.4.0'
//}
//dependencies {
// compile 'com.android.support:support-compat:25.4.0'
//}
dependencies { dependencies {
compile 'androidx.appcompat:appcompat:1.1.0' compile 'androidx.appcompat:appcompat:1.1.0'
} }
@ -55,7 +44,7 @@ android {
compileSdkVersion androidCompileSdkVersion.toInteger() compileSdkVersion androidCompileSdkVersion.toInteger()
buildToolsVersion androidBuildToolsVersion buildToolsVersion '28.0.3'
sourceSets { sourceSets {
main { main {
@ -63,7 +52,7 @@ android {
java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java'] java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']
aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl'] aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']
res.srcDirs = [qt5AndroidDir + '/res', 'res'] res.srcDirs = [qt5AndroidDir + '/res', 'res']
resources.srcDirs = ['src'] resources.srcDirs = ['resources']
renderscript.srcDirs = ['src'] renderscript.srcDirs = ['src']
assets.srcDirs = ['assets'] assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs'] jniLibs.srcDirs = ['libs']
@ -73,6 +62,15 @@ android {
lintOptions { lintOptions {
abortOnError false abortOnError false
} }
// Do not compress Qt binary resources file
aaptOptions {
noCompress 'rcc'
}
defaultConfig {
resConfigs "en"
}
} }
apply from: "androidnative.gradle" apply from: "androidnative.gradle"
setAndroidNativePath("/../androidnative.pri"); setAndroidNativePath("/../androidnative.pri");

View File

@ -1,69 +0,0 @@
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.1.0'
}
}
allprojects {
repositories {
jcenter()
}
}
apply plugin: 'com.android.application'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
//apply plugin: 'android-library'
dependencies {
compile 'com.android.support:support-v4:25.3.1'
}
dependencies {
compile 'com.android.support:support-compat:25.3.1'
}
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("/../androidnative.pri");

View File

@ -1,6 +1,5 @@
#Wed Apr 10 15:27:10 PDT 2013
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip

View File

@ -1,4 +1,4 @@
#!/usr/bin/env bash #!/usr/bin/env sh
############################################################################## ##############################################################################
## ##
@ -6,47 +6,6 @@
## ##
############################################################################## ##############################################################################
# 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
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME # Attempt to set APP_HOME
# Resolve links: $0 may be a link # Resolve links: $0 may be a link
PRG="$0" PRG="$0"
@ -61,9 +20,49 @@ while [ -h "$PRG" ] ; do
fi fi
done done
SAVED="`pwd`" SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&- cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`" APP_HOME="`pwd -P`"
cd "$SAVED" >&- cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# 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
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@ -90,7 +89,7 @@ location of your Java installation."
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n` MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@ -114,6 +113,7 @@ fi
if $cygwin ; then if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"` APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath # We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
@ -154,11 +154,19 @@ if $cygwin ; then
esac esac
fi fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules # Escape application args
function splitJvmOpts() { save () {
JVM_OPTS=("$@") for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
} }
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS APP_ARGS=$(save "$@")
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" # Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

View File

@ -1,90 +1,84 @@
@if "%DEBUG%" == "" @echo off @if "%DEBUG%" == "" @echo off
@rem ########################################################################## @rem ##########################################################################
@rem @rem
@rem Gradle startup script for Windows @rem Gradle startup script for Windows
@rem @rem
@rem ########################################################################## @rem ##########################################################################
@rem Set local scope for the variables with windows NT shell @rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal 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 DIRNAME=%~dp0
set DEFAULT_JVM_OPTS= if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set DIRNAME=%~dp0 set APP_HOME=%DIRNAME%
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0 @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set APP_HOME=%DIRNAME% set DEFAULT_JVM_OPTS=
@rem Find java.exe @rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init if "%ERRORLEVEL%" == "0" goto init
echo. echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo. echo.
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation. echo location of your Java installation.
goto fail goto fail
:findJavaFromJavaHome :findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=% set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init if exist "%JAVA_EXE%" goto init
echo. echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo. echo.
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation. echo location of your Java installation.
goto fail goto fail
:init :init
@rem Get command-line arguments, handling Windowz variants @rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
:win9xME_args @rem Slurp the command line arguments.
@rem Slurp the command line arguments. set CMD_LINE_ARGS=
set CMD_LINE_ARGS= set _SKIP=2
set _SKIP=2
:win9xME_args_slurp
:win9xME_args_slurp if "x%~1" == "x" goto execute
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
set CMD_LINE_ARGS=%*
goto execute :execute
@rem Setup the command line
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
set CMD_LINE_ARGS=%$
@rem Execute Gradle
:execute "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
@rem Setup the command line
:end
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
@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% :fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
:end rem the _cmd.exe /c_ return code!
@rem End local scope for the variables with windows NT shell if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
if "%ERRORLEVEL%"=="0" goto mainEnd exit /b 1
:fail :mainEnd
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of if "%OS%"=="Windows_NT" endlocal
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 :omega
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
sdk.dir=/home/pankraz/android-sdk_alt

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<resources> <resources>
<array name="qt_sources"> <array name="qt_sources">
<item>https://download.qt.io/ministro/android/qt5/qt-5.8</item> <item>https://download.qt.io/ministro/android/qt5/qt-5.14</item>
</array> </array>
<!-- The following is handled automatically by the deployment tool. It should <!-- The following is handled automatically by the deployment tool. It should
@ -11,15 +11,12 @@
<!-- %%INSERT_EXTRA_LIBS%% --> <!-- %%INSERT_EXTRA_LIBS%% -->
</array> </array>
<array name="qt_libs"> <array name="qt_libs">
<!-- %%INSERT_QT_LIBS%% --> <!-- %%INSERT_QT_LIBS%% -->
</array>
<array name="bundled_in_lib">
<!-- %%INSERT_BUNDLED_IN_LIB%% -->
</array> </array>
<array name="bundled_in_assets">
<!-- %%INSERT_BUNDLED_IN_ASSETS%% --> <array name="load_local_libs">
<!-- %%INSERT_LOCAL_LIBS%% -->
</array> </array>
</resources> </resources>

View File

@ -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(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;
}
});
}
}

View File

@ -41,7 +41,7 @@ public class AndroidNativeActivity extends org.qtproject.qt5.android.bindings.Qt
// result of the request. // result of the request.
} else { } else {
System.loadLibrary("friendiqa"); System.loadLibrary("friendiqa_arm64-v8a");
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))) { 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(); SystemDispatcher.onActivityResume();
} else { } else {
@ -90,7 +90,7 @@ public class AndroidNativeActivity extends org.qtproject.qt5.android.bindings.Qt
protected void onNewIntent(Intent data) { protected void onNewIntent(Intent data) {
System.loadLibrary("friendiqa"); System.loadLibrary("friendiqa_arm64-v8a");
super.onNewIntent(data); super.onNewIntent(data);
if ((data!=null) && (data.getType() != null) && !(data.getBooleanExtra("used",false))){ if ((data!=null) && (data.getType() != null) && !(data.getBooleanExtra("used",false))){
String type = data.getType(); String type = data.getType();

View File

@ -20,7 +20,7 @@ public class AndroidNativeService extends QtService
private static String TAG = "AndroidNative"; private static String TAG = "AndroidNative";
public void startQtService(Context ctx) { 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){ 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)); ctx.stopService(new Intent(ctx, AndroidNativeService.class));
@ -55,7 +55,7 @@ public class AndroidNativeService extends QtService
NotificationManager.IMPORTANCE_DEFAULT); NotificationManager.IMPORTANCE_DEFAULT);
channel.setSound(null,null); channel.setSound(null,null);
((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel); ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);
//Log.d(TAG,"Friendiqa onCreate Notification"); Log.d(TAG,"Friendiqa onCreate Notification");
Notification notification = new Notification.Builder(context,CHANNEL_ID) Notification notification = new Notification.Builder(context,CHANNEL_ID)
.setSmallIcon(R.drawable.friendiqanotification) .setSmallIcon(R.drawable.friendiqanotification)
.setContentTitle("Friendiqa") .setContentTitle("Friendiqa")

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -56,8 +56,8 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) {
#endif #endif
int main(int argc, char *argv[]) { Q_DECL_EXPORT int main(int argc, char *argv[]) {
//qDebug()<< "argv Friendiqa"<< argv[0]; //<<" argv2" <<argv[1]; //if (argc>1){qDebug()<< "argc Friendiqa"<< argc <<" argv1" <<argv[1];}
if ((argc>1) && (qstrcmp(argv[1],"-service")==0)){ if ((argc>1) && (qstrcmp(argv[1],"-service")==0)){
//qDebug()<<"FriendiqaMain Service"; //qDebug()<<"FriendiqaMain Service";
QAndroidService app(argc, argv); QAndroidService app(argc, argv);
@ -71,7 +71,7 @@ int main(int argc, char *argv[]) {
else{ else{
QApplication app(argc, argv); QApplication app(argc, argv);
QQuickView view; QQuickView view;
qDebug()<<"FriendiqaMain started"; //qDebug()<<"FriendiqaMain started";
QTranslator qtTranslator; QTranslator qtTranslator;
qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations"); qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations");
app.installTranslator(&qtTranslator); app.installTranslator(&qtTranslator);

View File

@ -24,6 +24,17 @@ SOURCES += common/friendiqa.cpp \
common/remoteauthasyncimageprovider.cpp \ common/remoteauthasyncimageprovider.cpp \
common/updatenews.cpp \ common/updatenews.cpp \
common/alarmandroid.cpp common/alarmandroid.cpp
lupdate_only{
SOURCES = qml/friendiqa.qml \
qml/*.qml
qml/calendarqml/*.qml
qml/configqml/*.qml
qml/genericqml/*.qml
qml/contactqml/*.qml
qml/newsqml/*.qml
qml/photoqml/*.qml
js/*.js
}
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
@ -70,16 +81,6 @@ DISTFILES += \
js/*.js \ js/*.js \
android/androidnative.gradle \ android/androidnative.gradle \
android/src/FriendiqaActivity.java \ android/src/FriendiqaActivity.java \
android/src/ExampleService.java android/src/FriendiqaService.java
contains(ANDROID_TARGET_ARCH,armeabi-v7a) { 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 = \
$$PWD/android/libcrypto_1_1.so \
$$PWD/android/libssl_1_1.so
}
contains(ANDROID_TARGET_ARCH,arm64-v8a) {
ANDROID_EXTRA_LIBS = \
/home/pankraz/ownCloud/clientsync/Friendiqa/v0.5.2/source-android/../../../../../git/android_openssl/arm64/libcrypto_1_1.so \
$$PWD/../../../../../git/android_openssl/arm64/libssl_1_1.so
}

View File

@ -45,7 +45,7 @@ StackView{
height:osSettings.appHeight height:osSettings.appHeight
property var db: ["Friendiqa", "1.0", "Stores Friendica data", 100000000] property var db: ["Friendiqa", "1.0", "Stores Friendica data", 100000000]
property var login: Service.readActiveConfig(db) property var login: Service.readActiveConfig(db)
property var globaloptions: ({}) //Service.readGlobaloptions(db) property var globaloptions: Service.readGO(db)
property var contactlist: [] property var contactlist: []
property real mm: osSettings.osType=="Android"?Screen.pixelDensity:Screen.pixelDensity*1.5 property real mm: osSettings.osType=="Android"?Screen.pixelDensity:Screen.pixelDensity*1.5
signal messageSignal(var friend) signal messageSignal(var friend)
@ -59,6 +59,7 @@ StackView{
signal uploadSignal(var urls) signal uploadSignal(var urls)
signal sendtextSignal(var intenttext) signal sendtextSignal(var intenttext)
signal changeimage(var method, var type, var id) signal changeimage(var method, var type, var id)
signal updateSyncinterval(int interval)
property var news:[] property var news:[]
property var newContacts:[] property var newContacts:[]
//property string contactLoadType: "" //property string contactLoadType: ""
@ -67,7 +68,7 @@ StackView{
onLoginChanged:{ onLoginChanged:{
if(login==""){root.push("qrc:/qml/configqml/AccountPage.qml")} if(login==""){root.push("qrc:/qml/configqml/AccountPage.qml")}
else{root.push(rootStackItem) else{root.push(rootStackItem)
newstab.newstabstatus=login.newsViewType; if (login.newsViewType!="" || login.newsViewType!=null){newstab.newstabstatus=login.newsViewType;}
Newsjs.getCurrentContacts(login,db,function(contacts){ Newsjs.getCurrentContacts(login,db,function(contacts){
contactlist=contacts})} contactlist=contacts})}
} }
@ -105,20 +106,20 @@ StackView{
FontLoader{id: fontAwesome; source: "qrc:/images/fontawesome-webfont.ttf"} FontLoader{id: fontAwesome; source: "qrc:/images/fontawesome-webfont.ttf"}
Keys.onReleased: { Keys.onReleased: {//print(event.key + "Backkey"+newstab.conversation.length+" "+root.depth)
if (event.key === osSettings.backKey) { if (event.key === osSettings.backKey) {
if (rootstack.currentIndex==0){ if (rootstack.currentIndex==0){
newstab.active=true; newstab.active=true;
if (newstab.newstabstatus!=login.newsViewType){ if (newstab.newstabstatus!=globaloptions.newsViewType){
newstab.newstabstatus=login.newsViewType; newstab.newstabstatus=globaloptions.newsViewType;
if(login.newsViewType=="Timeline"){Newsjs.newsfromdb(db,login.username,0,function(dbnews){ if(globaloptions.newsViewType=="Timeline"){Newsjs.newsfromdb(db,login.username,0,function(dbnews){
newsSignal(dbnews) newsSignal(dbnews)
})} })}
else{ else{
Newsjs.chatsfromdb(db,login.username,function(dbnews){ Newsjs.chatsfromdb(db,login.username,function(dbnews){
newsSignal(dbnews) newsSignal(dbnews)
})} })}
} }
else if (newstab.conversation.length>0){newstab.conversation=[]} else if (newstab.conversation.length>0){newstab.conversation=[]}
else if (root.depth>1){root.pop()} else if (root.depth>1){root.pop()}
@ -285,7 +286,6 @@ StackView{
} }
Label{ Label{
text: "\uf08b " +qsTr("Quit") text: "\uf08b " +qsTr("Quit")
font.pixelSize: 4*mm font.pixelSize: 4*mm
width: parent.width width: parent.width
@ -303,9 +303,6 @@ StackView{
} }
} }
Item{ Item{
id:rootStackItem id:rootStackItem
width:parent.width width:parent.width
@ -392,13 +389,13 @@ StackView{
} }
Component.onCompleted: { Component.onCompleted: {
forceActiveFocus(); forceActiveFocus();
Service.readGlobaloptions(db,function(go){globaloptions=go})
//print(xhr.networktype()); //print(xhr.networktype());
if(osSettings.osType=="Android"){ if(osSettings.osType=="Android"){
var component = Qt.createComponent("qrc:/qml/genericqml/IntentReceiver.qml"); var component = Qt.createComponent("qrc:/qml/genericqml/IntentReceiver.qml");
var IntentReceiverQml = component.createObject(root); var IntentReceiverQml = component.createObject(root);
} else if (osSettings.osType=="Linux"){ }
else if (osSettings.osType=="Linux"){
var component = Qt.createComponent("qrc:/qml/genericqml/LinuxSync.qml"); var component = Qt.createComponent("qrc:/qml/genericqml/LinuxSync.qml");
var LinuxSyncQml = component.createObject(root); var LinuxSyncQml = component.createObject(root);
} }

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -73,8 +73,10 @@ int main(int argc, char *argv[]) {
//return app.exec(); //return app.exec();
} }
else{ else{
QtWebEngine::initialize();
QApplication app(argc, argv); QApplication app(argc, argv);
QQuickView view; QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
QTranslator qtTranslator; QTranslator qtTranslator;
qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations"); qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations");
app.installTranslator(&qtTranslator); app.installTranslator(&qtTranslator);
@ -89,7 +91,7 @@ int main(int argc, char *argv[]) {
view.rootContext()->setContextProperty("alarm", alarm); view.rootContext()->setContextProperty("alarm", alarm);
UPDATENEWS* updatenews = UPDATENEWS::instance(); UPDATENEWS* updatenews = UPDATENEWS::instance();
view.rootContext()->setContextProperty("updatenews", updatenews); view.rootContext()->setContextProperty("updatenews", updatenews);
QtWebEngine::initialize();
view.setSource(QUrl("qrc:/qml/friendiqa.qml")); view.setSource(QUrl("qrc:/qml/friendiqa.qml"));
view.show(); view.show();
view.connect(view.rootContext()->engine(), SIGNAL(quit()), &app, SLOT(quit())); view.connect(view.rootContext()->engine(), SIGNAL(quit()), &app, SLOT(quit()));

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -128,18 +128,18 @@ void UPDATENEWS::login()
QSqlQuery synctimequery("SELECT * FROM globaloptions WHERE k='lastsync'",m_db); QSqlQuery synctimequery("SELECT * FROM globaloptions WHERE k='lastsync'",m_db);
if (synctimequery.next()){ if (synctimequery.next()){
QSqlQuery synctimequery2("UPDATE globaloptions SET v='"+QString::number(QDateTime::currentSecsSinceEpoch()) + "' WHERE k = 'lastsync'",m_db); QSqlQuery synctimequery2("UPDATE globaloptions SET v='"+QString::number(QDateTime::currentSecsSinceEpoch()) + "' WHERE k = 'lastsync'",m_db);
if(!(synctimequery2.exec())) {qDebug()<<synctimequery2.lastError();} if(!(synctimequery2.exec())) {qDebug()<<" synctimequery2 " << synctimequery2.lastError();}
qDebug() << " synctimequery "; //qDebug() << " synctimequery ";
} else { } else {
qDebug() << "INSERT INTO globaloptions(k,v) VALUES('lastsync','"+QString::number(QDateTime::currentSecsSinceEpoch()) + "'"; //qDebug() << "INSERT INTO globaloptions(k,v) VALUES('lastsync','"+QString::number(QDateTime::currentSecsSinceEpoch()) + "'";
QSqlQuery synctimequery3("INSERT INTO globaloptions(k,v) VALUES('lastsync','"+QString::number(QDateTime::currentSecsSinceEpoch()) + "')",m_db); QSqlQuery synctimequery3("INSERT INTO globaloptions(k,v) VALUES('lastsync','"+QString::number(QDateTime::currentSecsSinceEpoch()) + "')",m_db);
if(!(synctimequery3.exec())) {qDebug()<<synctimequery3.lastError();} if(!(synctimequery3.exec())) {qDebug() << " synctimequery3 " << synctimequery3.lastError();}
} }
} }
void UPDATENEWS::startsync() void UPDATENEWS::startsync()
{ //qDebug()<<"Friendiqa start syncing " <<synclist.length()<<" index "<<syncindex; { qDebug()<<"Friendiqa start syncing "<<syncindex <<" of "<<synclist.length();
QObject::connect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(store(QByteArray,QString))); QObject::connect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(store(QByteArray,QString)));
QObject::connect(&xhr,SIGNAL(error(QString,QString,QString,int)),this,SLOT(showError(QString,QString,QString,int))); QObject::connect(&xhr,SIGNAL(error(QString,QString,QString,int)),this,SLOT(showError(QString,QString,QString,int)));
if (syncindex<synclist.length()){ if (syncindex<synclist.length()){
@ -151,6 +151,8 @@ void UPDATENEWS::startsync()
directmessages(); directmessages();
} else if (synclist[syncindex]=="sync_Notifications") { } else if (synclist[syncindex]=="sync_Notifications") {
notifications(); notifications();
} else if (synclist[syncindex]=="sync_Events") {
events();
} }
} else if (syncindex==synclist.length()) { } else if (syncindex==synclist.length()) {
m_api=""; m_api="";
@ -159,6 +161,7 @@ void UPDATENEWS::startsync()
synclist.clear(); synclist.clear();
m_db.close(); m_db.close();
m_db.removeDatabase(m_db.connectionName()); m_db.removeDatabase(m_db.connectionName());
QObject::disconnect(&xhr,SIGNAL(error(QString,QString,QString,int)),this,SLOT(showError(QString,QString,QString,int)));
emit quitapp(); emit quitapp();
alarm.setAlarm(m_updateInterval); alarm.setAlarm(m_updateInterval);
m_updateInterval=0; m_updateInterval=0;
@ -239,6 +242,28 @@ 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()){
if (query.first()){
QString lastid=query.value(0).toString();
xhr.setParam("since_id",lastid);
}
}
xhr.setParam("count","30");
xhr.get();
QObject::disconnect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(store(QByteArray,QString)));
QObject::connect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(storeEvents(QByteArray,QString)));
QObject::connect(&xhr,SIGNAL(error(QString,QString,QString,int)),this,SLOT(showError(QString,QString,QString,int)));
//QObject::connect(&xhr, SIGNAL(downloaded(QString, QString, QString, int)), this, SLOT(updateImageLocation(QString,QString, QString, int)));
}
void UPDATENEWS::store(QByteArray serverreply,QString apiname) void UPDATENEWS::store(QByteArray serverreply,QString apiname)
{ if (apiname!=m_api || xhr.downloadtype()!=""){} else { { if (apiname!=m_api || xhr.downloadtype()!=""){} else {
QJsonDocument news; QJsonDocument news;
@ -328,7 +353,7 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname)
query.bindValue(16, newsitem["url"]); query.bindValue(16, newsitem["url"]);
} }
if(!(query.exec())) {qDebug()<<query.lastError();} if(!(query.exec())) {qDebug()<< "store news " << query.lastError();}
// notifications // notifications
if (apiname=="/api/statuses/friends_timeline"){ if (apiname=="/api/statuses/friends_timeline"){
@ -352,7 +377,7 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname)
} }
} }
}catch(...){ }catch(...){
qDebug() << "Friendiqasync Error inserting news" << newsitem["text"].toString() << " " << newsitem.toString(); //qDebug() << "Friendiqasync Error inserting news" << newsitem["text"].toString() << " " << newsitem.toString();
} }
} }
@ -387,7 +412,7 @@ void UPDATENEWS::updateImageLocation(QString downloadtype,QString imageurl, QStr
testquery.first(); testquery.first();
//qDebug()<< "update imageurl for " <<imageurl << " from " <<testquery.value(0).toString() <<" to "<< filename <<" index " << index << " newcontactnames.length " <<newcontactnames.length(); //qDebug()<< "update imageurl for " <<imageurl << " from " <<testquery.value(0).toString() <<" to "<< filename <<" index " << index << " newcontactnames.length " <<newcontactnames.length();
QSqlQuery query("UPDATE contacts SET profile_image='"+ filename +"' WHERE profile_image_url ='"+imageurl+ "' AND username = '" +username+"'",m_db); QSqlQuery query("UPDATE contacts SET profile_image='"+ filename +"' WHERE profile_image_url ='"+imageurl+ "' AND username = '" +username+"'",m_db);
query.exec(); if(!(query.exec())) {qDebug()<< "updateImagelocation " << query.lastError();}
if (index==(newcontactnames.length()-1)){ if (index==(newcontactnames.length()-1)){
newcontactnames.clear(); newcontactnames.clear();
newcontactimagelinks.clear(); newcontactimagelinks.clear();
@ -546,7 +571,7 @@ void UPDATENEWS::updateContacts(QList<QJsonValue> contacts){
query.bindValue(16,contact["time_zone"].toString()); query.bindValue(16,contact["time_zone"].toString());
query.bindValue(17,contact["statuses_count"].toInt()); query.bindValue(17,contact["statuses_count"].toInt());
query.bindValue(18,contact["following"].toBool()); query.bindValue(18,contact["following"].toBool());
query.bindValue(19,contact["verfied"].toBool()); query.bindValue(19,contact["verified"].toBool());
query.bindValue(20,contact["statusnet_blocking"].toBool()); query.bindValue(20,contact["statusnet_blocking"].toBool());
query.bindValue(21,contact["notifications"].toBool()); query.bindValue(21,contact["notifications"].toBool());
query.bindValue(22,contact["statusnet_profile_url"]); query.bindValue(22,contact["statusnet_profile_url"]);
@ -559,13 +584,65 @@ void UPDATENEWS::updateContacts(QList<QJsonValue> contacts){
query.bindValue(26,timestamp); query.bindValue(26,timestamp);
} }
query.exec() ; if(!(query.exec())) {qDebug()<< "updatecontacts " << query.lastError();}
} catch(...){ } catch(...){
qDebug() << "Friendiqasync Error inserting contact" << contact["screen_name"] << " " << contact.toString(); qDebug() << "Friendiqasync Error inserting contact" << contact["screen_name"] << " " << contact.toString();
} }
} }
} }
void UPDATENEWS::storeEvents(QByteArray serverreply,QString apiname)
{ if (apiname!=m_api || xhr.downloadtype()!=""){} else {
QJsonDocument events;
//qDebug()<<apiname << serverreply;
QJsonParseError jsonerror;
events=QJsonDocument::fromJson(serverreply,&jsonerror);
if (events.isArray()){
for (int i=0; i < events.array().count();i++){
QJsonValue eventitem=events[i];
try{
QSqlQuery query(m_db);
query.prepare("INSERT INTO events (username,id,cid,start,end,title,uri,desc,location,type,nofinish,adjust,ignore,permissions) " "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
query.bindValue(0,username);
query.bindValue(1,eventitem["id"].toInt());
query.bindValue(2,eventitem["cid"].toInt());
QString sourcedateStart=eventitem["startTime"].toString();
query.bindValue(3,QDateTime::fromString(sourcedateStart,Qt::ISODate).toMSecsSinceEpoch() );
QString sourcedateEnd=eventitem["endTime"].toString();
query.bindValue(4,QDateTime::fromString(sourcedateEnd,Qt::ISODate).toMSecsSinceEpoch() );
query.bindValue(5,eventitem["name"].toString());
query.bindValue(6,eventitem["uri"].toString());
query.bindValue(7,eventitem["desc"].toString().toUtf8().toBase64());
query.bindValue(8,eventitem["place"].toString());
query.bindValue(9,eventitem["type"].toString());
query.bindValue(10,eventitem["nofinsh"].toInt());
query.bindValue(11,eventitem["adjust"].toInt());
query.bindValue(12,eventitem["ignore"].toInt());
QJsonArray permissions; permissions={eventitem["allow_cid"].toString().replace("<","[").replace(">","]"),eventitem["allow_gid"].toString().replace("<","[").replace(">","]"),eventitem["deny_cid"].toString().replace("<","[").replace(">","]"),eventitem["deny_gid"].toString().replace("<","[").replace(">","]")};
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"];
}
}
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);
}
}
if(m_updateInterval!=0){
syncindex+=1;
startsync();
}
QObject::disconnect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(storeEvents(QByteArray,QString)));
}
QString UPDATENEWS::url() const QString UPDATENEWS::url() const
{ {
return m_url; return m_url;
@ -583,7 +660,7 @@ void UPDATENEWS::startImagedownload()
void UPDATENEWS::showError(QString data, QString url,QString api, int code ) void UPDATENEWS::showError(QString data, QString url,QString api, int code )
{ {
qDebug() << "showerror " << api << " data " << data; //qDebug() << "showerror " << api << " data " << data;
emit this->error(api,data); emit this->error(api,data);
if (api!=m_api || xhr.downloadtype()!=""){} else{ if (api!=m_api || xhr.downloadtype()!=""){} else{
if(m_updateInterval!=0){ if(m_updateInterval!=0){

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -68,10 +68,12 @@ public slots:
void startsync(); void startsync();
void directmessages(); void directmessages();
void notifications(); void notifications();
void events();
//void startservice(QString type,QVariantMap map); //void startservice(QString type,QVariantMap map);
void startImagedownload(); void startImagedownload();
void updateImageLocation(QString downloadtype,QString imageurl, QString filename, int index); void updateImageLocation(QString downloadtype,QString imageurl, QString filename, int index);
void store(QByteArray serverreply,QString apiname); void store(QByteArray serverreply,QString apiname);
void storeEvents(QByteArray serverreply,QString apiname);
void showError(QString data, QString url,QString api, int code); void showError(QString data, QString url,QString api, int code);
private: private:

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -292,7 +292,7 @@ void XHR::post()
void XHR::onReplyError(QNetworkReply::NetworkError code) void XHR::onReplyError(QNetworkReply::NetworkError code)
{ {
qDebug() << code; qDebug() << code;
emit this->error( bufferToString(), m_url,m_api, (int) code); if(downloadtype()!="contactlist"){emit this->error( bufferToString(), m_url,m_api, (int) code);}
buffer.clear(); buffer.clear();
reply->deleteLater(); reply->deleteLater();
if((downloadtype()=="contactlist")||(downloadtype()=="picturelist")){dlindex=dlindex+1;XHR::getlist();} if((downloadtype()=="contactlist")||(downloadtype()=="picturelist")){dlindex=dlindex+1;XHR::getlist();}

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -47,8 +47,6 @@ HEADERS += \
DISTFILES += \ DISTFILES += \
qml/calendarqml/*.qml \ qml/calendarqml/*.qml \
qml/newsqml/Lastcomment.qml \
qml/newsqml/NewsVideoLarge.qml \
translations/*.ts \ translations/*.ts \
translations/*.qm \ translations/*.qm \
qml/*.qml \ qml/*.qml \
@ -57,8 +55,7 @@ DISTFILES += \
qml/photoqml/*.qml \ qml/photoqml/*.qml \
qml/configqml/*.qml \ qml/configqml/*.qml \
js/*.js \ js/*.js \
qml/newsqml/NewsStack.qml \
qml/configqml/SyncComponent.qml
target.path=/usr/bin target.path=/usr/bin
desktop.path = /usr/share/applications desktop.path = /usr/share/applications

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -102,7 +102,7 @@ function getLastNews(login,database,callback){
var lastnewsid=0; var lastnewsid=0;
db.transaction( function(tx) { 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'); 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){print(e)}; try{lastnewsid=result.rows.item(0).status_id;}catch(e){lastnewsid=0};
callback(lastnewsid) callback(lastnewsid)
}) })
} }
@ -292,7 +292,7 @@ function newsfromdb(database,login,messagetype,callback,contact,stop_time){
newsArray[i].statusnet_html=Qt.atob(newsArray[i].statusnet_html); newsArray[i].statusnet_html=Qt.atob(newsArray[i].statusnet_html);
newsArray[i].text=Qt.atob(newsArray[i].text); newsArray[i].text=Qt.atob(newsArray[i].text);
newsArray[i].id=newsArray[i].status_id; newsArray[i].id=newsArray[i].status_id;
newsArray[i].friendica_author=newsArray[i].friendica_owner newsArray[i].friendica_author=objFromArray(allcontacts,"url",newsArray[i].friendica_owner)
newsArray[i]=fetchUsersForNews(database,login.username,newsArray[i],allcontacts); newsArray[i]=fetchUsersForNews(database,login.username,newsArray[i],allcontacts);
if (newsArray[i].attachments!="" && newsArray[i].attachments!==null){newsArray[i].attachments=JSON.parse(Qt.atob(newsArray[i].attachments))}; if (newsArray[i].attachments!="" && newsArray[i].attachments!==null){newsArray[i].attachments=JSON.parse(Qt.atob(newsArray[i].attachments))};
} }
@ -487,6 +487,7 @@ function chatsfromdb(database,login,messagetype,callback,stop_time){
helpernews.statusnet_html=Qt.atob(helpernews.statusnet_html); helpernews.statusnet_html=Qt.atob(helpernews.statusnet_html);
helpernews.text=Qt.atob(helpernews.text); helpernews.text=Qt.atob(helpernews.text);
helpernews.id=helpernews.status_id; helpernews.id=helpernews.status_id;
helpernews.friendica_author=objFromArray(allcontacts,"url",helpernews.friendica_owner);
if (helpernews.attachments!="" && helpernews.attachments!==null){helpernews.attachments=JSON.parse(Qt.atob(helpernews.attachments))}; if (helpernews.attachments!="" && helpernews.attachments!==null){helpernews.attachments=JSON.parse(Qt.atob(helpernews.attachments))};
helpernews.currentconversation=[]; helpernews.currentconversation=[];
for (var h = 0;h<newsrs.rows.length;h++){ for (var h = 0;h<newsrs.rows.length;h++){
@ -496,6 +497,7 @@ function chatsfromdb(database,login,messagetype,callback,stop_time){
helpernews2.statusnet_html=Qt.atob(helpernews2.statusnet_html); helpernews2.statusnet_html=Qt.atob(helpernews2.statusnet_html);
helpernews2.text=Qt.atob(helpernews2.text);//print(h+" "+helpernews2.text) helpernews2.text=Qt.atob(helpernews2.text);//print(h+" "+helpernews2.text)
helpernews2.id=helpernews2.status_id; helpernews2.id=helpernews2.status_id;
helpernews2.friendica_author=objFromArray(allcontacts,"url",helpernews2.friendica_owner);
if (helpernews2.attachments!="" && helpernews2.attachments!==null){helpernews2.attachments=JSON.parse(Qt.atob(helpernews2.attachments))}; if (helpernews2.attachments!="" && helpernews2.attachments!==null){helpernews2.attachments=JSON.parse(Qt.atob(helpernews2.attachments))};
helpernews.currentconversation.push(helpernews2) helpernews.currentconversation.push(helpernews2)
} }
@ -527,7 +529,7 @@ function allchatsfromdb(database,user,callback){
helpernews=fetchUsersForNews(database,user,helpernews,allcontacts); helpernews=fetchUsersForNews(database,user,helpernews,allcontacts);
helpernews.statusnet_html=Qt.atob(helpernews.statusnet_html); helpernews.statusnet_html=Qt.atob(helpernews.statusnet_html);
helpernews.text=Qt.atob(helpernews.text); helpernews.text=Qt.atob(helpernews.text);
helpernews.id=helpernews.status_id; helpernews.id=helpernews.status_id;helpernews.friendica_author=objFromArray(allcontacts,"url",helpernews.friendica_owner);
if (helpernews.attachments!="" && helpernews.attachments!==null){helpernews.attachments=JSON.parse(Qt.atob(helpernews.attachments))}; if (helpernews.attachments!="" && helpernews.attachments!==null){helpernews.attachments=JSON.parse(Qt.atob(helpernews.attachments))};
newsArray.push(helpernews); newsArray.push(helpernews);
countArray.push(newsrs.rows.length) countArray.push(newsrs.rows.length)
@ -552,7 +554,7 @@ function oldchatfromdb(database,user,conversationId,lastpost,allcontacts,callbac
helpernews=fetchUsersForNews(database,user,helpernews,allcontacts); helpernews=fetchUsersForNews(database,user,helpernews,allcontacts);
helpernews.statusnet_html=Qt.atob(helpernews.statusnet_html); helpernews.statusnet_html=Qt.atob(helpernews.statusnet_html);
helpernews.text=Qt.atob(helpernews.text); helpernews.text=Qt.atob(helpernews.text);
helpernews.id=helpernews.status_id; helpernews.id=helpernews.status_id;helpernews.friendica_author=objFromArray(allcontacts,"url",helpernews.friendica_owner);
if (helpernews.attachments!="" && helpernews.attachments!==null){helpernews.attachments=JSON.parse(Qt.atob(helpernews.attachments))}; if (helpernews.attachments!="" && helpernews.attachments!==null){helpernews.attachments=JSON.parse(Qt.atob(helpernews.attachments))};
callback(helpernews,newscount);} callback(helpernews,newscount);}
// var conversationobject={news:helpernews,newscount:newscount}; // var conversationobject={news:helpernews,newscount:newscount};

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -36,43 +36,27 @@ function findend (text, startpos) {
function beautify(newsitemobject,msg){ function beautify(newsitemobject,msg){
var forumname=""; var forumname="";
try{if (newsitemobject.messagetype==0&&newsitemobject.hasOwnProperty('friendica_author')&& try{
if (newsitemobject.messagetype==0&&newsitemobject.hasOwnProperty('friendica_author')&&
((newsitemobject.friendica_author.url)!=(newsitemobject.user.url))&&((newsitemobject.friendica_author.url)!=null)){ ((newsitemobject.friendica_author.url)!=(newsitemobject.user.url))&&((newsitemobject.friendica_author.url)!=null)){
//print(" Friendica Author "+JSON.stringify(newsitemobject)); //print(" Friendica Author "+JSON.stringify(newsitemobject));
forumname=" via "+newsitemobject.user.name; forumname=" via "+newsitemobject.user.name;
newsitemobject.user=newsitemobject.friendica_author; newsitemobject.user=newsitemobject.friendica_author;
}}catch(e){print("forum name "+e)} }
var likeText="";var dislikeText="";var attendyesText="";var attendnoText="";var attendmaybeText=""; var self={}; if (typeof(newsitemobject.friendica_activities_self)=="string"){
try{if (newsitemobject.messagetype==0&&newsitemobject.hasOwnProperty('friendica_activities')){ newsitemobject.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.")} }catch(e){print("forum name "+e)}
else {likeText= newsitemobject.friendica_activities.like.length+" "+ qsTr("like this.")}
} var self=({})
if (newsitemobject.friendica_activities.dislike.length>0){ if (newsitemobject.hasOwnProperty("friendica_activities_self")){
if (newsitemobject.friendica_activities.dislike.length==1){dislikeText= newsitemobject.friendica_activities.dislike[0].name+" "+ qsTr("doesn't like this.")} if (newsitemobject.friendica_activities_self.indexOf(3)!=-1){self.attending=qsTr("yes")}
else {dislikeText= newsitemobject.friendica_activities.dislike.length+" "+ qsTr("don't like this.")} if (newsitemobject.friendica_activities_self.indexOf(4)!=-1){self.attending=qsTr("no")}
} if (newsitemobject.friendica_activities_self.indexOf(5)!=-1){self.attending=qsTr("maybe")}
if (newsitemobject.friendica_activities.attendyes.length>0){ if (newsitemobject.friendica_activities_self.indexOf(1)!=-1){self.liked=1}
if (newsitemobject.friendica_activities.attendyes.length==1){attendyesText=newsitemobject.friendica_activities.attendyes[0].name+" "+ qsTr("will attend.")} if (newsitemobject.friendica_activities_self.indexOf(2)!=-1){self.disliked=1}
else {attendyesText= newsitemobject.friendica_activities.attendyes.length+" "+ qsTr("persons will attend.")} }
} var friendica_activities={self:self}
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.hasOwnProperty("friendica_activities_self")){
if (newsitemobject.friendica_activities_self.indexOf(3)!=-1){self.attending=qsTr("yes")}
if (newsitemobject.friendica_activities_self.indexOf(4)!=-1){self.attending=qsTr("no")}
if (newsitemobject.friendica_activities_self.indexOf(5)!=-1){self.attending=qsTr("maybe")}
if (newsitemobject.friendica_activities_self.indexOf(1)!=-1){self.liked=1}
if (newsitemobject.friendica_activities_self.indexOf(2)!=-1){self.disliked=1}
}}} catch(e){print("Activities "+e+ " "+JSON.stringify(newsitemobject.friendica_activities))}
var friendica_activities={likeText:likeText,dislikeText:dislikeText,attendyesText:attendyesText,attendnoText:attendnoText,attendmaybeText:attendmaybeText,self:self}
var attachmentList=[]; var attachmentList=[];
var videoformats=["mp4", "avi", "webm","ogg","mp3"] var videoformats=["mp4", "avi", "webm","ogg","mp3"]
try{if(newsitemobject.attachments){ try{if(newsitemobject.attachments){
@ -119,11 +103,8 @@ function beautify(newsitemobject,msg){
ptvideotext=ptvideotext.substring(ptposend,ptvideotext.length) ptvideotext=ptvideotext.substring(ptposend,ptvideotext.length)
if ((attachmentList.length==0) || (attachmentList[attachmentList.length-1].url!=ptvideohelper.url)){attachmentList.push(ptvideohelper)} if ((attachmentList.length==0) || (attachmentList[attachmentList.length-1].url!=ptvideohelper.url)){attachmentList.push(ptvideohelper)}
} }
} }
if (newsitemobject.text.indexOf("youtube.com/watch?v")>-1){ if (newsitemobject.text.indexOf("youtube.com/watch?v")>-1){
//print("message "+msg.options.showWebsiteForLinks);
//if (msg.options.showYoutube!="false"){
var yttext=newsitemobject.text; var yttext=newsitemobject.text;
while (yttext.indexOf("youtube.com/watch?v")>-1){ while (yttext.indexOf("youtube.com/watch?v")>-1){
var ythelperstringposition=yttext.indexOf("watch?v="); var ythelperstringposition=yttext.indexOf("watch?v=");
@ -133,44 +114,14 @@ function beautify(newsitemobject,msg){
yttext=yttext.substring(ytposend,yttext.length); yttext=yttext.substring(ytposend,yttext.length);
if ((attachmentList.length==0) || (attachmentList[attachmentList.length-1].url!=ythelper.url)){attachmentList.push(ythelper)} if ((attachmentList.length==0) || (attachmentList[attachmentList.length-1].url!=ythelper.url)){attachmentList.push(ythelper)}
} }
//} }
}
// if (newsitemobject.text.indexOf(".html")>-1){
// //print("message "+msg.options.showWebsiteForLinks);
// if (msg.options.showWebsiteForLinks!="false"){
// var linkhelper={mimetype:"text/html"}
// var linktext=newsitemobject.text;
// while (linktext.indexOf(".html")>-1){
// var linkhelperstringposition=linktext.indexOf(".html");
// var linkposend=findend(linktext,linkhelperstringposition);
// linkhelper.url=linktext.substring(linktext.lastIndexOf("http",linkhelperstringposition),linkposend);
// linktext=linktext.substring(linkhelperstringposition+5,linktext.length)
// if ((attachmentList.length==0) || (attachmentList[attachmentList.length-1].url!=linkhelper.url)){attachmentList.push(linkhelper)}
// }
// }
// }
newsitemobject.attachmentList=attachmentList; newsitemobject.attachmentList=attachmentList;
if ((msg.options.hasOwnProperty("hide_nsfw"))&&(msg.options.hide_nsfw==1)&&(newsitemobject.text.indexOf("#nsfw")>-1)){ if ((msg.options.hasOwnProperty("hide_nsfw"))&&(msg.options.hide_nsfw==1)&&(newsitemobject.text.indexOf("#nsfw")>-1)){
newsitemobject.nsfw=true newsitemobject.nsfw=true
} else{newsitemobject.nsfw=false} } else{newsitemobject.nsfw=false}
var seconds=(msg.currentTime-newsitemobject.created_at)/1000; newsitemobject.dateDiff=(msg.currentTime-newsitemobject.created_at)/1000;
var timestring="";
if (seconds<60) {timestring=seconds+" "+qsTr("seconds") +" "+qsTr("ago");}
else if (seconds<90){timestring=Math.round(seconds/60)+" "+qsTr("minute") +" "+qsTr("ago");}
else if (seconds<3600){timestring=Math.round(seconds/60)+" "+qsTr("minutes") +" "+qsTr("ago");}
else if (seconds<5400){timestring=Math.round(seconds/3600)+" "+qsTr("hour") +" "+qsTr("ago");}
else if (seconds<86400){timestring=Math.round(seconds/3600)+" "+qsTr("hours") +" "+qsTr("ago");}
else if (seconds<129600){timestring=Math.round(seconds/86400)+" "+qsTr("day") +" "+qsTr("ago");}
else if (seconds<3888000){timestring=Math.round(seconds/86400)+" "+qsTr("days") +" "+qsTr("ago");}
else if (seconds<5832000){timestring=Math.round(seconds/3888000)+" "+qsTr("month") +" "+qsTr("ago");}
else if (seconds<69984000){timestring=Math.round(seconds/3888000)+" "+qsTr("months") +" "+qsTr("ago");}
else {timestring=Math.round(seconds/46656000)+" "+qsTr("years") +" "+qsTr("ago");}
newsitemobject.dateDiff=timestring;
newsitemobject.friendica_activities_view=friendica_activities; newsitemobject.friendica_activities_view=friendica_activities;
newsitemobject.forumname=forumname; newsitemobject.forumname=forumname;
return newsitemobject; return newsitemobject;
@ -184,27 +135,28 @@ if(msg.deleteId!==undefined)
msg.model.sync() msg.model.sync()
} }
else{ else{
if(msg.method=="refresh"){msg.model.clear()}; if(msg.method=="refresh" ||msg.method=="conversation"){msg.model.clear()};
msg.model.sync() msg.model.sync()
for (var j=0;j<msg.news.length;j++){ for (var j=0;j<msg.news.length;j++){
if (msg.news[j]) { if (msg.news[j]) {
var newsitemobject=msg.news[j]; var newsitemobject=msg.news[j];
// print("Newsitem "+JSON.stringify(newsitemobject.friendica_owner)+" userid: "+newsitemobject.user.id);
// if (newsitemobject.messagetype==2){
// newsitemobject.user={};
// newsitemobject.user.profile_image="";
// newsitemobject.user.profile_image_url="";
// newsitemobject.user.name="";
// }
//var data=({"newsitemobject": newsitemobject,"dateDiff":timestring,"friendica_activities":friendica_activities,"forumname":forumname})}
//print("News:"+j+msg.news.length+JSON.stringify(data));
newsitemobject=beautify(newsitemobject,msg); newsitemobject=beautify(newsitemobject,msg);
if (newsitemobject.hasOwnProperty("currentconversation")&&(newsitemobject.currentconversation.length>1)){ if (newsitemobject.hasOwnProperty("currentconversation")&&(newsitemobject.currentconversation.length>1)){
newsitemobject.lastcomment=beautify(newsitemobject.currentconversation[newsitemobject.currentconversation.length-1],msg); newsitemobject.lastcomment=beautify(newsitemobject.currentconversation[newsitemobject.currentconversation.length-1],msg);
//print("Currentconversation" + newsitemobject.currentconversation.length+JSON.stringify(newsitemobject.lastcomment)) //print("Currentconversation" + newsitemobject.currentconversation.length+JSON.stringify(newsitemobject.lastcomment))
} }
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+1;
if (newsitemobject.indent>6){newsitemobject.indent=6};
break}
}
}}
var data=({"newsitemobject": newsitemobject}) var data=({"newsitemobject": newsitemobject})
} }
@ -216,7 +168,6 @@ else{
} }
if (j==msg.news.length){ if (j==msg.news.length){
//print("j: "+j+" msg.model.count: "+msg.model.count);
msg.model.sync() msg.model.sync()
} }
} }

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -90,14 +90,23 @@ function newscount(database, callback){
function eventsfromdb(database, username,callback){ function eventsfromdb(database, username,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]);
var allcontacts=[];
allcontacts=Newsjs.getAllContacts(root.db,login.username);
db.transaction( function(tx) { db.transaction( function(tx) {
var eventrs=tx.executeSql('select * from events WHERE username="'+username+'" ORDER BY start ASC'); var eventrs=tx.executeSql('select * from events WHERE username="'+username+'" ORDER BY start ASC');
var eventArray=[]; var eventArray=[];
var dayArray=[]; var dayArray=[];
for(var i = 0; i < eventrs.rows.length; i++) { for(var i = 0; i < eventrs.rows.length; i++) {
eventArray.push(eventrs.rows.item(i)); eventArray.push(eventrs.rows.item(i));
// eventArray[i]=fetchUsersForNews(database,username,newsArray[i]) if (eventArray[i].cid!=0){eventArray[i]["eventOwner"]=Newsjs.objFromArray(allcontacts,"cid",eventArray[i].cid);}
dayArray.push(Math.floor(eventrs.rows.item(i).start/86400000)); else{eventArray[i]["eventOwner"]=Newsjs.objFromArray(allcontacts,"isFriend",2);}
var startday=Math.floor((eventArray[i].start-new Date(eventArray[i].start).getTimezoneOffset() * 60 * 1000)/86400000);
var endday=Math.floor((eventArray[i].end-1-new Date(eventArray[i].end).getTimezoneOffset() * 60 * 1000)/86400000);if (endday<startday){endday=startday}
eventArray[i]["startday"]=startday;eventArray[i]["endday"]=endday;
dayArray.push(startday);
if (endday>startday){
for (var j=startday+1;j<endday+1;j++){dayArray.push(j)}
}
} }
callback(eventArray,dayArray)}); callback(eventArray,dayArray)});
} }
@ -281,8 +290,9 @@ function readConfig(database,callback,filter,filtervalue) { // reads config
for(var i = 0; i < rs.rows.length; i++) { for(var i = 0; i < rs.rows.length; i++) {
rsArray.push(rs.rows.item(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}; 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};
} else {var rsObject=""} if (rsObject.newsViewType!="" && rsObject.newsViewType!=null){updateNewsviewtype(database,rsObject.newsViewType)}
} else {var rsObject=""}
callback(rsObject)}} callback(rsObject)}}
) )
} }
@ -293,6 +303,14 @@ function readActiveConfig(database){
return obj; return obj;
} }
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")');
})
}
function readGlobaloptions(database,callback){ function readGlobaloptions(database,callback){
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
var go=({}); var go=({});
@ -303,7 +321,12 @@ function readGlobaloptions(database,callback){
} }
callback(go) callback(go)
}) })
}
function readGO(database){
var obj;
readGlobaloptions(database,function(go){obj=go});
return obj
} }
function updateglobaloptions(database,key,value){ function updateglobaloptions(database,key,value){
@ -334,6 +357,17 @@ 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=""');
Helperjs.showMessage(qsTr("Changelog"),qsTr("Setting view type of news has moved from account page to config page."),root)
})
}
function cleanNews(database,callback){ function cleanNews(database,callback){
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]); var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
db.transaction( function(tx) { db.transaction( function(tx) {
@ -611,7 +645,7 @@ function showGroups(){
for (var i=0;i<groups.length;i++){ for (var i=0;i<groups.length;i++){
groupitems=groupitems+"MenuItem{text:'"+groups[i].groupname+"'; onTriggered: Service.getGroupnews("+groups[i].gid+")}" groupitems=groupitems+"MenuItem{text:'"+groups[i].groupname+"'; onTriggered: Service.getGroupnews("+groups[i].gid+")}"
} }
var menuString="import QtQuick.Controls 1.4; import 'qrc:/js/service.js' as Service; Menu {"+groupitems+"}"; var menuString="import QtQuick.Controls 2.12; import 'qrc:/js/service.js' as Service; Menu {"+groupitems+"}";
var grouplistObject=Qt.createQmlObject(menuString,newsStack,"groupmenuOutput"); var grouplistObject=Qt.createQmlObject(menuString,newsStack,"groupmenuOutput");
grouplistObject.popup() grouplistObject.popup()
}) })

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -36,7 +36,7 @@ Item {
id: calendarDay id: calendarDay
width:7*mm width:7*mm
height: 7*mm height: 7*mm
property int dateInt:Math.floor((Date.parse(model.date)-(new Date().getTimezoneOffset() * 60 * 1000))/86400000) property int dateInt: Math.floor(Date.parse(model.date)/86400000) //Math.floor((Date.parse(model.date)-(new Date().getTimezoneOffset() * 60 * 1000))/86400000)
Rectangle { Rectangle {
id: placeHolder id: placeHolder
color: 'lightblue'; antialiasing: true color: 'lightblue'; antialiasing: true
@ -54,7 +54,7 @@ Item {
} }
Rectangle { Rectangle {
id:eventRect id:eventRect
color:"black" color:"grey"
anchors.margins: 0.5*mm anchors.margins: 0.5*mm
anchors.bottom: calendarDay.bottom anchors.bottom: calendarDay.bottom
width: parent.width-mm width: parent.width-mm
@ -64,15 +64,9 @@ Item {
MouseArea { MouseArea {
anchors.fill: calendarDay anchors.fill: calendarDay
onClicked: { onClicked: {
var eventDate=[];
var idx = eventdays.indexOf(dateInt);
while (idx != -1) {
eventDate.push(idx);
idx = eventdays.indexOf(dateInt,idx + 1)
}
var component = Qt.createComponent("qrc:/qml/calendarqml/EventList.qml"); var component = Qt.createComponent("qrc:/qml/calendarqml/EventList.qml");
if (component.status== Component.Ready){ if (component.status== Component.Ready){
var eventlist = component.createObject(calendartab,{"daylist": eventDate})} var eventlist = component.createObject(calendartab,{"dayint": dateInt})}
} }
} }
} }

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import QtQml 2.2 import QtQml 2.2
import Qt.labs.calendar 1.0 import Qt.labs.calendar 1.0
//import QtQuick.Controls 1.2 as Oldcontrol //import QtQuick.Controls 1.2 as Oldcontrol
@ -51,7 +51,7 @@ Rectangle {
property int offsetTime: currentTime.getTimezoneOffset() * 60 * 1000 property int offsetTime: currentTime.getTimezoneOffset() * 60 * 1000
property var events:[] property var events:[]
property var eventdays:[] property var eventdays:[]
//onEventdaysChanged: print(JSON.stringify(eventdays))
function showEvents(friend){ function showEvents(friend){
if(friend=="backButton"){Service.eventsfromdb(db,login.username,function(eventArray,dayArray){ if(friend=="backButton"){Service.eventsfromdb(db,login.username,function(eventArray,dayArray){
@ -94,9 +94,24 @@ Rectangle {
width: 8*mm width: 8*mm
text:"\uf021" text:"\uf021"
onClicked: { onClicked: {
Service.getEvents(db,login, calendartab,function(){ calBusy.running=true;
showEvents("") updatenews.setDatabase();
})}} updatenews.login();
updatenews.events();
// Service.getEvents(db,login, calendartab,function(){
// showEvents("")
// })
}}
Connections{
target: updatenews
onSuccess:{
calBusy.running=false;
showEvents("")
}
}
MButton{ MButton{
id: calendartabstatusButton id: calendartabstatusButton

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import "qrc:/js/service.js" as Service import "qrc:/js/service.js" as Service
import "qrc:/js/helper.js" as Helperjs import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"
@ -44,7 +44,7 @@ Rectangle{
x:mm x:mm
y:mm y:mm
property var daylist:[] property var daylist:[]
property int dayint: 0
MButton{ MButton{
id:closeButton id:closeButton
anchors.top: parent.top anchors.top: parent.top
@ -71,10 +71,12 @@ Rectangle{
id: eventModel id: eventModel
} }
Component.onCompleted:{ Component.onCompleted:{//print("daylist"+JSON.stringify(daylist) + dayint)
for (var i=0; i<daylist.length;i++){ var currentevents=events.filter(event=>(dayint>=event.startday)&&(dayint<=event.endday));
var liststate="";if(daylist.length<2){liststate="large"} for (var i=0; i<currentevents.length;i++){
eventModel.append({"event":events[daylist[i]],"eventstatus":liststate}); var liststate="";if(currentevents.length<2){liststate="large"};
//print(JSON.stringify(events[daylist[i]]));
eventModel.append({"event":currentevents[i],"eventstatus":liststate});
} }
} }
@ -86,26 +88,39 @@ Rectangle{
height:eventNameText.height+eventDetailsText.height+mm height:eventNameText.height+eventDetailsText.height+mm
border.color: "light grey" border.color: "light grey"
border.width: 1 border.width: 1
Text { 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 id:eventNameText
x:mm x: 8*mm
width:parent.width width:parent.width-8*mm
height:contentHeight height:contentHeight
text: new Date(event.start+calendarrectangle.offsetTime).toLocaleTimeString()+": "+event.title text: new Date(event.start).toLocaleString(Qt.locale(),Locale.NarrowFormat)+ " - " +(event.end>0?new Date(event.end).toLocaleString(Qt.locale(),Locale.NarrowFormat):" ")+": "+event.title //+calendarrectangle.offsetTime
font.pixelSize: 3*mm font.pixelSize: 3*mm
wrapMode:Text.Wrap wrapMode:Text.Wrap
} }
Text { Text {
id:eventDetailsText id:eventDetailsText
x:mm x:8*mm
z:4 z:4
width: parent.width width: parent.width-8*mm
height: contentHeight height: contentHeight
text: status==""?"":Qt.atob(event.html) textFormat: Text.RichText
text: status==""?"":Qt.atob(event.desc) + (event.location==""?"":"<br><br>"+qsTr("Location")+": "+event.location)//Qt.atob(event.html)
anchors.top: eventNameText.bottom anchors.top: eventNameText.bottom
font.pixelSize: 3*mm font.pixelSize: 3*mm
wrapMode:Text.Wrap wrapMode:Text.Wrap
onLinkActivated:{Qt.openUrlExternally(link)}
} }
MouseArea{ MouseArea{
anchors.fill: parent anchors.fill: parent

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -31,7 +31,7 @@
import QtQuick 2.7 import QtQuick 2.7
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import "qrc:/js/service.js" as Service import "qrc:/js/service.js" as Service
import "qrc:/js/layout.js" as Layoutjs import "qrc:/js/layout.js" as Layoutjs
@ -61,6 +61,8 @@ Page{
x: mm x: mm
y: mm y: mm
width: root.width/2 width: root.width/2
visible: users.length>0
onClicked:{ onClicked:{
var useritems=""; var useritems="";
for (var i=0;i<accountPage.users.length;i++){ for (var i=0;i<accountPage.users.length;i++){
@ -73,11 +75,10 @@ Page{
username.text= obj.username; username.text= obj.username;
password.text=Qt.atob(obj.password); password.text=Qt.atob(obj.password);
imagestore.text=obj.imagestore; imagestore.text=obj.imagestore;
newsTypeField.text=obj.newsViewType;
if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'} if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'}
},'username','"+ accountPage.users[i].username+"')}}" },'username','"+ accountPage.users[i].username+"')}}"
} }
var menuString="import QtQuick.Controls 2.4;import 'qrc:/js/service.js' as Service; Menu {"+useritems+"}"; var menuString="import QtQuick.Controls 2.12;import 'qrc:/js/service.js' as Service; Menu {"+useritems+"}";
var userlistObject=Qt.createQmlObject(menuString,accountPage,"usermenuOutput") var userlistObject=Qt.createQmlObject(menuString,accountPage,"usermenuOutput")
userlistObject.popup() } userlistObject.popup() }
} }
@ -109,11 +110,11 @@ Page{
// font.pixelSize:3*mm // font.pixelSize:3*mm
// x: 4*mm; y: 50*mm // x: 4*mm; y: 50*mm
// } // }
Text { // Text {
text: qsTr("News as") // text: qsTr("News as")
font.pixelSize:3*mm // font.pixelSize:3*mm
x: 4*mm; y: 50*mm // x: 4*mm; y: 50*mm
} // }
// Text { // Text {
@ -173,7 +174,7 @@ Page{
Rectangle{ Rectangle{
color: "light grey" color: "light grey"
x: 4*mm; y: 23.5*mm; width: root.width-14*mm; height: 5*mm; x: 4*mm; y: 23.5*mm; width: root.width-6*mm; height: 5*mm;
TextInput { TextInput {
id: username id: username
anchors.fill: parent anchors.fill: parent
@ -186,14 +187,14 @@ Page{
} }
} }
} }
Button { // Button {
x: root.width-9*mm; y: 23.5*mm; width:5*mm; height:5*mm // x: root.width-9*mm; y: 23.5*mm; width:5*mm; height:5*mm
text: "\uf234" // text: "\uf234"
font.pixelSize: 3*mm // font.pixelSize: 3*mm
onClicked: { // onClicked: {
root.push("qrc:/qml/configqml/RegisterPage.qml",{url:servername.text+"/register?nickname="+username.getText(0,username.length)}) // root.push("qrc:/qml/configqml/RegisterPage.qml",{url:servername.text+"/register?nickname="+username.getText(0,username.length)})
} // }
} // }
Rectangle{ Rectangle{
color: "light grey" color: "light grey"
@ -261,20 +262,20 @@ Page{
// } // }
// } // }
Rectangle{ // Rectangle{
x: 4*mm; y: 53.5*mm; width: newsTypeField.contentWidth+2*mm; height: 5*mm; // x: 4*mm; y: 53.5*mm; width: newsTypeField.contentWidth+2*mm; height: 5*mm;
color:"light grey" // color:"light grey"
Text{ // Text{
id: newsTypeField // id: newsTypeField
anchors.fill: parent // anchors.fill: parent
font.pixelSize:3*mm // font.pixelSize:3*mm
text:"Conversations" // text:"Conversations"
} // }
MouseArea{ // MouseArea{
anchors.fill:parent // anchors.fill:parent
onClicked:newstypemenu.popup() // onClicked:newstypemenu.popup()
} // }
} // }
BusyIndicator{ BusyIndicator{
id: accountBusy id: accountBusy
@ -306,7 +307,7 @@ Page{
font.pixelSize: 3*mm font.pixelSize: 3*mm
onClicked:{ onClicked:{
accountBusy.running=true; accountBusy.running=true;
var userconfig={server: servername.text, username: username.text, password:Qt.btoa(password.text), imagestore:imagestore.text, maxnews:"",interval: "",newsViewType:newsTypeField.text}; var userconfig={server: servername.text, username: username.text, password:Qt.btoa(password.text), imagestore:imagestore.text, maxnews:"",interval: ""};
var errormessage=""; var errormessage="";
if (servername.text==""){errormessage=qsTr("No server given! ")} if (servername.text==""){errormessage=qsTr("No server given! ")}
else if (username.text==""){errormessage+=qsTr("No nickname given! ")} else if (username.text==""){errormessage+=qsTr("No nickname given! ")}
@ -322,6 +323,7 @@ Page{
Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password!"),root) Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password!"),root)
} }
else{ else{
if (users.length==0){Service.setDefaultOptions(db);}
filesystem.Directory=userconfig.imagestore; filesystem.Directory=userconfig.imagestore;
filesystem.makeDir("contacts"); filesystem.makeDir("contacts");
filesystem.makeDir("albums"); filesystem.makeDir("albums");
@ -352,6 +354,7 @@ Page{
Button { Button {
x: parent.width/2+2*mm; y: mm; width: 5*mm; height: 8*mm; x: parent.width/2+2*mm; y: mm; width: 5*mm; height: 8*mm;
visible: users.length>0
text: "-" text: "-"
font.pixelSize: 3*mm font.pixelSize: 3*mm
onClicked:{ onClicked:{
@ -368,7 +371,7 @@ Page{
password.text=""; password.text="";
imagestore.text=""; imagestore.text="";
//maxNews.value=0; //maxNews.value=0;
newsTypeField.text="Conversations"; //newsTypeField.text="Conversations";
//messageIntervalSlider.value=30; //messageIntervalSlider.value=30;
userButton.text=qsTr("User"); userButton.text=qsTr("User");
Helperjs.readData(db,"config","",function(storedUsers){ Helperjs.readData(db,"config","",function(storedUsers){
@ -381,6 +384,7 @@ Page{
Button { Button {
x: parent.width/2+8*mm; y: mm; width: 5*mm; height: 8*mm; x: parent.width/2+8*mm; y: mm; width: 5*mm; height: 8*mm;
visible: users.length>0
text: "+" text: "+"
font.pixelSize: 3*mm font.pixelSize: 3*mm
onClicked:{ onClicked:{
@ -391,7 +395,7 @@ Page{
password.text="" password.text=""
imagestore.text="" imagestore.text=""
//maxNews.value=0 //maxNews.value=0
newsTypeField.text="Conversations" //newsTypeField.text="Conversations"
//messageIntervalSlider.value=30 //messageIntervalSlider.value=30
userButton.text=qsTr("User") userButton.text=qsTr("User")
} }
@ -409,6 +413,7 @@ Page{
id:closeButton id:closeButton
height: 8*mm height: 8*mm
width: 5*mm width: 5*mm
visible: users.length>0
anchors.top: parent.top anchors.top: parent.top
anchors.topMargin: 1*mm anchors.topMargin: 1*mm
anchors.right: parent.right anchors.right: parent.right
@ -417,19 +422,19 @@ Page{
font.pixelSize: 3*mm font.pixelSize: 3*mm
onClicked:{root.pop()} onClicked:{root.pop()}
} }
Menu { // Menu {
id:newstypemenu // id:newstypemenu
MenuItem { // MenuItem {
font.pixelSize: 3*mm // font.pixelSize: 3*mm
text: qsTr("Timeline") // text: qsTr("Timeline")
onTriggered: {newsTypeField.text="Timeline"} // onTriggered: {newsTypeField.text="Timeline"}
} // }
MenuItem { // MenuItem {
font.pixelSize: 3*mm // font.pixelSize: 3*mm
text: qsTr("Conversations") // text: qsTr("Conversations")
onTriggered: {newsTypeField.text="Conversations"} // onTriggered: {newsTypeField.text="Conversations"}
} // }
} // }
Component.onCompleted: { Component.onCompleted: {
try{Helperjs.readData(db,"config","",function(storedUsers){ try{Helperjs.readData(db,"config","",function(storedUsers){
@ -445,12 +450,12 @@ Page{
password.text=Qt.atob(obj.password); password.text=Qt.atob(obj.password);
imagestore.text=obj.imagestore; imagestore.text=obj.imagestore;
//maxNews.value=obj.maxnews; //maxNews.value=obj.maxnews;
newsTypeField.text=obj.newsViewType; //newsTypeField.text=obj.newsViewType;
//messageIntervalSlider.value=obj.timerInterval; //messageIntervalSlider.value=obj.timerInterval;
if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'} if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'}
},"isActive",0) },"isActive",0)
})} })}
catch (e){print(e) catch (e){//print("onCompleted" +users.count +e)
// Helperjs.friendicaWebRequest("https://dir.friendica.social/servers/surprise",accountPage,function(html){ // Helperjs.friendicaWebRequest("https://dir.friendica.social/servers/surprise",accountPage,function(html){
// print(html); // print(html);
// var bpos=html.indexOf("base "); // var bpos=html.indexOf("base ");

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -31,11 +31,9 @@
import QtQuick 2.11 import QtQuick 2.11
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import "qrc:/js/service.js" as Service import "qrc:/js/service.js" as Service
//import "qrc:/js/layout.js" as Layoutjs
//import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/configqml" import "qrc:/qml/configqml"
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"
@ -43,85 +41,92 @@ Page{
//anchors.fill: parent //anchors.fill: parent
width:root.width width:root.width
height:root.height height:root.height
//contentHeight: configBackground.height
//boundsBehavior: Flickable.StopAtBounds
// Rectangle{
// id:configBackground
// color: "white"
// anchors.fill: parent
// width:parent.width
// height:Math.max(90*mm,root.height-12*mm)
// property var users:[]
// property bool registeredUser: true
// property var userdata: ({})
// Text { Rectangle{
// text: qsTr("Image dir.") x: 4*mm; y:13.5*mm; width: parent.width - 14*mm; height: 5*mm;
// //text: qsTr("Max. News") color:"light grey"
// font.pixelSize:3*mm radius: 0.5*mm
// x: 4*mm; y: 10*mm Text{
// } anchors.fill: parent
Text { font.pixelSize:3*mm
text: qsTr("Max. News") text:qsTr("Sync")
//text: qsTr("News as") }
font.pixelSize:3*mm MouseArea{
x: 4*mm; y:10*mm anchors.fill:parent
onClicked:root.push("qrc:qml/configqml/SyncConfig.qml");
}
} }
Text {
// Text { text: qsTr("News as")
// text: qsTr("Show Website") font.pixelSize:3*mm
// x: 4*mm; y: 40*mm; width: 20*mm x: 4*mm; y: 20*mm
// } }
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")
}
MouseArea{
anchors.fill:parent
onClicked:newstypemenu.popup()
}
}
Menu {
id:newstypemenu
MenuItem {
font.pixelSize: 3*mm
text: qsTr("Timeline")
onTriggered: {newsTypeField.text=qsTr("Timeline");
Service.updateglobaloptions(root.db,"newsViewType","Timeline");}
}
MenuItem {
font.pixelSize: 3*mm
text: qsTr("Conversations")
onTriggered: {newsTypeField.text=qsTr("Conversations");
Service.updateglobaloptions(root.db,"newsViewType","Conversations");}
}
}
// Rectangle{color: "light grey"; x: 4*mm; y: 13.5*mm; width: root.width-14*mm; height: 5*mm;} Text {
// Flickable { text: qsTr("Max. News")
// id: imagestoreFlickable font.pixelSize:3*mm
// x: 4*mm; y: 13.5*mm; width: root.width-14*mm; height: 5*mm; x: 4*mm; y:30*mm
// clip: true }
// TextInput {
// id: imagestore
// width: imagestoreFlickable.width
// height: imagestoreFlickable.height
// font.pixelSize:3*mm
// wrapMode: TextEdit.NoWrap
// onCursorRectangleChanged: Layoutjs.ensureVisibility(cursorRectangle,imagestoreFlickable)
// }
// }
// 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
// }
// }
// Button {
// x: root.width-9*mm; y: 13.5*mm; width: 7*mm; height: 8*mm;
// text: "..."
// onClicked:
// {imagestoreDialog.open()}
// }
Slider{ id: maxNews Slider{ id: maxNews
x:19*mm; y: 13.5*mm;width: root.width/2;height:5*mm x:19*mm; y: 33.5*mm;width: root.width/2;height:5*mm
from: 0;to:2000; stepSize: 100 from: 0;to:2000; stepSize: 100
value: root.globaloptions.hasOwnProperty("max_news")?root.globaloptions.max_news:1000 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;
radius: 0.5*mm
TextEdit{id:maxNewsText;
anchors.fill: parent
font.pixelSize:3*mm
verticalAlignment:TextEdit.AlignRight
text:maxNews.value
selectByMouse: true
onTextChanged: {
Service.updateglobaloptions(root.db,"max_news",text);
}
}
}
CheckBox{ CheckBox{
id: nsfwCheckbox id: nsfwCheckbox
x: 4*mm x: 4*mm
y: 33.5*mm y: 43.5*mm
font.pixelSize: 3*mm font.pixelSize: 3*mm
//width:5*mm //width:5*mm
text: qsTr("Hide #nsfw?") text: qsTr("Hide #nsfw?")
@ -137,69 +142,6 @@ Page{
} }
} }
Rectangle{color: "light grey"; x: 4*mm; y: 13.5*mm; width: 9*mm; height: 5*mm;
radius: 0.5*mm
TextEdit{id:maxNewsText;
anchors.fill: parent
font.pixelSize:3*mm
verticalAlignment:TextEdit.AlignRight
text:maxNews.value
focus: true
selectByMouse: true
onTextChanged: {
Service.updateglobaloptions(root.db,"max_news",text);
}
}
}
Rectangle{
x: 4*mm; y:23.5*mm; width: parent.width - 14*mm; height: 5*mm;
color:"light grey"
radius: 0.5*mm
Text{
anchors.fill: parent
font.pixelSize:3*mm
text:qsTr("Sync")
}
MouseArea{
anchors.fill:parent
onClicked:root.push("qrc:qml/configqml/SyncConfig.qml");
}
}
// Slider{ id: messageIntervalSlider
// x:22*mm; y: 73.5*mm;width: root.width/2;height:5*mm
// from: 0;to:120; stepSize: 15
// }
// Rectangle{
// x: 4*mm; y: 73.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
// }
// }
// Text{x: 14*mm; y: 73.5*mm; width: 5*mm; height: 5*mm;
// font.pixelSize:3*mm
// text:qsTr("Min.")
// }
// CheckBox{
// id:showwebsiteCheckbox
// x:35*mm;y:80*mm
// onClicked:{
// if (checked==true){
// Service.updateglobaloptions(root.db,"showWebsiteForLinks","true")
// root.globaloptions.showWebsiteForLinks="true"
// }
// else {
// Service.updateglobaloptions(root.db,"showWebsiteForLinks","false")
// root.globaloptions.showWebsiteForLinks="false"
// }
// }
// }
MButton { MButton {
anchors.right: closeButton.left; anchors.rightMargin: mm; anchors.right: closeButton.left; anchors.rightMargin: mm;
@ -224,22 +166,4 @@ Page{
font.pixelSize: 3*mm font.pixelSize: 3*mm
onClicked:{root.pop()} onClicked:{root.pop()}
} }
// Menu {
// id:newstypemenu
// MenuItem {
// text: qsTr("Timeline")
// onTriggered: {newsTypeField.text="Timeline"}
// }
// MenuItem {
// text: qsTr("Conversations")
// onTriggered: {newsTypeField.text="Conversations"}
// }
// }
// Component.onCompleted: {
// Service.readGlobaloptions(db,function(go){
// if(go.hasOwnProperty("max_news")){maxNews.value=go.max_news}else{maxNews.value=1000}
// //if (root.globaloptions.showWebsiteForLinks!="false"){showwebsiteCheckbox.checked=true}
// })
// }
} }

View File

@ -1,482 +0,0 @@
// This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// In addition, as a special exception, the copyright holders give
// permission to link the code of portions of this program with the
// OpenSSL library under certain conditions as described in each
// individual source file, and distribute linked combinations including
// the two.
//
// You must obey the GNU General Public License in all respects for all
// of the code used other than OpenSSL. If you modify file(s) with this
// exception, you may extend this exception to your version of the
// file(s), but you are not obligated to do so. If you do not wish to do
// so, delete this exception statement from your version. If you delete
// this exception statement from all source files in the program, then
// also delete it here.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.7
import QtQuick.Dialogs 1.2
import QtQuick.Controls 1.2
import "qrc:/js/service.js" as Service
import "qrc:/js/layout.js" as Layoutjs
import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/configqml"
import "qrc:/qml/genericqml"
StackView{
id: configStack
anchors.fill:parent
initialItem: Flickable{
width:root.width-5*mm
height:root.height-12*mm
contentHeight: configBackground.height
boundsBehavior: Flickable.StopAtBounds
Rectangle{
id:configBackground
color: "white"
width:parent.width
height:Math.max(90*mm,root.height-12*mm)
property var users:[]
property bool registeredUser: true
property var userdata: ({})
function setServericon(server){
try {Helperjs.friendicaWebRequest(server+"/api/statusnet/config",configBackground, function (obj){
var serverdata = JSON.parse(obj);
servericon.visible=true;
servericon.source=serverdata.site.logo})} catch(e){print(e)}
}
BlueButton{
id:userButton
text:qsTr("User")
y:mm
width: root.width/2
onClicked:{
var useritems="";
for (var i=0;i<configBackground.users.length;i++){
useritems=useritems+"MenuItem{text:'"+configBackground.users[i].username+
"'; onTriggered: {Service.readConfig(db,function(obj){
configBackground.registeredUser=true;
userButton.text=obj.username;
servername.text=obj.server;
configBackground.setServericon(obj.server);
username.text= obj.username;
password.text=Qt.atob(obj.password);
imagestore.text=obj.imagestore;
maxNews.value=obj.maxnews;
newsTypeField.text=obj.newsViewType;
if( obj.isActive==0){userButton.fontColor='black'} else {userButton.fontColor='grey'}
},'username','"+configBackground.users[i].username+"')}}"
}
var menuString="import QtQuick.Controls 1.4;import 'qrc:/js/service.js' as Service; Menu {"+useritems+"}";
var userlistObject=Qt.createQmlObject(menuString,configBackground,"usermenuOutput")
userlistObject.popup() }
}
Text {
text: qsTr("Server")
font.pixelSize:3*mm
x: 4*mm; y: 10*mm
}
Text {
text: qsTr("Nickname")
font.pixelSize:3*mm
x: 4*mm; y: 20*mm
}
Text {
text: qsTr("Password")
font.pixelSize:3*mm
x: 4*mm; y: 30*mm
}
Text {
text: qsTr("Image dir.")
font.pixelSize:3*mm
x: 4*mm; y: 40*mm
}
Text {
text: qsTr("Max. News")
font.pixelSize:3*mm
x: 4*mm; y: 50*mm
}
Text {
text: qsTr("News as")
font.pixelSize:3*mm
x: 4*mm; y: 60*mm
}
Text {
text: qsTr("Sync Interval (0=None)")
font.pixelSize:3*mm
//visible: false
x: 4*mm; y: 70*mm; //width:35*mm;wrapMode: Text.Wrap
}
// Text {
// text: qsTr("Show Website")
// x: 4*mm; y:80*mm; width: 20*mm
// }
Image{
id:servericon
x:4*mm;y:13.5*mm
width:5*mm; height: 5*mm
visible: false
source:""
MouseArea{
anchors.fill:parent
onClicked:{
Service.showServerConfig(servername.text, configBackground, function(configString){
var serverconfigObject=Qt.createQmlObject(configString,configBackground,"serverconfigOutput");})
}
}
}
BlueButton{
id:serverSearchButton
text:"\uf002"
x:4*mm
y:13.5*mm
width: 5*mm; height:5*mm
visible: servericon.visible?false:true
onClicked:{Qt.openUrlExternally(Qt.resolvedUrl("https://dir.friendica.social/servers"))}
}
Rectangle{color: "light grey"; x: 10*mm; y: 13.5*mm; width: root.width-12*mm; height: 5*mm;}
Flickable {
id: servernameFlickable
x: 10*mm; y: 13.5*mm; width: root.width-12*mm; height: 5*mm;
contentWidth: servername.paintedWidth
contentHeight: servername.paintedHeight
clip: true
TextEdit {
id: servername
width: servernameFlickable.width
height: servernameFlickable.height
focus: true
font.pixelSize:3*mm
text:"https://..."
onEditingFinished:{
if((servername.text).substring(0,14) =="https://...http"){
serverstring.text= (serverstring.text).substring(11)
}
configBackground.setServericon(servername.text)
}
onCursorRectangleChanged: Layoutjs.ensureVisibility(cursorRectangle,servernameFlickable)
}
}
Rectangle{
color: "light grey"
x: 4*mm; y: 23.5*mm; width: root.width-14*mm; height: 5*mm;
TextInput {
id: username
anchors.fill: parent
font.pixelSize:3*mm
selectByMouse: true
onEditingFinished:{
if (username.text.indexOf('@')>-1){
Helperjs.showMessage(qsTr("Error"),qsTr("Nicknames containing @ symbol currently not supported"),configBackground)
}
// Helperjs.friendicaWebRequest(servername.text+'/api/users/show?screen_name='+username.text,configBackground,function(obj){
// var screennametest=JSON.parse(obj);
// if (screennametest.hasOwnProperty('status')){
// Helperjs.showMessage(qsTr("Error"),qsTr("Nickname not registered at given server!"),configBackground);
// configBackground.registeredUser=false;
// }else{configBackground.registeredUser=true}
// });
// }
}
}
}
BlueButton {
x: root.width-9*mm; y: 23.5*mm; width:7*mm
text: "\uf234"
onClicked: {
configStack.push({item:"qrc:/qml/configqml/RegisterPage.qml",properties:{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
selectByMouse: true
echoMode: TextInput.PasswordEchoOnEdit
}
}
Rectangle{color: "light grey"; x: 4*mm; y: 43.5*mm; width: root.width-14*mm; height: 5*mm;}
Flickable {
id: imagestoreFlickable
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
wrapMode: TextEdit.NoWrap
onCursorRectangleChanged: Layoutjs.ensureVisibility(cursorRectangle,imagestoreFlickable)
}
}
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
}
}
BlueButton {
x: root.width-9*mm; y: 43.5*mm; width: 7*mm; height: 5*mm;
text: "..."
onClicked:
{imagestoreDialog.open()}
}
Slider{ id: maxNews
x:19*mm; y: 53.5*mm;width: root.width/2;height:5*mm
minimumValue: 0;maximumValue:2000; stepSize: 100
}
Rectangle{color: "light grey"; x: 4*mm; y: 53.5*mm; width: 9*mm; height: 5*mm;
TextEdit{id:maxNewsText;
anchors.fill: parent
font.pixelSize:3*mm
verticalAlignment:TextEdit.AlignRight
text:maxNews.value
focus: true
selectByMouse: true
}
}
Rectangle{
x: 4*mm; y: 63.5*mm; width: newsTypeField.contentWidth+2*mm; height: 5*mm;
color:"light grey"
Text{
id: newsTypeField
anchors.fill: parent
font.pixelSize:3*mm
text:"Conversations"
}
MouseArea{
anchors.fill:parent
onClicked:newstypemenu.popup()
}
}
Slider{ id: messageIntervalSlider
x:22*mm; y: 73.5*mm;width: root.width/2;height:5*mm
minimumValue: 0;maximumValue:120; stepSize: 15
}
Rectangle{
x: 4*mm; y: 73.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
}
}
Text{x: 14*mm; y: 73.5*mm; width: 5*mm; height: 5*mm;
font.pixelSize:3*mm
text:qsTr("Min.")
}
// CheckBox{
// id:showwebsiteCheckbox
// x:35*mm;y:80*mm
// onClicked:{
// if (checked==true){
// Service.updateglobaloptions(root.db,"showWebsiteForLinks","true")
// root.globaloptions.showWebsiteForLinks="true"
// }
// else {
// Service.updateglobaloptions(root.db,"showWebsiteForLinks","false")
// root.globaloptions.showWebsiteForLinks="false"
// }
// }
// }
BlueButton {
x: 4*mm; y: 83.5*mm
text: qsTr("Confirm")
onClicked:{
var userconfig={server: servername.text, username: username.text, password:Qt.btoa(password.text), imagestore:imagestore.text,maxnews:maxNewsText.text,interval: messageIntervalField.text, newsViewType:newsTypeField.text};
var errormessage="";
if (servername.text==""){errormessage=qsTr("No server given! ")}
else if (username.text==""){errormessage+=qsTr("No nickname given! ")}
else if ((configBackground.registeredUser==false)){errormessage+=qsTr("Nickname not registered at given server! ")}
else if (password.text=="") {errormessage+=qsTr("No password 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){
var credentials=JSON.parse(obj);
if (credentials.hasOwnProperty('status')){
Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password!"),root)
}
else{
filesystem.Directory=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;
});
configBackground.users=storedUsers});
userButton.color="black"
//reset values
root.login=userconfig;
root.news=[];
},"isActive",0);
Service.requestProfile(userconfig,db,root,function(nc){root.newContacts=nc});
if(osSettings.osType=="Android" && userconfig.timerInterval !=0){
alarm.setAlarm(userconfig.timerInterval);
}
Helperjs.showMessage(qsTr("Success"),qsTr("Name")+": "+credentials.name+"\nScreen Name: "+credentials.screen_name,root)
}
});
}
else {Helperjs.showMessage(qsTr("Error"), errormessage,root)}
}}
BlueButton {
x: root.width/2+2*mm; y: mm; width: 5*mm; height: 5*mm;
text: "-"
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();
configBackground.registeredUser=true;
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;
})
configBackground.users=storedUsers;})
})
}}
BlueButton {
x: root.width/2+8*mm; y: mm; width: 5*mm; height: 5*mm;
text: "+"
onClicked:{
configBackground.registeredUser=true;
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")
}
}
BlueButton {
x: root.width/2+14*mm; y: mm; width: 5*mm; height: 5*mm;
text: "?"
onClicked:{
configStack.push({item:"qrc:/qml/configqml/InfoBox.qml"});
}
}
Menu {
id:newstypemenu
MenuItem {
text: qsTr("Timeline")
onTriggered: {newsTypeField.text="Timeline"}
}
MenuItem {
text: qsTr("Conversations")
onTriggered: {newsTypeField.text="Conversations"}
}
}
Component.onCompleted: {
try{Helperjs.readData(db,"config","",function(storedUsers){
storedUsers.sort(function(obj1, obj2) {
return obj1.isActive - obj2.isActive;
})
configBackground.users=storedUsers;
Service.readConfig(db,function(obj){
userButton.text=obj.username;
servername.text=obj.server;
configBackground.setServericon(obj.server);
username.text= obj.username;
password.text=Qt.atob(obj.password);
imagestore.text=obj.imagestore;
maxNews.value=obj.maxnews;
newsTypeField.text=obj.newsViewType;
messageIntervalSlider.value=obj.timerInterval;
if( obj.isActive==0){userButton.fontColor='black'} else {userButton.fontColor='grey'}},"isActive",0
)
})
// Service.readGlobaloptions(db,function(go){
// if (root.globaloptions.showWebsiteForLinks!="false"){showwebsiteCheckbox.checked=true}
// })
}
catch (e){print(e)
Helperjs.friendicaWebRequest("https://dir.friendica.social/servers/surprise",configBackground,function(html){
var bpos=html.indexOf("baseurl");
var baseurl=html.substring(html.indexOf("http",bpos),html.indexOf('"',html.indexOf("http",bpos)));
servername.text=baseurl
})}
}
}
}
}

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"
Rectangle{ Rectangle{
@ -43,7 +43,7 @@ Rectangle{
textFormat: Text.RichText textFormat: Text.RichText
width: root.width-mm width: root.width-mm
wrapMode: Text.WrapAtWordBoundaryOrAnywhere wrapMode: Text.WrapAtWordBoundaryOrAnywhere
text: "<b>Friendiqa v0.5.2 </b><br>Licensed under GPL 3 with the exception of OpenSSL <br> "+ text: "<b>Friendiqa v0.5.3 </b><br>Licensed under GPL 3 with the exception of OpenSSL <br> "+
"Website <a href='https://friendiqa.ma-nic.de'>https://friendiqa.ma-nic.de</a><br>"+ "Website <a href='https://friendiqa.ma-nic.de'>https://friendiqa.ma-nic.de</a><br>"+
"Sourcecode: <a href='https://git.friendi.ca/LubuWest/Friendiqa'>https://git.friendi.ca/LubuWest/Friendiqa</a><br>"+ "Sourcecode: <a href='https://git.friendi.ca/LubuWest/Friendiqa'>https://git.friendi.ca/LubuWest/Friendiqa</a><br>"+
"Privacy Policy: <a href='https://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md'>http://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md</a><br>"+ "Privacy Policy: <a href='https://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md'>http://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md</a><br>"+

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -29,10 +29,11 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick.Window 2.0
import QtQuick 2.0 import QtQuick 2.0
QtObject{ QtObject{
property real appWidth: 500 property real appWidth: Screen.desktopAvailableWidth/3
property real appHeight: 500 property real appHeight: Screen.desktopAvailableHeight/3*2
property int backKey: Qt.Key_Escape property int backKey: Qt.Key_Escape
property string osType: "Linux" property string osType: "Linux"
//property string attachImageDir:filesystem.homePath+"/Pictures/" //property string attachImageDir:filesystem.homePath+"/Pictures/"

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.9 import QtQuick 2.9
import QtQuick.Controls 2.5 import QtQuick.Controls 2.12
import QtWebView 1.1 import QtWebView 1.1
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -31,7 +31,7 @@
import QtQuick 2.11 import QtQuick 2.11
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import "qrc:/qml/configqml" import "qrc:/qml/configqml"
import "qrc:/js/service.js" as Service import "qrc:/js/service.js" as Service

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,14 +30,17 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.11 import QtQuick 2.11
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import "qrc:/qml/configqml" import "qrc:/qml/configqml"
import "qrc:/qml/genericqml"
import "qrc:/js/service.js" as Service import "qrc:/js/service.js" as Service
Rectangle{ Rectangle{
color:"white" color:"white"
width:root.width width:root.width
height:root.height height: root.height
//height:root.height
Text { Text {
text: qsTr("Sync Interval (0=None)") text: qsTr("Sync Interval (0=None)")
font.pixelSize:3*mm font.pixelSize:3*mm
@ -47,7 +50,7 @@ Rectangle{
Slider{ id: messageIntervalSlider Slider{ id: messageIntervalSlider
x:22*mm; y: 13.5*mm;width: root.width/2;height:5*mm x:22*mm; y: 13.5*mm;width: root.width/2;height:5*mm
value: globaloptions.syncinterval value: globaloptions.hasOwnProperty("syncinterval")?globaloptions.syncinterval:0
from: 0;to:120; stepSize: 15 from: 0;to:120; stepSize: 15
} }
Rectangle{ Rectangle{
@ -65,6 +68,7 @@ Rectangle{
if(osSettings.osType=="Android"){ if(osSettings.osType=="Android"){
alarm.setAlarm(text); alarm.setAlarm(text);
} else if(osSettings.osType=="Linux" && text !=0){ } else if(osSettings.osType=="Linux" && text !=0){
root.updateSyncinterval(parseInt(text))
} }
} }
} }
@ -74,18 +78,24 @@ Rectangle{
text:qsTr("Min.") text:qsTr("Min.")
} }
Column{ ScrollView{
y:22*mm width: root.width
width: parent.width height: root.height - 25*mm;y:22*mm
spacing:mm clip:true
//anchors.fill: parent Column{
SyncComponent{adapter:"Timeline"} //height: implicitHeight
SyncComponent{adapter:"Replies"} width: parent.width
SyncComponent{ adapter:"DirectMessages"} spacing:mm
SyncComponent{ adapter:"Notifications"} //anchors.fill: parent
SyncComponent{adapter:"Timeline"}
SyncComponent{adapter:"Replies"}
SyncComponent{ adapter:"DirectMessages"}
SyncComponent{ adapter:"Notifications"}
SyncComponent{ adapter: "Events"}
}
} }
Button{ MButton{
id:closeButton id:closeButton
anchors.top: parent.top anchors.top: parent.top
anchors.topMargin: 1*mm anchors.topMargin: 1*mm

View File

@ -1,92 +0,0 @@
// This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// In addition, as a special exception, the copyright holders give
// permission to link the code of portions of this program with the
// OpenSSL library under certain conditions as described in each
// individual source file, and distribute linked combinations including
// the two.
//
// You must obey the GNU General Public License in all respects for all
// of the code used other than OpenSSL. If you modify file(s) with this
// exception, you may extend this exception to your version of the
// file(s), but you are not obligated to do so. If you do not wish to do
// so, delete this exception statement from your version. If you delete
// this exception statement from all source files in the program, then
// also delete it here.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0
import QtQuick.Controls 2.4
import "qrc:/qml/genericqml"
Item {
id: contactComponent
height: 8*mm
width: parent.width
property var createdAtDate: new Date(contact.created_at)
property string connectUrl: (contact.network!=="dfrn")||(contact.isFriend==1)?"":( "<a href='"+contact.url.replace("profile","dfrn_request") +"'>"+qsTr("Connect")+"</a><br>")
Rectangle {
id: wrapper
width:parent.width
height: 8*mm
border.color: "grey"
color:"white"
Image {
id: photoImage
x:0.5*mm
y:0.5*mm
width: 7*mm
height: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
anchors.left: photoImage.right
anchors.margins: 1*mm
spacing: mm
Label {
id: namelabel
width: wrapper.width-4
height: 3*mm
text: contact.name
elide:Text.ElideRight
color: "#303030"
font.pixelSize: 3*mm
}
Label {
id: screennamelabel
width: wrapper.width-8*mm
height: 2.5*mm
text: "@"+contact.screen_name
elide:Text.ElideRight
color: "#303030"
font.pixelSize: 2.5*mm
}
}
MouseArea{
anchors.fill: parent
onClicked:{
rootstack.currentIndex=0;
bar.currentIndex=0;
root.contactdetailsSignal(contact)
}
}
}
}

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"
Item { Item {

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -31,7 +31,7 @@
// List of people // List of people
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.5 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/genericqml"

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.11 import QtQuick 2.11
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
//import QtQuick.Controls.Styles 1.4 //import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.11 import QtQuick.Layouts 1.11
import QtQuick.LocalStorage 2.0 import QtQuick.LocalStorage 2.0

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.11 import QtQuick 2.11
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import "qrc:/js/helper.js" as Helperjs import "qrc:/js/helper.js" as Helperjs
import "qrc:/js/news.js" as Newsjs import "qrc:/js/news.js" as Newsjs
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"
import "qrc:/js/service.js" as Service import "qrc:/js/service.js" as Service

View File

@ -45,7 +45,7 @@ StackView{
height:osSettings.appHeight height:osSettings.appHeight
property var db: ["Friendiqa", "1.0", "Stores Friendica data", 100000000] property var db: ["Friendiqa", "1.0", "Stores Friendica data", 100000000]
property var login: Service.readActiveConfig(db) property var login: Service.readActiveConfig(db)
property var globaloptions: ({}) //Service.readGlobaloptions(db) property var globaloptions: Service.readGO(db)
property var contactlist: [] property var contactlist: []
property real mm: osSettings.osType=="Android"?Screen.pixelDensity:Screen.pixelDensity*1.5 property real mm: osSettings.osType=="Android"?Screen.pixelDensity:Screen.pixelDensity*1.5
signal messageSignal(var friend) signal messageSignal(var friend)
@ -59,6 +59,7 @@ StackView{
signal uploadSignal(var urls) signal uploadSignal(var urls)
signal sendtextSignal(var intenttext) signal sendtextSignal(var intenttext)
signal changeimage(var method, var type, var id) signal changeimage(var method, var type, var id)
signal updateSyncinterval(int interval)
property var news:[] property var news:[]
property var newContacts:[] property var newContacts:[]
//property string contactLoadType: "" //property string contactLoadType: ""
@ -67,7 +68,7 @@ StackView{
onLoginChanged:{ onLoginChanged:{
if(login==""){root.push("qrc:/qml/configqml/AccountPage.qml")} if(login==""){root.push("qrc:/qml/configqml/AccountPage.qml")}
else{root.push(rootStackItem) else{root.push(rootStackItem)
newstab.newstabstatus=login.newsViewType; if (login.newsViewType!="" || login.newsViewType!=null){newstab.newstabstatus=login.newsViewType;}
Newsjs.getCurrentContacts(login,db,function(contacts){ Newsjs.getCurrentContacts(login,db,function(contacts){
contactlist=contacts})} contactlist=contacts})}
} }
@ -105,22 +106,20 @@ StackView{
FontLoader{id: fontAwesome; source: "qrc:/images/fontawesome-webfont.ttf"} FontLoader{id: fontAwesome; source: "qrc:/images/fontawesome-webfont.ttf"}
Keys.onReleased: {print("Backkey"+newstab.conversation.length+" "+root.depth) Keys.onReleased: {//print(event.key + "Backkey"+newstab.conversation.length+" "+root.depth)
if (event.key === osSettings.backKey) { if (event.key === osSettings.backKey) {
if (rootstack.currentIndex==0){ if (rootstack.currentIndex==0){
newstab.active=true; newstab.active=true;
print(newstab.newstabstatus) if (newstab.newstabstatus!=globaloptions.newsViewType){
if (newstab.newstabstatus!=login.newsViewType){ newstab.newstabstatus=globaloptions.newsViewType;
newstab.newstabstatus=login.newsViewType; if(globaloptions.newsViewType=="Timeline"){Newsjs.newsfromdb(db,login.username,0,function(dbnews){
if(login.newsViewType=="Timeline"){Newsjs.newsfromdb(db,login.username,0,function(dbnews){
newsSignal(dbnews) newsSignal(dbnews)
})} })}
else{ else{
Newsjs.chatsfromdb(db,login.username,function(dbnews){ Newsjs.chatsfromdb(db,login.username,function(dbnews){
newsSignal(dbnews) newsSignal(dbnews)
})} })}
print(newstab.conversation.length); }
}
else if (newstab.conversation.length>0){newstab.conversation=[]} else if (newstab.conversation.length>0){newstab.conversation=[]}
else if (root.depth>1){root.pop()} else if (root.depth>1){root.pop()}
@ -287,7 +286,6 @@ StackView{
} }
Label{ Label{
text: "\uf08b " +qsTr("Quit") text: "\uf08b " +qsTr("Quit")
font.pixelSize: 4*mm font.pixelSize: 4*mm
width: parent.width width: parent.width
@ -305,9 +303,6 @@ StackView{
} }
} }
Item{ Item{
id:rootStackItem id:rootStackItem
width:parent.width width:parent.width
@ -395,12 +390,12 @@ StackView{
} }
Component.onCompleted: { Component.onCompleted: {
forceActiveFocus(); forceActiveFocus();
Service.readGlobaloptions(db,function(go){globaloptions=go})
//print(xhr.networktype()); //print(xhr.networktype());
if(osSettings.osType=="Android"){ if(osSettings.osType=="Android"){
var component = Qt.createComponent("qrc:/qml/genericqml/IntentReceiver.qml"); var component = Qt.createComponent("qrc:/qml/genericqml/IntentReceiver.qml");
var IntentReceiverQml = component.createObject(root); var IntentReceiverQml = component.createObject(root);
} else if (osSettings.osType=="Linux"){ }
else if (osSettings.osType=="Linux"){
var component = Qt.createComponent("qrc:/qml/genericqml/LinuxSync.qml"); var component = Qt.createComponent("qrc:/qml/genericqml/LinuxSync.qml");
var LinuxSyncQml = component.createObject(root); var LinuxSyncQml = component.createObject(root);
} }

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"
Item { Item {

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import Qt.labs.folderlistmodel 2.1 import Qt.labs.folderlistmodel 2.1
import "qrc:/js/service.js" as Service import "qrc:/js/service.js" as Service
import "qrc:/js/helper.js" as Helperjs import "qrc:/js/helper.js" as Helperjs

View File

@ -12,11 +12,17 @@ Item {
} }
} }
function startSyncTimer(interval){
syncTimer.interval=interval*60000;
//print("synctimer interval "+syncTimer.interval)
syncTimer.start()
}
Component.onCompleted: { Component.onCompleted: {
if (root.globaloptions.hasOwnProperty("syncinterval") && root.globaloptions.syncinterval !=null && root.globaloptions.syncinterval !=0){ if (root.globaloptions.hasOwnProperty("syncinterval") && root.globaloptions.syncinterval !=null && root.globaloptions.syncinterval !=0){
syncTimer.interval=root.globaloptions.syncinterval*60000; startSyncTimer(root.globaloptions.syncinterval)
syncTimer.start()
} }
root.updateSyncinterval.connect(startSyncTimer)
} }
} }

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -29,12 +29,13 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.6 import QtQuick 2.6
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
Button{ Button{
id: mButton id: mButton
width: Math.max(text.width+2*mm,8*mm) width: Math.max(text.width+2*mm,8*mm)
//radius: mm
height: 6*mm height: 6*mm
//color: Material.grey //color: Material.grey
font.pixelSize: 3*mm font.pixelSize: 3*mm
background: Rectangle{color:"#F8F8F8"} background: Rectangle{color:"#F8F8F8";radius: 0.5*mm}
} }

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.7 import QtQuick 2.7
import QtQuick.Controls 1.2 import QtQuick.Controls 2.12
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"
//import "qrc:/js/news.js" as Newsjs //import "qrc:/js/news.js" as Newsjs
//import "qrc:/js/helper.js" as Helperjs //import "qrc:/js/helper.js" as Helperjs

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -31,7 +31,7 @@
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.4 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/genericqml"

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -31,7 +31,7 @@
// ConversationView with button // ConversationView with button
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.4 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/genericqml"
import "qrc:/qml/newsqml" import "qrc:/qml/newsqml"
@ -83,7 +83,7 @@ Rectangle {
} else { conversationBusy.running=false; } else { conversationBusy.running=false;
conversationModel.clear(); conversationModel.clear();
var currentTime= new Date(); var currentTime= new Date();
var msg = {'currentTime': currentTime, 'model': conversationModel,'news':newstab.conversation, 'method':'refresh', 'options':globaloptions}; var msg = {'currentTime': currentTime, 'model': conversationModel,'news':newstab.conversation, 'method':'conversation', 'options':globaloptions};
conversationWorker.sendMessage(msg) conversationWorker.sendMessage(msg)
//conversationsymbol.color="grey" //conversationsymbol.color="grey"
} }
@ -186,7 +186,7 @@ Rectangle {
Component.onCompleted: { Component.onCompleted: {
if (news.length>0){var currentTime= new Date(); if (news.length>0){var currentTime= new Date();
var msg = {'currentTime': currentTime, 'model': conversationModel,'news':news,'appendnews':true, 'options':globaloptions}; var msg = {'currentTime': currentTime, 'model': conversationModel,'news':news,'method':'conversation', 'options':globaloptions};
conversationWorker.sendMessage(msg)} conversationWorker.sendMessage(msg)}
} }
} }

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -32,7 +32,7 @@
// message.qml // message.qml
// message with buttons // message with buttons
import QtQuick 2.4 import QtQuick 2.4
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
//import QtQuick.Dialogs 1.2 //import QtQuick.Dialogs 1.2
import "qrc:/js/helper.js" as Helperjs import "qrc:/js/helper.js" as Helperjs
import "qrc:/js/smiley.js" as Smileyjs import "qrc:/js/smiley.js" as Smileyjs
@ -404,6 +404,7 @@ Rectangle{
visible:false //(bodyField.length>1)||(attachImageURLs.length>0) visible:false //(bodyField.length>1)||(attachImageURLs.length>0)
spacing: mm spacing: mm
height: 12*mm height: 12*mm
x: 0.5*mm
MButton{id:permButton MButton{id:permButton
visible: (newsSwipeview.stacktype!=="DirectMessages") visible: (newsSwipeview.stacktype!=="DirectMessages")
height: 6*mm height: 6*mm
@ -473,7 +474,7 @@ Rectangle{
else{Helperjs.showMessage(qsTr("Error"),qsTr("No receiver supplied!"),root)} else{Helperjs.showMessage(qsTr("Error"),qsTr("No receiver supplied!"),root)}
} }
if (conversation==true){ if (conversation==true){
newstab.newstabstatus=login.newsViewType; newsStack.pop(null) newstab.newstabstatus=root.globaloptions.newsViewType; newsStack.pop(null)
} }
} }
} }

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa // https://github.com/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -42,7 +42,7 @@ AnimatedImage {id:gif;
'Rectangle{id:recfullscreen;color:"white";width:root.width;height:root.height;'+ 'Rectangle{id:recfullscreen;color:"white";width:root.width;height:root.height;'+
'MouseArea {anchors.fill:parent;onClicked:{recfullscreen.destroy()}}'+ 'MouseArea {anchors.fill:parent;onClicked:{recfullscreen.destroy()}}'+
'AnimatedImage {id:giffullscreen;source: "'+gif.source+ 'AnimatedImage {id:giffullscreen;source: "'+gif.source+
'";anchors.centerIn:parent; width:root.width;fillMode: Image.PreserveAspectFit; onStatusChanged: playing = (status == AnimatedImage.Ready);'+ '";anchors.centerIn:parent; width:root.width;height:root.height;fillMode: Image.PreserveAspectFit; onStatusChanged: playing = (status == AnimatedImage.Ready);'+
'}}',root,"Attachmentlarge") '}}',root,"Attachmentlarge")
} }
} }

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.11 import QtQuick 2.11
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import "qrc:/js/news.js" as Newsjs import "qrc:/js/news.js" as Newsjs
import "qrc:/js/helper.js" as Helperjs import "qrc:/js/helper.js" as Helperjs
import "qrc:/js/service.js" as Service import "qrc:/js/service.js" as Service
@ -162,7 +162,7 @@ StackView{
case "Replies":messagetype=3;break; case "Replies":messagetype=3;break;
default:messagetype=0; default:messagetype=0;
} }
if(newstab.newstabstatus=="Timeline"){print("lastnewsid "+lastnews_id); if(newstab.newstabstatus=="Timeline"){//print("lastnewsid "+lastnews_id);
Newsjs.newsfromdb(root.db,root.login, messagetype,function(news){ Newsjs.newsfromdb(root.db,root.login, messagetype,function(news){
var msg = {'currentTime': currentTime, 'model': newsModel,'news':news,'method':"", 'options':globaloptions}; var msg = {'currentTime': currentTime, 'model': newsModel,'news':news,'method':"", 'options':globaloptions};
newsWorker.sendMessage(msg); newsWorker.sendMessage(msg);
@ -187,7 +187,8 @@ StackView{
Connections{ Connections{
target:xhr target:xhr
onError:{ onError:{
Helperjs.showMessage(qsTr("Network Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root); if (data !="contactlist"){Helperjs.showMessage(qsTr("Network Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root);}
newsBusy.running=false;
} }
onSuccess:{ onSuccess:{
// downloadNotice.text=downloadNotice.text+ "\n xhr finished "+Date.now(); // downloadNotice.text=downloadNotice.text+ "\n xhr finished "+Date.now();
@ -385,7 +386,6 @@ StackView{
} }
Component.onCompleted: { Component.onCompleted: {
//print(newsSwipeview.stacktype);
root.newstypeSignal.connect(newstypeHandling); root.newstypeSignal.connect(newstypeHandling);
root.messageSignal.connect(onFriendsMessages); root.messageSignal.connect(onFriendsMessages);
root.contactdetailsSignal.connect(showContact); root.contactdetailsSignal.connect(showContact);
@ -396,7 +396,7 @@ StackView{
newsSwipeview.height=rootStackItem.height-12*mm; newsSwipeview.height=rootStackItem.height-12*mm;
newsSwipeview.y=5*mm; newsSwipeview.y=5*mm;
rootStackItem.state="" rootStackItem.state=""
login.hasOwnProperty("newsViewType")?newstab.newstabstatus=login.newsViewType:"Conversations" root.globaloptions.hasOwnProperty("newsViewType")?newstab.newstabstatus=root.globaloptions.newsViewType:newstab.newstabstatus="Conversations";
var messagetype=0; var messagetype=0;
switch(newsSwipeview.stacktype){ switch(newsSwipeview.stacktype){
case "Home":messagetype=0;break; case "Home":messagetype=0;break;
@ -405,17 +405,17 @@ StackView{
case "Replies":messagetype=3;break; case "Replies":messagetype=3;break;
default:messagetype=0; default:messagetype=0;
} }
if((login.newsViewType=="Conversations")&&(newsSwipeview.stacktype=="Home")){ if((newstab.newstabstatus=="Conversations")&&(newsSwipeview.stacktype=="Home")){
Newsjs.chatsfromdb(db,login,messagetype,function(dbnews,lastid){ Newsjs.chatsfromdb(db,login,messagetype,function(dbnews,lastid){
lastnewsid=lastid; lastnewsid=lastid;
showNews(dbnews); showNews(dbnews);
}) })
} }
else{Newsjs.newsfromdb(db,login,messagetype,function(dbnews,lastid){ else{
Newsjs.newsfromdb(db,login,messagetype,function(dbnews,lastid){
lastnewsid=lastid; lastnewsid=lastid;
showNews(dbnews) showNews(dbnews)
})} })}
//}
} }
} }
} }

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.11 import QtQuick 2.11
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
//import QtQuick.Controls.Styles 2.3 //import QtQuick.Controls.Styles 2.3
//import QtQuick.Dialogs 1.3 //import QtQuick.Dialogs 1.3
import "qrc:/qml/newsqml" import "qrc:/qml/newsqml"
@ -40,25 +40,7 @@ import "qrc:/js/service.js" as Service
Item { Item {
// Connections{ onHeightChanged: {newsSwipeview.height=height-6*mm}
// target:xhr
// onError:{
// Helperjs.showMessage(qsTr("Network Error"),"API:\n" +login.server+api+"\n Return: \n"+data,root);
// }
// onSuccess:{
// if (api=="/api/statuses/friends_timeline"){
// // downloadNotice.text=downloadNotice.text+ "\n xhr finished "+Date.now();
// //Service.processNews(api,data);
// if(login.newsViewType=="Timeline"){
// Newsjs.newsfromdb(db,login.username,function(dbnews){showNews(dbnews)})}
// else{Newsjs.chatsfromdb(db,login.username,function(dbnews){
// showNews(dbnews);
// })}
// }
// }
// }
Timer {id:contacttimer; interval: 50; running: false; repeat: false Timer {id:contacttimer; interval: 50; running: false; repeat: false
onTriggered: { onTriggered: {
// downloadNotice.text=downloadNotice.text + "\n contactTimer start "+ Date.now() // downloadNotice.text=downloadNotice.text + "\n contactTimer start "+ Date.now()
@ -86,6 +68,50 @@ Item {
} }
} }
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 onFriendsMessages(friend){ function onFriendsMessages(friend){
newstab.newstabstatus="Contact" newstab.newstabstatus="Contact"
@ -126,7 +152,6 @@ Item {
height: parent.height-6*mm height: parent.height-6*mm
y: 5*mm y: 5*mm
function onDirectMessage(friend){currentIndex=2} function onDirectMessage(friend){currentIndex=2}
transitions: Transition { transitions: Transition {
PropertyAnimation { properties: "height"; PropertyAnimation { properties: "height";
easing.type: Easing.InOutQuad easing.type: Easing.InOutQuad
@ -167,7 +192,7 @@ Item {
source:(newsSwipeview.currentIndex==3)? "qrc:/qml/newsqml/NewsStack.qml":"" source:(newsSwipeview.currentIndex==3)? "qrc:/qml/newsqml/NewsStack.qml":""
//onLoaded: newsSwipeview.stacktype="Notifications" //onLoaded: newsSwipeview.stacktype="Notifications"
} }
Component.onCompleted: {root.directmessageSignal.connect(onDirectMessage);} Component.onCompleted: {root.directmessageSignal.connect(onDirectMessage)}
} }
PageIndicator { PageIndicator {

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -31,7 +31,7 @@
import QtMultimedia 5.8 import QtMultimedia 5.8
import QtQuick 2.9 import QtQuick 2.9
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
//import QtQuick.Controls.Styles 1.4 //import QtQuick.Controls.Styles 1.4
Rectangle{ Rectangle{

View File

@ -2,7 +2,7 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import "qrc:/js/news.js" as Newsjs import "qrc:/js/news.js" as Newsjs
import "qrc:/js/helper.js" as Helperjs import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"
@ -42,8 +42,10 @@ Item {
property int itemindex: index property int itemindex: index
property var newsitemobject:model.newsitemobject property var newsitemobject:model.newsitemobject
property string attending: "" property string attending: ""
property var friendica_activities_view: getActivitiesView(model.newsitemobject)
onAttendingChanged: {attendLabel.visible=true; onAttendingChanged: {attendLabel.visible=true;
attendLabel.text= qsTr("attending: ")+ qsTr(attending)} attendLabel.text= qsTr("attending")+": "+ qsTr(attending)}
signal replyto(string parent_id) signal replyto(string parent_id)
@ -80,8 +82,8 @@ Item {
// } // }
Column { Column {
id:toprow //newscolumn id:toprow //newscolumn
width: newsitem.width//-8*mm width: newsitemobject.hasOwnProperty("indent")?newsitem.width-(newsitem.width/20 *newsitemobject.indent):newsitem.width//-8*mm
x:newsitemobject.hasOwnProperty("indent")?newsitem.width/20*newsitemobject.indent:0
Item{ Item{
height: Math.max(profileImage.height+mm,topFlow.implicitHeight+mm) height: Math.max(profileImage.height+mm,topFlow.implicitHeight+mm)
width: parent.width width: parent.width
@ -128,7 +130,7 @@ Item {
color: "grey" color: "grey"
font.pixelSize: 1.5*mm font.pixelSize: 1.5*mm
horizontalAlignment: Label.AlignRight horizontalAlignment: Label.AlignRight
text: newsitemobject.dateDiff text: getDateDiffString(newsitemobject.dateDiff) + " " +qsTr("ago")
} }
Label { Label {
id:replytoLabel id:replytoLabel
@ -166,7 +168,7 @@ Item {
// clip:true // clip:true
// height: newsitemobject.nsfw?5*mm:Math.min(implicitHeight,3/4*root.height) // height: newsitemobject.nsfw?5*mm:Math.min(implicitHeight,3/4*root.height)
MouseArea{ MouseArea{
width: newsitem.width-8*mm-2 width: toprow.width-2
height: itemMessage.height height: itemMessage.height
onPressAndHold: { onPressAndHold: {
pushConversation(); pushConversation();
@ -178,7 +180,7 @@ Item {
textFormat: Text.RichText textFormat: Text.RichText
font.family: "Noto Sans" font.family: "Noto Sans"
text: newsitemobject.statusnet_html//newsitemobject.attachmentList.length>0?newsitemobject.text : newsitemobject.statusnet_html text: newsitemobject.statusnet_html//newsitemobject.attachmentList.length>0?newsitemobject.text : newsitemobject.statusnet_html
width: newsitem.width-2 width: toprow.width-2
height:newsitemobject.nsfw?5*mm:Math.min(implicitHeight,3/4*root.height) height:newsitemobject.nsfw?5*mm:Math.min(implicitHeight,3/4*root.height)
//height: implicitHeight //height: implicitHeight
wrapMode: Text.Wrap wrapMode: Text.Wrap
@ -257,7 +259,7 @@ Item {
Label{color: "grey" Label{color: "grey"
height:3.5*mm height:3.5*mm
font.pixelSize: 1.5*mm font.pixelSize: 1.5*mm
text: newsitemobject.friendica_activities_view.likeText text: friendica_activities_view.likeText
MouseArea{ MouseArea{
anchors.fill: parent anchors.fill: parent
onClicked: { showActivityContacts(newsitemobject.friendica_activities.like)} onClicked: { showActivityContacts(newsitemobject.friendica_activities.like)}
@ -266,7 +268,7 @@ Item {
Label{color: "grey" Label{color: "grey"
height:3.5*mm height:3.5*mm
font.pixelSize: 1.5*mm font.pixelSize: 1.5*mm
text: newsitemobject.friendica_activities_view.dislikeText text: friendica_activities_view.dislikeText
MouseArea{ MouseArea{
anchors.fill: parent anchors.fill: parent
onClicked: { showActivityContacts(newsitemobject.friendica_activities.dislike)} onClicked: { showActivityContacts(newsitemobject.friendica_activities.dislike)}
@ -275,7 +277,7 @@ Item {
Label{color: "grey" Label{color: "grey"
height:3.5*mm height:3.5*mm
font.pixelSize: 1.5*mm font.pixelSize: 1.5*mm
text: newsitemobject.friendica_activities_view.attendyesText text: friendica_activities_view.attendyesText
MouseArea{ MouseArea{
anchors.fill: parent anchors.fill: parent
onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendyes)} onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendyes)}
@ -283,7 +285,7 @@ Item {
Label{color: "grey" Label{color: "grey"
height:3.5*mm height:3.5*mm
font.pixelSize: 1.5*mm font.pixelSize: 1.5*mm
text: newsitemobject.friendica_activities_view.attendnoText text: friendica_activities_view.attendnoText
MouseArea{ MouseArea{
anchors.fill: parent anchors.fill: parent
onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendno)} onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendno)}
@ -292,7 +294,7 @@ Item {
Label{color: "grey" Label{color: "grey"
height:3.5*mm height:3.5*mm
font.pixelSize: 1.5*mm font.pixelSize: 1.5*mm
text: newsitemobject.friendica_activities_view.attendmaybeText text: friendica_activities_view.attendmaybeText
MouseArea{ MouseArea{
anchors.fill: parent anchors.fill: parent
onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendmaybe)} onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendmaybe)}
@ -315,7 +317,7 @@ Item {
width:newsitem.width/5 //10*mm width:newsitem.width/5 //10*mm
height: parent.height height: parent.height
visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false visible: ((newsitemobject.messagetype==0)||(newsitemobject.messagetype==3))? true:false
checked:(newsitemobject.friendica_activities_view.self.liked==1)?true:false checked:(model.newsitemobject.friendica_activities_view.self.liked==1)?true:false
indicator: Rectangle{ indicator: Rectangle{
implicitWidth: newsitem.width/5 //10*mm implicitWidth: newsitem.width/5 //10*mm
implicitHeight:4*mm implicitHeight:4*mm
@ -328,8 +330,14 @@ Item {
} }
} }
onClicked: { onClicked: {
if(likeCheckbox.checked==true){Newsjs.like(root.login,root.db,1,"like",newsitemobject.id,root);dislikeCheckbox.checked=false; model.newsitemobject.friendica_activities_view.self.liked=0 } if(likeCheckbox.checked==true){Newsjs.like(root.login,root.db,1,"like",newsitemobject.id,root);dislikeCheckbox.checked=false;
else{Newsjs.like(root.login,root.db,0,"like",newsitemobject.id,root); model.newsitemobject.friendica_activities_view.self.liked=1}} 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{ CheckBox{
id: dislikeCheckbox id: dislikeCheckbox
@ -349,8 +357,14 @@ Item {
} }
} }
onClicked: { onClicked: {
if (dislikeCheckbox.checked==true){Newsjs.like(root.login,root.db,1,"dislike",newsitemobject.id,root);likeCheckbox.checked=false; model.newsitemobject.friendica_activities_view.self.disliked=0} if (dislikeCheckbox.checked==true){Newsjs.like(root.login,root.db,1,"dislike",newsitemobject.id,root);likeCheckbox.checked=false;
else {Newsjs.like(root.login,root.db,0,"dislike",newsitemobject.id,root); model.newsitemobject.friendica_activities_view.self.disliked=1}} 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 { CheckBox {

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 2.3 import QtQuick.Controls 2.12
import "qrc:/js/service.js" as Service import "qrc:/js/service.js" as Service
import "qrc:/js/helper.js" as Helperjs import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.11 import QtQuick 2.11
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import QtQuick.Layouts 1.11 import QtQuick.Layouts 1.11
//import QtQuick.Controls.Styles 1.4 //import QtQuick.Controls.Styles 1.4
import "qrc:/js/smiley.js" as Smileyjs import "qrc:/js/smiley.js" as Smileyjs

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.5 import QtQuick 2.5
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import "qrc:/js/helper.js" as Helperjs import "qrc:/js/helper.js" as Helperjs
import "qrc:/js/image.js" as Imagejs import "qrc:/js/image.js" as Imagejs
import "qrc:/qml/genericqml" import "qrc:/qml/genericqml"

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.5 import QtQuick 2.5
import QtQuick.Controls 1.2 import QtQuick.Controls 2.12
import "qrc:/qml/photoqml" import "qrc:/qml/photoqml"
Package { Package {
@ -84,7 +84,7 @@ Package {
MouseArea { MouseArea {
width: realImage.paintedWidth; height: realImage.paintedHeight; anchors.centerIn: realImage width: realImage.paintedWidth; height: realImage.paintedHeight; anchors.centerIn: realImage
onPressAndHold:{ onPressAndHold:{
var menuString="import QtQuick 2.5;import QtQuick.Controls 1.4; "+ var menuString="import QtQuick 2.5;import QtQuick.Controls 2.12; "+
"Menu {MenuItem {text:qsTr('Delete on client and server'); onTriggered: {"+ "Menu {MenuItem {text:qsTr('Delete on client and server'); onTriggered: {"+
"changeimage('delete','image','"+imageLocation+"');photoModel.remove(index)}}"+ "changeimage('delete','image','"+imageLocation+"');photoModel.remove(index)}}"+
"MenuItem {text:qsTr('Move to album'); onTriggered: {"+ "MenuItem {text:qsTr('Move to album'); onTriggered: {"+

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.5 import QtQuick 2.5
import QtQuick.Controls 2.4 import QtQuick.Controls 2.12
import QtQml.Models 2.1 import QtQml.Models 2.1
import "qrc:/js/image.js" as Imagejs import "qrc:/js/image.js" as Imagejs
import "qrc:/js/helper.js" as Helperjs import "qrc:/js/helper.js" as Helperjs
@ -276,7 +276,7 @@ StackView{
}}} }}}
} }
Rectangle { id: photoBackground; color: 'light grey'; width: parent.width; height: parent.height; opacity: 0; visible: opacity != 0.0 } 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 } ListView { width: parent.width; height:parent.height; model: visualphotoModel.parts.browser; interactive: false }

View File

@ -1,6 +1,6 @@
// This file is part of Friendiqa // This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net> // Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
@ -30,7 +30,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.5 import QtQuick 2.5
import QtQuick.Controls 1.3 import QtQuick.Controls 2.12
import QtQml.Models 2.1 import QtQml.Models 2.1
//import "qrc:/js/service.js" as Service //import "qrc:/js/service.js" as Service
import "qrc:/js/image.js" as Imagejs import "qrc:/js/image.js" as Imagejs

View File

@ -5,108 +5,105 @@
<name>AccountPage</name> <name>AccountPage</name>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="59"/> <location filename="../qml/configqml/AccountPage.qml" line="59"/>
<location filename="../qml/configqml/AccountPage.qml" line="373"/> <location filename="../qml/configqml/AccountPage.qml" line="376"/>
<location filename="../qml/configqml/AccountPage.qml" line="396"/> <location filename="../qml/configqml/AccountPage.qml" line="400"/>
<source>User</source> <source>User</source>
<translation>Name</translation> <translation>Name</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="86"/> <location filename="../qml/configqml/AccountPage.qml" line="87"/>
<source>Server</source> <source>Server</source>
<translation>Server</translation> <translation>Server</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="91"/> <location filename="../qml/configqml/AccountPage.qml" line="92"/>
<source>Nickname</source> <source>Nickname</source>
<translation>Kurzname</translation> <translation>Kurzname</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="97"/> <location filename="../qml/configqml/AccountPage.qml" line="98"/>
<source>Password</source> <source>Password</source>
<translation>Passwort</translation> <translation>Passwort</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="102"/> <location filename="../qml/configqml/AccountPage.qml" line="103"/>
<source>Image dir.</source> <source>Image dir.</source>
<translation>Bildverz.</translation> <translation>Bildverz.</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="113"/>
<source>News as</source> <source>News as</source>
<translation>Anzeige</translation> <translation type="vanished">Anzeige</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="184"/> <location filename="../qml/configqml/AccountPage.qml" line="185"/>
<location filename="../qml/configqml/AccountPage.qml" line="322"/> <location filename="../qml/configqml/AccountPage.qml" line="323"/>
<location filename="../qml/configqml/AccountPage.qml" line="348"/> <location filename="../qml/configqml/AccountPage.qml" line="350"/>
<source>Error</source> <source>Error</source>
<translation>Fehler</translation> <translation>Fehler</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="184"/> <location filename="../qml/configqml/AccountPage.qml" line="185"/>
<source>Nicknames containing @ symbol currently not supported</source> <source>Nicknames containing @ symbol currently not supported</source>
<translation>Kurznamen mit @ Zeichen werden derzeit nicht unterstützt.</translation> <translation>Kurznamen mit @ Zeichen werden derzeit nicht unterstützt.</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="305"/> <location filename="../qml/configqml/AccountPage.qml" line="306"/>
<source>Confirm</source> <source>Confirm</source>
<translation>Bestätigen</translation> <translation>Bestätigen</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="311"/> <location filename="../qml/configqml/AccountPage.qml" line="312"/>
<source>No server given! </source> <source>No server given! </source>
<translation>Kein Server angegeben!</translation> <translation>Kein Server angegeben!</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="312"/> <location filename="../qml/configqml/AccountPage.qml" line="313"/>
<source>No nickname given! </source> <source>No nickname given! </source>
<translation>Kein Kurzname angegeben!</translation> <translation>Kein Kurzname angegeben!</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="313"/> <location filename="../qml/configqml/AccountPage.qml" line="314"/>
<source>No password given! </source> <source>No password given! </source>
<translation>Kein Passwort angegeben!</translation> <translation>Kein Passwort angegeben!</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="314"/> <location filename="../qml/configqml/AccountPage.qml" line="315"/>
<source>No image directory given!</source> <source>No image directory given!</source>
<translation>Kein Verzeichnis für Bilder angegeben!</translation> <translation>Kein Verzeichnis für Bilder angegeben!</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="322"/> <location filename="../qml/configqml/AccountPage.qml" line="323"/>
<source>Wrong password!</source> <source>Wrong password!</source>
<translation>Falsches Passwort!</translation> <translation>Falsches Passwort!</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="343"/> <location filename="../qml/configqml/AccountPage.qml" line="345"/>
<source>Success</source> <source>Success</source>
<translation>Bestätigt</translation> <translation>Bestätigt</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="343"/> <location filename="../qml/configqml/AccountPage.qml" line="345"/>
<source>Name</source> <source>Name</source>
<translation>Name</translation> <translation>Name</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="424"/>
<source>Timeline</source> <source>Timeline</source>
<translation>Chronologisch</translation> <translation type="vanished">Chronologisch</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/AccountPage.qml" line="429"/>
<source>Conversations</source> <source>Conversations</source>
<translation>Unterhaltungen</translation> <translation type="vanished">Unterhaltungen</translation>
</message> </message>
</context> </context>
<context> <context>
<name>CalendarTab</name> <name>CalendarTab</name>
<message> <message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="109"/> <location filename="../qml/calendarqml/CalendarTab.qml" line="124"/>
<source>Events</source> <source>Events</source>
<translation>Termine</translation> <translation>Termine</translation>
</message> </message>
<message> <message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="114"/> <location filename="../qml/calendarqml/CalendarTab.qml" line="129"/>
<source>Own Calendar</source> <source>Own Calendar</source>
<translation>Eigener Kalender</translation> <translation>Eigener Kalender</translation>
</message> </message>
@ -114,17 +111,35 @@
<context> <context>
<name>ConfigPage</name> <name>ConfigPage</name>
<message> <message>
<location filename="../qml/configqml/ConfigPage.qml" line="66"/> <location filename="../qml/configqml/ConfigPage.qml" line="61"/>
<source>News as</source>
<translation>Anzeige</translation>
</message>
<message>
<location filename="../qml/configqml/ConfigPage.qml" line="74"/>
<location filename="../qml/configqml/ConfigPage.qml" line="91"/>
<location filename="../qml/configqml/ConfigPage.qml" line="92"/>
<source>Conversations</source>
<translation>Unterhaltungen</translation>
</message>
<message>
<location filename="../qml/configqml/ConfigPage.qml" line="85"/>
<location filename="../qml/configqml/ConfigPage.qml" line="86"/>
<source>Timeline</source>
<translation>Chronologisch</translation>
</message>
<message>
<location filename="../qml/configqml/ConfigPage.qml" line="99"/>
<source>Max. News</source> <source>Max. News</source>
<translation>Max. Nachr.</translation> <translation>Max. Nachr.</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/ConfigPage.qml" line="127"/> <location filename="../qml/configqml/ConfigPage.qml" line="132"/>
<source>Hide #nsfw?</source> <source>Hide #nsfw?</source>
<translation>#nsfw minimieren?</translation> <translation>#nsfw minimieren?</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/ConfigPage.qml" line="161"/> <location filename="../qml/configqml/ConfigPage.qml" line="52"/>
<source>Sync</source> <source>Sync</source>
<translation>Autom. Aktualisierung</translation> <translation>Autom. Aktualisierung</translation>
</message> </message>
@ -310,6 +325,14 @@
<translation>Erstellt</translation> <translation>Erstellt</translation>
</message> </message>
</context> </context>
<context>
<name>EventList</name>
<message>
<location filename="../qml/calendarqml/EventList.qml" line="119"/>
<source>Location</source>
<translation>Ort</translation>
</message>
</context>
<context> <context>
<name>FriendsTab</name> <name>FriendsTab</name>
<message> <message>
@ -403,20 +426,20 @@
<translation>Woran denkst du gerade?</translation> <translation>Woran denkst du gerade?</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/MessageSend.qml" line="422"/> <location filename="../qml/newsqml/MessageSend.qml" line="423"/>
<location filename="../qml/newsqml/MessageSend.qml" line="473"/> <location filename="../qml/newsqml/MessageSend.qml" line="474"/>
<source>Error</source> <source>Error</source>
<translation>Fehler</translation> <translation>Fehler</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/MessageSend.qml" line="422"/> <location filename="../qml/newsqml/MessageSend.qml" line="423"/>
<source>Only one attachment supported at the moment. <source>Only one attachment supported at the moment.
Remove other attachment first!</source> Remove other attachment first!</source>
<translation>Nur ein Anhang derzeit unterstützt. <translation>Nur ein Anhang derzeit unterstützt.
Lösche zuerst den anderen Anhang!</translation> Lösche zuerst den anderen Anhang!</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/MessageSend.qml" line="473"/> <location filename="../qml/newsqml/MessageSend.qml" line="474"/>
<source>No receiver supplied!</source> <source>No receiver supplied!</source>
<translation>Kein Empfänger angegeben!</translation> <translation>Kein Empfänger angegeben!</translation>
</message> </message>
@ -432,12 +455,12 @@
<context> <context>
<name>NewsStack</name> <name>NewsStack</name>
<message> <message>
<location filename="../qml/newsqml/NewsStack.qml" line="189"/> <location filename="../qml/newsqml/NewsStack.qml" line="190"/>
<source>Network Error</source> <source>Network Error</source>
<translation>Netzwerk-Fehler</translation> <translation>Netzwerk-Fehler</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/NewsStack.qml" line="237"/> <location filename="../qml/newsqml/NewsStack.qml" line="239"/>
<source>More</source> <source>More</source>
<translation>Mehr</translation> <translation>Mehr</translation>
</message> </message>
@ -496,26 +519,125 @@
<source>Quit</source> <source>Quit</source>
<translation type="vanished">Schliessen</translation> <translation type="vanished">Schliessen</translation>
</message> </message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="73"/>
<source>seconds</source>
<translation>Sekunden</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="74"/>
<source>minute</source>
<translation>Minute</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="75"/>
<source>minutes</source>
<translation>Minuten</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="76"/>
<source>hour</source>
<translation>Stunde</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="77"/>
<source>hours</source>
<translation>Stunden</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="78"/>
<source>day</source>
<translation>Tag</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="79"/>
<source>days</source>
<translation>Tage</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="80"/>
<source>month</source>
<translation>Monat</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="81"/>
<source>months</source>
<translation>Monate</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="82"/>
<source>years</source>
<translation>Jahre</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="91"/>
<source>likes this.</source>
<translation>mag das.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="92"/>
<source>like this.</source>
<translation>mögen das.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="95"/>
<source>doesn&apos;t like this.</source>
<translation>mag das nicht.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="96"/>
<source>don&apos;t like this.</source>
<translation>mögen das nicht.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="99"/>
<source>will attend.</source>
<translation>nehmen teil.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="100"/>
<source>persons will attend.</source>
<translation>Personen nehmen teil.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="103"/>
<source>will not attend.</source>
<translation>nimmt nicht teil.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="104"/>
<source>persons will not attend.</source>
<translation>Personen nehmen nicht teil.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="107"/>
<source>may attend.</source>
<translation>nimmt vielleicht teil.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="108"/>
<source>persons may attend.</source>
<translation>Personen nehmen vielleicht teil.</translation>
</message>
</context> </context>
<context> <context>
<name>Newsitem</name> <name>Newsitem</name>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="46"/>
<source>attending: </source> <source>attending: </source>
<translation>Teilnahme</translation> <translation type="vanished">Teilnahme</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="123"/> <location filename="../qml/newsqml/Newsitem.qml" line="125"/>
<source>Source: </source> <source>Source: </source>
<translation>Quelle: </translation> <translation>Quelle: </translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="123"/> <location filename="../qml/newsqml/Newsitem.qml" line="125"/>
<source>Direct Message</source> <source>Direct Message</source>
<translation>Direktnachricht</translation> <translation>Direktnachricht</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="139"/> <location filename="../qml/newsqml/Newsitem.qml" line="141"/>
<source>In reply to </source> <source>In reply to </source>
<translation>Antwort an </translation> <translation>Antwort an </translation>
</message> </message>
@ -524,57 +646,67 @@
<translation type="vanished"> Kommentare</translation> <translation type="vanished"> Kommentare</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="307"/> <location filename="../qml/newsqml/Newsitem.qml" line="48"/>
<source>attending</source>
<translation>partecipare</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="133"/>
<source>ago</source>
<translation>her</translation>
</message>
<message>
<location filename="../qml/newsqml/Newsitem.qml" line="309"/>
<source>Attending: </source> <source>Attending: </source>
<translation>Teilnahme: </translation> <translation>Teilnahme: </translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="432"/> <location filename="../qml/newsqml/Newsitem.qml" line="446"/>
<source>Reply</source> <source>Reply</source>
<translation>Antworten</translation> <translation>Antworten</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="444"/> <location filename="../qml/newsqml/Newsitem.qml" line="458"/>
<source>DM</source> <source>DM</source>
<translation>Direktnachricht</translation> <translation>Direktnachricht</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="450"/> <location filename="../qml/newsqml/Newsitem.qml" line="464"/>
<source>Repost</source> <source>Repost</source>
<translation>Teilen</translation> <translation>Teilen</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="453"/> <location filename="../qml/newsqml/Newsitem.qml" line="467"/>
<source>Success!</source> <source>Success!</source>
<translation>Erledigt!</translation> <translation>Erledigt!</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="458"/> <location filename="../qml/newsqml/Newsitem.qml" line="472"/>
<source>Conversation</source> <source>Conversation</source>
<translation>Unterhaltung</translation> <translation>Unterhaltung</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="465"/> <location filename="../qml/newsqml/Newsitem.qml" line="479"/>
<source>Attending</source> <source>Attending</source>
<translation>Teilnahme</translation> <translation>Teilnahme</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="474"/> <location filename="../qml/newsqml/Newsitem.qml" line="488"/>
<source>yes</source> <source>yes</source>
<translation>ja</translation> <translation>ja</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="479"/> <location filename="../qml/newsqml/Newsitem.qml" line="493"/>
<source>maybe</source> <source>maybe</source>
<translation>vielleicht</translation> <translation>vielleicht</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="484"/> <location filename="../qml/newsqml/Newsitem.qml" line="498"/>
<source>no</source> <source>no</source>
<translation>nein</translation> <translation>nein</translation>
</message> </message>
<message> <message>
<location filename="../qml/newsqml/Newsitem.qml" line="491"/> <location filename="../qml/newsqml/Newsitem.qml" line="505"/>
<source>Delete</source> <source>Delete</source>
<translation>Löschen</translation> <translation>Löschen</translation>
</message> </message>
@ -883,12 +1015,12 @@
<context> <context>
<name>SyncConfig</name> <name>SyncConfig</name>
<message> <message>
<location filename="../qml/configqml/SyncConfig.qml" line="42"/> <location filename="../qml/configqml/SyncConfig.qml" line="45"/>
<source>Sync Interval (0=None)</source> <source>Sync Interval (0=None)</source>
<translation>Akt.-intervall (0=keine)</translation> <translation>Akt.-intervall (0=keine)</translation>
</message> </message>
<message> <message>
<location filename="../qml/configqml/SyncConfig.qml" line="74"/> <location filename="../qml/configqml/SyncConfig.qml" line="78"/>
<source>Min.</source> <source>Min.</source>
<translation>Min.</translation> <translation>Min.</translation>
</message> </message>
@ -896,57 +1028,57 @@
<context> <context>
<name>friendiqa</name> <name>friendiqa</name>
<message> <message>
<location filename="../qml/friendiqa.qml" line="159"/> <location filename="../qml/friendiqa.qml" line="158"/>
<source>Refresh</source> <source>Refresh</source>
<translation>Aktualisieren</translation> <translation>Aktualisieren</translation>
</message> </message>
<message> <message>
<location filename="../qml/friendiqa.qml" line="176"/> <location filename="../qml/friendiqa.qml" line="175"/>
<source>Timeline</source> <source>Timeline</source>
<translation>Chronologisch</translation> <translation>Chronologisch</translation>
</message> </message>
<message> <message>
<location filename="../qml/friendiqa.qml" line="189"/> <location filename="../qml/friendiqa.qml" line="188"/>
<source>Conversations</source> <source>Conversations</source>
<translation>Unterhaltungen</translation> <translation>Unterhaltungen</translation>
</message> </message>
<message> <message>
<location filename="../qml/friendiqa.qml" line="202"/> <location filename="../qml/friendiqa.qml" line="201"/>
<source>Favorites</source> <source>Favorites</source>
<translation>Markierte News</translation> <translation>Markierte News</translation>
</message> </message>
<message> <message>
<location filename="../qml/friendiqa.qml" line="214"/> <location filename="../qml/friendiqa.qml" line="213"/>
<source>Replies</source> <source>Replies</source>
<translation>Interaktionen</translation> <translation>Interaktionen</translation>
</message> </message>
<message> <message>
<location filename="../qml/friendiqa.qml" line="228"/> <location filename="../qml/friendiqa.qml" line="227"/>
<source>Public Timeline</source> <source>Public Timeline</source>
<translation>öff. Timeline</translation> <translation>öff. Timeline</translation>
</message> </message>
<message> <message>
<location filename="../qml/friendiqa.qml" line="241"/> <location filename="../qml/friendiqa.qml" line="240"/>
<source>Group news</source> <source>Group news</source>
<translation>News Gruppe</translation> <translation>News Gruppe</translation>
</message> </message>
<message> <message>
<location filename="../qml/friendiqa.qml" line="254"/> <location filename="../qml/friendiqa.qml" line="253"/>
<source>Search</source> <source>Search</source>
<translation>Suche</translation> <translation>Suche</translation>
</message> </message>
<message> <message>
<location filename="../qml/friendiqa.qml" line="267"/> <location filename="../qml/friendiqa.qml" line="266"/>
<source>Settings</source> <source>Settings</source>
<translation>Einstellungen</translation> <translation>Einstellungen</translation>
</message> </message>
<message> <message>
<location filename="../qml/friendiqa.qml" line="278"/> <location filename="../qml/friendiqa.qml" line="277"/>
<source>Accounts</source> <source>Accounts</source>
<translation>Konten</translation> <translation>Konten</translation>
</message> </message>
<message> <message>
<location filename="../qml/friendiqa.qml" line="291"/> <location filename="../qml/friendiqa.qml" line="289"/>
<source>Quit</source> <source>Quit</source>
<translation>Schliessen</translation> <translation>Schliessen</translation>
</message> </message>
@ -954,133 +1086,99 @@
<context> <context>
<name>newsworker</name> <name>newsworker</name>
<message> <message>
<location filename="../js/newsworker.js" line="48"/>
<source>likes this.</source> <source>likes this.</source>
<translation>mag das.</translation> <translation type="vanished">mag das.</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="49"/>
<source>like this.</source> <source>like this.</source>
<translation>mögen das.</translation> <translation type="vanished">mögen das.</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="52"/>
<source>doesn&apos;t like this.</source> <source>doesn&apos;t like this.</source>
<translation>mag das nicht.</translation> <translation type="vanished">mag das nicht.</translation>
</message>
<message>
<source>don&apos;t like this.</source>
<translation type="vanished">mögen das nicht.</translation>
</message>
<message>
<source>will attend.</source>
<translation type="vanished">nehmen teil.</translation>
</message>
<message>
<source>persons will attend.</source>
<translation type="vanished">Personen nehmen teil.</translation>
</message>
<message>
<source>will not attend.</source>
<translation type="vanished">nimmt nicht teil.</translation>
</message>
<message>
<source>persons will not attend.</source>
<translation type="vanished">Personen nehmen nicht teil.</translation>
</message>
<message>
<source>may attend.</source>
<translation type="vanished">nimmt vielleicht teil.</translation>
</message>
<message>
<source>persons may attend.</source>
<translation type="vanished">Personen nehmen vielleicht teil.</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="53"/> <location filename="../js/newsworker.js" line="53"/>
<source>don&apos;t like this.</source>
<translation>mögen das nicht.</translation>
</message>
<message>
<location filename="../js/newsworker.js" line="56"/>
<source>will attend.</source>
<translation>nehmen teil.</translation>
</message>
<message>
<location filename="../js/newsworker.js" line="57"/>
<source>persons will attend.</source>
<translation>Personen nehmen teil.</translation>
</message>
<message>
<location filename="../js/newsworker.js" line="60"/>
<source>will not attend.</source>
<translation>nimmt nicht teil.</translation>
</message>
<message>
<location filename="../js/newsworker.js" line="61"/>
<source>persons will not attend.</source>
<translation>Personen nehmen nicht teil.</translation>
</message>
<message>
<location filename="../js/newsworker.js" line="64"/>
<source>may attend.</source>
<translation>nimmt vielleicht teil.</translation>
</message>
<message>
<location filename="../js/newsworker.js" line="65"/>
<source>persons may attend.</source>
<translation>Personen nehmen vielleicht teil.</translation>
</message>
<message>
<location filename="../js/newsworker.js" line="69"/>
<source>yes</source> <source>yes</source>
<translation>ja</translation> <translation>ja</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="70"/> <location filename="../js/newsworker.js" line="54"/>
<source>no</source> <source>no</source>
<translation>nein</translation> <translation>nein</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="71"/> <location filename="../js/newsworker.js" line="55"/>
<source>maybe</source> <source>maybe</source>
<translation>vielleicht</translation> <translation>vielleicht</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="162"/>
<source>seconds</source> <source>seconds</source>
<translation>Sekunden</translation> <translation type="vanished">Sekunden</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="162"/>
<location filename="../js/newsworker.js" line="163"/>
<location filename="../js/newsworker.js" line="164"/>
<location filename="../js/newsworker.js" line="165"/>
<location filename="../js/newsworker.js" line="166"/>
<location filename="../js/newsworker.js" line="167"/>
<location filename="../js/newsworker.js" line="168"/>
<location filename="../js/newsworker.js" line="169"/>
<location filename="../js/newsworker.js" line="170"/>
<location filename="../js/newsworker.js" line="171"/>
<source>ago</source> <source>ago</source>
<translation>her</translation> <translation type="vanished">her</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="163"/>
<source>minute</source> <source>minute</source>
<translation>Minute</translation> <translation type="vanished">Minute</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="164"/>
<source>minutes</source> <source>minutes</source>
<translation>Minuten</translation> <translation type="vanished">Minuten</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="165"/>
<source>hour</source> <source>hour</source>
<translation>Stunde</translation> <translation type="vanished">Stunde</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="166"/>
<source>hours</source> <source>hours</source>
<translation>Stunden</translation> <translation type="vanished">Stunden</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="167"/>
<source>day</source> <source>day</source>
<translation>Tag</translation> <translation type="vanished">Tag</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="168"/>
<source>days</source> <source>days</source>
<translation>Tage</translation> <translation type="vanished">Tage</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="169"/>
<source>month</source> <source>month</source>
<translation>Monat</translation> <translation type="vanished">Monat</translation>
</message> </message>
<message> <message>
<location filename="../js/newsworker.js" line="170"/>
<source>months</source> <source>months</source>
<translation>Monate</translation> <translation type="vanished">Monate</translation>
</message>
<message>
<location filename="../js/newsworker.js" line="171"/>
<source>years</source>
<translation></translation>
</message> </message>
</context> </context>
<context> <context>
@ -1090,12 +1188,22 @@
<translation type="vanished">Fehler</translation> <translation type="vanished">Fehler</translation>
</message> </message>
<message> <message>
<location filename="../js/service.js" line="398"/> <location filename="../js/service.js" line="366"/>
<source>Changelog</source>
<translation>Änderungen</translation>
</message>
<message>
<location filename="../js/service.js" line="366"/>
<source>Setting view type of news has moved from account page to config page.</source>
<translation>Die Einstellung der Ansichtsart von Nachrichten wurde von der Kontoseite auf die Konfigurationsseite verschoben.</translation>
</message>
<message>
<location filename="../js/service.js" line="432"/>
<source>Undefined Array Error</source> <source>Undefined Array Error</source>
<translation>Antwort-Array ungültig</translation> <translation>Antwort-Array ungültig</translation>
</message> </message>
<message> <message>
<location filename="../js/service.js" line="401"/> <location filename="../js/service.js" line="435"/>
<source>JSON status Error</source> <source>JSON status Error</source>
<translation>Server-Antwort: Fehler</translation> <translation>Server-Antwort: Fehler</translation>
</message> </message>

Some files were not shown because too many files have changed in this diff Show More