Native colors and new message create window

This commit is contained in:
LubuWest 2023-07-27 21:52:16 +02:00
commit 2debd8f2ab
122 changed files with 3525 additions and 3122 deletions

View file

@ -1,8 +1,8 @@
## v0.6.8
* OAuth
* New translation: netherland
* OAuth2 as signup method
* New translation: Dutch
## v0.6.7
@ -210,4 +210,4 @@
# Translations
* German, Spanish
* German, Spanish

View file

@ -127,7 +127,8 @@ ToDo
* [Google Playstore](https://play.google.com/store/apps/details?id=org.qtproject.friendiqa)
* Arch User Repository: <https://aur.archlinux.org/packages/friendiqa/>
* Flatpak: <https://friendiqa.ma-nic.de/friendiqa.flatpakref>
* Flatpak for Mobile Linux: <https://friendiqa.ma-nic.de/friendiqaMobile.flatpakref>
## License
Pubished under the [GPL v3](http://gplv3.fsf.org) with the exception of the Openssl library, which is published under OpenSSL License.
Pubished under the [GPL v3](http://gplv3.fsf.org) with the exception of the Openssl library, which is published under OpenSSL License.

View file

@ -1,6 +1,6 @@
<?xml version="1.0"?>
<manifest package="org.qtproject.friendiqa" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.6.8" android:versionCode="34" android:installLocation="auto">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="31"/>
<!--<uses-sdk android:minSdkVersion="24" android:targetSdkVersion="33"/> -->
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
@ -132,5 +132,9 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
</manifest>

View file

@ -6,7 +6,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.2'
classpath "com.android.tools.build:gradle:4.1.0"
}
}
@ -25,7 +25,7 @@ dependencies {
}
dependencies {
compile 'androidx.appcompat:appcompat:1.1.0'
compile 'androidx.appcompat:appcompat:1.4.2'
}
android {
@ -44,8 +44,14 @@ android {
compileSdkVersion androidCompileSdkVersion.toInteger()
buildToolsVersion '28.0.3'
buildToolsVersion '31.0.0'
compileSdkVersion 33
defaultConfig {
minSdkVersion 26
targetSdkVersion 31
resConfigs "en"
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
@ -67,10 +73,6 @@ android {
aaptOptions {
noCompress 'rcc'
}
defaultConfig {
resConfigs "en"
}
}
apply from: "androidnative.gradle"
setAndroidNativePath("/../androidnative.pri");

View file

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View file

@ -10,15 +10,15 @@ import org.qtproject.qt5.android.QtNative;
//import androidnative.friendiqa.FriendiqaQtService;
public class FriendiqaService extends JobService{
private static String TAG = "AndroidNative";
private static String TAG = "FriendiqaService";
//Log.e(TAG,"Service");
@Override
public boolean onStartJob(JobParameters params) {
//Log.d(TAG,"Friendiqa JobService");
Log.d(TAG,"Friendiqa JobService");
Context context = this.getApplicationContext();
AndroidNativeService fs = new AndroidNativeService();
AndroidNativeService fs = new AndroidNativeService();
fs.startQtService(context);
jobFinished(params,false);
//Intent serviceIntent = new Intent(this, AndroidNativeService.class);

View file

@ -1,62 +0,0 @@
import QtQuick 2.2
import QtQuick.Window 2.1
import QuickAndroid 0.1
import QuickAndroid.Styles 0.1
import "./theme"
Page {
objectName: "ComponentPage";
property var pages: [
{
name: "Image Picker",
demo: "imagePicker/ImagePickerDemo.qml",
description: "Pick photo via Java language binding"
},{
name: "Toast",
demo: "toast/ToastDemo.qml",
description: "Toast Demonstration"
},{
name: "Notification",
demo: "notification/NotificationDemo.qml",
description: "Demonstrate how to use SystemDispatcher to send notification"
},{
name: "Information",
demo: "info/InfoDemo.qml",
description: "Android System Information"
},{
name: "Status Bar",
demo: "statusbar/StatusBarDemo.qml",
description: "Config Status Bar"
}
];
actionBar: ActionBar {
id : actionBar
iconSource: A.drawable("ic_menu",Constants.black87)
title: "AndroidNative Component List"
showIcon: false
actionButtonEnabled: false
}
VisualDataModel {
id: visualDataModel
delegate: ListItem {
title: modelData.name
subtitle: modelData.description
onClicked: {
present(Qt.resolvedUrl(modelData.demo));
}
}
model: pages;
}
ListView {
anchors.fill: parent
model : visualDataModel
}
}

View file

@ -1,25 +0,0 @@
AndroidNative Example Program
=====================
Prerequisites
-------------
* Qt Android SDK >= 5.6
* Android SDK
Check this article for how to setup Qt and Android SDK:
[Getting Started with Qt for Android](http://qt-project.org/doc/qt-5/androidgs.html)
Build Instruction
-----------------
1. Run `qpm install` to get required packages
1. Open androidnativeexample.pro by Qt Creator
1. Press the "Projects" tab. Make sure the "Android for xxx" kit has been selected
1. Plug a Android device to your computer
1. Press "Build" -> "Run"
1. The program will be deployed to your device. It is so easy!
![Screenshot](https://raw.githubusercontent.com/benlau/androidnative.pri/master/docs/screenshots/example1.png)

View file

@ -1,56 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<manifest package="androidnative.example" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto">
<application android:hardwareAccelerated="true"
android:name="org.qtproject.qt5.android.bindings.QtApplication"
android:theme="@style/AppTheme"
android:label="Android Native Example" android:icon="@drawable/icon">
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation"
android:name="androidnative.example.ExampleActivity"
android:label="Android Native Example"
android:screenOrientation="portrait"
android:theme="@style/AppTheme"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data android:name="android.app.lib_name" android:value="androidnativeexample"/>
<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.qt_libs_resource_id" android:resource="@array/qt_libs"/>
<meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
<!-- Deploy Qt libs as part of package -->
<meta-data android:name="android.app.bundle_local_qt_libs" android:value="1"/>
<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 -->
<meta-data android:name="android.app.use_local_qt_libs" android:value="1"/>
<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="plugins/platforms/android/libqtforandroid.so:lib/libQt5QuickParticles.so"/>
<meta-data android:name="android.app.load_local_jars" android:value="jar/QtAndroid.jar:jar/QtAndroidAccessibility.jar:jar/QtAndroid-bundled.jar:jar/QtAndroidAccessibility-bundled.jar"/>
<meta-data android:name="android.app.static_init_classes" android:value=""/>
<!-- 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_needed_msg" android:name="android.app.ministro_needed_msg"/>
<meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
<!-- Messages maps -->
<!-- Splash screen -->
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/>
<!-- Splash screen -->
</activity>
</application>
<uses-sdk android:minSdkVersion="18" android:targetSdkVersion="21"/>
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
<!-- 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. -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 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. -->
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
</manifest>

View file

@ -1,34 +0,0 @@
// Obtain androidPackageSourceDir
// androidPackageSourceDir is the absolute path of the folder containing build.gradle and AndroidManifests.xml
// This code also works with androiddeployqt.
import groovy.json.JsonSlurper
String getAndroidPackageSourceDir() {
String res = System.getProperty("user.dir");
FileTree tree = fileTree(dir: res + "/..").include("android*deployment-settings.json");
if (tree.getFiles().size() > 0) {
def inputFile = tree.getFiles().toArray()[0];
def InputJSON = new JsonSlurper().parseText(inputFile.text);
res = InputJSON["android-package-source-directory"]
} else {
println("android*deployment-settings.json not found. Set androidPackageSourceDir to user.dir");
}
return res;
}
String setAndroidNativePath(String path) {
String androidPackageSourceDir = getAndroidPackageSourceDir();
String androidNativePath = androidPackageSourceDir + path + "/java/src";
LinkedHashSet hash = android.sourceSets.main.java.srcDirs;
hash.add(androidNativePath);
android.sourceSets.main.java.srcDirs = hash;
}
ext {
setAndroidNativePath = this.&setAndroidNativePath;
}

View file

@ -1,60 +0,0 @@
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}
}
allprojects {
repositories {
jcenter()
}
}
apply plugin: 'com.android.application'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
android {
/*******************************************************
* The following variables:
* - androidBuildToolsVersion,
* - androidCompileSdkVersion
* - qt5AndroidDir - holds the path to qt android files
* needed to build any Qt application
* on Android.
*
* are defined in gradle.properties file. This file is
* updated by QtCreator and androiddeployqt tools.
* Changing them manually might break the compilation!
*******************************************************/
compileSdkVersion androidCompileSdkVersion.toInteger()
buildToolsVersion androidBuildToolsVersion
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']
aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']
res.srcDirs = [qt5AndroidDir + '/res', 'res']
resources.srcDirs = ['src']
renderscript.srcDirs = ['src']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
}
lintOptions {
abortOnError false
}
}
apply from: "androidnative.gradle"
setAndroidNativePath("/../../..");

View file

@ -1,9 +0,0 @@
## This file is automatically generated by QtCreator.
#
# This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
androidBuildToolsVersion=25.0.3
androidCompileSdkVersion=25
buildDir=.build
qt5AndroidDir=/home/pankraz/Qt/5.9.1/android_armv7/src/android/java

View file

@ -1,6 +0,0 @@
#Thu Feb 16 01:04:18 HKT 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2-all.zip

View file

@ -1,160 +0,0 @@
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

View file

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

View file

@ -1,6 +0,0 @@
## This file is automatically generated by QtCreator.
#
# This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
sdk.dir=/home/pankraz/android-sdk_alt

View file

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle" >
<solid android:color="#FFFFFFFF"/>
</shape>
</item>
<item>
<bitmap android:src="@drawable/icon"
android:gravity="center" />
</item>
</layer-list>

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash</item>
</style>
</resources>

View file

@ -1,25 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<array name="qt_sources">
<item>https://download.qt-project.org/ministro/android/qt5/qt-5.4</item>
</array>
<!-- The following is handled automatically by the deployment tool. It should
not be edited manually. -->
<array name="bundled_libs">
<!-- %%INSERT_EXTRA_LIBS%% -->
</array>
<array name="qt_libs">
<!-- %%INSERT_QT_LIBS%% -->
</array>
<array name="bundled_in_lib">
<!-- %%INSERT_BUNDLED_IN_LIB%% -->
</array>
<array name="bundled_in_assets">
<!-- %%INSERT_BUNDLED_IN_ASSETS%% -->
</array>
</resources>

View file

@ -1,16 +0,0 @@
package androidnative.example;
import androidnative.AndroidNativeActivity;
/**
* Created by benlau on 8/3/2017.
*/
public class ExampleActivity extends AndroidNativeActivity {
public ExampleActivity() {
super();
QT_ANDROID_THEMES = new String[] {""};
QT_ANDROID_DEFAULT_THEME = "";
}
}

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(R.drawable.icon);
}
m_builder.setContentTitle(title);
m_builder.setContentText(message);
m_notificationManager.notify(1, m_builder.build());
// Test function. Remove it later.
SystemDispatcher.dispatch("Notifier.notifyFinished");
} catch (Exception e) {
Log.d("",e.getMessage());
}
};
};
activity.runOnUiThread(runnable);
}
private void hapticFeedbackPerform(Map data) {
final Activity activity = QtNative.activity();
final Map messageData = data;
Runnable runnable = new Runnable () {
public void run() {
int feedbackConstant = (Integer) messageData.get("feedbackConstant");
int flags = (Integer) messageData.get("flags");
Log.d("",String.format("hapticFeedbackPerform(%d,%d)",feedbackConstant,flags));
View rootView = activity.getWindow().getDecorView().getRootView();
rootView.performHapticFeedback(feedbackConstant, flags);
// Test function. Remove it later.
SystemDispatcher.dispatch("hapticFeedbackPerformFinished");
};
};
activity.runOnUiThread(runnable);
}
public void onDispatched(String name , Map data) {
if (name.equals("Notifier.notify")) {
notificationManagerNotify(data);
return;
} else if (name.equals("hapticFeedbackPerform")) {
hapticFeedbackPerform(data);
return;
}
return;
}
});
}
}

View file

@ -1,38 +0,0 @@
TEMPLATE = app
QT += qml quick
SOURCES += main.cpp \
debugwrapper.cpp
RESOURCES += qml.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH += ../..
android {
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources
}
# include(vendor/vendor.pri)
# Default rules for deployment.
include(deployment.pri)
include(../../androidnative.pri)
include(../../../../../../quickandroid/quickandroid.pri)
DISTFILES += \
android-sources/AndroidManifest.xml \
android-sources/src/quickandroid/example/ExampleService.java \
README.md \
android-sources/gradle/wrapper/gradle-wrapper.jar \
android-sources/gradlew \
android-sources/res/values/libs.xml \
android-sources/build.gradle \
android-sources/gradle/wrapper/gradle-wrapper.properties \
android-sources/gradlew.bat \
android-sources/settings.gradle \
android-sources/src/androidnative/example/ExampleService.java
HEADERS += \
../../README.md \
debugwrapper.h

View file

@ -1,392 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.4.0, 2017-10-23T22:04:08. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{8825bc46-5cad-4a59-be78-bf9eeaa7217a}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap"/>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Android</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Android</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{8e3757e7-5698-4d0f-9f13-55359b1a832e}</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/pankraz/build/debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Anwendungsdaten kopieren</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.AndroidPackageInstallationStep</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.3">
<value type="QString" key="BuildTargetSdk">android-25</value>
<value type="QString" key="KeystoreLocation"></value>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Android-APK erstellen</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QmakeProjectManager.AndroidBuildApkStep</value>
<value type="int" key="Qt4ProjectManager.AndroidDeployQtStep.DeployQtAction">2</value>
<value type="bool" key="UseGradle">true</value>
<value type="bool" key="VerboseOutput">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">4</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/pankraz/ownCloud/clientsync/Friendiqa/v0.005/source-android/androidnative.pri/examples/build-androidnativeexample-Android-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Anwendungsdaten kopieren</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.AndroidPackageInstallationStep</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.3">
<value type="QString" key="BuildTargetSdk">android-25</value>
<value type="QString" key="KeystoreLocation"></value>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Android-APK erstellen</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QmakeProjectManager.AndroidBuildApkStep</value>
<value type="int" key="Qt4ProjectManager.AndroidDeployQtStep.DeployQtAction">2</value>
<value type="bool" key="UseGradle">true</value>
<value type="bool" key="VerboseOutput">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">4</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/pankraz/ownCloud/clientsync/Friendiqa/v0.005/source-android/androidnative.pri/examples/build-androidnativeexample-Android-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Anwendungsdaten kopieren</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.AndroidPackageInstallationStep</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.3">
<value type="QString" key="BuildTargetSdk">android-25</value>
<value type="QString" key="KeystoreLocation"></value>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Android-APK erstellen</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QmakeProjectManager.AndroidBuildApkStep</value>
<value type="int" key="Qt4ProjectManager.AndroidDeployQtStep.DeployQtAction">2</value>
<value type="bool" key="UseGradle">true</value>
<value type="bool" key="VerboseOutput">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">4</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deployment auf Android-Gerät</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.AndroidDeployQtStep</value>
<value type="bool" key="UninstallPreviousPackage">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deployment</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deployment auf Android-Gerät</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deployment auf Android-Gerät</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.AndroidDeployConfiguration2</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings">
<value type="QString" key="AndroidDeviceSerialNumber">CB5A22HSB9</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<valuelist type="QVariantList" key="Android.AmStartArgsKey"/>
<valuelist type="QVariantList" key="Android.PostFinishShellCmdListKey"/>
<valuelist type="QVariantList" key="Android.PreStartShellCmdListKey"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">androidnativeexample</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.AndroidRunConfiguration:/home/pankraz/ownCloud/clientsync/Friendiqa/v0.005/source-android/androidnative.pri/examples/androidnativeexample/androidnativeexample.pro</value>
<value type="QString" key="QMakeProjectManager.QmakeAndroidRunConfiguration.ProFile">androidnativeexample.pro</value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">18</value>
</data>
<data>
<variable>Version</variable>
<value type="int">18</value>
</data>
</qtcreator>

View file

@ -1,17 +0,0 @@
#include "debugwrapper.h"
#include "AndroidNative/debug.h"
DebugWrapper::DebugWrapper(QObject *parent) : QObject(parent)
{
}
long DebugWrapper::getNativeHeapSize() const
{
return AndroidNative::Debug::getNativeHeapSize();
}
long DebugWrapper::getNativeHeapAllocatedSize() const
{
return AndroidNative::Debug::getNativeHeapAllocatedSize();
}

View file

@ -1,20 +0,0 @@
#ifndef DEBUGWRAPPER_H
#define DEBUGWRAPPER_H
#include <QObject>
class DebugWrapper : public QObject
{
Q_OBJECT
public:
explicit DebugWrapper(QObject *parent = 0);
signals:
public slots:
long getNativeHeapSize() const;
long getNativeHeapAllocatedSize() const;
};
#endif // DEBUGWRAPPER_H

View file

@ -1,27 +0,0 @@
android-no-sdk {
target.path = /data/user/qt
export(target.path)
INSTALLS += target
} else:android {
x86 {
target.path = /libs/x86
} else: armeabi-v7a {
target.path = /libs/armeabi-v7a
} else {
target.path = /libs/armeabi
}
export(target.path)
INSTALLS += target
} else:unix {
isEmpty(target.path) {
qnx {
target.path = /tmp/$${TARGET}/bin
} else {
target.path = /opt/$${TARGET}/bin
}
export(target.path)
}
INSTALLS += target
}
export(INSTALLS)

View file

@ -1,38 +0,0 @@
import QtQuick 2.0
import QuickAndroid 0.1
import QuickAndroid.Styles 0.1
import "../theme"
Page {
actionBar: ActionBar {
id: actionBar
upEnabled: true
title: qsTr("Dialog Demo")
showTitle: true
onActionButtonClicked: back();
z: 10
}
Button {
id: label
text : "Press to launch dialog"
anchors.centerIn: parent
onClicked: {
dialog.open();
}
}
Dialog {
id: dialog
anchors.centerIn: parent
title: "Dialog"
Text {
text: "Demo"
}
z: 20
acceptButtonText: "OK"
}
}

View file

@ -1,77 +0,0 @@
import QtQuick 2.0
import QuickAndroid 0.1
import AndroidNative 1.0 as AN
import "../theme"
Page {
id: demo
actionBar: ActionBar {
title: "Image Picker Demo"
onActionButtonClicked: back();
}
AN.ImagePicker {
id: imagePicker;
multiple : true
}
Rectangle {
anchors.fill: parent
color: Constants.black100
Image {
id: image
anchors.fill: parent
source: imagePicker.imageUrl
fillMode: Image.PreserveAspectFit
visible: imagePicker.imageUrls.length <= 1
}
Grid {
columns: 3
spacing: 0
visible: !image.visible
Repeater {
model: imagePicker.imageUrls
delegate: Image {
width: demo.width / 3
height: width / 4 * 3
source: modelData
asynchronous: true
fillMode: Image.PreserveAspectCrop
}
}
}
Column {
anchors.right: parent.right
anchors.rightMargin: 16 * A.dp
anchors.bottom: parent.bottom
anchors.bottomMargin: 32 * A.dp
spacing: 16 * A.dp
FloatingActionButton {
iconSource: A.drawable("ic_camera",Constants.black87);
size: Constants.small
backgroundColor: Constants.white100
onClicked: {
imagePicker.takePhoto();
}
}
FloatingActionButton {
iconSource: A.drawable("ic_image",Constants.black87);
size: Constants.small
backgroundColor: Constants.white100
onClicked: {
imagePicker.pickImage();
}
}
}
}
}

View file

@ -1,55 +0,0 @@
import QtQuick 2.0
import QuickAndroid 0.1
import QuickAndroid.Styles 0.1
import "../theme"
Page {
id: page
actionBar: ActionBar {
id: actionBar
upEnabled: true
title: qsTr("Information")
showTitle: true
onActionButtonClicked: back();
z: 10
}
VisualItemModel {
id: itemModel
ListItem {
title: "Environment.DIRECTORY_DCIM"
subtitle: Environment.DIRECTORY_DCIM
interactive: false
width: page.width
}
ListItem {
title: "Debug.getNativeHeapSize"
subtitle: (Debug.getNativeHeapSize() / 1024 / 1024).toFixed(2) + "MB";
interactive: false
width: page.width
}
ListItem {
title: "Debug.getNativeHeapAllocatedSize"
subtitle: (Debug.getNativeHeapAllocatedSize() / 1024 / 1024).toFixed(2) + "MB";
interactive: false
width: page.width
}
ListItem {
title: "QThread.idealThreadCount"
subtitle: Misc.idealThreadCount;
interactive: false
width: page.width
}
}
ListView {
anchors.fill: parent
model: itemModel
}
}

View file

@ -1,72 +0,0 @@
#include <QtCore>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QQmlContext>
#include <QSettings>
//#include "qadrawableprovider.h"
#include "AndroidNative/systemdispatcher.h"
#include "AndroidNative/environment.h"
#include "AndroidNative/debug.h"
#include "AndroidNative/mediascannerconnection.h"
#include "debugwrapper.h"
using namespace AndroidNative;
#ifdef Q_OS_ANDROID
#include <QtAndroidExtras/QAndroidJniObject>
#include <QtAndroidExtras/QAndroidJniEnvironment>
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) {
Q_UNUSED(vm);
qDebug("NativeInterface::JNI_OnLoad()");
// It must call this function within JNI_OnLoad to enable System Dispatcher
SystemDispatcher::registerNatives();
return JNI_VERSION_1_6;
}
#endif
int main(int argc, char *argv[])
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
QGuiApplication app(argc, argv);
app.setApplicationName("Android Native Example");
app.setOrganizationDomain("com.github.benlau.androidnative");
QSettings settings;
settings.setValue("firstTimeLoading", false);
settings.sync();
QVariantMap env;
env["DIRECTORY_DCIM"] = Environment::getExternalStoragePublicDirectory(Environment::DIRECTORY_DCIM);
QVariantMap misc;
misc["idealThreadCount"] = QThread::idealThreadCount();
MediaScannerConnection::scanFile("");
SystemDispatcher::instance()->loadClass("androidnative.example.ExampleService");
QQmlApplicationEngine engine;
/* QuickAndroid Initialization */
engine.addImportPath("qrc:///"); // Add QuickAndroid into the import path
engine.rootContext()->setContextProperty("Environment", env);
engine.rootContext()->setContextProperty("Misc", misc);
engine.rootContext()->setContextProperty("Debug", new DebugWrapper(&engine));
/* End of QuickAndroid Initialization */
// Extra features:
//QADrawableProvider* provider = new QADrawableProvider();
//provider->setBasePath("qrc://res");
//engine.addImageProvider("drawable",provider);
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
return app.exec();
}

View file

@ -1,76 +0,0 @@
import QtQuick 2.2
import QtQuick.Window 2.2
import QuickAndroid 0.1
import QuickAndroid.Styles 0.1
import "./theme"
Window {
id: window;
width: 480
height: 640
color: "#FFFFFF"
visible: false;
/* Fast Splash Screen Setup Instruction
1. Create a custom theme (apptheme.qml) and set windowBackground to @drawable/splash.xml (Your splash screen drawable)
2. Within AndroidManifest.xml, set android.app.splash_screen_drawable to @drawable/splash.xml
<!-- Splash screen -->
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/>
<!-- Splash screen -->
That will show a splash screen while Qt is loading. However, screen flicker will happen when your Window
item is shown. To prevent screen flicker completely, you could setup your main.qml accoroding to step 3.
3. In your main.qml (the one with Window component)
3.1. Set Window.color to a color which is similar to splash screen / Theme.windowBackground
3.2. Set visible of Window to false until your content is loaded. (Keep Android splash screen while loading)
3.3. Use an asynchronous Loader for your content. Set opacity to 0.
3.4. Once everything is ready, set Window.visible to true and perform a fade-in animation on Loader
*/
Loader {
id: loader
parent: null
width: window.width
height: window.height
asynchronous: true
opacity: 0
focus: true;
sourceComponent: PageStack {
id: stack
objectName: "PageStack";
initialPage: Components {
onPresented: {
window.visible = true;
A.setTimeout(function() {
loader.parent = window.contentItem;
loader.opacity = 1;
}, 34);
}
}
}
Behavior on opacity {
NumberAnimation {
duration: 200
easing.type: Easing.OutQuad;
}
}
}
Component.onCompleted: {
ThemeManager.currentTheme = AppTheme
}
}

View file

@ -1,30 +0,0 @@
import QtQuick 2.2
import QtQuick.Window 2.1
import QuickAndroid 0.1
import QuickAndroid.Styles 0.1
import AndroidNative 1.0 as AN
import "../theme"
Page {
actionBar: ActionBar {
id : actionBar
title: "Notification"
z: 10
upEnabled: true
onActionButtonClicked: back();
}
Button {
id: label
text : "Press to send notification"
anchors.centerIn: parent
onClicked: {
AN.SystemDispatcher.dispatch("Notifier.notify",{
title: "Quick Android Example",
message: "Hello!"
});
}
}
}

View file

@ -1,31 +0,0 @@
<RCC>
<qresource prefix="/">
<file>main.qml</file>
<file>res/drawable-hdpi/icon.png</file>
<file>Components.qml</file>
<file>res/drawable-xxhdpi/ic_menu.png</file>
<file>dialog/DialogDemo.qml</file>
<file>notification/NotificationDemo.qml</file>
<file>theme/AppTheme.qml</file>
<file>theme/qmldir</file>
<file>res/drawable-hdpi/ic_android_black_48dp.png</file>
<file>res/drawable-xxhdpi/ic_android_black_48dp.png</file>
<file>res/drawable-mdpi/ic_android_black_48dp.png</file>
<file>res/drawable-xhdpi/ic_android_black_48dp.png</file>
<file>res/drawable-xxxhdpi/ic_android_black_48dp.png</file>
<file>res/drawable-hdpi/ic_done_black_24dp.png</file>
<file>res/drawable-mdpi/ic_done_black_24dp.png</file>
<file>res/drawable-xhdpi/ic_done_black_24dp.png</file>
<file>res/drawable-xxhdpi/ic_done_black_24dp.png</file>
<file>res/drawable-xxxhdpi/ic_done_black_24dp.png</file>
<file>theme/ActionBarBackground.qml</file>
<file>res/drawable-xxhdpi/ic_keyboard_backspace.png</file>
<file>res/drawable-xxhdpi/ic_arrow_back.png</file>
<file>res/drawable-xxhdpi/ic_image.png</file>
<file>res/drawable-xxhdpi/ic_camera.png</file>
<file>imagePicker/ImagePickerDemo.qml</file>
<file>info/InfoDemo.qml</file>
<file>toast/ToastDemo.qml</file>
<file>statusbar/StatusBarDemo.qml</file>
</qresource>
</RCC>

View file

@ -1,10 +0,0 @@
{
"name": "",
"description": "",
"dependencies": [
"com.github.benlau.quickandroid@0.1.7"
],
"license": "NONE",
"pri_filename": "",
"webpage": ""
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 B

View file

@ -1,47 +0,0 @@
import QtQuick 2.2
import QtQuick.Window 2.1
import QtQuick.Controls 2.1 as QQC2
import QuickAndroid 0.1
import QuickAndroid.Styles 0.1
import AndroidNative 1.0 as AN
import "../theme"
Page {
actionBar: ActionBar {
id : actionBar
title: "Status Bar"
z: 10
upEnabled: true
onActionButtonClicked: back();
}
Column {
anchors.centerIn: parent
QQC2.Switch {
text: "Translucent Status Bar"
checked: false
onCheckedChanged: {
AN.SystemDispatcher.dispatch("androidnative.Util.setTranslucentStatusBar", {value: checked});
}
}
QQC2.Switch {
text: "Status Bar Visible"
checked: true
onCheckedChanged: {
AN.SystemDispatcher.dispatch("androidnative.Util.setFullScreen", {value: checked});
}
}
}
Component.onCompleted: {
AN.SystemDispatcher.loadClass("androidnative.Util");
}
}

View file

@ -1,17 +0,0 @@
import QtQuick 2.0
import QuickAndroid 0.1
Item {
MaterialShadow {
asynchronous: true
anchors.fill: parent
depth: 1
}
Rectangle {
color: "#cddc39" // Lime 500
anchors.fill: parent
}
}

View file

@ -1,33 +0,0 @@
import QtQuick 2.0
import QuickAndroid 0.1
import QuickAndroid.Styles 0.1
pragma Singleton
Theme {
mediumText.textSize: 18 * A.dp
smallText.textSize : 14 * A.dp
colorPrimary: "#cddc39" // Lime 500
textColorPrimary: Constants.black87
windowBackground: "#eeeeee";
// The default icon of ActionBar is a "back" image
actionBar.iconSource: A.drawable("ic_arrow_back",Constants.black87)
// Background with shadow
actionBar.background: ActionBarBackground {
}
// actionBar.title.textSize is not allowed in QML. You should declare your own TextMaterial and assign directly.
// or modify text , smallText , mediumText and largetText
actionBar.title : customTextMaterial1;
actionBar.iconSourceSize: Qt.size(24 * A.dp , 24 * A.dp)
// Custom Style object.
TextMaterial {
id : customTextMaterial1
textSize: 18 * A.dp
textColor : Constants.black87
}
}

View file

@ -1,2 +0,0 @@
module theme
singleton AppTheme 0.1 AppTheme.qml

View file

@ -1,33 +0,0 @@
import QtQuick 2.2
import QtQuick.Window 2.1
import QuickAndroid 0.1
import QuickAndroid.Styles 0.1
import AndroidNative 1.0 as AN
import "../theme"
Page {
actionBar: ActionBar {
id : actionBar
title: "Toast"
z: 10
upEnabled: true
onActionButtonClicked: back();
}
AN.Toast {
id: toast
text: "Toast"
longDuration: true
}
Button {
id: label
text : "Press to show toast"
anchors.centerIn: parent
onClicked: {
toast.show();
}
}
}

View file

@ -10,6 +10,7 @@ import android.content.Context;
import android.Manifest.permission;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidnative.AndroidNativeService;
/** An alternative Activity class for Qt applicaiton.
@ -18,7 +19,8 @@ import androidx.core.content.ContextCompat;
public class AndroidNativeActivity extends org.qtproject.qt5.android.bindings.QtActivity {
public static final int MY_PERMISSIONS_REQUEST_READ_STORAGE = 0x245285a8;
public static final int MY_PERMISSIONS_REQUEST_POST_NOTIFICATIONS = 0x245285a9;
private static final String TAG = "AndroidNativeActivity";
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
@ -29,6 +31,11 @@ public class AndroidNativeActivity extends org.qtproject.qt5.android.bindings.Qt
protected void onResume() {
super.onResume();
AndroidNativeService fs = new AndroidNativeService();
fs.startQtService(this);
//if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
@ -75,19 +82,29 @@ public class AndroidNativeActivity extends org.qtproject.qt5.android.bindings.Qt
@Override public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
Log.d(TAG,"onRequestPermissionsResult");
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_STORAGE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Map message = new HashMap();
message.put("multiple",false);
SystemDispatcher.dispatch("androidnative.ImagePicker.pickImage",message);
} else {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Map message = new HashMap();
message.put("multiple",false);
SystemDispatcher.dispatch("androidnative.ImagePicker.pickImage",message);
} else {
}
}
case MY_PERMISSIONS_REQUEST_POST_NOTIFICATIONS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Map message = new HashMap();
message.put("multiple",false);
SystemDispatcher.dispatch("androidnative.Util.setPostNotification",message);
} else {
}
}
return;
}
}
}

View file

@ -20,14 +20,14 @@ public class AndroidNativeService extends QtService
private static String TAG = "AndroidNative";
public void startQtService(Context ctx) {
//Log.d(TAG, "QtActivity active "+String.valueOf(QtNative.activity()!=null));
Log.d(TAG, "QtActivity active "+String.valueOf(QtNative.activity()!=null));
if (QtNative.activity()==null){
//Log.d(TAG,"Friendiqasync Stop existing QtService");
Log.d(TAG,"Friendiqasync Stop existing QtService");
ctx.stopService(new Intent(ctx, AndroidNativeService.class));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//Log.d(TAG,"Friendiqasync startForegroundService");
Log.d(TAG,"Friendiqasync startForegroundService");
ctx.startForegroundService(new Intent(ctx, AndroidNativeService.class));
} else {
ctx.startService(new Intent(ctx, AndroidNativeService.class));
@ -35,7 +35,7 @@ public class AndroidNativeService extends QtService
}
public static void stopQtService(Context ctx) {
//Log.d(TAG,"Friendiqasync QtServiceStop");
Log.d(TAG,"Friendiqasync QtServiceStop");
ctx.stopService(new Intent(ctx, AndroidNativeService.class));
}
@ -44,11 +44,12 @@ public class AndroidNativeService extends QtService
{
Context context;
context = this.getApplicationContext();
Log.d(TAG,"Friendiqa onCreate");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Intent intent = new Intent(context,FriendiqaActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE);
String CHANNEL_ID = "channel_02";
NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
"Sync Channel",

View file

@ -25,6 +25,11 @@ import android.content.Intent;
import java.util.Map;
import org.qtproject.friendiqa.R;
import android.content.pm.PackageManager;
import android.Manifest;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class Util {
private static final String TAG = "androidnative.Util";
@ -33,7 +38,8 @@ public class Util {
public static final String SET_FULL_SCREEN = "androidnative.Util.setFullScreen";
public static final String SET_SCHEDULE = "androidnative.Util.setSchedule";
public static final String SET_NOTIFICATION = "androidnative.Util.setNotification";
public static final String SET_POST_NOTIFICATION = "androidnative.Util.setPostNotification";
public static final int MY_PERMISSIONS_REQUEST_POST_NOTIFICATIONS = 0x245285a9;
static {
SystemDispatcher.addListener(new SystemDispatcher.Listener() {
@ -46,6 +52,8 @@ public class Util {
setSchedule(message);
} else if (type.equals(SET_NOTIFICATION)) {
setNotification(message);
} else if (type.equals(SET_POST_NOTIFICATION)) {
setPostNotification(message);
}
}
});
@ -110,14 +118,14 @@ public class Util {
}
static void setNotification(Map message) {
//Log.d(TAG,"setNotification");
Log.d(TAG,"setNotification");
Context context;
//Context appcontext;
context = QtNative.service().getApplicationContext();
//appcontext = QtNative.activity().getApplicationContext();
Intent intent = new Intent(context,FriendiqaActivity.class);
//intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE);
final String textTitle = (String) message.get("title");
final String textContent = (String) message.get("message");
@ -171,14 +179,23 @@ public class Util {
} else {
context = QtNative.activity().getApplicationContext();
}
//AndroidNativeService fs = new AndroidNativeService();
//fs.startQtService(context);
if (value==0){
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.cancelAll();
//Log.d(TAG,"Friendiqasync deleting Androidnative jobscheduler");
Log.d(TAG,"Friendiqasync deleting Androidnative jobscheduler");
} else {
//Log.d(TAG,"Friendiqasync schedule Androidnative jobscheduler");
Log.d(TAG,"Friendiqasync schedule Androidnative jobscheduler");
ComponentName component = new ComponentName(context, FriendiqaService.class);
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
//Log.d(TAG,"Jobinfolist size " + String.valueOf(jobScheduler.getAllPendingJobs().size()));
if (jobScheduler.getAllPendingJobs().size()==0){
JobInfo.Builder builder = new JobInfo.Builder(2, component)
@ -186,7 +203,7 @@ public class Util {
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setPersisted(true)
.setPrefetch(true);
//Log.d(TAG,"Friendiqa schedule Androidnative sync schedule"+ (value * ONE_MIN));
Log.d(TAG,"1 Friendiqa schedule Androidnative sync schedule"+ (value * ONE_MIN));
jobScheduler.schedule(builder.build());
} else {
for ( JobInfo jobInfo : jobScheduler.getAllPendingJobs() ) {
@ -197,23 +214,42 @@ public class Util {
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setPersisted(true)
.setPrefetch(true);
//Log.d(TAG,"Friendiqa schedule Androidnative sync schedule"+ (value * ONE_MIN));
Log.d(TAG,"2 Friendiqa schedule Androidnative sync schedule"+ (value * ONE_MIN));
jobScheduler.schedule(builder.build());
}
}
}
//Log.d(TAG,"Active service " + String.valueOf(QtNative.service()!=null));
if (QtNative.service() != null){
//Log.d(TAG,"Schedule Stopping Friendiqa Androidnative service");
ComponentName componentStopper = new ComponentName(context, FriendiqaStopService.class);
JobInfo.Builder stopbuilder = new JobInfo.Builder(1, componentStopper)
.setMinimumLatency(50)
.setOverrideDeadline(100);
//if (QtNative.service() != null){
// Log.d(TAG,"Schedule Stopping Friendiqa Androidnative service");
// ComponentName componentStopper = new ComponentName(context, FriendiqaStopService.class);
// JobInfo.Builder stopbuilder = new JobInfo.Builder(1, componentStopper)
// .setMinimumLatency(50)
// .setOverrideDeadline(100);
JobScheduler jobStopScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobStopScheduler.schedule(stopbuilder.build());
}
// JobScheduler jobStopScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
// jobStopScheduler.schedule(stopbuilder.build());
//}
}
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
notificationManager.cancelAll();
//context.stopService(new Intent(context, AndroidNativeService.class));
}
static void setPostNotification(Map message) {
Log.d(TAG,"setPostNotification");
Context context;
if (QtNative.activity() == null){
context = QtNative.service().getApplicationContext();
} else {
context = QtNative.activity().getApplicationContext();
}
Activity activity = org.qtproject.qt5.android.QtNative.activity();
Log.d(TAG,String.valueOf(ContextCompat.checkSelfPermission(context,Manifest.permission.POST_NOTIFICATIONS)));
if (ContextCompat.checkSelfPermission(context,Manifest.permission.POST_NOTIFICATIONS)!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
Log.d(TAG,String.valueOf(PackageManager.PERMISSION_GRANTED));
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.POST_NOTIFICATIONS},MY_PERMISSIONS_REQUEST_POST_NOTIFICATIONS);
}
}
}

View file

@ -1 +1 @@
/home/pankraz/ownCloud/clientsync/Friendiqa/v0.6/source-linux/common/oauth.cpp
../../source-linux/common/oauth.cpp

View file

@ -1 +1 @@
/home/pankraz/ownCloud/clientsync/Friendiqa/v0.6/source-linux/common/oauth.h
../../source-linux/common/oauth.h

View file

@ -1,8 +1,8 @@
cmake_minimum_required(VERSION 3.1.0)
cmake_minimum_required(VERSION 3.16.0)
project(friendiqa VERSION 0.6 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
@ -13,35 +13,38 @@ if(CMAKE_VERSION VERSION_LESS "3.7.0")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
endif()
find_package(Qt5 COMPONENTS Widgets Quick Sql DBus NetworkAuth REQUIRED)
find_package(Qt6 REQUIRED COMPONENTS Core Widgets Quick QuickControls2 Sql DBus NetworkAuth REQUIRED)
qt_standard_project_setup()
set(MOC_SOURCES common/uploadableimage.h
common/xhr.h
common/filesystem.h
common/remoteauthasyncimageprovider.h
common/updatenews.h
common/alarm.h
common/oauth.h)
common/oauth.h
common/documenthandler.h)
set(SOURCES common/friendiqa.cpp
common/uploadableimage.cpp
common/xhr.cpp
common/filesystem.cpp
common/remoteauthasyncimageprovider.cpp
common/updatenews.cpp
common/alarmlinux.cpp
common/oauth.cpp)
common/oauth.cpp
common/documenthandler.cpp)
include_directories(common)
add_executable(friendiqa ${SOURCES} ${MOC_SOURCES} application.qrc)
qt_add_executable(friendiqa ${SOURCES} ${MOC_SOURCES} application.qrc)
target_link_libraries(friendiqa Qt::Core)
target_link_libraries(friendiqa Qt::Widgets)
target_link_libraries(friendiqa Qt::Quick)
target_link_libraries(friendiqa Qt::Sql)
target_link_libraries(friendiqa Qt::DBus)
target_link_libraries(friendiqa Qt::NetworkAuth)
target_link_libraries(friendiqa PRIVATE Qt6::Core)
target_link_libraries(friendiqa PRIVATE Qt6::Widgets)
target_link_libraries(friendiqa PRIVATE Qt6::Quick)
target_link_libraries(friendiqa PRIVATE Qt6::QuickControls2)
target_link_libraries(friendiqa PRIVATE Qt6::Sql)
target_link_libraries(friendiqa PRIVATE Qt6::DBus)
target_link_libraries(friendiqa PRIVATE Qt6::NetworkAuth)
install(TARGETS friendiqa DESTINATION ${CMAKE_INSTALL_BINDIR})
install(FILES images/de.manic.Friendiqa.desktop DESTINATION share/applications)

View file

@ -47,6 +47,7 @@ void ALARM::setAlarm(int interval)
QVariantMap message;
message["value"] = interval;
AndroidNative::SystemDispatcher::instance()->loadClass("androidnative.Util");
AndroidNative::SystemDispatcher::instance()->dispatch("androidnative.Util.setPostNotification", message);
AndroidNative::SystemDispatcher::instance()->dispatch("androidnative.Util.setSchedule", message);
AndroidNative::SystemDispatcher::instance()->dispatch("androidnative.Util.stopService", message);
}

View file

@ -0,0 +1,262 @@
// This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa
// Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// In addition, as a special exception, the copyright holders give
// permission to link the code of portions of this program with the
// OpenSSL library under certain conditions as described in each
// individual source file, and distribute linked combinations including
// the two.
//
// You must obey the GNU General Public License in all respects for all
// of the code used other than OpenSSL. If you modify file(s) with this
// exception, you may extend this exception to your version of the
// file(s), but you are not obligated to do so. If you do not wish to do
// so, delete this exception statement from your version. If you delete
// this exception statement from all source files in the program, then
// also delete it here.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <QQuickTextDocument>
#include <QTextCharFormat>
#include <QStringDecoder>
#include <QTextDocument>
#include <QTextDocumentFragment>
#include <QTextList>
#include <QDebug>
#include "documenthandler.h"
DocumentHandler::DocumentHandler(QObject *parent)
: QObject(parent)
, m_document(nullptr)
, m_cursorPosition(-1)
, m_selectionStart(0)
, m_selectionEnd(0)
{
}
QQuickTextDocument *DocumentHandler::document() const
{
return m_document;
}
void DocumentHandler::setDocument(QQuickTextDocument *document)
{
if (document == m_document)
return;
if (m_document)
disconnect(m_document->textDocument(), &QTextDocument::modificationChanged, this, &DocumentHandler::modifiedChanged);
m_document = document;
if (m_document)
connect(m_document->textDocument(), &QTextDocument::modificationChanged, this, &DocumentHandler::modifiedChanged);
emit documentChanged();
}
int DocumentHandler::cursorPosition() const
{
return m_cursorPosition;
}
void DocumentHandler::setCursorPosition(int position)
{
if (position == m_cursorPosition)
return;
m_cursorPosition = position;
emit cursorPositionChanged();
}
int DocumentHandler::selectionStart() const
{
return m_selectionStart;
}
void DocumentHandler::setSelectionStart(int position)
{
if (position == m_selectionStart)
return;
m_selectionStart = position;
emit selectionStartChanged();
}
int DocumentHandler::selectionEnd() const
{
return m_selectionEnd;
}
void DocumentHandler::setSelectionEnd(int position)
{
if (position == m_selectionEnd)
return;
m_selectionEnd = position;
emit selectionEndChanged();
}
QTextCursor DocumentHandler::textCursor() const
{
QTextDocument *doc = textDocument();
if (!doc)
return QTextCursor();
QTextCursor cursor = QTextCursor(doc);
if (m_selectionStart != m_selectionEnd) {
cursor.setPosition(m_selectionStart);
cursor.setPosition(m_selectionEnd, QTextCursor::KeepAnchor);
} else {
cursor.setPosition(m_cursorPosition);
}
return cursor;
}
QTextDocument *DocumentHandler::textDocument() const
{
if (!m_document)
return nullptr;
return m_document->textDocument();
}
void DocumentHandler::mergeFormatOnWordOrSelection(const QTextCharFormat &format)
{
QTextCursor cursor = textCursor();
if (!cursor.hasSelection())
cursor.select(QTextCursor::WordUnderCursor);
cursor.mergeCharFormat(format);
}
bool DocumentHandler::modified() const
{
return m_document && m_document->textDocument()->isModified();
}
void DocumentHandler::setModified(bool m)
{
if (m_document)
m_document->textDocument()->setModified(m);
}
QFont DocumentHandler::font() const
{
QTextCursor cursor = textCursor();
if (cursor.isNull())
return m_document->textDocument()->defaultFont();
QTextCharFormat format = cursor.charFormat();
return format.font();
}
void DocumentHandler::setFont(const QFont & font){
QTextCursor cursor = textCursor();
if (!cursor.isNull() && cursor.charFormat().font() == font)
return;
QTextCharFormat format;
format.setFont(font);
mergeFormatOnWordOrSelection(format);
emit fontChanged();
}
bool DocumentHandler::bold() const
{
const QTextCursor cursor = textCursor();
if (cursor.isNull())
return m_document->textDocument()->defaultFont().bold();
return cursor.charFormat().font().bold();
}
void DocumentHandler::setBold(bool bold)
{
const QTextCursor cursor = textCursor();
if (!cursor.isNull() && cursor.charFormat().font().bold() == bold)
return;
QFont font = cursor.charFormat().font();
font.setBold(bold);
QTextCharFormat format;
format.setFont(font);
mergeFormatOnWordOrSelection(format);
emit boldChanged();
}
bool DocumentHandler::italic() const
{
const QTextCursor cursor = textCursor();
if (cursor.isNull())
return m_document->textDocument()->defaultFont().italic();
return cursor.charFormat().font().italic();
}
void DocumentHandler::setItalic(bool italic)
{
const QTextCursor cursor = textCursor();
if (!cursor.isNull() && cursor.charFormat().font().italic() == italic)
return;
QFont font = cursor.charFormat().font();
font.setItalic(italic);
QTextCharFormat format;
format.setFont(font);
mergeFormatOnWordOrSelection(format);
emit italicChanged();
}
bool DocumentHandler::liststyle() const
{
const QTextCursor cursor = textCursor();
if (cursor.isNull())
return false;
return bool(cursor.currentList());
}
void DocumentHandler::setListstyle(bool liststyle)
{
QTextCursor cursor = textCursor();
if (!cursor.isNull() && !liststyle){
cursor.currentList()->remove(cursor.block());
emit liststyleChanged();
}else{
cursor.createList(QTextListFormat::ListDisc);
emit liststyleChanged();
}
}
bool DocumentHandler::codeblock() const
{
const QTextCursor cursor = textCursor();
if (cursor.isNull())
return false;
qDebug()<< QTextDocumentFragment(cursor).toPlainText();
return bool(QTextDocumentFragment(cursor).toMarkdown().contains("```"));
}
void DocumentHandler::setCodeblock(bool codeblock)
{
QTextCursor cursor = textCursor();
if (!cursor.isNull() && !codeblock){
qDebug()<< "!codeblock ```\n" + QTextDocumentFragment(cursor).toMarkdown() + "\n```";
cursor.insertMarkdown("```\n" + QTextDocumentFragment(cursor).toMarkdown() + "\n```");
emit codeblockChanged();
}
else{
qDebug()<< "```\n" + QTextDocumentFragment(cursor).toMarkdown() + "\n```";
cursor.insertMarkdown(QTextDocumentFragment(cursor).toMarkdown().remove("```"));
emit codeblockChanged();
}
}

View file

@ -0,0 +1,114 @@
// This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa
// Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// In addition, as a special exception, the copyright holders give
// permission to link the code of portions of this program with the
// OpenSSL library under certain conditions as described in each
// individual source file, and distribute linked combinations including
// the two.
//
// You must obey the GNU General Public License in all respects for all
// of the code used other than OpenSSL. If you modify file(s) with this
// exception, you may extend this exception to your version of the
// file(s), but you are not obligated to do so. If you do not wish to do
// so, delete this exception statement from your version. If you delete
// this exception statement from all source files in the program, then
// also delete it here.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef DOCUMENTHANDLER_H
#define DOCUMENTHANDLER_H
//#include <QFont>
#include <QObject>
#include <QTextCursor>
#include <QTextDocument>
#include <QQuickTextDocument>
//QT_BEGIN_NAMESPACE
//class QTextDocument;
//class QQuickTextDocument;
//QT_END_NAMESPACE
class DocumentHandler : public QObject{
Q_OBJECT
Q_PROPERTY(QQuickTextDocument *document READ document WRITE setDocument NOTIFY documentChanged)
Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition NOTIFY cursorPositionChanged)
Q_PROPERTY(int selectionStart READ selectionStart WRITE setSelectionStart NOTIFY selectionStartChanged)
Q_PROPERTY(int selectionEnd READ selectionEnd WRITE setSelectionEnd NOTIFY selectionEndChanged)
Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)
Q_PROPERTY(bool bold READ bold WRITE setBold NOTIFY boldChanged)
Q_PROPERTY(bool italic READ italic WRITE setItalic NOTIFY italicChanged)
Q_PROPERTY(bool liststyle READ liststyle WRITE setListstyle NOTIFY liststyleChanged)
Q_PROPERTY(bool codeblock READ codeblock WRITE setCodeblock NOTIFY codeblockChanged)
Q_PROPERTY(bool modified READ modified WRITE setModified NOTIFY modifiedChanged)
public:
explicit DocumentHandler(QObject *parent = nullptr);
QQuickTextDocument *document() const;
void setDocument(QQuickTextDocument *document);
int cursorPosition() const;
void setCursorPosition(int position);
int selectionStart() const;
void setSelectionStart(int position);
int selectionEnd() const;
void setSelectionEnd(int position);
QFont font() const;
void setFont(const QFont & font);
bool bold() const;
void setBold(bool bold);
bool italic() const;
void setItalic(bool italic);
bool liststyle() const;
void setListstyle(bool liststyle);
bool modified() const;
void setModified(bool m);
bool codeblock() const;
void setCodeblock(bool codeblock);
signals:
void documentChanged();
void cursorPositionChanged();
void selectionStartChanged();
void selectionEndChanged();
void fontChanged();
void boldChanged();
void italicChanged();
void liststyleChanged();
void codeblockChanged();
void error(const QString &message);
void modifiedChanged();
private:
QTextCursor textCursor() const;
QTextDocument *textDocument() const;
void mergeFormatOnWordOrSelection(const QTextCharFormat &format);
QQuickTextDocument *m_document;
int m_cursorPosition;
int m_selectionStart;
int m_selectionEnd;
};
#endif // DOCUMENTHANDLER_H

View file

@ -177,7 +177,13 @@ void FILESYSTEM::setAutostart(bool autostart) {
QString FILESYSTEM::osType() const
{
return QSysInfo::productType();
QString m_osType;
if(QSysInfo::productType()==QString("android")){
m_osType="Android";
}else{
m_osType="Linux";
}
return m_osType;
}
QString FILESYSTEM::hostname() const

View file

@ -31,6 +31,7 @@
#include <QApplication>
#include <QtQml/QQmlEngine>
#include <QtQml/qqml.h>
//#include <QtWebEngine>
//#include <QAndroidService>
//#include <QtAndroid>
@ -38,9 +39,10 @@
#include "xhr.h"
#include "updatenews.h"
#include "filesystem.h"
#include "remoteauthasyncimageprovider.h"
//#include "remoteauthasyncimageprovider.h"
#include "alarm.h"
#include "oauth.h"
#include "documenthandler.h"
//#include "AndroidNative/systemdispatcher.h"
//#include "AndroidNative/environment.h"
//#include "AndroidNative/debug.h"
@ -48,6 +50,7 @@
//#include <QQuickWidget>
#include <QSystemTrayIcon>
#include <QQmlContext>
#include <QQuickStyle>
// Declare a user-defined data type to work with an icon in QML
Q_DECLARE_METATYPE(QSystemTrayIcon::ActivationReason)
@ -59,11 +62,11 @@ Q_DECLARE_METATYPE(QSystemTrayIcon::ActivationReason)
#include <QtAndroidExtras/QAndroidJniEnvironment>
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) {
Q_UNUSED(vm);
qDebug("NativeInterface::JNI_OnLoad()"); // It must call this function within JNI_OnLoad to enable System Dispatcher
qDebug("NativeInterface::JNI_OnLoad()"); // It must call this function within JNI_OnLoad to enable System Dispatcher
AndroidNative::SystemDispatcher::registerNatives();
return JNI_VERSION_1_6;
}
AndroidNative::SystemDispatcher::registerNatives();
return JNI_VERSION_1_6;
}
#endif
@ -83,45 +86,47 @@ int main(int argc, char *argv[]) {
//return app.exec();
}
else{
//QtWebEngine::initialize();
QApplication app(argc, argv);
QQmlApplicationEngine view;
//QQuickView view;
//view.setResizeMode(QQuickView::SizeRootObjectToView);
app.setWindowIcon(QIcon(":/images/Friendiqa.ico"));
QTranslator qtTranslator;
qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations");
app.installTranslator(&qtTranslator);
RemoteAuthAsyncImageProvider *imageProvider = new RemoteAuthAsyncImageProvider;
view.addImageProvider("remoteauthimage",imageProvider);
view.rootContext()->setContextProperty("remoteauth", imageProvider);
XHR* xhr = XHR::instance();
view.rootContext()->setContextProperty("xhr", xhr);
FILESYSTEM* filesystem = FILESYSTEM::instance();
if (qstrcmp(argv[1],"-background")==0){
filesystem->setVisibility(false);
} else{filesystem->setVisibility(true);}
//QtWebEngine::initialize();
QGuiApplication::setApplicationName("Friendiqa");
QGuiApplication::setOrganizationName("Friendiqa");
QApplication app(argc, argv);
QQmlApplicationEngine view;
//view.setResizeMode(QQuickView::SizeRootObjectToView);
app.setWindowIcon(QIcon(":/images/Friendiqa.ico"));
QTranslator qtTranslator;
qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations");
app.installTranslator(&qtTranslator);
// RemoteAuthAsyncImageProvider *imageProvider = new RemoteAuthAsyncImageProvider;
// view.addImageProvider("remoteauthimage",imageProvider);
// view.rootContext()->setContextProperty("remoteauth", imageProvider);
XHR* xhr = XHR::instance();
view.rootContext()->setContextProperty("xhr", xhr);
FILESYSTEM* filesystem = FILESYSTEM::instance();
if (qstrcmp(argv[1],"-background")==0){
filesystem->setVisibility(false);
} else{filesystem->setVisibility(true);}
view.rootContext()->setContextProperty("filesystem", filesystem);
ALARM* alarm = ALARM::instance();
view.rootContext()->setContextProperty("alarm", alarm);
UPDATENEWS* updatenews = UPDATENEWS::instance();
view.rootContext()->setContextProperty("updatenews", updatenews);
view.rootContext()->setContextProperty("filesystem", filesystem);
ALARM* alarm = ALARM::instance();
view.rootContext()->setContextProperty("alarm", alarm);
UPDATENEWS* updatenews = UPDATENEWS::instance();
view.rootContext()->setContextProperty("updatenews", updatenews);
updatenews->setDatabase();
OAuthWrapper* oauth2 = OAuthWrapper::instance();
view.rootContext()->setContextProperty("oauth2", oauth2);
qmlRegisterType<DocumentHandler>("io.qt.examples.texteditor", 1, 0, "DocumentHandler");
qmlRegisterType<QSystemTrayIcon>("QSystemTrayIcon", 1, 0, "QSystemTrayIcon");
qRegisterMetaType<QSystemTrayIcon::ActivationReason>("ActivationReason");
view.rootContext()->setContextProperty("iconTrayBlack", QIcon(QPixmap(":/images/friendica-tray-black.svg")));
view.rootContext()->setContextProperty("iconTrayWhite", QIcon(QPixmap(":/images/friendica-tray-white.svg")));
OAuthWrapper* oauth2 = OAuthWrapper::instance();
view.rootContext()->setContextProperty("oauth2", oauth2);
qmlRegisterType<QSystemTrayIcon>("QSystemTrayIcon", 1, 0, "QSystemTrayIcon");
qRegisterMetaType<QSystemTrayIcon::ActivationReason>("ActivationReason");
view.rootContext()->setContextProperty("iconTray", QIcon(":/images/Friendica_monochrome.png"));
view.rootContext()->setContextProperty("iconTrayAvailable", QSystemTrayIcon::isSystemTrayAvailable());
view.load(QUrl("qrc:/qml/friendiqa.qml"));
//view.show();
view.connect(view.rootContext()->engine(), SIGNAL(quit()), &app, SLOT(quit()));
return app.exec();
view.rootContext()->setContextProperty("iconTrayAvailable", QSystemTrayIcon::isSystemTrayAvailable());
if(updatenews->getStyle() != 0){
QQuickStyle::setStyle("Material");
}
view.load(QUrl("qrc:/qml/friendiqa.qml"));
view.connect(view.rootContext()->engine(), SIGNAL(quit()), &app, SLOT(quit()));
return app.exec();
}
}

View file

@ -89,6 +89,17 @@ void UPDATENEWS::setDatabase()
}
}
int UPDATENEWS::getStyle()
{
QSqlQuery syncquery("SELECT * FROM globaloptions",m_db);
while (syncquery.next()){
if (syncquery.value(0).toString()=="view_darkmode"){
return syncquery.value(1).toInt();
}
}
return 0;
}
QJsonArray UPDATENEWS::getAccounts(QString filtername, QString filtervalue){
QString filterstring="";

View file

@ -57,6 +57,7 @@ signals:
public slots:
void setSyncAll(bool syncAll);
void setDatabase();
int getStyle();
void login();
void timeline();
void replies();

View file

@ -227,7 +227,7 @@ void XHR::download()
//connect(reply,SIGNAL(downloadProgress(qint64,qint64)), this,SLOT(updateDownloadProgress(qint64,qint64)));
connect(reply, &QNetworkReply::finished,this, &XHR::onRequestFinished);
connect(reply, &QNetworkReply::sslErrors, this, &XHR::onSSLError);
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError)));
}
void XHR::get()
@ -254,7 +254,7 @@ void XHR::get()
reply = manager.get(request);
connect(reply, &QNetworkReply::finished, this, &XHR::onReplySuccess);
//connect(reply,SIGNAL(downloadProgress(qint64,qint64)), this,SLOT(updateDownloadProgress(qint64,qint64)));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError)));
connect(reply, &QNetworkReply::readyRead, this, &XHR::onReadyRead);
connect(reply, &QNetworkReply::sslErrors, this, &XHR::onSSLError);
}
@ -312,7 +312,7 @@ void XHR::post()
reply = manager.post(request, multiPart);
qDebug() << "\t request sent";
connect(reply, &QNetworkReply::finished, this, &XHR::onReplySuccess);
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError)));
connect(reply, &QNetworkReply::readyRead, this, &XHR::onReadyRead);
connect(reply, &QNetworkReply::sslErrors, this, &XHR::onSSLError);
}

View file

@ -0,0 +1,707 @@
<!DOCTYPE html>
<html lang="de-DE" class="theme-forgejo-auto">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Friendiqa/friendica-tray-black.svg an master - Friendiqa - Friendica</title>
<link rel="manifest" href="data:application/json;base64,eyJuYW1lIjoiRnJpZW5kaWNhIiwic2hvcnRfbmFtZSI6IkZyaWVuZGljYSIsInN0YXJ0X3VybCI6Imh0dHBzOi8vZ2l0LmZyaWVuZGkuY2EvIiwiaWNvbnMiOlt7InNyYyI6Imh0dHBzOi8vZ2l0LmZyaWVuZGkuY2EvYXNzZXRzL2ltZy9sb2dvLnBuZyIsInR5cGUiOiJpbWFnZS9wbmciLCJzaXplcyI6IjUxMng1MTIifSx7InNyYyI6Imh0dHBzOi8vZ2l0LmZyaWVuZGkuY2EvYXNzZXRzL2ltZy9sb2dvLnN2ZyIsInR5cGUiOiJpbWFnZS9zdmcreG1sIiwic2l6ZXMiOiI1MTJ4NTEyIn1dfQ==">
<meta name="theme-color" content="#6cc644">
<meta name="default-theme" content="forgejo-auto">
<meta name="author" content="MorsMortium">
<meta name="description" content="Friendiqa - Qt/QML App for Friendiqa ">
<meta name="keywords" content="git,forge,forgejo">
<meta name="referrer" content="no-referrer">
<link rel="alternate" type="application/atom+xml" title="" href="/MorsMortium/Friendiqa.atom">
<link rel="alternate" type="application/rss+xml" title="" href="/MorsMortium/Friendiqa.rss">
<link rel="icon" href="/assets/img/favicon.svg" type="image/svg+xml">
<link rel="alternate icon" href="/assets/img/favicon.png" type="image/png">
<link rel="stylesheet" href="/assets/css/index.css?v=1.19.0~2">
<script>
window.addEventListener('error', function(e) {window._globalHandlerErrors=window._globalHandlerErrors||[]; window._globalHandlerErrors.push(e);});
window.config = {
appUrl: 'https:\/\/git.friendi.ca\/',
appSubUrl: '',
assetVersionEncoded: encodeURIComponent('1.19.0~2'),
assetUrlPrefix: '\/assets',
runModeIsProd: true ,
customEmojis: {"codeberg":":codeberg:","forgejo":":forgejo:","git":":git:","gitea":":gitea:","github":":github:","gitlab":":gitlab:","gogs":":gogs:"},
useServiceWorker: false ,
csrfToken: 'j3AMY83WEMWZdgwpxwqbuqbFxoE6MTY4NzcwMzA1ODE4MzkyMDQyOQ',
pageData: {},
requireTribute: null ,
notificationSettings: {"EventSourceUpdateTime":10000,"MaxTimeout":60000,"MinTimeout":10000,"TimeoutStep":10000},
enableTimeTracking: true ,
mermaidMaxSourceCharacters: 5000 ,
i18n: {
copy_success: 'Kopiert!',
copy_error: 'Kopieren fehlgeschlagen',
error_occurred: 'Ein Fehler ist aufgetreten',
network_error: 'Netzwerkfehler',
},
};
window.config.pageData = window.config.pageData || {};
</script>
<script src="/assets/js/webcomponents.js?v=1.19.0~2"></script>
<noscript>
<style>
.dropdown:hover > .menu { display: block; }
.ui.secondary.menu .dropdown.item > .menu { margin-top: 0; }
</style>
</noscript>
<meta property="og:title" content="Friendiqa">
<meta property="og:url" content="https://git.friendi.ca/MorsMortium/Friendiqa">
<meta property="og:description" content="Qt/QML App for Friendiqa ">
<meta property="og:type" content="object">
<meta property="og:image" content="https://git.friendi.ca/avatars/082870e8cbbfe310f1eb7f6c3e2253f1">
<meta property="og:site_name" content="Friendica">
<link rel="stylesheet" href="/assets/css/theme-forgejo-auto.css?v=1.19.0~2">
</head>
<body>
<div class="full height">
<noscript>Diese Webseite funktioniert besser mit JavaScript.</noscript>
<div class="ui top secondary stackable main menu following bar light no-vertical-tabs">
<nav class="ui container" id="navbar" aria-label="Navigation Bar">
<div class="item brand gt-sb">
<a href="/" aria-label="Startseite">
<img width="30" height="30" src="/assets/img/logo.svg" alt="Logo" aria-hidden="true">
</a>
<div class="gt-df gt-ac">
<button class="ui icon button mobile-only" id="navbar-expand-toggle">
<svg viewBox="0 0 16 16" class="svg octicon-three-bars" width="16" height="16" aria-hidden="true"><path d="M1 2.75A.75.75 0 0 1 1.75 2h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 2.75Zm0 5A.75.75 0 0 1 1.75 7h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 7.75ZM1.75 12h12.5a.75.75 0 0 1 0 1.5H1.75a.75.75 0 0 1 0-1.5Z"/></svg>
</button>
</div>
</div>
<a class="item " href="/explore/repos">Erkunden</a>
<a class="item" target="_blank" rel="noopener noreferrer" href="https://forgejo.org/docs/latest/">Hilfe</a>
<div class="right stackable menu">
<a class="item" href="/user/sign_up">
<svg viewBox="0 0 16 16" class="svg octicon-person" width="16" height="16" aria-hidden="true"><path d="M10.561 8.073a6.005 6.005 0 0 1 3.432 5.142.75.75 0 1 1-1.498.07 4.5 4.5 0 0 0-8.99 0 .75.75 0 0 1-1.498-.07 6.004 6.004 0 0 1 3.431-5.142 3.999 3.999 0 1 1 5.123 0ZM10.5 5a2.5 2.5 0 1 0-5 0 2.5 2.5 0 0 0 5 0Z"/></svg> Registrieren
</a>
<a class="item" rel="nofollow" href="/user/login?redirect_to=%2fMorsMortium%2fFriendiqa%2fsrc%2fbranch%2fmaster%2fsource-linux%2fimages%2ffriendica-tray-black.svg">
<svg viewBox="0 0 16 16" class="svg octicon-sign-in" width="16" height="16" aria-hidden="true"><path d="M2 2.75C2 1.784 2.784 1 3.75 1h2.5a.75.75 0 0 1 0 1.5h-2.5a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 0 1.5h-2.5A1.75 1.75 0 0 1 2 13.25Zm6.56 4.5h5.69a.75.75 0 0 1 0 1.5H8.56l1.97 1.97a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L6.22 8.53a.75.75 0 0 1 0-1.06l3.25-3.25a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734Z"/></svg> Anmelden
</a>
</div>
</nav>
</div>
<div role="main" aria-label="Friendiqa/friendica-tray-black.svg an master" class="page-content repository file list ">
<div class="header-wrapper">
<div class="ui container">
<div class="repo-header">
<div class="repo-title-wrap gt-df gt-fc">
<div class="repo-title" role="heading" aria-level="1">
<div class="repo-icon gt-mr-3">
<svg viewBox="0 0 16 16" class="svg octicon-repo-forked" width="32" height="32" aria-hidden="true"><path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"/></svg>
</div>
<a href="/MorsMortium">MorsMortium</a>
<div class="gt-mx-2">/</div>
<a href="/MorsMortium/Friendiqa">Friendiqa</a>
<a href="/MorsMortium/Friendiqa.rss"><i class="ui grey icon tooltip gt-ml-3" data-content="RSS Feed" data-position="top center"><svg viewBox="0 0 16 16" class="svg octicon-rss" width="18" height="18" aria-hidden="true"><path d="M2.002 2.725a.75.75 0 0 1 .797-.699C8.79 2.42 13.58 7.21 13.974 13.201a.75.75 0 0 1-1.497.098 10.502 10.502 0 0 0-9.776-9.776.747.747 0 0 1-.7-.798ZM2.84 7.05h-.002a7.002 7.002 0 0 1 6.113 6.111.75.75 0 0 1-1.49.178 5.503 5.503 0 0 0-4.8-4.8.75.75 0 0 1 .179-1.489ZM2 13a1 1 0 1 1 2 0 1 1 0 0 1-2 0Z"/></svg></i></a>
<div class="labels gt-df gt-ac gt-fw">
</div>
</div>
<div class="fork-flag">geforkt von <a href="/lubuwest/Friendiqa">lubuwest/Friendiqa</a></div>
</div>
<div class="repo-buttons">
<form method="post" action="/MorsMortium/Friendiqa/action/watch?redirect_to=%2fMorsMortium%2fFriendiqa%2fsrc%2fbranch%2fmaster%2fsource-linux%2fimages%2ffriendica-tray-black.svg">
<input type="hidden" name="_csrf" value="j3AMY83WEMWZdgwpxwqbuqbFxoE6MTY4NzcwMzA1ODE4MzkyMDQyOQ">
<div class="ui labeled button tooltip" data-content="Melde dich an, um dieses Repository zu beobachten." data-position="top center">
<button type="submit" class="ui compact small basic button" disabled>
<svg viewBox="0 0 16 16" class="svg octicon-eye" width="16" height="16" aria-hidden="true"><path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14c-1.981 0-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2ZM1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5c1.473 0 2.825-.742 3.955-1.715 1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5c-1.473 0-2.825.742-3.955 1.715-1.124.967-1.954 2.096-2.366 2.717ZM8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10Z"/></svg>Beobachten
</button>
<a class="ui basic label" href="/MorsMortium/Friendiqa/watchers">
1
</a>
</div>
</form>
<form method="post" action="/MorsMortium/Friendiqa/action/star?redirect_to=%2fMorsMortium%2fFriendiqa%2fsrc%2fbranch%2fmaster%2fsource-linux%2fimages%2ffriendica-tray-black.svg">
<input type="hidden" name="_csrf" value="j3AMY83WEMWZdgwpxwqbuqbFxoE6MTY4NzcwMzA1ODE4MzkyMDQyOQ">
<div class="ui labeled button tooltip" data-content="Bitte melde dich an, um dieses Repository zu favorisieren." data-position="top center">
<button type="submit" class="ui compact small basic button" disabled>
<svg viewBox="0 0 16 16" class="svg octicon-star" width="16" height="16" aria-hidden="true"><path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"/></svg>Favorisieren
</button>
<a class="ui basic label" href="/MorsMortium/Friendiqa/stars">
0
</a>
</div>
</form>
<div class="ui labeled button
tooltip disabled
"
data-content="Bitte melde dich an, um dieses Repository zu forken."
data-position="top center">
<a class="ui compact small basic button"
>
<svg viewBox="0 0 16 16" class="svg octicon-repo-forked" width="16" height="16" aria-hidden="true"><path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"/></svg>Fork
</a>
<div class="ui small modal" id="fork-repo-modal">
<svg viewBox="0 0 16 16" class="close inside svg octicon-x" width="16" height="16" aria-hidden="true"><path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"/></svg>
<div class="header">
Du hast bereits einen Fork von Friendiqa erstellt
</div>
<div class="content gt-tl">
<div class="ui list">
</div>
</div>
</div>
<a class="ui basic label" href="/MorsMortium/Friendiqa/forks">
0
</a>
</div>
</div>
</div>
</div>
<div class="ui tabs container">
<div class="ui tabular stackable menu navbar">
<a class="active item" href="/MorsMortium/Friendiqa">
<svg viewBox="0 0 16 16" class="svg octicon-code" width="16" height="16" aria-hidden="true"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"/></svg> Code
</a>
<a class="item" href="/MorsMortium/Friendiqa/issues">
<svg viewBox="0 0 16 16" class="svg octicon-issue-opened" width="16" height="16" aria-hidden="true"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"/><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"/></svg> Issues
</a>
<a class="item" href="/MorsMortium/Friendiqa/pulls">
<svg viewBox="0 0 16 16" class="svg octicon-git-pull-request" width="16" height="16" aria-hidden="true"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"/></svg> Pull-Requests
</a>
<a href="/MorsMortium/Friendiqa/packages" class="item">
<svg viewBox="0 0 16 16" class="svg octicon-package" width="16" height="16" aria-hidden="true"><path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"/></svg> Pakete
</a>
<a href="/MorsMortium/Friendiqa/projects" class="item">
<svg viewBox="0 0 16 16" class="svg octicon-project" width="16" height="16" aria-hidden="true"><path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"/></svg> Projekte
</a>
<a class="item" href="/MorsMortium/Friendiqa/releases">
<svg viewBox="0 0 16 16" class="svg octicon-tag" width="16" height="16" aria-hidden="true"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"/></svg> Releases
</a>
<a class="item" href="/MorsMortium/Friendiqa/wiki" >
<svg viewBox="0 0 16 16" class="svg octicon-book" width="16" height="16" aria-hidden="true"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"/></svg> Wiki
</a>
<a class="item" href="/MorsMortium/Friendiqa/activity">
<svg viewBox="0 0 16 16" class="svg octicon-pulse" width="16" height="16" aria-hidden="true"><path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"/></svg> Aktivität
</a>
</div>
</div>
<div class="ui tabs divider"></div>
</div>
<div class="ui container ">
<div class="gt-hidden" id="validate_prompt">
<span id="count_prompt">Du kannst nicht mehr als 25 Themen auswählen</span>
<span id="format_prompt">Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.</span>
</div>
<div class="repo-button-row gt-df gt-ac gt-sb gt-fw">
<div class="gt-df gt-ac gt-fw gt-gap-y-3">
<div class="fitted item choose reference">
<div class="ui floating filter dropdown custom"
data-branch-form=""
data-can-create-branch="false"
data-no-results="Keine Ergebnisse verfügbar."
data-set-action="" data-submit-form=""
data-view-type="branch"
data-ref-name="master"
data-branch-url-prefix="/MorsMortium/Friendiqa/src/branch/"
data-branch-url-suffix="/source-linux/images/friendica-tray-black.svg"
data-tag-url-prefix="/MorsMortium/Friendiqa/src/tag/"
data-tag-url-suffix="/source-linux/images/friendica-tray-black.svg">
<button class="branch-dropdown-button gt-ellipsis ui basic small compact button gt-df" @click="menuVisible = !menuVisible" @keyup.enter="menuVisible = !menuVisible">
<span class="text gt-df gt-ac gt-mr-2">
<span :class="{visible: isViewTag}" v-if="isViewTag" v-cloak><svg viewBox="0 0 16 16" class="svg octicon-tag" width="16" height="16" aria-hidden="true"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"/></svg></span>
<span :class="{visible: isViewBranch}" v-if="isViewBranch" ><svg viewBox="0 0 16 16" class="svg octicon-git-branch" width="16" height="16" aria-hidden="true"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"/></svg></span>
<span :class="{visible: isViewTree}" v-if="isViewTree" v-cloak><svg viewBox="0 0 16 16" class="svg octicon-git-branch" width="16" height="16" aria-hidden="true"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"/></svg></span>
<strong ref="dropdownRefName" class="gt-ml-3">master</strong>
</span>
<svg viewBox="0 0 16 16" class="dropdown icon svg octicon-triangle-down" width="14" height="14" aria-hidden="true"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"/></svg>
</button>
<div class="data gt-hidden" data-mode="branches">
<div class="item branch selected" data-url="master">master</div>
<div class="item tag " data-url="v0.001">v0.001</div>
<div class="item tag " data-url="v0.002">v0.002</div>
<div class="item tag " data-url="v0.004">v0.004</div>
<div class="item tag " data-url="v0.1">v0.1</div>
<div class="item tag " data-url="v0.1.2">v0.1.2</div>
<div class="item tag " data-url="v0.2">v0.2</div>
<div class="item tag " data-url="v0.2.1">v0.2.1</div>
<div class="item tag " data-url="v0.2.2">v0.2.2</div>
<div class="item tag " data-url="v0.3.1">v0.3.1</div>
<div class="item tag " data-url="v0.3.2">v0.3.2</div>
<div class="item tag " data-url="v0.3.3">v0.3.3</div>
<div class="item tag " data-url="v0.3.4">v0.3.4</div>
<div class="item tag " data-url="v0.5">v0.5</div>
<div class="item tag " data-url="v0.5.1">v0.5.1</div>
<div class="item tag " data-url="v0.5.2">v0.5.2</div>
<div class="item tag " data-url="v0.5.3">v0.5.3</div>
<div class="item tag " data-url="v0.5.4">v0.5.4</div>
<div class="item tag " data-url="v0.5.4.1">v0.5.4.1</div>
<div class="item tag " data-url="v0.6">v0.6</div>
<div class="item tag " data-url="v0.6.1">v0.6.1</div>
<div class="item tag " data-url="v0.6.2">v0.6.2</div>
<div class="item tag " data-url="v0.6.3">v0.6.3</div>
<div class="item tag " data-url="v0.6.5">v0.6.5</div>
<div class="item tag " data-url="v0.6.6">v0.6.6</div>
</div>
<div class="menu transition" :class="{visible: menuVisible}" v-if="menuVisible" v-cloak>
<div class="ui icon search input">
<i class="icon gt-df gt-ac gt-jc gt-m-0"><svg viewBox="0 0 16 16" class="svg octicon-filter" width="16" height="16" aria-hidden="true"><path d="M.75 3h14.5a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1 0-1.5ZM3 7.75A.75.75 0 0 1 3.75 7h8.5a.75.75 0 0 1 0 1.5h-8.5A.75.75 0 0 1 3 7.75Zm3 4a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"/></svg></i>
<input name="search" ref="searchField" autocomplete="off" v-model="searchTerm" @keydown="keydown($event)" placeholder="Branch oder Tag filtern...">
</div>
<div class="header branch-tag-choice">
<div class="ui grid">
<div class="two column row">
<a class="reference column" href="#" @click="createTag = false; mode = 'branches'; focusSearchField()">
<span class="text" :class="{black: mode == 'branches'}">
<svg viewBox="0 0 16 16" class="gt-mr-2 svg octicon-git-branch" width="16" height="16" aria-hidden="true"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"/></svg>Branches
</span>
</a>
<a class="reference column" href="#" @click="createTag = true; mode = 'tags'; focusSearchField()">
<span class="text" :class="{black: mode == 'tags'}">
<svg viewBox="0 0 16 16" class="gt-mr-2 svg octicon-tag" width="16" height="16" aria-hidden="true"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"/></svg>Tags
</span>
</a>
</div>
</div>
</div>
<div class="scrolling menu" ref="scrollContainer">
<div v-for="(item, index) in filteredItems" :key="item.name" class="item" :class="{selected: item.selected, active: active == index}" @click="selectItem(item)" :ref="'listItem' + index">${ item.name }</div>
<div class="item" v-if="showCreateNewBranch" :class="{active: active == filteredItems.length}" :ref="'listItem' + filteredItems.length">
<a href="#" @click="createNewBranch()">
<div v-show="createTag">
<i class="reference tags icon"></i>
Tag <strong>${ searchTerm }</strong> erstellen
</div>
<div v-show="!createTag">
<svg viewBox="0 0 16 16" class="svg octicon-git-branch" width="16" height="16" aria-hidden="true"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"/></svg>
Erstelle Branch <strong>${ searchTerm }</strong>
</div>
<div class="text small">
von „master“
</div>
</a>
<form ref="newBranchForm" action="/MorsMortium/Friendiqa/branches/_new/branch/master" method="post">
<input type="hidden" name="_csrf" value="j3AMY83WEMWZdgwpxwqbuqbFxoE6MTY4NzcwMzA1ODE4MzkyMDQyOQ">
<input type="hidden" name="new_branch_name" v-model="searchTerm">
<input type="hidden" name="create_tag" v-model="createTag">
<input type="hidden" name="current_path" value="source-linux/images/friendica-tray-black.svg">
</form>
</div>
</div>
<div class="message" v-if="showNoResults">${ noResults }</div>
</div>
</div>
</div>
<span class="ui breadcrumb repo-path gt-ml-2"><a class="section" href="/MorsMortium/Friendiqa/src/branch/master" title="Friendiqa">Friendiqa</a><span class="divider">/</span><span class="section"><a href="/MorsMortium/Friendiqa/src/branch/master/source-linux" title="source-linux">source-linux</a></span><span class="divider">/</span><span class="section"><a href="/MorsMortium/Friendiqa/src/branch/master/source-linux/images" title="images">images</a></span><span class="divider">/</span><span class="active section" title="friendica-tray-black.svg">friendica-tray-black.svg</span></span>
</div>
<div class="gt-df gt-ac">
</div>
</div>
<div class="tab-size-8 non-diff-file-content">
<h4 class="file-header ui top attached header gt-df gt-ac gt-sb gt-fw">
<div class="file-header-left gt-df gt-ac gt-py-3 gt-pr-4">
<div class="file-info text grey normal gt-mono">
<div class="file-info-entry">
42 Zeilen
</div>
<div class="file-info-entry">
1.7 KiB
</div>
<div class="file-info-entry">
XML
</div>
</div>
</div>
<div class="file-header-right file-actions gt-df gt-ac gt-fw">
<div class="ui compact icon buttons two-toggle-buttons">
<a href="/MorsMortium/Friendiqa/src/branch/master/source-linux/images/friendica-tray-black.svg?display=source" class="ui mini basic button tooltip " data-content="Quelltext anzeigen" data-position="bottom center"><svg viewBox="0 0 16 16" class="svg octicon-code" width="15" height="15" aria-hidden="true"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"/></svg></a>
<a href="/MorsMortium/Friendiqa/src/branch/master/source-linux/images/friendica-tray-black.svg" class="ui mini basic button tooltip active" data-content="Ansicht rendern" data-position="bottom center"><svg viewBox="0 0 16 16" class="svg octicon-file" width="15" height="15" aria-hidden="true"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"/></svg></a>
</div>
<div class="ui buttons gt-mr-2">
<a class="ui mini basic button" href="/MorsMortium/Friendiqa/raw/branch/master/source-linux/images/friendica-tray-black.svg">Originalformat</a>
<a class="ui mini basic button" href="/MorsMortium/Friendiqa/src/commit/8dc907e345eaaebbe8b81b9b098385454e3e8f45/source-linux/images/friendica-tray-black.svg">Permalink</a>
<a class="ui mini basic button" href="/MorsMortium/Friendiqa/blame/branch/master/source-linux/images/friendica-tray-black.svg">Blame</a>
<a class="ui mini basic button" href="/MorsMortium/Friendiqa/commits/branch/master/source-linux/images/friendica-tray-black.svg">Verlauf</a>
</div>
<a download href="/MorsMortium/Friendiqa/raw/branch/master/source-linux/images/friendica-tray-black.svg"><span class="btn-octicon tooltip" data-content="Datei herunterladen" data-position="bottom center"><svg viewBox="0 0 16 16" class="svg octicon-download" width="16" height="16" aria-hidden="true"><path d="M7.47 10.78 3.72 7.03a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018l2.47 2.47V1.75a.75.75 0 0 1 1.5 0v6.69l2.47-2.47a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-3.75 3.75a.75.75 0 0 1-1.06 0ZM3.75 13h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Z"/></svg></span></a>
<a id="copy-content" class="btn-octicon tooltip" data-link="/MorsMortium/Friendiqa/raw/branch/master/source-linux/images/friendica-tray-black.svg" data-content="Copy content"><svg viewBox="0 0 16 16" class="svg octicon-copy" width="14" height="14" aria-hidden="true"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"/></svg></a>
<span class="btn-octicon tooltip disabled" data-content="Du musst dieses Repository forken, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen." data-position="bottom center"><svg viewBox="0 0 16 16" class="svg octicon-pencil" width="16" height="16" aria-hidden="true"><path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"/></svg></span>
<span class="btn-octicon tooltip disabled" data-content="Du benötigst Schreibzugriff, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen." data-position="bottom center"><svg viewBox="0 0 16 16" class="svg octicon-trash" width="16" height="16" aria-hidden="true"><path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"/></svg></span>
</div>
</h4>
<div class="ui attached table unstackable segment">
<div class="file-view">
<div class="view-raw ui center">
<img src="/MorsMortium/Friendiqa/raw/branch/master/source-linux/images/friendica-tray-black.svg">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<footer role="group" aria-label="Footer">
<div class="ui container">
<div class="ui left" role="contentinfo" aria-label="About Software">
<a target="_blank" rel="noopener noreferrer" href="https://forgejo.org">Powered by Forgejo</a>
Version:
1.19.0&#43;2
Seite: <strong>37ms</strong>
Template: <strong>1ms</strong>
</div>
<div class="ui right links" role="group" aria-label="Links">
<div class="ui language bottom floating slide up dropdown link item">
<svg viewBox="0 0 16 16" class="svg octicon-globe" width="16" height="16" aria-hidden="true"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"/></svg>
<span>Deutsch</span>
<div class="menu language-menu">
<a lang="id-ID" data-url="/?lang=id-ID" class="item ">Bahasa Indonesia</a>
<a lang="de-DE" data-url="/?lang=de-DE" class="item active selected">Deutsch</a>
<a lang="en-US" data-url="/?lang=en-US" class="item ">English</a>
<a lang="es-ES" data-url="/?lang=es-ES" class="item ">Español</a>
<a lang="fr-FR" data-url="/?lang=fr-FR" class="item ">Français</a>
<a lang="it-IT" data-url="/?lang=it-IT" class="item ">Italiano</a>
<a lang="lv-LV" data-url="/?lang=lv-LV" class="item ">Latviešu</a>
<a lang="hu-HU" data-url="/?lang=hu-HU" class="item ">Magyar nyelv</a>
<a lang="nl-NL" data-url="/?lang=nl-NL" class="item ">Nederlands</a>
<a lang="pl-PL" data-url="/?lang=pl-PL" class="item ">Polski</a>
<a lang="pt-PT" data-url="/?lang=pt-PT" class="item ">Português de Portugal</a>
<a lang="pt-BR" data-url="/?lang=pt-BR" class="item ">Português do Brasil</a>
<a lang="fi-FI" data-url="/?lang=fi-FI" class="item ">Suomi</a>
<a lang="sv-SE" data-url="/?lang=sv-SE" class="item ">Svenska</a>
<a lang="tr-TR" data-url="/?lang=tr-TR" class="item ">Türkçe</a>
<a lang="cs-CZ" data-url="/?lang=cs-CZ" class="item ">Čeština</a>
<a lang="el-GR" data-url="/?lang=el-GR" class="item ">Ελληνικά</a>
<a lang="bg-BG" data-url="/?lang=bg-BG" class="item ">Български</a>
<a lang="ru-RU" data-url="/?lang=ru-RU" class="item ">Русский</a>
<a lang="uk-UA" data-url="/?lang=uk-UA" class="item ">Українська</a>
<a lang="fa-IR" data-url="/?lang=fa-IR" class="item ">فارسی</a>
<a lang="ml-IN" data-url="/?lang=ml-IN" class="item ">മലയാളം</a>
<a lang="ja-JP" data-url="/?lang=ja-JP" class="item ">日本語</a>
<a lang="zh-CN" data-url="/?lang=zh-CN" class="item ">简体中文</a>
<a lang="zh-TW" data-url="/?lang=zh-TW" class="item ">繁體中文(台灣)</a>
<a lang="zh-HK" data-url="/?lang=zh-HK" class="item ">繁體中文(香港)</a>
<a lang="ko-KR" data-url="/?lang=ko-KR" class="item ">한국어</a>
</div>
</div>
<a href="/assets/js/licenses.txt">Lizenzen</a>
<a href="/api/swagger">API</a>
</div>
</div>
</footer>
<script src="/assets/js/index.js?v=1.19.0~2" onerror="alert('Failed to load asset files from ' + this.src + '. Please make sure the asset files can be accessed.')"></script>
</body>
</html>

View file

@ -0,0 +1,707 @@
<!DOCTYPE html>
<html lang="de-DE" class="theme-forgejo-auto">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Friendiqa/friendica-tray-white.svg an master - Friendiqa - Friendica</title>
<link rel="manifest" href="data:application/json;base64,eyJuYW1lIjoiRnJpZW5kaWNhIiwic2hvcnRfbmFtZSI6IkZyaWVuZGljYSIsInN0YXJ0X3VybCI6Imh0dHBzOi8vZ2l0LmZyaWVuZGkuY2EvIiwiaWNvbnMiOlt7InNyYyI6Imh0dHBzOi8vZ2l0LmZyaWVuZGkuY2EvYXNzZXRzL2ltZy9sb2dvLnBuZyIsInR5cGUiOiJpbWFnZS9wbmciLCJzaXplcyI6IjUxMng1MTIifSx7InNyYyI6Imh0dHBzOi8vZ2l0LmZyaWVuZGkuY2EvYXNzZXRzL2ltZy9sb2dvLnN2ZyIsInR5cGUiOiJpbWFnZS9zdmcreG1sIiwic2l6ZXMiOiI1MTJ4NTEyIn1dfQ==">
<meta name="theme-color" content="#6cc644">
<meta name="default-theme" content="forgejo-auto">
<meta name="author" content="MorsMortium">
<meta name="description" content="Friendiqa - Qt/QML App for Friendiqa ">
<meta name="keywords" content="git,forge,forgejo">
<meta name="referrer" content="no-referrer">
<link rel="alternate" type="application/atom+xml" title="" href="/MorsMortium/Friendiqa.atom">
<link rel="alternate" type="application/rss+xml" title="" href="/MorsMortium/Friendiqa.rss">
<link rel="icon" href="/assets/img/favicon.svg" type="image/svg+xml">
<link rel="alternate icon" href="/assets/img/favicon.png" type="image/png">
<link rel="stylesheet" href="/assets/css/index.css?v=1.19.0~2">
<script>
window.addEventListener('error', function(e) {window._globalHandlerErrors=window._globalHandlerErrors||[]; window._globalHandlerErrors.push(e);});
window.config = {
appUrl: 'https:\/\/git.friendi.ca\/',
appSubUrl: '',
assetVersionEncoded: encodeURIComponent('1.19.0~2'),
assetUrlPrefix: '\/assets',
runModeIsProd: true ,
customEmojis: {"codeberg":":codeberg:","forgejo":":forgejo:","git":":git:","gitea":":gitea:","github":":github:","gitlab":":gitlab:","gogs":":gogs:"},
useServiceWorker: false ,
csrfToken: 'hRtY4yQKJpvShSAHOERpMVsB_hI6MTY4NzcwMzY4NDU0MTUwMzIyMw',
pageData: {},
requireTribute: null ,
notificationSettings: {"EventSourceUpdateTime":10000,"MaxTimeout":60000,"MinTimeout":10000,"TimeoutStep":10000},
enableTimeTracking: true ,
mermaidMaxSourceCharacters: 5000 ,
i18n: {
copy_success: 'Kopiert!',
copy_error: 'Kopieren fehlgeschlagen',
error_occurred: 'Ein Fehler ist aufgetreten',
network_error: 'Netzwerkfehler',
},
};
window.config.pageData = window.config.pageData || {};
</script>
<script src="/assets/js/webcomponents.js?v=1.19.0~2"></script>
<noscript>
<style>
.dropdown:hover > .menu { display: block; }
.ui.secondary.menu .dropdown.item > .menu { margin-top: 0; }
</style>
</noscript>
<meta property="og:title" content="Friendiqa">
<meta property="og:url" content="https://git.friendi.ca/MorsMortium/Friendiqa">
<meta property="og:description" content="Qt/QML App for Friendiqa ">
<meta property="og:type" content="object">
<meta property="og:image" content="https://git.friendi.ca/avatars/082870e8cbbfe310f1eb7f6c3e2253f1">
<meta property="og:site_name" content="Friendica">
<link rel="stylesheet" href="/assets/css/theme-forgejo-auto.css?v=1.19.0~2">
</head>
<body>
<div class="full height">
<noscript>Diese Webseite funktioniert besser mit JavaScript.</noscript>
<div class="ui top secondary stackable main menu following bar light no-vertical-tabs">
<nav class="ui container" id="navbar" aria-label="Navigation Bar">
<div class="item brand gt-sb">
<a href="/" aria-label="Startseite">
<img width="30" height="30" src="/assets/img/logo.svg" alt="Logo" aria-hidden="true">
</a>
<div class="gt-df gt-ac">
<button class="ui icon button mobile-only" id="navbar-expand-toggle">
<svg viewBox="0 0 16 16" class="svg octicon-three-bars" width="16" height="16" aria-hidden="true"><path d="M1 2.75A.75.75 0 0 1 1.75 2h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 2.75Zm0 5A.75.75 0 0 1 1.75 7h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 7.75ZM1.75 12h12.5a.75.75 0 0 1 0 1.5H1.75a.75.75 0 0 1 0-1.5Z"/></svg>
</button>
</div>
</div>
<a class="item " href="/explore/repos">Erkunden</a>
<a class="item" target="_blank" rel="noopener noreferrer" href="https://forgejo.org/docs/latest/">Hilfe</a>
<div class="right stackable menu">
<a class="item" href="/user/sign_up">
<svg viewBox="0 0 16 16" class="svg octicon-person" width="16" height="16" aria-hidden="true"><path d="M10.561 8.073a6.005 6.005 0 0 1 3.432 5.142.75.75 0 1 1-1.498.07 4.5 4.5 0 0 0-8.99 0 .75.75 0 0 1-1.498-.07 6.004 6.004 0 0 1 3.431-5.142 3.999 3.999 0 1 1 5.123 0ZM10.5 5a2.5 2.5 0 1 0-5 0 2.5 2.5 0 0 0 5 0Z"/></svg> Registrieren
</a>
<a class="item" rel="nofollow" href="/user/login?redirect_to=%2fMorsMortium%2fFriendiqa%2fsrc%2fbranch%2fmaster%2fsource-linux%2fimages%2ffriendica-tray-white.svg">
<svg viewBox="0 0 16 16" class="svg octicon-sign-in" width="16" height="16" aria-hidden="true"><path d="M2 2.75C2 1.784 2.784 1 3.75 1h2.5a.75.75 0 0 1 0 1.5h-2.5a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 0 1.5h-2.5A1.75 1.75 0 0 1 2 13.25Zm6.56 4.5h5.69a.75.75 0 0 1 0 1.5H8.56l1.97 1.97a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L6.22 8.53a.75.75 0 0 1 0-1.06l3.25-3.25a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734Z"/></svg> Anmelden
</a>
</div>
</nav>
</div>
<div role="main" aria-label="Friendiqa/friendica-tray-white.svg an master" class="page-content repository file list ">
<div class="header-wrapper">
<div class="ui container">
<div class="repo-header">
<div class="repo-title-wrap gt-df gt-fc">
<div class="repo-title" role="heading" aria-level="1">
<div class="repo-icon gt-mr-3">
<svg viewBox="0 0 16 16" class="svg octicon-repo-forked" width="32" height="32" aria-hidden="true"><path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"/></svg>
</div>
<a href="/MorsMortium">MorsMortium</a>
<div class="gt-mx-2">/</div>
<a href="/MorsMortium/Friendiqa">Friendiqa</a>
<a href="/MorsMortium/Friendiqa.rss"><i class="ui grey icon tooltip gt-ml-3" data-content="RSS Feed" data-position="top center"><svg viewBox="0 0 16 16" class="svg octicon-rss" width="18" height="18" aria-hidden="true"><path d="M2.002 2.725a.75.75 0 0 1 .797-.699C8.79 2.42 13.58 7.21 13.974 13.201a.75.75 0 0 1-1.497.098 10.502 10.502 0 0 0-9.776-9.776.747.747 0 0 1-.7-.798ZM2.84 7.05h-.002a7.002 7.002 0 0 1 6.113 6.111.75.75 0 0 1-1.49.178 5.503 5.503 0 0 0-4.8-4.8.75.75 0 0 1 .179-1.489ZM2 13a1 1 0 1 1 2 0 1 1 0 0 1-2 0Z"/></svg></i></a>
<div class="labels gt-df gt-ac gt-fw">
</div>
</div>
<div class="fork-flag">geforkt von <a href="/lubuwest/Friendiqa">lubuwest/Friendiqa</a></div>
</div>
<div class="repo-buttons">
<form method="post" action="/MorsMortium/Friendiqa/action/watch?redirect_to=%2fMorsMortium%2fFriendiqa%2fsrc%2fbranch%2fmaster%2fsource-linux%2fimages%2ffriendica-tray-white.svg">
<input type="hidden" name="_csrf" value="hRtY4yQKJpvShSAHOERpMVsB_hI6MTY4NzcwMzY4NDU0MTUwMzIyMw">
<div class="ui labeled button tooltip" data-content="Melde dich an, um dieses Repository zu beobachten." data-position="top center">
<button type="submit" class="ui compact small basic button" disabled>
<svg viewBox="0 0 16 16" class="svg octicon-eye" width="16" height="16" aria-hidden="true"><path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14c-1.981 0-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2ZM1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5c1.473 0 2.825-.742 3.955-1.715 1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5c-1.473 0-2.825.742-3.955 1.715-1.124.967-1.954 2.096-2.366 2.717ZM8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10Z"/></svg>Beobachten
</button>
<a class="ui basic label" href="/MorsMortium/Friendiqa/watchers">
1
</a>
</div>
</form>
<form method="post" action="/MorsMortium/Friendiqa/action/star?redirect_to=%2fMorsMortium%2fFriendiqa%2fsrc%2fbranch%2fmaster%2fsource-linux%2fimages%2ffriendica-tray-white.svg">
<input type="hidden" name="_csrf" value="hRtY4yQKJpvShSAHOERpMVsB_hI6MTY4NzcwMzY4NDU0MTUwMzIyMw">
<div class="ui labeled button tooltip" data-content="Bitte melde dich an, um dieses Repository zu favorisieren." data-position="top center">
<button type="submit" class="ui compact small basic button" disabled>
<svg viewBox="0 0 16 16" class="svg octicon-star" width="16" height="16" aria-hidden="true"><path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"/></svg>Favorisieren
</button>
<a class="ui basic label" href="/MorsMortium/Friendiqa/stars">
0
</a>
</div>
</form>
<div class="ui labeled button
tooltip disabled
"
data-content="Bitte melde dich an, um dieses Repository zu forken."
data-position="top center">
<a class="ui compact small basic button"
>
<svg viewBox="0 0 16 16" class="svg octicon-repo-forked" width="16" height="16" aria-hidden="true"><path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"/></svg>Fork
</a>
<div class="ui small modal" id="fork-repo-modal">
<svg viewBox="0 0 16 16" class="close inside svg octicon-x" width="16" height="16" aria-hidden="true"><path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"/></svg>
<div class="header">
Du hast bereits einen Fork von Friendiqa erstellt
</div>
<div class="content gt-tl">
<div class="ui list">
</div>
</div>
</div>
<a class="ui basic label" href="/MorsMortium/Friendiqa/forks">
0
</a>
</div>
</div>
</div>
</div>
<div class="ui tabs container">
<div class="ui tabular stackable menu navbar">
<a class="active item" href="/MorsMortium/Friendiqa">
<svg viewBox="0 0 16 16" class="svg octicon-code" width="16" height="16" aria-hidden="true"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"/></svg> Code
</a>
<a class="item" href="/MorsMortium/Friendiqa/issues">
<svg viewBox="0 0 16 16" class="svg octicon-issue-opened" width="16" height="16" aria-hidden="true"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"/><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"/></svg> Issues
</a>
<a class="item" href="/MorsMortium/Friendiqa/pulls">
<svg viewBox="0 0 16 16" class="svg octicon-git-pull-request" width="16" height="16" aria-hidden="true"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"/></svg> Pull-Requests
</a>
<a href="/MorsMortium/Friendiqa/packages" class="item">
<svg viewBox="0 0 16 16" class="svg octicon-package" width="16" height="16" aria-hidden="true"><path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"/></svg> Pakete
</a>
<a href="/MorsMortium/Friendiqa/projects" class="item">
<svg viewBox="0 0 16 16" class="svg octicon-project" width="16" height="16" aria-hidden="true"><path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"/></svg> Projekte
</a>
<a class="item" href="/MorsMortium/Friendiqa/releases">
<svg viewBox="0 0 16 16" class="svg octicon-tag" width="16" height="16" aria-hidden="true"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"/></svg> Releases
</a>
<a class="item" href="/MorsMortium/Friendiqa/wiki" >
<svg viewBox="0 0 16 16" class="svg octicon-book" width="16" height="16" aria-hidden="true"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"/></svg> Wiki
</a>
<a class="item" href="/MorsMortium/Friendiqa/activity">
<svg viewBox="0 0 16 16" class="svg octicon-pulse" width="16" height="16" aria-hidden="true"><path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"/></svg> Aktivität
</a>
</div>
</div>
<div class="ui tabs divider"></div>
</div>
<div class="ui container ">
<div class="gt-hidden" id="validate_prompt">
<span id="count_prompt">Du kannst nicht mehr als 25 Themen auswählen</span>
<span id="format_prompt">Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.</span>
</div>
<div class="repo-button-row gt-df gt-ac gt-sb gt-fw">
<div class="gt-df gt-ac gt-fw gt-gap-y-3">
<div class="fitted item choose reference">
<div class="ui floating filter dropdown custom"
data-branch-form=""
data-can-create-branch="false"
data-no-results="Keine Ergebnisse verfügbar."
data-set-action="" data-submit-form=""
data-view-type="branch"
data-ref-name="master"
data-branch-url-prefix="/MorsMortium/Friendiqa/src/branch/"
data-branch-url-suffix="/source-linux/images/friendica-tray-white.svg"
data-tag-url-prefix="/MorsMortium/Friendiqa/src/tag/"
data-tag-url-suffix="/source-linux/images/friendica-tray-white.svg">
<button class="branch-dropdown-button gt-ellipsis ui basic small compact button gt-df" @click="menuVisible = !menuVisible" @keyup.enter="menuVisible = !menuVisible">
<span class="text gt-df gt-ac gt-mr-2">
<span :class="{visible: isViewTag}" v-if="isViewTag" v-cloak><svg viewBox="0 0 16 16" class="svg octicon-tag" width="16" height="16" aria-hidden="true"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"/></svg></span>
<span :class="{visible: isViewBranch}" v-if="isViewBranch" ><svg viewBox="0 0 16 16" class="svg octicon-git-branch" width="16" height="16" aria-hidden="true"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"/></svg></span>
<span :class="{visible: isViewTree}" v-if="isViewTree" v-cloak><svg viewBox="0 0 16 16" class="svg octicon-git-branch" width="16" height="16" aria-hidden="true"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"/></svg></span>
<strong ref="dropdownRefName" class="gt-ml-3">master</strong>
</span>
<svg viewBox="0 0 16 16" class="dropdown icon svg octicon-triangle-down" width="14" height="14" aria-hidden="true"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"/></svg>
</button>
<div class="data gt-hidden" data-mode="branches">
<div class="item branch selected" data-url="master">master</div>
<div class="item tag " data-url="v0.001">v0.001</div>
<div class="item tag " data-url="v0.002">v0.002</div>
<div class="item tag " data-url="v0.004">v0.004</div>
<div class="item tag " data-url="v0.1">v0.1</div>
<div class="item tag " data-url="v0.1.2">v0.1.2</div>
<div class="item tag " data-url="v0.2">v0.2</div>
<div class="item tag " data-url="v0.2.1">v0.2.1</div>
<div class="item tag " data-url="v0.2.2">v0.2.2</div>
<div class="item tag " data-url="v0.3.1">v0.3.1</div>
<div class="item tag " data-url="v0.3.2">v0.3.2</div>
<div class="item tag " data-url="v0.3.3">v0.3.3</div>
<div class="item tag " data-url="v0.3.4">v0.3.4</div>
<div class="item tag " data-url="v0.5">v0.5</div>
<div class="item tag " data-url="v0.5.1">v0.5.1</div>
<div class="item tag " data-url="v0.5.2">v0.5.2</div>
<div class="item tag " data-url="v0.5.3">v0.5.3</div>
<div class="item tag " data-url="v0.5.4">v0.5.4</div>
<div class="item tag " data-url="v0.5.4.1">v0.5.4.1</div>
<div class="item tag " data-url="v0.6">v0.6</div>
<div class="item tag " data-url="v0.6.1">v0.6.1</div>
<div class="item tag " data-url="v0.6.2">v0.6.2</div>
<div class="item tag " data-url="v0.6.3">v0.6.3</div>
<div class="item tag " data-url="v0.6.5">v0.6.5</div>
<div class="item tag " data-url="v0.6.6">v0.6.6</div>
</div>
<div class="menu transition" :class="{visible: menuVisible}" v-if="menuVisible" v-cloak>
<div class="ui icon search input">
<i class="icon gt-df gt-ac gt-jc gt-m-0"><svg viewBox="0 0 16 16" class="svg octicon-filter" width="16" height="16" aria-hidden="true"><path d="M.75 3h14.5a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1 0-1.5ZM3 7.75A.75.75 0 0 1 3.75 7h8.5a.75.75 0 0 1 0 1.5h-8.5A.75.75 0 0 1 3 7.75Zm3 4a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"/></svg></i>
<input name="search" ref="searchField" autocomplete="off" v-model="searchTerm" @keydown="keydown($event)" placeholder="Branch oder Tag filtern...">
</div>
<div class="header branch-tag-choice">
<div class="ui grid">
<div class="two column row">
<a class="reference column" href="#" @click="createTag = false; mode = 'branches'; focusSearchField()">
<span class="text" :class="{black: mode == 'branches'}">
<svg viewBox="0 0 16 16" class="gt-mr-2 svg octicon-git-branch" width="16" height="16" aria-hidden="true"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"/></svg>Branches
</span>
</a>
<a class="reference column" href="#" @click="createTag = true; mode = 'tags'; focusSearchField()">
<span class="text" :class="{black: mode == 'tags'}">
<svg viewBox="0 0 16 16" class="gt-mr-2 svg octicon-tag" width="16" height="16" aria-hidden="true"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"/></svg>Tags
</span>
</a>
</div>
</div>
</div>
<div class="scrolling menu" ref="scrollContainer">
<div v-for="(item, index) in filteredItems" :key="item.name" class="item" :class="{selected: item.selected, active: active == index}" @click="selectItem(item)" :ref="'listItem' + index">${ item.name }</div>
<div class="item" v-if="showCreateNewBranch" :class="{active: active == filteredItems.length}" :ref="'listItem' + filteredItems.length">
<a href="#" @click="createNewBranch()">
<div v-show="createTag">
<i class="reference tags icon"></i>
Tag <strong>${ searchTerm }</strong> erstellen
</div>
<div v-show="!createTag">
<svg viewBox="0 0 16 16" class="svg octicon-git-branch" width="16" height="16" aria-hidden="true"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"/></svg>
Erstelle Branch <strong>${ searchTerm }</strong>
</div>
<div class="text small">
von „master“
</div>
</a>
<form ref="newBranchForm" action="/MorsMortium/Friendiqa/branches/_new/branch/master" method="post">
<input type="hidden" name="_csrf" value="hRtY4yQKJpvShSAHOERpMVsB_hI6MTY4NzcwMzY4NDU0MTUwMzIyMw">
<input type="hidden" name="new_branch_name" v-model="searchTerm">
<input type="hidden" name="create_tag" v-model="createTag">
<input type="hidden" name="current_path" value="source-linux/images/friendica-tray-white.svg">
</form>
</div>
</div>
<div class="message" v-if="showNoResults">${ noResults }</div>
</div>
</div>
</div>
<span class="ui breadcrumb repo-path gt-ml-2"><a class="section" href="/MorsMortium/Friendiqa/src/branch/master" title="Friendiqa">Friendiqa</a><span class="divider">/</span><span class="section"><a href="/MorsMortium/Friendiqa/src/branch/master/source-linux" title="source-linux">source-linux</a></span><span class="divider">/</span><span class="section"><a href="/MorsMortium/Friendiqa/src/branch/master/source-linux/images" title="images">images</a></span><span class="divider">/</span><span class="active section" title="friendica-tray-white.svg">friendica-tray-white.svg</span></span>
</div>
<div class="gt-df gt-ac">
</div>
</div>
<div class="tab-size-8 non-diff-file-content">
<h4 class="file-header ui top attached header gt-df gt-ac gt-sb gt-fw">
<div class="file-header-left gt-df gt-ac gt-py-3 gt-pr-4">
<div class="file-info text grey normal gt-mono">
<div class="file-info-entry">
42 Zeilen
</div>
<div class="file-info-entry">
1.7 KiB
</div>
<div class="file-info-entry">
XML
</div>
</div>
</div>
<div class="file-header-right file-actions gt-df gt-ac gt-fw">
<div class="ui compact icon buttons two-toggle-buttons">
<a href="/MorsMortium/Friendiqa/src/branch/master/source-linux/images/friendica-tray-white.svg?display=source" class="ui mini basic button tooltip " data-content="Quelltext anzeigen" data-position="bottom center"><svg viewBox="0 0 16 16" class="svg octicon-code" width="15" height="15" aria-hidden="true"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"/></svg></a>
<a href="/MorsMortium/Friendiqa/src/branch/master/source-linux/images/friendica-tray-white.svg" class="ui mini basic button tooltip active" data-content="Ansicht rendern" data-position="bottom center"><svg viewBox="0 0 16 16" class="svg octicon-file" width="15" height="15" aria-hidden="true"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"/></svg></a>
</div>
<div class="ui buttons gt-mr-2">
<a class="ui mini basic button" href="/MorsMortium/Friendiqa/raw/branch/master/source-linux/images/friendica-tray-white.svg">Originalformat</a>
<a class="ui mini basic button" href="/MorsMortium/Friendiqa/src/commit/8dc907e345eaaebbe8b81b9b098385454e3e8f45/source-linux/images/friendica-tray-white.svg">Permalink</a>
<a class="ui mini basic button" href="/MorsMortium/Friendiqa/blame/branch/master/source-linux/images/friendica-tray-white.svg">Blame</a>
<a class="ui mini basic button" href="/MorsMortium/Friendiqa/commits/branch/master/source-linux/images/friendica-tray-white.svg">Verlauf</a>
</div>
<a download href="/MorsMortium/Friendiqa/raw/branch/master/source-linux/images/friendica-tray-white.svg"><span class="btn-octicon tooltip" data-content="Datei herunterladen" data-position="bottom center"><svg viewBox="0 0 16 16" class="svg octicon-download" width="16" height="16" aria-hidden="true"><path d="M7.47 10.78 3.72 7.03a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018l2.47 2.47V1.75a.75.75 0 0 1 1.5 0v6.69l2.47-2.47a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-3.75 3.75a.75.75 0 0 1-1.06 0ZM3.75 13h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Z"/></svg></span></a>
<a id="copy-content" class="btn-octicon tooltip" data-link="/MorsMortium/Friendiqa/raw/branch/master/source-linux/images/friendica-tray-white.svg" data-content="Copy content"><svg viewBox="0 0 16 16" class="svg octicon-copy" width="14" height="14" aria-hidden="true"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"/></svg></a>
<span class="btn-octicon tooltip disabled" data-content="Du musst dieses Repository forken, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen." data-position="bottom center"><svg viewBox="0 0 16 16" class="svg octicon-pencil" width="16" height="16" aria-hidden="true"><path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"/></svg></span>
<span class="btn-octicon tooltip disabled" data-content="Du benötigst Schreibzugriff, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen." data-position="bottom center"><svg viewBox="0 0 16 16" class="svg octicon-trash" width="16" height="16" aria-hidden="true"><path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"/></svg></span>
</div>
</h4>
<div class="ui attached table unstackable segment">
<div class="file-view">
<div class="view-raw ui center">
<img src="/MorsMortium/Friendiqa/raw/branch/master/source-linux/images/friendica-tray-white.svg">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<footer role="group" aria-label="Footer">
<div class="ui container">
<div class="ui left" role="contentinfo" aria-label="About Software">
<a target="_blank" rel="noopener noreferrer" href="https://forgejo.org">Powered by Forgejo</a>
Version:
1.19.0&#43;2
Seite: <strong>42ms</strong>
Template: <strong>1ms</strong>
</div>
<div class="ui right links" role="group" aria-label="Links">
<div class="ui language bottom floating slide up dropdown link item">
<svg viewBox="0 0 16 16" class="svg octicon-globe" width="16" height="16" aria-hidden="true"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"/></svg>
<span>Deutsch</span>
<div class="menu language-menu">
<a lang="id-ID" data-url="/?lang=id-ID" class="item ">Bahasa Indonesia</a>
<a lang="de-DE" data-url="/?lang=de-DE" class="item active selected">Deutsch</a>
<a lang="en-US" data-url="/?lang=en-US" class="item ">English</a>
<a lang="es-ES" data-url="/?lang=es-ES" class="item ">Español</a>
<a lang="fr-FR" data-url="/?lang=fr-FR" class="item ">Français</a>
<a lang="it-IT" data-url="/?lang=it-IT" class="item ">Italiano</a>
<a lang="lv-LV" data-url="/?lang=lv-LV" class="item ">Latviešu</a>
<a lang="hu-HU" data-url="/?lang=hu-HU" class="item ">Magyar nyelv</a>
<a lang="nl-NL" data-url="/?lang=nl-NL" class="item ">Nederlands</a>
<a lang="pl-PL" data-url="/?lang=pl-PL" class="item ">Polski</a>
<a lang="pt-PT" data-url="/?lang=pt-PT" class="item ">Português de Portugal</a>
<a lang="pt-BR" data-url="/?lang=pt-BR" class="item ">Português do Brasil</a>
<a lang="fi-FI" data-url="/?lang=fi-FI" class="item ">Suomi</a>
<a lang="sv-SE" data-url="/?lang=sv-SE" class="item ">Svenska</a>
<a lang="tr-TR" data-url="/?lang=tr-TR" class="item ">Türkçe</a>
<a lang="cs-CZ" data-url="/?lang=cs-CZ" class="item ">Čeština</a>
<a lang="el-GR" data-url="/?lang=el-GR" class="item ">Ελληνικά</a>
<a lang="bg-BG" data-url="/?lang=bg-BG" class="item ">Български</a>
<a lang="ru-RU" data-url="/?lang=ru-RU" class="item ">Русский</a>
<a lang="uk-UA" data-url="/?lang=uk-UA" class="item ">Українська</a>
<a lang="fa-IR" data-url="/?lang=fa-IR" class="item ">فارسی</a>
<a lang="ml-IN" data-url="/?lang=ml-IN" class="item ">മലയാളം</a>
<a lang="ja-JP" data-url="/?lang=ja-JP" class="item ">日本語</a>
<a lang="zh-CN" data-url="/?lang=zh-CN" class="item ">简体中文</a>
<a lang="zh-TW" data-url="/?lang=zh-TW" class="item ">繁體中文(台灣)</a>
<a lang="zh-HK" data-url="/?lang=zh-HK" class="item ">繁體中文(香港)</a>
<a lang="ko-KR" data-url="/?lang=ko-KR" class="item ">한국어</a>
</div>
</div>
<a href="/assets/js/licenses.txt">Lizenzen</a>
<a href="/api/swagger">API</a>
</div>
</div>
</footer>
<script src="/assets/js/index.js?v=1.19.0~2" onerror="alert('Failed to load asset files from ' + this.src + '. Please make sure the asset files can be accessed.')"></script>
</body>
</html>

View file

@ -180,7 +180,7 @@ function updateData(database,table, username, key, value, callback,filter,filter
function showMessage(header,message,rootwindow){//print(message);
var cleanmessage=message.replace(/"/g,"-");
if(cleanmessage.length>200){cleanmessage=cleanmessage.slice(0,200)+'...'}
var messageString='import QtQuick 2.0; import QtQuick.Controls 2.15; import QtQuick.Controls.Material 2.12; Dialog{ visible: true; title:"'+header+'";standardButtons: Dialog.Ok;anchors.centerIn: parent;Label{text:" '+cleanmessage+'"}}';
var messageString='import QtQuick 2.0; import QtQuick.Controls 2.15; Dialog{ visible: true; title:"'+header+'";standardButtons: Dialog.Ok;anchors.centerIn: parent;Label{text:" '+cleanmessage+'"}}';
var messageObject=Qt.createQmlObject(messageString,rootwindow,"messageOutput");
}

View file

@ -313,6 +313,9 @@ function newsfromdb(database,login,messagetype,callback,contact,stop_time){
for(var i = 0; i < newsrs.rows.length; i++) {
newsArray.push(newsrs.rows.item(i));
if(newsArray[i].statusnet_html==""){
newsArray[i].statusnet_html=newsArray[i].text
}
newsArray[i].statusnet_html=Qt.atob(newsArray[i].statusnet_html);
newsArray[i].text=Qt.atob(newsArray[i].text);
newsArray[i].id=newsArray[i].status_id;

View file

@ -30,7 +30,6 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.11
import QtQuick.Controls.Material 2.12
//import QtQuick.Controls 2.4
Item {
@ -51,7 +50,7 @@ Item {
id:daytext
anchors.right: parent.right
anchors.margins: 0.5*mm
color:(model.month==monthgrid.month)?Material.primaryTextColor:Material.secondaryTextColor
color:(model.month==monthgrid.month)?osSettings.primaryTextColor:osSettings.secondaryTextColor
wrapMode: Text.WrapAnywhere
text: model.day
font.bold: model.today

View file

@ -29,11 +29,10 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0
import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.12
import QtQml 2.2
import Qt.labs.calendar 1.0
import QtQuick 2.15
import QtQuick.Controls 6.3
//import Qt.labs.calendar 1.0
//import QtQuick.Layouts 1.3
import "qrc:/js/service.js" as Service
import "qrc:/js/helper.js" as Helperjs
@ -45,7 +44,7 @@ Rectangle {
// y:1
width:parent.width
height:parent.height
color: Material.backgroundColor
color: osSettings.backgroundColor
property date currentTime: new Date()
property int offsetTime: currentTime.getTimezoneOffset() * 60 * 1000
property var events:[]
@ -128,7 +127,7 @@ Rectangle {
anchors.topMargin: 0.5*mm
anchors.right:calendartabstatusButton.left
anchors.rightMargin:mm
width: 2*root.fontFactor*osSettings.bigFontSize;
//width: 2*root.fontFactor*osSettings.bigFontSize;
text:"\uf021"
onClicked: {
calBusy.running=true;
@ -223,7 +222,7 @@ Rectangle {
orientation: ListView.Horizontal
highlightRangeMode: ListView.StrictlyEnforceRange
model: CalendarModel {id:calendarModel
model: CalendarModel {id:calendarModel
from: new Date()
to: new Date(new Date().valueOf()+93312000000)
}
@ -236,7 +235,7 @@ Rectangle {
//Layout.fillWidth: true
width: parent.width-root.fontFactor*osSettings.bigFontSize
horizontalAlignment:Text.AlignHCenter
color: Material.primaryTextColor
color: osSettings.primaryTextColor
text: model.year
font.pointSize: osSettings.systemFontSize
}
@ -244,7 +243,7 @@ Rectangle {
width: parent.width-osSettings.bigFontSize
text: Qt.locale().standaloneMonthName(model.month)
//Layout.fillWidth: true
color: Material.primaryTextColor
color: osSettings.primaryTextColor
horizontalAlignment:Text.AlignHCenter
font.pointSize: osSettings.systemFontSize
}

View file

@ -31,7 +31,6 @@
import QtQuick 2.0
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import QtQuick.Controls 1.4 as Oldcontrols
import "qrc:/js/service.js" as Service
import "qrc:/js/helper.js" as Helperjs
@ -56,7 +55,7 @@ Flickable{
id: eventRect
width: root.width
height: textColumn.height + 6*root.fontFactor*osSettings.bigFontSize
color: Material.backgroundColor
color: osSettings.backgroundColor
MButton{
id:closeButton
anchors.top: parent.top
@ -74,7 +73,7 @@ Flickable{
height: root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
//verticalAlignment: TextInput.AlignBottom
color: Material.primaryTextColor
color: osSettings.primaryTextColor
text:qsTr("Start")
}
@ -139,7 +138,7 @@ Flickable{
width: 3*root.fontFactor*osSettings.bigFontSize
height: root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
color: Material.primaryTextColor
color: osSettings.primaryTextColor
text:qsTr("End")
}
TextField {
@ -293,7 +292,7 @@ Flickable{
}
Rectangle{
color: Material.backgroundColor
color: osSettings.backgroundColor
radius: 0.5*mm
width: parent.width-root.fontFactor*osSettings.bigFontSize
height:Math.max(bodyField.contentHeight+root.fontFactor*osSettings.bigFontSize,2.5*root.fontFactor*osSettings.bigFontSize)
@ -391,7 +390,7 @@ Flickable{
Label {
text: formatText(Tumbler.tumbler.count, modelData)
opacity: 1.0 - Math.abs(Tumbler.displacement) / (Tumbler.tumbler.visibleItemCount / 2)
color:Material.primaryTextColor
color: osSettings.primaryTextColor
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
font.pointSize: osSettings.systemFontSize

View file

@ -31,7 +31,6 @@
import QtQuick 2.0
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/js/service.js" as Service
import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml"
@ -39,7 +38,7 @@ import "qrc:/qml/calendarqml"
Rectangle{
id:eventList
color: Material.backgroundColor
color: osSettings.backgroundColor
property var daylist:[]
property int dayint: 0
property var events:[]
@ -50,6 +49,7 @@ Rectangle{
anchors.topMargin: 1*mm
anchors.right: parent.right
anchors.rightMargin: 1*mm
width: 2*root.fontFactor*osSettings.bigFontSize;
text: "\uf057"
onClicked:{rootstackView.pop()}
}

View file

@ -31,7 +31,6 @@
import QtQuick 2.0
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/js/service.js" as Service
import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml"
@ -43,8 +42,8 @@ Rectangle{
property var currEvent: event
width:parent.width
height:Math.max(eventNameText.height+eventDetailsText.height,profileImage.height)+mm
border.color: Material.backgroundDimColor
color: Material.backgroundColor
//border.color: osSettings.backgroundDimColor
color: osSettings.backgroundColor
border.width: 1
radius: 0.5*mm
Image {
@ -61,7 +60,7 @@ Rectangle{
x: 8*mm
width:parent.width-8*mm
height:contentHeight
color: Material.primaryTextColor
color: osSettings.primaryTextColor
textFormat: Text.RichText
font.pointSize: osSettings.systemFontSize
text: new Date(event.start).toLocaleString(Qt.locale(),Locale.NarrowFormat)+ " - " +((event.end>0)&&(event.end!=null)?new Date(event.end).toLocaleString(Qt.locale(),Locale.NarrowFormat):"\u221E")+":<br>"+(status=="large"?"<b>"+event.title+"</b>":event.title)
@ -74,7 +73,7 @@ Rectangle{
z:4
width: parent.width-8*mm
height: contentHeight
color: Material.primaryTextColor
color: osSettings.primaryTextColor
textFormat: Text.RichText
text: status!="large"?"":Qt.atob(event.desc) + (event.location==""?"":"<br><br>"+qsTr("Location")+": "+event.location)
anchors.top: eventNameText.bottom

View file

@ -31,7 +31,6 @@
import QtQuick 2.0
import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.12
Dialog {
id: rulesDialog
@ -57,8 +56,8 @@ Dialog {
x:1; y:1
width: root.width-4*root.fontFactor*osSettings.bigFontSize
wrapMode: TextEdit.Wrap
color: Material.primaryTextColor
linkColor: Material.accentColor
color: osSettings.primaryTextColor
linkColor: osSettings.secondaryTextColor
textFormat: Text.PlainText
font.family: "Noto Sans"
font.pointSize: osSettings.systemFontSize

View file

@ -29,11 +29,12 @@
// 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 2.12
import QtQuick 6.3
import QtCore 6.3
import QtQuick.Dialogs 6.3
import QtQuick.Controls 6.3
import QtQuick.Layouts 1.12
import QtQml.Models 2.15
import QtQml.Models 6.3
import "qrc:/js/service.js" as Service
import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/configqml"
@ -55,495 +56,494 @@ Page{
xhr.clearParams();
xhr.get();
}
}
}
function verify(userconfig){
Helperjs.friendicaRequest(userconfig,"/api/v1/accounts/verify_credentials",root,function(obj){
accountBusy.running=false;
try{var credentials=JSON.parse(obj);
if (credentials.hasOwnProperty('error')){
Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root)
}
else{
if (users.length==0){Service.setDefaultOptions(db);}
if (userconfig.APIVersion!=""){userconfig.password=""}
if (imagestoredir==""){
imagestoredir=filesystem.homePath+"/"+credentials.username+"/";
userconfig.imagestore=imagestoredir
accountBusy.running=false;
try{var credentials=JSON.parse(obj);
if (credentials.hasOwnProperty('error')){
Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root)
}
if(userconfig.imagestore == filesystem.homePath+"/"+credentials.username+"/")
else{
if (users.length==0){Service.setDefaultOptions(db);}
if (userconfig.APIVersion!=""){userconfig.password=""}
if (imagestoredir==""){
imagestoredir=filesystem.homePath+"/"+credentials.username+"/";
userconfig.imagestore=imagestoredir
}
if(userconfig.imagestore == filesystem.homePath+"/"+credentials.username+"/")
{filesystem.makePath(filesystem.homePath+"/"+credentials.username);}
print("imagestoredir "+imagestoredir)
filesystem.Directory=imagestoredir;
filesystem.makeDir("contacts");
filesystem.makeDir("albums");
userconfig.accountId=credentials.id;
userconfig.username=credentials.username;
Service.storeConfig(db,userconfig);
print("imagestoredir "+imagestoredir)
filesystem.Directory=imagestoredir;
filesystem.makeDir("contacts");
filesystem.makeDir("albums");
userconfig.accountId=credentials.id;
userconfig.username=credentials.username;
Service.storeConfig(db,userconfig);
Service.readConfig(db,function(userconfig){
Helperjs.readData(db,"config","",function(storedUsers){
storedUsers.sort(function(obj1, obj2) {
return obj1.isActive - obj2.isActive;
});
accountPage.users=storedUsers});
//reset values
login=userconfig;
news=[];
contactlist=[];
rootstack.currentIndex=0;
newstypeSignal("refresh");
},"isActive",0);
Helperjs.showMessage(qsTr("Success"),qsTr("Name")+": "+credentials.display_name+"\nScreen Name: "+credentials.username,root)
rootstackView.pop()
}
}catch(e){Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root)};
})
}
BusyIndicator{
id: accountBusy
anchors.centerIn: parent
width: 5*root.fontFactor*osSettings.bigFontSize
height: 5*root.fontFactor*osSettings.bigFontSize
running: false
}
ColumnLayout{
x: root.fontFactor*osSettings.bigFontSize
width: root.width - 2*mm
y: root.fontFactor*osSettings.bigFontSize
spacing: root.fontFactor*osSettings.bigFontSize
Row{
spacing:0.5*mm
height: userButton.height
width: parent.width
MButton{
id:userButton
text:qsTr("User")
font.pointSize: osSettings.bigFontSize
visible: users.length>0
onClicked:{
var useritems="";
for (var i=0;i<accountPage.users.length;i++){
useritems=useritems+"MenuItem{font.pointSize: osSettings.bigFontSize;width:accountPage.width*2/3; text:'"+accountPage.users[i].username+
"'; onTriggered: {Service.readConfig(db,function(obj){
userButton.text=obj.username;
servername.text=obj.server;
serverModel.insert(0,{text:obj.server})
accountPage.setServericon(obj.server);
username.text= obj.username;
password.text=Qt.atob(obj.password);
imagestore.text=obj.imagestore;
imagestoredir=obj.imagestore;
if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'}
if(obj.password!=''){accountPage.state='password'}
else if (obj.token!=''){accountPage.state='oauth'}
},'username','"+ accountPage.users[i].username+"')}}"
}
var menuString="import QtQuick.Controls 2.15;import 'qrc:/js/service.js' as Service;"+
" Menu {width:8*root.fontFactor*osSettings.bigFontSize;"+useritems+"}";
var userlistObject=Qt.createQmlObject(menuString,accountPage,"usermenuOutput")
userlistObject.popup() }
}
MButton {
visible: users.length>0
text: "-"
font.pointSize: osSettings.bigFontSize
onClicked:{
var userconfig={server: servername.text, username: username.text, password: Qt.btoa(password.text)};
Service.readConfig(db,function(user){
if(userdata.token!=""){xhr.setUrl(servername.text);
xhr.setApi("/oauth/revoke");
xhr.clearParams();
xhr.setParam("client_id",user.client.client_id);
xhr.setParam("client_secret",user.client.client_secret);
xhr.setParam("token",user.token);
xhr.post();
}
},"username",username.text);
Service.deleteConfig(db,userconfig,function(){
filesystem.Directory=imagestore.text+"contacts";
filesystem.rmDir();
filesystem.Directory=imagestore.text+"albums";
filesystem.rmDir();
servername.text="https://";
servericon.visible=false;
servericon.source="";
username.text="";
password.text="";
imagestore.text="";
userButton.text=qsTr("User");
Helperjs.readData(db,"config","",function(storedUsers){
storedUsers.sort(function(obj1, obj2) {
return obj1.isActive - obj2.isActive;
})
accountPage.users=storedUsers;})
accountPage.state="new_oauth"
})
}}
MButton {
visible: users.length>0
text: "+"
font.pointSize: osSettings.bigFontSize
onClicked:{
servername.text="https://"
servericon.visible=false;
servericon.source="";
username.text=""
password.text=""
imagestore.text=""
userButton.text=qsTr("User")
accountPage.state="new_oauth"
}
}
MButton {
text: "?"
font.pointSize: osSettings.bigFontSize
onClicked:{
rootstackView.push("qrc:/qml/configqml/InfoBox.qml");
}
}
MButton{
id:closeButton
visible: users.length>0
text: "\uf057"
font.pointSize: osSettings.bigFontSize
onClicked:{rootstackView.pop()}
}
}
Row{
spacing:0.5*mm
height: 3*root.fontFactor*osSettings.bigFontSize
width: parent.width
Image{
id:servericon
width:2.5*root.fontFactor*osSettings.bigFontSize; height: 2.5*root.fontFactor*osSettings.bigFontSize
visible: false
source:""
property var serverconfig:({})
MouseArea{
anchors.fill:parent
onClicked:{
let serverConfigString="import QtQuick 2.0; import QtQuick.Dialogs 6.3; MessageDialog{ visible: true; title:'Server';buttons: MessageDialog.Ok;text: 'Name: "+
servericon.serverconfig.site.name+"\nLanguage: "+servericon.serverconfig.site.language+
"\nEmail: "+servericon.serverconfig.site.email+"\nTimezone: "+servericon.serverconfig.site.timezone+"\nClosed: "+servericon.serverconfig.site.closed+
"\nText limit: "+servericon.serverconfig.site.textlimit+"\nShort Url length: "+servericon.serverconfig.site.shorturllength+
"\nFriendica version: "+servericon.serverconfig.site.friendica.FRIENDICA_VERSION+
"\nDB Update version: "+servericon.serverconfig.site.friendica.DB_UPDATE_VERSION+"'}";
var serverconfigObject=Qt.createQmlObject(serverConfigString,accountPage,"serverconfigOutput");
}
}
}
FontLoader{id: fontAwesome; source: "qrc:/images/fontawesome-webfont.ttf"}
MButton{
id:serverSearchButton
width: 3*root.fontFactor*osSettings.bigFontSize; height: 2.5*root.fontFactor*osSettings.bigFontSize
text:"\uf002"
icon.name: "search"
font.pointSize: osSettings.bigFontSize
visible: servericon.visible?false:true
onClicked:{Qt.openUrlExternally(Qt.resolvedUrl("https://dir.friendica.social/servers"))}
}
// ComboBox{
// id: servername
// x: 4*root.fontFactor*osSettings.bigFontSize
// y: 3.5*root.fontFactor*osSettings.bigFontSize
// width: root.width-5*root.fontFactor*osSettings.bigFontSize
// height: 2.5*root.fontFactor*osSettings.bigFontSize//5*mm;
// font.pointSize: osSettings.systemFontSize
// editable:true
// model: serverModel
// onAccepted: {
// let cleanText =currentText;if(currentText==""){cleanText=editText}
// if((cleanText).substring(0,8) !=="https://"){
// cleanText="https://"+cleanText
// }
// if (find(cleanText) === -1) {
// serverModel.append({text: cleanText})
// currentIndex = find(cleanText)
// displayText=cleanText
// }
// if (cleanText!=""){accountPage.setServericon(cleanText)}
// }
// onFocusChanged: {
// if(focus==false){
// onAccepted()
// }
// }
// }
TextField {
id: servername
width: root.width-5*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
text:"https://"
onFocusChanged:{
if (focus){servermenu.open()}
else{
if((servername.text).substring(0,11) =="https://http"){
servername.text= (servername.text).substring(8)
}
if (servername.text!="https://"){
accountPage.setServericon(servername.text)}
}
}
}
Menu {
id:servermenu
width: 13*root.fontFactor*osSettings.bigFontSize
Instantiator{
model:serverModel
MenuItem{
text: modelData
onTriggered: {servername.text=modelData}
}
onObjectAdded:{servermenu.insertItem(index,object)}
onObjectRemoved:{servermenu.removeItem(object)}
}
}
ListModel{id:serverModel
ListElement{text:"https://anonsys.net"}
ListElement{text:"https://asaps-sm.lafayettegroup.com"}
ListElement{text:"https://f.freinetz.ch"}
ListElement{text:"https://friendica.chilemasto.casa"}
ListElement{text:"https://friendica.eskimo.com"}
ListElement{text:"https://friendica.me"}
ListElement{text:"https://friendica.opensocial.space"}
ListElement{text:"https://friendica.utzer.de"}
ListElement{text:"https://friendica.vrije-mens.org"}
ListElement{text:"https://libranet.de"}
ListElement{text:"https://loma.ml"}
ListElement{text:"https://nerdica.net"}
ListElement{text:"https://nsfw.wnymathguy.com"}
ListElement{text:"https://opensocial.at"}
ListElement{text:"https://poliverso.org"}
ListElement{text:"https://social.isurf.ca"}
ListElement{text:"https://social.trom.tf"}
ListElement{text:"https://squeet.me"}
ListElement{text:"https://venera.social"}
}
}
MButton {
id: ruleButton
width: parent.width
visible: (osSettings.osType=="Android") && (userButton.text== qsTr("User"))
height: 2*root.fontFactor*osSettings.bigFontSize;
text: qsTr("Instance rules")
font.pointSize: osSettings.bigFontSize
onClicked:{
xhr.setUrl(servername.text);
xhr.setApi("/api/v1/instance/rules");
xhr.clearParams();
xhr.get();
}
}
TextField {
id: username
width: root.width-5*root.fontFactor*osSettings.bigFontSize
height: servername.height
Layout.leftMargin: 3*root.fontFactor*osSettings.bigFontSize;
font.pointSize: osSettings.systemFontSize
visible: (osSettings.osType=="Android")?(text!= ""):true
placeholderText: qsTr("Nickname")
selectByMouse: true
onEditingFinished: {
if (username.text.indexOf('@')>-1){
Helperjs.showMessage(qsTr("Error"),qsTr("Nicknames containing @ symbol currently not supported"),accountPage)
}
imagestoredir=filesystem.homePath+"/"+username.text+"/"
}
}
TextField {
id: password
width: root.width-9*mm; height: 2.5*root.fontFactor*osSettings.bigFontSize;
font.pointSize: osSettings.systemFontSize
visible: (osSettings.osType=="Android")?(userButton.text!= qsTr("User")):true
selectByMouse: true
echoMode: TextInput.Password
placeholderText: qsTr("Password")
inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText | Qt.ImhSensitiveData
}
Row{
spacing:0.5*mm
height: 3*root.fontFactor*osSettings.bigFontSize
width: parent.width
Label {
id: imagedirlabel
visible: imagestore.text!=""
text: qsTr("Image dir.")
font.pointSize: osSettings.systemFontSize
}
TextField {
id: imagestore
width: root.width-17*mm;
height: 2.5*root.fontFactor*osSettings.bigFontSize;
visible:imagestore.text!=""
font.pointSize: osSettings.systemFontSize
selectByMouse: true
text: ""
wrapMode: TextEdit.NoWrap
onTextChanged: imagestoredir=imagestore.text
}
MButton {
visible:imagestore.text!=""
text: "..."
font.pointSize: osSettings.bigFontSize
onClicked:{imagestoreDialog.open()}
}
FolderDialog {
id: imagestoreDialog
title: "Please choose a directory"
currentFolder: StandardPaths.standardLocations(StandardPaths.PicturesLocation)[0]
//selectFolder: true
onAccepted: {
var imagestoreString=imagestoreDialog.selectedFolder.toString();
imagestoreString=imagestoreString.replace(/^(file:\/{2})/,"")+"/"
imagestore.text=imagestoreString
}
}
}
MButton {
id:confirmationOAuth
width: parent.width
text: qsTr("Connect")
font.pointSize: osSettings.bigFontSize
visible: (osSettings.osType=="Android")?userButton.text!= qsTr("User"):true
onClicked:{
if (servername.text==""){Helperjs.showMessage(qsTr("Error"), qsTr("No server given!"),root)}
else{
xhr.setUrl(servername.text);
xhr.setApi("/api/v1/apps");
xhr.clearParams();
if (osSettings.osType=="Android"){
xhr.setParam("client_name","Friendiqa-Android");
} else {
xhr.setParam("client_name","Friendiqa-"+filesystem.hostname);
}
xhr.setParam("redirect_uris","http://127.0.0.1:1337/");
xhr.setParam("scopes","read write follow push");
xhr.setParam("website","https://friendiqa.ma-nic.de");
xhr.post();
}
}
}
Connections{
target: xhr
function onSuccess(text,api){
if(api=="/api/v1/instance/rules"){
let rulestext="";
let rulesarray=JSON.parse(text)
for (let rule in rulesarray){
rulestext=rulestext+rulesarray[rule].text+"\n"
}
var component = Qt.createComponent("qrc:/qml/configqml/AcceptRules.qml");
var rulesdialog = component.createObject(accountPage,{"rules": rulestext});
rulesdialog.open();
}
else if(api=="/api/statusnet/config"){
try{let serverdata = JSON.parse(text);
servericon.visible=true;
servericon.source=serverdata.site.logo;
servericon.serverconfig=serverdata;
}
catch(e){print(e)}
}
else if (api=="/api/v1/apps"){print("/api/v1/apps text "+text)
let app=JSON.parse(text);
accountPage.appdata=app;
oauth2.setClientId(app.client_id);
oauth2.setClientSecret(app.client_secret);
oauth2.setServer(servername.text);
oauth2.grant();
}
}
function onError(text,api){
print(api + " Error "+ text)
}
}
Connections{
target: oauth2
function onSuccess(text){
var userconfig={server: servername.displayText, username:"", password:"", imagestore: imagestoredir,interval:"",token: text,client:Qt.btoa(JSON.stringify(appdata))}
verify(userconfig)
}
function onError(text){
Helperjs.showMessage(qsTr("Error"), qsTr("Couldn't connect to server"),root)
print ("oauth2 onerror "+text)
}
}
MButton {
id:confirmation
width: 10*root.fontFactor*osSettings.bigFontSize;
text: qsTr("Confirm")
font.pointSize: osSettings.bigFontSize
visible: false// (osSettings.osType=="Android")?userButton.text!= qsTr("User"):true
onClicked:{
accountBusy.running=true;
var userconfig={server: servername.displayText, username: username.text, password:Qt.btoa(password.text), imagestore:imagestoredir,interval:""};
var errormessage="";
if (servername.text==""){errormessage=qsTr("No server given! ")}
else if (username.text==""){errormessage+=qsTr("No nickname given! ")}
else if (password.text=="") {errormessage+=qsTr("No password given! ")}
else if (imagestoredir=="") {errormessage+=qsTr("No image directory given!")}
else {errormessage=""}
if (errormessage=="") {verify(userconfig)}
else {Helperjs.showMessage(qsTr("Error"), errormessage,root)}
}}
MButton {
id: setDefault
width: 10*root.fontFactor*osSettings.bigFontSize;
text: qsTr("Set as default")
font.pointSize: osSettings.bigFontSize
visible: false
onClicked:{
accountBusy.running=true;
let users=updatenews.getAccounts("username",username.text)
Service.storeConfig(db,users[0]);
Service.readConfig(db,function(userconfig){
Helperjs.readData(db,"config","",function(storedUsers){
storedUsers.sort(function(obj1, obj2) {
return obj1.isActive - obj2.isActive;
});
accountPage.users=storedUsers});
//reset values
//reset values
login=userconfig;
news=[];
contactlist=[];
rootstack.currentIndex=0;
newstypeSignal("refresh");
},"isActive",0);
Helperjs.showMessage(qsTr("Success"),qsTr("Name")+": "+credentials.display_name+"\nScreen Name: "+credentials.username,root)
Helperjs.showMessage(qsTr("Success"),"Screen Name: "+users[0].username,root)
rootstackView.pop()
}
}catch(e){Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root)};
})}
MButton{
id:userButton
text:qsTr("User")
font.pointSize: osSettings.bigFontSize
x: root.fontFactor*osSettings.bigFontSize
y: root.fontFactor*osSettings.bigFontSize
width: root.width/2 - 2*mm
height: 2*root.fontFactor*osSettings.bigFontSize
visible: users.length>0
onClicked:{
var useritems="";
for (var i=0;i<accountPage.users.length;i++){
useritems=useritems+"MenuItem{font.pointSize: osSettings.bigFontSize;width:accountPage.width*2/3; text:'"+accountPage.users[i].username+
"'; onTriggered: {Service.readConfig(db,function(obj){
userButton.text=obj.username;
servername.text=obj.server;
serverModel.insert(0,{text:obj.server})
accountPage.setServericon(obj.server);
username.text= obj.username;
password.text=Qt.atob(obj.password);
imagestore.text=obj.imagestore;
imagestoredir=obj.imagestore;
if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'}
if(obj.password!=''){accountPage.state='password'}
else if (obj.token!=''){accountPage.state='oauth'}
},'username','"+ accountPage.users[i].username+"')}}"
}
var menuString="import QtQuick.Controls 2.12;import 'qrc:/js/service.js' as Service;"+
" Menu {width:8*root.fontFactor*osSettings.bigFontSize;"+useritems+"}";
var userlistObject=Qt.createQmlObject(menuString,accountPage,"usermenuOutput")
userlistObject.popup() }
}
Image{
id:servericon
x:root.fontFactor*osSettings.bigFontSize;y:3*root.fontFactor*osSettings.bigFontSize
width:2.5*root.fontFactor*osSettings.bigFontSize; height: 2.5*root.fontFactor*osSettings.bigFontSize
visible: false
source:""
property var serverconfig:({})
MouseArea{
anchors.fill:parent
onClicked:{
let serverConfigString="import QtQuick 2.0; import QtQuick.Dialogs 1.2; MessageDialog{ visible: true; title:'Server';standardButtons: StandardButton.Ok;text: 'Name: "+
servericon.serverconfig.site.name+"\nLanguage: "+servericon.serverconfig.site.language+
"\nEmail: "+servericon.serverconfig.site.email+"\nTimezone: "+servericon.serverconfig.site.timezone+"\nClosed: "+servericon.serverconfig.site.closed+
"\nText limit: "+servericon.serverconfig.site.textlimit+"\nShort Url length: "+servericon.serverconfig.site.shorturllength+
"\nFriendica version: "+servericon.serverconfig.site.friendica.FRIENDICA_VERSION+
"\nDB Update version: "+servericon.serverconfig.site.friendica.DB_UPDATE_VERSION+"'}";
var serverconfigObject=Qt.createQmlObject(serverConfigString,accountPage,"serverconfigOutput");
}
}
}
FontLoader{id: fontAwesome; source: "qrc:/images/fontawesome-webfont.ttf"}
MButton{
id:serverSearchButton
text:"\uf002"
icon.name: "search"
font.pointSize: osSettings.bigFontSize
x:root.fontFactor*osSettings.bigFontSize
y:3*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize; height:2*root.fontFactor*osSettings.bigFontSize
visible: servericon.visible?false:true
onClicked:{Qt.openUrlExternally(Qt.resolvedUrl("https://dir.friendica.social/servers"))}
}
// ComboBox{
// id: servername
// x: 4*root.fontFactor*osSettings.bigFontSize
// y: 3.5*root.fontFactor*osSettings.bigFontSize
// width: root.width-5*root.fontFactor*osSettings.bigFontSize
// height: 2.5*root.fontFactor*osSettings.bigFontSize//5*mm;
// font.pointSize: osSettings.systemFontSize
// editable:true
// model: serverModel
// onAccepted: {
// let cleanText =currentText;if(currentText==""){cleanText=editText}
// if((cleanText).substring(0,8) !=="https://"){
// cleanText="https://"+cleanText
// }
// if (find(cleanText) === -1) {
// serverModel.append({text: cleanText})
// currentIndex = find(cleanText)
// displayText=cleanText
// }
// if (cleanText!=""){accountPage.setServericon(cleanText)}
// }
// onFocusChanged: {
// if(focus==false){
// onAccepted()
// }
// }
// }
TextField {
id: servername
x: 4*root.fontFactor*osSettings.bigFontSize
y: 3.5*root.fontFactor*osSettings.bigFontSize
width: root.width-5*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.systemFontSize
text:"https://"
onFocusChanged:{
if (focus){servermenu.open()}
else{
if((servername.text).substring(0,11) =="https://http"){
servername.text= (servername.text).substring(8)
}
if (servername.text!="https://"){
accountPage.setServericon(servername.text)}
}
}
}
Menu {
id:servermenu
width: 13*root.fontFactor*osSettings.bigFontSize
x: 4*root.fontFactor*osSettings.bigFontSize
y: 5*root.fontFactor*osSettings.bigFontSize
Instantiator{
model:serverModel
MenuItem{
text: modelData
onTriggered: {servername.text=modelData}
}
onObjectAdded: servermenu.insertItem(index,object)
onObjectRemoved: servermenu.removeItem(object)
}
}
ListModel{id:serverModel
ListElement{text:"https://anonsys.net"}
ListElement{text:"https://asaps-sm.lafayettegroup.com"}
ListElement{text:"https://f.freinetz.ch"}
ListElement{text:"https://friendica.chilemasto.casa"}
ListElement{text:"https://friendica.eskimo.com"}
ListElement{text:"https://friendica.me"}
ListElement{text:"https://friendica.opensocial.space"}
ListElement{text:"https://friendica.utzer.de"}
ListElement{text:"https://friendica.vrije-mens.org"}
ListElement{text:"https://libranet.de"}
ListElement{text:"https://loma.ml"}
ListElement{text:"https://nerdica.net"}
ListElement{text:"https://nsfw.wnymathguy.com"}
ListElement{text:"https://opensocial.at"}
ListElement{text:"https://poliverso.org"}
ListElement{text:"https://social.isurf.ca"}
ListElement{text:"https://social.trom.tf"}
ListElement{text:"https://squeet.me"}
ListElement{text:"https://venera.social"}
}
MButton {
id: ruleButton
x: root.fontFactor*osSettings.bigFontSize; y: 6*root.fontFactor*osSettings.bigFontSize; width: root.width-9*mm;
visible: (osSettings.osType=="Android") && (userButton.text== qsTr("User"))
height: 2*root.fontFactor*osSettings.bigFontSize;
text: qsTr("Instance rules")
font.pointSize: osSettings.bigFontSize
onClicked:{
xhr.setUrl(servername.text);
xhr.setApi("/api/v1/instance/rules");
xhr.clearParams();
xhr.get();
}
}
TextField {
id: username
x: root.fontFactor*osSettings.bigFontSize; y: 6*root.fontFactor*osSettings.bigFontSize; width: root.width-9*mm; //height: 5*mm;
font.pointSize: osSettings.systemFontSize
visible: (osSettings.osType=="Android")?(userButton.text!= qsTr("User")):true
placeholderText: qsTr("Nickname")
selectByMouse: true
onEditingFinished: {
if (username.text.indexOf('@')>-1){
Helperjs.showMessage(qsTr("Error"),qsTr("Nicknames containing @ symbol currently not supported"),accountPage)
}
imagestoredir=filesystem.homePath+"/"+username.text+"/"
//if (imagestore.text==filesystem.homePath+"/.friendiqa/"){imagestore.text=filesystem.homePath+"/.friendiqa/"+username.text+"/"}
}
}
TextField {
id: password
x: root.fontFactor*osSettings.bigFontSize; y: 9*root.fontFactor*osSettings.bigFontSize; width: root.width-9*mm; //height: 5*mm;
font.pointSize: osSettings.systemFontSize
visible: (osSettings.osType=="Android")?(userButton.text!= qsTr("User")):true
selectByMouse: true
echoMode: TextInput.Password
placeholderText: qsTr("Password")
inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText | Qt.ImhSensitiveData
}
Label {
id: imagedirlabel
visible: imagestore.text!=""
text: qsTr("Image dir.")
font.pointSize: osSettings.systemFontSize
x: root.fontFactor*osSettings.bigFontSize; y: 12*root.fontFactor*osSettings.bigFontSize
}
TextField {
id: imagestore
x: root.fontFactor*osSettings.bigFontSize; y: 13*root.fontFactor*osSettings.bigFontSize; width: root.width-17*mm; //height: 5*mm;
visible:imagestore.text!=""
font.pointSize: osSettings.systemFontSize
selectByMouse: true
text: "" //filesystem.homePath+"/.friendiqa/"+username.text+"/" //(osSettings.osType=="Android") && (filesystem.fileexist("/storage/emulated/0/Pictures/"))?"/storage/emulated/0/Pictures/":""
wrapMode: TextEdit.NoWrap
onTextChanged: imagestoredir=imagestore.text
}
MButton {
x: root.width-3*root.fontFactor*osSettings.bigFontSize; y: 13*root.fontFactor*osSettings.bigFontSize;
height: 2*root.fontFactor*osSettings.bigFontSize;
visible:imagestore.text!=""
text: "..."
font.pointSize: osSettings.bigFontSize
onClicked:{imagestoreDialog.open()}
}
FileDialog {
id: imagestoreDialog
title: "Please choose a directory"
folder: shortcuts.pictures
selectFolder: true
onAccepted: {
var imagestoreString=imagestoreDialog.folder.toString();
imagestoreString=imagestoreString.replace(/^(file:\/{2})/,"")+"/"
imagestore.text=imagestoreString
}
}
BusyIndicator{
id: accountBusy
anchors.horizontalCenter: parent.horizontalCenter
y: 16*root.fontFactor*osSettings.bigFontSize
width:10*mm
height: 10*mm
running: false
}
MButton {
id:confirmationOAuth
x: root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize
text: qsTr("Connect")
font.pointSize: osSettings.bigFontSize
visible: (osSettings.osType=="Android")?userButton.text!= qsTr("User"):true
onClicked:{
if (servername.text==""){Helperjs.showMessage(qsTr("Error"), qsTr("No server given!"),root)}
else{
xhr.setUrl(servername.text);
xhr.setApi("/api/v1/apps");
xhr.clearParams();
if (osSettings.osType=="Android"){
xhr.setParam("client_name","Friendiqa-Android");
} else {
xhr.setParam("client_name","Friendiqa-"+filesystem.hostname);
}
xhr.setParam("redirect_uris","http://127.0.0.1:1337/");
xhr.setParam("scopes","read write follow push");
xhr.setParam("website","https://friendiqa.ma-nic.de");
xhr.post();
}
}
}
Connections{
target: xhr
function onSuccess(text,api){
if(api=="/api/v1/instance/rules"){
let rulestext="";
let rulesarray=JSON.parse(text)
for (let rule in rulesarray){
rulestext=rulestext+rulesarray[rule].text+"\n"
}
var component = Qt.createComponent("qrc:/qml/configqml/AcceptRules.qml");
var rulesdialog = component.createObject(accountPage,{"rules": rulestext});
rulesdialog.open();
}
else if(api=="/api/statusnet/config"){
try{let serverdata = JSON.parse(text);
servericon.visible=true;
servericon.source=serverdata.site.logo;
servericon.serverconfig=serverdata;
}
catch(e){print(e)}
}
else if (api=="/api/v1/apps"){print("/api/v1/apps text "+text)
let app=JSON.parse(text);
accountPage.appdata=app;
oauth2.setClientId(app.client_id);
oauth2.setClientSecret(app.client_secret);
oauth2.setServer(servername.text);
oauth2.grant();
}
}
function onError(text,api){
print(api + " Error "+ text)
}
}
Connections{
target: oauth2
function onSuccess(text){
var userconfig={server: servername.displayText, username:"", password:"", imagestore: imagestoredir,interval:"",token: text,client:Qt.btoa(JSON.stringify(appdata))}
verify(userconfig)
}
function onError(text){
Helperjs.showMessage(qsTr("Error"), qsTr("Couldn't connect to server"),root)
print ("oauth2 onerror "+text)
}
}
MButton {
id:confirmation
x: root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize
text: qsTr("Confirm")
font.pointSize: osSettings.bigFontSize
visible: false// (osSettings.osType=="Android")?userButton.text!= qsTr("User"):true
onClicked:{
accountBusy.running=true;
var userconfig={server: servername.displayText, username: username.text, password:Qt.btoa(password.text), imagestore:imagestoredir,interval:""};
var errormessage="";
if (servername.text==""){errormessage=qsTr("No server given! ")}
else if (username.text==""){errormessage+=qsTr("No nickname given! ")}
else if (password.text=="") {errormessage+=qsTr("No password given! ")}
else if (imagestoredir=="") {errormessage+=qsTr("No image directory given!")}
else {errormessage=""}
if (errormessage=="") {verify(userconfig)}
else {Helperjs.showMessage(qsTr("Error"), errormessage,root)}
}}
MButton {
id: setDefault
x: 10*root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize
text: qsTr("Set as default")
font.pointSize: osSettings.bigFontSize
visible: false
onClicked:{
accountBusy.running=true;
let users=updatenews.getAccounts("username",username.text)
Service.storeConfig(db,users[0]);
Service.readConfig(db,function(userconfig){
//reset values
login=userconfig;
news=[];
contactlist=[];
rootstack.currentIndex=0;
newstypeSignal("refresh");
},"isActive",0);
Helperjs.showMessage(qsTr("Success"),"Screen Name: "+users[0].username,root)
rootstackView.pop()
}}
Row{
spacing:0.5*mm
anchors.top: parent.top
anchors.topMargin: root.fontFactor*osSettings.bigFontSize
anchors.right: parent.right
anchors.rightMargin: 1*mm
MButton {
width: 5*mm;
visible: users.length>0
text: "-"
font.pointSize: osSettings.bigFontSize
onClicked:{
var userconfig={server: servername.text, username: username.text, password: Qt.btoa(password.text)};
Service.readConfig(db,function(user){
if(userdata.token!=""){xhr.setUrl(servername.text);
xhr.setApi("/oauth/revoke");
xhr.clearParams();
xhr.setParam("client_id",user.client.client_id);
xhr.setParam("client_secret",user.client.client_secret);
xhr.setParam("token",user.token);
xhr.post();
}
},"username",username.text);
Service.deleteConfig(db,userconfig,function(){
filesystem.Directory=imagestore.text+"contacts";
filesystem.rmDir();
filesystem.Directory=imagestore.text+"albums";
filesystem.rmDir();
servername.text="https://";
servericon.visible=false;
servericon.source="";
username.text="";
password.text="";
imagestore.text="";
userButton.text=qsTr("User");
Helperjs.readData(db,"config","",function(storedUsers){
storedUsers.sort(function(obj1, obj2) {
return obj1.isActive - obj2.isActive;
})
accountPage.users=storedUsers;})
accountPage.state="new_oauth"
})
}}
MButton {
width: 5*mm;
visible: users.length>0
text: "+"
font.pointSize: osSettings.bigFontSize
onClicked:{
servername.text="https://"
servericon.visible=false;
servericon.source="";
username.text=""
password.text=""
imagestore.text=""
userButton.text=qsTr("User")
accountPage.state="new_oauth"
}
}
MButton {
width: 5*mm;
text: "?"
font.pointSize: osSettings.bigFontSize
onClicked:{
rootstackView.push("qrc:/qml/configqml/InfoBox.qml");
}
}
MButton{
id:closeButton
width: 5*mm;
visible: users.length>0
text: "\uf057"
font.pointSize: osSettings.bigFontSize
onClicked:{rootstackView.pop()}
}
}
states: [
State {
name: "new_oauth"
PropertyChanges {target: username; visible: false }
PropertyChanges {target: password; visible: false}
PropertyChanges {target: ruleButton; visible: true}
},
},
State {
name:"oauth"
PropertyChanges {target: username; visible: true}
@ -561,34 +561,34 @@ Page{
}
]
Component.onCompleted: { //print("filesystem.osType " +filesystem.osType)
try{Helperjs.readData(db,"config","",function(storedUsers){
storedUsers.sort(function(obj1, obj2) {
return obj1.isActive - obj2.isActive;
})
accountPage.users=storedUsers;
Service.readConfig(db,function(obj){
if (obj==null){
accountPage.state="new_oauth"
}
else{
userButton.text=obj.username;
servername.text=obj.server;
serverModel.insert(0,{text:obj.server})
accountPage.setServericon(obj.server);
username.text= obj.username;
password.text=Qt.atob(obj.password);
imagestore.text=obj.imagestore;
imagestoredir=obj.imagestore;
if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'}
if(obj.password!=""){accountPage.state="password"}
else if (obj.token!=""){accountPage.state="oauth"}
else {accountPage.state="new_oauth"}
}
Component.onCompleted: { //print("filesystem.osType " +filesystem.osType)
try{Helperjs.readData(db,"config","",function(storedUsers){
storedUsers.sort(function(obj1, obj2) {
return obj1.isActive - obj2.isActive;
})
accountPage.users=storedUsers;
Service.readConfig(db,function(obj){
if (obj==null){
accountPage.state="new_oauth"
}
else{
userButton.text=obj.username;
servername.text=obj.server;
serverModel.insert(0,{text:obj.server})
accountPage.setServericon(obj.server);
username.text= obj.username;
password.text=Qt.atob(obj.password);
imagestore.text=obj.imagestore;
imagestoredir=obj.imagestore;
if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'}
if(obj.password!=""){accountPage.state="password"}
else if (obj.token!=""){accountPage.state="oauth"}
else {accountPage.state="new_oauth"}
}
},"isActive",0)
},"isActive",0)
})}
catch (e){//print("onCompleted" +users.count +e)
}
}
}
}

View file

@ -30,179 +30,218 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.11
import QtQuick.Dialogs 1.2
//import QtQuick.Dialogs 1.2
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/js/service.js" as Service
import "qrc:/qml/configqml"
import "qrc:/qml/genericqml"
Page{
//anchors.fill: parent
width:root.width
height:root.height
width: parent.width
height: parent.height
ScrollView{
anchors.fill: parent
contentHeight: 40*root.fontFactor*osSettings.bigFontSize
contentWidth: root.width
clip:true
Label {
text: qsTr("News as")
font.pointSize:osSettings.systemFontSize
x: root.fontFactor*osSettings.bigFontSize; y: 2*root.fontFactor*osSettings.bigFontSize
}
Rectangle{
x: root.fontFactor*osSettings.bigFontSize; y: 4*root.fontFactor*osSettings.bigFontSize;
width: newsTypeField.contentWidth+2*mm; height: 2*root.fontFactor*osSettings.bigFontSize
color: Material.dialogColor//"#F3F3F3"
radius: 0.5*mm
Label{
id: newsTypeField
anchors.fill: parent
font.pointSize:osSettings.bigFontSize
text:qsTr("Conversations")
Label {
text: qsTr("News as")
font.pointSize:osSettings.systemFontSize
x: root.fontFactor*osSettings.bigFontSize; y: 2*root.fontFactor*osSettings.bigFontSize
}
MouseArea{
anchors.fill:parent
onClicked:newstypemenu.popup()
}
}
Menu {
id:newstypemenu
width:12*root.fontFactor*osSettings.bigFontSize
MenuItem {
font.pointSize: osSettings.bigFontSize
text: qsTr("Timeline")
onTriggered: {newsTypeField.text=qsTr("Timeline");
Service.updateglobaloptions(root.db,"newsViewType","Timeline");}
}
MenuItem {
font.pointSize: osSettings.bigFontSize
text: qsTr("Conversations")
onTriggered: {newsTypeField.text=qsTr("Conversations");
Service.updateglobaloptions(root.db,"newsViewType","Conversations");}
}
}
Label {
text: qsTr("Max. News")
font.pointSize: osSettings.systemFontSize
x: root.fontFactor*osSettings.bigFontSize; y:8*root.fontFactor*osSettings.bigFontSize
}
Slider{ id: maxNews
x:6*root.fontFactor*osSettings.bigFontSize; y: 10*root.fontFactor*osSettings.bigFontSize;
width: root.width/2;height:2*root.fontFactor*osSettings.bigFontSize
from: 0;to:2000; stepSize: 100
value: root.globaloptions.hasOwnProperty("max_news")?root.globaloptions.max_news:1000
}
Rectangle{
color: Material.dialogColor
x: root.fontFactor*osSettings.bigFontSize; y: 10*root.fontFactor*osSettings.bigFontSize;
width: 4*root.fontFactor*osSettings.bigFontSize; height: 2*root.fontFactor*osSettings.bigFontSize;
radius: 0.5*mm
TextEdit{id:maxNewsText;
anchors.fill: parent
font.pointSize: osSettings.bigFontSize
verticalAlignment:TextEdit.AlignRight
color: Material.primaryTextColor
text:maxNews.value
selectByMouse: true
onTextChanged: {
Service.updateglobaloptions(root.db,"max_news",text);
Rectangle{
x: root.fontFactor*osSettings.bigFontSize; y: 4*root.fontFactor*osSettings.bigFontSize;
width: newsTypeField.contentWidth+2*mm; height: 2*root.fontFactor*osSettings.bigFontSize
color: osSettings.backgroundDimColor//"#F3F3F3"
radius: 0.5*mm
Label{
id: newsTypeField
anchors.fill: parent
font.pointSize:osSettings.bigFontSize
text:qsTr("Conversations")
}
MouseArea{
anchors.fill:parent
onClicked:newstypemenu.popup()
}
}
}
CheckBox{
id: nsfwCheckbox
x: root.fontFactor*osSettings.bigFontSize
y: 14*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.bigFontSize
text: qsTr("Hide #nsfw?")
checked:(globaloptions["hide_nsfw"]==1)?true:false
onClicked: {
toggle();
if(nsfwCheckbox.checked==true){
Service.updateglobaloptions(root.db,"hide_nsfw",0);nsfwCheckbox.checked=false;
Menu {
id:newstypemenu
width:12*root.fontFactor*osSettings.bigFontSize
MenuItem {
font.pointSize: osSettings.bigFontSize
text: qsTr("Timeline")
onTriggered: {newsTypeField.text=qsTr("Timeline");
Service.updateglobaloptions(root.db,"newsViewType","Timeline");}
}
else{
Service.updateglobaloptions(root.db,"hide_nsfw",1);nsfwCheckbox.checked=true;
MenuItem {
font.pointSize: osSettings.bigFontSize
text: qsTr("Conversations")
onTriggered: {newsTypeField.text=qsTr("Conversations");
Service.updateglobaloptions(root.db,"newsViewType","Conversations");}
}
}
}
// CheckBox{
// id: darkmodeCheckbox
// tristate:true
// x: root.fontFactor*osSettings.bigFontSize
// y: 24*root.fontFactor*osSettings.bigFontSize
// font.pointSize: osSettings.bigFontSize
// text: qsTr("Dark Mode")
// checked:(globaloptions["view_darkmode"]==1)?true:false
// onClicked: {
// toggle();
// if(darkmodeCheckbox.checked==true){
// Service.updateglobaloptions(root.db,"view_darkmode",0);darkmodeCheckbox.checked=false;
// root.Material.theme=Material.Light
// }
// else{
// Service.updateglobaloptions(root.db,"view_darkmode",1);darkmodeCheckbox.checked=true;
// root.Material.theme=Material.Dark
// }
// }
// }
Column{
x: root.fontFactor*osSettings.bigFontSize
y: 18*root.fontFactor*osSettings.bigFontSize
Label{
text: qsTr("Dark Mode")
font.pointSize: osSettings.systemFontSize}
Label {
text: qsTr("Max. News")
font.pointSize: osSettings.systemFontSize
x: root.fontFactor*osSettings.bigFontSize; y:8*root.fontFactor*osSettings.bigFontSize
}
RadioButton{
text: qsTr("System")
checked: (globaloptions["view_darkmode"]==0 || globaloptions["view_darkmode"]==undefined)?true:false
Slider{ id: maxNews
x:6*root.fontFactor*osSettings.bigFontSize; y: 10*root.fontFactor*osSettings.bigFontSize;
width: root.width/2;height:2*root.fontFactor*osSettings.bigFontSize
from: 0;to:2000; stepSize: 100
value: root.globaloptions.hasOwnProperty("max_news")?root.globaloptions.max_news:1000
}
Rectangle{
color: osSettings.backgroundDimColor
x: root.fontFactor*osSettings.bigFontSize; y: 10*root.fontFactor*osSettings.bigFontSize;
width: 4*root.fontFactor*osSettings.bigFontSize; height: 2*root.fontFactor*osSettings.bigFontSize;
radius: 0.5*mm
TextEdit{id:maxNewsText;
anchors.fill: parent
font.pointSize: osSettings.bigFontSize
verticalAlignment:TextEdit.AlignRight
color: osSettings.primaryTextColor
text:maxNews.value
selectByMouse: true
onTextChanged: {
Service.updateglobaloptions(root.db,"max_news",text);
}
}
}
CheckBox{
id: nsfwCheckbox
x: root.fontFactor*osSettings.bigFontSize
y: 14*root.fontFactor*osSettings.bigFontSize
font.pointSize: osSettings.bigFontSize
text: qsTr("Hide #nsfw?")
checked:(globaloptions["hide_nsfw"]==1)?true:false
onClicked: {
if(checked==true){
Service.updateglobaloptions(root.db,"view_darkmode",0);
root.Material.theme=Material.System
}
toggle();
if(nsfwCheckbox.checked==true){
Service.updateglobaloptions(root.db,"hide_nsfw",0);nsfwCheckbox.checked=false;
}
else{
Service.updateglobaloptions(root.db,"hide_nsfw",1);nsfwCheckbox.checked=true;
}
}
}
RadioButton{
text: qsTr("Dark")
checked: (globaloptions["view_darkmode"]==1)?true:false
font.pointSize: osSettings.bigFontSize
onClicked: {
if(checked==true){
Service.updateglobaloptions(root.db,"view_darkmode",1);
root.Material.theme=Material.Dark
}
}
}
RadioButton{
text: qsTr("Light")
checked: (globaloptions["view_darkmode"]==2)?true:false
font.pointSize: osSettings.bigFontSize
onClicked: {
if(checked==true){
Service.updateglobaloptions(root.db,"view_darkmode",2);
root.Material.theme=Material.Light
}
}
}
}
MButton {
anchors.right: parent.right; //anchors.rightMargin: mm;
anchors.top: parent.top
anchors.topMargin: 2*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize;
text: "?"
font.pointSize: osSettings.bigFontSize
onClicked:{
rootstackView.push("qrc:/qml/configqml/InfoBox.qml");
// CheckBox{
// id: darkmodeCheckbox
// tristate:true
// x: root.fontFactor*osSettings.bigFontSize
// y: 24*root.fontFactor*osSettings.bigFontSize
// font.pointSize: osSettings.bigFontSize
// text: qsTr("Dark Mode")
// checked:(globaloptions["view_darkmode"]==1)?true:false
// onClicked: {
// toggle();
// if(darkmodeCheckbox.checked==true){
// Service.updateglobaloptions(root.db,"view_darkmode",0);darkmodeCheckbox.checked=false;
// root.Material.theme=Material.Light
// }
// else{
// Service.updateglobaloptions(root.db,"view_darkmode",1);darkmodeCheckbox.checked=true;
// root.Material.theme=Material.Dark
// }
// }
// }
Column{
visible: osSettings.osType=="Android"
x: root.fontFactor*osSettings.bigFontSize
y: 18*root.fontFactor*osSettings.bigFontSize
Label{
text: qsTr("Dark Mode")
font.pointSize: osSettings.systemFontSize}
RadioButton{
text: qsTr("System")
checked: (globaloptions["view_darkmode"]==0 || globaloptions["view_darkmode"]==undefined)?true:false
font.pointSize: osSettings.bigFontSize
onClicked: {
if(checked==true){
Service.updateglobaloptions(root.db,"view_darkmode",0);
root.Material.theme=Material.System
}
}
}
RadioButton{
text: qsTr("Dark")
checked: (globaloptions["view_darkmode"]==1)?true:false
font.pointSize: osSettings.bigFontSize
onClicked: {
if(checked==true){
Service.updateglobaloptions(root.db,"view_darkmode",1);
root.Material.theme=Material.Dark
}
}
}
RadioButton{
text: qsTr("Light")
checked: (globaloptions["view_darkmode"]==2)?true:false
font.pointSize: osSettings.bigFontSize
onClicked: {
if(checked==true){
Service.updateglobaloptions(root.db,"view_darkmode",2);
root.Material.theme=Material.Light
}
}
}
}
Column{
x: root.fontFactor*osSettings.bigFontSize
y: 28*root.fontFactor*osSettings.bigFontSize
Label{
text: qsTr("Toolbar Postion")
font.pointSize: osSettings.systemFontSize}
RadioButton{
text: qsTr("Top")
checked: (globaloptions["toolbarposition"]==0 || globaloptions["toolbarposition"]==undefined)?true:false
font.pointSize: osSettings.bigFontSize
onClicked: {
if(checked==true){
Service.updateglobaloptions(root.db,"roottoolbarposition",0);
globaloptions.toolbarposition=0;
root.roottoolbar.position=ToolBar.Header
}
}
}
RadioButton{
text: qsTr("Bottom")
checked: (globaloptions["toolbarposition"]==1)?true:false
font.pointSize: osSettings.bigFontSize
onClicked: {
if(checked==true){
Service.updateglobaloptions(root.db,"roottoolbarposition",1);
globaloptions.toolbarposition=1;
root.roottoolbar.position=ToolBar.Footer
}
}
}
}
MButton {
anchors.right: parent.right; anchors.rightMargin: mm;
anchors.top: parent.top
anchors.topMargin: 3*root.fontFactor*osSettings.bigFontSize
//width: 2*root.fontFactor*osSettings.bigFontSize;
text: "?"
font.pointSize: osSettings.bigFontSize
onClicked:{
rootstackView.push("qrc:/qml/configqml/InfoBox.qml");
}
}
}
// MButton{

View file

@ -30,10 +30,9 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.11
import QtQuick.Dialogs 1.2
//import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.11
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/js/service.js" as Service
import "qrc:/qml/configqml"
import "qrc:/qml/genericqml"
@ -119,7 +118,7 @@ Page{
MButton{
id:closeButton
// height: 2*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize;
//width: 2*root.fontFactor*osSettings.bigFontSize;
anchors.top: parent.top
anchors.topMargin:2*root.fontFactor*osSettings.bigFontSize
anchors.right: parent.right

View file

@ -31,8 +31,6 @@
import QtQuick 2.11
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
Page{
//anchors.fill: parent

View file

@ -31,7 +31,6 @@
import QtQuick 2.0
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/qml/genericqml"
Page{
@ -41,9 +40,9 @@ Page{
textFormat: Text.RichText
width: root.width-mm
font.pointSize: osSettings.systemFontSize
color:Material.primaryTextColor
color: osSettings.primaryTextColor
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
text: "<b>Friendiqa v0.6.8 </b><br>Licensed under GPL 3 with the exception of OpenSSL <br> "+
text: "<b>Friendiqa v0.6.9 </b><br>Licensed under GPL 3 with the exception of OpenSSL <br> "+
"Website <a href='https://friendiqa.ma-nic.de'>https://friendiqa.ma-nic.de</a><br>"+
"Sourcecode: <a href='https://git.friendi.ca/LubuWest/Friendiqa'>https://git.friendi.ca/LubuWest/Friendiqa</a><br>"+
"Privacy Policy: <a href='https://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md'>http://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md</a><br>"+

View file

@ -51,6 +51,7 @@ ScrollView{
spacing: 0.7*root.fontFactor*osSettings.bigFontSize
Label{
width:implicitWidth
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
text: "\uf085 "+ qsTr("Settings")
MouseArea{
@ -63,6 +64,7 @@ ScrollView{
Label{y: 2*root.fontFactor*osSettings.bigFontSize
width:implicitWidth
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
text: "\uf2bb " + qsTr("Accounts")
MouseArea{
@ -75,6 +77,7 @@ ScrollView{
Label{y: 4*root.fontFactor*osSettings.bigFontSize
width:implicitWidth
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
text: "\uf08b " +qsTr("Quit")
MouseArea{

View file

@ -31,16 +31,40 @@
import QtQuick.Window 2.0
import QtQuick 2.0
import QtQuick.Controls.Material 2.12
QtObject{
property int appWidth: Screen.desktopAvailableWidth
property int appHeight: Screen.desktopAvailableHeight
property int backKey: Qt.Key_Back
//property string attachImageDir:filesystem.cameraPath+"/"
property string osType: "Android"
property int systemFontSize: root.font.pointSize*1.1
property int bigFontSize: systemFontSize*1.3
property string imagePickQml: "ImagePicker"
property string imagePicker:'import QtQuick 2.0; import "qrc:/qml/genericqml";'+
imagePickQml+'{multiple : true;onReady: {attachImageURLs.push(imageUrl);'+
'attachImage(imageUrl)}}'
Material.theme: Material.System
property color backgroundColor: Material.backgroundColor
property color backgroundDimColor:Material.backgroundDimColor
property color primaryTextColor: Material.primaryTextColor
property color secondaryTextColor: Material.secondaryTextColor
property color dialogColor: Material.dialogColor
property color accentColor: Material.accentColor
property color buttonColor: Material.buttonColor
function setTheme(theme){
if (theme=="system"){
Material.theme=Material.System
}
else if (theme=="dark"){
Material.theme=Material.Dark
}
else if (theme=="light"){
Material.theme=Material.Light
}
}
}

View file

@ -30,7 +30,9 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick.Window 2.0
import QtQuick 2.0
import QtQuick 6.3
import QtQuick.Controls 6.3
QtObject{
property real appWidth: Screen.desktopAvailableWidth/4*3
property real appHeight: Screen.desktopAvailableHeight/4*3
@ -40,4 +42,25 @@ QtObject{
property int bigFontSize: systemFontSize*1.5
//property string attachImageDir:filesystem.homePath+"/Pictures/"
property string imagePickQml: "ImagePickerLinux"
//SystemPalette { id: sysPalette; colorGroup: SystemPalette.Active }
//property SystemPalette name: value
property color backgroundColor: palette.window
property color backgroundDimColor: palette.button
property color primaryTextColor: palette.windowText
property color secondaryTextColor: palette.buttonText
property color dialogColor: palette.base
property color accentColor: palette.highlightedText
property color buttonColor: palette.button
function setTheme(theme){
if (theme=="system"){
//Material.theme=Material.System
}
else if (theme=="dark"){
//Material.theme=Material.Dark
}
else if (theme=="light"){
//Material.theme=Material.Light
}
}
}

View file

@ -32,12 +32,11 @@
import QtQuick 2.11
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/qml/configqml"
import "qrc:/js/service.js" as Service
Rectangle{
color: Material.dialogColor
color: osSettings.dialogColor
property string adapter: ""
width: parent.width
height: 4*root.fontFactor*osSettings.bigFontSize

View file

@ -31,7 +31,6 @@
import QtQuick 2.11
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/qml/configqml"
import "qrc:/qml/genericqml"
import "qrc:/js/service.js" as Service
@ -59,14 +58,14 @@ Page{
Rectangle{
x: root.fontFactor*osSettings.bigFontSize; y:4*root.fontFactor*osSettings.bigFontSize;
width: 4*root.fontFactor*osSettings.bigFontSize; height: 2*root.fontFactor*osSettings.bigFontSize;
color: Material.dialogColor
color: osSettings.dialogColor
radius: 0.5*mm
TextEdit{
id: messageIntervalField
anchors.fill: parent
font.pointSize: osSettings.bigFontSize
verticalAlignment:TextEdit.AlignRight
color: Material.primaryTextColor
color: osSettings.primaryTextColor
text:messageIntervalSlider.value
focus: true
selectByMouse: true

View file

@ -31,7 +31,6 @@
import QtQuick 2.11
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import QtQuick.Layouts 1.11
import QtQuick.LocalStorage 2.0
import "qrc:/js/helper.js" as Helperjs
@ -115,7 +114,7 @@ Page{
x:1.5*root.fontFactor*osSettings.systemFontSize;
width:root.width-(7*root.fontFactor*osSettings.systemFontSize+mm);
height: 2.5*root.fontFactor*osSettings.systemFontSize;
color:Material.dialogColor
color:osSettings.dialogColor
selfdestroying:false
}
@ -132,10 +131,10 @@ Page{
Rectangle {
width: contactsSearchView.width
height: childrenRect.height
color: Material.backgroundColor
color: osSettings.backgroundColor
required property string section
Text {
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
text: parent.section
font.bold: true
font.pointSize: osSettings.bigFontSize

View file

@ -31,7 +31,6 @@
import QtQuick 2.11
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import QtQuick.Layouts 1.11
import QtQuick.LocalStorage 2.0
import "qrc:/js/helper.js" as Helperjs
@ -146,14 +145,15 @@ Item{
Rectangle {
id:searchComponent
x: mm; y:mm
color: Material.backgroundColor
color: osSettings.backgroundColor
radius:0.5*mm
width: 10*root.fontFactor*osSettings.bigFontSize
height: 2*root.fontFactor*osSettings.bigFontSize
TextField {
id: searchText
color: Material.primaryTextColor
color: osSettings.primaryTextColor
focus: true
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
wrapMode: Text.Wrap
anchors.fill:parent
@ -193,10 +193,10 @@ Item{
Rectangle {
width: friendsView.width
height: childrenRect.height
color: Material.backgroundColor
color: osSettings.backgroundColor
required property string section
Text {
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
text: parent.section
font.bold: true
font.pointSize: osSettings.bigFontSize
@ -208,11 +208,12 @@ Item{
Component { id:headerComponent
Rectangle{
color: Material.dialogColor
color: osSettings.dialogColor
width:friendsView.width
height:6*mm
Text{
color: Material.primaryTextColor
color: osSettings.primaryTextColor
font.family: fontAwesome.name
font.pointSize: osSettings.bigFontSize
anchors.centerIn: parent
text:"\uf234"

View file

@ -31,7 +31,6 @@
import QtQuick 2.11
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import QtQuick.Layouts 1.11
import QtQuick.LocalStorage 2.0
import "qrc:/js/helper.js" as Helperjs
@ -42,7 +41,7 @@ import "qrc:/qml/genericqml"
Rectangle {
y:1
color: Material.backgroundColor//"white"
color: osSettings.backgroundColor
function showContactdetails(contact){
// rootstack.currentIndex=0;

View file

@ -31,7 +31,6 @@
import QtQuick 2.11
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/js/helper.js" as Helperjs
import "qrc:/js/news.js" as Newsjs
import "qrc:/qml/genericqml"
@ -56,7 +55,7 @@ Item {
height: parent.height-mm
radius: 0.5*mm
border.color: "grey"
color:Material.backgroundColor
color:osSettings.backgroundColor
Rectangle{
id:namelabelRect
@ -65,13 +64,13 @@ Item {
width: wrapper.width-2
height: 3*root.fontFactor*osSettings.bigFontSize
//border.color: "light grey"
color:Material.backgroundColor
color: osSettings.backgroundColor
TextInput {
id: namelabel
anchors.fill: parent
readOnly: true
text: group.new?"":group.groupname
color: Material.secondaryTextColor//"#303030"
color: osSettings.secondaryTextColor//"#303030"
font.pointSize: osSettings.bigFontSize
}
}
@ -122,7 +121,7 @@ Item {
Rectangle{
id: detailsrectangle
anchors.top: namelabelRect.bottom
color: Material.backgroundColor
color: osSettings.backgroundColor
//anchors.topMargin: mm
x:mm
width: parent.width-2*mm

View file

@ -31,7 +31,6 @@
import QtQuick 2.0
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/qml/genericqml"
import "qrc:/js/service.js" as Service
@ -39,7 +38,7 @@ Rectangle {
// width:parent.width-2*mm
// height:parent.height-14*mm
anchors.fill:parent
color: Material.backgroundColor//color:"white"
color: osSettings.backgroundColor
property var profile:({})
property var attachImageURLs:[]
property var createdAtDate: new Date(profile.friendica_owner.created_at)
@ -176,6 +175,7 @@ Rectangle {
Text {
id:phototext
z:4
font.family: fontAwesome.name
text: "\uf040"
width:5*mm
anchors.top: photoImage.top
@ -206,7 +206,7 @@ Rectangle {
anchors.topMargin: 0
anchors.left: photoImage.left
wrapMode: Text.Wrap
color: Material.secondaryTextColor//"#303030"
color: osSettings.secondaryTextColor
font.pointSize: osSettings.bigFontSize
anchors.top: photoImage.bottom
}
@ -217,13 +217,13 @@ Rectangle {
Rectangle{
id:profileRect
width:profileView.width
color: Material.backgroundColor
color: osSettings.backgroundColor
height: 5*mm+profiletextfield.height
Text{
y:mm
font.pointSize: osSettings.systemFontSize
text:"<b>"+qsTr("profile id")+": </b> "+profileid+"<br>"
color:Material.primaryTextColor//"black"
color:osSettings.primaryTextColor
}
Text{
id:profiletextfield
@ -233,7 +233,7 @@ Rectangle {
wrapMode: Text.Wrap
font.pointSize: osSettings.systemFontSize
text:profiletext
color:Material.primaryTextColor
color: osSettings.primaryTextColor
onLinkActivated: Qt.openUrlExternally(link)
}
}
@ -242,7 +242,7 @@ Rectangle {
id:textcomponent
Text{
id:namelabeltext
color:Material.primaryTextColor
color: osSettings.primaryTextColor
width: namelabelflickable.width
height: implicitHeight
font.pointSize: osSettings.bigFontSize

View file

@ -33,7 +33,7 @@ import QtQuick 2.5
import QtQuick.LocalStorage 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.12
import QtQuick.Layouts 1.11
import QSystemTrayIcon 1.0
import "qrc:/js/news.js" as Newsjs
@ -45,7 +45,7 @@ ApplicationWindow{
id:root
title: "Friendiqa"
property var globaloptions: Service.readGO(db)
property QtObject osSettings: {var tmp=Qt.createComponent("qrc:/qml/configqml/OSSettingsLinux.qml");return tmp.createObject(root)}
property QtObject osSettings: {var tmp=Qt.createComponent("qrc:/qml/configqml/OSSettings"+filesystem.osType+".qml");return tmp.createObject(root)}
width: globaloptions.hasOwnProperty("appWidth")?globaloptions.appWidth:osSettings.appWidth
height:globaloptions.hasOwnProperty("appHeight")?globaloptions.appHeight:osSettings.appHeight
visible: filesystem.Visibility// true
@ -75,10 +75,6 @@ ApplicationWindow{
property var contactposts:[]
property bool imagePicking: false
Material.theme: Material.System
color: Material.backgroundColor
function onLoginChanged(login){
if(login=="" || login==null){rootstackView.push("qrc:/qml/configqml/AccountPage.qml")}
else{
@ -187,16 +183,18 @@ ApplicationWindow{
else {rootstack.currentIndex=0;close.accepted=false}
}
Rectangle{
anchors.fill: parent
color: Material.backgroundColor
color: osSettings.backgroundColor
}
header: ToolBar{
footer: ToolBar{
id: roottoolbar
//position: ToolBar.Footer//globaloptions.roottoolbarposition==0 || globaloptions.roottoolbarposition==undefined?ToolBar.Header:ToolBar.Footer
width:root.width
background: Rectangle{
anchors.fill: parent
color: Material.backgroundDimColor
color: osSettings.backgroundDimColor
}
RowLayout{
anchors.fill: parent
@ -209,38 +207,42 @@ ApplicationWindow{
try{while(rootstackView.depth>1){rootstackView.pop()}}catch(e){}
}
TabButton {
font.family: fontAwesome.name
text: "\uf03a"
background:Rectangle{
anchors.fill: parent
color: Material.backgroundDimColor
color: osSettings.backgroundDimColor
}
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Posts")
onDoubleClicked: {newstypeSignal("refresh")}
}
TabButton {
font.family: fontAwesome.name
text: "\uf0c0"
background:Rectangle{
anchors.fill: parent
color: Material.backgroundDimColor
color: osSettings.backgroundDimColor
}
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Contacts")
}
TabButton {
font.family: fontAwesome.name
text: "\uf03e"
background:Rectangle{
anchors.fill: parent
color: Material.backgroundDimColor
color: osSettings.backgroundDimColor
}
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Photos")
}
TabButton {
font.family: fontAwesome.name
text: "\uf073"
background:Rectangle{
anchors.fill: parent
color: Material.backgroundDimColor
color: osSettings.backgroundDimColor
}
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Calendar")
@ -249,11 +251,12 @@ ApplicationWindow{
}
}
StackView{id:rootstackView
width:root.width
height: root.height
initialItem: StackLayout{
StackView{id:rootstackView
//y:roottoolbar.height
//anchors.fill: parent
width:root.width
height: root.height-roottoolbar.contentHeight
initialItem: StackLayout{
id:rootstack
width:rootstackView.width
height: rootstackView.height
@ -283,7 +286,6 @@ StackView{id:rootstackView
}
}
QSystemTrayIcon {
id: systemTray
visible: false
@ -299,7 +301,7 @@ StackView{id:rootstackView
}
}
Component.onCompleted: {
icon = iconTray
icon = root.color<palette.text?iconTrayWhite:iconTrayBlack//iconTray
toolTip = qsTr("Click to open Friendiqa")
//&hide()
}
@ -309,9 +311,9 @@ StackView{id:rootstackView
Component.onCompleted: {
onLoginChanged(login);
globaloptions=Service.readGO(db);
if(globaloptions.view_darkmode==1){Material.theme=Material.Dark}
else if (globaloptions.view_darkmode==2){Material.theme=Material.Light}
else {Material.theme=Material.System}
if(globaloptions.view_darkmode==1){osSettings.setTheme("dark")}
else if (globaloptions.view_darkmode==2){osSettings.setTheme("light")}
else {osSettings.setTheme("system")}
if(!filesystem.Visibility){
systemTray.icon = iconTray;
// systemTray.toolTip = qsTr("Click to open Friendiqa");
@ -324,7 +326,7 @@ StackView{id:rootstackView
var IntentReceiverQml = component.createObject(root);
}
else if (osSettings.osType=="Linux"){
if (login!=""){newstypeSignal("refresh")}
//if (login!=""){newstypeSignal("refresh")}
var component = Qt.createComponent("qrc:/qml/genericqml/LinuxSync.qml");
var LinuxSyncQml = component.createObject(root);
}

View file

@ -30,7 +30,6 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0
import QtQuick.Controls.Material 2.12
Rectangle{
id: blueButton
width: Math.max(mainText.width+2*mm,5*mm)
@ -48,7 +47,7 @@ Rectangle{
Text{
id:mainText
color: Material.primaryTextColor//"black"
color: osSettings.primaryTextColor
anchors.centerIn: parent
width: contentWidth
height: contentHeight
@ -67,7 +66,7 @@ Rectangle{
states: [
State { name: "Pressed"
PropertyChanges { target: blueButton; color: Material.buttonColor} }
PropertyChanges { target: blueButton; color: osSettings.buttonColor} }
]
transitions: [
Transition { to:"*"

View file

@ -31,7 +31,6 @@
import QtQuick 2.0
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/qml/genericqml"
Item {
@ -46,8 +45,8 @@ Item {
width:parent.width
height: parent.height
radius: 0.5*mm
border.color: Material.backgroundDimColor
color: Material.backgroundColor
border.color: osSettings.backgroundDimColor
color: osSettings.backgroundColor
Image {
id: photoImage
x:0.5*mm
@ -70,7 +69,7 @@ Item {
height: 1.1*root.fontFactor*osSettings.bigFontSize
text: contact.name
elide: contentWidth>wrapper.width-4*osSettings.systemFontSize?Text.ElideRight:Text.ElideNone
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
font.pointSize: osSettings.bigFontSize
}
Label {
@ -79,7 +78,7 @@ Item {
height: 1.1*root.fontFactor*osSettings.bigFontSize
text: "(@"+contact.screen_name+")"
elide: contentWidth>wrapper.width-4*root.fontFactor*osSettings.systemFontSize?Text.ElideRight:Text.ElideNone
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
font.pointSize: osSettings.bigFontSize
}
Label {
@ -89,7 +88,7 @@ Item {
maximumLineCount:2
text: Qt.atob(contact.description)!=""?contact.description:""
elide:Text.ElideRight
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
font.pointSize: osSettings.systemFontSize
}
}

View file

@ -29,8 +29,8 @@
// 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.12
import QtQuick 2.15
import QtQuick.Controls 6.3
import "qrc:/qml/genericqml"
Item {
@ -50,6 +50,7 @@ Item {
Label{
y:2*root.fontFactor*osSettings.bigFontSize
width:parent.width
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
text: "\uf021 " + qsTr("Refresh")
MouseArea{
@ -69,6 +70,7 @@ Item {
Label{
y:3.5*root.fontFactor*osSettings.bigFontSize
width:parent.width
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
font.bold: account.username==login.username && currentnewstabstatus=="Timeline"
text: "\uf1da " + qsTr("Timeline")
@ -87,6 +89,7 @@ Item {
Label{
y:5*root.fontFactor*osSettings.bigFontSize
width:parent.width
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
font.bold: account.username==login.username && currentnewstabstatus=="Conversations"
text: "\uf086 " + qsTr("Conversations")
@ -107,6 +110,7 @@ Item {
Label{
y:6.5*root.fontFactor*osSettings.bigFontSize
width:parent.width
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
font.bold: account.username==login.username && currentnewstabstatus=="Replies"
text: "\uf0ec " + qsTr("Replies")
@ -125,6 +129,7 @@ Item {
Label{
y:8*root.fontFactor*osSettings.bigFontSize
width:parent.width
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
font.bold: account.username==login.username && currentnewstabstatus=="DirectMessages"
text: "\uf0e0 " + qsTr("Direct Messages")
@ -141,6 +146,7 @@ Item {
Label{
y:9.5*root.fontFactor*osSettings.bigFontSize
width:parent.width
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
font.bold: account.username==login.username && currentnewstabstatus=="Favorites"
text: "\uf005 " + qsTr("Favorites")
@ -159,6 +165,7 @@ Item {
Label{
y:11*root.fontFactor*osSettings.bigFontSize
width:parent.width
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
font.bold: account.username==login.username && currentnewstabstatus=="Public Timeline"
text: "\uf0ac " + qsTr("Public Timeline")
@ -177,6 +184,7 @@ Item {
Label{
y:12.5*root.fontFactor*osSettings.bigFontSize
width:parent.width
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
font.bold: account.username==login.username && currentnewstabstatus=="Groupnews"
text: "\uf0c0 " + qsTr("Group news")
@ -195,6 +203,7 @@ Item {
Label{
y:14*root.fontFactor*osSettings.bigFontSize
width:parent.width
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
font.bold: account.username==login.username && currentnewstabstatus=="Search"
text: "\uf002 " + qsTr("Search")
@ -213,6 +222,7 @@ Item {
Label{
y:15.5*root.fontFactor*osSettings.bigFontSize
width:parent.width
font.family: fontAwesome.name
font.pointSize: osSettings.systemFontSize
font.bold: account.username==login.username && currentnewstabstatus=="Notifications"
text: "\uf0f3 " + qsTr("Notifications")

View file

@ -37,7 +37,8 @@ Item {
Connections {
target: SystemDispatcher
onDispatched: {
//onDispatched: {
function onDispatched(type, message){
if ((type === m_CHOSEN_MESSAGE) && (root.imagePicking==true)) {
var h=[];
for (var n in message.imageUrls){

View file

@ -30,9 +30,8 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import QtQuick.Dialogs 1.2
import QtQuick.Controls 6.3
import QtQuick.Dialogs 6.3
import Qt.labs.folderlistmodel 2.12
import "qrc:/js/service.js" as Service
import "qrc:/js/helper.js" as Helperjs
@ -81,11 +80,12 @@ Item{
FileDialog {
id: imageFileDialog
title: "Please choose a file"
folder: shortcuts.pictures
selectFolder: false
selectMultiple: true
currentFolder: StandardPaths.standardLocations(StandardPaths.PicturesLocation)[0]
fileMode: FileDialog.OpenFiles
//selectMultiple: true
onAccepted: {
imageUrl=imageFileDialog.fileUrls.toString();
//imageUrl=imageFileDialog.fileUrls.toString();
imageUrl=imageFileDialog.selectedFiles.toString();
ready();
}
}

View file

@ -31,7 +31,6 @@
import QtQuick 2.0
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/qml/configqml"
Rectangle{
@ -40,7 +39,7 @@ Rectangle{
// height: root.height-bar.height
//y: bar.height
signal opened()
color: Material.backgroundColor
color: osSettings.backgroundColor
LeftDrawerScrollview{
width:parent.width-mm
@ -51,7 +50,7 @@ Rectangle{
width: 1
height: leftDrawer.height
anchors.right: leftDrawer.right
color: Material.dialogColor//"#EEEEEE"
color: osSettings.dialogColor
}
//Component.onCompleted: {opened();}
}

View file

@ -28,18 +28,18 @@
//
// 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.6
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import QtQuick 2.9
import QtQuick.Controls 6.3
Button{
id: mButton
property alias color: bg.color
width: Math.max(text.width+2*mm,2*root.fontFactor*osSettings.bigFontSize)
width: Math.max(implicitContentWidth+2*mm,3*root.fontFactor*osSettings.bigFontSize)
//radius: mm
height: 2*root.fontFactor*osSettings.bigFontSize
//color: Material.grey
height: 2.5*root.fontFactor*osSettings.bigFontSize
//color: Material.foreground
font.family: fontAwesome.name
font.pointSize: osSettings.bigFontSize
//highlighted:true
background: Rectangle{id:bg;color: Material.dialogColor//"#F3F3F3";
background: Rectangle{id:bg;color: osSettings.dialogColor;
radius: 0.5*mm}
}

View file

@ -30,14 +30,13 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.11
import QtQuick.Controls.Material 2.12
import "qrc:/js/service.js" as Service
import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml"
Rectangle{
id:permissionDialog
color: Material.backgroundColor
color: osSettings.backgroundColor
// x: mm
width: parent.width-5*mm
height:root.height/3
@ -66,7 +65,7 @@ Rectangle{
Text{ //cid not working in Friendica 02/2022
x:0.5*mm
y:0.5*mm
color: Material.primaryTextColor
color: osSettings.primaryTextColor
text: qsTr("Friends")
}
ListView {
@ -86,7 +85,7 @@ Rectangle{
id:contactItem
Rectangle{
id:contactitemRect
color: Material.backgroundColor
color: osSettings.backgroundColor
width:contactView.width
height: 5*mm
radius: 0.5*mm
@ -94,10 +93,10 @@ Rectangle{
onContactstatusChanged:{
if(contactstatus=="positive"){contactitemRect.color="light green"}
else if (contactstatus=="negative"){contactitemRect.color= "red"}
else{contactitemRect.color= Material.backgroundColor}}
border.color:Material.frameColor
else{contactitemRect.color= osSettings.backgroundColor}}
//border.color:Material.frameColor
Text{
color: Material.primaryTextColor
color: osSettings.primaryTextColor
text:contact.screen_name
}
MouseArea{
@ -126,7 +125,7 @@ Rectangle{
}
}
Text{
color: Material.primaryTextColor
color: osSettings.primaryTextColor
x:contactView.width+2*mm
y:0.5*mm
text: qsTr("Groups")
@ -155,11 +154,11 @@ Rectangle{
onGroupstatusChanged:
{if(groupstatus=="positive"){groupitemRect.color="light green"}
else if (groupstatus=="negative"){groupitemRect.color= "red"}
else{groupitemRect.color= Material.backgroundColor}}
color: Material.backgroundColor
border.color: Material.frameColor
else{groupitemRect.color= osSettings.backgroundColor}}
color: osSettings.backgroundColor
//border.color: Material.frameColor
Text{
color: Material.primaryTextColor
color: osSettings.primaryTextColor
text:group.groupname
}
MouseArea{

View file

@ -31,12 +31,11 @@
import QtQuick 2.7
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/qml/genericqml"
Rectangle {
id:searchComponent
color: Material.backgroundColor
color: osSettings.backgroundColor
radius:0.5*mm
property bool selfdestroying:false
/* anchors.left: parent.left
@ -48,7 +47,7 @@ Rectangle {
TextInput {
id: searchText
color: Material.primaryTextColor
color: osSettings.primaryTextColor
focus: true
font.pointSize: osSettings.bigFontSize
wrapMode: Text.Wrap

View file

@ -31,7 +31,6 @@
import QtQuick 2.0
import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.12
import "qrc:/js/helper.js" as Helperjs
Dialog {

View file

@ -32,7 +32,6 @@
import QtQuick 2.0
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/js/helper.js" as Helperjs
import "qrc:/js/news.js" as Newsjs
import "qrc:/js/service.js" as Service
@ -134,9 +133,9 @@ Page {
Component { id: contactHeader
Rectangle{
border.color: Material.backgroundDimColor
border.color: osSettings.backgroundDimColor
border.width: 1
color: Material.backgroundColor
color: osSettings.backgroundColor
width:contactView.width
height: contactView.width<35*root.fontFactor*osSettings.systemFontSize?(profileImage.height+namelabel.height+detailtext.height+7*mm):Math.max(profileImage.height,(buttonflow.height+namelabel.height+detailtext.height))+7*mm
property var createdAtDate: new Date(contact.created_at)
@ -319,7 +318,7 @@ Page {
height: implicitHeight
text:contact.name+" (@"+contact.screen_name+")"
wrapMode: Text.Wrap
color: Material.primaryTextColor
color: osSettings.primaryTextColor
font.pointSize: 1.2*osSettings.bigFontSize
font.family: "Noto Sans"
anchors.top: contactView.width<35*root.fontFactor*osSettings.systemFontSize?profileImage.bottom:buttonflow.bottom
@ -337,7 +336,7 @@ Page {
font.family: "Noto Sans"
textFormat:Text.RichText
wrapMode: Text.Wrap
color: Material.primaryTextColor
color: osSettings.primaryTextColor
text:"<b>"+qsTr("Description")+": </b> "+(Qt.atob(contact.description)!=""?contact.description:"")+"<br> <b>"+qsTr("Location")+":</b> "+contact.location+"<br> <b>"+qsTr("Posts")+":</b> "+contact.statuses_count+
"<br> <b>"+qsTr("URL")+":</b> <a href='"+ contact.url+"'>"+contact.url+"</a><br>"+
"<b>"+qsTr("Created at")+":</b> "+createdAtDate.toLocaleString(Qt.locale())+"<br>"+

View file

@ -31,15 +31,14 @@
// List of people from Friendica Activities
import QtQuick 2.0
import QtQuick.Controls.Material 2.12
import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml"
Rectangle {
id:activitiesRectangle
property var activitymembers
color: Material.dialogColor
border.color: Material.frameColor
color: osSettings.dialogColor
//border.color: osSettings.frameColor
radius:0.5*mm
width:root.width/2
height:Math.min(root.height/2,(10*mm+6*activitymembers.length*mm))
@ -61,8 +60,8 @@ Rectangle {
Component {
id:activitiesContact
Rectangle{
border.color: Material.frameColor
color: Material.backgroundColor
//border.color: Material.frameColor
color: osSettings.backgroundColor
border.width: 1
radius:0.5*mm
width:parent.width
@ -77,7 +76,7 @@ Rectangle {
onStatusChanged: if (contactImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"}
}
Text{
color: Material.primaryTextColor
color: osSettings.primaryTextColor
font.pointSize: osSettings.bigFontSize
anchors.left: contactImage.right
anchors.margins: 1*mm

View file

@ -30,11 +30,10 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0
import QtQuick.Controls.Material 2.12
Rectangle {
id:hashtagRectangle
color:Material.dialogColor
color: osSettings.dialogColor
property alias text: hashtagText.text
radius:0.3*mm
width:hashtagText.contentWidth+mm
@ -42,7 +41,7 @@ Rectangle {
Text{
id:hashtagText
font.pointSize: osSettings.systemFontSize
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
anchors.centerIn: parent
anchors.margins: 0.5*mm
}

View file

@ -29,9 +29,8 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.5
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import QtQuick 2.12
import QtQuick.Controls 6.3
import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml"
@ -177,7 +176,7 @@ Page{
Rectangle{
width: Math.max(10*root.fontFactor*osSettings.bigFontSize,uploadImage.width)
height:imageUploadView.height-4*root.fontFactor*osSettings.bigFontSize
color: Material.backgroundColor
color: osSettings.backgroundColor
Image{
id: uploadImage
width: parent.width //root.width/2-mm
@ -196,7 +195,7 @@ Page{
anchors.right: uploadImage.right
color: "black"
opacity: 0.5
Text{anchors.centerIn:parent;text: "\uf01e";color: "white"}
Text{anchors.centerIn:parent;font.family: fontAwesome.name;text: "\uf01e";color: "white"}
MouseArea{
anchors.fill:parent;
onClicked:{
@ -215,7 +214,7 @@ Page{
anchors.left: uploadImage.left
color: "black"
opacity: 0.5
Text{anchors.centerIn:parent;text: "\uf00d";color: "white"}
Text{anchors.centerIn:parent;font.family: fontAwesome.name; text: "\uf00d";color: "white"}
MouseArea{
anchors.fill:parent;
onClicked:{
@ -238,7 +237,7 @@ Page{
Rectangle{
id:descriptionRectangle
color: Material.backgroundColor
color: osSettings.backgroundColor
border.color: "grey"
anchors.top: uploadImage.bottom
anchors.topMargin: mm
@ -262,7 +261,7 @@ Page{
BlueButton{
width: 5*root.fontFactor*osSettings.bigFontSize
height:imageUploadView.height-3*root.fontFactor*osSettings.bigFontSize
color: Material.backgroundColor
color: osSettings.backgroundColor
border.color: "transparent"
text:"\u002b"
fontSize: 3*osSettings.bigFontSize

View file

@ -31,25 +31,30 @@
// message.qml
// message with buttons
import QtQuick 2.4
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Window 2.0;
import QtQuick.Dialogs 6.4;
//import Qt.labs.platform 6.3 as Platform
import io.qt.examples.texteditor 1.0;
import "qrc:/js/helper.js" as Helperjs
import "qrc:/js/smiley.js" as Smileyjs
import "qrc:/js/news.js" as Newsjs
import "qrc:/qml/genericqml"
import "qrc:/qml/newsqml"
Rectangle{
color:Material.dialogColor
width:parent.width
height: messageColumn.height+2*mm
id:messageSend
visible:conversation || (newstab.newstabstatus!="Search")?true:false
Window{
color: osSettings.backgroundColor
width: parent.width
height: parent.height//messageColumn.height+2*mm
id: messageSend
property bool wideScreen : width>height
// visible: conversation || (newstab.newstabstatus!="Search")?true:false
property string parentId: ""
property bool textfocus: false
property bool conversation: false
//property bool textfocus: false
//property bool conversation: false
property string reply_to_user:""
property string windowstate:""
property alias bodyMessage: bodyField.text
property var media_ids:[]
property var contacts: []
@ -59,15 +64,15 @@ Rectangle{
property var group_allow:login.hasOwnProperty("permissions")?login.permissions[2]:[]
property var group_deny:login.hasOwnProperty("permissions")?login.permissions[3]:[]
function directmessagePrepare(friend){
messageSend.state="active";
reply_to_user=friend.screen_name;
receiverLabel.text=friend.screen_name;
}
// function directmessagePrepare(friend){
// messageSend.state="active";
// reply_to_user=friend.screen_name;
// receiverLabel.text=friend.screen_name;
// }
function sendUrls(urls){
attachImage(urls);
messageSend.state="active";
attachImage(urls);
messageSend.state="active";
}
function sendtext(text){
@ -88,24 +93,26 @@ Rectangle{
}
function statusUpdate(title,status,in_reply_to_status_id) {
print("status: "+status);
//xhr.url= login.server + "/api/statuses/update.json";
try{newsBusy.running=true;conversationBusy.running=true}catch(e){}
xhr.setAccount(login);
xhr.setApi("/api/statuses/update");
xhr.setParam("source", "Friendiqa");
xhr.setParam("htmlstatus", status);
if (parentId!="") {xhr.setParam("in_reply_to_status_id", parentId)};
xhr.setParam("status", status);
if (parentId!="") {xhr.setParam("in_reply_to_status_id", in_reply_to_status_id)};
if (title!=="") {xhr.setParam("title", title)};
// if (group_allow.length>0) {xhr.setParam("group_allow", Helperjs.cleanArray(group_allow))};
// if (group_deny.length>0) {xhr.setParam("group_deny", Helperjs.cleanArray(group_deny))};
// if (contact_allow.length>0) {xhr.setParam("contact_allow", Helperjs.cleanArray(contact_allow))};
// if (contact_deny.length>0) {xhr.setParam("contact_deny", Helperjs.cleanArray(contact_deny))};
// if (group_allow.length>0) {xhr.setParam("group_allow", Helperjs.cleanArray(group_allow))};
// if (group_deny.length>0) {xhr.setParam("group_deny", Helperjs.cleanArray(group_deny))};
// if (contact_allow.length>0) {xhr.setParam("contact_allow", Helperjs.cleanArray(contact_allow))};
// if (contact_deny.length>0) {xhr.setParam("contact_deny", Helperjs.cleanArray(contact_deny))};
if (media_ids.length>0) {
xhr.setParam("media_ids", media_ids.join());
}
xhr.post();
Newsjs.storeHashtags(login,db,status,root);
media_ids=[]
messageSend.close()
}
function dmUpdate(title,text,replyto,screen_name) {
@ -116,20 +123,21 @@ Rectangle{
xhr.setParam("screen_name", screen_name);
if (parentId!="") {xhr.setParam("replyto", replyto)};
xhr.post();
messageSend.close()
}
function setParent(newsitemobject){
if (newsitemobject!=""){
messageSend.state="conversation"
messageSend.reply_to_user=newsitemobject.user.screen_name;
messageSend.parentId=newsitemobject.id
} else {
messageSend.state=null;
messageSend.reply_to_user="";
messageSend.parentId="";
bodyField.text="";
}
}
// function setParent(newsitemobject){
// if (newsitemobject!=""){
// messageSend.state="conversation"
// messageSend.reply_to_user=newsitemobject.user.screen_name;
// messageSend.parentId=newsitemobject.id
// } else {
// messageSend.state=null;
// messageSend.reply_to_user="";
// messageSend.parentId="";
// bodyField.text="";
// }
// }
function contactmenu(letter){
Newsjs.listFriends(login,db,function(contacts){
@ -153,18 +161,51 @@ Rectangle{
tagSelector.visible=true
});
}
// Flickable{
// anchors.fill: parent
// contentHeight: messageColumn.height
// boundsBehavior: Flickable.StopAtBounds
Action {
id: quitAction
shortcut: StandardKey.Quit
onTriggered: messageSend.close()
}
Action {
id: copyAction
shortcut: StandardKey.Copy
onTriggered: bodyField.copy()
}
Action {
id: cutAction
shortcut: StandardKey.Cut
onTriggered: bodyField.cut()
}
Action {
id: pasteAction
shortcut: StandardKey.Paste
onTriggered: bodyField.paste()
}
Action {
id: boldAction
shortcut: StandardKey.Bold
onTriggered: document.bold = !document.bold
}
Action {
id: italicAction
shortcut: StandardKey.Italic
onTriggered: document.italic = !document.italic
}
DropArea{
anchors.fill: parent
onDropped: {
if (messageSend.state==""){messageSend.state="active"}
//if (messageSend.state==""){messageSend.state="active"}
if (drop.keys.includes('text/uri-list')){
var droptext = drop.text.replace(/(\r\n|\n|\r)/gm, ",");
imageUploadDialog.visible=true;
attachImage(droptext)}
attachImage(droptext)}
else if (drop.keys.includes('text/html')){
bodyField.append(drop.html)}
else if (drop.keys.includes('text/plain')){
@ -172,121 +213,71 @@ Rectangle{
}
}
}
Column {
y:0.5*mm
id:messageColumn
spacing: 0.5*mm
width: parent.width
height: 2.6*root.fontFactor*osSettings.bigFontSize+stackTypeDescription.height
Label{id:stackTypeDescription
width: parent.width
horizontalAlignment:Text.AlignHCenter
text: !conversation &&newsSwipeview.stacktype?qsTr(newsSwipeview.stacktype):""
font.pointSize: osSettings.bigFontSize
BlueButton{
width: root.fontFactor*osSettings.bigFontSize
height:stackTypeDescription.height
anchors.left: stackTypeDescription.left
anchors.leftMargin: 2*root.fontFactor*osSettings.bigFontSize
visible: newsSwipeview.currentIndex!=0
text:"\uf053"
fontColor: Material.hintTextColor
border.color: "transparent"
color:"transparent"
radius:0
onClicked: {newsSwipeview.currentIndex=newsSwipeview.currentIndex-1}
ScrollView{
width: messageSend.width-root.fontFactor*osSettings.bigFontSize
height: parent.height
clip:true
Column {
y:0.5*mm
id:messageColumn
spacing: 0.5*mm
width: messageSend.width-2*root.fontFactor*osSettings.bigFontSize
TextArea{
id:receiverLabel
x: mm
width: parent.width-2*mm
font.pointSize: osSettings.bigFontSize
placeholderText:qsTr("to:")
text: ""
visible:false
onTextChanged: {
if (text!=""){contactmenu(text)} else {var receiver=getText(0,cursorPosition);contactmenu(receiver+preeditText)}}
}
BlueButton{
width: root.fontFactor*osSettings.bigFontSize
height:stackTypeDescription.height
anchors.right: stackTypeDescription.right
anchors.rightMargin: 2*root.fontFactor*osSettings.bigFontSize
visible: newsSwipeview.currentIndex!=newsSwipeview.count-1
text:"\uf054"
fontColor: Material.hintTextColor
border.color: "transparent"
color:"transparent"
radius:0
onClicked: {newsSwipeview.currentIndex=newsSwipeview.currentIndex+1}
TextField {
id: titleField
x: mm
width: parent.width
font.pointSize: osSettings.systemFontSize
placeholderText: qsTr("Title (optional)")
placeholderTextColor: osSettings.secondaryTextColor
visible: false
background: Rectangle{
color: osSettings.backgroundDimColor
radius: 0.5*mm
}
}
}
TextArea{
id:receiverLabel
width: messageColumn.width
font.pointSize: osSettings.bigFontSize
placeholderText:qsTr("to:")
text: ""
visible:false
onTextChanged: {
if (text!=""){contactmenu(text)} else {var receiver=getText(0,cursorPosition);contactmenu(receiver+preeditText)}}
}
TextField {
id: titleField
x: 0.5*mm
width: parent.width-mm
font.pointSize: osSettings.systemFontSize
placeholderText: qsTr("Title (optional)")
visible: false
onVisibleChanged: if ((visible==true)&&(conversation==true)){
conversationView.contentY=conversationView.contentY+titleField.height
}
}
Rectangle{
color: Material.backgroundColor
radius: 0.5*mm
visible:(conversation || (newsSwipeview.stacktype!="Notifications"))
x:mm
width: parent.width-2*mm
height:Math.max(bodyField.contentHeight+4*mm,2.5*root.fontFactor*osSettings.bigFontSize)
// Rectangle{
// color: osSettings.backgroundColor
// radius: 0.5*mm
// x:mm
// width: parent.width-2*mm
// height:Math.max(bodyField.contentHeight+4*mm,2.5*root.fontFactor*osSettings.bigFontSize)
TextArea {
id: bodyField
property string contactprefix:""
property string placeholder: osSettings.osType=="Linux"? qsTr(" Drop your Content here."):""
anchors.fill: parent
//anchors.fill: parent
x:mm
height:Math.max(bodyField.contentHeight+4*mm,2.5*root.fontFactor*osSettings.bigFontSize)
width: parent.width
background: Rectangle{
color: osSettings.backgroundDimColor
radius: 0.5*mm
}
font.pointSize: osSettings.systemFontSize
font.family: "Noto Sans"
wrapMode: Text.Wrap
selectByMouse: true
placeholderText: conversation?"": (qsTr("What's on your mind?")+placeholder)
textFormat: TextEdit.RichText
onLineCountChanged: {
if (messageSend.ListView.view==null){
if (newsitem.ListView.view==null){}
else {newsitem.ListView.view.contentY=newsitem.ListView.view.contentY+root.fontFactor*osSettings.systemFontSize}
}
if(conversation==true){
conversationView.contentY=conversationView.contentY+root.fontFactor*osSettings.systemFontSize
}
else{
messageSend.ListView.view.contentY=messageSend.ListView.view.contentY+root.fontFactor*osSettings.systemFontSize
}
}
persistentSelection: true
placeholderText: (qsTr("What's on your mind?")+placeholder)
placeholderTextColor: osSettings.secondaryTextColor
textFormat: TextEdit.MarkdownText
onLinkActivated:{Qt.openUrlExternally(link)}
onActiveFocusChanged:{
if (activeFocus==true){
if (messageSend.ListView.view==null){
if ((typeof newsitem == 'undefined') || (newsitem.ListView.view==null)){}
else {
newsitem.ListView.view.contentY=newsitem.ListView.view.contentY+newsitem.height/2}
}
else if (conversation==true){
if(parentId==""){setParent(conversationModel.get(0).newsitemobject);}
messageSend.state="conversation";
try{conversationView.contentY=conversationView.contentY+20*mm}catch(e){}
} else if (textfocus==false){
messageSend.state="active";
messageSend.ListView.view.positionViewAtBeginning();
}
else{
messageSend.ListView.view.contentY=messageSend.ListView.view.contentY+8*mm
};
}
}
onTextChanged:{
if (text!=""){
var plaintext=getText(0,cursorPosition)
@ -302,200 +293,317 @@ Rectangle{
}else {contactSelector.visible=false}
}else{contactSelector.visible=false}
}
}
}
ListView{
id:contactSelector
visible: false
z:3
x:2*root.fontFactor*osSettings.bigFontSize
width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize
height: messageSend.height/2
model:contactModel
function processContactSelection(contact){
if(Helperjs.getCount(db,login,"contacts","screen_name",contact.screen_name)>1){
contact.screen_name=contact.screen_name+"+"+contacts.cid
MouseArea {
acceptedButtons: Qt.RightButton
anchors.fill: parent
onClicked: contextMenu.open()
}
if (newsSwipeview.stacktype=='DirectMessages'){
receiverLabel.text=contact.screen_name;
reply_to_user=contact.screen_name
} else {
bodyField.remove(bodyField.getText(0,bodyField.cursorPosition).lastIndexOf(bodyField.contactprefix,bodyField.cursorPosition),bodyField.cursorPosition);
bodyField.insert(bodyField.cursorPosition, bodyField.contactprefix+contact.screen_name+" ");
bodyField.cursorPosition=bodyField.cursorPosition+contact.screen_name.length+1
}
Menu {
id: contextMenu
MenuItem {
text: qsTr("Copy")
enabled: bodyField.selectedText
action: copyAction
//onTriggered: bodyField.copy()
}
MenuItem {
text: qsTr("Cut")
enabled: bodyField.selectedText
action: cutAction
//onTriggered: bodyField.cut()
}
MenuItem {
text: qsTr("Paste")
enabled: bodyField.canPaste
action: pasteAction
//onTriggered: bodyField.paste()
}
MenuItem {
text: qsTr("Text")
enabled: bodyField.selectedText
onTriggered: print(bodyField.getFormattedText(bodyField.selectionStart,bodyField.selectionEnd))
}
//receiverLabel.text=contact.screen_name;
contactSelector.visible=false
}
delegate: ContactComponent { }
}
ListModel{id:contactModel}
ListView{
id: tagSelector
visible: false
z:3
x:2*root.fontFactor*osSettings.bigFontSize
width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize
height: messageSend.height/2
model:tagModel
clip: true
spacing: 0
function processTagSelection(hashtag){
bodyField.insert(bodyField.cursorPosition, hashtag+" ");
bodyField.cursorPosition=bodyField.cursorPosition+hashtag.length+1
tagSelector.visible=false
}
delegate: MButton {text:tag;onClicked: tagSelector.processTagSelection(tag)}
}
ListModel{id:tagModel}
Row{
id:buttonRow
visible:false
spacing: mm
height: 2.5*root.fontFactor*osSettings.bigFontSize
x: 0.5*mm
// MButton{id:permButton //Permissions not working in Friendica 02/2022
// visible: !conversation && (newsSwipeview.stacktype!=="DirectMessages")
// height: 2*root.fontFactor*osSettings.bigFontSize
// width: 2*root.fontFactor*osSettings.bigFontSize
// text: ((contact_allow.length==0)&&(contact_deny.length==0)&&(group_allow.length==0)&&(group_deny.length==0))?"\uf09c":"\uf023"
// onClicked: { if (permissionDialog.visible==false){permissionDialog.visible=true} else{permissionDialog.visible=false}}
// }
MButton{
id:smileyButton
text: "\uf118"
height: 2*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
onClicked: {if (smileyDialog.visible==false){smileyDialog.visible=true} else{smileyDialog.visible=false}}
DocumentHandler { id: document
document: bodyField.textDocument
cursorPosition: bodyField.cursorPosition
selectionStart: bodyField.selectionStart
selectionEnd: bodyField.selectionEnd
property alias bold: document.font.bold
property alias italic: document.font.italic
property alias strikeout: document.font.strikeout
//onError: function (message) { errorDialog.text = message errorDialog.open() }
}
MButton{
id:hastagButton
text: "\uf292"
height: 2*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
onClicked: {if (tagSelector.visible==false){hashtagmenu()} else{tagSelector.visible=false}}
}
MButton{
id:imagesButton
visible:(newsSwipeview.stacktype!="DirectMessages")
text: "\uf03e"
height: 2*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
onClicked: {
if (imageUploadDialog.visible==false){
imageUploadDialog.visible=true;
imageUploadDialog.attach()
ListView{
id:contactSelector
visible: false
z:3
x:2*root.fontFactor*osSettings.bigFontSize
width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize
height: messageSend.height/2
model:contactModel
function processContactSelection(contact){
if(Helperjs.getCount(db,login,"contacts","screen_name",contact.screen_name)>1){
contact.screen_name=contact.screen_name+"+"+contacts.cid
}
else{imageUploadDialog.visible=false}}
if (newsSwipeview.stacktype=='DirectMessages'){
receiverLabel.text=contact.screen_name;
reply_to_user=contact.screen_name
} else {
bodyField.remove(bodyField.getText(0,bodyField.cursorPosition).lastIndexOf(bodyField.contactprefix,bodyField.cursorPosition),bodyField.cursorPosition);
bodyField.insert(bodyField.cursorPosition, bodyField.contactprefix+contact.screen_name+" ");
bodyField.cursorPosition=bodyField.cursorPosition+contact.screen_name.length+1
}
//receiverLabel.text=contact.screen_name;
contactSelector.visible=false
}
delegate: ContactComponent { }
}
ListModel{id:contactModel}
MButton {
id: cancelButton
height: 2*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
text: "\uf057"
onClicked: {
if (textfocus==true){messageSend.destroy()}
else{
bodyField.text="";
messageSend.state="";
permissionDialog.visible=false;
smileyDialog.visible=false;
imageUploadDialog.visible=false;
receiverLabel.visible=false;
reply_to_user="";
media_ids=[]
ListView{
id: tagSelector
visible: false
z:3
x:2*root.fontFactor*osSettings.bigFontSize
width: parent.width-2.2*root.fontFactor*osSettings.bigFontSize
height: messageSend.height/2
model:tagModel
clip: true
spacing: 0
function processTagSelection(hashtag){
bodyField.insert(bodyField.cursorPosition, hashtag+" ");
bodyField.cursorPosition=bodyField.cursorPosition+hashtag.length+1
tagSelector.visible=false
}
delegate: MButton {text:tag;onClicked: tagSelector.processTagSelection(tag)}
}
ListModel{id:tagModel}
Row{
id:formatRow
visible: wideScreen
spacing: mm
height: 3.5*root.fontFactor*osSettings.bigFontSize
x: 0.5*mm
MButton {
id: boldButton
text: "\uf032" // icon-bold
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Bold")
focusPolicy: Qt.NoFocus
// Don't want to close the virtual keyboard when this is clicked.
// focusPolicy: Qt.NoFocus
// checkable: true
// checked: document.bold
onClicked: {
document.bold = !document.bold;
bodyField.forceActiveFocus()
}
}
MButton {
id: italicButton
text: "\uf033" // icon-italic
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Italic")
focusPolicy: Qt.NoFocus
// focusPolicy: Qt.NoFocus
// checkable: true
// checked: document.italic
onClicked: {document.italic = !document.italic;bodyField.forceActiveFocus()}
}
MButton {
id: liststyleButton
text: "\uf03a" // icon-align-justify
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Create list")
// focusPolicy: Qt.NoFocus
// checkable: true
// checked: document.alignment == Qt.AlignJustify
onClicked: {document.liststyle = !document.liststyle;bodyField.forceActiveFocus()}
}
MButton {
id: codeblockButton
text: "\uf121" // icon-code
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Format as code")
// focusPolicy: Qt.NoFocus
// checkable: true
// checked: document.alignment == Qt.AlignJustify
onClicked: {document.codeblock = !document.codeblock;bodyField.forceActiveFocus()}
}
MButton {
id: plainButton
text: bodyField.textFormat==TextEdit.PlainText?qsTr("Rendered"):qsTr("MD") // icon-code
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Show Markdown code")
// focusPolicy: Qt.NoFocus
// checkable: true
// checked: document.alignment == Qt.AlignJustify
onClicked: {
if(bodyField.textFormat==TextEdit.PlainText){
bodyField.textFormat=TextEdit.MarkdownText;}
else {bodyField.textFormat=TextEdit.PlainText}
bodyField.forceActiveFocus()
}
}
}
MButton {
id: sendButton
height: 2*root.fontFactor*osSettings.bigFontSize
width: 2*root.fontFactor*osSettings.bigFontSize
text: "\uf1d9"
onClicked: {
var title=titleField.text.replace("\"","\'");
var body=bodyField.getFormattedText(0,bodyField.length);
var dmbody=bodyField.getText(0,bodyField.length);
if (conversation || newsSwipeview.stacktype!=="DirectMessages"){
if (parentId!=""){
statusUpdate(title,dmbody,parentId)
}else{
statusUpdate(title,body,parentId)}
}else {
if (reply_to_user!=""){dmUpdate(title,dmbody,parentId,reply_to_user)}
else{Helperjs.showMessage(qsTr("Error"),qsTr("No receiver supplied!"),root)}
}
if (conversation==true){
newstab.newstabstatus=root.globaloptions.newsViewType; rootstackView.pop(null)
PermissionDialog{id:permissionDialog;x:mm;visible: false}
SmileyDialog{id:smileyDialog;x:mm;visible: false}
MessageImageUploadDialog{id:imageUploadDialog;visible: false}
Row{
id:buttonRow
visible: true
spacing: mm
height: 3.5*root.fontFactor*osSettings.bigFontSize
x: 0.5*mm
// MButton{id:permButton //Permissions not working in Friendica 02/2022
// visible: !conversation && (newsSwipeview.stacktype!=="DirectMessages")
// height: 2*root.fontFactor*osSettings.bigFontSize
// width: 2*root.fontFactor*osSettings.bigFontSize
// text: ((contact_allow.length==0)&&(contact_deny.length==0)&&(group_allow.length==0)&&(group_deny.length==0))?"\uf09c":"\uf023"
// onClicked: { if (permissionDialog.visible==false){permissionDialog.visible=true} else{permissionDialog.visible=false}}
// }
MButton{
id:smileyButton
text: "\uf118"
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Insert smiley")
height: 3*root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
onClicked: {if (smileyDialog.visible==false){smileyDialog.visible=true} else{smileyDialog.visible=false}}
}
MButton{
id:hastagButton
text: "\uf292"
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Insert previous hashtag")
height: 3*root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
onClicked: {if (tagSelector.visible==false){hashtagmenu()} else{tagSelector.visible=false}}
}
MButton{
id:imagesButton
visible:(newsSwipeview.stacktype!="DirectMessages")
text: "\uf03e"
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Insert images")
height: 3*root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
onClicked: {
if (imageUploadDialog.visible==false){
imageUploadDialog.visible=true;
imageUploadDialog.attach()
}
else{imageUploadDialog.visible=false}}
}
MButton {
id: cancelButton
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Cancel message")
height: 3*root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
text: "\uf057"
onClicked: {messageSend.close()}
}
MButton {
id: formatButton
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Format message")
height: 3*root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
text: "\uf031"
onClicked: {formatRow.visible?formatRow.visible=false:formatRow.visible=true}
}
MButton {
id: sendButton
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Send message")
height: 3*root.fontFactor*osSettings.bigFontSize
width: 3*root.fontFactor*osSettings.bigFontSize
text: "\uf1d9"
onClicked: {
var title=titleField.text.replace("\"","\'");
var body=bodyField.getFormattedText(0,bodyField.length);
var dmbody=bodyField.getText(0,bodyField.length);
if (windowstate=="directmessage"){
if (reply_to_user!=""){dmUpdate(title,dmbody,parentId,reply_to_user)}
else{Helperjs.showMessage(qsTr("Error"),qsTr("No receiver supplied!"),root)}
}else {
body=body.replace(/\*\*/g,"__")
statusUpdate(title,body,parentId)
}
}
}
}
}
PermissionDialog{id:permissionDialog;x:mm;visible: false}
SmileyDialog{id:smileyDialog;x:mm;visible: false}
MessageImageUploadDialog{id:imageUploadDialog;visible: false}
}
Component.onCompleted:{
root.replySignal.connect(setParent);
root.directmessageSignal.connect(directmessagePrepare);
if(parentId!="" &&reply_to_user!=""){
receiverLabel.text=reply_to_user;
}
// root.replySignal.connect(setParent);
// root.directmessageSignal.connect(directmessagePrepare);
root.uploadSignal.connect(sendUrls);
root.sendtextSignal.connect(sendtext);
if (textfocus==true){bodyField.forceActiveFocus()}
// if (textfocus==true){bodyField.forceActiveFocus()}
}
states: [
State {
name: "active"
PropertyChanges {
target: messageColumn; height: implicitHeight
}
PropertyChanges {
target: buttonRow; visible:true
}
PropertyChanges {
target: titleField; visible:(newsSwipeview.stacktype!="DirectMessages")
}
PropertyChanges {
target: receiverLabel; visible:(newsSwipeview.stacktype=="DirectMessages");
}
},
State {
name: "conversation"
PropertyChanges {
target: messageColumn; height: implicitHeight
}
PropertyChanges {
target: buttonRow; visible:true
}
PropertyChanges {
target: titleField; visible:(!conversation&&newsSwipeview.stacktype!="DirectMessages")
}
},
StateGroup{
state: windowstate
states: [
State {
name: "active"
PropertyChanges {
target: messageColumn; height: implicitHeight
}
PropertyChanges {
target: titleField; visible: true
}
State {
name: "reply"
PropertyChanges {
target: messageColumn; height: implicitHeight
},
State {
name: "directmessage"
PropertyChanges {
target: messageColumn; height: implicitHeight
}
PropertyChanges {
target: formatRow; visible: false
}
PropertyChanges {
target: titleField; visible: false
}
PropertyChanges {
target: receiverLabel; visible: true;
}
PropertyChanges {
target: imagesButton; visible: false
}
PropertyChanges {
target: formatButton; visible: false
} },
State {
name: "reply"
PropertyChanges {
target: messageColumn; height: implicitHeight
}
PropertyChanges {
target: titleField; visible: false
}
PropertyChanges {
target: bodyField; placeholderText:"";focus:true
}
}
PropertyChanges {
target: buttonRow; visible:true
}
PropertyChanges {
target: titleField; visible:false
}
PropertyChanges {
target: bodyField; placeholderText:"";focus:true
}
PropertyChanges {
target: stackTypeDescription; visible:false
}
}
]
]
}
}

View file

@ -30,12 +30,12 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.0
import QtQuick.Controls.Material 2.12
Rectangle{
id: moreComments
width: parent.width
height: 5*mm
color:Material.background//"white"
color:osSettings.backgroundColor
property int comments:0
// border.color:"grey"
// border.width:1

View file

@ -32,7 +32,6 @@
import QtQuick 2.15
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/qml/genericqml"
Page{
@ -66,7 +65,7 @@ Page{
anchors.topMargin: 1*mm
anchors.right: parent.right
anchors.rightMargin: 1*mm
color: Material.dialogColor
color: osSettings.dialogColor
text: "\uf057"
onClicked: {
if (rootstackView.depth>1){

View file

@ -31,7 +31,6 @@
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/js/news.js" as Newsjs
import "qrc:/js/helper.js" as Helperjs
import "qrc:/js/service.js" as Service
@ -40,11 +39,12 @@ Rectangle{
id: newsStack
width: parent.width
height: parent.height
color: Material.backgroundColor
color: osSettings.backgroundColor
property string updateMethodNews: "refresh"
property var allchats: ({})
property int lastnewsid:0
property string newstabstatus: ""
property bool expectScreenUpdate: false
function newstypeHandling(newstype){
try{newsBusy.running=true}catch(e){print(e)};
@ -69,21 +69,25 @@ Rectangle{
newsStack.updateMethodNews="refresh";
newstab.newstabstatus="Favorites";
Service.updateView("Favorites");
expectScreenUpdate=true;
break;
case "replies":
newsStack.updateMethodNews="refresh";
newstab.newstabstatus="Replies";
Service.updateView("Replies");
expectScreenUpdate=true;
break;
case "publictimeline":
newsStack.updateMethodNews="refresh";
newstab.newstabstatus="Public Timeline";
Service.updateView("Public Timeline");
expectScreenUpdate=true;
break;
case "groupnews":
newsStack.updateMethodNews="refresh";
newstab.newstabstatus="Groupnews";
Service.showGroups();
expectScreenUpdate=true;
break;
case "search":
newsView.anchors.topMargin=7*mm;
@ -109,6 +113,7 @@ Rectangle{
else if (newsSwipeview.stacktype=="Notifications"){
Service.updateView("Notifications")
}
expectScreenUpdate=true;
break;
default:
if (newstab.newstabstatus=="Timeline" || newstabstatus=="Timeline"){
@ -126,6 +131,7 @@ Rectangle{
else if (newsSwipeview.stacktype=="Notifications"){
Service.updateView("Notifications")
}
expectScreenUpdate=true;
}
}
@ -149,7 +155,9 @@ Rectangle{
xhr.setAccount(login);
xhr.setApi("/api/search");
xhr.setParam("q",term)
xhr.get();}
xhr.get();
expectScreenUpdate=true;
}
newsView.anchors.topMargin=mm
}
@ -201,6 +209,7 @@ Rectangle{
try{xhr.setParam("max_id",newsModel.get(newsModel.count-1).newsitemobject.id-1);}catch(e){}
xhr.get()
expectScreenUpdate=true;
}
}
@ -232,6 +241,7 @@ Rectangle{
target:xhr
function onError(data,url,api,code){
newsBusy.running=false;
expectScreenUpdate=false;
}
function onSuccess(data,api){
const newsApiArray=["/api/statuses/friends_timeline",
@ -249,9 +259,11 @@ Rectangle{
"/api/statuses/update",
"/api/direct_messages/new"
];
if(newsApiArray.includes(api)){
if(newsApiArray.includes(api) && expectScreenUpdate==true){
expectScreenUpdate=false;
Service.processNews(api,data)
root.replySignal("")
expectScreenUpdate=false;
}
}
}
@ -261,8 +273,11 @@ Rectangle{
newsBusy.running=false;
}
function onSuccess(api){
loadDBNews();
newsBusy.running=false;
if(expectScreenUpdate){
loadDBNews();
newsBusy.running=false;
expectScreenUpdate=false;
}
}
}
@ -286,6 +301,7 @@ Rectangle{
else if (newsSwipeview.stacktype=="Replies"){
Service.updateView("Replies")
}
expectScreenUpdate=true;
root.replySignal("")
}
}
@ -294,12 +310,12 @@ Rectangle{
Component { id:footerComponent
Rectangle{
border.color: "#EEEEEE"
color: Material.dialogColor
color: osSettings.dialogColor
border.width: 1
width:newsView.width
height:6*mm
Text{
color: Material.primaryTextColor
color: osSettings.primaryTextColor
font.pointSize: osSettings.systemFontSize
anchors.centerIn: parent
text:qsTr("More")
@ -308,6 +324,7 @@ Rectangle{
anchors.fill:parent
onClicked:{
if (newsModel.count==0){
expectScreenUpdate=true;
if (newsSwipeview.stacktype=="Home"){
Service.updateView(newstab.newstabstatus)
}
@ -334,11 +351,11 @@ Rectangle{
property bool viewdraggedpositive: false
property string viewtype: "news"
width: parent.width
height: parent.height-3*mm
height: parent.height//-3*mm
anchors.margins: 0.5*mm
clip: true
spacing: 0
header:MessageSend{id:messagesend;onHeightChanged: {if(state=="active"){newsView.positionViewAtBeginning()}}}
//header:MessageSend{id:messagesend;onHeightChanged: {if(state=="active"){newsView.positionViewAtBeginning()}}}
footer: footerComponent
model: newsModel
delegate: Newsitem{}
@ -397,18 +414,22 @@ Rectangle{
showNews(news)});
}
} else {
expectScreenUpdate=true;
Service.updateView(currentnewstabstatus,currentlastnews)
}
});
}
else if (newsSwipeview.stacktype=="DirectMessages"){
Service.updateView("Direct Messages")
expectScreenUpdate=true;
}
else if (newsSwipeview.stacktype=="Notifications"){
Service.updateView("Notifications")
expectScreenUpdate=true;
}
else if (newsSwipeview.stacktype=="Replies"){
Service.updateView("Replies")
expectScreenUpdate=true;
}
}

View file

@ -29,18 +29,18 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import QtQuick 2.11
import QtQuick.Controls 2.12
import QtQuick 2.15
import QtQuick.Controls 6.3
import "qrc:/qml/newsqml"
import "qrc:/qml/genericqml"
import "qrc:/js/news.js" as Newsjs
import "qrc:/js/helper.js" as Helperjs
import "qrc:/js/service.js" as Service
Rectangle{
Page{
id:newstabitem
width:rootstack.width
height: rootstack.height-8*mm
height: rootstack.height
Timer {id:contacttimer; interval: 50; running: false; repeat: false
onTriggered: {
@ -85,48 +85,66 @@ Rectangle{
function getActivitiesView(newsitemobject){
var likeText="";var dislikeText="";var attendyesText="";var attendnoText="";var attendmaybeText=""; var self={};
try{if (newsitemobject.messagetype==0&&newsitemobject.hasOwnProperty('friendica_activities')){
if (newsitemobject.friendica_activities.like.length>0){
if (newsitemobject.friendica_activities.like.length==1){likeText= newsitemobject.friendica_activities.like[0].name+" "+ qsTr("likes this.")}
else {likeText= newsitemobject.friendica_activities.like.length+" "+ qsTr("like this.")}
}
if (newsitemobject.friendica_activities.dislike.length>0){
if (newsitemobject.friendica_activities.dislike.length==1){dislikeText= newsitemobject.friendica_activities.dislike[0].name+" "+ qsTr("doesn't like this.")}
else {dislikeText= newsitemobject.friendica_activities.dislike.length+" "+ qsTr("don't like this.")}
}
if (newsitemobject.friendica_activities.attendyes.length>0){
if (newsitemobject.friendica_activities.attendyes.length==1){attendyesText=newsitemobject.friendica_activities.attendyes[0].name+" "+ qsTr("will attend.")}
else {attendyesText= newsitemobject.friendica_activities.attendyes.length+" "+ qsTr("persons will attend.")}
}
if (newsitemobject.friendica_activities.attendno.length>0){
if (newsitemobject.friendica_activities.attendno.length==1){attendnoText= newsitemobject.friendica_activities.attendno[0].name+" "+ qsTr("will not attend.")}
else {attendnoText= newsitemobject.friendica_activities.attendno.length+" "+ qsTr("persons will not attend.")}
}
if (newsitemobject.friendica_activities.attendmaybe.length>0){
if (newsitemobject.friendica_activities.attendmaybe.length==1){attendmaybeText= newsitemobject.friendica_activities.attendmaybe[0].name+" "+ qsTr("may attend.")}
else {attendmaybeText= newsitemobject.friendica_activities.attendmaybe.length+" "+ qsTr("persons may attend.")}
}
//var friendica_activities_self=JSON.parse(newsitemobject.friendica_activities_self);
if (newsitemobject.friendica_activities.like.length>0){
if (newsitemobject.friendica_activities.like.length==1){likeText= newsitemobject.friendica_activities.like[0].name+" "+ qsTr("likes this.")}
else {likeText= newsitemobject.friendica_activities.like.length+" "+ qsTr("like this.")}
}
if (newsitemobject.friendica_activities.dislike.length>0){
if (newsitemobject.friendica_activities.dislike.length==1){dislikeText= newsitemobject.friendica_activities.dislike[0].name+" "+ qsTr("doesn't like this.")}
else {dislikeText= newsitemobject.friendica_activities.dislike.length+" "+ qsTr("don't like this.")}
}
if (newsitemobject.friendica_activities.attendyes.length>0){
if (newsitemobject.friendica_activities.attendyes.length==1){attendyesText=newsitemobject.friendica_activities.attendyes[0].name+" "+ qsTr("will attend.")}
else {attendyesText= newsitemobject.friendica_activities.attendyes.length+" "+ qsTr("persons will attend.")}
}
if (newsitemobject.friendica_activities.attendno.length>0){
if (newsitemobject.friendica_activities.attendno.length==1){attendnoText= newsitemobject.friendica_activities.attendno[0].name+" "+ qsTr("will not attend.")}
else {attendnoText= newsitemobject.friendica_activities.attendno.length+" "+ qsTr("persons will not attend.")}
}
if (newsitemobject.friendica_activities.attendmaybe.length>0){
if (newsitemobject.friendica_activities.attendmaybe.length==1){attendmaybeText= newsitemobject.friendica_activities.attendmaybe[0].name+" "+ qsTr("may attend.")}
else {attendmaybeText= newsitemobject.friendica_activities.attendmaybe.length+" "+ qsTr("persons may attend.")}
}
//var friendica_activities_self=JSON.parse(newsitemobject.friendica_activities_self);
}} catch(e){print("Activities "+e+ " "+JSON.stringify(newsitemobject.friendica_activities))}
return {likeText:likeText,dislikeText:dislikeText,attendyesText:attendyesText,attendnoText:attendnoText,attendmaybeText:attendmaybeText}
}
function openMessageSend(messageState,newsitemobject){
var parentId=""
var replyUser=""
if(newsitemobject!=""){
parentId=newsitemobject.id
replyUser=newsitemobject.user.screen_name;
}
// var messageString='import QtQuick 2.15; import QtQuick.Window 2.0; import "qrc:/qml/newsqml";'+
// ' Window{id:messageWindow; title:"Message"; width:root.width; height:root.height; '+
// 'MessageSend{state:"'+messageState+'"} Component.onCompleted: {x=Screen.width/2-width/2; y=Screen.height/2-height/2}}';
// var messageObject=Qt.createQmlObject(messageString,root,"messageOutput");
var messageObject = Qt.createComponent("qrc:/qml/newsqml/MessageSend.qml");
var messageWindow=messageObject.createObject(root, { parentId: parentId, reply_to_user: replyUser, windowstate: messageState });
messageWindow.show();
}
// CalendarTab{
// visible: wideScreen&&rootstackView.depth<2
// width: newstabitem.width/3
// x: newsSwipeview.width
// //anchors.left: newsSwipeview.right
// //anchors.fill: null
// }
// Rectangle{
// color: "#F8F8F8"
// height: parent.height
// width: 0.5*mm
// anchors.left: newsSwipeview.right
// }
MessageSend{}
// CalendarTab{
// visible: wideScreen&&rootstackView.depth<2
// width: newstabitem.width/3
// x: newsSwipeview.width
// //anchors.left: newsSwipeview.right
// //anchors.fill: null
// }
// Rectangle{
// color: "#F8F8F8"
// height: parent.height
// width: 0.5*mm
// anchors.left: newsSwipeview.right
// }
BlueButton{
z:2
anchors.right: parent.right
visible: !wideScreen
fontColor: "grey"
border.color: "transparent"
@ -136,6 +154,20 @@ Rectangle{
leftDrawerAndroid.visible?leftDrawerAndroid.close():leftDrawerAndroid.open()}
}
MButton{
z:2
anchors.right: parent.right
anchors.bottom: parent.bottom
// fontColor: "grey"
// border.color: "transparent"
text: "\uf040"
font.pointSize: osSettings.bigFontSize
onClicked:{
if (newsSwipeview.stacktype=="DirectMessages"){openMessageSend("directmessage","")}
else {openMessageSend("active","")}
}
}
LeftDrawerLinux{
id:leftDrawer
property var newstabstatus: newstab.newstabstatus
@ -148,22 +180,87 @@ Rectangle{
id: leftDrawerAndroid
}
TabBar {
id: newstabbar
x: leftDrawer.width
width: newsSwipeview.width
spacing: 1
position: TabBar.Header
onCurrentIndexChanged: {
newsSwipeview.currentIndex=newstabbar.currentIndex;
}
TabButton {
font.family: fontAwesome.name
font.pointSize : osSettings.bigFontSize
width: newstabbar.width/5
text: "\uf015"
background:Rectangle{
anchors.fill: parent
color: osSettings.backgroundDimColor
border.color: newsSwipeview.currentIndex==0?osSettings.accentColor:color
}
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Home")
onDoubleClicked: {newstypeSignal("refresh")}
}
TabButton {
font.family: fontAwesome.name
font.pointSize: osSettings.bigFontSize
width: newstabbar.width/5
text: "\uf0ec"
background:Rectangle{
anchors.fill: parent
color: osSettings.backgroundDimColor
border.color: newsSwipeview.currentIndex==1?osSettings.accentColor:color
}
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Replies")
}
TabButton {
font.family: fontAwesome.name
font.pointSize: osSettings.bigFontSize
width: newstabbar.width/5
text: "\uf0e0"
background:Rectangle{
anchors.fill: parent
color: osSettings.backgroundDimColor
border.color: newsSwipeview.currentIndex==2?osSettings.accentColor:color
}
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Direct Messages")
}
TabButton {
font.family: fontAwesome.name
font.pointSize: osSettings.bigFontSize
width: newstabbar.width/5
text: "\uf0f3"
background:Rectangle{
anchors.fill: parent
color: osSettings.backgroundDimColor
border.color: newsSwipeview.currentIndex==3?osSettings.accentColor:color
}
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Notifications")
}
}
SwipeView{
id: newsSwipeview
property string stacktype:"Home"
currentIndex: 0
width: wideScreen&&rootstackView.depth<2?newstabitem.width-leftDrawer.width:newstabitem.width//newstabitem.width/3*2:newstabitem.width
height: newstabitem.height-4*mm
height: newstabitem.height-newstabbar.height
x: leftDrawer.width
y: newstabbar.height
function onDirectMessage(friend){currentIndex=2}
onCurrentIndexChanged: {
switch(currentIndex){
case 0: stacktype="Home";break;
case 1: stacktype="Replies";break;
case 2: stacktype="DirectMessages";break;
case 3: stacktype="Notifications";break;
default: stacktype="Home";
case 0: stacktype="Home";break;
case 1: stacktype="Replies";break;
case 2: stacktype="DirectMessages";break;
case 3: stacktype="Notifications";break;
default: stacktype="Home";
}
}

View file

@ -31,7 +31,6 @@
import QtQuick 2.0
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/js/news.js" as Newsjs
import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml"
@ -59,17 +58,18 @@ Item {
if (model.newsitemobject.hasOwnProperty("currentconversation")){
rootstackView.push("qrc:/qml/newsqml/Conversation.qml",{"news": model.newsitemobject.currentconversation})}
else{rootstackView.push("qrc:/qml/newsqml/Conversation.qml")};
expectScreenUpdate=true;
showConversation(index,newsitemobject)
}
Rectangle{width:newsitem.width; height: 1; anchors.bottom: newsitem.bottom;
color: Material.backgroundDimColor
color: osSettings.backgroundDimColor
}
Rectangle{
width:newsitem.width
height:newsitem.height-1
color: Material.background
color: osSettings.backgroundColor
Column {
id:toprow
@ -112,20 +112,20 @@ Item {
Label {
id:messageTypeLabel
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
text: if (newsitemobject.messagetype==1){ qsTr("Direct Message")} else if(newsitemobject.messagetype==2) {" Notification"} else {qsTr("Source: ")+newsitemobject.source}
font.pointSize: 0.6*osSettings.systemFontSize
}
Label {
id:createdAtLabel
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
font.pointSize: 0.6*osSettings.systemFontSize
horizontalAlignment: Label.AlignRight
text: " \u00B7 "+getDateDiffString(newsitemobject.dateDiff) + " " +qsTr("ago")
}
Label {
id:replytoLabel
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
font.pointSize: 0.6*osSettings.systemFontSize
font.family: "Noto Sans"
horizontalAlignment: Label.AlignRight
@ -139,8 +139,8 @@ Item {
height: itemMessage.height
onClicked: {pushConversation()}
Text {
color: Material.primaryTextColor
linkColor: Material.accentColor
color: osSettings.primaryTextColor
linkColor: osSettings.accentColor
id: itemMessage
textFormat: Text.RichText
font.family: "Noto Sans"
@ -189,12 +189,12 @@ Item {
anchors.bottom: toprow.bottom
visible: toprow.implicitHeight>3/4*root.height || newsitemobject.nsfw
text:"\uf078"
fontColor: Material.secondaryTextColor
fontColor: osSettings.secondaryTextColor
border.color: "transparent"
color: Material.backgroundColor
color: osSettings.backgroundColor
// gradient: Gradient {
// GradientStop { position: 0.0; color: "transparent" }
// GradientStop { position: 0.5; color: Material.backgroundDimColor}
// GradientStop { position: 0.5; color: osSettings.backgroundDimColor}
// }
radius:0
onClicked: {
@ -215,7 +215,7 @@ Item {
width:parent.width
spacing:mm
Label{color: Material.secondaryTextColor
Label{color: osSettings.secondaryTextColor
height:3.5*mm
font.pointSize: 0.75*osSettings.systemFontSize
text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.likeText
@ -224,7 +224,7 @@ Item {
onClicked: { showActivityContacts(newsitemobject.friendica_activities.like)}
}
}
Label{color: Material.secondaryTextColor
Label{color: osSettings.secondaryTextColor
height:3.5*mm
font.pointSize: 0.75*osSettings.systemFontSize
text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.dislikeText
@ -233,7 +233,7 @@ Item {
onClicked: { showActivityContacts(newsitemobject.friendica_activities.dislike)}
}
}
Label{color: Material.secondaryTextColor
Label{color: osSettings.secondaryTextColor
height:3.5*mm
font.pointSize: 0.75*osSettings.systemFontSize
text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.attendyesText
@ -241,7 +241,7 @@ Item {
anchors.fill: parent
onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendyes)}
}}
Label{color: Material.secondaryTextColor
Label{color: osSettings.secondaryTextColor
height:3.5*mm
font.pointSize: 0.75*osSettings.systemFontSize
text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.attendnoText
@ -250,7 +250,7 @@ Item {
onClicked: { showActivityContacts(newsitemobject.friendica_activities.attendno)}
}
}
Label{color: Material.secondaryTextColor
Label{color: osSettings.secondaryTextColor
height:3.5*mm
font.pointSize: 0.75*osSettings.systemFontSize
text: newsitemobject.hasOwnProperty("isLastComment")?"":friendica_activities_view.attendmaybeText
@ -261,7 +261,7 @@ Item {
}
Label{
id:attendLabel
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
height:3.5*mm
font.pointSize: 0.75*osSettings.systemFontSize
horizontalAlignment: Label.AlignRight
@ -288,7 +288,7 @@ Item {
anchors.centerIn: parent
font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name
color:likeCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor
color:likeCheckbox.checked?osSettings.primaryTextColor: osSettings.secondaryTextColor
text:likeCheckbox.checked?"\uf118"+"!":"\uf118"
}
}
@ -317,7 +317,7 @@ Item {
anchors.centerIn: parent
font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name
color:dislikeCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor
color:dislikeCheckbox.checked?osSettings.primaryTextColor: osSettings.secondaryTextColor
text: dislikeCheckbox.checked?"\uf119"+"!":"\uf119"
}
}
@ -346,7 +346,7 @@ Item {
anchors.centerIn: parent
font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name
color: favoritedCheckbox.checked?Material.primaryTextColor: Material.secondaryTextColor
color: favoritedCheckbox.checked?osSettings.primaryTextColor: osSettings.secondaryTextColor
text:"\uf005"
}
}
@ -365,7 +365,7 @@ Item {
color:"transparent"
Text{
id:replysymbol
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
anchors.centerIn: parent
font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name
@ -374,21 +374,24 @@ Item {
MouseArea{
anchors.fill:parent
onClicked: {
var directmessage=0;
if (newsitemobject.messagetype==1){ directmessage=1}
var replycomp=Qt.createComponent("qrc:/qml/newsqml/MessageSend.qml");
var conversation;
if (newsitem.ListView.view==null){conversation=true}
else if (newsitem.ListView.view.viewtype=="conversation"){
conversation=true
newsitem.ListView.view.currentIndex=itemindex
}
else{
conversation=false;
newsitem.ListView.view.currentIndex=itemindex
};
var reply=replycomp.createObject(friendicaActivities,{parentId:newsitemobject.id,reply_to_user:newsitemobject.user.screen_name, state:"reply",conversation:conversation,textfocus:true})
openMessageSend("reply",newsitemobject)
}
// var directmessage=0;
// if (newsitemobject.messagetype==1){ directmessage=1}
// var replycomp=Qt.createComponent("qrc:/qml/newsqml/MessageSend.qml");
// var conversation;
// if (newsitem.ListView.view==null){conversation=true}
// else if (newsitem.ListView.view.viewtype=="conversation"){
// conversation=true
// newsitem.ListView.view.currentIndex=itemindex
// }
// else{
// conversation=false;
// newsitem.ListView.view.currentIndex=itemindex
// };
// var reply=replycomp.createObject(friendicaActivities,{parentId:newsitemobject.id,reply_to_user:newsitemobject.user.screen_name, state:"reply",conversation:conversation,textfocus:true})
// }
}
}
Rectangle{
@ -398,7 +401,7 @@ Item {
color:"transparent"
Text{
id:newsmenusymbol
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
anchors.centerIn: parent
font.pointSize: osSettings.bigFontSize
font.family:fontAwesome.name
@ -416,7 +419,7 @@ Item {
delegate: MenuItem{
contentItem: Text{
font.pointSize: osSettings.systemFontSize
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
text: parent.text
}
}
@ -483,7 +486,7 @@ Item {
delegate: MenuItem{
contentItem: Text{
font.pointSize: osSettings.systemFontSize
color: Material.secondaryTextColor
color: osSettings.secondaryTextColor
text: parent.text
}
}

View file

@ -31,7 +31,6 @@
import QtQuick 2.0
import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.12
import "qrc:/js/helper.js" as Helperjs
Dialog {

View file

@ -32,7 +32,6 @@
import QtQuick 2.11
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.11
import QtQuick.Controls.Material 2.12
import "qrc:/js/smiley.js" as Smileyjs
import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/genericqml"
@ -42,7 +41,7 @@ Rectangle{
x: mm
width: messageColumn.width-5*mm
height:root.height/2
color: Material.backgroundColor
color: osSettings.backgroundColor
MButton{
id:closeButton
@ -64,22 +63,8 @@ Rectangle{
text:qsTr("Unicode")
font.pointSize: osSettings.systemFontSize
}
TabButton {
text: qsTr("Standard")
font.pointSize: osSettings.systemFontSize
}
TabButton {
text: qsTr("Addon")
font.pointSize: osSettings.systemFontSize
}
TabButton {
text: qsTr("Adult")
font.pointSize: osSettings.systemFontSize
}
}
StackLayout{
id:smileyTabView
currentIndex: smileybar.currentIndex
@ -89,7 +74,7 @@ Rectangle{
height: smileyDialog.height-4*root.fontFactor*osSettings.bigFontSize
Rectangle{
id: htmlGridTab
color: Material.backgroundColor
color: osSettings.backgroundColor
GridView {
id:htmlView
anchors.fill: parent
@ -109,97 +94,7 @@ Rectangle{
}
}
}
Rectangle{
id: coreGridTab
color: Material.backgroundColor
GridView {
id: coreSmileyView
anchors.fill: parent
cellWidth: 5*mm
cellHeight: 5*mm
clip: true
model: coreSmileyModel
delegate: smileyItem
}
ListModel{
id: coreSmileyModel
}
Component.onCompleted:{
var smileyarray=Smileyjs.core
for (var icon in smileyarray){
coreSmileyModel.append({"emoji":smileyarray[icon]})
}
}
}
Rectangle{
id: addonGridTab
color: Material.backgroundColor
GridView {
id: addonView
anchors.fill: parent
cellWidth: 5*mm
cellHeight: 5*mm
clip: true
model: addonModel
delegate: smileyItem
}
ListModel{
id: addonModel
}
Component.onCompleted:{
for (var icon in Smileyjs.addon){
addonModel.append({"emoji":Smileyjs.addon[icon]})
}
}
}
Rectangle{
id: adultGridTab
color: Material.backgroundColor
GridView {
id: adultView
anchors.fill: parent
cellWidth: 5*mm
cellHeight: 5*mm
clip: true
model: adultModel
delegate: smileyItem
}
ListModel{
id: adultModel
}
Component.onCompleted:{
for (var icon in Smileyjs.adult){
adultModel.append({"emoji":Smileyjs.adult[icon]})
}
}
}
}
Component{
id:smileyItem
AnimatedImage{id:smileyImage
width:4.5*mm
height: 4.5*mm
fillMode:Image.PreserveAspectFit
source:emoji.url
MouseArea{
anchors.fill: parent
onClicked:{
//bodyField.append(emoji.name+" ")
bodyField.insert(bodyField.cursorPosition,emoji.name+" ");
smileyDialog.visible=false
}
}
}
}
Component{
id:htmlItem

View file

@ -31,7 +31,6 @@
import QtQuick 2.5
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import "qrc:/js/helper.js" as Helperjs
import "qrc:/js/image.js" as Imagejs
import "qrc:/qml/genericqml"
@ -237,7 +236,7 @@ Page{
Rectangle{
width:root.width/2 //Math.max(20*mm,descriptionInput.contentWidth)
height:imageUploadView.height-3*root.fontFactor*osSettings.bigFontSize// 20*mm
color: Material.backgroundColor
color: osSettings.backgroundColor
Image{
id: uploadImage
width: root.width/2-mm //20*mm
@ -256,7 +255,7 @@ Page{
}
Rectangle{
color: Material.backgroundColor
color: osSettings.backgroundColor
border.color: "grey"
anchors.top: uploadImage.bottom
anchors.topMargin: mm
@ -282,7 +281,7 @@ Page{
BlueButton{
width: 5*root.fontFactor*osSettings.bigFontSize
height:imageUploadView.height-3*root.fontFactor*osSettings.bigFontSize
color: Material.backgroundColor
color: osSettings.backgroundColor
text:"\u002b"
fontSize: 3*osSettings.bigFontSize
onClicked:{

View file

@ -31,7 +31,6 @@
import QtQuick 2.5
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import QtQml.Models 2.1
import "qrc:/js/image.js" as Imagejs
import "qrc:/js/helper.js" as Helperjs
@ -44,7 +43,7 @@ StackView{
initialItem:Rectangle {
id:fotorectangle
anchors.fill:parent
color: Material.backgroundColor
color: osSettings.backgroundColor
property var newimages:[]
property int currentimageno: 0
property bool remoteContact: false
@ -174,7 +173,7 @@ StackView{
BlueButton{
z:2
visible: !wideScreen
fontColor: Material.secondaryTextColor//"grey"
fontColor: osSettings.secondaryTextColor//"grey"
border.color: "transparent"
text: "\uf0c9"
font.pointSize: osSettings.bigFontSize
@ -287,13 +286,13 @@ StackView{
clip: true
model: visualphotoModel.parts.album
footer:Rectangle{
border.color: Material.backgroundDimColor
border.color: osSettings.backgroundDimColor
border.width: 1
color: Material.dialogColor
color: osSettings.dialogColor
width:12*mm
height:6*mm
Text{
color: Material.primaryTextColor
color: osSettings.primaryTextColor
font.pointSize: 0.75*osSettings.systemFontSize
anchors.centerIn: parent
text:qsTr("More")

View file

@ -1,5 +1,6 @@
[Controls]
Style=Material
Style=Fusion
#Style=Material
[Default]
Font\Family=Noto Sans