diff --git a/.gitignore b/.gitignore index 2b880085b..6f9356d05 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ Thumbs.db *.pro.user .kdev4 *.kdev4 + +!supportlibs/libsam3/Makefile diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d620b3719..8e96b8124 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,32 +1,48 @@ image: docker:stable services: - - docker:stable-dind + - docker:stable-dind + +stages: + - build + - test workflow: rules: - if: $CI_MERGE_REQUEST_ID - if: $CI_COMMIT_BRANCH -build-and-test: +variables: + UBUNTU_TESTING_IMAGE_TAG: "$CI_REGISTRY_IMAGE/gitlabci_outputs/ubuntu_testing:$CI_COMMIT_SHA" + +build-ubuntu-test-image: + stage: build script: - - > - if [ -n "$CI_MERGE_REQUEST_ID" ]; then - REPO_ARGS="--build-arg REPO_URL=$CI_MERGE_REQUEST_SOURCE_PROJECT_URL" ; - REPO_ARGS="$REPO_ARGS --build-arg REPO_BRANCH=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" ; - else - REPO_ARGS="--build-arg REPO_URL=$CI_REPOSITORY_URL" ; - REPO_ARGS="$REPO_ARGS --build-arg REPO_BRANCH=$CI_COMMIT_BRANCH" ; - fi ; - export REPO_ARGS ; - echo REPO_ARGS=$REPO_ARGS ; + - > + docker login "$CI_REGISTRY" + --username "$CI_REGISTRY_USER" + --password "$CI_REGISTRY_PASSWORD" - mkdir Dockercontext - > - docker build -t retroshare:testing $REPO_ARGS + docker build + -t $UBUNTU_TESTING_IMAGE_TAG + $($CI_PROJECT_DIR/build_scripts/GitlabCI/getRepoArgs.sh) --file $CI_PROJECT_DIR/build_scripts/GitlabCI/gitlabCI.Dockerfile Dockercontext + - docker push $UBUNTU_TESTING_IMAGE_TAG + - echo UBUNTU_TESTING_IMAGE_TAG=$UBUNTU_TESTING_IMAGE_TAG + +test-ubuntu: + stage: test + script: + - > + docker login "$CI_REGISTRY" + --username "$CI_REGISTRY_USER" + --password "$CI_REGISTRY_PASSWORD" + - echo UBUNTU_TESTING_IMAGE_TAG=$UBUNTU_TESTING_IMAGE_TAG + - docker pull $UBUNTU_TESTING_IMAGE_TAG - > - docker run --name retroshare --detach --tty retroshare:testing + docker run --name retroshare --detach --tty $UBUNTU_TESTING_IMAGE_TAG retroshare-service --jsonApiPort 9092 - apk add jq - > @@ -51,3 +67,43 @@ build-and-test: docker exec retroshare curl --verbose http://127.0.0.1:9092/rsMsgs/getChatLobbyList | jq - docker container stop retroshare + +build-android-arm-apk: + stage: build + script: + - mkdir Dockercontext + - > + docker build -t retroshare:android_arm_latest + $($CI_PROJECT_DIR/build_scripts/GitlabCI/getRepoArgs.sh) + --build-arg RS_SERVICE_QMAKE_EXTRA_OPTS="$RS_SERVICE_QMAKE_EXTRA_OPTS" + --file $CI_PROJECT_DIR/build_scripts/GitlabCI/Android.Dockerfile + Dockercontext +# see https://stackoverflow.com/a/59055906 + - > + docker cp + $(docker create --rm retroshare:android_arm_latest):/retroshare-service-android-build/android-build/build/outputs/apk/debug/android-build-debug.apk + $CI_PROJECT_DIR/RetroShare_Android_Service-arm.apk + artifacts: + paths: + - RetroShare_Android_Service-arm.apk + +# Use separate runner to avoid no space left on device +build-android-arm64-apk: + stage: build + script: + - mkdir Dockercontext + - > + docker build -t retroshare:android_arm64_latest + $($CI_PROJECT_DIR/build_scripts/GitlabCI/getRepoArgs.sh) + --build-arg ANDROID_PLATFORM_VER=21 + --build-arg ANDROID_NDK_ARCH=arm64 + --build-arg RS_SERVICE_QMAKE_EXTRA_OPTS="$RS_SERVICE_QMAKE_EXTRA_OPTS" + --file $CI_PROJECT_DIR/build_scripts/GitlabCI/Android.Dockerfile + Dockercontext + - > + docker cp + $(docker create --rm retroshare:android_arm64_latest):/retroshare-service-android-build/android-build/build/outputs/apk/debug/android-build-debug.apk + $CI_PROJECT_DIR/RetroShare_Android_Service-arm64.apk + artifacts: + paths: + - RetroShare_Android_Service-arm64.apk diff --git a/.gitmodules b/.gitmodules index c35876fc6..2f69bb7b2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,3 +14,6 @@ [submodule "supportlibs/rapidjson"] path = supportlibs/rapidjson url = https://github.com/Tencent/rapidjson.git +[submodule "supportlibs/libsam3"] + path = supportlibs/libsam3 + url = https://github.com/i2p/libsam3.git diff --git a/.travis.yml b/.travis.yml index 9b0be7fa6..ef38661ba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,10 +8,10 @@ language: cpp matrix: include: - - os: linux - dist: bionic - sudo: required - compiler: gcc +# - os: linux +# dist: bionic +# sudo: required +# compiler: gcc - os: osx osx_image: xcode10.2 compiler: clang @@ -68,11 +68,11 @@ before_script: fi script: - - if [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then make -j4; fi + - if [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then travis_wait 30 make -j$(nproc); fi after_success: - if [ $TRAVIS_OS_NAME == osx ]; then build_scripts/OSX/travis_makeOSXPackage.sh ; fi - - if [ $TRAVIS_OS_NAME == linux ] && [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then make -j2; fi +# - if [ $TRAVIS_OS_NAME == linux ] && [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then make -j2; fi # branches: diff --git a/README.asciidoc b/README.asciidoc index 734c3d083..9bacc3345 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -9,9 +9,9 @@ RetroShare provides file sharing, chat, messages, forums, channels and more. .Build Status |=============================================================================== -|GNU/Linux (via Gitlab CI) | image:https://gitlab.com/RetroShare/RetroShare/badges/master/pipeline.svg[link="https://gitlab.com/RetroShare/RetroShare/-/commits/master",title="pipeline status"] -|GNU/Linux, macOS, (via Travis CI) | image:https://travis-ci.org/RetroShare/RetroShare.svg?branch=master[link="https://travis-ci.org/RetroShare/RetroShare"] +|GNU/Linux, Android (via Gitlab CI) | image:https://gitlab.com/RetroShare/RetroShare/badges/master/pipeline.svg[link="https://gitlab.com/RetroShare/RetroShare/-/commits/master",title="pipeline status"] |Windows (via AppVeyor) | image:https://ci.appveyor.com/api/projects/status/github/RetroShare/RetroShare?svg=true[link="https://ci.appveyor.com/project/RetroShare58622/retroshare"] +|macOS, (via Travis CI) | image:https://app.travis-ci.com/RetroShare/RetroShare.svg?branch=master[link="https://app.travis-ci.com/github/RetroShare/RetroShare"] |=============================================================================== diff --git a/build_scripts/Android/Dockerfile b/build_scripts/Android/Dockerfile new file mode 100644 index 000000000..2e4b8c762 --- /dev/null +++ b/build_scripts/Android/Dockerfile @@ -0,0 +1,115 @@ +## To prepare an image suitable as base for Gitlab CI use +## image name must match gitlab repository name, you can play just with the tag +## the part after : +# export CI_IMAGE_NAME="registry.gitlab.com/retroshare/retroshare:android_arm_base" +# docker build --squash -t "${CI_REGISTRY_IMAGE}" \ +# --build-arg QT_INSTALLER_JWT_TOKEN="your qt JWT token goes here" . +# +# To build Android ARMv8 (64 bit) package pass also +# export CI_IMAGE_NAME="registry.gitlab.com/retroshare/retroshare:android_arm64_base" +# --build-arg ANDROID_NDK_ARCH=arm64 --build-arg ANDROID_PLATFORM_VER=21 + +## --squash is very important in case of GitlabCI shared runners as they are +## limited to 25GB disk size + +## To push it to gitlab CI registry you need first to login and the to push +# docker login registry.gitlab.com +# docker push ${CI_IMAGE_NAME} + +## To extract the generated APK easily you can run after the build complete +# docker cp \ +# $(docker create --rm ${CI_IMAGE_NAME}):/retroshare-service-android-build/android-build/build/outputs/apk/debug/android-build-debug.apk \ +# /tmp/RetroShare_Android_Service.apk + + +FROM ubuntu:20.04 + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && apt-get clean +RUN apt-get install -y -qq \ + bash build-essential bzip2 cmake curl chrpath doxygen \ + git p7zip python qt5-default qttools5-dev tclsh unzip wget zip + +# Dependencies to create Android pkg +RUN apt-get install -y -qq \ + openjdk-8-jre openjdk-8-jdk openjdk-8-jdk-headless gradle + +ARG FRESHCLONE=0 +ARG REPO_URL=https://gitlab.com/RetroShare/RetroShare.git +ARG REPO_BRANCH=master +ARG REPO_DEPTH="--depth 2000" + +RUN git clone $REPO_DEPTH $REPO_URL -b $REPO_BRANCH && cd RetroShare && \ + git fetch --tags + +ENV PREPARE_TOOLCHAIN="/RetroShare/build_scripts/Android/prepare-toolchain-clang.sh" +ENV NATIVE_LIBS_TOOLCHAIN_PATH="/android-toolchain/" + +ARG ANDROID_PLATFORM_VER=16 +ARG ANDROID_NDK_ARCH=arm + +ENV ANDROID_SDK_PATH="/opt/android-sdk" +ENV ANDROID_HOME="$ANDROID_SDK_PATH" +ENV ANDROID_SDK_ROOT="$ANDROID_SDK_PATH" + +ENV ANDROID_NDK_PATH="/opt/android-ndk" +ENV ANDROID_NDK_ROOT="$ANDROID_NDK_PATH" + +ENV PATH="$PATH:$ANDROID_HOME/tools" +ENV PATH="$PATH:$ANDROID_HOME/platform-tools" +ENV JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/" + +RUN mkdir /bCache +WORKDIR /bCache + +## Quick HACK to ease development +#COPY prepare-toolchain-clang.sh $PREPARE_TOOLCHAIN + +RUN $PREPARE_TOOLCHAIN install_android_sdk +RUN $PREPARE_TOOLCHAIN install_android_ndk +RUN $PREPARE_TOOLCHAIN + +ARG QT_INSTALLER_JWT_TOKEN +RUN $PREPARE_TOOLCHAIN install_qt_android +# Avoid Qt account details leak into the image +RUN rm -f /root/.local/share/Qt/qtaccount.ini +# Shrink image by removing unneded Qt components +RUN rm -r \ + $NATIVE_LIBS_TOOLCHAIN_PATH/Qt/Docs/ \ + $NATIVE_LIBS_TOOLCHAIN_PATH/Qt/Examples/ \ + $NATIVE_LIBS_TOOLCHAIN_PATH/Qt/Tools/ + +RUN mkdir /jsonapi-generator-build +WORKDIR /jsonapi-generator-build/ +RUN qmake ../RetroShare/jsonapi-generator/src/ \ + CONFIG+=no_retroshare_plugins \ + CONFIG+=no_retroshare_service CONFIG+=no_retroshare_gui \ + CONFIG+=rs_jsonapi CONFIG+=no_rs_sam3_libsam3 && \ + make -j$(nproc) + +RUN mkdir /retroshare-service-android-build +WORKDIR /retroshare-service-android-build +ARG RS_SERVICE_QMAKE_EXTRA_OPTS +RUN $($PREPARE_TOOLCHAIN get_qt_dir | head -n 1)/bin/qmake ../RetroShare \ + -spec android-clang \ + CONFIG+=retroshare_service CONFIG+=rs_jsonapi \ + RS_UPNP_LIB=miniupnpc \ + JSONAPI_GENERATOR_EXE=/jsonapi-generator-build/jsonapi-generator \ + NATIVE_LIBS_TOOLCHAIN_PATH=$NATIVE_LIBS_TOOLCHAIN_PATH \ + CONFIG+=no_retroshare_gui CONFIG+=no_rs_service_webui_terminal_password \ + CONFIG+=no_rs_service_terminal_login \ + CONFIG+=no_rs_sam3 CONFIG+=no_rs_sam3_libsam3 \ + $RS_SERVICE_QMAKE_EXTRA_OPTS +RUN make -j$(nproc) +RUN make install INSTALL_ROOT=/retroshare-service-android-build/android-build/ +RUN $($PREPARE_TOOLCHAIN get_qt_dir | head -n 1)/bin/androiddeployqt \ + --input retroshare-service/src/android-libretroshare-service.so-deployment-settings.json \ + --output android-build --android-platform android-$ANDROID_PLATFORM_VER \ + --jdk $JAVA_HOME --gradle + + +RUN rm -rf /bCache + +# Clean apt cache +RUN apt-get clean && rm -rf /var/lib/apt/lists/* diff --git a/build_scripts/Android/README.asciidoc b/build_scripts/Android/README.asciidoc index d5670e10c..c47974161 100644 --- a/build_scripts/Android/README.asciidoc +++ b/build_scripts/Android/README.asciidoc @@ -81,6 +81,7 @@ JSONAPI_GENERATOR_EXE=Your_Path/jsonapi-generator/src/jsonapi-generator NATIVE_LIBS_TOOLCHAIN_PATH=Your_Path/retroshare-android-16-arm/ CONFIG+=no_retroshare_gui CONFIG+=no_rs_service_webui_terminal_password CONFIG+=no_rs_service_terminal_login +CONFIG+=no_rs_sam3 CONFIG+=no_rs_sam3_libsam3 ------------------------------------------------------------------------------- TIP: Some versions of QtCreator try to find the Android SDK in diff --git a/build_scripts/Android/prepare-toolchain-clang.sh b/build_scripts/Android/prepare-toolchain-clang.sh index 83c30721b..25fefccba 100755 --- a/build_scripts/Android/prepare-toolchain-clang.sh +++ b/build_scripts/Android/prepare-toolchain-clang.sh @@ -2,7 +2,8 @@ # Script to prepare RetroShare Android package building toolchain # -# Copyright (C) 2016-2020 Gioacchino Mazzurco +# Copyright (C) 2016-2021 Gioacchino Mazzurco +# Copyright (C) 2020-2021 Asociación Civil Altermundi # # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU Affero General Public License as published by the @@ -38,6 +39,15 @@ define_default_value ANDROID_PLATFORM_VER "16" define_default_value NATIVE_LIBS_TOOLCHAIN_PATH "${HOME}/Builds/android-toolchains/retroshare-android-${ANDROID_PLATFORM_VER}-${ANDROID_NDK_ARCH}/" define_default_value HOST_NUM_CPU $(nproc) +define_default_value ANDROID_SDK_INSTALL "false" +define_default_value ANDROID_SDK_TOOLS_VERSION "3859397" +define_default_value ANDROID_SDK_TOOLS_SHA256 444e22ce8ca0f67353bda4b85175ed3731cae3ffa695ca18119cbacef1c1bea0 +define_default_value ANDROID_SDK_VERSION "29.0.3" + +define_default_value ANDROID_NDK_INSTALL "false" +define_default_value ANDROID_NDK_VERSION "r21" +define_default_value ANDROID_NDK_SHA256 b65ea2d5c5b68fb603626adcbcea6e4d12c68eb8a73e373bbb9d23c252fc647b + define_default_value BZIP2_SOURCE_VERSION "1.0.6" define_default_value BZIP2_SOURCE_SHA256 a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd @@ -48,16 +58,22 @@ define_default_value SQLITE_SOURCE_YEAR "2018" define_default_value SQLITE_SOURCE_VERSION "3250200" define_default_value SQLITE_SOURCE_SHA256 da9a1484423d524d3ac793af518cdf870c8255d209e369bd6a193e9f9d0e3181 -define_default_value SQLCIPHER_SOURCE_VERSION "4.2.0" -define_default_value SQLCIPHER_SOURCE_SHA256 105c1b813f848da038c03647a8bfc9d42fb46865e6aaf4edfd46ff3b18cdccfc +define_default_value SQLCIPHER_SOURCE_VERSION "4.4.3" +define_default_value SQLCIPHER_SOURCE_SHA256 b8df69b998c042ce7f8a99f07cf11f45dfebe51110ef92de95f1728358853133 define_default_value LIBUPNP_SOURCE_VERSION "1.8.4" define_default_value LIBUPNP_SOURCE_SHA256 976c3e4555604cdd8391ed2f359c08c9dead3b6bf131c24ce78e64d6669af2ed -define_default_value INSTALL_QT_ANDROID "false" -define_default_value QT_VERSION "5.12.0" +define_default_value QT_ANDROID_VIA_INSTALLER "false" +define_default_value QT_VERSION "5.12.11" +define_default_value QT_INSTALLER_VERSION "4.1.1" +define_default_value QT_INSTALLER_SHA256 1266ffd0d1b0e466244e3bc8422975c1aa9d96745b6bb28d422f7f92df11f34c +define_default_value QT_INSTALLER_JWT_TOKEN "" +define_default_value QT_INSTALL_PATH "${NATIVE_LIBS_TOOLCHAIN_PATH}/Qt/" + define_default_value QT_ANDROID_INSTALLER_SHA256 a214084e2295c9a9f8727e8a0131c37255bf724bfc69e80f7012ba3abeb1f763 +define_default_value RESTBED_SOURCE_REPO "https://github.com/Corvusoft/restbed.git" define_default_value RESTBED_SOURCE_VERSION f74f9329dac82e662c1d570b7cd72c192b729eb4 define_default_value UDP_DISCOVERY_CPP_SOURCE "https://github.com/truvorskameikin/udp-discovery-cpp.git" @@ -72,6 +88,64 @@ define_default_value RAPIDJSON_SOURCE_SHA256 bf7ced29704a1e696fbccf2a2b4ea068e77 define_default_value MINIUPNPC_SOURCE_VERSION "2.1.20190625" define_default_value MINIUPNPC_SOURCE_SHA256 8723f5d7fd7970de23635547700878cd29a5c2bb708b5e5475b2d1d2510317fb +# zlib and libpng versions walks toghether +define_default_value ZLIB_SOURCE_VERSION "1.2.11" +define_default_value ZLIB_SOURCE_SHA256 4ff941449631ace0d4d203e3483be9dbc9da454084111f97ea0a2114e19bf066 + +define_default_value LIBPNG_SOURCE_VERSION "1.6.37" +define_default_value LIBPNG_SOURCE_SHA256 505e70834d35383537b6491e7ae8641f1a4bed1876dbfe361201fc80868d88ca + +define_default_value LIBJPEG_SOURCE_VERSION "9d" +define_default_value LIBJPEG_SOURCE_SHA256 6c434a3be59f8f62425b2e3c077e785c9ce30ee5874ea1c270e843f273ba71ee + +define_default_value TIFF_SOURCE_VERSION "4.2.0" +define_default_value TIFF_SOURCE_SHA256 eb0484e568ead8fa23b513e9b0041df7e327f4ee2d22db5a533929dfc19633cb + +define_default_value CIMG_SOURCE_VERSION "2.9.7" +define_default_value CIMG_SOURCE_SHA256 595dda9718431a123b418fa0db88e248c44590d47d9b1646970fa0503e27fa5c + +define_default_value PHASH_SOURCE_REPO "https://gitlab.com/g10h4ck/pHash.git" +define_default_value PHASH_SOURCE_VERSION origin/android-ndk + +define_default_value MVPTREE_SOURCE_REPO "https://github.com/starkdg/mvptree.git" +define_default_value MVPTREE_SOURCE_VERSION origin/master + +define_default_value REPORT_DIR "$(pwd)/$(basename ${NATIVE_LIBS_TOOLCHAIN_PATH})_build_report/" + +cArch="" +eABI="" +cmakeABI="" + +case "${ANDROID_NDK_ARCH}" in +"arm") + cArch="${ANDROID_NDK_ARCH}" + eABI="eabi" + ;; +"arm64") + cArch="aarch64" + eABI="" + ;; +"x86") + cArch="i686" + eABI="" + ;; +"x86_64") + echo "ANDROID_NDK_ARCH=${ANDROID_NDK_ARCH} not supported yet" + exit -1 + cArch="??" + eABI="" +esac + +export SYSROOT="${NATIVE_LIBS_TOOLCHAIN_PATH}/sysroot/" +export PREFIX="${SYSROOT}/usr/" +export CC="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-clang" +export CXX="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-clang++" +export AR="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-ar" +export RANLIB="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-ranlib" + +# Used to instruct cmake to explicitely ignore host libraries +export HOST_IGNORE_PREFIX="/usr/" + ## $1 filename, $2 sha256 hash function check_sha256() @@ -104,159 +178,269 @@ function verified_download() } } -cArch="" -eABI="" +# This function is the result of reading and testing many many stuff be very +# careful editing it +function andro_cmake() +{ +# Using android.toolchain.cmake as documented here +# https://developer.android.com/ndk/guides/cmake seens to break more things then +# it fixes :-\ -case "${ANDROID_NDK_ARCH}" in -"arm") - cArch="${ANDROID_NDK_ARCH}" - eABI="eabi" + cmakeProc="" + case "${ANDROID_NDK_ARCH}" in + "arm") + cmakeProc="armv7-a" ;; -"arm64") - cArch="aarch64" - eABI="" + "arm64") + cmakeProc="aarch64" ;; -"x86") - cArch="i686" - eABI="" + "x86") + cmakeProc="i686" ;; -esac + "x86_64") + cmakeProc="x86_64" + ;; + *) + echo "Unhandled NDK architecture ${ANDROID_NDK_ARCH}" + exit -1 + ;; + esac -export SYSROOT="${NATIVE_LIBS_TOOLCHAIN_PATH}/sysroot/" -export PREFIX="${SYSROOT}/usr/" -export CC="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-clang" -export CXX="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-clang++" -export AR="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-ar" -export RANLIB="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-ranlib" + _hi="$HOST_IGNORE_PREFIX" + cmake \ + -DCMAKE_SYSTEM_PROCESSOR=$cmakeProc \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_PREFIX_PATH="${PREFIX}" \ + -DCMAKE_SYSTEM_PREFIX_PATH="${PREFIX}" \ + -DCMAKE_INCLUDE_PATH="${PREFIX}/include" \ + -DCMAKE_SYSTEM_INCLUDE_PATH="${PREFIX}/include" \ + -DCMAKE_LIBRARY_PATH="${PREFIX}/lib" \ + -DCMAKE_SYSTEM_LIBRARY_PATH="${PREFIX}/lib" \ + -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ + -DCMAKE_IGNORE_PATH="$_hi/include;$_hi/lib;$_hi/lib64" \ + $@ + + # It is probably ok to do not touch CMAKE_PROGRAM_PATH and + # CMAKE_SYSTEM_PROGRAM_PATH +} + +function git_source_get() +{ + sourceDir="$1" ; shift #$1 + sourceRepo="$1" ; shift #$2 + sourceVersion="$1" ; shift #$3 + # extra paramethers are treated as submodules + + [ -d "$sourceDir" ] && + { + pushd "$sourceDir" + actUrl="$(git remote get-url origin)" + [ "$actUrl" != "$sourceRepo" ] && rm -rf "${sourceDir}" + popd + } || true + + [ -d $sourceDir ] || git clone "$sourceRepo" "$sourceDir" + pushd $sourceDir + + git fetch --all + git reset --hard ${sourceVersion} + + while [ "$1" != "" ] ; do + git submodule update --init "$1" + pushd "$1" + git reset --hard + shift + popd + done + + popd +} + +declare -A TASK_REGISTER + +function task_register() +{ + TASK_REGISTER[$1]=true +} + +function task_unregister() +{ + # we may simply wipe them but we could benefit from keeping track of + # unregistered tasks too + TASK_REGISTER[$1]=false +} + +function task_logfile() +{ + echo "$REPORT_DIR/$1.log" +} + +function task_run() +{ + mTask="$1" ; shift + + [ "${TASK_REGISTER[$mTask]}" != "true" ] && + { + echo "Attempt to run not registered task $mTask $@" + return -1 + } + + logFile="$(task_logfile $mTask)" + if [ -f "$logFile" ] ; then + echo "Task $mTask already run more details at $logFile" + else + date | tee > "$logFile" + $mTask $@ |& tee --append "$logFile" + mRetval="${PIPESTATUS[0]}" + echo "Task $mTask return ${mRetval} more details at $logFile" + date | tee --append "$logFile" + return ${mRetval} + fi +} + +function task_zap() +{ + rm -f "$(task_logfile $1)" +} + +DUPLICATED_INCLUDES_LIST_FILE="${REPORT_DIR}/duplicated_includes_list" +DUPLICATED_INCLUDES_DIR="${REPORT_DIR}/duplicated_includes/" + +task_register install_android_sdk +install_android_sdk() +{ + tFile="sdk-tools-linux-${ANDROID_SDK_TOOLS_VERSION}.zip" + + verified_download "${tFile}" "${ANDROID_SDK_TOOLS_SHA256}" \ + "https://dl.google.com/android/repository/${tFile}" + + unzip "${tFile}" + mkdir -p "$ANDROID_SDK_PATH" + rm -rf "$ANDROID_SDK_PATH/tools/" + mv --verbose tools/ "$ANDROID_SDK_PATH/tools/" + + # Install Android SDK + yes | $ANDROID_SDK_PATH/tools/bin/sdkmanager --licenses && \ + $ANDROID_SDK_PATH/tools/bin/sdkmanager --update + $ANDROID_SDK_PATH/tools/bin/sdkmanager "platforms;android-$ANDROID_PLATFORM_VER" + $ANDROID_SDK_PATH/tools/bin/sdkmanager "build-tools;$ANDROID_SDK_VERSION" +} + +task_register install_android_ndk +install_android_ndk() +{ + tFile="android-ndk-${ANDROID_NDK_VERSION}-linux-x86_64.zip" + + verified_download "${tFile}" "${ANDROID_NDK_SHA256}" \ + "https://dl.google.com/android/repository/${tFile}" + + unzip "${tFile}" + mkdir -p "$ANDROID_NDK_PATH" + rm -rf "$ANDROID_NDK_PATH" + mv --verbose "android-ndk-${ANDROID_NDK_VERSION}/" "$ANDROID_NDK_PATH/" +} ## More information available at https://android.googlesource.com/platform/ndk/+/ics-mr0/docs/STANDALONE-TOOLCHAIN.html -build_toolchain() +task_register bootstrap_toolchain +bootstrap_toolchain() { - echo "build_toolchain() -################################################################################ -################################################################################ -################################################################################ -" - - rm -rf ${NATIVE_LIBS_TOOLCHAIN_PATH} + rm -rf "${NATIVE_LIBS_TOOLCHAIN_PATH}" ${ANDROID_NDK_PATH}/build/tools/make_standalone_toolchain.py --verbose \ --arch ${ANDROID_NDK_ARCH} --install-dir ${NATIVE_LIBS_TOOLCHAIN_PATH} \ --api ${ANDROID_PLATFORM_VER} - find "${PREFIX}/include/" -not -type d > "${NATIVE_LIBS_TOOLCHAIN_PATH}/deletefiles" + + # Avoid problems with arm64 some libraries installing on lib64 + ln -s "${PREFIX}/lib/" "${PREFIX}/lib64" + + pushd "${PREFIX}/include/" + find . -not -type d > "${DUPLICATED_INCLUDES_LIST_FILE}" + popd } ## This avoid include errors due to -isystem and -I ordering issue -delete_copied_includes() +task_register deduplicate_includes +deduplicate_includes() { - echo "delete_copied_includes() -################################################################################ -################################################################################ -################################################################################ -" - cat "${NATIVE_LIBS_TOOLCHAIN_PATH}/deletefiles" | while read delFile ; do - rm "$delFile" - done + while read delFile ; do + mNewPath="${DUPLICATED_INCLUDES_DIR}/$delFile" + mkdir --verbose --parents "$(dirname "$mNewPath")" + mv --verbose "${PREFIX}/include/$delFile" "$mNewPath" + done < "${DUPLICATED_INCLUDES_LIST_FILE}" } -## More information available at https://gitlab.com/relan/provisioners/merge_requests/1 and http://stackoverflow.com/a/34032216 +task_register reduplicate_includes +reduplicate_includes() +{ + pushd "${DUPLICATED_INCLUDES_DIR}" + find . -not -type d | while read delFile ; do + mv --verbose "${delFile}" "${PREFIX}/include/$delFile" + done + popd +} + +# $1 optional prefix prepended only if return value is not empty +# $2 optional suffix appended only if return value is not empty +task_register get_qt_arch +get_qt_arch() +{ + local QT_VERSION_COMP="$(echo $QT_VERSION | awk -F. '{print $1*1000000+$2*1000+$3}')" + local QT_ARCH="" + + # Qt >= 5.15.0 ships all Android architectures toghether + [ "$QT_VERSION_COMP" -lt "5015000" ] && + { + case "${ANDROID_NDK_ARCH}" in + "arm") + QT_ARCH="armv7" + ;; + "arm64") + QT_ARCH="arm64_v8a" + ;; + "x86") + QT_ARCH="x86" + ;; + esac + + echo "$1$QT_ARCH$2" + } +} + +task_register get_qt_dir +get_qt_dir() +{ + echo "${QT_INSTALL_PATH}/${QT_VERSION}/android$(get_qt_arch _)/" +} + +## More information available at https://wiki.qt.io/Online_Installer_4.x +task_register install_qt_android install_qt_android() { - echo "install_qt_android() -################################################################################ -################################################################################ -################################################################################ -" + [ "$QT_INSTALLER_JWT_TOKEN" == "" ] && + { + echo "To run Qt installer QT_INSTALLER_JWT_TOKEN environement variable \ +need to be set to a valid JWT token see https://wiki.qt.io/Online_Installer_4.x" + return -1 + } - QT_VERSION_CODE=$(echo $QT_VERSION | tr -d .) - QT_INSTALL_PATH=${NATIVE_LIBS_TOOLCHAIN_PATH}/Qt - QT_INSTALLER="qt-unified-linux-x64-3.0.2-online.run" - - verified_download $QT_INSTALLER $QT_ANDROID_INSTALLER_SHA256 \ - http://master.qt.io/archive/online_installers/3.0/${QT_INSTALLER} + QT_VERSION_CODE="$(echo $QT_VERSION | tr -d .)" + QT_INSTALLER="qt-unified-linux-x86_64-${QT_INSTALLER_VERSION}-online.run" + tMajDotMinVer="$(echo $QT_INSTALLER_VERSION | awk -F. '{print $1"."$2}')" + verified_download $QT_INSTALLER $QT_INSTALLER_SHA256 \ + "https://master.qt.io/archive/online_installers/${tMajDotMinVer}/${QT_INSTALLER}" chmod a+x ${QT_INSTALLER} - - QT_INSTALLER_SCRIPT="qt_installer_script.js" - cat << EOF > "${QT_INSTALLER_SCRIPT}" -function Controller() { - installer.autoRejectMessageBoxes(); - installer.installationFinished.connect(function() { - gui.clickButton(buttons.NextButton); - }); - - var welcomePage = gui.pageWidgetByObjectName("WelcomePage"); - welcomePage.completeChanged.connect(function() { - if (gui.currentPageWidget().objectName == welcomePage.objectName) - gui.clickButton(buttons.NextButton); - }); -} - -Controller.prototype.WelcomePageCallback = function() { - gui.clickButton(buttons.NextButton); -} - -Controller.prototype.CredentialsPageCallback = function() { - gui.clickButton(buttons.NextButton); -} - -Controller.prototype.IntroductionPageCallback = function() { - gui.clickButton(buttons.NextButton); -} - -Controller.prototype.TargetDirectoryPageCallback = function() { - gui.currentPageWidget().TargetDirectoryLineEdit.setText("$QT_INSTALL_PATH"); - gui.clickButton(buttons.NextButton); -} - -Controller.prototype.ComponentSelectionPageCallback = function() { - var widget = gui.currentPageWidget(); - - // You can get these component names by running the installer with the - // --verbose flag. It will then print out a resource tree. - - widget.deselectComponent("qt.tools.qtcreator"); - widget.deselectComponent("qt.tools.doc"); - widget.deselectComponent("qt.tools.examples"); - - widget.selectComponent("qt.$QT_VERSION_CODE.android_armv7"); - - gui.clickButton(buttons.NextButton); -} - -Controller.prototype.LicenseAgreementPageCallback = function() { - gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true); - gui.clickButton(buttons.NextButton); -} - -Controller.prototype.StartMenuDirectoryPageCallback = function() { - gui.clickButton(buttons.NextButton); -} - -Controller.prototype.ReadyForInstallationPageCallback = function() { - gui.clickButton(buttons.NextButton); -} - -Controller.prototype.FinishedPageCallback = function() { - var checkBoxForm = gui.currentPageWidget().LaunchQtCreatorCheckBoxForm; - if (checkBoxForm && checkBoxForm.launchQtCreatorCheckBox) - checkBoxForm.launchQtCreatorCheckBox.checked = false; - gui.clickButton(buttons.FinishButton); -} -EOF - -QT_QPA_PLATFORM=minimal ./${QT_INSTALLER} --script ${QT_INSTALLER_SCRIPT} + QT_QPA_PLATFORM=minimal ./${QT_INSTALLER} \ + install qt.qt5.${QT_VERSION_CODE}.android$(get_qt_arch _) \ + --accept-licenses --accept-obligations --confirm-command \ + --default-answer --no-default-installations \ + --root "${QT_INSTALL_PATH}" } ## More information available at retroshare://file?name=Android%20Native%20Development%20Kit%20Cookbook.pdf&size=29214468&hash=0123361c1b14366ce36118e82b90faf7c7b1b136 +task_register build_bzlib build_bzlib() { - echo "build_bzlib() -################################################################################ -################################################################################ -################################################################################ -" - B_dir="bzip2-${BZIP2_SOURCE_VERSION}" rm -rf $B_dir @@ -279,14 +463,9 @@ build_bzlib() } ## More information available at http://doc.qt.io/qt-5/opensslsupport.html +task_register build_openssl build_openssl() { - echo "build_openssl() -################################################################################ -################################################################################ -################################################################################ -" - B_dir="openssl-${OPENSSL_SOURCE_VERSION}" rm -rf $B_dir @@ -308,6 +487,10 @@ build_openssl() --openssldir="${SYSROOT}/etc/ssl" # sed -i 's/LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \\/LIBNAME=$$i \\/g' Makefile # sed -i '/LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \\/d' Makefile + + # Avoid documentation build which is unneded and time consuming + echo "exit 0; " > util/process_docs.pl + make -j${HOST_NUM_CPU} make install rm -f ${PREFIX}/lib/libssl.so* @@ -315,14 +498,9 @@ build_openssl() cd .. } +task_register build_sqlite build_sqlite() { - echo "build_sqlite() -################################################################################ -################################################################################ -################################################################################ -" - B_dir="sqlite-autoconf-${SQLITE_SOURCE_VERSION}" rm -rf $B_dir @@ -335,18 +513,13 @@ build_sqlite() make -j${HOST_NUM_CPU} make install rm -f ${PREFIX}/lib/libsqlite3.so* -# ${CC} -shared -o libsqlite3.so -fPIC sqlite3.o -ldl -# cp libsqlite3.so "${SYSROOT}/usr/lib" cd .. } +task_register build_sqlcipher build_sqlcipher() { - echo "build_sqlcipher() -################################################################################ -################################################################################ -################################################################################ -" + task_run build_sqlite B_dir="sqlcipher-${SQLCIPHER_SOURCE_VERSION}" rm -rf $B_dir @@ -358,14 +531,14 @@ build_sqlcipher() tar -xf $T_file cd $B_dir - case "${ANDROID_NDK_ARCH}" in - "arm64") - # SQLCipher config.sub is outdated and doesn't recognize newer architectures - rm config.sub - autoreconf --verbose --install --force - automake --add-missing --copy --force-missing - ;; - esac +# case "${ANDROID_NDK_ARCH}" in +# "arm64") +# # SQLCipher config.sub is outdated and doesn't recognize newer architectures +# rm config.sub +# autoreconf --verbose --install --force +# automake --add-missing --copy --force-missing +# ;; +# esac ./configure --with-pic --build=$(sh ./config.guess) \ --host=${cArch}-linux \ --prefix="${PREFIX}" --with-sysroot="${SYSROOT}" \ @@ -377,14 +550,9 @@ build_sqlcipher() cd .. } +task_register build_libupnp build_libupnp() { - echo "build_libupnp() -################################################################################ -################################################################################ -################################################################################ -" - B_dir="pupnp-release-${LIBUPNP_SOURCE_VERSION}" B_ext=".tar.gz" B_file="${B_dir}${B_ext}" @@ -408,14 +576,9 @@ build_libupnp() cd .. } +task_register build_rapidjson build_rapidjson() { - echo "build_rapidjson() -################################################################################ -################################################################################ -################################################################################ -" - B_dir="rapidjson-${RAPIDJSON_SOURCE_VERSION}" D_file="${B_dir}.tar.gz" verified_download $D_file $RAPIDJSON_SOURCE_SHA256 \ @@ -424,42 +587,25 @@ build_rapidjson() cp -r "${B_dir}/include/rapidjson/" "${PREFIX}/include/rapidjson" } +task_register build_restbed build_restbed() { - echo "build_restbed() -################################################################################ -################################################################################ -################################################################################ -" + S_dir="restbed" + B_dir="${S_dir}-build" + git_source_get "$S_dir" "$RESTBED_SOURCE_REPO" "${RESTBED_SOURCE_VERSION}" \ + "dependency/asio" "dependency/catch" - [ -d restbed ] || git clone --depth=2000 https://github.com/Corvusoft/restbed.git - cd restbed -# git fetch --tags -# git checkout tags/${RESTBED_SOURCE_VERSION} - git checkout ${RESTBED_SOURCE_VERSION} - git submodule update --init dependency/asio - git submodule update --init dependency/catch - git submodule update --init dependency/kashmir - cd .. - - rm -rf restbed-build; mkdir restbed-build ; cd restbed-build - cmake \ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON BUILD_TESTS=OFF \ - -DBUILD_SSL=OFF -DCMAKE_INSTALL_PREFIX="${PREFIX}" -B. -H../restbed + rm -rf "$B_dir"; mkdir "$B_dir" + pushd "$B_dir" + andro_cmake -DBUILD_TESTS=OFF -DBUILD_SSL=OFF -B. -H../${S_dir} make -j${HOST_NUM_CPU} make install - cp "${PREFIX}/library/librestbed.a" "${PREFIX}/lib/" - cd .. + popd } +task_register build_udp-discovery-cpp build_udp-discovery-cpp() { - echo "build_udp-discovery-cpp() -################################################################################ -################################################################################ -################################################################################ -" - S_dir="udp-discovery-cpp" [ -d $S_dir ] || git clone $UDP_DISCOVERY_CPP_SOURCE $S_dir cd $S_dir @@ -468,23 +614,16 @@ build_udp-discovery-cpp() B_dir="udp-discovery-cpp-build" rm -rf ${B_dir}; mkdir ${B_dir}; cd ${B_dir} - cmake \ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - -DCMAKE_INSTALL_PREFIX="${PREFIX}" -B. -H../udp-discovery-cpp + andro_cmake -B. -H../$S_dir make -j${HOST_NUM_CPU} cp libudp-discovery.a "${PREFIX}/lib/" cp ../$S_dir/*.hpp "${PREFIX}/include/" cd .. } +task_register build_xapian build_xapian() { - echo "build_xapian() -################################################################################ -################################################################################ -################################################################################ -" - B_dir="xapian-core-${XAPIAN_SOURCE_VERSION}" D_file="$B_dir.tar.xz" verified_download $D_file $XAPIAN_SOURCE_SHA256 \ @@ -503,15 +642,12 @@ build_xapian() --prefix="${PREFIX}" --with-sysroot="${SYSROOT}" make -j${HOST_NUM_CPU} make install + cd .. } +task_register build_miniupnpc build_miniupnpc() { - echo "build_miniupnpc() -################################################################################ -################################################################################ -################################################################################ -" S_dir="miniupnpc-${MINIUPNPC_SOURCE_VERSION}" B_dir="miniupnpc-${MINIUPNPC_SOURCE_VERSION}-build" D_file="$S_dir.tar.gz" @@ -521,29 +657,228 @@ build_miniupnpc() tar -xf $D_file mkdir $B_dir cd $B_dir - cmake \ + andro_cmake \ -DUPNPC_BUILD_STATIC=TRUE \ -DUPNPC_BUILD_SHARED=FALSE \ -DUPNPC_BUILD_TESTS=FALSE \ -DUPNPC_BUILD_SAMPLE=FALSE \ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - -DCMAKE_INSTALL_PREFIX="${PREFIX}" -B. -S../$S_dir + -B. -S../$S_dir make -j${HOST_NUM_CPU} make install + cd .. } -build_toolchain -[ "${INSTALL_QT_ANDROID}X" != "trueX" ] || install_qt_android -build_bzlib -build_openssl -build_sqlite -build_sqlcipher -build_libupnp -build_rapidjson -build_restbed -build_udp-discovery-cpp -build_xapian -build_miniupnpc -delete_copied_includes +task_register build_zlib +build_zlib() +{ + S_dir="zlib-${ZLIB_SOURCE_VERSION}" + B_dir="zlib-${ZLIB_SOURCE_VERSION}-build" + D_file="$S_dir.tar.xz" + verified_download $D_file $ZLIB_SOURCE_SHA256 \ + http://www.zlib.net/${D_file} + rm -rf $S_dir $B_dir + tar -xf $D_file + mkdir $B_dir + cd $B_dir + andro_cmake -B. -S../$S_dir + make -j${HOST_NUM_CPU} + make install + rm -f ${PREFIX}/lib/libz.so* + cd .. +} -echo NATIVE_LIBS_TOOLCHAIN_PATH=${NATIVE_LIBS_TOOLCHAIN_PATH} +task_register build_libpng +build_libpng() +{ + task_run build_zlib + + S_dir="libpng-${LIBPNG_SOURCE_VERSION}" + B_dir="libpng-${LIBPNG_SOURCE_VERSION}-build" + D_file="$S_dir.tar.xz" + verified_download $D_file $LIBPNG_SOURCE_SHA256 \ + https://download.sourceforge.net/libpng/${D_file} + rm -rf $S_dir $B_dir + tar -xf $D_file + + # libm is part of bionic An android + sed -i -e 's/find_library(M_LIBRARY m)/set(M_LIBRARY "")/' $S_dir/CMakeLists.txt + + # Disable hardware acceleration as they are problematic for Android + # compilation and are not supported by all phones, it is necessary to fiddle + # with CMakeLists.txt as libpng 1.6.37 passing it as cmake options seems not + # working properly + # https://github.com/imagemin/optipng-bin/issues/97 + # https://github.com/opencv/opencv/issues/7600 + echo "add_definitions(-DPNG_ARM_NEON_OPT=0)" >> $S_dir/CMakeLists.txt + + mkdir $B_dir + pushd $B_dir + + HW_OPT="OFF" +# [ "$ANDROID_PLATFORM_VER" -ge "22" ] && HW_OPT="ON" + + andro_cmake \ + -DPNG_SHARED=OFF \ + -DPNG_STATIC=ON \ + -DPNG_TESTS=OFF \ + -DPNG_HARDWARE_OPTIMIZATIONS=$HW_OPT \ + -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ + -B. -S../$S_dir + make -j${HOST_NUM_CPU} + make install + popd +} + +task_register build_libjpeg +build_libjpeg() +{ + S_dir="jpeg-${LIBJPEG_SOURCE_VERSION}" + D_file="jpegsrc.v${LIBJPEG_SOURCE_VERSION}.tar.gz" + verified_download $D_file $LIBJPEG_SOURCE_SHA256 \ + https://www.ijg.org/files/$D_file + rm -rf $S_dir + tar -xf $D_file + cd $S_dir + ./configure --with-pic --prefix="${PREFIX}" --host=${cArch}-linux + make -j${HOST_NUM_CPU} + make install + rm -f ${PREFIX}/lib/libjpeg.so* + cd .. +} + +task_register build_tiff +build_tiff() +{ + S_dir="tiff-${TIFF_SOURCE_VERSION}" + B_dir="${S_dir}-build" + D_file="tiff-${TIFF_SOURCE_VERSION}.tar.gz" + + verified_download $D_file $TIFF_SOURCE_SHA256 \ + https://download.osgeo.org/libtiff/${D_file} + + rm -rf $S_dir $B_dir + tar -xf $D_file + mkdir $B_dir + + # Disable tools building, not needed for retroshare, and depending on some + # OpenGL headers not available on Android + echo "" > $S_dir/tools/CMakeLists.txt + + # Disable tests building, not needed for retroshare, and causing linker + # errors + echo "" > $S_dir/test/CMakeLists.txt + + # Disable extra tools building, not needed for retroshare, and causing + # linker errors + echo "" > $S_dir/contrib/CMakeLists.txt + + # Disable more unneded stuff + echo "" > $S_dir/build/CMakeLists.txt + echo "" > $S_dir/html/CMakeLists.txt + echo "" > $S_dir/man/CMakeLists.txt + echo "" > $S_dir/port/CMakeLists.txt + + # Change to static library build + sed -i 's\add_library(tiff\add_library(tiff STATIC\' \ + $S_dir/libtiff/CMakeLists.txt + + cd $B_dir + #TODO: build dependecies to support more formats + andro_cmake \ + -Dlibdeflate=OFF -Djbig=OFF -Dlzma=OFF -Dzstd=OFF -Dwebp=OFF \ + -Djpeg12=OFF \ + -Dcxx=OFF \ + -B. -S../$S_dir + make -j${HOST_NUM_CPU} + make install + cd .. +} + +task_register build_cimg +build_cimg() +{ + task_run build_libpng + task_run build_libjpeg + task_run build_tiff + + S_dir="CImg-${CIMG_SOURCE_VERSION}" + D_file="CImg_${CIMG_SOURCE_VERSION}.zip" + + verified_download $D_file $CIMG_SOURCE_SHA256 \ + https://cimg.eu/files/${D_file} + + unzip -o $D_file + + cp --archive --verbose "$S_dir/CImg.h" "$PREFIX/include/" +} + +task_register build_phash +build_phash() +{ + task_run build_cimg + + S_dir="pHash" + B_dir="${S_dir}-build" + + git_source_get "$S_dir" "$PHASH_SOURCE_REPO" "${PHASH_SOURCE_VERSION}" + + rm -rf $B_dir; mkdir $B_dir ; pushd $B_dir + andro_cmake -DPHASH_DYNAMIC=OFF -DPHASH_STATIC=ON -B. -H../pHash + make -j${HOST_NUM_CPU} + make install + popd +} + +task_register build_mvptree +build_mvptree() +{ + S_dir="mvptree" + B_dir="${S_dir}-build" + + git_source_get "$S_dir" "$MVPTREE_SOURCE_REPO" "${MVPTREE_SOURCE_VERSION}" + rm -rf $B_dir; mkdir $B_dir ; pushd $B_dir + andro_cmake -B. -H../${S_dir} + make -j${HOST_NUM_CPU} + make install + popd +} + +task_register get_native_libs_toolchain_path +get_native_libs_toolchain_path() +{ + echo ${NATIVE_LIBS_TOOLCHAIN_PATH} +} + +task_register build_default_toolchain +build_default_toolchain() +{ + task_run bootstrap_toolchain || return $? + task_run build_bzlib || return $? + task_run build_openssl || return $? + task_run build_sqlcipher || return $? + task_run build_rapidjson || return $? + task_run build_restbed || return $? + task_run build_udp-discovery-cpp || return $? + task_run build_xapian || return $? + task_run build_miniupnpc || return $? + task_run build_phash || return $? + task_run deduplicate_includes || return $? + task_run get_native_libs_toolchain_path || return $? +} + +if [ "$1" == "" ]; then + rm -rf "$REPORT_DIR" + mkdir -p "$REPORT_DIR" + cat "$0" > "$REPORT_DIR/build_script" + env > "$REPORT_DIR/build_env" + build_default_toolchain +else + # do not delete report directory in this case so we can reuse material + # produced by previous run, like deduplicated includes + mkdir -p "$REPORT_DIR" + while [ "$1" != "" ] ; do + task_zap $1 + task_run $1 || exit $? + shift + done +fi diff --git a/build_scripts/GitlabCI/Android.Dockerfile b/build_scripts/GitlabCI/Android.Dockerfile new file mode 100644 index 000000000..a0844972d --- /dev/null +++ b/build_scripts/GitlabCI/Android.Dockerfile @@ -0,0 +1,46 @@ +ARG ANDROID_NDK_ARCH=arm +FROM registry.gitlab.com/retroshare/retroshare:android_${ANDROID_NDK_ARCH}_base + +RUN apt-get update -y && apt-get upgrade -y + +ARG REPO_URL=https://gitlab.com/RetroShare/RetroShare.git +ARG REPO_BRANCH=master + +WORKDIR /RetroShare +RUN git remote add testing $REPO_URL && \ + git fetch --tags testing $REPO_BRANCH && \ + git reset --hard testing/$REPO_BRANCH && \ + git --no-pager log --max-count 1 + +RUN rm -rf /jsonapi-generator-build ; mkdir /jsonapi-generator-build +WORKDIR /jsonapi-generator-build/ +RUN qmake ../RetroShare/jsonapi-generator/src/ \ + CONFIG+=no_retroshare_plugins \ + CONFIG+=no_retroshare_service CONFIG+=no_retroshare_gui \ + CONFIG+=rs_jsonapi CONFIG+=no_rs_sam3_libsam3 && \ + make -j$(nproc) + +RUN rm -rf /retroshare-service-android-build ; mkdir /retroshare-service-android-build +WORKDIR /retroshare-service-android-build + +# ARG declared before FROM get wiped after it, so we need declaring it again +ARG ANDROID_NDK_ARCH=arm +ARG RS_SERVICE_QMAKE_EXTRA_OPTS +RUN $($PREPARE_TOOLCHAIN get_qt_dir | head -n 1)/bin/qmake ../RetroShare \ + -spec android-clang \ + CONFIG+=retroshare_service CONFIG+=rs_jsonapi \ + RS_UPNP_LIB=miniupnpc \ + JSONAPI_GENERATOR_EXE=/jsonapi-generator-build/jsonapi-generator \ + NATIVE_LIBS_TOOLCHAIN_PATH=$NATIVE_LIBS_TOOLCHAIN_PATH \ + CONFIG+=no_retroshare_gui CONFIG+=no_rs_service_webui_terminal_password \ + CONFIG+=no_rs_service_terminal_login \ + CONFIG+=no_rs_sam3 CONFIG+=no_rs_sam3_libsam3 \ + $RS_SERVICE_QMAKE_EXTRA_OPTS +RUN make -j$(nproc) +RUN make install INSTALL_ROOT=/retroshare-service-android-build/android-build/ + +ARG ANDROID_PLATFORM_VER=16 +RUN $($PREPARE_TOOLCHAIN get_qt_dir | head -n 1)/bin/androiddeployqt \ + --input retroshare-service/src/android-libretroshare-service.so-deployment-settings.json \ + --output android-build --android-platform android-$ANDROID_PLATFORM_VER \ + --jdk $JAVA_HOME --gradle diff --git a/build_scripts/GitlabCI/base.Dockerfile b/build_scripts/GitlabCI/base.Dockerfile index f4cf610db..b65ed1776 100644 --- a/build_scripts/GitlabCI/base.Dockerfile +++ b/build_scripts/GitlabCI/base.Dockerfile @@ -2,42 +2,43 @@ ## force cloning a new ## To prepare an image suitable as base for Gitlab CI use -# docker build -t "${CI_REGISTRY_IMAGE}:base" --build-arg KEEP_SOURCE=true --build-arg REPO_DEPTH="" -f base.Dockerfile . - -## Now you need to tag it so you can later push it -# docker tag ${ID_OF_THE_CREATED_IMAGE} registry.gitlab.com/retroshare/${CI_REGISTRY_IMAGE}:base +# export CI_REGISTRY_IMAGE="registry.gitlab.com/retroshare/retroshare:base" +# docker build -t "${CI_REGISTRY_IMAGE}" -f base.Dockerfile . ## To push it to gitlab CI registry you need first to login and the to push # docker login registry.gitlab.com -# docker push registry.gitlab.com/retroshare/${CI_REGISTRY_IMAGE}:base - +# docker push "${CI_REGISTRY_IMAGE}" ## To run the container -# docker run -it -p 127.0.0.1:9092:9092 "${CI_REGISTRY_IMAGE}:base" retroshare-service --jsonApiPort 9092 --jsonApiBindAddress 0.0.0.0 +# docker run -it -p 127.0.0.1:9092:9092 "${CI_REGISTRY_IMAGE}" retroshare-service --jsonApiPort 9092 --jsonApiBindAddress 0.0.0.0 FROM ubuntu -ARG CACHEBUST=0 -RUN \ - apt-get update -y && apt-get upgrade -y && \ - apt-get install -y build-essential libssl-dev libbz2-dev libsqlite3-dev \ +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update -y && apt-get upgrade -y -qq && \ + apt-get install -y -qq build-essential cimg-dev libssl-dev libbz2-dev \ + libsqlite3-dev \ libsqlcipher-dev libupnp-dev pkg-config libz-dev \ qt5-default libxapian-dev qttools5-dev doxygen rapidjson-dev \ git cmake curl +RUN git clone --depth 1 https://github.com/aetilius/pHash.git && \ + rm -rf pHash-build && mkdir pHash-build && cd pHash-build && \ + cmake -B. -H../pHash -DCMAKE_INSTALL_PREFIX=/usr && \ + make -j$(nproc) && make install && cd .. && \ + rm -rf pHash-build pHash + ARG FRESHCLONE=0 ARG REPO_URL=https://gitlab.com/RetroShare/RetroShare.git ARG REPO_BRANCH=master ARG REPO_DEPTH="--depth 2000" -ARG KEEP_SOURCE=false -RUN apt-get update -y && apt-get upgrade -y RUN git clone $REPO_DEPTH $REPO_URL -b $REPO_BRANCH && cd RetroShare && \ git fetch --tags && cd .. -RUN \ - mkdir RetroShare-build && cd RetroShare-build && \ +RUN mkdir RetroShare-build && cd RetroShare-build && \ qmake ../RetroShare \ - CONFIG+=no_retroshare_plugins CONFIG+=ipv6 \ + CONFIG+=no_retroshare_plugins \ CONFIG+=retroshare_service CONFIG+=no_retroshare_gui \ CONFIG+=rs_jsonapi CONFIG+=rs_deep_search && \ (make -j$(nproc) || make -j$(nproc) || make) && make install && \ - cd .. && rm -rf RetroShare-build && ($KEEP_SOURCE || rm -rf RetroShare) + cd .. && rm -rf RetroShare-build diff --git a/build_scripts/GitlabCI/getRepoArgs.sh b/build_scripts/GitlabCI/getRepoArgs.sh new file mode 100755 index 000000000..8794524e1 --- /dev/null +++ b/build_scripts/GitlabCI/getRepoArgs.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +[ -n "$CI_MERGE_REQUEST_ID" ] && + echo \ + --build-arg REPO_URL="$CI_MERGE_REQUEST_SOURCE_PROJECT_URL" \ + --build-arg REPO_BRANCH="$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" || + echo \ + --build-arg REPO_URL="$CI_REPOSITORY_URL" \ + --build-arg REPO_BRANCH="$CI_COMMIT_BRANCH" diff --git a/build_scripts/OBS b/build_scripts/OBS index 6d6ee4aab..b260e5834 160000 --- a/build_scripts/OBS +++ b/build_scripts/OBS @@ -1 +1 @@ -Subproject commit 6d6ee4aab171c23c603f7e813ba66d22192393ad +Subproject commit b260e58346b1eec782bdf88a7e8f3c9d36fd3ecb diff --git a/build_scripts/Windows-msys2/build/pack.bat b/build_scripts/Windows-msys2/build/pack.bat index 3bf53ea75..4948c1541 100644 --- a/build_scripts/Windows-msys2/build/pack.bat +++ b/build_scripts/Windows-msys2/build/pack.bat @@ -147,8 +147,10 @@ for /R "%RsDeployPath%" %%D in (*.dll, *.exe) do ( call :copy_dependencies "%%D" "%RsDeployPath%" ) -echo copy qss -xcopy /S "%SourcePath%\retroshare-gui\src\qss" "%RsDeployPath%\qss" %Quite% +if exist "%SourcePath%\retroshare-gui\src\qss" ( + echo copy qss + xcopy /S "%SourcePath%\retroshare-gui\src\qss" "%RsDeployPath%\qss" %Quite% +) echo copy stylesheets xcopy /S "%SourcePath%\retroshare-gui\src\gui\qss\chat" "%RsDeployPath%\stylesheets" %Quite% diff --git a/build_scripts/Windows-msys2/env/tools/prepare-msys2.bat b/build_scripts/Windows-msys2/env/tools/prepare-msys2.bat index 2f85c42be..b1e0c4187 100644 --- a/build_scripts/Windows-msys2/env/tools/prepare-msys2.bat +++ b/build_scripts/Windows-msys2/env/tools/prepare-msys2.bat @@ -25,8 +25,11 @@ if exist "%EnvMSYS2Path%\msys%MSYS2Base%\usr\bin\pacman.exe" ( ) ) -set MSYS2Install=msys2-base-%MSYS2Architecture%-20200720.tar.xz -set MSYS2Url=http://sourceforge.net/projects/msys2/files/Base/%MSYS2Architecture%/%MSYS2Install%/download +if "%MSYS2Architecture%"=="i686" set MSYS2Version=20210705 +if "%MSYS2Architecture%"=="x86_64" set MSYS2Version=20210725 + +set MSYS2Install=msys2-base-%MSYS2Architecture%-%MSYS2Version%.tar.xz +set MSYS2Url=https://repo.msys2.org/distrib/%MSYS2Architecture%/%MSYS2Install% %cecho% info "Remove previous MSYS2 version" call "%ToolsPath%\remove-dir.bat" "%EnvMSYS2Path%" @@ -41,12 +44,10 @@ if not exist "%EnvDownloadPath%\%MSYS2Install%" %cecho% error "Cannot download M set MSYS2SH=%EnvMSYS2Path%\msys%MSYS2Base%\usr\bin\sh %cecho% info "Initialize MSYS2" -"%MSYS2SH%" -lc "pacman -Sy" -"%MSYS2SH%" -lc "pacman --noconfirm --needed -S bash pacman pacman-mirrors msys2-runtime" +"%MSYS2SH%" -lc "yes | pacman --noconfirm -Syuu msys2-keyring" +"%MSYS2SH%" -lc "pacman --noconfirm -Su" call "%EnvMSYS2Path%\msys%MSYS2Base%\autorebase.bat" -call "%EnvRootPath%\update-msys2.bat" -call "%EnvRootPath%\update-msys2.bat" :exit endlocal diff --git a/build_scripts/Windows-msys2/env/tools/root/update-msys2.bat b/build_scripts/Windows-msys2/env/tools/root/update-msys2.bat index 3075e392b..a3d2398cd 100644 --- a/build_scripts/Windows-msys2/env/tools/root/update-msys2.bat +++ b/build_scripts/Windows-msys2/env/tools/root/update-msys2.bat @@ -8,11 +8,11 @@ if exist "%~dp0msys2\msys64" call :update 64 goto :EOF :update -set MSYSSH=%~dp0msys2\msys%~1\usr\bin\sh +set MSYS2SH=%~dp0msys2\msys%~1\usr\bin\sh echo Update MSYS2 %~1 -"%MSYSSH%" -lc "pacman -Sy" -"%MSYSSH%" -lc "pacman --noconfirm -Su" +"%MSYS2SH%" -lc "yes | pacman --noconfirm -Syuu msys2-keyring" +"%MSYS2SH%" -lc "pacman --noconfirm -Su" :exit endlocal diff --git a/build_scripts/Windows-msys2/installer/retroshare-Qt5.nsi b/build_scripts/Windows-msys2/installer/retroshare-Qt5.nsi index b30300634..cd4a7867e 100644 --- a/build_scripts/Windows-msys2/installer/retroshare-Qt5.nsi +++ b/build_scripts/Windows-msys2/installer/retroshare-Qt5.nsi @@ -218,7 +218,7 @@ Section $(Section_Data) Section_Data ; Stylesheets SetOutPath "$INSTDIR\qss" - File /r "${DEPLOYDIR}\qss\*.*" + File /nonfatal /r "${DEPLOYDIR}\qss\*.*" SectionEnd ;Section $(Section_Link) Section_Link diff --git a/build_scripts/Windows/build/pack.bat b/build_scripts/Windows/build/pack.bat index a48c71d58..2a86b9a16 100644 --- a/build_scripts/Windows/build/pack.bat +++ b/build_scripts/Windows/build/pack.bat @@ -132,8 +132,10 @@ if exist "%QtPath%\..\plugins\styles\qwindowsvistastyle.dll" ( copy "%QtPath%\..\plugins\imageformats\*.dll" "%RsDeployPath%\imageformats" %Quite% del /Q "%RsDeployPath%\imageformats\*d?.dll" %Quite% -echo copy qss -xcopy /S "%SourcePath%\retroshare-gui\src\qss" "%RsDeployPath%\qss" %Quite% +if exist "%SourcePath%\retroshare-gui\src\qss" ( + echo copy qss + xcopy /S "%SourcePath%\retroshare-gui\src\qss" "%RsDeployPath%\qss" %Quite% +) echo copy stylesheets xcopy /S "%SourcePath%\retroshare-gui\src\gui\qss\chat" "%RsDeployPath%\stylesheets" %Quite% diff --git a/build_scripts/Windows/env/tools/prepare-msys2.bat b/build_scripts/Windows/env/tools/prepare-msys2.bat index 0a649ae0e..a0483289a 100644 --- a/build_scripts/Windows/env/tools/prepare-msys2.bat +++ b/build_scripts/Windows/env/tools/prepare-msys2.bat @@ -25,8 +25,11 @@ if exist "%EnvMSYS2Path%\msys%MSYS2Base%\usr\bin\pacman.exe" ( ) ) -set MSYS2Install=msys2-base-%MSYS2Architecture%-20190524.tar.xz -set MSYS2Url=http://sourceforge.net/projects/msys2/files/Base/%MSYS2Architecture%/%MSYS2Install%/download +if "%MSYS2Architecture%"=="i686" set MSYS2Version=20210705 +if "%MSYS2Architecture%"=="x86_64" set MSYS2Version=20210725 + +set MSYS2Install=msys2-base-%MSYS2Architecture%-%MSYS2Version%.tar.xz +set MSYS2Url=https://repo.msys2.org/distrib/%MSYS2Architecture%/%MSYS2Install% set CMakeInstall=cmake-3.19.0-win32-x86.zip set CMakeUrl=https://github.com/Kitware/CMake/releases/download/v3.19.0/%CMakeInstall% set CMakeUnpackPath=%EnvMSYS2Path%\msys%MSYS2Base% @@ -64,17 +67,11 @@ if "%FoundProfile%"=="0" ( set MSYS2SH=%EnvMSYS2Path%\msys%MSYS2Base%\usr\bin\sh -%cecho% info "Update keyring" -"%MSYS2SH%" -lc "curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz" -"%MSYS2SH%" -lc "pacman --noconfirm -U msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz" - %cecho% info "Initialize MSYS2" -"%MSYS2SH%" -lc "pacman -Sy" -"%MSYS2SH%" -lc "pacman --noconfirm --needed -S bash pacman pacman-mirrors msys2-runtime" +"%MSYS2SH%" -lc "yes | pacman --noconfirm -Syuu msys2-keyring" +"%MSYS2SH%" -lc "pacman --noconfirm -Su" call "%EnvMSYS2Path%\msys%MSYS2Base%\autorebase.bat" -call "%EnvRootPath%\update-msys2.bat" -call "%EnvRootPath%\update-msys2.bat" :exit endlocal diff --git a/build_scripts/Windows/env/tools/root/update-msys2.bat b/build_scripts/Windows/env/tools/root/update-msys2.bat index 3075e392b..a3d2398cd 100644 --- a/build_scripts/Windows/env/tools/root/update-msys2.bat +++ b/build_scripts/Windows/env/tools/root/update-msys2.bat @@ -8,11 +8,11 @@ if exist "%~dp0msys2\msys64" call :update 64 goto :EOF :update -set MSYSSH=%~dp0msys2\msys%~1\usr\bin\sh +set MSYS2SH=%~dp0msys2\msys%~1\usr\bin\sh echo Update MSYS2 %~1 -"%MSYSSH%" -lc "pacman -Sy" -"%MSYSSH%" -lc "pacman --noconfirm -Su" +"%MSYS2SH%" -lc "yes | pacman --noconfirm -Syuu msys2-keyring" +"%MSYS2SH%" -lc "pacman --noconfirm -Su" :exit endlocal diff --git a/build_scripts/Windows/installer/retroshare-Qt5.nsi b/build_scripts/Windows/installer/retroshare-Qt5.nsi index 4e989b956..9fd364764 100644 --- a/build_scripts/Windows/installer/retroshare-Qt5.nsi +++ b/build_scripts/Windows/installer/retroshare-Qt5.nsi @@ -334,7 +334,7 @@ Section $(Section_Data) Section_Data ; Stylesheets SetOutPath "$INSTDIR\qss" - File /r "${SOURCEDIR}\retroshare-gui\src\qss\*.*" + File /nonfatal /r "${SOURCEDIR}\retroshare-gui\src\qss\*.*" SectionEnd ;Section $(Section_Link) Section_Link diff --git a/libretroshare/src/chat/distributedchat.cc b/libretroshare/src/chat/distributedchat.cc index 4112afd31..cacd68e08 100644 --- a/libretroshare/src/chat/distributedchat.cc +++ b/libretroshare/src/chat/distributedchat.cc @@ -1513,7 +1513,7 @@ ChatLobbyVirtualPeerId DistributedChatService::makeVirtualPeerId(ChatLobbyId lob } -void DistributedChatService::denyLobbyInvite(const ChatLobbyId& lobby_id) +bool DistributedChatService::denyLobbyInvite(const ChatLobbyId& lobby_id) { RsStackMutex stack(mDistributedChatMtx); /********** STACK LOCKED MTX ******/ @@ -1525,10 +1525,12 @@ void DistributedChatService::denyLobbyInvite(const ChatLobbyId& lobby_id) if(it == _lobby_invites_queue.end()) { std::cerr << " (EE) lobby invite not in cache!!" << std::endl; - return ; + return false; } _lobby_invites_queue.erase(it) ; + + return true; } bool DistributedChatService::joinVisibleChatLobby(const ChatLobbyId& lobby_id,const RsGxsId& gxs_id) diff --git a/libretroshare/src/chat/distributedchat.h b/libretroshare/src/chat/distributedchat.h index 96369511d..e7b9ee33a 100644 --- a/libretroshare/src/chat/distributedchat.h +++ b/libretroshare/src/chat/distributedchat.h @@ -61,7 +61,7 @@ class DistributedChatService void getChatLobbyList(std::list& clids) ; bool getChatLobbyInfo(const ChatLobbyId& id,ChatLobbyInfo& clinfo) ; bool acceptLobbyInvite(const ChatLobbyId& id,const RsGxsId& identity) ; - void denyLobbyInvite(const ChatLobbyId& id) ; + bool denyLobbyInvite(const ChatLobbyId& id) ; void getPendingChatLobbyInvites(std::list& invites) ; void invitePeerToLobby(const ChatLobbyId&, const RsPeerId& peer_id,bool connexion_challenge = false) ; void unsubscribeChatLobby(const ChatLobbyId& lobby_id) ; diff --git a/libretroshare/src/deep_search/commonutils.cpp b/libretroshare/src/deep_search/commonutils.cpp index eecbd4ec6..e8e1e4b59 100644 --- a/libretroshare/src/deep_search/commonutils.cpp +++ b/libretroshare/src/deep_search/commonutils.cpp @@ -1,8 +1,8 @@ /******************************************************************************* * RetroShare full text indexing and search implementation based on Xapian * * * - * Copyright (C) 2018-2019 Gioacchino Mazzurco * - * Copyright (C) 2019 Asociación Civil Altermundi * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Affero General Public License version 3 as * @@ -18,54 +18,49 @@ * * *******************************************************************************/ +#include +#include + #include "deep_search/commonutils.hpp" #include "util/stacktrace.h" -#include "util/rsdebug.h" +#include "util/rsthreads.h" +#include "util/rsdebuglevel0.h" + +#ifndef XAPIAN_AT_LEAST +/// Added in Xapian 1.4.2. +#define XAPIAN_AT_LEAST(A,B,C) \ + (XAPIAN_MAJOR_VERSION > (A) || \ + (XAPIAN_MAJOR_VERSION == (A) && \ + (XAPIAN_MINOR_VERSION > (B) || \ + (XAPIAN_MINOR_VERSION == (B) && XAPIAN_REVISION >= (C))))) +#endif namespace DeepSearch { - -std::unique_ptr openWritableDatabase( - const std::string& path, int flags, int blockSize ) -{ - try - { - std::unique_ptr dbPtr( - new Xapian::WritableDatabase(path, flags, blockSize) ); - return dbPtr; - } - catch(Xapian::DatabaseLockError) - { - RsErr() << __PRETTY_FUNCTION__ << " Failed aquiring Xapian DB lock " - << path << std::endl; - print_stacktrace(); - } - catch(...) - { - RsErr() << __PRETTY_FUNCTION__ << " Xapian DB is apparently corrupted " - << "deleting it might help without causing any harm: " - << path << std::endl; - print_stacktrace(); - } - - return nullptr; -} - std::unique_ptr openReadOnlyDatabase( const std::string& path, int flags ) { try { +#if XAPIAN_AT_LEAST(1,3,2) std::unique_ptr dbPtr( new Xapian::Database(path, flags) ); +#else + std::unique_ptr dbPtr(new Xapian::Database(path)); + if(flags) + { + RS_WARN( "Xapian DB flags: ", flags, " ignored due to old Xapian " + "library version: ", XAPIAN_VERSION, " < 1.3.2" ); + } +#endif return dbPtr; } - catch(Xapian::DatabaseOpeningError e) + catch(Xapian::DatabaseOpeningError& e) { RsWarn() << __PRETTY_FUNCTION__ << " " << e.get_msg() << ", probably nothing has been indexed yet." << std::endl; } - catch(Xapian::DatabaseLockError) + catch(Xapian::DatabaseLockError&) { RsErr() << __PRETTY_FUNCTION__ << " Failed aquiring Xapian DB lock " << path << std::endl; @@ -90,4 +85,136 @@ std::string timetToXapianDate(const rstime_t& time) return date; } +StubbornWriteOpQueue::~StubbornWriteOpQueue() +{ + auto fErr = flush(0); + if(fErr) + { + RS_FATAL( "Flush failed on destruction ", mOpStore.size(), + " operations irreparably lost ", fErr ); + print_stacktrace(); + } +} + +void StubbornWriteOpQueue::push(write_op op) +{ + RS_DBG4(""); + + { + std::unique_lock lock(mQueueMutex); + mOpStore.push(op); + } + + flush(); +} + +std::error_condition StubbornWriteOpQueue::flush( + rstime_t acceptDelay, rstime_t callTS ) +{ + RS_DBG4(""); + + { + // Return without attempt to open the database if the queue is empty + std::unique_lock lock(mQueueMutex); + if(mOpStore.empty()) return std::error_condition(); + } + + std::unique_ptr dbPtr; + try + { + dbPtr = std::make_unique( + mDbPath, Xapian::DB_CREATE_OR_OPEN ); + } + catch(Xapian::DatabaseLockError) + { + if(acceptDelay) + { + rstime_t tNow = time(nullptr); + rstime_t maxRemaining = tNow - (callTS + acceptDelay); + if(maxRemaining > 0) + { + std::chrono::milliseconds interval( + std::max(rstime_t(50), maxRemaining*1000/5) ); + RS_DBG3( "Cannot acquire database write lock, retrying in:", + interval.count(), "ms" ); + RsThread::async([this, acceptDelay, callTS, interval]() + { + std::this_thread::sleep_for(interval); + flush(acceptDelay, callTS); + }); + return std::error_condition(); + } + else + { + RS_ERR(std::errc::timed_out, acceptDelay, callTS, tNow); + return std::errc::timed_out; + } + } + else return std::errc::resource_unavailable_try_again; + } + catch(...) + { + RS_ERR("Xapian DB ", mDbPath, " is apparently corrupted"); + print_stacktrace(); + return std::errc::io_error; + } + + std::unique_lock lock(mQueueMutex); + while(!mOpStore.empty()) + { + auto op = mOpStore.front(); mOpStore.pop(); + op(*dbPtr); + } + return std::error_condition(); +} + +std::string simpleTextHtmlExtract(const std::string& rsHtmlDoc) +{ + if(rsHtmlDoc.empty()) return rsHtmlDoc; + + const bool isPlainMsg = + rsHtmlDoc[0] != '<' || rsHtmlDoc[rsHtmlDoc.size() - 1] != '>'; + if(isPlainMsg) return rsHtmlDoc; + + auto oSize = rsHtmlDoc.size(); + auto bodyTagBegin(rsHtmlDoc.find("= oSize) return rsHtmlDoc; + + auto bodyTagEnd(rsHtmlDoc.find(">", bodyTagBegin)); + if(bodyTagEnd >= oSize) return rsHtmlDoc; + + std::string retVal(rsHtmlDoc.substr(bodyTagEnd+1)); + + // strip also CSS inside + oSize = retVal.size(); + auto styleTagBegin(retVal.find("", styleTagBegin)); + if(styleEnd < oSize) + retVal.erase(styleTagBegin, 8+styleEnd-styleTagBegin); + } + + std::string::size_type oPos; + std::string::size_type cPos; + int itCount = 0; + while((oPos = retVal.find("<")) < retVal.size()) + { + if((cPos = retVal.find(">")) <= retVal.size()) + retVal.erase(oPos, 1+cPos-oPos); + else break; + + // Avoid infinite loop with crafty input + if(itCount > 1000) + { + RS_WARN( "Breaking stripping loop due to max allowed iterations ", + "rsHtmlDoc: ", rsHtmlDoc, " retVal: ", retVal ); + break; + } + ++itCount; + } + + return retVal; +} + } diff --git a/libretroshare/src/deep_search/commonutils.hpp b/libretroshare/src/deep_search/commonutils.hpp index 28961bc09..5f47c39bd 100644 --- a/libretroshare/src/deep_search/commonutils.hpp +++ b/libretroshare/src/deep_search/commonutils.hpp @@ -1,8 +1,8 @@ /******************************************************************************* * RetroShare full text indexing and search implementation based on Xapian * * * - * Copyright (C) 2018-2019 Gioacchino Mazzurco * - * Copyright (C) 2019 Asociación Civil Altermundi * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Affero General Public License version 3 as * @@ -21,6 +21,9 @@ #include #include +#include +#include +#include #include "util/rstime.h" @@ -33,13 +36,34 @@ namespace DeepSearch { - -std::unique_ptr openWritableDatabase( - const std::string& path, int flags = 0, int blockSize = 0 ); +typedef std::function write_op; std::unique_ptr openReadOnlyDatabase( const std::string& path, int flags = 0 ); std::string timetToXapianDate(const rstime_t& time); +std::string simpleTextHtmlExtract(const std::string& rsHtmlDoc); + +struct StubbornWriteOpQueue +{ + explicit StubbornWriteOpQueue(const std::string& dbPath): + mDbPath(dbPath) {} + + ~StubbornWriteOpQueue(); + + void push(write_op op); + + std::error_condition flush( + rstime_t acceptDelay = 20, rstime_t callTS = time(nullptr) ); + +private: + std::queue mOpStore; + rstime_t mLastFlush; + + std::mutex mQueueMutex; + + const std::string mDbPath; +}; + } diff --git a/libretroshare/src/deep_search/filesindex.cpp b/libretroshare/src/deep_search/filesindex.cpp index 3edcf9a97..9d5b09a72 100644 --- a/libretroshare/src/deep_search/filesindex.cpp +++ b/libretroshare/src/deep_search/filesindex.cpp @@ -1,8 +1,8 @@ /******************************************************************************* * RetroShare full text indexing and search implementation based on Xapian * * * - * Copyright (C) 2018-2019 Gioacchino Mazzurco * - * Copyright (C) 2019 Asociación Civil Altermundi * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Affero General Public License version 3 as * @@ -18,47 +18,47 @@ * * *******************************************************************************/ -#include "deep_search/filesindex.hpp" -#include "deep_search/commonutils.hpp" -#include "util/rsdebug.h" -#include "retroshare/rsinit.h" -#include "retroshare/rsversion.h" #include +#include "deep_search/filesindex.hpp" +#include "deep_search/commonutils.hpp" +#include "util/rsdebuglevel1.h" +#include "retroshare/rsinit.h" +#include "retroshare/rsversion.h" + /*static*/ std::multimap DeepFilesIndex::indexersRegister = {}; -bool DeepFilesIndex::indexFile( +std::error_condition DeepFilesIndex::indexFile( const std::string& path, const std::string& name, const RsFileHash& hash ) { - auto dbPtr = DeepSearch::openWritableDatabase( - mDbPath, Xapian::DB_CREATE_OR_OPEN ); - if(!dbPtr) return false; - Xapian::WritableDatabase& db(*dbPtr); - const std::string hashString = hash.toStdString(); const std::string idTerm("Q" + hashString); - Xapian::Document oldDoc; - Xapian::PostingIterator pIt = db.postlist_begin(idTerm); - if( pIt != db.postlist_end(idTerm) ) + auto db = DeepSearch::openReadOnlyDatabase(mDbPath); + if(db) { - oldDoc = db.get_document(*pIt); - if( oldDoc.get_value(INDEXER_VERSION_VALUENO) == - RS_HUMAN_READABLE_VERSION && - std::stoull(oldDoc.get_value(INDEXERS_COUNT_VALUENO)) == - indexersRegister.size() ) + Xapian::Document oldDoc; + Xapian::PostingIterator pIt = db->postlist_begin(idTerm); + if( pIt != db->postlist_end(idTerm) ) { - /* Looks like this file has already been indexed by this RetroShare - * exact version, so we can skip it. If the version was different it - * made sense to reindex it as better indexers might be available - * since last time it was indexed */ - Dbg3() << __PRETTY_FUNCTION__ << " skipping laready indexed file: " - << hash << " " << name << std::endl; - return true; + oldDoc = db->get_document(*pIt); + if( oldDoc.get_value(INDEXER_VERSION_VALUENO) == + RS_HUMAN_READABLE_VERSION && + std::stoull(oldDoc.get_value(INDEXERS_COUNT_VALUENO)) == + indexersRegister.size() ) + { + /* Looks like this file has already been indexed by this + * RetroShare exact version, so we can skip it. If the version + * was different it made sense to reindex it as better indexers + * might be available since last time it was indexed */ + RS_DBG3("skipping laready indexed file: ", hash, " ", name); + return std::error_condition(); + } } + db.reset(); // Release DB read lock ASAP } Xapian::Document doc; @@ -80,22 +80,21 @@ bool DeepFilesIndex::indexFile( doc.add_value( INDEXERS_COUNT_VALUENO, std::to_string(indexersRegister.size()) ); - db.replace_document(idTerm, doc); - return true; + mWriteQueue.push([idTerm, doc](Xapian::WritableDatabase& db) + { db.replace_document(idTerm, doc); }); + + return std::error_condition(); } -bool DeepFilesIndex::removeFileFromIndex(const RsFileHash& hash) +std::error_condition DeepFilesIndex::removeFileFromIndex(const RsFileHash& hash) { - Dbg3() << __PRETTY_FUNCTION__ << " removing file from index: " - << hash << std::endl; + RS_DBG3(hash); - std::unique_ptr db = - DeepSearch::openWritableDatabase(mDbPath, Xapian::DB_CREATE_OR_OPEN); - if(!db) return false; + mWriteQueue.push([hash](Xapian::WritableDatabase& db) + { db.delete_document("Q" + hash.toStdString()); }); - db->delete_document("Q" + hash.toStdString()); - return true; + return std::error_condition(); } /*static*/ std::string DeepFilesIndex::dbDefaultPath() @@ -104,20 +103,20 @@ bool DeepFilesIndex::removeFileFromIndex(const RsFileHash& hash) /*static*/ bool DeepFilesIndex::registerIndexer( int order, const DeepFilesIndex::IndexerFunType& indexerFun ) { - Dbg1() << __PRETTY_FUNCTION__ << " " << order << std::endl; + RS_DBG1(order); indexersRegister.insert(std::make_pair(order, indexerFun)); return true; } -uint32_t DeepFilesIndex::search( +std::error_condition DeepFilesIndex::search( const std::string& queryStr, std::vector& results, uint32_t maxResults ) { results.clear(); auto dbPtr = DeepSearch::openReadOnlyDatabase(mDbPath); - if(!dbPtr) return 0; + if(!dbPtr) return std::errc::bad_file_descriptor; Xapian::Database& db(*dbPtr); // Set up a QueryParser with a stemmer and suitable prefixes. @@ -151,7 +150,7 @@ uint32_t DeepFilesIndex::search( results.push_back(s); } - return static_cast(results.size()); + return std::error_condition(); } diff --git a/libretroshare/src/deep_search/filesindex.hpp b/libretroshare/src/deep_search/filesindex.hpp index f811e5e9c..b337bd072 100644 --- a/libretroshare/src/deep_search/filesindex.hpp +++ b/libretroshare/src/deep_search/filesindex.hpp @@ -1,8 +1,8 @@ /******************************************************************************* * RetroShare full text indexing and search implementation based on Xapian * * * - * Copyright (C) 2018-2019 Gioacchino Mazzurco * - * Copyright (C) 2019 Asociación Civil Altermundi * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Affero General Public License version 3 as * @@ -19,9 +19,6 @@ *******************************************************************************/ #pragma once -#include "retroshare/rstypes.h" -#include "util/rsdebug.h" - #include #include #include @@ -29,6 +26,9 @@ #include #include +#include "retroshare/rstypes.h" +#include "deep_search/commonutils.hpp" + struct DeepFilesSearchResult { DeepFilesSearchResult() : mWeight(0) {} @@ -41,7 +41,8 @@ struct DeepFilesSearchResult class DeepFilesIndex { public: - DeepFilesIndex(const std::string& dbPath) : mDbPath(dbPath) {} + explicit DeepFilesIndex(const std::string& dbPath): + mDbPath(dbPath), mWriteQueue(dbPath) {} /** * @brief Search indexed files @@ -49,7 +50,7 @@ public: * no limits * @return search results count */ - uint32_t search( const std::string& queryStr, + std::error_condition search( const std::string& queryStr, std::vector& results, uint32_t maxResults = 100 ); @@ -57,7 +58,7 @@ public: * @return false if file could not be indexed because of error or * unsupported type, true otherwise. */ - bool indexFile( + std::error_condition indexFile( const std::string& path, const std::string& name, const RsFileHash& hash ); @@ -65,7 +66,7 @@ public: * @brief Remove file entry from database * @return false on error, true otherwise. */ - bool removeFileFromIndex(const RsFileHash& hash); + std::error_condition removeFileFromIndex(const RsFileHash& hash); static std::string dbDefaultPath(); @@ -96,8 +97,8 @@ private: const std::string mDbPath; + DeepSearch::StubbornWriteOpQueue mWriteQueue; + /** Storage for indexers function by order */ static std::multimap indexersRegister; - - RS_SET_CONTEXT_DEBUG_LEVEL(1) }; diff --git a/libretroshare/src/deep_search/forumsindex.cpp b/libretroshare/src/deep_search/forumsindex.cpp new file mode 100644 index 000000000..acc7aed9a --- /dev/null +++ b/libretroshare/src/deep_search/forumsindex.cpp @@ -0,0 +1,208 @@ +/******************************************************************************* + * RetroShare full text indexing and search implementation based on Xapian * + * * + * Copyright (C) 2021 Gioacchino Mazzurco * + * Copyright (C) 2021 Asociación Civil Altermundi * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License version 3 as * + * published by the Free Software Foundation. * + * * + * 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 Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with this program. If not, see . * + * * + *******************************************************************************/ + +#include "deep_search/forumsindex.hpp" +#include "deep_search/commonutils.hpp" +#include "retroshare/rsinit.h" +#include "retroshare/rsgxsforums.h" +#include "util/rsdebuglevel4.h" + +std::error_condition DeepForumsIndex::search( + const std::string& queryStr, + std::vector& results, uint32_t maxResults ) +{ + results.clear(); + + std::unique_ptr dbPtr( + DeepSearch::openReadOnlyDatabase(mDbPath) ); + if(!dbPtr) return std::errc::bad_file_descriptor; + + Xapian::Database& db(*dbPtr); + + // Set up a QueryParser with a stemmer and suitable prefixes. + Xapian::QueryParser queryparser; + //queryparser.set_stemmer(Xapian::Stem("en")); + queryparser.set_stemming_strategy(queryparser.STEM_SOME); + // Start of prefix configuration. + //queryparser.add_prefix("title", "S"); + //queryparser.add_prefix("description", "XD"); + // End of prefix configuration. + + // And parse the query. + Xapian::Query query = queryparser.parse_query(queryStr); + + // Use an Enquire object on the database to run the query. + Xapian::Enquire enquire(db); + enquire.set_query(query); + + Xapian::MSet mset = enquire.get_mset( + 0, maxResults ? maxResults : db.get_doccount() ); + + for( Xapian::MSetIterator m = mset.begin(); m != mset.end(); ++m ) + { + const Xapian::Document& doc = m.get_document(); + DeepForumsSearchResult s; + s.mUrl = doc.get_value(URL_VALUENO); +#if XAPIAN_AT_LEAST(1,3,5) + s.mSnippet = mset.snippet(doc.get_data()); +#endif // XAPIAN_AT_LEAST(1,3,5) + results.push_back(s); + } + + return std::error_condition(); +} + +/*static*/ std::string DeepForumsIndex::forumIndexId(const RsGxsGroupId& grpId) +{ + RsUrl forumIndexId(RsGxsForums::DEFAULT_FORUM_BASE_URL); + forumIndexId.setQueryKV( + RsGxsForums::FORUM_URL_ID_FIELD, grpId.toStdString() ); + return forumIndexId.toString(); +} + +/*static*/ std::string DeepForumsIndex::postIndexId( + const RsGxsGroupId& grpId, const RsGxsMessageId& msgId ) +{ + RsUrl postIndexId(RsGxsForums::DEFAULT_FORUM_BASE_URL); + postIndexId.setQueryKV(RsGxsForums::FORUM_URL_ID_FIELD, grpId.toStdString()); + postIndexId.setQueryKV(RsGxsForums::FORUM_URL_MSG_ID_FIELD, msgId.toStdString()); + return postIndexId.toString(); +} + +std::error_condition DeepForumsIndex::indexForumGroup( + const RsGxsForumGroup& forum ) +{ + // Set up a TermGenerator that we'll use in indexing. + Xapian::TermGenerator termgenerator; + //termgenerator.set_stemmer(Xapian::Stem("en")); + + // We make a document and tell the term generator to use this. + Xapian::Document doc; + termgenerator.set_document(doc); + + // Index each field with a suitable prefix. + termgenerator.index_text(forum.mMeta.mGroupName, 1, "G"); + termgenerator.index_text( + DeepSearch::timetToXapianDate(forum.mMeta.mPublishTs), 1, "D" ); + termgenerator.index_text(forum.mDescription, 1, "XD"); + + // Index fields without prefixes for general search. + termgenerator.index_text(forum.mMeta.mGroupName); + termgenerator.increase_termpos(); + termgenerator.index_text(forum.mDescription); + + // store the RS link so we are able to retrive it on matching search + const std::string rsLink(forumIndexId(forum.mMeta.mGroupId)); + doc.add_value(URL_VALUENO, rsLink); + + /* Store some fields for display purposes. Retrieved later to provide the + * matching snippet on search */ + doc.set_data(forum.mMeta.mGroupName + "\n" + forum.mDescription); + + /* We use the identifier to ensure each object ends up in the database only + * once no matter how many times we run the indexer. + * "Q" prefix is a Xapian convention for unique id term. */ + const std::string idTerm("Q" + rsLink); + doc.add_boolean_term(idTerm); + + mWriteQueue.push([idTerm, doc](Xapian::WritableDatabase& db) + { db.replace_document(idTerm, doc); } ); + + return std::error_condition(); +} + +std::error_condition DeepForumsIndex::removeForumFromIndex( + const RsGxsGroupId& grpId ) +{ + mWriteQueue.push([grpId](Xapian::WritableDatabase& db) + { db.delete_document("Q" + forumIndexId(grpId)); }); + + return std::error_condition(); +} + +std::error_condition DeepForumsIndex::indexForumPost(const RsGxsForumMsg& post) +{ + RS_DBG4(post); + + const auto& groupId = post.mMeta.mGroupId; + const auto& msgId = post.mMeta.mMsgId; + + if(groupId.isNull() || msgId.isNull()) + { + RS_ERR("Got post with invalid id ", post); + print_stacktrace(); + return std::errc::invalid_argument; + } + + // Set up a TermGenerator that we'll use in indexing. + Xapian::TermGenerator termgenerator; + //termgenerator.set_stemmer(Xapian::Stem("en")); + + // We make a document and tell the term generator to use this. + Xapian::Document doc; + termgenerator.set_document(doc); + + // Index each field with a suitable prefix. + termgenerator.index_text(post.mMeta.mMsgName, 1, "S"); + termgenerator.index_text( + DeepSearch::timetToXapianDate(post.mMeta.mPublishTs), 1, "D" ); + + // Avoid indexing RetroShare-gui HTML tags + const std::string cleanMsg = DeepSearch::simpleTextHtmlExtract(post.mMsg); + termgenerator.index_text(cleanMsg, 1, "XD" ); + + // Index fields without prefixes for general search. + termgenerator.index_text(post.mMeta.mMsgName); + + termgenerator.increase_termpos(); + termgenerator.index_text(cleanMsg); + // store the RS link so we are able to retrive it on matching search + const std::string rsLink(postIndexId(groupId, msgId)); + doc.add_value(URL_VALUENO, rsLink); + + // Store some fields for display purposes. + doc.set_data(post.mMeta.mMsgName + "\n" + cleanMsg); + + // We use the identifier to ensure each object ends up in the + // database only once no matter how many times we run the + // indexer. + const std::string idTerm("Q" + rsLink); + doc.add_boolean_term(idTerm); + + mWriteQueue.push( [idTerm, doc](Xapian::WritableDatabase& db) + { db.replace_document(idTerm, doc); } ); + + + return std::error_condition(); +} + +std::error_condition DeepForumsIndex::removeForumPostFromIndex( + RsGxsGroupId grpId, RsGxsMessageId msgId ) +{ + // "Q" prefix is a Xapian convention for unique id term. + std::string idTerm("Q" + postIndexId(grpId, msgId)); + mWriteQueue.push( [idTerm](Xapian::WritableDatabase& db) + { db.delete_document(idTerm); } ); + + return std::error_condition(); +} + +/*static*/ std::string DeepForumsIndex::dbDefaultPath() +{ return RsAccounts::AccountDirectory() + "/deep_forum_index_xapian_db"; } diff --git a/libretroshare/src/deep_search/forumsindex.hpp b/libretroshare/src/deep_search/forumsindex.hpp new file mode 100644 index 000000000..2955ce323 --- /dev/null +++ b/libretroshare/src/deep_search/forumsindex.hpp @@ -0,0 +1,81 @@ +/******************************************************************************* + * RetroShare full text indexing and search implementation based on Xapian * + * * + * Copyright (C) 2021 Gioacchino Mazzurco * + * Copyright (C) 2021 Asociación Civil Altermundi * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License version 3 as * + * published by the Free Software Foundation. * + * * + * 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 Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with this program. If not, see . * + * * + *******************************************************************************/ +#pragma once + +#include +#include +#include + +#include "util/rstime.h" +#include "retroshare/rsgxsforums.h" +#include "retroshare/rsevents.h" +#include "deep_search/commonutils.hpp" + +struct DeepForumsSearchResult +{ + std::string mUrl; + double mWeight; + std::string mSnippet; +}; + +struct DeepForumsIndex +{ + explicit DeepForumsIndex(const std::string& dbPath) : + mDbPath(dbPath), mWriteQueue(dbPath) {} + + /** + * @brief Search indexed GXS groups and messages + * @param[in] maxResults maximum number of acceptable search results, 0 for + * no limits + * @return search results count + */ + std::error_condition search( const std::string& queryStr, + std::vector& results, + uint32_t maxResults = 100 ); + + std::error_condition indexForumGroup(const RsGxsForumGroup& chan); + + std::error_condition removeForumFromIndex(const RsGxsGroupId& grpId); + + std::error_condition indexForumPost(const RsGxsForumMsg& post); + + std::error_condition removeForumPostFromIndex( + RsGxsGroupId grpId, RsGxsMessageId msgId ); + + static std::string dbDefaultPath(); + +private: + static std::string forumIndexId(const RsGxsGroupId& grpId); + static std::string postIndexId( + const RsGxsGroupId& grpId, const RsGxsMessageId& msgId ); + + enum : Xapian::valueno + { + /// Used to store retroshare url of indexed documents + URL_VALUENO, + + /// @see Xapian::BAD_VALUENO + BAD_VALUENO = Xapian::BAD_VALUENO + }; + + const std::string mDbPath; + + DeepSearch::StubbornWriteOpQueue mWriteQueue; +}; diff --git a/libretroshare/src/file_sharing/dir_hierarchy.cc b/libretroshare/src/file_sharing/dir_hierarchy.cc index d93df1d1b..6504da96f 100644 --- a/libretroshare/src/file_sharing/dir_hierarchy.cc +++ b/libretroshare/src/file_sharing/dir_hierarchy.cc @@ -3,7 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2016 by Mr.Alice * + * Copyright (C) 2016 Mr.Alice * + * Copyright (C) 2021 Gioacchino Mazzurco * + * Copyright (C) 2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -29,6 +31,7 @@ #include "dir_hierarchy.h" #include "filelist_io.h" #include "file_sharing_defaults.h" +#include "util/cxx17retrocompat.h" #ifdef RS_DEEP_FILES_INDEX # include "deep_search/filesindex.hpp" @@ -70,7 +73,8 @@ InternalFileHierarchyStorage::InternalFileHierarchyStorage() : mRoot(0) mTotalFiles = 0 ; } -bool InternalFileHierarchyStorage::getDirHashFromIndex(const DirectoryStorage::EntryIndex& index,RsFileHash& hash) const +bool InternalFileHierarchyStorage::getDirHashFromIndex( + const DirectoryStorage::EntryIndex& index, RsFileHash& hash ) const { if(!checkIndex(index,FileStorageNode::TYPE_DIR)) return false ; @@ -79,6 +83,7 @@ bool InternalFileHierarchyStorage::getDirHashFromIndex(const DirectoryStorage::E return true; } + bool InternalFileHierarchyStorage::getIndexFromDirHash(const RsFileHash& hash,DirectoryStorage::EntryIndex& index) { std::map::iterator it = mDirHashes.find(hash) ; @@ -88,35 +93,39 @@ bool InternalFileHierarchyStorage::getIndexFromDirHash(const RsFileHash& hash,Di index = it->second; - // make sure the hash actually points to some existing file. If not, remove it. This is a lazy update of dir hashes: when we need them, we check them. - if(!checkIndex(index, FileStorageNode::TYPE_DIR) || static_cast(mNodes[index])->dir_hash != hash) - { - std::cerr << "(II) removing non existing hash from dir hash list: " << hash << std::endl; - - mDirHashes.erase(it) ; - return false ; - } + /* make sure the hash actually points to some existing directory. If not, + * remove it. This is an opportunistic update of dir hashes: when we need + * them, we check them. */ + if( !checkIndex(index, FileStorageNode::TYPE_DIR) || + static_cast(mNodes[index])->dir_hash != hash ) + { + RS_INFO("removing non existing dir hash: ", hash, " from dir hash list"); + mDirHashes.erase(it); + return false; + } return true; } -bool InternalFileHierarchyStorage::getIndexFromFileHash(const RsFileHash& hash,DirectoryStorage::EntryIndex& index) + +bool InternalFileHierarchyStorage::getIndexFromFileHash( + const RsFileHash& hash, DirectoryStorage::EntryIndex& index ) { - std::map::iterator it = mFileHashes.find(hash) ; + auto it = std::as_const(mFileHashes).find(hash); + if(it == mFileHashes.end()) return false; - if(it == mFileHashes.end()) - return false; + index = it->second; - index = it->second; + /* make sure the hash actually points to some existing file. If not, remove + * it. This is an opportunistic update of file hashes: when we need them, + * we check them. */ + if( !checkIndex(it->second, FileStorageNode::TYPE_FILE) || + static_cast(mNodes[index])->file_hash != hash ) + { + RS_INFO("removing non existing file hash: ", hash, " from file hash list"); + mFileHashes.erase(it); + return false; + } - // make sure the hash actually points to some existing file. If not, remove it. This is a lazy update of file hashes: when we need them, we check them. - if(!checkIndex(it->second, FileStorageNode::TYPE_FILE) || static_cast(mNodes[index])->file_hash != hash) - { - std::cerr << "(II) removing non existing hash from file hash list: " << hash << std::endl; - - mFileHashes.erase(it) ; - return false ; - } - - return true; + return true; } bool InternalFileHierarchyStorage::getChildIndex(DirectoryStorage::EntryIndex e,int row,DirectoryStorage::EntryIndex& c) const @@ -155,10 +164,13 @@ bool InternalFileHierarchyStorage::isIndexValid(DirectoryStorage::EntryIndex e) return e < mNodes.size() && mNodes[e] != NULL ; } -bool InternalFileHierarchyStorage::updateSubDirectoryList(const DirectoryStorage::EntryIndex& indx, const std::set& subdirs, const RsFileHash& random_hash_seed) +bool InternalFileHierarchyStorage::updateSubDirectoryList( + const DirectoryStorage::EntryIndex& indx, + const std::set& subdirs, + const RsFileHash& random_hash_seed ) { - if(!checkIndex(indx,FileStorageNode::TYPE_DIR)) - return false; + if(!checkIndex(indx,FileStorageNode::TYPE_DIR)) + return false; DirEntry& d(*static_cast(mNodes[indx])) ; @@ -284,10 +296,17 @@ bool InternalFileHierarchyStorage::checkIndex(DirectoryStorage::EntryIndex indx, return true; } -bool InternalFileHierarchyStorage::updateSubFilesList(const DirectoryStorage::EntryIndex& indx,const std::map& subfiles,std::map& new_files) +bool InternalFileHierarchyStorage::updateSubFilesList( + const DirectoryStorage::EntryIndex& indx, + const std::map& subfiles, + std::map& new_files ) { - if(!checkIndex(indx,FileStorageNode::TYPE_DIR)) - return false; + if(!checkIndex(indx, FileStorageNode::TYPE_DIR)) + { + RS_ERR("indx: ", indx, std::errc::not_a_directory); + print_stacktrace(); + return false; + } DirEntry& d(*static_cast(mNodes[indx])) ; new_files = subfiles ; @@ -312,9 +331,11 @@ bool InternalFileHierarchyStorage::updateSubFilesList(const DirectoryStorage::En continue; } - if(it->second.modtime != f.file_modtime || it->second.size != f.file_size) // file is newer and/or has different size + // file is newer and/or has different size + if(it->second.modtime != f.file_modtime || it->second.size != f.file_size) { - f.file_hash.clear(); // hash needs recomputing + // hash needs recomputing + f.file_hash.clear(); f.file_modtime = it->second.modtime; f.file_size = it->second.size; @@ -342,13 +363,16 @@ bool InternalFileHierarchyStorage::updateSubFilesList(const DirectoryStorage::En } return true; } -bool InternalFileHierarchyStorage::updateHash(const DirectoryStorage::EntryIndex& file_index,const RsFileHash& hash) +bool InternalFileHierarchyStorage::updateHash( + const DirectoryStorage::EntryIndex& file_index, const RsFileHash& hash ) { - if(!checkIndex(file_index,FileStorageNode::TYPE_FILE)) - { - std::cerr << "[directory storage] (EE) cannot update file at index " << file_index << ". Not a valid index, or not a file." << std::endl; - return false; - } + if(!checkIndex(file_index, FileStorageNode::TYPE_FILE)) + { + RS_ERR( "Cannot update file at index ", file_index, + ". Not a valid index, or not a file." ); + print_stacktrace(); + return false; + } #ifdef DEBUG_DIRECTORY_STORAGE std::cerr << "[directory storage] updating hash at index " << file_index << ", hash=" << hash << std::endl; #endif @@ -436,14 +460,20 @@ DirectoryStorage::EntryIndex InternalFileHierarchyStorage::allocateNewIndex() return mNodes.size()-1 ; } -bool InternalFileHierarchyStorage::updateDirEntry(const DirectoryStorage::EntryIndex& indx,const std::string& dir_name,rstime_t most_recent_time,rstime_t dir_modtime,const std::vector& subdirs_hash,const std::vector& subfiles_array) +bool InternalFileHierarchyStorage::updateDirEntry( + const DirectoryStorage::EntryIndex& indx, const std::string& dir_name, + rstime_t most_recent_time, rstime_t dir_modtime, + const std::vector& subdirs_hash, + const std::vector& subfiles_array ) { - if(!checkIndex(indx,FileStorageNode::TYPE_DIR)) - { - std::cerr << "[directory storage] (EE) cannot update dir at index " << indx << ". Not a valid index, or not an existing dir." << std::endl; - return false; - } - DirEntry& d(*static_cast(mNodes[indx])) ; + if(!checkIndex(indx,FileStorageNode::TYPE_DIR)) + { + RS_ERR( "cannot update dir at index ", indx, ". Not a valid index, or " + "not an existing dir." ); + return false; + } + + DirEntry& d(*static_cast(mNodes[indx])); #ifdef DEBUG_DIRECTORY_STORAGE std::cerr << "Updating dir entry: name=\"" << dir_name << "\", most_recent_time=" << most_recent_time << ", modtime=" << dir_modtime << std::endl; @@ -703,14 +733,14 @@ const InternalFileHierarchyStorage::FileStorageNode *InternalFileHierarchyStorag return NULL ; } -const InternalFileHierarchyStorage::DirEntry *InternalFileHierarchyStorage::getDirEntry(DirectoryStorage::EntryIndex indx) const +const InternalFileHierarchyStorage::DirEntry* +InternalFileHierarchyStorage::getDirEntry(DirectoryStorage::EntryIndex indx) const { - if(!checkIndex(indx,FileStorageNode::TYPE_DIR)) - return NULL ; - - return static_cast(mNodes[indx]) ; + if(!checkIndex(indx,FileStorageNode::TYPE_DIR)) return nullptr; + return static_cast(mNodes[indx]); } -const InternalFileHierarchyStorage::FileEntry *InternalFileHierarchyStorage::getFileEntry(DirectoryStorage::EntryIndex indx) const +const InternalFileHierarchyStorage::FileEntry* +InternalFileHierarchyStorage::getFileEntry(DirectoryStorage::EntryIndex indx) const { if(!checkIndex(indx,FileStorageNode::TYPE_FILE)) return NULL ; @@ -754,7 +784,10 @@ bool InternalFileHierarchyStorage::searchHash(const RsFileHash& hash,DirectorySt class DirectoryStorageExprFileEntry: public RsRegularExpression::ExpFileEntry { public: - DirectoryStorageExprFileEntry(const InternalFileHierarchyStorage::FileEntry& fe,const InternalFileHierarchyStorage::DirEntry& parent) : mFe(fe),mDe(parent) {} + DirectoryStorageExprFileEntry( + const InternalFileHierarchyStorage::FileEntry& fe, + const InternalFileHierarchyStorage::DirEntry& parent ) : + mFe(fe), mDe(parent) {} inline virtual const std::string& file_name() const { return mFe.file_name ; } inline virtual uint64_t file_size() const { return mFe.file_size ; } @@ -768,14 +801,18 @@ private: const InternalFileHierarchyStorage::DirEntry& mDe ; }; -int InternalFileHierarchyStorage::searchBoolExp(RsRegularExpression::Expression * exp, std::list &results) const +int InternalFileHierarchyStorage::searchBoolExp( + RsRegularExpression::Expression* exp, + std::list& results ) const { - for(std::map::const_iterator it(mFileHashes.begin());it!=mFileHashes.end();++it) - if(mNodes[it->second] != NULL && exp->eval( - DirectoryStorageExprFileEntry(*static_cast(mNodes[it->second]), - *static_cast(mNodes[mNodes[it->second]->parent_index]) - ))) - results.push_back(it->second); + for(auto& it: std::as_const(mFileHashes)) + if(mNodes[it.second]) + if(exp->eval( + DirectoryStorageExprFileEntry( + *static_cast(mNodes[it.second]), + *static_cast(mNodes[mNodes[it.second]->parent_index]) + ) )) + results.push_back(it.second); return 0; } @@ -784,27 +821,43 @@ int InternalFileHierarchyStorage::searchTerms( const std::list& terms, std::list& results ) const { - // most entries are likely to be files, so we could do a linear search over the entries tab. - // instead we go through the table of hashes. + /* most entries are likely to be files, so we could do a linear search over + * the entries tab. Instead we go through the table of hashes.*/ - for(std::map::const_iterator it(mFileHashes.begin());it!=mFileHashes.end();++it) - if(mNodes[it->second] != NULL) - { - const std::string &str1 = static_cast(mNodes[it->second])->file_name; + for(auto& it : std::as_const(mFileHashes)) + { + // node may be null for some hash waiting to be deleted + if(mNodes[it.second]) + { + rs_view_ptr tFileEntry = + static_cast(mNodes[it.second]); - for(std::list::const_iterator iter(terms.begin()); iter != terms.end(); ++iter) - { - /* always ignore case */ - const std::string &str2 = (*iter); + /* Most file will just have file name stored, but single file shared + * without a shared dir will contain full path instead of just the + * name, so purify it to perform the search */ + std::string tFilename = tFileEntry->file_name; + if(tFileEntry->file_name.find("/") != std::string::npos) + { + std::string _tParentDir; + RsDirUtil::splitDirFromFile( + tFileEntry->file_name, _tParentDir, tFilename ); + } - if(str1.end() != std::search( str1.begin(), str1.end(), str2.begin(), str2.end(), RsRegularExpression::CompareCharIC() )) - { - results.push_back(it->second); - break; - } - } - } - return 0 ; + for(auto& termIt : std::as_const(terms)) + { + /* always ignore case */ + if(tFilename.end() != std::search( + tFilename.begin(), tFilename.end(), + termIt.begin(), termIt.end(), + RsRegularExpression::CompareCharIC() )) + { + results.push_back(it.second); + break; + } + } + } + } + return 0; } bool InternalFileHierarchyStorage::check(std::string& error_string) // checks consistency of storage. @@ -958,8 +1011,9 @@ void InternalFileHierarchyStorage::recursPrint(int depth,DirectoryStorage::Entry bool InternalFileHierarchyStorage::nodeAccessError(const std::string& s) { - std::cerr << "(EE) InternalDirectoryStructure: ERROR: " << s << std::endl; - return false ; + RS_ERR(s); + print_stacktrace(); + return false; } // Removes the given subdirectory from the parent node and all its pendign subdirs and files. diff --git a/libretroshare/src/file_sharing/directory_storage.cc b/libretroshare/src/file_sharing/directory_storage.cc index c4a46f4fb..583ac5882 100644 --- a/libretroshare/src/file_sharing/directory_storage.cc +++ b/libretroshare/src/file_sharing/directory_storage.cc @@ -3,7 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2016 by Mr.Alice * + * Copyright (C) 2016 Mr.Alice * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -30,6 +32,7 @@ #include "directory_storage.h" #include "dir_hierarchy.h" #include "filelist_io.h" +#include "util/cxx17retrocompat.h" #ifdef RS_DEEP_FILES_INDEX # include "deep_search/filesindex.hpp" @@ -67,8 +70,11 @@ DirectoryStorage::FileIterator& DirectoryStorage::FileIterator::operator++() return *this; } -DirectoryStorage::EntryIndex DirectoryStorage::FileIterator::operator*() const { return mStorage->getSubFileIndex(mParentIndex,mFileTabIndex) ; } -DirectoryStorage::EntryIndex DirectoryStorage::DirIterator ::operator*() const { return mStorage->getSubDirIndex(mParentIndex,mDirTabIndex) ; } +DirectoryStorage::EntryIndex DirectoryStorage::FileIterator::operator*() const +{ return mStorage->getSubFileIndex(mParentIndex, mFileTabIndex); } + +DirectoryStorage::EntryIndex DirectoryStorage::DirIterator::operator*() const +{ return mStorage->getSubDirIndex(mParentIndex, mDirTabIndex); } DirectoryStorage::FileIterator::operator bool() const { return **this != DirectoryStorage::NO_INDEX; } DirectoryStorage::DirIterator ::operator bool() const { return **this != DirectoryStorage::NO_INDEX; } @@ -139,7 +145,9 @@ bool DirectoryStorage::updateSubDirectoryList(const EntryIndex& indx, const std: mChanged = true ; return res ; } -bool DirectoryStorage::updateSubFilesList(const EntryIndex& indx,const std::map& subfiles,std::map& new_files) +bool DirectoryStorage::updateSubFilesList( + const EntryIndex& indx, const std::map& subfiles, + std::map& new_files ) { RS_STACK_MUTEX(mDirStorageMtx) ; bool res = mFileHierarchy->updateSubFilesList(indx,subfiles,new_files) ; @@ -348,7 +356,8 @@ int LocalDirectoryStorage::searchHash(const RsFileHash& hash, RsFileHash& real_h return false ; } -void LocalDirectoryStorage::setSharedDirectoryList(const std::list& lst) +void LocalDirectoryStorage::setSharedDirectoryList( + const std::list& lst ) { std::set dirs_with_new_virtualname ; bool dirs_with_changed_flags = false ; @@ -379,7 +388,9 @@ void LocalDirectoryStorage::setSharedDirectoryList(const std::list new_dirs ; @@ -529,7 +540,7 @@ bool LocalDirectoryStorage::updateHash( #endif ret = (!update_internal_hierarchy) || - mFileHierarchy->updateHash(index,hash); + mFileHierarchy->updateHash(index, hash); } // RS_STACK_MUTEX(mDirStorageMtx); #ifdef RS_DEEP_FILES_INDEX @@ -538,7 +549,7 @@ bool LocalDirectoryStorage::updateHash( fInfo.storage_permission_flags & DIR_FLAGS_ANONYMOUS_SEARCH ) { DeepFilesIndex dfi(DeepFilesIndex::dbDefaultPath()); - ret &= dfi.indexFile(fInfo.path, fInfo.fname, hash); + ret &= !dfi.indexFile(fInfo.path, fInfo.fname, hash); } #endif // def RS_DEEP_FILES_INDEX @@ -617,48 +628,78 @@ bool LocalDirectoryStorage::getFileSharingPermissions(const EntryIndex& indx,Fil return locked_getFileSharingPermissions(indx,flags,parent_groups) ; } -bool LocalDirectoryStorage::locked_getFileSharingPermissions(const EntryIndex& indx, FileStorageFlags& flags, std::list &parent_groups) +bool LocalDirectoryStorage::locked_getFileSharingPermissions( + const EntryIndex& indx, FileStorageFlags& flags, + std::list& parent_groups ) { - flags.clear() ; - parent_groups.clear(); + flags.clear(); + parent_groups.clear(); - std::string base_dir; + /* We got a request for root directory no need to do anything more after + * clearing outputs */ + if(!indx) return true; - const InternalFileHierarchyStorage::FileStorageNode *n = mFileHierarchy->getNode(indx) ; + using FileStorageNode = InternalFileHierarchyStorage::FileStorageNode; + using EntryIndex = DirectoryStorage::EntryIndex; - if(n == NULL) - return false ; + rs_view_ptr n = mFileHierarchy->getNode(indx); + if(!n) + { + RS_ERR("Node for index: ", indx, "not found"); + print_stacktrace(); + return false; + } - for(DirectoryStorage::EntryIndex i=((n->type()==InternalFileHierarchyStorage::FileStorageNode::TYPE_FILE)?((intptr_t)n->parent_index):indx);;) - { - const InternalFileHierarchyStorage::DirEntry *e = mFileHierarchy->getDirEntry(i) ; + // Climb down node tree up to root + 1 + EntryIndex curIndex = indx; + while (n->parent_index) + { + curIndex = n->parent_index; + n = mFileHierarchy->getNode(curIndex); + } - if(e == NULL) - break ; + // Retrieve base name + std::string tBaseName; + switch (n->type()) + { + // Handle single file shared case + case InternalFileHierarchyStorage::FileStorageNode::TYPE_FILE: + tBaseName = mFileHierarchy->getFileEntry(curIndex)->file_name; + break; + // Handle shared directory case + case InternalFileHierarchyStorage::FileStorageNode::TYPE_DIR: + tBaseName = mFileHierarchy->getDirEntry(curIndex)->dir_name; + break; + default: + RS_ERR("Got unhandled node type: ", n->type()); + print_stacktrace(); + return false; + } - if(e->parent_index == 0) - { - base_dir = e->dir_name ; - break ; - } - i = e->parent_index ; - } + // Use base name to retrieve sharing permissions + if(!tBaseName.empty()) + { + auto it = std::as_const(mLocalDirs).find(tBaseName); - if(!base_dir.empty()) - { - std::map::const_iterator it = mLocalDirs.find(base_dir) ; + if(it == mLocalDirs.end()) + { + RS_ERR( "base name \"", tBaseName, + "\" for index: ", indx, " not found in shared dir list." ); + print_stacktrace(); + return false; + } - if(it == mLocalDirs.end()) - { - std::cerr << "(II) base directory \"" << base_dir << "\" not found in shared dir list." << std::endl; - return false ; - } + flags = it->second.shareflags; + parent_groups = it->second.parent_groups; + } + else + { + RS_ERR("base name for indx: ", indx, " is empty"); + print_stacktrace(); + return false; + } - flags = it->second.shareflags; - parent_groups = it->second.parent_groups; - } - - return true; + return true; } std::string LocalDirectoryStorage::locked_getVirtualDirName(EntryIndex indx) const @@ -705,134 +746,214 @@ std::string LocalDirectoryStorage::locked_getVirtualPath(EntryIndex indx) const return it->second.virtualname + "/" + res; } -bool LocalDirectoryStorage::serialiseDirEntry(const EntryIndex& indx,RsTlvBinaryData& bindata,const RsPeerId& client_id) +bool LocalDirectoryStorage::serialiseDirEntry( + const EntryIndex& indx, RsTlvBinaryData& bindata, + const RsPeerId& client_id ) { - RS_STACK_MUTEX(mDirStorageMtx) ; + RS_STACK_MUTEX(mDirStorageMtx); - const InternalFileHierarchyStorage::DirEntry *dir = mFileHierarchy->getDirEntry(indx); + const InternalFileHierarchyStorage::DirEntry* dir = + mFileHierarchy->getDirEntry(indx); #ifdef DEBUG_LOCAL_DIRECTORY_STORAGE std::cerr << "Serialising Dir entry " << std::hex << indx << " for client id " << client_id << std::endl; #endif - if(dir == NULL) - { - std::cerr << "(EE) serialiseDirEntry: ERROR. Cannot find entry " << (void*)(intptr_t)indx << std::endl; - return false; - } - // compute list of allowed subdirs - std::vector allowed_subdirs ; - FileStorageFlags node_flags ; - std::list node_groups ; + if(!dir) + { + RS_ERR("Cannot find entry ", indx); + return false; + } - // for each subdir, compute the node flags and groups, then ask rsPeers to compute the mask that result from these flags for the particular peer supplied in parameter + // compute list of allowed subdirs + std::vector allowed_subdirs; + FileStorageFlags node_flags; + std::list node_groups; + + /* for each subdir, compute the node flags and groups, then ask rsPeers to + * compute the mask that result from these flags for the particular peer + * supplied in parameter */ + + for(uint32_t i=0;isubdirs.size();++i) + if(indx != 0 || ( + locked_getFileSharingPermissions( + dir->subdirs[i], node_flags, node_groups ) && + ( rsPeers->computePeerPermissionFlags( + client_id, node_flags, node_groups ) & + RS_FILE_HINTS_BROWSABLE ) )) + { + RsFileHash hash; + if(!mFileHierarchy->getDirHashFromIndex(dir->subdirs[i],hash)) + { + RS_ERR( "Cannot get hash from subdir index: ", + dir->subdirs[i], ". Weird bug." ); + print_stacktrace(); + return false; + } + allowed_subdirs.push_back(hash); - for(uint32_t i=0;isubdirs.size();++i) - if(indx != 0 || (locked_getFileSharingPermissions(dir->subdirs[i],node_flags,node_groups) && (rsPeers->computePeerPermissionFlags(client_id,node_flags,node_groups) & RS_FILE_HINTS_BROWSABLE))) - { - RsFileHash hash ; - if(!mFileHierarchy->getDirHashFromIndex(dir->subdirs[i],hash)) - { - std::cerr << "(EE) Cannot get hash from subdir index " << dir->subdirs[i] << ". Weird bug." << std::endl ; - return false; - } - allowed_subdirs.push_back(hash) ; #ifdef DEBUG_LOCAL_DIRECTORY_STORAGE std::cerr << " pushing subdir " << hash << ", array position=" << i << " indx=" << dir->subdirs[i] << std::endl; #endif - } + } #ifdef DEBUG_LOCAL_DIRECTORY_STORAGE else std::cerr << " not pushing subdir " << hash << ", array position=" << i << " indx=" << dir->subdirs[i] << ": permission denied for this peer." << std::endl; #endif - // now count the files that do not have a null hash (meaning the hash has indeed been computed) + /* now count the files that do not have a null hash (meaning the hash has + * indeed been computed), also in case files are shared singularly (without + * a shared directory) so they are child of root check browsability + * permission */ + uint32_t allowed_subfiles = 0; + for(uint32_t i=0; isubfiles.size(); ++i) + { + const InternalFileHierarchyStorage::FileEntry* file = + mFileHierarchy->getFileEntry(dir->subfiles[i]); + if(file != nullptr && !file->file_hash.isNull() + && ( indx !=0 || ( + locked_getFileSharingPermissions( + dir->subfiles[i], node_flags, node_groups ) && + rsPeers->computePeerPermissionFlags( + client_id, node_flags, node_groups ) & + RS_FILE_HINTS_BROWSABLE ) )) + allowed_subfiles++; + } - uint32_t allowed_subfiles = 0 ; + unsigned char* section_data = (unsigned char *) + rs_malloc(FL_BASE_TMP_SECTION_SIZE); + if(!section_data) return false; - for(uint32_t i=0;isubfiles.size();++i) - { - const InternalFileHierarchyStorage::FileEntry *file = mFileHierarchy->getFileEntry(dir->subfiles[i]) ; - if(file != NULL && !file->file_hash.isNull()) - allowed_subfiles++ ; - } + uint32_t section_size = FL_BASE_TMP_SECTION_SIZE; + uint32_t section_offset = 0; - unsigned char *section_data = (unsigned char *)rs_malloc(FL_BASE_TMP_SECTION_SIZE) ; + /* we need to send: + * - the name of the directory, its TS + * - the index entry for each subdir (the updte TS are exchanged at a + * higher level) + * - the file info for each subfile */ - if(!section_data) - return false ; + std::string virtual_dir_name = locked_getVirtualDirName(indx); - uint32_t section_size = FL_BASE_TMP_SECTION_SIZE; - uint32_t section_offset = 0; + /* Manual serialization AGAIN! This is terrible and should be ported to the + * new serialization system ASAP! */ + if(!FileListIO::writeField( + section_data, section_size, section_offset, + FILE_LIST_IO_TAG_DIR_NAME, virtual_dir_name )) + { free(section_data); return false; } + if(!FileListIO::writeField( + section_data, section_size, section_offset, + FILE_LIST_IO_TAG_RECURS_MODIF_TS, + (uint32_t)dir->dir_most_recent_time )) + { free(section_data); return false; } + if(!FileListIO::writeField( + section_data, section_size, section_offset, + FILE_LIST_IO_TAG_MODIF_TS, (uint32_t)dir->dir_modtime )) + { free(section_data); return false;} - // we need to send: - // - the name of the directory, its TS - // - the index entry for each subdir (the updte TS are exchanged at a higher level) - // - the file info for each subfile - // - std::string virtual_dir_name = locked_getVirtualDirName(indx) ; + // serialise number of subdirs and number of subfiles + if(!FileListIO::writeField( + section_data, section_size, section_offset, + FILE_LIST_IO_TAG_RAW_NUMBER, (uint32_t)allowed_subdirs.size() )) + { free(section_data); return false; } + if(!FileListIO::writeField( + section_data, section_size, section_offset, + FILE_LIST_IO_TAG_RAW_NUMBER, (uint32_t)allowed_subfiles )) + { free(section_data); return false; } - if(!FileListIO::writeField(section_data,section_size,section_offset,FILE_LIST_IO_TAG_DIR_NAME ,virtual_dir_name )) { free(section_data); return false ;} - if(!FileListIO::writeField(section_data,section_size,section_offset,FILE_LIST_IO_TAG_RECURS_MODIF_TS,(uint32_t)dir->dir_most_recent_time)) { free(section_data); return false ;} - if(!FileListIO::writeField(section_data,section_size,section_offset,FILE_LIST_IO_TAG_MODIF_TS ,(uint32_t)dir->dir_modtime )) { free(section_data); return false ;} + // serialise subdirs entry indexes + for(uint32_t i=0; isubfiles.size(); ++i) + { + uint32_t file_section_offset = 0; - // serialise directory subfiles, with info for each of them + const InternalFileHierarchyStorage::FileEntry* file = + mFileHierarchy->getFileEntry(dir->subfiles[i]); - unsigned char *file_section_data = (unsigned char *)rs_malloc(FL_BASE_TMP_SECTION_SIZE) ; + if(file == nullptr || file->file_hash.isNull()) + { + RS_INFO( "skipping unhashed or Null file entry ", + dir->subfiles[i], " to get/send file info." ); + continue; + } - if(!file_section_data) - { - free(section_data); - return false ; - } + if(indx == 0) + { + if(!locked_getFileSharingPermissions( + dir->subfiles[i], node_flags, node_groups )) + { + RS_ERR( "Failure getting sharing permission for single file: ", + dir->subfiles[i] ); + print_stacktrace(); + continue; + } - uint32_t file_section_size = FL_BASE_TMP_SECTION_SIZE ; + if(!( rsPeers->computePeerPermissionFlags( + client_id, node_flags, node_groups ) & + RS_FILE_HINTS_BROWSABLE )) + { + RS_INFO( "Skipping single file shared without browse " + "permission" ); + continue; + } + } - for(uint32_t i=0;isubfiles.size();++i) - { - uint32_t file_section_offset = 0 ; + if(!FileListIO::writeField( + file_section_data, file_section_size, file_section_offset, + FILE_LIST_IO_TAG_FILE_NAME, file->file_name )) + { free(section_data); free(file_section_data); return false; } + if(!FileListIO::writeField( + file_section_data, file_section_size, file_section_offset, + FILE_LIST_IO_TAG_FILE_SIZE, file->file_size )) + { free(section_data); free(file_section_data); return false; } + if(!FileListIO::writeField( + file_section_data, file_section_size, file_section_offset, + FILE_LIST_IO_TAG_FILE_SHA1_HASH, file->file_hash )) + { free(section_data); free(file_section_data); return false; } + if(!FileListIO::writeField( + file_section_data, file_section_size, file_section_offset, + FILE_LIST_IO_TAG_MODIF_TS, (uint32_t)file->file_modtime )) + { free(section_data); free(file_section_data); return false; } - const InternalFileHierarchyStorage::FileEntry *file = mFileHierarchy->getFileEntry(dir->subfiles[i]) ; - - if(file == NULL || file->file_hash.isNull()) - { - std::cerr << "(II) skipping unhashed or Null file entry " << dir->subfiles[i] << " to get/send file info." << std::endl; - continue ; - } - - if(!FileListIO::writeField(file_section_data,file_section_size,file_section_offset,FILE_LIST_IO_TAG_FILE_NAME ,file->file_name )) { free(section_data);free(file_section_data);return false ;} - if(!FileListIO::writeField(file_section_data,file_section_size,file_section_offset,FILE_LIST_IO_TAG_FILE_SIZE ,file->file_size )) { free(section_data);free(file_section_data);return false ;} - if(!FileListIO::writeField(file_section_data,file_section_size,file_section_offset,FILE_LIST_IO_TAG_FILE_SHA1_HASH,file->file_hash )) { free(section_data);free(file_section_data);return false ;} - if(!FileListIO::writeField(file_section_data,file_section_size,file_section_offset,FILE_LIST_IO_TAG_MODIF_TS ,(uint32_t)file->file_modtime)) { free(section_data);free(file_section_data);return false ;} - - // now write the whole string into a single section in the file - - if(!FileListIO::writeField(section_data,section_size,section_offset,FILE_LIST_IO_TAG_REMOTE_FILE_ENTRY,file_section_data,file_section_offset)) { free(section_data); free(file_section_data);return false ;} + // now write the whole string into a single section in the file + if(!FileListIO::writeField( + section_data, section_size, section_offset, + FILE_LIST_IO_TAG_REMOTE_FILE_ENTRY, + file_section_data, file_section_offset )) + { free(section_data); free(file_section_data); return false; } #ifdef DEBUG_LOCAL_DIRECTORY_STORAGE std::cerr << " pushing subfile " << file->hash << ", array position=" << i << " indx=" << dir->subfiles[i] << std::endl; #endif - } - free(file_section_data) ; + } + free(file_section_data); #ifdef DEBUG_LOCAL_DIRECTORY_STORAGE std::cerr << "Serialised dir entry to send for entry index " << (void*)(intptr_t)indx << ". Data size is " << section_size << " bytes" << std::endl; #endif - bindata.bin_data = realloc(section_data,section_offset) ; // This discards the possibly unused trailing bytes in the end of section_data - bindata.bin_len = section_offset ; + // Discards the possibly unused trailing bytes in the end of section_data + bindata.bin_data = realloc(section_data,section_offset); + bindata.bin_len = section_offset; - return true ; + return true; } diff --git a/libretroshare/src/file_sharing/directory_updater.cc b/libretroshare/src/file_sharing/directory_updater.cc index 828d1ee2c..7d6828712 100644 --- a/libretroshare/src/file_sharing/directory_updater.cc +++ b/libretroshare/src/file_sharing/directory_updater.cc @@ -3,7 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2016 by Mr.Alice * + * Copyright (C) 2016 Mr.Alice * + * Copyright (C) 2021 Gioacchino Mazzurco * + * Copyright (C) 2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -19,13 +21,15 @@ * along with this program. If not, see . * * * ******************************************************************************/ + +#include "util/cxx17retrocompat.h" #include "util/folderiterator.h" #include "util/rstime.h" #include "rsserver/p3face.h" - #include "directory_storage.h" #include "directory_updater.h" #include "file_sharing_defaults.h" +#include "util/rsdebuglevel3.h" //#define DEBUG_LOCAL_DIR_UPDATER 1 @@ -121,185 +125,238 @@ void LocalDirectoryUpdater::forceUpdate(bool add_safe_delay) bool LocalDirectoryUpdater::sweepSharedDirectories(bool& some_files_not_ready) { - if(mHashSalt.isNull()) - { - std::cerr << "(EE) no salt value in LocalDirectoryUpdater. Is that a bug?" << std::endl; - return false; - } + if(mHashSalt.isNull()) + { + RS_ERR("no salt value in LocalDirectoryUpdater"); + print_stacktrace(); + return false; + } - mIsChecking = true ; + mIsChecking = true; - RsServer::notify()->notifyListPreChange(NOTIFY_LIST_DIRLIST_LOCAL, 0); -#ifdef DEBUG_LOCAL_DIR_UPDATER - std::cerr << "[directory storage] LocalDirectoryUpdater::sweep()" << std::endl; -#endif + RsServer::notify()->notifyListPreChange(NOTIFY_LIST_DIRLIST_LOCAL, 0); - // recursive update algorithm works that way: - // - the external loop starts on the shared directory list and goes through sub-directories - // - at the same time, it updates the local list of shared directories. A single sweep is performed over the whole directory structure. - // - the information that is costly to compute (the hash) is store externally into a separate structure. - // - doing so, changing directory names or moving files between directories does not cause a re-hash of the content. - // - std::list shared_directory_list ; - mSharedDirectories->getSharedDirectoryList(shared_directory_list); + /* recursive update algorithm works that way: + * - the external loop starts on the shared directory list and goes through + * sub-directories + * - at the same time, it updates the local list of shared directories. + * A single sweep is performed over the whole directory structure. + * - the information that is costly to compute (the hash) is stored + * externally into a separate structure. + * - doing so, changing directory names or moving files between directories + * does not cause a re-hash of the content. */ + std::list shared_directory_list; + mSharedDirectories->getSharedDirectoryList(shared_directory_list); + std::set sub_dir_list; - std::set sub_dir_list ; + /* Support also single files sharing as it make much more sense on some + * platforms like Android */ + std::map singleFilesMap; - // We re-check that each dir actually exists. It might have been removed from the disk. + /* We re-check that each dir actually exists. It might have been removed + * from the disk. Accept also single files not just directories. */ + for(auto& realDir: std::as_const(shared_directory_list)) + { + const auto& fPath = realDir.filename; + if(RsDirUtil::checkDirectory(fPath)) + sub_dir_list.insert(fPath); + else if (RsDirUtil::fileExists(fPath)) + { + rstime_t lastWrite= RsDirUtil::lastWriteTime(fPath); + if(time(nullptr) >= lastWrite + MIN_TIME_AFTER_LAST_MODIFICATION) + { + uint64_t fSize = 0; + RsDirUtil::checkFile(fPath,fSize); - for(std::list::const_iterator real_dir_it(shared_directory_list.begin());real_dir_it!=shared_directory_list.end();++real_dir_it) - if(RsDirUtil::checkDirectory( (*real_dir_it).filename ) ) - sub_dir_list.insert( (*real_dir_it).filename ) ; + singleFilesMap[fPath].modtime = lastWrite; + singleFilesMap[fPath].size = fSize; + } + else + { + some_files_not_ready = true; + RS_INFO( "file: \"", fPath, "\" is " + "probably being written to. Keep it for later"); + } + } + else RS_WARN( "Got non existent file \"", fPath, + "\" in shared directories list. Ignored." ); + } - // make sure that entries in stored_dir_it are the same than paths in real_dir_it, and in the same order. + { + const auto tRoot = mSharedDirectories->root(); + std::map needsUpdate; + mSharedDirectories->updateSubFilesList( + tRoot, singleFilesMap, needsUpdate); - mSharedDirectories->updateSubDirectoryList(mSharedDirectories->root(),sub_dir_list,mHashSalt) ; + for( DirectoryStorage::FileIterator storedSingleFilesIt( + mSharedDirectories, mSharedDirectories->root() ); + storedSingleFilesIt; ++storedSingleFilesIt ) + { + const auto& it = storedSingleFilesIt; + RsFileHash hash; + if( mHashCache->requestHash( + it.name(), it.size(), it.modtime(), hash, + this, *it ) ) + mSharedDirectories->updateHash(*it, hash, it.hash() != hash); + } + } - // now for each of them, go recursively and match both files and dirs + /* make sure that entries in stored_dir_it are the same than paths in + * real_dir_it, and in the same order. */ + mSharedDirectories->updateSubDirectoryList( + mSharedDirectories->root(), sub_dir_list, mHashSalt ); - std::set existing_dirs ; + // now for each of them, go recursively and match both files and dirs + std::set existing_dirs; + for( DirectoryStorage::DirIterator stored_dir_it( + mSharedDirectories, mSharedDirectories->root() ); + stored_dir_it; ++stored_dir_it ) + { + RS_DBG4("recursing into \"", stored_dir_it.name()); - for(DirectoryStorage::DirIterator stored_dir_it(mSharedDirectories,mSharedDirectories->root()) ; stored_dir_it;++stored_dir_it) - { -#ifdef DEBUG_LOCAL_DIR_UPDATER - std::cerr << "[directory storage] recursing into " << stored_dir_it.name() << std::endl; -#endif existing_dirs.insert(RsDirUtil::removeSymLinks(stored_dir_it.name())); + recursUpdateSharedDir( + stored_dir_it.name(), *stored_dir_it, + existing_dirs, 1, some_files_not_ready ); + /* here we need to use the list that was stored, instead of the shared + * dir list, because the two are not necessarily in the same order. */ + } - recursUpdateSharedDir(stored_dir_it.name(), *stored_dir_it,existing_dirs,1,some_files_not_ready) ; // here we need to use the list that was stored, instead of the shared dir list, because the two - // are not necessarily in the same order. - } + RsServer::notify()->notifyListChange(NOTIFY_LIST_DIRLIST_LOCAL, 0); + mIsChecking = false; - RsServer::notify()->notifyListChange(NOTIFY_LIST_DIRLIST_LOCAL, 0); - mIsChecking = false ; - - return true ; + return true; } -void LocalDirectoryUpdater::recursUpdateSharedDir(const std::string& cumulated_path, DirectoryStorage::EntryIndex indx,std::set& existing_directories,uint32_t current_depth,bool& some_files_not_ready) +void LocalDirectoryUpdater::recursUpdateSharedDir( + const std::string& cumulated_path, DirectoryStorage::EntryIndex indx, + std::set& existing_directories, uint32_t current_depth, + bool& some_files_not_ready ) { -#ifdef DEBUG_LOCAL_DIR_UPDATER - std::cerr << "[directory storage] parsing directory " << cumulated_path << ", index=" << indx << std::endl; -#endif + RS_DBG4("parsing directory \"", cumulated_path, "\" index: ", indx); - // make sure list of subdirs is the same - // make sure list of subfiles is the same - // request all hashes to the hashcache + /* make sure list of subdirs is the same + * make sure list of subfiles is the same + * request all hashes to the hashcache */ - librs::util::FolderIterator dirIt(cumulated_path,mFollowSymLinks,false); // disallow symbolic links and files from the future. + // disallow symbolic links and files from the future. + librs::util::FolderIterator dirIt(cumulated_path, mFollowSymLinks, false); - rstime_t dir_local_mod_time ; - if(!mSharedDirectories->getDirectoryLocalModTime(indx,dir_local_mod_time)) - { - std::cerr << "(EE) Cannot get local mod time for dir index " << indx << std::endl; - return; - } + rstime_t dir_local_mod_time; + if(!mSharedDirectories->getDirectoryLocalModTime(indx,dir_local_mod_time)) + { + RS_ERR("Cannot get local mod time for dir index: ", indx); + print_stacktrace(); + return; + } - rstime_t now = time(NULL) ; + rstime_t now = time(nullptr); + /* the > is because we may have changed the virtual name, and therefore the + * TS wont match. We only want to detect when the directory has changed on + * the disk */ + if(mNeedsFullRecheck || dirIt.dir_modtime() > dir_local_mod_time) + { + // collect subdirs and subfiles + std::map subfiles; + std::set subdirs; - if(mNeedsFullRecheck || dirIt.dir_modtime() > dir_local_mod_time) // the > is because we may have changed the virtual name, and therefore the TS wont match. - // we only want to detect when the directory has changed on the disk - { - // collect subdirs and subfiles + for( ; dirIt.isValid(); dirIt.next() ) + if(filterFile(dirIt.file_name())) + { + const auto fType = dirIt.file_type(); + switch(fType) + { + case librs::util::FolderIterator::TYPE_FILE: + if(now >= dirIt.file_modtime() + MIN_TIME_AFTER_LAST_MODIFICATION) + { + subfiles[dirIt.file_name()].modtime = dirIt.file_modtime(); + subfiles[dirIt.file_name()].size = dirIt.file_size(); + RS_DBG4("adding sub-file \"", dirIt.file_name(), "\""); + } + else + { + some_files_not_ready = true; + RS_INFO( "file: \"", dirIt.file_fullpath(), "\" is " + "probably being written to. Keep it for later"); + } + break; + case librs::util::FolderIterator::TYPE_DIR: + { + bool dir_is_accepted = true; + /* 64 is here as a safe limit, to make infinite loops + * impossible. + * TODO: Make it a visible constexpr in the header */ + if( (mMaxShareDepth > 0u && current_depth > mMaxShareDepth) + || (mMaxShareDepth == 0 && current_depth >= 64) ) + dir_is_accepted = false; - std::map subfiles ; - std::set subdirs ; + if(dir_is_accepted && mFollowSymLinks && mIgnoreDuplicates) + { + std::string real_path = RsDirUtil::removeSymLinks( + cumulated_path + "/" + dirIt.file_name() ); - for(;dirIt.isValid();dirIt.next()) - if(filterFile(dirIt.file_name())) - { - switch(dirIt.file_type()) - { - case librs::util::FolderIterator::TYPE_FILE: + if( existing_directories.end() != + existing_directories.find(real_path) ) + { + RS_WARN( "Directory: \"", cumulated_path, + "\" has real path: \"", real_path, + "\" which already belongs to another " + "shared directory. Ignoring" ); + dir_is_accepted = false; + } + else existing_directories.insert(real_path); + } - if(dirIt.file_modtime() + MIN_TIME_AFTER_LAST_MODIFICATION < now) - { - subfiles[dirIt.file_name()].modtime = dirIt.file_modtime() ; - subfiles[dirIt.file_name()].size = dirIt.file_size(); -#ifdef DEBUG_LOCAL_DIR_UPDATER - std::cerr << " adding sub-file \"" << dirIt.file_name() << "\"" << std::endl; -#endif - } - else - { - some_files_not_ready = true ; + if(dir_is_accepted) subdirs.insert(dirIt.file_name()); - std::cerr << "(WW) file " << dirIt.file_fullpath() << " is probably being written to. Keeping it for later." << std::endl; - } + RS_DBG4("adding sub-dir \"", dirIt.file_name(), "\""); - break; + break; + } + default: + RS_ERR( "Got Dir entry of unknown type:", fType, + "with path \"", cumulated_path, "/", + dirIt.file_name(), "\"" ); + print_stacktrace(); + break; + } + } - case librs::util::FolderIterator::TYPE_DIR: - { - bool dir_is_accepted = true ; + /* update folder modificatoin time, which is the only way to detect + * e.g. removed or renamed files. */ + mSharedDirectories->setDirectoryLocalModTime(indx,dirIt.dir_modtime()); - if( (mMaxShareDepth > 0u && current_depth > mMaxShareDepth) || (mMaxShareDepth==0 && current_depth >= 64)) // 64 is here as a safe limit, to make loops impossible. - dir_is_accepted = false ; + // update file and dir lists for current directory. + mSharedDirectories->updateSubDirectoryList(indx,subdirs,mHashSalt); - if(dir_is_accepted && mFollowSymLinks && mIgnoreDuplicates) - { - std::string real_path = RsDirUtil::removeSymLinks(cumulated_path + "/" + dirIt.file_name()) ; + std::map new_files; + mSharedDirectories->updateSubFilesList(indx, subfiles, new_files); - if(existing_directories.end() != existing_directories.find(real_path)) - { - std::cerr << "(WW) Directory " << cumulated_path << " has real path " << real_path << " which already belongs to another shared directory. Ignoring" << std::endl; - dir_is_accepted = false ; - } - else - existing_directories.insert(real_path) ; - } - - if(dir_is_accepted) - subdirs.insert(dirIt.file_name()); - -#ifdef DEBUG_LOCAL_DIR_UPDATER - std::cerr << " adding sub-dir \"" << dirIt.file_name() << "\"" << std::endl; -#endif - } - break; - default: - std::cerr << "(EE) Dir entry of unknown type with path \"" << cumulated_path << "/" << dirIt.file_name() << "\"" << std::endl; - } - } - // update folder modificatoin time, which is the only way to detect e.g. removed or renamed files. - - mSharedDirectories->setDirectoryLocalModTime(indx,dirIt.dir_modtime()) ; - - // update file and dir lists for current directory. - - mSharedDirectories->updateSubDirectoryList(indx,subdirs,mHashSalt) ; - - std::map new_files ; - mSharedDirectories->updateSubFilesList(indx,subfiles,new_files) ; - - // now go through list of subfiles and request the hash to hashcache - - for(DirectoryStorage::FileIterator dit(mSharedDirectories,indx);dit;++dit) - { - // ask about the hash. If not present, ask HashCache. If not present, or different, the callback will update it. - - RsFileHash hash ; - - // mSharedDirectories does two things: store H(F), and compute H(H(F)), which is used in FT. The later is always needed. - - if(mHashCache->requestHash(cumulated_path + "/" + dit.name(),dit.size(),dit.modtime(),hash,this,*dit)) - mSharedDirectories->updateHash(*dit,hash,hash != dit.hash()); - } - } -#ifdef DEBUG_LOCAL_DIR_UPDATER - else - std::cerr << " directory is unchanged. Keeping existing files and subdirs list." << std::endl; -#endif - - // go through the list of sub-dirs and recursively update - - for(DirectoryStorage::DirIterator stored_dir_it(mSharedDirectories,indx) ; stored_dir_it; ++stored_dir_it) + // now go through list of subfiles and request the hash to hashcache + for( DirectoryStorage::FileIterator dit(mSharedDirectories,indx); + dit; ++dit ) { -#ifdef DEBUG_LOCAL_DIR_UPDATER - std::cerr << " recursing into " << stored_dir_it.name() << std::endl; -#endif - recursUpdateSharedDir(cumulated_path + "/" + stored_dir_it.name(), *stored_dir_it,existing_directories,current_depth+1,some_files_not_ready) ; + /* ask about the hash. If not present, ask HashCache. + * If not present, or different, the callback will update it. */ + RsFileHash hash; + + /* mSharedDirectories does two things: store H(F), and + * compute H(H(F)), which is used in FT. + * The later is always needed. */ + + if( mHashCache->requestHash( + cumulated_path + "/" + dit.name(), + dit.size(), dit.modtime(), hash, this, *dit ) ) + mSharedDirectories->updateHash(*dit, hash, hash != dit.hash()); } + } + + // go through the list of sub-dirs and recursively update + for( DirectoryStorage::DirIterator stored_dir_it(mSharedDirectories, indx); + stored_dir_it; ++stored_dir_it ) + recursUpdateSharedDir( cumulated_path + "/" + stored_dir_it.name(), + *stored_dir_it, existing_directories, + current_depth+1, some_files_not_ready ); } bool LocalDirectoryUpdater::filterFile(const std::string& fname) const @@ -347,7 +404,8 @@ void LocalDirectoryUpdater::hash_callback(uint32_t client_param, const std::stri bool LocalDirectoryUpdater::hash_confirm(uint32_t client_param) { - return mSharedDirectories->getEntryType(DirectoryStorage::EntryIndex(client_param)) == DIR_TYPE_FILE ; + return mSharedDirectories->getEntryType( + DirectoryStorage::EntryIndex(client_param) ) == DIR_TYPE_FILE; } void LocalDirectoryUpdater::setFileWatchPeriod(int seconds) diff --git a/libretroshare/src/file_sharing/hash_cache.cc b/libretroshare/src/file_sharing/hash_cache.cc index 331f1a481..62924d70a 100644 --- a/libretroshare/src/file_sharing/hash_cache.cc +++ b/libretroshare/src/file_sharing/hash_cache.cc @@ -187,9 +187,10 @@ void HashStorage::threadTick() else rs_sprintf(tmpout, "%lu/%lu (%s - %d%%) : %s", (unsigned long int)mHashCounter+1, (unsigned long int)mTotalFilesToHash, friendlyUnit(mTotalHashedSize).c_str(), int(mTotalHashedSize/double(mTotalSizeToHash)*100.0), job.full_path.c_str()) ; - //RsServer::notify()->notifyHashingInfo(NOTIFY_HASHTYPE_HASH_FILE, tmpout) ; - if(rsEvents) { + /* Emit deprecated event only for retrocompatibility + * TODO: create a proper event with structured data instead of a + * formatted string */ auto ev = std::make_shared(); ev->mEventCode = RsSharedDirectoriesEventCode::HASHING_FILE; ev->mMessage = tmpout; @@ -198,7 +199,7 @@ void HashStorage::threadTick() double seconds_origin = rstime::RsScopeTimer::currentTime() ; - if(RsDirUtil::getFileHash(job.full_path, hash,size, this)) + if(RsDirUtil::getFileHash(job.full_path, hash, size, this)) { // store the result @@ -218,8 +219,7 @@ void HashStorage::threadTick() mChanged = true ; mTotalHashedSize += size ; } - else - std::cerr << "ERROR: cannot hash file " << job.full_path << std::endl; + else RS_ERR("Failure hashing file: ", job.full_path); mHashingTime += rstime::RsScopeTimer::currentTime() - seconds_origin ; mHashedBytes += size ; @@ -233,11 +233,18 @@ void HashStorage::threadTick() ++mHashCounter ; } - } - // call the client + } - if(!hash.isNull()) - job.client->hash_callback(job.client_param, job.full_path, hash, size); + // call the client + if(!hash.isNull()) + job.client->hash_callback(job.client_param, job.full_path, hash, size); + + /* Notify we completed hashing a file */ + auto ev = std::make_shared(); + ev->mFilePath = job.full_path; + ev->mHashingSpeed = mCurrentHashingSpeed; + ev->mFileHash = hash; + rsEvents->postEvent(ev); } bool HashStorage::requestHash(const std::string& full_path,uint64_t size,rstime_t mod_time,RsFileHash& known_hash,HashStorageClient *c,uint32_t client_param) diff --git a/libretroshare/src/file_sharing/p3filelists.cc b/libretroshare/src/file_sharing/p3filelists.cc index 6eb3899e2..419196275 100644 --- a/libretroshare/src/file_sharing/p3filelists.cc +++ b/libretroshare/src/file_sharing/p3filelists.cc @@ -3,7 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2018 by Mr.Alice * + * Copyright (C) 2018 Mr.Alice * + * Copyright (C) 2021 Gioacchino Mazzurco * + * Copyright (C) 2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -30,7 +32,7 @@ #include "retroshare/rsids.h" #include "retroshare/rspeers.h" #include "retroshare/rsinit.h" - +#include "util/cxx17retrocompat.h" #include "rsserver/p3face.h" #define P3FILELISTS_DEBUG() std::cerr << time(NULL) << " : FILE_LISTS : " << __FUNCTION__ << " : " @@ -1044,31 +1046,36 @@ void p3FileDatabase::getExtraFilesDirDetails(void *ref,DirectoryStorage::EntryIn } // This function converts a pointer into directory details, to be used by the AbstractItemModel for browsing the files. -int p3FileDatabase::RequestDirDetails(void *ref, DirDetails& d, FileSearchFlags flags) const +int p3FileDatabase::RequestDirDetails( + void* ref, DirDetails& d, FileSearchFlags flags ) const { - RS_STACK_MUTEX(mFLSMtx) ; + RS_STACK_MUTEX(mFLSMtx); - d.children.clear(); + d.children.clear(); - // Case where the pointer is NULL, which means we're at the top of the list of shared directories for all friends (including us) - // or at the top of our own list of shared directories, depending on the flags. + /* Case where the pointer is NULL, which means we're at the top of the list + * of shared directories for all friends (including us) or at the top of our + * own list of shared directories, depending on the flags. + * + * Friend index is used as follows: + * 0 : own id + * 1...n : other friends + * + * entry_index: starts at 0. + * + * The point is: we cannot use (0,0) because it encodes to NULL. No existing + * combination should encode to NULL. + * So we need to properly convert the friend index into 0 or into a friend + * tab index in mRemoteDirectories. + * + * We should also check the consistency between flags and the content of ref. + */ - // Friend index is used as follows: - // 0 : own id - // 1...n : other friends - // - // entry_index: starts at 0. - // - // The point is: we cannot use (0,0) because it encodes to NULL. No existing combination should encode to NULL. - // So we need to properly convert the friend index into 0 or into a friend tab index in mRemoteDirectories. - // - // We should also check the consistency between flags and the content of ref. - - if (ref == NULL) - { - d.ref = NULL ; - d.type = DIR_TYPE_ROOT; - d.parent = NULL; + if (ref == nullptr) + { + d.ref = nullptr; + d.type = DIR_TYPE_ROOT; + d.parent = nullptr; d.prow = -1; d.name = "root"; d.hash.clear() ; @@ -1078,12 +1085,13 @@ int p3FileDatabase::RequestDirDetails(void *ref, DirDetails& d, FileSearchFlags d.max_mtime = 0 ; if(flags & RS_FILE_HINTS_LOCAL) - { - void *p; + { + void *p = nullptr; - { - convertEntryIndexToPointer(0,0,p); // root of own directories - DirStub stub; + { + // root of own directories + convertEntryIndexToPointer(0, 0, p); + DirStub stub; stub.type = DIR_TYPE_PERSON; stub.name = mServCtrl->getOwnId().toStdString(); stub.ref = p; @@ -1092,9 +1100,11 @@ int p3FileDatabase::RequestDirDetails(void *ref, DirDetails& d, FileSearchFlags if(mExtraFiles->size() > 0) { - convertEntryIndexToPointer(0,1,p); // local shared files from extra list - DirStub stub; - stub.type = DIR_TYPE_PERSON; // not totally exact, but used as a trick. + // local shared files from extra list + convertEntryIndexToPointer(0, 1, p); + DirStub stub; + // not totally exact, but used as a trick. + stub.type = DIR_TYPE_PERSON; stub.name = "[Extra List]"; stub.ref = p; @@ -1127,18 +1137,19 @@ int p3FileDatabase::RequestDirDetails(void *ref, DirDetails& d, FileSearchFlags } uint32_t fi; - DirectoryStorage::EntryIndex e ; + DirectoryStorage::EntryIndex e; convertPointerToEntryIndex(ref,e,fi); - // check consistency - if( (fi == 0 && !(flags & RS_FILE_HINTS_LOCAL)) || (fi > 1 && (flags & RS_FILE_HINTS_LOCAL))) - { - P3FILELISTS_ERROR() << "(EE) remote request on local index or local request on remote index. This should not happen." << std::endl; - return false ; - } + // check consistency + if( (fi == 0 && !(flags & RS_FILE_HINTS_LOCAL)) || + (fi > 1 && (flags & RS_FILE_HINTS_LOCAL))) + { + RS_ERR("Remote request on local index or local request on remote index"); + return false; + } - if((flags & RS_FILE_HINTS_LOCAL) && fi == 1) // extra list + if((flags & RS_FILE_HINTS_LOCAL) && fi == 1) // extra list { getExtraFilesDirDetails(ref,e,d); @@ -1150,25 +1161,28 @@ int p3FileDatabase::RequestDirDetails(void *ref, DirDetails& d, FileSearchFlags } - DirectoryStorage *storage = (flags & RS_FILE_HINTS_LOCAL)? ((DirectoryStorage*)mLocalSharedDirs) : ((DirectoryStorage*)mRemoteDirectories[fi-1]); + DirectoryStorage* storage = + (flags & RS_FILE_HINTS_LOCAL) ? + ((DirectoryStorage*) mLocalSharedDirs) : + ((DirectoryStorage*) mRemoteDirectories[fi-1]); - // Case where the index is the top of a single person. Can be us, or a friend. + /* Case where the index is the top of a single person. + * Can be us, or a friend. */ + if(!storage || !storage->extractData(e,d)) + { + RS_WARN( "request on index; ", e, ", for directory ID:", + ( (!storage)? ("[NULL]") : (storage->peerId().toStdString()) ), + " failed" ); + return false; + } - if(storage==NULL || !storage->extractData(e,d)) - { -#ifdef DEBUG_FILE_HIERARCHY - P3FILELISTS_DEBUG() << "(WW) request on index " << e << ", for directory ID=" << ((storage==NULL)?("[NULL]"):(storage->peerId().toStdString())) << " failed. This should not happen." << std::endl; -#endif - return false ; - } + /* update indexes. This is a bit hacky, but does the job. The cast to + * intptr_t is the proper way to convert a pointer into an int. */ + convertEntryIndexToPointer((intptr_t)d.ref,fi,d.ref); - // update indexes. This is a bit hacky, but does the job. The cast to intptr_t is the proper way to convert - // a pointer into an int. - - convertEntryIndexToPointer((intptr_t)d.ref,fi,d.ref) ; - - for(uint32_t i=0;i((intptr_t)d.children[i].ref,fi,d.children[i].ref); + for(uint32_t i=0; i( + (intptr_t) d.children[i].ref, fi, d.children[i].ref ); if(e == 0) // root { @@ -1178,9 +1192,9 @@ int p3FileDatabase::RequestDirDetails(void *ref, DirDetails& d, FileSearchFlags else { if(d.parent == 0) // child of root node - d.prow = (flags & RS_FILE_HINTS_LOCAL)?0:(fi-1); + d.prow = (flags & RS_FILE_HINTS_LOCAL) ? 0 : (fi-1); else - d.prow = storage->parentRow(e) ; + d.prow = storage->parentRow(e); convertEntryIndexToPointer((intptr_t)d.parent,fi,d.parent) ; } @@ -1307,7 +1321,9 @@ uint32_t p3FileDatabase::watchPeriod() return mLocalDirWatcher->fileWatchPeriod(); } -int p3FileDatabase::SearchKeywords(const std::list& keywords, std::list& results,FileSearchFlags flags,const RsPeerId& client_peer_id) +int p3FileDatabase::SearchKeywords( + const std::list& keywords, std::list& results, + FileSearchFlags flags, const RsPeerId& client_peer_id ) { if(flags & RS_FILE_HINTS_LOCAL) { @@ -1319,15 +1335,15 @@ int p3FileDatabase::SearchKeywords(const std::list& keywords, std:: mLocalSharedDirs->searchTerms(keywords,firesults) ; - for(std::list::iterator it(firesults.begin());it!=firesults.end();++it) - { - void *p=NULL; - convertEntryIndexToPointer(*it,0,p); - pointers.push_back(p) ; - } + for(auto& it: std::as_const(firesults)) + { + void *p = nullptr; + convertEntryIndexToPointer(it, 0, p); + pointers.push_back(p); + } } - filterResults(pointers,results,flags,client_peer_id) ; + filterResults(pointers, results, flags, client_peer_id); } if(flags & RS_FILE_HINTS_REMOTE) @@ -1476,7 +1492,9 @@ bool p3FileDatabase::search( return false; } -int p3FileDatabase::filterResults(const std::list& firesults,std::list& results,FileSearchFlags flags,const RsPeerId& peer_id) const +int p3FileDatabase::filterResults( + const std::list& firesults, std::list& results, + FileSearchFlags flags, const RsPeerId& peer_id ) const { results.clear(); @@ -1484,29 +1502,33 @@ int p3FileDatabase::filterResults(const std::list& firesults,std::list::const_iterator rit(firesults.begin()); rit != firesults.end(); ++rit) - { - DirDetails cdetails ; + for(void* rit: std::as_const(firesults)) + { + DirDetails cdetails; - if(!RequestDirDetails (*rit,cdetails,RS_FILE_HINTS_LOCAL)) - { - P3FILELISTS_ERROR() << "(EE) Cannot get dir details for entry " << *rit << std::endl; - continue ; - } + if(!RequestDirDetails(rit, cdetails, RS_FILE_HINTS_LOCAL)) + { + RS_ERR("Cannot retrieve dir details for entry: ", rit); + print_stacktrace(); + continue ; + } + + RS_DBG( "Filtering candidate: ", rit, + ", name: ", cdetails.name, ", path: ", cdetails.path, + ", flags: ", cdetails.flags, ", peer: ", peer_id ); + + if(!peer_id.isNull()) + { + FileSearchFlags permission_flags = + rsPeers->computePeerPermissionFlags( + peer_id, cdetails.flags, cdetails.parent_groups ); + + if (cdetails.type == DIR_TYPE_FILE && ( permission_flags & flags )) + { + cdetails.id.clear(); + results.push_back(cdetails); #ifdef DEBUG_P3FILELISTS - P3FILELISTS_DEBUG() << "Filtering candidate " << *rit << ", flags=" << cdetails.flags << ", peer=" << peer_id ; -#endif - - if(!peer_id.isNull()) - { - FileSearchFlags permission_flags = rsPeers->computePeerPermissionFlags(peer_id,cdetails.flags,cdetails.parent_groups) ; - - if (cdetails.type == DIR_TYPE_FILE && ( permission_flags & flags )) - { - cdetails.id.clear() ; - results.push_back(cdetails); -#ifdef DEBUG_P3FILELISTS - std::cerr << ": kept" << std::endl ; + std::cerr << ": kept" << std::endl ; #endif } #ifdef DEBUG_P3FILELISTS @@ -1518,7 +1540,19 @@ int p3FileDatabase::filterResults(const std::list& firesults,std::listPeerId() << ". hash=" << item->entry_hash << ", flags=" << (void*)(intptr_t)item->flags << ", request id: " << std::hex << item->request_id << std::dec << ", last known TS: " << item->last_known_recurs_modf_TS << std::endl; -#endif + RS_DBG( "Received directory sync request from peer ", item->PeerId(), + ". hash=", item->entry_hash, ", flags=", item->flags, + ", request id: ", item->request_id, ", last known TS: ", + item->last_known_recurs_modf_TS ); - EntryIndex entry_index = DirectoryStorage::NO_INDEX; + EntryIndex entry_index = DirectoryStorage::NO_INDEX; + if(!mLocalSharedDirs->getIndexFromDirHash(item->entry_hash,entry_index)) + { + RS_DBG("Cannot find entry index for hash ", item->entry_hash, + " cannot respond to sync request." ); + return; + } - if(!mLocalSharedDirs->getIndexFromDirHash(item->entry_hash,entry_index)) - { -#ifdef DEBUG_P3FILELISTS - P3FILELISTS_DEBUG() << " (EE) Cannot find entry index for hash " << item->entry_hash << ": cannot respond to sync request." << std::endl; -#endif - return; - } + uint32_t entry_type = mLocalSharedDirs->getEntryType(entry_index); + ritem->PeerId(item->PeerId()); + ritem->request_id = item->request_id; + ritem->entry_hash = item->entry_hash; - uint32_t entry_type = mLocalSharedDirs->getEntryType(entry_index) ; - ritem->PeerId(item->PeerId()) ; - ritem->request_id = item->request_id; - ritem->entry_hash = item->entry_hash ; + std::list node_groups; + FileStorageFlags node_flags; - std::list node_groups; - FileStorageFlags node_flags; + if(entry_type != DIR_TYPE_DIR) + { + RS_DBG( "Directory does not exist anymore, or is not a directory, " + "or permission denied. Answering with proper flags." ); + ritem->flags = RsFileListsItem::FLAGS_SYNC_RESPONSE | + RsFileListsItem::FLAGS_ENTRY_WAS_REMOVED; + } + else if( entry_index != 0 && + (!mLocalSharedDirs->getFileSharingPermissions( + entry_index, node_flags,node_groups ) || + !(rsPeers->computePeerPermissionFlags( + item->PeerId(), node_flags, node_groups ) & + RS_FILE_HINTS_BROWSABLE)) ) + { + RS_ERR("cannot get file permissions for entry index: ", entry_index, + ", or permission denied." ); + ritem->flags = RsFileListsItem::FLAGS_SYNC_RESPONSE | + RsFileListsItem::FLAGS_ENTRY_WAS_REMOVED; + } + else + { + rstime_t local_recurs_max_time; + mLocalSharedDirs->getDirectoryRecursModTime( + entry_index, local_recurs_max_time ); - if(entry_type != DIR_TYPE_DIR) - { -#ifdef DEBUG_P3FILELISTS - P3FILELISTS_DEBUG() << " Directory does not exist anymore, or is not a directory, or permission denied. Answering with proper flags." << std::endl; -#endif - ritem->flags = RsFileListsItem::FLAGS_SYNC_RESPONSE | RsFileListsItem::FLAGS_ENTRY_WAS_REMOVED ; - } - else if(entry_index != 0 && (!mLocalSharedDirs->getFileSharingPermissions(entry_index,node_flags,node_groups) || !(rsPeers->computePeerPermissionFlags(item->PeerId(),node_flags,node_groups) & RS_FILE_HINTS_BROWSABLE))) - { - P3FILELISTS_ERROR() << "(EE) cannot get file permissions for entry index " << (void*)(intptr_t)entry_index << ", or permission denied." << std::endl; - ritem->flags = RsFileListsItem::FLAGS_SYNC_RESPONSE | RsFileListsItem::FLAGS_ENTRY_WAS_REMOVED ; - } - else - { - rstime_t local_recurs_max_time ; - mLocalSharedDirs->getDirectoryRecursModTime(entry_index,local_recurs_max_time) ; + /* normally, should be "<", but since we provided the TS it should + * be equal, so != is more robust. */ + if(item->last_known_recurs_modf_TS != local_recurs_max_time) + { + RS_DBG( "Directory is more recent than what the friend knows. " + "Sending full dir content as response."); - if(item->last_known_recurs_modf_TS != local_recurs_max_time) // normally, should be "<", but since we provided the TS it should be equal, so != is more robust. - { -#ifdef DEBUG_P3FILELISTS - P3FILELISTS_DEBUG() << " Directory is more recent than what the friend knows. Sending full dir content as response." << std::endl; -#endif + ritem->flags = RsFileListsItem::FLAGS_SYNC_RESPONSE | + RsFileListsItem::FLAGS_SYNC_DIR_CONTENT; + ritem->last_known_recurs_modf_TS = local_recurs_max_time; - ritem->flags = RsFileListsItem::FLAGS_SYNC_RESPONSE | RsFileListsItem::FLAGS_SYNC_DIR_CONTENT; - ritem->last_known_recurs_modf_TS = local_recurs_max_time; + /* We supply the peer id, in order to possibly remove some + * subdirs, if entries are not allowed to be seen by this peer. + */ + mLocalSharedDirs->serialiseDirEntry( + entry_index, ritem->directory_content_data, + item->PeerId() ); + } + else + { + RS_DBG3( "Directory is up to date w.r.t. what the friend knows." + " Sending ACK." ); - // We supply the peer id, in order to possibly remove some subdirs, if entries are not allowed to be seen by this peer. - mLocalSharedDirs->serialiseDirEntry(entry_index,ritem->directory_content_data,item->PeerId()) ; - } - else - { -#ifdef DEBUG_P3FILELISTS - P3FILELISTS_DEBUG() << " Directory is up to date w.r.t. what the friend knows. Sending ACK." << std::endl; -#endif + ritem->flags = RsFileListsItem::FLAGS_SYNC_RESPONSE | + RsFileListsItem::FLAGS_ENTRY_UP_TO_DATE; + ritem->last_known_recurs_modf_TS = local_recurs_max_time; + } + } + } - ritem->flags = RsFileListsItem::FLAGS_SYNC_RESPONSE | RsFileListsItem::FLAGS_ENTRY_UP_TO_DATE ; - ritem->last_known_recurs_modf_TS = local_recurs_max_time ; - } - } - } - - // sends the response. - - splitAndSendItem(ritem) ; + // sends the response. + splitAndSendItem(ritem); } void p3FileDatabase::splitAndSendItem(RsFileListsSyncResponseItem *ritem) diff --git a/libretroshare/src/ft/ftcontroller.cc b/libretroshare/src/ft/ftcontroller.cc index 29494f189..b43139911 100644 --- a/libretroshare/src/ft/ftcontroller.cc +++ b/libretroshare/src/ft/ftcontroller.cc @@ -735,8 +735,7 @@ bool ftController::completeFile(const RsFileHash& hash) RsDirUtil::splitDirFromFile(fc->mDestination,dst_dir,dst_file) ; // We use this intermediate file in case the destination directory is not available, so as to not keep the partial file name. - - std::string intermediate_file_name = src_dir+'/'+dst_file ; + std::string intermediate_file_name = RsDirUtil::makePath(src_dir, dst_file); // I don't know how the size can be zero, but believe me, this happens, // and it causes an error on linux because then the file may not even exist. @@ -1542,6 +1541,11 @@ std::string ftController::getPartialsDirectory() return mPartialsPath; } +bool ftController::FileServerCancel(const RsFileHash& hash) +{ + RsStackMutex stack(ctrlMutex); /******* LOCKED ********/ + return mDataplex->deleteServer(hash); +} bool ftController::setDestinationDirectory(const RsFileHash& hash,const std::string& dest_dir) { RsStackMutex stack(ctrlMutex); /******* LOCKED ********/ diff --git a/libretroshare/src/ft/ftcontroller.h b/libretroshare/src/ft/ftcontroller.h index e890a83d6..854a3e3a1 100644 --- a/libretroshare/src/ft/ftcontroller.h +++ b/libretroshare/src/ft/ftcontroller.h @@ -157,6 +157,7 @@ public: bool getFileDownloadChunksDetails(const RsFileHash& hash,FileChunksInfo& info); bool setDestinationName(const RsFileHash& hash,const std::string& dest_name) ; bool setDestinationDirectory(const RsFileHash& hash,const std::string& dest_name) ; + bool FileServerCancel(const RsFileHash& hash); // Download speed bool getPriority(const RsFileHash& hash,DwlSpeed& p); diff --git a/libretroshare/src/ft/ftdatamultiplex.cc b/libretroshare/src/ft/ftdatamultiplex.cc index de8f1261c..f4b63be8b 100644 --- a/libretroshare/src/ft/ftdatamultiplex.cc +++ b/libretroshare/src/ft/ftdatamultiplex.cc @@ -1039,6 +1039,23 @@ void ftDataMultiplex::handlePendingCrcRequests() } } +bool ftDataMultiplex::deleteServer(const RsFileHash& hash) +{ + RsStackMutex stack(dataMtx); /******* LOCK MUTEX ******/ + + auto sit = mServers.find(hash); + + if(sit == mServers.end()) + return false; + + // We don't delete servers that are clients at the same time ! + if(dynamic_cast(sit->second) == NULL) + delete sit->second; + + mServers.erase(sit); + return true; +} + void ftDataMultiplex::deleteUnusedServers() { RsStackMutex stack(dataMtx); /******* LOCK MUTEX ******/ diff --git a/libretroshare/src/ft/ftdatamultiplex.h b/libretroshare/src/ft/ftdatamultiplex.h index 019940b63..6b15e7617 100644 --- a/libretroshare/src/ft/ftdatamultiplex.h +++ b/libretroshare/src/ft/ftdatamultiplex.h @@ -112,9 +112,9 @@ class ftDataMultiplex: public ftDataRecv, public RsQueueThread bool FileDownloads(std::list &hashs); bool FileDetails(const RsFileHash &hash, FileSearchFlags hintsflag, FileInfo &info); - void deleteUnusedServers() ; - void handlePendingCrcRequests() ; - + void deleteUnusedServers() ; + bool deleteServer(const RsFileHash& hash); // deletes FtServers for the given hash. Used when removing an extra file from shares. + void handlePendingCrcRequests() ; /*************** SEND INTERFACE (calls ftDataSend) *******************/ diff --git a/libretroshare/src/ft/ftserver.cc b/libretroshare/src/ft/ftserver.cc index 07a400acf..bf745e9e8 100644 --- a/libretroshare/src/ft/ftserver.cc +++ b/libretroshare/src/ft/ftserver.cc @@ -3,7 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2008 by Robert Fernie * + * Copyright (C) 2008 Robert Fernie * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -817,7 +819,10 @@ bool ftServer::ExtraFileAdd(std::string fname, const RsFileHash& hash, uint64_t } bool ftServer::ExtraFileRemove(const RsFileHash& hash) -{ return mFileDatabase->removeExtraFile(hash); } +{ + mFtController->FileServerCancel(hash); + return mFileDatabase->removeExtraFile(hash); +} bool ftServer::ExtraFileHash( std::string localpath, rstime_t period, TransferRequestFlags flags ) { @@ -873,9 +878,11 @@ int ftServer::SearchKeywords(std::list keywords, std::listSearchKeywords(keywords, results,flags,RsPeerId()); } -int ftServer::SearchKeywords(std::list keywords, std::list &results,FileSearchFlags flags,const RsPeerId& peer_id) +int ftServer::SearchKeywords( + std::list keywords, std::list &results, + FileSearchFlags flags, const RsPeerId& peer_id ) { - return mFileDatabase->SearchKeywords(keywords, results,flags,peer_id); + return mFileDatabase->SearchKeywords(keywords, results, flags, peer_id); } int ftServer::SearchBoolExp(RsRegularExpression::Expression * exp, std::list &results,FileSearchFlags flags) @@ -2030,7 +2037,7 @@ bool ftServer::receiveSearchRequest( std::vector dRes; DeepFilesIndex dfi(DeepFilesIndex::dbDefaultPath()); - if(dfi.search(searchReq.queryString, dRes, maxAllowsHits) > 0) + if(!dfi.search(searchReq.queryString, dRes, maxAllowsHits)) { RsFileSearchResultItem resIt; diff --git a/libretroshare/src/gxs/rsgenexchange.cc b/libretroshare/src/gxs/rsgenexchange.cc index 5ddb0be26..da8973eb1 100644 --- a/libretroshare/src/gxs/rsgenexchange.cc +++ b/libretroshare/src/gxs/rsgenexchange.cc @@ -4,7 +4,8 @@ * libretroshare: retroshare core library * * * * Copyright (C) 2012 Christopher Evi-Parker * - * Copyright (C) 2019 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -193,47 +194,6 @@ RsGenExchange::RsGenExchange( VALIDATE_MAX_WAITING_TIME(60) { mDataAccess = new RsGxsDataAccess(gds); - - // Perform an early checking/cleaning of the db. Will eliminate groups and messages that do not match their hash - -#ifdef RS_DEEP_CHANNEL_INDEX - // This code is only called because it of deep indexing in channels. But loading - // the entire set of messages in order to provide indexing is pretty bad (very costly and slowly - // eats memory, as many tests have shown. Not because of leaks, but because new threads are - // apparently attributed large stacks and pages of memory are not regained by the system maybe because it thinks - // that RS will use them again. - // - // * the deep check should be implemented differently, in an incremental way. For instance in notifyChanges() of each - // service (e.g. channels here) should update the index when a new message is received. The question to how old messages - // are processed is open. I believe that they shouldn't. New users will progressively process them. - // - // * integrity check (re-hashing of message data) is not needed. Message signature already ensures that all messages received are - // unalterated. The only problem (possibly very rare) is that a message is locally corrupted and not deleted (because of no check). - // It will therefore never be replaced by the correct one from friends. The cost of re-hashing the whole db data regularly - // doesn't counterbalance such a low risk. - // - if(mServType == RS_SERVICE_GXS_TYPE_CHANNELS) - { - std::vector grpsToDel; - GxsMsgReq msgsToDel; - - RsGxsSinglePassIntegrityCheck::check(mServType,mGixs,mDataStore, - this, *mSerialiser, - grpsToDel,msgsToDel); - - for(auto& grpId: grpsToDel) - { - uint32_t token2=0; - deleteGroup(token2,grpId); - } - - if(!msgsToDel.empty()) - { - uint32_t token1=0; - deleteMsgs(token1,msgsToDel); - } - } -#endif } void RsGenExchange::setNetworkExchangeService(RsNetworkExchangeService *ns) @@ -362,12 +322,12 @@ void RsGenExchange::tick() { mIntegrityCheck = new RsGxsIntegrityCheck( mDataStore, this, *mSerialiser, mGixs); - mIntegrityCheck->start("gxs integrity"); - mChecking = true; + std::string thisName = typeid(*this).name(); + mChecking = mIntegrityCheck->start("gxs IC4 "+thisName); } } - if(mIntegrityCheck->isDone()) + if(mIntegrityCheck->isDone() || !mChecking) { std::vector grpIds; GxsMsgReq msgIds; @@ -2717,10 +2677,15 @@ void RsGenExchange::processMessageDelete() msgDeleted.push_back(note.msgIds); } - for(const auto& msgreq:msgDeleted) - for(const auto& msgit:msgreq) - for(const auto& msg:msgit.second) - mNotifications.push_back(new RsGxsMsgChange(RsGxsNotify::TYPE_MESSAGE_DELETED,msgit.first,msg, false)); + /* Three nested for looks like a performance bomb, but as Cyril says here + * https://github.com/RetroShare/RetroShare/pull/2218#pullrequestreview-565194022 + * this should actually not explode at all because it is just one message at + * time that get notified */ + for(const auto& msd : mMsgDeletePublish) + for(auto& msgMap : msd.mMsgs) + for(auto& msgId : msgMap.second) + mNotifications.push_back( + new RsGxsMsgDeletedChange(msgMap.first, msgId) ); mMsgDeletePublish.clear(); } diff --git a/libretroshare/src/gxs/rsgxsnetservice.cc b/libretroshare/src/gxs/rsgxsnetservice.cc index e1b70a670..e664b580c 100644 --- a/libretroshare/src/gxs/rsgxsnetservice.cc +++ b/libretroshare/src/gxs/rsgxsnetservice.cc @@ -3,7 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2012-2012 by Christopher Evi-Parker * + * Copyright (C) 2012 Christopher Evi-Parker * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -5204,13 +5206,14 @@ TurtleRequestId RsGxsNetService::turtleSearchRequest(const std::string& match_st return mGxsNetTunnel->turtleSearchRequest(match_string,this) ; } -#ifndef RS_DEEP_CHANNEL_INDEX static bool termSearch(const std::string& src, const std::string& substring) { - /* always ignore case */ - return src.end() != std::search( src.begin(), src.end(), substring.begin(), substring.end(), RsRegularExpression::CompareCharIC() ); + /* always ignore case */ + return src.end() != std::search( + src.begin(), src.end(), substring.begin(), substring.end(), + RsRegularExpression::CompareCharIC() ); } -#endif // ndef RS_DEEP_CHANNEL_INDEX + bool RsGxsNetService::retrieveDistantSearchResults(TurtleRequestId req,std::map& group_infos) { @@ -5246,7 +5249,8 @@ bool RsGxsNetService::clearDistantSearchResults(const TurtleRequestId& id) return true ; } -void RsGxsNetService::receiveTurtleSearchResults( TurtleRequestId req, const std::list& group_infos ) +void RsGxsNetService::receiveTurtleSearchResults( + TurtleRequestId req, const std::list& group_infos ) { std::set groupsToNotifyResults; @@ -5276,26 +5280,20 @@ void RsGxsNetService::receiveTurtleSearchResults( TurtleRequestId req, const std for (const RsGxsGroupSummary& gps : group_infos) { -#ifndef RS_DEEP_CHANNEL_INDEX +#ifdef TO_REMOVE + /* Because of deep search is enabled search results may bring more + * info then we already have also about post that are indexed by + * xapian, so we don't apply this filter anymore. */ + /* Only keep groups that are not locally known, and groups that are * not already in the mDistantSearchResults structure. - * mDataStore may in some situations allocate an empty group meta data, so it's important - * to test that the group meta is both non null and actually corresponds to the group id we seek. */ + * mDataStore may in some situations allocate an empty group meta + * data, so it's important to test that the group meta is both non + * null and actually corresponds to the group id we seek. */ + auto& meta(grpMeta[gps.mGroupId]); + if(meta != nullptr && meta->mGroupId == gps.mGroupId) continue; +#endif // def TO_REMOVE - auto& meta(grpMeta[gps.mGroupId]); - - if(meta != nullptr && meta->mGroupId == gps.mGroupId) - continue; - -#ifdef NXS_NET_DEBUG_9 - std::cerr << " group " << gps.mGroupId << " is not known. Adding it to search results..." << std::endl; -#endif - -#else // ndef RS_DEEP_CHANNEL_INDEX - /* When deep search is enabled search results may bring more info - * then we already have also about post that are indexed by xapian, - * so we don't apply this filter in this case. */ -#endif const RsGxsGroupId& grpId(gps.mGroupId); groupsToNotifyResults.insert(grpId); @@ -5332,18 +5330,19 @@ void RsGxsNetService::receiveTurtleSearchResults( TurtleRequestId req, const std mObserver->receiveDistantSearchResults(req, grpId); } -void RsGxsNetService::receiveTurtleSearchResults(TurtleRequestId req,const unsigned char *encrypted_group_data,uint32_t encrypted_group_data_len) +void RsGxsNetService::receiveTurtleSearchResults( + TurtleRequestId req, + const uint8_t* encrypted_group_data, uint32_t encrypted_group_data_len ) { #ifdef NXS_NET_DEBUG_8 GXSNETDEBUG___ << " received encrypted group data for turtle search request " << std::hex << req << std::dec << ": " << RsUtil::BinToHex(encrypted_group_data,encrypted_group_data_len,50) << std::endl; #endif - auto it = mSearchRequests.find(req); - - if(mSearchRequests.end() == it) - { - std::cerr << "(EE) received search results for unknown request " << std::hex << req << std::dec ; - return; - } + auto it = mSearchRequests.find(req); + if(mSearchRequests.end() == it) + { + RS_WARN("Received search results for unknown request: ", req); + return; + } RsGxsGroupId grpId = it->second; uint8_t encryption_master_key[32]; @@ -5417,56 +5416,42 @@ void RsGxsNetService::receiveTurtleSearchResults(TurtleRequestId req,const unsig mObserver->receiveDistantSearchResults(req, grpId); } +std::error_condition RsGxsNetService::distantSearchRequest( + rs_owner_ptr searchData, uint32_t dataSize, + RsServiceType serviceType, TurtleRequestId& requestId ) +{ + if(!mGxsNetTunnel) + { + free(searchData); + return std::errc::function_not_supported; + } + + return mGxsNetTunnel->turtleSearchRequest( + searchData, dataSize, serviceType, requestId ); +} + +std::error_condition RsGxsNetService::handleDistantSearchRequest( + rs_view_ptr requestData, uint32_t requestSize, + rs_owner_ptr& resultData, uint32_t& resultSize ) +{ + RS_DBG(""); + return mObserver->handleDistantSearchRequest( + requestData, requestSize, resultData, resultSize ); +} + +std::error_condition RsGxsNetService::receiveDistantSearchResult( + const TurtleRequestId requestId, + rs_owner_ptr& resultData, uint32_t& resultSize ) +{ + return mObserver->receiveDistantSearchResult( + requestId, resultData, resultSize ); +} + bool RsGxsNetService::search( const std::string& substring, std::list& group_infos ) { group_infos.clear(); -#ifdef RS_DEEP_CHANNEL_INDEX - -#warning TODO: filter deep index search result to non circle-restricted groups. -// /!\ -// /!\ These results should be filtered to only return results coming from a non restricted group! -// /!\ - - std::vector results; - DeepChannelsIndex::search(substring, results); - - for(auto dsr : results) - { - RsUrl rUrl(dsr.mUrl); - const auto& uQ(rUrl.query()); - auto rit = uQ.find("id"); - if(rit != rUrl.query().end()) - { - RsGroupNetworkStats stats; - RsGxsGroupId grpId(rit->second); - if( !grpId.isNull() && getGroupNetworkStats(grpId, stats) ) - { - RsGxsGroupSummary s; - - s.mGroupId = grpId; - - if((rit = uQ.find("name")) != uQ.end()) - s.mGroupName = rit->second; - if((rit = uQ.find("signFlags")) != uQ.end()) - s.mSignFlags = static_cast(std::stoul(rit->second)); - if((rit = uQ.find("publishTs")) != uQ.end()) - s.mPublishTs = static_cast(std::stoll(rit->second)); - if((rit = uQ.find("authorId")) != uQ.end()) - s.mAuthorId = RsGxsId(rit->second); - - s.mSearchContext = dsr.mSnippet; - - s.mNumberOfMessages = stats.mMaxVisibleCount; - s.mLastMessageTs = stats.mLastGroupModificationTS; - s.mPopularity = stats.mSuppliers; - - group_infos.push_back(s); - } - } - } -#else // RS_DEEP_CHANNEL_INDEX RsGxsGrpMetaTemporaryMap grpMetaMap; { RS_STACK_MUTEX(mNxsMutex) ; @@ -5492,12 +5477,11 @@ bool RsGxsNetService::search( const std::string& substring, group_infos.push_back(s); } -#endif // RS_DEEP_CHANNEL_INDEX #ifdef NXS_NET_DEBUG_8 GXSNETDEBUG___ << " performing local substring search in response to distant request. Found " << group_infos.size() << " responses." << std::endl; #endif - return !group_infos.empty(); + return !group_infos.empty(); } bool RsGxsNetService::search(const Sha1CheckSum& hashed_group_id,unsigned char *& encrypted_group_data,uint32_t& encrypted_group_data_len) diff --git a/libretroshare/src/gxs/rsgxsnetservice.h b/libretroshare/src/gxs/rsgxsnetservice.h index 295b8232a..a4b448003 100644 --- a/libretroshare/src/gxs/rsgxsnetservice.h +++ b/libretroshare/src/gxs/rsgxsnetservice.h @@ -3,7 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2012-2012 by Christopher Evi-Parker * + * Copyright (C) 2012 Christopher Evi-Parker * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -19,8 +21,7 @@ * along with this program. If not, see . * * * *******************************************************************************/ -#ifndef RSGXSNETSERVICE_H -#define RSGXSNETSERVICE_H +#pragma once #include #include @@ -130,18 +131,53 @@ public: virtual bool msgAutoSync() const override { return mAllowMsgSync; } virtual bool grpAutoSync() const override { return mGrpAutoSync; } - /*! - * \brief Search methods. - * These four methods are used to request distant search and receive the results. - * \param group_id - */ - virtual TurtleRequestId turtleGroupRequest(const RsGxsGroupId& group_id)override ; - virtual TurtleRequestId turtleSearchRequest(const std::string& match_string)override ; - virtual bool search(const std::string& substring,std::list& group_infos) override ; + /// @see RsNetworkExchangeService + std::error_condition distantSearchRequest( + rs_owner_ptr searchData, uint32_t dataSize, + RsServiceType serviceType, TurtleRequestId& requestId ) override; + + /// @see RsNetworkExchangeService + std::error_condition handleDistantSearchRequest( + rs_view_ptr requestData, uint32_t requestSize, + rs_owner_ptr& resultData, uint32_t& resultSize ) override; + + /// @see RsNetworkExchangeService + std::error_condition receiveDistantSearchResult( + const TurtleRequestId requestId, + rs_owner_ptr& resultData, uint32_t& resultSize ) override; + + /** Request group data via turtle search + * @param group_id */ + TurtleRequestId turtleGroupRequest(const RsGxsGroupId& group_id) override; + + /** + * @brief Search for matching groups names over turtle search. + * @deprecated this method is kept mostly for retrocompatibility with older + * peers, newly implemented search functions should instead be based on the + * service generic search. + * @see RsNetworkExchangeService + */ + RS_DEPRECATED_FOR(distantSearchRequest) + TurtleRequestId turtleSearchRequest(const std::string& match_string) override; + + /** @see RsNetworkExchangeService + * @deprecated kept for retrocompatibility with older peers, new code should + * instead be based on the service generic search */ + RS_DEPRECATED_FOR(receiveDistantSearchResult) + void receiveTurtleSearchResults( + TurtleRequestId req, + const uint8_t* encrypted_group_data, + uint32_t encrypted_group_data_len ) override; + + /** + * @deprecated kept for retrocompatibility with older peers, new code should + * instead be based on the service generic search */ + RS_DEPRECATED_FOR(handleRemoteSearchRequest) + virtual bool search( const std::string& substring, + std::list& group_infos) override; virtual bool search(const Sha1CheckSum& hashed_group_id,unsigned char *& encrypted_group_data,uint32_t& encrypted_group_data_len)override ; virtual void receiveTurtleSearchResults(TurtleRequestId req,const std::list& group_infos)override ; - virtual void receiveTurtleSearchResults(TurtleRequestId req,const unsigned char *encrypted_group_data,uint32_t encrypted_group_data_len)override ; virtual bool retrieveDistantSearchResults(TurtleRequestId req, std::map &group_infos)override ; virtual bool clearDistantSearchResults(const TurtleRequestId& id)override ; @@ -629,5 +665,3 @@ private: bool mUseMetaCache; }; - -#endif // RSGXSNETSERVICE_H diff --git a/libretroshare/src/gxs/rsgxsnettunnel.cc b/libretroshare/src/gxs/rsgxsnettunnel.cc index 9b7a3089a..7f70ffa42 100644 --- a/libretroshare/src/gxs/rsgxsnettunnel.cc +++ b/libretroshare/src/gxs/rsgxsnettunnel.cc @@ -3,7 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2018 by Cyril Soler * + * Copyright (C) 2018 Cyril Soler * + * Copyright (C) 2019-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -27,6 +29,8 @@ #include "gxs/rsnxs.h" #include "rsgxsnettunnel.h" +/*extern*/ RsGxsDistSync* rsGxsDistSync = nullptr; + //#define DEBUG_RSGXSNETTUNNEL 1 #define GXS_NET_TUNNEL_NOT_IMPLEMENTED() { std::cerr << __PRETTY_FUNCTION__ << ": not yet implemented." << std::endl; } @@ -36,42 +40,93 @@ static const uint32_t RS_GXS_NET_TUNNEL_MAX_ALLOWED_HITS_GROUP_DATA = 1; static const uint32_t RS_GXS_NET_TUNNEL_MAX_ALLOWED_HITS_GROUP_SEARCH = 100; -RsGxsDistSync *rsGxsDistSync = NULL; RsGxsNetTunnelService::RsGxsNetTunnelService(): mGxsNetTunnelMtx("GxsNetTunnel") { mRandomBias.clear(); - mLastKeepAlive = time(NULL) + (RSRandom::random_u32()%20); // adds some variance in order to avoid doing all this tasks at once across services - mLastAutoWash = time(NULL) + (RSRandom::random_u32()%20); - mLastDump = time(NULL) + (RSRandom::random_u32()%20); + /* adds some variance in order to avoid doing all this tasks at once across + * services */ + auto now = time(nullptr); + mLastKeepAlive = now + (RsRandom::random_u32()%20); + mLastAutoWash = now + (RsRandom::random_u32()%20); + mLastDump = now + (RsRandom::random_u32()%20); } -//===========================================================================================================================================// -// Transport Items // -//===========================================================================================================================================// +//============================================================================// +// Transport Items // +//============================================================================// -const uint16_t RS_SERVICE_TYPE_GXS_NET_TUNNEL = 0x2233 ; +enum class RsGxsNetTunnelItemSubtypes : uint8_t +{ + VIRTUAL_PEER = 0x01, + KEEP_ALIVE = 0x02, + + RANDOM_BIAS = 0x03, + + /// @deprecated kept only for retrocompatibility @see SERVICE_SEARCH_REQUEST + SEARCH_SUBSTRING = 0x04, + + SEARCH_GROUP_REQUEST = 0x05, + + // SEARCH_GROUP_SUMMARY = 0x06, removed + + SEARCH_GROUP_DATA = 0x07, + + /// @deprecated kept only for retrocompatibility @see SERVICE_SEARCH_REPLY + SEARCH_GROUP_SUMMARY = 0x08, + + /** Generic search request generated and handled by specific service + * (channels, forums...) */ + SERVICE_SEARCH_REQUEST = 0x09, + + /** Generic search reply generated and handled by specific service + * (channels, forums...) */ + SERVICE_SEARCH_REPLY = 0x0a +}; + +RS_DEPRECATED_FOR(RsServiceType::GXS_DISTANT) +constexpr uint16_t RS_SERVICE_TYPE_GXS_NET_TUNNEL = + static_cast(RsServiceType::GXS_DISTANT); + +RS_DEPRECATED_FOR(RsGxsNetTunnelItemSubtypes) const uint8_t RS_PKT_SUBTYPE_GXS_NET_TUNNEL_VIRTUAL_PEER = 0x01 ; +RS_DEPRECATED_FOR(RsGxsNetTunnelItemSubtypes) const uint8_t RS_PKT_SUBTYPE_GXS_NET_TUNNEL_KEEP_ALIVE = 0x02 ; +RS_DEPRECATED_FOR(RsGxsNetTunnelItemSubtypes) const uint8_t RS_PKT_SUBTYPE_GXS_NET_TUNNEL_RANDOM_BIAS = 0x03 ; +RS_DEPRECATED_FOR(RsGxsNetTunnelItemSubtypes) const uint8_t RS_PKT_SUBTYPE_GXS_NET_TUNNEL_TURTLE_SEARCH_SUBSTRING = 0x04 ; +RS_DEPRECATED_FOR(RsGxsNetTunnelItemSubtypes) const uint8_t RS_PKT_SUBTYPE_GXS_NET_TUNNEL_TURTLE_SEARCH_GROUP_REQUEST = 0x05 ; -// const uint8_t RS_PKT_SUBTYPE_GXS_NET_TUNNEL_TURTLE_SEARCH_GROUP_SUMMARY = 0x06; // DEPRECATED +RS_DEPRECATED_FOR(RsGxsNetTunnelItemSubtypes) const uint8_t RS_PKT_SUBTYPE_GXS_NET_TUNNEL_TURTLE_SEARCH_GROUP_DATA = 0x07 ; +RS_DEPRECATED_FOR(RsGxsNetTunnelItemSubtypes) const uint8_t RS_PKT_SUBTYPE_GXS_NET_TUNNEL_TURTLE_SEARCH_GROUP_SUMMARY = 0x08; +// Do not add new subitems types as const, use RsGxsNetTunnelItemSubtypes instead -class RsGxsNetTunnelItem: public RsItem +struct RsGxsNetTunnelItem: RsItem { public: - explicit RsGxsNetTunnelItem(uint8_t item_subtype) : RsItem(RS_PKT_VERSION_SERVICE,RS_SERVICE_TYPE_GXS_NET_TUNNEL,item_subtype) + explicit RsGxsNetTunnelItem(RsGxsNetTunnelItemSubtypes subtype): + RsItem( RS_PKT_VERSION_SERVICE, RS_SERVICE_TYPE_GXS_NET_TUNNEL, + static_cast(subtype) ) + { + /* no priority. All items are encapsulated into generic Turtle items + * anyway. */ + } + + virtual ~RsGxsNetTunnelItem() = default; + virtual void clear() {} + + RS_DEPRECATED_FOR("RsGxsNetTunnelItem(RsGxsNetTunnelItemSubtypes subtype)") + explicit RsGxsNetTunnelItem(uint8_t item_subtype): + RsItem( RS_PKT_VERSION_SERVICE, RS_SERVICE_TYPE_GXS_NET_TUNNEL, + item_subtype ) { // no priority. All items are encapsulated into generic Turtle items anyway. } - - virtual ~RsGxsNetTunnelItem() {} - virtual void clear() {} }; class RsGxsNetTunnelVirtualPeerItem: public RsGxsNetTunnelItem @@ -113,7 +168,86 @@ public: Bias20Bytes mRandomBias; // Cannot be a simple char[] because of serialization. }; -class RsGxsNetTunnelTurtleSearchSubstringItem: public RsGxsNetTunnelItem +struct RsGxsServiceTurtleSearchReqItem: RsGxsNetTunnelItem +{ + RsGxsServiceTurtleSearchReqItem(): + RsGxsNetTunnelItem(RsGxsNetTunnelItemSubtypes::SERVICE_SEARCH_REQUEST), + mServiceType(RsServiceType::NONE), mSearchData(nullptr), + mSearchDataSize(0) {} + + explicit RsGxsServiceTurtleSearchReqItem(RsServiceType service): + RsGxsNetTunnelItem(RsGxsNetTunnelItemSubtypes::SERVICE_SEARCH_REQUEST), + mServiceType(service), mSearchData(nullptr), mSearchDataSize(0) {} + + /// Type of the service which originated the search request + RsServiceType mServiceType; + + uint8_t* mSearchData; /// Service search request data + uint32_t mSearchDataSize; /// Search data size + + /// @see RsSerializable + void serial_process( + RsGenericSerializer::SerializeJob j, + RsGenericSerializer::SerializeContext& ctx ) override + { + RS_SERIAL_PROCESS(mServiceType); + + RsTypeSerializer::RawMemoryWrapper prox(mSearchData, mSearchDataSize); + RsTypeSerializer::serial_process(j, ctx, prox, "mSearchData"); + } + + /// @see RsItem + void clear() override + { + free(mSearchData); + mSearchData = nullptr; + mSearchDataSize = 0; + } + + ~RsGxsServiceTurtleSearchReqItem() override { clear(); } +}; + +struct RsGxsServiceTurtleSearchReplyItem: RsGxsNetTunnelItem +{ + RsGxsServiceTurtleSearchReplyItem(): + RsGxsNetTunnelItem(RsGxsNetTunnelItemSubtypes::SERVICE_SEARCH_REPLY), + mServiceType(RsServiceType::NONE), mReplyData(nullptr), + mReplyDataSize(0) {} + + explicit RsGxsServiceTurtleSearchReplyItem(RsServiceType service): + RsGxsNetTunnelItem(RsGxsNetTunnelItemSubtypes::SERVICE_SEARCH_REPLY), + mServiceType(service), mReplyData(nullptr), mReplyDataSize(0) {} + + /// Type of the service which originated the search request + RsServiceType mServiceType; + + uint8_t* mReplyData; /// Service search reply data + uint32_t mReplyDataSize; /// Search reply data size + + /// @see RsSerializable + void serial_process( + RsGenericSerializer::SerializeJob j, + RsGenericSerializer::SerializeContext& ctx ) override + { + RS_SERIAL_PROCESS(mServiceType); + + RsTypeSerializer::RawMemoryWrapper prox(mReplyData, mReplyDataSize); + RsTypeSerializer::serial_process(j, ctx, prox, "mSearchData"); + } + + /// @see RsItem + void clear() override + { + free(mReplyData); + mReplyData = nullptr; + mReplyDataSize = 0; + } + + ~RsGxsServiceTurtleSearchReplyItem() override { clear(); } +}; + +class RS_DEPRECATED_FOR(RsGxsServiceTurtleSearchItem) +RsGxsNetTunnelTurtleSearchSubstringItem: public RsGxsNetTunnelItem { public: explicit RsGxsNetTunnelTurtleSearchSubstringItem(): RsGxsNetTunnelItem(RS_PKT_SUBTYPE_GXS_NET_TUNNEL_TURTLE_SEARCH_SUBSTRING) {} @@ -164,6 +298,7 @@ public: RsTypeSerializer::serial_process(j,ctx,group_infos,"group_infos") ; } }; + class RsGxsNetTunnelTurtleSearchGroupDataItem: public RsGxsNetTunnelItem { public: @@ -193,28 +328,41 @@ public: class RsGxsNetTunnelSerializer: public RsServiceSerializer { public: - RsGxsNetTunnelSerializer() :RsServiceSerializer(RS_SERVICE_TYPE_GXS_NET_TUNNEL) {} + RsGxsNetTunnelSerializer(): + RsServiceSerializer(RS_SERVICE_TYPE_GXS_NET_TUNNEL) {} virtual RsItem *create_item(uint16_t service,uint8_t item_subtype) const { if(service != RS_SERVICE_TYPE_GXS_NET_TUNNEL) { - GXS_NET_TUNNEL_ERROR() << "received item with wrong service ID " << std::hex << service << std::dec << std::endl; - return NULL ; + RS_ERR( "received item with wrong service ID ", service); + print_stacktrace(); + return nullptr; } - switch(item_subtype) + switch(static_cast(item_subtype)) { - case RS_PKT_SUBTYPE_GXS_NET_TUNNEL_VIRTUAL_PEER : return new RsGxsNetTunnelVirtualPeerItem ; - case RS_PKT_SUBTYPE_GXS_NET_TUNNEL_KEEP_ALIVE : return new RsGxsNetTunnelKeepAliveItem ; - case RS_PKT_SUBTYPE_GXS_NET_TUNNEL_RANDOM_BIAS : return new RsGxsNetTunnelRandomBiasItem ; - case RS_PKT_SUBTYPE_GXS_NET_TUNNEL_TURTLE_SEARCH_SUBSTRING : return new RsGxsNetTunnelTurtleSearchSubstringItem; - case RS_PKT_SUBTYPE_GXS_NET_TUNNEL_TURTLE_SEARCH_GROUP_REQUEST : return new RsGxsNetTunnelTurtleSearchGroupRequestItem; - case RS_PKT_SUBTYPE_GXS_NET_TUNNEL_TURTLE_SEARCH_GROUP_SUMMARY : return new RsGxsNetTunnelTurtleSearchGroupSummaryItem; - case RS_PKT_SUBTYPE_GXS_NET_TUNNEL_TURTLE_SEARCH_GROUP_DATA : return new RsGxsNetTunnelTurtleSearchGroupDataItem; + case RsGxsNetTunnelItemSubtypes::VIRTUAL_PEER: + return new RsGxsNetTunnelVirtualPeerItem; + case RsGxsNetTunnelItemSubtypes::KEEP_ALIVE: + return new RsGxsNetTunnelKeepAliveItem; + case RsGxsNetTunnelItemSubtypes::RANDOM_BIAS: + return new RsGxsNetTunnelRandomBiasItem; + case RsGxsNetTunnelItemSubtypes::SEARCH_SUBSTRING: + return new RsGxsNetTunnelTurtleSearchSubstringItem; + case RsGxsNetTunnelItemSubtypes::SEARCH_GROUP_REQUEST: + return new RsGxsNetTunnelTurtleSearchGroupRequestItem; + case RsGxsNetTunnelItemSubtypes::SEARCH_GROUP_SUMMARY: + return new RsGxsNetTunnelTurtleSearchGroupSummaryItem; + case RsGxsNetTunnelItemSubtypes::SEARCH_GROUP_DATA: + return new RsGxsNetTunnelTurtleSearchGroupDataItem; + case RsGxsNetTunnelItemSubtypes::SERVICE_SEARCH_REQUEST: + return new RsGxsServiceTurtleSearchReqItem; + case RsGxsNetTunnelItemSubtypes::SERVICE_SEARCH_REPLY: + return new RsGxsServiceTurtleSearchReplyItem; default: - GXS_NET_TUNNEL_ERROR() << "type ID " << std::hex << (int)item_subtype << std::dec << " is not handled!" << std::endl; - return NULL ; + RS_ERR("Unkonown item type: ", static_cast(item_subtype)); + return nullptr; } } }; @@ -993,7 +1141,9 @@ TurtleRequestId RsGxsNetTunnelService::turtleGroupRequest(const RsGxsGroupId& gr return mTurtle->turtleSearch(mem,size,this) ; } -TurtleRequestId RsGxsNetTunnelService::turtleSearchRequest(const std::string& match_string,RsNetworkExchangeService *client_service) +TurtleRequestId RsGxsNetTunnelService::turtleSearchRequest( + const std::string& match_string, + RsNetworkExchangeService* client_service ) { GXS_NET_TUNNEL_DEBUG() << ": starting a turtle search request for string \"" << match_string << "\"" << std::endl; @@ -1002,7 +1152,7 @@ TurtleRequestId RsGxsNetTunnelService::turtleSearchRequest(const std::string& ma search_item.service = client_service->serviceType() ; uint32_t size = RsGxsNetTunnelSerializer().size(&search_item) ; - unsigned char *mem = (unsigned char*)rs_malloc(size) ; + uint8_t* mem = rs_malloc(size); if(mem == NULL) return 0 ; @@ -1013,151 +1163,304 @@ TurtleRequestId RsGxsNetTunnelService::turtleSearchRequest(const std::string& ma return mTurtle->turtleSearch(mem,size,this) ; } -bool RsGxsNetTunnelService::receiveSearchRequest(unsigned char *search_request_data,uint32_t search_request_data_len,unsigned char *& search_result_data,uint32_t& search_result_data_size,uint32_t& max_allowed_hits) +std::error_condition RsGxsNetTunnelService::turtleSearchRequest( + rs_owner_ptr searchData, uint32_t dataSize, + RsServiceType serviceType, TurtleRequestId& requestId ) { - GXS_NET_TUNNEL_DEBUG() << ": received a request." << std::endl; + if(!searchData || !dataSize || serviceType == RsServiceType::NONE) + return std::errc::invalid_argument; - RsItem *item = RsGxsNetTunnelSerializer().deserialise(search_request_data,&search_request_data_len) ; + RsGxsServiceTurtleSearchReqItem searchItem(serviceType); + searchItem.mSearchDataSize = dataSize; + searchItem.mSearchData = searchData; - RsGxsNetTunnelTurtleSearchSubstringItem *substring_sr = dynamic_cast(item) ; + RsGxsNetTunnelSerializer tSerializer; - if(substring_sr != NULL) - { - GXS_NET_TUNNEL_DEBUG() << " : type is substring for service " << std::hex << (int)substring_sr->service << std::dec << std::endl; + uint32_t size = tSerializer.size(&searchItem); + uint8_t* buf = rs_malloc(size); - max_allowed_hits = RS_GXS_NET_TUNNEL_MAX_ALLOWED_HITS_GROUP_SEARCH ; + tSerializer.serialise(&searchItem, buf, &size); - std::list results ; - RsNetworkExchangeService *service = nullptr; + requestId = mTurtle->turtleSearch(buf, size, this); + if(!requestId) return std::errc::result_out_of_range; - { - RS_STACK_MUTEX(mGxsNetTunnelMtx); - - auto it = mSearchableServices.find(substring_sr->service) ; - - if(it != mSearchableServices.end()) - service = it->second; - } - - if(service != nullptr && service->search(substring_sr->substring_match,results)) - { - RsGxsNetTunnelTurtleSearchGroupSummaryItem search_result_item ; - - GXS_NET_TUNNEL_DEBUG() << " : " << results.size() << " result found. Sending back." << std::endl; - - search_result_item.service = substring_sr->service ; - search_result_item.group_infos = results ; - - search_result_data_size = RsGxsNetTunnelSerializer().size(&search_result_item) ; - search_result_data = (unsigned char*)rs_malloc(search_result_data_size) ; - - delete item; - - if(search_result_data == NULL) - return false ; - - RsGxsNetTunnelSerializer().serialise(&search_result_item,search_result_data,&search_result_data_size); - - return true ; - } - } - - RsGxsNetTunnelTurtleSearchGroupRequestItem *substring_gr = dynamic_cast(item) ; - - if(substring_gr != NULL) - { - RS_STACK_MUTEX(mGxsNetTunnelMtx); - auto it = mSearchableServices.find(substring_gr->service) ; - - max_allowed_hits = RS_GXS_NET_TUNNEL_MAX_ALLOWED_HITS_GROUP_DATA ; - - unsigned char *encrypted_group_data = NULL ; - uint32_t encrypted_group_data_len = 0 ; - - if(it != mSearchableServices.end() && it->second->search(substring_gr->hashed_group_id,encrypted_group_data,encrypted_group_data_len)) - { - RsGxsNetTunnelTurtleSearchGroupDataItem search_result_item ; - - search_result_item.service = substring_gr->service ; - search_result_item.encrypted_group_data = encrypted_group_data ; - search_result_item.encrypted_group_data_len = encrypted_group_data_len; - - search_result_data_size = RsGxsNetTunnelSerializer().size(&search_result_item) ; - search_result_data = (unsigned char*)rs_malloc(search_result_data_size) ; - - if(search_result_data == NULL) - return false ; - - RsGxsNetTunnelSerializer().serialise(&search_result_item,search_result_data,&search_result_data_size); - - delete item; - return true ; - } - } - - delete item; - return false ; + return std::error_condition(); } -void RsGxsNetTunnelService::receiveSearchResult(TurtleSearchRequestId request_id,unsigned char *search_result_data,uint32_t search_result_data_len) +rs_view_ptr +RsGxsNetTunnelService::retrievieSearchableServiceLocking(uint16_t serviceType) { - RsItem *item = RsGxsNetTunnelSerializer().deserialise(search_result_data,&search_result_data_len); + RS_STACK_MUTEX(mGxsNetTunnelMtx); + auto it = mSearchableServices.find(serviceType); + if( it != mSearchableServices.end()) return it->second; + return nullptr; +} - GXS_NET_TUNNEL_DEBUG() << " : received search result for search request " << std::hex << request_id << "" << std::endl; +bool RsGxsNetTunnelService::receiveSearchRequest( + uint8_t* search_request_data, uint32_t search_request_data_len, + uint8_t*& search_result_data, uint32_t& search_result_data_size, + uint32_t& max_allowed_hits ) +{ + /* Must return true only if there are matching results available, false in + * all other cases. @see RsTurleClientService */ - RsGxsNetTunnelTurtleSearchGroupSummaryItem *result_gs = dynamic_cast(item) ; + RS_DBG3(""); - if(result_gs != NULL) + RsGxsNetTunnelSerializer tSerializer; + + std::unique_ptr item; + item.reset(tSerializer.deserialise( + search_request_data, &search_request_data_len )); + + if(!item) { - GXS_NET_TUNNEL_DEBUG() << " : result is of type group summary result for service " << result_gs->service << std::dec << ": " << std::endl; - -#ifdef DEBUG_RSGXSNETTUNNEL - for(auto it(result_gs->group_infos.begin());it!=result_gs->group_infos.end();++it) - std::cerr << " group " << (*it).mGroupId << ": " << (*it).mGroupName << ", " << (*it).mNumberOfMessages << " messages, last is " << time(NULL)-(*it).mLastMessageTs << " secs ago." << std::endl; -#endif - - auto it = mSearchableServices.find(result_gs->service) ; - - if(it == mSearchableServices.end()) - { - GXS_NET_TUNNEL_ERROR() << ": deserialized item is for service " << std::hex << result_gs->service << std::dec << " that is not in the searchable services list." << std::endl; - delete item; - return ; - } - - it->second->receiveTurtleSearchResults(request_id,result_gs->group_infos) ; - - delete item; - return ; + RS_ERR( "Deserialization failed: ", + search_request_data, search_request_data_len, item.get() ); + print_stacktrace(); + return false; } - RsGxsNetTunnelTurtleSearchGroupDataItem *result_gd = dynamic_cast(item) ; - - if(result_gd != NULL) - { - GXS_NET_TUNNEL_DEBUG() << " : result is of type group data for service " << result_gd->service << std::dec << ": " << std::endl; - - auto it = mSearchableServices.find(result_gd->service) ; - - if(it == mSearchableServices.end()) + switch(static_cast(item->PacketSubType())) + { + case RsGxsNetTunnelItemSubtypes::SEARCH_SUBSTRING: + { + if(!search_result_data) { - GXS_NET_TUNNEL_ERROR() << ": deserialized item is for service " << std::hex << result_gd->service << std::dec << " that is not in the searchable services list." << std::endl; - delete item; - return ; + RS_ERR( "Got item with TURTLE_SEARCH_SUBSTRING without space for " + "results!" ); + print_stacktrace(); + break; } - it->second->receiveTurtleSearchResults(request_id,result_gd->encrypted_group_data,result_gd->encrypted_group_data_len) ; + auto substring_sr = + dynamic_cast(item.get()); + if(!substring_sr) + { + RS_WARN( "Got item with TURTLE_SEARCH_SUBSTRING subtype: ", + item->PacketSubType(), " but casting failed!"); + break; + } - result_gd->encrypted_group_data = NULL ; // prevents deletion - delete item; + max_allowed_hits = RS_GXS_NET_TUNNEL_MAX_ALLOWED_HITS_GROUP_SEARCH; + std::list results; + auto tService = retrievieSearchableServiceLocking(substring_sr->service); + if(tService && tService->search(substring_sr->substring_match, results)) + { + RsGxsNetTunnelTurtleSearchGroupSummaryItem search_result_item; + search_result_item.service = substring_sr->service; + search_result_item.group_infos = results; + search_result_data_size = tSerializer.size(&search_result_item); + search_result_data = rs_malloc(search_result_data_size); - return ; - } + tSerializer.serialise( + &search_result_item, search_result_data, + &search_result_data_size ); - GXS_NET_TUNNEL_ERROR() << ": deserialized item is of unknown type. Dropping!" << std::endl; + return true; + } + + break; + } + case RsGxsNetTunnelItemSubtypes::SEARCH_GROUP_REQUEST: + { + auto *substring_gr = + dynamic_cast(item.get()); + + if(!substring_gr) + { + RS_WARN( "Got item with TURTLE_SEARCH_GROUP_REQUEST subtype: ", + item->PacketSubType(), " but casting failed!" ); + break; + } + + max_allowed_hits = RS_GXS_NET_TUNNEL_MAX_ALLOWED_HITS_GROUP_DATA; + uint8_t* encrypted_group_data = nullptr; + uint32_t encrypted_group_data_len = 0; + + auto tService = retrievieSearchableServiceLocking(substring_gr->service); + if(tService && tService->search( + substring_gr->hashed_group_id, + encrypted_group_data, encrypted_group_data_len )) + { + RsGxsNetTunnelTurtleSearchGroupDataItem search_result_item; + search_result_item.service = substring_gr->service; + search_result_item.encrypted_group_data = encrypted_group_data; + search_result_item.encrypted_group_data_len = encrypted_group_data_len; + search_result_data_size = tSerializer.size(&search_result_item); + search_result_data = rs_malloc(search_result_data_size); + + tSerializer.serialise( + &search_result_item, + search_result_data, &search_result_data_size ); + return true; + } + break; + } + case RsGxsNetTunnelItemSubtypes::SERVICE_SEARCH_REQUEST: + { + RS_DBG3("SERVICE_SEARCH_REQUEST"); + + auto searchItem = + static_cast(item.get()); + + max_allowed_hits = RS_GXS_NET_TUNNEL_MAX_ALLOWED_HITS_GROUP_SEARCH; + + uint16_t sType = static_cast(searchItem->mServiceType); + auto sService = retrievieSearchableServiceLocking(sType); + if(!sService) + { + RS_WARN("Got search request for non searchable service: ", sType); + break; + } + + RsGxsServiceTurtleSearchReplyItem replyItem(searchItem->mServiceType); + + auto errc = sService->handleDistantSearchRequest( + searchItem->mSearchData, searchItem->mSearchDataSize, + replyItem.mReplyData, replyItem.mReplyDataSize ); + if(errc) + { + // Some error has been reported by the searchable service + RS_WARN("searchable service: ", sType , " reported: ", errc); + break; + } + + if( (!replyItem.mReplyData && replyItem.mReplyDataSize) || + (replyItem.mReplyData && !replyItem.mReplyDataSize) ) + { + // Inconsistent behaviour from searcheable service + RS_ERR( "searchable service: ", sType , " silently failed handling " + "inconsistent result mReplyData: ", replyItem.mReplyData, + " mReplyDataSize: ", replyItem.mReplyDataSize ); + break; + } + + /* Our node have 0 matching results */ + if(!replyItem.mReplyData && !replyItem.mReplyDataSize) + break; + + search_result_data_size = tSerializer.size(&replyItem); + search_result_data = rs_malloc(search_result_data_size); + + tSerializer.serialise( + &replyItem, search_result_data, &search_result_data_size ); + + return true; + } + default: + RS_WARN("Got unknown item type: ", item->PacketSubType()); + break; + } + + return false; } -void RsGxsNetTunnelService::getStatistics(std::map& groups, std::map& virtual_peers, std::map &turtle_vpid_to_net_tunnel_vpid, Bias20Bytes& bias ) const +void RsGxsNetTunnelService::receiveSearchResult( + TurtleSearchRequestId request_id, + uint8_t* search_result_data, uint32_t search_result_data_len ) +{ + RS_DBG3(request_id); + + std::unique_ptr item; + item.reset(RsGxsNetTunnelSerializer().deserialise( + search_result_data,&search_result_data_len )); + + auto castFailedWarn = [](const uint8_t subtype) + { + RS_WARN( "Got item with subtype: ", subtype, + " but cast failed!" ); + }; + + auto searchableServiceGet = [this](const auto pservice) + { + auto service = static_cast(pservice); + auto it = mSearchableServices.find(service); + if(it == mSearchableServices.end()) + { + RS_WARN( "got item for service ", service, + " which is not in the searchable services list." ); + return static_cast(nullptr); + } + + return it->second; + }; + + const auto tSubtype = item->PacketSubType(); + switch (static_cast(tSubtype)) + { + case RsGxsNetTunnelItemSubtypes::SEARCH_GROUP_SUMMARY: + { + auto result_gs = + dynamic_cast( + item.get() ); + + if(!result_gs) + { + castFailedWarn(tSubtype); + break; + } + + RS_DBG2( " got result is of type group summary result for service ", + result_gs->service ); + + auto service = searchableServiceGet(result_gs->service); + if(service) + service->receiveTurtleSearchResults( + request_id, result_gs->group_infos ); + return; + } + case RsGxsNetTunnelItemSubtypes::SEARCH_GROUP_DATA: + { + auto result_gd = + dynamic_cast(item.get()); + + if(!result_gd) + { + castFailedWarn(tSubtype); + break; + } + + RS_DBG2("got group data result for service: ", result_gd->service); + + auto service = searchableServiceGet(result_gd->service); + if(service) + service->receiveTurtleSearchResults( + request_id, + result_gd->encrypted_group_data, + result_gd->encrypted_group_data_len ); + + /* Ensure ownershipt is passed down preventing deletion */ + result_gd->encrypted_group_data = nullptr; + break; + } + case RsGxsNetTunnelItemSubtypes::SERVICE_SEARCH_REPLY: + { + auto searchReply = + static_cast(item.get()); + + auto service = searchableServiceGet(searchReply->mServiceType); + if(service) + service->receiveDistantSearchResult( + request_id, + searchReply->mReplyData, + searchReply->mReplyDataSize ); + + /* Ensure memory ownership is passed down preventing deletion */ + searchReply->mReplyData = nullptr; + break; + } + default: + RS_WARN("got item of unknown type: ", item->PacketSubType()); + break; + } +} + +void RsGxsNetTunnelService::getStatistics( + std::map& groups, + std::map& virtual_peers, + std::map& + turtle_vpid_to_net_tunnel_vpid, Bias20Bytes& bias ) const { groups = mGroups ; virtual_peers = mVirtualPeers ; diff --git a/libretroshare/src/gxs/rsgxsnettunnel.h b/libretroshare/src/gxs/rsgxsnettunnel.h index 7c18ab54c..c7f9ac1f3 100644 --- a/libretroshare/src/gxs/rsgxsnettunnel.h +++ b/libretroshare/src/gxs/rsgxsnettunnel.h @@ -3,7 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2018 by Cyril Soler * + * Copyright (C) 2018 Cyril Soler * + * Copyright (C) 2021 Gioacchino Mazzurco * + * Copyright (C) 2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -23,6 +25,7 @@ #pragma once #include +#include #include "turtle/p3turtle.h" #include "retroshare/rsgxsdistsync.h" @@ -100,7 +103,7 @@ // and there is no way to prevent it. We therefore rely on GXS data integrity system to prevent this to happen. // -class RsGxsNetTunnelItem ; +struct RsGxsNetTunnelItem; class RsNetworkExchangeService ; class RsGxsNetTunnelService: @@ -108,8 +111,8 @@ class RsGxsNetTunnelService: public RsGxsDistSync { public: - RsGxsNetTunnelService() ; - virtual ~RsGxsNetTunnelService() ; + RsGxsNetTunnelService(); + ~RsGxsNetTunnelService() override; /*! * \brief registerSearchableService @@ -181,24 +184,38 @@ public: */ void dump() const; - /*! - * \brief connectToTurtleRouter - * Should be called after allocating a RsGxsNetTunnelService - * \param tr turtle router object - */ - virtual void connectToTurtleRouter(p3turtle *tr) ; + /*! + * Should be called after allocating a RsGxsNetTunnelService + * \param tr turtle router object + */ + void connectToTurtleRouter(p3turtle *tr) override; - TurtleRequestId turtleGroupRequest(const RsGxsGroupId& group_id, RsNetworkExchangeService *client_service) ; - TurtleRequestId turtleSearchRequest(const std::string& match_string,RsNetworkExchangeService *client_service) ; + /** Gxs services (channels, forums...) are supposed to use this to request + * searches on distant peers */ + std::error_condition turtleSearchRequest( + rs_owner_ptr searchData, uint32_t dataSize, + RsServiceType serviceType, TurtleRequestId& requestId ); - /*! - * \brief receiveSearchRequest - * See RsTurtleClientService::@ - */ - virtual bool receiveSearchRequest(unsigned char *search_request_data, uint32_t search_request_data_len, unsigned char *& search_result_data, uint32_t& search_result_data_len, uint32_t &max_allowed_hits); - virtual void receiveSearchResult(TurtleSearchRequestId request_id,unsigned char *search_result_data,uint32_t search_result_data_len); + ///@see RsTurtleClientService + bool receiveSearchRequest( + unsigned char* search_request_data, + uint32_t search_request_data_len, + unsigned char*& search_result_data, + uint32_t& search_result_data_len, + uint32_t& max_allowed_hits ) override; - void threadTick() override; /// @see RsTickingThread + ///@see RsTurtleClientService + virtual void receiveSearchResult( + TurtleSearchRequestId request_id, + unsigned char* search_result_data, + uint32_t search_result_data_len ) override; + + TurtleRequestId turtleGroupRequest( + const RsGxsGroupId& group_id, + RsNetworkExchangeService* client_service ); + + /// @see RsTickingThread + void threadTick() override; // Overloads p3Config @@ -213,6 +230,11 @@ public: std::map& turtle_vpid_to_net_tunnel_vpid, Bias20Bytes& bias) const; + RS_DEPRECATED + TurtleRequestId turtleSearchRequest( + const std::string& match_string, + RsNetworkExchangeService* client_service ); + protected: // interaction with turtle router @@ -233,6 +255,8 @@ private: void sendKeepAlivePackets() ; void handleIncoming(RsGxsNetTunnelItem *item) ; void flush_pending_items(); + rs_view_ptr retrievieSearchableServiceLocking( + uint16_t serviceType ); std::map mGroups ; // groups on the client and server side diff --git a/libretroshare/src/gxs/rsgxsnotify.h b/libretroshare/src/gxs/rsgxsnotify.h index 990acfe84..030d9f26f 100644 --- a/libretroshare/src/gxs/rsgxsnotify.h +++ b/libretroshare/src/gxs/rsgxsnotify.h @@ -97,3 +97,13 @@ private: bool mMetaChange; }; +struct RsGxsMsgDeletedChange : RsGxsNotify +{ + RsGxsMsgDeletedChange( + const RsGxsGroupId& gid, const RsGxsMessageId& msgId): + RsGxsNotify(gid), messageId(msgId) {} + + NotifyType getType() override { return TYPE_MESSAGE_DELETED; } + + const RsGxsMessageId messageId; +}; diff --git a/libretroshare/src/gxs/rsgxsutil.cc b/libretroshare/src/gxs/rsgxsutil.cc index f64fd236f..4a0f3e372 100644 --- a/libretroshare/src/gxs/rsgxsutil.cc +++ b/libretroshare/src/gxs/rsgxsutil.cc @@ -3,8 +3,8 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2013-2013 by Christopher Evi-Parker * - * Copyright (C) 2018 Gioacchino Mazzurco * + * Copyright (C) 2013 Christopher Evi-Parker * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -29,12 +29,6 @@ #include "pqi/pqihash.h" #include "gxs/rsgixs.h" -#ifdef RS_DEEP_CHANNEL_INDEX -# include "deep_search/channelsindex.hpp" -# include "services/p3gxschannels.h" -# include "rsitems/rsgxschannelitems.h" -#endif - // The goals of this set of methods is to check GXS messages and groups for consistency, mostly // re-ferifying signatures and hashes, to make sure that the data hasn't been tempered. This shouldn't // happen anyway, but we still conduct these test as an extra safety measure. @@ -197,9 +191,8 @@ bool RsGxsCleanUp::clean(RsGxsGroupId& next_group_to_check,std::vector& grpsToDel, GxsMsgReq& msgsToDel) +bool RsGxsSinglePassIntegrityCheck::check( + uint16_t service_type, RsGixs* mgixs, RsGeneralDataService* mds, + std::vector& grpsToDel, GxsMsgReq& msgsToDel ) { #ifdef DEBUG_GXSUTIL GXSUTIL_DEBUG() << "Parsing all groups and messages data in service " << std::hex << mds->serviceType() << " for integrity check. Could take a while..." << std::endl; #endif -#ifdef RS_DEEP_CHANNEL_INDEX - bool isGxsChannels = mGenExchangeClient->serviceType() == RS_SERVICE_GXS_TYPE_CHANNELS; - std::set indexedGroups; -#endif // first take out all the groups std::map grp; @@ -393,55 +380,14 @@ bool RsGxsSinglePassIntegrityCheck::check(uint16_t service_type, RsGixs *mgixs, } else msgIds.erase(msgIds.find(grp->grpId)); // could not get them, so group is removed from list. - -#ifdef RS_DEEP_CHANNEL_INDEX - // This should be moved to p3gxschannels. It is really not the place for this here! - - if( isGxsChannels - && grp->metaData->mCircleType == GXS_CIRCLE_TYPE_PUBLIC - && grp->metaData->mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_SUBSCRIBED ) - { - RsGxsGrpMetaData meta; - meta.deserialise(grp->meta.bin_data, grp->meta.bin_len); - - uint32_t blz = grp->grp.bin_len; - RsItem* rIt = mSerializer.deserialise(grp->grp.bin_data, - &blz); - - if( RsGxsChannelGroupItem* cgIt = - dynamic_cast(rIt) ) - { - RsGxsChannelGroup cg; - cgIt->toChannelGroup(cg, false); - cg.mMeta = meta; - - indexedGroups.insert(grp->grpId); - DeepChannelsIndex::indexChannelGroup(cg); - } - else - { - std::cerr << __PRETTY_FUNCTION__ << " Group: " - << meta.mGroupId.toStdString() << " " - << meta.mGroupName - << " doesn't seems a channel, please " - << "report to developers" - << std::endl; - print_stacktrace(); - } - - delete rIt; - } -#endif // def RS_DEEP_CHANNEL_INDEX - } - else - { - std::cerr << __PRETTY_FUNCTION__ <<" (EE) deleting group " << grp->grpId << " with wrong hash or null/corrupted meta data. meta=" << grp->metaData << std::endl; - grpsToDel.push_back(grp->grpId); -#ifdef RS_DEEP_CHANNEL_INDEX - if(isGxsChannels) - DeepChannelsIndex::removeChannelFromIndex(grp->grpId); -#endif // def RS_DEEP_CHANNEL_INDEX } + else + { + RS_WARN( "deleting group ", grp->grpId, + " with wrong hash or null/corrupted meta data. meta=", + grp->metaData ); + grpsToDel.push_back(grp->grpId); + } delete grp; } @@ -469,15 +415,9 @@ bool RsGxsSinglePassIntegrityCheck::check(uint16_t service_type, RsGixs *mgixs, if(nxsMsg) nxsMsgS.insert(nxsMsg->msgId); - for (auto& msgId:msgIdV) - if(nxsMsgS.find(msgId) == nxsMsgS.end()) - { - msgsToDel[grpId].insert(msgId); -#ifdef RS_DEEP_CHANNEL_INDEX - if(isGxsChannels) - DeepChannelsIndex::removeChannelPostFromIndex(grpId, msgId); -#endif // def RS_DEEP_CHANNEL_INDEX - } + for (auto& msgId:msgIdV) + if(nxsMsgS.find(msgId) == nxsMsgS.end()) + msgsToDel[grpId].insert(msgId); } for(auto mit = msgs.begin(); mit != msgs.end(); ++mit) @@ -495,54 +435,11 @@ bool RsGxsSinglePassIntegrityCheck::check(uint16_t service_type, RsGixs *mgixs, if(msg->metaData == NULL || currHash != msg->metaData->mHash) { - std::cerr << __PRETTY_FUNCTION__ <<" (EE) deleting message " << msg->msgId << " in group " << msg->grpId << " with wrong hash or null/corrupted meta data. meta=" << (void*)msg->metaData << std::endl; + RS_WARN( "deleting message ", msg->msgId, " in group ", + msg->grpId, + " with wrong hash or null/corrupted meta data. meta=", + static_cast(msg->metaData) ); msgsToDel[msg->grpId].insert(msg->msgId); -#ifdef RS_DEEP_CHANNEL_INDEX - if(isGxsChannels) - DeepChannelsIndex::removeChannelPostFromIndex( - msg->grpId, msg->msgId ); -#endif // def RS_DEEP_CHANNEL_INDEX - } - else if (subscribed_groups.count(msg->metaData->mGroupId)) - { -#ifdef RS_DEEP_CHANNEL_INDEX - // This should be moved to p3gxschannels. It is really not the place for this here! - - if( isGxsChannels && indexedGroups.count(msg->metaData->mGroupId) ) - { - RsGxsMsgMetaData meta; - meta.deserialise(msg->meta.bin_data, &msg->meta.bin_len); - - uint32_t blz = msg->msg.bin_len; - RsItem* rIt = mSerializer.deserialise(msg->msg.bin_data, - &blz); - - if( RsGxsChannelPostItem* cgIt = - dynamic_cast(rIt) ) - { - RsGxsChannelPost cg; - cgIt->toChannelPost(cg, false); - cg.mMeta = meta; - - DeepChannelsIndex::indexChannelPost(cg); - } - else if(dynamic_cast(rIt)) {} - else if(dynamic_cast(rIt)) {} - else - { - std::cerr << __PRETTY_FUNCTION__ << " Message: " - << meta.mMsgId.toStdString() - << " in group: " - << meta.mGroupId.toStdString() << " " - << " doesn't seems a channel post, please " - << "report to developers" - << std::endl; - print_stacktrace(); - } - - delete rIt; - } -#endif // def RS_DEEP_CHANNEL_INDEX } delete msg; diff --git a/libretroshare/src/gxs/rsgxsutil.h b/libretroshare/src/gxs/rsgxsutil.h index 34f1b2baa..21fd6bb06 100644 --- a/libretroshare/src/gxs/rsgxsutil.h +++ b/libretroshare/src/gxs/rsgxsutil.h @@ -3,8 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2013-2013 by Christopher Evi-Parker * - * Copyright (C) 2018 Gioacchino Mazzurco * + * Copyright (C) 2013 Christopher Evi-Parker * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -162,18 +163,9 @@ class RsGxsIntegrityCheck : public RsThread enum CheckState { CheckStart, CheckChecking }; public: - - - /*! - * - * @param dataService - * @param mGroupTS - * @param chunkSize - * @param sleepPeriod - */ - RsGxsIntegrityCheck(RsGeneralDataService* const dataService, - RsGenExchange *genex, RsSerialType&, - RsGixs *gixs); + RsGxsIntegrityCheck( RsGeneralDataService* const dataService, + RsGenExchange* genex, RsSerialType&, + RsGixs* gixs ); static bool check(uint16_t service_type, RsGixs *mgixs, RsGeneralDataService *mds); bool isDone(); @@ -201,19 +193,9 @@ private: class RsGxsSinglePassIntegrityCheck { public: - - /*! - * - * @param dataService - * @param mGroupTS - * @param chunkSize - * @param sleepPeriod - */ - static bool check(uint16_t service_type, RsGixs *mgixs, RsGeneralDataService *mds -#ifdef RS_DEEP_CHANNEL_INDEX - , RsGenExchange* mGenExchangeClient, RsSerialType& mSerializer -#endif - , std::vector& grpsToDel, GxsMsgReq& msgsToDel); + static bool check( + uint16_t service_type, RsGixs* mgixs, RsGeneralDataService* mds, + std::vector& grpsToDel, GxsMsgReq& msgsToDel ); }; class GroupUpdate diff --git a/libretroshare/src/gxs/rsnxs.h b/libretroshare/src/gxs/rsnxs.h index fb6238f92..2f9bb25a6 100644 --- a/libretroshare/src/gxs/rsnxs.h +++ b/libretroshare/src/gxs/rsnxs.h @@ -3,8 +3,10 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2011-2011 by Robert Fernie * - * Copyright 2011-2011 by Christopher Evi-Parker * + * Copyright (C) 2011 Robert Fernie * + * Copyright (C) 2011 Christopher Evi-Parker * + * Copyright (C) 2019-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -20,17 +22,15 @@ * along with this program. If not, see . * * * *******************************************************************************/ - -#ifndef RSGNP_H -#define RSGNP_H +#pragma once #include #include -#include "util/rstime.h" #include #include #include +#include "util/rstime.h" #include "services/p3service.h" #include "retroshare/rsreputations.h" #include "retroshare/rsidentity.h" @@ -61,9 +61,8 @@ class RsNetworkExchangeService { public: - - RsNetworkExchangeService(){ return;} - virtual ~RsNetworkExchangeService() {} + RsNetworkExchangeService() = default; + virtual ~RsNetworkExchangeService() = default; virtual uint16_t serviceType() const =0; /*! @@ -85,9 +84,24 @@ public: virtual bool msgAutoSync() const =0; virtual bool grpAutoSync() const =0; - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /// DISTANT SEARCH FUNCTIONS /// - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + /// DISTANT SEARCH FUNCTIONS /// + //////////////////////////////////////////////////////////////////////////// + + /// Trigger remote generic GXS service search + virtual std::error_condition distantSearchRequest( + rs_owner_ptr searchData, uint32_t dataSize, + RsServiceType serviceType, TurtleRequestId& requestId ) = 0; + + /// Handle remote generic GXS services search requests to specific service + virtual std::error_condition handleDistantSearchRequest( + rs_view_ptr requestData, uint32_t requestSize, + rs_owner_ptr& resultData, uint32_t& resultSize ) = 0; + + /// Receive remote generic GXS services search result + virtual std::error_condition receiveDistantSearchResult( + const TurtleRequestId requestId, + rs_owner_ptr& resultData, uint32_t& resultSize ) = 0; /*! * \brief turtleGroupRequest @@ -115,13 +129,17 @@ public: */ virtual void receiveTurtleSearchResults(TurtleRequestId req,const std::list& group_infos)=0; - /*! - * \brief receiveTurtleSearchResults - * Called by turtle (through RsGxsNetTunnel) when new data is received - * \param req Turtle search request ID associated with this result - * \param encrypted_group_data Group data - */ - virtual void receiveTurtleSearchResults(TurtleRequestId req,const unsigned char *encrypted_group_data,uint32_t encrypted_group_data_len)=0; + /*! + * \brief receiveTurtleSearchResults + * Called by turtle (through RsGxsNetTunnel) when new data is received + * \param req Turtle search request ID associated with this result + * \param encrypted_group_data Group data + */ + RS_DEPRECATED_FOR("receiveDistantSearchResult") + virtual void receiveTurtleSearchResults( + TurtleRequestId req, + rs_owner_ptr encrypted_group_data, + uint32_t encrypted_group_data_len ) = 0; /*! * \brief retrieveTurtleSearchResults @@ -141,7 +159,9 @@ public: virtual bool clearDistantSearchResults(const TurtleRequestId& id)=0; virtual bool retrieveDistantGroupSummary(const RsGxsGroupId&,RsGxsGroupSearchResults&)=0; - virtual bool search(const std::string& substring,std::list& group_infos) =0; + RS_DEPRECATED_FOR("handleDistantSearchRequest and distantSearchRequest") + virtual bool search(const std::string& substring,std::list& group_infos) =0; + virtual bool search(const Sha1CheckSum& hashed_group_id,unsigned char *& encrypted_group_data,uint32_t& encrypted_group_data_len)=0; /*! @@ -306,5 +326,3 @@ public: } } }; - -#endif // RSGNP_H diff --git a/libretroshare/src/util/rserrno.h b/libretroshare/src/gxs/rsnxsobserver.cpp similarity index 68% rename from libretroshare/src/util/rserrno.h rename to libretroshare/src/gxs/rsnxsobserver.cpp index 526a4890a..2b5ab0d8a 100644 --- a/libretroshare/src/util/rserrno.h +++ b/libretroshare/src/gxs/rsnxsobserver.cpp @@ -1,24 +1,36 @@ -/******************************************************************************* - * libretroshare/src/util: rserrno.h * - * * - * libretroshare: retroshare core library * - * * - * Copyright (C) 2019 Gioacchino Mazzurco * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * 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 Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ -#pragma once - -const char* rsErrnoName(int err); +/******************************************************************************* + * RetroShare General eXchange System * + * * + * Copyright (C) 2021 Gioacchino Mazzurco * + * Copyright (C) 2021 Asociación Civil Altermundi * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * 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 Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with this program. If not, see . * + * * + *******************************************************************************/ + +#include "gxs/rsnxsobserver.h" + +const RsNxsObserverErrorCategory RsNxsObserverErrorCategory::instance; + +std::error_condition RsNxsObserverErrorCategory::default_error_condition(int ev) +const noexcept +{ + switch(static_cast(ev)) + { + case RsNxsObserverErrorNum::NOT_OVERRIDDEN_BY_OBSERVER: + return std::errc::operation_not_supported; + default: + return std::error_condition(ev, *this); + } +} diff --git a/libretroshare/src/gxs/rsnxsobserver.h b/libretroshare/src/gxs/rsnxsobserver.h index 2da5067a4..9d81e7656 100644 --- a/libretroshare/src/gxs/rsnxsobserver.h +++ b/libretroshare/src/gxs/rsnxsobserver.h @@ -3,7 +3,10 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2011-2012 by Robert Fernie, Evi-Parker Christopher * + * Copyright (C) 2011-2012 Robert Fernie * + * Copyright (C) 2011-2012 Christopher Evi-Parker * + * Copyright (C) 2021 Gioacchino Mazzurco * + * Copyright (C) 2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -19,21 +22,61 @@ * along with this program. If not, see . * * * *******************************************************************************/ -#ifndef RSNXSOBSERVER_H -#define RSNXSOBSERVER_H +#pragma once -#include +#include +#include + +#include "retroshare/rsgxsiface.h" #include "rsitems/rsnxsitems.h" +#include "util/rsdebug.h" -typedef uint32_t TurtleRequestId ; +typedef uint32_t TurtleRequestId; + +enum class RsNxsObserverErrorNum : int32_t +{ + NOT_OVERRIDDEN_BY_OBSERVER = 2004, +}; + +struct RsNxsObserverErrorCategory: std::error_category +{ + const char* name() const noexcept override + { return "RetroShare NXS Observer"; } + + std::string message(int ev) const override + { + switch (static_cast(ev)) + { + case RsNxsObserverErrorNum::NOT_OVERRIDDEN_BY_OBSERVER: + return "Method not overridden by observer"; + default: + return rsErrorNotInCategory(ev, name()); + } + } + + std::error_condition default_error_condition(int ev) const noexcept override; + + const static RsNxsObserverErrorCategory instance; +}; + + +namespace std +{ +/** Register RsNxsObserverErrorNum as an error condition enum, must be in std + * namespace */ +template<> struct is_error_condition_enum : true_type {}; +} + +/** Provide RsJsonApiErrorNum conversion to std::error_condition, must be in + * same namespace of RsJsonApiErrorNum */ +inline std::error_condition make_error_condition(RsNxsObserverErrorNum e) noexcept +{ + return std::error_condition( + static_cast(e), RsNxsObserverErrorCategory::instance ); +}; class RsNxsObserver { -public: - - RsNxsObserver() {} - - public: /*! @@ -56,6 +99,46 @@ public: std::cerr << __PRETTY_FUNCTION__ << ": not overloaded but still called. Nothing will happen." << std::endl; } + /** If advanced search functionalities like deep indexing are supported at + * observer/service level, this method should be overridden to handle search + * requests there. + * @param[in] requestData search query + * @param[in] requestSize search query size + * @param[out] resultData results data storage for a pointer to search + * result reply data or nullptr if no mathing results where found + * @param[out] resultSize storage for results data size or 0 if no matching + * results where found + * @return Error details or success, NOT_OVERRIDDEN_BY_OBSERVER is + * returned to inform the caller that this method was not overridden by the + * observer so do not use it for other meanings. */ + virtual std::error_condition handleDistantSearchRequest( + rs_view_ptr requestData, uint32_t requestSize, + rs_owner_ptr& resultData, uint32_t& resultSize ) + { + /* Avoid unused paramethers warning this way so doxygen can still parse + * paramethers documentation */ + (void) requestData; (void) requestSize; + (void) resultData; (void) resultSize; + return RsNxsObserverErrorNum::NOT_OVERRIDDEN_BY_OBSERVER; + } + + /** If advanced search functionalities like deep indexing are supported at + * observer/service level, this method should be overridden to handle search + * results there. + * @param[in] requestId search query id + * @param[out] resultData results data + * @param[out] resultSize results data size + * @return Error details or success, NOT_OVERRIDDEN_BY_OBSERVER is + * returned to inform the caller that this method was not overridden by the + * observer so do not use it for other meanings. */ + virtual std::error_condition receiveDistantSearchResult( + const TurtleRequestId requestId, + rs_owner_ptr& resultData, uint32_t& resultSize ) + { + (void) requestId; (void) resultData; (void) resultSize; + return RsNxsObserverErrorNum::NOT_OVERRIDDEN_BY_OBSERVER; + } + /*! * @param grpId group id */ @@ -70,6 +153,7 @@ public: * @param grpId group id */ virtual void notifyChangedGroupStats(const RsGxsGroupId &grpId) = 0; -}; -#endif // RSNXSOBSERVER_H + RsNxsObserver() = default; + virtual ~RsNxsObserver() = default; +}; diff --git a/libretroshare/src/libretroshare.pro b/libretroshare/src/libretroshare.pro index 4da980828..5d9a764a9 100644 --- a/libretroshare/src/libretroshare.pro +++ b/libretroshare/src/libretroshare.pro @@ -161,7 +161,7 @@ rs_webui { HEADERS += plugins/pluginmanager.h \ plugins/dlfcn_win32.h \ - rsitems/rspluginitems.h \ + rsitems/rspluginitems.h \ util/i2pcommon.h \ util/rsinitedptr.h @@ -398,7 +398,6 @@ HEADERS += pqi/authssl.h \ pqi/pqissl.h \ pqi/pqissllistener.h \ pqi/pqisslpersongrp.h \ - pqi/pqissli2pbob.h \ pqi/pqisslproxy.h \ pqi/pqistore.h \ pqi/pqistreamer.h \ @@ -459,7 +458,7 @@ HEADERS += rsitems/rsitem.h \ rsitems/rsgxsupdateitems.h \ rsitems/rsserviceinfoitems.h \ -HEADERS += services/autoproxy/p3i2pbob.h \ +HEADERS += \ services/rseventsservice.h \ services/autoproxy/rsautoproxymonitor.h \ services/p3msgservice.h \ @@ -513,8 +512,7 @@ HEADERS += util/folderiterator.h \ util/cxx11retrocompat.h \ util/cxx14retrocompat.h \ util/cxx17retrocompat.h \ - util/rsurl.h \ - util/rserrno.h + util/rsurl.h SOURCES += ft/ftchunkmap.cc \ ft/ftcontroller.cc \ @@ -563,7 +561,6 @@ SOURCES += pqi/authgpg.cc \ pqi/pqissl.cc \ pqi/pqissllistener.cc \ pqi/pqisslpersongrp.cc \ - pqi/pqissli2pbob.cpp \ pqi/pqisslproxy.cc \ pqi/pqistore.cc \ pqi/pqistreamer.cc \ @@ -621,7 +618,6 @@ SOURCES += serialiser/rsbaseserial.cc \ SOURCES += services/autoproxy/rsautoproxymonitor.cc \ services/rseventsservice.cc \ - services/autoproxy/p3i2pbob.cc \ services/p3msgservice.cc \ services/p3service.cc \ services/p3statusservice.cc \ @@ -641,10 +637,10 @@ SOURCES += util/folderiterator.cc \ util/rsexpr.cc \ util/smallobject.cc \ util/rsdir.cc \ - util/rsmemory.cc \ util/rsdiscspace.cc \ util/rsnet.cc \ util/rsnet_ss.cc \ + util/rsdnsutils.cc \ util/extaddrfinder.cc \ util/dnsresolver.cc \ util/rsprint.cc \ @@ -655,8 +651,7 @@ SOURCES += util/folderiterator.cc \ util/rsrecogn.cc \ util/rstime.cc \ util/rsurl.cc \ - util/rsbase64.cc \ - util/rserrno.cc + util/rsbase64.cc equals(RS_UPNP_LIB, miniupnpc) { HEADERS += rs_upnp/upnputil.h rs_upnp/upnphandler_miniupnp.h @@ -720,7 +715,8 @@ SOURCES += rsitems/rsnxsitems.cc \ gxs/gxstokenqueue.cc \ gxs/rsgxsnetutils.cc \ gxs/rsgxsutil.cc \ - gxs/rsgxsrequesttypes.cc + gxs/rsgxsrequesttypes.cc \ + gxs/rsnxsobserver.cpp # Tor HEADERS += retroshare/rstor.h @@ -986,6 +982,14 @@ rs_jsonapi { SOURCES += jsonapi/jsonapi.cpp } +rs_deep_forums_index { + HEADERS *= deep_search/commonutils.hpp + SOURCES *= deep_search/commonutils.cpp + + HEADERS += deep_search/forumsindex.hpp + SOURCES += deep_search/forumsindex.cpp +} + rs_deep_channels_index { HEADERS *= deep_search/commonutils.hpp SOURCES *= deep_search/commonutils.cpp @@ -1059,6 +1063,44 @@ rs_broadcast_discovery { } } +rs_sam3 { + SOURCES += \ + services/autoproxy/p3i2psam3.cpp \ + pqi/pqissli2psam3.cpp \ + + HEADERS += \ + services/autoproxy/p3i2psam3.h \ + pqi/pqissli2psam3.h \ +} + +rs_sam3_libsam3 { + DUMMYQMAKECOMPILERINPUT = FORCE + libsam3.name = Generating libsam3. + libsam3.input = DUMMYQMAKECOMPILERINPUT + libsam3.output = $$clean_path($${LIBSAM3_BUILD_PATH}/libsam3.a) + libsam3.CONFIG += target_predeps combine + libsam3.variable_out = PRE_TARGETDEPS + win32-g++:isEmpty(QMAKE_SH) { + LIBSAM3_MAKE_PARAMS = CC=gcc + libsam3.commands = \ + cd /D $$shell_path($${RS_SRC_PATH}) && git submodule update --init supportlibs/libsam3 || cd . $$escape_expand(\\n\\t) \ + $(CHK_DIR_EXISTS) $$shell_path($$LIBSAM3_BUILD_PATH) $(MKDIR) $$shell_path($${LIBSAM3_BUILD_PATH}) $$escape_expand(\\n\\t) \ + $(COPY_DIR) $$shell_path($${LIBSAM3_SRC_PATH}) $$shell_path($${LIBSAM3_BUILD_PATH}) || cd . $$escape_expand(\\n\\t) + } else { + LIBSAM3_MAKE_PARAMS = + libsam3.commands = \ + cd $${RS_SRC_PATH} && ( \ + git submodule update --init supportlibs/libsam3 || \ + true ) && \ + mkdir -p $${LIBSAM3_BUILD_PATH} && \ + (cp -r $${LIBSAM3_SRC_PATH}/* $${LIBSAM3_BUILD_PATH} || true) && + } + libsam3.commands += \ + cd $$shell_path($${LIBSAM3_BUILD_PATH}) && \ + $(MAKE) build $${LIBSAM3_MAKE_PARAMS} + QMAKE_EXTRA_COMPILERS += libsam3 +} + ########################################################################################################### # OLD CONFIG OPTIONS. # Not used much - but might be useful one day. diff --git a/libretroshare/src/pqi/p3netmgr.cc b/libretroshare/src/pqi/p3netmgr.cc index 32b413e7b..21e45ac16 100644 --- a/libretroshare/src/pqi/p3netmgr.cc +++ b/libretroshare/src/pqi/p3netmgr.cc @@ -47,14 +47,15 @@ struct RsLog::logInfo p3netmgrzoneInfo = {RsLog::Default, "p3netmgr"}; /* Network setup States */ -const uint32_t RS_NET_NEEDS_RESET = 0x0000; -const uint32_t RS_NET_UNKNOWN = 0x0001; -const uint32_t RS_NET_UPNP_INIT = 0x0002; -const uint32_t RS_NET_UPNP_SETUP = 0x0003; -const uint32_t RS_NET_EXT_SETUP = 0x0004; -const uint32_t RS_NET_DONE = 0x0005; -const uint32_t RS_NET_LOOPBACK = 0x0006; -//const uint32_t RS_NET_DOWN = 0x0007; +constexpr uint32_t RS_NET_NEEDS_RESET = 0x0000; +constexpr uint32_t RS_NET_UNKNOWN = 0x0001; +constexpr uint32_t RS_NET_UPNP_INIT = 0x0002; +constexpr uint32_t RS_NET_UPNP_SETUP = 0x0003; +constexpr uint32_t RS_NET_EXT_SETUP = 0x0004; +constexpr uint32_t RS_NET_DONE = 0x0005; +constexpr uint32_t RS_NET_LOOPBACK = 0x0006; +//constexpr uint32_t RS_NET_DOWN = 0x0007; +constexpr uint32_t RS_NET_SHUTDOWN = 0x00FF; //Highest value to not restart UPnP nor ExtAddrFinder /* Stun modes (TODO) */ //const uint32_t RS_STUN_DHT = 0x0001; @@ -68,6 +69,8 @@ const uint32_t MAX_UPNP_COMPLETE = 600; /* 10 min... seems to take a while */ //const uint32_t MIN_TIME_BETWEEN_NET_RESET = 5; +const uint32_t MIN_TIME_EXT_FINDER_UPDATE = 300; /* 5min to check if external IP is changed */ + /**** * #define NETMGR_DEBUG 1 * #define NETMGR_DEBUG_RESET 1 @@ -107,19 +110,17 @@ void pqiNetStatus::print(std::ostream &out) } -p3NetMgrIMPL::p3NetMgrIMPL() : mPeerMgr(nullptr), mLinkMgr(nullptr), - mNetMtx("p3NetMgr"), mNetStatus(RS_NET_UNKNOWN), mStatusChanged(false), - mDoNotNetCheckUntilTs(0) +p3NetMgrIMPL::p3NetMgrIMPL() + : mPeerMgr(nullptr), mLinkMgr(nullptr) + , mNetMtx("p3NetMgr"), mNetMode(RS_NET_MODE_UDP), mVsDisc(RS_VS_DISC_FULL), mVsDht(RS_VS_DHT_FULL)// default to full. + , mNetInitTS(0), mNetStatus(RS_NET_UNKNOWN), mStatusChanged(false) + , mUseExtAddrFinder(true), mNetExtAddrFinderTs(0), mDoNotNetCheckUntilTs(0) { { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ - mNetMode = RS_NET_MODE_UDP; - - mUseExtAddrFinder = true; mExtAddrFinder = new ExtAddrFinder(); - mNetInitTS = 0; mNetFlags = pqiNetStatus(); mOldNetFlags = pqiNetStatus(); @@ -133,10 +134,6 @@ p3NetMgrIMPL::p3NetMgrIMPL() : mPeerMgr(nullptr), mLinkMgr(nullptr), mLocalAddr.ss_family = AF_INET; mExtAddr.ss_family = AF_INET; - // default to full. - mVsDisc = RS_VS_DISC_FULL; - mVsDht = RS_VS_DHT_FULL; - } #ifdef NETMGR_DEBUG @@ -235,6 +232,10 @@ void p3NetMgrIMPL::netReset() rslog(RSL_ALERT, p3netmgrzone, "p3NetMgr::netReset() Called"); shutdown(); /* blocking shutdown call */ + { + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ + mNetStatus = RS_NET_UNKNOWN; + } // Will initiate a new call for determining the external ip. if (mUseExtAddrFinder) @@ -242,7 +243,7 @@ void p3NetMgrIMPL::netReset() #ifdef NETMGR_DEBUG_RESET std::cerr << "p3NetMgrIMPL::netReset() restarting AddrFinder" << std::endl; #endif - mExtAddrFinder->reset() ; + mExtAddrFinder->reset(true) ; } else { @@ -265,7 +266,7 @@ void p3NetMgrIMPL::netReset() * as it calls back to p3ConnMgr. */ - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ struct sockaddr_storage iaddr = mLocalAddr; @@ -283,8 +284,7 @@ void p3NetMgrIMPL::netReset() } { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ - mNetStatus = RS_NET_UNKNOWN; + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ netStatusReset_locked(); } @@ -311,8 +311,8 @@ bool p3NetMgrIMPL::shutdown() /* blocking shutdown call */ std::cerr << std::endl; #endif { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ - mNetStatus = RS_NET_UNKNOWN; + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ + mNetStatus = RS_NET_SHUTDOWN; mNetInitTS = time(NULL); netStatusReset_locked(); } @@ -347,7 +347,7 @@ void p3NetMgrIMPL::netStartup() */ - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ mNetInitTS = time(NULL); netStatusReset_locked(); @@ -460,35 +460,51 @@ void p3NetMgrIMPL::netStatusTick() uint32_t netStatus = 0; rstime_t age = 0; + bool needExtFinderUpdate = false; { - RsStackMutex stack(mNetMtx); /************** LOCK MUTEX ***************/ + RS_STACK_MUTEX(mNetMtx); /************** LOCK MUTEX ***************/ netStatus = mNetStatus; age = time(NULL) - mNetInitTS; - } + needExtFinderUpdate = netStatus == RS_NET_DONE; + needExtFinderUpdate &= mNetExtAddrFinderTs < time(nullptr); + if(needExtFinderUpdate) + mNetExtAddrFinderTs = time(nullptr) + MIN_TIME_EXT_FINDER_UPDATE; + } - if(netStatus <= RS_NET_UPNP_SETUP && mUseExtAddrFinder) - { - sockaddr_storage tmpip = mLocalAddr; // copies local port and correctly inits the IP family + if( mUseExtAddrFinder + && ( netStatus <= RS_NET_UPNP_SETUP + || needExtFinderUpdate) ) + { + sockaddr_storage tmpip; + sockaddr_storage_copy( mLocalAddr, tmpip); // copies local port and correctly inits the IP family #if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) - std::cerr << "Asking ExtAddrFinder for IP. Initializing port with " << sockaddr_storage_port(tmpip) << std::endl; + RS_DBG("Asking ExtAddrFinder for IP. Initializing port with ", sockaddr_storage_port(tmpip)); #endif - if(mExtAddrFinder->hasValidIP(tmpip) && sockaddr_storage_ipv6_to_ipv4(tmpip) && !sockaddr_storage_same(tmpip,mExtAddr)) - { + if(mExtAddrFinder->hasValidIPV4(tmpip)) + { + if(!sockaddr_storage_same(tmpip,mExtAddr)) + { #if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) - std::cerr << "p3NetMgrIMPL::netExtCheck() Ext supplied by ExtAddrFinder" << std::endl; + RS_DBG("Ext supplied by ExtAddrFinder. ExtAddr: ", tmpip); #endif - + setExtAddress(tmpip); + } + } + else if(mExtAddrFinder->hasValidIPV6(tmpip)) + { + if(!sockaddr_storage_same(tmpip,mExtAddr)) + { + //Only if no IPv4 else, reset connections on setExtAddress() #if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) - std::cerr << "p3NetMgrIMPL::netExtCheck() "; - std::cerr << "ExtAddr: " << sockaddr_storage_tostring(tmpip); - std::cerr << std::endl; + RS_DBG("Ext supplied by ExtAddrFinder. ExtAddr: ", tmpip); #endif - setExtAddress(tmpip); - } - } + setExtAddress(tmpip); + } + } + } switch(netStatus) { @@ -578,7 +594,7 @@ void p3NetMgrIMPL::netDhtInit() uint32_t vs = 0; { - RsStackMutex stack(mNetMtx); /*********** LOCKED MUTEX ************/ + RS_STACK_MUTEX(mNetMtx); /*********** LOCKED MUTEX ************/ vs = mVsDht; } @@ -745,25 +761,16 @@ void p3NetMgrIMPL::netExtCheck() if (mUseExtAddrFinder) { #if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) - std::cerr << "p3NetMgrIMPL::netExtCheck() checking ExtAddrFinder" << std::endl; + RS_DBG("checking ExtAddrFinder"); #endif - sockaddr_storage tmpip = mLocalAddr; // copies local port and correctly inits the IP family + sockaddr_storage tmpip; + sockaddr_storage_copy( mLocalAddr, tmpip); // copies local port and correctly inits the IP family - bool extFinderOk = mExtAddrFinder->hasValidIP(tmpip); - - if (extFinderOk && sockaddr_storage_ipv6_to_ipv4(tmpip)) + // Test for IPv4 first to be compatible with older versions. + if (mExtAddrFinder->hasValidIPV4(tmpip)) { -#if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) - std::cerr << "p3NetMgrIMPL::netExtCheck() Ext supplied by ExtAddrFinder" << std::endl; -#endif sockaddr_storage_setport(tmpip, guessNewExtPort()); -#if defined(NETMGR_DEBUG_TICK) || defined(NETMGR_DEBUG_RESET) - std::cerr << "p3NetMgrIMPL::netExtCheck() "; - std::cerr << "ExtAddr: " << sockaddr_storage_tostring(tmpip); - std::cerr << std::endl; -#endif - mNetFlags.mExtAddrOk = true; address_votes[tmpip].n++ ; @@ -773,10 +780,22 @@ void p3NetMgrIMPL::netExtCheck() * (which it is not normally) */ mNetFlags.mExtAddrStableOk = true; - std::cerr << __PRETTY_FUNCTION__ << " ExtAddrFinder " - << " reported external address " - << sockaddr_storage_iptostring(tmpip) - << std::endl; + RS_DBG("Reported external IPv4 address ", sockaddr_storage_iptostring(tmpip)); + } + else if (mExtAddrFinder->hasValidIPV6(tmpip)) + { + sockaddr_storage_setport(tmpip, guessNewExtPort()); + + mNetFlags.mExtAddrOk = true; + + address_votes[tmpip].n++ ; + + /* XXX HACK TO FIX drbob: ALLOWING + * ExtAddrFinder -> ExtAddrStableOk = true + * (which it is not normally) */ + mNetFlags.mExtAddrStableOk = true; + + RS_DBG("Reported external IPv6 address ", sockaddr_storage_iptostring(tmpip)); } } } @@ -967,7 +986,7 @@ void p3NetMgrIMPL::netExtCheck() if (netSetupDone) { - std::cerr << "p3NetMgrIMPL::netExtCheck() netSetupDone" << std::endl; + RS_DBG("netSetupDone"); /* Setup NetStateBox with this info */ updateNetStateBox_startup(); @@ -978,12 +997,14 @@ void p3NetMgrIMPL::netExtCheck() mPeerMgr->UpdateOwnAddress(mLocalAddr, mExtAddr); } - /* inform DHT about our external address */ - RsPeerId fakeId; - netAssistKnownPeer(fakeId, mExtAddr, NETASSIST_KNOWN_PEER_SELF | NETASSIST_KNOWN_PEER_ONLINE); + /* inform DHT about our external IPV4 address, it doesn't support IPv6 for now.*/ + if(sockaddr_storage_ipv6_to_ipv4(mExtAddr)) + { + RsPeerId fakeId; + netAssistKnownPeer(fakeId, mExtAddr, NETASSIST_KNOWN_PEER_SELF | NETASSIST_KNOWN_PEER_ONLINE); + } - std::cerr << __PRETTY_FUNCTION__ << " Network Setup Complete" - << std::endl; + RS_INFO("Network Setup Complete"); } } @@ -994,7 +1015,8 @@ void p3NetMgrIMPL::netExtCheck() bool p3NetMgrIMPL::checkNetAddress() { bool addrChanged = false; - bool validAddr = false; + bool validAddr = false; + bool needOwnAddrUpdate = false; sockaddr_storage prefAddr; sockaddr_storage oldAddr; @@ -1067,8 +1089,7 @@ bool p3NetMgrIMPL::checkNetAddress() if (!validAddr) { - RsErr() << __PRETTY_FUNCTION__ << " no valid local network address " - <<" found. Report to developers." << std::endl; + RS_ERR("no valid local network address found. Report to developers."); print_stacktrace(); return false; @@ -1109,6 +1130,7 @@ bool p3NetMgrIMPL::checkNetAddress() sockaddr_storage_setport(mExtAddr, port); // this accounts for when the port was updated addrChanged = true; } + } // RS_STACK_MUTEX(mNetMtx); if (addrChanged) @@ -1123,11 +1145,24 @@ bool p3NetMgrIMPL::checkNetAddress() rsEvents->postEvent(ev); } - if (mPeerMgr) mPeerMgr->UpdateOwnAddress(mLocalAddr, mExtAddr); + needOwnAddrUpdate = true; netReset(); } + if (mPeerMgr) + { + // Retrieve last known IP, if none, update own addresse to get current. + peerState ps; + mPeerMgr->getOwnNetStatus(ps); + needOwnAddrUpdate |= ps.ipAddrs.mLocal.mAddrs.empty(); + needOwnAddrUpdate |= ps.ipAddrs.mExt.mAddrs.empty(); + if (needOwnAddrUpdate) + { + mPeerMgr->UpdateOwnAddress(mLocalAddr, mExtAddr); + } + } + return true; } @@ -1139,7 +1174,7 @@ bool p3NetMgrIMPL::checkNetAddress() /* to allow resets of network stuff */ void p3NetMgrIMPL::addNetListener(pqiNetListener *listener) { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ mNetListeners.push_back(listener); } @@ -1149,7 +1184,7 @@ bool p3NetMgrIMPL::setLocalAddress(const struct sockaddr_storage &addr) { bool changed = false; { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ if (!sockaddr_storage_same(mLocalAddr, addr)) { changed = true; @@ -1171,7 +1206,7 @@ bool p3NetMgrIMPL::setLocalAddress(const struct sockaddr_storage &addr) } bool p3NetMgrIMPL::getExtAddress(struct sockaddr_storage& addr) { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ if(mNetFlags.mExtAddrOk) { @@ -1186,7 +1221,7 @@ bool p3NetMgrIMPL::setExtAddress(const struct sockaddr_storage &addr) { bool changed = false; { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ if (!sockaddr_storage_same(mExtAddr, addr)) { changed = true; @@ -1220,7 +1255,7 @@ bool p3NetMgrIMPL::setNetworkMode(uint32_t netMode) { uint32_t oldNetMode; { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ /* only change TRY flags */ oldNetMode = mNetMode; @@ -1266,7 +1301,7 @@ bool p3NetMgrIMPL::setNetworkMode(uint32_t netMode) bool p3NetMgrIMPL::setVisState(uint16_t vs_disc, uint16_t vs_dht) { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ mVsDisc = vs_disc; mVsDht = vs_dht; @@ -1628,7 +1663,7 @@ void p3NetMgrIMPL::getNetStatus(pqiNetStatus &status) uint32_t netsize = 0, rsnetsize = 0; netAssistConnectStats(netsize, rsnetsize); - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ /* quick update of the stuff that can change! */ mNetFlags.mDhtOk = dhtOk; @@ -1652,7 +1687,7 @@ void p3NetMgrIMPL::getNetStatus(pqiNetStatus &status) bool p3NetMgrIMPL::getIPServersEnabled() { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ return mUseExtAddrFinder; } @@ -1661,15 +1696,32 @@ void p3NetMgrIMPL::getIPServersList(std::list& ip_servers) mExtAddrFinder->getIPServersList(ip_servers); } +void p3NetMgrIMPL::getCurrentExtIPList(std::list& ip_list) +{ + ip_list.clear(); + sockaddr_storage addr; + if(mExtAddrFinder->hasValidIPV4(addr)) + ip_list.push_back(sockaddr_storage_iptostring(addr)); + if(mExtAddrFinder->hasValidIPV6(addr)) + ip_list.push_back(sockaddr_storage_iptostring(addr)); +} + void p3NetMgrIMPL::setIPServersEnabled(bool b) { + if (mUseExtAddrFinder != b) { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + mExtAddrFinder->reset(true); + if (b) + mExtAddrFinder->start_request(); + } + + { + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ mUseExtAddrFinder = b; } #ifdef NETMGR_DEBUG - std::cerr << "p3NetMgr: setIPServers to " << b << std::endl ; + RS_DBG("set mUseExtAddrFinder to ", b); #endif } @@ -1682,31 +1734,31 @@ void p3NetMgrIMPL::setIPServersEnabled(bool b) RsNetState p3NetMgrIMPL::getNetStateMode() { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ return mNetStateBox.getNetStateMode(); } RsNetworkMode p3NetMgrIMPL::getNetworkMode() { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ return mNetStateBox.getNetworkMode(); } RsNatTypeMode p3NetMgrIMPL::getNatTypeMode() { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ return mNetStateBox.getNatTypeMode(); } RsNatHoleMode p3NetMgrIMPL::getNatHoleMode() { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ return mNetStateBox.getNatHoleMode(); } RsConnectModes p3NetMgrIMPL::getConnectModes() { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ return mNetStateBox.getConnectModes(); } @@ -1730,7 +1782,7 @@ void p3NetMgrIMPL::updateNetStateBox_temporal() /* input network bits */ if (mDhtStunner->getExternalAddr(tmpaddr, isstable)) { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ mNetStateBox.setAddressStunDht(tmpaddr, isstable); #ifdef NETMGR_DEBUG_STATEBOX @@ -1749,7 +1801,7 @@ void p3NetMgrIMPL::updateNetStateBox_temporal() /* input network bits */ if (mProxyStunner->getExternalAddr(tmpaddr, isstable)) { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ mNetStateBox.setAddressStunProxy(tmpaddr, isstable); #ifdef NETMGR_DEBUG_STATEBOX @@ -1768,7 +1820,7 @@ void p3NetMgrIMPL::updateNetStateBox_temporal() bool dhtOn = netAssistConnectEnabled(); bool dhtActive = netAssistConnectActive(); - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ mNetStateBox.setDhtState(dhtOn, dhtActive); } @@ -1777,7 +1829,7 @@ void p3NetMgrIMPL::updateNetStateBox_temporal() #ifdef NETMGR_DEBUG_STATEBOX { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ auto netstate = mNetStateBox.getNetStateMode(); auto netMode = mNetStateBox.getNetworkMode(); @@ -1823,7 +1875,7 @@ void p3NetMgrIMPL::updateNatSetting() RsNatTypeMode natType = RsNatTypeMode::UNKNOWN; RsNatHoleMode natHole = RsNatHoleMode::UNKNOWN; { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ natType = mNetStateBox.getNatTypeMode(); natHole = mNetStateBox.getNatHoleMode(); @@ -1925,7 +1977,7 @@ void p3NetMgrIMPL::updateNetStateBox_startup() std::cerr << std::endl; #endif { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ /* fill in the data */ struct sockaddr_storage tmpip; @@ -1973,8 +2025,8 @@ void p3NetMgrIMPL::updateNetStateBox_startup() /* ExtAddrFinder */ if (mUseExtAddrFinder) { - tmpip = mLocalAddr; - bool extFinderOk = mExtAddrFinder->hasValidIP(tmpip); + tmpip = mLocalAddr; + bool extFinderOk = mExtAddrFinder->hasValidIPV4(tmpip); if (extFinderOk) { @@ -2020,7 +2072,7 @@ void p3NetMgrIMPL::updateNetStateBox_startup() void p3NetMgrIMPL::updateNetStateBox_reset() { { - RsStackMutex stack(mNetMtx); /****** STACK LOCK MUTEX *******/ + RS_STACK_MUTEX(mNetMtx); /****** STACK LOCK MUTEX *******/ mNetStateBox.reset(); diff --git a/libretroshare/src/pqi/p3netmgr.h b/libretroshare/src/pqi/p3netmgr.h index a847c07b1..e7b341098 100644 --- a/libretroshare/src/pqi/p3netmgr.h +++ b/libretroshare/src/pqi/p3netmgr.h @@ -120,6 +120,7 @@ virtual bool shutdown() = 0; /* blocking shutdown call */ virtual bool getIPServersEnabled() = 0; virtual void setIPServersEnabled(bool b) = 0; virtual void getIPServersList(std::list& ip_servers) = 0; +virtual void getCurrentExtIPList(std::list& ip_list) = 0; // ONLY USED by p3face-config.cc WHICH WILL BE REMOVED. virtual void getNetStatus(pqiNetStatus &status) = 0; @@ -171,6 +172,7 @@ virtual bool shutdown(); /* blocking shutdown call */ virtual bool getIPServersEnabled(); virtual void setIPServersEnabled(bool b); virtual void getIPServersList(std::list& ip_servers); +virtual void getCurrentExtIPList(std::list& ip_list); // ONLY USED by p3face-config.cc WHICH WILL BE REMOVED. virtual void getNetStatus(pqiNetStatus &status); @@ -307,12 +309,13 @@ void netStatusReset_locked(); uint16_t mVsDisc; uint16_t mVsDht; - rstime_t mNetInitTS; + rstime_t mNetInitTS; uint32_t mNetStatus; bool mStatusChanged; - bool mUseExtAddrFinder; + bool mUseExtAddrFinder; + rstime_t mNetExtAddrFinderTs; /* network status flags (read by rsiface) */ pqiNetStatus mNetFlags; diff --git a/libretroshare/src/pqi/pqissl.cc b/libretroshare/src/pqi/pqissl.cc index 76d447cc8..1cfff8fbd 100644 --- a/libretroshare/src/pqi/pqissl.cc +++ b/libretroshare/src/pqi/pqissl.cc @@ -1742,6 +1742,13 @@ bool pqissl::moretoread(uint32_t usec) { rslog(RSL_ALERT, pqisslzone, "pqissl::moretoread() Select ERROR!"); + RS_WARN(strerror(errno)); + + if (errno == EBADF) { + // happens when SAM is shut down + rslog(RSL_ALERT, pqisslzone, "pqissl::moretoread() -> calling reset()"); + reset_locked(); + } return 0; } diff --git a/libretroshare/src/pqi/pqissli2pbob.cpp b/libretroshare/src/pqi/pqissli2pbob.cpp deleted file mode 100644 index 5551ce788..000000000 --- a/libretroshare/src/pqi/pqissli2pbob.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************* - * libretroshare/src/pqi: pqissli2pbob.cc * - * * - * libretroshare: retroshare core library * - * * - * Copyright 2016 by Sehraf * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * 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 Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ -#include "pqissli2pbob.h" - -bool pqissli2pbob::connect_parameter(uint32_t type, const std::string &value) -{ - if (type == NET_PARAM_CONNECT_DOMAIN_ADDRESS) - { - RS_STACK_MUTEX(mSslMtx); - // a new line must be appended! - mI2pAddr = value + '\n'; - return true; - } - - return pqissl::connect_parameter(type, value); -} - -int pqissli2pbob::Basic_Connection_Complete() -{ - int ret; - - if ((ret = pqissl::Basic_Connection_Complete()) != 1) - { - // basic connection not complete. - return ret; - } - - // send addr. (new line is already appended) - ret = send(sockfd, mI2pAddr.c_str(), mI2pAddr.length(), 0); - if (ret != (int)mI2pAddr.length()) - return -1; - return 1; -} diff --git a/libretroshare/src/pqi/pqissli2pbob.h b/libretroshare/src/pqi/pqissli2pbob.h deleted file mode 100644 index b1a643a75..000000000 --- a/libretroshare/src/pqi/pqissli2pbob.h +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************* - * libretroshare/src/pqi: pqissli2pbob.h * - * * - * libretroshare: retroshare core library * - * * - * Copyright 2016 by Sehraf * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * 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 Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ -#ifndef PQISSLI2PBOB_H -#define PQISSLI2PBOB_H - -#include "pqi/pqissl.h" - -/* - * This class is a minimal varied version of pqissl to work with I2P BOB tunnels. - * The only difference is that the [.b32].i2p addresses must be sent first. - * - * Everything else is untouched. - */ - -class pqissli2pbob : public pqissl -{ -public: - pqissli2pbob(pqissllistener *l, PQInterface *parent, p3LinkMgr *lm) - : pqissl(l, parent, lm) {} - - // NetInterface interface -public: - bool connect_parameter(uint32_t type, const std::string &value); - - // pqissl interface -protected: - int Basic_Connection_Complete(); - -private: - std::string mI2pAddr; -}; - -#endif // PQISSLI2PBOB_H diff --git a/libretroshare/src/pqi/pqissli2psam3.cpp b/libretroshare/src/pqi/pqissli2psam3.cpp new file mode 100644 index 000000000..1e0f5d433 --- /dev/null +++ b/libretroshare/src/pqi/pqissli2psam3.cpp @@ -0,0 +1,261 @@ +#include "pqissli2psam3.h" + +#include + +RS_SET_CONTEXT_DEBUG_LEVEL(2) + +static constexpr int pqiDone = 1; +static constexpr int pqiWait = 0; +static constexpr int pqiError = -1; + +pqissli2psam3::pqissli2psam3(pqissllistener *l, PQInterface *parent, p3LinkMgr *lm) + : pqissl(l, parent, lm), mState(pqisslSam3State::NONE), mI2pAddrB32(), mI2pAddrLong() +{ + RS_DBG4(); + mConn = nullptr; +} + +bool pqissli2psam3::connect_parameter(uint32_t type, const std::string &value) +{ + RS_DBG4(); + + if (type == NET_PARAM_CONNECT_DOMAIN_ADDRESS) + { + RS_DBG1("got addr:", value); + RS_STACK_MUTEX(mSslMtx); + mI2pAddrB32 = value; + return true; + } + + return pqissl::connect_parameter(type, value); +} + +int pqissli2psam3::Initiate_Connection() +{ + RS_DBG4(); + + if(waiting != WAITING_DELAY) + { + RS_ERR("Already Attempt in Progress!"); + return pqiError; + } + + switch (mState) { + case(pqisslSam3State::NONE): + RS_DBG2("NONE"); + { + if(mConn) { + // how did we end up here? + RS_ERR("state is NONE but a connection is existing?!"); + } + mConn = 0; + // get SAM session + mConn = 0; + samSettings ss; + ss.session = nullptr; + rsAutoProxyMonitor::taskSync(autoProxyType::I2PSAM3, autoProxyTask::getSettings, static_cast(&ss)); + + if (!!ss.session) { + RS_DBG3("NONE->DO_LOOKUP"); + mState = pqisslSam3State::DO_LOOKUP; + } else { + RS_DBG3("NONE->DO_LOOKUP NOPE", ss.session); + } + } + break; + case(pqisslSam3State::DO_LOOKUP): + RS_DBG1("DO_LOOKUP"); + + if (!mI2pAddrLong.empty()) { + // skip lookup, it is highly unlikely/impossible for a public key to change (isn't it?) + mState = pqisslSam3State::WAIT_LOOKUP; + break; + } + + { + i2p::address *addr = new i2p::address; + addr->clear(); + addr->base32 = mI2pAddrB32; + rsAutoProxyMonitor::taskAsync(autoProxyType::I2PSAM3, autoProxyTask::lookupKey, this, static_cast(addr)); + } + mState = pqisslSam3State::WAIT_LOOKUP; + break; + case(pqisslSam3State::DO_CONNECT): + RS_DBG2("DO_CONNECT"); + + { + auto wrapper = new samEstablishConnectionWrapper(); + wrapper->address.clear(); + wrapper->address.publicKey = mI2pAddrLong; + wrapper->connection = nullptr; + + rsAutoProxyMonitor::taskAsync(autoProxyType::I2PSAM3, autoProxyTask::establishConnection, this, static_cast(wrapper)); + } + mState = pqisslSam3State::WAIT_CONNECT; + break; + case(pqisslSam3State::DONE): + RS_DBG2("DONE"); + + if (setupSocket()) + return pqiDone; + return pqiError; + + /* waiting */ + case(pqisslSam3State::WAIT_LOOKUP): + RS_DBG3("WAIT_LOOKUP"); + break; + case(pqisslSam3State::WAIT_CONNECT): + RS_DBG3("WAIT_CONNECT"); + break; + } + return pqiWait; +} + +int pqissli2psam3::net_internal_close(int fd) +{ + RS_DBG4(); + + // sanity check + if (mConn && fd != mConn->fd) { + // this should never happen! + RS_ERR("fd != mConn"); +// sam3CloseConnection(mConn); + } + + // now to the actuall closing + int ret = pqissl::net_internal_close(fd); + + rsAutoProxyMonitor::taskAsync(autoProxyType::I2PSAM3, autoProxyTask::closeConnection, this, mConn); + + // finally cleanup + mConn = 0; + mState = pqisslSam3State::NONE; + + return ret; +} + +void pqissli2psam3::taskFinished(taskTicket *&ticket) +{ + RS_DBG4(); + + switch (ticket->task) { + case autoProxyTask::lookupKey: + { + auto addr = static_cast(ticket->data); + + RS_STACK_MUTEX(mSslMtx); + if (ticket->result == autoProxyStatus::ok) { + mI2pAddrLong = addr->publicKey; + mState = pqisslSam3State::DO_CONNECT; + } else { + waiting = WAITING_FAIL_INTERFACE; + } + + delete addr; + ticket->data = nullptr; + addr = nullptr; + } + break; + case autoProxyTask::establishConnection: + { + auto wrapper = static_cast(ticket->data); + + RS_STACK_MUTEX(mSslMtx); + if (ticket->result == autoProxyStatus::ok) { + mConn = wrapper->connection; + mState = pqisslSam3State::DONE; + } else { + waiting = WAITING_FAIL_INTERFACE; + } + + delete wrapper; + ticket->data = nullptr; + wrapper = nullptr; + } + break; + case autoProxyTask::closeConnection: + // nothing to do here + break; + default: + RS_WARN("unkown task", ticket->task); + } + + // clean up! + delete ticket; + ticket = nullptr; +} + +bool pqissli2psam3::setupSocket() +{ + /* + * This function contains the generis part from pqissl::Initiate_Connection() + */ + int err; + int osock = mConn->fd; + + err = unix_fcntl_nonblock(osock); + if (err < 0) + { + RS_ERR("Cannot make socket NON-Blocking:", err); + + waiting = WAITING_FAIL_INTERFACE; + net_internal_close(osock); + return false; + } + +#ifdef WINDOWS_SYS + /* Set TCP buffer size for Windows systems */ + + int sockbufsize = 0; + int size = sizeof(int); + + err = getsockopt(osock, SOL_SOCKET, SO_RCVBUF, (char *)&sockbufsize, &size); +#ifdef PQISSL_DEBUG + if (err == 0) { + std::cerr << "pqissl::Initiate_Connection: Current TCP receive buffer size " << sockbufsize << std::endl; + } else { + std::cerr << "pqissl::Initiate_Connection: Error getting TCP receive buffer size. Error " << err << std::endl; + } +#endif + + sockbufsize = 0; + + err = getsockopt(osock, SOL_SOCKET, SO_SNDBUF, (char *)&sockbufsize, &size); +#ifdef PQISSL_DEBUG + if (err == 0) { + std::cerr << "pqissl::Initiate_Connection: Current TCP send buffer size " << sockbufsize << std::endl; + } else { + std::cerr << "pqissl::Initiate_Connection: Error getting TCP send buffer size. Error " << err << std::endl; + } +#endif + + sockbufsize = WINDOWS_TCP_BUFFER_SIZE; + + err = setsockopt(osock, SOL_SOCKET, SO_RCVBUF, (char *)&sockbufsize, sizeof(sockbufsize)); +#ifdef PQISSL_DEBUG + if (err == 0) { + std::cerr << "pqissl::Initiate_Connection: TCP receive buffer size set to " << sockbufsize << std::endl; + } else { + std::cerr << "pqissl::Initiate_Connection: Error setting TCP receive buffer size. Error " << err << std::endl; + } +#endif + + err = setsockopt(osock, SOL_SOCKET, SO_SNDBUF, (char *)&sockbufsize, sizeof(sockbufsize)); +#ifdef PQISSL_DEBUG + if (err == 0) { + std::cerr << "pqissl::Initiate_Connection: TCP send buffer size set to " << sockbufsize << std::endl; + } else { + std::cerr << "pqissl::Initiate_Connection: Error setting TCP send buffer size. Error " << err << std::endl; + } +#endif +#endif // WINDOWS_SYS + + + mTimeoutTS = time(NULL) + mConnectTimeout; + //std::cerr << "Setting Connect Timeout " << mConnectTimeout << " Seconds into Future " << std::endl; + + waiting = WAITING_SOCK_CONNECT; + sockfd = osock; + + return true; +} diff --git a/libretroshare/src/pqi/pqissli2psam3.h b/libretroshare/src/pqi/pqissli2psam3.h new file mode 100644 index 000000000..90fdff6e0 --- /dev/null +++ b/libretroshare/src/pqi/pqissli2psam3.h @@ -0,0 +1,47 @@ +#ifndef PQISSLI2PSAM3_H +#define PQISSLI2PSAM3_H + +#include "pqi/pqissl.h" +#include "services/autoproxy/rsautoproxymonitor.h" +#include "services/autoproxy/p3i2psam3.h" + +// Use a state machine as the whole pqi code is designed around them and some operation (like lookup) might be blocking +enum class pqisslSam3State : uint8_t { + NONE = 0, + DO_LOOKUP, + WAIT_LOOKUP, + DO_CONNECT, + WAIT_CONNECT, + DONE +}; + +class pqissli2psam3 : public pqissl, public autoProxyCallback +{ +public: + pqissli2psam3(pqissllistener *l, PQInterface *parent, p3LinkMgr *lm); + + // NetInterface interface +public: + bool connect_parameter(uint32_t type, const std::string &value); + + // pqissl interface +protected: + int Initiate_Connection(); + int net_internal_close(int fd); + + // autoProxyCallback interface +public: + void taskFinished(taskTicket *&ticket); + +private: + bool setupSocket(); + +private: + pqisslSam3State mState; + std::string mI2pAddrB32; + std::string mI2pAddrLong; + + Sam3Connection *mConn; +}; + +#endif // PQISSLI2PSAM3_H diff --git a/libretroshare/src/pqi/pqissllistener.h b/libretroshare/src/pqi/pqissllistener.h index 85af2d869..800ca876b 100644 --- a/libretroshare/src/pqi/pqissllistener.h +++ b/libretroshare/src/pqi/pqissllistener.h @@ -186,8 +186,8 @@ public: virtual int finaliseConnection(int fd, SSL *ssl, const RsPeerId& peerId, const sockaddr_storage &raddr); + RS_SET_CONTEXT_DEBUG_LEVEL(2) + private: std::map listenaddr; - - RS_SET_CONTEXT_DEBUG_LEVEL(2) }; diff --git a/libretroshare/src/pqi/pqisslpersongrp.cc b/libretroshare/src/pqi/pqisslpersongrp.cc index 7016a2fa6..328d64cae 100644 --- a/libretroshare/src/pqi/pqisslpersongrp.cc +++ b/libretroshare/src/pqi/pqisslpersongrp.cc @@ -46,7 +46,7 @@ static struct RsLog::logInfo pqipersongrpzoneInfo = {RsLog::Default, "pqipersong #endif #include "pqi/pqisslproxy.h" -#include "pqi/pqissli2pbob.h" +#include "pqi/pqissli2psam3.h" pqilistener * pqisslpersongrp::locked_createListener(const struct sockaddr_storage &laddr) { @@ -74,24 +74,26 @@ pqiperson * pqisslpersongrp::locked_createPerson(const RsPeerId& id, pqilistener std::cerr << std::endl; #endif - // Use pqicI2PBOB for I2P - pqiconnect *pqicSOCKSProxy, *pqicI2PBOB; + // Use pqicI2P for I2P + pqiconnect *pqicSOCKSProxy, *pqicI2P; { pqisslproxy *pqis = new pqisslproxy((pqissllistener *) listener, pqip, mLinkMgr); RsSerialiser *rss = new RsSerialiser(); rss->addSerialType(new RsRawSerialiser()); pqicSOCKSProxy = new pqiconnect(pqip, rss, pqis); } - if (rsAutoProxyMonitor::instance()->isEnabled(autoProxyType::I2PBOB)) +#ifdef RS_USE_I2P_SAM3 + if (rsAutoProxyMonitor::instance()->isEnabled(autoProxyType::I2PSAM3)) { - pqissli2pbob *pqis = new pqissli2pbob((pqissllistener *) listener, pqip, mLinkMgr); + pqissli2psam3 *pqis = new pqissli2psam3((pqissllistener *) listener, pqip, mLinkMgr); RsSerialiser *rss = new RsSerialiser(); rss->addSerialType(new RsRawSerialiser()); - pqicI2PBOB = new pqiconnect(pqip, rss, pqis); - } else { - pqicI2PBOB = pqicSOCKSProxy; + pqicI2P = new pqiconnect(pqip, rss, pqis); } + else +#endif // def RS_USE_I2P_SAM3 + pqicI2P = pqicSOCKSProxy; /* first select type based on peer */ @@ -101,7 +103,7 @@ pqiperson * pqisslpersongrp::locked_createPerson(const RsPeerId& id, pqilistener pqip -> addChildInterface(PQI_CONNECT_HIDDEN_TOR_TCP, pqicSOCKSProxy); break; case RS_HIDDEN_TYPE_I2P: - pqip -> addChildInterface(PQI_CONNECT_HIDDEN_I2P_TCP, pqicI2PBOB); + pqip -> addChildInterface(PQI_CONNECT_HIDDEN_I2P_TCP, pqicI2P); break; default: /* peer is not a hidden one but we are */ @@ -109,7 +111,7 @@ pqiperson * pqisslpersongrp::locked_createPerson(const RsPeerId& id, pqilistener uint32_t typeOwn = mPeerMgr->getHiddenType(AuthSSL::getAuthSSL()->OwnId()); switch (typeOwn) { case RS_HIDDEN_TYPE_I2P: - pqip -> addChildInterface(PQI_CONNECT_HIDDEN_I2P_TCP, pqicI2PBOB); + pqip -> addChildInterface(PQI_CONNECT_HIDDEN_I2P_TCP, pqicI2P); break; default: /* this case shouldn't happen! */ diff --git a/libretroshare/src/retroshare/rsevents.h b/libretroshare/src/retroshare/rsevents.h index a1ea3b399..80823dd56 100644 --- a/libretroshare/src/retroshare/rsevents.h +++ b/libretroshare/src/retroshare/rsevents.h @@ -91,8 +91,8 @@ enum class RsEventType : uint32_t /// @see RsGxsPostedEvent GXS_IDENTITY = 12, - /// @see RsFiles - SHARED_DIRECTORIES = 13, + /// @see RsFiles @deprecated + SHARED_DIRECTORIES = 13, /// @see RsFiles FILE_TRANSFER = 14, @@ -100,8 +100,11 @@ enum class RsEventType : uint32_t /// @see RsMsgs CHAT_MESSAGE = 15, - /// @see rspeers.h - NETWORK = 16, + /// @see rspeers.h + NETWORK = 16, + + /** Emitted to update library clients about file hashing being completed */ + FILE_HASHING_COMPLETED = 20, /// @see rspeers.h TOR_MANAGER = 17, diff --git a/libretroshare/src/retroshare/rsfiles.h b/libretroshare/src/retroshare/rsfiles.h index f25d90957..17b68aede 100644 --- a/libretroshare/src/retroshare/rsfiles.h +++ b/libretroshare/src/retroshare/rsfiles.h @@ -194,7 +194,8 @@ enum class RsFileTransferEventCode: uint8_t { COMPLETED_FILES_REMOVED = 0x02, // }; -struct RsSharedDirectoriesEvent: RsEvent +struct RS_DEPRECATED_FOR("Packing arbitrary data into an std::string is bad idea") +RsSharedDirectoriesEvent: RsEvent { RsSharedDirectoriesEvent() : RsEvent(RsEventType::SHARED_DIRECTORIES), mEventCode(RsSharedDirectoriesEventCode::UNKNOWN) {} ~RsSharedDirectoriesEvent() override = default; @@ -212,6 +213,31 @@ struct RsSharedDirectoriesEvent: RsEvent std::string mMessage; }; +struct RsFileHashingCompletedEvent: RsEvent +{ + RsFileHashingCompletedEvent(): + RsEvent(RsEventType::FILE_HASHING_COMPLETED), mHashingSpeed(0) {} + + ///* @see RsEvent @see RsSerializable + void serial_process( RsGenericSerializer::SerializeJob j, + RsGenericSerializer::SerializeContext& ctx ) override + { + RsEvent::serial_process(j, ctx); + RS_SERIAL_PROCESS(mFilePath); + RS_SERIAL_PROCESS(mFileHash); + RS_SERIAL_PROCESS(mHashingSpeed); + } + + /// Complete path of the file being hashed + std::string mFilePath; + + /// File hash, null if error occurred + RsFileHash mFileHash; + + /// Hashing speed in MB/s + double mHashingSpeed; +}; + struct RsFileTransferEvent: RsEvent { RsFileTransferEvent() : RsEvent(RsEventType::FILE_TRANSFER), mFileTransferEventCode(RsFileTransferEventCode::UNKNOWN) {} diff --git a/libretroshare/src/retroshare/rsgxscircles.h b/libretroshare/src/retroshare/rsgxscircles.h index 32bc8e547..40916f234 100644 --- a/libretroshare/src/retroshare/rsgxscircles.h +++ b/libretroshare/src/retroshare/rsgxscircles.h @@ -4,7 +4,8 @@ * libretroshare: retroshare core library * * * * Copyright (C) 2012-2014 Robert Fernie * - * Copyright (C) 2018-2019 Gioacchino Mazzurco * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -46,7 +47,7 @@ extern RsGxsCircles* rsGxsCircles; enum class RsGxsCircleType : uint32_t // 32 bit overkill, just for retrocompat { UNKNOWN = 0, /// Used to detect uninizialized values. - PUBLIC = 1, /// Public distribution, based on GxsIds + PUBLIC = 1, /// Public distribution EXTERNAL = 2, /// Restricted to an external circle, based on GxsIds NODES_GROUP = 3, /// Restricted to a group of friend nodes, the administrator of the circle behave as a hub for them diff --git a/libretroshare/src/retroshare/rsgxsforums.h b/libretroshare/src/retroshare/rsgxsforums.h index 83a961fc3..4967d46c5 100644 --- a/libretroshare/src/retroshare/rsgxsforums.h +++ b/libretroshare/src/retroshare/rsgxsforums.h @@ -4,8 +4,8 @@ * libretroshare: retroshare core library * * * * Copyright (C) 2012-2014 Robert Fernie * - * Copyright (C) 2018-2020 Gioacchino Mazzurco * - * Copyright (C) 2019-2020 Asociación Civil Altermundi * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -115,9 +115,13 @@ enum class RsForumEventCode: uint8_t READ_STATUS_CHANGED = 0x06, /// msg was read or marked unread STATISTICS_CHANGED = 0x07, /// suppliers and how many messages they have changed MODERATOR_LIST_CHANGED = 0x08, /// forum moderation list has changed. - SYNC_PARAMETERS_UPDATED = 0x0a, /// sync and storage times have changed - PINNED_POSTS_CHANGED = 0x0b, /// some posts where pinned or un-pinned - DELETED_FORUM = 0x0c, /// forum was deleted by cleaning + SYNC_PARAMETERS_UPDATED = 0x0a, /// sync and storage times have changed + PINNED_POSTS_CHANGED = 0x0b, /// some posts where pinned or un-pinned + DELETED_FORUM = 0x0c, /// forum was deleted by cleaning + DELETED_POST = 0x0d, /// Post deleted (usually by cleaning) + + /// Distant search result received + DISTANT_SEARCH_RESULT = 0x0e }; struct RsGxsForumEvent: RsEvent @@ -129,8 +133,8 @@ struct RsGxsForumEvent: RsEvent RsForumEventCode mForumEventCode; RsGxsGroupId mForumGroupId; RsGxsMessageId mForumMsgId; - std::list mModeratorsAdded; - std::list mModeratorsRemoved; + std::list mModeratorsAdded; + std::list mModeratorsRemoved; ///* @see RsEvent @see RsSerializable void serial_process( @@ -141,7 +145,6 @@ struct RsGxsForumEvent: RsEvent RS_SERIAL_PROCESS(mForumEventCode); RS_SERIAL_PROCESS(mForumGroupId); RS_SERIAL_PROCESS(mForumMsgId); - RS_SERIAL_PROCESS(mForumMsgId); RS_SERIAL_PROCESS(mModeratorsAdded); RS_SERIAL_PROCESS(mModeratorsRemoved); } @@ -149,6 +152,29 @@ struct RsGxsForumEvent: RsEvent ~RsGxsForumEvent() override; }; +/** This event is fired once distant search results are received */ +struct RsGxsForumsDistantSearchEvent: RsEvent +{ + RsGxsForumsDistantSearchEvent(): + RsEvent(RsEventType::GXS_FORUMS), + mForumEventCode(RsForumEventCode::DISTANT_SEARCH_RESULT) {} + + RsForumEventCode mForumEventCode; + TurtleRequestId mSearchId; + std::vector mSearchResults; + + ///* @see RsEvent @see RsSerializable + void serial_process( RsGenericSerializer::SerializeJob j, + RsGenericSerializer::SerializeContext& ctx ) override + { + RsEvent::serial_process(j, ctx); + + RS_SERIAL_PROCESS(mForumEventCode); + RS_SERIAL_PROCESS(mSearchId); + RS_SERIAL_PROCESS(mSearchResults); + } +}; + class RsGxsForums: public RsGxsIfaceHelper { public: @@ -385,6 +411,50 @@ public: const RsGxsGroupId& forumId, const RsGxsMessageId& postId, bool keepForever ) = 0; + /** + * @brief Get forum content summaries + * @jsonapi{development} + * @param[in] forumId id of the forum of which the content is requested + * @param[in] contentIds ids of requested contents, if empty summaries of + * all messages are reqeusted + * @param[out] summaries storage for summaries + * @return success or error details if something failed + */ + virtual std::error_condition getContentSummaries( + const RsGxsGroupId& forumId, + const std::set& contentIds, + std::vector& summaries ) = 0; + + /** + * @brief Search the whole reachable network for matching forums and + * posts + * @jsonapi{development} + * An @see RsGxsForumsDistantSearchEvent is emitted when matching results + * arrives from the network + * @param[in] matchString string to search into the forum and posts + * @param[out] searchId storage for search id, useful to track search events + * and retrieve search results + * @return success or error details + */ + virtual std::error_condition distantSearchRequest( + const std::string& matchString, TurtleRequestId& searchId ) = 0; + + /** + * @brief Search the local index for matching forums and posts + * @jsonapi{development} + * @param[in] matchString string to search into the index + * @param[out] searchResults storage for searchr esults + * @return success or error details + */ + virtual std::error_condition localSearch( + const std::string& matchString, + std::vector& searchResults ) = 0; + + + //////////////////////////////////////////////////////////////////////////// + /* Following functions are deprecated and should not be considered a stable + * to use API */ + /** * @brief Create forum. Blocking API. * @jsonapi{development} diff --git a/libretroshare/src/retroshare/rsgxsiface.h b/libretroshare/src/retroshare/rsgxsiface.h index ce64bf4ed..eca8b009e 100644 --- a/libretroshare/src/retroshare/rsgxsiface.h +++ b/libretroshare/src/retroshare/rsgxsiface.h @@ -4,7 +4,8 @@ * libretroshare: retroshare core library * * * * Copyright (C) 2012 Christopher Evi-Parker * - * Copyright (C) 2019 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -31,13 +32,63 @@ #include "rsitems/rsserviceids.h" #include "retroshare/rsevents.h" +/*! + * This structure is used to transport GXS search results. + * It contains the group information as well as a context string to tell where + * the information was found. + * Keep it small as to make search responses as light as possible. + * It differs from RsGxsGroupSearchResults because it supports also results from + * message matches not just groups. + */ +struct RsGxsSearchResult : RsSerializable +{ + RsGxsSearchResult(): mPublishTs(0) {} + + /** Id of the group which match*/ + RsGxsGroupId mGroupId; + + /** Title of the group which match */ + std::string mGroupName; + + /** Optional message id if the search match is against a message */ + RsGxsMessageId mMsgId; + + /** Optional message title if the search match is against a message */ + std::string mMsgName; + + /** Author id of the element which matched (group or message) */ + RsGxsId mAuthorId; + + /** Publish timestamp of the element which matched (group or message) */ + rstime_t mPublishTs; + + /** A snippet of content around the exact match */ + std::string mSearchContext; + + /// @see RsSerializable::serial_process + void serial_process( RsGenericSerializer::SerializeJob j, + RsGenericSerializer::SerializeContext& ctx ) + { + RS_SERIAL_PROCESS(mGroupId); + RS_SERIAL_PROCESS(mGroupName); + RS_SERIAL_PROCESS(mMsgId); + RS_SERIAL_PROCESS(mMsgName); + RS_SERIAL_PROCESS(mAuthorId); + RS_SERIAL_PROCESS(mPublishTs); + RS_SERIAL_PROCESS(mSearchContext); + } + + virtual ~RsGxsSearchResult() = default; +}; + /*! * This structure is used to transport group summary information when a GXS * service is searched. It contains the group information as well as a context * string to tell where the information was found. It is more compact than a * GroupMeta object, so as to make search responses as light as possible. */ -struct RsGxsGroupSummary : RsSerializable +struct RS_DEPRECATED_FOR(RsGxsSearchResult) +RsGxsGroupSummary : RsSerializable { RsGxsGroupSummary() : mPublishTs(0), mNumberOfMessages(0),mLastMessageTs(0), @@ -78,8 +129,12 @@ struct RsGxsGroupSummary : RsSerializable * strings to tell where the information was found. It is more compact than a * GroupMeta object, so as to make search responses as light as possible. */ -struct RsGxsGroupSearchResults : RsSerializable +struct RS_DEPRECATED_FOR(RsGxsSearchResult) +RsGxsGroupSearchResults : RsSerializable { + /* TODO: This seems exactly the same as RsGxsGroupSummary + mSearchContexts + * do we really need both? */ + RsGxsGroupSearchResults() : mPublishTs(0), mNumberOfMessages(0),mLastMessageTs(0), mSignFlags(0),mPopularity(0) {} @@ -113,6 +168,7 @@ struct RsGxsGroupSearchResults : RsSerializable virtual ~RsGxsGroupSearchResults() = default; }; + /*! * Stores ids of changed gxs groups and messages. * It is used to notify about GXS changes. diff --git a/libretroshare/src/retroshare/rsgxsifacehelper.h b/libretroshare/src/retroshare/rsgxsifacehelper.h index 4339f95f0..a6680afc6 100644 --- a/libretroshare/src/retroshare/rsgxsifacehelper.h +++ b/libretroshare/src/retroshare/rsgxsifacehelper.h @@ -1,536 +1,561 @@ -/******************************************************************************* - * libretroshare/src/retroshare: rsgxsifacehelper.h * - * * - * libretroshare: retroshare core library * - * * - * Copyright (C) 2011 Christopher Evi-Parker * - * Copyright (C) 2018-2020 Gioacchino Mazzurco * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * 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 Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ -#pragma once - -#include -#include - -#include "retroshare/rsgxsiface.h" -#include "retroshare/rsservicecontrol.h" -#include "retroshare/rsreputations.h" -#include "rsgxsflags.h" -#include "util/rsdeprecate.h" -#include "util/rsdebug.h" - -/*! - * This class only make method of internal members visible tu upper level to - * offer a more friendly API. - * This is just a workaround to awkward GXS API design, do not take it as an - * example for your coding. - * To properly fix the API design many changes with the implied chain reactions - * are necessary, so at this point this workaround seems acceptable. - */ - -//================================== -// #define DEBUG_GXSIFACEHELPER 1 -//================================== - -enum class TokenRequestType: uint8_t -{ - __NONE = 0x00, /// Used to detect uninitialized - GROUP_DATA = 0x01, - GROUP_META = 0x02, - GROUP_IDS = 0x03, - POSTS = 0x04, - ALL_POSTS = 0x05, - MSG_RELATED_INFO = 0x06, - GROUP_STATISTICS = 0x07, - SERVICE_STATISTICS = 0x08, - NO_KILL_TYPE = 0x09, - __MAX /// Used to detect out of range -}; - -class RsGxsIfaceHelper -{ -public: - /*! - * @param gxs handle to RsGenExchange instance of service (Usually the - * service class itself) - */ - explicit RsGxsIfaceHelper(RsGxsIface& gxs) : - mGxs(gxs), mTokenService(*gxs.getTokenService()), mMtx("GxsIfaceHelper") - {} - - ~RsGxsIfaceHelper() = default; - -#ifdef TO_REMOVE - /*! - * Gxs services should call this for automatic handling of - * changes, send - * @param changes - */ - void receiveChanges(std::vector &changes) - { - mGxs.receiveChanges(changes); - } -#endif - - /* Generic Lists */ - - /*! - * Retrieve list of group ids associated to a request token - * @param token token to be redeemed for this request - * @param groupIds the ids return for given request token - * @return false if request token is invalid, check token status for error report - */ - bool getGroupList(const uint32_t &token, std::list &groupIds) - { - return mGxs.getGroupList(token, groupIds); - } - - /*! - * Retrieves list of msg ids associated to a request token - * @param token token to be redeemed for this request - * @param msgIds the ids return for given request token - * @return false if request token is invalid, check token status for error report - */ - bool getMsgList(const uint32_t &token, - GxsMsgIdResult& msgIds) - { - return mGxs.getMsgList(token, msgIds); - } - - /*! - * Retrieves list of msg related ids associated to a request token - * @param token token to be redeemed for this request - * @param msgIds the ids return for given request token - * @return false if request token is invalid, check token status for error report - */ - bool getMsgRelatedList(const uint32_t &token, MsgRelatedIdResult &msgIds) - { - return mGxs.getMsgRelatedList(token, msgIds); - } - - /*! - * @param token token to be redeemed for group summary request - * @param groupInfo the ids returned for given request token - * @return false if request token is invalid, check token status for error report - */ - bool getGroupSummary(const uint32_t &token, std::list &groupInfo) - { - return mGxs.getGroupMeta(token, groupInfo); - } - - /*! - * @param token token to be redeemed for message summary request - * @param msgInfo the message metadata returned for given request token - * @return false if request token is invalid, check token status for error report - */ - bool getMsgSummary(const uint32_t &token, GxsMsgMetaMap &msgInfo) - { - return mGxs.getMsgMeta(token, msgInfo); - } - - /*! - * @param token token to be redeemed for message related summary request - * @param msgInfo the message metadata returned for given request token - * @return false if request token is invalid, check token status for error report - */ - bool getMsgRelatedSummary(const uint32_t &token, GxsMsgRelatedMetaMap &msgInfo) - { - return mGxs.getMsgRelatedMeta(token, msgInfo); - } - - /*! - * subscribes to group, and returns token which can be used - * to be acknowledged to get group Id - * @param token token to redeem for acknowledgement - * @param grpId the id of the group to subscribe to - */ - bool subscribeToGroup(uint32_t& token, const RsGxsGroupId& grpId, bool subscribe) - { - return mGxs.subscribeToGroup(token, grpId, subscribe); - } - - /*! - * This allows the client service to acknowledge that their msgs has - * been created/modified and retrieve the create/modified msg ids - * @param token the token related to modification/create request - * @param msgIds map of grpid->msgIds of message created/modified - * @return true if token exists false otherwise - */ - bool acknowledgeMsg(const uint32_t& token, std::pair& msgId) - { - return mGxs.acknowledgeTokenMsg(token, msgId); - } - - /*! - * This allows the client service to acknowledge that their grps has - * been created/modified and retrieve the create/modified grp ids - * @param token the token related to modification/create request - * @param msgIds vector of ids of groups created/modified - * @return true if token exists false otherwise - */ - bool acknowledgeGrp(const uint32_t& token, RsGxsGroupId& grpId) - { - return mGxs.acknowledgeTokenGrp(token, grpId); - } - - /*! - * Gets service statistic for a given services - * @param token value to to retrieve requested stats - * @param stats the status - * @return true if token exists false otherwise - */ - bool getServiceStatistic(const uint32_t& token, GxsServiceStatistic& stats) - { - return mGxs.getServiceStatistic(token, stats); - } - - /*! - * - * @param token to be redeemed - * @param stats the stats associated to token request - * @return true if token is false otherwise - */ - bool getGroupStatistic(const uint32_t& token, GxsGroupStatistic& stats) - { - return mGxs.getGroupStatistic(token, stats); - } - - /*! - * This determines the reputation threshold messages need to surpass in order - * for it to be accepted by local user from remote source - * NOTE: threshold only enforced if service require author signature - * @param token value set to be redeemed with acknowledgement - * @param grpId group id for cutoff value to be set - * @param CutOff The cut off value to set - */ - void setGroupReputationCutOff(uint32_t& token, const RsGxsGroupId& grpId, int CutOff) - { - return mGxs.setGroupReputationCutOff(token, grpId, CutOff); - } - - /*! - * @return storage/sync time of messages in secs - */ - uint32_t getDefaultStoragePeriod() - { - return mGxs.getDefaultStoragePeriod(); - } - uint32_t getStoragePeriod(const RsGxsGroupId& grpId) - { - return mGxs.getStoragePeriod(grpId); - } - void setStoragePeriod(const RsGxsGroupId& grpId,uint32_t age_in_secs) - { - mGxs.setStoragePeriod(grpId,age_in_secs); - } - uint32_t getDefaultSyncPeriod() - { - return mGxs.getDefaultSyncPeriod(); - } - uint32_t getSyncPeriod(const RsGxsGroupId& grpId) - { - return mGxs.getSyncPeriod(grpId); - } - void setSyncPeriod(const RsGxsGroupId& grpId,uint32_t age_in_secs) - { - mGxs.setSyncPeriod(grpId,age_in_secs); - } - - RsReputationLevel minReputationForForwardingMessages( - uint32_t group_sign_flags, uint32_t identity_flags ) - { - return mGxs.minReputationForForwardingMessages(group_sign_flags,identity_flags); - } - - /// @see RsTokenService::requestGroupInfo - bool requestGroupInfo( uint32_t& token, const RsTokReqOptions& opts, const std::list &groupIds, bool high_priority_request = false ) - { - TokenRequestType token_request_type; - - switch(opts.mReqType) - { - case GXS_REQUEST_TYPE_GROUP_DATA: token_request_type = TokenRequestType::GROUP_DATA; break; - case GXS_REQUEST_TYPE_GROUP_META: token_request_type = TokenRequestType::GROUP_META; break; - case GXS_REQUEST_TYPE_GROUP_IDS: token_request_type = TokenRequestType::GROUP_IDS; break; - default: - RsErr() << __PRETTY_FUNCTION__ << "(EE) Unexpected request type " << opts.mReqType << "!!" << std::endl; - return false; - } - - cancelActiveRequestTokens(token_request_type); - - if( mTokenService.requestGroupInfo(token, 0, opts, groupIds)) - { - RS_STACK_MUTEX(mMtx); - mActiveTokens[token]=high_priority_request? (TokenRequestType::NO_KILL_TYPE) : token_request_type; -#ifdef DEBUG_GXSIFACEHELPER - locked_dumpTokens(); -#endif - return true; - } - else - return false; - } - - /// @see RsTokenService::requestGroupInfo - bool requestGroupInfo(uint32_t& token, const RsTokReqOptions& opts, bool high_priority_request = false) - { - TokenRequestType token_request_type; - - switch(opts.mReqType) - { - case GXS_REQUEST_TYPE_GROUP_DATA: token_request_type = TokenRequestType::GROUP_DATA; break; - case GXS_REQUEST_TYPE_GROUP_META: token_request_type = TokenRequestType::GROUP_META; break; - case GXS_REQUEST_TYPE_GROUP_IDS: token_request_type = TokenRequestType::GROUP_IDS; break; - default: - RsErr() << __PRETTY_FUNCTION__ << "(EE) Unexpected request type " << opts.mReqType << "!!" << std::endl; - return false; - } - - cancelActiveRequestTokens(token_request_type); - - - if( mTokenService.requestGroupInfo(token, 0, opts)) - { - RS_STACK_MUTEX(mMtx); - mActiveTokens[token]=high_priority_request? (TokenRequestType::NO_KILL_TYPE) : token_request_type; -#ifdef DEBUG_GXSIFACEHELPER - locked_dumpTokens(); -#endif - return true; - } - else - return false; - } - - /// @see RsTokenService::requestMsgInfo - bool requestMsgInfo( uint32_t& token, const RsTokReqOptions& opts, const GxsMsgReq& msgIds ) - { - if(mTokenService.requestMsgInfo(token, 0, opts, msgIds)) - { - RS_STACK_MUTEX(mMtx); - - mActiveTokens[token]= (msgIds.size()==1 && msgIds.begin()->second.size()==0) ?(TokenRequestType::ALL_POSTS):(TokenRequestType::POSTS); -#ifdef DEBUG_GXSIFACEHELPER - locked_dumpTokens(); -#endif - return true; - } - else - return false; - } - - /// @see RsTokenService::requestMsgInfo - bool requestMsgInfo( uint32_t& token, const RsTokReqOptions& opts, const std::list& grpIds ) - { - if(mTokenService.requestMsgInfo(token, 0, opts, grpIds)) - { - RS_STACK_MUTEX(mMtx); - mActiveTokens[token]=TokenRequestType::ALL_POSTS; -#ifdef DEBUG_GXSIFACEHELPER - locked_dumpTokens(); -#endif - return true; - } - else - return false; - } - - /// @see RsTokenService::requestMsgRelatedInfo - bool requestMsgRelatedInfo( - uint32_t& token, const RsTokReqOptions& opts, - const std::vector& msgIds ) - { - if( mTokenService.requestMsgRelatedInfo(token, 0, opts, msgIds)) - { - RS_STACK_MUTEX(mMtx); - mActiveTokens[token]=TokenRequestType::MSG_RELATED_INFO; -#ifdef DEBUG_GXSIFACEHELPER - locked_dumpTokens(); -#endif - return true; - } - else - return false; - } - - /** - * @jsonapi{development} - * @param[in] token - */ - RsTokenService::GxsRequestStatus requestStatus(uint32_t token) - { return mTokenService.requestStatus(token); } - - /// @see RsTokenService::requestServiceStatistic - bool requestServiceStatistic(uint32_t& token) - { - RsTokReqOptions opts; - opts.mReqType = GXS_REQUEST_TYPE_SERVICE_STATS; - - mTokenService.requestServiceStatistic(token,opts); - - RS_STACK_MUTEX(mMtx); - mActiveTokens[token]=TokenRequestType::SERVICE_STATISTICS; - -#ifdef DEBUG_GXSIFACEHELPER - locked_dumpTokens(); -#endif - return true; - } - - /// @see RsTokenService::requestGroupStatistic - bool requestGroupStatistic(uint32_t& token, const RsGxsGroupId& grpId) - { - RsTokReqOptions opts; - opts.mReqType = GXS_REQUEST_TYPE_GROUP_STATS; - - mTokenService.requestGroupStatistic(token, grpId,opts); - - RS_STACK_MUTEX(mMtx); - mActiveTokens[token]=TokenRequestType::GROUP_STATISTICS; -#ifdef DEBUG_GXSIFACEHELPER - locked_dumpTokens(); -#endif - return true; - } - - bool cancelActiveRequestTokens(TokenRequestType type) - { - RS_STACK_MUTEX(mMtx); - for(auto it = mActiveTokens.begin();it!=mActiveTokens.end();) - if(it->second == type) - { - mTokenService.cancelRequest(it->first); - it = mActiveTokens.erase(it); - } - else - ++it; - - return true; - } - - /// @see RsTokenService::cancelRequest - bool cancelRequest(uint32_t token) - { - { - RS_STACK_MUTEX(mMtx); - mActiveTokens.erase(token); - } - return mTokenService.cancelRequest(token); - } - - /** - * @deprecated - * Token service methods are already exposed by this helper, so you should - * not need to get token service pointer directly anymore. - */ - RS_DEPRECATED RsTokenService* getTokenService() { return &mTokenService; } - -protected: - /** - * Block caller while request is being processed. - * Useful for blocking API implementation. - * @param[in] token token associated to the request caller is waiting for - * @param[in] maxWait maximum waiting time in milliseconds - * @param[in] checkEvery time in millisecond between status checks - * @param[in] auto_delete_if_unsuccessful delete the request when it fails. This avoid leaving useless pending requests in the queue that would slow down additional calls. - */ - RsTokenService::GxsRequestStatus waitToken( - uint32_t token, - std::chrono::milliseconds maxWait = std::chrono::milliseconds(20000), - std::chrono::milliseconds checkEvery = std::chrono::milliseconds(100), - bool auto_delete_if_unsuccessful=true) - { -#if defined(__ANDROID__) && (__ANDROID_API__ < 24) - auto wkStartime = std::chrono::steady_clock::now(); - int maxWorkAroundCnt = 10; -LLwaitTokenBeginLabel: -#endif - auto timeout = std::chrono::steady_clock::now() + maxWait; - auto st = requestStatus(token); - - while( !(st == RsTokenService::FAILED || st >= RsTokenService::COMPLETE) - && std::chrono::steady_clock::now() < timeout ) - { - std::this_thread::sleep_for(checkEvery); - st = requestStatus(token); - } - if(st != RsTokenService::COMPLETE && auto_delete_if_unsuccessful) - cancelRequest(token); - -#if defined(__ANDROID__) && (__ANDROID_API__ < 24) - /* Work around for very slow/old android devices, we don't expect this - * to be necessary on newer devices. If it take unreasonably long - * something worser is already happening elsewere and we return anyway. - */ - if( st > RsTokenService::FAILED && st < RsTokenService::COMPLETE - && maxWorkAroundCnt-- > 0 ) - { - maxWait *= 10; - checkEvery *= 3; - Dbg3() << __PRETTY_FUNCTION__ << " Slow Android device " - << " workaround st: " << st - << " maxWorkAroundCnt: " << maxWorkAroundCnt - << " maxWait: " << maxWait.count() - << " checkEvery: " << checkEvery.count() << std::endl; - goto LLwaitTokenBeginLabel; - } - Dbg3() << __PRETTY_FUNCTION__ << " lasted: " - << std::chrono::duration_cast( - std::chrono::steady_clock::now() - wkStartime ).count() - << "ms" << std::endl; - -#endif - - { - RS_STACK_MUTEX(mMtx); - mActiveTokens.erase(token); - } - - return st; - } - -private: - RsGxsIface& mGxs; - RsTokenService& mTokenService; - RsMutex mMtx; - - std::map mActiveTokens; - -#ifdef DEBUG_GXSIFACEHELPER - void locked_dumpTokens() - { - const uint16_t service_id = mGxs.serviceType(); - const auto countSize = static_cast(TokenRequestType::__MAX); - uint32_t count[countSize] = {0}; - - RsDbg rsdbg; - rsdbg << __PRETTY_FUNCTION__ << " Service 0x" << std::hex << service_id - << " (" << rsServiceControl->getServiceName( - RsServiceInfo::RsServiceInfoUIn16ToFullServiceId(service_id) ) - << ") this=0x" << static_cast(this) - << ") Active tokens (per type): "; - - // let's count how many token of each type we've got. - for(auto& it: mActiveTokens) ++count[static_cast(it.second)]; - - for(uint32_t i=0; i < countSize; ++i) - rsdbg /* << i << ":" */ << count[i] << " "; - } -#endif // def DEBUG_GXSIFACEHELPER - - RS_SET_CONTEXT_DEBUG_LEVEL(1) -}; +/******************************************************************************* + * libretroshare/src/retroshare: rsgxsifacehelper.h * + * * + * libretroshare: retroshare core library * + * * + * Copyright (C) 2011 Christopher Evi-Parker * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * 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 Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with this program. If not, see . * + * * + *******************************************************************************/ +#pragma once + +#include +#include + +#include "retroshare/rsgxsiface.h" +#include "retroshare/rsservicecontrol.h" +#include "retroshare/rsreputations.h" +#include "rsgxsflags.h" +#include "util/rsdeprecate.h" +#include "util/rsdebug.h" + +/*! + * This class only make method of internal members visible tu upper level to + * offer a more friendly API. + * This is just a workaround to awkward GXS API design, do not take it as an + * example for your coding. + * To properly fix the API design many changes with the implied chain reactions + * are necessary, so at this point this workaround seems acceptable. + */ + +//================================== +// #define DEBUG_GXSIFACEHELPER 1 +//================================== + +enum class TokenRequestType: uint8_t +{ + __NONE = 0x00, /// Used to detect uninitialized + GROUP_DATA = 0x01, + GROUP_META = 0x02, + GROUP_IDS = 0x03, + POSTS = 0x04, + ALL_POSTS = 0x05, + MSG_RELATED_INFO = 0x06, + GROUP_STATISTICS = 0x07, + SERVICE_STATISTICS = 0x08, + NO_KILL_TYPE = 0x09, + __MAX /// Used to detect out of range +}; + +class RsGxsIfaceHelper +{ +public: + /*! + * @param gxs handle to RsGenExchange instance of service (Usually the + * service class itself) + */ + explicit RsGxsIfaceHelper(RsGxsIface& gxs) : + mGxs(gxs), mTokenService(*gxs.getTokenService()), mMtx("GxsIfaceHelper") + {} + + ~RsGxsIfaceHelper() = default; + +#ifdef TO_REMOVE + /*! + * Gxs services should call this for automatic handling of + * changes, send + * @param changes + */ + void receiveChanges(std::vector &changes) + { + mGxs.receiveChanges(changes); + } +#endif + + /* Generic Lists */ + + /*! + * Retrieve list of group ids associated to a request token + * @param token token to be redeemed for this request + * @param groupIds the ids return for given request token + * @return false if request token is invalid, check token status for error report + */ + bool getGroupList(const uint32_t &token, std::list &groupIds) + { + return mGxs.getGroupList(token, groupIds); + } + + /*! + * Retrieves list of msg ids associated to a request token + * @param token token to be redeemed for this request + * @param msgIds the ids return for given request token + * @return false if request token is invalid, check token status for error report + */ + bool getMsgList(const uint32_t &token, + GxsMsgIdResult& msgIds) + { + return mGxs.getMsgList(token, msgIds); + } + + /*! + * Retrieves list of msg related ids associated to a request token + * @param token token to be redeemed for this request + * @param msgIds the ids return for given request token + * @return false if request token is invalid, check token status for error report + */ + bool getMsgRelatedList(const uint32_t &token, MsgRelatedIdResult &msgIds) + { + return mGxs.getMsgRelatedList(token, msgIds); + } + + /*! + * @param token token to be redeemed for group summary request + * @param groupInfo the ids returned for given request token + * @return false if request token is invalid, check token status for error report + */ + bool getGroupSummary(const uint32_t &token, std::list &groupInfo) + { + return mGxs.getGroupMeta(token, groupInfo); + } + + /*! + * @param token token to be redeemed for message summary request + * @param msgInfo the message metadata returned for given request token + * @return false if request token is invalid, check token status for error report + */ + bool getMsgSummary(const uint32_t &token, GxsMsgMetaMap &msgInfo) + { + return mGxs.getMsgMeta(token, msgInfo); + } + + /*! + * @param token token to be redeemed for message related summary request + * @param msgInfo the message metadata returned for given request token + * @return false if request token is invalid, check token status for error report + */ + bool getMsgRelatedSummary(const uint32_t &token, GxsMsgRelatedMetaMap &msgInfo) + { + return mGxs.getMsgRelatedMeta(token, msgInfo); + } + + /*! + * subscribes to group, and returns token which can be used + * to be acknowledged to get group Id + * @param token token to redeem for acknowledgement + * @param grpId the id of the group to subscribe to + */ + bool subscribeToGroup(uint32_t& token, const RsGxsGroupId& grpId, bool subscribe) + { + return mGxs.subscribeToGroup(token, grpId, subscribe); + } + + /*! + * This allows the client service to acknowledge that their msgs has + * been created/modified and retrieve the create/modified msg ids + * @param token the token related to modification/create request + * @param msgIds map of grpid->msgIds of message created/modified + * @return true if token exists false otherwise + */ + bool acknowledgeMsg(const uint32_t& token, std::pair& msgId) + { + return mGxs.acknowledgeTokenMsg(token, msgId); + } + + /*! + * This allows the client service to acknowledge that their grps has + * been created/modified and retrieve the create/modified grp ids + * @param token the token related to modification/create request + * @param msgIds vector of ids of groups created/modified + * @return true if token exists false otherwise + */ + bool acknowledgeGrp(const uint32_t& token, RsGxsGroupId& grpId) + { + return mGxs.acknowledgeTokenGrp(token, grpId); + } + + /*! + * Gets service statistic for a given services + * @param token value to to retrieve requested stats + * @param stats the status + * @return true if token exists false otherwise + */ + bool getServiceStatistic(const uint32_t& token, GxsServiceStatistic& stats) + { + return mGxs.getServiceStatistic(token, stats); + } + + /*! + * + * @param token to be redeemed + * @param stats the stats associated to token request + * @return true if token is false otherwise + */ + bool getGroupStatistic(const uint32_t& token, GxsGroupStatistic& stats) + { + return mGxs.getGroupStatistic(token, stats); + } + + /*! + * @brief Get default maximum storage time for GXS messages + * @jsonapi{development} + * @return storage time in seconds + */ + uint32_t getDefaultStoragePeriod() + { return mGxs.getDefaultStoragePeriod(); } + + /*! + * @brief Get maximum storage time of GXS messages for the given group + * @jsonapi{development} + * @param[in] groupId Id of the group + * @return storage time in seconds + */ + uint32_t getStoragePeriod(const RsGxsGroupId& groupId) + { return mGxs.getStoragePeriod(groupId); } + + /*! + * @brief Set GXS messages maximum storage time for the given group + * @jsonapi{development} + * @param[in] groupId Id of the group + * @param[in] storageSecs storage time in seconds + */ + void setStoragePeriod(const RsGxsGroupId& groupId, uint32_t storageSecs) + { mGxs.setStoragePeriod(groupId, storageSecs); } + + /*! + * @brief Get default maximum syncronization age for GXS messages + * @jsonapi{development} + * @return age in seconds + */ + uint32_t getDefaultSyncPeriod() + { return mGxs.getDefaultSyncPeriod(); } + + /*! + * @brief Get maximum syncronization age of GXS messages for the given group + * @jsonapi{development} + * @param[in] groupId Id of the group + * @return age in seconds + */ + uint32_t getSyncPeriod(const RsGxsGroupId& groupId) + { return mGxs.getSyncPeriod(groupId); } + + /*! + * @brief Set GXS messages maximum syncronization age for the given group + * @jsonapi{development} + * @param[in] groupId Id of the group + * @param[in] syncAge age in seconds + */ + void setSyncPeriod(const RsGxsGroupId& groupId, uint32_t syncAge) + { mGxs.setSyncPeriod(groupId, syncAge); } + + /*! + * This determines the reputation threshold messages need to surpass in order + * for it to be accepted by local user from remote source + * NOTE: threshold only enforced if service require author signature + * @param token value set to be redeemed with acknowledgement + * @param grpId group id for cutoff value to be set + * @param CutOff The cut off value to set + */ + void setGroupReputationCutOff(uint32_t& token, const RsGxsGroupId& grpId, int CutOff) + { + return mGxs.setGroupReputationCutOff(token, grpId, CutOff); + } + + RsReputationLevel minReputationForForwardingMessages( + uint32_t group_sign_flags, uint32_t identity_flags ) + { + return mGxs.minReputationForForwardingMessages(group_sign_flags,identity_flags); + } + + /// @see RsTokenService::requestGroupInfo + bool requestGroupInfo( uint32_t& token, const RsTokReqOptions& opts, const std::list &groupIds, bool high_priority_request = false ) + { + TokenRequestType token_request_type; + + switch(opts.mReqType) + { + case GXS_REQUEST_TYPE_GROUP_DATA: token_request_type = TokenRequestType::GROUP_DATA; break; + case GXS_REQUEST_TYPE_GROUP_META: token_request_type = TokenRequestType::GROUP_META; break; + case GXS_REQUEST_TYPE_GROUP_IDS: token_request_type = TokenRequestType::GROUP_IDS; break; + default: + RsErr() << __PRETTY_FUNCTION__ << "(EE) Unexpected request type " << opts.mReqType << "!!" << std::endl; + return false; + } + + cancelActiveRequestTokens(token_request_type); + + if( mTokenService.requestGroupInfo(token, 0, opts, groupIds)) + { + RS_STACK_MUTEX(mMtx); + mActiveTokens[token]=high_priority_request? (TokenRequestType::NO_KILL_TYPE) : token_request_type; +#ifdef DEBUG_GXSIFACEHELPER + locked_dumpTokens(); +#endif + return true; + } + else + return false; + } + + /// @see RsTokenService::requestGroupInfo + bool requestGroupInfo(uint32_t& token, const RsTokReqOptions& opts, bool high_priority_request = false) + { + TokenRequestType token_request_type; + + switch(opts.mReqType) + { + case GXS_REQUEST_TYPE_GROUP_DATA: token_request_type = TokenRequestType::GROUP_DATA; break; + case GXS_REQUEST_TYPE_GROUP_META: token_request_type = TokenRequestType::GROUP_META; break; + case GXS_REQUEST_TYPE_GROUP_IDS: token_request_type = TokenRequestType::GROUP_IDS; break; + default: + RsErr() << __PRETTY_FUNCTION__ << "(EE) Unexpected request type " << opts.mReqType << "!!" << std::endl; + return false; + } + + cancelActiveRequestTokens(token_request_type); + + + if( mTokenService.requestGroupInfo(token, 0, opts)) + { + RS_STACK_MUTEX(mMtx); + mActiveTokens[token]=high_priority_request? (TokenRequestType::NO_KILL_TYPE) : token_request_type; +#ifdef DEBUG_GXSIFACEHELPER + locked_dumpTokens(); +#endif + return true; + } + else + return false; + } + + /// @see RsTokenService::requestMsgInfo + bool requestMsgInfo( uint32_t& token, const RsTokReqOptions& opts, const GxsMsgReq& msgIds ) + { + if(mTokenService.requestMsgInfo(token, 0, opts, msgIds)) + { + RS_STACK_MUTEX(mMtx); + + mActiveTokens[token]= (msgIds.size()==1 && msgIds.begin()->second.size()==0) ?(TokenRequestType::ALL_POSTS):(TokenRequestType::POSTS); +#ifdef DEBUG_GXSIFACEHELPER + locked_dumpTokens(); +#endif + return true; + } + else + return false; + } + + /// @see RsTokenService::requestMsgInfo + bool requestMsgInfo( uint32_t& token, const RsTokReqOptions& opts, const std::list& grpIds ) + { + if(mTokenService.requestMsgInfo(token, 0, opts, grpIds)) + { + RS_STACK_MUTEX(mMtx); + mActiveTokens[token]=TokenRequestType::ALL_POSTS; +#ifdef DEBUG_GXSIFACEHELPER + locked_dumpTokens(); +#endif + return true; + } + else + return false; + } + + /// @see RsTokenService::requestMsgRelatedInfo + bool requestMsgRelatedInfo( + uint32_t& token, const RsTokReqOptions& opts, + const std::vector& msgIds ) + { + if( mTokenService.requestMsgRelatedInfo(token, 0, opts, msgIds)) + { + RS_STACK_MUTEX(mMtx); + mActiveTokens[token]=TokenRequestType::MSG_RELATED_INFO; +#ifdef DEBUG_GXSIFACEHELPER + locked_dumpTokens(); +#endif + return true; + } + else + return false; + } + + /** + * @jsonapi{development} + * @param[in] token + */ + RsTokenService::GxsRequestStatus requestStatus(uint32_t token) + { return mTokenService.requestStatus(token); } + + /// @see RsTokenService::requestServiceStatistic + bool requestServiceStatistic(uint32_t& token) + { + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_SERVICE_STATS; + + mTokenService.requestServiceStatistic(token,opts); + + RS_STACK_MUTEX(mMtx); + mActiveTokens[token]=TokenRequestType::SERVICE_STATISTICS; + +#ifdef DEBUG_GXSIFACEHELPER + locked_dumpTokens(); +#endif + return true; + } + + /// @see RsTokenService::requestGroupStatistic + bool requestGroupStatistic(uint32_t& token, const RsGxsGroupId& grpId) + { + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_GROUP_STATS; + + mTokenService.requestGroupStatistic(token, grpId,opts); + + RS_STACK_MUTEX(mMtx); + mActiveTokens[token]=TokenRequestType::GROUP_STATISTICS; +#ifdef DEBUG_GXSIFACEHELPER + locked_dumpTokens(); +#endif + return true; + } + + bool cancelActiveRequestTokens(TokenRequestType type) + { + RS_STACK_MUTEX(mMtx); + for(auto it = mActiveTokens.begin();it!=mActiveTokens.end();) + if(it->second == type) + { + mTokenService.cancelRequest(it->first); + it = mActiveTokens.erase(it); + } + else + ++it; + + return true; + } + + /// @see RsTokenService::cancelRequest + bool cancelRequest(uint32_t token) + { + { + RS_STACK_MUTEX(mMtx); + mActiveTokens.erase(token); + } + return mTokenService.cancelRequest(token); + } + + /** + * @deprecated + * Token service methods are already exposed by this helper, so you should + * not need to get token service pointer directly anymore. + */ + RS_DEPRECATED RsTokenService* getTokenService() { return &mTokenService; } + +protected: + /** + * Block caller while request is being processed. + * Useful for blocking API implementation. + * @param[in] token token associated to the request caller is waiting for + * @param[in] maxWait maximum waiting time in milliseconds + * @param[in] checkEvery time in millisecond between status checks + * @param[in] auto_delete_if_unsuccessful delete the request when it fails. This avoid leaving useless pending requests in the queue that would slow down additional calls. + */ + RsTokenService::GxsRequestStatus waitToken( + uint32_t token, + std::chrono::milliseconds maxWait = std::chrono::milliseconds(20000), + std::chrono::milliseconds checkEvery = std::chrono::milliseconds(100), + bool auto_delete_if_unsuccessful=true) + { +#if defined(__ANDROID__) && (__ANDROID_API__ < 24) + auto wkStartime = std::chrono::steady_clock::now(); + int maxWorkAroundCnt = 10; +LLwaitTokenBeginLabel: +#endif + auto timeout = std::chrono::steady_clock::now() + maxWait; + auto st = requestStatus(token); + + while( !(st == RsTokenService::FAILED || st >= RsTokenService::COMPLETE) + && std::chrono::steady_clock::now() < timeout ) + { + std::this_thread::sleep_for(checkEvery); + st = requestStatus(token); + } + if(st != RsTokenService::COMPLETE && auto_delete_if_unsuccessful) + cancelRequest(token); + +#if defined(__ANDROID__) && (__ANDROID_API__ < 24) + /* Work around for very slow/old android devices, we don't expect this + * to be necessary on newer devices. If it take unreasonably long + * something worser is already happening elsewere and we return anyway. + */ + if( st > RsTokenService::FAILED && st < RsTokenService::COMPLETE + && maxWorkAroundCnt-- > 0 ) + { + maxWait *= 10; + checkEvery *= 3; + Dbg3() << __PRETTY_FUNCTION__ << " Slow Android device " + << " workaround st: " << st + << " maxWorkAroundCnt: " << maxWorkAroundCnt + << " maxWait: " << maxWait.count() + << " checkEvery: " << checkEvery.count() << std::endl; + goto LLwaitTokenBeginLabel; + } + Dbg3() << __PRETTY_FUNCTION__ << " lasted: " + << std::chrono::duration_cast( + std::chrono::steady_clock::now() - wkStartime ).count() + << "ms" << std::endl; + +#endif + + { + RS_STACK_MUTEX(mMtx); + mActiveTokens.erase(token); + } + + return st; + } + +private: + RsGxsIface& mGxs; + RsTokenService& mTokenService; + RsMutex mMtx; + + std::map mActiveTokens; + +#ifdef DEBUG_GXSIFACEHELPER + void locked_dumpTokens() + { + const uint16_t service_id = mGxs.serviceType(); + const auto countSize = static_cast(TokenRequestType::__MAX); + uint32_t count[countSize] = {0}; + + RsDbg rsdbg; + rsdbg << __PRETTY_FUNCTION__ << " Service 0x" << std::hex << service_id + << " (" << rsServiceControl->getServiceName( + RsServiceInfo::RsServiceInfoUIn16ToFullServiceId(service_id) ) + << ") this=0x" << static_cast(this) + << ") Active tokens (per type): "; + + // let's count how many token of each type we've got. + for(auto& it: mActiveTokens) ++count[static_cast(it.second)]; + + for(uint32_t i=0; i < countSize; ++i) + rsdbg /* << i << ":" */ << count[i] << " "; + } +#endif // def DEBUG_GXSIFACEHELPER + + RS_SET_CONTEXT_DEBUG_LEVEL(1) +}; diff --git a/libretroshare/src/retroshare/rsgxsifacetypes.h b/libretroshare/src/retroshare/rsgxsifacetypes.h index 0f78b3738..d6232a0d6 100644 --- a/libretroshare/src/retroshare/rsgxsifacetypes.h +++ b/libretroshare/src/retroshare/rsgxsifacetypes.h @@ -63,7 +63,7 @@ struct RsGroupMetaData : RsSerializable mCircleType(0x0001), mAuthenFlags(0), mSubscribeFlags(0), mPop(0), mVisibleMsgCount(0), mLastPost(0), mGroupStatus(0) {} - virtual ~RsGroupMetaData() {} + virtual ~RsGroupMetaData() = default; void operator =(const RsGxsGrpMetaData& rGxsMeta); RsGroupMetaData(const RsGxsGrpMetaData& rGxsMeta) { operator=(rGxsMeta); } diff --git a/libretroshare/src/retroshare/rsinit.h b/libretroshare/src/retroshare/rsinit.h index 11eb54466..c421755cc 100644 --- a/libretroshare/src/retroshare/rsinit.h +++ b/libretroshare/src/retroshare/rsinit.h @@ -197,7 +197,7 @@ public: /* * Setup Hidden Location; */ - static void SetHiddenLocation(const std::string& hiddenaddress, uint16_t port, bool useBob); + static void SetHiddenLocation(const std::string& hiddenaddress, uint16_t port, bool useI2p); static bool LoadPassword(const std::string& passwd) ; diff --git a/libretroshare/src/retroshare/rsmsgs.h b/libretroshare/src/retroshare/rsmsgs.h index 614a99707..6264af47a 100644 --- a/libretroshare/src/retroshare/rsmsgs.h +++ b/libretroshare/src/retroshare/rsmsgs.h @@ -906,8 +906,9 @@ virtual void getOwnAvatarData(unsigned char *& data,int& size) = 0 ; * @brief denyLobbyInvite deny a chat lobby invite * @jsonapi{development} * @param[in] id chat lobby id you were invited into - */ - virtual void denyLobbyInvite(const ChatLobbyId &id) = 0 ; + * @return true on success + */ + virtual bool denyLobbyInvite(const ChatLobbyId &id) = 0 ; /** * @brief getPendingChatLobbyInvites get a list of all pending chat lobby invites diff --git a/libretroshare/src/retroshare/rspeers.h b/libretroshare/src/retroshare/rspeers.h index 3fdbbaf17..f49ef7fc2 100644 --- a/libretroshare/src/retroshare/rspeers.h +++ b/libretroshare/src/retroshare/rspeers.h @@ -788,6 +788,7 @@ public: virtual bool setProxyServer(const uint32_t type, const std::string &addr, const uint16_t port) = 0; virtual void getIPServersList(std::list& ip_servers) = 0; + virtual void getCurrentExtIPList(std::list& ip_list) = 0; virtual void allowServerIPDetermination(bool) = 0; virtual bool resetOwnExternalAddressList() = 0; virtual bool getAllowServerIPDetermination() = 0 ; diff --git a/libretroshare/src/retroshare/rstypes.h b/libretroshare/src/retroshare/rstypes.h index 97d97f565..1920e665a 100644 --- a/libretroshare/src/retroshare/rstypes.h +++ b/libretroshare/src/retroshare/rstypes.h @@ -3,7 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2004-2006 by Robert Fernie * + * Copyright (C) 2004-2006 Robert Fernie * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2020-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -135,17 +137,10 @@ struct PeerBandwidthLimits : RsSerializable } }; -//class SearchRequest // unused stuff. -//{ -// public: -// int searchId; -// RsCertId toId; /* all zeros for everyone! */ -// std::list tests; -//}; - - /********************** For FileCache Interface *****************/ +/* G10h4ck: Having this kind of stuff on public headers is pretty dangerous for + * name space pollution, a C++11 enum class should be used instad ASAP */ #define DIR_TYPE_UNKNOWN 0x00 #define DIR_TYPE_ROOT 0x01 #define DIR_TYPE_PERSON 0x02 @@ -258,7 +253,10 @@ struct DirStub : RsSerializable uint8_t type; std::string name; - void *ref; + + /* G10h4ck do we still need to keep this as void* instead of uint64_t for + * retroshare-gui sake? */ + void* ref; /// @see RsSerializable void serial_process(RsGenericSerializer::SerializeJob j, @@ -267,29 +265,12 @@ struct DirStub : RsSerializable RS_SERIAL_PROCESS(type); RS_SERIAL_PROCESS(name); -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic ignored "-Wstrict-aliasing" -#endif // defined(__GNUC__) && !defined(__clang__) - // (Cyril) We have to do this because on some systems (MacOS) uintptr_t is unsigned long which is not well defined. It is always - // preferable to force type serialization to the correct size rather than letting the compiler choose for us. - // /!\ This structure cannot be sent over the network. The serialization would be inconsistent. - - if(sizeof(ref) == 4) - { - std::uint32_t& handle(reinterpret_cast(ref)); - RS_SERIAL_PROCESS(handle); - } - else if(sizeof(ref) == 8) - { - std::uint64_t& handle(reinterpret_cast(ref)); - RS_SERIAL_PROCESS(handle); - } - else - std::cerr << __PRETTY_FUNCTION__ << ": cannot serialize raw pointer of size " << sizeof(ref) << std::endl; - -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic pop -#endif // defined(__GNUC__) && !defined(__clang__) + /* Enforce serialization as uint64_t because void* changes size (usually + * 4 bytes on 32bit arch and 8 bytes on 64bit archs) depending on + * architectures and make JSON API behave inconsistenly. */ + uint64_t handle = reinterpret_cast(ref); + RS_SERIAL_PROCESS(handle); + ref = reinterpret_cast(handle); } }; @@ -330,9 +311,9 @@ struct DirDetails : RsSerializable void serial_process(RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx) override { - /* Enforce serialization as uint64_t because void* changes size - * depending (usually 4 bytes on 32bit arch and 8 bytes on 64bit archs) - */ + /* Enforce serialization as uint64_t because void* changes size (usually + * 4 bytes on 32bit arch and 8 bytes on 64bit archs) depending on + * architectures and make JSON API behave inconsistenly. */ uint64_t handle = reinterpret_cast(ref); RS_SERIAL_PROCESS(handle); ref = reinterpret_cast(handle); @@ -347,7 +328,7 @@ struct DirDetails : RsSerializable RS_SERIAL_PROCESS(name); RS_SERIAL_PROCESS(hash); RS_SERIAL_PROCESS(path); - RS_SERIAL_PROCESS(size); + RS_SERIAL_PROCESS(size); RS_SERIAL_PROCESS(mtime); RS_SERIAL_PROCESS(flags); RS_SERIAL_PROCESS(max_mtime); diff --git a/libretroshare/src/rsitems/rsgxsforumitems.h b/libretroshare/src/rsitems/rsgxsforumitems.h index 30c6c4e08..b1f5fb629 100644 --- a/libretroshare/src/rsitems/rsgxsforumitems.h +++ b/libretroshare/src/rsitems/rsgxsforumitems.h @@ -3,7 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2012-2012 by Robert Fernie * + * Copyright (C) 2012 Robert Fernie * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -19,8 +21,7 @@ * along with this program. If not, see . * * * *******************************************************************************/ -#ifndef RS_GXS_FORUM_ITEMS_H -#define RS_GXS_FORUM_ITEMS_H +#pragma once #include @@ -31,7 +32,18 @@ #include "retroshare/rsgxsforums.h" +enum class RsGxsForumsItems : uint8_t +{ + GROUP_ITEM = 0x02, + MESSAGE_ITEM = 0x03, + SEARCH_REQUEST = 0x04, + SEARCH_REPLY = 0x05, +}; + +RS_DEPRECATED_FOR(RsGxsForumsItems) const uint8_t RS_PKT_SUBTYPE_GXSFORUM_GROUP_ITEM = 0x02; + +RS_DEPRECATED_FOR(RsGxsForumsItems) const uint8_t RS_PKT_SUBTYPE_GXSFORUM_MESSAGE_ITEM = 0x03; class RsGxsForumGroupItem : public RsGxsGrpItem @@ -61,6 +73,48 @@ public: RsGxsForumMsg mMsg; }; +struct RsGxsForumsSearchRequest : RsSerializable +{ + RsGxsForumsSearchRequest() : mType(RsGxsForumsItems::SEARCH_REQUEST) {} + + /// Just for easier back and forward compatibility + RsGxsForumsItems mType; + + /// Store search match string + std::string mQuery; + + /// @see RsSerializable + void serial_process( RsGenericSerializer::SerializeJob j, + RsGenericSerializer::SerializeContext& ctx ) override + { + RS_SERIAL_PROCESS(mType); + RS_SERIAL_PROCESS(mQuery); + } + + ~RsGxsForumsSearchRequest() override = default; +}; + +struct RsGxsForumsSearchReply : RsSerializable +{ + RsGxsForumsSearchReply() : mType(RsGxsForumsItems::SEARCH_REPLY) {} + + /// Just for easier back and forward compatibility + RsGxsForumsItems mType; + + /// Results storage + std::vector mResults; + + /// @see RsSerializable + void serial_process( RsGenericSerializer::SerializeJob j, + RsGenericSerializer::SerializeContext& ctx ) override + { + RS_SERIAL_PROCESS(mType); + RS_SERIAL_PROCESS(mResults); + } + + ~RsGxsForumsSearchReply() override = default; +}; + class RsGxsForumSerialiser : public RsServiceSerializer { public: @@ -69,5 +123,3 @@ public: virtual RsItem *create_item(uint16_t service_id,uint8_t item_subtype) const ; }; - -#endif /* RS_GXS_FORUM_ITEMS_H */ diff --git a/libretroshare/src/rsitems/rsitem.h b/libretroshare/src/rsitems/rsitem.h index 1c8ea9789..3ef44f859 100644 --- a/libretroshare/src/rsitems/rsitem.h +++ b/libretroshare/src/rsitems/rsitem.h @@ -86,9 +86,8 @@ struct RsItem : RsMemoryManagement::SmallObject, RsSerializable virtual void serial_process(RsGenericSerializer::SerializeJob, RsGenericSerializer::SerializeContext&)// = 0; { - std::cerr << "(EE) RsItem::serial_process(...) called by an item using" - << "new serialization classes, but not derived! Class is " - << typeid(*this).name() << std::endl; + RS_ERR( "called by an item using new serialization system without " + "overriding Class is: ", typeid(*this).name() ); print_stacktrace(); } diff --git a/libretroshare/src/rsitems/rsserviceids.h b/libretroshare/src/rsitems/rsserviceids.h index ead349e32..eb08db07c 100644 --- a/libretroshare/src/rsitems/rsserviceids.h +++ b/libretroshare/src/rsitems/rsserviceids.h @@ -28,7 +28,9 @@ enum class RsServiceType : uint16_t { - NONE = 0, /// To detect non-initialized reads + /// To detect non-initialized items + NONE = 0, + GOSSIP_DISCOVERY = 0x0011, CHAT = 0x0012, MSG = 0x0013, @@ -46,7 +48,10 @@ enum class RsServiceType : uint16_t GWEMAIL_MAIL = 0x0025, SERVICE_CONTROL = 0x0026, DISTANT_CHAT = 0x0027, + + /// For GXS identity authenticated tunnels, do not confuse with @GXS_DISTANT GXS_TUNNEL = 0x0028, + BANLIST = 0x0101, STATUS = 0x0102, NXS = 0x0200, @@ -58,6 +63,7 @@ enum class RsServiceType : uint16_t POSTED = 0x0216, CHANNELS = 0x0217, GXSCIRCLE = 0x0218, + /// not gxs, but used with identities. REPUTATION = 0x0219, GXS_RECOGN = 0x0220, @@ -68,13 +74,13 @@ enum class RsServiceType : uint16_t CHANNELS_CONFIG = 0x0317, RTT = 0x1011, /// Round Trip Time - - /***************** IDS ALLOCATED FOR PLUGINS ******************/ - // 2000+ PLUGIN_ARADO_ID = 0x2001, PLUGIN_QCHESS_ID = 0x2002, PLUGIN_FEEDREADER = 0x2003, + /// GXS distant sync and search do not confuse with @see GXS_TUNNEL + GXS_DISTANT = 0x2233, + /// Reserved for packet slicing probes. PACKET_SLICING_PROBE = 0xAABB, diff --git a/libretroshare/src/rsserver/p3face.h b/libretroshare/src/rsserver/p3face.h index 661cb244f..648e39123 100644 --- a/libretroshare/src/rsserver/p3face.h +++ b/libretroshare/src/rsserver/p3face.h @@ -43,7 +43,7 @@ class p3heartbeat; class p3discovery2; -class p3I2pBob; +class p3I2pSam3; /* GXS Classes - just declare the classes. so we don't have to totally recompile to switch */ @@ -161,8 +161,8 @@ public: p3ChatService *chatSrv; p3StatusService *mStatusSrv; p3GxsTunnelService *mGxsTunnels; -#ifdef RS_USE_I2P_BOB - p3I2pBob *mI2pBob; +#ifdef RS_USE_I2P_SAM3 + p3I2pSam3 *mI2pSam3; #endif // This list contains all threaded services. It will be used to shut them down properly. diff --git a/libretroshare/src/rsserver/p3msgs.cc b/libretroshare/src/rsserver/p3msgs.cc index b877c0282..a89e1ae04 100644 --- a/libretroshare/src/rsserver/p3msgs.cc +++ b/libretroshare/src/rsserver/p3msgs.cc @@ -530,9 +530,9 @@ bool p3Msgs::acceptLobbyInvite(const ChatLobbyId& id,const RsGxsId& gxs_id) { return mChatSrv->acceptLobbyInvite(id,gxs_id) ; } -void p3Msgs::denyLobbyInvite(const ChatLobbyId& id) +bool p3Msgs::denyLobbyInvite(const ChatLobbyId& id) { - mChatSrv->denyLobbyInvite(id) ; + return mChatSrv->denyLobbyInvite(id) ; } void p3Msgs::getPendingChatLobbyInvites(std::list& invites) { diff --git a/libretroshare/src/rsserver/p3msgs.h b/libretroshare/src/rsserver/p3msgs.h index 91d044ee5..f30ebe5aa 100644 --- a/libretroshare/src/rsserver/p3msgs.h +++ b/libretroshare/src/rsserver/p3msgs.h @@ -64,66 +64,66 @@ public: /*! * @param msgList ref to list summarising client's msgs */ - virtual bool getMessageSummaries(std::list &msgList); - virtual bool getMessage(const std::string &mId, Rs::Msgs::MessageInfo &msg); - virtual void getMessageCount(uint32_t &nInbox, uint32_t &nInboxNew, uint32_t &nOutbox, uint32_t &nDraftbox, uint32_t &nSentbox, uint32_t &nTrashbox); + virtual bool getMessageSummaries(std::list &msgList)override ; + virtual bool getMessage(const std::string &mId, Rs::Msgs::MessageInfo &msg)override ; + virtual void getMessageCount(uint32_t &nInbox, uint32_t &nInboxNew, uint32_t &nOutbox, uint32_t &nDraftbox, uint32_t &nSentbox, uint32_t &nTrashbox)override ; RS_DEPRECATED_FOR(sendMail) - virtual bool MessageSend(Rs::Msgs::MessageInfo &info); - virtual bool SystemMessage(const std::string &title, const std::string &message, uint32_t systemFlag); - virtual bool MessageToDraft(Rs::Msgs::MessageInfo &info, const std::string &msgParentId); - virtual bool MessageToTrash(const std::string &mid, bool bTrash); - virtual bool MessageDelete(const std::string &mid); - virtual bool MessageRead(const std::string &mid, bool unreadByUser); - virtual bool MessageReplied(const std::string &mid, bool replied); - virtual bool MessageForwarded(const std::string &mid, bool forwarded); - virtual bool MessageStar(const std::string &mid, bool star); - virtual bool MessageJunk(const std::string &mid, bool junk); - virtual bool MessageLoadEmbeddedImages(const std::string &mid, bool load); - virtual bool getMsgParentId(const std::string &msgId, std::string &msgParentId); + virtual bool MessageSend(Rs::Msgs::MessageInfo &info)override ; + virtual bool SystemMessage(const std::string &title, const std::string &message, uint32_t systemFlag)override ; + virtual bool MessageToDraft(Rs::Msgs::MessageInfo &info, const std::string &msgParentId)override ; + virtual bool MessageToTrash(const std::string &mid, bool bTrash)override ; + virtual bool MessageDelete(const std::string &mid)override ; + virtual bool MessageRead(const std::string &mid, bool unreadByUser)override ; + virtual bool MessageReplied(const std::string &mid, bool replied)override ; + virtual bool MessageForwarded(const std::string &mid, bool forwarded)override ; + virtual bool MessageStar(const std::string &mid, bool star)override ; + virtual bool MessageJunk(const std::string &mid, bool junk)override ; + virtual bool MessageLoadEmbeddedImages(const std::string &mid, bool load)override ; + virtual bool getMsgParentId(const std::string &msgId, std::string &msgParentId)override ; - virtual bool getMessageTagTypes(Rs::Msgs::MsgTagType& tags); - virtual bool setMessageTagType(uint32_t tagId, std::string& text, uint32_t rgb_color); - virtual bool removeMessageTagType(uint32_t tagId); + virtual bool getMessageTagTypes(Rs::Msgs::MsgTagType& tags)override ; + virtual bool setMessageTagType(uint32_t tagId, std::string& text, uint32_t rgb_color)override ; + virtual bool removeMessageTagType(uint32_t tagId)override ; - virtual bool getMessageTag(const std::string &msgId, Rs::Msgs::MsgTagInfo& info); + virtual bool getMessageTag(const std::string &msgId, Rs::Msgs::MsgTagInfo& info)override ; /* set == false && tagId == 0 --> remove all */ - virtual bool setMessageTag(const std::string &msgId, uint32_t tagId, bool set); + virtual bool setMessageTag(const std::string &msgId, uint32_t tagId, bool set)override ; - virtual bool resetMessageStandardTagTypes(Rs::Msgs::MsgTagType& tags); + virtual bool resetMessageStandardTagTypes(Rs::Msgs::MsgTagType& tags)override ; - virtual uint32_t getDistantMessagingPermissionFlags() ; - virtual void setDistantMessagingPermissionFlags(uint32_t flags) ; + virtual uint32_t getDistantMessagingPermissionFlags() override ; + virtual void setDistantMessagingPermissionFlags(uint32_t flags) override ; /*! * gets avatar from peer, image data in jpeg format */ - virtual void getAvatarData(const RsPeerId& pid,unsigned char *& data,int& size); + virtual void getAvatarData(const RsPeerId& pid,unsigned char *& data,int& size)override ; /*! * sets clients avatar, image data should be in jpeg format */ - virtual void setOwnAvatarData(const unsigned char *data,int size); + virtual void setOwnAvatarData(const unsigned char *data,int size)override ; /*! * retrieve clients avatar, image data in jpeg format */ - virtual void getOwnAvatarData(unsigned char *& data,int& size); + virtual void getOwnAvatarData(unsigned char *& data,int& size)override ; /*! * sets clients custom status (e.g. "i'm tired") */ - virtual void setCustomStateString(const std::string& status_string) ; + virtual void setCustomStateString(const std::string& status_string) override ; /*! * retrieves client's custom status */ - virtual std::string getCustomStateString() ; + virtual std::string getCustomStateString() override ; /*! * retrieves peer's custom status */ - virtual std::string getCustomStateString(const RsPeerId& peer_id) ; + virtual std::string getCustomStateString(const RsPeerId& peer_id) override ; /*! @@ -132,56 +132,56 @@ public: * @param msg the message * @see ChatId */ - virtual bool sendChat(ChatId destination, std::string msg) ; + virtual bool sendChat(ChatId destination, std::string msg) override ; /*! * Return the max message size for security forwarding */ - virtual uint32_t getMaxMessageSecuritySize(int type); + virtual uint32_t getMaxMessageSecuritySize(int type)override ; /*! * sends immediate status string to a specific peer, e.g. in a private chat * @param chat_id chat id to send status string to * @param status_string immediate status to send */ - virtual void sendStatusString(const ChatId& id, const std::string& status_string) ; + virtual void sendStatusString(const ChatId& id, const std::string& status_string) override ; /** * @brief clearChatLobby: Signal chat was cleared by GUI. * @param id: Chat id cleared. */ - virtual void clearChatLobby(const ChatId &id); + virtual void clearChatLobby(const ChatId &id)override ; /****************************************/ - virtual bool joinVisibleChatLobby(const ChatLobbyId& id, const RsGxsId &own_id) ; - virtual void getListOfNearbyChatLobbies(std::vector& public_lobbies) ; - virtual void getChatLobbyList(std::list& cl_list) ; - virtual bool getChatLobbyInfo(const ChatLobbyId& id,ChatLobbyInfo& info) ; - virtual void invitePeerToLobby(const ChatLobbyId&, const RsPeerId&) ; - virtual bool acceptLobbyInvite(const ChatLobbyId& id, const RsGxsId &gxs_id) ; - virtual void denyLobbyInvite(const ChatLobbyId& id) ; - virtual void getPendingChatLobbyInvites(std::list& invites) ; - virtual void unsubscribeChatLobby(const ChatLobbyId& lobby_id) ; - virtual void sendLobbyStatusPeerLeaving(const ChatLobbyId& lobby_id); - virtual bool setIdentityForChatLobby(const ChatLobbyId& lobby_id,const RsGxsId&) ; - virtual bool getIdentityForChatLobby(const ChatLobbyId&,RsGxsId& nick) ; - virtual bool setDefaultIdentityForChatLobby(const RsGxsId&) ; - virtual void getDefaultIdentityForChatLobby(RsGxsId& nick) ; - virtual void setLobbyAutoSubscribe(const ChatLobbyId& lobby_id, const bool autoSubscribe); - virtual bool getLobbyAutoSubscribe(const ChatLobbyId& lobby_id); - virtual ChatLobbyId createChatLobby(const std::string& lobby_name,const RsGxsId& lobby_identity,const std::string& lobby_topic,const std::set& invited_friends,ChatLobbyFlags privacy_type) ; + virtual bool joinVisibleChatLobby(const ChatLobbyId& id, const RsGxsId &own_id) override ; + virtual void getListOfNearbyChatLobbies(std::vector& public_lobbies) override ; + virtual void getChatLobbyList(std::list& cl_list) override ; + virtual bool getChatLobbyInfo(const ChatLobbyId& id,ChatLobbyInfo& info) override ; + virtual void invitePeerToLobby(const ChatLobbyId&, const RsPeerId&) override ; + virtual bool acceptLobbyInvite(const ChatLobbyId& id, const RsGxsId &gxs_id) override ; + virtual bool denyLobbyInvite(const ChatLobbyId& id) override ; + virtual void getPendingChatLobbyInvites(std::list& invites) override ; + virtual void unsubscribeChatLobby(const ChatLobbyId& lobby_id) override ; + virtual void sendLobbyStatusPeerLeaving(const ChatLobbyId& lobby_id)override ; + virtual bool setIdentityForChatLobby(const ChatLobbyId& lobby_id,const RsGxsId&) override ; + virtual bool getIdentityForChatLobby(const ChatLobbyId&,RsGxsId& nick) override ; + virtual bool setDefaultIdentityForChatLobby(const RsGxsId&) override ; + virtual void getDefaultIdentityForChatLobby(RsGxsId& nick) override ; + virtual void setLobbyAutoSubscribe(const ChatLobbyId& lobby_id, const bool autoSubscribe)override ; + virtual bool getLobbyAutoSubscribe(const ChatLobbyId& lobby_id)override ; + virtual ChatLobbyId createChatLobby(const std::string& lobby_name,const RsGxsId& lobby_identity,const std::string& lobby_topic,const std::set& invited_friends,ChatLobbyFlags privacy_type) override ; virtual bool initiateDistantChatConnexion( const RsGxsId& to_gxs_id, const RsGxsId& from_gxs_id, DistantChatPeerId &pid, uint32_t& error_code, - bool notify = true ); + bool notify = true )override ; - virtual bool getDistantChatStatus(const DistantChatPeerId& gxs_id,DistantChatPeerInfo& info); - virtual bool closeDistantChatConnexion(const DistantChatPeerId &pid) ; + virtual bool getDistantChatStatus(const DistantChatPeerId& gxs_id,DistantChatPeerInfo& info)override ; + virtual bool closeDistantChatConnexion(const DistantChatPeerId &pid) override ; - virtual uint32_t getDistantChatPermissionFlags() ; - virtual bool setDistantChatPermissionFlags(uint32_t flags) ; + virtual uint32_t getDistantChatPermissionFlags() override ; + virtual bool setDistantChatPermissionFlags(uint32_t flags) override ; private: diff --git a/libretroshare/src/rsserver/p3peers.cc b/libretroshare/src/rsserver/p3peers.cc index c44877fc5..7011d7aef 100644 --- a/libretroshare/src/rsserver/p3peers.cc +++ b/libretroshare/src/rsserver/p3peers.cc @@ -373,7 +373,7 @@ bool p3Peers::getPeerDetails(const RsPeerId& id, RsPeerDetails &d) sockaddr_storage_ipv6_to_ipv4(it->mAddr); std::string toto; toto += sockaddr_storage_tostring(it->mAddr); - rs_sprintf_append(toto, " %ld sec", time(NULL) - it->mSeenTime); + rs_sprintf_append(toto, " %ld sec loc", time(NULL) - it->mSeenTime); d.ipAddressList.push_back(toto); } for(it = ps.ipAddrs.mExt.mAddrs.begin(); it != ps.ipAddrs.mExt.mAddrs.end(); ++it) @@ -381,7 +381,7 @@ bool p3Peers::getPeerDetails(const RsPeerId& id, RsPeerDetails &d) sockaddr_storage_ipv6_to_ipv4(it->mAddr); std::string toto; toto += sockaddr_storage_tostring(it->mAddr); - rs_sprintf_append(toto, " %ld sec", time(NULL) - it->mSeenTime); + rs_sprintf_append(toto, " %ld sec ext", time(NULL) - it->mSeenTime); d.ipAddressList.push_back(toto); } } @@ -859,9 +859,15 @@ void p3Peers::getIPServersList(std::list& ip_servers) { mNetMgr->getIPServersList(ip_servers) ; } +void p3Peers::getCurrentExtIPList(std::list& ip_list) +{ + mNetMgr->getCurrentExtIPList(ip_list) ; +} bool p3Peers::resetOwnExternalAddressList() { - return mPeerMgr->resetOwnExternalAddressList(); + //TODO Phenom 2021-10-30: Need to call something like mNetMgr->netReset(); + // to update this addresslist. + return mPeerMgr->resetOwnExternalAddressList(); } void p3Peers::allowServerIPDetermination(bool b) { @@ -1287,7 +1293,11 @@ bool p3Peers::getShortInvite(std::string& invite, const RsPeerId& _sslId, Retros } #else sockaddr_storage tLocal; - if(sockaddr_storage_inet_pton(tLocal, tDetails.localAddr) && sockaddr_storage_isValidNet(tLocal) && sockaddr_storage_ipv6_to_ipv4(tLocal) && tDetails.localPort ) + bool validLoc = sockaddr_storage_inet_pton(tLocal, tDetails.localAddr) + && sockaddr_storage_isValidNet(tLocal) + && tDetails.localPort; + bool isLocIpv4 = sockaddr_storage_ipv6_to_ipv4(tLocal); + if(validLoc && isLocIpv4) { uint32_t t4Addr = reinterpret_cast(tLocal).sin_addr.s_addr; @@ -1305,7 +1315,11 @@ bool p3Peers::getShortInvite(std::string& invite, const RsPeerId& _sslId, Retros } sockaddr_storage tExt; - if(sockaddr_storage_inet_pton(tExt, tDetails.extAddr) && sockaddr_storage_isValidNet(tExt) && sockaddr_storage_ipv6_to_ipv4(tExt) && tDetails.extPort ) + bool validExt = sockaddr_storage_inet_pton(tExt, tDetails.extAddr) + && sockaddr_storage_isValidNet(tExt) + && tDetails.extPort; + bool isExtIpv4 = sockaddr_storage_ipv6_to_ipv4(tExt); + if(validExt && isExtIpv4) { uint32_t t4Addr = reinterpret_cast(tExt).sin_addr.s_addr; @@ -1321,6 +1335,17 @@ bool p3Peers::getShortInvite(std::string& invite, const RsPeerId& _sslId, Retros offset += 4+2; } + else if(validExt && !isExtIpv4) + { + // External address is IPv6, save it on LOCATOR + sockaddr_storage_setport(tExt,tDetails.extPort); + std::string tLocator = sockaddr_storage_tostring(tExt); + + addPacketHeader(RsShortInviteFieldType::LOCATOR, tLocator.size(),buf,offset,buf_size); + memcpy(&buf[offset],tLocator.c_str(),tLocator.size()); + + offset += tLocator.size(); + } #endif } @@ -1595,13 +1620,31 @@ std::string p3Peers::GetRetroshareInvite( const RsPeerId& sslId, RetroshareInvit if (getPeerDetails(ssl_id, detail)) { - if(!(invite_flags & RetroshareInviteFlags::FULL_IP_HISTORY) || detail.isHiddenNode) - detail.ipAddressList.clear(); + if( !(invite_flags & RetroshareInviteFlags::FULL_IP_HISTORY) + || detail.isHiddenNode) + detail.ipAddressList.clear(); + + //Check if external address is IPv6, then move it to ipAddressList as RsCertificate only allow 4 numbers. + sockaddr_storage tExt; + bool validExt = sockaddr_storage_inet_pton(tExt, detail.extAddr) + && sockaddr_storage_isValidNet(tExt) + && detail.extPort; + bool isExtIpv4 = sockaddr_storage_ipv6_to_ipv4(tExt); + + if( !(invite_flags & RetroshareInviteFlags::FULL_IP_HISTORY) + && !detail.isHiddenNode + && validExt && !isExtIpv4) + { + sockaddr_storage_setport(tExt,detail.extPort); + detail.ipAddressList.push_front(sockaddr_storage_tostring(tExt) + " "); // Space needed to later parse. + detail.extAddr = ""; //Clear it to not trigg error. + detail.extPort = 0; + } unsigned char *mem_block = nullptr; size_t mem_block_size = 0; - if(!AuthGPG::getAuthGPG()->exportPublicKey( RsPgpId(detail.gpg_id), mem_block, mem_block_size, false, !!(invite_flags & RetroshareInviteFlags::PGP_SIGNATURES) )) + if(!AuthGPG::getAuthGPG()->exportPublicKey( RsPgpId(detail.gpg_id), mem_block, mem_block_size, false, !!(invite_flags & RetroshareInviteFlags::PGP_SIGNATURES) )) { std::cerr << "Cannot output certificate for id \"" << detail.gpg_id << "\". Sorry." << std::endl; diff --git a/libretroshare/src/rsserver/p3peers.h b/libretroshare/src/rsserver/p3peers.h index 56f1f73e6..c2ff96d10 100644 --- a/libretroshare/src/rsserver/p3peers.h +++ b/libretroshare/src/rsserver/p3peers.h @@ -132,6 +132,7 @@ public: virtual bool isProxyAddress(const uint32_t type, const sockaddr_storage &addr); virtual void getIPServersList(std::list& ip_servers) override; + virtual void getCurrentExtIPList(std::list& ip_list) override; virtual void allowServerIPDetermination(bool) override; virtual bool getAllowServerIPDetermination() override; virtual bool resetOwnExternalAddressList() override; diff --git a/libretroshare/src/rsserver/rsinit.cc b/libretroshare/src/rsserver/rsinit.cc index 6373e0d3c..a49111021 100644 --- a/libretroshare/src/rsserver/rsinit.cc +++ b/libretroshare/src/rsserver/rsinit.cc @@ -2,7 +2,8 @@ * libretroshare/src/retroshare: rsinit.cc * * * * Copyright (C) 2004-2014 Robert Fernie * - * Copyright (C) 2016-2019 Gioacchino Mazzurco * + * Copyright (C) 2016-2021 Gioacchino Mazzurco * + * Copyright (C) 2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -173,7 +174,7 @@ struct RsInitConfig std::string hiddenNodeAddress; uint16_t hiddenNodePort; - bool hiddenNodeI2PBOB; + bool hiddenNodeI2P; /* Logging */ bool haveLogFile; @@ -667,13 +668,13 @@ void RsInit::setAutoLogin(bool autoLogin){ } /* Setup Hidden Location; */ -void RsInit::SetHiddenLocation(const std::string& hiddenaddress, uint16_t port, bool useBob) +void RsInit::SetHiddenLocation(const std::string& hiddenaddress, uint16_t port, bool useI2p) { /* parse the bugger (todo) */ rsInitConfig->hiddenNodeSet = true; rsInitConfig->hiddenNodeAddress = hiddenaddress; rsInitConfig->hiddenNodePort = port; - rsInitConfig->hiddenNodeI2PBOB = useBob; + rsInitConfig->hiddenNodeI2P = useI2p; } @@ -720,7 +721,7 @@ RsGRouter *rsGRouter = NULL ; # include "rs_upnp/upnphandler_miniupnp.h" #endif // def RS_USE_LIBUPNP -#include "services/autoproxy/p3i2pbob.h" +#include "services/autoproxy/p3i2psam3.h" #include "services/autoproxy/rsautoproxymonitor.h" #include "services/p3gxsreputation.h" @@ -926,9 +927,9 @@ int RsServer::StartupRetroShare() mNetMgr->setManagers(mPeerMgr, mLinkMgr); rsAutoProxyMonitor *autoProxy = rsAutoProxyMonitor::instance(); -#ifdef RS_USE_I2P_BOB - mI2pBob = new p3I2pBob(mPeerMgr); - autoProxy->addProxy(autoProxyType::I2PBOB, mI2pBob); +#ifdef RS_USE_I2P_SAM3 + mI2pSam3 = new p3I2pSam3(mPeerMgr); + autoProxy->addProxy(autoProxyType::I2PSAM3, mI2pSam3); #endif //load all the SSL certs as friends @@ -1339,22 +1340,26 @@ int RsServer::StartupRetroShare() mWiki->setNetworkExchangeService(wiki_ns) ; #endif - /**** Forum GXS service ****/ + /************************* Forum GXS service ******************************/ - RsGeneralDataService* gxsforums_ds = new RsDataService(currGxsDir + "/", "gxsforums_db", - RS_SERVICE_GXS_TYPE_FORUMS, NULL, rsInitConfig->gxs_passwd); + RsGeneralDataService* gxsforums_ds = new RsDataService( + currGxsDir + "/", "gxsforums_db", RS_SERVICE_GXS_TYPE_FORUMS, + nullptr, rsInitConfig->gxs_passwd ); + p3GxsForums* mGxsForums = new p3GxsForums( + gxsforums_ds, nullptr, mGxsIdService ); - p3GxsForums *mGxsForums = new p3GxsForums(gxsforums_ds, NULL, mGxsIdService); + RsGxsNetTunnelService* gxsForumsTunnelService = nullptr; +#ifdef RS_DEEP_FORUMS_INDEX + gxsForumsTunnelService = mGxsNetTunnel; +#endif - // create GXS photo service - RsGxsNetService* gxsforums_ns = new RsGxsNetService( - RS_SERVICE_GXS_TYPE_FORUMS, gxsforums_ds, nxsMgr, - mGxsForums, mGxsForums->getServiceInfo(), - mReputations, mGxsCircles,mGxsIdService, - pgpAuxUtils);//,mGxsNetTunnel,true,true,true); + RsGxsNetService* gxsforums_ns = new RsGxsNetService( + RS_SERVICE_GXS_TYPE_FORUMS, gxsforums_ds, nxsMgr, mGxsForums, + mGxsForums->getServiceInfo(), mReputations, mGxsCircles, + mGxsIdService, pgpAuxUtils, gxsForumsTunnelService ); + mGxsForums->setNetworkExchangeService(gxsforums_ns); - mGxsForums->setNetworkExchangeService(gxsforums_ns) ; /**** Channel GXS service ****/ @@ -1601,7 +1606,10 @@ int RsServer::StartupRetroShare() /**************************************************************************/ // Turtle search for GXS services - mGxsNetTunnel->registerSearchableService(gxschannels_ns) ; + mGxsNetTunnel->registerSearchableService(gxschannels_ns); +#ifdef RS_DEEP_FORUMS_INDEX + mGxsNetTunnel->registerSearchableService(gxsforums_ns); +#endif /**************************************************************************/ @@ -1658,8 +1666,9 @@ int RsServer::StartupRetroShare() mConfigMgr->addConfiguration("wire.cfg", wire_ns); #endif #endif //RS_ENABLE_GXS -#ifdef RS_USE_I2P_BOB - mConfigMgr->addConfiguration("I2PBOB.cfg", mI2pBob); +#ifdef RS_USE_I2P_SAM3 + // to make migration easiert, SAM will use BOBs configuration, as they are compatible / the same. + mConfigMgr->addConfiguration("I2PBOB.cfg", mI2pSam3); #endif mPluginsManager->addConfigurations(mConfigMgr) ; @@ -1712,34 +1721,33 @@ int RsServer::StartupRetroShare() { std::cout << "RsServer::StartupRetroShare setting up hidden locations" << std::endl; - if (rsInitConfig->hiddenNodeI2PBOB) { - std::cout << "RsServer::StartupRetroShare setting up BOB" << std::endl; + if (rsInitConfig->hiddenNodeI2P) { + std::cout << "RsServer::StartupRetroShare setting up SAMv3" << std::endl; // we need a local port! mNetMgr->checkNetAddress(); // add i2p proxy - // bob will use this address sockaddr_storage i2pInstance; sockaddr_storage_ipv4_aton(i2pInstance, rsInitConfig->hiddenNodeAddress.c_str()); mPeerMgr->setProxyServerAddress(RS_HIDDEN_TYPE_I2P, i2pInstance); std::string addr; // will be set by auto proxy service - uint16_t port = rsInitConfig->hiddenNodePort; // unused by bob + uint16_t port; // unused by SAM - bool r = autoProxy->initialSetup(autoProxyType::I2PBOB, addr, port); + bool r = autoProxy->initialSetup(autoProxyType::I2PSAM3, addr, port); if (r && !addr.empty()) { mPeerMgr->setupHiddenNode(addr, port); - // now enable bob - bobSettings bs; - autoProxy->taskSync(autoProxyType::I2PBOB, autoProxyTask::getSettings, &bs); - bs.enable = true; - autoProxy->taskSync(autoProxyType::I2PBOB, autoProxyTask::setSettings, &bs); + // now enable SAM + samSettings ss; + autoProxy->taskSync(autoProxyType::I2PSAM3, autoProxyTask::getSettings, &ss); + ss.enable = true; + autoProxy->taskSync(autoProxyType::I2PSAM3, autoProxyTask::setSettings, &ss); } else { std::cerr << "RsServer::StartupRetroShare failed to receive keys" << std::endl; - /// TODO add notify for failed bob setup + /// TODO add notify for failed i2p setup } } else { mPeerMgr->setupHiddenNode(rsInitConfig->hiddenNodeAddress, rsInitConfig->hiddenNodePort); @@ -1761,19 +1769,17 @@ int RsServer::StartupRetroShare() if (rsInitConfig->hiddenNodeSet) { // newly created location // mNetMgr->checkNetAddress() will setup ports for us + +#if 0 // this was used for BOB but is not requires for SAMv3 // trigger updates for auto proxy services std::vector types; - - // i2p bob need to rebuild its command map - types.push_back(autoProxyType::I2PBOB); - rsAutoProxyMonitor::taskSync(types, autoProxyTask::reloadConfig); +#endif } /**************************************************************************/ /* startup (stuff dependent on Ids/peers is after this point) */ /**************************************************************************/ - autoProxy->startAll(); pqih->init_listener(); @@ -1806,8 +1812,8 @@ int RsServer::StartupRetroShare() /**************************************************************************/ // auto proxy threads -#ifdef RS_USE_I2P_BOB - startServiceThread(mI2pBob, "I2P-BOB"); +#ifdef RS_USE_I2P_SAM3 + startServiceThread(mI2pSam3, "I2P-SAM3"); #endif #ifdef RS_ENABLE_GXS diff --git a/libretroshare/src/services/autoproxy/p3i2pbob.cc b/libretroshare/src/services/autoproxy/p3i2pbob.cc deleted file mode 100644 index f9eb3d9b3..000000000 --- a/libretroshare/src/services/autoproxy/p3i2pbob.cc +++ /dev/null @@ -1,1117 +0,0 @@ -/******************************************************************************* - * libretroshare/src/services/autoproxy: p3i2pbob.cc * - * * - * libretroshare: retroshare core library * - * * - * Copyright 2016 by Sehraf * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * 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 Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ -#include -#include /* for usleep() */ - -#include "p3i2pbob.h" - -#include "pqi/p3peermgr.h" -#include "rsitems/rsconfigitems.h" -#include "util/radix32.h" -#include "util/radix64.h" -#include "util/rsdebug.h" -#include "util/rstime.h" -#include "util/rsprint.h" -#include "util/rsrandom.h" - -static const std::string kConfigKeyBOBEnable = "BOB_ENABLE"; -static const std::string kConfigKeyBOBKey = "BOB_KEY"; -static const std::string kConfigKeyBOBAddr = "BOB_ADDR"; -static const std::string kConfigKeyInLength = "IN_LENGTH"; -static const std::string kConfigKeyInQuantity = "IN_QUANTITY"; -static const std::string kConfigKeyInVariance = "IN_VARIANCE"; -static const std::string kConfigKeyOutLength = "OUT_LENGTH"; -static const std::string kConfigKeyOutQuantity = "OUT_QUANTITY"; -static const std::string kConfigKeyOutVariance = "OUT_VARIANCE"; - -/// Sleep duration for receiving loop in error/no-data case -static const useconds_t sleepTimeRecv = 250; // times 1000 = 250ms -/// Sleep duration for everything else -static const useconds_t sleepTimeWait = 50; // times 1000 = 50ms or 0.05s -static const int sleepFactorDefault = 10; // 0.5s -static const int sleepFactorFast = 1; // 0.05s -static const int sleepFactorSlow = 20; // 1s - -static const rstime_t selfCheckPeroid = 30; - -void doSleep(useconds_t timeToSleepMS) { - rstime::rs_usleep((useconds_t) (timeToSleepMS * 1000)); -} - -p3I2pBob::p3I2pBob(p3PeerMgr *peerMgr) - : RsTickingThread(), p3Config(), - mState(csIdel), mTask(ctIdle), - mStateOld(csIdel), mTaskOld(ctIdle), - mBOBState(bsCleared), mPeerMgr(peerMgr), - mConfigLoaded(false), mSocket(0), - mLastProxyCheck(time(NULL)), - mProcessing(NULL), mLock("I2P-BOB") -{ - // set defaults - mSetting.initDefault(); - - mCommands.clear(); -} - -bool p3I2pBob::isEnabled() -{ - RS_STACK_MUTEX(mLock); - return mSetting.enable; -} - -bool p3I2pBob::initialSetup(std::string &addr, uint16_t &/*port*/) -{ - RS_DBG(""); - - // update config - { - RS_STACK_MUTEX(mLock); - if (!mConfigLoaded) { - finalizeSettings_locked(); - mConfigLoaded = true; - } else { - updateSettings_locked(); - } - } - - RS_DBG("config updated"); - - // request keys - // p3I2pBob::stateMachineBOB expects mProcessing to be set therefore - // we create this fake ticket without a callback or data - // ticket gets deleted later by this service - taskTicket *fakeTicket = rsAutoProxyMonitor::getTicket(); - fakeTicket->task = autoProxyTask::receiveKey; - processTaskAsync(fakeTicket); - - RS_DBG("fakeTicket requested"); - - // now start thread - start("I2P-BOB gen key"); - - RS_DBG("thread started"); - - int counter = 0; - // wait for keys - for(;;) { - doSleep(sleepTimeWait * sleepFactorDefault); - - RS_STACK_MUTEX(mLock); - - // wait for tast change - if (mTask != ctRunGetKeys) - break; - - if (++counter > 30) { - RS_DBG4("timeout!"); - return false; - } - } - - RS_DBG("got keys"); - - // stop thread - fullstop(); - - RS_DBG("thread stopped"); - - { - RS_STACK_MUTEX(mLock); - addr = mSetting.address.base32; - } - - RS_DBG4("addr ", addr); - - return true; -} - -void p3I2pBob::processTaskAsync(taskTicket *ticket) -{ - switch (ticket->task) { - case autoProxyTask::start: - case autoProxyTask::stop: - case autoProxyTask::receiveKey: - case autoProxyTask::proxyStatusCheck: - { - RS_STACK_MUTEX(mLock); - mPending.push(ticket); - } - break; - default: - RS_DBG("unknown task"); - rsAutoProxyMonitor::taskError(ticket); - break; - } -} - -void p3I2pBob::processTaskSync(taskTicket *ticket) -{ - bool data = !!ticket->data; - - // check wether we can process the task immediately or have to queue it - switch (ticket->task) { - case autoProxyTask::status: - // check if everything needed is set - if (!data) { - RS_DBG("autoProxyTask::status data is missing"); - rsAutoProxyMonitor::taskError(ticket); - break; - } - - // get states - getStates((struct bobStates*)ticket->data); - - // finish task - rsAutoProxyMonitor::taskDone(ticket, autoProxyStatus::ok); - break; - case autoProxyTask::getSettings: - // check if everything needed is set - if (!data) { - RS_DBG("autoProxyTask::getSettings data is missing"); - rsAutoProxyMonitor::taskError(ticket); - break; - } - - // get settings - getBOBSettings((struct bobSettings *)ticket->data); - - // finish task - rsAutoProxyMonitor::taskDone(ticket, autoProxyStatus::ok); - break; - case autoProxyTask::setSettings: - // check if everything needed is set - if (!data) { - RS_DBG("autoProxyTask::setSettings data is missing"); - rsAutoProxyMonitor::taskError(ticket); - break; - } - - // set settings - setBOBSettings((struct bobSettings *)ticket->data); - - // finish task - rsAutoProxyMonitor::taskDone(ticket, autoProxyStatus::ok); - break; - case autoProxyTask::reloadConfig: - { - RS_STACK_MUTEX(mLock); - updateSettings_locked(); - } - rsAutoProxyMonitor::taskDone(ticket, autoProxyStatus::ok); - break; - case autoProxyTask::getErrorInfo: - if (!data) { - RS_DBG("autoProxyTask::getErrorInfo data is missing"); - rsAutoProxyMonitor::taskError(ticket); - } else { - RS_STACK_MUTEX(mLock); - *(std::string *)ticket->data = mErrorMsg; - rsAutoProxyMonitor::taskDone(ticket, autoProxyStatus::ok); - } - break; - default: - RS_DBG("unknown task"); - rsAutoProxyMonitor::taskError(ticket); - break; - } -} - -bool inline isAnswerOk(const std::string &answer) { - return (answer.compare(0, 2, "OK") == 0); -} - -bool inline isTunnelActiveError(const std::string &answer) { - return answer.compare(0, 22, "ERROR tunnel is active") == 0; -} - -void p3I2pBob::threadTick() -{ - int sleepTime = 0; - { - RS_STACK_MUTEX(mLock); - RS_DBG4("data_tick mState: ", mState, " mTask: ", mTask, " mBOBState: ", mBOBState, " mPending: ", mPending.size()); - } - - sleepTime += stateMachineController(); - sleepTime += stateMachineBOB(); - - sleepTime >>= 1; - - // sleep outisde of lock! - doSleep(sleepTime * sleepTimeWait); -} - -int p3I2pBob::stateMachineBOB() -{ - std::string answer; - bobStateInfo currentState; - - { - RS_STACK_MUTEX(mLock); - if (mBOBState == bsCleared || !mConfigLoaded) { - // we don't have work to do - sleep longer - return sleepFactorSlow; - } - - // get next command - currentState = mCommands[mBOBState]; - } - - // this call can take a while - // do NOT hold the lock - answer = executeCommand(currentState.command); - - // can hold the lock for the rest of the function - RS_STACK_MUTEX(mLock); - - // special state first - if (mBOBState == bsList) { - int counter = 0; - while (answer.find("OK Listing done") == std::string::npos) { - RS_DBG3("stateMachineBOB status check: read loop, counter: ", counter); - answer += recv(); - counter++; - } - - if (answer.find(mTunnelName) == std::string::npos) { - RS_DBG("status check: tunnel down!"); - // signal error - *((bool *)mProcessing->data) = true; - } - - mBOBState = currentState.nextState; - } else if (isAnswerOk(answer)) { - // check for other special states - std::string key; - switch (mBOBState) { - case bsNewkeysN: - key = answer.substr(3, answer.length()-3); - mSetting.address.base32 = i2p::keyToBase32Addr(key); - IndicateConfigChanged(); - break; - case bsGetkeys: - key = answer.substr(3, answer.length()-3); - mSetting.address.privateKey = key; - IndicateConfigChanged(); - break; - default: - break; - } - - // goto next command - mBOBState = currentState.nextState; - } else { - return stateMachineBOB_locked_failure(answer, currentState); - } - return sleepFactorFast; -} - -int p3I2pBob::stateMachineBOB_locked_failure(const std::string &answer, const bobStateInfo ¤tState) -{ - // wait in case of active tunnel - // happens when trying to clear a stopping tunnel - if (isTunnelActiveError(answer)) { - return sleepFactorDefault; - } - - RS_DBG("FAILED to run command: ", currentState.command); - RS_DBG("answer: ", answer); - - mErrorMsg.append("FAILED to run command '" + currentState.command + "'" + '\n'); - mErrorMsg.append("reason '" + answer + "'" + '\n'); - - // this error handling needs testing! - mStateOld = mState; - mState = csError; - switch (mBOBState) { - case bsGetnick: - // failed getting nick - // tunnel is probably non existing - case bsClear: - // tunnel is cleared - mBOBState = bsQuit; - break; - case bsStop: - // failed stopping - // tunnel us probably not running - // continue to clearing - mBOBState = bsClear; - break; - case bsQuit: - // this can happen when the - // connection is somehow broken - // just try to disconnect - disconnectI2P(); - mBOBState = bsCleared; - break; - default: - // try to recover - mBOBState = bsGetnick; - break; - } - - return sleepFactorFast; -} - -int p3I2pBob::stateMachineController() -{ - RS_STACK_MUTEX(mLock); - - switch (mState) { - case csIdel: - return stateMachineController_locked_idle(); - case csDoConnect: - if (!connectI2P()) { - RS_DBG("doConnect: unable to connect"); - mStateOld = mState; - mState = csError; - mErrorMsg = "unable to connect to BOB port"; - return sleepFactorSlow; - } - - RS_DBG4("doConnect: connected"); - mState = csConnected; - break; - case csConnected: - return stateMachineController_locked_connected(); - case csWaitForBob: - // check connection problems - if (mSocket == 0) { - RS_DBG("waitForBob: conection lost"); - mStateOld = mState; - mState = csError; - mErrorMsg = "connection lost to BOB"; - return sleepFactorDefault; - } - - // check for finished BOB protocol - if (mBOBState == bsCleared) { - // done - RS_DBG4("waitForBob: mBOBState == bsCleared"); - mState = csDoDisconnect; - } - break; - case csDoDisconnect: - if (!disconnectI2P() || mSocket != 0) { - // just in case - RS_DBG("doDisconnect: can't disconnect"); - mStateOld = mState; - mState = csError; - mErrorMsg = "unable to disconnect from BOB"; - return sleepFactorDefault; - } - - RS_DBG4("doDisconnect: disconnected"); - mState = csDisconnected; - break; - case csDisconnected: - return stateMachineController_locked_disconnected(); - case csError: - return stateMachineController_locked_error(); - } - - return sleepFactorFast; -} - -int p3I2pBob::stateMachineController_locked_idle() -{ - // do some sanity checks - // use asserts becasue these things indicate wrong/broken state machines that need to be fixed ASAP! - assert(mBOBState == bsCleared); - assert(mSocket == 0); - assert(mState == csIdel || mState == csDisconnected); - - controllerTask oldTask = mTask; - // check for new task - if (mProcessing == NULL && !mPending.empty()) { - mProcessing = mPending.front(); - mPending.pop(); - - if (!mSetting.enable && ( - mProcessing->task == autoProxyTask::start || - mProcessing->task == autoProxyTask::stop || - mProcessing->task == autoProxyTask::proxyStatusCheck)) { - // skip since we are not enabled - RS_DBG1("disabled -> skipping ticket"); - rsAutoProxyMonitor::taskDone(mProcessing, autoProxyStatus::disabled); - mProcessing = NULL; - } else { - // set states - switch (mProcessing->task) { - case autoProxyTask::start: - mLastProxyCheck = time(NULL); - mTask = ctRunSetUp; - break; - case autoProxyTask::stop: - mTask = ctRunShutDown; - break; - case autoProxyTask::receiveKey: - mTaskOld = mTask; - mTask = ctRunGetKeys; - break; - case autoProxyTask::proxyStatusCheck: - mTaskOld = mTask; - mTask = ctRunCheck; - break; - default: - RS_DBG1("unknown async task"); - rsAutoProxyMonitor::taskError(mProcessing); - mProcessing = NULL; - break; - } - } - - mErrorMsg.clear(); - } - - // periodically check - if (mTask == ctRunSetUp && mLastProxyCheck < time(NULL) - selfCheckPeroid) { - taskTicket *tt = rsAutoProxyMonitor::getTicket(); - tt->task = autoProxyTask::proxyStatusCheck; - tt->data = (void *) new bool; - - *((bool *)tt->data) = false; - - mPending.push(tt); - - mLastProxyCheck = time(NULL); - } - - // wait for new task - if (!!mProcessing) { - // check if task was changed - if (mTask != oldTask) { - mState = csDoConnect; - } else { - // A ticket shall be processed but the state didn't change. - // This means that what ever is requested in the ticket - // was requested before already. - // -> set mState to csDisconnected to answer the ticket - mState = csDisconnected; - } - return sleepFactorFast; - } - - return sleepFactorSlow; -} - -int p3I2pBob::stateMachineController_locked_connected() -{ - // set proper bob state - switch (mTask) { - case ctRunSetUp: - // when we have a key use it for server tunnel! - if(mSetting.address.privateKey.empty()) { - RS_DBG4("setting mBOBState = setnickC"); - mBOBState = bsSetnickC; - } else { - RS_DBG4("setting mBOBState = setnickS"); - mBOBState = bsSetnickS; - } - break; - case ctRunShutDown: - // shut down existing tunnel - RS_DBG4("setting mBOBState = getnick"); - mBOBState = bsGetnick; - break; - case ctRunCheck: - RS_DBG4("setting mBOBState = list"); - mBOBState = bsList; - break; - case ctRunGetKeys: - RS_DBG4("setting mBOBState = setnickN"); - mBOBState = bsSetnickN; - break; - case ctIdle: - RS_DBG("task is idle. This should not happen!"); - break; - } - - mState = csWaitForBob; - return sleepFactorFast; -} - -int p3I2pBob::stateMachineController_locked_disconnected() -{ - // check if we had an error - bool errorHappened = (mStateOld == csError); - - if(errorHappened) { - // reset old state - mStateOld = csIdel; - RS_DBG("error during process!"); - } - - // answer ticket - controllerState newState = csIdel; - switch (mTask) { - case ctRunSetUp: - if (errorHappened) { - rsAutoProxyMonitor::taskError(mProcessing); - // switch to error - newState = csError; - } else { - rsAutoProxyMonitor::taskDone(mProcessing, autoProxyStatus::online); - } - break; - case ctRunShutDown: - // don't care about error here - rsAutoProxyMonitor::taskDone(mProcessing, autoProxyStatus::offline); - break; - case ctRunCheck: - // get result and delete dummy ticket - errorHappened |= *((bool *)mProcessing->data); - delete (bool *)mProcessing->data; - delete mProcessing; - - // restore old task - mTask = mTaskOld; - - if (!errorHappened) { - RS_DBG4("run check result: ok"); - break; - } - // switch to error - newState = csError; - RS_DBG("run check result: error"); - mErrorMsg = "Connection check failed. Will try to restart tunnel."; - - break; - case ctRunGetKeys: - if (!errorHappened) { - // rebuild commands - updateSettings_locked(); - - if (mProcessing->data) - *((struct bobSettings *)mProcessing->data) = mSetting; - - rsAutoProxyMonitor::taskDone(mProcessing, autoProxyStatus::ok); - } else { - rsAutoProxyMonitor::taskError(mProcessing); - // switch to error - newState = csError; - } - - // restore old task - mTask = mTaskOld; - break; - case ctIdle: - RS_DBG("task is idle. This should not happen!"); - rsAutoProxyMonitor::taskError(mProcessing); - } - mProcessing = NULL; - mState = newState; - - if (newState == csError) - mLastProxyCheck = time(NULL); - - return sleepFactorFast; -} - -int p3I2pBob::stateMachineController_locked_error() -{ - // wait for bob protocoll - if (mBOBState != bsCleared) { - RS_DBG4("waiting for BOB"); - return sleepFactorFast; - } - -#if 0 - RS_DBG4("stateMachineController_locked_error: mProcessing: ", (mProcessing ? "not null" : "null")); -#endif - - // try to finish ticket - if (mProcessing) { - switch (mTask) { - case ctRunCheck: - // connection check failed at some point - RS_DBG("failed to check proxy status (it's likely dead)!"); - *((bool *)mProcessing->data) = true; - mState = csDoDisconnect; - mStateOld = csIdel; - // keep the error message - break; - case ctRunShutDown: - // not a big deal though - RS_DBG("failed to shut down tunnel (it's likely dead though)!"); - mState = csDoDisconnect; - mStateOld = csIdel; - mErrorMsg.clear(); - break; - case ctIdle: - // should not happen but we need to deal with it - // this will produce some error messages in the log and finish the task (marked as failed) - RS_DBG("task is idle. This should not happen!"); - mState = csDoDisconnect; - mStateOld = csIdel; - mErrorMsg.clear(); - break; - case ctRunGetKeys: - case ctRunSetUp: - RS_DBG("failed to receive key / start up"); - mStateOld = csError; - mState = csDoDisconnect; - // keep the error message - break; - } - return sleepFactorFast; - } - - // periodically retry - if (mLastProxyCheck < time(NULL) - (selfCheckPeroid >> 1) && mTask == ctRunSetUp) { - RS_DBG("retrying"); - - mLastProxyCheck = time(NULL); - mErrorMsg.clear(); - - // create fake ticket - taskTicket *tt = rsAutoProxyMonitor::getTicket(); - tt->task = autoProxyTask::start; - mPending.push(tt); - } - - // check for new tickets - if (!mPending.empty()) { - RS_DBG4("processing new ticket"); - - // reset and try new task - mTask = ctIdle; - mState = csIdel; - return sleepFactorFast; - } - - return sleepFactorDefault; -} - -RsSerialiser *p3I2pBob::setupSerialiser() -{ - RsSerialiser* rsSerialiser = new RsSerialiser(); - rsSerialiser->addSerialType(new RsGeneralConfigSerialiser()); - - return rsSerialiser; -} - -#define addKVS(_vitem, _kv, _key, _value) \ - _kv.key = _key;\ - _kv.value = _value;\ - _vitem->tlvkvs.pairs.push_back(_kv); - -#define addKVSInt(_vitem, _kv, _key, _value) \ - _kv.key = _key;\ - rs_sprintf(_kv.value, "%d", _value);\ - _vitem->tlvkvs.pairs.push_back(_kv); - -bool p3I2pBob::saveList(bool &cleanup, std::list &lst) -{ - RS_DBG4(""); - - cleanup = true; - RsConfigKeyValueSet *vitem = new RsConfigKeyValueSet; - RsTlvKeyValue kv; - - RS_STACK_MUTEX(mLock); - addKVS(vitem, kv, kConfigKeyBOBEnable, mSetting.enable ? "TRUE" : "FALSE") - addKVS(vitem, kv, kConfigKeyBOBKey, mSetting.address.privateKey) - addKVS(vitem, kv, kConfigKeyBOBAddr, mSetting.address.base32) - addKVSInt(vitem, kv, kConfigKeyInLength, mSetting.inLength) - addKVSInt(vitem, kv, kConfigKeyInQuantity, mSetting.inQuantity) - addKVSInt(vitem, kv, kConfigKeyInVariance, mSetting.inVariance) - addKVSInt(vitem, kv, kConfigKeyOutLength, mSetting.outLength) - addKVSInt(vitem, kv, kConfigKeyOutQuantity, mSetting.outQuantity) - addKVSInt(vitem, kv, kConfigKeyOutVariance, mSetting.outVariance) - - lst.push_back(vitem); - - return true; -} - -#undef addKVS -#undef addKVSUInt - -#define getKVSUInt(_kit, _key, _value) \ - else if (_kit->key == _key) {\ - std::istringstream is(_kit->value);\ - int tmp;\ - is >> tmp;\ - _value = (int8_t)tmp;\ - } - -bool p3I2pBob::loadList(std::list &load) -{ - RS_DBG4(""); - - for(std::list::const_iterator it = load.begin(); it!=load.end(); ++it) { - RsConfigKeyValueSet *vitem = dynamic_cast(*it); - if(vitem != NULL) { - RS_STACK_MUTEX(mLock); - for(std::list::const_iterator kit = vitem->tlvkvs.pairs.begin(); kit != vitem->tlvkvs.pairs.end(); ++kit) { - if (kit->key == kConfigKeyBOBEnable) - mSetting.enable = kit->value == "TRUE"; - else if (kit->key == kConfigKeyBOBKey) - mSetting.address.privateKey = kit->value; - else if (kit->key == kConfigKeyBOBAddr) - mSetting.address.base32 = kit->value; - getKVSUInt(kit, kConfigKeyInLength, mSetting.inLength) - getKVSUInt(kit, kConfigKeyInQuantity, mSetting.inQuantity) - getKVSUInt(kit, kConfigKeyInVariance, mSetting.inVariance) - getKVSUInt(kit, kConfigKeyOutLength, mSetting.outLength) - getKVSUInt(kit, kConfigKeyOutQuantity, mSetting.outQuantity) - getKVSUInt(kit, kConfigKeyOutVariance, mSetting.outVariance) - else - RS_DBG("unknown key: ", kit->key); - } - } - delete vitem; - } - - RS_STACK_MUTEX(mLock); - finalizeSettings_locked(); - mConfigLoaded = true; - - return true; -} - -#undef getKVSUInt - -void p3I2pBob::getBOBSettings(bobSettings *settings) -{ - if (settings == NULL) - return; - - RS_STACK_MUTEX(mLock); - *settings = mSetting; - -} - -void p3I2pBob::setBOBSettings(const bobSettings *settings) -{ - if (settings == NULL) - return; - - RS_STACK_MUTEX(mLock); - mSetting = *settings; - - IndicateConfigChanged(); - - // Note: - // We don't take care of updating a running BOB session here - // This can be done manually by stoping and restarting the session - - // Note2: - // In case there is no config yet to load - // finalize settings here instead - if (!mConfigLoaded) { - finalizeSettings_locked(); - mConfigLoaded = true; - } else { - updateSettings_locked(); - } -} - -void p3I2pBob::getStates(bobStates *bs) -{ - if (bs == NULL) - return; - - RS_STACK_MUTEX(mLock); - bs->cs = mState; - bs->ct = mTask; - bs->bs = mBOBState; - bs->tunnelName = mTunnelName; -} - -std::string p3I2pBob::executeCommand(const std::string &command) -{ - RS_DBG4("running: ", command); - - std::string copy = command; - copy.push_back('\n'); - - // send command - // there is only one thread that touches mSocket - no need for a lock - ::send(mSocket, copy.c_str(), copy.size(), 0); - - // receive answer (trailing new line is already removed!) - std::string ans = recv(); - - RS_DBG4("answer: ", ans); - - return ans; -} - -bool p3I2pBob::connectI2P() -{ - // there is only one thread that touches mSocket - no need for a lock - - if (mSocket != 0) { - RS_DBG("mSocket != 0"); - return false; - } - - // create socket - mSocket = unix_socket(PF_INET, SOCK_STREAM, 0); - if (mSocket < 0) - { - RS_DBG("Failed to open socket! Socket Error: ", socket_errorType(errno)); - return false; - } - - // connect - int err = unix_connect(mSocket, mI2PProxyAddr); - if (err != 0) { - RS_DBG("Failed to connect to BOB! Socket Error: ", socket_errorType(errno)); - return false; - } - - // receive hello msg - recv(); - - RS_DBG4("done"); - return true; -} - -bool p3I2pBob::disconnectI2P() -{ - // there is only one thread that touches mSocket - no need for a lock - - if (mSocket == 0) { - RS_DBG("mSocket == 0"); - return true; - } - - int err = unix_close(mSocket); - if (err != 0) { - RS_DBG("Failed to close socket! Socket Error: ", socket_errorType(errno)); - return false; - } - - RS_DBG4("done"); - mSocket = 0; - return true; -} - -std::string toString(const std::string &a, const int b) { - std::ostringstream oss; - oss << b; - return a + oss.str();; -} - -std::string toString(const std::string &a, const uint16_t b) { - return toString(a, (int)b); -} - -std::string toString(const std::string &a, const int8_t b) { - return toString(a, (int)b); -} - -void p3I2pBob::finalizeSettings_locked() -{ - RS_DBG4(""); - - sockaddr_storage_clear(mI2PProxyAddr); - // get i2p proxy addr - sockaddr_storage proxy; - mPeerMgr->getProxyServerAddress(RS_HIDDEN_TYPE_I2P, proxy); - - // overwrite port to bob port - sockaddr_storage_setipv4(mI2PProxyAddr, (sockaddr_in*)&proxy); - sockaddr_storage_setport(mI2PProxyAddr, 2827); - - RS_DBG4("using ", mI2PProxyAddr); - RS_DBG4("using ", mSetting.address.base32); - - peerState ps; - mPeerMgr->getOwnNetStatus(ps); - - // setup commands - // new lines are appended later! - - // generate 8 characater long random suffix for name - constexpr size_t len = 8; - const std::string location = RsRandom::alphaNumeric(len); - RS_DBG4("using suffix ", location); - mTunnelName = "RetroShare-" + location; - - const std::string setnick = "setnick RetroShare-" + location; - const std::string getnick = "getnick RetroShare-" + location; - const std::string newkeys = "newkeys"; - const std::string getkeys = "getkeys"; - const std::string setkeys = "setkeys " + mSetting.address.privateKey; - const std::string inhost = "inhost " + sockaddr_storage_iptostring(proxy); - const std::string inport = toString("inport ", sockaddr_storage_port(proxy)); - const std::string outhost = "outhost " + sockaddr_storage_iptostring(ps.localaddr); - const std::string outport = toString("outport ", sockaddr_storage_port(ps.localaddr)); - // length - const std::string inlength = toString("option inbound.length=", mSetting.inLength); - const std::string outlength = toString("option outbound.length=", mSetting.outLength); - // variance - const std::string invariance = toString("option inbound.lengthVariance=", mSetting.inVariance); - const std::string outvariance= toString("option outbound.lengthVariance=", mSetting.outVariance); - // quantity - const std::string inquantity = toString("option inbound.quantity=", mSetting.inQuantity); - const std::string outquantity= toString("option outbound.quantity=", mSetting.outQuantity); - const std::string quiet = "quiet true"; - const std::string start = "start"; - const std::string stop = "stop"; - const std::string clear = "clear"; - const std::string list = "list"; - const std::string quit = "quit"; - - // setup state machine - - // start chain - // -> A: server and client tunnel - mCommands[bsSetnickS] = {setnick, bsSetkeys}; - mCommands[bsSetkeys] = {setkeys, bsOuthost}; - mCommands[bsOuthost] = {outhost, bsOutport}; - mCommands[bsOutport] = {outport, bsInhost}; - // -> B: only client tunnel - mCommands[bsSetnickC] = {setnick, bsNewkeysC}; - mCommands[bsNewkeysC] = {newkeys, bsInhost}; - // -> both - mCommands[bsInhost] = {inhost, bsInport}; - mCommands[bsInport] = {inport, bsInlength}; - mCommands[bsInlength] = {inlength, bsOutlength}; - mCommands[bsOutlength] = {outlength, bsInvariance}; - mCommands[bsInvariance] = {invariance, bsOutvariance}; - mCommands[bsOutvariance]= {outvariance,bsInquantity}; - mCommands[bsInquantity] = {inquantity, bsOutquantity}; - mCommands[bsOutquantity]= {outquantity,bsQuiet}; - mCommands[bsQuiet] = {quiet, bsStart}; - mCommands[bsStart] = {start, bsQuit}; - mCommands[bsQuit] = {quit, bsCleared}; - - // stop chain - mCommands[bsGetnick] = {getnick, bsStop}; - mCommands[bsStop] = {stop, bsClear}; - mCommands[bsClear] = {clear, bsQuit}; - - // getkeys chain - mCommands[bsSetnickN] = {setnick, bsNewkeysN}; - mCommands[bsNewkeysN] = {newkeys, bsGetkeys}; - mCommands[bsGetkeys] = {getkeys, bsClear}; - - // list chain - mCommands[bsList] = {list, bsQuit}; -} - -void p3I2pBob::updateSettings_locked() -{ - RS_DBG4(""); - - sockaddr_storage proxy; - mPeerMgr->getProxyServerAddress(RS_HIDDEN_TYPE_I2P, proxy); - - peerState ps; - mPeerMgr->getOwnNetStatus(ps); - - const std::string setkeys = "setkeys " + mSetting.address.privateKey; - const std::string inhost = "inhost " + sockaddr_storage_iptostring(proxy); - const std::string inport = toString("inport ", sockaddr_storage_port(proxy)); - const std::string outhost = "outhost " + sockaddr_storage_iptostring(ps.localaddr); - const std::string outport = toString("outport ", sockaddr_storage_port(ps.localaddr)); - - // length - const std::string inlength = toString("option inbound.length=", mSetting.inLength); - const std::string outlength = toString("option outbound.length=", mSetting.outLength); - // variance - const std::string invariance = toString("option inbound.lengthVariance=", mSetting.inVariance); - const std::string outvariance= toString("option outbound.lengthVariance=", mSetting.outVariance); - // quantity - const std::string inquantity = toString("option inbound.quantity=", mSetting.inQuantity); - const std::string outquantity= toString("option outbound.quantity=", mSetting.outQuantity); - - mCommands[bsSetkeys] = {setkeys, bsOuthost}; - mCommands[bsOuthost] = {outhost, bsOutport}; - mCommands[bsOutport] = {outport, bsInhost}; - mCommands[bsInhost] = {inhost, bsInport}; - mCommands[bsInport] = {inport, bsInlength}; - - mCommands[bsInlength] = {inlength, bsOutlength}; - mCommands[bsOutlength] = {outlength, bsInvariance}; - mCommands[bsInvariance] = {invariance, bsOutvariance}; - mCommands[bsOutvariance]= {outvariance,bsInquantity}; - mCommands[bsInquantity] = {inquantity, bsOutquantity}; - mCommands[bsOutquantity]= {outquantity,bsQuiet}; -} - -std::string p3I2pBob::recv() -{ - // BOB works line based - // -> \n indicates and of the line - - constexpr uint16_t bufferSize = 128; - char buffer[bufferSize]; - - std::string ans; - uint16_t retry = 10; - - do { - memset(buffer, 0, bufferSize); - - // peek at data - auto length = ::recv(mSocket, buffer, bufferSize, MSG_PEEK); - if (length <= 0) { - if (length < 0) { - // error - perror(__PRETTY_FUNCTION__); - } - retry--; - doSleep(sleepTimeRecv); - continue; - } - - // at least one byte was read - - // search for new line - auto bufferStr = std::string(buffer); - size_t pos = bufferStr.find('\n'); - - if (pos == std::string::npos) { - // no new line found -> more to read - - // sanity check - if (length != bufferSize) { - // expectation: a full buffer was peeked) - RS_DBG1("peeked less than bufferSize but also didn't found a new line character"); - } - // this should never happen - assert(length <= bufferSize); - } else { - // new line found -> end of message - - // calculate how much there is to read, read the \n, too! - length = pos + 1; - - // end loop - retry = 0; - } - - // now read for real - memset(buffer, 0, bufferSize); - length = ::recv(mSocket, buffer, length, 0); - bufferStr = std::string(buffer); - ans.append(bufferStr); - } while(retry > 0); - - return ans; -} diff --git a/libretroshare/src/services/autoproxy/p3i2pbob.h b/libretroshare/src/services/autoproxy/p3i2pbob.h deleted file mode 100644 index 29bcbcb61..000000000 --- a/libretroshare/src/services/autoproxy/p3i2pbob.h +++ /dev/null @@ -1,256 +0,0 @@ -/******************************************************************************* - * libretroshare/src/services/autoproxy: p3i2pbob.h * - * * - * libretroshare: retroshare core library * - * * - * Copyright 2016 by Sehraf * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * 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 Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ -#ifndef P3I2PBOB_H -#define P3I2PBOB_H - -#include -#include -#include -#include "util/rstime.h" -#ifndef WINDOWS_SYS - #include -#endif - -#include "pqi/p3cfgmgr.h" -#include "services/autoproxy/rsautoproxymonitor.h" -#include "util/rsthreads.h" -#include "util/i2pcommon.h" - -/* - * This class implements I2P BOB (BASIC OPEN BRIDGE) communication to allow RS - * to automatically remote control I2P to setup the needed tunnel. - * BOB is a simple text-based interface: https://geti2p.net/en/docs/api/bob - * - * Note 1: - * One tunnel is enough even for hidden locations since it can be used - * bidirectional. (In contrast to what RS I2P users had to set up manually.) - * - * Note 2: - * BOB tunnels are no SOCKS tunnel. Therefore pqissli2pbob implements a simplified - * proxy specially for BOB tunnels. - * - * Note 3: - * BOB needs a unique name as an ID for each tunnel. - * We use 'RetroShare-' + 8 random base32 characters. - * - * Design: - * The service uses three state machines to manage its task: - * int stateMachineBOB(); - * mBOBState - * int stateMachineController(); - * mState - * mTask - * - * stateMachineBOB: - * This state machine manages the low level communication with BOB. It basically has a linked - * list (currently a implemented as a std::map) that contains a command and the next - * state. - * Each high level operation (start up / shut down / get keys) is represented by a - * chain of states. E.g. the chain to retrieve new keys: - * mCommands[bobState::setnickN] = {setnick, bobState::newkeysN}; - * mCommands[bobState::newkeysN] = {newkeys, bobState::getkeys}; - * mCommands[bobState::getkeys] = {getkeys, bobState::clear}; - * mCommands[bobState::clear] = {clear, bobState::quit}; - * mCommands[bobState::quit] = {quit, bobState::cleared}; - * - * stateMachineController: - * This state machine manages the high level tasks. - * It is controlled by mState and mTask. - * - * mTast: - * Tracks the high level operation (like start up). - * It will keep its value even when a task is done to track - * the requested BOB state. - * When other operations are performed like a conection check - * the last task gets backed up and is later restored again - * - * mState: - * This state lives only for one operation an manages the communication - * with the BOB instance. This is basically connecting, starting BOB - * protocol and disconnecting - * - * How a task looks like: - * 1) RS sets task using the ticket system - * 2) stateMachineController connects to BOBs control port, sets mBobState to a lists head - * 3) stateMachineBOB processes command chain - * 4) stateMachineBOB is done and sets mBobState to cleared signaling that the connection - * is cleared and can be closed - * 5) stateMachineController disconnects from BOBs control port and updates mState - */ - -/// -/// \brief The controllerState enum -/// States for the controller to keep track of what he is currently doing -enum controllerState { - csIdel, - csDoConnect, - csConnected, - csWaitForBob, - csDoDisconnect, - csDisconnected, - csError -}; - -/// -/// \brief The controllerTask enum -/// This state tracks the controllers tast (e.g. setup a BOB tunnel or shut down -/// an existing one). -enum controllerTask { - ctIdle, - ctRunSetUp, - ctRunShutDown, - ctRunGetKeys, - ctRunCheck -}; - -/// -/// \brief The bobState enum -/// One state for each message -/// -enum bobState { - bsCleared, - bsSetnickC, // chain head for only client tunnel - bsSetnickN, // chain head for getting new (server) keys - bsSetnickS, // chain head for client and server tunnel - bsGetnick, - bsNewkeysC, // part of chain for only client tunnel - bsNewkeysN, // part of chain for getting new (server) keys - bsGetkeys, - bsSetkeys, - bsInhost, - bsOuthost, - bsInport, - bsOutport, - bsInlength, - bsOutlength, - bsInvariance, - bsOutvariance, - bsInquantity, - bsOutquantity, - bsQuiet, - bsStart, - bsStop, - bsClear, - bsList, // chain head for 'list' command - bsQuit -}; - -/// -/// \brief The bobStateInfo struct -/// State machine with commands -/// \todo This could be replaced by a linked list instead of a map -struct bobStateInfo { - std::string command; - bobState nextState; -}; - -struct bobSettings : i2p::settings {}; - -/// -/// \brief The bobStates struct -/// This container struct is used to pass all states. -/// Additionally, the tunnel name is included to to show it in the GUI. -/// The advantage of a struct is that it can be forward declared. -struct bobStates { - bobState bs; - controllerState cs; - controllerTask ct; - - std::string tunnelName; -}; - -class p3PeerMgr; - -class p3I2pBob : public RsTickingThread, public p3Config, public autoProxyService -{ -public: - explicit p3I2pBob(p3PeerMgr *peerMgr); - - // autoProxyService interface -public: - bool isEnabled(); - bool initialSetup(std::string &addr, uint16_t &); - void processTaskAsync(taskTicket *ticket); - void processTaskSync(taskTicket *ticket); - - void threadTick() override; /// @see RsTickingThread - -private: - int stateMachineBOB(); - int stateMachineBOB_locked_failure(const std::string &answer, const bobStateInfo ¤tState); - - int stateMachineController(); - int stateMachineController_locked_idle(); - int stateMachineController_locked_connected(); - int stateMachineController_locked_disconnected(); - int stateMachineController_locked_error(); - - // p3Config interface -protected: - RsSerialiser *setupSerialiser(); - bool saveList(bool &cleanup, std::list &lst); - bool loadList(std::list &load); - -private: - // helpers - void getBOBSettings(bobSettings *settings); - void setBOBSettings(const bobSettings *settings); - void getStates(bobStates *bs); - - std::string executeCommand(const std::string &command); - bool connectI2P(); - bool disconnectI2P(); - - void finalizeSettings_locked(); - void updateSettings_locked(); - - std::string recv(); - - // states for state machines - controllerState mState; - controllerTask mTask; - // used to store old state when in error state - // mStateOld is also used as a flag when an error occured in BOB protocol - controllerState mStateOld; - // mTaskOld is used to keep the previous task (start up / shut down) when requesting keys or checking the connection - controllerTask mTaskOld; - bobSettings mSetting; - bobState mBOBState; - - // used variables - p3PeerMgr *mPeerMgr; - bool mConfigLoaded; - int mSocket; - rstime_t mLastProxyCheck; - sockaddr_storage mI2PProxyAddr; - std::map mCommands; - std::string mErrorMsg; - std::string mTunnelName; - - std::queue mPending; - taskTicket *mProcessing; - - // mutex - RsMutex mLock; -}; - -#endif // P3I2PBOB_H diff --git a/libretroshare/src/services/autoproxy/p3i2psam3.cpp b/libretroshare/src/services/autoproxy/p3i2psam3.cpp new file mode 100644 index 000000000..c9e77273e --- /dev/null +++ b/libretroshare/src/services/autoproxy/p3i2psam3.cpp @@ -0,0 +1,798 @@ +#include "p3i2psam3.h" + +#include + +#include "pqi/p3peermgr.h" +#include "rsitems/rsconfigitems.h" + + +static const std::string kConfigKeySAM3Enable = "SAM3_ENABLE"; + +static const std::string kConfigKeyDestPriv = "DEST_PRIV"; + +static const std::string kConfigKeyInLength = "IN_LENGTH"; +static const std::string kConfigKeyInQuantity = "IN_QUANTITY"; +static const std::string kConfigKeyInVariance = "IN_VARIANCE"; +static const std::string kConfigKeyInBackupQuantity = "IN_BACKUPQUANTITY"; + +static const std::string kConfigKeyOutLength = "OUT_LENGTH"; +static const std::string kConfigKeyOutQuantity = "OUT_QUANTITY"; +static const std::string kConfigKeyOutVariance = "OUT_VARIANCE"; +static const std::string kConfigKeyOutBackupQuantity = "OUT_BACKUPQUANTITY"; + +#ifdef RS_I2P_SAM3_BOB_COMPAT +// used for migration from BOB to SAM +static const std::string kConfigKeyBOBEnable = "BOB_ENABLE"; +static const std::string kConfigKeyBOBKey = "BOB_KEY"; +static const std::string kConfigKeyBOBAddr = "BOB_ADDR"; +#endif + +static constexpr bool kDefaultSAM3Enable = false; + +RS_SET_CONTEXT_DEBUG_LEVEL(2) + +static void inline doSleep(std::chrono::duration> timeToSleepMS) { + std::this_thread::sleep_for(timeToSleepMS); +} + +p3I2pSam3::p3I2pSam3(p3PeerMgr *peerMgr) : + mConfigLoaded(false), mPeerMgr(peerMgr), mPending(), mLock("p3i2p-sam3") +#ifdef RS_USE_I2P_SAM3_LIBSAM3 + , mLockSam3Access("p3i2p-sam3-access") +#endif +{ + RS_DBG4(); + + // set defaults + mSetting.initDefault(); + mSetting.enable = kDefaultSAM3Enable; + mSetting.session = nullptr; + + libsam3_debug = 0; +} + +bool p3I2pSam3::isEnabled() +{ + RS_STACK_MUTEX(mLock); + return mSetting.enable; +} + +bool p3I2pSam3::initialSetup(std::string &addr, uint16_t &/*port*/) +{ + RS_DBG4(); + + RS_STACK_MUTEX(mLock); + + if (!mSetting.address.publicKey.empty() || !mSetting.address.privateKey.empty()) + RS_WARN("overwriting keys!"); + + bool success = generateKey(mSetting.address.publicKey, mSetting.address.privateKey); + + if (!success) { + RS_WARN("failed to retrieve keys"); + return false; + } else { + std::string s, c; + i2p::getKeyTypes(mSetting.address.publicKey, s, c); + RS_INFO("received key ", s, " ", c); + RS_INFO("public key: ", mSetting.address.publicKey); + RS_INFO("private key: ", mSetting.address.privateKey); + RS_INFO("address: ", i2p::keyToBase32Addr(mSetting.address.publicKey)); + + // sanity check + auto pub = i2p::publicKeyFromPrivate(mSetting.address.privateKey); + RS_INFO("pub key derived: ", pub); + RS_INFO("address: ", i2p::keyToBase32Addr(pub)); + if (pub != mSetting.address.publicKey) { + RS_WARN("public key does not match private key! fixing ..."); + mSetting.address.publicKey = pub; + } + + mSetting.address.base32 = i2p::keyToBase32Addr(mSetting.address.publicKey); + + IndicateConfigChanged(); + } + + addr = mSetting.address.base32; + return true; +} + +void p3I2pSam3::processTaskAsync(taskTicket *ticket) +{ + RS_DBG4(); + + switch (ticket->task) { + case autoProxyTask::stop: [[fallthrough]]; + case autoProxyTask::start: [[fallthrough]]; + case autoProxyTask::receiveKey: [[fallthrough]]; + case autoProxyTask::lookupKey: [[fallthrough]]; + case autoProxyTask::proxyStatusCheck: [[fallthrough]]; + case autoProxyTask::establishConnection: [[fallthrough]]; + case autoProxyTask::closeConnection: + { + RS_STACK_MUTEX(mLock); + mPending.push(ticket); + } + break; + case autoProxyTask::status: [[fallthrough]]; + case autoProxyTask::getSettings: [[fallthrough]]; + case autoProxyTask::setSettings: [[fallthrough]]; + case autoProxyTask::getErrorInfo: [[fallthrough]]; + case autoProxyTask::reloadConfig: + // These are supposed to be sync! + RS_DBG("unknown task or sync one!"); + rsAutoProxyMonitor::taskError(ticket); + break; + } +} + +void p3I2pSam3::processTaskSync(taskTicket *ticket) +{ +// RS_DBG4(); + + const bool data = !!ticket->data; + + switch (ticket->task) { + case autoProxyTask::status: + { + samStatus *ss = static_cast(ticket->data); + RS_STACK_MUTEX(mLock); + ss->state = mState; + if (mSetting.session) + ss->sessionName = mSetting.session->channel; + else + ss->sessionName = "none"; + } + rsAutoProxyMonitor::taskDone(ticket, autoProxyStatus::ok); + + break; + case autoProxyTask::getSettings: + // check if everything needed is set + if (!data) { + RS_DBG("autoProxyTask::getSettings data is missing"); + rsAutoProxyMonitor::taskError(ticket); + break; + } + + // get settings + { + RS_STACK_MUTEX(mLock); + *static_cast(ticket->data) = mSetting; + } + + // finish task + rsAutoProxyMonitor::taskDone(ticket, autoProxyStatus::ok); + break; + case autoProxyTask::setSettings: + // check if everything needed is set + if (!data) { + RS_DBG("autoProxyTask::setSettings data is missing"); + rsAutoProxyMonitor::taskError(ticket); + break; + } + + // set settings + { + RS_STACK_MUTEX(mLock); + mSetting = *static_cast(ticket->data); + updateSettings_locked(); + } + + // finish task + rsAutoProxyMonitor::taskDone(ticket, autoProxyStatus::ok); + break; + case autoProxyTask::getErrorInfo: + *static_cast(ticket->data) = mSetting.session->error; + rsAutoProxyMonitor::taskDone(ticket, autoProxyStatus::ok); + break; + case autoProxyTask::reloadConfig: + { + RS_STACK_MUTEX(mLock); + updateSettings_locked(); + } + rsAutoProxyMonitor::taskDone(ticket, autoProxyStatus::ok); + break; + case autoProxyTask::stop: +#if 0 // doesn't seem to work, socket stays "CLOSE_WAIT" + // there can be a case where libsam3 will block forever because for some reason it does not detect that the socket it has is dead + // as a workaroung kill it from here + if (mState == samStatus::samState::connectSession || mState == samStatus::samState::connectForward) { + // lock should be held by the main thread + if (!mTmpSession) { + // now it's getting weird + RS_WARN("session is nullptr but mState says it is connecting."); + // no break! just ignore for now ... + } else { + // just close it from here, libsam3 is not thread safe. + // a bit of a hack but should do the trick +// sam3CloseSession(mSetting.session); + sam3tcpDisconnect(mTmpSession->fd); + // no break! continue as usual to keep everything in line + } + } +#endif + [[fallthrough]]; + case autoProxyTask::start: [[fallthrough]]; + case autoProxyTask::receiveKey: [[fallthrough]]; + case autoProxyTask::lookupKey: [[fallthrough]]; + case autoProxyTask::proxyStatusCheck: [[fallthrough]]; + case autoProxyTask::establishConnection: [[fallthrough]]; + case autoProxyTask::closeConnection: + // These are supposed to be async! + RS_WARN("unknown task or async one!"); + rsAutoProxyMonitor::taskError(ticket); + break; + } +} + +void p3I2pSam3::threadTick() +{ +// { +// RS_STACK_MUTEX(mLock); +// Dbg4() << __PRETTY_FUNCTION__ << " mPending: " << mPending.size() << std::endl; +// } + + if(mPending.empty()) { + // sleep outisde of lock! + doSleep(std::chrono::milliseconds(250)); + return; + } + + // get task + taskTicket *tt = nullptr; + { + RS_STACK_MUTEX(mLock); + tt = mPending.front(); + mPending.pop(); + } + + switch (tt->task) { + case autoProxyTask::stop: + mState = samStatus::samState::offline; + stopForwarding(); + stopSession(); + rsAutoProxyMonitor::taskDone(tt, autoProxyStatus::offline); + break; + + case autoProxyTask::start: + { + if (!mSetting.enable) { + rsAutoProxyMonitor::taskDone(tt, autoProxyStatus::disabled); + break; + } + + // create main session + mState = samStatus::samState::connectSession; + bool ret = startSession(); + if (!ret) { + mState = samStatus::samState::offline; + + rsAutoProxyMonitor::taskError(tt); + break; + } + + // start forwarding + mState = samStatus::samState::connectForward; + ret = startForwarding(); + + // finish ticket + if (ret) { + mState = samStatus::samState::online; + rsAutoProxyMonitor::taskDone(tt, autoProxyStatus::online); + } else { + mState = samStatus::samState::offline; + rsAutoProxyMonitor::taskError(tt); + } + } + break; + + case autoProxyTask::receiveKey: + { + i2p::address *addr = static_cast(tt->data); + if (generateKey(addr->publicKey, addr->privateKey)) { + addr->base32 = i2p::keyToBase32Addr(addr->publicKey); + rsAutoProxyMonitor::taskDone(tt, autoProxyStatus::ok); + } else { + rsAutoProxyMonitor::taskError(tt); + } + } + break; + + case autoProxyTask::lookupKey: + lookupKey(tt); + break; + + case autoProxyTask::proxyStatusCheck: + { + // TODO better detection of status + bool ok; + ok = !!mSetting.session->fd; + ok &= !!mSetting.session->fwd_fd; + *static_cast(tt->data) = ok; + rsAutoProxyMonitor::taskDone(tt, ok ? autoProxyStatus::ok : autoProxyStatus::error); + } + break; + + case autoProxyTask::establishConnection: + establishConnection(tt); + break; + case autoProxyTask::closeConnection: + closeConnection(tt); + break; + case autoProxyTask::status: [[fallthrough]]; + case autoProxyTask::getSettings: [[fallthrough]]; + case autoProxyTask::setSettings: [[fallthrough]]; + case autoProxyTask::getErrorInfo: [[fallthrough]]; + case autoProxyTask::reloadConfig: + RS_ERR("unable to handle! This is a bug! task:", tt->task); + rsAutoProxyMonitor::taskError(tt); + break; + } + tt = nullptr; + + // give i2p backend some time + doSleep(std::chrono::milliseconds(100)); +} + +RsSerialiser *p3I2pSam3::setupSerialiser() +{ + RsSerialiser* rsSerialiser = new RsSerialiser(); + rsSerialiser->addSerialType(new RsGeneralConfigSerialiser()); + + return rsSerialiser; +} + +#define addKVS(_key, _value) \ + kv.key = _key;\ + kv.value = _value;\ + vitem->tlvkvs.pairs.push_back(kv); + +#define addKVSInt(_key, _value) \ + kv.key = _key;\ + rs_sprintf(kv.value, "%d", _value);\ + vitem->tlvkvs.pairs.push_back(kv); + +bool p3I2pSam3::saveList(bool &cleanup, std::list &lst) +{ + RS_DBG4(); + + cleanup = true; + RsConfigKeyValueSet *vitem = new RsConfigKeyValueSet; + RsTlvKeyValue kv; + + RS_STACK_MUTEX(mLock); + addKVS(kConfigKeySAM3Enable, mSetting.enable ? "TRUE" : "FALSE") + addKVS(kConfigKeyDestPriv, mSetting.address.privateKey); + + addKVSInt(kConfigKeyInLength, mSetting.inLength) + addKVSInt(kConfigKeyInQuantity, mSetting.inQuantity) + addKVSInt(kConfigKeyInVariance, mSetting.inVariance) + addKVSInt(kConfigKeyInBackupQuantity, mSetting.inBackupQuantity) + + addKVSInt(kConfigKeyOutLength, mSetting.outLength) + addKVSInt(kConfigKeyOutQuantity, mSetting.outQuantity) + addKVSInt(kConfigKeyOutVariance, mSetting.outVariance) + addKVSInt(kConfigKeyOutBackupQuantity, mSetting.outBackupQuantity) + +#ifdef RS_I2P_SAM3_BOB_COMPAT + // these allow SAMv3 users to switch back to BOB + // remove after some time + addKVS(kConfigKeyBOBEnable, mSetting.enable ? "TRUE" : "FALSE") + addKVS(kConfigKeyBOBKey, mSetting.address.privateKey) + addKVS(kConfigKeyBOBAddr, mSetting.address.base32) +#endif + lst.push_back(vitem); + return true; +} + +#undef addKVS +#undef addKVSUInt + +#define getKVSUInt(_kit, _key, _value) \ + else if (_kit->key == _key) {\ + std::istringstream is(_kit->value);\ + int tmp;\ + is >> tmp;\ + _value = (int8_t)tmp;\ + } + +bool p3I2pSam3::loadList(std::list &load) +{ + RS_DBG4(); + + std::string priv; + priv.clear(); + + for(std::list::const_iterator it = load.begin(); it!=load.end(); ++it) { + RsConfigKeyValueSet *vitem = dynamic_cast(*it); + if(vitem != NULL) { + RS_STACK_MUTEX(mLock); + for(std::list::const_iterator kit = vitem->tlvkvs.pairs.begin(); kit != vitem->tlvkvs.pairs.end(); ++kit) { + if (kit->key == kConfigKeySAM3Enable) + mSetting.enable = kit->value == "TRUE"; + else if (kit->key == kConfigKeyDestPriv) + priv = kit->value; + getKVSUInt(kit, kConfigKeyInLength, mSetting.inLength) + getKVSUInt(kit, kConfigKeyInQuantity, mSetting.inQuantity) + getKVSUInt(kit, kConfigKeyInVariance, mSetting.inVariance) + getKVSUInt(kit, kConfigKeyInBackupQuantity, mSetting.inBackupQuantity) + + getKVSUInt(kit, kConfigKeyOutLength, mSetting.outLength) + getKVSUInt(kit, kConfigKeyOutQuantity, mSetting.outQuantity) + getKVSUInt(kit, kConfigKeyOutVariance, mSetting.outVariance) + getKVSUInt(kit, kConfigKeyOutBackupQuantity, mSetting.outBackupQuantity) + +#ifdef RS_I2P_SAM3_BOB_COMPAT + // import BOB settings + else if (kit->key == kConfigKeyBOBEnable) + mSetting.enable = kit->value == "TRUE"; + else if (kit->key == kConfigKeyBOBKey) { + // don't overwirte, just import when not set already! + if (priv.empty()) + priv = kit->value; + } +#endif + else + RS_INFO("unknown key:", kit->key); + } + } + delete vitem; + } + + // get the pub key + std::string pub = i2p::publicKeyFromPrivate(priv); + if (pub.empty() || priv.empty()) + RS_DBG("no destination to load"); + else { + RS_STACK_MUTEX(mLock); + + mSetting.address.publicKey = pub; + mSetting.address.privateKey = priv; + mSetting.address.base32 = i2p::keyToBase32Addr(pub); + } + + RS_STACK_MUTEX(mLock); + mConfigLoaded = true; + + return true; +} + +#undef getKVSUInt + +bool p3I2pSam3::startSession() +{ + RS_DBG4(); + + constexpr size_t len = 8; + const std::string location = RsRandom::alphaNumeric(len); + const std::string nick = "RetroShare-" + location; + + std::vector params; + { + RS_STACK_MUTEX(mLock); + + // length + params.push_back(i2p::makeOption("inbound.length", mSetting.inLength)); + params.push_back(i2p::makeOption("outbound.length", mSetting.outLength)); + // variance + params.push_back(i2p::makeOption("inbound.lengthVariance", + mSetting.inVariance)); + params.push_back(i2p::makeOption("outbound.lengthVariance", + mSetting.outVariance)); + // quantity + params.push_back(i2p::makeOption("inbound.quantity", + mSetting.inQuantity)); + params.push_back(i2p::makeOption("outbound.quantity", + mSetting.outQuantity)); + // backup quantity + params.push_back(i2p::makeOption("inbound.backupQuantity", + mSetting.inBackupQuantity)); + params.push_back(i2p::makeOption("outbound.backupQuantity", + mSetting.outBackupQuantity)); + } + + std::string paramsStr; + for (auto &&p : params) + paramsStr.append(p + " "); + // keep trailing space for easier extending when necessary + + int ret; + + if (mSetting.session) { + stopSession(); + } + + auto session = (Sam3Session*)rs_malloc(sizeof (Sam3Session)); + + // add nick + paramsStr.append("inbound.nickname=" + nick); // leading space is already there + + { + RS_STACK_MUTEX(mLockSam3Access); + + if(!mSetting.address.privateKey.empty()) { + RS_DBG3("with destination"); + ret = sam3CreateSession(session, SAM3_HOST_DEFAULT, SAM3_PORT_DEFAULT, mSetting.address.privateKey.c_str(), Sam3SessionType::SAM3_SESSION_STREAM, Sam3SigType::EdDSA_SHA512_Ed25519, paramsStr.c_str()); + } else { + RS_DBG("without destination"); + ret = sam3CreateSession(session, SAM3_HOST_DEFAULT, SAM3_PORT_DEFAULT, SAM3_DESTINATION_TRANSIENT, Sam3SessionType::SAM3_SESSION_STREAM, Sam3SigType::EdDSA_SHA512_Ed25519, paramsStr.c_str()); + } + } + + if (ret != 0) { + delete session; + session = nullptr; + return false; + } + +#if 0 // this check is useless. For non i2p hidden locations the public key is temporal anyway and for i2p hidden ones, it is part of the (fixed) private key. + if (!mSetting.address.publicKey.empty() && mSetting.address.publicKey != session->pubkey) + // This should be ok for non hidden locations. This should be a problem for hidden i2p locations... + RS_DBG("public key changed! Yet unsure if this is ok or a problem. Should be fine for non i2p hidden locations or clear net."); +#endif + /* + * Note: sam3CreateSession will issue a name looup of "ME" to receive its public key, thus it is always correct. + * No need to use i2p::publicKeyFromPrivate() + */ + RS_STACK_MUTEX(mLock); + mSetting.session = session; + mSetting.address.publicKey = session->pubkey; + mSetting.address.base32 = i2p::keyToBase32Addr(session->pubkey); + // do not overwrite the private key, if any!! + + RS_DBG1("nick: ", nick, " address: ", mSetting.address.base32); + RS_DBG2(" myDestination.pub ", mSetting.address.publicKey); + RS_DBG2(" myDestination.priv ", mSetting.address.privateKey); + return true; +} + +bool p3I2pSam3::startForwarding() +{ + RS_DBG4(); + + if(mSetting.address.privateKey.empty()) { + RS_DBG3("no private key set"); + // IMPORANT: return true here! + // since there is no forward session for non hidden nodes, this funtion is successfull by doing nothing + return true; + } + + if (!mSetting.session) { + RS_WARN("no session found!"); + return false; + } + + peerState ps; + mPeerMgr->getOwnNetStatus(ps); + + RS_STACK_MUTEX(mLockSam3Access); + + mSetting.session->silent = true; + int ret = sam3StreamForward(mSetting.session, sockaddr_storage_iptostring(ps.localaddr).c_str(), sockaddr_storage_port(ps.localaddr)); + if (ret < 0) { + RS_DBG("forward failed, due to", mSetting.session->error); + return false; + } + + return true; +} + +void p3I2pSam3::stopSession() +{ + RS_DBG4(); + + { + RS_STACK_MUTEX(mLock); + if (!mSetting.session) + return; + + // swap connections + mInvalidConnections = mValidConnections; + mValidConnections.clear(); + + RS_STACK_MUTEX(mLockSam3Access); + sam3CloseSession(mSetting.session); + free(mSetting.session); + + mSetting.session = nullptr; + mState = samStatus::samState::offline; + } + + // At least i2pd doesn't like to instantaniously stop and (re)start a session, wait here just a little bit. + // Not ideal but does the trick. + // (This happens when using the "restart" button in the settings.) + doSleep(std::chrono::seconds(10)); +} + +void p3I2pSam3::stopForwarding() +{ + // nothing to do here, forwarding is stop when closing the seassion +} + +bool p3I2pSam3::generateKey(std::string &pub, std::string &priv) +{ + RS_DBG4(); + + pub.clear(); + priv.clear(); + + // The session is only usef for transporting the data + Sam3Session ss; + + if (0 > sam3GenerateKeys(&ss, SAM3_HOST_DEFAULT, SAM3_PORT_DEFAULT, Sam3SigType::EdDSA_SHA512_Ed25519)) { + RS_DBG("got error: ", ss.error); + return false; + } + + pub = std::string(ss.pubkey); + priv = std::string(ss.privkey); + + // sanity check + auto p = i2p::publicKeyFromPrivate(priv); + if (p != pub) { + RS_WARN("public key does not match private key! fixing ..."); + pub = p; + } + + RS_DBG2("publuc key / address ", pub); + RS_DBG2("private key ", priv); + + return true; +} + +void p3I2pSam3::lookupKey(taskTicket *ticket) +{ + // this can be called independend of the main SAM session! + + auto addr = static_cast(ticket->data); + if (addr->base32.empty()) { + RS_ERR("lookupKey: called with empty address"); + rsAutoProxyMonitor::taskError(ticket); + return; + } + + RsThread::async([ticket]() + { + auto addr = static_cast(ticket->data); + + // The session is only usef for transporting the data + Sam3Session ss; + int ret = sam3NameLookup(&ss, SAM3_HOST_DEFAULT, SAM3_PORT_DEFAULT, addr->base32.c_str()); + if (ret < 0) { + // get error + RS_DBG("key: ", addr->base32); + RS_DBG("got error: ", ss.error); + rsAutoProxyMonitor::taskError(ticket); + } else { + addr->publicKey = ss.destkey; + rsAutoProxyMonitor::taskDone(ticket, autoProxyStatus::ok); + RS_DBG1("success"); + } + }); +} + +void p3I2pSam3::establishConnection(taskTicket *ticket) +{ + if (mState != samStatus::samState::online || !mSetting.session) { + RS_WARN("no session found!"); + rsAutoProxyMonitor::taskError(ticket); + return; + } + + samEstablishConnectionWrapper *wrapper = static_cast(ticket->data); + if (wrapper->address.publicKey.empty()) { + RS_ERR("no public key given"); + rsAutoProxyMonitor::taskError(ticket); + return; + } + + RsThread::async([ticket, this]() { + auto wrapper = static_cast(ticket->data); + + struct Sam3Connection *connection; + { + auto l = this->mLockSam3Access; + RS_STACK_MUTEX(l); + mSetting.session->silent = false; + connection = sam3StreamConnect(this->mSetting.session, wrapper->address.publicKey.c_str()); + } + + if (!connection) { + // get error + RS_DBG("got error:", this->mSetting.session->error); + rsAutoProxyMonitor::taskError(ticket); + } else { + wrapper->connection = connection; + { + auto l = this->mLockSam3Access; + RS_STACK_MUTEX(l); + this->mValidConnections.push_back(connection); + } + RS_DBG1("success"); + rsAutoProxyMonitor::taskDone(ticket, autoProxyStatus::ok); + } + }); +} + +void p3I2pSam3::closeConnection(taskTicket *ticket) +{ + Sam3Connection *conn = static_cast(ticket->data); + + if (mState == samStatus::samState::offline || !mSetting.session) { + // no session found, sam was likely stopped + RS_DBG2("no session found"); + + auto it = std::find(mInvalidConnections.begin(), mInvalidConnections.end(), conn); + if (it != mInvalidConnections.end()) { + // this is the expected case + mInvalidConnections.erase(it); + } else { + // this is unexpected but not a big deal, just warn + RS_WARN("cannot find connection in mInvalidConnections"); + + it = std::find(mValidConnections.begin(), mValidConnections.end(), conn); + if (it != mValidConnections.end()) { + mValidConnections.erase(it); + + // now it is getting even weirder, still not a big deal, just warn + RS_WARN("found connection in mValidConnections"); + } + } + + // when libsam3 has already handled closing of the connection - which should be the case here - the memory has been freed already (-> pointer is invalid) + conn = nullptr; + } else { + RS_STACK_MUTEX(mLock); + + bool callClose = true; + // search in current connections + auto it = std::find(mValidConnections.begin(), mValidConnections.end(), conn); + if (it != mValidConnections.end()) { + RS_DBG2("found valid connection"); + mValidConnections.erase(it); + } else { + // search in old connections + it = std::find(mInvalidConnections.begin(), mInvalidConnections.end(), conn); + if (it != mInvalidConnections.end()) { + // old connection, just ignore. *should* be freed already + mInvalidConnections.erase(it); + + RS_DBG2("found old (invalid) connection"); + + callClose = false; + conn = nullptr; + } else { + // weird + RS_WARN("could'n find connection!"); + + // best thing we can do here + callClose = false; + conn = nullptr; + } + } + + if (callClose) { + RS_DBG2("closing connection"); + + RS_STACK_MUTEX(mLockSam3Access); + sam3CloseConnection(conn); + conn = nullptr; // freed by above call + } + } + + if (conn) { + free(conn); + conn = nullptr; + } + + ticket->data = nullptr; + rsAutoProxyMonitor::taskDone(ticket, autoProxyStatus::ok); + return; +} + +void p3I2pSam3::updateSettings_locked() +{ + RS_DBG4(); + IndicateConfigChanged(); + +#if 0 // TODO recreat session when active, can we just recreat it? + if (mSs) { + stopSession(); + startSession(); + } +#endif +} diff --git a/libretroshare/src/services/autoproxy/p3i2psam3.h b/libretroshare/src/services/autoproxy/p3i2psam3.h new file mode 100644 index 000000000..c6b57615e --- /dev/null +++ b/libretroshare/src/services/autoproxy/p3i2psam3.h @@ -0,0 +1,110 @@ +#ifndef P3I2PSAM3_H +#define P3I2PSAM3_H + +#include +#include + +#include "services/autoproxy/rsautoproxymonitor.h" +#include "pqi/p3cfgmgr.h" +#include "util/i2pcommon.h" +#include "util/rsthreads.h" + +/* + * This class implements I2P SAMv3 (Simple Anonymous Messaging) to allow RS + * to automatically setup tunnel to and from I2P. + * SAMv3 is a simple text-based interface: https://geti2p.net/de/docs/api/samv3 + * + * For the actual SAM commands / low level stuff libsam3 (https://github.com/i2p/libsam3) + * is used with some minor adjustments, for exmaple, the FORWARD session is always silent. + * + * SAM in a nutshell works like this: + * 1) setup main/control session which configures everything (destination ID, tunnel number, hops number, and so on) + * 2) setup a forward session, so that I2P will establish a connection to RS for each incoming connection to our i2p destination + * 3a) query/lookup the destination (public key) for a given i2p address + * 3b) connect to the given destination + * + * An established connection (both incoming or outgoing) are then handed over to RS. + * The lifetime of a session (and its subordinates connections) is bound to their tcp socket. When the socket closes, the session is closed, too. + * + */ + +class p3PeerMgr; + +class Sam3Session; +class Sam3Connection; + +typedef Sam3Session samSession; + +struct samSettings : i2p::settings { + samSession *session; +}; + +struct samEstablishConnectionWrapper { + i2p::address address; + Sam3Connection *connection; +}; + +struct samStatus { + std::string sessionName; + enum samState { + offline, + connectSession, + connectForward, + online + } state; // the name is kinda redundant ... +}; + +class p3I2pSam3 : public RsTickingThread, public p3Config, public autoProxyService +{ +public: + p3I2pSam3(p3PeerMgr *peerMgr); + + // autoProxyService interface +public: + bool isEnabled(); + bool initialSetup(std::string &addr, uint16_t &port); + void processTaskAsync(taskTicket *ticket); + void processTaskSync(taskTicket *ticket); + + // RsTickingThread interface +public: + void threadTick(); /// @see RsTickingThread + + // p3Config interface +protected: + RsSerialiser *setupSerialiser(); + bool saveList(bool &cleanup, std::list &); + bool loadList(std::list &load); + +private: + bool startSession(); + bool startForwarding(); + void stopSession(); + void stopForwarding(); + + bool generateKey(std::string &pub, std::string &priv); + void lookupKey(taskTicket *ticket); + void establishConnection(taskTicket *ticket); + void closeConnection(taskTicket *ticket); + void updateSettings_locked(); + + bool mConfigLoaded; + + samSettings mSetting; + p3PeerMgr *mPeerMgr; + std::queue mPending; + + // Used to report the state to the gui + // (Since the create session call/will can block and there is no easy way from outside the main thread to see + // what is going on, it is easier to store the current state in an extra variable independen from the main thread) + samStatus::samState mState; + + // used to keep track of connections, libsam3 does it internally but it can be unreliable since pointers are shared + std::list mValidConnections, mInvalidConnections; + + // mutex + RsMutex mLock; + RsMutex mLockSam3Access; // libsam3 is not thread safe! (except for key lookup) +}; + +#endif // P3I2PSAM3_H diff --git a/libretroshare/src/services/autoproxy/rsautoproxymonitor.cc b/libretroshare/src/services/autoproxy/rsautoproxymonitor.cc index d58c871e3..b2d71571e 100644 --- a/libretroshare/src/services/autoproxy/rsautoproxymonitor.cc +++ b/libretroshare/src/services/autoproxy/rsautoproxymonitor.cc @@ -329,14 +329,22 @@ autoProxyService *rsAutoProxyMonitor::lookUpService(autoProxyType::autoProxyType bool rsAutoProxyMonitor::isAsyncTask(autoProxyTask::autoProxyTask_enum t) { + // Explicit list all values, so that missing ones will be detected by the compiler. switch (t) { - case autoProxyTask::start: - case autoProxyTask::stop: - case autoProxyTask::receiveKey: + case autoProxyTask::start: [[fallthrough]]; + case autoProxyTask::stop: [[fallthrough]]; + case autoProxyTask::receiveKey: [[fallthrough]]; + case autoProxyTask::lookupKey: [[fallthrough]]; + case autoProxyTask::establishConnection: [[fallthrough]]; + case autoProxyTask::closeConnection: return true; - break; - default: - break; + case autoProxyTask::status: [[fallthrough]]; + case autoProxyTask::getSettings: [[fallthrough]]; + case autoProxyTask::setSettings: [[fallthrough]]; + case autoProxyTask::getErrorInfo: [[fallthrough]]; + case autoProxyTask::reloadConfig: [[fallthrough]]; + case autoProxyTask::proxyStatusCheck: + return false; } return false; } diff --git a/libretroshare/src/services/autoproxy/rsautoproxymonitor.h b/libretroshare/src/services/autoproxy/rsautoproxymonitor.h index d9a4c16aa..e08692947 100644 --- a/libretroshare/src/services/autoproxy/rsautoproxymonitor.h +++ b/libretroshare/src/services/autoproxy/rsautoproxymonitor.h @@ -31,23 +31,27 @@ class autoProxyCallback; namespace autoProxyType { enum autoProxyType_enum { - I2PBOB +// I2PBOB, + I2PSAM3 }; } namespace autoProxyTask { enum autoProxyTask_enum { /* async tasks */ - start, ///< start up proxy - stop, ///< shut down proxy - receiveKey, ///< renew proxy key (if any) - proxyStatusCheck, ///< use to check if the proxy is still running + start, ///< start up proxy + stop, ///< shut down proxy + receiveKey, ///< renew proxy key (if any) + lookupKey, ///< look up a base32 addr + proxyStatusCheck, ///< use to check if the proxy is still running + establishConnection, ///< create a connection to a given public key or base32 address + closeConnection, ///< closes a connection /* sync tasks */ - status, ///< get status from auto proxy - getSettings, ///< get setting from auto proxy - setSettings, ///< set setting of auto proxy - reloadConfig, ///< signal config reload/rebuild - getErrorInfo ///< get error information from auto proxy + status, ///< get status from auto proxy + getSettings, ///< get setting from auto proxy + setSettings, ///< set setting of auto proxy + reloadConfig, ///< signal config reload/rebuild + getErrorInfo ///< get error information from auto proxy }; } diff --git a/libretroshare/src/services/p3gxsforums.cc b/libretroshare/src/services/p3gxsforums.cc index a301997e6..6cb3ae5c6 100644 --- a/libretroshare/src/services/p3gxsforums.cc +++ b/libretroshare/src/services/p3gxsforums.cc @@ -4,8 +4,8 @@ * libretroshare: retroshare core library * * * * Copyright (C) 2012-2014 Robert Fernie * - * Copyright (C) 2018-2020 Gioacchino Mazzurco * - * Copyright (C) 2019-2020 Asociación Civil Altermundi * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -59,7 +59,11 @@ p3GxsForums::p3GxsForums( RsGeneralDataService *gds, RsGenExchange( gds, nes, new RsGxsForumSerialiser(), RS_SERVICE_GXS_TYPE_FORUMS, gixs, forumsAuthenPolicy()), RsGxsForums(static_cast(*this)), mGenToken(0), - mGenActive(false), mGenCount(0), mKnownForumsMutex("GXS forums known forums timestamp cache") + mGenActive(false), mGenCount(0), + mKnownForumsMutex("GXS forums known forums timestamp cache") +#ifdef RS_DEEP_FORUMS_INDEX + , mDeepIndex(DeepForumsIndex::dbDefaultPath()) +#endif { // Test Data disabled in Repo. //RsTickEvent::schedule_in(FORUM_TESTEVENT_DUMMYDATA, DUMMYDATA_PERIOD); @@ -190,223 +194,254 @@ RsSerialiser* p3GxsForums::setupSerialiser() return rss; } -void p3GxsForums::notifyChanges(std::vector &changes) +void p3GxsForums::notifyChanges(std::vector& changes) { -#ifdef GXSFORUMS_DEBUG - std::cerr << "p3GxsForums::notifyChanges() : " << changes.size() << "changes to notify" << std::endl; -#endif + RS_DBG2(changes.size(), " changes to notify"); - std::vector::iterator it; - for(it = changes.begin(); it != changes.end(); ++it) + for(RsGxsNotify* gxsChange: changes) { - RsGxsMsgChange *msgChange = dynamic_cast(*it); + // Let the compiler delete the change for us + std::unique_ptr gxsChangeDeleter(gxsChange); - if (msgChange) + switch(gxsChange->getType()) { - if (msgChange->getType() == RsGxsNotify::TYPE_RECEIVED_NEW || msgChange->getType() == RsGxsNotify::TYPE_PUBLISHED) /* message received */ - if (rsEvents) + case RsGxsNotify::TYPE_RECEIVED_NEW: // [[fallthrough]] + case RsGxsNotify::TYPE_PUBLISHED: + { + auto msgChange = dynamic_cast(gxsChange); + + if(msgChange) /* Message received */ + { + uint8_t msgSubtype = msgChange->mNewMsgItem->PacketSubType(); + switch(static_cast(msgSubtype)) { + case RsGxsForumsItems::MESSAGE_ITEM: + { + auto newForumMessageItem = + dynamic_cast( + msgChange->mNewMsgItem ); + + if(!newForumMessageItem) + { + RS_ERR("Received message change with mNewMsgItem type " + "mismatching or null"); + print_stacktrace(); + return; + } + +#ifdef RS_DEEP_FORUMS_INDEX + RsGxsForumMsg tmpPost = newForumMessageItem->mMsg; + tmpPost.mMeta = newForumMessageItem->meta; + mDeepIndex.indexForumPost(tmpPost); +#endif auto ev = std::make_shared(); ev->mForumMsgId = msgChange->mMsgId; ev->mForumGroupId = msgChange->mGroupId; ev->mForumEventCode = RsForumEventCode::NEW_MESSAGE; rsEvents->postEvent(ev); + break; } - -#ifdef NOT_USED_YET - if (!msgChange->metaChange()) - { -#ifdef GXSCHANNELS_DEBUG - std::cerr << "p3GxsForums::notifyChanges() Found Message Change Notification"; - std::cerr << std::endl; -#endif - - std::map > &msgChangeMap = msgChange->msgChangeMap; - for(auto mit = msgChangeMap.begin(); mit != msgChangeMap.end(); ++mit) - { -#ifdef GXSCHANNELS_DEBUG - std::cerr << "p3GxsForums::notifyChanges() Msgs for Group: " << mit->first; - std::cerr << std::endl; -#endif - bool enabled = false; - if (autoDownloadEnabled(mit->first, enabled) && enabled) - { -#ifdef GXSCHANNELS_DEBUG - std::cerr << "p3GxsChannels::notifyChanges() AutoDownload for Group: " << mit->first; - std::cerr << std::endl; -#endif - - /* problem is most of these will be comments and votes, - * should make it occasional - every 5mins / 10minutes TODO */ - unprocessedGroups.push_back(mit->first); - } + default: + RS_WARN("Got unknown gxs message subtype: ", msgSubtype); + break; } } -#endif + + auto groupChange = dynamic_cast(gxsChange); + if(groupChange) /* Group received */ + { + bool unknown; + { + RS_STACK_MUTEX(mKnownForumsMutex); + unknown = ( mKnownForums.find(gxsChange->mGroupId) + == mKnownForums.end() ); + mKnownForums[gxsChange->mGroupId] = time(nullptr); + IndicateConfigChanged(); + } + + if(unknown) + { + auto ev = std::make_shared(); + ev->mForumGroupId = gxsChange->mGroupId; + ev->mForumEventCode = RsForumEventCode::NEW_FORUM; + rsEvents->postEvent(ev); + } + +#ifdef RS_DEEP_FORUMS_INDEX + uint8_t itemType = groupChange->mNewGroupItem->PacketSubType(); + switch(static_cast(itemType)) + { + case RsGxsForumsItems::GROUP_ITEM: + { + auto newForumGroupItem = + static_cast( + groupChange->mNewGroupItem ); + mDeepIndex.indexForumGroup(newForumGroupItem->mGroup); + break; + } + default: + RS_WARN("Got unknown gxs group subtype: ", itemType); + break; + } +#endif // def RS_DEEP_FORUMS_INDEX + + } + break; } - else + case RsGxsNotify::TYPE_PROCESSED: // happens when the group is subscribed { - if (rsEvents) + auto ev = std::make_shared(); + ev->mForumGroupId = gxsChange->mGroupId; + ev->mForumEventCode = RsForumEventCode::SUBSCRIBE_STATUS_CHANGED; + rsEvents->postEvent(ev); + break; + } + case RsGxsNotify::TYPE_GROUP_SYNC_PARAMETERS_UPDATED: + { + auto ev = std::make_shared(); + ev->mForumGroupId = gxsChange->mGroupId; + ev->mForumEventCode = RsForumEventCode::SYNC_PARAMETERS_UPDATED; + rsEvents->postEvent(ev); + break; + } + case RsGxsNotify::TYPE_MESSAGE_DELETED: + { + auto delChange = dynamic_cast(gxsChange); + if(!delChange) { - RsGxsGroupChange *grpChange = dynamic_cast(*it); - if (grpChange) - { - switch (grpChange->getType()) - { - case RsGxsNotify::TYPE_PROCESSED: // happens when the group is subscribed - { - auto ev = std::make_shared(); - ev->mForumGroupId = grpChange->mGroupId; - ev->mForumEventCode = RsForumEventCode::SUBSCRIBE_STATUS_CHANGED; - rsEvents->postEvent(ev); - } - break; - - case RsGxsNotify::TYPE_GROUP_SYNC_PARAMETERS_UPDATED: - { - auto ev = std::make_shared(); - ev->mForumGroupId = grpChange->mGroupId; - ev->mForumEventCode = RsForumEventCode::SYNC_PARAMETERS_UPDATED; - rsEvents->postEvent(ev); - } - break; - - case RsGxsNotify::TYPE_PUBLISHED: - case RsGxsNotify::TYPE_RECEIVED_NEW: - { - /* group received */ - - bool unknown; - { - RS_STACK_MUTEX(mKnownForumsMutex); - unknown = (mKnownForums.find(grpChange->mGroupId)==mKnownForums.end()); - mKnownForums[grpChange->mGroupId] = time(nullptr); - IndicateConfigChanged(); - } - - if(unknown) - { - auto ev = std::make_shared(); - ev->mForumGroupId = grpChange->mGroupId; - ev->mForumEventCode = RsForumEventCode::NEW_FORUM; - rsEvents->postEvent(ev); - } - else - RsInfo() << __PRETTY_FUNCTION__ - << " Not notifying already known forum " - << grpChange->mGroupId << std::endl; - } - break; - - case RsGxsNotify::TYPE_GROUP_DELETED: - { - auto ev = std::make_shared(); - ev->mForumGroupId = grpChange->mGroupId; - ev->mForumEventCode = RsForumEventCode::DELETED_FORUM; - rsEvents->postEvent(ev); - } - break; - - case RsGxsNotify::TYPE_STATISTICS_CHANGED: - { - auto ev = std::make_shared(); - ev->mForumGroupId = grpChange->mGroupId; - ev->mForumEventCode = RsForumEventCode::STATISTICS_CHANGED; - rsEvents->postEvent(ev); - - RS_STACK_MUTEX(mKnownForumsMutex); - mKnownForums[grpChange->mGroupId] = time(nullptr); - IndicateConfigChanged(); - } - break; - - case RsGxsNotify::TYPE_UPDATED: - { - // Happens when the group data has changed. In this case we need to analyse the old and new group in order to detect possible notifications for clients - - RsGxsForumGroupItem *old_forum_grp_item = dynamic_cast(grpChange->mOldGroupItem); - RsGxsForumGroupItem *new_forum_grp_item = dynamic_cast(grpChange->mNewGroupItem); - - if(old_forum_grp_item == nullptr || new_forum_grp_item == nullptr) - { - RsErr() << __PRETTY_FUNCTION__ << " received GxsGroupUpdate item with mOldGroup and mNewGroup not of type RsGxsForumGroupItem or NULL. This is inconsistent!" << std::endl; - delete grpChange; - continue; - } - - // First of all, we check if there is a difference between the old and new list of moderators - - std::list added_mods, removed_mods; - - for(auto& gxs_id: new_forum_grp_item->mGroup.mAdminList.ids) - if(old_forum_grp_item->mGroup.mAdminList.ids.find(gxs_id) == old_forum_grp_item->mGroup.mAdminList.ids.end()) - added_mods.push_back(gxs_id); - - for(auto& gxs_id: old_forum_grp_item->mGroup.mAdminList.ids) - if(new_forum_grp_item->mGroup.mAdminList.ids.find(gxs_id) == new_forum_grp_item->mGroup.mAdminList.ids.end()) - removed_mods.push_back(gxs_id); - - if(!added_mods.empty() || !removed_mods.empty()) - { - auto ev = std::make_shared(); - - ev->mForumGroupId = new_forum_grp_item->meta.mGroupId; - ev->mModeratorsAdded = added_mods; - ev->mModeratorsRemoved = removed_mods; - ev->mForumEventCode = RsForumEventCode::MODERATOR_LIST_CHANGED; - - rsEvents->postEvent(ev); - } - - // check the list of pinned posts - - std::list added_pins, removed_pins; - - for(auto& msg_id: new_forum_grp_item->mGroup.mPinnedPosts.ids) - if(old_forum_grp_item->mGroup.mPinnedPosts.ids.find(msg_id) == old_forum_grp_item->mGroup.mPinnedPosts.ids.end()) - added_pins.push_back(msg_id); - - for(auto& msg_id: old_forum_grp_item->mGroup.mPinnedPosts.ids) - if(new_forum_grp_item->mGroup.mPinnedPosts.ids.find(msg_id) == new_forum_grp_item->mGroup.mPinnedPosts.ids.end()) - removed_pins.push_back(msg_id); - - if(!added_pins.empty() || !removed_pins.empty()) - { - auto ev = std::make_shared(); - - ev->mForumGroupId = new_forum_grp_item->meta.mGroupId; - ev->mForumEventCode = RsForumEventCode::PINNED_POSTS_CHANGED; - - rsEvents->postEvent(ev); - } - - if( old_forum_grp_item->mGroup.mDescription != new_forum_grp_item->mGroup.mDescription - || old_forum_grp_item->meta.mGroupName != new_forum_grp_item->meta.mGroupName - || old_forum_grp_item->meta.mGroupFlags != new_forum_grp_item->meta.mGroupFlags - || old_forum_grp_item->meta.mAuthorId != new_forum_grp_item->meta.mAuthorId - || old_forum_grp_item->meta.mCircleId != new_forum_grp_item->meta.mCircleId - ) - { - auto ev = std::make_shared(); - ev->mForumGroupId = new_forum_grp_item->meta.mGroupId; - ev->mForumEventCode = RsForumEventCode::UPDATED_FORUM; - rsEvents->postEvent(ev); - } - } - break; - - - default: - RsErr() << " Got a GXS event of type " << grpChange->getType() << " Currently not handled." << std::endl; - break; - } - } + RS_ERR( "Got mismatching notification type: ", + gxsChange->getType() ); + print_stacktrace(); + break; } + +#ifdef RS_DEEP_FORUMS_INDEX + mDeepIndex.removeForumPostFromIndex( + delChange->mGroupId, delChange->messageId); +#endif + + auto ev = std::make_shared(); + ev->mForumEventCode = RsForumEventCode::DELETED_POST; + ev->mForumGroupId = delChange->mGroupId; + ev->mForumMsgId = delChange->messageId; + break; + } + case RsGxsNotify::TYPE_GROUP_DELETED: + { +#ifdef RS_DEEP_FORUMS_INDEX + mDeepIndex.removeForumFromIndex(gxsChange->mGroupId); +#endif + auto ev = std::make_shared(); + ev->mForumGroupId = gxsChange->mGroupId; + ev->mForumEventCode = RsForumEventCode::DELETED_FORUM; + rsEvents->postEvent(ev); + break; + } + case RsGxsNotify::TYPE_STATISTICS_CHANGED: + { + auto ev = std::make_shared(); + ev->mForumGroupId = gxsChange->mGroupId; + ev->mForumEventCode = RsForumEventCode::STATISTICS_CHANGED; + rsEvents->postEvent(ev); + + RS_STACK_MUTEX(mKnownForumsMutex); + mKnownForums[gxsChange->mGroupId] = time(nullptr); + IndicateConfigChanged(); + break; + } + case RsGxsNotify::TYPE_UPDATED: + { + /* Happens when the group data has changed. In this case we need to + * analyse the old and new group in order to detect possible + * notifications for clients */ + + auto grpChange = dynamic_cast(gxsChange); + + RsGxsForumGroupItem* old_forum_grp_item = + dynamic_cast(grpChange->mOldGroupItem); + RsGxsForumGroupItem* new_forum_grp_item = + dynamic_cast(grpChange->mNewGroupItem); + + if( old_forum_grp_item == nullptr || new_forum_grp_item == nullptr) + { + RS_ERR( "received GxsGroupUpdate item with mOldGroup and " + "mNewGroup not of type RsGxsForumGroupItem or NULL. " + "This is inconsistent!"); + print_stacktrace(); + break; + } + +#ifdef RS_DEEP_FORUMS_INDEX + mDeepIndex.indexForumGroup(new_forum_grp_item->mGroup); +#endif + + /* First of all, we check if there is a difference between the old + * and new list of moderators */ + + std::list added_mods, removed_mods; + for(auto& gxs_id: new_forum_grp_item->mGroup.mAdminList.ids) + if( old_forum_grp_item->mGroup.mAdminList.ids.find(gxs_id) + == old_forum_grp_item->mGroup.mAdminList.ids.end() ) + added_mods.push_back(gxs_id); + + for(auto& gxs_id: old_forum_grp_item->mGroup.mAdminList.ids) + if( new_forum_grp_item->mGroup.mAdminList.ids.find(gxs_id) + == new_forum_grp_item->mGroup.mAdminList.ids.end() ) + removed_mods.push_back(gxs_id); + + if(!added_mods.empty() || !removed_mods.empty()) + { + auto ev = std::make_shared(); + + ev->mForumGroupId = new_forum_grp_item->meta.mGroupId; + ev->mModeratorsAdded = added_mods; + ev->mModeratorsRemoved = removed_mods; + ev->mForumEventCode = RsForumEventCode::MODERATOR_LIST_CHANGED; + + rsEvents->postEvent(ev); + } + + // check the list of pinned posts + std::list added_pins, removed_pins; + + for(auto& msg_id: new_forum_grp_item->mGroup.mPinnedPosts.ids) + if( old_forum_grp_item->mGroup.mPinnedPosts.ids.find(msg_id) + == old_forum_grp_item->mGroup.mPinnedPosts.ids.end() ) + added_pins.push_back(msg_id); + + for(auto& msg_id: old_forum_grp_item->mGroup.mPinnedPosts.ids) + if( new_forum_grp_item->mGroup.mPinnedPosts.ids.find(msg_id) + == new_forum_grp_item->mGroup.mPinnedPosts.ids.end() ) + removed_pins.push_back(msg_id); + + if(!added_pins.empty() || !removed_pins.empty()) + { + auto ev = std::make_shared(); + ev->mForumGroupId = new_forum_grp_item->meta.mGroupId; + ev->mForumEventCode = RsForumEventCode::PINNED_POSTS_CHANGED; + rsEvents->postEvent(ev); + } + + if( old_forum_grp_item->mGroup.mDescription != new_forum_grp_item->mGroup.mDescription + || old_forum_grp_item->meta.mGroupName != new_forum_grp_item->meta.mGroupName + || old_forum_grp_item->meta.mGroupFlags != new_forum_grp_item->meta.mGroupFlags + || old_forum_grp_item->meta.mAuthorId != new_forum_grp_item->meta.mAuthorId + || old_forum_grp_item->meta.mCircleId != new_forum_grp_item->meta.mCircleId ) + { + auto ev = std::make_shared(); + ev->mForumGroupId = new_forum_grp_item->meta.mGroupId; + ev->mForumEventCode = RsForumEventCode::UPDATED_FORUM; + rsEvents->postEvent(ev); + } + + break; } - /* shouldn't need to worry about groups - as they need to be subscribed to */ - - delete *it; + default: + RS_ERR( "Got a GXS event of type ", gxsChange->getType(), + " Currently not handled." ); + break; + } } } @@ -618,6 +653,8 @@ bool p3GxsForums::createForumV2( forum.mMeta.mSignFlags = GXS_SERV::FLAG_GROUP_SIGN_PUBLISH_NONEREQ | GXS_SERV::FLAG_AUTHOR_AUTHENTICATION_REQUIRED; + /* This flag have always this value even for circle restricted forums due to + * how GXS distribute/verify groups */ forum.mMeta.mGroupFlags = GXS_SERV::FLAG_PRIVACY_PUBLIC; forum.mMeta.mCircleId.clear(); @@ -1370,6 +1407,255 @@ bool RsGxsForumGroup::canEditPosts(const RsGxsId& id) const id == mMeta.mAuthorId; } +std::error_condition p3GxsForums::getContentSummaries( + const RsGxsGroupId& forumId, + const std::set& contentIds, + std::vector& summaries ) +{ + uint32_t token; + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_MSG_META; + + GxsMsgReq msgReq; + msgReq[forumId] = contentIds; + + + if(!requestMsgInfo(token, opts, msgReq)) + { + RS_ERR("requestMsgInfo failed"); + return std::errc::invalid_argument; + } + + switch(waitToken(token, std::chrono::seconds(5))) + { + case RsTokenService::COMPLETE: + { + GxsMsgMetaMap metaMap; + if(!RsGenExchange::getMsgMeta(token, metaMap)) + return std::errc::result_out_of_range; + summaries = metaMap[forumId]; + return std::error_condition(); + } + case RsTokenService::PARTIAL: // [[fallthrough]]; + case RsTokenService::PENDING: + return std::errc::timed_out; + default: + return std::errc::not_supported; + } +} + +#ifdef RS_DEEP_FORUMS_INDEX +std::error_condition p3GxsForums::handleDistantSearchRequest( + rs_view_ptr requestData, uint32_t requestSize, + rs_owner_ptr& resultData, uint32_t& resultSize ) +{ + RS_DBG1(""); + + RsGxsForumsSearchRequest request; + { + RsGenericSerializer::SerializeContext ctx(requestData, requestSize); + RsGenericSerializer::SerializeJob j = + RsGenericSerializer::SerializeJob::DESERIALIZE; + RS_SERIAL_PROCESS(request); + } + + if(request.mType != RsGxsForumsItems::SEARCH_REQUEST) + { + // If more types are implemented we would put a switch on mType instead + RS_WARN( "Got search request with unkown type: ", + static_cast(request.mType) ); + return std::errc::bad_message; + } + + RsGxsForumsSearchReply reply; + auto mErr = prepareSearchResults(request.mQuery, true, reply.mResults); + if(mErr || reply.mResults.empty()) return mErr; + + { + RsGenericSerializer::SerializeContext ctx; + RsGenericSerializer::SerializeJob j = + RsGenericSerializer::SerializeJob::SIZE_ESTIMATE; + RS_SERIAL_PROCESS(reply); + resultSize = ctx.mOffset; + } + + resultData = rs_malloc(resultSize); + RsGenericSerializer::SerializeContext ctx(resultData, resultSize); + RsGenericSerializer::SerializeJob j = + RsGenericSerializer::SerializeJob::SERIALIZE; + RS_SERIAL_PROCESS(reply); + + return std::error_condition(); +} + +std::error_condition p3GxsForums::distantSearchRequest( + const std::string& matchString, TurtleRequestId& searchId ) +{ + RsGxsForumsSearchRequest request; + request.mQuery = matchString; + + uint32_t requestSize; + { + RsGenericSerializer::SerializeContext ctx; + RsGenericSerializer::SerializeJob j = + RsGenericSerializer::SerializeJob::SIZE_ESTIMATE; + RS_SERIAL_PROCESS(request); + requestSize = ctx.mOffset; + } + + std::error_condition ec; + auto requestData = rs_malloc(requestSize, &ec); + if(!requestData) return ec; + { + RsGenericSerializer::SerializeContext ctx(requestData, requestSize); + RsGenericSerializer::SerializeJob j = + RsGenericSerializer::SerializeJob::SERIALIZE; + RS_SERIAL_PROCESS(request); + } + + return netService()->distantSearchRequest( + requestData, requestSize, + static_cast(serviceType()), searchId ); +} + +std::error_condition p3GxsForums::localSearch( + const std::string& matchString, + std::vector& searchResults ) +{ return prepareSearchResults(matchString, false, searchResults); } + +std::error_condition p3GxsForums::prepareSearchResults( + const std::string& matchString, bool publicOnly, + std::vector& searchResults ) +{ + std::vector results; + auto mErr = mDeepIndex.search(matchString, results); + if(mErr) return mErr; + + searchResults.clear(); + for(auto uRes: results) + { + RsUrl resUrl(uRes.mUrl); + const auto forumIdStr = resUrl.getQueryV(RsGxsForums::FORUM_URL_ID_FIELD); + if(!forumIdStr) + { + RS_ERR( "Forum URL retrieved from deep index miss ID. ", + "Should never happen! ", uRes.mUrl ); + print_stacktrace(); + return std::errc::address_not_available; + } + + std::vector forumsInfo; + RsGxsGroupId forumId(*forumIdStr); + if(forumId.isNull()) + { + RS_ERR( "Forum ID retrieved from deep index is invalid. ", + "Should never happen! ", uRes.mUrl ); + print_stacktrace(); + return std::errc::bad_address; + } + + if( !getForumsInfo(std::list{forumId}, forumsInfo) || + forumsInfo.empty() ) + { + RS_ERR( "Forum just parsed from deep index link not found. " + "Should never happen! ", forumId, " ", uRes.mUrl ); + print_stacktrace(); + return std::errc::identifier_removed; + } + + RsGroupMetaData& fMeta(forumsInfo[0].mMeta); + + // Avoid leaking sensitive information to unkown peers + if( publicOnly && + ( static_cast(fMeta.mCircleType) != + RsGxsCircleType::PUBLIC ) ) continue; + + RsGxsSearchResult res; + res.mGroupId = forumId; + res.mGroupName = fMeta.mGroupName; + res.mAuthorId = fMeta.mAuthorId; + res.mPublishTs = fMeta.mPublishTs; + res.mSearchContext = uRes.mSnippet; + + auto postIdStr = + resUrl.getQueryV(RsGxsForums::FORUM_URL_MSG_ID_FIELD); + if(postIdStr) + { + RsGxsMessageId msgId(*postIdStr); + if(msgId.isNull()) + { + RS_ERR( "Post just parsed from deep index link is invalid. " + "Should never happen! ", postIdStr, " ", uRes.mUrl ); + print_stacktrace(); + return std::errc::bad_address; + } + + std::vector msgSummaries; + auto errc = getContentSummaries( + forumId, std::set{msgId}, msgSummaries); + if(errc) return errc; + + if(msgSummaries.size() != 1) + { + RS_ERR( "getContentSummaries returned: ", msgSummaries.size(), + "should never happen!" ); + return std::errc::result_out_of_range; + } + + RsMsgMetaData& msgMeta(msgSummaries[0]); + res.mMsgId = msgMeta.mMsgId; + res.mMsgName = msgMeta.mMsgName; + res.mAuthorId = msgMeta.mAuthorId; + } + + RS_DBG4(res); + searchResults.push_back(res); + } + + return std::error_condition(); +} + +std::error_condition p3GxsForums::receiveDistantSearchResult( + const TurtleRequestId requestId, + rs_owner_ptr& resultData, uint32_t& resultSize ) +{ + RsGxsForumsSearchReply reply; + { + RsGenericSerializer::SerializeContext ctx(resultData, resultSize); + RsGenericSerializer::SerializeJob j = + RsGenericSerializer::SerializeJob::DESERIALIZE; + RS_SERIAL_PROCESS(reply); + } + free(resultData); + + if(reply.mType != RsGxsForumsItems::SEARCH_REPLY) + { + // If more types are implemented we would put a switch on mType instead + RS_WARN( "Got search request with unkown type: ", + static_cast(reply.mType) ); + return std::errc::bad_message; + } + + auto event = std::make_shared(); + event->mSearchId = requestId; + event->mSearchResults = reply.mResults; + rsEvents->postEvent(event); + return std::error_condition(); +} + +#else // def RS_DEEP_FORUMS_INDEX + +std::error_condition p3GxsForums::distantSearchRequest( + const std::string&, TurtleRequestId& ) +{ return std::errc::function_not_supported; } + +std::error_condition p3GxsForums::localSearch( + const std::string&, + std::vector& ) +{ return std::errc::function_not_supported; } + +#endif // def RS_DEEP_FORUMS_INDEX + /*static*/ const std::string RsGxsForums::DEFAULT_FORUM_BASE_URL = "retroshare:///forums"; /*static*/ const std::string RsGxsForums::FORUM_URL_NAME_FIELD = diff --git a/libretroshare/src/services/p3gxsforums.h b/libretroshare/src/services/p3gxsforums.h index 97f04cc7b..b499e7b0d 100644 --- a/libretroshare/src/services/p3gxsforums.h +++ b/libretroshare/src/services/p3gxsforums.h @@ -4,8 +4,8 @@ * libretroshare: retroshare core library * * * * Copyright (C) 2012-2014 Robert Fernie * - * Copyright (C) 2018-2020 Gioacchino Mazzurco * - * Copyright (C) 2019-2020 Asociación Civil Altermundi * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -32,6 +32,10 @@ #include "util/rstickevent.h" #include "util/rsdebug.h" +#ifdef RS_DEEP_FORUMS_INDEX +#include "deep_search/forumsindex.hpp" +#endif + class p3GxsForums: public RsGenExchange, public RsGxsForums, public p3Config, public RsTickEvent /* only needed for testing - remove after */ @@ -142,7 +146,34 @@ public: /// @see RsGxsForums std::error_condition setPostKeepForever( const RsGxsGroupId& forumId, const RsGxsMessageId& postId, - bool keepForever ) override; + bool keepForever ) override; + + /// @see RsGxsForums + std::error_condition getContentSummaries( + const RsGxsGroupId& forumId, + const std::set& contentIds, + std::vector& summaries ) override; + + /// @see RsGxsForums + std::error_condition distantSearchRequest( + const std::string& matchString, TurtleRequestId& searchId ) override; + + /// @see RsGxsForums + std::error_condition localSearch( + const std::string& matchString, + std::vector& searchResults ) override; + +#ifdef RS_DEEP_FORUMS_INDEX + /// @see RsNxsObserver + std::error_condition handleDistantSearchRequest( + rs_view_ptr requestData, uint32_t requestSize, + rs_owner_ptr& resultData, uint32_t& resultSize ) override; + + /// @see RsNxsObserver + std::error_condition receiveDistantSearchResult( + const TurtleRequestId requestId, + rs_owner_ptr& resultData, uint32_t& resultSize ) override; +#endif /// implementation of rsGxsGorums /// @@ -155,6 +186,17 @@ public: bool getMsgMetaData(const uint32_t &token, GxsMsgMetaMap& msg_metas) ; +protected: +#ifdef RS_DEEP_FORUMS_INDEX + /** Internal usage + * @param[in] publicOnly if true is passed only results pertaining to + * publicly shared forums are returned + */ + std::error_condition prepareSearchResults( + const std::string& matchString, bool publicOnly, + std::vector& searchResults ); +#endif //def RS_DEEP_FORUMS_INDEX + private: static uint32_t forumsAuthenPolicy(); @@ -189,4 +231,8 @@ bool generateGroup(uint32_t &token, std::string groupName); std::map mKnownForums ; RsMutex mKnownForumsMutex; + +#ifdef RS_DEEP_FORUMS_INDEX + DeepForumsIndex mDeepIndex; +#endif }; diff --git a/libretroshare/src/turtle/p3turtle.cc b/libretroshare/src/turtle/p3turtle.cc index 10069056a..65f14048e 100644 --- a/libretroshare/src/turtle/p3turtle.cc +++ b/libretroshare/src/turtle/p3turtle.cc @@ -3,7 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2009-2018 by Cyril Soler * + * Copyright (C) 2009-2018 Cyril Soler * + * Copyright (C) 2018-2021 Gioacchino Mazzurco * + * Copyright (C) 2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -26,6 +28,10 @@ #include #include #include +#include +#include +#include +#include #include "rsserver/p3face.h" #include "crypto/rscrypto.h" @@ -39,13 +45,7 @@ #include "ft/ftcontroller.h" #include "p3turtle.h" - -#include -#include -#include - -#include - +#include "util/cxx17retrocompat.h" #include "util/rsdebug.h" #include "util/rsprint.h" #include "util/rsrandom.h" @@ -1975,7 +1975,8 @@ void p3turtle::handleTunnelResult(RsTurtleTunnelOkItem *item) // -void RsTurtleStringSearchRequestItem::search(std::list& result) const +void RsTurtleStringSearchRequestItem::search( + std::list& result ) const { /* call to core */ std::list initialResults; @@ -1988,17 +1989,19 @@ void RsTurtleStringSearchRequestItem::search(std::list& result) std::cerr << "Performing rsFiles->search()" << std::endl ; #endif // now, search! - rsFiles->SearchKeywords(words, initialResults,RS_FILE_HINTS_LOCAL | RS_FILE_HINTS_SEARCHABLE,PeerId()); + rsFiles->SearchKeywords( + words, initialResults, + RS_FILE_HINTS_LOCAL | RS_FILE_HINTS_SEARCHABLE, PeerId() ); #ifdef P3TURTLE_DEBUG std::cerr << initialResults.size() << " matches found." << std::endl ; #endif result.clear() ; - for(std::list::const_iterator it(initialResults.begin());it!=initialResults.end();++it) + for(auto& it: std::as_const(initialResults)) { // retain only file type - if (it->type == DIR_TYPE_DIR) + if (it.type == DIR_TYPE_DIR) { #ifdef P3TURTLE_DEBUG std::cerr << " Skipping directory " << it->name << std::endl ; @@ -2006,12 +2009,12 @@ void RsTurtleStringSearchRequestItem::search(std::list& result) continue; } - TurtleFileInfo i ; - i.hash = it->hash ; - i.size = it->size ; - i.name = it->name ; + TurtleFileInfo i; + i.hash = it.hash; + i.size = it.size; + i.name = it.name; - result.push_back(i) ; + result.push_back(i); } } void RsTurtleRegExpSearchRequestItem::search(std::list& result) const diff --git a/libretroshare/src/turtle/turtleclientservice.h b/libretroshare/src/turtle/turtleclientservice.h index 9cbe5763f..55525ae3c 100644 --- a/libretroshare/src/turtle/turtleclientservice.h +++ b/libretroshare/src/turtle/turtleclientservice.h @@ -19,23 +19,25 @@ * along with this program. If not, see . * * * *******************************************************************************/ - -// This class is the parent class for any service that will use the turtle router to distribute its packets. -// Typical representative clients include: -// -// p3ChatService: opens tunnels to distant peers for chatting -// ftServer: searches and open tunnels to distant sources for file transfer -// #pragma once #include #include -#include -#include + +#include "serialiser/rsserial.h" +#include "turtle/rsturtleitem.h" +#include "util/rsdebug.h" struct RsItem; class p3turtle ; +/** This class is the parent class for any service that will use the turtle + * router to distribute its packets. + * Typical representative clients include: + * p3ChatService: opens tunnels to distant peers for chatting + * ftServer: searches and open tunnels to distant sources for file + * transfer + */ class RsTurtleClientService { public: @@ -87,30 +89,35 @@ class RsTurtleClientService std::cerr << "!!!!!! Received Data from turtle router, but the client service is not handling it !!!!!!!!!!" << std::endl ; } - /*! - * \brief receiveSearchRequest - * This method is called by the turtle router to notify the client of a search request in the form generic data. The returned - * result contains the serialised generic result returned by the client. - * - * The turtle router keeps the memory ownership over search_request_data - * - * \param search_request_data generic serialized search data - * \param search_request_data_len length of the serialized search data - * \param search_result_data generic serialized search result data - * \param search_result_data_len length of the serialized search result data - * \param max_allowed_hits max number of hits allowed to be sent back and forwarded - * - * \return true if the search is successful. - */ - virtual bool receiveSearchRequest(unsigned char */*search_request_data*/, - uint32_t /*search_request_data_len*/, - unsigned char *& /*search_result_data*/, - uint32_t& /*search_result_data_len*/, - uint32_t& /* max_allows_hits */) - { - std::cerr << "!!!!!! Received search result from turtle router, but the client service who requested it is not handling it !!!!!!!!!!" << std::endl ; - return false; - } + /*! + * This method is called by the turtle router to notify the client of a + * search request in the form generic data. + * The returned result contains the serialised generic result returned by the + * client service. + * The turtle router keeps the memory ownership over search_request_data + * \param search_request_data generic serialized search data + * \param search_request_data_len length of the serialized search data + * \param search_result_data generic serialized search result data + * \param search_result_data_len length of the serialized search result data + * \param max_allowed_hits max number of hits allowed to be sent back and + * forwarded + * \return true if matching results are available, false otherwise. + */ + virtual bool receiveSearchRequest( + unsigned char *search_request_data, uint32_t search_request_data_len, + unsigned char *& search_result_data, uint32_t& search_result_data_len, + uint32_t& max_allows_hits ) + { + /* Suppress unused warning this way and not commenting the param names + * so doxygen match documentation against params */ + (void) search_request_data; (void) search_request_data_len; + (void) search_result_data; (void) search_result_data_len; + (void) max_allows_hits; + + RS_WARN( "Received search request from turtle router, but the client " + "is not handling it!" ); + return false; + } /*! * \brief receiveSearchResult diff --git a/libretroshare/src/use_libretroshare.pri b/libretroshare/src/use_libretroshare.pri index ee8872104..0cca29150 100644 --- a/libretroshare/src/use_libretroshare.pri +++ b/libretroshare/src/use_libretroshare.pri @@ -90,6 +90,15 @@ rs_broadcast_discovery { win32-g++|win32-clang-g++:dLibs *= wsock32 } +rs_sam3_libsam3 { + LIBSAM3_SRC_PATH=$$clean_path($${RS_SRC_PATH}/supportlibs/libsam3/) + LIBSAM3_BUILD_PATH=$$clean_path($${RS_BUILD_PATH}/supportlibs/libsam3/) + INCLUDEPATH *= $$clean_path($${LIBSAM3_SRC_PATH}/src/libsam3/) + DEPENDPATH *= $$clean_path($${LIBSAM3_BUILD_PATH}) + QMAKE_LIBDIR *= $$clean_path($${LIBSAM3_BUILD_PATH}) + LIBS *= -L$$clean_path($${LIBSAM3_BUILD_PATH}) -lsam3 +} + static { sLibs *= $$mLibs } else { diff --git a/libretroshare/src/util/dnsresolver.cc b/libretroshare/src/util/dnsresolver.cc index 3b68a052e..7ce9edee6 100644 --- a/libretroshare/src/util/dnsresolver.cc +++ b/libretroshare/src/util/dnsresolver.cc @@ -41,8 +41,6 @@ const rstime_t MAX_TIME_BEFORE_RETRY = 300 ; /* seconds before retrying an ip address */ const rstime_t MAX_KEEP_DNS_ENTRY = 3600 ; /* seconds during which a DNS entry is considered valid */ -static const std::string ADDR_AGENT = "Mozilla/5.0"; - void *solveDNSEntries(void *p) { bool more_to_go = true ; diff --git a/libretroshare/src/util/extaddrfinder.cc b/libretroshare/src/util/extaddrfinder.cc index b214dc779..03b9f33a9 100644 --- a/libretroshare/src/util/extaddrfinder.cc +++ b/libretroshare/src/util/extaddrfinder.cc @@ -19,9 +19,13 @@ * along with this program. If not, see . * * * *******************************************************************************/ + +//#define EXTADDRSEARCH_DEBUG + #include "extaddrfinder.h" #include "pqi/pqinetwork.h" +#include "rsdebug.h" #include "util/rsstring.h" #include "util/rsmemory.h" @@ -38,286 +42,237 @@ #include #include "util/rstime.h" -const uint32_t MAX_IP_STORE = 300; /* seconds ip address timeout */ +#include -//#define EXTADDRSEARCH_DEBUG +const uint32_t MAX_IP_STORE = 300; /* seconds ip address timeout */ -static const std::string ADDR_AGENT = "Mozilla/5.0"; - -static std::string scan_ip(const std::string& text) +class ZeroInt { - std::set digits ; - digits.insert('0') ; digits.insert('3') ; digits.insert('6') ; - digits.insert('1') ; digits.insert('4') ; digits.insert('7') ; - digits.insert('2') ; digits.insert('5') ; digits.insert('8') ; - digits.insert('9') ; +public: + ZeroInt() : n(0) {} + uint32_t n ; +}; - for(int i=0;i<(int)text.size();++i) - { - while(i < (int)text.size() && digits.find(text[i])==digits.end()) ++i ; - - if(i>=(int)text.size()) - return "" ; - - unsigned int a,b,c,d ; - - if(sscanf(text.c_str()+i,"%u.%u.%u.%u",&a,&b,&c,&d) != 4) - continue ; - - if(a < 256 && b<256 && c<256 && d<256) - { - std::string s ; - rs_sprintf(s, "%u.%u.%u.%u", a, b, c, d) ; - return s; - } - } - return "" ; -} - -static void getPage(const std::string& server_name,std::string& page) -{ - page = "" ; - int sockfd,n=0; // socket descriptor - struct sockaddr_in serveur; // server's parameters - memset(&serveur.sin_zero, 0, sizeof(serveur.sin_zero)); - - char buf[1024]; - char request[1024]; -#ifdef EXTADDRSEARCH_DEBUG - std::cout << "ExtAddrFinder: connecting to " << server_name << std::endl ; -#endif - // socket creation - - sockfd = unix_socket(PF_INET,SOCK_STREAM,0); - if (sockfd < 0) - { - std::cerr << "ExtAddrFinder: Failed to create socket" << std::endl; - return ; - } - - serveur.sin_family = AF_INET; - - // get server's ipv4 adress - - in_addr in ; - - if(!rsGetHostByName(server_name.c_str(),in)) /* l'hôte n'existe pas */ - { - std::cerr << "ExtAddrFinder: Unknown host " << server_name << std::endl; - unix_close(sockfd); - return ; - } - serveur.sin_addr = in ; - serveur.sin_port = htons(80); - -#ifdef EXTADDRSEARCH_DEBUG - printf("Connection attempt\n"); -#endif - std::cerr << "ExtAddrFinder: resolved hostname " << server_name << " to " << rs_inet_ntoa(in) << std::endl; - - sockaddr_storage server; - sockaddr_storage_setipv4(server, &serveur); - sockaddr_storage_setport(server, 80); - if(unix_connect(sockfd, server) == -1) - { - std::cerr << "ExtAddrFinder: Connection error to " << server_name << std::endl ; - unix_close(sockfd); - return ; - } -#ifdef EXTADDRSEARCH_DEBUG - std::cerr << "ExtAddrFinder: Connection established to " << server_name << std::endl ; -#endif - - // envoi - if(snprintf( request, - 1024, - "GET / HTTP/1.0\r\n" - "Host: %s:%d\r\n" - "Connection: Close\r\n" - "\r\n", - server_name.c_str(), 80) > 1020) - { - std::cerr << "ExtAddrFinder: buffer overrun. The server name \"" << server_name << "\" is too long. This is quite unexpected." << std::endl; - unix_close(sockfd); - return ; - } - - if(send(sockfd,request,strlen(request),0)== -1) - { - std::cerr << "ExtAddrFinder: Could not send request to " << server_name << std::endl ; - unix_close(sockfd); - return ; - } - // recéption - - while((n = recv(sockfd, buf, sizeof buf - 1, 0)) > 0) - { - buf[n] = '\0'; - page += std::string(buf,n) ; - } - // fermeture de la socket - - unix_close(sockfd); -#ifdef EXTADDRSEARCH_DEBUG - std::cerr << "ExtAddrFinder: Got full page from " << server_name << std::endl ; -#endif -} - - -void* doExtAddrSearch(void *p) +void ExtAddrFinder::run() { std::vector res ; - ExtAddrFinder *af = (ExtAddrFinder*)p ; - - for(std::list::const_iterator it(af->_ip_servers.begin());it!=af->_ip_servers.end();++it) + for(auto& it : _ip_servers) { - std::string page ; - - getPage(*it,page) ; - std::string ip = scan_ip(page) ; - + std::string ip = ""; + rsGetHostByNameSpecDNS(it,"myip.opendns.com",ip,2); if(ip != "") res.push_back(ip) ; #ifdef EXTADDRSEARCH_DEBUG - std::cout << "ip found through " << *it << ": \"" << ip << "\"" << std::endl ; + RS_DBG("ip found through DNS ", it, ": \"", ip, "\""); #endif } if(res.empty()) { - // thread safe copy results. - // - { - RsStackMutex mtx(af->mAddrMtx) ; - - af->mFound = false ; - af->mFoundTS = time(NULL) ; - af->mSearching = false ; - } - return NULL ; + reset(); + return ; } - sort(res.begin(),res.end()) ; // eliminates outliers. + std::map addrV4_votes; + std::map addrV6_votes; + std::string all_addrV4_Found; + std::string all_addrV6_Found; - - - if(!sockaddr_storage_ipv4_aton(af->mAddr, res[res.size()/2].c_str())) + for(auto curRes : res) { - std::cerr << "ExtAddrFinder: Could not convert " << res[res.size()/2] << " into an address." << std::endl ; + sockaddr_storage addr; + sockaddr_storage_clear(addr); + bool validIP = sockaddr_storage_inet_pton(addr, curRes) + && sockaddr_storage_isValidNet(addr); + bool isIPv4 = sockaddr_storage_ipv6_to_ipv4(addr); + if( validIP && isIPv4 ) { - RsStackMutex mtx(af->mAddrMtx) ; - af->mFound = false ; - af->mFoundTS = time(NULL) ; - af->mSearching = false ; + addr.ss_family = AF_INET; + addrV4_votes[addr].n++ ; + all_addrV4_Found += sockaddr_storage_tostring(addr) + "\n"; } - return NULL ; + else if( validIP && !isIPv4) + { + addr.ss_family = AF_INET6; + addrV6_votes[addr].n++ ; + all_addrV6_Found += sockaddr_storage_tostring(addr) + "\n"; + } + else + RS_ERR("Invalid addresse reported: ", curRes) ; + } + if( (0 == addrV4_votes.size()) && (0 == addrV6_votes.size()) ) + { + RS_ERR("Could not find any external address."); + reset(); + return ; + } + + if( 1 < addrV4_votes.size() ) + RS_ERR("Multiple external IPv4 addresses reported: " + , all_addrV4_Found ) ; + + if( 1 < addrV6_votes.size() ) + RS_ERR("Multiple external IPv6 addresses reported: " + , all_addrV6_Found ) ; + { - RsStackMutex mtx(af->mAddrMtx) ; - af->mFound = true ; - af->mFoundTS = time(NULL) ; - af->mSearching = false ; + RS_STACK_MUTEX(mAddrMtx); + + mSearching = false ; + mFoundTS = time(NULL) ; + + // Only save more reported address if not only once. + uint32_t admax = 0 ; + sockaddr_storage_clear(mAddrV4); + for (auto it : addrV4_votes) + if (admax < it.second.n) + { + mAddrV4 = it.first ; + mFoundV4 = true ; + admax = it.second.n ; + } + + admax = 0 ; + sockaddr_storage_clear(mAddrV6); + for (auto it : addrV6_votes) + if (admax < it.second.n) + { + mAddrV6 = it.first ; + mFoundV6 = true ; + admax = it.second.n ; + } + } - return NULL ; + return ; } - void ExtAddrFinder::start_request() { - void *data = (void *)this; - pthread_t tid ; - - if(! pthread_create(&tid, 0, &doExtAddrSearch, data)) - pthread_detach(tid); /* so memory is reclaimed in linux */ - else - std::cerr << "(EE) Could not start ExtAddrFinder thread." << std::endl; + if (!isRunning()) + start("ExtAddrFinder"); } -bool ExtAddrFinder::hasValidIP(struct sockaddr_storage &addr) +bool ExtAddrFinder::hasValidIPV4(struct sockaddr_storage &addr) { #ifdef EXTADDRSEARCH_DEBUG - std::cerr << "ExtAddrFinder: Getting ip." << std::endl ; + RS_DBG("Getting ip."); #endif { - RsStackMutex mut(mAddrMtx) ; - if(mFound) + RS_STACK_MUTEX(mAddrMtx) ; + if(mFoundV4) { #ifdef EXTADDRSEARCH_DEBUG - std::cerr << "ExtAddrFinder: Has stored ip: responding with this ip." << std::endl ; + RS_DBG("Has stored ip responding with this ip:", sockaddr_storage_iptostring(mAddrV4)) ; #endif - sockaddr_storage_copyip(addr,mAddr); // just copy the IP so we dont erase the port. + sockaddr_storage_copyip(addr,mAddrV4); // just copy the IP so we dont erase the port. } } - rstime_t delta; + + testTimeOut(); + + RS_STACK_MUTEX(mAddrMtx) ; + return mFoundV4; +} + +bool ExtAddrFinder::hasValidIPV6(struct sockaddr_storage &addr) +{ +#ifdef EXTADDRSEARCH_DEBUG + RS_DBG("Getting ip."); +#endif + { - RsStackMutex mut(mAddrMtx) ; - //timeout the current ip - delta = time(NULL) - mFoundTS; + RS_STACK_MUTEX(mAddrMtx) ; + if(mFoundV6) + { +#ifdef EXTADDRSEARCH_DEBUG + RS_DBG("Has stored ip responding with this ip:", sockaddr_storage_iptostring(mAddrV6)) ; +#endif + sockaddr_storage_copyip(addr,mAddrV6); // just copy the IP so we dont erase the port. + } } - if((uint32_t)delta > MAX_IP_STORE) {//launch a research + + testTimeOut(); + + RS_STACK_MUTEX(mAddrMtx) ; + return mFoundV6; +} + +void ExtAddrFinder::testTimeOut() +{ + bool timeOut; + { + RS_STACK_MUTEX(mAddrMtx) ; + //timeout the current ip + timeOut = (mFoundTS + MAX_IP_STORE < time(NULL)); + } + if(timeOut || mFirstTime) {//launch a research if( mAddrMtx.trylock()) { if(!mSearching) { #ifdef EXTADDRSEARCH_DEBUG - std::cerr << "ExtAddrFinder: No stored ip: Initiating new search." << std::endl ; + RS_DBG("No stored ip: Initiating new search."); #endif mSearching = true ; start_request() ; } #ifdef EXTADDRSEARCH_DEBUG else - std::cerr << "ExtAddrFinder: Already searching." << std::endl ; + RS_DBG("Already searching."); #endif + mFirstTime = false; mAddrMtx.unlock(); } #ifdef EXTADDRSEARCH_DEBUG else - std::cerr << "ExtAddrFinder: (Note) Could not acquire lock. Busy." << std::endl ; + RS_DBG("(Note) Could not acquire lock. Busy."); #endif } - - RsStackMutex mut(mAddrMtx) ; - return mFound ; } -void ExtAddrFinder::reset() +void ExtAddrFinder::reset(bool firstTime /*=false*/) { - RsStackMutex mut(mAddrMtx) ; +#ifdef EXTADDRSEARCH_DEBUG + RS_DBG("firstTime=", firstTime); +#endif + RS_STACK_MUTEX(mAddrMtx) ; - mFound = false ; mSearching = false ; - mFoundTS = time(NULL) - MAX_IP_STORE; + mFoundV4 = false ; + mFoundV6 = false ; + mFirstTime = firstTime; + mFoundTS = time(nullptr); + sockaddr_storage_clear(mAddrV4); + sockaddr_storage_clear(mAddrV6); } ExtAddrFinder::~ExtAddrFinder() { #ifdef EXTADDRSEARCH_DEBUG - std::cerr << "ExtAddrFinder: Deleting ExtAddrFinder." << std::endl ; + RS_DBG("Deleting ExtAddrFinder."); #endif - } ExtAddrFinder::ExtAddrFinder() : mAddrMtx("ExtAddrFinder") { #ifdef EXTADDRSEARCH_DEBUG - std::cerr << "ExtAddrFinder: Creating new ExtAddrFinder." << std::endl ; + RS_DBG("Creating new ExtAddrFinder."); #endif - RsStackMutex mut(mAddrMtx) ; + reset( true ); - mFound = false; - mSearching = false; - mFoundTS = time(NULL) - MAX_IP_STORE; - sockaddr_storage_clear(mAddr); - - _ip_servers.push_back(std::string( "checkip.dyndns.org" )) ; - _ip_servers.push_back(std::string( "www.myip.dk" )) ; - _ip_servers.push_back(std::string( "showip.net" )) ; - _ip_servers.push_back(std::string( "www.displaymyip.com")) ; +//https://unix.stackexchange.com/questions/22615/how-can-i-get-my-external-ip-address-in-a-shell-script + //Enter direct ip so local DNS cannot change it. + //DNS servers must recognize "myip.opendns.com" + _ip_servers.push_back(std::string( "208.67.222.222" )) ;//resolver1.opendns.com + _ip_servers.push_back(std::string( "208.67.220.220" )) ;//resolver2.opendns.com + _ip_servers.push_back(std::string( "208.67.222.220" )) ;//resolver3.opendns.com + _ip_servers.push_back(std::string( "208.67.220.222" )) ;//resolver4.opendns.com + _ip_servers.push_back(std::string( "2620:119:35::35" )) ;//resolver1.opendns.com + _ip_servers.push_back(std::string( "2620:119:53::53" )) ;//resolver2.opendns.com } - diff --git a/libretroshare/src/util/extaddrfinder.h b/libretroshare/src/util/extaddrfinder.h index 22a9a5689..1a2360bab 100644 --- a/libretroshare/src/util/extaddrfinder.h +++ b/libretroshare/src/util/extaddrfinder.h @@ -30,26 +30,31 @@ struct sockaddr ; -class ExtAddrFinder +class ExtAddrFinder: public RsThread { public: ExtAddrFinder() ; ~ExtAddrFinder() ; - bool hasValidIP(struct sockaddr_storage &addr) ; + bool hasValidIPV4(struct sockaddr_storage &addr) ; + bool hasValidIPV6(struct sockaddr_storage &addr) ; void getIPServersList(std::list& ip_servers) { ip_servers = _ip_servers ; } void start_request() ; - void reset() ; + void reset(bool firstTime = false) ; private: - friend void* doExtAddrSearch(void *p) ; + virtual void run(); + void testTimeOut(); - RsMutex mAddrMtx ; - rstime_t mFoundTS; - struct sockaddr_storage mAddr; - bool mFound ; - bool mSearching ; - std::list _ip_servers ; + RsMutex mAddrMtx; + bool mSearching; + bool mFoundV4; + bool mFoundV6; + bool mFirstTime; + rstime_t mFoundTS; + struct sockaddr_storage mAddrV4; + struct sockaddr_storage mAddrV6; + std::list _ip_servers; }; diff --git a/libretroshare/src/util/folderiterator.cc b/libretroshare/src/util/folderiterator.cc index c67204fc6..df3203ba2 100644 --- a/libretroshare/src/util/folderiterator.cc +++ b/libretroshare/src/util/folderiterator.cc @@ -38,8 +38,11 @@ namespace librs { namespace util { -FolderIterator::FolderIterator(const std::string& folderName, bool allow_symlinks, bool allow_files_from_the_future) - : mFolderName(folderName),mAllowSymLinks(allow_symlinks),mAllowFilesFromTheFuture(allow_files_from_the_future) +FolderIterator::FolderIterator( + const std::string& folderName, bool allow_symlinks, + bool allow_files_from_the_future ): + mFolderName(folderName), mAllowSymLinks(allow_symlinks), + mAllowFilesFromTheFuture(allow_files_from_the_future) { is_open = false ; validity = false ; diff --git a/libretroshare/src/util/folderiterator.h b/libretroshare/src/util/folderiterator.h index 19cbb8e9c..5a853eae3 100644 --- a/libretroshare/src/util/folderiterator.h +++ b/libretroshare/src/util/folderiterator.h @@ -44,8 +44,10 @@ namespace librs { namespace util { class FolderIterator { public: - FolderIterator(const std::string& folderName,bool allow_symlinks,bool allow_files_from_the_future = true); - ~FolderIterator(); + FolderIterator( + const std::string& folderName, bool allow_symlinks, + bool allow_files_from_the_future = true ); + ~FolderIterator(); enum { TYPE_UNKNOWN = 0x00, TYPE_FILE = 0x01, diff --git a/libretroshare/src/util/i2pcommon.cpp b/libretroshare/src/util/i2pcommon.cpp index ec2ebfd6b..524219eb3 100644 --- a/libretroshare/src/util/i2pcommon.cpp +++ b/libretroshare/src/util/i2pcommon.cpp @@ -50,8 +50,10 @@ std::string publicKeyFromPrivate(std::string const &priv) * https://geti2p.net/spec/common-structures#keysandcert * https://geti2p.net/spec/common-structures#certificate */ - if (priv.length() < 884) // base64 ( = 663 bytes = KeyCert + priv Keys) + if (priv.length() < privKeyMinLenth_b64) { + RS_WARN("key to short!"); return std::string(); + } // creat a copy to work on, need to convert it to standard base64 auto priv_copy(priv); @@ -70,13 +72,14 @@ std::string publicKeyFromPrivate(std::string const &priv) uint8_t certType = 0; uint16_t len = 0; uint16_t signingKeyType = 0; - uint16_t cryptKey = 0; + uint16_t cryptKeyType = 0; // only used for easy break do { try { // jump to certificate p += publicKeyLen; + // try to read type and length certType = *p++; len = readTwoBytesBE(p); @@ -87,7 +90,7 @@ std::string publicKeyFromPrivate(std::string const &priv) /* * CertType.Null * type null is followed by 0x00 0x00 - * so has to be 0! + * so len has to be 0! */ RS_DBG("cert is CertType.Null"); publicKeyLen += 3; // add 0x00 0x00 0x00 @@ -119,7 +122,7 @@ std::string publicKeyFromPrivate(std::string const &priv) // likely 7 signingKeyType = readTwoBytesBE(p); - RS_DBG("signing pubkey type ", certType); + RS_DBG("signing pubkey type ", signingKeyType); if (signingKeyType >= 3 && signingKeyType <= 6) { RS_DBG("signing pubkey type ", certType, " has oversize"); // calculate oversize @@ -137,18 +140,18 @@ std::string publicKeyFromPrivate(std::string const &priv) return std::string(); } - publicKeyLen += values.first - 128; // 128 = default DSA key length = the space than can be used before the key must be splitted + publicKeyLen += values.first - 128; // 128 = default DSA key length = the space that can be used before the key must be splitted } // Crypto Public Key // likely 0 - cryptKey = readTwoBytesBE(p); - RS_DBG("crypto pubkey type ", cryptKey); + cryptKeyType = readTwoBytesBE(p); + RS_DBG("crypto pubkey type ", cryptKeyType); // info: these are all smaller than the default 256 bytes, so no oversize calculation is needed break; } catch (const std::out_of_range &e) { - RS_DBG("hit exception! ", e.what()); + RS_DBG("hit an exception! ", e.what()); return std::string(); } } while(false); @@ -160,4 +163,107 @@ std::string publicKeyFromPrivate(std::string const &priv) return pub; } +bool getKeyTypes(const std::string &key, std::string &signingKey, std::string &cryptoKey) +{ + if (key.length() < pubKeyMinLenth_b64) { + RS_WARN("key to short!"); + return false; + } + + // creat a copy to work on, need to convert it to standard base64 + auto key_copy(key); + std::replace(key_copy.begin(), key_copy.end(), '~', '/'); + // replacing the - with a + is not necessary, as RsBase64 can handle base64url encoding, too + // std::replace(copy.begin(), copy.end(), '-', '+'); + + // get raw data + std::vector data; + RsBase64::decode(key_copy, data); + + auto p = data.cbegin(); + + constexpr size_t publicKeyLen = 256 + 128; // default length (bytes) + uint8_t certType = 0; + uint16_t signingKeyType = 0; + uint16_t cryptKeyType = 0; + + // try to read types + try { + // jump to certificate + p += publicKeyLen; + + // try to read type and skip length + certType = *p++; + p += 2; + + // only 0 and 5 are used / valid at this point + // check for == 0 + if (certType == static_cast::type>(CertType::Null)) { + RS_DBG("cert is CertType.Null"); + + signingKey = "DSA_SHA1"; + cryptoKey = "ElGamal"; + return true; + } + + // check for != 5 + if (certType != static_cast::type>(CertType::Key)) { + // unsupported + RS_DBG("cert type ", certType, " is unsupported"); + return false; + } + + RS_DBG("cert is CertType.Key"); + + // Signing Public Key + // likely 7 + signingKeyType = readTwoBytesBE(p); + RS_DBG("signing pubkey type ", signingKeyType); + + // Crypto Public Key + // likely 0 + cryptKeyType = readTwoBytesBE(p); + RS_DBG("crypto pubkey type ", cryptKeyType); + } catch (const std::out_of_range &e) { + RS_DBG("hit an exception! ", e.what()); + return false; + } + + // now convert to string (this would be easier with c++17) +#define HELPER(a, b, c) \ + case static_cast::type>(a::c): \ + b = #c; \ + break; + + switch (signingKeyType) { + HELPER(SigningKeyType, signingKey, DSA_SHA1) + HELPER(SigningKeyType, signingKey, ECDSA_SHA256_P256) + HELPER(SigningKeyType, signingKey, ECDSA_SHA384_P384) + HELPER(SigningKeyType, signingKey, ECDSA_SHA512_P521) + HELPER(SigningKeyType, signingKey, RSA_SHA256_2048) + HELPER(SigningKeyType, signingKey, RSA_SHA384_3072) + HELPER(SigningKeyType, signingKey, RSA_SHA512_4096) + HELPER(SigningKeyType, signingKey, EdDSA_SHA512_Ed25519) + HELPER(SigningKeyType, signingKey, EdDSA_SHA512_Ed25519ph) + HELPER(SigningKeyType, signingKey, RedDSA_SHA512_Ed25519) + default: + RsWarn("unkown signing key type:", signingKeyType); + return false; + } + + switch (cryptKeyType) { + HELPER(CryptoKeyType, cryptoKey, ElGamal) + HELPER(CryptoKeyType, cryptoKey, P256) + HELPER(CryptoKeyType, cryptoKey, P384) + HELPER(CryptoKeyType, cryptoKey, P521) + HELPER(CryptoKeyType, cryptoKey, X25519) + default: + RsWarn("unkown crypto key type:", cryptKeyType); + return false; + } +#undef HELPER + + return true; +} + } // namespace i2p diff --git a/libretroshare/src/util/i2pcommon.h b/libretroshare/src/util/i2pcommon.h index 1fd152079..f0da0322b 100644 --- a/libretroshare/src/util/i2pcommon.h +++ b/libretroshare/src/util/i2pcommon.h @@ -186,6 +186,39 @@ static const std::array, 12> signingKeyLengths { /*SigningKeyType::RedDSA_SHA512_Ed25519 */ std::make_pair( 32, 32), }; +/* + * Key length infos: + * + * BOB private key + * len b64: 884 + * len pln: 663 + * + * BOB public key / destination + * len b64: 516 + * len pln: 387 + * + * SAMv3 private key + * len b64: 908 + * len pln: 679 + * + * SAMv3 public key + * len b64: 516 + * len pln: 387 + * + * Example: + * in bytes, public key only + * 384 (Key) + 3 (Null certificate) = 387 bytes + * 384 (Key) + 7 (key certificate) = 391 bytes + * + * in bytes public + private key + * 384 (Key) + 3 (Null certificate) + 256 (ElGamal) + 20 (DSA_SHA1) = 663 bytes + * 384 (Key) + 7 (key certificate) + 256 (ElGamal) + 32 (EdDSA_SHA512_Ed25519) = 679 bytes + */ +constexpr size_t pubKeyMinLenth_b64 = 516; +constexpr size_t pubKeyMinLenth_bin = 387; +constexpr size_t privKeyMinLenth_b64 = 884; +constexpr size_t privKeyMinLenth_bin = 663; + /** * @brief makeOption Creates the string "lhs=rhs" used by BOB and SAM. Converts rhs * @param lhs option to set @@ -208,6 +241,15 @@ std::string keyToBase32Addr(const std::string &key); */ std::string publicKeyFromPrivate(const std::string &priv); +/** + * @brief getKeyTypes returns the name of the utilized algorithms used by the key + * @param key public key + * @param signingKey name of the signing key, e.g. DSA_SHA1 + * @param cryptoKey name of the crpyto key, e.g. ElGamal + * @return true on success, false otherwise + */ +bool getKeyTypes(const std::string &key, std::string &signingKey, std::string &cryptoKey); + } // namespace i2p #endif // I2PCOMMON_H diff --git a/libretroshare/src/util/rsdebug.cc b/libretroshare/src/util/rsdebug.cc index 0a4777ab0..b87dc2c37 100644 --- a/libretroshare/src/util/rsdebug.cc +++ b/libretroshare/src/util/rsdebug.cc @@ -3,9 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright (C) 2004-2008 by Robert Fernie * - * Copyright (C) 2020 Gioacchino Mazzurco * - * Copyright (C) 2020 Asociación Civil Altermundi * + * Copyright (C) 2004-2008 Robert Fernie * + * Copyright (C) 2020-2021 Gioacchino Mazzurco * + * Copyright (C) 2020-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -22,6 +22,8 @@ * * *******************************************************************************/ +#include + #include "util/rsdebug.h" std::ostream &operator<<(std::ostream& out, const std::error_condition& err) @@ -36,6 +38,54 @@ std::string rsErrorNotInCategory(int errNum, const std::string& categoryName) " not available in category: " + categoryName; } +std::error_condition rs_errno_to_condition(int errno_code) +{ return std::make_error_condition(static_cast(errno_code)); } + + +std::ostream& hex_dump(std::ostream& os, const void *buffer, + std::size_t bufsize, bool showPrintableChars /*= true*/) +{ + if (buffer == nullptr) { + return os; + } + auto oldFormat = os.flags(); + auto oldFillChar = os.fill(); + constexpr std::size_t maxline{8}; + // create a place to store text version of string + char renderString[maxline+1]; + char *rsptr{renderString}; + // convenience cast + const unsigned char *buf{reinterpret_cast(buffer)}; + + for (std::size_t linecount=maxline; bufsize; --bufsize, ++buf) { + os << std::setw(2) << std::setfill('0') << std::hex + << static_cast(*buf) << ' '; + *rsptr++ = std::isprint(*buf) ? *buf : '.'; + if (--linecount == 0) { + *rsptr++ = '\0'; // terminate string + if (showPrintableChars) { + os << " | " << renderString; + } + os << '\n'; + rsptr = renderString; + linecount = std::min(maxline, bufsize); + } + } + // emit newline if we haven't already + if (rsptr != renderString) { + if (showPrintableChars) { + for (*rsptr++ = '\0'; rsptr != &renderString[maxline+1]; ++rsptr) { + os << " "; + } + os << " | " << renderString; + } + os << '\n'; + } + + os.fill(oldFillChar); + os.flags(oldFormat); + return os; +} //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// @@ -208,3 +258,7 @@ void rslog(const RsLog::logLvl lvl, RsLog::logInfo *info, const std::string &msg lineCount++; } } +/// All the lines before are DEPRECATED!! +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// diff --git a/libretroshare/src/util/rsdebug.h b/libretroshare/src/util/rsdebug.h index 6409e9492..25d1f1969 100644 --- a/libretroshare/src/util/rsdebug.h +++ b/libretroshare/src/util/rsdebug.h @@ -2,8 +2,8 @@ * RetroShare debugging utilities * * * * Copyright (C) 2004-2008 Robert Fernie * - * Copyright (C) 2019-2020 Gioacchino Mazzurco * - * Copyright (C) 2020 Asociación Civil Altermundi * + * Copyright (C) 2019-2021 Gioacchino Mazzurco * + * Copyright (C) 2020-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -65,6 +65,12 @@ std::ostream &operator<<(std::ostream& out, const std::error_condition& err); * the message around */ std::string rsErrorNotInCategory(int errNum, const std::string& categoryName); +/** Convert C errno codes to modern C++11 std::error_condition, this is quite + * useful to use toghether with C functions used around the code like `malloc`, + * `socket` etc to let errors bubble up comprensibly to upper layers C++11 code + */ +std::error_condition rs_errno_to_condition(int errno_code); + template struct t_RsLogger : std::ostringstream @@ -204,6 +210,53 @@ struct RsNoDbg }; +//From https://codereview.stackexchange.com/a/165162 +/** + * @brief hex_dump: Send Hexadecimal Dump to stream + * @param os: Output Stream + * @param buffer: Buffer to send + * @param bufsize: Buffer's size + * @param showPrintableChars: If must send printable Char too + * @return + * basic string: + * 61 62 63 64 65 66 31 32 | abcdef12 + * 33 34 35 36 00 7a 79 78 | 3456.zyx + * 77 76 75 39 38 37 36 35 | wvu98765 + * 34 45 64 77 61 72 64 00 | 4Edward. + * + * wide string: + * 41 00 00 00 20 00 00 00 | A... ... + * 77 00 00 00 69 00 00 00 | w...i... + * 64 00 00 00 65 00 00 00 | d...e... + * 20 00 00 00 73 00 00 00 | ...s... + * 74 00 00 00 72 00 00 00 | t...r... + * 69 00 00 00 6e 00 00 00 | i...n... + * 67 00 00 00 2e 00 00 00 | g....... + * + * a double + * 49 92 24 49 92 24 09 40 | I.$I.$.@ + */ +std::ostream& hex_dump(std::ostream& os, const void *buffer, + std::size_t bufsize, bool showPrintableChars = true); + +/** + * @brief The hexDump struct + * Enable to print dump calling like that: + * const char test[] = "abcdef123456\0zyxwvu987654Edward"; + * RsDbg()< * - * Copyright (C) 2020 Gioacchino Mazzurco * - * Copyright (C) 2020 Asociación Civil Altermundi * + * Copyright (C) 2020-2021 Gioacchino Mazzurco * + * Copyright (C) 2020-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -27,11 +27,13 @@ #include #include #include -#include +#include +#include class RsThread; -#include +#include "retroshare/rstypes.h" +#include "util/rsmemory.h" #ifndef WINDOWS_SYS typedef int rs_lock_handle_t; @@ -79,10 +81,11 @@ const char *scanf_string_for_uint(int bytes) ; int breakupDirList(const std::string& path, std::list &subdirs); -// Splits the path into parent directory and file. File can be empty if full_path is a dir ending with '/' -// if full_path does not contain a directory, then dir will be "." and file will be full_path. - -bool splitDirFromFile(const std::string& full_path,std::string& dir, std::string& file); +/** Splits the path into parent directory and file. File can be empty if + * full_path is a dir ending with '/' if full_path does not contain a directory, + * then dir will be "." and file will be full_path */ +bool splitDirFromFile( const std::string& full_path, + std::string& dir, std::string& file ); bool copyFile(const std::string& source,const std::string& dest); @@ -92,6 +95,17 @@ bool moveFile(const std::string& source, const std::string& dest); bool removeFile(const std::string& file); bool fileExists(const std::string& file); bool checkFile(const std::string& filename,uint64_t& file_size,bool disallow_empty_file = false); + +/** + * @brief Retrieve file last modification time + * @param path path of the file + * @param errc optional storage for error details + * @return 0 on error, file modification time represented as unix epoch otherwise. + */ +rstime_t lastWriteTime( + const std::string& path, + std::error_condition& errc = RS_DEFAULT_STORAGE_PARAM(std::error_condition) ); + bool checkDirectory(const std::string& dir); bool checkCreateDirectory(const std::string& dir); diff --git a/libretroshare/src/util/rsdnsutils.cc b/libretroshare/src/util/rsdnsutils.cc new file mode 100644 index 000000000..f6bef0de3 --- /dev/null +++ b/libretroshare/src/util/rsdnsutils.cc @@ -0,0 +1,361 @@ +/******************************************************************************* + * libretroshare/src/util: rsdnsutils.cc * + * * + * libretroshare: retroshare core library * + * * + * Copyright 2021 Phenom * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * 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 Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public License * + * along with this program. If not, see . * + * * + *******************************************************************************/ + +//#define DEBUG_SPEC_DNS 1 + +#include "util/rsnet.h" + +#include "util/rsdebug.h" +#include "util/rsthreads.h" +#include "util/rsstring.h" + +#ifdef WINDOWS_SYS +#else +#include +#endif + +//https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-2 +constexpr uint16_t DNSC_IN = 1; //Internet (IN) +//https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4 +constexpr uint16_t DNST_A = 1; //Ipv4 address +constexpr uint16_t DNST_AAAA =28; //Ipv6 address + +///Need to pack as we use sizeof them. (avoid padding) +#pragma pack(1) +//DNS header structure +struct DNS_HEADER +{ + unsigned short id; // identification number + + //Header flags https://www.bind9.net/dns-header-flags + unsigned char rd :1; //bit 07 Recursion Desired, indicates if the client means a recursive query + unsigned char tc :1; //bit 06 TrunCation, indicates that this message was truncated due to excessive length + unsigned char aa :1; //bit 05 Authoritative Answer, in a response, indicates if the DNS server is authoritative for the queried hostname + unsigned char opcode :4;//bit 01-04 The type can be QUERY (standard query, 0), IQUERY (inverse query, 1), or STATUS (server status request, 2) + unsigned char qr :1; //bit 00 Indicates if the message is a query (0) or a reply (1) + + unsigned char rcode :4; //bit 12-15 Response Code can be NOERROR (0), FORMERR (1, Format error), SERVFAIL (2), NXDOMAIN (3, Nonexistent domain), etc. + unsigned char cd :1; //bit 11 Checking Disabled [RFC 4035][RFC 6840][RFC Errata 4927] used by DNSSEC + unsigned char ad :1; //bit 10 Authentic Data [RFC 4035][RFC 6840][RFC Errata 4924] used by DNSSEC + unsigned char z :1; //bit 09 Zero, reserved for future use + unsigned char ra :1; //bit 08 Recursion Available [RFC 1035] in a response, indicates if the replying DNS server supports recursion + + unsigned short q_count; // number of question entries + unsigned short ans_count; // number of answer entries + unsigned short auth_count; // number of authority resource records entries + unsigned short add_count; // number of additional resource record entries +}; +//// OpCode text https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-5 +//static const char *opcodetext[] = { "QUERY", "IQUERY", "STATUS", +// "RESERVED3", "NOTIFY", "UPDATE", +// "STATEFUL", "RESERVED7", "RESERVED8", +// "RESERVED9", "RESERVED10", "RESERVED11", +// "RESERVED12", "RESERVED13", "RESERVED14", +// "RESERVED15" }; +//// RCode text https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6 +//static const char *rcodetext[] = { "NOERROR", "FORMERR", "SERVFAIL", +// "NXDOMAIN", "NOTIMP", "REFUSED", +// "YXDOMAIN", "YXRRSET", "NXRRSET", +// "NOTAUTH", "NOTZONE", "DSOTYPENI", +// "RESERVED12", "RESERVED13", "RESERVED14", +// "RESERVED15", "BADVERS", "BADKEY", +// "BADTIME", "BADMODE", "BADNAME", +// "BADALG", "BADTRUNC", "BADCOOKIE"}; + +//Constant sized fields of query structure +//https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml +struct QUESTION +{ + unsigned short qtype; //https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4 + unsigned short qclass; //https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-2 +}; + +//Constant sized fields of the resource record structure +struct RR_DATA +{ + unsigned short rtype; //https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4 + unsigned short rclass; //https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-2 + unsigned int rttl; //Time To Live is the number of seconds left before the information expires. (32bits integer, so maximum 140 years) + unsigned short data_len;//Lenght of following data +}; +#pragma pack() + +bool rsGetHostByNameSpecDNS(const std::string& servername, const std::string& hostname, std::string& returned_addr, int timeout_s /*= -1*/) +{ +#ifdef DEBUG_SPEC_DNS + RS_DBG("servername=", servername, " hostname=", hostname); +#endif + + if (strlen(servername.c_str()) > 256) + { + RS_ERR("servername is too long > 256 chars: ", servername); + return false; + } + if (strlen(hostname.c_str()) > 256) + { + RS_ERR("hostname is too long > 256 chars: ", hostname); + return false; + } + + sockaddr_storage serverAddr; + bool validServer = sockaddr_storage_inet_pton(serverAddr, servername) + && sockaddr_storage_isValidNet(serverAddr); + bool isIPV4 = validServer && sockaddr_storage_ipv6_to_ipv4(serverAddr); + + if (!validServer) + { + in_addr in ; + if (!rsGetHostByName(servername, in)) + { + RS_ERR("servername is on an unknow format: ", servername); + return false; + } + + validServer = sockaddr_storage_inet_pton(serverAddr, rs_inet_ntoa(in)) + && sockaddr_storage_isValidNet(serverAddr); + isIPV4 = validServer && sockaddr_storage_ipv6_to_ipv4(serverAddr); + + if (!validServer) + { + RS_ERR("rsGetHostByName return bad answer: ", rs_inet_ntoa(in)); + return false; + } + } + + sockaddr_storage_setport( serverAddr, 53); + + //Set the DNS structure to standard queries + unsigned char buf[65536]; + struct DNS_HEADER* dns = (struct DNS_HEADER *)&buf; + dns->id = static_cast(htons(getpid())); //Transaction Id + //dns flags = 0x0100 Standard Query + dns->qr = 0; //Query/Response: Message is a query + dns->opcode = 0; //OpCode: Standard query + dns->aa = 0; //Authoritative: Server is not an authority for domain + dns->tc = 0; //TrunCated: Message is not truncated + dns->rd = 1; //Recursion Desired: Do query recursively + dns->ra = 0; //Recursion Available: Server cannot do recursive queries + dns->z = 0; //Z: reserved + dns->ad = 0; //Authentic Data: Answer/authority portion was not authenticated by the server + dns->cd = 0; //Checking Disabled: Unacceptable + dns->rcode = 0; //Response Code: No error + + dns->q_count = htons(1); //1 Question + dns->ans_count = 0; //0 Answer + dns->auth_count = 0; //0 Authority RRs + dns->add_count = 0; //0 Additional RRs + size_t curSendSize = sizeof(struct DNS_HEADER); + + //Point to the query server name portion + unsigned char* qname =static_cast(&buf[curSendSize]); + //First byte is Label Type: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-10 + qname[0] = 0x04; //One Label with Normal label lower 6 bits is the length of the label + memcpy(&qname[1],hostname.c_str(),strlen(hostname.c_str())); + size_t qnameSize = strlen((const char*)qname); + // Format Hostname like www.google.com to 3www6google3com + { + size_t last = qnameSize; + for(size_t i = qnameSize-1 ; i > 0 ; i--) + if(qname[i]=='.') + { + qname[i]=last-i-1; + last = i; + } + } + curSendSize += qnameSize +1; //With \0 terminator + + //Point to the query constant portion + struct QUESTION* qinfo =(struct QUESTION*)&buf[curSendSize]; + qinfo->qtype = htons(isIPV4 ? DNST_A : DNST_AAAA); //Type: A / AAAA(Host Address) + qinfo->qclass = htons(DNSC_IN); //Class: IN + curSendSize += sizeof(struct QUESTION); + +#ifdef DEBUG_SPEC_DNS + RS_DBG("Sending Packet:\n", hexDump(buf, curSendSize)); +#endif + int s = socket(serverAddr.ss_family , SOCK_DGRAM , IPPROTO_UDP); //UDP packet for DNS queries + if(s<0) + { + RS_ERR("Could not open socket."); + return false; + } + + if (timeout_s > -1) + rs_setSockTimeout(s, true, timeout_s); + + ssize_t send_size = sendto( s, (char*)buf, curSendSize, 0 + , (struct sockaddr*)&serverAddr + , isIPV4 ? sizeof(sockaddr_in) + : sizeof(sockaddr_in6) + ); + if( send_size < 0) + { + RS_ERR("Send Failed with size = ", send_size); + close(s); + return false; + } + +#ifdef DEBUG_SPEC_DNS + RS_DBG("Waiting answer..."); +#endif + //****************************************************************************************// + //--- Receive the answer ---// + //****************************************************************************************// + socklen_t sa_size = static_cast(isIPV4 ? sizeof(sockaddr_in) + : sizeof(sockaddr_in6) + ); + ssize_t rec_size=recvfrom( s,(char*)buf , 65536 , 0 + , (struct sockaddr*)&serverAddr + , &sa_size + ); + close(s); // No more need of this socket, close it. + if(rec_size <= 0) + { + RS_ERR("Receive Failed"); + return false; + } +#ifdef DEBUG_SPEC_DNS + RS_DBG("Received:\n", hexDump(buf, rec_size)); +#endif + + + if (rec_size< static_cast(sizeof(struct DNS_HEADER)) ) + { + RS_ERR("Request received too small to get DNSHeader."); + return false; + } +#ifdef DEBUG_SPEC_DNS + //Point to the header portion + dns = (struct DNS_HEADER*) buf; + RS_DBG("The response contains :\n" + ,ntohs(dns->q_count) , " Questions.\n" + ,ntohs(dns->ans_count) , " Answers.\n" + ,ntohs(dns->auth_count) , " Authoritative Servers.\n" + ,ntohs(dns->add_count) , " Additional records."); +#endif + size_t curRecSize = sizeof(struct DNS_HEADER); + + + if (rec_size< static_cast(curRecSize + 1 + sizeof(struct QUESTION)) ) + { + RS_ERR("Request received too small to get Question return."); + return false; + } + //Point to the query portion + unsigned char* qnameRecv =static_cast(&buf[curRecSize]); + if (memcmp(qname,qnameRecv,qnameSize + 1 + sizeof(struct QUESTION)) ) + { + RS_ERR("Request received different from that sent."); + return false; + } + curRecSize += qnameSize + 1 + sizeof(struct QUESTION); + + if (rec_size< static_cast(curRecSize + 2) ) + { + RS_ERR("Request received too small to get Answer return."); + return false; + } + //Point to the Answer portion + unsigned char* reader = &buf[curRecSize]; + + size_t rLabelSize=0; + if((reader[0]&0xC0) == 0) + { + //Normal label lower 6 bits is the length of the label + rLabelSize=(reader[0]&~(0xC0)*256) + reader[1]; + } + else if ((reader[0]&0xC0) == 0xC0) + { + //Compressed label the lower 6 bits and the 8 bits from next octet form a pointer to the compression target. + //Don't need to read it, maybe the same as in Query + rLabelSize=0; + } + else + { + RS_ERR("Answer received with unmanaged label format."); + return false; + } + curRecSize += 2 + rLabelSize; + + if (rec_size< static_cast(curRecSize + sizeof(struct RR_DATA)) ) + { + RS_ERR("Request received too small to get Data return."); + return false; + } + //Point to the query portion + struct RR_DATA* rec_data = (struct RR_DATA *)&buf[curRecSize]; + if (rec_data->rtype!=qinfo->qtype) + { + RS_ERR("Answer's type received different from query sent."); + return false; + } + if (rec_data->rclass!=qinfo->qclass) + { + RS_ERR("Answer's class received different from query sent."); + return false; + } + curRecSize += sizeof(struct RR_DATA); + + if (rec_size< static_cast(curRecSize + ntohs(rec_data->data_len)) ) + { + RS_ERR("Request received too small to get Full Data return."); + return false; + } + + //Retrieve Address + if(ntohs(rec_data->data_len)==4) + { + if (isIPV4) + { + in_addr ipv4Add; + ipv4Add.s_addr=*(in_addr_t*)&buf[curRecSize]; +#ifdef DEBUG_SPEC_DNS + RS_DBG("Retrieve address: ", rs_inet_ntoa(ipv4Add)); +#endif + returned_addr = rs_inet_ntoa(ipv4Add); + return true; + } + } + else if(ntohs(rec_data->data_len)==16) + { + if (!isIPV4) + { + in6_addr ipv6Add; + ipv6Add =*(in6_addr*)&buf[curRecSize]; + + struct sockaddr_storage ss; + sockaddr_storage_clear(ss); + sockaddr_in6 addr_ipv6; + addr_ipv6.sin6_addr = ipv6Add; + sockaddr_storage_setipv6(ss,&addr_ipv6); + +#ifdef DEBUG_SPEC_DNS + RS_DBG("Retrieve address: ", sockaddr_storage_iptostring(ss).c_str()); +#endif + returned_addr = sockaddr_storage_iptostring(ss); + return true; + } + } + + RS_ERR("Retrieve unmanaged data size=", ntohs(rec_data->data_len)); + return false; +} diff --git a/libretroshare/src/util/rserrno.cc b/libretroshare/src/util/rserrno.cc deleted file mode 100644 index b62394d69..000000000 --- a/libretroshare/src/util/rserrno.cc +++ /dev/null @@ -1,54 +0,0 @@ -/******************************************************************************* - * libretroshare/src/util: rserrno.cc * - * * - * libretroshare: retroshare core library * - * * - * Copyright (C) 2019 Gioacchino Mazzurco * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * 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 Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -#include - -#define RS_INTERNAL_ERRNO_CASE(e) case e: return #e - -const char* rsErrnoName(int err) -{ - switch (err) - { - RS_INTERNAL_ERRNO_CASE(EINVAL); - RS_INTERNAL_ERRNO_CASE(EBUSY); - RS_INTERNAL_ERRNO_CASE(EAGAIN); - RS_INTERNAL_ERRNO_CASE(EDEADLK); - RS_INTERNAL_ERRNO_CASE(EPERM); - RS_INTERNAL_ERRNO_CASE(EBADF); - RS_INTERNAL_ERRNO_CASE(EFAULT); - RS_INTERNAL_ERRNO_CASE(ENOTSOCK); - RS_INTERNAL_ERRNO_CASE(EISCONN); - RS_INTERNAL_ERRNO_CASE(ECONNREFUSED); - RS_INTERNAL_ERRNO_CASE(ETIMEDOUT); - RS_INTERNAL_ERRNO_CASE(ENETUNREACH); - RS_INTERNAL_ERRNO_CASE(EADDRINUSE); - RS_INTERNAL_ERRNO_CASE(EINPROGRESS); - RS_INTERNAL_ERRNO_CASE(EALREADY); - RS_INTERNAL_ERRNO_CASE(ENOTCONN); - RS_INTERNAL_ERRNO_CASE(EPIPE); - RS_INTERNAL_ERRNO_CASE(ECONNRESET); - RS_INTERNAL_ERRNO_CASE(EHOSTUNREACH); - RS_INTERNAL_ERRNO_CASE(EADDRNOTAVAIL); - } - - return "rsErrnoName UNKNOWN ERROR CODE"; -} diff --git a/libretroshare/src/util/rsmemory.cc b/libretroshare/src/util/rsmemory.cc deleted file mode 100644 index 2b162c77d..000000000 --- a/libretroshare/src/util/rsmemory.cc +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************* - * libretroshare/src/util: rsmemory.cc * - * * - * libretroshare: retroshare core library * - * * - * Copyright 2012-2012 by Cyril Soler * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * 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 Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ -#include "util/rsmemory.h" - -void *rs_malloc(size_t size) -{ - static const size_t SAFE_MEMALLOC_THRESHOLD = 1024*1024*1024 ; // 1Gb should be enough for everything! - - if(size == 0) - { - std::cerr << "(EE) Memory allocation error. A chunk of size 0 was requested. Callstack:" << std::endl; - print_stacktrace() ; - return NULL ; - } - - if(size > SAFE_MEMALLOC_THRESHOLD) - { - std::cerr << "(EE) Memory allocation error. A chunk of size larger than " << SAFE_MEMALLOC_THRESHOLD << " was requested. Callstack:" << std::endl; - print_stacktrace() ; - return NULL ; - } - - void *mem = malloc(size) ; - - if(mem == NULL) - { - std::cerr << "(EE) Memory allocation error for a chunk of " << size << " bytes. Callstack:" << std::endl; - print_stacktrace() ; - return NULL ; - } - - return mem ; -} - diff --git a/libretroshare/src/util/rsmemory.h b/libretroshare/src/util/rsmemory.h index eb2889a6f..8afc48cf7 100644 --- a/libretroshare/src/util/rsmemory.h +++ b/libretroshare/src/util/rsmemory.h @@ -3,8 +3,9 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2012 Cyril Soler * - * Copyright 2019-2020 Gioacchino Mazzurco * + * Copyright (C) 2012 Cyril Soler * + * Copyright (C) 2019-2021 Gioacchino Mazzurco * + * Copyright (C) 2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -25,8 +26,10 @@ #include #include #include +#include #include "util/stacktrace.h" +#include "util/rsdebug.h" /** * @brief Shorthand macro to declare optional functions output parameters @@ -108,7 +111,66 @@ template using rs_view_ptr = T*; * @see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1408r0.pdf */ template using rs_owner_ptr = T*; -void *rs_malloc(size_t size) ; + +/// 1Gb should be enough for everything! +static constexpr size_t SAFE_MEMALLOC_THRESHOLD = 1024*1024*1024; + +/** Comfortable templated safer malloc, just use it specifing the type of the + * pointer to be returned without need of ugly casting the returned pointer + * `uint8_t* ptr = rs_malloc(40);` + * @param[in] size number of bytes to allocate + * @param[out] ec optional storage for error details. Value is meaningful only + * whem nullptr is returned. + * @return nullptr on error, pointer to the allocated chuck of memory on success + */ +template rs_owner_ptr rs_malloc( + size_t size, + rs_view_ptr ec = nullptr ) +{ + if(size == 0) + { + if(!ec) + { + RS_ERR("A chunk of size 0 was requested"); + print_stacktrace(); + exit(static_cast(std::errc::invalid_argument)); + } + + *ec = std::errc::invalid_argument; + return nullptr; + } + + if(size > SAFE_MEMALLOC_THRESHOLD) + { + if(!ec) + { + RS_ERR( "A chunk of size larger than ", SAFE_MEMALLOC_THRESHOLD, + " was requested" ); + exit(static_cast(std::errc::argument_out_of_domain)); + } + + *ec = std::errc::argument_out_of_domain; + return nullptr; + } + + void* mem = malloc(size); + if(!mem) + { + if(!ec) + { + RS_ERR( "Allocation failed for a chunk of ", size, + " bytes with: ", errno); + print_stacktrace(); + exit(errno); + } + + *ec = rs_errno_to_condition(errno); + return nullptr; + } + + return static_cast>(mem); +} + /** @deprecated use std::unique_ptr instead // This is a scope guard to release the memory block when going of of the current scope. @@ -128,7 +190,7 @@ void *rs_malloc(size_t size) ; // // } // mem gets freed automatically */ -class RsTemporaryMemory +class RS_DEPRECATED_FOR("std::unique_ptr") RsTemporaryMemory { public: explicit RsTemporaryMemory(size_t s) diff --git a/libretroshare/src/util/rsnet.cc b/libretroshare/src/util/rsnet.cc index 1e5f79181..a0d6f7447 100644 --- a/libretroshare/src/util/rsnet.cc +++ b/libretroshare/src/util/rsnet.cc @@ -174,3 +174,17 @@ std::string rs_inet_ntoa(struct in_addr in) rs_sprintf(str, "%u.%u.%u.%u", (int) bytes[0], (int) bytes[1], (int) bytes[2], (int) bytes[3]); return str; } + +int rs_setSockTimeout( int sockfd, bool forReceive /*= true*/ + , int timeout_Sec /*= 0*/, int timeout_uSec /*= 0*/) +{ +#ifdef WINDOWS_SYS + DWORD timeout = timeout_Sec * 1000 + timeout_uSec; +#else + struct timeval timeout; + timeout.tv_sec = timeout_Sec; + timeout.tv_usec = timeout_uSec; +#endif + return setsockopt( sockfd, SOL_SOCKET, forReceive ? SO_RCVTIMEO : SO_SNDTIMEO + , (const char*)&timeout, sizeof timeout); +} diff --git a/libretroshare/src/util/rsnet.h b/libretroshare/src/util/rsnet.h index cad2c116a..33dff1c9e 100644 --- a/libretroshare/src/util/rsnet.h +++ b/libretroshare/src/util/rsnet.h @@ -84,6 +84,18 @@ bool isExternalNet(const struct in_addr *addr); // uses a re-entrant version of gethostbyname bool rsGetHostByName(const std::string& hostname, in_addr& returned_addr) ; +/** + * @brief Get hostName address using specific DNS server. + * Using it allow to direct ask our Address to IP, so no need to have a DNS (IPv4 or IPv6). + * If we ask to a IPv6 DNS Server, it respond for our IPv6 address. + * @param servername: Address or name of DNS Server. + * @param hostname: HosteName to get IP ("myip.opendns.com" to get own). + * @param returned_addr: returned IP of hostname. + * @param timeout_s: Timeout in sec to wait server response. + * @return True in success. + */ +bool rsGetHostByNameSpecDNS(const std::string& servername, const std::string& hostname, std::string& returned_addr, int timeout_s = -1); + std::ostream& operator<<(std::ostream& o, const sockaddr_in&); std::ostream& operator<<(std::ostream& o, const sockaddr_storage&); @@ -159,4 +171,14 @@ bool sockaddr_storage_inet_ntop(const sockaddr_storage &addr, std::string &dst); int rs_setsockopt( int sockfd, int level, int optname, const uint8_t *optval, uint32_t optlen ); +/** + * @brief Set socket Timeout. + * @param sockfd: The socket to manage. + * @param forReceive: True for Receive, False for Send. + * @param timeout_Sec: Timeout second part. + * @param timeout_uSec: Timeout micro second part. + * @return 0 on success, -1 for errors. + */ +int rs_setSockTimeout( int sockfd, bool forReceive = true, int timeout_Sec = 0, int timeout_uSec = 0); + #endif /* RS_UNIVERSAL_NETWORK_HEADER */ diff --git a/libretroshare/src/util/rsnet_ss.cc b/libretroshare/src/util/rsnet_ss.cc index c084f516e..795ad6512 100644 --- a/libretroshare/src/util/rsnet_ss.cc +++ b/libretroshare/src/util/rsnet_ss.cc @@ -233,8 +233,7 @@ bool sockaddr_storage_setport(struct sockaddr_storage &addr, uint16_t port) bool sockaddr_storage_setipv4(struct sockaddr_storage &addr, const sockaddr_in *addr_ipv4) { #ifdef SS_DEBUG - std::cerr << "sockaddr_storage_setipv4()"; - std::cerr << std::endl; + RS_ERR(); #endif sockaddr_storage_clear(addr); @@ -249,7 +248,9 @@ bool sockaddr_storage_setipv4(struct sockaddr_storage &addr, const sockaddr_in * bool sockaddr_storage_setipv6(struct sockaddr_storage &addr, const sockaddr_in6 *addr_ipv6) { - std::cerr << "sockaddr_storage_setipv6()" << std::endl; +#ifdef SS_DEBUG + RS_ERR(); +#endif sockaddr_storage_clear(addr); struct sockaddr_in6 *ipv6_ptr = to_ipv6_ptr(addr); @@ -262,6 +263,7 @@ bool sockaddr_storage_setipv6(struct sockaddr_storage &addr, const sockaddr_in6 } #ifdef WINDOWS_SYS +#ifndef InetPtonA int inet_pton(int af, const char *src, void *dst) { sockaddr_storage ss; @@ -288,6 +290,7 @@ int inet_pton(int af, const char *src, void *dst) return 0; } #endif +#endif bool sockaddr_storage_inet_pton( sockaddr_storage &addr, const std::string& ipStr ) diff --git a/libretroshare/src/util/rsthreads.cc b/libretroshare/src/util/rsthreads.cc index 035ad214a..519ab129f 100644 --- a/libretroshare/src/util/rsthreads.cc +++ b/libretroshare/src/util/rsthreads.cc @@ -4,8 +4,8 @@ * libretroshare: retroshare core library * * * * Copyright (C) 2004-2007 Robert Fernie * - * Copyright (C) 2016-2020 Gioacchino Mazzurco * - * Copyright (C) 2019-2020 Asociación Civil Altermundi * + * Copyright (C) 2016-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -25,7 +25,6 @@ #include "rsthreads.h" #include "util/rsdebug.h" -#include "util/rserrno.h" #include #include @@ -92,11 +91,12 @@ void RsThread::resetTid() #ifdef WINDOWS_SYS memset (&mTid, 0, sizeof(mTid)); #else - mTid = 0; + mTid = pthread_t(); //Thread identifiers should be considered opaque and can be null. #endif } -RsThread::RsThread() : mHasStopped(true), mShouldStop(false), mLastTid() +RsThread::RsThread() : mInitMtx("RsThread"), mHasStopped(true), + mShouldStop(false), mLastTid() #ifdef RS_THREAD_FORCE_STOP , mStopTimeout(0) #endif @@ -115,19 +115,24 @@ void RsThread::askForStop() void RsThread::wrapRun() { + {RS_STACK_MUTEX(mInitMtx);} // Waiting Init done. run(); resetTid(); mHasStopped = true; } void RsThread::fullstop() +{ + askForStop(); + waitWhileStopping(); +} + +void RsThread::waitWhileStopping() { #ifdef RS_THREAD_FORCE_STOP const rstime_t stopRequTS = time(nullptr); #endif - askForStop(); - const pthread_t callerTid = pthread_self(); if(pthread_equal(mTid, callerTid)) { @@ -169,7 +174,8 @@ void RsThread::fullstop() { RsErr() << __PRETTY_FUNCTION__ << " pthread_cancel(" << std::hex << mTid << std::dec <<") returned " - << terr << " " << rsErrnoName(terr) << std::endl; + << terr << " " << rs_errno_to_condition(terr) + << std::endl; print_stacktrace(); } @@ -184,23 +190,15 @@ bool RsThread::start(const std::string& threadName) // Atomically check if the thread was already started and set it as running if(mHasStopped.exchange(false)) { + RS_STACK_MUTEX(mInitMtx); // Block thread starting to run + mShouldStop = false; int pError = pthread_create( &mTid, nullptr, &rsthread_init, static_cast(this) ); if(pError) { - RsErr() << __PRETTY_FUNCTION__ << " pthread_create could not create" - << " new thread: " << threadName << " pError: " << pError - << std::endl; - mHasStopped = true; - print_stacktrace(); - return false; - } - if(!mTid) - { - RsErr() << __PRETTY_FUNCTION__ << " pthread_create could not create" - << " new thread: " << threadName << " mTid: " << mTid - << std::endl; + RS_ERR( "pthread_create could not create new thread: ", threadName, + rs_errno_to_condition(pError) ); mHasStopped = true; print_stacktrace(); return false; @@ -281,7 +279,7 @@ void RsMutex::lock() if( err != 0) { RsErr() << __PRETTY_FUNCTION__ << "pthread_mutex_lock returned: " - << rsErrnoName(err) + << rs_errno_to_condition(err) #ifdef RS_MUTEX_DEBUG << " name: " << name() #endif @@ -325,7 +323,11 @@ RsThread::~RsThread() << "likely to crash because of this." << std::endl; print_stacktrace(); - fullstop(); + /* Last resort attempt to stop the thread in a less pathological state. + * Don't call fullstop() as it rely on virtual methods that at this + * point are not anymore the one from inerithing classes causing + * compilers to output a warning */ + waitWhileStopping(); } } diff --git a/libretroshare/src/util/rsthreads.h b/libretroshare/src/util/rsthreads.h index 82221ebbb..edec70472 100644 --- a/libretroshare/src/util/rsthreads.h +++ b/libretroshare/src/util/rsthreads.h @@ -4,8 +4,8 @@ * libretroshare: retroshare core library * * * * Copyright (C) 2004-2006 Robert Fernie * - * Copyright (C) 2016-2020 Gioacchino Mazzurco * - * Copyright (C) 2019-2020 Asociación Civil Altermundi * + * Copyright (C) 2016-2021 Gioacchino Mazzurco * + * Copyright (C) 2019-2021 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -105,7 +105,7 @@ class RsStackMutex { public: - RsStackMutex(RsMutex &mtx) : mMtx(mtx) + explicit RsStackMutex(RsMutex& mtx): mMtx(mtx) { mMtx.lock(); #ifdef RS_MUTEX_DEBUG @@ -261,6 +261,13 @@ private: /** Call @see run() setting the appropriate flags around it*/ void wrapRun(); + /** Wait the thread while it is stopping */ + void waitWhileStopping(); + + /** To be sure Init (pthread_setname_np) is done before continue thread. + * Else can finish before and crash. */ + RsMutex mInitMtx; + /// True if thread is stopped, false otherwise std::atomic mHasStopped; diff --git a/libretroshare/src/util/rstime.h b/libretroshare/src/util/rstime.h index 6cc01e486..c17f2a5c7 100644 --- a/libretroshare/src/util/rstime.h +++ b/libretroshare/src/util/rstime.h @@ -3,7 +3,8 @@ * * * libretroshare: retroshare core library * * * - * Copyright 2013-2013 by Cyril Soler * + * Copyright 2013 Cyril Soler * + * Copyright 2018 Gioacchino Mazzurco * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * diff --git a/plugins/Common/retroshare_plugin.pri b/plugins/Common/retroshare_plugin.pri index 5159aa9b1..db2cd25eb 100644 --- a/plugins/Common/retroshare_plugin.pri +++ b/plugins/Common/retroshare_plugin.pri @@ -103,7 +103,8 @@ win32 { for(bin, BIN_DIR):LIBS += -L"$$bin" LIBS += -lpthread - QMAKE_LFLAGS += -Wl,--end-group + # Do not add for MinGW + !isEmpty(QMAKE_SH): QMAKE_LFLAGS += -Wl,--end-group } macx { diff --git a/plugins/FeedReader/gui/AddFeedDialog.ui b/plugins/FeedReader/gui/AddFeedDialog.ui index ff657b6ff..a10cec8a4 100644 --- a/plugins/FeedReader/gui/AddFeedDialog.ui +++ b/plugins/FeedReader/gui/AddFeedDialog.ui @@ -6,8 +6,8 @@ 0 0 - 715 - 605 + 1068 + 880 @@ -37,14 +37,14 @@ - + QFrame::NoFrame QFrame::Raised - + @@ -73,7 +73,7 @@ - + @@ -306,6 +306,14 @@ + + + 11 + 75 + true + true + + Name: @@ -405,6 +413,11 @@
gui/common/HeaderFrame.h
1 + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
urlLineEdit diff --git a/plugins/FeedReader/gui/FeedReaderDialog.ui b/plugins/FeedReader/gui/FeedReaderDialog.ui index 7c77717bb..5eed95bc7 100644 --- a/plugins/FeedReader/gui/FeedReaderDialog.ui +++ b/plugins/FeedReader/gui/FeedReaderDialog.ui @@ -86,7 +86,14 @@
- + + + + 12 + 75 + true + + Feeds @@ -178,11 +185,6 @@ - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
RSTreeWidget QTreeWidget diff --git a/plugins/FeedReader/gui/FeedReaderFeedItem.ui b/plugins/FeedReader/gui/FeedReaderFeedItem.ui index 37c2df915..47d56f441 100644 --- a/plugins/FeedReader/gui/FeedReaderFeedItem.ui +++ b/plugins/FeedReader/gui/FeedReaderFeedItem.ui @@ -10,7 +10,7 @@ 123
- + 1 @@ -30,7 +30,7 @@ 1 - + 0 @@ -46,9 +46,9 @@ QFrame::Sunken - + - + @@ -66,9 +66,9 @@ - + - + @@ -92,7 +92,7 @@ - + 0 @@ -101,7 +101,9 @@ + 11 75 + true true @@ -127,7 +129,7 @@ - + 8 @@ -195,7 +197,7 @@ p, li { white-space: pre-wrap; } Expand - + :/icons/png/down-arrow.png:/icons/png/down-arrow.png @@ -221,7 +223,7 @@ p, li { white-space: pre-wrap; } Set as read and remove item - + :/icons/png/correct.png:/icons/png/correct.png @@ -247,7 +249,7 @@ p, li { white-space: pre-wrap; } Remove Item - + :/icons/png/exit2.png:/icons/png/exit2.png @@ -260,7 +262,7 @@ p, li { white-space: pre-wrap; } - + 0 @@ -287,7 +289,7 @@ p, li { white-space: pre-wrap; } QFrame::Sunken - + 5 @@ -336,16 +338,8 @@ p, li { white-space: pre-wrap; } - - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
-
- diff --git a/plugins/FeedReader/gui/PreviewFeedDialog.ui b/plugins/FeedReader/gui/PreviewFeedDialog.ui index 14868c082..41cebc153 100644 --- a/plugins/FeedReader/gui/PreviewFeedDialog.ui +++ b/plugins/FeedReader/gui/PreviewFeedDialog.ui @@ -7,7 +7,7 @@ 0 0 800 - 521 + 564 @@ -16,7 +16,7 @@ true - + 0 @@ -28,7 +28,7 @@ 0 - + 0 @@ -57,6 +57,14 @@ 0 + + + 11 + 75 + true + true + + Name: @@ -284,7 +292,7 @@ - + @@ -324,6 +332,14 @@ 0 + + + 11 + 75 + true + true + + Title: @@ -365,7 +381,7 @@ false - + 0 @@ -387,7 +403,7 @@ - + 0 @@ -451,7 +467,7 @@ QFrame::Raised - + 0 @@ -472,7 +488,7 @@ QFrame::Raised - + 0 @@ -499,7 +515,7 @@ QFrame::Raised - + 0 @@ -513,7 +529,7 @@ 0 - + @@ -572,11 +588,13 @@ - titleFrame - splitter - buttonBox + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
RSPlainTextEdit QPlainTextEdit diff --git a/plugins/VOIP/qss/VOIP_qss.default b/plugins/FeedReader/qss/FeedReader_default.qss similarity index 52% rename from plugins/VOIP/qss/VOIP_qss.default rename to plugins/FeedReader/qss/FeedReader_default.qss index abe80ad93..9b964468c 100644 --- a/plugins/VOIP/qss/VOIP_qss.default +++ b/plugins/FeedReader/qss/FeedReader_default.qss @@ -1,9 +1,3 @@ /* Default stylesheet This file is used as default for all stylesheets and can be overloaded */ -/* Font */ - -VOIPToasterItem QLabel#textLabel -{ - qproperty-fontSizeFactor: 115; -} diff --git a/plugins/FeedReader/qss/FeedReader_qss.qrc b/plugins/FeedReader/qss/FeedReader_qss.qrc index 437503d74..adefd6b1b 100644 --- a/plugins/FeedReader/qss/FeedReader_qss.qrc +++ b/plugins/FeedReader/qss/FeedReader_qss.qrc @@ -1,6 +1,6 @@ - FeedReader_qss.default + FeedReader_default.qss FeedReader_Standard.qss diff --git a/plugins/VOIP/gui/VOIPConfigPanel.cpp b/plugins/VOIP/gui/VOIPConfigPanel.cpp index b30df639c..a46169dcb 100644 --- a/plugins/VOIP/gui/VOIPConfigPanel.cpp +++ b/plugins/VOIP/gui/VOIPConfigPanel.cpp @@ -375,7 +375,7 @@ void VOIPConfigPanel::on_qpbAudioWizard_clicked() { void VOIPConfigPanel::on_changedCurrentInputDevice(int i) { - QString s = dynamic_cast(sender())->itemData(i).toString(); + QString s = dynamic_cast(sender())->itemData(i).toString(); videoInput->stop(); diff --git a/plugins/VOIP/gui/VOIPConfigPanel.ui b/plugins/VOIP/gui/VOIPConfigPanel.ui index 178436808..9fbb9008c 100644 --- a/plugins/VOIP/gui/VOIPConfigPanel.ui +++ b/plugins/VOIP/gui/VOIPConfigPanel.ui @@ -63,7 +63,7 @@
- + @@ -257,7 +257,7 @@ - + When to transmit your speech @@ -510,6 +510,11 @@
gui/AudioStats.h
1 + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
qsDoublePush diff --git a/plugins/VOIP/gui/VOIPToasterItem.ui b/plugins/VOIP/gui/VOIPToasterItem.ui index ef1a3e402..676e787e2 100644 --- a/plugins/VOIP/gui/VOIPToasterItem.ui +++ b/plugins/VOIP/gui/VOIPToasterItem.ui @@ -22,7 +22,7 @@ 102 - + 0 @@ -39,14 +39,14 @@ 0 - + QFrame::WinPanel QFrame::Raised - + 2 @@ -63,7 +63,7 @@ 2 - + 6 @@ -97,13 +97,20 @@ + + + 12 + 75 + true + + RetroShare - + Qt::Horizontal @@ -141,7 +148,7 @@ - + 6 @@ -240,7 +247,7 @@ background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.67,
- + 0 @@ -255,6 +262,7 @@ background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.67, + 12 75 true @@ -272,11 +280,6 @@ background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.67,
- - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
AvatarWidget QLabel diff --git a/plugins/VOIP/qss/VOIP_Standard.qss b/plugins/VOIP/qss/VOIP_Standard.qss index ee40c6344..851f9af4f 100644 --- a/plugins/VOIP/qss/VOIP_Standard.qss +++ b/plugins/VOIP/qss/VOIP_Standard.qss @@ -1 +1 @@ -/* Standard stylesheet for FeedReader */ +/* Standard stylesheet for VOIP */ diff --git a/plugins/FeedReader/qss/FeedReader_qss.default b/plugins/VOIP/qss/VOIP_default.qss similarity index 51% rename from plugins/FeedReader/qss/FeedReader_qss.default rename to plugins/VOIP/qss/VOIP_default.qss index 27ca35f0c..9b964468c 100644 --- a/plugins/FeedReader/qss/FeedReader_qss.default +++ b/plugins/VOIP/qss/VOIP_default.qss @@ -1,9 +1,3 @@ /* Default stylesheet This file is used as default for all stylesheets and can be overloaded */ -/* Font */ - -FeedReaderFeedItem QLabel#titleLabel -{ - qproperty-fontSizeFactor: 135; -} diff --git a/plugins/VOIP/qss/VOIP_qss.qrc b/plugins/VOIP/qss/VOIP_qss.qrc index f82c259d4..81df6f74d 100644 --- a/plugins/VOIP/qss/VOIP_qss.qrc +++ b/plugins/VOIP/qss/VOIP_qss.qrc @@ -1,6 +1,6 @@ - VOIP_qss.default + VOIP_default.qss VOIP_Standard.qss diff --git a/plugins/plugins.pro b/plugins/plugins.pro index 209b82898..7ecbc32c7 100644 --- a/plugins/plugins.pro +++ b/plugins/plugins.pro @@ -19,5 +19,5 @@ TEMPLATE = subdirs SUBDIRS += \ - VOIP \ + VOIP \ FeedReader diff --git a/retroshare-gui/src/changelog.txt b/retroshare-gui/src/changelog.txt index 3da31f03c..24c784d1a 100644 --- a/retroshare-gui/src/changelog.txt +++ b/retroshare-gui/src/changelog.txt @@ -439,7 +439,7 @@ Changes for 0.5.4e - Enabled embedded images in private chat and messages (only for QT version 4.7.0 and higher) - added tooltips to GroupFlagsWidget when buttons are unchecked (Patch from Anonym) - when an unknow user attempt to connect, show the name in the security item (Patch from Anonym) - - Load new stylesheets for locale depended things. Loading order: qss.default (internal), qss. (internal e.g. qss.de_DE) + - Load new stylesheets for locale depended things. Loading order: default.qss (internal), .qss (internal e.g. de_DE.qss) stylesheet.qss (internal or external), stylesheet_.lqss (parallel to stylesheet) - Added api for news feeds to the plugin interface. Added news feeds to the FeedReader plugin. - Removed toaster for muted participant of a chat lobby. @@ -586,7 +586,7 @@ Changes for 0.5.4c - GUI * patch from AC to perform html optimization of forum posts using the canonical function optimizeHtml() * fixed bug preventing share manager to modify more than one directory at once - * Moved most of the hardcoded colors of lists and trees to the file qss.default (with help from braindead). + * Moved most of the hardcoded colors of lists and trees to the file default.qss (with help from braindead). Now the stylesheet can redefine these colors. * Added multiselective mute/unmute to chat lobby. Added mute/unmute with double click on icon. * Added flag for hungarian language. @@ -790,10 +790,10 @@ Changes for 0.5.4a * Set the built-in stylesheet "Standard" as default for new profiles. * Removed some unnecessary style sheets. * Added two internal stylesheets: - - qss.default - This file is used as default for all stylesheets (e.g. the frames of + - default.qss - This file is used as default for all stylesheets (e.g. the frames of the AvatarWidget) and can be overloaded from the selected stylesheet - Standard.qss - The standard stylesheet for the current look of RetroShare. More internal stylesheets can be added. - The plan is to move nearly all internal stylesheets to the files Standard.qss/qss.default. + The plan is to move nearly all internal stylesheets to the files Standard.qss/default.qss. After that the "empty" stylesheet should represent the system theme of the os. - Added clear chat history to the context menu of the message text browser @@ -3121,4 +3121,4 @@ We have available for those interested in retroshare: (2) deb installation files for debian/etch and kubuntu/feisty (3) Language pack for those interested in translating. - \ No newline at end of file + diff --git a/retroshare-gui/src/gui/AboutWidget.cpp b/retroshare-gui/src/gui/AboutWidget.cpp index aa239650e..7dccb1693 100644 --- a/retroshare-gui/src/gui/AboutWidget.cpp +++ b/retroshare-gui/src/gui/AboutWidget.cpp @@ -52,8 +52,8 @@ AboutWidget::AboutWidget(QWidget* parent) l->setMargin(0); l->addStretch(1); l->addStretch(1); - frame->setContentsMargins(0, 0, 0, 0); - frame->setLayout(l); + specialFrame->setContentsMargins(0, 0, 0, 0); + specialFrame->setLayout(l); tWidget = NULL; aWidget = NULL; installAWidget(); @@ -67,7 +67,7 @@ AboutWidget::AboutWidget(QWidget* parent) void AboutWidget::installAWidget() { assert(tWidget == NULL); aWidget = new AWidget(); - QVBoxLayout* l = (QVBoxLayout*)frame->layout(); + QVBoxLayout* l = (QVBoxLayout*)specialFrame->layout(); l->insertWidget(0, aWidget); l->setStretchFactor(aWidget, 100); aWidget->setFocus(); @@ -96,10 +96,10 @@ void AboutWidget::installTWidget() { vl->addWidget(levelLabel); vl->addStretch(); - QHBoxLayout* l = (QHBoxLayout*)frame->layout(); + QHBoxLayout* l = (QHBoxLayout*)specialFrame->layout(); l->insertWidget(0, pan); l->insertWidget(0, tWidget); - QRect cRect = frame->contentsRect(); + QRect cRect = specialFrame->contentsRect(); int height = tWidget->heightForWidth(cRect.width()); tWidget->setFixedSize(cRect.width() * cRect.height() / height, cRect.height()); npLabel->setFixedSize(tWidget->squareWidth()*4, tWidget->squareHeight()*5); @@ -117,7 +117,7 @@ void AboutWidget::installTWidget() { void AboutWidget::switchPages() { QLayoutItem* li = NULL; - QLayout* l = frame->layout(); + QLayout* l = specialFrame->layout(); while ((li = l->takeAt(0)) && li->widget()) { li->widget()->deleteLater(); } @@ -158,9 +158,9 @@ void AboutWidget::updateTitle() void AboutWidget::mousePressEvent(QMouseEvent *e) { QPoint globalPos = mapToGlobal(e->pos()); - QPoint framePos = frame->mapFromGlobal(globalPos); + QPoint framePos = specialFrame->mapFromGlobal(globalPos); - if (frame->contentsRect().contains(framePos)) { + if (specialFrame->contentsRect().contains(framePos)) { { if(e->modifiers() & Qt::ControlModifier) switchPages(); diff --git a/retroshare-gui/src/gui/AboutWidget.ui b/retroshare-gui/src/gui/AboutWidget.ui index 99b638388..548d6fd9a 100644 --- a/retroshare-gui/src/gui/AboutWidget.ui +++ b/retroshare-gui/src/gui/AboutWidget.ui @@ -57,7 +57,7 @@
- + QFrame::StyledPanel diff --git a/retroshare-gui/src/gui/ChatLobbyWidget.cpp b/retroshare-gui/src/gui/ChatLobbyWidget.cpp index 475495674..d369c9bcf 100644 --- a/retroshare-gui/src/gui/ChatLobbyWidget.cpp +++ b/retroshare-gui/src/gui/ChatLobbyWidget.cpp @@ -94,14 +94,14 @@ ChatLobbyWidget::ChatLobbyWidget(QWidget *parent, Qt::WindowFlags flags) myInviteIdChooser = NULL; QObject::connect( NotifyQt::getInstance(), SIGNAL(lobbyListChanged()), SLOT(lobbyChanged())); - QObject::connect( NotifyQt::getInstance(), SIGNAL(chatLobbyEvent(qulonglong,int,const RsGxsId&,const QString&)), this, SLOT(displayChatLobbyEvent(qulonglong,int,const RsGxsId&,const QString&))); + QObject::connect( NotifyQt::getInstance(), SIGNAL(chatLobbyEvent(qulonglong,int,RsGxsId,QString)), this, SLOT(displayChatLobbyEvent(qulonglong,int,RsGxsId,QString))); QObject::connect( NotifyQt::getInstance(), SIGNAL(chatLobbyInviteReceived()), this, SLOT(readChatLobbyInvites())); QObject::connect( ui.lobbyTreeWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(lobbyTreeWidgetCustomPopupMenu(QPoint))); QObject::connect( ui.lobbyTreeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(itemDoubleClicked(QTreeWidgetItem*,int))); QObject::connect( ui.lobbyTreeWidget, SIGNAL(itemSelectionChanged()), this, SLOT(updateCurrentLobby())); - QObject::connect( ui.filterLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(filterItems(QString))); + QObject::connect( ui.filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(filterItems(QString))); QObject::connect( ui.filterLineEdit, SIGNAL(filterChanged(int)), this, SLOT(filterColumnChanged(int))); QObject::connect( ui.createLobbyToolButton, SIGNAL(clicked()), this, SLOT(createChatLobby())); @@ -194,25 +194,25 @@ ChatLobbyWidget::ChatLobbyWidget(QWidget *parent, Qt::WindowFlags flags) // load settings processSettings(true); - int S = QFontMetricsF(font()).height(); - QString help_str = tr("\ -

  Chat Rooms

\ -

Chat rooms work pretty much like IRC. \ - They allow you to talk anonymously with tons of people without the need to make friends.

\ -

A chat room can be public (your friends see it) or private (your friends can't see it, unless you \ - invite them with ). \ - Once you have been invited to a private room, you will be able to see it when your friends \ - are using it.

\ -

The list at left shows \ - chat lobbies your friends are participating in. You can either \ -

    \ -
  • Right click to create a new chat room
  • \ -
  • Double click a chat room to enter, chat, and show it to your friends
  • \ -
\ - Note: For the chat rooms to work properly, your computer needs be on time. So check your system clock!\ -

\ + int S = QFontMetricsF(font()).height(); + QString help_str = tr("\ +

  Chat Rooms

\ +

Chat rooms work pretty much like IRC. \ + They allow you to talk anonymously with tons of people without the need to make friends.

\ +

A chat room can be public (your friends see it) or private (your friends can't see it, unless you \ + invite them with ). \ + Once you have been invited to a private room, you will be able to see it when your friends \ + are using it.

\ +

The list at left shows \ + chat lobbies your friends are participating in. You can either \ +

    \ +
  • Right click to create a new chat room
  • \ +
  • Double click a chat room to enter, chat, and show it to your friends
  • \ +
\ + Note: For the chat rooms to work properly, your computer needs be on time. So check your system clock!\ +

\ " - ).arg(QString::number(2*S)).arg(QString::number(S)) ; + ).arg(QString::number(2*S), QString::number(S)) ; registerHelpButton(ui.helpButton,help_str,"ChatLobbyDialog") ; @@ -232,7 +232,7 @@ ChatLobbyWidget::~ChatLobbyWidget() UserNotify *ChatLobbyWidget::createUserNotify(QObject *parent) { myChatLobbyUserNotify = new ChatLobbyUserNotify(parent); - connect(myChatLobbyUserNotify, SIGNAL(countChanged(ChatLobbyId, unsigned int)), this, SLOT(updateNotify(ChatLobbyId, unsigned int))); + connect(myChatLobbyUserNotify, SIGNAL(countChanged(ChatLobbyId, uint)), this, SLOT(updateNotify(ChatLobbyId, uint))); return myChatLobbyUserNotify; } @@ -920,7 +920,7 @@ void ChatLobbyWidget::showBlankPage(ChatLobbyId id, bool subscribed /*= false*/) } } - ui.lobbyInfoLabel->setText(text); + ui.info_Label_Lobby->setText(text); return ; } @@ -932,7 +932,7 @@ void ChatLobbyWidget::showBlankPage(ChatLobbyId id, bool subscribed /*= false*/) ui.lobbysec_lineEdit->clear(); QString text = tr("No chat room selected. \nSelect chat rooms at left to show details.\nDouble click a chat room to enter and chat.") ; - ui.lobbyInfoLabel->setText(text) ; + ui.info_Label_Lobby->setText(text) ; } void ChatLobbyWidget::subscribeItem() @@ -1116,6 +1116,7 @@ void ChatLobbyWidget::updateCurrentLobby() filterItems(ui.filterLineEdit->text()); } } + void ChatLobbyWidget::updateMessageChanged(bool incoming, ChatLobbyId id, QDateTime time, QString senderName, QString msg) { QTreeWidgetItem *current_item = ui.lobbyTreeWidget->currentItem(); @@ -1174,9 +1175,11 @@ void ChatLobbyWidget::readChatLobbyInvites() if(found) continue ; - QMessageBox mb(QObject::tr("Join chat room"), - tr("%1 invites you to chat room named %2").arg(QString::fromUtf8(rsPeers->getPeerName((*it).peer_id).c_str())).arg(RsHtml::plainText(it->lobby_name)), - QMessageBox::Question, QMessageBox::Yes,QMessageBox::No, 0); + QMessageBox mb(QObject::tr("Join chat room") + , tr("%1 invites you to chat room named %2") + .arg(QString::fromUtf8(rsPeers->getPeerName((*it).peer_id).c_str()) + , RsHtml::plainText(it->lobby_name)) + , QMessageBox::Question, QMessageBox::Yes,QMessageBox::No, 0); QLabel *label; diff --git a/retroshare-gui/src/gui/ChatLobbyWidget.ui b/retroshare-gui/src/gui/ChatLobbyWidget.ui index 4a4f863ef..5a679189e 100644 --- a/retroshare-gui/src/gui/ChatLobbyWidget.ui +++ b/retroshare-gui/src/gui/ChatLobbyWidget.ui @@ -70,7 +70,14 @@
- + + + + 12 + 75 + true + + Chat rooms @@ -183,7 +190,7 @@ - + 16 @@ -228,6 +235,13 @@ + + + 12 + 75 + true + + @@ -244,6 +258,7 @@ + 12 75 true @@ -261,6 +276,13 @@ 0 + + + 16 + 75 + true + + TextLabel @@ -270,6 +292,7 @@ + 12 75 true @@ -296,6 +319,7 @@ + 12 75 true @@ -325,6 +349,7 @@ + 12 75 true @@ -351,6 +376,7 @@ + 12 75 true @@ -371,6 +397,7 @@ + 12 75 true @@ -396,7 +423,7 @@
- + TextLabel @@ -432,12 +459,12 @@ LineEditClear QLineEdit -
gui/common/LineEditClear.h
+
gui/common/LineEditClear.h
- StyledLabel - QLabel -
gui/common/StyledLabel.h
+ RSTreeWidget + QTreeWidget +
gui/common/RSTreeWidget.h
diff --git a/retroshare-gui/src/gui/Circles/CirclesDialog.ui b/retroshare-gui/src/gui/Circles/CirclesDialog.ui index da9da0b8b..05b89146b 100644 --- a/retroshare-gui/src/gui/Circles/CirclesDialog.ui +++ b/retroshare-gui/src/gui/Circles/CirclesDialog.ui @@ -49,7 +49,14 @@
- + + + + 12 + 75 + true + + Circles @@ -247,13 +254,6 @@ - - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
-
diff --git a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp index 2b9d3b804..b8ee868ad 100644 --- a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp +++ b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp @@ -98,7 +98,7 @@ CreateCircleDialog::CreateCircleDialog() connect(ui.addButton, SIGNAL(clicked()), this, SLOT(addMember())); connect(ui.removeButton, SIGNAL(clicked()), this, SLOT(removeMember())); - connect(ui.createButton, SIGNAL(clicked()), this, SLOT(createCircle())); + connect(ui.postButton, SIGNAL(clicked()), this, SLOT(createCircle())); connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(close())); connect(ui.treeWidget_membership, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(selectedMember(QTreeWidgetItem*, QTreeWidgetItem*))); @@ -187,14 +187,14 @@ void CreateCircleDialog::editExistingId(const RsGxsGroupId &circleId, const bool ui.idChooser->setVisible(true) ; } - ui.createButton->setText(tr("Update")); + ui.postButton->setText(tr("Update")); ui.addButton->setEnabled(!readonly) ; ui.removeButton->setEnabled(!readonly) ; if(readonly) { - ui.createButton->hide() ; + ui.postButton->hide() ; ui.cancelButton->setText(tr("Close")); ui.peersSelection_GB->hide() ; ui.addButton->hide() ; @@ -216,7 +216,7 @@ void CreateCircleDialog::editNewId(bool isExternal) { setupForExternalCircle(); ui.headerFrame->setHeaderText(tr("Create New Circle")); - ui.createButton->setText(tr("Create")); + ui.postButton->setText(tr("Create")); } else { diff --git a/retroshare-gui/src/gui/Circles/CreateCircleDialog.ui b/retroshare-gui/src/gui/Circles/CreateCircleDialog.ui index 54e1fe80f..62390e56a 100644 --- a/retroshare-gui/src/gui/Circles/CreateCircleDialog.ui +++ b/retroshare-gui/src/gui/Circles/CreateCircleDialog.ui @@ -13,7 +13,7 @@ - + 0 @@ -40,226 +40,225 @@ - + QFrame::StyledPanel QFrame::Raised - + Circle Details - + + + 11 + - - - - - - 75 - true - - - - Qt::LeftToRight - - - Name: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - <html><head/><body><p>The circle name, contact author and invited member list will be visible to all invited members. If the circle is not private, it will also be visible to neighbor nodes of the nodes who host the invited members.</p></body></html> - - - - - - - - 75 - true - - - - Contact author: - - - - - - - - 0 - 0 - - - - <html><head/><body><p>The creator of a circle is purely optional. It is however useful for public circles so that people know with whom to discuss membership aspects.</p></body></html> - - - - - - - [Circle Admin] - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 40 - 20 - - - - - - - - - 75 - true - - - - Distribution: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 2 + + + + 75 + true + + + + Qt::LeftToRight + + + Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + <html><head/><body><p>The circle name, contact author and invited member list will be visible to all invited members. If the circle is not private, it will also be visible to neighbor nodes of the nodes who host the invited members.</p></body></html> + + + + + + + + 75 + true + + + + Contact author: + + + + + + + + 0 + 0 + + + + <html><head/><body><p>The creator of a circle is purely optional. It is however useful for public circles so that people know with whom to discuss membership aspects.</p></body></html> + + + + + + + [Circle Admin] + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + + + + + 75 + true + + + + Distribution: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 2 + + + 2 + + + 2 + + + 2 + + + + + <html><head/><body><p>Publicly distributed circles are visible to your friends, which will get to know the circle data (Creator, members, etc)</p></body></html> - - 2 + + Public - - 2 + + + :/icons/png/network-puplic.png:/icons/png/network-puplic.png - - 2 + + + 24 + 24 + - - - - <html><head/><body><p>Publicly distributed circles are visible to your friends, which will get to know the circle data (Creator, members, etc)</p></body></html> - - - Public - - - - :/icons/png/network-puplic.png:/icons/png/network-puplic.png - - - - 24 - 24 - - - - - - - - <html><head/><body><p>Private (a.k.a. self-restricted) circles are only visible to the invited members of these circles. In practice the circle uses its own list of invited members to limit its own distribution. </p></body></html> - - - Private - - - - :/icons/png/person.png:/icons/png/person.png - - - - 24 - 24 - - - - - - - - <html><head/><body><p>Circles can be restricted to the members of another circle. Only the members of that second circle will be allowed to see the new circle and its content (list of members, etc).</p></body></html> - - - Only &visible to members of: - - - - :/icons/png/circles.png:/icons/png/circles.png - - - - 24 - 24 - - - - - - - - - - - Qt::Horizontal - - - - 147 - 20 - - - - - - - - + + + + + + <html><head/><body><p>Private (a.k.a. self-restricted) circles are only visible to the invited members of these circles. In practice the circle uses its own list of invited members to limit its own distribution. </p></body></html> + + + Private + + + + :/icons/png/person.png:/icons/png/person.png + + + + 24 + 24 + + + + + + + + <html><head/><body><p>Circles can be restricted to the members of another circle. Only the members of that second circle will be allowed to see the new circle and its content (list of members, etc).</p></body></html> + + + Only &visible to members of: + + + + :/icons/png/circles.png:/icons/png/circles.png + + + + 24 + 24 + + + + + + + + + + + Qt::Horizontal + + + + 147 + 20 + + + + + + - + Invited Members - + @@ -287,9 +286,9 @@ - + - + Qt::Vertical @@ -330,7 +329,7 @@ - + Qt::Vertical @@ -378,7 +377,7 @@ QFrame::Raised - + 0 @@ -419,9 +418,9 @@ - + - + Filter @@ -438,7 +437,7 @@ - + Qt::Horizontal @@ -451,7 +450,14 @@ - + + + + 12 + 75 + true + + Create @@ -503,7 +509,6 @@ - diff --git a/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp index 9c3703032..b6da4de7b 100644 --- a/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp @@ -121,10 +121,10 @@ SearchDialog::SearchDialog(QWidget *parent) connect( ui.searchSummaryWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( searchSummaryWidgetCustomPopupMenu( QPoint ) ) ); connect( ui.showBannedFiles_TB, SIGNAL( clicked() ), this, SLOT( openBannedFiles() ) ); - connect( ui.lineEdit, SIGNAL( returnPressed ( void ) ), this, SLOT( searchKeywords( void ) ) ); + connect( ui.lineEdit, SIGNAL( returnPressed () ), this, SLOT( searchKeywords() ) ); connect( ui.lineEdit, SIGNAL( textChanged ( const QString& ) ), this, SLOT( checkText( const QString& ) ) ); - connect( ui.pushButtonSearch, SIGNAL( released ( void ) ), this, SLOT( searchKeywords( void ) ) ); - connect( ui.pushButtonDownload, SIGNAL( released ( void ) ), this, SLOT( download( void ) ) ); + connect( ui.searchButton, SIGNAL( released () ), this, SLOT( searchKeywords() ) ); + connect( ui.pushButtonDownload, SIGNAL( released () ), this, SLOT( download() ) ); connect( ui.cloaseallsearchresultsButton, SIGNAL(clicked()), this, SLOT(searchRemoveAll())); connect( ui.searchResultWidget, SIGNAL( itemDoubleClicked ( QTreeWidgetItem *, int)), this, SLOT(download())); @@ -186,11 +186,6 @@ SearchDialog::SearchDialog(QWidget *parent) _smheader->resizeSection ( SR_AGE_COL, 90*f ); _smheader->resizeSection ( SR_HASH_COL, 240*f ); - // set header text aligment - QTreeWidgetItem * headerItem = ui.searchResultWidget->headerItem(); - headerItem->setTextAlignment(SR_NAME_COL, Qt::AlignRight | Qt::AlignRight); - headerItem->setTextAlignment(SR_SIZE_COL, Qt::AlignRight | Qt::AlignRight); - ui.searchResultWidget->sortItems(SR_NAME_COL, Qt::AscendingOrder); /* Set initial size the splitter */ @@ -276,30 +271,9 @@ void SearchDialog::processSettings(bool bLoad) void SearchDialog::checkText(const QString& txt) { - bool valid; - QColor color; - - if(txt.length() < 3) - { - std::cout << "setting palette 1" << std::endl ; - valid = false; - color = QApplication::palette().color(QPalette::Disabled, QPalette::Base); - } - else - { - std::cout << "setting palette 2" << std::endl ; - valid = true; - color = QApplication::palette().color(QPalette::Active, QPalette::Base); - } - - /* unpolish widget to clear the stylesheet's palette cache */ + ui.searchButton->setDisabled(txt.length() < 3); + ui.searchLineFrame->setProperty("valid", (txt.length() >= 3)); ui.searchLineFrame->style()->unpolish(ui.searchLineFrame); - - QPalette palette = ui.lineEdit->palette(); - palette.setColor(ui.lineEdit->backgroundRole(), color); - ui.lineEdit->setPalette(palette); - - ui.searchLineFrame->setProperty("valid", valid); Rshare::refreshStyleSheet(ui.searchLineFrame, false); } @@ -393,11 +367,10 @@ void SearchDialog::download() /* should also be able to handle multi-selection */ QList itemsForDownload = ui.searchResultWidget->selectedItems() ; int numdls = itemsForDownload.size() ; - QTreeWidgetItem * item ; bool attemptDownloadLocal = false ; for (int i = 0; i < numdls; ++i) { - item = itemsForDownload.at(i) ; + QTreeWidgetItem *item = itemsForDownload.at(i) ; // call the download // * if (item->text(SR_HASH_COL).isEmpty()) { // we have a folder @@ -421,8 +394,8 @@ void SearchDialog::download() std::cout << *it << "-" << std::endl; QColor foreground = textColorDownloading(); - for (int i = 0; i < item->columnCount(); ++i) - item->setData(i, Qt::ForegroundRole, foreground ); + for (int j = 0; j < item->columnCount(); ++j) + item->setData(j, Qt::ForegroundRole, foreground ); } } } @@ -1209,17 +1182,16 @@ void SearchDialog::insertFile(qulonglong searchId, const FileDetail& file, int s // bool found = false ; bool altname = false ; - int sources; - int friendSource = 0; - int anonymousSource = 0; QString modifiedResult; - QList itms = ui.searchResultWidget->findItems(QString::fromStdString(file.hash.toStdString()),Qt::MatchExactly,SR_HASH_COL) ; + QList itms = ui.searchResultWidget->findItems(QString::fromStdString(file.hash.toStdString()),Qt::MatchExactly,SR_HASH_COL) ; - for(QList::const_iterator it(itms.begin());it!=itms.end();++it) - if((*it)->text(SR_SEARCH_ID_COL) == sid_hexa) + for(auto &it : itms) + if(it->text(SR_SEARCH_ID_COL) == sid_hexa) { - QString resultCount = (*it)->text(SR_SOURCES_COL); + int friendSource = 0; + int anonymousSource = 0; + QString resultCount = it->text(SR_SOURCES_COL); QStringList modifiedResultCount = resultCount.split("/", QString::SkipEmptyParts); if(searchType == FRIEND_SEARCH) { @@ -1233,13 +1205,13 @@ void SearchDialog::insertFile(qulonglong searchId, const FileDetail& file, int s } modifiedResult = QString::number(friendSource) + "/" + QString::number(anonymousSource); float fltRes = friendSource + (float)anonymousSource/1000; - (*it)->setText(SR_SOURCES_COL,modifiedResult); - (*it)->setData(SR_SOURCES_COL, ROLE_SORT, fltRes); - QTreeWidgetItem *item = (*it); + it->setText(SR_SOURCES_COL,modifiedResult); + it->setData(SR_SOURCES_COL, ROLE_SORT, fltRes); + QTreeWidgetItem *item = it; found = true ; - if(QString::compare((*it)->text(SR_NAME_COL), QString::fromUtf8(file.name.c_str()), Qt::CaseSensitive)!=0) + if(QString::compare(it->text(SR_NAME_COL), QString::fromUtf8(file.name.c_str()), Qt::CaseSensitive)!=0) altname = true; if (!item->data(SR_DATA_COL, SR_ROLE_LOCAL).toBool()) { @@ -1280,19 +1252,18 @@ void SearchDialog::insertFile(qulonglong searchId, const FileDetail& file, int s } } - if(altname) - { - QTreeWidgetItem *item = new RSTreeWidgetItem(compareResultRole); - item->setText(SR_NAME_COL, QString::fromUtf8(file.name.c_str())); - item->setText(SR_HASH_COL, QString::fromStdString(file.hash.toStdString())); - setIconAndType(item, QString::fromUtf8(file.name.c_str())); - item->setText(SR_SIZE_COL, QString::number(file.size)); - setIconAndType(item, QString::fromUtf8(file.name.c_str())); - (*it)->addChild(item); + if(altname) + { + QTreeWidgetItem *altItem = new RSTreeWidgetItem(compareResultRole); + altItem->setText(SR_NAME_COL, QString::fromUtf8(file.name.c_str())); + altItem->setText(SR_HASH_COL, QString::fromStdString(file.hash.toStdString())); + setIconAndType(altItem, QString::fromUtf8(file.name.c_str())); + altItem->setText(SR_SIZE_COL, QString::number(file.size)); + setIconAndType(altItem, QString::fromUtf8(file.name.c_str())); + it->addChild(altItem); + } } - } - if(!found) { ++nb_results[searchId] ; @@ -1301,7 +1272,7 @@ void SearchDialog::insertFile(qulonglong searchId, const FileDetail& file, int s QTreeWidgetItem *item = new RSTreeWidgetItem(compareResultRole); item->setText(SR_NAME_COL, QString::fromUtf8(file.name.c_str())); - item->setText(SR_HASH_COL, QString::fromStdString(file.hash.toStdString())); + item->setText(SR_HASH_COL, QString::fromStdString(file.hash.toStdString())); setIconAndType(item, QString::fromUtf8(file.name.c_str())); @@ -1314,6 +1285,8 @@ void SearchDialog::insertFile(qulonglong searchId, const FileDetail& file, int s item->setText(SR_AGE_COL, QString::number(file.age)); item->setData(SR_AGE_COL, ROLE_SORT, file.age); item->setTextAlignment( SR_SIZE_COL, Qt::AlignRight ); + int friendSource = 0; + int anonymousSource = 0; if(searchType == FRIEND_SEARCH) { friendSource = 1; @@ -1344,7 +1317,7 @@ void SearchDialog::insertFile(qulonglong searchId, const FileDetail& file, int s } else { item->setData(SR_DATA_COL, SR_ROLE_LOCAL, false); - sources = item->text(SR_SOURCES_COL).toInt(); + int sources = item->text(SR_SOURCES_COL).toInt(); if (sources == 1) { foreground = ui.searchResultWidget->palette().color(QPalette::Text); @@ -1369,11 +1342,8 @@ void SearchDialog::insertFile(qulonglong searchId, const FileDetail& file, int s /* hide/show this search result */ hideOrShowSearchResult(item); - } - /* update the summary as well */ - if(!found) // only increment result when it's a new item. - { + // only increment result when it's a new item. int s = ui.searchSummaryWidget->topLevelItem(summaryItemIndex)->text(SS_RESULTS_COL).toInt() ; ui.searchSummaryWidget->topLevelItem(summaryItemIndex)->setText(SS_RESULTS_COL, QString::number(s+1)); ui.searchSummaryWidget->topLevelItem(summaryItemIndex)->setData(SS_RESULTS_COL, ROLE_SORT, s+1); diff --git a/retroshare-gui/src/gui/FileTransfer/SearchDialog.h b/retroshare-gui/src/gui/FileTransfer/SearchDialog.h index 83eb3b1b2..55db103ca 100644 --- a/retroshare-gui/src/gui/FileTransfer/SearchDialog.h +++ b/retroshare-gui/src/gui/FileTransfer/SearchDialog.h @@ -159,7 +159,7 @@ private: QAbstractItemDelegate *mAgeColumnDelegate; QAbstractItemDelegate *mSizeColumnDelegate; - /* Color definitions (for standard see qss.default) */ + /* Color definitions (for standard see default.qss) */ QColor mTextColorLocal; QColor mTextColorDownloading; QColor mTextColorNoSources; diff --git a/retroshare-gui/src/gui/FileTransfer/SearchDialog.ui b/retroshare-gui/src/gui/FileTransfer/SearchDialog.ui index ad8c61068..47fd2179e 100644 --- a/retroshare-gui/src/gui/FileTransfer/SearchDialog.ui +++ b/retroshare-gui/src/gui/FileTransfer/SearchDialog.ui @@ -6,7 +6,7 @@ 0 0 - 793 + 783 511 @@ -16,7 +16,7 @@ 1 - + @@ -31,7 +31,7 @@ QFrame::Plain - + 3 @@ -45,42 +45,30 @@ 3 - + 2 - - - 0 - 22 - - - - - 16777215 - 22 - - - + - 0 + 2 - 0 + 2 - 0 + 2 - 0 + 2 0 - 1 + 0 @@ -93,7 +81,14 @@ - + + + + 12 + 75 + true + + Qt::NoFocus @@ -223,6 +218,9 @@ true + + false + KeyWords @@ -261,6 +259,9 @@ true + + false + Filename @@ -336,7 +337,7 @@ - + Any @@ -460,6 +461,11 @@ QLineEdit
gui/common/LineEditClear.h
+ + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
SearchTreeWidget QTreeWidget @@ -467,8 +473,8 @@ - + diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp index 20de4b9e9..61e01ab24 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp @@ -213,15 +213,20 @@ SharedFilesDialog::SharedFilesDialog(bool remote_mode, QWidget *parent) /* Set header resize modes and initial section sizes */ QHeaderView * header = ui.dirTreeView->header () ; +#if QT_VERSION < QT_VERSION_CHECK(5,11,0) + int charWidth = ui.dirTreeView->fontMetrics().width("_"); +#else + int charWidth = ui.dirTreeView->fontMetrics().horizontalAdvance("_"); +#endif - header->resizeSection ( COLUMN_NAME, 490 ); - header->resizeSection ( COLUMN_FILENB, 70 ); - header->resizeSection ( COLUMN_SIZE, 70 ); - header->resizeSection ( COLUMN_AGE, 100 ); - header->resizeSection ( COLUMN_FRIEND_ACCESS,100); - header->resizeSection ( COLUMN_WN_VISU_DIR, 100 ); + header->resizeSection ( COLUMN_NAME , charWidth*100 ); + header->resizeSection ( COLUMN_FILENB , charWidth*15 ); + header->resizeSection ( COLUMN_SIZE , charWidth*10 ); + header->resizeSection ( COLUMN_AGE , charWidth*6 ); + header->resizeSection ( COLUMN_FRIEND_ACCESS, charWidth*10 ); + header->resizeSection ( COLUMN_WN_VISU_DIR , charWidth*20 ); - header->setStretchLastSection(false); + header->setStretchLastSection(true); /* Set Multi Selection */ ui.dirTreeView->setSelectionMode(QAbstractItemView::ExtendedSelection); diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.ui b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.ui index b1f4ceb9b..6915c1c44 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.ui +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.ui @@ -61,7 +61,14 @@
- + + + + 12 + 75 + true + + Files @@ -216,7 +223,7 @@ border-image: url(:/images/closepressed.png)
- + Tree view @@ -230,7 +237,7 @@ border-image: url(:/images/closepressed.png) - + All @@ -304,7 +311,7 @@ border-image: url(:/images/closepressed.png) Download - + :/images/download16.png:/images/download16.png @@ -366,9 +373,9 @@ border-image: url(:/images/closepressed.png) true - + false - +
@@ -379,9 +386,9 @@ border-image: url(:/images/closepressed.png)
- StyledLabel - QLabel -
gui/common/StyledLabel.h
+ RSComboBox + QComboBox +
gui/common/RSComboBox.h
diff --git a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.ui b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.ui index d2e7a9ab6..f329509b1 100644 --- a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.ui +++ b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.ui @@ -70,7 +70,14 @@
- + + + + 12 + 75 + true + + File Transfers @@ -213,6 +220,9 @@ true + + false + false @@ -280,6 +290,9 @@ true + + false +
@@ -294,11 +307,6 @@
- - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
LineEditClear QLineEdit diff --git a/retroshare-gui/src/gui/FriendsDialog.ui b/retroshare-gui/src/gui/FriendsDialog.ui index b32c71465..02408e382 100644 --- a/retroshare-gui/src/gui/FriendsDialog.ui +++ b/retroshare-gui/src/gui/FriendsDialog.ui @@ -10,7 +10,7 @@ 491 - + 0 @@ -37,7 +37,7 @@ QFrame::Sunken - + 2 @@ -70,14 +70,21 @@
- + + + + 12 + 75 + true + + Network - + Qt::Horizontal @@ -115,12 +122,12 @@ Qt::Horizontal - + 1 - + @@ -130,7 +137,7 @@ QFrame::Sunken - + 1 @@ -192,7 +199,14 @@ - + + + + 20 + 75 + true + + Nickname (Location) @@ -240,7 +254,7 @@ Broadcast - + @@ -362,11 +376,6 @@
gui/common/AvatarWidget.h
1 - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
ChatWidget QWidget @@ -380,9 +389,9 @@ 1 - StyledElidedLabel + ElidedLabel QLabel -
gui/common/StyledElidedLabel.h
+
gui/common/ElidedLabel.h
NewFriendList diff --git a/retroshare-gui/src/gui/GenCertDialog.cpp b/retroshare-gui/src/gui/GenCertDialog.cpp index f9511a46c..1abdb698b 100644 --- a/retroshare-gui/src/gui/GenCertDialog.cpp +++ b/retroshare-gui/src/gui/GenCertDialog.cpp @@ -53,7 +53,7 @@ class EntropyCollectorWidget: public QTextBrowser { public: - EntropyCollectorWidget(QProgressBar *pr,QWidget *p = NULL) + explicit EntropyCollectorWidget(QProgressBar *pr,QWidget *p = NULL) : QTextBrowser(p) { progress = pr ; @@ -150,7 +150,7 @@ GenCertDialog::GenCertDialog(bool onlyGenerateIdentity, QWidget *parent) connect(ui.node_input, SIGNAL(textChanged(QString)), this, SLOT(updateCheckLabels())); connect(ui.reuse_existing_node_CB, SIGNAL(toggled(bool)), this, SLOT(updateCheckLabels())); - connect(ui.cbUseBob, SIGNAL(clicked(bool)), this, SLOT(useBobChecked(bool)));; + connect(ui.cbUseBob, SIGNAL(clicked(bool)), this, SLOT(useI2pChecked(bool)));; entropy_timer = new QTimer ; entropy_timer->start(20) ; @@ -288,8 +288,6 @@ void GenCertDialog::setupState() break; } - //ui.no_node_label->setVisible(false); - setWindowTitle(generate_new?tr("Create new profile and new Retroshare node"):tr("Create new Retroshare node")); //ui.headerFrame->setHeaderText(generate_new?tr("Create a new profile and node"):tr("Create a new node")); @@ -300,15 +298,9 @@ void GenCertDialog::setupState() ui.genPGPuser->setVisible(adv_state && haveGPGKeys && !generate_new) ; - //ui.genprofileinfo_label->setVisible(false); - //ui.no_gpg_key_label->setText(tr("Welcome to Retroshare. Before you can proceed you need to create a profile and associate a node with it. To do so please fill out this form.\nAlternatively you can import a (previously exported) profile. Just uncheck \"Create a new profile\"")); - //no_gpg_key_label->setVisible(false); - ui.name_label->setVisible(true); ui.name_input->setVisible(generate_new); - //ui.header_label->setVisible(false) ; - ui.nickname_label->setVisible(adv_state && !mOnlyGenerateIdentity); ui.nickname_input->setVisible(adv_state && !mOnlyGenerateIdentity); @@ -341,9 +333,9 @@ void GenCertDialog::setupState() ui.hiddenport_spinBox->setVisible(hidden_state && !tor_auto); ui.cbUseBob->setVisible(hidden_state && !tor_auto); -#ifndef RS_USE_I2P_BOB +#ifndef RS_USE_I2P_SAM3 ui.cbUseBob->setDisabled(true); - ui.cbUseBob->setToolTip(tr("BOB support is not available")); + ui.cbUseBob->setToolTip(tr("SAMv3 support is not available")); #endif if(!mAllFieldsOk) @@ -352,8 +344,8 @@ void GenCertDialog::setupState() ui.genButton->setVisible(false) ; ui.generate_label->setVisible(false) ; - ui.info_label->setText("Please choose a profile name and password...") ; - ui.info_label->setVisible(true) ; + ui.info_Label->setText("Please choose a profile name and password...") ; + ui.info_Label->setVisible(true) ; } else if(!mEntropyOk) { @@ -361,8 +353,8 @@ void GenCertDialog::setupState() ui.genButton->setVisible(false) ; ui.generate_label->setVisible(false) ; - ui.info_label->setText("Please move your mouse randomly to generate enough random data to create your profile.") ; - ui.info_label->setVisible(true) ; + ui.info_Label->setText("Please move your mouse randomly to generate enough random data to create your profile.") ; + ui.info_Label->setVisible(true) ; } else { @@ -371,7 +363,7 @@ void GenCertDialog::setupState() ui.genButton->setToolTip(tr("Click to create your node and/or profile")) ; ui.genButton->setVisible(true) ; ui.generate_label->setVisible(false) ; - ui.info_label->setVisible(false) ; + ui.info_Label->setVisible(false) ; } } @@ -407,7 +399,7 @@ void GenCertDialog::updateCheckLabels() ui.node_name_check_LB ->setPixmap(bad) ; } - if(!generate_new || ui.name_input->text().length() >= 3) + if(!generate_new || ui.name_input->text().trimmed().length() >= 3) ui.profile_name_check_LB ->setPixmap(good) ; else { @@ -440,10 +432,10 @@ void GenCertDialog::updateCheckLabels() setupState(); } -void GenCertDialog::useBobChecked(bool checked) +void GenCertDialog::useI2pChecked(bool checked) { if (checked) { - ui.hiddenaddr_input->setPlaceholderText(tr("I2P instance address with BOB enabled")); + ui.hiddenaddr_input->setPlaceholderText(tr("I2P instance address with SAMv3 enabled")); ui.hiddenaddr_label->setText(tr("I2P instance address")); ui.hiddenport_spinBox->setEnabled(false); @@ -539,12 +531,12 @@ void GenCertDialog::genPerson() std::string hl = ui.hiddenaddr_input->text().toStdString(); uint16_t port = ui.hiddenport_spinBox->value(); - bool useBob = ui.cbUseBob->isChecked(); + bool useI2p = ui.cbUseBob->isChecked(); - if (useBob && hl.empty()) + if (useI2p && hl.empty()) hl = "127.0.0.1"; - RsInit::SetHiddenLocation(hl, port, useBob); /* parses it */ + RsInit::SetHiddenLocation(hl, port, useI2p); /* parses it */ } @@ -591,7 +583,6 @@ void GenCertDialog::genPerson() //generate a new gpg key std::string err_string; //_key_label->setText(tr("Generating new node key, please be patient: this process needs generating large prime numbers, and can take some minutes on slow computers. \n\nFill in your password when asked, to sign your new key.")); - //ui.no_gpg_key_label->show(); //ui.reuse_existing_node_CB->hide(); ui.name_label->hide(); ui.name_input->hide(); @@ -609,7 +600,6 @@ void GenCertDialog::genPerson() ui.node_input->hide(); ui.genButton->hide(); ui.importIdentity_PB->hide(); - //ui.genprofileinfo_label->hide(); ui.nodeType_CB->hide(); //ui.adv_checkbox->hide(); ui.keylength_label->hide(); diff --git a/retroshare-gui/src/gui/GenCertDialog.h b/retroshare-gui/src/gui/GenCertDialog.h index afd82e5f0..6d9d3610a 100644 --- a/retroshare-gui/src/gui/GenCertDialog.h +++ b/retroshare-gui/src/gui/GenCertDialog.h @@ -31,7 +31,7 @@ class GenCertDialog : public QDialog public: /** Default constructor */ - GenCertDialog(bool onlyGenerateIdentity, QWidget *parent = 0); + explicit GenCertDialog(bool onlyGenerateIdentity, QWidget *parent = 0); virtual ~GenCertDialog() ; virtual void mouseMoveEvent(QMouseEvent *e) ; @@ -44,7 +44,7 @@ private slots: void switchReuseExistingNode(); void grabMouse(); void updateCheckLabels(); - void useBobChecked(bool checked); + void useI2pChecked(bool checked); private: void initKeyList(); diff --git a/retroshare-gui/src/gui/GenCertDialog.ui b/retroshare-gui/src/gui/GenCertDialog.ui index 96f09cae2..a747709d3 100644 --- a/retroshare-gui/src/gui/GenCertDialog.ui +++ b/retroshare-gui/src/gui/GenCertDialog.ui @@ -111,7 +111,7 @@
- + 0 @@ -187,7 +187,7 @@ - + 0 @@ -245,6 +245,12 @@ 0 + + + 75 + true + + <html><head/><body><p>Put a strong password here. This password protects your private node key!</p></body></html> @@ -303,6 +309,12 @@ 0 + + + 75 + true + + <html><head/><body><p>Your node name designates the Retroshare instance that</p><p>will run on this computer.</p></body></html> @@ -340,6 +352,12 @@ 32 + + + 75 + true + + <html><head/><body><p>The profile name identifies you over the network.</p><p>It is used by your friends to accept connections from you.</p><p>You can create multiple Retroshare nodes with the</p><p>same profile on different computers.</p><p><br/></p></body></html> @@ -352,13 +370,19 @@ - + 0 0 + + + 75 + true + + Your profile is associated with a PGP key pair. RetroShare currently ignores DSA keys. @@ -417,6 +441,12 @@ 0 + + + 75 + true + + <html><head/><body><p>Put a strong password here. This password protects your private node key!</p></body></html> @@ -456,6 +486,12 @@ 32 + + + 75 + true + + <html><head/><body><p>This should be a Tor Onion address of the form: xa76giaf6ifda7ri63i263.onion <br/>or an I2P address in the form: [52 characters].b32.i2p </p><p>In order to get one, you must configure either Tor or I2P to create a new hidden service / server tunnel. </p><p>You can also leave this blank now, but your node will only work if you correctly set the Tor/I2P service address in Options-&gt;Network-&gt;Hidden Service configuration panel.</p></body></html> @@ -479,6 +515,12 @@ 0 + + + 75 + true + + <html><head/><body><p>This is your connection port.</p><p>Any value between 1024 and 65535 </p><p>should be ok. You can change it later.</p></body></html> @@ -496,7 +538,7 @@ - Use BOB + Use I2P @@ -510,6 +552,12 @@ 0 + + + 75 + true + + <html><head/><body><p>Identities are used when you write in chat rooms, forums and channel comments. </p><p>They also receive/send email over the Retroshare network. You can create</p><p>a signed identity now, or do it later on when you get to need it.</p></body></html> @@ -532,6 +580,8 @@ 12 + 75 + true @@ -721,7 +771,12 @@
- + + + + 12 + + TextLabel @@ -751,6 +806,13 @@
+ + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
name_input node_input @@ -764,8 +826,8 @@ importIdentity_PB - + diff --git a/retroshare-gui/src/gui/GetStartedDialog.cpp b/retroshare-gui/src/gui/GetStartedDialog.cpp index d525808b6..21fe60be0 100644 --- a/retroshare-gui/src/gui/GetStartedDialog.cpp +++ b/retroshare-gui/src/gui/GetStartedDialog.cpp @@ -53,19 +53,19 @@ GetStartedDialog::GetStartedDialog(QWidget *parent) mFirstShow = true; - connect(ui.inviteCheckBox, SIGNAL(stateChanged( int )), this, SLOT(tickInviteChanged())); - connect(ui.addCheckBox, SIGNAL(stateChanged( int )), this, SLOT(tickAddChanged())); - connect(ui.connectCheckBox, SIGNAL(stateChanged( int )), this, SLOT(tickConnectChanged())); - connect(ui.firewallCheckBox, SIGNAL(stateChanged( int )), this, SLOT(tickFirewallChanged())); + connect(ui.inviteCheckBox, SIGNAL(stateChanged(int)), this, SLOT(tickInviteChanged())); + connect(ui.addCheckBox, SIGNAL(stateChanged(int)), this, SLOT(tickAddChanged())); + connect(ui.connectCheckBox, SIGNAL(stateChanged(int)), this, SLOT(tickConnectChanged())); + connect(ui.firewallCheckBox, SIGNAL(stateChanged(int)), this, SLOT(tickFirewallChanged())); - connect(ui.pushButton_InviteFriends, SIGNAL(clicked( bool )), this, SLOT(inviteFriends())); - connect(ui.pushButton_AddFriend, SIGNAL(clicked( bool )), this, SLOT(addFriends())); + connect(ui.pushButton_InviteFriends, SIGNAL(clicked(bool)), this, SLOT(inviteFriends())); + connect(ui.pushButton_AddFriend, SIGNAL(clicked(bool)), this, SLOT(addFriends())); - connect(ui.pushButton_FAQ, SIGNAL(clicked( bool )), this, SLOT(OpenFAQ())); - connect(ui.pushButton_Forums, SIGNAL(clicked( bool )), this, SLOT(OpenForums())); - connect(ui.pushButton_Website, SIGNAL(clicked( bool )), this, SLOT(OpenWebsite())); - connect(ui.pushButton_EmailFeedback, SIGNAL(clicked( bool )), this, SLOT(emailFeedback())); - connect(ui.pushButton_EmailSupport, SIGNAL(clicked( bool )), this, SLOT(emailSupport())); + connect(ui.pushButton_FAQ, SIGNAL(clicked(bool)), this, SLOT(OpenFAQ())); + connect(ui.pushButton_Forums, SIGNAL(clicked(bool)), this, SLOT(OpenForums())); + connect(ui.pushButton_Website, SIGNAL(clicked(bool)), this, SLOT(OpenWebsite())); + connect(ui.pushButton_EmailFeedback, SIGNAL(clicked(bool)), this, SLOT(emailFeedback())); + connect(ui.pushButton_EmailSupport, SIGNAL(clicked(bool)), this, SLOT(emailSupport())); } GetStartedDialog::~GetStartedDialog() @@ -105,8 +105,7 @@ void GetStartedDialog::showEvent ( QShowEvent * /*event*/ ) void GetStartedDialog::updateFromUserLevel() { - RsConfigUserLvl userLevel = RsConfigUserLvl::NEW; - userLevel = rsConfig->getUserLevel(); + RsConfigUserLvl userLevel = rsConfig->getUserLevel(); ui.inviteCheckBox->setChecked(false); ui.addCheckBox->setChecked(false); @@ -185,17 +184,12 @@ void GetStartedDialog::tickFirewallChanged() } } -static void sendMail(const QString &address, const QString &subject, QString body) +static void sendMail(const QString &address, const QString &subject, const QString &body) { - /* Only under windows do we need to do this! */ -#ifdef Q_OS_WIN - /* search and replace the end of lines with: "%0D%0A" */ - body.replace("\n", "%0D%0A"); -#endif QString mailstr = "mailto:" + address; - mailstr += "?subject=" + subject; - mailstr += "&body=" + body; + mailstr += "?subject=" + QUrl::toPercentEncoding(subject); + mailstr += "&body=" + QUrl::toPercentEncoding(body); std::cerr << "MAIL STRING:" << mailstr.toStdString() << std::endl; @@ -240,7 +234,7 @@ void GetStartedDialog::inviteFriends() RsAutoUpdatePage::unlockAllEvents() ; } - QString text = QString("%1\n%2\n\n%3\n").arg(GetInviteText()).arg(GetCutBelowText()).arg(QString::fromUtf8(cert.c_str())); + QString text = QString("%1\n%2\n\n%3\n").arg(GetInviteText(), GetCutBelowText(), QString::fromUtf8(cert.c_str())); sendMail("", tr("RetroShare Invitation"), text); } @@ -427,8 +421,10 @@ void GetStartedDialog::emailSupport() sysVersion = "Linux"; #endif #endif - text += QString("My RetroShare Configuration is: (%1, %2, %3)").arg(Rshare::retroshareVersion(true)).arg(sysVersion).arg(static_cast::type>(userLevel)) + "\n"; - text += "\n"; + text += QString("My RetroShare Configuration is: (%1, %2, %3)").arg(Rshare::retroshareVersion(true) + , sysVersion + ).arg(static_cast::type>(userLevel)) + "\n"; + text += "\n"; text += QString("I am having trouble with RetroShare."); text += QString(" Can you help me with....") + "\n"; diff --git a/retroshare-gui/src/gui/GetStartedDialog.ui b/retroshare-gui/src/gui/GetStartedDialog.ui index 13698c204..5c0a78e6b 100644 --- a/retroshare-gui/src/gui/GetStartedDialog.ui +++ b/retroshare-gui/src/gui/GetStartedDialog.ui @@ -10,7 +10,7 @@ 582 - + 0 @@ -32,11 +32,20 @@ Getting Started - + 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -53,12 +62,12 @@ 732 - + 0 - + @@ -121,20 +130,20 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">RetroShare is nothing without your Friends. Click on the Button to start the process.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Email an Invitation with your &quot;ID Certificate&quot; to your friends.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Be sure to get their invitation back as well... </span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">You can only connect with friends if you have both added each other.</span></p></body></html> +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">RetroShare is nothing without your Friends. Click on the Button to start the process.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Email an Invitation with your &quot;ID Certificate&quot; to your friends.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Be sure to get their invitation back as well... </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">You can only connect with friends if you have both added each other.</span></p></body></html>
- + @@ -197,17 +206,17 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">When your friends send you their invitations, click to open the Add Friends window.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Paste your Friends' &quot;ID Certificates&quot; into the window and add them as friends.</span></p></body></html> +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">When your friends send you their invitations, click to open the Add Friends window.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Paste your Friends' &quot;ID Certificates&quot; into the window and add them as friends.</span></p></body></html>
- + 0 @@ -282,25 +291,25 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Be Online at the same time as your friends, and RetroShare will automatically connect you!</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Your client needs to find the RetroShare Network before it can make connections.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">This takes 5-30 minutes the first time you start up RetroShare</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">The DHT indicator (in the Status Bar) turns Green when it can make connections.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">After a couple of minutes, the NAT indicator (also in the Status Bar) switch to Yellow or Green.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">If it remains Red, then you have a Nasty Firewall, that RetroShare struggles to connect through.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Look in the Further Help section for more advice about connecting.</span></p></body></html> +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Be Online at the same time as your friends, and RetroShare will automatically connect you!</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Your client needs to find the RetroShare Network before it can make connections.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">This takes 5-30 minutes the first time you start up RetroShare</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">The DHT indicator (in the Status Bar) turns Green when it can make connections.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">After a couple of minutes, the NAT indicator (also in the Status Bar) switch to Yellow or Green.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">If it remains Red, then you have a Nasty Firewall, that RetroShare struggles to connect through.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Look in the Further Help section for more advice about connecting.</span></p></body></html>
- + @@ -366,23 +375,23 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">You can improve your Retroshare performance by opening an External Port. </span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">This will speed up connections and allow more people to connect with you. </span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">The easiest way to do this is by enabling UPnP on your Wireless Box or Router.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">As each router is different, you will need to find out your Router Model and search the Internet for instructions.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">If none of this makes sense to you, don't worry about it Retroshare will still work.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p></body></html> +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">You can improve your Retroshare performance by opening an External Port. </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">This will speed up connections and allow more people to connect with you. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">The easiest way to do this is by enabling UPnP on your Wireless Box or Router.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">As each router is different, you will need to find out your Router Model and search the Internet for instructions.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">If none of this makes sense to you, don't worry about it Retroshare will still work.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p></body></html>
- + Qt::Vertical @@ -407,31 +416,31 @@ p, li { white-space: pre-wrap; } Further Help and Support - + - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Having trouble getting started with RetroShare?</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">1) Look at the FAQ Wiki. This is a bit old, we are trying to bring it up to date.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">2) Check out the Online Forums. Ask questions and discuss features.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">3) Try the Internal RetroShare Forums </span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;"> - These come online once you are connected to friends.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">4) If you are still stuck. Email us.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Enjoy Retrosharing</span></p></body></html> +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Having trouble getting started with RetroShare?</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">1) Look at the FAQ Wiki. This is a bit old, we are trying to bring it up to date.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">2) Check out the Online Forums. Ask questions and discuss features.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">3) Try the Internal RetroShare Forums </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;"> - These come online once you are connected to friends.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">4) If you are still stuck. Email us.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:12pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Enjoy Retrosharing</span></p></body></html> - + @@ -454,7 +463,7 @@ p, li { white-space: pre-wrap; } - + Qt::Vertical @@ -481,7 +490,7 @@ p, li { white-space: pre-wrap; } - + Qt::Vertical @@ -494,7 +503,7 @@ p, li { white-space: pre-wrap; } - + Qt::Vertical diff --git a/retroshare-gui/src/gui/HelpDialog.ui b/retroshare-gui/src/gui/HelpDialog.ui index 66884029f..3d40a8a90 100644 --- a/retroshare-gui/src/gui/HelpDialog.ui +++ b/retroshare-gui/src/gui/HelpDialog.ui @@ -56,7 +56,7 @@ 6 - + @@ -72,13 +72,13 @@ - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:9pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">RetroShare is an Open Source cross-platform, </span></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">private and secure decentralized communication platform. </span></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">It lets you share securely your friends, </span></p> @@ -97,16 +97,6 @@ p, li { white-space: pre-wrap; } - - - - QFrame::StyledPanel - - - QFrame::Raised - - - @@ -223,7 +213,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:9pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600;">RetroShare Translations:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://retroshare.sourceforge.net/wiki/index.php/Translation"><span style=" font-family:'MS Shell Dlg 2'; text-decoration: underline; color:#0000ff;">http://retroshare.sourceforge.net/wiki/index.php/Translation</span></a></p> diff --git a/retroshare-gui/src/gui/HomePage.ui b/retroshare-gui/src/gui/HomePage.ui index 60743b3c1..5de0fa6fe 100644 --- a/retroshare-gui/src/gui/HomePage.ui +++ b/retroshare-gui/src/gui/HomePage.ui @@ -89,6 +89,8 @@ 11 + 75 + true @@ -105,7 +107,7 @@ ... - + :/icons/help_64.png:/icons/help_64.png @@ -289,6 +291,13 @@ private and secure decentralized communication platform. + + + 15 + 75 + true + + Add friend @@ -415,8 +424,8 @@ private and secure decentralized communication platform. - + diff --git a/retroshare-gui/src/gui/Identity/IdDetailsDialog.ui b/retroshare-gui/src/gui/Identity/IdDetailsDialog.ui index 6a681f142..f54a19b8c 100644 --- a/retroshare-gui/src/gui/Identity/IdDetailsDialog.ui +++ b/retroshare-gui/src/gui/Identity/IdDetailsDialog.ui @@ -355,7 +355,7 @@ - + 0 @@ -493,12 +493,16 @@ p, li { white-space: pre-wrap; } - - HeaderFrame - QFrame -
gui/common/HeaderFrame.h
- 1 + + HeaderFrame + QFrame +
gui/common/HeaderFrame.h
+ 1
-
- + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+ diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index e8c39e75d..2585a286c 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -259,7 +259,7 @@ IdDialog::IdDialog(QWidget *parent) ui->editButton->hide(); - ui->avlabel_Circles->setPixmap(FilesDefs::getPixmapFromQtResourcePath(":/icons/png/circles.png")); + ui->avLabel_Circles->setPixmap(FilesDefs::getPixmapFromQtResourcePath(":/icons/png/circles.png")); ui->headerTextLabel_Circles->setText(tr("Circles")); @@ -475,10 +475,10 @@ void IdDialog::clearPerson() { QFontMetricsF f(ui->avLabel_Person->font()) ; - ui->avLabel_Person->setPixmap(FilesDefs::getPixmapFromQtResourcePath(":/icons/png/people.png").scaled(f.height()*4,f.height()*4,Qt::IgnoreAspectRatio,Qt::SmoothTransformation)); + ui->avLabel_Person->setPixmap(FilesDefs::getPixmapFromQtResourcePath(":/icons/png/people.png").scaled(f.height()*4,f.height()*4,Qt::KeepAspectRatio,Qt::SmoothTransformation)); ui->headerTextLabel_Person->setText(tr("People")); - ui->inviteFrame->hide(); + ui->info_Frame_Invite->hide(); ui->avatarLabel->clear(); whileBlocking(ui->ownOpinion_CB)->setCurrentIndex(1); @@ -2490,7 +2490,7 @@ void IdDialog::sendInvite() { MessageComposer::sendInvite(id,false); - ui->inviteFrame->show(); + ui->info_Frame_Invite->show(); ui->inviteButton->setEnabled(false); } @@ -2572,9 +2572,9 @@ void IdDialog::removefromContacts() updateIdList(); } -void IdDialog::on_closeInfoFrameButton_clicked() +void IdDialog::on_closeInfoFrameButton_Invite_clicked() { - ui->inviteFrame->setVisible(false); + ui->info_Frame_Invite->setVisible(false); } // We need to use indexes here because saving items is not possible since they can be re-created. diff --git a/retroshare-gui/src/gui/Identity/IdDialog.h b/retroshare-gui/src/gui/Identity/IdDialog.h index 4e465fc5d..403b3a437 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.h +++ b/retroshare-gui/src/gui/Identity/IdDialog.h @@ -89,7 +89,7 @@ private slots: void chatIdentityItem(QTreeWidgetItem* item); void sendMsg(); void copyRetroshareLink(); - void on_closeInfoFrameButton_clicked(); + void on_closeInfoFrameButton_Invite_clicked(); void updateSelection(); diff --git a/retroshare-gui/src/gui/Identity/IdDialog.ui b/retroshare-gui/src/gui/Identity/IdDialog.ui index 256849509..7b16da166 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.ui +++ b/retroshare-gui/src/gui/Identity/IdDialog.ui @@ -88,7 +88,14 @@
- + + + + 12 + 75 + true + + People @@ -287,7 +294,7 @@ - -155 + 0 0 634 523 @@ -295,7 +302,7 @@ - + 0 @@ -308,14 +315,19 @@ QFrame::Raised - + 12 - + + + + 22 + + People @@ -335,10 +347,19 @@ - + + + + + 0 + 0 + 0 + + + @@ -359,6 +380,15 @@ + + + + 0 + 0 + 0 + + + @@ -379,6 +409,15 @@ + + + + 154 + 154 + 154 + + + @@ -409,7 +448,7 @@ QFrame::Box - + 6 @@ -423,7 +462,7 @@ 6 - + 16 @@ -442,14 +481,14 @@ - + Invite messages stay into your Outbox until an acknowledgement of receipt has been received. - + 16 @@ -803,7 +842,7 @@ border-image: url(:/images/closepressed.png) - + <html><head/><body><p><span style=" font-family:'Sans'; font-size:9pt;">Your own opinion about an identity rules the visibility of that identity for yourself and your friend nodes. Your own opinion is shared among friends and used to compute a reputation score: If your opinion about an identity is neutral, the reputation score is the difference between friend's positive and negative opinions. If not, your own opinion gives the score.</span></p><p><span style=" font-family:'Sans'; font-size:9pt;">The overall score is used in chat lobbies, forums and channels to decide on the actions to take for each specific identity. When the overall score is lower than -1, the identity is banned, which prevents all messages and forums/channels authored by this identity to be forwarded, both ways. Some forums also have special anti-spam flags that require a non negative reputation level, making them more sensitive to bad opinions. Banned identities gradually lose their activity and eventually disappear (after 5 days).</span></p><p><span style=" font-family:'Sans'; font-size:9pt;">You can change the thresholds and the time of inactivity to delete identities in preferences -&gt; people. </span></p></body></html> @@ -938,7 +977,7 @@ border-image: url(:/images/closepressed.png) detailsGroupBox usageStatisticsGBox - headerFramePerson + headerBFramePerson @@ -954,19 +993,19 @@ border-image: url(:/images/closepressed.png) - + QFrame::StyledPanel QFrame::Raised - + 12 - + 64 @@ -991,7 +1030,12 @@ border-image: url(:/images/closepressed.png) - + + + + 22 + + Circles @@ -1074,7 +1118,7 @@ border-image: url(:/images/closepressed.png) LineEditClear QLineEdit -
gui/common/LineEditClear.h
+
gui/common/LineEditClear.h
RSTreeWidget @@ -1082,14 +1126,14 @@ border-image: url(:/images/closepressed.png)
gui/common/RSTreeWidget.h
- StyledElidedLabel + ElidedLabel QLabel -
gui/common/StyledElidedLabel.h
+
gui/common/ElidedLabel.h
- StyledLabel - QLabel -
gui/common/StyledLabel.h
+ RSComboBox + QComboBox +
gui/common/RSComboBox.h
RSTextBrowser diff --git a/retroshare-gui/src/gui/Identity/IdEditDialog.cpp b/retroshare-gui/src/gui/Identity/IdEditDialog.cpp index a77713e1e..9396a9758 100644 --- a/retroshare-gui/src/gui/Identity/IdEditDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdEditDialog.cpp @@ -77,7 +77,7 @@ IdEditDialog::IdEditDialog(QWidget *parent) : /* Connect signals */ connect(ui->radioButton_GpgId, SIGNAL(toggled(bool)), this, SLOT(idTypeToggled(bool))); connect(ui->radioButton_Pseudo, SIGNAL(toggled(bool)), this, SLOT(idTypeToggled(bool))); - connect(ui->createButton, SIGNAL(clicked()), this, SLOT(submit())); + connect(ui->postButton, SIGNAL(clicked()), this, SLOT(submit())); connect(ui->cancelButton, SIGNAL(clicked()), this, SLOT(reject())); connect(ui->plainTextEdit_Tag, SIGNAL(textChanged()), this, SLOT(checkNewTag())); @@ -238,7 +238,7 @@ void IdEditDialog::setupExistingId(const RsGxsGroupId& keyId) setWindowTitle(tr("Edit identity")); ui->headerFrame->setHeaderImage(FilesDefs::getPixmapFromQtResourcePath(":/icons/png/person.png")); ui->headerFrame->setHeaderText(tr("Edit identity")); - ui->createButton->setText(tr("Update")); + ui->postButton->setText(tr("Update")); mStateHelper->setLoading(IDEDITDIALOG_LOADID, true); @@ -601,7 +601,7 @@ void IdEditDialog::createId() if(rsIdentity->createIdentity(keyId,params.nickname,params.mImage,!params.isPgpLinked,gpg_password)) { - ui->createButton->setEnabled(false); + ui->postButton->setEnabled(false); if(!keyId.isNull()) { diff --git a/retroshare-gui/src/gui/Identity/IdEditDialog.ui b/retroshare-gui/src/gui/Identity/IdEditDialog.ui index e30c12d8a..1b4e53186 100644 --- a/retroshare-gui/src/gui/Identity/IdEditDialog.ui +++ b/retroshare-gui/src/gui/Identity/IdEditDialog.ui @@ -55,10 +55,19 @@ - + + + + + 0 + 0 + 0 + + + @@ -79,6 +88,15 @@ + + + + 0 + 0 + 0 + + + @@ -99,6 +117,15 @@ + + + + 154 + 154 + 154 + + + @@ -120,6 +147,11 @@ + + + 12 + + true @@ -365,7 +397,7 @@ QFrame::Raised - + @@ -477,7 +509,7 @@ - + 9 @@ -507,7 +539,14 @@ - + + + + 12 + 75 + true + + Create diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 8ba6a0a90..bf5dc6230 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -247,12 +247,13 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags) statusBar()->setVisible(Settings->valueFromGroup("StatusBar", "ShowStatusBar", QVariant(true)).toBool()); /* initialize combobox in status bar */ - statusComboBox = new QComboBox(statusBar()); + statusComboBox = new RSComboBox(statusBar()); statusComboBox->setVisible(Settings->valueFromGroup("StatusBar", "ShowStatus", QVariant(true)).toBool()); statusComboBox->setFocusPolicy(Qt::ClickFocus); initializeStatusObject(statusComboBox, true); QWidget *widget = new QWidget(); + widget->setObjectName("trans_statusComboBoxFrame"); QHBoxLayout *hbox = new QHBoxLayout(); hbox->setMargin(0); hbox->setSpacing(6); @@ -1300,7 +1301,7 @@ static void setStatusObject(QObject *pObject, int nStatus) } return; } - QComboBox *pComboBox = dynamic_cast(pObject); + RSComboBox *pComboBox = dynamic_cast(pObject); if (pComboBox) { /* set index of combobox */ int nIndex = pComboBox->findData(nStatus, Qt::UserRole); @@ -1389,7 +1390,7 @@ void MainWindow::initializeStatusObject(QObject *pObject, bool bConnect) } } else { /* initialize combobox */ - QComboBox *pComboBox = dynamic_cast(pObject); + RSComboBox *pComboBox = dynamic_cast(pObject); if (pComboBox) { pComboBox->addItem(QIcon(StatusDefs::imageStatus(RS_STATUS_ONLINE)), StatusDefs::name(RS_STATUS_ONLINE), RS_STATUS_ONLINE); pComboBox->addItem(QIcon(StatusDefs::imageStatus(RS_STATUS_BUSY)), StatusDefs::name(RS_STATUS_BUSY), RS_STATUS_BUSY); @@ -1613,7 +1614,7 @@ void MainWindow::switchVisibilityStatus(StatusElement e,bool b) //{ // ServicePermissionDialog::showYourself(); //} -QComboBox *MainWindow::statusComboBoxInstance() +RSComboBox *MainWindow::statusComboBoxInstance() { return statusComboBox; } diff --git a/retroshare-gui/src/gui/MainWindow.h b/retroshare-gui/src/gui/MainWindow.h index be459d295..e34fda42a 100644 --- a/retroshare-gui/src/gui/MainWindow.h +++ b/retroshare-gui/src/gui/MainWindow.h @@ -25,12 +25,12 @@ #include #include "gui/common/rwindow.h" +#include "gui/common/RSComboBox.h" namespace Ui { class MainWindow; } -class QComboBox; class QLabel; class QActionGroup; class QListWidgetItem; @@ -174,7 +174,7 @@ public: void removeStatusObject(QObject *pObject); void setStatus(QObject *pObject, int nStatus); - QComboBox *statusComboBoxInstance(); + RSComboBox *statusComboBoxInstance(); PeerStatus *peerstatusInstance(); NATStatus *natstatusInstance(); DHTStatus *dhtstatusInstance(); @@ -294,7 +294,7 @@ private: QAction *toggleVisibilityAction, *toolAct; QList userNotifyList; - QComboBox *statusComboBox; + RSComboBox *statusComboBox; PeerStatus *peerstatus; NATStatus *natstatus; DHTStatus *dhtstatus; diff --git a/retroshare-gui/src/gui/MainWindow.ui b/retroshare-gui/src/gui/MainWindow.ui index d1dc1c2f7..55a7145e0 100644 --- a/retroshare-gui/src/gui/MainWindow.ui +++ b/retroshare-gui/src/gui/MainWindow.ui @@ -33,6 +33,11 @@ 0 + + + 12 + + QFrame::NoFrame @@ -143,7 +148,7 @@ - + :/images/add-share24.png:/images/add-share24.png @@ -161,7 +166,7 @@ - + :/images/messenger.png:/images/messenger.png @@ -187,7 +192,7 @@ - + :/images/exit_24x24.png:/images/exit_24x24.png diff --git a/retroshare-gui/src/gui/MessengerWindow.ui b/retroshare-gui/src/gui/MessengerWindow.ui index 7e952e86b..cc81303b8 100644 --- a/retroshare-gui/src/gui/MessengerWindow.ui +++ b/retroshare-gui/src/gui/MessengerWindow.ui @@ -74,7 +74,7 @@ - + true @@ -124,7 +124,7 @@ - + 0 @@ -175,7 +175,7 @@ 0 0 258 - 21 + 27 @@ -199,6 +199,11 @@
gui/LogoBar.h
1
+ + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
diff --git a/retroshare-gui/src/gui/NetworkDialog.h b/retroshare-gui/src/gui/NetworkDialog.h index 6a5b1c367..216cd8cc5 100644 --- a/retroshare-gui/src/gui/NetworkDialog.h +++ b/retroshare-gui/src/gui/NetworkDialog.h @@ -43,6 +43,7 @@ class NetworkDialog : public RsAutoUpdatePage Q_PROPERTY(QColor backgroundColorAcceptConnection READ backgroundColorAcceptConnection WRITE setBackgroundColorAcceptConnection) Q_PROPERTY(QColor backgroundColorHasSignedMe READ backgroundColorHasSignedMe WRITE setBackgroundColorHasSignedMe) Q_PROPERTY(QColor backgroundColorDenied READ backgroundColorDenied WRITE setBackgroundColorDenied) + Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor) public: /** Default Constructor */ @@ -55,12 +56,14 @@ public: QColor backgroundColorAcceptConnection() const { return mBackgroundColorAcceptConnection; } QColor backgroundColorHasSignedMe() const { return mBackgroundColorHasSignedMe; } QColor backgroundColorDenied() const { return mBackgroundColorDenied; } + QColor textColor() const { return mTextColor; } void setBackgroundColorSelf(QColor color) { PGPIdItemModel->setBackgroundColorSelf(color); mBackgroundColorSelf = color; } void setBackgroundColorOwnSign(QColor color) { PGPIdItemModel->setBackgroundColorOwnSign(color); mBackgroundColorOwnSign = color; } void setBackgroundColorAcceptConnection(QColor color) { PGPIdItemModel->setBackgroundColorAcceptConnection(color); mBackgroundColorAcceptConnection = color; } void setBackgroundColorHasSignedMe(QColor color) { PGPIdItemModel->setBackgroundColorHasSignedMe(color); mBackgroundColorHasSignedMe = color; } void setBackgroundColorDenied(QColor color) { PGPIdItemModel->setBackgroundColorDenied(color); mBackgroundColorDenied = color; } + void setTextColor(QColor color) { PGPIdItemModel->setTextColor(color); mTextColor = color; } protected: void changeEvent(QEvent *e); @@ -89,12 +92,13 @@ private: void removeKeys(std::set selected) ; - /* Color definitions (for standard see qss.default) */ + /* Color definitions (for standard see default.qss) */ QColor mBackgroundColorSelf; QColor mBackgroundColorOwnSign; QColor mBackgroundColorAcceptConnection; QColor mBackgroundColorHasSignedMe; QColor mBackgroundColorDenied; + QColor mTextColor; RSTreeWidgetItemCompareRole *compareNetworkRole ; diff --git a/retroshare-gui/src/gui/NetworkDialog/pgpid_item_model.cpp b/retroshare-gui/src/gui/NetworkDialog/pgpid_item_model.cpp index 96ab24e92..49bba065f 100644 --- a/retroshare-gui/src/gui/NetworkDialog/pgpid_item_model.cpp +++ b/retroshare-gui/src/gui/NetworkDialog/pgpid_item_model.cpp @@ -299,6 +299,10 @@ QVariant pgpid_item_model::data(const QModelIndex &index, int role) const } } } + else if(role == Qt::ForegroundRole) + { + return QBrush(mTextColor); + } return QVariant(); } diff --git a/retroshare-gui/src/gui/NetworkDialog/pgpid_item_model.h b/retroshare-gui/src/gui/NetworkDialog/pgpid_item_model.h index 1e38e0461..c4ae73400 100644 --- a/retroshare-gui/src/gui/NetworkDialog/pgpid_item_model.h +++ b/retroshare-gui/src/gui/NetworkDialog/pgpid_item_model.h @@ -60,6 +60,7 @@ public: void setBackgroundColorAcceptConnection(QColor color) { mBackgroundColorAcceptConnection = color; } void setBackgroundColorHasSignedMe(QColor color) { mBackgroundColorHasSignedMe = color; } void setBackgroundColorDenied(QColor color) { mBackgroundColorDenied = color; } + void setTextColor(QColor color) { mTextColor = color; } public slots: @@ -73,6 +74,7 @@ private: QColor mBackgroundColorAcceptConnection; QColor mBackgroundColorHasSignedMe; QColor mBackgroundColorDenied; + QColor mTextColor; }; #endif // KEY_ITEM_MODEL_H diff --git a/retroshare-gui/src/gui/NewsFeed.cpp b/retroshare-gui/src/gui/NewsFeed.cpp index afef19b16..d86ba2d7a 100644 --- a/retroshare-gui/src/gui/NewsFeed.cpp +++ b/retroshare-gui/src/gui/NewsFeed.cpp @@ -270,7 +270,10 @@ void NewsFeed::handleForumEvent(std::shared_ptr event) case RsForumEventCode::UPDATED_MESSAGE: case RsForumEventCode::NEW_MESSAGE: - addFeedItem(new GxsForumMsgItem(this, NEWSFEED_NEW_FORUM, pe->mForumGroupId, pe->mForumMsgId, false, true)); + addFeedItem(new GxsForumMsgItem( + this, NEWSFEED_NEW_FORUM, + pe->mForumGroupId, pe->mForumMsgId, + false, true )); break; default: break; @@ -501,7 +504,7 @@ void NewsFeed::handleSecurityEvent(std::shared_ptr event) MessageComposer::addConnectAttemptMsg(e.mPgpId, e.mSslId, QString::fromStdString(det.name + "(" + det.location + ")")); } -void NewsFeed::testFeeds(uint notifyFlags) +void NewsFeed::testFeeds(uint /*notifyFlags*/) { #ifdef TO_REMOVE if (!instance) { diff --git a/retroshare-gui/src/gui/NewsFeed.ui b/retroshare-gui/src/gui/NewsFeed.ui index 1314c60c7..32a679a74 100644 --- a/retroshare-gui/src/gui/NewsFeed.ui +++ b/retroshare-gui/src/gui/NewsFeed.ui @@ -67,7 +67,14 @@
- + + + + 12 + 75 + true + + Activity Stream @@ -87,7 +94,7 @@ - + @@ -143,9 +150,9 @@ - StyledLabel - QLabel -
gui/common/StyledLabel.h
+ RSComboBox + QComboBox +
gui/common/RSComboBox.h
RSFeedWidget diff --git a/retroshare-gui/src/gui/PhotoShare/AlbumDialog.ui b/retroshare-gui/src/gui/PhotoShare/AlbumDialog.ui index 2d1e7de4e..ef39eac4a 100644 --- a/retroshare-gui/src/gui/PhotoShare/AlbumDialog.ui +++ b/retroshare-gui/src/gui/PhotoShare/AlbumDialog.ui @@ -138,14 +138,14 @@
- + 0 1 - + 0 @@ -185,8 +185,8 @@ p, li { white-space: pre-wrap; } 0 0 - 757 - 395 + 741 + 316 diff --git a/retroshare-gui/src/gui/PhotoShare/AlbumExtra.ui b/retroshare-gui/src/gui/PhotoShare/AlbumExtra.ui index 23b0a462f..ee8c173fc 100644 --- a/retroshare-gui/src/gui/PhotoShare/AlbumExtra.ui +++ b/retroshare-gui/src/gui/PhotoShare/AlbumExtra.ui @@ -28,7 +28,7 @@ - + 0 @@ -111,6 +111,13 @@
+ + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
diff --git a/retroshare-gui/src/gui/PhotoShare/PhotoDialog.ui b/retroshare-gui/src/gui/PhotoShare/PhotoDialog.ui index cf809286c..7be276b77 100644 --- a/retroshare-gui/src/gui/PhotoShare/PhotoDialog.ui +++ b/retroshare-gui/src/gui/PhotoShare/PhotoDialog.ui @@ -153,7 +153,7 @@
- + 50 % @@ -302,6 +302,13 @@ + + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
diff --git a/retroshare-gui/src/gui/PhotoShare/PhotoShare.ui b/retroshare-gui/src/gui/PhotoShare/PhotoShare.ui index 19230a67f..e5476486f 100644 --- a/retroshare-gui/src/gui/PhotoShare/PhotoShare.ui +++ b/retroshare-gui/src/gui/PhotoShare/PhotoShare.ui @@ -61,7 +61,7 @@ Edit Album Details - + :/images/edit_16.png:/images/edit_16.png @@ -186,6 +186,11 @@ + + + 12 + + My Albums @@ -212,6 +217,11 @@ + + + 12 + + Subscribed Albums @@ -238,6 +248,11 @@ + + + 12 + + Shared Albums @@ -286,7 +301,7 @@ 0 0 804 - 208 + 205 @@ -322,7 +337,7 @@ 0 0 804 - 208 + 205 diff --git a/retroshare-gui/src/gui/PhotoShare/PhotoSlideShow.ui b/retroshare-gui/src/gui/PhotoShare/PhotoSlideShow.ui index b8509703e..03c5093ad 100644 --- a/retroshare-gui/src/gui/PhotoShare/PhotoSlideShow.ui +++ b/retroshare-gui/src/gui/PhotoShare/PhotoSlideShow.ui @@ -24,6 +24,11 @@ 0 + + + 12 + + Album Name @@ -155,8 +160,6 @@ - - diff --git a/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget.cpp b/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget.cpp index 7dc90eb82..241c713d1 100644 --- a/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget.cpp +++ b/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget.cpp @@ -108,15 +108,15 @@ void BoardPostDisplayWidgetBase::makeUpVote() void BoardPostDisplayWidgetBase::setReadStatus(bool isNew, bool isUnread) { if (isUnread) - readButton()->setIcon(FilesDefs::getIconFromQtResourcePath(":/images/message-state-unread.png")); + readButton()->setIcon(FilesDefs::getIconFromQtResourcePath(":/images/message-state-unread.png")); else - readButton()->setIcon(FilesDefs::getIconFromQtResourcePath(":/images/message-state-read.png")); + readButton()->setIcon(FilesDefs::getIconFromQtResourcePath(":/images/message-state-read.png")); - newLabel()->setVisible(isNew); + newLabel()->setVisible(isNew); - mainFrame()->setProperty("new", isNew); - mainFrame()->style()->unpolish(mainFrame()); - mainFrame()->style()->polish(mainFrame()); + feedFrame()->setProperty("new", isNew); + feedFrame()->style()->unpolish(feedFrame()); + feedFrame()->style()->polish( feedFrame()); } void BoardPostDisplayWidget_compact::doExpand(bool e) @@ -174,8 +174,9 @@ void BoardPostDisplayWidgetBase::setup() menu->addAction(CopyLinkAction); menu->addSeparator(); shareButton()->setMenu(menu); + shareButton()->setPopupMode(QToolButton::InstantPopup); - connect(shareButton(),SIGNAL(pressed()),this,SLOT(handleShareButtonClicked())); + connect(menu,SIGNAL(aboutToShow()),this,SLOT(handleShareButtonClicked())); RsReputationLevel overall_reputation = rsReputations->overallReputationLevel(mPost.mMeta.mAuthorId); bool redacted = (overall_reputation == RsReputationLevel::LOCALLY_NEGATIVE); @@ -293,17 +294,17 @@ void BoardPostDisplayWidgetBase::handleCopyLinkClicked() BoardPostDisplayWidget_compact::BoardPostDisplayWidget_compact(const RsPostedPost& post, uint8_t display_flags,QWidget *parent=nullptr) : BoardPostDisplayWidgetBase(post,display_flags,parent), ui(new Ui::BoardPostDisplayWidget_compact()) { - ui->setupUi(this); - setup(); + ui->setupUi(this); + setup(); - ui->verticalLayout->addStretch(); - ui->verticalLayout->setAlignment(Qt::AlignTop); - ui->topLayout->setAlignment(Qt::AlignTop); - ui->arrowsLayout->addStretch(); - ui->arrowsLayout->setAlignment(Qt::AlignTop); - ui->verticalLayout_2->addStretch(); + ui->right_VL->addStretch(); + ui->right_VL->setAlignment(Qt::AlignTop); + ui->topLayout->setAlignment(Qt::AlignTop); + ui->arrowsLayout->addStretch(); + ui->arrowsLayout->setAlignment(Qt::AlignTop); + ui->feedFrame_VL->addStretch(); - adjustSize(); + adjustSize(); } BoardPostDisplayWidget_compact::~BoardPostDisplayWidget_compact() @@ -414,9 +415,9 @@ QLabel *BoardPostDisplayWidget_compact::dateLabel() { return ui->da QLabel *BoardPostDisplayWidget_compact::titleLabel() { return ui->titleLabel; } QLabel *BoardPostDisplayWidget_compact::scoreLabel() { return ui->scoreLabel; } QLabel *BoardPostDisplayWidget_compact::notes() { return ui->notes; } -QPushButton *BoardPostDisplayWidget_compact::shareButton() { return ui->shareButton; } +QToolButton *BoardPostDisplayWidget_compact::shareButton() { return ui->shareButton; } QLabel *BoardPostDisplayWidget_compact::pictureLabel() { return ui->pictureLabel; } -QFrame *BoardPostDisplayWidget_compact::mainFrame() { return ui->mainFrame; } +QFrame *BoardPostDisplayWidget_compact::feedFrame() { return ui->feedFrame; } //=================================================================================================================================== //== class BoardPostDisplayWidget_card == @@ -425,17 +426,17 @@ QFrame *BoardPostDisplayWidget_compact::mainFrame() { return ui->ma BoardPostDisplayWidget_card::BoardPostDisplayWidget_card(const RsPostedPost& post, uint8_t display_flags, QWidget *parent) : BoardPostDisplayWidgetBase(post,display_flags,parent), ui(new Ui::BoardPostDisplayWidget_card()) { - ui->setupUi(this); - setup(); + ui->setupUi(this); + setup(); - ui->verticalLayout->addStretch(); - ui->verticalLayout->setAlignment(Qt::AlignTop); - ui->topLayout->setAlignment(Qt::AlignTop); - ui->arrowsLayout->addStretch(); - ui->arrowsLayout->setAlignment(Qt::AlignTop); - ui->verticalLayout_2->addStretch(); + ui->right_VL->addStretch(); + ui->right_VL->setAlignment(Qt::AlignTop); + ui->topLayout->setAlignment(Qt::AlignTop); + ui->arrowsLayout->addStretch(); + ui->arrowsLayout->setAlignment(Qt::AlignTop); + ui->feedFrame_VL->addStretch(); - adjustSize(); + adjustSize(); } BoardPostDisplayWidget_card::~BoardPostDisplayWidget_card() @@ -493,7 +494,7 @@ QLabel *BoardPostDisplayWidget_card::dateLabel() { return ui->dateL QLabel *BoardPostDisplayWidget_card::titleLabel() { return ui->titleLabel; } QLabel *BoardPostDisplayWidget_card::scoreLabel() { return ui->scoreLabel; } QLabel *BoardPostDisplayWidget_card::notes() { return ui->notes; } -QPushButton *BoardPostDisplayWidget_card::shareButton() { return ui->shareButton; } +QToolButton *BoardPostDisplayWidget_card::shareButton() { return ui->shareButton; } QLabel *BoardPostDisplayWidget_card::pictureLabel() { return ui->pictureLabel; } -QFrame *BoardPostDisplayWidget_card::mainFrame() { return ui->mainFrame; } +QFrame *BoardPostDisplayWidget_card::feedFrame() { return ui->feedFrame; } diff --git a/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget.h b/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget.h index 32ce60a2a..a6d4a04d6 100644 --- a/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget.h +++ b/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget.h @@ -78,8 +78,8 @@ protected slots: virtual QLabel *notes() =0; virtual QLabel *pictureLabel()=0; virtual QToolButton *readButton() =0; - virtual QPushButton *shareButton() =0; - virtual QFrame *mainFrame() =0; + virtual QToolButton *shareButton() =0; + virtual QFrame *feedFrame() =0; void loadComments(bool e); void readToggled(); @@ -126,8 +126,8 @@ public: QLabel *notes() override; QLabel *pictureLabel() override; QToolButton *readButton() override; - QPushButton *shareButton() override; - QFrame *mainFrame() override; + QToolButton *shareButton() override; + QFrame *feedFrame() override; public slots: void viewPicture() ; @@ -164,9 +164,9 @@ public: QLabel *scoreLabel() override; QLabel *notes() override; QToolButton *readButton() override; - QPushButton *shareButton() override; + QToolButton *shareButton() override; QLabel *pictureLabel() override; - QFrame *mainFrame() override; + QFrame *feedFrame() override; protected slots: /* GxsGroupFeedItem */ diff --git a/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget_card.ui b/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget_card.ui index 42dc90f44..28ce4fd1d 100644 --- a/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget_card.ui +++ b/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget_card.ui @@ -22,7 +22,7 @@ - + 0 @@ -42,7 +42,7 @@ 2 - + 0 @@ -55,7 +55,7 @@ QFrame::Raised - + 2 @@ -127,10 +127,10 @@ - + - 9 + 14 @@ -177,9 +177,9 @@ - + - + 5 @@ -199,8 +199,8 @@ - 50 - false + 75 + true @@ -277,7 +277,7 @@
- + Qt::Horizontal @@ -295,7 +295,7 @@ - + 0 @@ -304,9 +304,9 @@ - Arial - 10 + 12 75 + true true @@ -340,7 +340,7 @@ - + Qt::Horizontal @@ -371,7 +371,7 @@ - + @@ -393,7 +393,7 @@ - + Share @@ -401,13 +401,16 @@ :/images/share.png:/images/share.png - + true + + Qt::ToolButtonTextBesideIcon + - + Qt::Horizontal @@ -436,15 +439,10 @@ QLabel
gui/gxs/GxsIdLabel.h
- - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
- + diff --git a/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget_compact.ui b/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget_compact.ui index 411d4583e..f27524f08 100644 --- a/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget_compact.ui +++ b/retroshare-gui/src/gui/Posted/BoardPostDisplayWidget_compact.ui @@ -22,7 +22,7 @@ - + 0 @@ -42,7 +42,7 @@ 2 - + 0 @@ -55,7 +55,7 @@ QFrame::Raised - + 2 @@ -89,78 +89,80 @@ 2 - - - - - - 0 - 0 - - - - Vote up - - - - - - - :/images/up-arrow.png:/images/up-arrow.png - - - true - - - - - - - - 9 - - - - 0 - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Vote down - - - - - - \/ - - - - :/images/down-arrow.png:/images/down-arrow.png - - - true - - - - + + + + + + + 0 + 0 + + + + Vote up + + + + + + + :/images/up-arrow.png:/images/up-arrow.png + + + true + + + + + + + + 14 + + + + 0 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Vote down + + + + + + \/ + + + + :/images/down-arrow.png:/images/down-arrow.png + + + true + + + + + @@ -182,12 +184,12 @@ - + 3 - + 0 @@ -196,9 +198,9 @@ - Arial - 10 + 12 75 + true true @@ -220,7 +222,7 @@ - + 6 @@ -243,8 +245,8 @@ - 50 - false + 75 + true @@ -285,7 +287,7 @@ - + Qt::Horizontal @@ -303,7 +305,7 @@
- + @@ -345,7 +347,7 @@ - + Share @@ -353,7 +355,10 @@ :/images/share.png:/images/share.png - + + Qt::ToolButtonTextBesideIcon + + true @@ -395,7 +400,7 @@ - + Qt::Horizontal @@ -421,7 +426,7 @@ QFrame::Raised - + 2 @@ -474,11 +479,6 @@ - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
GxsIdLabel QLabel diff --git a/retroshare-gui/src/gui/Posted/PhotoView.ui b/retroshare-gui/src/gui/Posted/PhotoView.ui index e0d4dce64..e1e7a21e5 100644 --- a/retroshare-gui/src/gui/Posted/PhotoView.ui +++ b/retroshare-gui/src/gui/Posted/PhotoView.ui @@ -24,6 +24,7 @@ MS Sans Serif 11 75 + true true @@ -36,14 +37,14 @@
- + 0 0 - + 0 @@ -133,7 +134,10 @@ MS Sans Serif - 9 + 11 + 75 + true + true diff --git a/retroshare-gui/src/gui/Posted/PostedCardView.cpp b/retroshare-gui/src/gui/Posted/PostedCardView.cpp index b7ead3c0b..9824cfda2 100644 --- a/retroshare-gui/src/gui/Posted/PostedCardView.cpp +++ b/retroshare-gui/src/gui/Posted/PostedCardView.cpp @@ -104,12 +104,12 @@ void PostedCardView::setReadStatus(bool isNew, bool isUnread) ui->newLabel->setVisible(isNew); - ui->mainFrame->setProperty("new", isNew); - ui->mainFrame->style()->unpolish(ui->mainFrame); - ui->mainFrame->style()->polish( ui->mainFrame); + ui->feedFrame->setProperty("new", isNew); + ui->feedFrame->style()->unpolish(ui->feedFrame); + ui->feedFrame->style()->polish( ui->feedFrame); } -void PostedCardView::setComment(const RsGxsComment& cmt) {} +void PostedCardView::setComment(const RsGxsComment& /*cmt*/) {} PostedCardView::~PostedCardView() { @@ -192,11 +192,11 @@ void PostedCardView::fill() ui->dateLabel->setText(timestamp); } else { - QPixmap sqpixmap2 = FilesDefs::getPixmapFromQtResourcePath(":/images/thumb-default.png"); + //QPixmap sqpixmap2 = FilesDefs::getPixmapFromQtResourcePath(":/images/thumb-default.png"); mInFill = true; - int desired_height = 1.5*(ui->voteDownButton->height() + ui->voteUpButton->height() + ui->scoreLabel->height()); - int desired_width = sqpixmap2.width()*desired_height/(float)sqpixmap2.height(); + //int desired_height = 1.5*(ui->voteDownButton->height() + ui->voteUpButton->height() + ui->scoreLabel->height()); + //int desired_width = sqpixmap2.width()*desired_height/(float)sqpixmap2.height(); QDateTime qtime; qtime.setTime_t(mPost.mMeta.mPublishTs); @@ -211,7 +211,6 @@ void PostedCardView::fill() // The only combination that seems to work: load as EncodedUrl, extract toEncoded(). QByteArray urlarray(mPost.mLink.c_str()); QUrl url = QUrl::fromEncoded(urlarray.trimmed()); - QString urlstr = "Invalid Link"; QString sitestr = "Invalid Link"; bool urlOkay = url.isValid(); @@ -230,7 +229,7 @@ void PostedCardView::fill() if (urlOkay) { - urlstr = QString(" "); urlstr += messageName(); @@ -259,7 +258,6 @@ void PostedCardView::fill() GxsIdDetails::loadPixmapFromData(mPost.mImage.mData, mPost.mImage.mSize, pixmap,GxsIdDetails::ORIGINAL); // Wiping data - as its been passed to thumbnail. - QPixmap scaledpixmap; if(pixmap.width() > 800){ QPixmap scaledpixmap = pixmap.scaledToWidth(800, Qt::SmoothTransformation); ui->pictureLabel->setPixmap(scaledpixmap); @@ -267,14 +265,14 @@ void PostedCardView::fill() ui->pictureLabel->setPixmap(pixmap); } } - else if (mPost.mImage.mData == NULL) + else //if (mPost.mImage.mData == NULL) { ui->picture_frame->hide(); } - else - { - ui->picture_frame->show(); - } + //else + //{ + // ui->picture_frame->show(); + //} } //QString score = "Hot" + QString::number(post.mHotScore); diff --git a/retroshare-gui/src/gui/Posted/PostedCardView.ui b/retroshare-gui/src/gui/Posted/PostedCardView.ui index 8cbbd4d56..a55acad24 100644 --- a/retroshare-gui/src/gui/Posted/PostedCardView.ui +++ b/retroshare-gui/src/gui/Posted/PostedCardView.ui @@ -33,7 +33,7 @@ 0 - + 0 @@ -49,7 +49,7 @@ QFrame::Sunken - + 0 @@ -69,7 +69,7 @@ 6 - + 0 @@ -78,9 +78,9 @@ - Arial - 10 + 11 75 + true true @@ -290,10 +290,10 @@ - + - 9 + 14 @@ -506,11 +506,6 @@ - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
GxsIdLabel QLabel @@ -518,9 +513,9 @@
- + diff --git a/retroshare-gui/src/gui/Posted/PostedCreatePostDialog.cpp b/retroshare-gui/src/gui/Posted/PostedCreatePostDialog.cpp index 6bbfa3e37..9c08c8169 100644 --- a/retroshare-gui/src/gui/Posted/PostedCreatePostDialog.cpp +++ b/retroshare-gui/src/gui/Posted/PostedCreatePostDialog.cpp @@ -53,10 +53,10 @@ PostedCreatePostDialog::PostedCreatePostDialog(RsPosted *posted, const RsGxsGrou ui->setupUi(this); Settings->loadWidgetInformation(this); - connect(ui->submitButton, SIGNAL(clicked()), this, SLOT(createPost())); + connect(ui->postButton, SIGNAL(clicked()), this, SLOT(createPost())); connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject())); connect(ui->addPicButton, SIGNAL(clicked() ), this , SLOT(addPicture())); - connect(ui->RichTextEditWidget, SIGNAL(textSizeOk(bool)),ui->submitButton, SLOT(setEnabled(bool))); + connect(ui->RichTextEditWidget, SIGNAL(textSizeOk(bool)),ui->postButton, SLOT(setEnabled(bool))); ui->headerFrame->setHeaderImage(FilesDefs::getPixmapFromQtResourcePath(":/icons/png/postedlinks.png")); ui->headerFrame->setHeaderText(tr("Create a new Post")); @@ -74,13 +74,13 @@ PostedCreatePostDialog::PostedCreatePostDialog(RsPosted *posted, const RsGxsGrou ui->idChooser->loadIds(IDCHOOSER_ID_REQUIRED, default_author); QSignalMapper *signalMapper = new QSignalMapper(this); - connect(ui->postButton, SIGNAL(clicked()), signalMapper, SLOT(map())); - connect(ui->imageButton, SIGNAL(clicked()), signalMapper, SLOT(map())); - connect(ui->linkButton, SIGNAL(clicked()), signalMapper, SLOT(map())); + connect(ui->viewPostButton, SIGNAL(clicked()), signalMapper, SLOT(map())); + connect(ui->viewImageButton, SIGNAL(clicked()), signalMapper, SLOT(map())); + connect(ui->viewLinkButton, SIGNAL(clicked()), signalMapper, SLOT(map())); - signalMapper->setMapping(ui->postButton, VIEW_POST); - signalMapper->setMapping(ui->imageButton, VIEW_IMAGE); - signalMapper->setMapping(ui->linkButton, VIEW_LINK); + signalMapper->setMapping(ui->viewPostButton, VIEW_POST); + signalMapper->setMapping(ui->viewImageButton, VIEW_IMAGE); + signalMapper->setMapping(ui->viewLinkButton, VIEW_LINK); connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(setPage(int))); ui->removeButton->hide(); @@ -189,7 +189,7 @@ void PostedCreatePostDialog::fileHashingFinished(QList hashedFiles) link = RetroShareLink::createFile(hashedFile.filename, hashedFile.size, QString::fromStdString(hashedFile.hash.toStdString())); ui->linkEdit->setText(link.toString()); } - ui->submitButton->setEnabled(true); + ui->postButton->setEnabled(true); ui->addPicButton->setEnabled(true); } @@ -233,7 +233,7 @@ void PostedCreatePostDialog::addPicture() //If still yes then link it if(answer == QMessageBox::Yes) { - ui->submitButton->setEnabled(false); + ui->postButton->setEnabled(false); ui->addPicButton->setEnabled(false); QStringList files; files.append(imagefilename); @@ -245,11 +245,11 @@ void PostedCreatePostDialog::addPicture() int PostedCreatePostDialog::viewMode() { - if (ui->postButton->isChecked()) { + if (ui->viewPostButton->isChecked()) { return VIEW_POST; - } else if (ui->imageButton->isChecked()) { + } else if (ui->viewImageButton->isChecked()) { return VIEW_IMAGE; - } else if (ui->linkButton->isChecked()) { + } else if (ui->viewLinkButton->isChecked()) { return VIEW_LINK; } @@ -263,25 +263,25 @@ void PostedCreatePostDialog::setPage(int viewMode) case VIEW_POST: ui->stackedWidget->setCurrentIndex(0); - ui->postButton->setChecked(true); - ui->imageButton->setChecked(false); - ui->linkButton->setChecked(false); + ui->viewPostButton->setChecked(true); + ui->viewImageButton->setChecked(false); + ui->viewLinkButton->setChecked(false); break; case VIEW_IMAGE: ui->stackedWidget->setCurrentIndex(1); - ui->imageButton->setChecked(true); - ui->postButton->setChecked(false); - ui->linkButton->setChecked(false); + ui->viewImageButton->setChecked(true); + ui->viewPostButton->setChecked(false); + ui->viewLinkButton->setChecked(false); break; case VIEW_LINK: ui->stackedWidget->setCurrentIndex(2); - ui->linkButton->setChecked(true); - ui->postButton->setChecked(false); - ui->imageButton->setChecked(false); + ui->viewLinkButton->setChecked(true); + ui->viewPostButton->setChecked(false); + ui->viewImageButton->setChecked(false); break; default: diff --git a/retroshare-gui/src/gui/Posted/PostedCreatePostDialog.ui b/retroshare-gui/src/gui/Posted/PostedCreatePostDialog.ui index bd44c4d0a..a9ae69b46 100644 --- a/retroshare-gui/src/gui/Posted/PostedCreatePostDialog.ui +++ b/retroshare-gui/src/gui/Posted/PostedCreatePostDialog.ui @@ -40,21 +40,21 @@
- + QFrame::StyledPanel QFrame::Raised - + 0 - + 0 @@ -73,7 +73,7 @@ - + 0 @@ -104,7 +104,7 @@ Preview - + 0 @@ -115,7 +115,7 @@ 0 - + Qt::Horizontal @@ -128,7 +128,7 @@ - + Qt::Horizontal @@ -143,17 +143,17 @@ - 0 + 1 - + - + 9 - + Qt::Horizontal @@ -190,7 +190,7 @@ - + Qt::Horizontal @@ -203,7 +203,7 @@ - + Qt::Vertical @@ -218,7 +218,7 @@ - + Qt::Horizontal @@ -233,7 +233,7 @@ - + 2 @@ -267,7 +267,7 @@ - + Qt::Horizontal @@ -305,7 +305,7 @@
- + 0 @@ -323,7 +323,7 @@
- + Qt::Vertical @@ -340,7 +340,7 @@ - + @@ -367,13 +367,20 @@ - + 0 0 + + + 12 + 75 + true + + @@ -399,12 +406,12 @@ - + 2 - + Post @@ -424,7 +431,7 @@ - + Image @@ -450,7 +457,7 @@ - + Link @@ -473,7 +480,7 @@ - + Qt::Horizontal @@ -488,10 +495,19 @@ - + + + + + 0 + 0 + 0 + + + @@ -512,6 +528,15 @@ + + + + 0 + 0 + 0 + + + @@ -532,6 +557,15 @@ + + + + 154 + 154 + 154 + + + @@ -553,6 +587,11 @@ + + + 12 + + true @@ -584,7 +623,7 @@ - + 6 @@ -613,15 +652,9 @@ - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
- - HashBox - QScrollArea -
gui/common/HashBox.h
- 1 + GxsIdChooser + QComboBox +
gui/gxs/GxsIdChooser.h
HeaderFrame @@ -629,21 +662,22 @@
gui/common/HeaderFrame.h
1
- - GxsIdChooser - QComboBox -
gui/gxs/GxsIdChooser.h
-
RichTextEdit QWidget
util/RichTextEdit.h
1
+ + HashBox + QScrollArea +
gui/common/HashBox.h
+ 1 +
- + diff --git a/retroshare-gui/src/gui/Posted/PostedItem.cpp b/retroshare-gui/src/gui/Posted/PostedItem.cpp index fa79b9d70..90f393dab 100644 --- a/retroshare-gui/src/gui/Posted/PostedItem.cpp +++ b/retroshare-gui/src/gui/Posted/PostedItem.cpp @@ -705,9 +705,9 @@ void PostedItem::setReadStatus(bool isNew, bool isUnread) //ui->newLabel->setVisible(isNew); - ui->mainFrame->setProperty("new", isNew); - ui->mainFrame->style()->unpolish(ui->mainFrame); - ui->mainFrame->style()->polish( ui->mainFrame); + ui->feedFrame->setProperty("new", isNew); + ui->feedFrame->style()->unpolish(ui->feedFrame); + ui->feedFrame->style()->polish( ui->feedFrame); } diff --git a/retroshare-gui/src/gui/Posted/PostedItem.ui b/retroshare-gui/src/gui/Posted/PostedItem.ui index f16c7b100..fc316a632 100644 --- a/retroshare-gui/src/gui/Posted/PostedItem.ui +++ b/retroshare-gui/src/gui/Posted/PostedItem.ui @@ -33,7 +33,7 @@ 0 - + 0 @@ -49,7 +49,7 @@ QFrame::Sunken - + 0 @@ -125,7 +125,12 @@ - + + + + 14 + + 0 @@ -248,7 +253,7 @@ 6 - + 0 @@ -257,7 +262,9 @@ + 11 75 + true true @@ -327,6 +334,7 @@ + 11 75 true true @@ -718,15 +726,10 @@
- - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
ElidedLabel QLabel -
gui/common/ElidedLabel.h
+
gui/common/ElidedLabel.h
1
@@ -741,9 +744,9 @@
- + diff --git a/retroshare-gui/src/gui/Posted/PostedListWidget.cpp b/retroshare-gui/src/gui/Posted/PostedListWidget.cpp index a88a1d6b5..c5f95aa24 100644 --- a/retroshare-gui/src/gui/Posted/PostedListWidget.cpp +++ b/retroshare-gui/src/gui/Posted/PostedListWidget.cpp @@ -102,7 +102,7 @@ PostedListWidget::PostedListWidget(const RsGxsGroupId &postedId, QWidget *parent available posts from your subscribed friends, and make the \ links visible to all other friends.

Afterwards you can unsubscribe from the context menu of the links list at left.

")); - ui->infoframe->hide(); + ui->infoFrame->hide(); /* load settings */ processSettings(true); @@ -417,7 +417,7 @@ void PostedListWidget::insertPostedDetails(const RsPostedGroup &group) if (IS_GROUP_SUBSCRIBED(group.mMeta.mSubscribeFlags)) { - ui->infoframe->hide(); + ui->infoFrame->hide(); } else { @@ -472,7 +472,7 @@ void PostedListWidget::insertPostedDetails(const RsPostedGroup &group) ui->infoDistribution->setText(distrib_string); - ui->infoframe->show(); + ui->infoFrame->show(); } } @@ -771,7 +771,7 @@ void PostedListWidget::applyRanking() void PostedListWidget::blank() { clearPosts(); - ui->infoframe->hide(); + ui->infoFrame->hide(); } void PostedListWidget::clearPosts() { diff --git a/retroshare-gui/src/gui/Posted/PostedListWidget.ui b/retroshare-gui/src/gui/Posted/PostedListWidget.ui index f59ee76ee..22f1761ca 100644 --- a/retroshare-gui/src/gui/Posted/PostedListWidget.ui +++ b/retroshare-gui/src/gui/Posted/PostedListWidget.ui @@ -30,7 +30,7 @@ 0 - + QFrame::Box @@ -106,7 +106,7 @@ - + <html><head/><body><p><span style=" font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'; font-size:14pt; color:#24292e; background-color:#ffffff;">Select sorting</span></p></body></html> @@ -260,7 +260,7 @@ - + QFrame::StyledPanel @@ -323,7 +323,7 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Description</span></p></body></html> @@ -515,7 +515,10 @@ p, li { white-space: pre-wrap; } - 14 + 11 + 75 + true + true @@ -658,16 +661,21 @@ p, li { white-space: pre-wrap; } QLabel
gui/gxs/GxsIdLabel.h
- - SubscribeToolButton - QToolButton -
gui/common/SubscribeToolButton.h
-
GxsIdChooser QComboBox
gui/gxs/GxsIdChooser.h
+ + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+ + SubscribeToolButton + QToolButton +
gui/common/SubscribeToolButton.h
+
diff --git a/retroshare-gui/src/gui/Posted/PostedListWidgetWithModel.cpp b/retroshare-gui/src/gui/Posted/PostedListWidgetWithModel.cpp index 8ff178af6..087eebe3c 100644 --- a/retroshare-gui/src/gui/Posted/PostedListWidgetWithModel.cpp +++ b/retroshare-gui/src/gui/Posted/PostedListWidgetWithModel.cpp @@ -923,7 +923,7 @@ void PostedListWidgetWithModel::insertBoardDetails(const RsPostedGroup& group) formatDescription = RsHtml().formatText(NULL, formatDescription, formatFlag); - ui->infoDescription->setText(formatDescription); + ui->trans_Description->setText(formatDescription); ui->infoAdministrator->setId(group.mMeta.mAuthorId) ; link = RetroShareLink::createMessage(group.mMeta.mAuthorId, ""); diff --git a/retroshare-gui/src/gui/Posted/PostedListWidgetWithModel.ui b/retroshare-gui/src/gui/Posted/PostedListWidgetWithModel.ui index ccba99f67..0433fe838 100644 --- a/retroshare-gui/src/gui/Posted/PostedListWidgetWithModel.ui +++ b/retroshare-gui/src/gui/Posted/PostedListWidgetWithModel.ui @@ -46,7 +46,7 @@
- + @@ -54,7 +54,7 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Description</span></p></body></html>
@@ -271,9 +271,10 @@ p, li { white-space: pre-wrap; } - 50 + 15 + 75 false - false + true @@ -300,7 +301,7 @@ p, li { white-space: pre-wrap; }
- + 0 @@ -309,7 +310,9 @@ p, li { white-space: pre-wrap; } + 11 75 + true true @@ -344,7 +347,7 @@ p, li { white-space: pre-wrap; } - + QFrame::Box @@ -372,6 +375,12 @@ p, li { white-space: pre-wrap; } 0 + + + 75 + true + + Create Post @@ -394,7 +403,13 @@ p, li { white-space: pre-wrap; } - + + + + 75 + true + + <html><head/><body><p><span style=" font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'; font-size:14pt; color:#24292e; background-color:#ffffff;">Select sorting</span></p></body></html> @@ -572,14 +587,15 @@ p, li { white-space: pre-wrap; } - LineEditClear - QLineEdit -
gui/common/LineEditClear.h
+ ElidedLabel + QLabel +
gui/common/ElidedLabel.h
+ 1
- SubscribeToolButton - QToolButton -
gui/common/SubscribeToolButton.h
+ GxsIdChooser + QComboBox +
gui/gxs/GxsIdChooser.h
GxsIdLabel @@ -587,15 +603,14 @@ p, li { white-space: pre-wrap; }
gui/gxs/GxsIdLabel.h
- RSTreeView - QTreeView -
gui/common/RSTreeView.h
- 1 + LineEditClear + QLineEdit +
gui/common/LineEditClear.h
- StyledElidedLabel - QLabel -
gui/common/StyledElidedLabel.h
+ RSComboBox + QComboBox +
gui/common/RSComboBox.h
RSTabWidget @@ -604,9 +619,15 @@ p, li { white-space: pre-wrap; } 1 - GxsIdChooser - QComboBox -
gui/gxs/GxsIdChooser.h
+ RSTreeView + QTreeView +
gui/common/RSTreeView.h
+ 1 +
+ + SubscribeToolButton + QToolButton +
gui/common/SubscribeToolButton.h
diff --git a/retroshare-gui/src/gui/QuickStartWizard.cpp b/retroshare-gui/src/gui/QuickStartWizard.cpp index f442d2f1b..200e75948 100644 --- a/retroshare-gui/src/gui/QuickStartWizard.cpp +++ b/retroshare-gui/src/gui/QuickStartWizard.cpp @@ -20,20 +20,23 @@ #include "QuickStartWizard.h" -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include +#include "gui/common/FilesDefs.h" +#ifdef USE_COMBOBOX +#include "gui/common/RSComboBox.h" +#endif #include "settings/rsharesettings.h" #include "util/QtVersion.h" -#include "gui/common/FilesDefs.h" + +#include "retroshare/rsfiles.h" +#include "retroshare/rsconfig.h" +#include "retroshare/rspeers.h" +#include "retroshare/rstypes.h" + +#include +#include +#include +#include +#include QuickStartWizard::QuickStartWizard(QWidget *parent) : QDialog(parent) @@ -53,7 +56,7 @@ QuickStartWizard::QuickStartWizard(QWidget *parent) : // ui.checkBoxF2FRouting->setChecked(true) ; // ui.checkBoxF2FRouting->setEnabled(false) ; - connect( ui.netModeComboBox, SIGNAL( activated ( int ) ), this, SLOT( toggleUPnP( ) ) ); + connect( ui.netModeComboBox, SIGNAL( activated(int) ), this, SLOT( toggleUPnP() ) ); // connect( ui.checkBoxTunnelConnection, SIGNAL( toggled( bool ) ), this, SLOT( toggleTunnelConnection(bool) ) ); // bool b = rsPeers->getAllowTunnelConnection() ; @@ -299,7 +302,7 @@ void QuickStartWizard::loadShare() listWidget->insertRow(row) ; listWidget->setItem(row,0,new QTableWidgetItem(QString::fromStdString((*it).filename))); #ifdef USE_COMBOBOX - QComboBox *cb = new QComboBox ; + RSComboBox *cb = new RSComboBox ; cb->addItem(tr("Network Wide")) ; cb->addItem(tr("Browsable")) ; cb->addItem(tr("Universal")) ; @@ -494,7 +497,6 @@ void QuickStartWizard::loadNetwork() void QuickStartWizard::saveChanges() { - QString str; //bool saveAddr = false; diff --git a/retroshare-gui/src/gui/QuickStartWizard.ui b/retroshare-gui/src/gui/QuickStartWizard.ui index ede111c52..fc8832637 100644 --- a/retroshare-gui/src/gui/QuickStartWizard.ui +++ b/retroshare-gui/src/gui/QuickStartWizard.ui @@ -334,7 +334,7 @@ p, li { white-space: pre-wrap; }
- + Automatic (UPnP) @@ -360,7 +360,7 @@ p, li { white-space: pre-wrap; } - + Public: DHT & Discovery @@ -1072,6 +1072,11 @@ p, li { white-space: pre-wrap; }
gui/common/HeaderFrame.h
1 + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
diff --git a/retroshare-gui/src/gui/ServicePermissionDialog.ui b/retroshare-gui/src/gui/ServicePermissionDialog.ui index 0acd51c75..7354fe9ae 100644 --- a/retroshare-gui/src/gui/ServicePermissionDialog.ui +++ b/retroshare-gui/src/gui/ServicePermissionDialog.ui @@ -16,8 +16,17 @@ true - - + + + 0 + + + 0 + + + 0 + + 0 @@ -37,14 +46,14 @@
- + QFrame::StyledPanel QFrame::Raised - + @@ -69,7 +78,7 @@ - frame + gradFrame headerFrame diff --git a/retroshare-gui/src/gui/ShareManager.cpp b/retroshare-gui/src/gui/ShareManager.cpp index 8f4e32542..6681e30c5 100644 --- a/retroshare-gui/src/gui/ShareManager.cpp +++ b/retroshare-gui/src/gui/ShareManager.cpp @@ -66,7 +66,7 @@ ShareManager::ShareManager() Settings->loadWidgetInformation(this); connect(ui.addButton, SIGNAL(clicked( bool ) ), this , SLOT( addShare() ) ); - connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(applyAndClose())); + connect(ui.applyButton, SIGNAL(clicked()), this, SLOT(applyAndClose())); connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(cancel())); connect(ui.shareddirList, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(shareddirListCustomPopupMenu(QPoint))); diff --git a/retroshare-gui/src/gui/ShareManager.ui b/retroshare-gui/src/gui/ShareManager.ui index e20074f9a..2799737c9 100644 --- a/retroshare-gui/src/gui/ShareManager.ui +++ b/retroshare-gui/src/gui/ShareManager.ui @@ -17,7 +17,7 @@ :/images/logo/logo_16.png:/images/logo/logo_16.png - + 0 @@ -47,14 +47,14 @@ - + QFrame::NoFrame QFrame::Raised - + 6 @@ -63,10 +63,7 @@ Shared Folder Manager - - - 2 - + @@ -97,7 +94,7 @@ false - 22 + 43 @@ -132,17 +129,12 @@ - - - 0 - 0 - - - - - 200 - 200 - + + + 12 + 75 + true + Add a Share Directory @@ -150,16 +142,10 @@ Add new - - - 24 - 24 - - - + Qt::Horizontal @@ -172,7 +158,14 @@ - + + + + 12 + 75 + true + + Apply and close @@ -186,10 +179,19 @@ - + + + + + 0 + 0 + 0 + + + @@ -210,6 +212,15 @@ + + + + 0 + 0 + 0 + + + @@ -230,6 +241,15 @@ + + + + 154 + 154 + 154 + + + @@ -251,6 +271,11 @@ + + + 12 + + true @@ -274,11 +299,6 @@ - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
HeaderFrame QFrame diff --git a/retroshare-gui/src/gui/StartDialog.ui b/retroshare-gui/src/gui/StartDialog.ui index a49d51e9b..8c491caeb 100644 --- a/retroshare-gui/src/gui/StartDialog.ui +++ b/retroshare-gui/src/gui/StartDialog.ui @@ -252,7 +252,7 @@
- + @@ -298,6 +298,8 @@ 12 + 75 + true @@ -355,16 +357,21 @@ p, li { white-space: pre-wrap; }
- - - - - LineEditClear QLineEdit
gui/common/LineEditClear.h
+ + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+ + + + + diff --git a/retroshare-gui/src/gui/TheWire/PulseAddDialog.cpp b/retroshare-gui/src/gui/TheWire/PulseAddDialog.cpp index ee9c562a2..15fe997a6 100644 --- a/retroshare-gui/src/gui/TheWire/PulseAddDialog.cpp +++ b/retroshare-gui/src/gui/TheWire/PulseAddDialog.cpp @@ -35,7 +35,7 @@ PulseAddDialog::PulseAddDialog(QWidget *parent) { ui.setupUi(this); - connect(ui.pushButton_Post, SIGNAL( clicked( void ) ), this, SLOT( postPulse( void ) ) ); + connect(ui.postButton, SIGNAL( clicked( void ) ), this, SLOT( postPulse( void ) ) ); connect(ui.pushButton_AddURL, SIGNAL( clicked( void ) ), this, SLOT( addURL( void ) ) ); connect(ui.pushButton_ClearDisplayAs, SIGNAL( clicked( void ) ), this, SLOT( clearDisplayAs( void ) ) ); connect(ui.pushButton_Cancel, SIGNAL( clicked( void ) ), this, SLOT( cancelPulse( void ) ) ); @@ -98,10 +98,9 @@ void PulseAddDialog::cleanup() QLayout *layout = ui.widget_replyto->layout(); // completely delete layout and sublayouts QLayoutItem * item; - QWidget * widget; while ((item = layout->takeAt(0))) { - if ((widget = item->widget()) != 0) + if (QWidget *widget = item->widget()) { std::cerr << "PulseAddDialog::cleanup() removing widget"; std::cerr << std::endl; @@ -129,8 +128,8 @@ void PulseAddDialog::cleanup() ui.frame_URL->setEnabled(false); ui.frame_URL->hide(); - ui.pushButton_Post->setEnabled(false); - ui.pushButton_Post->setText(tr("Post")); + ui.postButton->setEnabled(false); + ui.postButton->setText(tr("Post")); ui.textEdit_Pulse->setPlaceholderText(tr("Whats happening?")); ui.frame_input->setVisible(true); ui.widget_sentiment->setVisible(true); @@ -163,12 +162,12 @@ void PulseAddDialog::pulseTextChanged() { std::string pulseText = ui.textEdit_Pulse->toPlainText().toStdString(); bool enable = (pulseText.size() > 0) && (pulseText.size() < PULSE_MAX_SIZE); - ui.pushButton_Post->setEnabled(enable); + ui.postButton->setEnabled(enable); } // Old Interface, deprecate / make internal. // TODO: Convert mReplyToPulse to be an SPtr, and remove &pulse parameter. -void PulseAddDialog::setReplyTo(RsWirePulse &pulse, RsWirePulseSPtr pPulse, std::string &groupName, uint32_t replyType) +void PulseAddDialog::setReplyTo(const RsWirePulse &pulse, RsWirePulseSPtr pPulse, std::string &/*groupName*/, uint32_t replyType) { mIsReply = true; mReplyToPulse = pulse; @@ -191,21 +190,21 @@ void PulseAddDialog::setReplyTo(RsWirePulse &pulse, RsWirePulseSPtr pPulse, std: if (mReplyType & WIRE_PULSE_TYPE_REPLY) { - ui.pushButton_Post->setText(tr("Reply to Pulse")); + ui.postButton->setText(tr("Reply to Pulse")); ui.textEdit_Pulse->setPlaceholderText(tr("Pulse your reply")); } else { // cannot add msg for like / republish. - ui.pushButton_Post->setEnabled(true); + ui.postButton->setEnabled(true); ui.frame_input->setVisible(false); ui.widget_sentiment->setVisible(false); if (mReplyType & WIRE_PULSE_TYPE_REPUBLISH) { - ui.pushButton_Post->setText(tr("Republish Pulse")); + ui.postButton->setText(tr("Republish Pulse")); ui.pushButton_picture->hide(); } else if (mReplyType & WIRE_PULSE_TYPE_LIKE) { - ui.pushButton_Post->setText(tr("Like Pulse")); + ui.postButton->setText(tr("Like Pulse")); ui.pushButton_picture->hide(); } } diff --git a/retroshare-gui/src/gui/TheWire/PulseAddDialog.h b/retroshare-gui/src/gui/TheWire/PulseAddDialog.h index ab386df2e..258efb736 100644 --- a/retroshare-gui/src/gui/TheWire/PulseAddDialog.h +++ b/retroshare-gui/src/gui/TheWire/PulseAddDialog.h @@ -57,7 +57,7 @@ private slots: private: // OLD VERSIONs, private now. void setGroup(RsWireGroup &group); - void setReplyTo(RsWirePulse &pulse, RsWirePulseSPtr pPulse, std::string &groupName, uint32_t replyType); + void setReplyTo(const RsWirePulse &pulse, RsWirePulseSPtr pPulse, std::string &groupName, uint32_t replyType); void postOriginalPulse(); void postReplyPulse(); diff --git a/retroshare-gui/src/gui/TheWire/PulseAddDialog.ui b/retroshare-gui/src/gui/TheWire/PulseAddDialog.ui index 1b8fb24cc..940d8f895 100644 --- a/retroshare-gui/src/gui/TheWire/PulseAddDialog.ui +++ b/retroshare-gui/src/gui/TheWire/PulseAddDialog.ui @@ -13,7 +13,7 @@ - + 0 @@ -21,7 +21,7 @@ 6 - + 0 @@ -34,18 +34,12 @@ 16777215 - - QFrame::StyledPanel - - - QFrame::Raised - - + 0 - + 100 @@ -72,7 +66,7 @@ - + Qt::Horizontal @@ -86,6 +80,11 @@ + + + 12 + + GroupLabel @@ -118,13 +117,7 @@ - - QFrame::StyledPanel - - - QFrame::Raised - - + 0 @@ -142,7 +135,7 @@ - + 20 @@ -175,7 +168,7 @@ - + Qt::Horizontal @@ -188,14 +181,14 @@ - + Response Sentiment: - + 0 @@ -238,13 +231,7 @@ - - QFrame::StyledPanel - - - QFrame::Raised - - + 0 @@ -275,7 +262,7 @@ QFrame::Raised - + @@ -345,9 +332,9 @@ - + - + URL @@ -364,7 +351,7 @@ - + Display As @@ -387,7 +374,7 @@ - + 6 @@ -408,7 +395,7 @@ - + Qt::Horizontal @@ -421,7 +408,14 @@ - + + + + 12 + 75 + true + + Post @@ -444,9 +438,12 @@ QLabel
gui/gxs/GxsIdLabel.h
+ + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
- - - + diff --git a/retroshare-gui/src/gui/TheWire/PulseReply.cpp b/retroshare-gui/src/gui/TheWire/PulseReply.cpp index 92dccabf5..5067b5f9b 100644 --- a/retroshare-gui/src/gui/TheWire/PulseReply.cpp +++ b/retroshare-gui/src/gui/TheWire/PulseReply.cpp @@ -50,7 +50,7 @@ void PulseReply::setup() // connect(pushButton_tmpViewGroup, SIGNAL(clicked()), this, SLOT(actionViewGroup())); // connect(pushButton_tmpViewParent, SIGNAL(clicked()), this, SLOT(actionViewParent())); - connect(toolButton_follow, SIGNAL(clicked()), this, SLOT(actionFollow())); + connect(followButton, SIGNAL(clicked()), this, SLOT(actionFollow())); // connect(toolButton_rate, SIGNAL(clicked()), this, SLOT(rate())); connect(toolButton_reply, SIGNAL(clicked()), this, SLOT(actionReply())); @@ -118,7 +118,7 @@ void PulseReply::setPulseStatus(PulseStatus status) { widget_actions->setVisible(status == PulseStatus::FULL); widget_follow->setVisible(status != PulseStatus::FULL); - toolButton_follow->setEnabled(status == PulseStatus::UNSUBSCRIBED); + followButton->setEnabled(status == PulseStatus::UNSUBSCRIBED); switch(status) { diff --git a/retroshare-gui/src/gui/TheWire/PulseReply.ui b/retroshare-gui/src/gui/TheWire/PulseReply.ui index 1ffbbdf85..3af469f63 100644 --- a/retroshare-gui/src/gui/TheWire/PulseReply.ui +++ b/retroshare-gui/src/gui/TheWire/PulseReply.ui @@ -26,7 +26,7 @@ - + 0 @@ -48,7 +48,7 @@ QFrame::Raised - + 0 @@ -380,7 +380,14 @@ - + + + + 12 + 75 + true + + FOLLOW diff --git a/retroshare-gui/src/gui/TheWire/PulseTopLevel.cpp b/retroshare-gui/src/gui/TheWire/PulseTopLevel.cpp index e8c830a0b..0948e745b 100644 --- a/retroshare-gui/src/gui/TheWire/PulseTopLevel.cpp +++ b/retroshare-gui/src/gui/TheWire/PulseTopLevel.cpp @@ -48,7 +48,7 @@ void PulseTopLevel::setup() { connect(toolButton_viewGroup, SIGNAL(clicked()), this, SLOT(actionViewGroup())); connect(toolButton_viewParent, SIGNAL(clicked()), this, SLOT(actionViewParent())); - connect(toolButton_follow, SIGNAL(clicked()), this, SLOT(actionFollow())); + connect(followButton, SIGNAL(clicked()), this, SLOT(actionFollow())); connect(toolButton_followParent, SIGNAL(clicked()), this, SLOT(actionFollowParent())); // connect(toolButton_rate, SIGNAL(clicked()), this, SLOT(rate())); @@ -58,7 +58,7 @@ void PulseTopLevel::setup() connect(toolButton_view, SIGNAL(clicked()), this, SLOT(actionViewPulse())); } -void PulseTopLevel::setRefMessage(QString msg, uint32_t image_count) +void PulseTopLevel::setRefMessage(QString /*msg*/, uint32_t /*image_count*/) { // This should never happen. //widget_message->setRefMessage(msg, image_count); @@ -149,7 +149,7 @@ void PulseTopLevel::setReferenceString(QString ref) } } -void PulseTopLevel::mousePressEvent(QMouseEvent *event) +void PulseTopLevel::mousePressEvent(QMouseEvent */*event*/) { } diff --git a/retroshare-gui/src/gui/TheWire/PulseTopLevel.ui b/retroshare-gui/src/gui/TheWire/PulseTopLevel.ui index 35f763948..077b72473 100644 --- a/retroshare-gui/src/gui/TheWire/PulseTopLevel.ui +++ b/retroshare-gui/src/gui/TheWire/PulseTopLevel.ui @@ -24,9 +24,9 @@ - + - + 0 @@ -48,7 +48,7 @@ QFrame::Raised - + @@ -63,7 +63,7 @@ 40 - + 0 @@ -77,7 +77,7 @@ 0 - + Qt::Horizontal @@ -171,7 +171,7 @@ - + Qt::Horizontal @@ -200,9 +200,9 @@ 60 - + - + Qt::Vertical @@ -256,7 +256,7 @@ - + Qt::Horizontal @@ -336,7 +336,7 @@ 16777215 - + @@ -345,7 +345,7 @@ - + Qt::Horizontal @@ -361,7 +361,7 @@
- + Qt::Horizontal @@ -381,9 +381,9 @@ 40 - + - + @@ -392,14 +392,14 @@ - + <html><head/><body><p><span style=" color:#2e3436;">Replies</span></p></body></html> - + Qt::Horizontal @@ -417,7 +417,7 @@ - + @@ -426,14 +426,14 @@ - + <html><head/><body><p><span style=" color:#2e3436;">Republishes</span></p></body></html> - + Qt::Horizontal @@ -451,7 +451,7 @@ - + @@ -460,14 +460,14 @@ - + <html><head/><body><p><span style=" color:#2e3436;">Likes</span></p></body></html> - + Qt::Horizontal @@ -485,7 +485,7 @@ - + Qt::Horizontal @@ -501,7 +501,7 @@ - + Qt::Horizontal @@ -521,11 +521,11 @@ 40 - + - + - + Qt::Horizontal @@ -562,7 +562,7 @@ - + Qt::Horizontal @@ -577,9 +577,9 @@
- + - + Qt::Horizontal @@ -616,7 +616,7 @@
- + Qt::Horizontal @@ -631,9 +631,9 @@
- + - + Qt::Horizontal @@ -670,7 +670,7 @@ - + Qt::Horizontal @@ -685,9 +685,9 @@ - + - + Qt::Horizontal @@ -717,7 +717,7 @@ - + Qt::Horizontal @@ -748,9 +748,9 @@ 40 - + - + Qt::Horizontal @@ -763,7 +763,14 @@ - + + + + 12 + 75 + true + + FOLLOW @@ -773,7 +780,7 @@ - + Qt::Horizontal diff --git a/retroshare-gui/src/gui/TheWire/PulseViewGroup.cpp b/retroshare-gui/src/gui/TheWire/PulseViewGroup.cpp index 547fabbab..8707eaf8c 100644 --- a/retroshare-gui/src/gui/TheWire/PulseViewGroup.cpp +++ b/retroshare-gui/src/gui/TheWire/PulseViewGroup.cpp @@ -42,7 +42,7 @@ PulseViewGroup::PulseViewGroup(PulseViewHolder *holder, RsWireGroupSPtr group) void PulseViewGroup::setup() { if (mGroup) { - connect(toolButton_follow, SIGNAL(clicked()), this, SLOT(actionFollow())); + connect(followButton, SIGNAL(clicked()), this, SLOT(actionFollow())); label_groupName->setText("@" + QString::fromStdString(mGroup->mMeta.mGroupName)); label_authorName->setText(BoldString(QString::fromStdString(mGroup->mMeta.mAuthorId.toStdString()))); diff --git a/retroshare-gui/src/gui/TheWire/PulseViewGroup.ui b/retroshare-gui/src/gui/TheWire/PulseViewGroup.ui index 41a2bf23a..77329e3c2 100644 --- a/retroshare-gui/src/gui/TheWire/PulseViewGroup.ui +++ b/retroshare-gui/src/gui/TheWire/PulseViewGroup.ui @@ -24,9 +24,9 @@ - + - + 0 @@ -48,12 +48,12 @@ QFrame::Raised - + - + - + Qt::Horizontal @@ -85,7 +85,7 @@ - + Qt::Horizontal @@ -114,9 +114,9 @@ 60 - + - + Qt::Horizontal @@ -167,7 +167,7 @@ - + Qt::Vertical @@ -205,7 +205,7 @@ 16777215 - + @@ -226,7 +226,7 @@ - + Qt::Horizontal @@ -261,7 +261,7 @@ - + Qt::Horizontal @@ -296,7 +296,7 @@ - + Qt::Horizontal @@ -316,9 +316,9 @@ 40 - + - + @@ -327,14 +327,14 @@ - + <html><head/><body><p><span style=" color:#2e3436;">Pulses</span></p></body></html> - + Qt::Horizontal @@ -352,7 +352,7 @@ - + @@ -361,14 +361,14 @@ - + <html><head/><body><p><span style=" color:#2e3436;">Replies</span></p></body></html> - + Qt::Horizontal @@ -386,7 +386,7 @@ - + @@ -395,14 +395,14 @@ - + <html><head/><body><p><span style=" color:#2e3436;">Republishes</span></p></body></html> - + Qt::Horizontal @@ -420,7 +420,7 @@ - + @@ -429,14 +429,14 @@ - + <html><head/><body><p><span style=" color:#2e3436;">Likes</span></p></body></html> - + Qt::Horizontal @@ -454,7 +454,7 @@ - + Qt::Horizontal @@ -470,7 +470,7 @@ - + Qt::Horizontal @@ -490,9 +490,9 @@ 40 - + - + Qt::Horizontal @@ -505,7 +505,14 @@ - + + + + 12 + 75 + true + + FOLLOW @@ -515,7 +522,7 @@ - + Qt::Horizontal @@ -535,8 +542,6 @@ - - - + diff --git a/retroshare-gui/src/gui/TheWire/WireDialog.cpp b/retroshare-gui/src/gui/TheWire/WireDialog.cpp index ed2ee5edd..23031d6ec 100644 --- a/retroshare-gui/src/gui/TheWire/WireDialog.cpp +++ b/retroshare-gui/src/gui/TheWire/WireDialog.cpp @@ -57,14 +57,12 @@ /** Constructor */ WireDialog::WireDialog(QWidget *parent) -: MainPage(parent), mGroupSet(GROUP_SET_ALL) + : MainPage(parent), mGroupSet(GROUP_SET_ALL) + , mAddDialog(nullptr), mGroupSelected(nullptr), mWireQueue(nullptr) + , mHistoryIndex(-1) { ui.setupUi(this); - mAddDialog = NULL; - mGroupSelected = NULL; - mHistoryIndex = -1; - connect( ui.toolButton_createAccount, SIGNAL(clicked()), this, SLOT(createGroup())); connect( ui.toolButton_createPulse, SIGNAL(clicked()), this, SLOT(createPulse())); connect( ui.toolButton_refresh, SIGNAL(clicked()), this, SLOT(refreshGroups())); @@ -98,6 +96,7 @@ WireDialog::~WireDialog() // save settings processSettings(false); + clearTwitterView(); delete(mWireQueue); } @@ -127,7 +126,7 @@ void WireDialog::refreshGroups() void WireDialog::addGroup(QWidget *item) { - QLayout *alayout = ui.scrollAreaWidgetContents_groups->layout(); + QLayout *alayout = ui.groupsWidget->layout(); alayout->addWidget(item); } @@ -268,7 +267,7 @@ void WireDialog::deleteGroups() mGroupSelected = NULL; - QLayout *alayout = ui.scrollAreaWidgetContents_groups->layout(); + QLayout *alayout = ui.groupsWidget->layout(); QLayoutItem *item; int i = 0; while (i < alayout->count()) @@ -300,17 +299,16 @@ void WireDialog::updateGroups(std::vector& groups) mOwnGroups.clear(); ui.groupChooser->clear(); - std::vector::const_iterator it; - for(it = groups.begin(); it != groups.end(); it++) { + for(auto &it : groups) { // save list of all groups. - mAllGroups[it->mMeta.mGroupId] = *it; + mAllGroups[it.mMeta.mGroupId] = it; - if (it->mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN) + if (it.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN) { // grab own groups. // setup Chooser too. - mOwnGroups.push_back(*it); - ui.groupChooser->addItem(QString::fromStdString(it->mMeta.mGroupName)); + mOwnGroups.push_back(it); + ui.groupChooser->addItem(QString::fromStdString(it.mMeta.mGroupName)); } } } @@ -362,16 +360,15 @@ void WireDialog::showGroups() std::list allGroupIds; /* depends on the comboBox */ - std::map::const_iterator it; - for (it = mAllGroups.begin(); it != mAllGroups.end(); it++) + for (auto &it : mAllGroups) { bool add = (mGroupSet == GROUP_SET_ALL); - if (it->second.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN) { + if (it.second.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN) { if (mGroupSet == GROUP_SET_OWN) { add = true; } } - else if (it->second.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_SUBSCRIBED) { + else if (it.second.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_SUBSCRIBED) { if (mGroupSet == GROUP_SET_SUBSCRIBED) { add = true; } @@ -383,11 +380,11 @@ void WireDialog::showGroups() } if (add) { - addGroup(it->second); + addGroup(it.second); // request data. std::list grpIds; - grpIds.push_back(it->second.mMeta.mGroupId); - allGroupIds.push_back(it->second.mMeta.mGroupId); + grpIds.push_back(it.second.mMeta.mGroupId); + allGroupIds.push_back(it.second.mMeta.mGroupId); } } @@ -790,20 +787,21 @@ void WireDialog::showPulseFocus(const RsGxsGroupId groupId, const RsGxsMessageId // fetch data from backend. RsWirePulseSPtr pPulse; int type = 0; - bool success = rsWire->getPulseFocus(groupId, msgId, type, pPulse); - - // sleep(2); - - /* now insert the pulse + children into the layput */ - RsQThreadUtils::postToObject([pPulse,this]() + if(rsWire->getPulseFocus(groupId, msgId, type, pPulse)) { - /* Here it goes any code you want to be executed on the Qt Gui + // sleep(2); + + /* now insert the pulse + children into the layput */ + RsQThreadUtils::postToObject([pPulse,this]() + { + /* Here it goes any code you want to be executed on the Qt Gui * thread, for example to update the data model with new information * after a blocking call to RetroShare API complete */ - postPulseFocus(pPulse); + postPulseFocus(pPulse); - }, this); + }, this); + } }); } @@ -822,10 +820,9 @@ void WireDialog::postPulseFocus(RsWirePulseSPtr pPulse) addTwitterView(new PulseTopLevel(this, pPulse)); - std::list::iterator it; - for(it = pPulse->mReplies.begin(); it != pPulse->mReplies.end(); it++) + for(auto &it : pPulse->mReplies) { - RsWirePulseSPtr reply = *it; + RsWirePulseSPtr reply = it; PulseReply *firstReply = new PulseReply(this, reply); addTwitterView(firstReply); @@ -857,9 +854,9 @@ void WireDialog::postPulseFocus(RsWirePulseSPtr pPulse) addTwitterView(new PulseReplySeperator()); } - for(it = pPulse->mRepublishes.begin(); it != pPulse->mRepublishes.end(); it++) + for(auto &it : pPulse->mRepublishes) { - RsWirePulseSPtr repub = *it; + RsWirePulseSPtr repub = it; PulseReply *firstRepub = new PulseReply(this, repub); firstRepub->showReplyLine(false); @@ -928,10 +925,9 @@ void WireDialog::postGroupFocus(RsWireGroupSPtr group, std::list::iterator it; - for(it = pulses.begin(); it != pulses.end(); it++) + for(auto &it : pulses) { - RsWirePulseSPtr reply = *it; + RsWirePulseSPtr reply = it; // don't show likes if (reply->mPulseType & WIRE_PULSE_TYPE_LIKE) { @@ -949,7 +945,7 @@ void WireDialog::postGroupFocus(RsWireGroupSPtr group, std::list groupIds) +void WireDialog::requestGroupsPulses(const std::list& groupIds) { WireViewHistory view; view.viewType = WireViewType::GROUPS; @@ -959,7 +955,7 @@ void WireDialog::requestGroupsPulses(const std::list groupIds) showGroupsPulses(groupIds); } -void WireDialog::showGroupsPulses(const std::list groupIds) +void WireDialog::showGroupsPulses(const std::list& groupIds) { clearTwitterView(); @@ -968,20 +964,21 @@ void WireDialog::showGroupsPulses(const std::list groupIds) { // fetch data from backend. std::list pulses; - bool success = rsWire->getPulsesForGroups(groupIds, pulses); - - // sleep(2); - - /* now insert the pulse + children into the layput */ - RsQThreadUtils::postToObject([pulses,this]() + if(rsWire->getPulsesForGroups(groupIds, pulses)) { - /* Here it goes any code you want to be executed on the Qt Gui + // sleep(2); + + /* now insert the pulse + children into the layput */ + RsQThreadUtils::postToObject([pulses,this]() + { + /* Here it goes any code you want to be executed on the Qt Gui * thread, for example to update the data model with new information * after a blocking call to RetroShare API complete */ - postGroupsPulses(pulses); + postGroupsPulses(pulses); - }, this); + }, this); + } }); } @@ -992,10 +989,9 @@ void WireDialog::postGroupsPulses(std::list pulses) ui.label_viewMode->setText("Groups Pulses"); - std::list::iterator it; - for(it = pulses.begin(); it != pulses.end(); it++) + for(auto &it : pulses) { - RsWirePulseSPtr reply = *it; + RsWirePulseSPtr reply = it; // don't show likes if (reply->mPulseType & WIRE_PULSE_TYPE_LIKE) { std::cerr << "WireDialog::postGroupsPulses() Not showing LIKE"; diff --git a/retroshare-gui/src/gui/TheWire/WireDialog.h b/retroshare-gui/src/gui/TheWire/WireDialog.h index 100cedeec..8ccf13377 100644 --- a/retroshare-gui/src/gui/TheWire/WireDialog.h +++ b/retroshare-gui/src/gui/TheWire/WireDialog.h @@ -76,9 +76,9 @@ public: WireDialog(QWidget *parent = 0); ~WireDialog(); - virtual QIcon iconPixmap() const { return QIcon(IMAGE_WIRE) ; } - virtual QString pageName() const { return tr("The Wire") ; } - virtual QString helpText() const { return ""; } + virtual QIcon iconPixmap() const override { return QIcon(IMAGE_WIRE) ; } + virtual QString pageName() const override { return tr("The Wire") ; } + virtual QString helpText() const override { return ""; } // WireGroupHolder interface. virtual void subscribe(RsGxsGroupId &groupId) override; @@ -114,8 +114,8 @@ public: void showGroupFocus(const RsGxsGroupId groupId); void postGroupFocus(RsWireGroupSPtr group, std::list pulses); - void requestGroupsPulses(const std::list groupIds); - void showGroupsPulses(const std::list groupIds); + void requestGroupsPulses(const std::list& groupIds); + void showGroupsPulses(const std::list& groupIds); void postGroupsPulses(std::list pulses); private slots: @@ -153,7 +153,7 @@ private: bool loadGroupData(const uint32_t &token); void acknowledgeGroup(const uint32_t &token, const uint32_t &userType); - virtual void loadRequest(const TokenQueue *queue, const TokenRequest &req); + virtual void loadRequest(const TokenQueue *queue, const TokenRequest &req) override; int mGroupSet; diff --git a/retroshare-gui/src/gui/TheWire/WireDialog.ui b/retroshare-gui/src/gui/TheWire/WireDialog.ui index 2aeefe92f..23eb87a78 100644 --- a/retroshare-gui/src/gui/TheWire/WireDialog.ui +++ b/retroshare-gui/src/gui/TheWire/WireDialog.ui @@ -6,7 +6,7 @@ 0 0 - 804 + 809 586 @@ -33,7 +33,7 @@ 0 - + 0 @@ -46,7 +46,7 @@ QFrame::Plain - + 0 @@ -108,7 +108,7 @@ - + @@ -134,7 +134,7 @@ Qt::Horizontal - + 1 @@ -159,9 +159,9 @@ QFrame::Raised - + - + All @@ -199,22 +199,22 @@ - + true - + 0 0 - 228 - 488 + 220 + 444 - + - + Qt::Vertical @@ -305,6 +305,11 @@ + + + 12 + + Most Recent @@ -337,7 +342,7 @@ - + 0 @@ -382,8 +387,8 @@ 0 0 - 523 - 484 + 521 + 437 @@ -429,6 +434,13 @@ + + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
diff --git a/retroshare-gui/src/gui/WikiPoos/WikiAddDialog.ui b/retroshare-gui/src/gui/WikiPoos/WikiAddDialog.ui index 9de9e6a3e..28f2e41ce 100644 --- a/retroshare-gui/src/gui/WikiPoos/WikiAddDialog.ui +++ b/retroshare-gui/src/gui/WikiPoos/WikiAddDialog.ui @@ -51,7 +51,7 @@
- + Travel @@ -110,7 +110,7 @@ - + 0 @@ -135,7 +135,7 @@ - + 0 @@ -170,7 +170,7 @@ - + 0 @@ -195,7 +195,7 @@ - + 0 @@ -266,6 +266,13 @@ + + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
diff --git a/retroshare-gui/src/gui/WikiPoos/WikiEditDialog.cpp b/retroshare-gui/src/gui/WikiPoos/WikiEditDialog.cpp index 077641621..8dd0404d6 100644 --- a/retroshare-gui/src/gui/WikiPoos/WikiEditDialog.cpp +++ b/retroshare-gui/src/gui/WikiPoos/WikiEditDialog.cpp @@ -56,18 +56,18 @@ WikiEditDialog::WikiEditDialog(QWidget *parent) { ui.setupUi(this); - connect(ui.pushButton_Cancel, SIGNAL( clicked( void ) ), this, SLOT( cancelEdit( void ) ) ); - connect(ui.pushButton_Revert, SIGNAL( clicked( void ) ), this, SLOT( revertEdit( void ) ) ); - connect(ui.pushButton_Submit, SIGNAL( clicked( void ) ), this, SLOT( submitEdit( void ) ) ); - connect(ui.pushButton_Preview, SIGNAL( clicked( void ) ), this, SLOT( previewToggle( void ) ) ); - connect(ui.pushButton_History, SIGNAL( clicked( void ) ), this, SLOT( historyToggle( void ) ) ); - connect(ui.toolButton_Show, SIGNAL( clicked( void ) ), this, SLOT( detailsToggle( void ) ) ); - connect(ui.toolButton_Hide, SIGNAL( clicked( void ) ), this, SLOT( detailsToggle( void ) ) ); - connect(ui.textEdit, SIGNAL( textChanged( void ) ), this, SLOT( textChanged( void ) ) ); - connect(ui.checkBox_OldHistory, SIGNAL( clicked( void ) ), this, SLOT( oldHistoryChanged( void ) ) ); - connect(ui.checkBox_Merge, SIGNAL( clicked( void ) ), this, SLOT( mergeModeToggle( void ) ) ); - connect(ui.pushButton_Merge, SIGNAL( clicked( void ) ), this, SLOT( generateMerge( void ) ) ); - connect(ui.treeWidget_History, SIGNAL( itemSelectionChanged( void ) ), this, SLOT( historySelected( void ) ) ); + connect(ui.pushButton_Cancel, SIGNAL( clicked() ), this, SLOT( cancelEdit() ) ); + connect(ui.pushButton_Revert, SIGNAL( clicked() ), this, SLOT( revertEdit() ) ); + connect(ui.postButton, SIGNAL( clicked() ), this, SLOT( submitEdit() ) ); + connect(ui.pushButton_Preview, SIGNAL( clicked() ), this, SLOT( previewToggle() ) ); + connect(ui.pushButton_History, SIGNAL( clicked() ), this, SLOT( historyToggle() ) ); + connect(ui.toolButton_Show, SIGNAL( clicked() ), this, SLOT( detailsToggle() ) ); + connect(ui.toolButton_Hide, SIGNAL( clicked() ), this, SLOT( detailsToggle() ) ); + connect(ui.textEdit, SIGNAL( textChanged() ), this, SLOT( textChanged() ) ); + connect(ui.checkBox_OldHistory, SIGNAL( clicked() ), this, SLOT( oldHistoryChanged() ) ); + connect(ui.checkBox_Merge, SIGNAL( clicked() ), this, SLOT( mergeModeToggle() ) ); + connect(ui.pushButton_Merge, SIGNAL( clicked() ), this, SLOT( generateMerge() ) ); + connect(ui.treeWidget_History, SIGNAL( itemSelectionChanged() ), this, SLOT( historySelected() ) ); mWikiQueue = new TokenQueue(rsWiki->getTokenService(), this); @@ -125,7 +125,7 @@ void WikiEditDialog::textChanged() mTextChanged = true; ui.pushButton_Revert->setEnabled(true); - ui.pushButton_Submit->setEnabled(true); + ui.postButton->setEnabled(true); ui.label_Status->setText("Modified"); // Disable Selection in Edit History. @@ -142,7 +142,7 @@ void WikiEditDialog::textReset() mTextChanged = false; ui.pushButton_Revert->setEnabled(false); - ui.pushButton_Submit->setEnabled(false); + ui.postButton->setEnabled(false); ui.label_Status->setText("Original"); // Enable Selection in Edit History. @@ -434,11 +434,11 @@ void WikiEditDialog::setNewPage() void WikiEditDialog::setRepublishMode(RsGxsMessageId &origMsgId) { - mRepublishMode = true; - mRepublishOrigId = origMsgId; - ui.pushButton_Submit->setText(tr("Republish")); + mRepublishMode = true; + mRepublishOrigId = origMsgId; + ui.postButton->setText(tr("Republish")); /* No need for for REQUIRED ID */ - ui.comboBox_IdChooser->loadIds(0, RsGxsId()); + ui.comboBox_IdChooser->loadIds(0, RsGxsId()); } diff --git a/retroshare-gui/src/gui/WikiPoos/WikiEditDialog.ui b/retroshare-gui/src/gui/WikiPoos/WikiEditDialog.ui index c971c1398..5433f4a7f 100644 --- a/retroshare-gui/src/gui/WikiPoos/WikiEditDialog.ui +++ b/retroshare-gui/src/gui/WikiPoos/WikiEditDialog.ui @@ -13,7 +13,7 @@ - + 0 @@ -40,14 +40,14 @@
- + QFrame::StyledPanel QFrame::Raised - + @@ -63,7 +63,7 @@ Page Edit History - + @@ -109,18 +109,18 @@ - + QFrame::StyledPanel QFrame::Raised - + - + 6 @@ -132,7 +132,7 @@ - + Qt::Vertical @@ -157,7 +157,7 @@ - + 0 @@ -177,7 +177,7 @@ Wiki Group: - frame + formFrame @@ -254,16 +254,23 @@
- + + + + 15 + 75 + true + + History - + Qt::Horizontal @@ -298,7 +305,7 @@ - + @@ -314,7 +321,7 @@ - + Qt::Horizontal @@ -327,7 +334,14 @@ - + + + + 12 + 75 + true + + Submit @@ -357,8 +371,6 @@
gui/gxs/GxsIdChooser.h
- - - + diff --git a/retroshare-gui/src/gui/advsearch/AdvancedSearchDialog.ui b/retroshare-gui/src/gui/advsearch/AdvancedSearchDialog.ui index 5926e8d94..9427358cd 100644 --- a/retroshare-gui/src/gui/advsearch/AdvancedSearchDialog.ui +++ b/retroshare-gui/src/gui/advsearch/AdvancedSearchDialog.ui @@ -6,8 +6,8 @@ 0 0 - 838 - 130 + 297 + 138 @@ -17,7 +17,7 @@ :/images/logo/logo_16.png:/images/logo/logo_16.png - + 0 @@ -31,20 +31,14 @@ 0 - - - - 0 - 130 - - + QFrame::StyledPanel QFrame::Raised - + @@ -53,12 +47,6 @@ 1 - - - 800 - 60 - - false @@ -68,59 +56,15 @@ Qt::AlignJustify|Qt::AlignTop - + 0 - - 2 - - - 2 - - - 2 - - - 2 - - - - - - 1 - 0 - - - - - 600 - 26 - - - - false - - - - - - - Qt::Vertical - - - - 20 - 9 - - - - - + 6 @@ -142,8 +86,8 @@ Add a further search criterion. - - :/images/add_24x24.png:/images/add_24x24.png + + :/icons/png/add.png:/icons/png/add.png @@ -174,16 +118,10 @@ - + Qt::Horizontal - - - 381 - 27 - - @@ -203,7 +141,7 @@
- + 0 @@ -227,6 +165,7 @@ + diff --git a/retroshare-gui/src/gui/advsearch/advancedsearchdialog.cpp b/retroshare-gui/src/gui/advsearch/advancedsearchdialog.cpp index eb9b9ce83..da3d24057 100644 --- a/retroshare-gui/src/gui/advsearch/advancedsearchdialog.cpp +++ b/retroshare-gui/src/gui/advsearch/advancedsearchdialog.cpp @@ -21,97 +21,79 @@ *******************************************************************************/ #include "advancedsearchdialog.h" + #include "gui/common/FilesDefs.h" +#include + AdvancedSearchDialog::AdvancedSearchDialog(QWidget * parent) : QDialog (parent) { - setupUi(this); - dialogLayout = this->layout(); - metrics = new QFontMetrics(this->font()); + setupUi(this); - // the list of expressions - expressions = new QList(); + QFontMetrics metrics = QFontMetrics(this->font()); + searchCriteriaBox_VL->setContentsMargins(2, metrics.height()/2, 2, 2); + addExprButton->setIconSize(QSize(metrics.height(),metrics.height())*1.5); + resetButton->setIconSize(QSize(metrics.height(),metrics.height())*1.5); - // a area for holding the objects - expressionsLayout = new QVBoxLayout(); - expressionsLayout->setSpacing(0); - expressionsLayout->setMargin(0); - expressionsLayout->setObjectName(QString::fromUtf8("expressionsLayout")); - expressionsFrame->setSizePolicy(QSizePolicy::MinimumExpanding, - QSizePolicy::MinimumExpanding); - expressionsFrame->setLayout(expressionsLayout); - - // we now add the first expression widgets to the dialog via a vertical - // layout - reset();//addNewExpression(); + // Save current default size as minimum to only add expresssions size to it. + this->adjustSize(); + this->setMinimumSize(this->size()); - connect (this->addExprButton, SIGNAL(clicked()), - this, SLOT(addNewExpression())); - connect (this->resetButton, SIGNAL(clicked()), - this, SLOT(reset())); - connect(this->executeButton, SIGNAL(clicked()), - this, SLOT(prepareSearch())); + // the list of expressions + expressions = new QList(); - addExprButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/add.png")); + // we now add the first expression widgets to the dialog + reset();//addNewExpression(); + + connect ( addExprButton, SIGNAL(clicked()) + , this, SLOT(addNewExpression())); + connect ( resetButton, SIGNAL(clicked()) + , this, SLOT(reset())); + connect ( searchButton, SIGNAL(clicked()) + , this, SLOT(prepareSearch())); } void AdvancedSearchDialog::addNewExpression() { - int sizeChange = metrics->height() + 26; + ExpressionWidget *expr = new ExpressionWidget(searchCriteriaBox, (expressions->size() == 0)); + expressions->append(expr); - ExpressionWidget *expr; - if (expressions->size() == 0) - { - //create an initial expression - expr = new ExpressionWidget(expressionsFrame, true); - } else { - expr = new ExpressionWidget(expressionsFrame); - } - - expressions->append(expr); - expressionsLayout->addWidget(expr, 1, Qt::AlignLeft); - - - connect(expr, SIGNAL(signalDelete(ExpressionWidget*)), - this, SLOT(deleteExpression(ExpressionWidget*))); - - //expressionsLayout->invalidate(); - //searchCriteriaBox->setMinimumSize(searchCriteriaBox->minimumWidth(), - // searchCriteriaBox->minimumHeight() + sizeChange); - //searchCriteriaBox->adjustSize(); - expressionsFrame->adjustSize(); - this->setMinimumSize(this->minimumWidth(), this->minimumHeight()+sizeChange); - this->adjustSize(); + searchCriteriaBox_VL->addWidget(expr); + searchCriteriaBox_VL->setAlignment(Qt::AlignTop); + expr->adjustSize(); + if (searchCriteriaBox->minimumWidth() < expr->minimumWidth()) + searchCriteriaBox->setMinimumWidth(expr->minimumWidth()); + QSize exprHeight = QSize(0,expr->height()); + + connect( expr, SIGNAL(signalDelete(ExpressionWidget*)) + , this, SLOT(deleteExpression(ExpressionWidget*)) ); + + this->setMinimumSize(this->minimumSize() + exprHeight); + int marg = gradFrame_GL->contentsMargins().left()+gradFrame_GL->contentsMargins().right(); + marg += this->contentsMargins().left()+this->contentsMargins().right(); + if (this->minimumWidth() < (searchCriteriaBox->minimumWidth()+marg)) + this->setMinimumWidth(searchCriteriaBox->minimumWidth()+marg); } void AdvancedSearchDialog::deleteExpression(ExpressionWidget* expr) { - int sizeChange = metrics->height() + 26; - - expressions->removeAll(expr); - expr->hide(); - expressionsLayout->removeWidget(expr); - delete expr; - - expressionsLayout->invalidate(); - //searchCriteriaBox->setMinimumSize(searchCriteriaBox->minimumWidth(), - // searchCriteriaBox->minimumHeight() - sizeChange); - //searchCriteriaBox->adjustSize(); - expressionsFrame->adjustSize(); - this->setMinimumSize(this->minimumWidth(), this->minimumHeight()-sizeChange); - this->adjustSize(); + QSize exprHeight = QSize(0,expr->height()); + + expressions->removeAll(expr); + expr->hide(); + searchCriteriaBox_VL->removeWidget(expr); + delete expr; + + this->setMinimumSize(this->minimumSize() - exprHeight); + this->resize(this->size() - exprHeight); } void AdvancedSearchDialog::reset() { - ExpressionWidget *expr; while (!expressions->isEmpty()) - { - expr = expressions->takeLast(); - deleteExpression(expr); - } + deleteExpression(expressions->takeLast()); // now add a new default expressions addNewExpression(); @@ -129,7 +111,6 @@ RsRegularExpression::Expression * AdvancedSearchDialog::getRsExpr() // process the special case: first expression wholeExpression = expressions->at(0)->getRsExpression(); - // iterate through the items in elements and #warning Phenom (2017-07-21): I don t know if it is a real memLeak for wholeExpression. If not remove this warning and add a comment how it is deleted. @@ -140,21 +121,20 @@ RsRegularExpression::Expression * AdvancedSearchDialog::getRsExpr() wholeExpression = new RsRegularExpression::CompoundExpression(expressions->at(i)->getOperator(), wholeExpression, expressions->at(i)->getRsExpression()); - } + } return wholeExpression; } QString AdvancedSearchDialog::getSearchAsString() { QString str = expressions->at(0)->toString(); - // iterate through the items in elements and for (int i = 1; i < expressions->size(); ++i) { // extract the expression information and compound it with the // first expression str += QString(" ") + expressions->at(i)->toString(); - } + } return str; } diff --git a/retroshare-gui/src/gui/advsearch/advancedsearchdialog.h b/retroshare-gui/src/gui/advsearch/advancedsearchdialog.h index 317809e6f..25ea74129 100644 --- a/retroshare-gui/src/gui/advsearch/advancedsearchdialog.h +++ b/retroshare-gui/src/gui/advsearch/advancedsearchdialog.h @@ -22,13 +22,10 @@ #ifndef _AdvancedSearch_h_ #define _AdvancedSearch_h_ -#include -#include -#include -#include -#include #include "ui_AdvancedSearchDialog.h" + #include "expressionwidget.h" + #include class AdvancedSearchDialog : public QDialog, public Ui::AdvancedSearchDialog @@ -49,10 +46,7 @@ private slots: void prepareSearch(); private: - QLayout * dialogLayout; - QVBoxLayout * expressionsLayout; QList * expressions; - QFontMetrics * metrics; }; #endif // _AdvancedSearch_h_ diff --git a/retroshare-gui/src/gui/advsearch/expressionwidget.cpp b/retroshare-gui/src/gui/advsearch/expressionwidget.cpp index 2b6ad3b2e..5e5eee1ea 100644 --- a/retroshare-gui/src/gui/advsearch/expressionwidget.cpp +++ b/retroshare-gui/src/gui/advsearch/expressionwidget.cpp @@ -21,107 +21,60 @@ *******************************************************************************/ #include "expressionwidget.h" -ExpressionWidget::ExpressionWidget(QWidget * parent, bool initial) : QWidget(parent) +ExpressionWidget::ExpressionWidget(QWidget * parent, bool initial) + : QWidget(parent) + , isFirst (initial), inRangedConfig(false) + , searchType (NameSearch) // the default search type { - setupUi(this); - - inRangedConfig = false; - - // the default search type - searchType = NameSearch; - - exprLayout = this->layout(); - - exprOpFrame->setLayout (createLayout()); - exprTermFrame->setLayout (createLayout()); - exprConditionFrame->setLayout (createLayout()); - exprParamFrame->setLayout (createLayout()); - exprParamFrame->setSizePolicy(QSizePolicy::MinimumExpanding, - QSizePolicy::Fixed); - - elements = new QList(); - - exprOpElem = new ExprOpElement(); - exprOpFrame->layout()->addWidget(exprOpElem); - elements->append(exprOpElem); - - exprTermElem = new ExprTermsElement(); - exprTermFrame->layout()->addWidget(exprTermElem); - elements->append(exprTermElem); - connect (exprTermElem, SIGNAL(currentIndexChanged(int)), - this, SLOT (adjustExprForTermType(int))); - - exprCondElem = new ExprConditionElement(searchType); - exprConditionFrame->layout()->addWidget(exprCondElem); - elements->append(exprCondElem); - connect (exprCondElem, SIGNAL (currentIndexChanged(int)), - this, SLOT (adjustExprForConditionType(int))); - - exprParamElem= new ExprParamElement(searchType); - exprParamFrame->layout()->addWidget(exprParamElem); - elements->append(exprParamElem); - - // set up the default search: a search on name - adjustExprForTermType(searchType); - isFirst = initial; - deleteExprButton ->setVisible(!isFirst); - exprOpElem ->setVisible(!isFirst); - exprTermFrame ->show(); - exprConditionFrame ->show(); - exprParamFrame ->show(); - - // connect the delete button signal - connect (deleteExprButton, SIGNAL (clicked()), - this, SLOT(deleteExpression())); - - this->show(); -} + setupUi(this); -QLayout * ExpressionWidget::createLayout(QWidget * parent) -{ - QHBoxLayout * hboxLayout; - if (parent == 0) - { - hboxLayout = new QHBoxLayout(); - } else { - hboxLayout = new QHBoxLayout(parent); - } - hboxLayout->setSpacing(0); - hboxLayout->setMargin(0); - return hboxLayout; + connect (exprTermElem, SIGNAL(currentIndexChanged(int)), + this, SLOT (adjustExprForTermType(int))); + + connect (exprCondElem, SIGNAL (currentIndexChanged(int)), + this, SLOT (adjustExprForConditionType(int))); + + // set up the default search: a search on name + adjustExprForTermType(searchType); + exprOpElem ->setVisible(!isFirst); + deleteExprButton ->setVisible(!isFirst); + + // connect the delete button signal + connect (deleteExprButton, SIGNAL (clicked()), + this, SLOT(deleteExpression()) ); + + this->show(); } bool ExpressionWidget::isStringSearchExpression() { - return (searchType == NameSearch || searchType == PathSearch - || searchType == ExtSearch || searchType == HashSearch); + return ( searchType == NameSearch || searchType == PathSearch + || searchType == ExtSearch || searchType == HashSearch); } void ExpressionWidget::adjustExprForTermType(int index) { - ExprSearchType type = GuiExprElement::TermsIndexMap[index]; - searchType = type; - - // now adjust the relevant elements - // the condition combobox - exprCondElem->adjustForSearchType(type); - - // the parameter expression: can be a date, 1-2 edit fields - // or a size with units etc - exprParamElem->adjustForSearchType(type); - exprParamFrame->adjustSize(); - - exprLayout->invalidate(); - this->adjustSize(); + ExprSearchType type = GuiExprElement::TermsIndexMap[index]; + searchType = type; + + // now adjust the relevant elements + // the condition combobox + exprCondElem->adjustForSearchType(type); + + // the parameter expression: can be a date, 1-2 edit fields + // or a size with units etc + exprParamElem->adjustForSearchType(type); + + this->setMinimumWidth( exprOpElem->width()+exprTermElem->width() + + exprCondElem->width()+exprParamElem->width() + + deleteExprButton->width() ); } void ExpressionWidget::adjustExprForConditionType(int newCondition) { - // we adjust the appearance for a ranged selection - inRangedConfig = (newCondition == GuiExprElement::RANGE_INDEX); - exprParamElem->setRangedSearch(inRangedConfig); - exprParamFrame->layout()->invalidate(); - exprParamFrame->adjustSize(); + // we adjust the appearance for a ranged selection + inRangedConfig = (newCondition == GuiExprElement::RANGE_INDEX); + exprParamElem->setRangedSearch(inRangedConfig); } void ExpressionWidget::deleteExpression() @@ -156,7 +109,11 @@ RsRegularExpression::Expression* ExpressionWidget::getRsExpression() if (isStringSearchExpression()) { QString txt = exprParamElem->getStrSearchValue(); +#if QT_VERSION < QT_VERSION_CHECK(5,15,0) QStringList words = txt.split(" ", QString::SkipEmptyParts); +#else + QStringList words = txt.split(" ", Qt::SkipEmptyParts); +#endif for (int i = 0; i < words.size(); ++i) wordList.push_back(words.at(i).toUtf8().constData()); } else if (inRangedConfig){ @@ -170,7 +127,7 @@ RsRegularExpression::Expression* ExpressionWidget::getRsExpression() lowVal = lowVal^highVal; } } - + switch (searchType) { case NameSearch: @@ -208,20 +165,20 @@ RsRegularExpression::Expression* ExpressionWidget::getRsExpression() break; case SizeSearch: if (inRangedConfig) - { - if(lowVal >= (uint64_t)(1024*1024*1024) || highVal >= (uint64_t)(1024*1024*1024)) - expr = new RsRegularExpression::SizeExpressionMB(exprCondElem->getRelOperator(), (int)(lowVal / (1024*1024)), (int)(highVal / (1024*1024))); - else - expr = new RsRegularExpression::SizeExpression(exprCondElem->getRelOperator(), lowVal, highVal); - } - else - { - uint64_t s = exprParamElem->getIntValue() ; + { + if(lowVal >= (uint64_t)(1024*1024*1024) || highVal >= (uint64_t)(1024*1024*1024)) + expr = new RsRegularExpression::SizeExpressionMB(exprCondElem->getRelOperator(), (int)(lowVal / (1024*1024)), (int)(highVal / (1024*1024))); + else + expr = new RsRegularExpression::SizeExpression(exprCondElem->getRelOperator(), lowVal, highVal); + } + else + { + uint64_t s = exprParamElem->getIntValue() ; - if(s >= (uint64_t)(1024*1024*1024)) - expr = new RsRegularExpression::SizeExpressionMB(exprCondElem->getRelOperator(), (int)(s/(1024*1024))) ; - else - expr = new RsRegularExpression::SizeExpression(exprCondElem->getRelOperator(), (int)s) ; + if(s >= (uint64_t)(1024*1024*1024)) + expr = new RsRegularExpression::SizeExpressionMB(exprCondElem->getRelOperator(), (int)(s/(1024*1024))) ; + else + expr = new RsRegularExpression::SizeExpression(exprCondElem->getRelOperator(), (int)s) ; } break; }; diff --git a/retroshare-gui/src/gui/advsearch/expressionwidget.h b/retroshare-gui/src/gui/advsearch/expressionwidget.h index 40ef3ec47..109ea2a35 100644 --- a/retroshare-gui/src/gui/advsearch/expressionwidget.h +++ b/retroshare-gui/src/gui/advsearch/expressionwidget.h @@ -21,14 +21,16 @@ *******************************************************************************/ #ifndef _ExpressionWidget_h_ #define _ExpressionWidget_h_ -#include -#include -#include -#include -#include "guiexprelement.h" #include "ui_expressionwidget.h" +#include "guiexprelement.h" + +#include + +#include + +#include /** Represents an Advanced Search GUI Expression object which acts as a container @@ -74,20 +76,10 @@ private slots: private: - QLayout * createLayout(QWidget* parent = 0); - bool isStringSearchExpression(); - - QList * elements; - QLayout * exprLayout; - ExprOpElement * exprOpElem; - ExprTermsElement * exprTermElem; - ExprConditionElement * exprCondElem; - ExprParamElement* exprParamElem; - - bool inRangedConfig; bool isFirst; + bool inRangedConfig; ExprSearchType searchType; }; diff --git a/retroshare-gui/src/gui/advsearch/expressionwidget.ui b/retroshare-gui/src/gui/advsearch/expressionwidget.ui index 9e7d2d780..5b8584f00 100644 --- a/retroshare-gui/src/gui/advsearch/expressionwidget.ui +++ b/retroshare-gui/src/gui/advsearch/expressionwidget.ui @@ -2,104 +2,33 @@ ExpressionWidget - - - 0 - 0 - 800 - 34 - - - + 0 0 - - - 800 - 30 - - - - - 16777215 - 55 - - Expression Widget - - 6 - - - 6 - - + + + + + + + + + + - + 0 0 - - - 90 - 26 - - - - - - - - - 0 - 0 - - - - - 100 - 26 - - - - - - - - - 0 - 0 - - - - - 180 - 26 - - - - - - - - - 1 - 0 - - - - - 350 - 26 - - @@ -113,21 +42,34 @@ - - - - Qt::Horizontal - - - - 0 - 30 - - - -
+ + + ExprOpElement + QFrame +
gui/advsearch/guiexprelement.h
+ 1 +
+ + ExprTermsElement + QFrame +
gui/advsearch/guiexprelement.h
+ 1 +
+ + ExprConditionElement + QFrame +
gui/advsearch/guiexprelement.h
+ 1 +
+ + ExprParamElement + QFrame +
gui/advsearch/guiexprelement.h
+ 1 +
+
diff --git a/retroshare-gui/src/gui/advsearch/guiexprelement.cpp b/retroshare-gui/src/gui/advsearch/guiexprelement.cpp index 44d1350a4..23317c168 100644 --- a/retroshare-gui/src/gui/advsearch/guiexprelement.cpp +++ b/retroshare-gui/src/gui/advsearch/guiexprelement.cpp @@ -21,14 +21,10 @@ *******************************************************************************/ #include "guiexprelement.h" -#define STR_FIELDS_MIN_WIDTH 200 -#define SIZE_FIELDS_MIN_WIDTH 80 -#define DATE_FIELDS_MIN_WIDTH 100 -#define FIELDS_MIN_HEIGHT 26 - -#define LOGICAL_OP_CB_WIDTH 70 -#define STD_CB_WIDTH 90 -#define CONDITION_CB_WIDTH 170 +#define STR_FIELDS_MIN_WFACTOR 20.0 +#define SIZE_FIELDS_MIN_WFACTOR 8.0 +#define DATE_FIELDS_MIN_WFACTOR 10.0 +#define FIELDS_MIN_HFACTOR 1.2 const int GuiExprElement::AND_INDEX = 0; const int GuiExprElement::OR_INDEX = 1; @@ -37,10 +33,10 @@ const int GuiExprElement::XOR_INDEX = 2; const int GuiExprElement::NAME_INDEX = 0; const int GuiExprElement::PATH_INDEX = 1; const int GuiExprElement::EXT_INDEX = 2; -const int GuiExprElement::HASH_INDEX = 3; -/*const int GuiExprElement::KEYWORDS_INDEX = ???; -const int GuiExprElement::COMMENTS_INDEX = ???; -const int GuiExprElement::META_INDEX = ???;*/ +const int GuiExprElement::HASH_INDEX = 3; +//const int GuiExprElement::KEYWORDS_INDEX = ???; +//const int GuiExprElement::COMMENTS_INDEX = ???; +//const int GuiExprElement::META_INDEX = ???; const int GuiExprElement::DATE_INDEX = 4; const int GuiExprElement::SIZE_INDEX = 5; const int GuiExprElement::POP_INDEX = 6; @@ -76,14 +72,13 @@ bool GuiExprElement::initialised = false; GuiExprElement::GuiExprElement(QWidget * parent) - : QWidget(parent) + : QFrame(parent), searchType(NameSearch) { - if (!GuiExprElement::initialised) - { - initialiseOptionsLists(); - } - searchType = NameSearch; + if (!GuiExprElement::initialised) + initialiseOptionsLists(); + setObjectName("trans_InternalFrame"); + createLayout(this); } @@ -96,7 +91,7 @@ void GuiExprElement::initialiseOptionsLists() const QString NAME = tr("Name"); const QString PATH = tr("Path"); const QString EXT = tr("Extension"); - const QString HASH = tr("Hash"); + const QString HASH = tr("Hash"); //const QString KEYWORDS= tr("Keywords"); //const QString COMMENTS= tr("Comments"); //const QString META = tr("Meta"); @@ -128,7 +123,7 @@ void GuiExprElement::initialiseOptionsLists() //GuiExprElement::searchTermsOptionsList.append(META); GuiExprElement::searchTermsOptionsList.append(DATE); GuiExprElement::searchTermsOptionsList.append(SIZE); -// GuiExprElement::searchTermsOptionsList.append(POP); + //GuiExprElement::searchTermsOptionsList.append(POP); GuiExprElement::stringOptionsList.append(CONTAINS); GuiExprElement::stringOptionsList.append(CONTALL); @@ -220,24 +215,29 @@ QStringList GuiExprElement::getConditionOptions(ExprSearchType t) return QStringList(); } -QHBoxLayout * GuiExprElement::createLayout(QWidget * parent) +QHBoxLayout * GuiExprElement::createLayout(QWidget * parent /*= nullptr*/) { - QHBoxLayout * hboxLayout; - if (parent == 0) - { - hboxLayout = new QHBoxLayout(); - } else { - hboxLayout = new QHBoxLayout(parent); - } + QHBoxLayout * hboxLayout = new QHBoxLayout(parent); hboxLayout->setMargin(0); hboxLayout->setSpacing(0); return hboxLayout; } +QSize GuiExprElement::getMinSize(float widthFactor/*=1*/, float heightFactor/*=1*/) +{ + QFontMetrics fm = QFontMetrics(font()); +#if QT_VERSION < QT_VERSION_CHECK(5,11,0) + QSize size = QSize(fm.width("_")*widthFactor, fm.height()*heightFactor); +#else + QSize size = QSize(fm.horizontalAdvance("_")*widthFactor, fm.height()*heightFactor); +#endif + return size; +} + bool GuiExprElement::isStringSearchExpression() { - return (searchType == NameSearch || searchType == PathSearch - || searchType == ExtSearch || searchType == HashSearch); + return (searchType == NameSearch || searchType == PathSearch + || searchType == ExtSearch || searchType == HashSearch); } @@ -245,14 +245,12 @@ bool GuiExprElement::isStringSearchExpression() /* *********** L O G I C A L O P E L E M E N T ******************/ /* ********************************************************************/ ExprOpElement::ExprOpElement(QWidget * parent) - : GuiExprElement(parent) + : GuiExprElement(parent) { - internalframe = new QFrame(this); - internalframe->setLayout(createLayout()); - cb = new QComboBox(this); - cb->setMinimumSize(LOGICAL_OP_CB_WIDTH, FIELDS_MIN_HEIGHT); - cb->addItems(GuiExprElement::exprOpsList); - internalframe->layout()->addWidget(cb); + cb = new RSComboBox(this); + cb->addItems(GuiExprElement::exprOpsList); + layout()->addWidget(cb); + setMinimumSize(cb->sizeHint()); } QString ExprOpElement::toString() @@ -271,16 +269,14 @@ RsRegularExpression::LogicalOperator ExprOpElement::getLogicalOperator() /* *********** T E R M S E L E M E N T ******************/ /* **********************************************************/ ExprTermsElement::ExprTermsElement(QWidget * parent) - : GuiExprElement(parent) + : GuiExprElement(parent) { - internalframe = new QFrame(this); - internalframe->setLayout(createLayout()); - cb = new QComboBox(this); - cb->setMinimumSize(STD_CB_WIDTH, FIELDS_MIN_HEIGHT); - connect (cb, SIGNAL(currentIndexChanged(int)), - this, SIGNAL(currentIndexChanged(int))); - cb->addItems(GuiExprElement::searchTermsOptionsList); - internalframe->layout()->addWidget(cb); + cb = new RSComboBox(this); + connect (cb, SIGNAL(currentIndexChanged(int)), + this, SIGNAL(currentIndexChanged(int))); + cb->addItems(GuiExprElement::searchTermsOptionsList); + layout()->addWidget(cb); + setMinimumSize(cb->sizeHint()); } QString ExprTermsElement::toString() { @@ -290,17 +286,15 @@ QString ExprTermsElement::toString() /* ******************************************************************/ /* *********** C O N D I T I O N E L E M E N T ******************/ /* ******************************************************************/ -ExprConditionElement::ExprConditionElement(ExprSearchType type, QWidget * parent) - : GuiExprElement(parent) +ExprConditionElement::ExprConditionElement(QWidget * parent, ExprSearchType type) + : GuiExprElement(parent) { - internalframe = new QFrame(this); - internalframe->setLayout(createLayout()); - cb = new QComboBox(this); - cb->setMinimumSize(CONDITION_CB_WIDTH, FIELDS_MIN_HEIGHT); - connect (cb, SIGNAL(currentIndexChanged(int)), - this, SIGNAL(currentIndexChanged(int))); - cb->addItems(getConditionOptions(type)); - internalframe->layout()->addWidget(cb); + cb = new RSComboBox(this); + connect (cb, SIGNAL(currentIndexChanged(int)), + this, SIGNAL(currentIndexChanged(int))); + cb->addItems(getConditionOptions(type)); + layout()->addWidget(cb); + setMinimumSize(cb->sizeHint()); } @@ -334,174 +328,189 @@ void ExprConditionElement::adjustForSearchType(ExprSearchType type) /* **********************************************************/ /* *********** P A R A M E L E M E N T ******************/ /* **********************************************************/ -ExprParamElement::ExprParamElement(ExprSearchType type, QWidget * parent) - : GuiExprElement(parent) +ExprParamElement::ExprParamElement(QWidget * parent, ExprSearchType type) + : GuiExprElement(parent), inRangedConfig(false) { - internalframe = new QFrame(this); - internalframe->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - internalframe->setLayout(createLayout()); - inRangedConfig = false; - searchType = type; - adjustForSearchType(type); + adjustForSearchType(type); } QString ExprParamElement::toString() { - QString str = ""; - if (isStringSearchExpression()) - { - str = QString("\"") + getStrSearchValue() + QString("\""); - // we don't bother with case if hash search - if (searchType != HashSearch) { - str += (ignoreCase() ? QString(" (ignore case)") - : QString(" (case sensitive)")); + QString str = ""; + if (isStringSearchExpression()) + { + str = QString("\"") + getStrSearchValue() + QString("\""); + // we don't bother with case if hash search + if (searchType != HashSearch) { + str += (ignoreCase() ? QString(" (ignore case)") + : QString(" (case sensitive)")); + } + } else + { + if (searchType == DateSearch) { + QDateEdit * dateEdit = findChild ("param1"); + str = dateEdit->text(); + if (inRangedConfig) + { + str += QString(" ") + tr("to") + QString(" "); + dateEdit = findChild ("param2"); + str += dateEdit->text(); + } + } else if (searchType == SizeSearch) + { + QLineEdit * lineEditSize = findChild("param1"); + str = ("" == lineEditSize->text()) ? "0" + : lineEditSize->text(); + RSComboBox * cb = findChild ("unitsCb1"); + str += QString(" ") + cb->itemText(cb->currentIndex()); + if (inRangedConfig) + { + str += QString(" ") + tr("to") + QString(" "); + lineEditSize = findChild("param2"); + str += ("" == lineEditSize->text()) ? "0" + : lineEditSize->text(); + cb = findChild ("unitsCb2"); + str += QString(" ") + cb->itemText(cb->currentIndex()); + } + } } - } else - { - if (searchType == DateSearch) { - QDateEdit * dateEdit = internalframe->findChild ("param1"); - str = dateEdit->text(); - if (inRangedConfig) - { - str += QString(" ") + tr("to") + QString(" "); - dateEdit = internalframe->findChild ("param2"); - str += dateEdit->text(); - } - } else if (searchType == SizeSearch) - { - QLineEdit * lineEditSize = internalframe->findChild("param1"); - str = ("" == lineEditSize->text()) ? "0" - : lineEditSize->text(); - QComboBox * cb = internalframe->findChild ("unitsCb1"); - str += QString(" ") + cb->itemText(cb->currentIndex()); - if (inRangedConfig) - { - str += QString(" ") + tr("to") + QString(" "); - lineEditSize = internalframe->findChild("param2"); - str += ("" == lineEditSize->text()) ? "0" - : lineEditSize->text(); - cb = internalframe->findChild ("unitsCb2"); - str += QString(" ") + cb->itemText(cb->currentIndex()); - } - } - } - return str; + return str; } +void clearLayout(QLayout *layout) { + if (layout == NULL) + return; + QLayoutItem *item; + while((item = layout->takeAt(0))) { + if (item->layout()) { + clearLayout(item->layout()); + delete item->layout(); + } + if (item->widget()) { + delete item->widget(); + } + delete item; + } +} void ExprParamElement::adjustForSearchType(ExprSearchType type) -{ - // record which search type is active - searchType = type; - QRegExp regExp("0|[1-9][0-9]*"); - numValidator = new QRegExpValidator(regExp, this); - QRegExp hexRegExp("[A-Fa-f0-9]*"); - hexValidator = new QRegExpValidator(hexRegExp, this); - - // remove all elements - QList children = internalframe->findChildren(); - QWidget* child; - QLayout * lay_out = internalframe->layout(); - while (!children.isEmpty()) - { - child = children.takeLast(); - child->hide(); - lay_out->removeWidget(child); - delete child; - } - delete lay_out; +{ + // record which search type is active + searchType = type; + QRegExp regExp("0|[1-9][0-9]*"); + numValidator = new QRegExpValidator(regExp, this); + QRegExp hexRegExp("[A-Fa-f0-9]*"); + hexValidator = new QRegExpValidator(hexRegExp, this); - QHBoxLayout* hbox = createLayout(); - internalframe->setLayout(hbox); - internalframe->setMinimumSize(320,26); + QHBoxLayout* hbox = static_cast(layout()); + clearLayout(hbox); + + setMinimumSize(getMinSize(STR_FIELDS_MIN_WFACTOR,FIELDS_MIN_HFACTOR) ); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); + + if (isStringSearchExpression()) + { + // set up for default of a simple input field + QLineEdit* lineEdit = new QLineEdit(this); + lineEdit->setMinimumSize(getMinSize(STR_FIELDS_MIN_WFACTOR,FIELDS_MIN_HFACTOR)); + lineEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + lineEdit->setObjectName("param1"); + hbox->addWidget(lineEdit); + + hbox->addSpacing(9); + + QCheckBox* icCb = new QCheckBox(tr("ignore case"), this); + icCb->setMinimumSize(getMinSize(icCb->text().length()+2,FIELDS_MIN_HFACTOR)); + icCb->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + icCb->setObjectName("ignoreCaseCB"); + icCb->setCheckState(Qt::Checked); + hbox->addWidget(icCb); + + // hex search specifics: hidden case sensitivity and hex validator + if (searchType == HashSearch) { + icCb->hide(); + lineEdit->setValidator(hexValidator); + } + setMinimumSize(lineEdit->minimumSize() + + QSize((searchType != HashSearch ? icCb->minimumWidth() : 0),0) ); + + } else if (searchType == DateSearch) + { + QDateEdit * dateEdit = new QDateEdit(QDate::currentDate(), this); + dateEdit->setMinimumSize(getMinSize(DATE_FIELDS_MIN_WFACTOR, FIELDS_MIN_HFACTOR)); + dateEdit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + dateEdit->setDisplayFormat(tr("yyyy-MM-dd")); + dateEdit->setObjectName("param1"); + dateEdit->setMinimumDate(QDate(1970, 1, 1)); + dateEdit->setMaximumDate(QDate(2099, 12,31)); + hbox->addWidget(dateEdit, Qt::AlignLeft); + hbox->addStretch(); + setMinimumSize(dateEdit->minimumSize()); + + } else if (searchType == SizeSearch) + { + QLineEdit * lineEdit = new QLineEdit(this); + lineEdit->setMinimumSize(getMinSize(SIZE_FIELDS_MIN_WFACTOR, FIELDS_MIN_HFACTOR)); + lineEdit->setMaximumSize(getMinSize(SIZE_FIELDS_MIN_WFACTOR, FIELDS_MIN_HFACTOR)); + lineEdit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + lineEdit->setObjectName("param1"); + lineEdit->setValidator(numValidator); + hbox->addWidget(lineEdit, Qt::AlignLeft); + + hbox->addSpacing(9); + + RSComboBox * cb = new RSComboBox(this); + cb->setObjectName("unitsCb1"); + cb->addItem(tr("KB"), QVariant(1024)); + cb->addItem(tr("MB"), QVariant(1024*1024)); + cb->addItem(tr("GB"), QVariant(1024*1024*1024)); + hbox->addWidget(cb); + hbox->addStretch(); + setMinimumSize(lineEdit->minimumSize() + QSize(9,0) + + QSize(cb->minimumWidth(),0) ); - if (isStringSearchExpression()) - { - // set up for default of a simple input field - QLineEdit* lineEdit = new QLineEdit(internalframe); - lineEdit->setMinimumSize(STR_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); - lineEdit->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); - lineEdit->setObjectName("param1"); - hbox->addWidget(lineEdit); - hbox->addSpacing(9); - QCheckBox* icCb = new QCheckBox(tr("ignore case"), internalframe); - icCb->setObjectName("ignoreCaseCB"); - icCb->setCheckState(Qt::Checked); - // hex search specifics: hidden case sensitivity and hex validator - if (searchType == HashSearch) { - icCb->hide(); - lineEdit->setValidator(hexValidator); } - hbox->addWidget(icCb); - hbox->addStretch(); - - } else if (searchType == DateSearch) - { - QDateEdit * dateEdit = new QDateEdit(QDate::currentDate(), internalframe); - dateEdit->setMinimumSize(DATE_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); - dateEdit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - dateEdit->setDisplayFormat(tr("dd.MM.yyyy")); - dateEdit->setObjectName("param1"); - dateEdit->setMinimumDate(QDate(1970, 1, 1)); - dateEdit->setMaximumDate(QDate(2099, 12,31)); - hbox->addWidget(dateEdit, Qt::AlignLeft); - hbox->addStretch(); - } else if (searchType == SizeSearch) - { - QLineEdit * lineEdit = new QLineEdit(internalframe); - lineEdit->setMinimumSize(SIZE_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); - lineEdit->setMaximumSize(SIZE_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); - lineEdit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - lineEdit->setObjectName("param1"); - lineEdit->setValidator(numValidator); - hbox->addWidget(lineEdit, Qt::AlignLeft); - QComboBox * cb = new QComboBox(internalframe); - cb->setObjectName("unitsCb1"); - cb-> addItem(tr("KB"), QVariant(1024)); - cb->addItem(tr("MB"), QVariant(1048576)); - cb->addItem(tr("GB"), QVariant(1073741824)); - hbox->addSpacing(9); - internalframe->layout()->addWidget(cb); - hbox->addStretch(); - } - - /* POP Search not implemented - else if (searchType == PopSearch) - { - QLineEdit * lineEdit = new QLineEdit(elem); - lineEdit->setObjectName("param1"); - lineEdit->setValidator(numValidator); - elem->layout()->addWidget(lineEdit); - }*/ - hbox->invalidate(); - internalframe->adjustSize(); - internalframe->show(); - this->adjustSize(); + /* POP Search not implemented + else if (searchType == PopSearch) + { + QLineEdit * lineEdit = new QLineEdit(this); + lineEdit->setObjectName("param1"); + lineEdit->setValidator(numValidator); + hbox->addWidget(lineEdit); + hbox->addStretch(); + setMinimumSize(lineEdit->minimumSize()); + }*/ + hbox->invalidate(); + adjustSize(); + show(); } void ExprParamElement::setRangedSearch(bool ranged) -{ +{ if (inRangedConfig == ranged) return; // nothing to do here inRangedConfig = ranged; - QHBoxLayout* hbox = (dynamic_cast(internalframe->layout())); + QHBoxLayout* hbox = static_cast(layout()); // add additional or remove extra input fields depending on whether // ranged search or not if (inRangedConfig) { + + if(hbox->itemAt(hbox->count()-1)->spacerItem()) + delete hbox->takeAt(hbox->count()-1); + QLabel * toLbl = new QLabel(tr("to")); - toLbl->setMinimumSize(10, FIELDS_MIN_HEIGHT); + toLbl->setMinimumSize(getMinSize(2, FIELDS_MIN_HFACTOR)); toLbl->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); if (searchType == DateSearch) { - internalframe->setMinimumSize(250,26); - QDateEdit * dateEdit = new QDateEdit(QDate::currentDate(), internalframe); - dateEdit->setMinimumSize(DATE_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); + QDateEdit * dateEdit = new QDateEdit(QDate::currentDate(), this); + dateEdit->setMinimumSize(getMinSize(DATE_FIELDS_MIN_WFACTOR, FIELDS_MIN_HFACTOR)); dateEdit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + dateEdit->setDisplayFormat(tr("yyyy-MM-dd")); dateEdit->setObjectName("param2"); - dateEdit->setDisplayFormat(tr("dd.MM.yyyy")); dateEdit->setMinimumDate(QDate(1970, 1, 1)); dateEdit->setMaximumDate(QDate(2099, 12,31)); @@ -510,18 +519,21 @@ void ExprParamElement::setRangedSearch(bool ranged) hbox->addSpacing(9); hbox->addWidget(dateEdit, Qt::AlignLeft); hbox->addStretch(); + setMinimumSize(minimumSize() + QSize(9,0) + + QSize(toLbl->minimumWidth(),0) + QSize(9,0) + + QSize(dateEdit->minimumWidth(),0) ); + } else if (searchType == SizeSearch) { - internalframe->setMinimumSize(340,26); - QLineEdit * lineEdit = new QLineEdit(internalframe); - lineEdit->setMinimumSize(SIZE_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); - lineEdit->setMaximumSize(SIZE_FIELDS_MIN_WIDTH, FIELDS_MIN_HEIGHT); + QLineEdit * lineEdit = new QLineEdit(this); + lineEdit->setMinimumSize(getMinSize(SIZE_FIELDS_MIN_WFACTOR, FIELDS_MIN_HFACTOR)); + lineEdit->setMaximumSize(getMinSize(SIZE_FIELDS_MIN_WFACTOR, FIELDS_MIN_HFACTOR)); lineEdit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); lineEdit->setObjectName("param2"); lineEdit->setValidator(numValidator); - QComboBox * cb = new QComboBox(internalframe); + RSComboBox * cb = new RSComboBox(this); cb->setObjectName("unitsCb2"); - cb-> addItem(tr("KB"), QVariant(1024)); + cb->addItem(tr("KB"), QVariant(1024)); cb->addItem(tr("MB"), QVariant(1048576)); cb->addItem(tr("GB"), QVariant(1073741824)); @@ -532,28 +544,39 @@ void ExprParamElement::setRangedSearch(bool ranged) hbox->addSpacing(9); hbox->addWidget(cb); hbox->addStretch(); - } -// else if (searchType == PopSearch) -// { -// elem->layout()->addWidget(new QLabel(tr("to")), Qt::AlignCenter); -// QLineEdit * lineEdit = new QLineEdit(elem); -// lineEdit->setObjectName("param2"); -// lineEdit->setValidator(numValidator); -// elem->layout()->addWidget(slineEdit); -// } + setMinimumSize(minimumSize() + QSize(9,0) + + QSize(toLbl->minimumWidth(),0) + QSize(9,0) + + QSize(lineEdit->minimumWidth(),0) + QSize(9,0) + + QSize(cb->minimumWidth(),0) ); + + } +// else if (searchType == PopSearch) +// { +// QLineEdit * lineEdit = new QLineEdit(this); +// lineEdit->setObjectName("param2"); +// lineEdit->setValidator(numValidator); + +// hbox->addSpacing(9); +// hbox->addWidget(toLbl, Qt::AlignLeft); +// hbox->addSpacing(9); +// hbox->addWidget(lineEdit, Qt::AlignLeft); +// hbox->addStretch(); +// setMinimumSize(minimumSize() + QSize(9,0) +// + QSize(toLbl->minimumWidth(),0) + QSize(9,0) +// + QSize(lineEdit->minimumWidth(),0) ); +// } hbox->invalidate(); - internalframe->adjustSize(); - internalframe->show(); - this->adjustSize(); + adjustSize(); + show(); } else { adjustForSearchType(searchType); } } bool ExprParamElement::ignoreCase() -{ +{ return (isStringSearchExpression() - && (internalframe->findChild("ignoreCaseCB")) + && (findChild("ignoreCaseCB")) ->checkState()==Qt::Checked); } @@ -561,15 +584,15 @@ QString ExprParamElement::getStrSearchValue() { if (!isStringSearchExpression()) return ""; - QLineEdit * lineEdit = internalframe->findChild("param1"); + QLineEdit * lineEdit = findChild("param1"); return lineEdit->displayText(); } uint64_t ExprParamElement::getIntValueFromField(QString fieldName, bool isToField,bool *ok) { uint64_t val = 0; - if(ok!=NULL) - *ok=true ; + if(ok!=NULL) + *ok=true ; QString suffix = (isToField) ? "2": "1" ; // NOTE qFindChild necessary for MSVC 6 compatibility!! @@ -577,25 +600,29 @@ uint64_t ExprParamElement::getIntValueFromField(QString fieldName, bool isToFiel { case DateSearch: { - QDateEdit * dateEdit = internalframe->findChild (fieldName + suffix); - QDateTime * time = new QDateTime(dateEdit->date()); - val = (uint64_t)time->toTime_t(); + QDateEdit * dateEdit = findChild (fieldName + suffix); +#if QT_VERSION < QT_VERSION_CHECK(5,15,0) + QDateTime time = QDateTime(dateEdit->date()); +#else + QDateTime time = dateEdit->date().startOfDay(); +#endif + val = (uint64_t)time.toTime_t(); break; - } + } case SizeSearch: { - QLineEdit * lineEditSize = internalframe->findChild(fieldName + suffix); + QLineEdit * lineEditSize = findChild(fieldName + suffix); bool ok2 = false; val = (lineEditSize->displayText()).toULongLong(&ok2); if (ok2) - { - QComboBox * cb = internalframe->findChild((QString("unitsCb") + suffix)); + { + RSComboBox * cb = findChild((QString("unitsCb") + suffix)); QVariant data = cb->itemData(cb->currentIndex()); val *= data.toULongLong(); - } - else - if(ok!=NULL) - *ok=false ; + } + else + if(ok!=NULL) + *ok=false ; break; } @@ -615,8 +642,8 @@ uint64_t ExprParamElement::getIntValueFromField(QString fieldName, bool isToFiel case HashSearch: default: // shouldn't be here...val stays at -1 - if(ok!=NULL) - *ok=false ; + if(ok!=NULL) + *ok=false ; } return val; diff --git a/retroshare-gui/src/gui/advsearch/guiexprelement.h b/retroshare-gui/src/gui/advsearch/guiexprelement.h index 00748f4f7..50ebeaa15 100644 --- a/retroshare-gui/src/gui/advsearch/guiexprelement.h +++ b/retroshare-gui/src/gui/advsearch/guiexprelement.h @@ -22,25 +22,18 @@ #ifndef _GuiExprElement_h_ #define _GuiExprElement_h_ -#include -#include -#include -#include -#include +#include "gui/common/RSComboBox.h" + +#include "retroshare/rsexpr.h" + #include -#include -#include #include -#include -#include -#include #include -#include +#include +#include #include -#include - enum ExprSearchType { NameSearch, @@ -53,13 +46,13 @@ enum ExprSearchType }; -class GuiExprElement: public QWidget +class GuiExprElement: public QFrame { Q_OBJECT public: GuiExprElement(QWidget * parent = 0); - virtual void adjustForSearchType(ExprSearchType) {} + void adjustForSearchType(ExprSearchType) {} virtual ~GuiExprElement(){} virtual void set(int){} virtual void set(QObject*){} @@ -103,8 +96,8 @@ protected: condition combobox */ QStringList getConditionOptions(ExprSearchType t); - QHBoxLayout* createLayout(QWidget* parent = 0); - QFrame * internalframe; + QHBoxLayout* createLayout(QWidget* parent = nullptr); + QSize getMinSize(float widthFactor = 1.0, float heightFactor = 1.0); ExprSearchType searchType; @@ -125,7 +118,6 @@ protected: static QMap strConditionStrMap; static QMap relConditionStrMap; - }; /** the Expression operator combobox element */ @@ -134,11 +126,11 @@ class ExprOpElement : public GuiExprElement Q_OBJECT public: - ExprOpElement(QWidget * parent = 0); + ExprOpElement(QWidget * parent = nullptr); RsRegularExpression::LogicalOperator getLogicalOperator(); QString toString(); private: - QComboBox * cb; + RSComboBox * cb; }; /** the Terms combobox element */ @@ -147,7 +139,7 @@ class ExprTermsElement : public GuiExprElement Q_OBJECT public: - ExprTermsElement(QWidget * parent = 0); + ExprTermsElement(QWidget * parent = nullptr); int getTermsIndex(); RsRegularExpression::RelOperator getRelOperator(); RsRegularExpression::StringOperator getStringOperator(); @@ -158,7 +150,7 @@ signals: void currentIndexChanged(int); private: - QComboBox * cb; + RSComboBox * cb; }; /** the Conditions combobox element */ @@ -167,7 +159,7 @@ class ExprConditionElement : public GuiExprElement Q_OBJECT public: - ExprConditionElement(ExprSearchType, QWidget * parent = 0); + ExprConditionElement(QWidget * parent = nullptr, ExprSearchType type = NameSearch); RsRegularExpression::RelOperator getRelOperator(); RsRegularExpression::StringOperator getStringOperator(); void adjustForSearchType(ExprSearchType); @@ -178,7 +170,7 @@ signals: void currentIndexChanged(int); private: - QComboBox * cb; + RSComboBox * cb; }; /** the Parameter element */ @@ -187,7 +179,7 @@ class ExprParamElement : public GuiExprElement Q_OBJECT public: - ExprParamElement(ExprSearchType, QWidget * parent = 0); + ExprParamElement(QWidget * parent = nullptr, ExprSearchType type = NameSearch); QVariant* getRSExprValue(); void adjustForSearchType(ExprSearchType); void setRangedSearch(bool ranged = true); diff --git a/retroshare-gui/src/gui/chat/ChatLobbyDialog.ui b/retroshare-gui/src/gui/chat/ChatLobbyDialog.ui index 0a1635735..0851eba15 100644 --- a/retroshare-gui/src/gui/chat/ChatLobbyDialog.ui +++ b/retroshare-gui/src/gui/chat/ChatLobbyDialog.ui @@ -13,7 +13,7 @@ MainWindow - + 0 @@ -48,7 +48,7 @@
- + 0 @@ -61,7 +61,10 @@ 0 - + + + 2 + 0 @@ -82,7 +85,7 @@ QFrame::Sunken - + 2 diff --git a/retroshare-gui/src/gui/chat/ChatWidget.cpp b/retroshare-gui/src/gui/chat/ChatWidget.cpp index 491d2ca21..d4a20fe74 100644 --- a/retroshare-gui/src/gui/chat/ChatWidget.cpp +++ b/retroshare-gui/src/gui/chat/ChatWidget.cpp @@ -183,7 +183,7 @@ ChatWidget::ChatWidget(QWidget *parent) connect(ui->chatTextEdit, SIGNAL(currentCharFormatChanged(QTextCharFormat)), this, SLOT(chatCharFormatChanged())); connect(ui->chatTextEdit, SIGNAL(textChanged()), this, SLOT(updateLenOfChatTextEdit())); - ui->infoFrame->setVisible(false); + ui->info_Frame->setVisible(false); ui->statusMessageLabel->hide(); setAcceptDrops(true); @@ -290,12 +290,12 @@ void ChatWidget::addChatBarWidget(QWidget *w) void ChatWidget::addTitleBarWidget(QWidget *w) { - ui->pluginTitleFrame->layout()->addWidget(w) ; + ui->trans_Frame_PluginTitle->layout()->addWidget(w) ; } void ChatWidget::addTopBarWidget(QWidget *w) { - ui->pluginTopFrame->layout()->addWidget(w) ; + ui->trans_Frame_PluginTop->layout()->addWidget(w) ; } void ChatWidget::hideChatText(bool hidden) @@ -642,7 +642,7 @@ bool ChatWidget::eventFilter(QObject *obj, QEvent *event) } } - } else if (obj == ui->chatTextEdit) { + } else if (obj == ui->chatTextEdit) { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(event); @@ -1286,7 +1286,7 @@ void ChatWidget::sendChat() void ChatWidget::on_closeInfoFrameButton_clicked() { - ui->infoFrame->setVisible(false); + ui->info_Frame->setVisible(false); } void ChatWidget::on_searchButton_clicked(bool bValue) @@ -1804,27 +1804,27 @@ void ChatWidget::updateStatus(const QString &peer_id, int status) switch (status) { case RS_STATUS_OFFLINE: - ui->infoFrame->setVisible(true); + ui->info_Frame->setVisible(true); ui->infoLabel->setText(peerName + " " + tr("appears to be Offline.") +"\n" + tr("Messages you send will be delivered after Friend is again Online.")); break; case RS_STATUS_INACTIVE: - ui->infoFrame->setVisible(true); + ui->info_Frame->setVisible(true); ui->infoLabel->setText(peerName + " " + tr("is Idle and may not reply")); break; case RS_STATUS_ONLINE: - ui->infoFrame->setVisible(false); + ui->info_Frame->setVisible(false); break; case RS_STATUS_AWAY: ui->infoLabel->setText(peerName + " " + tr("is Away and may not reply")); - ui->infoFrame->setVisible(true); + ui->info_Frame->setVisible(true); break; case RS_STATUS_BUSY: ui->infoLabel->setText(peerName + " " + tr("is Busy and may not reply")); - ui->infoFrame->setVisible(true); + ui->info_Frame->setVisible(true); break; } diff --git a/retroshare-gui/src/gui/chat/ChatWidget.ui b/retroshare-gui/src/gui/chat/ChatWidget.ui index 7ecbcfdc2..88e501335 100644 --- a/retroshare-gui/src/gui/chat/ChatWidget.ui +++ b/retroshare-gui/src/gui/chat/ChatWidget.ui @@ -84,10 +84,12 @@ - + + 11 75 + true true @@ -100,7 +102,14 @@ - + + + + 12 + 75 + true + + (Status) @@ -121,14 +130,14 @@ - + QFrame::NoFrame QFrame::Plain - + 3 @@ -311,14 +320,14 @@ - + QFrame::NoFrame QFrame::Plain - + 3 @@ -355,12 +364,6 @@ 0 - - QFrame::StyledPanel - - - QFrame::Raised - 0 @@ -375,10 +378,19 @@ 0 - + + + + + 0 + 0 + 0 + + + @@ -399,6 +411,15 @@ + + + + 0 + 0 + 0 + + + @@ -419,6 +440,15 @@ + + + + 154 + 154 + 154 + + + @@ -1089,21 +1119,6 @@ border-image: url(:/images/closepressed.png) - - LineEditClear - QLineEdit -
gui/common/LineEditClear.h
-
- - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
- - RSTextBrowser - QTextBrowser -
gui/common/RSTextBrowser.h
-
HashBox QScrollArea @@ -1115,11 +1130,20 @@ border-image: url(:/images/closepressed.png) QTextEdit
gui/common/MimeTextEdit.h
+ + LineEditClear + QLineEdit +
gui/common/LineEditClear.h
+
+ + RSTextBrowser + QTextBrowser +
gui/common/RSTextBrowser.h
+
- - + diff --git a/retroshare-gui/src/gui/chat/CreateLobbyDialog.ui b/retroshare-gui/src/gui/chat/CreateLobbyDialog.ui index 7c4d01aaa..15dab649d 100644 --- a/retroshare-gui/src/gui/chat/CreateLobbyDialog.ui +++ b/retroshare-gui/src/gui/chat/CreateLobbyDialog.ui @@ -37,10 +37,15 @@
- - + + - + + + + 15 + + A chat room is a decentralized and anonymous chat group. All participants receive all messages. Once the room is created you can invite other friend nodes with invite button on top right. @@ -103,7 +108,7 @@ - + Public (Visible by friends) @@ -230,6 +235,13 @@ + + + 12 + 75 + true + + Create @@ -250,17 +262,6 @@ - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
- - HeaderFrame - QFrame -
gui/common/HeaderFrame.h
- 1 -
FriendSelectionWidget QWidget @@ -272,6 +273,17 @@ QComboBox
gui/gxs/GxsIdChooser.h
+ + HeaderFrame + QFrame +
gui/common/HeaderFrame.h
+ 1 +
+ + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
diff --git a/retroshare-gui/src/gui/chat/PopupChatWindow.cpp b/retroshare-gui/src/gui/chat/PopupChatWindow.cpp index 6c1f9128d..f9324d5fc 100644 --- a/retroshare-gui/src/gui/chat/PopupChatWindow.cpp +++ b/retroshare-gui/src/gui/chat/PopupChatWindow.cpp @@ -88,7 +88,7 @@ PopupChatWindow::PopupChatWindow(bool tabbed, QWidget *parent, Qt::WindowFlags f // ui.actionSetOnTop->setVisible(false);// removed, because the window manager should handle this already. // ui.actionColor->setVisible(false);// moved to the context menu - ui.chattoolBar->hide(); // no widgets left! + ui.headerToolBar->hide(); // no widgets left! setAttribute(Qt::WA_DeleteOnClose, true); @@ -440,7 +440,7 @@ void PopupChatWindow::calculateStyle(ChatDialog *dialog) } } - ui.chattoolBar->setStyleSheet(toolSheet); + ui.headerToolBar->setStyleSheet(toolSheet); ui.chatstatusbar->setStyleSheet(statusSheet); ui.chatcentralwidget->setStyleSheet(widgetSheet); } diff --git a/retroshare-gui/src/gui/chat/PopupChatWindow.ui b/retroshare-gui/src/gui/chat/PopupChatWindow.ui index ea6ea79af..0394a1c31 100644 --- a/retroshare-gui/src/gui/chat/PopupChatWindow.ui +++ b/retroshare-gui/src/gui/chat/PopupChatWindow.ui @@ -43,7 +43,7 @@
- + false diff --git a/retroshare-gui/src/gui/common/AvatarDialog.cpp b/retroshare-gui/src/gui/common/AvatarDialog.cpp index 8eb24a184..632fa2948 100644 --- a/retroshare-gui/src/gui/common/AvatarDialog.cpp +++ b/retroshare-gui/src/gui/common/AvatarDialog.cpp @@ -166,7 +166,7 @@ void AvatarDialog::loadAvatarWidget() message += "\n RetroShare/stickers\n RetroShare/Data/stickers\n RetroShare/Data/Location/stickers"; ui->nostickersLabel->setText(message); } else { - ui->infoframe->hide(); + ui->info_Frame->hide(); } bool bOnlyOneGroup = (stickerTabs.count() == 1); @@ -272,7 +272,7 @@ void AvatarDialog::loadAvatarWidget() loadToolTips(firstpage); //Get widget's size - QSize sizeWidget = ui->avatarWidget->sizeHint(); + //QSize sizeWidget = ui->avatarWidget->sizeHint(); } diff --git a/retroshare-gui/src/gui/common/AvatarDialog.ui b/retroshare-gui/src/gui/common/AvatarDialog.ui index 9c5bc9482..a7b98cbcf 100644 --- a/retroshare-gui/src/gui/common/AvatarDialog.ui +++ b/retroshare-gui/src/gui/common/AvatarDialog.ui @@ -13,7 +13,7 @@ Change Avatar - + 0 @@ -37,14 +37,14 @@
- + QFrame::StyledPanel QFrame::Raised - + 3 @@ -52,14 +52,14 @@ 0 - + QFrame::StyledPanel QFrame::Raised - + @@ -74,7 +74,7 @@ - + @@ -121,7 +121,7 @@ - + Qt::Vertical @@ -146,7 +146,7 @@ 0 0 431 - 359 + 356 @@ -180,7 +180,7 @@ - + 9 @@ -194,7 +194,7 @@ 9 - + Qt::Horizontal @@ -219,7 +219,7 @@ - frame + gradFrame headerFrame @@ -235,9 +235,7 @@
gui/gxschannels/GxsChannelPostThumbnail.h
- - - + buttonBox diff --git a/retroshare-gui/src/gui/common/Emoticons.cpp b/retroshare-gui/src/gui/common/Emoticons.cpp index d6bb17e4a..0f37eebfc 100644 --- a/retroshare-gui/src/gui/common/Emoticons.cpp +++ b/retroshare-gui/src/gui/common/Emoticons.cpp @@ -205,10 +205,11 @@ void Emoticons::showSmileyWidget(QWidget *parent, QWidget *button, const char *s // (Cyril) Never use an absolute size. It needs to be scaled to the actual font size on the screen. // QFontMetricsF fm(parent->font()) ; - smTab->setIconSize(QSize(28*fm.height()/14.0,28*fm.height()/14.0)); + QSize size(28*fm.height()/14.0,28*fm.height()/14.0); + smTab->setIconSize(size); smTab->setMinimumWidth(400); smTab->setTabPosition(QTabWidget::South); - smTab->setStyleSheet("QTabBar::tab { height: 44px; width: 44px; }"); + smTab->setStyleSheet(QString("QTabBar::tab { height: %1px; width: %1px; padding: 0px; margin: 0px;}").arg(size.width()*1.1)); if (groupName.right(4).toLower() == ".png") smTab->addTab( tabGrpWidget, FilesDefs::getIconFromQtResourcePath(groupName), ""); diff --git a/retroshare-gui/src/gui/common/FriendList.h b/retroshare-gui/src/gui/common/FriendList.h index 3a5c15bbe..efcf034d4 100644 --- a/retroshare-gui/src/gui/common/FriendList.h +++ b/retroshare-gui/src/gui/common/FriendList.h @@ -125,7 +125,7 @@ private: std::set openGroups; std::set openPeers; - /* Color definitions (for standard see qss.default) */ + /* Color definitions (for standard see default.qss) */ QColor mTextColorGroup; QColor mTextColorStatus[RS_STATUS_COUNT]; diff --git a/retroshare-gui/src/gui/common/FriendListModel.cpp b/retroshare-gui/src/gui/common/FriendListModel.cpp index 9d2bfa50b..1b83485bc 100644 --- a/retroshare-gui/src/gui/common/FriendListModel.cpp +++ b/retroshare-gui/src/gui/common/FriendListModel.cpp @@ -1052,7 +1052,12 @@ std::map::const_iterator RsFriendListModel::createInvalidatedP if(rsPeers->getGPGDetails(pgp_id,hprof.profile_info)) { - std::cerr << "(EE) asked to create an invalidated profile that already exists!" << std::endl; + std::cerr << "(EE) asked to create an invalidated profile that already exists: " << pgp_id << std::endl; + + pgp_indices[pgp_id] = mProfiles.size(); + mProfiles.push_back(hprof); + it2 = pgp_indices.find(pgp_id); + return it2; } diff --git a/retroshare-gui/src/gui/common/FriendListModel.h b/retroshare-gui/src/gui/common/FriendListModel.h index 871dc14b9..646159377 100644 --- a/retroshare-gui/src/gui/common/FriendListModel.h +++ b/retroshare-gui/src/gui/common/FriendListModel.h @@ -156,7 +156,7 @@ public: void clear() ; - /* Color definitions (for standard see qss.default) */ + /* Color definitions (for standard see default.qss) */ QColor mTextColorGroup; QColor mTextColorStatus[RS_STATUS_COUNT]; diff --git a/retroshare-gui/src/gui/common/FriendSelectionWidget.h b/retroshare-gui/src/gui/common/FriendSelectionWidget.h index 7a2fb718e..20c4a15e9 100644 --- a/retroshare-gui/src/gui/common/FriendSelectionWidget.h +++ b/retroshare-gui/src/gui/common/FriendSelectionWidget.h @@ -162,7 +162,7 @@ private: QAction *mActionSortByState; QAction *mActionFilterConnected; - /* Color definitions (for standard see qss.default) */ + /* Color definitions (for standard see default.qss) */ QColor mTextColorOnline; Ui::FriendSelectionWidget *ui; diff --git a/retroshare-gui/src/gui/common/GroupChooser.cpp b/retroshare-gui/src/gui/common/GroupChooser.cpp index be456f96d..8cdf2fd2d 100644 --- a/retroshare-gui/src/gui/common/GroupChooser.cpp +++ b/retroshare-gui/src/gui/common/GroupChooser.cpp @@ -20,15 +20,16 @@ #include "GroupChooser.h" +#include + +#include + #include #include -#include -#include - /** Constructor */ GroupChooser::GroupChooser(QWidget *parent) -: QComboBox(parent), mFlags(0) + : RSComboBox(parent), mFlags(0) { return; } diff --git a/retroshare-gui/src/gui/common/GroupChooser.h b/retroshare-gui/src/gui/common/GroupChooser.h index fa7e2eba7..04d821bc2 100644 --- a/retroshare-gui/src/gui/common/GroupChooser.h +++ b/retroshare-gui/src/gui/common/GroupChooser.h @@ -20,13 +20,14 @@ #pragma once -#include +#include "gui/common/RSComboBox.h" + #include -class GroupChooser : public QComboBox +class GroupChooser : public RSComboBox { public: - GroupChooser(QWidget *parent = NULL); + GroupChooser(QWidget *parent = nullptr); void loadGroups(uint32_t chooserFlags, const RsNodeGroupId& defaultId); bool getChosenGroup(RsNodeGroupId& id); diff --git a/retroshare-gui/src/gui/common/GroupTreeWidget.h b/retroshare-gui/src/gui/common/GroupTreeWidget.h index 6125dac28..b27c37014 100644 --- a/retroshare-gui/src/gui/common/GroupTreeWidget.h +++ b/retroshare-gui/src/gui/common/GroupTreeWidget.h @@ -158,7 +158,7 @@ private: private: - /* Color definitions (for standard see qss.default) */ + /* Color definitions (for standard see default.qss) */ QColor mTextColor[GROUPTREEWIDGET_COLOR_COUNT]; // Compare role used for each column diff --git a/retroshare-gui/src/gui/common/HeaderFrame.ui b/retroshare-gui/src/gui/common/HeaderFrame.ui index 45a65943a..f9c436f68 100644 --- a/retroshare-gui/src/gui/common/HeaderFrame.ui +++ b/retroshare-gui/src/gui/common/HeaderFrame.ui @@ -16,15 +16,24 @@ 76 - + 0 - + + 0 + + + 0 + + + 0 + + 0 - + 0 @@ -37,7 +46,7 @@ 76 - + 12 @@ -67,7 +76,14 @@ - + + + + 22 + 75 + true + + Header text @@ -77,7 +93,7 @@ - + QFrame::HLine @@ -90,9 +106,9 @@ - StyledElidedLabel + ElidedLabel QLabel -
gui/common/StyledElidedLabel.h
+
gui/common/ElidedLabel.h
diff --git a/retroshare-gui/src/gui/common/LineEditClear.cpp b/retroshare-gui/src/gui/common/LineEditClear.cpp index b439aaa07..c3d68b512 100644 --- a/retroshare-gui/src/gui/common/LineEditClear.cpp +++ b/retroshare-gui/src/gui/common/LineEditClear.cpp @@ -29,17 +29,18 @@ #include #endif -#define IMAGE_FILTER ":/images/find-16.png" +#define IMAGE_FILTER ":/images/find.png" LineEditClear::LineEditClear(QWidget *parent) - : QLineEdit(parent) + : QLineEdit(parent) { mActionGroup = NULL; mFilterButton = NULL; + QFontMetrics fm(this->font()); mClearButton = new QToolButton(this); - mClearButton->setFixedSize(16, 16); - mClearButton->setIconSize(QSize(16, 16)); + mClearButton->setFixedSize(fm.height(), fm.height()); + mClearButton->setIconSize(QSize(fm.height(), fm.height())); mClearButton->setCursor(Qt::ArrowCursor); mClearButton->setStyleSheet("QToolButton { border: none; padding: 0px; }" "QToolButton { border-image: url(:/images/closenormal.png) }" @@ -50,7 +51,7 @@ LineEditClear::LineEditClear(QWidget *parent) mClearButton->setToolTip("Clear Filter"); connect(mClearButton, SIGNAL(clicked()), this, SLOT(clear())); - connect(this, SIGNAL(textChanged(const QString&)), this, SLOT(updateClearButton(const QString&))); + connect(this, SIGNAL(textChanged(QString)), this, SLOT(updateClearButton(QString))); //#if QT_VERSION < 0x040700 #if QT_VERSION < 0x050000//PlaceHolder text only shown when not have focus in Qt4 @@ -124,15 +125,18 @@ void LineEditClear::showFilterIcon() } mFilterButton = new QToolButton(this); - mFilterButton->setFixedSize(16, 16); - mFilterButton->setIcon(FilesDefs::getIconFromQtResourcePath(IMAGE_FILTER)); - //mFilterButton->setIconSize(filterPixmap.size()); - mFilterButton->setCursor(Qt::ArrowCursor); - mFilterButton->setStyleSheet("QToolButton { border: none; padding: 0px; }" - "QToolButton[popupMode=\"2\"] { padding-right: 10px; }" - "QToolButton::menu-indicator[popupMode=\"2\"] { subcontrol-origin: padding; subcontrol-position: bottom right; top: 5px; left: -3px; width: 7px; }"); - mFilterButton->move(2, 2); + mFilterButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); mFilterButton->setFocusPolicy(Qt::NoFocus); + mFilterButton->setPopupMode(QToolButton::InstantPopup); + mFilterButton->setAutoFillBackground(true); + mFilterButton->setToolButtonStyle(Qt::ToolButtonIconOnly); + setFilterButtonIcon(QIcon()); + mFilterButton->setCursor(Qt::ArrowCursor); + mFilterButton->setStyleSheet("QToolButton { background: transparent; border: none; margin: 0px; padding: 0px; }" + "QToolButton[popupMode=\"2\"] { padding-right: 10px; }" + "QToolButton::menu-indicator[popupMode=\"2\"] { subcontrol-origin: padding; subcontrol-position: bottom right; top: 5px; left: -3px; width: 7px; }" + ); + mFilterButton->move(2, 2); reposButtons(); } @@ -155,9 +159,6 @@ void LineEditClear::addFilter(const QIcon &icon, const QString &text, int id, co showFilterIcon(); if (mActionGroup == NULL) { - mFilterButton->setFixedSize(26, 16); - mFilterButton->setPopupMode(QToolButton::InstantPopup); - mActionGroup = new QActionGroup(this); mActionGroup->setExclusive(true); @@ -222,10 +223,19 @@ void LineEditClear::activateAction(QAction *action) setPlaceholderText(*description); } - QIcon icon = action->icon(); - if (icon.isNull()) { - icon = FilesDefs::getIconFromQtResourcePath(IMAGE_FILTER); - } - - mFilterButton->setIcon(icon); + setFilterButtonIcon(action->icon()); +} + +void LineEditClear::setFilterButtonIcon(const QIcon &icon) +{ + if (icon.isNull()) + mFilterButton->setIcon(FilesDefs::getIconFromQtResourcePath(IMAGE_FILTER)); + else + mFilterButton->setIcon(icon); + + ensurePolished(); + QFontMetrics fm(this->font()); + QSize size(fm.width("___"), fm.height()); + mFilterButton->setFixedSize(size); + mFilterButton->setIconSize(size); } diff --git a/retroshare-gui/src/gui/common/LineEditClear.h b/retroshare-gui/src/gui/common/LineEditClear.h index e8aea0626..ae30f6127 100644 --- a/retroshare-gui/src/gui/common/LineEditClear.h +++ b/retroshare-gui/src/gui/common/LineEditClear.h @@ -61,6 +61,7 @@ protected: #endif void reposButtons(); void activateAction(QAction *action); + void setFilterButtonIcon(const QIcon &icon); private slots: void updateClearButton(const QString &text); diff --git a/retroshare-gui/src/gui/common/NewFriendList.cpp b/retroshare-gui/src/gui/common/NewFriendList.cpp index ba794fafe..d151c6430 100644 --- a/retroshare-gui/src/gui/common/NewFriendList.cpp +++ b/retroshare-gui/src/gui/common/NewFriendList.cpp @@ -237,7 +237,7 @@ NewFriendList::NewFriendList(QWidget */*parent*/) : /* RsAutoUpdatePage(5000,par ui->peerTreeWidget->setColumnWidth(RsFriendListModel::COLUMN_THREAD_ID , 32 * fontWidth); ui->peerTreeWidget->setColumnWidth(RsFriendListModel::COLUMN_THREAD_LAST_CONTACT, 12 * fontWidth); - int avatarHeight = fontMetrics.height() * 3; + int avatarHeight = fontMetrics.height() * 2; ui->peerTreeWidget->setIconSize(QSize(avatarHeight, avatarHeight)); mModel->checkInternalData(true); @@ -376,7 +376,7 @@ void NewFriendList::addToolButton(QToolButton *toolButton) toolButton->setIconSize(QSize(S*1.5,S*1.5)); toolButton->setFocusPolicy(Qt::NoFocus); - ui->titleBarFrame->layout()->addWidget(toolButton); + ui->toolBarFrame->layout()->addWidget(toolButton); } void NewFriendList::saveExpandedPathsAndSelection(std::set& expanded_indexes, QString& sel) @@ -697,7 +697,7 @@ void NewFriendList::peerTreeWidgetCustomPopupMenu() mModel->getGroupData(parent,info); QAction *removeFromGroup = groupsMenu->addAction(tr("Remove from group ")+QString::fromUtf8(info.name.c_str())); - removeFromGroup->setData(parent.sibling(parent.row(),RsFriendListModel::COLUMN_THREAD_ID).data(Qt::DisplayRole)); + removeFromGroup->setData(QString::fromStdString(info.id.toStdString())); connect(removeFromGroup, SIGNAL(triggered()), this, SLOT(removeFromGroup())); } @@ -767,6 +767,7 @@ void NewFriendList::createNewGroup() { CreateGroup createGrpDialog (RsNodeGroupId(), this); createGrpDialog.exec(); + checkInternalData(true); } #ifdef NOT_USED diff --git a/retroshare-gui/src/gui/common/NewFriendList.ui b/retroshare-gui/src/gui/common/NewFriendList.ui index 3ec1c6c03..20ae02eb2 100644 --- a/retroshare-gui/src/gui/common/NewFriendList.ui +++ b/retroshare-gui/src/gui/common/NewFriendList.ui @@ -10,7 +10,7 @@ 292
- + 0 @@ -27,14 +27,14 @@ 0 - + QFrame::Box QFrame::Sunken - + 3 @@ -58,6 +58,11 @@ + + + 12 + + Qt::CustomContextMenu @@ -124,7 +129,7 @@ LineEditClear QLineEdit -
gui/common/LineEditClear.h
+
gui/common/LineEditClear.h
diff --git a/retroshare-gui/src/gui/common/StyledElidedLabel.cpp b/retroshare-gui/src/gui/common/RSComboBox.cpp similarity index 52% rename from retroshare-gui/src/gui/common/StyledElidedLabel.cpp rename to retroshare-gui/src/gui/common/RSComboBox.cpp index 43fc85220..e11a3c99d 100644 --- a/retroshare-gui/src/gui/common/StyledElidedLabel.cpp +++ b/retroshare-gui/src/gui/common/RSComboBox.cpp @@ -1,7 +1,7 @@ /******************************************************************************* - * gui/common/StyleElidedLabel.cpp * + * gui/common/RSComboBox.cpp * * * - * Copyright (c) 2014, RetroShare Team * + * Copyright (C) 2010, Retroshare Team * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Affero General Public License as * @@ -18,29 +18,42 @@ * * *******************************************************************************/ -#include -#include "StyledElidedLabel.h" +#include "RSComboBox.h" -/** Constructor */ -StyledElidedLabel::StyledElidedLabel(QWidget *parent) - : ElidedLabel(parent), _lastFactor(-1) +#include "gui/common/RSElidedItemDelegate.h" + +#include +#include + +RSComboBox::RSComboBox(QWidget *parent /*= nullptr*/) + :QComboBox(parent) { + // To Fix ComboBox item delegate not respecting stylesheet. See QDarkStyleSheet issues 214 + setItemDelegate(new RSElidedItemDelegate()); + view()->installEventFilter(this); } -StyledElidedLabel::StyledElidedLabel(const QString &text, QWidget *parent) - : ElidedLabel(text, parent), _lastFactor(-1) +bool RSComboBox::eventFilter(QObject *obj, QEvent *event) { -} + if(QAbstractItemView* view = dynamic_cast(obj)) + { + // To Fix ComboBox item delegate not respecting stylesheet. See QDarkStyleSheet issues 214 + // With QStyleItemDelegate QComboBox::item:checked doesn't works. + // With QComboBox ::item:checked, it's applied to hover ones. + if (event->type() == QEvent::Show) + { + if(QComboBox* cmb = dynamic_cast(view->parent()->parent()) ) + { + for (int curs = 0; curs < cmb->count(); ++curs) + { + QFont font = cmb->itemData(curs, Qt::FontRole).value(); + font.setBold(curs == cmb->currentIndex()); + cmb->setItemData(curs, QVariant(font), Qt::FontRole); -void StyledElidedLabel::setFontSizeFactor(int factor) -{ - int newFactor = factor; - if (factor > 0) { - if (_lastFactor > 0) newFactor = 100 + factor - _lastFactor; - _lastFactor = factor; - QFont f = font(); - qreal fontSize = newFactor * f.pointSizeF() / 100; - f.setPointSizeF(fontSize); - setFont(f); + } + } + } } + // pass the event on to the parent class + return QWidget::eventFilter(obj, event); } diff --git a/retroshare-gui/src/gui/common/StyledLabel.h b/retroshare-gui/src/gui/common/RSComboBox.h similarity index 74% rename from retroshare-gui/src/gui/common/StyledLabel.h rename to retroshare-gui/src/gui/common/RSComboBox.h index faf0654da..8ce46a649 100644 --- a/retroshare-gui/src/gui/common/StyledLabel.h +++ b/retroshare-gui/src/gui/common/RSComboBox.h @@ -1,7 +1,7 @@ /******************************************************************************* - * gui/common/StyledLabel.h * + * gui/common/RSComboBox.h * * * - * Copyright (c) 2014, RetroShare Team * + * Copyright (C) 2010, Retroshare Team * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Affero General Public License as * @@ -18,25 +18,19 @@ * * *******************************************************************************/ -#ifndef _STYLEDLABEL_H -#define _STYLEDLABEL_H +#ifndef RSCOMBOBOX_H +#define RSCOMBOBOX_H -#include +#include -class StyledLabel : public QLabel +class RSComboBox : public QComboBox { Q_OBJECT - Q_PROPERTY(int fontSizeFactor READ fontSizeFactor WRITE setFontSizeFactor) - public: - StyledLabel(QWidget *parent = NULL); - StyledLabel(const QString &text, QWidget *parent = NULL); + explicit RSComboBox(QWidget *parent = nullptr); - int fontSizeFactor(); - void setFontSizeFactor(int factor); - -private: - int mFontSizeFactor; +protected: + bool eventFilter(QObject *obj, QEvent *event); }; -#endif +#endif // RSCOMBOBOX_H diff --git a/retroshare-gui/src/gui/common/RSElidedItemDelegate.cpp b/retroshare-gui/src/gui/common/RSElidedItemDelegate.cpp index 34879b10c..eb017a033 100644 --- a/retroshare-gui/src/gui/common/RSElidedItemDelegate.cpp +++ b/retroshare-gui/src/gui/common/RSElidedItemDelegate.cpp @@ -20,7 +20,7 @@ #include "RSElidedItemDelegate.h" -#include "gui/common/StyledElidedLabel.h" +#include "gui/common/ElidedLabel.h" #include "util/rsdebug.h" #include @@ -385,7 +385,7 @@ void RSElidedItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem & const int textVMargin = ownStyle->pixelMetric(QStyle::PM_FocusFrameVMargin, nullptr, widget) + 1; textRect = textRect.adjusted(textHMargin, textVMargin, -textHMargin, -textVMargin); // remove width padding - StyledElidedLabel::paintElidedLine(painter,ownOption.text,textRect,ownOption.font,ownOption.displayAlignment,to.wrapMode(),mPaintRoundedRect); + ElidedLabel::paintElidedLine(painter,ownOption.text,textRect,ownOption.font,ownOption.displayAlignment,to.wrapMode(),mPaintRoundedRect); } painter->restore(); #ifdef DEBUG_EID_PAINT @@ -436,7 +436,7 @@ bool RSElidedItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, //Update RSElidedItemDelegate as only one delegate for all items QRect rectElision; - bool elided = StyledElidedLabel::paintElidedLine(nullptr,text,textRect,ownOption.font,ownOption.displayAlignment,to.wrapMode(),true,&rectElision); + bool elided = ElidedLabel::paintElidedLine(nullptr,text,textRect,ownOption.font,ownOption.displayAlignment,to.wrapMode(),true,&rectElision); if (elided && (rectElision.contains(ev->pos()))){ QToolTip::showText(ev->globalPos(),QString("") + text + QString("")); return true; // eat event diff --git a/retroshare-gui/src/gui/common/RSImageBlockWidget.cpp b/retroshare-gui/src/gui/common/RSImageBlockWidget.cpp index e1f517f42..63dd224f1 100644 --- a/retroshare-gui/src/gui/common/RSImageBlockWidget.cpp +++ b/retroshare-gui/src/gui/common/RSImageBlockWidget.cpp @@ -31,7 +31,7 @@ RSImageBlockWidget::RSImageBlockWidget(QWidget *parent) : ui->setupUi(this); mDefaultRect = this->geometry(); - ui->infoFrame->installEventFilter(this); + ui->info_Frame->installEventFilter(this); mTimer = new RsProtectedTimer(this); mTimer->setSingleShot(true); diff --git a/retroshare-gui/src/gui/common/RSImageBlockWidget.ui b/retroshare-gui/src/gui/common/RSImageBlockWidget.ui index f483a1afd..ab40c379d 100644 --- a/retroshare-gui/src/gui/common/RSImageBlockWidget.ui +++ b/retroshare-gui/src/gui/common/RSImageBlockWidget.ui @@ -33,10 +33,19 @@ 0 - + + + + + 0 + 0 + 0 + + + @@ -57,6 +66,15 @@ + + + + 0 + 0 + 0 + + + @@ -77,6 +95,15 @@ + + + + 154 + 154 + 154 + + + @@ -104,7 +131,7 @@ QFrame::Box - + 6 diff --git a/retroshare-gui/src/gui/common/RsCollectionDialog.ui b/retroshare-gui/src/gui/common/RsCollectionDialog.ui index ceaea3b99..d8693ef0a 100644 --- a/retroshare-gui/src/gui/common/RsCollectionDialog.ui +++ b/retroshare-gui/src/gui/common/RsCollectionDialog.ui @@ -23,7 +23,7 @@ true - + 0 @@ -50,14 +50,14 @@ - + QFrame::StyledPanel QFrame::Raised - + @@ -70,7 +70,7 @@ QFrame::Plain - + @@ -88,7 +88,7 @@ 0 - + 0 @@ -334,7 +334,7 @@ - + :/images/deletemail24.png:/images/deletemail24.png @@ -410,7 +410,7 @@ - + @@ -419,7 +419,7 @@ - + Qt::Horizontal @@ -498,7 +498,7 @@
- frame + gradFrame headerFrame
diff --git a/retroshare-gui/src/gui/common/StyledElidedLabel.h b/retroshare-gui/src/gui/common/StyledElidedLabel.h deleted file mode 100644 index d6467ab1f..000000000 --- a/retroshare-gui/src/gui/common/StyledElidedLabel.h +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* - * gui/common/StyleElidedLabel.h * - * * - * Copyright (c) 2014, RetroShare Team * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Affero General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * 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 Affero General Public License for more details. * - * * - * You should have received a copy of the GNU Affero General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -#ifndef _STYLEDELIDEDLABEL_H -#define _STYLEDELIDEDLABEL_H - -#include "ElidedLabel.h" - -class StyledElidedLabel : public ElidedLabel -{ - Q_OBJECT - Q_PROPERTY(int fontSizeFactor READ fontSizeFactor WRITE setFontSizeFactor) - -public: - StyledElidedLabel(QWidget *parent = NULL); - StyledElidedLabel(const QString &text, QWidget *parent = NULL); - - void setFontSizeFactor(int factor); - int fontSizeFactor() {return _lastFactor;} - -private: - int _lastFactor; -}; - -#endif diff --git a/retroshare-gui/src/gui/common/StyledLabel.cpp b/retroshare-gui/src/gui/common/StyledLabel.cpp deleted file mode 100644 index 2eabc9852..000000000 --- a/retroshare-gui/src/gui/common/StyledLabel.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* - * gui/common/StyledLabel.cpp * - * * - * Copyright (c) 2014, RetroShare Team * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Affero General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * 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 Affero General Public License for more details. * - * * - * You should have received a copy of the GNU Affero General Public License * - * along with this program. If not, see . * - * * - *******************************************************************************/ - -#include - -#include "StyledLabel.h" - -/** Constructor */ -StyledLabel::StyledLabel(QWidget *parent) - : QLabel(parent) -{ -} - -StyledLabel::StyledLabel(const QString &text, QWidget *parent) - : QLabel(text, parent) -{ -} - -int StyledLabel::fontSizeFactor() -{ - return mFontSizeFactor; -} - -void StyledLabel::setFontSizeFactor(int factor) -{ - mFontSizeFactor = factor; - - QFont f = font(); - qreal fontSize = mFontSizeFactor * f.pointSizeF() / 100; - f.setPointSizeF(fontSize); - setFont(f); -} diff --git a/retroshare-gui/src/gui/connect/ConfCertDialog.ui b/retroshare-gui/src/gui/connect/ConfCertDialog.ui index a2f94bc5b..93f9a86ba 100644 --- a/retroshare-gui/src/gui/connect/ConfCertDialog.ui +++ b/retroshare-gui/src/gui/connect/ConfCertDialog.ui @@ -6,8 +6,8 @@ 0 0 - 658 - 419 + 666 + 522 @@ -47,14 +47,14 @@
- + QFrame::StyledPanel QFrame::Raised - + diff --git a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp index 90f532fd5..c3463a79b 100755 --- a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp +++ b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp @@ -107,8 +107,8 @@ ConnectFriendWizard::ConnectFriendWizard(QWidget *parent) : //ui->foffRadioButton->hide(); //ui->rsidRadioButton->hide(); - ui->cp_Label->hide(); - ui->requestinfolabel->hide(); + ui->info_Label_FrdReq->hide(); + ui->info_Label_Request->hide(); connect(ui->acceptNoSignGPGCheckBox,SIGNAL(toggled(bool)), ui->_options_GB,SLOT(setEnabled(bool))) ; connect(ui->addKeyToKeyring_CB,SIGNAL(toggled(bool)), ui->acceptNoSignGPGCheckBox,SLOT(setChecked(bool))) ; @@ -295,8 +295,8 @@ void ConnectFriendWizard::setCertificate(const QString &certificate, bool friend setStartId(Page_Conclusion); if (friendRequest){ - ui->cp_Label->show(); - ui->requestinfolabel->show(); + ui->info_Label_FrdReq->show(); + ui->info_Label_Request->show(); setTitleText(ui->ConclusionPage, tr("Friend request")); ui->ConclusionPage->setSubTitle(tr("Details about the request")); setButtonText(QWizard::FinishButton , tr("Accept")); @@ -320,8 +320,8 @@ void ConnectFriendWizard::setCertificate(const QString &certificate, bool friend setStartId(Page_Conclusion); if (friendRequest){ - ui->cp_Label->show(); - ui->requestinfolabel->show(); + ui->info_Label_FrdReq->show(); + ui->info_Label_Request->show(); setTitleText(ui->ConclusionPage, tr("Friend request")); ui->ConclusionPage->setSubTitle(tr("Details about the request")); setButtonText(QWizard::FinishButton , tr("Accept")); @@ -358,8 +358,8 @@ void ConnectFriendWizard::setGpgId(const RsPgpId &gpgId, const RsPeerId &sslId, setStartId(Page_Conclusion); if (friendRequest){ - ui->cp_Label->show(); - ui->requestinfolabel->show(); + ui->info_Label_FrdReq->show(); + ui->info_Label_Request->show(); setTitleText(ui->ConclusionPage, tr("Friend request")); ui->ConclusionPage->setSubTitle(tr("Details about the request")); setButtonText(QWizard::FinishButton , tr("Accept")); @@ -374,8 +374,8 @@ void ConnectFriendWizard::setGpgId(const RsPgpId &gpgId, const RsPeerId &sslId, //setStartId(friendRequest ? Page_FriendRequest : Page_Conclusion); setStartId(Page_Conclusion); if (friendRequest){ - ui->cp_Label->show(); - ui->requestinfolabel->show(); + ui->info_Label_FrdReq->show(); + ui->info_Label_Request->show(); setTitleText(ui->ConclusionPage,tr("Friend request")); ui->ConclusionPage->setSubTitle(tr("Details about the request")); setButtonText(QWizard::FinishButton , tr("Accept")); @@ -530,7 +530,7 @@ void ConnectFriendWizard::initializePage(int id) } } - ui->cp_Label->setText(tr("You have a friend request from") + " " + QString::fromUtf8(peerDetails.name.c_str())); + ui->info_Label_FrdReq->setText(tr("You have a friend request from") + " " + QString::fromUtf8(peerDetails.name.c_str())); ui->nameEdit->setText(QString::fromUtf8(peerDetails.name.c_str())); ui->trustEdit->setText(trustString); ui->profileIdEdit->setText(QString::fromStdString(peerDetails.gpg_id.toStdString())); diff --git a/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui b/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui index 5e9cd7a34..f6ac10b5e 100644 --- a/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui +++ b/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui @@ -360,7 +360,7 @@ - + 0 @@ -370,6 +370,15 @@ + + + + 0 + 0 + 0 + + + @@ -390,6 +399,15 @@ + + + + 0 + 0 + 0 + + + @@ -410,6 +428,15 @@ + + + + 154 + 154 + 154 + + + @@ -431,6 +458,11 @@ + + + 10 + + true @@ -510,6 +542,14 @@ 0 + + + 11 + 75 + true + true + + Name: @@ -687,7 +727,7 @@ - + @@ -701,7 +741,7 @@ - +
@@ -767,10 +807,19 @@
- + + + + + 0 + 0 + 0 + + + @@ -791,6 +840,15 @@ + + + + 0 + 0 + 0 + + + @@ -811,6 +869,15 @@ + + + + 154 + 154 + 154 + + + @@ -832,6 +899,11 @@ + + + 12 + + true @@ -863,17 +935,17 @@ - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
ConnectFriendPage QWizardPage
gui/connect/ConnectFriendWizard.h
1
+ + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
RSPlainTextEdit QPlainTextEdit @@ -881,8 +953,8 @@
- + diff --git a/retroshare-gui/src/gui/connect/ConnectProgressDialog.cpp b/retroshare-gui/src/gui/connect/ConnectProgressDialog.cpp index ce1c843c8..e405430e5 100755 --- a/retroshare-gui/src/gui/connect/ConnectProgressDialog.cpp +++ b/retroshare-gui/src/gui/connect/ConnectProgressDialog.cpp @@ -235,38 +235,42 @@ void ConnectProgressDialog::initDialog() void ConnectProgressDialog::updateStatus() { - if (time(NULL) > mInitTS + CONNECT_TIMEOUT_PERIOD) - { - sayConnectTimeout(); - mState = CONNECT_STATE_FAILED; - } + if (time(NULL) > mInitTS + CONNECT_TIMEOUT_PERIOD) + { + sayConnectTimeout(); + mState = CONNECT_STATE_FAILED; + } - switch(mState) - { - case CONNECT_STATE_PROGRESS: + switch(mState) + { + case CONNECT_STATE_PROGRESS: - updateNetworkStatus(); - updateContactStatus(); + updateNetworkStatus(); + updateContactStatus(); + + if(!mIsPeerHiddenNode && !mAmIHiddenNode) + { #ifdef RS_USE_BITDHT - updateDhtStatus(); + updateDhtStatus(); #endif - updateLookupStatus(); - updateUdpStatus(); + updateLookupStatus(); + updateUdpStatus(); + } - return; - break; + return; + break; - default: - case CONNECT_STATE_CLOSED: - case CONNECT_STATE_FAILED: - case CONNECT_STATE_DENIED: - case CONNECT_STATE_CONNECTED: - break; - } + default: + case CONNECT_STATE_CLOSED: + case CONNECT_STATE_FAILED: + case CONNECT_STATE_DENIED: + case CONNECT_STATE_CONNECTED: + break; + } - /* shutdown actions */ - ui->progressFrame->setEnabled(false); - mTimer->stop(); + /* shutdown actions */ + ui->progressFrame->setEnabled(false); + mTimer->stop(); } @@ -282,42 +286,70 @@ void ConnectProgressDialog::stopAndClose() void ConnectProgressDialog::updateNetworkStatus() { - RsNetState netState = rsConfig->getNetState(); + QLabel *label = ui->NetResult; - QLabel *label = ui->NetResult; - switch(netState) - { - case RsNetState::BAD_UNKNOWN: - label->setText(tr("Unknown State")); - break; - case RsNetState::BAD_OFFLINE: - label->setText(tr("Offline")); - break; - case RsNetState::BAD_NATSYM: - label->setText(tr("Behind Symmetric NAT")); - break; - case RsNetState::BAD_NODHT_NAT: - label->setText(tr("Behind NAT & No DHT")); - break; - case RsNetState::WARNING_RESTART: - label->setText(tr("NET Restart")); - break; - case RsNetState::WARNING_NATTED: - label->setText(tr("Behind NAT")); - break; - case RsNetState::WARNING_NODHT: - label->setText(tr("No DHT")); - break; - case RsNetState::GOOD: - label->setText(tr("NET STATE GOOD!")); - break; - case RsNetState::ADV_FORWARD: - label->setText(tr("UNVERIFIABLE FORWARD!")); - break; - case RsNetState::ADV_DARK_FORWARD: - label->setText(tr("UNVERIFIABLE FORWARD & NO DHT")); - break; - } + if(mAmIHiddenNode || mIsPeerHiddenNode) + switch(rsConfig->getNetState()) + { + case RsNetState::BAD_UNKNOWN: + label->setText(tr("Unknown State")); + break; + case RsNetState::BAD_OFFLINE: + label->setText(tr("Offline")); + break; + case RsNetState::BAD_NATSYM: + label->setText(tr("Behind Symmetric NAT")); + break; + case RsNetState::WARNING_RESTART: + label->setText(tr("NET Restart")); + break; + case RsNetState::BAD_NODHT_NAT: + case RsNetState::WARNING_NATTED: + label->setText(tr("Behind NAT")); + break; + case RsNetState::WARNING_NODHT: + case RsNetState::GOOD: + label->setText(tr("NET STATE GOOD!")); + break; + case RsNetState::ADV_DARK_FORWARD: + case RsNetState::ADV_FORWARD: + label->setText(tr("UNVERIFIABLE FORWARD!")); + break; + } + else + switch(rsConfig->getNetState()) + { + case RsNetState::BAD_UNKNOWN: + label->setText(tr("Unknown State")); + break; + case RsNetState::BAD_OFFLINE: + label->setText(tr("Offline")); + break; + case RsNetState::BAD_NATSYM: + label->setText(tr("Behind Symmetric NAT")); + break; + case RsNetState::BAD_NODHT_NAT: + label->setText(tr("Behind NAT & No DHT")); + break; + case RsNetState::WARNING_RESTART: + label->setText(tr("NET Restart")); + break; + case RsNetState::WARNING_NATTED: + label->setText(tr("Behind NAT")); + break; + case RsNetState::WARNING_NODHT: + label->setText(tr("No DHT")); + break; + case RsNetState::GOOD: + label->setText(tr("NET STATE GOOD!")); + break; + case RsNetState::ADV_FORWARD: + label->setText(tr("UNVERIFIABLE FORWARD!")); + break; + case RsNetState::ADV_DARK_FORWARD: + label->setText(tr("UNVERIFIABLE FORWARD & NO DHT")); + break; + } } void ConnectProgressDialog::updateContactStatus() @@ -454,13 +486,9 @@ void ConnectProgressDialog::updateLookupStatus() mState = CONNECT_STATE_FAILED; if (mLookupStatus == CONNECT_LOOKUP_NODHTCONFIG) - { sayPeerNoDhtConfig(); - } else - { sayPeerOffline(); - } } case CONNECT_LOOKUP_FAIL: diff --git a/retroshare-gui/src/gui/connect/PGPKeyDialog.cpp b/retroshare-gui/src/gui/connect/PGPKeyDialog.cpp index b167ca1ed..cc86593c4 100644 --- a/retroshare-gui/src/gui/connect/PGPKeyDialog.cpp +++ b/retroshare-gui/src/gui/connect/PGPKeyDialog.cpp @@ -45,6 +45,8 @@ #include "util/DateTime.h" #include "util/misc.h" +#define FRIEND_OPTIONS_TAB_INDEX 2 + QMap PGPKeyDialog::instances_pgp; PGPKeyDialog *PGPKeyDialog::instance(const RsPgpId& pgp_id) @@ -199,11 +201,13 @@ void PGPKeyDialog::load() { ui.make_friend_button->hide(); ui.denyFriendButton->show(); + ui.stabWidget->setTabEnabled(FRIEND_OPTIONS_TAB_INDEX,true); } else { ui.make_friend_button->show(); ui.denyFriendButton->hide(); + ui.stabWidget->setTabEnabled(FRIEND_OPTIONS_TAB_INDEX,false); } //web of trust diff --git a/retroshare-gui/src/gui/connect/PGPKeyDialog.ui b/retroshare-gui/src/gui/connect/PGPKeyDialog.ui index 04b891fdf..a1e0f208e 100644 --- a/retroshare-gui/src/gui/connect/PGPKeyDialog.ui +++ b/retroshare-gui/src/gui/connect/PGPKeyDialog.ui @@ -30,14 +30,14 @@ 0 - + QFrame::StyledPanel QFrame::Raised - + 3 @@ -56,11 +56,11 @@ 0 - + Profile info - + 0 @@ -68,9 +68,9 @@ 6 - + - + @@ -103,7 +103,7 @@ - + <html><head/><body><p>The trust level is an optional and local parameter that you can set in order to remember your option about a given PGP key. It is not used whatsoever to authorize connections. </p></body></html> @@ -350,11 +350,11 @@ p, li { white-space: pre-wrap; } - + PGP key - + @@ -391,11 +391,11 @@ p, li { white-space: pre-wrap; } - + - Options + Friend options - + @@ -518,17 +518,22 @@ p, li { white-space: pre-wrap; } - - RSTextBrowser - QTextBrowser -
gui/common/RSTextBrowser.h
-
HeaderFrame QFrame
gui/common/HeaderFrame.h
1
+ + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+ + RSTextBrowser + QTextBrowser +
gui/common/RSTextBrowser.h
+
diff --git a/retroshare-gui/src/gui/feeds/AttachFileItem.ui b/retroshare-gui/src/gui/feeds/AttachFileItem.ui index d0421e864..b755fba22 100644 --- a/retroshare-gui/src/gui/feeds/AttachFileItem.ui +++ b/retroshare-gui/src/gui/feeds/AttachFileItem.ui @@ -16,15 +16,24 @@ 35 - + + + 0 + + + 0 + + + 0 + + + 0 + 0 - - 0 - - + 0 @@ -37,7 +46,7 @@ QFrame::Sunken - + 2 diff --git a/retroshare-gui/src/gui/feeds/BoardsCommentsItem.cpp b/retroshare-gui/src/gui/feeds/BoardsCommentsItem.cpp index 670567f03..814a915d9 100644 --- a/retroshare-gui/src/gui/feeds/BoardsCommentsItem.cpp +++ b/retroshare-gui/src/gui/feeds/BoardsCommentsItem.cpp @@ -536,9 +536,9 @@ void BoardsCommentsItem::setReadStatus(bool isNew, bool isUnread) ui->readButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/images/message-state-read.png")); } - ui->mainFrame->setProperty("new", isNew); - ui->mainFrame->style()->unpolish(ui->mainFrame); - ui->mainFrame->style()->polish( ui->mainFrame); + ui->feedFrame->setProperty("new", isNew); + ui->feedFrame->style()->unpolish(ui->feedFrame); + ui->feedFrame->style()->polish( ui->feedFrame); } void BoardsCommentsItem::toggle() diff --git a/retroshare-gui/src/gui/feeds/BoardsCommentsItem.ui b/retroshare-gui/src/gui/feeds/BoardsCommentsItem.ui index b3e529091..53e233e0b 100644 --- a/retroshare-gui/src/gui/feeds/BoardsCommentsItem.ui +++ b/retroshare-gui/src/gui/feeds/BoardsCommentsItem.ui @@ -10,7 +10,14 @@ 157 - + + + 12 + 75 + true + + + 1 @@ -24,7 +31,7 @@ 1 - + 0 @@ -40,7 +47,7 @@ QFrame::Sunken - + 9 @@ -53,7 +60,7 @@ 8 - + @@ -68,6 +75,7 @@ + 12 75 true @@ -131,6 +139,7 @@ + 12 75 true @@ -147,6 +156,7 @@ + 12 75 true @@ -160,7 +170,7 @@ - + Qt::Horizontal @@ -242,7 +252,7 @@ - + @@ -275,7 +285,7 @@ - + Qt::Vertical @@ -291,7 +301,7 @@ - + 0 @@ -312,7 +322,7 @@ QFrame::Sunken - + 5 @@ -367,7 +377,7 @@ - + 3 @@ -384,7 +394,7 @@ 3 - + Qt::Horizontal @@ -403,6 +413,7 @@ + 12 75 true @@ -425,7 +436,9 @@ + 12 75 + true true @@ -449,6 +462,8 @@ MS Sans Serif 10 + 75 + true @@ -483,8 +498,6 @@
gui/gxs/GxsIdLabel.h
- - - + diff --git a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp index 88b724598..7f1b23a92 100644 --- a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp +++ b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.cpp @@ -175,9 +175,9 @@ void ChannelsCommentsItem::setup() // hide expand button, replies is not implemented yet ui->expandButton->hide(); - ui->mainFrame->setProperty("new", false); - ui->mainFrame->style()->unpolish(ui->mainFrame); - ui->mainFrame->style()->polish( ui->mainFrame); + ui->feedFrame->setProperty("new", false); + ui->feedFrame->style()->unpolish(ui->feedFrame); + ui->feedFrame->style()->polish( ui->feedFrame); ui->expandFrame->hide(); } @@ -305,7 +305,8 @@ void ChannelsCommentsItem::loadMessage() RsQThreadUtils::postToObject( [cmt,this]() { - uint32_t autorized_lines = (int)floor((ui->avatarLabel->height() - ui->buttonHLayout->sizeHint().height())/QFontMetricsF(ui->subjectLabel->font()).height()); + uint32_t autorized_lines = (int)floor( (ui->avatarLabel->height() - ui->button_HL->sizeHint().height()) + / QFontMetricsF(ui->subjectLabel->font()).height()); ui->commLabel->setText(RsHtml().formatText(NULL, RsStringUtil::CopyLines(QString::fromUtf8(cmt.mComment.c_str()), autorized_lines), RSHTML_FORMATTEXT_EMBED_LINKS)); @@ -368,7 +369,7 @@ void ChannelsCommentsItem::loadComment() int comNb = comments.size(); - RsQThreadUtils::postToObject( [comNb,this]() + RsQThreadUtils::postToObject( [comNb]() { QString sComButText = tr("Comment"); if (comNb == 1) @@ -434,7 +435,8 @@ void ChannelsCommentsItem::fill() /* subject */ //ui->titleLabel->setText(QString::fromUtf8(mPost.mMeta.mMsgName.c_str())); - uint32_t autorized_lines = (int)floor((ui->avatarLabel->height() - ui->buttonHLayout->sizeHint().height())/QFontMetricsF(ui->subjectLabel->font()).height()); + //uint32_t autorized_lines = (int)floor( (ui->avatarLabel->height() - ui->button_HL->sizeHint().height()) + // / QFontMetricsF(ui->subjectLabel->font()).height()); // fill first 4 lines of message. (csoler) Disabled the replacement of smileys and links, because the cost is too crazy //ui->subjectLabel->setText(RsHtml().formatText(NULL, RsStringUtil::CopyLines(QString::fromUtf8(mPost.mMsg.c_str()), autorized_lines), RSHTML_FORMATTEXT_EMBED_SMILEYS | RSHTML_FORMATTEXT_EMBED_LINKS)); @@ -534,9 +536,9 @@ void ChannelsCommentsItem::setReadStatus(bool isNew, bool isUnread) ui->readButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/images/message-state-read.png")); } - ui->mainFrame->setProperty("new", isNew); - ui->mainFrame->style()->unpolish(ui->mainFrame); - ui->mainFrame->style()->polish( ui->mainFrame); + ui->feedFrame->setProperty("new", isNew); + ui->feedFrame->style()->unpolish(ui->feedFrame); + ui->feedFrame->style()->polish( ui->feedFrame); } void ChannelsCommentsItem::doExpand(bool open) diff --git a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.ui b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.ui index 45c55b841..cd0265c1d 100644 --- a/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.ui +++ b/retroshare-gui/src/gui/feeds/ChannelsCommentsItem.ui @@ -10,7 +10,7 @@ 157
- + 1 @@ -24,7 +24,7 @@ 1 - + 0 @@ -40,7 +40,7 @@ QFrame::Sunken - + 9 @@ -51,12 +51,12 @@ 3 - + 8 - + @@ -134,6 +134,7 @@ + 12 75 true @@ -150,6 +151,7 @@ + 12 75 true @@ -163,7 +165,7 @@ - + Qt::Horizontal @@ -272,7 +274,7 @@ 3 - + Qt::Horizontal @@ -313,7 +315,9 @@ + 11 75 + true true @@ -360,7 +364,7 @@ - + @@ -393,7 +397,7 @@ - + Qt::Vertical @@ -409,7 +413,7 @@ - + 0 @@ -430,7 +434,7 @@ QFrame::Sunken - + 5 @@ -486,8 +490,6 @@
gui/gxs/GxsIdLabel.h
- - - + diff --git a/retroshare-gui/src/gui/feeds/ChatMsgItem.ui b/retroshare-gui/src/gui/feeds/ChatMsgItem.ui index 2a8725b09..64c994b6f 100644 --- a/retroshare-gui/src/gui/feeds/ChatMsgItem.ui +++ b/retroshare-gui/src/gui/feeds/ChatMsgItem.ui @@ -10,7 +10,7 @@ 209 - + 1 @@ -24,7 +24,7 @@ 1 - + 0 @@ -40,9 +40,9 @@ QFrame::Sunken - + - + @@ -60,7 +60,7 @@ - + Qt::Vertical @@ -75,7 +75,12 @@ - + + + + 17 + + Peer Name @@ -85,7 +90,7 @@ - + Qt::Horizontal @@ -149,7 +154,7 @@ - + 0 @@ -247,7 +252,7 @@ - + Qt::Horizontal @@ -307,7 +312,7 @@ - + 0 @@ -345,11 +350,6 @@
gui/common/AvatarWidget.h
1 - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
diff --git a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.ui b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.ui index b5c3eb9aa..6c568993d 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.ui +++ b/retroshare-gui/src/gui/feeds/GxsChannelGroupItem.ui @@ -10,7 +10,15 @@ 161
- + + + 11 + 75 + true + true + + + 1 @@ -24,7 +32,7 @@ 1 - + 0 @@ -34,6 +42,15 @@ + + + + 0 + 0 + 0 + + + @@ -54,6 +71,15 @@ + + + + 0 + 0 + 0 + + + @@ -74,6 +100,15 @@ + + + + 154 + 154 + 154 + + + @@ -104,9 +139,9 @@ QFrame::Sunken - + - + @@ -133,7 +168,7 @@ - + @@ -144,6 +179,7 @@ + 11 75 true true @@ -158,7 +194,9 @@ + 11 75 + true true @@ -171,7 +209,7 @@ - + Qt::Horizontal @@ -186,7 +224,7 @@ - + @@ -207,7 +245,7 @@ - + Qt::Horizontal @@ -282,7 +320,7 @@ - + 0 @@ -303,7 +341,7 @@ Channel Description - + @@ -341,7 +379,6 @@ - diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp index 733e3048b..f95c9bcb3 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.cpp @@ -221,9 +221,9 @@ void GxsChannelPostItem::setup() //ui->subjectLabel->setMinimumWidth(100); //ui->warning_label->setMinimumWidth(100); - ui->mainFrame->setProperty("new", false); - ui->mainFrame->style()->unpolish(ui->mainFrame); - ui->mainFrame->style()->polish( ui->mainFrame); + ui->feedFrame->setProperty("new", false); + ui->feedFrame->style()->unpolish(ui->feedFrame); + ui->feedFrame->style()->polish( ui->feedFrame); ui->expandFrame->hide(); } @@ -647,9 +647,9 @@ void GxsChannelPostItem::setReadStatus(bool isNew, bool isUnread) ui->newLabel->setVisible(isNew); - ui->mainFrame->setProperty("new", isNew); - ui->mainFrame->style()->unpolish(ui->mainFrame); - ui->mainFrame->style()->polish( ui->mainFrame); + ui->feedFrame->setProperty("new", isNew); + ui->feedFrame->style()->unpolish(ui->feedFrame); + ui->feedFrame->style()->polish( ui->feedFrame); } // void GxsChannelPostItem::setFileCleanUpWarning(uint32_t time_left) diff --git a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.ui b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.ui index 3ce8c06b3..578fa1637 100644 --- a/retroshare-gui/src/gui/feeds/GxsChannelPostItem.ui +++ b/retroshare-gui/src/gui/feeds/GxsChannelPostItem.ui @@ -10,7 +10,7 @@ 231 - + 1 @@ -30,7 +30,7 @@ 1 - + 0 @@ -46,11 +46,11 @@ QFrame::Sunken - + - + @@ -86,6 +86,7 @@ + 11 75 true true @@ -125,7 +126,7 @@ - + Qt::Vertical @@ -139,6 +140,14 @@ + + + 11 + 75 + false + true + + TextLabel @@ -317,7 +326,7 @@ - + Qt::Horizontal @@ -385,7 +394,7 @@ - + 0 @@ -406,7 +415,7 @@ QFrame::Sunken - + 5 @@ -451,7 +460,7 @@ - + Qt::Vertical @@ -472,7 +481,7 @@ ElidedLabel QLabel -
gui/common/ElidedLabel.h
+
gui/common/ElidedLabel.h
1
diff --git a/retroshare-gui/src/gui/feeds/GxsCircleItem.ui b/retroshare-gui/src/gui/feeds/GxsCircleItem.ui index c295d1b57..7a77f5bda 100644 --- a/retroshare-gui/src/gui/feeds/GxsCircleItem.ui +++ b/retroshare-gui/src/gui/feeds/GxsCircleItem.ui @@ -10,7 +10,7 @@ 108
- + 1 @@ -24,7 +24,7 @@ 1 - + 0 @@ -34,6 +34,15 @@ + + + + 0 + 0 + 0 + + + @@ -54,6 +63,15 @@ + + + + 0 + 0 + 0 + + + @@ -74,6 +92,15 @@ + + + + 154 + 154 + 154 + + + @@ -104,7 +131,7 @@ QFrame::Sunken - + @@ -131,9 +158,9 @@ - + - + @@ -154,8 +181,9 @@ - 10 + 11 75 + true true @@ -177,6 +205,7 @@ + 11 75 true true @@ -188,7 +217,7 @@ - + Qt::Horizontal @@ -203,9 +232,9 @@ - + - + 10 @@ -220,6 +249,14 @@ + + + 11 + 75 + true + true + + name @@ -244,7 +281,7 @@ - + @@ -306,7 +343,7 @@ - + Qt::Horizontal @@ -358,8 +395,8 @@ - + diff --git a/retroshare-gui/src/gui/feeds/GxsForumGroupItem.ui b/retroshare-gui/src/gui/feeds/GxsForumGroupItem.ui index 88000d0cb..14cb13620 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumGroupItem.ui +++ b/retroshare-gui/src/gui/feeds/GxsForumGroupItem.ui @@ -10,7 +10,7 @@ 464 - + 1 @@ -24,7 +24,7 @@ 1 - + 0 @@ -34,6 +34,15 @@ + + + + 0 + 0 + 0 + + + @@ -54,6 +63,15 @@ + + + + 0 + 0 + 0 + + + @@ -74,6 +92,15 @@ + + + + 154 + 154 + 154 + + + @@ -104,9 +131,9 @@ QFrame::Sunken - + - + @@ -133,7 +160,7 @@ - + @@ -144,6 +171,7 @@ + 11 75 true true @@ -158,7 +186,9 @@ + 11 75 + true true @@ -171,7 +201,7 @@ - + Qt::Horizontal @@ -186,7 +216,7 @@ - + @@ -207,7 +237,7 @@ - + Qt::Horizontal @@ -282,7 +312,7 @@ - + 0 @@ -303,7 +333,7 @@ Forum Description - + @@ -339,7 +369,7 @@ Moderator list - + 0 @@ -367,7 +397,6 @@ - diff --git a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp index af80babd5..5c33b4f13 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.cpp @@ -106,7 +106,7 @@ void GxsForumMsgItem::setup() connect(ui->subjectLabel, SIGNAL(linkActivated(QString)), this, SLOT(on_linkActivated(QString))); ui->timestamplabel->clear(); ui->parentNameLabel->clear(); - ui->nameLabel->clear(); + ui->currNameLabel->clear(); /* general ones */ connect(ui->expandButton, SIGNAL(clicked()), this, SLOT(toggle())); @@ -347,12 +347,12 @@ void GxsForumMsgItem::fillMessage() if(idDetails.mAvatar.mSize == 0 || !GxsIdDetails::loadPixmapFromData(idDetails.mAvatar.mData, idDetails.mAvatar.mSize, pixmap,GxsIdDetails::SMALL)) pixmap = GxsIdDetails::makeDefaultIcon(mMessage.mMeta.mAuthorId,GxsIdDetails::SMALL); - ui->avatar->setPixmap(pixmap); + ui->currAvatar->setPixmap(pixmap); - ui->nameLabel->setId(mMessage.mMeta.mAuthorId); + ui->currNameLabel->setId(mMessage.mMeta.mAuthorId); RetroShareLink msgLink = RetroShareLink::createGxsMessageLink(RetroShareLink::TYPE_FORUM, mMessage.mMeta.mGroupId, mMessage.mMeta.mMsgId, messageName()); - ui->subLabel->setText(msgLink.toHtml()); + ui->currSubLabel->setText(msgLink.toHtml()); if (wasExpanded() || ui->expandFrame->isVisible()) fillExpandFrame(); @@ -386,7 +386,7 @@ void GxsForumMsgItem::fillGroup() void GxsForumMsgItem::fillExpandFrame() { - ui->msgLabel->setText(RsHtml().formatText(NULL, QString::fromUtf8(mMessage.mMsg.c_str()), RSHTML_FORMATTEXT_EMBED_SMILEYS | RSHTML_FORMATTEXT_EMBED_LINKS)); + ui->currMsgLabel->setText(RsHtml().formatText(NULL, QString::fromUtf8(mMessage.mMsg.c_str()), RSHTML_FORMATTEXT_EMBED_SMILEYS | RSHTML_FORMATTEXT_EMBED_LINKS)); } QString GxsForumMsgItem::messageName() @@ -445,9 +445,9 @@ void GxsForumMsgItem::toggle() void GxsForumMsgItem::setReadStatus(bool isNew, bool /*isUnread*/) { - ui->mainFrame->setProperty("new", isNew); - ui->mainFrame->style()->unpolish(ui->mainFrame); - ui->mainFrame->style()->polish( ui->mainFrame); + ui->feedFrame->setProperty("new", isNew); + ui->feedFrame->style()->unpolish(ui->feedFrame); + ui->feedFrame->style()->polish( ui->feedFrame); } /*********** SPECIFIC FUNCTIONS ***********************/ diff --git a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.ui b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.ui index 5967010b7..89aec4e1b 100644 --- a/retroshare-gui/src/gui/feeds/GxsForumMsgItem.ui +++ b/retroshare-gui/src/gui/feeds/GxsForumMsgItem.ui @@ -10,7 +10,7 @@ 360 - + 1 @@ -24,7 +24,7 @@ 1 - + 0 @@ -34,6 +34,15 @@ + + + + 0 + 0 + 0 + + + @@ -45,6 +54,15 @@ + + + + 0 + 0 + 0 + + + @@ -56,6 +74,15 @@ + + + + 154 + 154 + 154 + + + @@ -77,7 +104,7 @@ QFrame::Sunken - + @@ -104,7 +131,7 @@ - + @@ -115,7 +142,9 @@ + 11 75 + true true @@ -134,7 +163,7 @@ - + Qt::Horizontal @@ -165,9 +194,9 @@ - + - + 75 @@ -196,7 +225,7 @@ - + Qt::Horizontal @@ -299,7 +328,7 @@ - + 32 @@ -331,9 +360,9 @@ - + - + 0 @@ -371,7 +400,7 @@ - + Qt::Horizontal @@ -389,7 +418,7 @@ - + Qt::Vertical @@ -402,7 +431,7 @@ - + @@ -426,7 +455,7 @@ - + Qt::Horizontal @@ -454,9 +483,9 @@ QFrame::Sunken - + - + 32 @@ -472,10 +501,12 @@ - + + 11 75 + true true @@ -488,9 +519,9 @@ - + - + 0 @@ -509,7 +540,7 @@ - + 0 @@ -530,7 +561,7 @@ - + Qt::Vertical @@ -543,9 +574,9 @@ - + - + 0 @@ -587,13 +618,12 @@ AvatarWidget - QLabel + QWidget
gui/common/AvatarWidget.h
1
- diff --git a/retroshare-gui/src/gui/feeds/MsgItem.cpp b/retroshare-gui/src/gui/feeds/MsgItem.cpp index 87a01bcd9..66ae5f49b 100644 --- a/retroshare-gui/src/gui/feeds/MsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/MsgItem.cpp @@ -67,7 +67,7 @@ MsgItem::MsgItem(FeedHolder *parent, uint32_t feedId, const std::string &msgId, expandFrame->hide(); - inviteFrame->hide(); + info_Frame_Invite->hide(); updateItemStatic(); updateItem(); @@ -122,14 +122,14 @@ void MsgItem::updateItemStatic() title = QString::fromUtf8(mi.title.c_str()) + " " + tr("from") + " " + srcName; replyButton->setText(tr("Reply to invite")); subjectLabel->hide(); - inviteFrame->show(); + info_Frame_Invite->show(); } else if ((mi.msgflags & RS_MSG_USER_REQUEST) && mi.rsgxsid_srcId.isNull()) { title = QString::fromUtf8(mi.title.c_str()) + " " + " " + srcName; subjectLabel->hide(); - inviteFrame->show(); - infoLabel->setText(tr("This message invites you to make friend! You may accept this request.")); + info_Frame_Invite->show(); + infoLabel_Invite->setText(tr("This message invites you to make friend! You may accept this request.")); sendinviteButton->hide(); replyButton->hide(); } @@ -137,7 +137,7 @@ void MsgItem::updateItemStatic() { title = tr("Message From") + ": " + srcName; sendinviteButton->hide(); - inviteFrame->hide(); + info_Frame_Invite->hide(); } } else diff --git a/retroshare-gui/src/gui/feeds/MsgItem.ui b/retroshare-gui/src/gui/feeds/MsgItem.ui index 9075554a9..b195e80c6 100644 --- a/retroshare-gui/src/gui/feeds/MsgItem.ui +++ b/retroshare-gui/src/gui/feeds/MsgItem.ui @@ -10,7 +10,7 @@ 180
- + 1 @@ -24,7 +24,7 @@ 1
- + 0 @@ -40,10 +40,10 @@ QFrame::Sunken - + - - + + 0 @@ -57,7 +57,7 @@ 0 - + 70 @@ -82,7 +82,7 @@ - 12 + 11 75 true true @@ -97,7 +97,7 @@ - + Qt::Horizontal @@ -142,7 +142,7 @@ - + @@ -164,7 +164,7 @@ - + Qt::Horizontal @@ -259,10 +259,19 @@ - + + + + + 0 + 0 + 0 + + + @@ -283,6 +292,15 @@ + + + + 0 + 0 + 0 + + + @@ -303,6 +321,15 @@ + + + + 154 + 154 + 154 + + + @@ -333,7 +360,7 @@ QFrame::Box - + 6 @@ -347,7 +374,7 @@ 6 - + 16 @@ -366,7 +393,7 @@ - + This message invites you to make friend! You may accept this request and send your own Certificate back @@ -380,7 +407,7 @@ - + @@ -412,7 +439,7 @@ AvatarWidget - QLabel + QWidget
gui/common/AvatarWidget.h
1
diff --git a/retroshare-gui/src/gui/feeds/PeerItem.ui b/retroshare-gui/src/gui/feeds/PeerItem.ui index 230cbd7a4..cf66466f3 100644 --- a/retroshare-gui/src/gui/feeds/PeerItem.ui +++ b/retroshare-gui/src/gui/feeds/PeerItem.ui @@ -13,7 +13,7 @@ false - + 1 @@ -27,7 +27,7 @@ 1
- + 0 @@ -43,13 +43,13 @@ QFrame::Sunken - + 0 - + 0 @@ -60,7 +60,7 @@ 0 - + 70 @@ -76,9 +76,14 @@ - + - + + + + 17 + + Peer Name @@ -97,6 +102,7 @@ + 11 75 true true @@ -113,9 +119,9 @@ - + - + Qt::Horizontal @@ -152,7 +158,7 @@ - + @@ -203,7 +209,7 @@ - + Qt::Horizontal @@ -265,11 +271,11 @@ - + - + - + @@ -397,7 +403,7 @@ - + @@ -406,6 +412,14 @@ 0 + + + 11 + 75 + true + true + + TextLabel @@ -508,18 +522,12 @@ AvatarWidget - QLabel + QWidget
gui/common/AvatarWidget.h
1
- - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
- diff --git a/retroshare-gui/src/gui/feeds/PostedGroupItem.ui b/retroshare-gui/src/gui/feeds/PostedGroupItem.ui index 27226fd28..636cc2c54 100644 --- a/retroshare-gui/src/gui/feeds/PostedGroupItem.ui +++ b/retroshare-gui/src/gui/feeds/PostedGroupItem.ui @@ -10,7 +10,7 @@ 161 - + 1 @@ -24,7 +24,7 @@ 1 - + 0 @@ -34,6 +34,15 @@ + + + + 0 + 0 + 0 + + + @@ -54,6 +63,15 @@ + + + + 0 + 0 + 0 + + + @@ -74,6 +92,15 @@ + + + + 154 + 154 + 154 + + + @@ -104,9 +131,9 @@ QFrame::Sunken - + - + @@ -133,7 +160,7 @@ - + @@ -144,6 +171,7 @@ + 11 75 true true @@ -158,7 +186,9 @@ + 11 75 + true true @@ -171,7 +201,7 @@ - + Qt::Horizontal @@ -186,7 +216,7 @@ - + @@ -207,7 +237,7 @@ - + Qt::Horizontal @@ -282,7 +312,7 @@ - + 0 @@ -303,14 +333,14 @@ Board Description - + - :/images/contacts24.png + :/images/contacts24.png @@ -340,8 +370,6 @@ - - diff --git a/retroshare-gui/src/gui/feeds/SecurityIpItem.ui b/retroshare-gui/src/gui/feeds/SecurityIpItem.ui index a9471c6b1..11a742880 100644 --- a/retroshare-gui/src/gui/feeds/SecurityIpItem.ui +++ b/retroshare-gui/src/gui/feeds/SecurityIpItem.ui @@ -10,7 +10,7 @@ 185 - + 1 @@ -24,7 +24,7 @@ 1 - + 0 @@ -43,12 +43,12 @@ QFrame::Sunken - + 0 - + 0 @@ -66,7 +66,7 @@ 0 - + 70 @@ -79,13 +79,141 @@ 70 - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - + + + + 6 + + + 0 + + + + + + 11 + 75 + true + true + + + + Title + + + + + + + + 0 + 0 + + + + + 10 + + + + IP address: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + + <html><head/><body><p>This warning is here to protect you against traffic forwarding attacks. In such a case, the friend you're connected to will not see your external IP, but the attacker's IP. </p><p><br/></p><p>However, if you just changed IPs for some reason (some ISPs regularly force change IPs) this warning just tells you that a friend connected to the new IP before Retroshare figured out the IP changed. Nothing's wrong in this case.</p><p><br/></p><p>You can easily suppress false warnings by white-listing your own IPs (e.g. the range of your ISP), or by completely disabling these warnings in Options-&gt;Notify-&gt;News Feed.</p></body></html> + + + IP Address + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + but reported: + + + + + + + + 0 + 0 + + + + IP address reported + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + Peer: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + Name (Location) + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + + + + + + 75 + true + + + + TextLabel + + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + + + + - + 6 @@ -142,7 +270,7 @@ - + Qt::Horizontal @@ -196,130 +324,12 @@ - - - - - - - 75 - true - - - - TextLabel - - - Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing - - - - - - - - - 6 - - - 0 - - - - - - 0 - 0 - - - - IP address: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - true - - - - - - - <html><head/><body><p>This warning is here to protect you against traffic forwarding attacks. In such a case, the friend you're connected to will not see your external IP, but the attacker's IP. </p><p><br/></p><p>However, if you just changed IPs for some reason (some ISPs regularly force change IPs) this warning just tells you that a friend connected to the new IP before Retroshare figured out the IP changed. Nothing's wrong in this case.</p><p><br/></p><p>You can easily suppress false warnings by white-listing your own IPs (e.g. the range of your ISP), or by completely disabling these warnings in Options-&gt;Notify-&gt;News Feed.</p></body></html> - - - IP Address - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - - - but reported: - - - - - - - - 0 - 0 - - - - IP address reported - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - - - Peer: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Title - - - - - - - - 0 - 0 - - - - Name (Location) - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - -
- + @@ -333,22 +343,6 @@ - - - - - 0 - 0 - - - - Location - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - @@ -365,19 +359,6 @@ - - - - - 75 - true - - - - Location: - - - @@ -401,6 +382,35 @@ + + + + + 75 + true + + + + Location: + + + + + + + + 0 + 0 + + + + Location + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + @@ -412,15 +422,10 @@ AvatarWidget - QLabel + QWidget
gui/common/AvatarWidget.h
1
- - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
RsBanListToolButton QToolButton diff --git a/retroshare-gui/src/gui/feeds/SecurityItem.ui b/retroshare-gui/src/gui/feeds/SecurityItem.ui index de674a133..bc0524d18 100644 --- a/retroshare-gui/src/gui/feeds/SecurityItem.ui +++ b/retroshare-gui/src/gui/feeds/SecurityItem.ui @@ -10,7 +10,7 @@ 246 - + 1 @@ -24,7 +24,7 @@ 1 - + 0 @@ -40,13 +40,13 @@ QFrame::Sunken - + 0 - - + + 0 @@ -63,7 +63,7 @@ 0 - + 70 @@ -76,13 +76,10 @@ 70 - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - + 6 @@ -90,7 +87,12 @@ 0 - + + + + 17 + + Peer Name @@ -109,6 +111,7 @@ + 11 75 true true @@ -123,13 +126,18 @@ - + 0 0 + + + 17 + + wants to be friend with you on RetroShare @@ -144,7 +152,7 @@ - + @@ -164,7 +172,7 @@ - + 6 @@ -276,7 +284,7 @@ - + Qt::Horizontal @@ -292,7 +300,7 @@ - + Qt::Horizontal @@ -351,11 +359,11 @@ - + - + - + @@ -463,7 +471,7 @@ - + @@ -472,6 +480,14 @@ 0 + + + 11 + 75 + true + true + + TextLabel @@ -570,19 +586,14 @@ AvatarWidget - QLabel + QWidget
gui/common/AvatarWidget.h
1
- - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
- + diff --git a/retroshare-gui/src/gui/feeds/SubFileItem.ui b/retroshare-gui/src/gui/feeds/SubFileItem.ui index 6717836b5..8fdd8230d 100644 --- a/retroshare-gui/src/gui/feeds/SubFileItem.ui +++ b/retroshare-gui/src/gui/feeds/SubFileItem.ui @@ -10,7 +10,7 @@ 128 - + 0 @@ -27,16 +27,16 @@ 0 - + QFrame::Box QFrame::Sunken - + - + @@ -215,7 +215,7 @@ - + diff --git a/retroshare-gui/src/gui/groups/CreateGroup.ui b/retroshare-gui/src/gui/groups/CreateGroup.ui index 7abcd5a4e..838a15ac6 100644 --- a/retroshare-gui/src/gui/groups/CreateGroup.ui +++ b/retroshare-gui/src/gui/groups/CreateGroup.ui @@ -13,27 +13,36 @@ Create a Group - + + + 0 + + + 0 + + + 0 + + + 0 + 6 0 - - 0 - - + QFrame::StyledPanel QFrame::Raised - + - + diff --git a/retroshare-gui/src/gui/gxs/GxsCircleChooser.cpp b/retroshare-gui/src/gui/gxs/GxsCircleChooser.cpp index 630a3efbe..9e56c53cd 100644 --- a/retroshare-gui/src/gui/gxs/GxsCircleChooser.cpp +++ b/retroshare-gui/src/gui/gxs/GxsCircleChooser.cpp @@ -20,15 +20,15 @@ #include "GxsCircleChooser.h" -#include #include +#include #include /** Constructor */ GxsCircleChooser::GxsCircleChooser(QWidget *parent) -: QComboBox(parent) + : RSComboBox(parent) { return; } diff --git a/retroshare-gui/src/gui/gxs/GxsCircleChooser.h b/retroshare-gui/src/gui/gxs/GxsCircleChooser.h index f78b350b8..37234b230 100644 --- a/retroshare-gui/src/gui/gxs/GxsCircleChooser.h +++ b/retroshare-gui/src/gui/gxs/GxsCircleChooser.h @@ -21,17 +21,18 @@ #ifndef _GXS_CIRCLES_CHOOSER_H #define _GXS_CIRCLES_CHOOSER_H -#include +#include "gui/common/RSComboBox.h" + #include -class GxsCircleChooser : public QComboBox +class GxsCircleChooser : public RSComboBox { - Q_OBJECT + Q_OBJECT public: - GxsCircleChooser(QWidget *parent = NULL); + GxsCircleChooser(QWidget *parent = nullptr); - void loadCircles(const RsGxsCircleId &defaultId); + void loadCircles(const RsGxsCircleId &defaultId); bool getChosenCircle(RsGxsCircleId &id); private: diff --git a/retroshare-gui/src/gui/gxs/GxsCommentContainer.ui b/retroshare-gui/src/gui/gxs/GxsCommentContainer.ui index bad001d4f..72b64e4e0 100644 --- a/retroshare-gui/src/gui/gxs/GxsCommentContainer.ui +++ b/retroshare-gui/src/gui/gxs/GxsCommentContainer.ui @@ -46,7 +46,14 @@ - + + + + 12 + 75 + true + + Comment Container @@ -87,12 +94,7 @@
gui/common/RSTabWidget.h
1
- - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
-
+ diff --git a/retroshare-gui/src/gui/gxs/GxsCommentDialog.ui b/retroshare-gui/src/gui/gxs/GxsCommentDialog.ui index 734e490ca..7b50494d6 100644 --- a/retroshare-gui/src/gui/gxs/GxsCommentDialog.ui +++ b/retroshare-gui/src/gui/gxs/GxsCommentDialog.ui @@ -97,7 +97,13 @@
- + + + + 75 + true + + <html><head/><body><p><span style=" font-family:'-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol'; font-size:14px; color:#24292e; background-color:#ffffff;">sort by</span></p></body></html> @@ -174,15 +180,20 @@
+ + GxsCommentTreeWidget + QTreeWidget +
gui/gxs/GxsCommentTreeWidget.h
+
GxsIdChooser QComboBox
gui/gxs/GxsIdChooser.h
- GxsCommentTreeWidget - QTreeWidget -
gui/gxs/GxsCommentTreeWidget.h
+ RSComboBox + QComboBox +
gui/common/RSComboBox.h
diff --git a/retroshare-gui/src/gui/gxs/GxsCreateCommentDialog.cpp b/retroshare-gui/src/gui/gxs/GxsCreateCommentDialog.cpp index 3dacc3e6c..67a538a94 100644 --- a/retroshare-gui/src/gui/gxs/GxsCreateCommentDialog.cpp +++ b/retroshare-gui/src/gui/gxs/GxsCreateCommentDialog.cpp @@ -51,8 +51,8 @@ void GxsCreateCommentDialog::loadComment(const QString &msgText, const QString & ui->avatarLabel->setGxsId(msgAuthorId); ui->avatarLabel->setFrameType(AvatarWidget::NO_FRAME); - ui->replaytolabel->setId(msgAuthorId); - ui->replaytolabel->setText( tr("Replying to") + " @" + msgAuthor); + ui->replyToLabel->setId(msgAuthorId); + ui->replyToLabel->setText( tr("Replying to") + " @" + msgAuthor); ui->commentTextEdit->setPlaceholderText( tr("Type your reply")); ui->postButton->setText("Reply"); @@ -116,11 +116,11 @@ void GxsCreateCommentDialog::checkLength(){ int charRemains = MAX_ALLOWED_GXS_MESSAGE_SIZE - msg.length(); if(charRemains >= 0) { text = tr("It remains %1 characters after HTML conversion.").arg(charRemains); - ui->infoLabel->setStyleSheet("QLabel#infoLabel { }"); + ui->info_Label->setStyleSheet("QLabel#info_Label { }"); }else{ text = tr("Warning: This message is too big of %1 characters after HTML conversion.").arg((0-charRemains)); - ui->infoLabel->setStyleSheet("QLabel#infoLabel {color: red; font: bold; }"); + ui->info_Label->setStyleSheet("QLabel#info_Label {color: red; font: bold; }"); } ui->postButton->setEnabled(charRemains>=0); - ui->infoLabel->setText(text); + ui->info_Label->setText(text); } diff --git a/retroshare-gui/src/gui/gxs/GxsCreateCommentDialog.ui b/retroshare-gui/src/gui/gxs/GxsCreateCommentDialog.ui index 9a40b6f4a..aecd1b794 100644 --- a/retroshare-gui/src/gui/gxs/GxsCreateCommentDialog.ui +++ b/retroshare-gui/src/gui/gxs/GxsCreateCommentDialog.ui @@ -7,13 +7,13 @@ 0 0 505 - 367 + 406 Make Comment - + 0 @@ -30,7 +30,7 @@ 0 - + 0 @@ -58,9 +58,9 @@ QFrame::Raised - + - + 52 @@ -73,16 +73,24 @@ 52 - + - + true + + + 11 + 75 + true + true + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> @@ -121,7 +129,7 @@ p, li { white-space: pre-wrap; } - + Qt::Vertical @@ -138,12 +146,12 @@ p, li { white-space: pre-wrap; } - + 6 - + Qt::Horizontal @@ -176,14 +184,14 @@ p, li { white-space: pre-wrap; } - + TextLabel - + @@ -208,21 +216,31 @@ p, li { white-space: pre-wrap; } + + + 12 + 75 + true + + Post - + 0 0 - - + + + 75 + true + @@ -240,6 +258,12 @@ p, li { white-space: pre-wrap; } QLabel
gui/gxs/GxsIdLabel.h
+ + AvatarWidget + QWidget +
gui/common/AvatarWidget.h
+ 1 +
GxsIdChooser QComboBox @@ -250,12 +274,6 @@ p, li { white-space: pre-wrap; } QTextEdit
gui/common/MimeTextEdit.h
- - AvatarWidget - QLabel -
gui/common/AvatarWidget.h
- 1 -
diff --git a/retroshare-gui/src/gui/gxs/GxsGroupDialog.cpp b/retroshare-gui/src/gui/gxs/GxsGroupDialog.cpp index ff1919403..f51c73be3 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupDialog.cpp +++ b/retroshare-gui/src/gui/gxs/GxsGroupDialog.cpp @@ -92,7 +92,7 @@ GxsGroupDialog::~GxsGroupDialog() void GxsGroupDialog::init() { // connect up the buttons. - connect(ui.createButton, SIGNAL(clicked()), this, SLOT(submitGroup())); + connect(ui.postButton, SIGNAL(clicked()), this, SLOT(submitGroup())); connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(cancelDialog())); connect(ui.pubKeyShare_cb, SIGNAL(clicked()), this, SLOT(setShareList())); connect(ui.addAdmins_cb, SIGNAL(clicked()), this, SLOT(setAdminsList())); @@ -194,7 +194,7 @@ void GxsGroupDialog::setUiText(UiType uiType, const QString &text) //ui.contactsdockWidget->setWindowTitle(text); break; case UITYPE_BUTTONBOX_OK: - ui.createButton->setText(text); + ui.postButton->setText(text); break; } } @@ -210,7 +210,7 @@ void GxsGroupDialog::setUiToolTip(UiType uiType, const QString &text) ui.addAdmins_cb->setToolTip(text); break; case UITYPE_BUTTONBOX_OK: - ui.createButton->setToolTip(text); + ui.postButton->setToolTip(text); default: break; } @@ -232,14 +232,14 @@ void GxsGroupDialog::initMode() { ui.stackedWidget->setCurrentIndex(1); mReadonlyFlags = 0xffffffff; // Force all to readonly. - ui.createButton->hide(); + ui.postButton->hide(); } break; case MODE_EDIT: { ui.stackedWidget->setCurrentIndex(0); - ui.createButton->setText(tr("Submit Group Changes")); + ui.postButton->setText(tr("Submit Group Changes")); } break; } @@ -384,8 +384,8 @@ void GxsGroupDialog::setupVisibility() ui.pubKeyShare_cb->setVisible(mEnabledFlags & GXS_GROUP_FLAGS_SHAREKEYS); ui.addAdmins_cb->setVisible(mEnabledFlags & GXS_GROUP_FLAGS_ADDADMINS); - ui.label_8->setVisible(mEnabledFlags & GXS_GROUP_FLAGS_ADDADMINS); ui.moderatorsLabel->setVisible(mEnabledFlags & GXS_GROUP_FLAGS_ADDADMINS); + ui.moderatorsValueLabel->setVisible(mEnabledFlags & GXS_GROUP_FLAGS_ADDADMINS); ui.personalGroupBox->setVisible(mEnabledFlags & GXS_GROUP_FLAGS_PERSONALSIGN); @@ -465,12 +465,12 @@ void GxsGroupDialog::updateFromExistingMeta(const QString &description) ui.lastpostline->setText(tr("Never")); else ui.lastpostline->setText(DateTime::formatLongDateTime(mGrpMeta.mLastPost)); - ui.authorLabel->setId(mGrpMeta.mAuthorId); + ui.authorValueLabel->setId(mGrpMeta.mAuthorId); ui.createdline->setText(DateTime::formatLongDateTime(mGrpMeta.mPublishTs)); link = RetroShareLink::createMessage(mGrpMeta.mAuthorId, ""); - ui.authorLabel->setText(link.toHtml()); + ui.authorValueLabel->setText(link.toHtml()); ui.IDline->setText(QString::fromStdString(mGrpMeta.mGroupId.toStdString())); ui.descriptiontextEdit->setPlainText(description); @@ -915,8 +915,8 @@ void GxsGroupDialog::setSelectedModerators(const std::set& ids) moderatorsListString += link.toHtml() + " "; } - //ui.moderatorsLabel->setId(det.mId); - ui.moderatorsLabel->setText(moderatorsListString); + //ui.moderatorsValueLabel->setId(det.mId); + ui.moderatorsValueLabel->setText(moderatorsListString); } /*********************************************************************************** diff --git a/retroshare-gui/src/gui/gxs/GxsGroupDialog.ui b/retroshare-gui/src/gui/gxs/GxsGroupDialog.ui index e6da1441e..b42e777de 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupDialog.ui +++ b/retroshare-gui/src/gui/gxs/GxsGroupDialog.ui @@ -13,7 +13,7 @@ Create New - + 0 @@ -47,7 +47,7 @@ 0
- + 0 @@ -59,7 +59,7 @@ - + 3 @@ -98,7 +98,7 @@
- + 6 @@ -106,7 +106,7 @@ 6
- + Name @@ -118,7 +118,7 @@
- + Qt::Horizontal @@ -131,7 +131,7 @@ - + <html><head/><body><p>The identity here can be used to send feedback.</p></body></html> @@ -178,7 +178,7 @@ Description - + @@ -190,7 +190,7 @@ Publish Signatures - + 6 @@ -235,7 +235,7 @@ - + Qt::Horizontal @@ -255,7 +255,7 @@ Personal Signatures - + @@ -278,7 +278,7 @@ - + Qt::Horizontal @@ -298,7 +298,7 @@ Comments - + 6 @@ -329,7 +329,7 @@
- + Qt::Horizontal @@ -349,16 +349,16 @@ Spam-protection - + - + Posts permissions: - + <html><head/><body><p>This combo box allows you to choose how posts are handled depending on the node the poster belongs to.</p><p><span style=" font-weight:600;">All allowed</span>: all posts are treated equally.</p><p><span style=" font-weight:600;">Defavor posts from unsigned IDs</span>: anonymous IDs will require a reputation of 0.4 to be received/forwarded.</p><p><span style=" font-weight:600;">Defavor posts from unsigned IDs and IDs from unknown nodes</span>: anonymous IDs and IDs signed by unknown Retroshare nodes will require a reputation of 0.4 to be received/forwarded.</p></body></html> @@ -380,7 +380,7 @@ - + Qt::Horizontal @@ -406,9 +406,9 @@
- + - + @@ -426,7 +426,7 @@ Message Distribution - + 6 @@ -532,20 +532,7 @@ - - - Qt::Horizontal - - - - 0 - 17 - - - - - - + Qt::Horizontal @@ -563,205 +550,213 @@
- + 0 - + Info - - - - - - - Author - - - - - - - Last Post - - - - - - - Name - - - - - - - Popularity - - - - - + + + 9 + + + 9 + + + 9 + + + 9 + + + + + Author + + + + + + + Last Post + + + + + + + Name + + + + + + + Popularity + + + + + + + TextLabel + + + + + + + Anti Spam: + + + + + + + true + + + + + + + TextLabel + + + true + + + + + + + Comments: + + + + + + + GxsIdLabel + + + true + + + + + + + ID + + + + + + + true + + + + + + + Posts + + + + + + + + + + true + + + + + + + TextLabel - - - - Anti Spam: - - - - - - - true - - - - - - - TextLabel - - - true - - - - - - - Comments: - - - - - - - GxsIdLabel - - - true - - - - - - - ID - - - - - - - true - - - - - - - Posts - - - - - - - - - - true - - - - - - - - - TextLabel - - - - - - - - 0 - 0 - - - - - - - - - - Distribution: - - - - - - - true - - - - - - - true - - - - - - - Moderators: - - - - - - - TextLabel - - - true - - - - - - - - - - Created + + + + + 0 + 0 + + + + + Distribution: + + + + + + + true + + + + + + + true + + + + + + + Moderators: + + + + + + + TextLabel + + + true + + + + + + + + + + Created + + + - + Description - + @@ -777,14 +772,14 @@ - + QFrame::StyledPanel QFrame::Raised - + @@ -793,7 +788,7 @@ - + Qt::Horizontal @@ -806,7 +801,14 @@ - + + + + 12 + 75 + true + + Create @@ -819,25 +821,9 @@ - GxsIdLabel + ClickableLabel QLabel -
gui/gxs/GxsIdLabel.h
-
- - GxsIdChooser - QComboBox -
gui/gxs/GxsIdChooser.h
-
- - GxsCircleChooser - QComboBox -
gui/gxs/GxsCircleChooser.h
-
- - HeaderFrame - QFrame -
gui/common/HeaderFrame.h
- 1 +
util/ClickableLabel.h
FriendSelectionWidget @@ -845,20 +831,41 @@
gui/common/FriendSelectionWidget.h
1
- - MimeTextEdit - QTextEdit -
gui/common/MimeTextEdit.h
-
GroupChooser QComboBox
gui/common/GroupChooser.h
- ClickableLabel + GxsCircleChooser + QComboBox +
gui/gxs/GxsCircleChooser.h
+
+ + GxsIdChooser + QComboBox +
gui/gxs/GxsIdChooser.h
+
+ + GxsIdLabel QLabel -
util/ClickableLabel.h
+
gui/gxs/GxsIdLabel.h
+
+ + HeaderFrame + QFrame +
gui/common/HeaderFrame.h
+ 1 +
+ + MimeTextEdit + QTextEdit +
gui/common/MimeTextEdit.h
+
+ + RSComboBox + QComboBox +
gui/common/RSComboBox.h
diff --git a/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.ui b/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.ui index 0a8fa4587..8cb249020 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.ui +++ b/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.ui @@ -70,7 +70,14 @@
- + + + + 12 + 75 + true + + Name @@ -168,11 +175,6 @@
gui/common/RSTabWidget.h
1 - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
GroupTreeWidget QWidget diff --git a/retroshare-gui/src/gui/gxs/GxsGroupShareKey.cpp b/retroshare-gui/src/gui/gxs/GxsGroupShareKey.cpp index dfcafaaf2..9197e3665 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupShareKey.cpp +++ b/retroshare-gui/src/gui/gxs/GxsGroupShareKey.cpp @@ -79,14 +79,14 @@ void GroupShareKey::setTyp() ui->headerFrame->setHeaderImage(FilesDefs::getPixmapFromQtResourcePath(":/icons/png/channels.png")); ui->headerFrame->setHeaderText(tr("Share channel publish permissions")); - ui->sharekeyinfo_label->setText(tr("You can allow your friends to publish in your channel, or send the publish permissions to another Retroshare instance of yours. Select the friends which you want to be allowed to publish in this channel. Note: it is currently not possible to revoke channel publish permissions.")); + ui->info_Label_ShareKey->setText(tr("You can allow your friends to publish in your channel, or send the publish permissions to another Retroshare instance of yours. Select the friends which you want to be allowed to publish in this channel. Note: it is currently not possible to revoke channel publish permissions.")); } else if(mGrpType == FORUM_KEY_SHARE) { ui->headerFrame->setHeaderImage(FilesDefs::getPixmapFromQtResourcePath(":/icons/png/forums.png")); ui->headerFrame->setHeaderText(tr("Share forum admin permissions")); - ui->sharekeyinfo_label->setText(tr("You can let your friends know about your forum by sharing it with them. Select the friends with which you want to share your forum.")); + ui->info_Label_ShareKey->setText(tr("You can let your friends know about your forum by sharing it with them. Select the friends with which you want to share your forum.")); } else if (mGrpType == POSTED_KEY_SHARE) @@ -96,7 +96,7 @@ void GroupShareKey::setTyp() ui->headerFrame->setHeaderImage(FilesDefs::getPixmapFromQtResourcePath(":/icons/png/posted.png")); ui->headerFrame->setHeaderText(tr("Share board admin permissions")); - ui->sharekeyinfo_label->setText(tr("You can allow your friends to edit the board. Select them in the list below. Note: it is not possible to revoke Board admin permissions.")); + ui->info_Label_ShareKey->setText(tr("You can allow your friends to edit the board. Select them in the list below. Note: it is not possible to revoke Board admin permissions.")); } else diff --git a/retroshare-gui/src/gui/gxs/GxsGroupShareKey.ui b/retroshare-gui/src/gui/gxs/GxsGroupShareKey.ui index fb7db3b6e..b41aad127 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupShareKey.ui +++ b/retroshare-gui/src/gui/gxs/GxsGroupShareKey.ui @@ -17,7 +17,16 @@ 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -78,7 +87,16 @@ - + + 0 + + + 0 + + + 0 + + 0 @@ -140,15 +158,12 @@
- + 11 - - - QFrame::StyledPanel diff --git a/retroshare-gui/src/gui/gxs/GxsIdChooser.cpp b/retroshare-gui/src/gui/gxs/GxsIdChooser.cpp index 9321c4de4..a3398e4cd 100644 --- a/retroshare-gui/src/gui/gxs/GxsIdChooser.cpp +++ b/retroshare-gui/src/gui/gxs/GxsIdChooser.cpp @@ -19,18 +19,19 @@ *******************************************************************************/ #include "GxsIdChooser.h" + #include "GxsIdDetails.h" #include "RsGxsUpdateBroadcastBase.h" -#include "gui/Identity/IdEditDialog.h" #include "gui/common/FilesDefs.h" +#include "gui/Identity/IdEditDialog.h" #include "util/misc.h" #include #include #include -#include +#include #include #define ROLE_SORT Qt::UserRole + 1 // Qt::UserRole is reserved for data @@ -50,7 +51,7 @@ /** Constructor */ GxsIdChooser::GxsIdChooser(QWidget *parent) - : QComboBox(parent), mFlags(IDCHOOSER_ANON_DEFAULT) + : RSComboBox(parent), mFlags(IDCHOOSER_ANON_DEFAULT) { // mBase = new RsGxsUpdateBroadcastBase(rsIdentity, this); // connect(mBase, SIGNAL(fillDisplay(bool)), this, SLOT(fillDisplay(bool))); diff --git a/retroshare-gui/src/gui/gxs/GxsIdChooser.h b/retroshare-gui/src/gui/gxs/GxsIdChooser.h index 3cee770eb..205d0d13a 100644 --- a/retroshare-gui/src/gui/gxs/GxsIdChooser.h +++ b/retroshare-gui/src/gui/gxs/GxsIdChooser.h @@ -21,14 +21,14 @@ #ifndef _GXS_ID_CHOOSER_H #define _GXS_ID_CHOOSER_H -#include -#include +#include "gui/common/RSComboBox.h" + +#include "retroshare/rsgxsifacetypes.h" // This class implement a basic RS functionality which is that ComboBox displaying Id // should update regularly. They also should update only when visible, to save CPU time. // -struct RsGxsIfaceHelper; class RsGxsUpdateBroadcastBase; #define IDCHOOSER_ID_REQUIRED 0x0001 @@ -36,13 +36,12 @@ class RsGxsUpdateBroadcastBase; #define IDCHOOSER_NO_CREATE 0x0004 #define IDCHOOSER_NON_ANONYMOUS 0x0008 -class GxsIdChooser : public QComboBox +class GxsIdChooser : public RSComboBox { Q_OBJECT public: - GxsIdChooser(RsGxsIfaceHelper* ifaceImpl, QWidget *parent = NULL); - GxsIdChooser(QWidget *parent = NULL); + GxsIdChooser(QWidget *parent = nullptr); virtual ~GxsIdChooser(); void setFlags(uint32_t flags) ; diff --git a/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.cpp b/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.cpp index 3d51f0acb..e8f34d1eb 100644 --- a/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.cpp +++ b/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.cpp @@ -74,7 +74,7 @@ CreateGxsChannelMsg::CreateGxsChannelMsg(const RsGxsGroupId &cId, RsGxsMessageId connect(addFileButton, SIGNAL(clicked() ), this , SLOT(addExtraFile())); connect(removeAllFilesButton, SIGNAL(clicked() ), this , SLOT(clearAllAttachments())); //connect(addfilepushButton, SIGNAL(clicked() ), this , SLOT(addExtraFile())); - connect(subjectEdit,SIGNAL(textChanged(const QString&)),this,SLOT(updatePreviewText(const QString&))); + connect(subjectEdit,SIGNAL(textChanged(QString)),this,SLOT(updatePreviewText(QString))); connect(expandButton, SIGNAL(clicked()), this, SLOT( toggle())); connect(addThumbnailButton, SIGNAL(clicked() ), this , SLOT(addThumbnail())); @@ -183,8 +183,8 @@ void CreateGxsChannelMsg::contextMenu(QPoint /*point*/) int n_file = 0 ; - for(QList::const_iterator it(links.begin());it!=links.end();++it) - if((*it).type() == RetroShareLink::TYPE_FILE) + for(auto &it : links) + if(it.type() == RetroShareLink::TYPE_FILE) ++n_file ; QMenu contextMnu(this) ; @@ -203,42 +203,42 @@ void CreateGxsChannelMsg::pasteLink() { std::cerr << "Pasting links: " << std::endl; - QList links; + QList links; RSLinkClipboard::pasteLinks(links) ; - for(QList::const_iterator it(links.begin());it!=links.end();++it) - if((*it).type() == RetroShareLink::TYPE_FILE) + for(auto &it : links) + if(it.type() == RetroShareLink::TYPE_FILE) { // 0 - check that we actually have the file! // - std::cerr << "Pasting " << (*it).toString().toStdString() << std::endl; + std::cerr << "Pasting " << it.toString().toStdString() << std::endl; - FileInfo info ; - RsFileHash hash( (*it).hash().toStdString()) ; + FileInfo info ; + RsFileHash hash( it.hash().toStdString()) ; #ifdef TO_REMOVE - if(rsFiles->alreadyHaveFile( hash,info ) ) + if(rsFiles->alreadyHaveFile( hash,info ) ) #endif - addAttachment(hash, (*it).name().toUtf8().constData(), (*it).size(), rsFiles->alreadyHaveFile( hash,info ), RsPeerId()) ; + addAttachment(hash, it.name().toUtf8().constData(), it.size(), rsFiles->alreadyHaveFile( hash,info ), RsPeerId()) ; #ifdef TO_REMOVE - else - not_have.push_back( *it ) ; + else + not_have.push_back( *it ) ; #endif - } + } #ifdef TO_REMOVE - if(!not_have.empty()) - { - QString msg = tr("You are about to add files you're not actually sharing. Do you still want this to happen?")+"

" ; + if(!not_have.empty()) + { + QString msg = tr("You are about to add files you're not actually sharing. Do you still want this to happen?")+"

" ; - for(QList::const_iterator it(not_have.begin());it!=not_have.end();++it) - msg += (*it).toString() + "
" ; + for(QList::const_iterator it(not_have.begin());it!=not_have.end();++it) + msg += (*it).toString() + "
" ; - if(QMessageBox::YesToAll == QMessageBox::question(NULL,tr("About to post un-owned files to a channel."),msg,QMessageBox::YesToAll | QMessageBox::No)) - for(QList::const_iterator it(not_have.begin());it!=not_have.end();++it) - addAttachment(RsFileHash((*it).hash().toStdString()), (*it).name().toUtf8().constData(), (*it).size(), false, RsPeerId()) ; - } + if(QMessageBox::YesToAll == QMessageBox::question(NULL,tr("About to post un-owned files to a channel."),msg,QMessageBox::YesToAll | QMessageBox::No)) + for(QList::const_iterator it(not_have.begin());it!=not_have.end();++it) + addAttachment(RsFileHash((*it).hash().toStdString()), (*it).name().toUtf8().constData(), (*it).size(), false, RsPeerId()) ; + } #endif } @@ -818,9 +818,9 @@ void CreateGxsChannelMsg::sendMessage(const std::string &subject, const std::str post.mThumbnail.copy((uint8_t *) ba.data(), ba.size()); } - int generateCount = 0; #ifdef ENABLE_GENERATE + int generateCount = 0; if (generateCheckBox->isChecked()) { generateCount = generateSpinBox->value(); if (QMessageBox::question(this, tr("Generate mass data"), tr("Do you really want to generate %1 messages ?").arg(generateCount), QMessageBox::Yes|QMessageBox::No, QMessageBox::No) == QMessageBox::No) { @@ -830,18 +830,20 @@ void CreateGxsChannelMsg::sendMessage(const std::string &subject, const std::str #endif uint32_t token; - if (generateCount) { #ifdef ENABLE_GENERATE + if (generateCount) { for (int count = 0; count < generateCount; ++count) { RsGxsChannelPost generatePost = post; generatePost.mMeta.mMsgName = QString("%1 %2").arg(QString::fromUtf8(post.mMeta.mMsgName.c_str())).arg(count + 1, 3, 10, QChar('0')).toUtf8().constData(); rsGxsChannels->createPost(token, generatePost); } -#endif } else { +#endif rsGxsChannels->createPost(token, post); +#ifdef ENABLE_GENERATE } +#endif } accept(); @@ -966,14 +968,14 @@ void CreateGxsChannelMsg::toggle() if (expandButton->isChecked()) { thumbnailFrame->hide(); - gridLayoutTextEdit->setContentsMargins(0,9,0,0); + subject_HL->setContentsMargins(0,9,0,0); expandButton->setIcon(FilesDefs::getIconFromQtResourcePath(QString(":/icons/png/down-arrow.png"))); expandButton->setToolTip(tr("Show")); } else { thumbnailFrame->show(); - gridLayoutTextEdit->setContentsMargins(0,0,0,0); + subject_HL->setContentsMargins(0,0,0,0); expandButton->setIcon(FilesDefs::getIconFromQtResourcePath(QString(":/icons/png/up-arrow.png"))); expandButton->setToolTip(tr("Hide")); } diff --git a/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.ui b/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.ui index b29e9cdd8..510da23a1 100644 --- a/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.ui +++ b/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.ui @@ -20,7 +20,7 @@ :/images/logo/logo_16.png:/images/logo/logo_16.png - + 0 @@ -40,14 +40,14 @@ 0 - + QFrame::StyledPanel QFrame::Raised - + 3 @@ -77,7 +77,7 @@ - + 9 @@ -99,7 +99,7 @@
- + Qt::Horizontal @@ -113,6 +113,13 @@ + + + 12 + 75 + true + + Post @@ -141,8 +148,8 @@ 0 - - + + 0 @@ -163,7 +170,7 @@ QFrame::Plain - + 6 @@ -193,7 +200,7 @@ p, li { white-space: pre-wrap; } - + @@ -208,7 +215,7 @@ p, li { white-space: pre-wrap; } - + <html><head/><body><p>Choose aspect ratio policy. In 'Auto' mode, the most suitable aspect ratio is chosen for you.</p></body></html> @@ -254,7 +261,7 @@ p, li { white-space: pre-wrap; } - + Qt::Horizontal @@ -272,7 +279,7 @@ p, li { white-space: pre-wrap; } - + 9 @@ -317,7 +324,7 @@ p, li { white-space: pre-wrap; } - + 6 @@ -332,7 +339,7 @@ p, li { white-space: pre-wrap; }
- + Qt::Vertical @@ -350,7 +357,7 @@ p, li { white-space: pre-wrap; }
- + 6 @@ -388,10 +395,10 @@ p, li { white-space: pre-wrap; }
- + - + @@ -481,7 +488,7 @@ p, li { white-space: pre-wrap; } - + Qt::Horizontal @@ -518,7 +525,7 @@ p, li { white-space: pre-wrap; } 0 - + 3 @@ -548,7 +555,7 @@ p, li { white-space: pre-wrap; } Drag and Drop Files from Search Results - +
@@ -579,7 +586,7 @@ p, li { white-space: pre-wrap; }
- + Qt::Horizontal @@ -604,6 +611,12 @@ p, li { white-space: pre-wrap; }
+ + ChannelPostThumbnailView + QWidget +
gui/gxschannels/GxsChannelPostThumbnail.h
+ 1 +
HeaderFrame QFrame @@ -617,10 +630,9 @@ p, li { white-space: pre-wrap; } 1 - ChannelPostThumbnailView - QWidget -
gui/gxschannels/GxsChannelPostThumbnail.h
- 1 + RSComboBox + QComboBox +
gui/common/RSComboBox.h
diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelFilesStatusWidget.ui b/retroshare-gui/src/gui/gxschannels/GxsChannelFilesStatusWidget.ui index c1b02ab83..463b05423 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelFilesStatusWidget.ui +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelFilesStatusWidget.ui @@ -13,7 +13,7 @@ Form - + 0 @@ -27,11 +27,11 @@ 0 - + true - + 2 diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.ui b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.ui index 4bdae007a..cc98c8e56 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.ui +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidgetWithModel.ui @@ -55,6 +55,13 @@ 0 + + + 12 + 75 + true + + Subscribe @@ -77,6 +84,12 @@ + + + 75 + true + + Qt::NoFocus @@ -189,12 +202,12 @@ - + + 25 75 true - false @@ -389,7 +402,7 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Description</span></p></body></html> @@ -649,6 +662,12 @@ p, li { white-space: pre-wrap; } QLabel
gui/gxs/GxsIdLabel.h
+ + ElidedLabel + QLabel +
gui/common/ElidedLabel.h
+ 1 +
SubscribeToolButton QToolButton @@ -666,11 +685,6 @@ p, li { white-space: pre-wrap; }
gui/gxs/GxsCommentDialog.h
1
- - StyledElidedLabel - QLabel -
gui/common/StyledElidedLabel.h
-
diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp index 3cf29ecf1..ffbcb2493 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp @@ -384,14 +384,14 @@ void CreateGxsForumMsg::checkLength() int charRemains = MAX_ALLOWED_GXS_MESSAGE_SIZE - msg.length(); if(charRemains >= 0) { text = tr("It remains %1 characters after HTML conversion.").arg(charRemains); - ui.infoLabel->setStyleSheet("QLabel#infoLabel { }"); + ui.info_Label->setStyleSheet("QLabel#info_Label { }"); }else{ text = tr("Warning: This message is too big of %1 characters after HTML conversion.").arg((0-charRemains)); - ui.infoLabel->setStyleSheet("QLabel#infoLabel {color: red; font: bold; }"); + ui.info_Label->setStyleSheet("QLabel#info_Label {color: red; font: bold; }"); } ui.postButton->setToolTip(text); ui.postButton->setEnabled(charRemains>=0); - ui.infoLabel->setText(text); + ui.info_Label->setText(text); } void CreateGxsForumMsg::createMsg() diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.ui b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.ui index 7af77f2d5..10105a630 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.ui +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.ui @@ -17,7 +17,7 @@ :/images/logo/logo_16.png:/images/logo/logo_16.png
- + 0 @@ -37,17 +37,17 @@
- + QFrame::StyledPanel QFrame::Raised - + - + 0 @@ -68,7 +68,7 @@ QFrame::Raised - + 0 @@ -82,7 +82,7 @@ 0 - + 50 @@ -119,9 +119,9 @@ Forum Post - + - + @@ -141,8 +141,8 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Sans Serif'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Sans Serif';"><br /></p></body></html> +</style></head><body style=" font-family:'MS Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8.25pt;"><br /></p></body></html> @@ -160,7 +160,7 @@ p, li { white-space: pre-wrap; } QFrame::Sunken - + 0 @@ -249,7 +249,7 @@ p, li { white-space: pre-wrap; } - + Qt::Horizontal @@ -298,7 +298,7 @@ p, li { white-space: pre-wrap; } Attach files via drag and drop - + @@ -322,7 +322,7 @@ p, li { white-space: pre-wrap; } - + @@ -341,7 +341,7 @@ p, li { white-space: pre-wrap; } - + Qt::Horizontal @@ -355,6 +355,13 @@ p, li { white-space: pre-wrap; } + + + 12 + 75 + true + + Post @@ -375,17 +382,6 @@ p, li { white-space: pre-wrap; } - - HashBox - QScrollArea -
gui/common/HashBox.h
- 1 -
- - MimeTextEdit - QTextEdit -
gui/common/MimeTextEdit.h
-
GxsIdChooser QComboBox @@ -397,10 +393,20 @@ p, li { white-space: pre-wrap; }
gui/common/HeaderFrame.h
1
+ + HashBox + QScrollArea +
gui/common/HashBox.h
+ 1 +
+ + MimeTextEdit + QTextEdit +
gui/common/MimeTextEdit.h
+
- diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumGroupDialog.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumGroupDialog.cpp index 424091867..8f9b9ed0d 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumGroupDialog.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumGroupDialog.cpp @@ -63,7 +63,7 @@ GxsForumGroupDialog::GxsForumGroupDialog(QWidget *parent) : GxsGroupDialog(ForumCreateEnabledFlags, ForumCreateDefaultsFlags, parent) { ui.pubKeyShare_cb->setEnabled(true) ; - ui.label_2->setToolTip(tr("

Put one of your identities here to allow others to send feedback and also have moderator rights on the forum. You may as well leave that field blank and keep the forum anonymously administrated.

")); + ui.idChooserLabel->setToolTip(tr("

Put one of your identities here to allow others to send feedback and also have moderator rights on the forum. You may as well leave that field blank and keep the forum anonymously administrated.

")); } GxsForumGroupDialog::GxsForumGroupDialog(Mode mode, RsGxsGroupId groupId, QWidget *parent) diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h index 6df3c5c89..29e56268f 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h @@ -214,7 +214,7 @@ private: unsigned int mNewCount; bool mDisplayBannedText; - /* Color definitions (for standard see qss.default) */ + /* Color definitions (for standard see default.qss) */ QColor mTextColorRead; QColor mTextColorUnread; QColor mTextColorUnreadChildren; diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui index b5fe3f95d..b27354e8b 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui @@ -74,6 +74,13 @@ 0 + + + 12 + 75 + true + + Subscribe @@ -84,6 +91,12 @@
+ + + 75 + true + + Qt::NoFocus @@ -112,19 +125,29 @@ - + 0 0 + + + 12 + 75 + true + + <html><head/><body><p>Click here to clear current selected thread and display more information about this forum.</p></body></html> Forum Name + + 2 + @@ -173,7 +196,7 @@
- + Lastest post in thread @@ -405,7 +428,7 @@ - + @@ -521,40 +544,46 @@ - RSTextBrowser - QTextBrowser -
gui/common/RSTextBrowser.h
-
- - LineEditClear - QLineEdit -
gui/common/LineEditClear.h
-
- - StyledElidedLabel + ElidedLabel QLabel -
gui/common/StyledElidedLabel.h
-
- - SubscribeToolButton - QToolButton -
gui/common/SubscribeToolButton.h
+
gui/common/ElidedLabel.h
+ 1
GxsIdLabel QLabel
gui/gxs/GxsIdLabel.h
+ + LineEditClear + QLineEdit +
gui/common/LineEditClear.h
+
RSImageBlockWidget QWidget
gui/common/RSImageBlockWidget.h
1
+ + RSTextBrowser + QTextBrowser +
gui/common/RSTextBrowser.h
+
+ + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+ + SubscribeToolButton + QToolButton +
gui/common/SubscribeToolButton.h
+
- + diff --git a/retroshare-gui/src/gui/images.qrc b/retroshare-gui/src/gui/images.qrc index fcdd4f3cc..4dc8177bd 100644 --- a/retroshare-gui/src/gui/images.qrc +++ b/retroshare-gui/src/gui/images.qrc @@ -418,8 +418,9 @@ qss/chat/compact/history/main.css qss/chat/compact/history/variants/Standard.css qss/chat/compact/history/variants/Colored.css - qss/stylesheet/qss.default - qss/stylesheet/Standard.qss + qss/stylesheet/default.qss + qss/stylesheet/Standard_Light.qss + qss/stylesheet/Standard_Dark.qss images/tags/pgp-known.png images/tags/pgp-unknown.png images/tags/dev-ambassador.png diff --git a/retroshare-gui/src/gui/msgs/MessageComposer.cpp b/retroshare-gui/src/gui/msgs/MessageComposer.cpp index 2be5efb35..f80434fd2 100644 --- a/retroshare-gui/src/gui/msgs/MessageComposer.cpp +++ b/retroshare-gui/src/gui/msgs/MessageComposer.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include @@ -136,8 +137,8 @@ MessageComposer::MessageComposer(QWidget *parent, Qt::WindowFlags flags) m_completer = NULL; - ui.distantFrame->hide(); - ui.sizeLimitFrame->hide(); + ui.info_Frame_Distant->hide(); + ui.info_Frame_SizeLimit->hide(); ui.respond_to_CB->hide(); ui.fromLabel->hide(); @@ -148,7 +149,7 @@ MessageComposer::MessageComposer(QWidget *parent, Qt::WindowFlags flags) ui.hashBox->hide(); // connect up the buttons. - connect( ui.actionSend, SIGNAL( triggered (bool)), this, SLOT( sendMessage( ) ) ); + connect( ui.actionSend, SIGNAL( triggered(bool)), this, SLOT( sendMessage() ) ); //connect( ui.actionReply, SIGNAL( triggered (bool)), this, SLOT( replyMessage( ) ) ); connect(ui.boldbtn, SIGNAL(clicked()), this, SLOT(textBold())); connect(ui.underlinebtn, SIGNAL(clicked()), this, SLOT(textUnderline())); @@ -162,16 +163,16 @@ MessageComposer::MessageComposer(QWidget *parent, Qt::WindowFlags flags) connect(ui.actionContactsView, SIGNAL(triggered()), this, SLOT(toggleContacts())); connect(ui.actionSaveas, SIGNAL(triggered()), this, SLOT(saveasDraft())); connect(ui.actionAttach, SIGNAL(triggered()), this, SLOT(attachFile())); - connect(ui.titleEdit, SIGNAL(textChanged(const QString &)), this, SLOT(titleChanged())); + connect(ui.titleEdit, SIGNAL(textChanged(QString)), this, SLOT(titleChanged())); connect(ui.sizeincreaseButton, SIGNAL (clicked()), this, SLOT (fontSizeIncrease())); connect(ui.sizedecreaseButton, SIGNAL (clicked()), this, SLOT (fontSizeDecrease())); connect(ui.actionQuote, SIGNAL(triggered()), this, SLOT(blockQuote())); connect(ui.codeButton, SIGNAL (clicked()), this, SLOT (toggleCode())); - connect(ui.msgText, SIGNAL( checkSpellingChanged( bool ) ), this, SLOT( spellChecking( bool ) ) ); + connect(ui.msgText, SIGNAL( checkSpellingChanged(bool) ), this, SLOT( spellChecking(bool) ) ); - connect(ui.msgText, SIGNAL(currentCharFormatChanged(const QTextCharFormat &)), this, SLOT(currentCharFormatChanged(const QTextCharFormat &))); + connect(ui.msgText, SIGNAL(currentCharFormatChanged(QTextCharFormat)), this, SLOT(currentCharFormatChanged(QTextCharFormat))); connect(ui.msgText, SIGNAL(cursorPositionChanged()), this, SLOT(cursorPositionChanged())); connect(ui.msgText->document(), SIGNAL(modificationChanged(bool)), actionSave, SLOT(setEnabled(bool))); @@ -206,12 +207,12 @@ MessageComposer::MessageComposer(QWidget *parent, Qt::WindowFlags flags) connect(ui.filterComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterComboBoxChanged(int))); - connect(ui.addToButton, SIGNAL(clicked(void)), this, SLOT(addTo())); - connect(ui.addCcButton, SIGNAL(clicked(void)), this, SLOT(addCc())); - connect(ui.addBccButton, SIGNAL(clicked(void)), this, SLOT(addBcc())); - connect(ui.addRecommendButton, SIGNAL(clicked(void)), this, SLOT(addRecommend())); + connect(ui.addToButton, SIGNAL(clicked()), this, SLOT(addTo())); + connect(ui.addCcButton, SIGNAL(clicked()), this, SLOT(addCc())); + connect(ui.addBccButton, SIGNAL(clicked()), this, SLOT(addBcc())); + connect(ui.addRecommendButton, SIGNAL(clicked()), this, SLOT(addRecommend())); - connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(const QString&,int)), this, SLOT(peerStatusChanged(const QString&,int))); + connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(peerStatusChanged(QString,int))); connect(ui.friendSelectionWidget, SIGNAL(contentChanged()), this, SLOT(buildCompleter())); connect(ui.friendSelectionWidget, SIGNAL(doubleClicked(int,QString)), this, SLOT(addTo())); connect(ui.friendSelectionWidget, SIGNAL(itemSelectionChanged()), this, SLOT(friendSelectionChanged())); @@ -232,7 +233,7 @@ MessageComposer::MessageComposer(QWidget *parent, Qt::WindowFlags flags) ui.friendSelectionWidget->start(); QActionGroup *grp = new QActionGroup(this); - connect(grp, SIGNAL(triggered(QAction *)), this, SLOT(textAlign(QAction *))); + connect(grp, SIGNAL(triggered(QAction*)), this, SLOT(textAlign(QAction*))); actionAlignLeft = new QAction(QIcon(""), tr("&Left"), grp); actionAlignLeft->setShortcut(Qt::CTRL + Qt::Key_L); @@ -248,7 +249,7 @@ MessageComposer::MessageComposer(QWidget *parent, Qt::WindowFlags flags) actionAlignJustify->setCheckable(true); QActionGroup *grp2 = new QActionGroup(this); - connect(grp2, SIGNAL(triggered(QAction *)), this, SLOT(textStyle(QAction *))); + connect(grp2, SIGNAL(triggered(QAction*)), this, SLOT(textStyle(QAction*))); actionDisc = new QAction(QIcon(""), tr("Bullet list (disc)"), grp2); actionDisc->setCheckable(true); @@ -283,17 +284,44 @@ MessageComposer::MessageComposer(QWidget *parent, Qt::WindowFlags flags) ui.filterComboBox->setCurrentIndex(3); connect(ui.comboStyle, SIGNAL(activated(int)),this, SLOT(changeFormatType(int))); - connect(ui.comboFont, SIGNAL(activated(const QString &)), this, SLOT(textFamily(const QString &))); + connect(ui.comboFont, SIGNAL(activated(QString)), this, SLOT(textFamily(QString))); + +#if QT_VERSION < QT_VERSION_CHECK(5,11,0) + ui.comboFont->setMaximumWidth(QFontMetrics(ui.comboFont->font()).width("_")*20); +#else + ui.comboFont->setMaximumWidth(QFontMetrics(ui.comboFont->font()).horizontalAdvance("_")*20); +#endif ui.comboSize->setEditable(true); + ui.comboSize->style()->polish(ui.comboSize); // Needed else QLineEdit inside QComboBox background is painted with black color. QFontDatabase db; foreach(int size, db.standardSizes()) - ui.comboSize->addItem(QString::number(size)); + ui.comboSize->addItem(QString::number(size)); - connect(ui.comboSize, SIGNAL(activated(const QString &)),this, SLOT(textSize(const QString &))); + QStyleOptionComboBox opt; QSize sh; + opt.initFrom(ui.comboSize); + opt.subControls = QStyle::SC_All; + opt.activeSubControls = QStyle::SC_None; + opt.editable = ui.comboSize->isEditable(); + sh = ui.comboSize->style()->sizeFromContents(QStyle::CT_ComboBox, &opt, sh, ui.comboSize); + //+4 because there is hardcoded margins in QCommonStyle::drawControl(CE_ComboBoxLabel) +#if QT_VERSION < QT_VERSION_CHECK(5,11,0) + sh.setWidth(sh.width() + ui.comboSize->fontMetrics().width("8")*2 + 4); +#else + sh.setWidth(sh.width() + ui.comboSize->fontMetrics().horizontalAdvance("8")*2 + 4); +#endif + ui.comboSize->setMaximumWidth(sh.width()); + ui.comboSize->view()->setMinimumWidth(sh.width() + ui.comboSize->view()->verticalScrollBar()->minimumWidth() + 4); + + connect(ui.comboSize, SIGNAL(activated(QString)),this, SLOT(textSize(QString))); ui.comboSize->setCurrentIndex(ui.comboSize->findText(QString::number(QApplication::font().pointSize()))); + ui.toolBarFrame->setMinimumHeight( ui.comboStyle->height() + + ui.toolBarFrameHLayout->contentsMargins().top() + + ui.toolBarFrameHLayout->contentsMargins().bottom() + ); + QMenu * alignmentmenu = new QMenu(); alignmentmenu->addAction(actionAlignLeft); alignmentmenu->addAction(actionAlignCenter); @@ -313,11 +341,11 @@ MessageComposer::MessageComposer(QWidget *parent, Qt::WindowFlags flags) ui.styleButton->setMenu(formatlistmenu); QPixmap pxm(24,24); - pxm.fill(Qt::black); + pxm.fill(ui.msgText->palette().text().color()); ui.colorbtn->setIcon(pxm); QPixmap pxm2(24,24); - pxm2.fill(Qt::white); + pxm2.fill(ui.msgText->palette().window().color()); ui.color2btn->setIcon(pxm2); /* Set header resize modes and initial section sizes */ @@ -369,7 +397,7 @@ MessageComposer::MessageComposer(QWidget *parent, Qt::WindowFlags flags) // create tag menu TagsMenu *menu = new TagsMenu (tr("Tags"), this); connect(menu, SIGNAL(aboutToShow()), this, SLOT(tagAboutToShow())); - connect(menu, SIGNAL(tagSet(int, bool)), this, SLOT(tagSet(int, bool))); + connect(menu, SIGNAL(tagSet(int,bool)), this, SLOT(tagSet(int,bool))); connect(menu, SIGNAL(tagRemoveAll()), this, SLOT(tagRemoveAll())); ui.tagButton->setMenu(menu); @@ -408,21 +436,21 @@ void MessageComposer::updateCells(int,int) if(has_gxs) { ui.respond_to_CB->show(); - ui.distantFrame->show(); + ui.info_Frame_Distant->show(); ui.fromLabel->show(); checkLength(); } else { ui.respond_to_CB->hide(); - ui.distantFrame->hide() ; + ui.info_Frame_Distant->hide() ; ui.fromLabel->hide(); } if(rowCount > 20) - ui.sizeLimitFrame->show(); + ui.info_Frame_SizeLimit->show(); else - ui.sizeLimitFrame->hide(); + ui.info_Frame_SizeLimit->hide(); } void MessageComposer::processSettings(bool bLoad) @@ -619,7 +647,7 @@ void MessageComposer::addConnectAttemptMsg(const RsPgpId &gpgId, const RsPeerId // PGPId+SslId are always here. But if the peer is not a friend the SSL id cannot be used. // (todo) If the PGP id doesn't get us a PGP key from the keyring, we need to create a short invite - RetroShareLink link = RetroShareLink::createUnknownSslCertificate(sslId, gpgId); + RetroShareLink link = RetroShareLink::createUnknownSslCertificate(sslId, gpgId); if (!link.valid()) return; @@ -772,7 +800,6 @@ void MessageComposer::buildCompleter() std::list::iterator peerIt; rsPeers->getFriendList(peers); - std::list gxsIds; QList gxsitems ; ui.friendSelectionWidget->items(gxsitems,FriendSelectionWidget::IDTYPE_GXS) ; @@ -781,9 +808,9 @@ void MessageComposer::buildCompleter() QStringList completerList; QStringList completerGroupList; - for (QList::const_iterator idIt = gxsitems.begin(); idIt != gxsitems.end(); ++idIt) + for (auto &idIt : gxsitems) { - RsGxsId id ( ui.friendSelectionWidget->idFromItem( *idIt ) ); + RsGxsId id ( ui.friendSelectionWidget->idFromItem( idIt ) ); RsIdentityDetails detail; if(rsIdentity->getIdDetails(id, detail)) @@ -1038,8 +1065,8 @@ MessageComposer *MessageComposer::newMsg(const std::string &msgId /* = ""*/) std::list groupInfoList; rsPeers->getGroupInfoList(groupInfoList); - std::list groupIds; - std::list::iterator groupIt; + // std::list groupIds; + // std::list::iterator groupIt; // calculateGroupsOfSslIds(groupInfoList, msgInfo.msgto, groupIds); // for (groupIt = groupIds.begin(); groupIt != groupIds.end(); ++groupIt ) { @@ -1281,7 +1308,7 @@ MessageComposer *MessageComposer::forwardMsg(const std::string &msgId) msgComposer->setTitleText(QString::fromUtf8(msgInfo.title.c_str()), FORWARD); msgComposer->setQuotedMsg(QString::fromUtf8(msgInfo.msg.c_str()), buildReplyHeader(msgInfo)); - std::list& files_info = msgInfo.files; + const std::list& files_info = msgInfo.files; msgComposer->setFileList(files_info); @@ -1599,16 +1626,16 @@ bool MessageComposer::getRecipientFromRow(int row, enumType &type, destinationTy QString MessageComposer::getRecipientEmailAddress(const RsGxsId& id,const RsIdentityDetails& detail) { - return (QString("%2 <")+tr("Distant identity:")+" %2@%1>").arg(QString::fromStdString(id.toStdString())).arg(QString::fromUtf8(detail.mNickname.c_str())) ; + return (QString("%2 <")+tr("Distant identity:")+" %2@%1>").arg(QString::fromStdString(id.toStdString()), QString::fromUtf8(detail.mNickname.c_str())) ; } QString MessageComposer::getRecipientEmailAddress(const RsPeerId& /* id */,const RsPeerDetails& detail) { - QString location_name = detail.location.empty()?tr("[Missing]"):QString::fromUtf8(detail.location.c_str()) ; + QString location_name = detail.location.empty()?tr("[Missing]"):QString::fromUtf8(detail.location.c_str()) ; - return (QString("%1 (")+tr("Node name & id:")+" %2, %3)").arg(QString::fromUtf8(detail.name.c_str())) - .arg(location_name) - .arg(QString::fromUtf8(detail.id.toStdString().c_str())) ; + return (QString("%1 (")+tr("Node name & id:")+" %2, %3)").arg(QString::fromUtf8(detail.name.c_str()) + , location_name + , QString::fromUtf8(detail.id.toStdString().c_str())) ; } void MessageComposer::setRecipientToRow(int row, enumType type, destinationType dest_type, const std::string &id) @@ -1619,12 +1646,13 @@ void MessageComposer::setRecipientToRow(int row, enumType type, destinationType QComboBox *comboBox = dynamic_cast(ui.recipientWidget->cellWidget(row, COLUMN_RECIPIENT_TYPE)); if (comboBox == NULL) { - comboBox = new QComboBox; + comboBox = new RSComboBox; comboBox->addItem(tr("To"), TO); comboBox->addItem(tr("Cc"), CC); comboBox->addItem(tr("Bcc"), BCC); ui.recipientWidget->setCellWidget(row, COLUMN_RECIPIENT_TYPE, comboBox); + ui.recipientWidget->setRowHeight(row, comboBox->height()); comboBox->setLayoutDirection(Qt::RightToLeft); comboBox->installEventFilter(this); @@ -1789,7 +1817,7 @@ void MessageComposer::editingRecipientFinished() if (row >= rowCount) // not found return; - enumType type; + enumType type = TO; std::string id; // dummy destinationType dtype ; @@ -1818,13 +1846,13 @@ void MessageComposer::editingRecipientFinished() ui.friendSelectionWidget->items(gxsitems,FriendSelectionWidget::IDTYPE_GXS) ; RsIdentityDetails detail; - for (QList::const_iterator idIt = gxsitems.begin(); idIt != gxsitems.end(); ++idIt) + for (auto &idIt : gxsitems) { - RsGxsId id ( ui.friendSelectionWidget->idFromItem( *idIt ) ); + RsGxsId gxsId ( ui.friendSelectionWidget->idFromItem( idIt ) ); - if(rsIdentity->getIdDetails(id, detail) && text == getRecipientEmailAddress(id,detail)) + if(rsIdentity->getIdDetails(gxsId, detail) && text == getRecipientEmailAddress(gxsId,detail)) { - setRecipientToRow(row, type, PEER_TYPE_GXS, id.toStdString()); + setRecipientToRow(row, type, PEER_TYPE_GXS, gxsId.toStdString()); return ; } } @@ -2271,7 +2299,8 @@ void MessageComposer::addSmileys() // add trailing space smiley += QString(" "); // add preceding space when needed (not at start of text or preceding space already exists) - if(!ui.msgText->textCursor().atStart() && ui.msgText->toPlainText()[ui.msgText->textCursor().position() - 1] != QChar(' ')) + QString plainText = ui.msgText->toPlainText(); + if(!ui.msgText->textCursor().atStart() && plainText[ui.msgText->textCursor().position() - 1] != QChar(' ')) smiley = QString(" ") + smiley; ui.msgText->textCursor().insertText(smiley); } @@ -2308,14 +2337,14 @@ void MessageComposer::fontChanged(const QFont &f) void MessageComposer::colorChanged(const QColor &c) { - QPixmap pix(16, 16); + QPixmap pix(24, 24); pix.fill(c); ui.colorbtn->setIcon(pix); } void MessageComposer::colorChanged2(const QColor &c) { - QPixmap pix(16, 16); + QPixmap pix(24, 24); pix.fill(c); ui.color2btn->setIcon(pix); } @@ -2810,7 +2839,7 @@ void MessageComposer::showTagLabels() tag = tags.types.find(*tagId); if (tag != tags.types.end()) { QLabel *tagLabel = new QLabel(TagDefs::name(tag->first, tag->second.first), this); - tagLabel->setMaximumHeight(16); + tagLabel->setMaximumHeight(QFontMetrics(tagLabel->font()).height()*1.2); tagLabel->setStyleSheet(TagDefs::labelStyleSheet(tag->second.second)); tagLabels.push_back(tagLabel); ui.tagLayout->addWidget(tagLabel); @@ -2820,13 +2849,14 @@ void MessageComposer::showTagLabels() ui.tagLayout->addStretch(); } } -void MessageComposer::on_closeSizeLimitFrameButton_clicked() + +void MessageComposer::on_closeInfoFrameButton_Distant_clicked() { - ui.sizeLimitFrame->setVisible(false); + ui.info_Frame_Distant->setVisible(false); } -void MessageComposer::on_closeInfoFrameButton_clicked() +void MessageComposer::on_closeInfoFrameButton_SizeLimit_clicked() { - ui.distantFrame->setVisible(false); + ui.info_Frame_SizeLimit->setVisible(false); } QString MessageComposer::inviteMessage() diff --git a/retroshare-gui/src/gui/msgs/MessageComposer.h b/retroshare-gui/src/gui/msgs/MessageComposer.h index a5f6d773c..4db4f6ba9 100644 --- a/retroshare-gui/src/gui/msgs/MessageComposer.h +++ b/retroshare-gui/src/gui/msgs/MessageComposer.h @@ -163,8 +163,8 @@ private slots: void tagSet(int tagId, bool set); void tagRemoveAll(); - void on_closeInfoFrameButton_clicked(); - void on_closeSizeLimitFrameButton_clicked(); + void on_closeInfoFrameButton_Distant_clicked(); + void on_closeInfoFrameButton_SizeLimit_clicked(); static QString inviteMessage(); diff --git a/retroshare-gui/src/gui/msgs/MessageComposer.ui b/retroshare-gui/src/gui/msgs/MessageComposer.ui index ff76237f9..64f8b1332 100644 --- a/retroshare-gui/src/gui/msgs/MessageComposer.ui +++ b/retroshare-gui/src/gui/msgs/MessageComposer.ui @@ -6,8 +6,8 @@ 0 0 - 1008 - 755 + 1000 + 750 @@ -70,7 +70,7 @@ 0 - + @@ -176,7 +176,7 @@
- + @@ -339,7 +339,7 @@ false - 25 + 30
@@ -350,7 +350,7 @@ Qt::Vertical - + @@ -366,7 +366,7 @@ QFrame::Sunken - + 6 @@ -379,504 +379,485 @@ 6 - - - - 1 + + + + + 150 + 16777215 + - - - - - 16777215 - 16777215 - - - - Qt::ClickFocus - - - - Paragraph - - - - - Heading 1 - - - - - Heading 2 - - - - - Heading 2 - - - - - Heading 3 - - - - - Heading 4 - - - - - Heading 5 - - - - - Heading 6 - - - + + Qt::ClickFocus + + + + Paragraph + - - - - - 100 - 16777215 - - - - Qt::ClickFocus - - + + + Heading 1 + - - - - - 45 - 16777215 - - - - Qt::ClickFocus - - - Font size - - - - 22 - 22 - - - + + + Heading 2 + - - - - - 1677 - 1677 - - - - Qt::NoFocus - - - Increase font size - - - - - - - :/icons/textedit/font-increase.png:/icons/textedit/font-increase.png - - - - 24 - 24 - - - - true - - + + + Heading 2 + - - - - - 167 - 167 - - - - Qt::NoFocus - - - Decrease font size - - - - - - - :/icons/textedit/font-decrease.png:/icons/textedit/font-decrease.png - - - - 24 - 24 - - - - true - - + + + Heading 3 + - - - - - 0 - 0 - - - - - 1677 - 1677 - - - - Qt::NoFocus - - - Bold - - - - - - - :/icons/textedit/bold.png:/icons/textedit/bold.png - - - - 24 - 24 - - - - true - - - true - - + + + Heading 4 + - - - - - 0 - 0 - - - - - 167 - 167 - - - - Qt::NoFocus - - - Italic - - - - - - - :/icons/textedit/italic.png:/icons/textedit/italic.png - - - - 24 - 24 - - - - true - - - true - - + + + Heading 5 + - - - - - 0 - 0 - - - - - 167 - 167 - - - - Qt::NoFocus - - - Add an Image - - - - - - - :/icons/textedit/photo-of-a-landscape.png:/icons/textedit/photo-of-a-landscape.png - - - - 24 - 24 - - - - true - - + + + Heading 6 + - - - - - 0 - 0 - - - - - 167 - 167 - - - - Qt::NoFocus - - - Alignment - - - - - - - :/icons/textedit/align.png:/icons/textedit/align.png - - - - 24 - 24 - - - - QToolButton::InstantPopup - - - true - - - - - - - Qt::NoFocus - - - Sets text font to code style - - - - - - - :/icons/textedit/code.png:/icons/textedit/code.png - - - - 24 - 24 - - - - true - - - - - - - Qt::Horizontal - - - - 20 - 24 - - - - - - - - - 0 - 0 - - - - - 167 - 167 - - - - Qt::NoFocus - - - Underline - - - - - - - :/icons/textedit/underline.png:/icons/textedit/underline.png - - - - 24 - 24 - - - - true - - - true - - - - - - - Qt::NoFocus - - - - :/icons/textedit/smile.png:/icons/textedit/smile.png - - - - 24 - 24 - - - - true - - - - - - - - 0 - 0 - - - - - 167 - 167 - - - - Qt::NoFocus - - - Set Text color - - - - - - true - - - - - - - Set Text background color - - - - - - false - - - true - - - - - - - - - - - :/icons/textedit/numberd-list.png:/icons/textedit/numberd-list.png - - - - 24 - 24 - - - - false - - - QToolButton::InstantPopup - - - true - - - - + + + + + + Qt::ClickFocus + + + + + + + + 0 + 0 + + + + Qt::ClickFocus + + + Font size + + + + + + + Qt::NoFocus + + + Set Text color + + + + + + true + + + + + + + Qt::NoFocus + + + Set Text background color + + + + + + false + + + true + + + + + + + + 1677 + 1677 + + + + Qt::NoFocus + + + Increase font size + + + + + + + :/icons/textedit/font-increase.png:/icons/textedit/font-increase.png + + + + 24 + 24 + + + + true + + + + + + + + 167 + 167 + + + + Qt::NoFocus + + + Decrease font size + + + + + + + :/icons/textedit/font-decrease.png:/icons/textedit/font-decrease.png + + + + 24 + 24 + + + + true + + + + + + + + 0 + 0 + + + + + 1677 + 1677 + + + + Qt::NoFocus + + + Bold + + + + + + + :/icons/textedit/bold.png:/icons/textedit/bold.png + + + + 24 + 24 + + + + true + + + true + + + + + + + + 0 + 0 + + + + + 167 + 167 + + + + Qt::NoFocus + + + Underline + + + + + + + :/icons/textedit/underline.png:/icons/textedit/underline.png + + + + 24 + 24 + + + + true + + + true + + + + + + + + 0 + 0 + + + + + 167 + 167 + + + + Qt::NoFocus + + + Italic + + + + + + + :/icons/textedit/italic.png:/icons/textedit/italic.png + + + + 24 + 24 + + + + true + + + true + + + + + + + Qt::NoFocus + + + Sets text font to code style + + + + + + + :/icons/textedit/code.png:/icons/textedit/code.png + + + + 24 + 24 + + + + true + + + + + + + + + + + :/icons/textedit/numberd-list.png:/icons/textedit/numberd-list.png + + + + 24 + 24 + + + + false + + + QToolButton::InstantPopup + + + true + + + + + + + + 0 + 0 + + + + + 167 + 167 + + + + Qt::NoFocus + + + Alignment + + + + + + + :/icons/textedit/align.png:/icons/textedit/align.png + + + + 24 + 24 + + + + QToolButton::InstantPopup + + + true + + + + + + + + 0 + 0 + + + + + 167 + 167 + + + + Qt::NoFocus + + + Add an Image + + + + + + + :/icons/textedit/photo-of-a-landscape.png:/icons/textedit/photo-of-a-landscape.png + + + + 24 + 24 + + + + true + + + + + + + Qt::NoFocus + + + + :/icons/textedit/smile.png:/icons/textedit/smile.png + + + + 24 + 24 + + + + true + + + + + + + Qt::Horizontal + + + + 20 + 24 + + +
- + + + + + 0 + 0 + 0 + + + @@ -897,6 +878,15 @@ + + + + 0 + 0 + 0 + + + @@ -917,6 +907,15 @@ + + + + 154 + 154 + 154 + + + @@ -947,7 +946,7 @@ QFrame::Box - + 6 @@ -961,7 +960,7 @@ 6 - + 16 @@ -980,7 +979,7 @@ - + Distant messages stay into your Outbox until an acknowledgement of receipt has been received. @@ -990,7 +989,7 @@ - + 16 @@ -1027,10 +1026,19 @@ border-image: url(:/images/closepressed.png) - + + + + + 0 + 0 + 0 + + + @@ -1051,6 +1059,15 @@ border-image: url(:/images/closepressed.png) + + + + 0 + 0 + 0 + + + @@ -1071,6 +1088,15 @@ border-image: url(:/images/closepressed.png) + + + + 154 + 154 + 154 + + + @@ -1101,7 +1127,7 @@ border-image: url(:/images/closepressed.png) QFrame::Box - + 6 @@ -1115,7 +1141,7 @@ border-image: url(:/images/closepressed.png) 6 - + 16 @@ -1134,7 +1160,7 @@ border-image: url(:/images/closepressed.png) - + Sending messages to more than 20 people at once is not recommended. If you need to send invites, dedicated forums is what you need. @@ -1144,7 +1170,7 @@ border-image: url(:/images/closepressed.png) - + 16 @@ -1284,8 +1310,8 @@ border-image: url(:/images/closepressed.png) 0 0 - 1008 - 25 + 1176 + 20 @@ -1386,27 +1412,32 @@ border-image: url(:/images/closepressed.png) + + FriendSelectionWidget + QWidget +
gui/common/FriendSelectionWidget.h
+ 1 +
GxsIdChooser QComboBox
gui/gxs/GxsIdChooser.h
+ + HashBox + QScrollArea +
gui/common/HashBox.h
+ 1 +
MimeTextEdit QTextEdit
gui/common/MimeTextEdit.h
- FriendSelectionWidget - QWidget -
gui/common/FriendSelectionWidget.h
- 1 -
- - HashBox - QScrollArea -
gui/common/HashBox.h
- 1 + RSComboBox + QComboBox +
gui/common/RSComboBox.h
@@ -1421,8 +1452,8 @@ border-image: url(:/images/closepressed.png) hashBox - + diff --git a/retroshare-gui/src/gui/msgs/MessageWidget.cpp b/retroshare-gui/src/gui/msgs/MessageWidget.cpp index 9b671129f..e614eeca0 100644 --- a/retroshare-gui/src/gui/msgs/MessageWidget.cpp +++ b/retroshare-gui/src/gui/msgs/MessageWidget.cpp @@ -65,7 +65,7 @@ class RsHtmlMsg : public RsHtml { public: - RsHtmlMsg(uint msgFlags) : RsHtml() + explicit RsHtmlMsg(uint msgFlags) : RsHtml() { this->msgFlags = msgFlags; } @@ -192,13 +192,13 @@ MessageWidget::MessageWidget(bool controlled, QWidget *parent, Qt::WindowFlags f QFont font = QFont("Arial", 10, QFont::Bold); ui.subjectText->setFont(font); - ui.toText->setMaximumHeight(ui.toText->fontMetrics().lineSpacing()*1.5); + ui.trans_ToText->setMaximumHeight(ui.trans_ToText->fontMetrics().lineSpacing()*1.5); ui.ccLabel->setVisible(false); - ui.ccText->setVisible(false); - ui.ccText->setMaximumHeight(ui.ccText->fontMetrics().lineSpacing()*1.5); + ui.trans_CCText->setVisible(false); + ui.trans_CCText->setMaximumHeight(ui.trans_CCText->fontMetrics().lineSpacing()*1.5); ui.bccLabel->setVisible(false); - ui.bccText->setVisible(false); - ui.bccText->setMaximumHeight(ui.bccText->fontMetrics().lineSpacing()*1.5); + ui.trans_BCCText->setVisible(false); + ui.trans_BCCText->setMaximumHeight(ui.trans_BCCText->fontMetrics().lineSpacing()*1.5); ui.tagsLabel->setVisible(false); @@ -210,7 +210,7 @@ MessageWidget::MessageWidget(bool controlled, QWidget *parent, Qt::WindowFlags f ui.dateText-> setText(""); - ui.inviteFrame->hide(); + ui.info_Frame_Invite->hide(); } MessageWidget::~MessageWidget() @@ -355,18 +355,18 @@ void MessageWidget::getcurrentrecommended() std::map files ; - for (QModelIndexList::const_iterator it(list.begin());it!=list.end();++it) { - FileInfo& fi(files[it->row()]) ; + for (auto &it : list) { + FileInfo& fi(files[it.row()]) ; - switch (it->column()) { + switch (it.column()) { case COLUMN_FILE_NAME: - fi.fname = it->data().toString().toUtf8().constData(); + fi.fname = it.data().toString().toUtf8().constData(); break ; case COLUMN_FILE_SIZE: - fi.size = it->data(Qt::UserRole).toULongLong() ; + fi.size = it.data(Qt::UserRole).toULongLong() ; break ; case COLUMN_FILE_HASH: - fi.hash = RsFileHash(it->data().toString().toStdString()) ; + fi.hash = RsFileHash(it.data().toString().toStdString()) ; break ; } } @@ -491,17 +491,17 @@ void MessageWidget::fill(const std::string &msgId) if (currMsgId.empty()) { /* blank it */ ui.dateText-> setText(""); - ui.toText->setText(""); + ui.trans_ToText->setText(""); ui.fromText->setText(""); ui.filesText->setText(""); ui.ccLabel->setVisible(false); - ui.ccText->setVisible(false); - ui.ccText->clear(); + ui.trans_CCText->setVisible(false); + ui.trans_CCText->clear(); ui.bccLabel->setVisible(false); - ui.bccText->setVisible(false); - ui.bccText->clear(); + ui.trans_BCCText->setVisible(false); + ui.trans_BCCText->clear(); ui.subjectText->setText(""); ui.msgList->clear(); @@ -511,7 +511,7 @@ void MessageWidget::fill(const std::string &msgId) clearTagLabels(); checkLength(); - ui.inviteFrame->hide(); + ui.info_Frame_Invite->hide(); ui.expandFilesButton->setChecked(false); ui.downloadButton->setEnabled(false); togglefileview(true); @@ -543,15 +543,15 @@ void MessageWidget::fill(const std::string &msgId) } if ((msgInfo.msgflags & RS_MSG_USER_REQUEST) && msgInfo.rsgxsid_srcId.isNull()){ - ui.inviteFrame->show(); + ui.info_Frame_Invite->show(); ui.sendInviteButton->hide(); - ui.infoLabel->setText(tr("You got an invite to make friend! You may accept this request.")); + ui.infoLabel_Invite->setText(tr("You got an invite to make friend! You may accept this request.")); } else if ((msgInfo.msgflags & RS_MSG_USER_REQUEST) && (!msgInfo.rsgxsid_srcId.isNull())){ - ui.inviteFrame->show(); + ui.info_Frame_Invite->show(); ui.sendInviteButton->show(); - ui.infoLabel->setText(tr("You got an invite to make friend! You may accept this request and send your own Certificate back")); + ui.infoLabel_Invite->setText(tr("You got an invite to make friend! You may accept this request and send your own Certificate back")); } else { - ui.inviteFrame->hide(); + ui.info_Frame_Invite->hide(); } const std::list &recList = msgInfo.files; @@ -594,12 +594,12 @@ void MessageWidget::fill(const std::string &msgId) text += link.toHtml() + " "; } - ui.toText->setText(text); + ui.trans_ToText->setText(text); - if (!msgInfo.rspeerid_msgcc.empty() || !msgInfo.rsgxsid_msgcc.empty()) - { + if (!msgInfo.rspeerid_msgcc.empty() || !msgInfo.rsgxsid_msgcc.empty()) + { ui.ccLabel->setVisible(true); - ui.ccText->setVisible(true); + ui.trans_CCText->setVisible(true); text.clear(); for(std::set::const_iterator pit = msgInfo.rspeerid_msgcc.begin(); pit != msgInfo.rspeerid_msgcc.end(); ++pit) { @@ -613,17 +613,17 @@ void MessageWidget::fill(const std::string &msgId) text += link.toHtml() + " "; } - ui.ccText->setText(text); + ui.trans_CCText->setText(text); } else { ui.ccLabel->setVisible(false); - ui.ccText->setVisible(false); - ui.ccText->clear(); + ui.trans_CCText->setVisible(false); + ui.trans_CCText->clear(); } if (!msgInfo.rspeerid_msgbcc.empty() || !msgInfo.rsgxsid_msgbcc.empty()) { ui.bccLabel->setVisible(true); - ui.bccText->setVisible(true); + ui.trans_BCCText->setVisible(true); text.clear(); for(std::set::const_iterator pit = msgInfo.rspeerid_msgbcc.begin(); pit != msgInfo.rspeerid_msgbcc.end(); ++pit) { @@ -637,11 +637,11 @@ void MessageWidget::fill(const std::string &msgId) text += link.toHtml() + " "; } - ui.bccText->setText(text); + ui.trans_BCCText->setText(text); } else { ui.bccLabel->setVisible(false); - ui.bccText->setVisible(false); - ui.bccText->clear(); + ui.trans_BCCText->setVisible(false); + ui.trans_BCCText->clear(); } ui.dateText->setText(DateTime::formatDateTime(msgInfo.ts)); @@ -916,4 +916,4 @@ void MessageWidget::checkLength() text = tr("%1 (%2) ").arg(charlength).arg(misc::friendlyUnit(charlength)); ui.sizeLabel->setText(text); -} \ No newline at end of file +} diff --git a/retroshare-gui/src/gui/msgs/MessageWidget.ui b/retroshare-gui/src/gui/msgs/MessageWidget.ui index c781dc5d1..6f544a01b 100644 --- a/retroshare-gui/src/gui/msgs/MessageWidget.ui +++ b/retroshare-gui/src/gui/msgs/MessageWidget.ui @@ -347,7 +347,7 @@
- + 0 @@ -366,7 +366,7 @@ - + 0 @@ -385,7 +385,7 @@ - + 0 @@ -461,10 +461,19 @@ - + + + + + 0 + 0 + 0 + + + @@ -485,6 +494,15 @@ + + + + 0 + 0 + 0 + + + @@ -505,6 +523,15 @@ + + + + 154 + 154 + 154 + + + @@ -535,7 +562,7 @@ QFrame::Box - + 6 @@ -549,7 +576,7 @@ 6 - + 16 @@ -568,7 +595,7 @@ - + You got an invite to make friend! You may accept this request and send your own Certificate back diff --git a/retroshare-gui/src/gui/msgs/MessagesDialog.h b/retroshare-gui/src/gui/msgs/MessagesDialog.h index fab811ee7..497c7a06d 100644 --- a/retroshare-gui/src/gui/msgs/MessagesDialog.h +++ b/retroshare-gui/src/gui/msgs/MessagesDialog.h @@ -152,7 +152,7 @@ private: RsMessageModel *mMessageModel; MessageSortFilterProxyModel *mMessageProxyModel; - /* Color definitions (for standard see qss.default) */ + /* Color definitions (for standard see default.qss) */ QColor mTextColorInbox; /** Qt Designer generated object */ diff --git a/retroshare-gui/src/gui/msgs/MessagesDialog.ui b/retroshare-gui/src/gui/msgs/MessagesDialog.ui index 183396a2c..e0bf5c9a0 100644 --- a/retroshare-gui/src/gui/msgs/MessagesDialog.ui +++ b/retroshare-gui/src/gui/msgs/MessagesDialog.ui @@ -10,7 +10,7 @@ 485 - + 0 @@ -36,7 +36,7 @@ Messages - + 0 @@ -55,7 +55,7 @@ Qt::Horizontal - + 0 @@ -72,11 +72,11 @@ 0 - + true - + 3 @@ -139,6 +139,11 @@ 0 + + + 11 + + Qt::CustomContextMenu @@ -188,23 +193,17 @@ - - + + 0 - + true - - QFrame::StyledPanel - - - QFrame::Raised - - + 3 @@ -254,6 +253,11 @@ 0 + + + 11 + + @@ -275,13 +279,13 @@
- - + + 0 - + 3 @@ -321,7 +325,7 @@
- + Qt::Horizontal @@ -352,7 +356,7 @@ Qt::NoFocus - + :/icons/help_64.png:/icons/help_64.png @@ -476,8 +480,8 @@ listWidget - + diff --git a/retroshare-gui/src/gui/profile/ProfileManager.ui b/retroshare-gui/src/gui/profile/ProfileManager.ui index 9ec918e89..a2ffe541b 100644 --- a/retroshare-gui/src/gui/profile/ProfileManager.ui +++ b/retroshare-gui/src/gui/profile/ProfileManager.ui @@ -23,27 +23,36 @@ Profile Manager - + :/images/logo/logo_16.png:/images/logo/logo_16.png - - + + + 0 + + + 0 + + + 0 + + 0 0 - + 0 30 - + - + @@ -54,12 +63,12 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select a Retroshare node key from the list below to be used on another computer, and press &quot;Export selected key.&quot;</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">To create a new location on a different computer, select the identity manager in the login window. From there you can import the key file and create a new location for that key. </p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Creating a new node with the same key allows your friend nodes to accept you automatically.</p></body></html> +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:11pt;">Select a Retroshare node key from the list below to be used on another computer, and press &quot;Export selected key.&quot;</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:11pt;">To create a new location on a different computer, select the identity manager in the login window. From there you can import the key file and create a new location for that key. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:11pt;">Creating a new node with the same key allows your friend nodes to accept you automatically.</span></p></body></html>
@@ -71,11 +80,11 @@ p, li { white-space: pre-wrap; }
- + Full keys available in your keyring: - + diff --git a/retroshare-gui/src/gui/profile/ProfileWidget.cpp b/retroshare-gui/src/gui/profile/ProfileWidget.cpp index b6418ae56..cf823ab53 100644 --- a/retroshare-gui/src/gui/profile/ProfileWidget.cpp +++ b/retroshare-gui/src/gui/profile/ProfileWidget.cpp @@ -45,7 +45,7 @@ ProfileWidget::ProfileWidget(QWidget *parent, Qt::WindowFlags flags) connect(ui.CopyCertButton,SIGNAL(clicked()), this, SLOT(copyCert())); connect(ui.profile_Button,SIGNAL(clicked()), this, SLOT(profilemanager())); - ui.onlinesince->setText(DateTime::formatLongDateTime(Rshare::startupTime())); + ui.onLineSince->setText(DateTime::formatLongDateTime(Rshare::startupTime())); } void ProfileWidget::showEvent ( QShowEvent * /*event*/ ) @@ -59,7 +59,7 @@ void ProfileWidget::showEvent ( QShowEvent * /*event*/ ) ui.name->setText(QString::fromUtf8(detail.name.c_str())); ui.country->setText(QString::fromUtf8(detail.location.c_str())); - ui.peerid->setText(QString::fromStdString(detail.id.toStdString())); + ui.peerId->setText(QString::fromStdString(detail.id.toStdString())); ui.ipAddressList->clear(); for(std::list::const_iterator it(detail.ipAddressList.begin());it!=detail.ipAddressList.end();++it) diff --git a/retroshare-gui/src/gui/profile/ProfileWidget.ui b/retroshare-gui/src/gui/profile/ProfileWidget.ui index 4462acad5..2bd1fae73 100644 --- a/retroshare-gui/src/gui/profile/ProfileWidget.ui +++ b/retroshare-gui/src/gui/profile/ProfileWidget.ui @@ -16,17 +16,35 @@ 0 - - + + 0 - + + 0 + + + 0 + + + 0 + + 0 - - + + + 2 + + + 2 + + + 2 + + 2 @@ -41,7 +59,7 @@ Edit status message - + :/images/edit_16.png:/images/edit_16.png @@ -61,7 +79,7 @@ Copy Certificate - + :/images/view-certificate-copy-32.png:/images/view-certificate-copy-32.png @@ -81,7 +99,7 @@ Profile Manager - + :/images/contact_new.png:/images/contact_new.png @@ -99,7 +117,7 @@ - + Qt::Horizontal @@ -128,18 +146,18 @@ 569 - + - + QFrame::Box QFrame::Sunken - + - + @@ -154,9 +172,10 @@ - + + 12 75 true @@ -169,7 +188,7 @@ - + 0 @@ -207,7 +226,7 @@ - + 0 @@ -245,7 +264,7 @@ - + 0 @@ -264,7 +283,7 @@ - + 0 @@ -286,16 +305,16 @@ - + QFrame::Box QFrame::Sunken - + - + 0 @@ -333,7 +352,7 @@ - + 0 @@ -352,7 +371,7 @@ - + 0 @@ -390,7 +409,7 @@ - + 0 @@ -409,7 +428,7 @@ - + @@ -427,9 +446,10 @@ - + + 12 75 true @@ -445,16 +465,16 @@ - + QFrame::Box QFrame::Sunken - + - + @@ -472,9 +492,10 @@ - + + 12 75 true @@ -487,7 +508,7 @@ - + 0 @@ -547,7 +568,7 @@ - + 0 @@ -566,7 +587,7 @@ - + Qt::Horizontal @@ -620,7 +641,7 @@ - + Qt::Horizontal @@ -633,7 +654,7 @@ - + Qt::Horizontal @@ -646,7 +667,7 @@ - + 0 @@ -675,7 +696,7 @@ - + 100 @@ -722,13 +743,6 @@ - - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
-
diff --git a/retroshare-gui/src/gui/profile/StatusMessage.ui b/retroshare-gui/src/gui/profile/StatusMessage.ui index 0f537c280..c5a29369f 100644 --- a/retroshare-gui/src/gui/profile/StatusMessage.ui +++ b/retroshare-gui/src/gui/profile/StatusMessage.ui @@ -35,7 +35,7 @@ :/images/logo/logo_16.png:/images/logo/logo_16.png
- + 9 @@ -44,12 +44,7 @@ 113 - - QFrame#frame{background: white; -border: 1px solid #CCCCCC;} - - - + 91 @@ -73,7 +68,7 @@ border: 1px solid #CCCCCC;} - + 100 @@ -90,7 +85,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;">Status message</span></p></body></html> - + 100 @@ -107,7 +102,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; color:#666666;">Enter your message</span></p></body></html> - + 20 @@ -129,7 +124,7 @@ p, li { white-space: pre-wrap; } :/images/user/personal64.png - + 0 @@ -138,14 +133,6 @@ p, li { white-space: pre-wrap; } 241 - - QFrame#frame_2{ -background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, -stop:0 #FEFEFE, stop:1 #E8E8E8); - -border: 1px solid #CCCCCC;} - - QFrame::StyledPanel @@ -166,11 +153,11 @@ border: 1px solid #CCCCCC;} - frame_2 - frame - label_3 - label_2 - label + gradFrame + plainBFrame + statusLabel + enterMsgLabel + iconLabel diff --git a/retroshare-gui/src/gui/qss/stylesheet/Standard.qss b/retroshare-gui/src/gui/qss/stylesheet/Standard.qss deleted file mode 100644 index 442055f3b..000000000 --- a/retroshare-gui/src/gui/qss/stylesheet/Standard.qss +++ /dev/null @@ -1,1231 +0,0 @@ -/* Standard stylesheet for RetroShare */ - -/* Standard rules */ - -QFrame#toolBarFrame, QFrame#toolBarFrameTop { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FEFEFE, stop:1 #E8E8E8); - border: 1px solid #CCCCCC; -} - -/* HeaderFrame */ - -HeaderFrame > QFrame#frame { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #9BDBF9, stop:1 #1592CD); - border: 0px; -} - -HeaderFrame > QFrame#frame > QLabel#headerLabel { - color: rgb(255, 255, 255); -} - -AvatarDialog QFrame#infoframe -{ - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -/* GenCertDialog */ - -GenCertDialog QLabel#genprofileinfo_label, QLabel#header_label, QLabel#entropy_label -{ - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -GenCertDialog QLabel#label_hiddenaddr { - border: 1px solid #50FF5B; - border-radius: 6px; - background: #CCFFCC; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #CCFFCC, stop:1 #AAFFAA); -} -GenCertDialog QLabel#no_node_label, GenCertDialog QLabel#no_gpg_key_label { - border: 1px solid #FFC550; - border-radius: 6px; - background: #FFEECC; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFEECC, stop:1 #FFE3AB); - padding: 4px; - font-size: 14pt; -} - -GenCertDialog > QFrame#headerFrame > QLabel#headerLabel { - color: rgb(255, 255, 255); -} - -GenCertDialog > QFrame#frame { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FEFEFE, stop:1 #E8E8E8); - border: 1px solid #CCCCCC; -} - -/* ConnectFriendWizard */ - -ConnectFriendWizard { -/* QWizard cannot be resized horizontal when banner pixmap is set - qproperty-bannerPixmap: url(:/images/connect/connectFriendBanner1.png);*/ - qproperty-titleFontSize: 16; - qproperty-titleFontWeight: 500; -/* qproperty-titleColor: white; */ -} - -/* FriendsDialog */ - -FriendsDialog QFrame#headFrame { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #9BDBF9, stop:1 #1592CD); - border: 1px; - border-radius: 4px; -} - -FriendsDialog QFrame#headFrame > QLabel#nicknameLabel { - color: rgb(255, 255, 255); -} - -FriendsDialog QTextEdit#msgText, FriendsDialog QTextEdit#lineEdit { - border: 1px solid #CCCCCC; -} - -/* Channels */ - -ChannelFeed QFrame#headFrame { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #F2F2F2, stop:1 #E6E6E6); - border: 1px solid #CCCCCC; -} - -ChannelFeed QLabel#logoLabel, EditChanDetails QLabel#logoLabel, CreateChannel QLabel#logoLabel { - border: 2px solid white; -} - -CreateChannelMsg QFrame#fileFrame { - border: 2px solid black; - background: white; -} - -GxsCreateCommentDialog QTextEdit#commentTextEdit { - border: 2px solid #0099cc; - border-radius: 6px; - background: white; -} - -GxsCreateCommentDialog QLabel#titleLabel { - font-size: 12pt; - font-weight: 600; - color: black; -} - -GxsCreateCommentDialog QLabel#replaytolabel { - font-weight: bold; - color: gray; -} - -GxsCreateCommentDialog QFrame#frame { - background: white; -} - -CreateGxsChannelMsg QPushButton#postButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -CreateGxsChannelMsg QPushButton#postButton:hover { - background: #03b1f3; - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - -CreateCircleDialog QPushButton#createButton, CreateLobbyDialog QPushButton#createButton, -IdEditDialog QPushButton#createButton, CreateGxsForumMsg QPushButton#postButton, -GxsCreateCommentDialog QPushButton#postButton, GxsGroupDialog QPushButton#createButton, -PulseAddDialog QPushButton#pushButton_Post, PulseTopLevel QToolButton#toolButton_follow, -PulseViewGroup QToolButton#toolButton_follow, WikiEditDialog QPushButton#pushButton_Submit{ - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 20px; - min-width: 4em; - padding: 2px; - padding-left: 6px; - padding-right: 6px; -} - -CreateCircleDialog QPushButton#createButton:hover, CreateLobbyDialog QPushButton#createButton:hover, -IdEditDialog QPushButton#createButton:hover, CreateGxsForumMsg QPushButton#postButton:hover, -GxsCreateCommentDialog QPushButton#postButton:hover, GxsGroupDialog QPushButton#createButton:hover, -ShareManager QPushButton#closeButton:hover, PulseAddDialog QPushButton#pushButton_Post:hover, -PulseTopLevel QToolButton#toolButton_follow:hover, PulseViewGroup QToolButton#toolButton_follow:hover, -WikiEditDialog QPushButton#pushButton_Submit:hover{ - background: #03b1f3; - border-radius: 4px; - min-width: 4em; - padding: 2px; - padding-left: 6px; - padding-right: 6px; -} - -ShareManager QPushButton#closeButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; - padding-left: 6px; - padding-right: 6px; -} - -ShareManager QPushButton#addButton{ - font: bold; - font-size: 12pt; - color: white; - background: #32CD32; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 4px; -} - -ShareManager QPushButton#addButton:hover{ - background: #5AD75A; - border-radius: 4px; - min-width: 4em; - padding: 4px; -} - -SearchDialog QPushButton#pushButtonSearch { - font: bold; - font-size: 12pt; - color: white; - background: #32CD32; - border-radius: 4px; - max-height: 25px; - min-width: 4em; - padding: 4px; -} - -SearchDialog QPushButton#pushButtonSearch:hover{ - background: #5AD75A; - border-radius: 4px; - min-width: 4em; - padding: 4px; -} - -CreateGxsForumMsg QPushButton#postButton:disabled, PostedCreatePostDialog QPushButton#submitButton:disabled, -CreateGxsChannelMsg QPushButton#postButton:disabled, GxsCreateCommentDialog QPushButton#postButton:disabled, -PulseAddDialog QPushButton#pushButton_Post:disabled, WikiEditDialog QPushButton#pushButton_Submit:disabled { - font: bold; - font-size: 12pt; - color: white; - background: #d40000; - border-radius: 4px; - max-height: 20px; - min-width: 4em; - padding-left: 6px; - padding-right: 6px; -} - -/* Forums */ - -GxsForumThreadWidget QPushButton#forumName -{ - font: bold; - font-size: 12pt; -} - -CreateForumMsg > QToolBar#toolBar, CreateForumV2Msg > QToolBar#toolBar { - background-image: url(:/images/headerFrame.png); -} - -/* MessengerWindow */ - -MessengerWindow QFrame#logoFrame { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FEFEFE, stop:1 #E8E8E8); - border: 1px solid #CCCCCC; -} - -MessengerWindow QFrame#messengerframetop{ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #9BDBF9, stop:1 #1592CD); - border: 0px; -} - -/* Create Distant Chat Invite */ - -CreateMsgLinkDialog QLabel#distantchatinfo_label -{ - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -/* Chat lobby */ - -ChatLobbyWidget QLabel#lobbyinfo_label -{ - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -ChatLobbyWidget QLabel#lobbyname_lineEdit -{ - font: bold; - font-size: 16pt; -} - -ChatLobbyWidget QGroupBox#lobbyinfo_groupBox -{ - - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #FEFEFE, stop:1 #E8E8E8); - border-radius: 6px; - border: 1px solid #CCCCCC; - - padding: 14 6px; - font-size: 12pt; - font-weight: bold; - -} - -ChatLobbyWidget QGroupBox::title#lobbyinfo_groupBox -{ - padding: 4 12px; - background: #039bd5; - color: white; -} - -ChatLobbyWidget QLabel#lobbyInfoLabel { - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - - -ChatLobbyDialog QFrame#participantsFrame { - border: transparent; -} - -ChatLobbyDialog QListWidget#participantsList { - border: 1px solid #B8B6B1; - border-radius: 6px; - background: white; -} - -CreateLobbyDialog QFrame#roomFrame { - border: 2px solid #CCCCCC; - border-radius:6px; - background: white; -} - -CreateLobbyDialog QLabel#lobbyInfoLabel { - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -ChatWidget QTextEdit#chatTextEdit, ChatWidget QTextBrowser#textBrowser { - border: 1px solid #0099cc; - border-radius: 6px; - background: white; -} - -ChatWidget QFrame#infoFrame { - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -ChatWidget QFrame#titleBarFrame, QFrame#toolBarFrameTop { - -} - -PopupChatWindow QToolBar#chattoolBar{ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #9BDBF9, stop:1 #1592CD); - border: 0px; -} - -/* Messages */ - -MessageComposer QToolBar#toolBar { - -} - -MessagesDialog QFrame#folderFrame, MessagesDialog QFrame#quickViewFrame { - background: transparent; - -} - -/* Profile */ - -ProfileWidget QFrame#frame_1, ProfileWidget QFrame#frame_2, ProfileWidget QFrame#frame_3 { - background-color: white; - border: 2px solid #CCCCCC; -} - -/* Settings */ - -PluginItem > QFrame#frame { - border: 2px solid #A8B8D1; - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #FCFDFE, stop: 1 #E2E8EF); - border-radius: 0px -} - -/* Network */ - -/*NetworkView > QGraphWidget#graphicsView -{ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,stop:0 lightgray, stop:1 darkgray); -} -*/ - -/* GetStartedDialog */ - -GetStartedDialog QTextEdit { - border: 1px solid #B8B6B1; - border-radius: 6px; - background: white; -} - -/* GenCertDialog */ - -/* GenCertDialog > QFrame#headerFrame { - background-image: url(:/images/genbackground.png); -} - -GenCertDialog > QFrame#headerFrame > QLabel#headerLabel { - color: rgb(255, 255, 255); -} -*/ - -/* ConnectFriendWizard */ - -ConnectFriendWizard QWizardPage#ConclusionPage > QGroupBox#peerDetailsFrame { - border: 2px solid #039bd5; - border-radius:6px; - background: white; - padding: 12 12px; -} - -ConnectFriendWizard QLabel#fr_label, QLabel#requestinfolabel, QLabel#cp_Label -{ - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -ConnectFriendWizard QGroupBox::title#peerDetailsFrame -{ - padding: 4 12px; - background: transparent; - padding: 4 12px; - background: #039bd5; - color: white; -} - -/* Toaster */ - -ChatToaster > QFrame#windowFrame, -ChatLobbyToaster > QFrame#windowFrame, -DownloadToaster > QFrame#windowFrame, -FriendRequestToaster > QFrame#windowFrame, -GroupChatToaster > QFrame#windowFrame, -MessageToaster >QFrame#windowFrame, -OnlineToaster > QFrame#windowFrame { - background-image: url(:/images/toaster/backgroundtoaster.png); -} - -/* Feeds */ - -AttachFileItem > QFrame#frame { - border: 2px solid black; - background: white; -} - -ChanNewItem > QFrame#frame { - border: 2px solid #D3D3D3; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFFF, stop:1 #F2F2F2); - border-radius: 10px; -} - -ChanNewItem QLabel#logoLabel { - border: 2px solid #D3D3D3; - border-radius: 2px; -} - -GxsChannelPostItem > QFrame#mainFrame[new=false] { - background-color: white; -} - -GxsChannelPostItem > QFrame#mainFrame[new=true] { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #F0F8FD, stop:0.8 #E6F2FD, stop: 0.81 #E6F2FD, stop: 1 #D2E7FD); -} - -GxsChannelPostItem QLabel#newLabel{ - border: 1px solid #167BE7; - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2291E0, stop: 1 #3EB3FF); - border-radius: 3px; - color: white; -} - -GxsChannelPostItem QLabel#subjectLabel, GxsChannelPostItem QLabel#titleLabel { - font: 11pt; - font: bold italic; -} - -GxsChannelPostItem QFrame#msgFrame { - border: 2px solid #82B9F4; - border-radius: 3px; -} - -GxsChannelPostItem QLabel#logoLabel { - border: 2px solid #D3D3D3; -} - -GxsChannelPostItem QLabel#logoLabel { - background-color: black; -} - -GxsCircleItem QFrame#mainFrame { - background-color: white; -} - -GxsCircleItem QLabel#gxsIdLabel, QLabel#nameLabel, QLabel#titleLabel { - font: 11pt; - font: bold italic; -} - - -ForumNewItem > QFrame#frame, ForumMsgItem > QFrame#frame { - border: 2px solid #CCCCCC; - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #EEEEEE, stop: 1 #CCCCCC); - border-radius: 10px; -} - -ForumNewItem > QLabel#nextNameLabel, ForumMsgItem > QLabel#nameLabel { - color: rgb(59, 89, 152); -} - -ForumMsgItem QLabel#iconLabel { - border: 2px solid #CCCCCC; - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #EEEEEE, stop: 1 #CCCCCC); - border-radius: 10px -} - -ForumMsgItem QFrame#prevFrame { - border: 2px solid black; - border-radius: 10px; -} - -SubFileItem QProgressBar#progressBar { - border: 1px solid black; - text-align: center; - color: white; - padding: 1px; - border-top-left-radius: 7px; - border-bottom-left-radius: 7px; - background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #fff, stop: 0.4999 #eee, stop: 0.5 #ddd, stop: 1 #eee); - min-width: 15px; -} - -SubFileItem QProgressBar#progressBar::chunk { - background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #78d, stop: 0.4999 #46a, stop: 0.5 #45a, stop: 1 #238); - border-top-left-radius: 7px; - border-bottom-left-radius: 7px; - border: 1px solid black; - min-width: 15px; -} - -PluginItem QLabel#infoLabel { - - color: #054A02; - font: bold; - -} - -ConfCertDialog QPlainTextEdit#plainTextEdit { - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -ServerPage QPlainTextEdit#plainTextEdit { - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -ServerPage QPlainTextEdit#hiddenpageInHelpPlainTextEdit { - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -ServerPage QPlainTextEdit#pteBobSimple { - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - - -/* ProfileManager */ - -ProfileManager > QFrame#headerFrame { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #9BDBF9, stop:1 #1592CD); - border: 1px solid #CCCCCC; -} - -ProfileManager QTextEdit#textEdit -{ - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -/* RSImageBlockWidget */ - -RSImageBlockWidget QFrame#infoFrame { - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -/* ShareManager */ - -ShareManager QLabel#labelInstructions { - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -/* MessageWidget */ - -MessageWidget QFrame#decryptFrame { - border: 1px solid #50FF5B; - border-radius: 6px; - background: #CCFFCC; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #CCFFCC, stop:1 #AAFFAA); -} - -MessageWidget QFrame#inviteFrame { - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -/* Posted Links */ - -PostedCreatePostDialog QLabel#info_label { - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -QLabel#sharekeyinfo_label{ - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -QLabel#subscribersLabel{ - border: 1px solid #CCCCCC; - border-radius: 6px; - -} - -QFrame#distantFrame{ - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -QLabel#avatarLabel{ - border: 2px solid #CCCCCC; - border-radius: 4px; -} - -IdDialog QFrame#headerFramePerson { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #9BDBF9, stop:1 #1592CD); - border: 1px; - border-radius: 4px; -} - -IdDialog QFrame#headerFrameCircle { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #9BDBF9, stop:1 #1592CD); - border: 1px; - border-radius: 4px; -} - -IdDialog QLabel#headerTextLabel { - color: rgb(255, 255, 255); -} - -IdDialog QLabel#headerTextLabel_Person { - color: rgb(255, 255, 255); -} - -IdDialog QLabel#headerTextLabel_Circles { - color: rgb(255, 255, 255); -} - -IdDialog QLabel#avlabel { - border: 4px solid white; - border-radius: 10px; -} - -IdDialog QFrame#inviteFrame { - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -IdEditDialog QLabel#info_label -{ - border: 1px solid #DCDC41; - border-radius: 6px; - background: #FFFFD7; - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); -} - -GenCertDialog QComboBox#genPGPuser { - border: 2px solid #0099cc; - border-radius: 6px; - background: white; - font: bold; -} - -GenCertDialog QSpinBox#hiddenport_spinBox { - border: 2px solid #0099cc; - border-radius: 6px; - background: white; - font: bold; -} - -GenCertDialog QLineEdit#hiddenaddr_input { - border: 2px solid #0099cc; - border-radius: 6px; - background: white; - font: bold; -} - -GenCertDialog QLineEdit#password2_input { - border: 2px solid #0099cc; - border-radius: 6px; - background: white; - font: bold; -} - -GenCertDialog QLineEdit#password_input { - border: 2px solid #0099cc; - border-radius: 6px; - background: white; - font: bold; -} - -GenCertDialog QLineEdit#nickname_input { - border: 2px solid #0099cc; - border-radius: 6px; - background: white; - font: bold; -} - -GenCertDialog QLineEdit#node_input { - border: 2px solid #0099cc; - border-radius: 6px; - background: white; - font: bold; -} - -GenCertDialog QLineEdit#name_input { - border: 2px solid #0099cc; - border-radius: 6px; - background: white; - font: bold; -} - -GenCertDialog QPushButton#genButton { - border-image: url(:/images/btn_blue.png) 4; - border-width: 4; - font: bold; - color: white; -} - -GenCertDialog QPushButton#genButton:hover { - border-image: url(:/images/btn_blue_hover.png) 4; -} - -GenCertDialog QPushButton#genButton:disabled { - border-image: url(:/images/btn_27.png) 4; -/* font-size: 16pt; */ - font: bold; - color: black; -} - -ConnectFriendWizard QRadioButton { - font-size: 16pt; -} - -ConnectFriendWizard QPlainTextEdit#friendCertEdit { - border: none; - background: white; -} - -ConnectFriendWizard QFrame#friendFrame { - border: 2px solid #0099cc; - border-radius: 6px; - background: white; -} - -StartDialog QPushButton#loadButton { - border-image: url(:/images/btn_blue.png) 4; - border-width: 4; - font: bold; - color: white; -} - -StartDialog QPushButton#loadButton:hover { - border-image: url(:/images/btn_blue_hover.png) 4; -} - -StartDialog QFrame#loginframe{ - border-image: url(:/images/logo/background_lessblue.png) 0 0 0 0 stretch stretch; - border-width: 0px; -} - -GenCertDialog QFrame#profileframe{ - border-image: url(:/images/logo/background.png) 0 0 0 0 stretch stretch; - border-width: 0px; -} - -PostedListWidgetWithModel QComboBox#sortStrategy_CB { - font: bold; - color: #0099cc; -} - -PostedListWidgetWithModel QToolButton#submitPostButton, GxsChannelPostsWidgetWithModel QToolButton#postButton, -GxsForumThreadWidget QToolButton#newthreadButton { - font: bold; -} - -PostedListWidgetWithModel QToolButton#subscribeToolButton { - font: bold; - font-size: 15pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; -} - -PostedListWidgetWithModel QToolButton#subscribeToolButton:hover { - background: #03b1f3; - border-radius: 4px; -} - -PostedListWidgetWithModel QFrame#headerFrame { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FEFEFE, stop:1 #E8E8E8); - border: 1px solid #CCCCCC; -} - -GxsForumThreadWidget QToolButton#subscribeToolButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; -} - -GxsForumThreadWidget QToolButton#subscribeToolButton:hover { - background: #03b1f3; - border-radius: 4px; -} - -GxsForumMsgItem QFrame#mainFrame, PeerItem QFrame#mainFrame, GxsForumGroupItem QFrame#mainFrame, -GxsChannelGroupItem QFrame#mainFrame, MsgItem QFrame#mainFrame, ChatMsgItem QFrame#mainFrame -SecurityIpItem QFrame#mainFrame, MsgItem QFrame#msgFrame, SecurityItem QFrame#mainFrame{ - background-color: white; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton:hover { - background: #03b1f3; - border-radius: 4px; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton:pressed { - background: #03b1f3; - border-radius: 4px; - border: 1px solid gray; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton:disabled { - background: gray; - border-radius: 4px; - border: 1px solid gray; - color: lightgray; -} - -/* only for MenuButtonPopup */ - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton[popupMode="1"], -PostedListWidgetWithModel QToolButton#subscribeToolButton[popupMode="1"]{ - padding-right: 0px; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton::menu-arrow, -PostedListWidgetWithModel QToolButton#subscribeToolButton::menu-arrow{ - image: none; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton::menu-button, -PostedListWidgetWithModel QToolButton#subscribeToolButton::menu-button{ - image: none; -} - -GxsChannelFilesStatusWidget QToolButton#openFolderToolButton::menu-indicator { - image: none; -} - -GxsChannelFilesStatusWidget QToolButton#openFolderToolButton[popupMode="0"] { - padding-right: 0px; -} - -GxsChannelFilesStatusWidget QToolButton#openFolderToolButton::menu-indicator { - image: none; -} - -GxsChannelFilesStatusWidget QToolButton#openFolderToolButton[popupMode="0"] { - padding-right: 0px; -} - -GxsGroupDialog QLabel#groupLogo{ - border: 2px solid #CCCCCC; - border-radius: 3px; -} - -GxsChannelGroupItem QFrame#frame, GxsForumGroupItem QFrame#frame, -PostedGroupItem QFrame#frame { - background-color: white; -} - -HomePage QLabel#userCertLabel { - color: #0099cc; - font: bold; -} - -HomePage QPlainTextEdit#userCertEdit { - - background: transparent; -} - -HomePage QToolButton#addButton { - font: bold; - font-size: 15pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -HomePage QToolButton#addButton:hover { - background: #03b1f3; - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - - -PostedItem QFrame#mainFrame { - background-color: white; -} - -PostedItem > QFrame#mainFrame [new=false]{ - background: white; -} - -PostedItem QFrame#voteFrame { - background: #f8f9fa; -} - -BoardPostDisplayWidget_compact QFrame#mainFrame { - background-color: white; -} - -BoardPostDisplayWidget_compact > QFrame#mainFrame [new=false]{ - background: white; -} - -BoardPostDisplayWidget_compact > QFrame#mainFrame[new=true] { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #F0F8FD, stop:0.8 #E6F2FD, stop: 0.81 #E6F2FD, stop: 1 #D2E7FD); -} - -BoardPostDisplayWidget_compact QLabel#pictureLabel{ - border: 2px solid #CCCCCC; - border-radius: 3px; -} - -BoardPostDisplayWidget_compact QLabel#fromBoldLabel , -BoardPostDisplayWidget_card QLabel#fromBoldLabel { - font: bold; -} - -BoardPostDisplayWidget_compact QLabel#fromBoldLabel, QLabel#fromLabel, QLabel#dateLabel, QLabel#siteBoldLabel , -BoardPostDisplayWidget_card QLabel#fromBoldLabel, QLabel#fromLabel, QLabel#dateLabel, QLabel#siteBoldLabel{ - color: #787c7e; -} - -BoardPostDisplayWidget_compact QLabel#newLabel { - border: 1px solid #167BE7; - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2291E0, stop: 1 #3EB3FF); - border-radius: 3px; -} - -BoardPostDisplayWidget_card QLabel#newLabel { - border: 1px solid #167BE7; - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2291E0, stop: 1 #3EB3FF); - border-radius: 3px; -} - -PostedCardView QFrame#voteFrame { - background: #f8f9fa; -} - -BoardPostDisplayWidget_card QFrame#mainFrame{ - background: white; -} - -BoardPostDisplayWidget_card > QFrame#mainFrame [new=false]{ - background: white; -} - -BoardPostDisplayWidget_card > QFrame#mainFrame[new=true] { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #F0F8FD, stop:0.8 #E6F2FD, stop: 0.81 #E6F2FD, stop: 1 #D2E7FD); -} - -BoardPostDisplayWidget_compact QLabel#titleLabel, -BoardPostDisplayWidget_card QLabel#titleLabel{ - font-size: 12pt; - font: bold; -} - -GxsCommentDialog QComboBox#sortBox { - font: bold; - color: #0099cc; -} - -PostedListWidgetWithModel QTextBrowser#infoDescription { - background: transparent; - border: none; -} - -PostedCreatePostDialog QPushButton#submitButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -PostedCreatePostDialog QPushButton#submitButton:hover { - background: #03b1f3; - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - -MessageWidget QTextBrowser#toText , QTextBrowser#ccText , QTextBrowser#bccText { - background: transparent; - border: none; -} - -WireGroupItem QWidget:hover{ - background-color: #7ecbfb; -} - -WireDialog QFrame#frame{ - background-color: white; -} - -WireDialog QWidget#scrollAreaWidgetContents_groups{ - background-color: white; -} - -MessagesDialog QWidget#messageTreeWidget::item { - padding: 2px; -} - -MessagesDialog QWidget#messageTreeWidget::item:selected { - background-color: #cde8ff; - color: black; -} - -MessagesDialog QWidget#messageTreeWidget::item:hover { - background-color: #e5f3ff; - color: black; -} - -GxsForumThreadWidget QWidget#threadTreeWidget { - selection-background-color: #cde8ff; - show-decoration-selected: 1; -} - -GxsForumThreadWidget QWidget#threadTreeWidget::item { - padding: 2px; -} - -GxsForumThreadWidget QWidget#threadTreeWidget::item:selected:active , -GxsForumThreadWidget QWidget#threadTreeWidget::item:selected:!active { - background-color: #cde8ff; -} - -GxsChannelDialog GroupTreeWidget QTreeWidget#treeWidget::item{ - /*background-color: #F00000;*/ - /*padding: 2px*/ -} - -MainWindow QListWidget { - font-size: 12pt; -} - -PulseTopLevel QFrame#frame, PulseViewGroup QFrame#frame, PulseReply QFrame#frame { - border: 2px solid #c4cfd6; - background: white; -} - -PulseAddDialog QTextEdit#textEdit_Pulse { - border: 2px solid #c4cfd6; - border-radius: 6px; - background: white; -} - -PulseAddDialog QFrame#frame_input, QFrame#frame_reply, QFrame#frame { - border: 0px; -} - -PulseAddDialog QLabel#label_groupName { - font-size: 12pt; -} - -PulseReply #line_replyLine , PulseMessage #line{ - color: #c4cfd6; -} - -PulseReply QLabel#label_groupName{ - color: #5b7083; -} - -WireDialog QLabel#label_viewMode { - font-size: 12pt; -} - -WireGroupDialog QFrame#frame { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #9BDBF9, stop:1 #1592CD); - border: 0px; -} - -PhotoShare QPushButton#pushButton_YourAlbums, QPushButton#pushButton_SubscribedAlbums, -QPushButton#pushButton_SharedAlbums { - font-size: 12pt; -} - -AlbumItem QFrame#albumFrame { - border: 2px solid #CCCCCC; - border-radius: 10px -} - -PhotoItem QFrame#photoFrame { - border: 2px solid #CCCCCC; - border-radius: 10px -} - -PhotoItem QWidget:hover { - background-color: #7ecbfb; -} - -PhotoSlideShow QLabel#albumLabel { - font-size: 12pt; -} - -ChannelsCommentsItem QFrame#mainFrame, BoardsCommentsItem QFrame#mainFrame { - background-color: white; -} - -ChannelsCommentsItem QLabel#newCommentLabel, BoardsCommentsItem QLabel#newCommentLabel { - font-size: 12pt; - font: bold; -} - -ChannelsCommentsItem QLabel#subjectLabel, ChannelsCommentsItem QLabel#titleLabel , QLabel#nameLabel { - font-size: 12pt; - font: bold; -} - -BoardsCommentsItem QLabel#subjectLabel, QLabel#titleLabel , QLabel#nameLabel { - font-size: 12pt; - font: bold; -} - -NewFriendList QTreeView#peerTreeWidget::item:selected, QTreeView#peerTreeWidget::branch:selected:active { - background: #cde8ff; -} - -NewFriendList QTreeView#peerTreeWidget { - font-size: 12pt; -} - -WikiEditDialog QPushButton#pushButton_History { - font: bold; - font-size: 15px; - color: white; - background: #5bb62b; - border-radius: 4px; - max-height: 20px; - min-width: 4em; - padding: 2px; - padding-left: 6px; - padding-right: 6px; -} - -WikiEditDialog QPushButton#pushButton_History:hover { - background: #57af29; -} diff --git a/retroshare-gui/src/gui/qss/stylesheet/Standard_Dark.qss b/retroshare-gui/src/gui/qss/stylesheet/Standard_Dark.qss new file mode 100644 index 000000000..f2097d0be --- /dev/null +++ b/retroshare-gui/src/gui/qss/stylesheet/Standard_Dark.qss @@ -0,0 +1,2545 @@ + /* Standard Dark stylesheet for RetroShare + Don't use font-size or font-weight, they are defined in .ui files. + Icon size are defined in .cpp files. + + For decoration, use px (pixel or dot) + For horizontal size, use em (width of M char) + For vertical size, use ex (height of x char to respect DotPerInch of your system) + See: https://doc.qt.io/qt-5/stylesheet-reference.html#length + + It use a public one for general widgets https://github.com/ColinDuquesnoy/QDarkStyleSheet + /qdarkstyle/dark/style.qss + Updated at 2021-11-04 Tag v3.0.2 + Replace all ":/qss_icons/dark" by ":/standard_dark" + */ + +/* --------------------------------------------------------------------------- + + WARNING! File created programmatically. All changes made in this file will be lost! + + Created by the qtsass compiler v0.3.0 + + The definitions are in the "qdarkstyle.qss._styles.scss" module + +--------------------------------------------------------------------------- */ +/* Light Style - QDarkStyleSheet ------------------------------------------ */ +/* + +See Qt documentation: + + - https://doc.qt.io/qt-5/stylesheet.html + - https://doc.qt.io/qt-5/stylesheet-reference.html + - https://doc.qt.io/qt-5/stylesheet-examples.html + +--------------------------------------------------------------------------- */ +/* Reset elements ------------------------------------------------------------ + +Resetting everything helps to unify styles across different operating systems + +--------------------------------------------------------------------------- */ +* { + padding: 0px; + margin: 0px; + border: 0px; + border-style: none; + border-image: none; + outline: 0; +} + +/* specific reset for elements inside QToolBar */ +QToolBar * { + margin: 0px; + padding: 0px; +} + +/* QWidget ---------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QWidget { + background-color: #19232D; + border: 0px solid #455364; + padding: 0px; + color: #E0E1E3; + selection-background-color: #346792; + selection-color: #E0E1E3; +} + +QWidget:disabled { + background-color: #19232D; + color: #9DA9B5; + selection-background-color: #26486B; + selection-color: #9DA9B5; +} + +QWidget::item:selected { + background-color: #346792; +} + +QWidget::item:hover:!selected { + background-color: #1A72BB; +} + +/* QMainWindow ------------------------------------------------------------ + +This adjusts the splitter in the dock widget, not qsplitter +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmainwindow + +--------------------------------------------------------------------------- */ +QMainWindow::separator { + background-color: #455364; + border: 0px solid #19232D; + spacing: 0px; + padding: 2px; +} + +QMainWindow::separator:hover { + background-color: #60798B; + border: 0px solid #1A72BB; +} + +QMainWindow::separator:horizontal { + width: 5px; + margin-top: 2px; + margin-bottom: 2px; + image: url(":/standard_dark/rc/toolbar_separator_vertical.png"); +} + +QMainWindow::separator:vertical { + height: 5px; + margin-left: 2px; + margin-right: 2px; + image: url(":/standard_dark/rc/toolbar_separator_horizontal.png"); +} + +/* QToolTip --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtooltip + +--------------------------------------------------------------------------- */ +QToolTip { + background-color: #346792; + color: #E0E1E3; + /* If you remove the border property, background stops working on Windows */ + border: none; + /* Remove padding, for fix combo box tooltip */ + padding: 0px; + /* Remove opacity, fix #174 - may need to use RGBA */ +} + +/* QStatusBar ------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qstatusbar + +--------------------------------------------------------------------------- */ +QStatusBar { + border: 1px solid #455364; + /* Fixes Spyder #9120, #9121 */ + background: #455364; + /* Fixes #205, white vertical borders separating items */ +} + +QStatusBar::item { + border: none; +} + +QStatusBar QToolTip { + background-color: #1A72BB; + border: 1px solid #19232D; + color: #19232D; + /* Remove padding, for fix combo box tooltip */ + padding: 0px; + /* Reducing transparency to read better */ + opacity: 230; +} + +QStatusBar QLabel { + /* Fixes Spyder #9120, #9121 */ + background: transparent; +} + +/* QCheckBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcheckbox + +--------------------------------------------------------------------------- */ +QCheckBox { + background-color: #19232D; + color: #E0E1E3; + spacing: 4px; + outline: none; + padding-top: 4px; + padding-bottom: 4px; +} + +QCheckBox:focus { + border: none; +} + +QCheckBox QWidget:disabled { + background-color: #19232D; + color: #9DA9B5; +} + +QCheckBox::indicator { + margin-left: 2px; + height: 14px; + width: 14px; +} + +QCheckBox::indicator:unchecked { + image: url(":/standard_dark/rc/checkbox_unchecked.png"); +} + +QCheckBox::indicator:unchecked:hover, QCheckBox::indicator:unchecked:focus, QCheckBox::indicator:unchecked:pressed { + border: none; + image: url(":/standard_dark/rc/checkbox_unchecked_focus.png"); +} + +QCheckBox::indicator:unchecked:disabled { + image: url(":/standard_dark/rc/checkbox_unchecked_disabled.png"); +} + +QCheckBox::indicator:checked { + image: url(":/standard_dark/rc/checkbox_checked.png"); +} + +QCheckBox::indicator:checked:hover, QCheckBox::indicator:checked:focus, QCheckBox::indicator:checked:pressed { + border: none; + image: url(":/standard_dark/rc/checkbox_checked_focus.png"); +} + +QCheckBox::indicator:checked:disabled { + image: url(":/standard_dark/rc/checkbox_checked_disabled.png"); +} + +QCheckBox::indicator:indeterminate { + image: url(":/standard_dark/rc/checkbox_indeterminate.png"); +} + +QCheckBox::indicator:indeterminate:disabled { + image: url(":/standard_dark/rc/checkbox_indeterminate_disabled.png"); +} + +QCheckBox::indicator:indeterminate:focus, QCheckBox::indicator:indeterminate:hover, QCheckBox::indicator:indeterminate:pressed { + image: url(":/standard_dark/rc/checkbox_indeterminate_focus.png"); +} + +/* QGroupBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qgroupbox + +--------------------------------------------------------------------------- */ +QGroupBox { + font-weight: bold; + border: 1px solid #455364; + border-radius: 4px; + padding: 2px; + margin-top: 6px; + margin-bottom: 4px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 4px; + padding-left: 2px; + padding-right: 4px; + padding-top: -4px; +} + +QGroupBox::indicator { + margin-left: 2px; + margin-top: 2px; + padding: 0; + height: 14px; + width: 14px; +} + +QGroupBox::indicator:unchecked { + border: none; + image: url(":/standard_dark/rc/checkbox_unchecked.png"); +} + +QGroupBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:focus, QGroupBox::indicator:unchecked:pressed { + border: none; + image: url(":/standard_dark/rc/checkbox_unchecked_focus.png"); +} + +QGroupBox::indicator:unchecked:disabled { + image: url(":/standard_dark/rc/checkbox_unchecked_disabled.png"); +} + +QGroupBox::indicator:checked { + border: none; + image: url(":/standard_dark/rc/checkbox_checked.png"); +} + +QGroupBox::indicator:checked:hover, QGroupBox::indicator:checked:focus, QGroupBox::indicator:checked:pressed { + border: none; + image: url(":/standard_dark/rc/checkbox_checked_focus.png"); +} + +QGroupBox::indicator:checked:disabled { + image: url(":/standard_dark/rc/checkbox_checked_disabled.png"); +} + +/* QRadioButton ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qradiobutton + +--------------------------------------------------------------------------- */ +QRadioButton { + background-color: #19232D; + color: #E0E1E3; + spacing: 4px; + padding-top: 4px; + padding-bottom: 4px; + border: none; + outline: none; +} + +QRadioButton:focus { + border: none; +} + +QRadioButton:disabled { + background-color: #19232D; + color: #9DA9B5; + border: none; + outline: none; +} + +QRadioButton QWidget { + background-color: #19232D; + color: #E0E1E3; + spacing: 0px; + padding: 0px; + outline: none; + border: none; +} + +QRadioButton::indicator { + border: none; + outline: none; + margin-left: 2px; + height: 14px; + width: 14px; +} + +QRadioButton::indicator:unchecked { + image: url(":/standard_dark/rc/radio_unchecked.png"); +} + +QRadioButton::indicator:unchecked:hover, QRadioButton::indicator:unchecked:focus, QRadioButton::indicator:unchecked:pressed { + border: none; + outline: none; + image: url(":/standard_dark/rc/radio_unchecked_focus.png"); +} + +QRadioButton::indicator:unchecked:disabled { + image: url(":/standard_dark/rc/radio_unchecked_disabled.png"); +} + +QRadioButton::indicator:checked { + border: none; + outline: none; + image: url(":/standard_dark/rc/radio_checked.png"); +} + +QRadioButton::indicator:checked:hover, QRadioButton::indicator:checked:focus, QRadioButton::indicator:checked:pressed { + border: none; + outline: none; + image: url(":/standard_dark/rc/radio_checked_focus.png"); +} + +QRadioButton::indicator:checked:disabled { + outline: none; + image: url(":/standard_dark/rc/radio_checked_disabled.png"); +} + +/* QMenuBar --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenubar + +--------------------------------------------------------------------------- */ +QMenuBar { + background-color: #455364; + padding: 2px; + border: 1px solid #19232D; + color: #E0E1E3; + selection-background-color: #1A72BB; +} + +QMenuBar:focus { + border: 1px solid #346792; +} + +QMenuBar::item { + background: transparent; + padding: 4px; +} + +QMenuBar::item:selected { + padding: 4px; + background: transparent; + border: 0px solid #455364; + background-color: #1A72BB; +} + +QMenuBar::item:pressed { + padding: 4px; + border: 0px solid #455364; + background-color: #1A72BB; + color: #E0E1E3; + margin-bottom: 0px; + padding-bottom: 0px; +} + +/* QMenu ------------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenu + +--------------------------------------------------------------------------- */ +QMenu { + border: 0px solid #455364; + color: #E0E1E3; + margin: 0px; + background-color: #37414F; + selection-background-color: #1A72BB; +} + +QMenu::separator { + height: 1px; + background-color: #60798B; + color: #E0E1E3; +} + +QMenu::item { + background-color: #37414F; + padding: 4px 24px 4px 28px; + /* Reserve space for selection border */ + border: 1px transparent #455364; +} + +QMenu::item:selected { + color: #E0E1E3; + background-color: #1A72BB; +} + +QMenu::item:pressed { + background-color: #1A72BB; +} + +QMenu::icon { + padding-left: 10px; + width: 14px; + height: 14px; +} + +QMenu::indicator { + padding-left: 8px; + width: 12px; + height: 12px; + /* non-exclusive indicator = check box style indicator (see QActionGroup::setExclusive) */ + /* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ +} + +QMenu::indicator:non-exclusive:unchecked { + image: url(":/standard_dark/rc/checkbox_unchecked.png"); +} + +QMenu::indicator:non-exclusive:unchecked:hover, QMenu::indicator:non-exclusive:unchecked:focus, QMenu::indicator:non-exclusive:unchecked:pressed { + border: none; + image: url(":/standard_dark/rc/checkbox_unchecked_focus.png"); +} + +QMenu::indicator:non-exclusive:unchecked:disabled { + image: url(":/standard_dark/rc/checkbox_unchecked_disabled.png"); +} + +QMenu::indicator:non-exclusive:checked { + image: url(":/standard_dark/rc/checkbox_checked.png"); +} + +QMenu::indicator:non-exclusive:checked:hover, QMenu::indicator:non-exclusive:checked:focus, QMenu::indicator:non-exclusive:checked:pressed { + border: none; + image: url(":/standard_dark/rc/checkbox_checked_focus.png"); +} + +QMenu::indicator:non-exclusive:checked:disabled { + image: url(":/standard_dark/rc/checkbox_checked_disabled.png"); +} + +QMenu::indicator:non-exclusive:indeterminate { + image: url(":/standard_dark/rc/checkbox_indeterminate.png"); +} + +QMenu::indicator:non-exclusive:indeterminate:disabled { + image: url(":/standard_dark/rc/checkbox_indeterminate_disabled.png"); +} + +QMenu::indicator:non-exclusive:indeterminate:focus, QMenu::indicator:non-exclusive:indeterminate:hover, QMenu::indicator:non-exclusive:indeterminate:pressed { + image: url(":/standard_dark/rc/checkbox_indeterminate_focus.png"); +} + +QMenu::indicator:exclusive:unchecked { + image: url(":/standard_dark/rc/radio_unchecked.png"); +} + +QMenu::indicator:exclusive:unchecked:hover, QMenu::indicator:exclusive:unchecked:focus, QMenu::indicator:exclusive:unchecked:pressed { + border: none; + outline: none; + image: url(":/standard_dark/rc/radio_unchecked_focus.png"); +} + +QMenu::indicator:exclusive:unchecked:disabled { + image: url(":/standard_dark/rc/radio_unchecked_disabled.png"); +} + +QMenu::indicator:exclusive:checked { + border: none; + outline: none; + image: url(":/standard_dark/rc/radio_checked.png"); +} + +QMenu::indicator:exclusive:checked:hover, QMenu::indicator:exclusive:checked:focus, QMenu::indicator:exclusive:checked:pressed { + border: none; + outline: none; + image: url(":/standard_dark/rc/radio_checked_focus.png"); +} + +QMenu::indicator:exclusive:checked:disabled { + outline: none; + image: url(":/standard_dark/rc/radio_checked_disabled.png"); +} + +QMenu::right-arrow { + margin: 5px; + padding-left: 12px; + image: url(":/standard_dark/rc/arrow_right.png"); + height: 12px; + width: 12px; +} + +/* QAbstractItemView ------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox + +--------------------------------------------------------------------------- */ +QAbstractItemView { + alternate-background-color: #19232D; + color: #E0E1E3; + border: 1px solid #455364; + border-radius: 4px; +} + +QAbstractItemView QLineEdit { + padding: 2px; +} + +/* QAbstractScrollArea ---------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea + +--------------------------------------------------------------------------- */ +QAbstractScrollArea { + background-color: #19232D; + border: 1px solid #455364; + border-radius: 4px; + /* fix #159 */ + padding: 2px; + /* remove min-height to fix #244 */ + color: #E0E1E3; +} + +QAbstractScrollArea:disabled { + color: #9DA9B5; +} + +/* QScrollArea ------------------------------------------------------------ + +--------------------------------------------------------------------------- */ +QScrollArea QWidget QWidget:disabled { + background-color: #19232D; +} + +/* QScrollBar ------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qscrollbar + +--------------------------------------------------------------------------- */ +QScrollBar:horizontal { + height: 16px; + margin: 2px 16px 2px 16px; + border: 1px solid #455364; + border-radius: 4px; + background-color: #19232D; +} + +QScrollBar:vertical { + background-color: #19232D; + width: 16px; + margin: 16px 2px 16px 2px; + border: 1px solid #455364; + border-radius: 4px; +} + +QScrollBar::handle:horizontal { + background-color: #60798B; + border: 1px solid #455364; + border-radius: 4px; + min-width: 8px; +} + +QScrollBar::handle:horizontal:hover { + background-color: #346792; + border: #346792; + border-radius: 4px; + min-width: 8px; +} + +QScrollBar::handle:horizontal:focus { + border: 1px solid #1A72BB; +} + +QScrollBar::handle:vertical { + background-color: #60798B; + border: 1px solid #455364; + min-height: 8px; + border-radius: 4px; +} + +QScrollBar::handle:vertical:hover { + background-color: #346792; + border: #346792; + border-radius: 4px; + min-height: 8px; +} + +QScrollBar::handle:vertical:focus { + border: 1px solid #1A72BB; +} + +QScrollBar::add-line:horizontal { + margin: 0px 0px 0px 0px; + border-image: url(":/standard_dark/rc/arrow_right_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover, QScrollBar::add-line:horizontal:on { + border-image: url(":/standard_dark/rc/arrow_right.png"); + height: 12px; + width: 12px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url(":/standard_dark/rc/arrow_down_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on { + border-image: url(":/standard_dark/rc/arrow_down.png"); + height: 12px; + width: 12px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + margin: 0px 3px 0px 3px; + border-image: url(":/standard_dark/rc/arrow_left_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on { + border-image: url(":/standard_dark/rc/arrow_left.png"); + height: 12px; + width: 12px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url(":/standard_dark/rc/arrow_up_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover, QScrollBar::sub-line:vertical:on { + border-image: url(":/standard_dark/rc/arrow_up.png"); + height: 12px; + width: 12px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal { + background: none; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { + background: none; +} + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + background: none; +} + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { + background: none; +} + +/* QTextEdit -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-specific-widgets + +--------------------------------------------------------------------------- */ +QTextEdit { + background-color: #19232D; + color: #E0E1E3; + border-radius: 4px; + border: 1px solid #455364; +} + +QTextEdit:focus { + border: 1px solid #1A72BB; +} + +QTextEdit:selected { + background: #346792; + color: #455364; +} + +/* QPlainTextEdit --------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QPlainTextEdit { + background-color: #19232D; + color: #E0E1E3; + border-radius: 4px; + border: 1px solid #455364; +} + +QPlainTextEdit:focus { + border: 1px solid #1A72BB; +} + +QPlainTextEdit:selected { + background: #346792; + color: #455364; +} + +/* QSizeGrip -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsizegrip + +--------------------------------------------------------------------------- */ +QSizeGrip { + background: transparent; + width: 12px; + height: 12px; + image: url(":/standard_dark/rc/window_grip.png"); +} + +/* QStackedWidget --------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QStackedWidget { + padding: 2px; + border: 1px solid #455364; + border: 1px solid #19232D; +} + +/* QToolBar --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbar + +--------------------------------------------------------------------------- */ +QToolBar { + background-color: #455364; + border-bottom: 1px solid #19232D; + padding: 1px; + font-weight: bold; + spacing: 2px; +} + +QToolBar:disabled { + /* Fixes #272 */ + background-color: #455364; +} + +QToolBar::handle:horizontal { + width: 16px; + image: url(":/standard_dark/rc/toolbar_move_horizontal.png"); +} + +QToolBar::handle:vertical { + height: 16px; + image: url(":/standard_dark/rc/toolbar_move_vertical.png"); +} + +QToolBar::separator:horizontal { + width: 16px; + image: url(":/standard_dark/rc/toolbar_separator_horizontal.png"); +} + +QToolBar::separator:vertical { + height: 16px; + image: url(":/standard_dark/rc/toolbar_separator_vertical.png"); +} + +QToolButton#qt_toolbar_ext_button { + background: #455364; + border: 0px; + color: #E0E1E3; + image: url(":/standard_dark/rc/arrow_right.png"); +} + +/* QAbstractSpinBox ------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QAbstractSpinBox { + background-color: #19232D; + border: 1px solid #455364; + color: #E0E1E3; + /* This fixes 103, 111 */ + padding-top: 2px; + /* This fixes 103, 111 */ + padding-bottom: 2px; + padding-left: 4px; + padding-right: 4px; + border-radius: 4px; + /* min-width: 5px; removed to fix 109 */ +} + +QAbstractSpinBox:up-button { + background-color: transparent #19232D; + subcontrol-origin: border; + subcontrol-position: top right; + border-left: 1px solid #455364; + border-bottom: 1px solid #455364; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin: 1px; + width: 12px; + margin-bottom: -1px; +} + +QAbstractSpinBox::up-arrow, QAbstractSpinBox::up-arrow:disabled, QAbstractSpinBox::up-arrow:off { + image: url(":/standard_dark/rc/arrow_up_disabled.png"); + height: 8px; + width: 8px; +} + +QAbstractSpinBox::up-arrow:hover { + image: url(":/standard_dark/rc/arrow_up.png"); +} + +QAbstractSpinBox:down-button { + background-color: transparent #19232D; + subcontrol-origin: border; + subcontrol-position: bottom right; + border-left: 1px solid #455364; + border-top: 1px solid #455364; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin: 1px; + width: 12px; + margin-top: -1px; +} + +QAbstractSpinBox::down-arrow, QAbstractSpinBox::down-arrow:disabled, QAbstractSpinBox::down-arrow:off { + image: url(":/standard_dark/rc/arrow_down_disabled.png"); + height: 8px; + width: 8px; +} + +QAbstractSpinBox::down-arrow:hover { + image: url(":/standard_dark/rc/arrow_down.png"); +} + +QAbstractSpinBox:hover { + border: 1px solid #346792; + color: #E0E1E3; +} + +QAbstractSpinBox:focus { + border: 1px solid #1A72BB; +} + +QAbstractSpinBox:selected { + background: #346792; + color: #455364; +} + +/* ------------------------------------------------------------------------ */ +/* DISPLAYS --------------------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QLabel ----------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe + +--------------------------------------------------------------------------- */ +QLabel { + background-color: #19232D; + border: 0px solid #455364; + padding: 2px; + margin: 0px; + color: #E0E1E3; +} + +QLabel:disabled { + background-color: #19232D; + border: 0px solid #455364; + color: #9DA9B5; +} + +/* QTextBrowser ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea + +--------------------------------------------------------------------------- */ +QTextBrowser { + background-color: #19232D; + border: 1px solid #455364; + color: #E0E1E3; + border-radius: 4px; +} + +QTextBrowser:disabled { + background-color: #19232D; + border: 1px solid #455364; + color: #9DA9B5; + border-radius: 4px; +} + +QTextBrowser:hover, QTextBrowser:!hover, QTextBrowser:selected, QTextBrowser:pressed { + border: 1px solid #455364; +} + +/* QGraphicsView ---------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QGraphicsView { + background-color: #19232D; + border: 1px solid #455364; + color: #E0E1E3; + border-radius: 4px; +} + +QGraphicsView:disabled { + background-color: #19232D; + border: 1px solid #455364; + color: #9DA9B5; + border-radius: 4px; +} + +QGraphicsView:hover, QGraphicsView:!hover, QGraphicsView:selected, QGraphicsView:pressed { + border: 1px solid #455364; +} + +/* QCalendarWidget -------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QCalendarWidget { + border: 1px solid #455364; + border-radius: 4px; +} + +QCalendarWidget:disabled { + background-color: #19232D; + color: #9DA9B5; +} + +/* QLCDNumber ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QLCDNumber { + background-color: #19232D; + color: #E0E1E3; +} + +QLCDNumber:disabled { + background-color: #19232D; + color: #9DA9B5; +} + +/* QProgressBar ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qprogressbar + +--------------------------------------------------------------------------- */ +QProgressBar { + background-color: #19232D; + border: 1px solid #455364; + color: #E0E1E3; + border-radius: 4px; + text-align: center; +} + +QProgressBar:disabled { + background-color: #19232D; + border: 1px solid #455364; + color: #9DA9B5; + border-radius: 4px; + text-align: center; +} + +QProgressBar::chunk { + background-color: #346792; + color: #19232D; + border-radius: 4px; +} + +QProgressBar::chunk:disabled { + background-color: #26486B; + color: #9DA9B5; + border-radius: 4px; +} + +/* ------------------------------------------------------------------------ */ +/* BUTTONS ---------------------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QPushButton ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qpushbutton + +--------------------------------------------------------------------------- */ +QPushButton { + background-color: #455364; + color: #E0E1E3; + border-radius: 4px; + padding: 2px; + outline: none; + border: none; +} + +QPushButton:disabled { + background-color: #455364; + color: #9DA9B5; + border-radius: 4px; + padding: 2px; +} + +QPushButton:checked { + background-color: #60798B; + border-radius: 4px; + padding: 2px; + outline: none; +} + +QPushButton:checked:disabled { + background-color: #60798B; + color: #9DA9B5; + border-radius: 4px; + padding: 2px; + outline: none; +} + +QPushButton:checked:selected { + background: #60798B; +} + +QPushButton:hover { + background-color: #54687A; + color: #E0E1E3; +} + +QPushButton:pressed { + background-color: #60798B; +} + +QPushButton:selected { + background: #60798B; + color: #E0E1E3; +} + +QPushButton::menu-indicator { + subcontrol-origin: padding; + subcontrol-position: bottom right; + bottom: 4px; +} + +QDialogButtonBox QPushButton { + /* Issue #194 #248 - Special case of QPushButton inside dialogs, for better UI */ + min-width: 80px; +} + +/* QToolButton ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbutton + +--------------------------------------------------------------------------- */ +QToolButton { + background-color: #455364; + color: #E0E1E3; + border-radius: 4px; + padding: 2px; + outline: none; + border: none; + /* The subcontrols below are used only in the DelayedPopup mode */ + /* The subcontrols below are used only in the MenuButtonPopup mode */ + /* The subcontrol below is used only in the InstantPopup or DelayedPopup mode */ +} + +QToolButton:disabled { + background-color: #455364; + color: #9DA9B5; + border-radius: 4px; + padding: 2px; +} + +QToolButton:checked { + background-color: #60798B; + border-radius: 4px; + padding: 2px; + outline: none; +} + +QToolButton:checked:disabled { + background-color: #60798B; + color: #9DA9B5; + border-radius: 4px; + padding: 2px; + outline: none; +} + +QToolButton:checked:hover { + background-color: #54687A; + color: #E0E1E3; +} + +QToolButton:checked:pressed { + background-color: #60798B; +} + +QToolButton:checked:selected { + background: #60798B; + color: #E0E1E3; +} + +QToolButton:hover { + background-color: #54687A; + color: #E0E1E3; +} + +QToolButton:pressed { + background-color: #60798B; +} + +QToolButton:selected { + background: #60798B; + color: #E0E1E3; +} + +QToolButton[popupMode="0"] { + /* Only for DelayedPopup */ + padding-right: 2px; +} + +QToolButton[popupMode="1"] { + /* Only for MenuButtonPopup */ + padding-right: 20px; +} + +QToolButton[popupMode="1"]::menu-button { + border: none; +} + +QToolButton[popupMode="1"]::menu-button:hover { + border: none; + border-left: 1px solid #455364; + border-radius: 0; +} + +QToolButton[popupMode="2"] { + /* Only for InstantPopup */ + padding-right: 2px; +} + +QToolButton::menu-button { + padding: 2px; + border-radius: 4px; + width: 12px; + border: none; + outline: none; +} + +QToolButton::menu-button:hover { + border: 1px solid #346792; +} + +QToolButton::menu-button:checked:hover { + border: 1px solid #346792; +} + +QToolButton::menu-indicator { + image: url(":/standard_dark/rc/arrow_down.png"); + height: 8px; + width: 8px; + top: 0; + /* Exclude a shift for better image */ + left: -2px; + /* Shift it a bit */ +} + +QToolButton::menu-arrow { + image: url(":/standard_dark/rc/arrow_down.png"); + height: 8px; + width: 8px; +} + +QToolButton::menu-arrow:hover { + image: url(":/standard_dark/rc/arrow_down_focus.png"); +} + +/* QCommandLinkButton ----------------------------------------------------- + +--------------------------------------------------------------------------- */ +QCommandLinkButton { + background-color: transparent; + border: 1px solid #455364; + color: #E0E1E3; + border-radius: 4px; + padding: 0px; + margin: 0px; +} + +QCommandLinkButton:disabled { + background-color: transparent; + color: #9DA9B5; +} + +/* ------------------------------------------------------------------------ */ +/* INPUTS - NO FIELDS ----------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QComboBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox + +--------------------------------------------------------------------------- */ +QComboBox { + border: 1px solid #455364; + border-radius: 4px; + selection-background-color: #346792; + padding-left: 4px; + padding-right: 4px; + /* padding-right = 36; 4 + 16*2 See scrollbar size */ + /* changed to 4px to fix #239 */ + /* Fixes #103, #111 */ + min-height: 1.5em; + /* padding-top: 2px; removed to fix #132 */ + /* padding-bottom: 2px; removed to fix #132 */ + /* min-width: 75px; removed to fix #109 */ + /* Needed to remove indicator - fix #132 */ +} + +QComboBox QAbstractItemView { + border: 1px solid #455364; + border-radius: 0; + background-color: #19232D; + selection-background-color: #346792; +} + +QComboBox QAbstractItemView:hover { + background-color: #19232D; + color: #E0E1E3; +} + +QComboBox QAbstractItemView:selected { + background: #346792; + color: #455364; +} + +QComboBox QAbstractItemView:alternate { + background: #19232D; +} + +QComboBox:disabled { + background-color: #19232D; + color: #9DA9B5; +} + +QComboBox:hover { + border: 1px solid #346792; +} + +QComboBox:focus { + border: 1px solid #1A72BB; +} + +QComboBox:on { + selection-background-color: #346792; +} + +QComboBox::indicator { + border: none; + border-radius: 0; + background-color: transparent; + selection-background-color: transparent; + color: transparent; + selection-color: transparent; + /* Needed to remove indicator - fix #132 */ +} + +QComboBox::indicator:alternate { + background: #19232D; +} + +QComboBox::item:alternate { + background: #19232D; +} + +QComboBox::item:checked { + font-weight: bold; +} + +QComboBox::item:selected { + border: 0px solid transparent; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 12px; + border-left: 1px solid #455364; +} + +QComboBox::down-arrow { + image: url(":/standard_dark/rc/arrow_down_disabled.png"); + height: 8px; + width: 8px; +} + +QComboBox::down-arrow:on, QComboBox::down-arrow:hover, QComboBox::down-arrow:focus { + image: url(":/standard_dark/rc/arrow_down.png"); +} + +/* QSlider ---------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qslider + +--------------------------------------------------------------------------- */ +QSlider:disabled { + background: #19232D; +} + +QSlider:focus { + border: none; +} + +QSlider::groove:horizontal { + background: #455364; + border: 1px solid #455364; + height: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::groove:vertical { + background: #455364; + border: 1px solid #455364; + width: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::add-page:vertical { + background: #346792; + border: 1px solid #455364; + width: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::add-page:vertical :disabled { + background: #26486B; +} + +QSlider::sub-page:horizontal { + background: #346792; + border: 1px solid #455364; + height: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::sub-page:horizontal:disabled { + background: #26486B; +} + +QSlider::handle:horizontal { + background: #9DA9B5; + border: 1px solid #455364; + width: 8px; + height: 8px; + margin: -8px 0px; + border-radius: 4px; +} + +QSlider::handle:horizontal:hover { + background: #346792; + border: 1px solid #346792; +} + +QSlider::handle:horizontal:focus { + border: 1px solid #1A72BB; +} + +QSlider::handle:vertical { + background: #9DA9B5; + border: 1px solid #455364; + width: 8px; + height: 8px; + margin: 0 -8px; + border-radius: 4px; +} + +QSlider::handle:vertical:hover { + background: #346792; + border: 1px solid #346792; +} + +QSlider::handle:vertical:focus { + border: 1px solid #1A72BB; +} + +/* QLineEdit -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlineedit + +--------------------------------------------------------------------------- */ +QLineEdit { + background-color: #19232D; + padding-top: 2px; + /* This QLineEdit fix 103, 111 */ + padding-bottom: 2px; + /* This QLineEdit fix 103, 111 */ + padding-left: 4px; + padding-right: 4px; + border-style: solid; + border: 1px solid #455364; + border-radius: 4px; + color: #E0E1E3; +} + +QLineEdit:disabled { + background-color: #19232D; + color: #9DA9B5; +} + +QLineEdit:hover { + border: 1px solid #346792; + color: #E0E1E3; +} + +QLineEdit:focus { + border: 1px solid #1A72BB; +} + +QLineEdit:selected { + background-color: #346792; + color: #455364; +} + +/* QTabWiget -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar + +--------------------------------------------------------------------------- */ +QTabWidget { + padding: 2px; + selection-background-color: #455364; +} + +QTabWidget QWidget { + /* Fixes #189 */ + border-radius: 4px; +} + +QTabWidget::pane { + border: 1px solid #455364; + border-radius: 4px; + margin: 0px; + /* Fixes double border inside pane with pyqt5 */ + padding: 0px; +} + +QTabWidget::pane:selected { + background-color: #455364; + border: 1px solid #346792; +} + +/* QTabBar ---------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar + +--------------------------------------------------------------------------- */ +QTabBar, QDockWidget QTabBar { + qproperty-drawBase: 0; + border-radius: 4px; + margin: 0px; + padding: 2px; + border: 0; + /* left: 5px; move to the right by 5px - removed for fix */ +} + +QTabBar::close-button, QDockWidget QTabBar::close-button { + border: 0; + margin: 0; + padding: 4px; + image: url(":/standard_dark/rc/window_close.png"); +} + +QTabBar::close-button:hover, QDockWidget QTabBar::close-button:hover { + image: url(":/standard_dark/rc/window_close_focus.png"); +} + +QTabBar::close-button:pressed, QDockWidget QTabBar::close-button:pressed { + image: url(":/standard_dark/rc/window_close_pressed.png"); +} + +QTabBar::tab, QDockWidget QTabBar::tab { + /* !selected and disabled ----------------------------------------- */ + /* selected ------------------------------------------------------- */ +} + +QTabBar::tab:top:selected:disabled, QDockWidget QTabBar::tab:top:selected:disabled { + border-bottom: 3px solid #26486B; + color: #9DA9B5; + background-color: #455364; +} + +QTabBar::tab:bottom:selected:disabled, QDockWidget QTabBar::tab:bottom:selected:disabled { + border-top: 3px solid #26486B; + color: #9DA9B5; + background-color: #455364; +} + +QTabBar::tab:left:selected:disabled, QDockWidget QTabBar::tab:left:selected:disabled { + border-right: 3px solid #26486B; + color: #9DA9B5; + background-color: #455364; +} + +QTabBar::tab:right:selected:disabled, QDockWidget QTabBar::tab:right:selected:disabled { + border-left: 3px solid #26486B; + color: #9DA9B5; + background-color: #455364; +} + +QTabBar::tab:top:!selected:disabled, QDockWidget QTabBar::tab:top:!selected:disabled { + border-bottom: 3px solid #19232D; + color: #9DA9B5; + background-color: #19232D; +} + +QTabBar::tab:bottom:!selected:disabled, QDockWidget QTabBar::tab:bottom:!selected:disabled { + border-top: 3px solid #19232D; + color: #9DA9B5; + background-color: #19232D; +} + +QTabBar::tab:left:!selected:disabled, QDockWidget QTabBar::tab:left:!selected:disabled { + border-right: 3px solid #19232D; + color: #9DA9B5; + background-color: #19232D; +} + +QTabBar::tab:right:!selected:disabled, QDockWidget QTabBar::tab:right:!selected:disabled { + border-left: 3px solid #19232D; + color: #9DA9B5; + background-color: #19232D; +} + +QTabBar::tab:top:!selected, QDockWidget QTabBar::tab:top:!selected { + border-bottom: 2px solid #19232D; + margin-top: 2px; +} + +QTabBar::tab:bottom:!selected, QDockWidget QTabBar::tab:bottom:!selected { + border-top: 2px solid #19232D; + margin-bottom: 2px; +} + +QTabBar::tab:left:!selected, QDockWidget QTabBar::tab:left:!selected { + border-left: 2px solid #19232D; + margin-right: 2px; +} + +QTabBar::tab:right:!selected, QDockWidget QTabBar::tab:right:!selected { + border-right: 2px solid #19232D; + margin-left: 2px; +} + +QTabBar::tab:top, QDockWidget QTabBar::tab:top { + background-color: #455364; + margin-left: 2px; + padding-left: 4px; + padding-right: 4px; + padding-top: 2px; + padding-bottom: 2px; + min-width: 5px; + border-bottom: 3px solid #455364; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +QTabBar::tab:top:selected, QDockWidget QTabBar::tab:top:selected { + background-color: #54687A; + border-bottom: 3px solid #259AE9; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +QTabBar::tab:top:!selected:hover, QDockWidget QTabBar::tab:top:!selected:hover { + border: 1px solid #1A72BB; + border-bottom: 3px solid #1A72BB; + /* Fixes spyder-ide/spyder#9766 and #243 */ + padding-left: 3px; + padding-right: 3px; +} + +QTabBar::tab:bottom, QDockWidget QTabBar::tab:bottom { + border-top: 3px solid #455364; + background-color: #455364; + margin-left: 2px; + padding-left: 4px; + padding-right: 4px; + padding-top: 2px; + padding-bottom: 2px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + min-width: 5px; +} + +QTabBar::tab:bottom:selected, QDockWidget QTabBar::tab:bottom:selected { + background-color: #54687A; + border-top: 3px solid #259AE9; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +QTabBar::tab:bottom:!selected:hover, QDockWidget QTabBar::tab:bottom:!selected:hover { + border: 1px solid #1A72BB; + border-top: 3px solid #1A72BB; + /* Fixes spyder-ide/spyder#9766 and #243 */ + padding-left: 3px; + padding-right: 3px; +} + +QTabBar::tab:left, QDockWidget QTabBar::tab:left { + background-color: #455364; + margin-top: 2px; + padding-left: 2px; + padding-right: 2px; + padding-top: 4px; + padding-bottom: 4px; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + min-height: 5px; +} + +QTabBar::tab:left:selected, QDockWidget QTabBar::tab:left:selected { + background-color: #54687A; + border-right: 3px solid #259AE9; +} + +QTabBar::tab:left:!selected:hover, QDockWidget QTabBar::tab:left:!selected:hover { + border: 1px solid #1A72BB; + border-right: 3px solid #1A72BB; + /* Fixes different behavior #271 */ + margin-right: 0px; + padding-right: -1px; +} + +QTabBar::tab:right, QDockWidget QTabBar::tab:right { + background-color: #455364; + margin-top: 2px; + padding-left: 2px; + padding-right: 2px; + padding-top: 4px; + padding-bottom: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + min-height: 5px; +} + +QTabBar::tab:right:selected, QDockWidget QTabBar::tab:right:selected { + background-color: #54687A; + border-left: 3px solid #259AE9; +} + +QTabBar::tab:right:!selected:hover, QDockWidget QTabBar::tab:right:!selected:hover { + border: 1px solid #1A72BB; + border-left: 3px solid #1A72BB; + /* Fixes different behavior #271 */ + margin-left: 0px; + padding-left: 0px; +} + +QTabBar QToolButton, QDockWidget QTabBar QToolButton { + /* Fixes #136 */ + background-color: #455364; + height: 12px; + width: 12px; +} + +QTabBar QToolButton:pressed, QDockWidget QTabBar QToolButton:pressed { + background-color: #455364; +} + +QTabBar QToolButton:pressed:hover, QDockWidget QTabBar QToolButton:pressed:hover { + border: 1px solid #346792; +} + +QTabBar QToolButton::left-arrow:enabled, QDockWidget QTabBar QToolButton::left-arrow:enabled { + image: url(":/standard_dark/rc/arrow_left.png"); +} + +QTabBar QToolButton::left-arrow:disabled, QDockWidget QTabBar QToolButton::left-arrow:disabled { + image: url(":/standard_dark/rc/arrow_left_disabled.png"); +} + +QTabBar QToolButton::right-arrow:enabled, QDockWidget QTabBar QToolButton::right-arrow:enabled { + image: url(":/standard_dark/rc/arrow_right.png"); +} + +QTabBar QToolButton::right-arrow:disabled, QDockWidget QTabBar QToolButton::right-arrow:disabled { + image: url(":/standard_dark/rc/arrow_right_disabled.png"); +} + +/* QDockWiget ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QDockWidget { + outline: 1px solid #455364; + background-color: #19232D; + border: 1px solid #455364; + border-radius: 4px; + titlebar-close-icon: url(":/standard_dark/rc/transparent.png"); + titlebar-normal-icon: url(":/standard_dark/rc/transparent.png"); +} + +QDockWidget::title { + /* Better size for title bar */ + padding: 3px; + spacing: 4px; + border: none; + background-color: #455364; +} + +QDockWidget::close-button { + icon-size: 12px; + border: none; + background: transparent; + background-image: transparent; + border: 0; + margin: 0; + padding: 0; + image: url(":/standard_dark/rc/window_close.png"); +} + +QDockWidget::close-button:hover { + image: url(":/standard_dark/rc/window_close_focus.png"); +} + +QDockWidget::close-button:pressed { + image: url(":/standard_dark/rc/window_close_pressed.png"); +} + +QDockWidget::float-button { + icon-size: 12px; + border: none; + background: transparent; + background-image: transparent; + border: 0; + margin: 0; + padding: 0; + image: url(":/standard_dark/rc/window_undock.png"); +} + +QDockWidget::float-button:hover { + image: url(":/standard_dark/rc/window_undock_focus.png"); +} + +QDockWidget::float-button:pressed { + image: url(":/standard_dark/rc/window_undock_pressed.png"); +} + +/* QTreeView QListView QTableView ----------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtreeview +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlistview +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtableview + +--------------------------------------------------------------------------- */ +QTreeView:branch:selected, QTreeView:branch:hover { + background: url(":/standard_dark/rc/transparent.png"); +} + +QTreeView:branch:has-siblings:!adjoins-item { + border-image: url(":/standard_dark/rc/branch_line.png") 0; +} + +QTreeView:branch:has-siblings:adjoins-item { + border-image: url(":/standard_dark/rc/branch_more.png") 0; +} + +QTreeView:branch:!has-children:!has-siblings:adjoins-item { + border-image: url(":/standard_dark/rc/branch_end.png") 0; +} + +QTreeView:branch:has-children:!has-siblings:closed, QTreeView:branch:closed:has-children:has-siblings { + border-image: none; + image: url(":/standard_dark/rc/branch_closed.png"); +} + +QTreeView:branch:open:has-children:!has-siblings, QTreeView:branch:open:has-children:has-siblings { + border-image: none; + image: url(":/standard_dark/rc/branch_open.png"); +} + +QTreeView:branch:has-children:!has-siblings:closed:hover, QTreeView:branch:closed:has-children:has-siblings:hover { + image: url(":/standard_dark/rc/branch_closed_focus.png"); +} + +QTreeView:branch:open:has-children:!has-siblings:hover, QTreeView:branch:open:has-children:has-siblings:hover { + image: url(":/standard_dark/rc/branch_open_focus.png"); +} + +QTreeView::indicator:checked, +QListView::indicator:checked, +QTableView::indicator:checked, +QColumnView::indicator:checked { + image: url(":/standard_dark/rc/checkbox_checked.png"); +} + +QTreeView::indicator:checked:hover, QTreeView::indicator:checked:focus, QTreeView::indicator:checked:pressed, +QListView::indicator:checked:hover, +QListView::indicator:checked:focus, +QListView::indicator:checked:pressed, +QTableView::indicator:checked:hover, +QTableView::indicator:checked:focus, +QTableView::indicator:checked:pressed, +QColumnView::indicator:checked:hover, +QColumnView::indicator:checked:focus, +QColumnView::indicator:checked:pressed { + image: url(":/standard_dark/rc/checkbox_checked_focus.png"); +} + +QTreeView::indicator:unchecked, +QListView::indicator:unchecked, +QTableView::indicator:unchecked, +QColumnView::indicator:unchecked { + image: url(":/standard_dark/rc/checkbox_unchecked.png"); +} + +QTreeView::indicator:unchecked:hover, QTreeView::indicator:unchecked:focus, QTreeView::indicator:unchecked:pressed, +QListView::indicator:unchecked:hover, +QListView::indicator:unchecked:focus, +QListView::indicator:unchecked:pressed, +QTableView::indicator:unchecked:hover, +QTableView::indicator:unchecked:focus, +QTableView::indicator:unchecked:pressed, +QColumnView::indicator:unchecked:hover, +QColumnView::indicator:unchecked:focus, +QColumnView::indicator:unchecked:pressed { + image: url(":/standard_dark/rc/checkbox_unchecked_focus.png"); +} + +QTreeView::indicator:indeterminate, +QListView::indicator:indeterminate, +QTableView::indicator:indeterminate, +QColumnView::indicator:indeterminate { + image: url(":/standard_dark/rc/checkbox_indeterminate.png"); +} + +QTreeView::indicator:indeterminate:hover, QTreeView::indicator:indeterminate:focus, QTreeView::indicator:indeterminate:pressed, +QListView::indicator:indeterminate:hover, +QListView::indicator:indeterminate:focus, +QListView::indicator:indeterminate:pressed, +QTableView::indicator:indeterminate:hover, +QTableView::indicator:indeterminate:focus, +QTableView::indicator:indeterminate:pressed, +QColumnView::indicator:indeterminate:hover, +QColumnView::indicator:indeterminate:focus, +QColumnView::indicator:indeterminate:pressed { + image: url(":/standard_dark/rc/checkbox_indeterminate_focus.png"); +} + +QTreeView, +QListView, +QTableView, +QColumnView { + background-color: #19232D; + border: 1px solid #455364; + color: #E0E1E3; + gridline-color: #455364; + border-radius: 4px; +} + +QTreeView:disabled, +QListView:disabled, +QTableView:disabled, +QColumnView:disabled { + background-color: #19232D; + color: #9DA9B5; +} + +QTreeView:selected, +QListView:selected, +QTableView:selected, +QColumnView:selected { + background-color: #346792; + color: #455364; +} + +QTreeView:focus, +QListView:focus, +QTableView:focus, +QColumnView:focus { + border: 1px solid #1A72BB; +} + +QTreeView::item:pressed, +QListView::item:pressed, +QTableView::item:pressed, +QColumnView::item:pressed { + background-color: #346792; +} + +QTreeView::item:selected:active, +QListView::item:selected:active, +QTableView::item:selected:active, +QColumnView::item:selected:active { + background-color: #346792; +} + +QTreeView::item:selected:!active, +QListView::item:selected:!active, +QTableView::item:selected:!active, +QColumnView::item:selected:!active { + color: #E0E1E3; + background-color: #37414F; +} + +QTreeView::item:!selected:hover, +QListView::item:!selected:hover, +QTableView::item:!selected:hover, +QColumnView::item:!selected:hover { + outline: 0; + color: #E0E1E3; + background-color: #37414F; +} + +QTableCornerButton::section { + background-color: #19232D; + border: 1px transparent #455364; + border-radius: 0px; +} + +/* QHeaderView ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qheaderview + +--------------------------------------------------------------------------- */ +QHeaderView { + background-color: #455364; + border: 0px transparent #455364; + padding: 0; + margin: 0; + border-radius: 0; +} + +QHeaderView:disabled { + background-color: #455364; + border: 1px transparent #455364; +} + +QHeaderView::section { + background-color: #455364; + color: #E0E1E3; + border-radius: 0; + text-align: left; + font-size: 13px; +} + +QHeaderView::section::horizontal { + padding-top: 0; + padding-bottom: 0; + padding-left: 4px; + padding-right: 4px; + border-left: 1px solid #19232D; +} + +QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one { + border-left: 1px solid #455364; +} + +QHeaderView::section::horizontal:disabled { + color: #9DA9B5; +} + +QHeaderView::section::vertical { + padding-top: 0; + padding-bottom: 0; + padding-left: 4px; + padding-right: 4px; + border-top: 1px solid #19232D; +} + +QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one { + border-top: 1px solid #455364; +} + +QHeaderView::section::vertical:disabled { + color: #9DA9B5; +} + +QHeaderView::down-arrow { + /* Those settings (border/width/height/background-color) solve bug */ + /* transparent arrow background and size */ + background-color: #455364; + border: none; + height: 12px; + width: 12px; + padding-left: 2px; + padding-right: 2px; + image: url(":/standard_dark/rc/arrow_down.png"); +} + +QHeaderView::up-arrow { + background-color: #455364; + border: none; + height: 12px; + width: 12px; + padding-left: 2px; + padding-right: 2px; + image: url(":/standard_dark/rc/arrow_up.png"); +} + +/* QToolBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbox + +--------------------------------------------------------------------------- */ +QToolBox { + padding: 0px; + border: 0px; + border: 1px solid #455364; +} + +QToolBox:selected { + padding: 0px; + border: 2px solid #346792; +} + +QToolBox::tab { + background-color: #19232D; + border: 1px solid #455364; + color: #E0E1E3; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +QToolBox::tab:disabled { + color: #9DA9B5; +} + +QToolBox::tab:selected { + background-color: #60798B; + border-bottom: 2px solid #346792; +} + +QToolBox::tab:selected:disabled { + background-color: #455364; + border-bottom: 2px solid #26486B; +} + +QToolBox::tab:!selected { + background-color: #455364; + border-bottom: 2px solid #455364; +} + +QToolBox::tab:!selected:disabled { + background-color: #19232D; +} + +QToolBox::tab:hover { + border-color: #1A72BB; + border-bottom: 2px solid #1A72BB; +} + +QToolBox QScrollArea QWidget QWidget { + padding: 0px; + border: 0px; + background-color: #19232D; +} + +/* QFrame ----------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe +https://doc.qt.io/qt-5/qframe.html#-prop +https://doc.qt.io/qt-5/qframe.html#details +https://stackoverflow.com/questions/14581498/qt-stylesheet-for-hline-vline-color + +--------------------------------------------------------------------------- */ +/* (dot) .QFrame fix #141, #126, #123 */ +.QFrame { + border-radius: 4px; + border: 1px solid #455364; + /* No frame */ + /* HLine */ + /* HLine */ +} + +.QFrame[frameShape="0"] { + border-radius: 4px; + border: 1px transparent #455364; +} + +.QFrame[frameShape="4"] { + max-height: 2px; + border: none; + background-color: #455364; +} + +.QFrame[frameShape="5"] { + max-width: 2px; + border: none; + background-color: #455364; +} + +/* QSplitter -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsplitter + +--------------------------------------------------------------------------- */ +QSplitter { + background-color: #455364; + spacing: 0px; + padding: 0px; + margin: 0px; +} + +QSplitter::handle { + background-color: #455364; + border: 0px solid #19232D; + spacing: 0px; + padding: 1px; + margin: 0px; +} + +QSplitter::handle:hover { + background-color: #9DA9B5; +} + +QSplitter::handle:horizontal { + width: 5px; + image: url(":/standard_dark/rc/line_vertical.png"); +} + +QSplitter::handle:vertical { + height: 5px; + image: url(":/standard_dark/rc/line_horizontal.png"); +} + +/* QDateEdit, QDateTimeEdit ----------------------------------------------- + +--------------------------------------------------------------------------- */ +QDateEdit, QDateTimeEdit { + selection-background-color: #346792; + border-style: solid; + border: 1px solid #455364; + border-radius: 4px; + /* This fixes 103, 111 */ + padding-top: 2px; + /* This fixes 103, 111 */ + padding-bottom: 2px; + padding-left: 4px; + padding-right: 4px; + min-width: 10px; +} + +QDateEdit:on, QDateTimeEdit:on { + selection-background-color: #346792; +} + +QDateEdit::drop-down, QDateTimeEdit::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 12px; + border-left: 1px solid #455364; +} + +QDateEdit::down-arrow, QDateTimeEdit::down-arrow { + image: url(":/standard_dark/rc/arrow_down_disabled.png"); + height: 8px; + width: 8px; +} + +QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, QDateEdit::down-arrow:focus, QDateTimeEdit::down-arrow:on, QDateTimeEdit::down-arrow:hover, QDateTimeEdit::down-arrow:focus { + image: url(":/standard_dark/rc/arrow_down.png"); +} + +QDateEdit QAbstractItemView, QDateTimeEdit QAbstractItemView { + background-color: #19232D; + border-radius: 4px; + border: 1px solid #455364; + selection-background-color: #346792; +} + +/* QAbstractView ---------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QAbstractView:hover { + border: 1px solid #346792; + color: #E0E1E3; +} + +QAbstractView:selected { + background: #346792; + color: #455364; +} + +/* PlotWidget ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +PlotWidget { + /* Fix cut labels in plots #134 */ + padding: 0px; +} + +/**********************************/ +/* RetroShare specific part */ +/**********************************/ + +/**** Fix QTreeView Items ****/ + +QTreeView::item, +QListView::item, +QTableView::item, +QColumnView::item { + color: #F0F0F0; + background: transparent; +} +QTreeView:branch:!selected:hover, +QTreeView:branch:selected:!active { + color: #E0E1E3; + background-color: #37414F; +} + +/**** Fix QSplitter ****/ + +QSplitter { + background-color: #19232D; +} + +QSplitter::handle { + background-color: #455364; + border: 0px solid #455364; + border-radius: 4px; +} + + +/**** Standard rules ****/ + +QFrame[objectName^="feedFrame"],/* Frame used in Feeds*/ +QFrame[objectName^="plainFrame"],/* Frame used in Widget with plain background*/ +QFrame[objectName^="plainBFrame"] {/* Frame used in Widget with plain bordered background*/ + background-color: #19232D; +} +QFrame[objectName^="plainBFrame"] { + border: 1px solid #32414B; +} + +/* Frame used in old Feeds*/ +QFrame#feedFrame[new=false] { + background-color: #19232D; +} +/* Frame used in new Feeds*/ +QFrame#feedFrame[new=true] { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #19232D, stop:0.8 #1251A0, stop: 0.81 #1251A0, stop: 1 #19232D); +} +QFrame#feedFrame QLabel { + background: transparent; +} + +QFrame[objectName^="gradFrame"],/* Frame used in Widget with gradient colored background*/ +QFrame#bottomFrame,/* Frame used at the bottom of dialog*/ +QFrame#toasterFrame,/* Frame used in Toasters*/ +QFrame#toolBarFrame {/* Frame used for buttons*/ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #19232D, stop:1 #32414B); + border: 1px solid #CCCCCC; +} +QFrame#toolBarFrame > LineEditClear { + background-color: #29333D; +} +QFrame[objectName^="gradFrame"] QComboBox, +QFrame[objectName^="gradFrame"] QLineEdit, +QFrame[objectName^="gradFrame"] QTextEdit { + background-color: #29333D; +} +QFrame[objectName^="gradFrame"] QComboBox QAbstractItemView { + background-color: #555555; + selection-background-color: #1464A0; +} + +QLabel#avatarLabel{ + border: 2px solid #CCCCCC; + border-radius: 4px; +} + + +/* HeaderFrame & TitleBarFrame */ + +QFrame[objectName^="headerFrame"], +QFrame[objectName^="headerBFrame"], +QToolBar#headerToolBar, +QFrame#titleBarFrame { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #455364, stop: 0.5 #54687A,stop: 0.6 #44586A, stop:1 #455364); + border: 0px; +} +QFrame[objectName^="#headerBFrame"] { + border: 1px; + border-radius: 4px; +} +QFrame[objectName^="headerFrame"] > *:!hover, +QFrame[objectName^="headerBFrame"] > *:!hover, +QFrame#titleBarFrame > *:!hover { + background: transparent; + color: white; +} +QFrame#titleBarFrame QComboBox, +QFrame#titleBarFrame QLineEdit, +QFrame#titleBarFrame QTextEdit { + background: #29333D; +} + + +/**** Special Page tweak ****/ + + +/* Forums */ + +GxsForumThreadWidget QWidget#threadTreeWidget { + selection-background-color: #005599; + show-decoration-selected: 1; +} + +GxsForumThreadWidget QWidget#threadTreeWidget::item { + padding: 2px; +} + +GxsForumThreadWidget QWidget#threadTreeWidget::item:selected:active , +GxsForumThreadWidget QWidget#threadTreeWidget::item:selected:!active { + background-color: #005599; +} + + +/* Posted */ + +BoardPostDisplayWidget_compact QFrame#voteFrame, +BoardPostDisplayWidget_card QFrame#voteFrame, +PostedItem QFrame#voteFrame { + background: rgba( 80, 80, 80, 20% ); +} + +BoardPostDisplayWidget_card QToolButton#voteUpButton, +BoardPostDisplayWidget_compact QToolButton#voteUpButton { + background-color: #166716; + border: none; + border-radius: 4px; +} +BoardPostDisplayWidget_card QToolButton#voteDownButton, +BoardPostDisplayWidget_compact QToolButton#voteDownButton { + background-color: #673232; + border: none; + border-radius: 4px; +} + +BoardPostDisplayWidget_card QToolButton#voteUpButton:hover, +BoardPostDisplayWidget_compact QToolButton#voteUpButton:hover { + background-color: #166716; + border: 2px solid #808080; + border-radius: 4px; +} +BoardPostDisplayWidget_card QToolButton#voteDownButton:hover, +BoardPostDisplayWidget_compact QToolButton#voteDownButton:hover { + background-color: #673232; + border: 2px solid #808080; + border-radius: 4px; +} + +BoardPostDisplayWidget_card QToolButton#voteUpButton:disabled, +BoardPostDisplayWidget_compact QToolButton#voteUpButton:disabled, +BoardPostDisplayWidget_card QToolButton#voteDownButton:disabled, +BoardPostDisplayWidget_compact QToolButton#voteDownButton:disabled { + background: transparent; + border: none; +} + +BoardPostDisplayWidget_card QLabel#pictureLabel, +BoardPostDisplayWidget_compact QLabel#pictureLabel{ + border: 2px solid #444444; + border-radius: 3px; +} + + +/*************** Optional ***************/ + +/**** WikiPoos ****/ +WikiEditDialog QPushButton#pushButton_History { + color: white; + background: #5bb62b; + border-radius: 4px; + max-height: 20px; + min-width: 4em; + padding: 2px; + padding-left: 6px; + padding-right: 6px; +} + +WikiEditDialog QPushButton#pushButton_History:hover { + background: #57af29; +} + + +/**** The Wire ****/ + +WireGroupItem QFrame#wire_frame QLabel{ + background: transparent; +} +WireGroupItem QFrame#wire_frame:hover { + background-color: #2e8bab; +} + +PulseTopLevel QFrame#frame, +PulseViewGroup QFrame#frame, +PulseReply QFrame#frame { + border: 2px solid #38444d; + border-radius: 6px; +} + +PulseAddDialog QTextEdit#textEdit_Pulse { + border: 2px solid #c4cfd6; + border-radius: 6px; + background: white; + color: black; +} + +PulseReply #line_replyLine, +PulseMessage #line{ + color: #c4cfd6; +} + +PulseReply QLabel#label_groupName{ + color: #5b7083; +} + +/**** Color definitions ****/ + +ForumsDialog, GxsForumThreadWidget +{ + qproperty-textColorRead: darkgray; + qproperty-textColorUnread: white; + qproperty-textColorUnreadChildren: red; + qproperty-textColorNotSubscribed: white; + qproperty-textColorMissing: darkred; + qproperty-textColorPinned: #D07000; + + qproperty-backgroundColorPinned: #19232D; + qproperty-backgroundColorFiltered: darkGreen; +} + +GroupTreeWidget +{ + qproperty-textColorCategory: rgb(99, 99, 99); + qproperty-textColorPrivateKey: rgb(85,151,209); +} + +NetworkDialog { + qproperty-backgroundColorSelf: darkred; + qproperty-backgroundColorOwnSign: darkred; + qproperty-backgroundColorAcceptConnection: black; + qproperty-backgroundColorHasSignedMe: darkred; + qproperty-backgroundColorDenied: #201F1F; + qproperty-textColor: white; +} + +NewFriendList { + qproperty-textColorStatusAway: #4040A0; + qproperty-textColorStatusBusy: #A04040; + qproperty-textColorStatusOnline: #40A040; + qproperty-textColorStatusInactive: #A0A040; + qproperty-textColorStatusOffline: gray; + qproperty-textColorGroup: rgb(123, 123, 123); +} + +RSTextBrowser, MimeTextEdit +{ + /*qproperty-textColorQuote: rgb(125, 125, 255);*/ + qproperty-textColorQuotes: ColorList(#789922 #039bd5 #800000 #800080 #008080 #b10dc9 #85144b #3d9970); +} + +/* OpModeStatus need to be at end to overload other values*/ + +OpModeStatus { + qproperty-opMode_Full_Color: #007000; + qproperty-opMode_NoTurtle_Color: #000070; + qproperty-opMode_Gaming_Color: #707000; + qproperty-opMode_Minimal_Color: #700000; +} +OpModeStatus[opMode="Full"] { + color: #F0F0F0; + background: #007000; +} +OpModeStatus[opMode="NoTurtle"] { + color: #F0F0F0; + background: #000070; +} +OpModeStatus[opMode="Gaming"] { + color: #F0F0F0; + background: #707000; +} +OpModeStatus[opMode="Minimal"] { + color: #F0F0F0; + background: #700000; +} + +/*Property Values at end to overwrite other settings*/ + +[new=false] { + background: #19232D; +} +[new=true] { + background: #1251A0; +} + +[valid=true] { + background: rgba(0,255,0,15%); +} + +[valid=false] { + background: rgba(255,0,0,15%); +} + +[WrongValue="true"] { + background-color: #702020; +} diff --git a/retroshare-gui/src/gui/qss/stylesheet/Standard_Light.qss b/retroshare-gui/src/gui/qss/stylesheet/Standard_Light.qss new file mode 100644 index 000000000..85f601e3e --- /dev/null +++ b/retroshare-gui/src/gui/qss/stylesheet/Standard_Light.qss @@ -0,0 +1,2685 @@ +/* Standard Light stylesheet for RetroShare + Don't use font-size or font-weight, they are defined in .ui files. + Icon size are defined in .cpp files. + + For decoration, use px (pixel or dot) + For horizontal size, use em (width of M char) + For vertical size, use ex (height of x char to respect DotPerInch of your system) + See: https://doc.qt.io/qt-5/stylesheet-reference.html#length + + It use a public one for general widgets https://github.com/ColinDuquesnoy/QDarkStyleSheet + /qdarkstyle/light/style.qss + Updated at 2021-11-04 Tag v3.0.2 + Replace all ":/qss_icons/light" by ":/standard_light" + */ + +/* --------------------------------------------------------------------------- + + WARNING! File created programmatically. All changes made in this file will be lost! + + Created by the qtsass compiler v0.3.0 + + The definitions are in the "qdarkstyle.qss._styles.scss" module + +--------------------------------------------------------------------------- */ +/* Dark Style - QDarkStyleSheet ------------------------------------------ */ +/* + +See Qt documentation: + + - https://doc.qt.io/qt-5/stylesheet.html + - https://doc.qt.io/qt-5/stylesheet-reference.html + - https://doc.qt.io/qt-5/stylesheet-examples.html + +--------------------------------------------------------------------------- */ +/* Reset elements ------------------------------------------------------------ + +Resetting everything helps to unify styles across different operating systems + +--------------------------------------------------------------------------- */ +* { + padding: 0px; + margin: 0px; + border: 0px; + border-style: none; + border-image: none; + outline: 0; +} + +/* specific reset for elements inside QToolBar */ +QToolBar * { + margin: 0px; + padding: 0px; +} + +/* QWidget ---------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QWidget { + background-color: #FAFAFA; + border: 0px solid #C9CDD0; + padding: 0px; + color: #19232D; + selection-background-color: #9FCBFF; + selection-color: #19232D; +} + +QWidget:disabled { + background-color: #FAFAFA; + color: #788D9C; + selection-background-color: #DAEDFF; + selection-color: #788D9C; +} + +QWidget::item:selected { + background-color: #9FCBFF; +} + +QWidget::item:hover:!selected { + background-color: #73C7FF; +} + +/* QMainWindow ------------------------------------------------------------ + +This adjusts the splitter in the dock widget, not qsplitter +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmainwindow + +--------------------------------------------------------------------------- */ +QMainWindow::separator { + background-color: #C9CDD0; + border: 0px solid #FAFAFA; + spacing: 0px; + padding: 2px; +} + +QMainWindow::separator:hover { + background-color: #ACB1B6; + border: 0px solid #73C7FF; +} + +QMainWindow::separator:horizontal { + width: 5px; + margin-top: 2px; + margin-bottom: 2px; + image: url(":/standard_light/rc/toolbar_separator_vertical.png"); +} + +QMainWindow::separator:vertical { + height: 5px; + margin-left: 2px; + margin-right: 2px; + image: url(":/standard_light/rc/toolbar_separator_horizontal.png"); +} + +/* QToolTip --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtooltip + +--------------------------------------------------------------------------- */ +QToolTip { + background-color: #9FCBFF; + color: #19232D; + /* If you remove the border property, background stops working on Windows */ + border: none; + /* Remove padding, for fix combo box tooltip */ + padding: 0px; + /* Remove opacity, fix #174 - may need to use RGBA */ +} + +/* QStatusBar ------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qstatusbar + +--------------------------------------------------------------------------- */ +QStatusBar { + border: 1px solid #C9CDD0; + /* Fixes Spyder #9120, #9121 */ + background: #C9CDD0; + /* Fixes #205, white vertical borders separating items */ +} + +QStatusBar::item { + border: none; +} + +QStatusBar QToolTip { + background-color: #73C7FF; + border: 1px solid #FAFAFA; + color: #FAFAFA; + /* Remove padding, for fix combo box tooltip */ + padding: 0px; + /* Reducing transparency to read better */ + opacity: 230; +} + +QStatusBar QLabel { + /* Fixes Spyder #9120, #9121 */ + background: transparent; +} + +/* QCheckBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcheckbox + +--------------------------------------------------------------------------- */ +QCheckBox { + background-color: #FAFAFA; + color: #19232D; + spacing: 4px; + outline: none; + padding-top: 4px; + padding-bottom: 4px; +} + +QCheckBox:focus { + border: none; +} + +QCheckBox QWidget:disabled { + background-color: #FAFAFA; + color: #788D9C; +} + +QCheckBox::indicator { + margin-left: 2px; + height: 14px; + width: 14px; +} + +QCheckBox::indicator:unchecked { + image: url(":/standard_light/rc/checkbox_unchecked.png"); +} + +QCheckBox::indicator:unchecked:hover, QCheckBox::indicator:unchecked:focus, QCheckBox::indicator:unchecked:pressed { + border: none; + image: url(":/standard_light/rc/checkbox_unchecked_focus.png"); +} + +QCheckBox::indicator:unchecked:disabled { + image: url(":/standard_light/rc/checkbox_unchecked_disabled.png"); +} + +QCheckBox::indicator:checked { + image: url(":/standard_light/rc/checkbox_checked.png"); +} + +QCheckBox::indicator:checked:hover, QCheckBox::indicator:checked:focus, QCheckBox::indicator:checked:pressed { + border: none; + image: url(":/standard_light/rc/checkbox_checked_focus.png"); +} + +QCheckBox::indicator:checked:disabled { + image: url(":/standard_light/rc/checkbox_checked_disabled.png"); +} + +QCheckBox::indicator:indeterminate { + image: url(":/standard_light/rc/checkbox_indeterminate.png"); +} + +QCheckBox::indicator:indeterminate:disabled { + image: url(":/standard_light/rc/checkbox_indeterminate_disabled.png"); +} + +QCheckBox::indicator:indeterminate:focus, QCheckBox::indicator:indeterminate:hover, QCheckBox::indicator:indeterminate:pressed { + image: url(":/standard_light/rc/checkbox_indeterminate_focus.png"); +} + +/* QGroupBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qgroupbox + +--------------------------------------------------------------------------- */ +QGroupBox { + font-weight: bold; + border: 1px solid #C9CDD0; + border-radius: 4px; + padding: 2px; + margin-top: 6px; + margin-bottom: 4px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 4px; + padding-left: 2px; + padding-right: 4px; + padding-top: -4px; +} + +QGroupBox::indicator { + margin-left: 2px; + margin-top: 2px; + padding: 0; + height: 14px; + width: 14px; +} + +QGroupBox::indicator:unchecked { + border: none; + image: url(":/standard_light/rc/checkbox_unchecked.png"); +} + +QGroupBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:focus, QGroupBox::indicator:unchecked:pressed { + border: none; + image: url(":/standard_light/rc/checkbox_unchecked_focus.png"); +} + +QGroupBox::indicator:unchecked:disabled { + image: url(":/standard_light/rc/checkbox_unchecked_disabled.png"); +} + +QGroupBox::indicator:checked { + border: none; + image: url(":/standard_light/rc/checkbox_checked.png"); +} + +QGroupBox::indicator:checked:hover, QGroupBox::indicator:checked:focus, QGroupBox::indicator:checked:pressed { + border: none; + image: url(":/standard_light/rc/checkbox_checked_focus.png"); +} + +QGroupBox::indicator:checked:disabled { + image: url(":/standard_light/rc/checkbox_checked_disabled.png"); +} + +/* QRadioButton ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qradiobutton + +--------------------------------------------------------------------------- */ +QRadioButton { + background-color: #FAFAFA; + color: #19232D; + spacing: 4px; + padding-top: 4px; + padding-bottom: 4px; + border: none; + outline: none; +} + +QRadioButton:focus { + border: none; +} + +QRadioButton:disabled { + background-color: #FAFAFA; + color: #788D9C; + border: none; + outline: none; +} + +QRadioButton QWidget { + background-color: #FAFAFA; + color: #19232D; + spacing: 0px; + padding: 0px; + outline: none; + border: none; +} + +QRadioButton::indicator { + border: none; + outline: none; + margin-left: 2px; + height: 14px; + width: 14px; +} + +QRadioButton::indicator:unchecked { + image: url(":/standard_light/rc/radio_unchecked.png"); +} + +QRadioButton::indicator:unchecked:hover, QRadioButton::indicator:unchecked:focus, QRadioButton::indicator:unchecked:pressed { + border: none; + outline: none; + image: url(":/standard_light/rc/radio_unchecked_focus.png"); +} + +QRadioButton::indicator:unchecked:disabled { + image: url(":/standard_light/rc/radio_unchecked_disabled.png"); +} + +QRadioButton::indicator:checked { + border: none; + outline: none; + image: url(":/standard_light/rc/radio_checked.png"); +} + +QRadioButton::indicator:checked:hover, QRadioButton::indicator:checked:focus, QRadioButton::indicator:checked:pressed { + border: none; + outline: none; + image: url(":/standard_light/rc/radio_checked_focus.png"); +} + +QRadioButton::indicator:checked:disabled { + outline: none; + image: url(":/standard_light/rc/radio_checked_disabled.png"); +} + +/* QMenuBar --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenubar + +--------------------------------------------------------------------------- */ +QMenuBar { + background-color: #C9CDD0; + padding: 2px; + border: 1px solid #FAFAFA; + color: #19232D; + selection-background-color: #73C7FF; +} + +QMenuBar:focus { + border: 1px solid #9FCBFF; +} + +QMenuBar::item { + background: transparent; + padding: 4px; +} + +QMenuBar::item:selected { + padding: 4px; + background: transparent; + border: 0px solid #C9CDD0; + background-color: #73C7FF; +} + +QMenuBar::item:pressed { + padding: 4px; + border: 0px solid #C9CDD0; + background-color: #73C7FF; + color: #19232D; + margin-bottom: 0px; + padding-bottom: 0px; +} + +/* QMenu ------------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenu + +--------------------------------------------------------------------------- */ +QMenu { + border: 0px solid #C9CDD0; + color: #19232D; + margin: 0px; + background-color: #CED1D4; + selection-background-color: #73C7FF; +} + +QMenu::separator { + height: 1px; + background-color: #ACB1B6; + color: #19232D; +} + +QMenu::item { + background-color: #CED1D4; + padding: 4px 24px 4px 28px; + /* Reserve space for selection border */ + border: 1px transparent #C9CDD0; +} + +QMenu::item:selected { + color: #19232D; + background-color: #73C7FF; +} + +QMenu::item:pressed { + background-color: #73C7FF; +} + +QMenu::icon { + padding-left: 10px; + width: 14px; + height: 14px; +} + +QMenu::indicator { + padding-left: 8px; + width: 12px; + height: 12px; + /* non-exclusive indicator = check box style indicator (see QActionGroup::setExclusive) */ + /* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ +} + +QMenu::indicator:non-exclusive:unchecked { + image: url(":/standard_light/rc/checkbox_unchecked.png"); +} + +QMenu::indicator:non-exclusive:unchecked:hover, QMenu::indicator:non-exclusive:unchecked:focus, QMenu::indicator:non-exclusive:unchecked:pressed { + border: none; + image: url(":/standard_light/rc/checkbox_unchecked_focus.png"); +} + +QMenu::indicator:non-exclusive:unchecked:disabled { + image: url(":/standard_light/rc/checkbox_unchecked_disabled.png"); +} + +QMenu::indicator:non-exclusive:checked { + image: url(":/standard_light/rc/checkbox_checked.png"); +} + +QMenu::indicator:non-exclusive:checked:hover, QMenu::indicator:non-exclusive:checked:focus, QMenu::indicator:non-exclusive:checked:pressed { + border: none; + image: url(":/standard_light/rc/checkbox_checked_focus.png"); +} + +QMenu::indicator:non-exclusive:checked:disabled { + image: url(":/standard_light/rc/checkbox_checked_disabled.png"); +} + +QMenu::indicator:non-exclusive:indeterminate { + image: url(":/standard_light/rc/checkbox_indeterminate.png"); +} + +QMenu::indicator:non-exclusive:indeterminate:disabled { + image: url(":/standard_light/rc/checkbox_indeterminate_disabled.png"); +} + +QMenu::indicator:non-exclusive:indeterminate:focus, QMenu::indicator:non-exclusive:indeterminate:hover, QMenu::indicator:non-exclusive:indeterminate:pressed { + image: url(":/standard_light/rc/checkbox_indeterminate_focus.png"); +} + +QMenu::indicator:exclusive:unchecked { + image: url(":/standard_light/rc/radio_unchecked.png"); +} + +QMenu::indicator:exclusive:unchecked:hover, QMenu::indicator:exclusive:unchecked:focus, QMenu::indicator:exclusive:unchecked:pressed { + border: none; + outline: none; + image: url(":/standard_light/rc/radio_unchecked_focus.png"); +} + +QMenu::indicator:exclusive:unchecked:disabled { + image: url(":/standard_light/rc/radio_unchecked_disabled.png"); +} + +QMenu::indicator:exclusive:checked { + border: none; + outline: none; + image: url(":/standard_light/rc/radio_checked.png"); +} + +QMenu::indicator:exclusive:checked:hover, QMenu::indicator:exclusive:checked:focus, QMenu::indicator:exclusive:checked:pressed { + border: none; + outline: none; + image: url(":/standard_light/rc/radio_checked_focus.png"); +} + +QMenu::indicator:exclusive:checked:disabled { + outline: none; + image: url(":/standard_light/rc/radio_checked_disabled.png"); +} + +QMenu::right-arrow { + margin: 5px; + padding-left: 12px; + image: url(":/standard_light/rc/arrow_right.png"); + height: 12px; + width: 12px; +} + +/* QAbstractItemView ------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox + +--------------------------------------------------------------------------- */ +QAbstractItemView { + alternate-background-color: #FAFAFA; + color: #19232D; + border: 1px solid #C9CDD0; + border-radius: 4px; +} + +QAbstractItemView QLineEdit { + padding: 2px; +} + +/* QAbstractScrollArea ---------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea + +--------------------------------------------------------------------------- */ +QAbstractScrollArea { + background-color: #FAFAFA; + border: 1px solid #C9CDD0; + border-radius: 4px; + /* fix #159 */ + padding: 2px; + /* remove min-height to fix #244 */ + color: #19232D; +} + +QAbstractScrollArea:disabled { + color: #788D9C; +} + +/* QScrollArea ------------------------------------------------------------ + +--------------------------------------------------------------------------- */ +QScrollArea QWidget QWidget:disabled { + background-color: #FAFAFA; +} + +/* QScrollBar ------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qscrollbar + +--------------------------------------------------------------------------- */ +QScrollBar:horizontal { + height: 16px; + margin: 2px 16px 2px 16px; + border: 1px solid #C9CDD0; + border-radius: 4px; + background-color: #FAFAFA; +} + +QScrollBar:vertical { + background-color: #FAFAFA; + width: 16px; + margin: 16px 2px 16px 2px; + border: 1px solid #C9CDD0; + border-radius: 4px; +} + +QScrollBar::handle:horizontal { + background-color: #ACB1B6; + border: 1px solid #C9CDD0; + border-radius: 4px; + min-width: 8px; +} + +QScrollBar::handle:horizontal:hover { + background-color: #9FCBFF; + border: #9FCBFF; + border-radius: 4px; + min-width: 8px; +} + +QScrollBar::handle:horizontal:focus { + border: 1px solid #73C7FF; +} + +QScrollBar::handle:vertical { + background-color: #ACB1B6; + border: 1px solid #C9CDD0; + min-height: 8px; + border-radius: 4px; +} + +QScrollBar::handle:vertical:hover { + background-color: #9FCBFF; + border: #9FCBFF; + border-radius: 4px; + min-height: 8px; +} + +QScrollBar::handle:vertical:focus { + border: 1px solid #73C7FF; +} + +QScrollBar::add-line:horizontal { + margin: 0px 0px 0px 0px; + border-image: url(":/standard_light/rc/arrow_right_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover, QScrollBar::add-line:horizontal:on { + border-image: url(":/standard_light/rc/arrow_right.png"); + height: 12px; + width: 12px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url(":/standard_light/rc/arrow_down_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on { + border-image: url(":/standard_light/rc/arrow_down.png"); + height: 12px; + width: 12px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + margin: 0px 3px 0px 3px; + border-image: url(":/standard_light/rc/arrow_left_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on { + border-image: url(":/standard_light/rc/arrow_left.png"); + height: 12px; + width: 12px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url(":/standard_light/rc/arrow_up_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover, QScrollBar::sub-line:vertical:on { + border-image: url(":/standard_light/rc/arrow_up.png"); + height: 12px; + width: 12px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal { + background: none; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { + background: none; +} + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + background: none; +} + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { + background: none; +} + +/* QTextEdit -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-specific-widgets + +--------------------------------------------------------------------------- */ +QTextEdit { + background-color: #FAFAFA; + color: #19232D; + border-radius: 4px; + border: 1px solid #C9CDD0; +} + +QTextEdit:focus { + border: 1px solid #73C7FF; +} + +QTextEdit:selected { + background: #9FCBFF; + color: #C9CDD0; +} + +/* QPlainTextEdit --------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QPlainTextEdit { + background-color: #FAFAFA; + color: #19232D; + border-radius: 4px; + border: 1px solid #C9CDD0; +} + +QPlainTextEdit:focus { + border: 1px solid #73C7FF; +} + +QPlainTextEdit:selected { + background: #9FCBFF; + color: #C9CDD0; +} + +/* QSizeGrip -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsizegrip + +--------------------------------------------------------------------------- */ +QSizeGrip { + background: transparent; + width: 12px; + height: 12px; + image: url(":/standard_light/rc/window_grip.png"); +} + +/* QStackedWidget --------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QStackedWidget { + padding: 2px; + border: 1px solid #C9CDD0; + border: 1px solid #FAFAFA; +} + +/* QToolBar --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbar + +--------------------------------------------------------------------------- */ +QToolBar { + background-color: #C9CDD0; + border-bottom: 1px solid #FAFAFA; + padding: 1px; + font-weight: bold; + spacing: 2px; +} + +QToolBar:disabled { + /* Fixes #272 */ + background-color: #C9CDD0; +} + +QToolBar::handle:horizontal { + width: 16px; + image: url(":/standard_light/rc/toolbar_move_horizontal.png"); +} + +QToolBar::handle:vertical { + height: 16px; + image: url(":/standard_light/rc/toolbar_move_vertical.png"); +} + +QToolBar::separator:horizontal { + width: 16px; + image: url(":/standard_light/rc/toolbar_separator_horizontal.png"); +} + +QToolBar::separator:vertical { + height: 16px; + image: url(":/standard_light/rc/toolbar_separator_vertical.png"); +} + +QToolButton#qt_toolbar_ext_button { + background: #C9CDD0; + border: 0px; + color: #19232D; + image: url(":/standard_light/rc/arrow_right.png"); +} + +/* QAbstractSpinBox ------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QAbstractSpinBox { + background-color: #FAFAFA; + border: 1px solid #C9CDD0; + color: #19232D; + /* This fixes 103, 111 */ + padding-top: 2px; + /* This fixes 103, 111 */ + padding-bottom: 2px; + padding-left: 4px; + padding-right: 4px; + border-radius: 4px; + /* min-width: 5px; removed to fix 109 */ +} + +QAbstractSpinBox:up-button { + background-color: transparent #FAFAFA; + subcontrol-origin: border; + subcontrol-position: top right; + border-left: 1px solid #C9CDD0; + border-bottom: 1px solid #C9CDD0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin: 1px; + width: 12px; + margin-bottom: -1px; +} + +QAbstractSpinBox::up-arrow, QAbstractSpinBox::up-arrow:disabled, QAbstractSpinBox::up-arrow:off { + image: url(":/standard_light/rc/arrow_up_disabled.png"); + height: 8px; + width: 8px; +} + +QAbstractSpinBox::up-arrow:hover { + image: url(":/standard_light/rc/arrow_up.png"); +} + +QAbstractSpinBox:down-button { + background-color: transparent #FAFAFA; + subcontrol-origin: border; + subcontrol-position: bottom right; + border-left: 1px solid #C9CDD0; + border-top: 1px solid #C9CDD0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin: 1px; + width: 12px; + margin-top: -1px; +} + +QAbstractSpinBox::down-arrow, QAbstractSpinBox::down-arrow:disabled, QAbstractSpinBox::down-arrow:off { + image: url(":/standard_light/rc/arrow_down_disabled.png"); + height: 8px; + width: 8px; +} + +QAbstractSpinBox::down-arrow:hover { + image: url(":/standard_light/rc/arrow_down.png"); +} + +QAbstractSpinBox:hover { + border: 1px solid #9FCBFF; + color: #19232D; +} + +QAbstractSpinBox:focus { + border: 1px solid #73C7FF; +} + +QAbstractSpinBox:selected { + background: #9FCBFF; + color: #C9CDD0; +} + +/* ------------------------------------------------------------------------ */ +/* DISPLAYS --------------------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QLabel ----------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe + +--------------------------------------------------------------------------- */ +QLabel { + background-color: #FAFAFA; + border: 0px solid #C9CDD0; + padding: 2px; + margin: 0px; + color: #19232D; +} + +QLabel:disabled { + background-color: #FAFAFA; + border: 0px solid #C9CDD0; + color: #788D9C; +} + +/* QTextBrowser ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea + +--------------------------------------------------------------------------- */ +QTextBrowser { + background-color: #FAFAFA; + border: 1px solid #C9CDD0; + color: #19232D; + border-radius: 4px; +} + +QTextBrowser:disabled { + background-color: #FAFAFA; + border: 1px solid #C9CDD0; + color: #788D9C; + border-radius: 4px; +} + +QTextBrowser:hover, QTextBrowser:!hover, QTextBrowser:selected, QTextBrowser:pressed { + border: 1px solid #C9CDD0; +} + +/* QGraphicsView ---------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QGraphicsView { + background-color: #FAFAFA; + border: 1px solid #C9CDD0; + color: #19232D; + border-radius: 4px; +} + +QGraphicsView:disabled { + background-color: #FAFAFA; + border: 1px solid #C9CDD0; + color: #788D9C; + border-radius: 4px; +} + +QGraphicsView:hover, QGraphicsView:!hover, QGraphicsView:selected, QGraphicsView:pressed { + border: 1px solid #C9CDD0; +} + +/* QCalendarWidget -------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QCalendarWidget { + border: 1px solid #C9CDD0; + border-radius: 4px; +} + +QCalendarWidget:disabled { + background-color: #FAFAFA; + color: #788D9C; +} + +/* QLCDNumber ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QLCDNumber { + background-color: #FAFAFA; + color: #19232D; +} + +QLCDNumber:disabled { + background-color: #FAFAFA; + color: #788D9C; +} + +/* QProgressBar ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qprogressbar + +--------------------------------------------------------------------------- */ +QProgressBar { + background-color: #FAFAFA; + border: 1px solid #C9CDD0; + color: #19232D; + border-radius: 4px; + text-align: center; +} + +QProgressBar:disabled { + background-color: #FAFAFA; + border: 1px solid #C9CDD0; + color: #788D9C; + border-radius: 4px; + text-align: center; +} + +QProgressBar::chunk { + background-color: #9FCBFF; + color: #FAFAFA; + border-radius: 4px; +} + +QProgressBar::chunk:disabled { + background-color: #DAEDFF; + color: #788D9C; + border-radius: 4px; +} + +/* ------------------------------------------------------------------------ */ +/* BUTTONS ---------------------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QPushButton ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qpushbutton + +--------------------------------------------------------------------------- */ +QPushButton { + background-color: #C9CDD0; + color: #19232D; + border-radius: 4px; + padding: 2px; + outline: none; + border: none; +} + +QPushButton:disabled { + background-color: #C9CDD0; + color: #788D9C; + border-radius: 4px; + padding: 2px; +} + +QPushButton:checked { + background-color: #ACB1B6; + border-radius: 4px; + padding: 2px; + outline: none; +} + +QPushButton:checked:disabled { + background-color: #ACB1B6; + color: #788D9C; + border-radius: 4px; + padding: 2px; + outline: none; +} + +QPushButton:checked:selected { + background: #ACB1B6; +} + +QPushButton:hover { + background-color: #B9BDC1; + color: #19232D; +} + +QPushButton:pressed { + background-color: #ACB1B6; +} + +QPushButton:selected { + background: #ACB1B6; + color: #19232D; +} + +QPushButton::menu-indicator { + subcontrol-origin: padding; + subcontrol-position: bottom right; + bottom: 4px; +} + +QDialogButtonBox QPushButton { + /* Issue #194 #248 - Special case of QPushButton inside dialogs, for better UI */ + min-width: 80px; +} + +/* QToolButton ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbutton + +--------------------------------------------------------------------------- */ +QToolButton { + background-color: #C9CDD0; + color: #19232D; + border-radius: 4px; + padding: 2px; + outline: none; + border: none; + /* The subcontrols below are used only in the DelayedPopup mode */ + /* The subcontrols below are used only in the MenuButtonPopup mode */ + /* The subcontrol below is used only in the InstantPopup or DelayedPopup mode */ +} + +QToolButton:disabled { + background-color: #C9CDD0; + color: #788D9C; + border-radius: 4px; + padding: 2px; +} + +QToolButton:checked { + background-color: #ACB1B6; + border-radius: 4px; + padding: 2px; + outline: none; +} + +QToolButton:checked:disabled { + background-color: #ACB1B6; + color: #788D9C; + border-radius: 4px; + padding: 2px; + outline: none; +} + +QToolButton:checked:hover { + background-color: #B9BDC1; + color: #19232D; +} + +QToolButton:checked:pressed { + background-color: #ACB1B6; +} + +QToolButton:checked:selected { + background: #ACB1B6; + color: #19232D; +} + +QToolButton:hover { + background-color: #B9BDC1; + color: #19232D; +} + +QToolButton:pressed { + background-color: #ACB1B6; +} + +QToolButton:selected { + background: #ACB1B6; + color: #19232D; +} + +QToolButton[popupMode="0"] { + /* Only for DelayedPopup */ + padding-right: 2px; +} + +QToolButton[popupMode="1"] { + /* Only for MenuButtonPopup */ + padding-right: 20px; +} + +QToolButton[popupMode="1"]::menu-button { + border: none; +} + +QToolButton[popupMode="1"]::menu-button:hover { + border: none; + border-left: 1px solid #C9CDD0; + border-radius: 0; +} + +QToolButton[popupMode="2"] { + /* Only for InstantPopup */ + padding-right: 2px; +} + +QToolButton::menu-button { + padding: 2px; + border-radius: 4px; + width: 12px; + border: none; + outline: none; +} + +QToolButton::menu-button:hover { + border: 1px solid #9FCBFF; +} + +QToolButton::menu-button:checked:hover { + border: 1px solid #9FCBFF; +} + +QToolButton::menu-indicator { + image: url(":/standard_light/rc/arrow_down.png"); + height: 8px; + width: 8px; + top: 0; + /* Exclude a shift for better image */ + left: -2px; + /* Shift it a bit */ +} + +QToolButton::menu-arrow { + image: url(":/standard_light/rc/arrow_down.png"); + height: 8px; + width: 8px; +} + +QToolButton::menu-arrow:hover { + image: url(":/standard_light/rc/arrow_down_focus.png"); +} + +/* QCommandLinkButton ----------------------------------------------------- + +--------------------------------------------------------------------------- */ +QCommandLinkButton { + background-color: transparent; + border: 1px solid #C9CDD0; + color: #19232D; + border-radius: 4px; + padding: 0px; + margin: 0px; +} + +QCommandLinkButton:disabled { + background-color: transparent; + color: #788D9C; +} + +/* ------------------------------------------------------------------------ */ +/* INPUTS - NO FIELDS ----------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QComboBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox + +--------------------------------------------------------------------------- */ +QComboBox { + border: 1px solid #C9CDD0; + border-radius: 4px; + selection-background-color: #9FCBFF; + padding-left: 4px; + padding-right: 4px; + /* padding-right = 36; 4 + 16*2 See scrollbar size */ + /* changed to 4px to fix #239 */ + /* Fixes #103, #111 */ + min-height: 1.5em; + /* padding-top: 2px; removed to fix #132 */ + /* padding-bottom: 2px; removed to fix #132 */ + /* min-width: 75px; removed to fix #109 */ + /* Needed to remove indicator - fix #132 */ +} + +QComboBox QAbstractItemView { + border: 1px solid #C9CDD0; + border-radius: 0; + background-color: #FAFAFA; + selection-background-color: #9FCBFF; +} + +QComboBox QAbstractItemView:hover { + background-color: #FAFAFA; + color: #19232D; +} + +QComboBox QAbstractItemView:selected { + background: #9FCBFF; + color: #C9CDD0; +} + +QComboBox QAbstractItemView:alternate { + background: #FAFAFA; +} + +QComboBox:disabled { + background-color: #FAFAFA; + color: #788D9C; +} + +QComboBox:hover { + border: 1px solid #9FCBFF; +} + +QComboBox:focus { + border: 1px solid #73C7FF; +} + +QComboBox:on { + selection-background-color: #9FCBFF; +} + +QComboBox::indicator { + border: none; + border-radius: 0; + background-color: transparent; + selection-background-color: transparent; + color: transparent; + selection-color: transparent; + /* Needed to remove indicator - fix #132 */ +} + +QComboBox::indicator:alternate { + background: #FAFAFA; +} + +QComboBox::item:alternate { + background: #FAFAFA; +} + +QComboBox::item:checked { + font-weight: bold; +} + +QComboBox::item:selected { + border: 0px solid transparent; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 12px; + border-left: 1px solid #C9CDD0; +} + +QComboBox::down-arrow { + image: url(":/standard_light/rc/arrow_down_disabled.png"); + height: 8px; + width: 8px; +} + +QComboBox::down-arrow:on, QComboBox::down-arrow:hover, QComboBox::down-arrow:focus { + image: url(":/standard_light/rc/arrow_down.png"); +} + +/* QSlider ---------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qslider + +--------------------------------------------------------------------------- */ +QSlider:disabled { + background: #FAFAFA; +} + +QSlider:focus { + border: none; +} + +QSlider::groove:horizontal { + background: #C9CDD0; + border: 1px solid #C9CDD0; + height: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::groove:vertical { + background: #C9CDD0; + border: 1px solid #C9CDD0; + width: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::add-page:vertical { + background: #9FCBFF; + border: 1px solid #C9CDD0; + width: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::add-page:vertical :disabled { + background: #DAEDFF; +} + +QSlider::sub-page:horizontal { + background: #9FCBFF; + border: 1px solid #C9CDD0; + height: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::sub-page:horizontal:disabled { + background: #DAEDFF; +} + +QSlider::handle:horizontal { + background: #788D9C; + border: 1px solid #C9CDD0; + width: 8px; + height: 8px; + margin: -8px 0px; + border-radius: 4px; +} + +QSlider::handle:horizontal:hover { + background: #9FCBFF; + border: 1px solid #9FCBFF; +} + +QSlider::handle:horizontal:focus { + border: 1px solid #73C7FF; +} + +QSlider::handle:vertical { + background: #788D9C; + border: 1px solid #C9CDD0; + width: 8px; + height: 8px; + margin: 0 -8px; + border-radius: 4px; +} + +QSlider::handle:vertical:hover { + background: #9FCBFF; + border: 1px solid #9FCBFF; +} + +QSlider::handle:vertical:focus { + border: 1px solid #73C7FF; +} + +/* QLineEdit -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlineedit + +--------------------------------------------------------------------------- */ +QLineEdit { + background-color: #FAFAFA; + padding-top: 2px; + /* This QLineEdit fix 103, 111 */ + padding-bottom: 2px; + /* This QLineEdit fix 103, 111 */ + padding-left: 4px; + padding-right: 4px; + border-style: solid; + border: 1px solid #C9CDD0; + border-radius: 4px; + color: #19232D; +} + +QLineEdit:disabled { + background-color: #FAFAFA; + color: #788D9C; +} + +QLineEdit:hover { + border: 1px solid #9FCBFF; + color: #19232D; +} + +QLineEdit:focus { + border: 1px solid #73C7FF; +} + +QLineEdit:selected { + background-color: #9FCBFF; + color: #C9CDD0; +} + +/* QTabWiget -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar + +--------------------------------------------------------------------------- */ +QTabWidget { + padding: 2px; + selection-background-color: #C9CDD0; +} + +QTabWidget QWidget { + /* Fixes #189 */ + border-radius: 4px; +} + +QTabWidget::pane { + border: 1px solid #C9CDD0; + border-radius: 4px; + margin: 0px; + /* Fixes double border inside pane with pyqt5 */ + padding: 0px; +} + +QTabWidget::pane:selected { + background-color: #C9CDD0; + border: 1px solid #9FCBFF; +} + +/* QTabBar ---------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar + +--------------------------------------------------------------------------- */ +QTabBar, QDockWidget QTabBar { + qproperty-drawBase: 0; + border-radius: 4px; + margin: 0px; + padding: 2px; + border: 0; + /* left: 5px; move to the right by 5px - removed for fix */ +} + +QTabBar::close-button, QDockWidget QTabBar::close-button { + border: 0; + margin: 0; + padding: 4px; + image: url(":/standard_light/rc/window_close.png"); +} + +QTabBar::close-button:hover, QDockWidget QTabBar::close-button:hover { + image: url(":/standard_light/rc/window_close_focus.png"); +} + +QTabBar::close-button:pressed, QDockWidget QTabBar::close-button:pressed { + image: url(":/standard_light/rc/window_close_pressed.png"); +} + +QTabBar::tab, QDockWidget QTabBar::tab { + /* !selected and disabled ----------------------------------------- */ + /* selected ------------------------------------------------------- */ +} + +QTabBar::tab:top:selected:disabled, QDockWidget QTabBar::tab:top:selected:disabled { + border-bottom: 3px solid #DAEDFF; + color: #788D9C; + background-color: #C9CDD0; +} + +QTabBar::tab:bottom:selected:disabled, QDockWidget QTabBar::tab:bottom:selected:disabled { + border-top: 3px solid #DAEDFF; + color: #788D9C; + background-color: #C9CDD0; +} + +QTabBar::tab:left:selected:disabled, QDockWidget QTabBar::tab:left:selected:disabled { + border-right: 3px solid #DAEDFF; + color: #788D9C; + background-color: #C9CDD0; +} + +QTabBar::tab:right:selected:disabled, QDockWidget QTabBar::tab:right:selected:disabled { + border-left: 3px solid #DAEDFF; + color: #788D9C; + background-color: #C9CDD0; +} + +QTabBar::tab:top:!selected:disabled, QDockWidget QTabBar::tab:top:!selected:disabled { + border-bottom: 3px solid #FAFAFA; + color: #788D9C; + background-color: #FAFAFA; +} + +QTabBar::tab:bottom:!selected:disabled, QDockWidget QTabBar::tab:bottom:!selected:disabled { + border-top: 3px solid #FAFAFA; + color: #788D9C; + background-color: #FAFAFA; +} + +QTabBar::tab:left:!selected:disabled, QDockWidget QTabBar::tab:left:!selected:disabled { + border-right: 3px solid #FAFAFA; + color: #788D9C; + background-color: #FAFAFA; +} + +QTabBar::tab:right:!selected:disabled, QDockWidget QTabBar::tab:right:!selected:disabled { + border-left: 3px solid #FAFAFA; + color: #788D9C; + background-color: #FAFAFA; +} + +QTabBar::tab:top:!selected, QDockWidget QTabBar::tab:top:!selected { + border-bottom: 2px solid #FAFAFA; + margin-top: 2px; +} + +QTabBar::tab:bottom:!selected, QDockWidget QTabBar::tab:bottom:!selected { + border-top: 2px solid #FAFAFA; + margin-bottom: 2px; +} + +QTabBar::tab:left:!selected, QDockWidget QTabBar::tab:left:!selected { + border-left: 2px solid #FAFAFA; + margin-right: 2px; +} + +QTabBar::tab:right:!selected, QDockWidget QTabBar::tab:right:!selected { + border-right: 2px solid #FAFAFA; + margin-left: 2px; +} + +QTabBar::tab:top, QDockWidget QTabBar::tab:top { + background-color: #C9CDD0; + margin-left: 2px; + padding-left: 4px; + padding-right: 4px; + padding-top: 2px; + padding-bottom: 2px; + min-width: 5px; + border-bottom: 3px solid #C9CDD0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +QTabBar::tab:top:selected, QDockWidget QTabBar::tab:top:selected { + background-color: #B9BDC1; + border-bottom: 3px solid #37AEFE; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +QTabBar::tab:top:!selected:hover, QDockWidget QTabBar::tab:top:!selected:hover { + border: 1px solid #73C7FF; + border-bottom: 3px solid #73C7FF; + /* Fixes spyder-ide/spyder#9766 and #243 */ + padding-left: 3px; + padding-right: 3px; +} + +QTabBar::tab:bottom, QDockWidget QTabBar::tab:bottom { + border-top: 3px solid #C9CDD0; + background-color: #C9CDD0; + margin-left: 2px; + padding-left: 4px; + padding-right: 4px; + padding-top: 2px; + padding-bottom: 2px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + min-width: 5px; +} + +QTabBar::tab:bottom:selected, QDockWidget QTabBar::tab:bottom:selected { + background-color: #B9BDC1; + border-top: 3px solid #37AEFE; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +QTabBar::tab:bottom:!selected:hover, QDockWidget QTabBar::tab:bottom:!selected:hover { + border: 1px solid #73C7FF; + border-top: 3px solid #73C7FF; + /* Fixes spyder-ide/spyder#9766 and #243 */ + padding-left: 3px; + padding-right: 3px; +} + +QTabBar::tab:left, QDockWidget QTabBar::tab:left { + background-color: #C9CDD0; + margin-top: 2px; + padding-left: 2px; + padding-right: 2px; + padding-top: 4px; + padding-bottom: 4px; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + min-height: 5px; +} + +QTabBar::tab:left:selected, QDockWidget QTabBar::tab:left:selected { + background-color: #B9BDC1; + border-right: 3px solid #37AEFE; +} + +QTabBar::tab:left:!selected:hover, QDockWidget QTabBar::tab:left:!selected:hover { + border: 1px solid #73C7FF; + border-right: 3px solid #73C7FF; + /* Fixes different behavior #271 */ + margin-right: 0px; + padding-right: -1px; +} + +QTabBar::tab:right, QDockWidget QTabBar::tab:right { + background-color: #C9CDD0; + margin-top: 2px; + padding-left: 2px; + padding-right: 2px; + padding-top: 4px; + padding-bottom: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + min-height: 5px; +} + +QTabBar::tab:right:selected, QDockWidget QTabBar::tab:right:selected { + background-color: #B9BDC1; + border-left: 3px solid #37AEFE; +} + +QTabBar::tab:right:!selected:hover, QDockWidget QTabBar::tab:right:!selected:hover { + border: 1px solid #73C7FF; + border-left: 3px solid #73C7FF; + /* Fixes different behavior #271 */ + margin-left: 0px; + padding-left: 0px; +} + +QTabBar QToolButton, QDockWidget QTabBar QToolButton { + /* Fixes #136 */ + background-color: #C9CDD0; + height: 12px; + width: 12px; +} + +QTabBar QToolButton:pressed, QDockWidget QTabBar QToolButton:pressed { + background-color: #C9CDD0; +} + +QTabBar QToolButton:pressed:hover, QDockWidget QTabBar QToolButton:pressed:hover { + border: 1px solid #9FCBFF; +} + +QTabBar QToolButton::left-arrow:enabled, QDockWidget QTabBar QToolButton::left-arrow:enabled { + image: url(":/standard_light/rc/arrow_left.png"); +} + +QTabBar QToolButton::left-arrow:disabled, QDockWidget QTabBar QToolButton::left-arrow:disabled { + image: url(":/standard_light/rc/arrow_left_disabled.png"); +} + +QTabBar QToolButton::right-arrow:enabled, QDockWidget QTabBar QToolButton::right-arrow:enabled { + image: url(":/standard_light/rc/arrow_right.png"); +} + +QTabBar QToolButton::right-arrow:disabled, QDockWidget QTabBar QToolButton::right-arrow:disabled { + image: url(":/standard_light/rc/arrow_right_disabled.png"); +} + +/* QDockWiget ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QDockWidget { + outline: 1px solid #C9CDD0; + background-color: #FAFAFA; + border: 1px solid #C9CDD0; + border-radius: 4px; + titlebar-close-icon: url(":/standard_light/rc/transparent.png"); + titlebar-normal-icon: url(":/standard_light/rc/transparent.png"); +} + +QDockWidget::title { + /* Better size for title bar */ + padding: 3px; + spacing: 4px; + border: none; + background-color: #C9CDD0; +} + +QDockWidget::close-button { + icon-size: 12px; + border: none; + background: transparent; + background-image: transparent; + border: 0; + margin: 0; + padding: 0; + image: url(":/standard_light/rc/window_close.png"); +} + +QDockWidget::close-button:hover { + image: url(":/standard_light/rc/window_close_focus.png"); +} + +QDockWidget::close-button:pressed { + image: url(":/standard_light/rc/window_close_pressed.png"); +} + +QDockWidget::float-button { + icon-size: 12px; + border: none; + background: transparent; + background-image: transparent; + border: 0; + margin: 0; + padding: 0; + image: url(":/standard_light/rc/window_undock.png"); +} + +QDockWidget::float-button:hover { + image: url(":/standard_light/rc/window_undock_focus.png"); +} + +QDockWidget::float-button:pressed { + image: url(":/standard_light/rc/window_undock_pressed.png"); +} + +/* QTreeView QListView QTableView ----------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtreeview +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlistview +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtableview + +--------------------------------------------------------------------------- */ +QTreeView:branch:selected, QTreeView:branch:hover { + background: url(":/standard_light/rc/transparent.png"); +} + +QTreeView:branch:has-siblings:!adjoins-item { + border-image: url(":/standard_light/rc/branch_line.png") 0; +} + +QTreeView:branch:has-siblings:adjoins-item { + border-image: url(":/standard_light/rc/branch_more.png") 0; +} + +QTreeView:branch:!has-children:!has-siblings:adjoins-item { + border-image: url(":/standard_light/rc/branch_end.png") 0; +} + +QTreeView:branch:has-children:!has-siblings:closed, QTreeView:branch:closed:has-children:has-siblings { + border-image: none; + image: url(":/standard_light/rc/branch_closed.png"); +} + +QTreeView:branch:open:has-children:!has-siblings, QTreeView:branch:open:has-children:has-siblings { + border-image: none; + image: url(":/standard_light/rc/branch_open.png"); +} + +QTreeView:branch:has-children:!has-siblings:closed:hover, QTreeView:branch:closed:has-children:has-siblings:hover { + image: url(":/standard_light/rc/branch_closed_focus.png"); +} + +QTreeView:branch:open:has-children:!has-siblings:hover, QTreeView:branch:open:has-children:has-siblings:hover { + image: url(":/standard_light/rc/branch_open_focus.png"); +} + +QTreeView::indicator:checked, +QListView::indicator:checked, +QTableView::indicator:checked, +QColumnView::indicator:checked { + image: url(":/standard_light/rc/checkbox_checked.png"); +} + +QTreeView::indicator:checked:hover, QTreeView::indicator:checked:focus, QTreeView::indicator:checked:pressed, +QListView::indicator:checked:hover, +QListView::indicator:checked:focus, +QListView::indicator:checked:pressed, +QTableView::indicator:checked:hover, +QTableView::indicator:checked:focus, +QTableView::indicator:checked:pressed, +QColumnView::indicator:checked:hover, +QColumnView::indicator:checked:focus, +QColumnView::indicator:checked:pressed { + image: url(":/standard_light/rc/checkbox_checked_focus.png"); +} + +QTreeView::indicator:unchecked, +QListView::indicator:unchecked, +QTableView::indicator:unchecked, +QColumnView::indicator:unchecked { + image: url(":/standard_light/rc/checkbox_unchecked.png"); +} + +QTreeView::indicator:unchecked:hover, QTreeView::indicator:unchecked:focus, QTreeView::indicator:unchecked:pressed, +QListView::indicator:unchecked:hover, +QListView::indicator:unchecked:focus, +QListView::indicator:unchecked:pressed, +QTableView::indicator:unchecked:hover, +QTableView::indicator:unchecked:focus, +QTableView::indicator:unchecked:pressed, +QColumnView::indicator:unchecked:hover, +QColumnView::indicator:unchecked:focus, +QColumnView::indicator:unchecked:pressed { + image: url(":/standard_light/rc/checkbox_unchecked_focus.png"); +} + +QTreeView::indicator:indeterminate, +QListView::indicator:indeterminate, +QTableView::indicator:indeterminate, +QColumnView::indicator:indeterminate { + image: url(":/standard_light/rc/checkbox_indeterminate.png"); +} + +QTreeView::indicator:indeterminate:hover, QTreeView::indicator:indeterminate:focus, QTreeView::indicator:indeterminate:pressed, +QListView::indicator:indeterminate:hover, +QListView::indicator:indeterminate:focus, +QListView::indicator:indeterminate:pressed, +QTableView::indicator:indeterminate:hover, +QTableView::indicator:indeterminate:focus, +QTableView::indicator:indeterminate:pressed, +QColumnView::indicator:indeterminate:hover, +QColumnView::indicator:indeterminate:focus, +QColumnView::indicator:indeterminate:pressed { + image: url(":/standard_light/rc/checkbox_indeterminate_focus.png"); +} + +QTreeView, +QListView, +QTableView, +QColumnView { + background-color: #FAFAFA; + border: 1px solid #C9CDD0; + color: #19232D; + gridline-color: #C9CDD0; + border-radius: 4px; +} + +QTreeView:disabled, +QListView:disabled, +QTableView:disabled, +QColumnView:disabled { + background-color: #FAFAFA; + color: #788D9C; +} + +QTreeView:selected, +QListView:selected, +QTableView:selected, +QColumnView:selected { + background-color: #9FCBFF; + color: #C9CDD0; +} + +QTreeView:focus, +QListView:focus, +QTableView:focus, +QColumnView:focus { + border: 1px solid #73C7FF; +} + +QTreeView::item:pressed, +QListView::item:pressed, +QTableView::item:pressed, +QColumnView::item:pressed { + background-color: #9FCBFF; +} + +QTreeView::item:selected:active, +QListView::item:selected:active, +QTableView::item:selected:active, +QColumnView::item:selected:active { + background-color: #9FCBFF; +} + +QTreeView::item:selected:!active, +QListView::item:selected:!active, +QTableView::item:selected:!active, +QColumnView::item:selected:!active { + color: #19232D; + background-color: #CED1D4; +} + +QTreeView::item:!selected:hover, +QListView::item:!selected:hover, +QTableView::item:!selected:hover, +QColumnView::item:!selected:hover { + outline: 0; + color: #19232D; + background-color: #CED1D4; +} + +QTableCornerButton::section { + background-color: #FAFAFA; + border: 1px transparent #C9CDD0; + border-radius: 0px; +} + +/* QHeaderView ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qheaderview + +--------------------------------------------------------------------------- */ +QHeaderView { + background-color: #C9CDD0; + border: 0px transparent #C9CDD0; + padding: 0; + margin: 0; + border-radius: 0; +} + +QHeaderView:disabled { + background-color: #C9CDD0; + border: 1px transparent #C9CDD0; +} + +QHeaderView::section { + background-color: #C9CDD0; + color: #19232D; + border-radius: 0; + text-align: left; + font-size: 13px; +} + +QHeaderView::section::horizontal { + padding-top: 0; + padding-bottom: 0; + padding-left: 4px; + padding-right: 4px; + border-left: 1px solid #FAFAFA; +} + +QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one { + border-left: 1px solid #C9CDD0; +} + +QHeaderView::section::horizontal:disabled { + color: #788D9C; +} + +QHeaderView::section::vertical { + padding-top: 0; + padding-bottom: 0; + padding-left: 4px; + padding-right: 4px; + border-top: 1px solid #FAFAFA; +} + +QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one { + border-top: 1px solid #C9CDD0; +} + +QHeaderView::section::vertical:disabled { + color: #788D9C; +} + +QHeaderView::down-arrow { + /* Those settings (border/width/height/background-color) solve bug */ + /* transparent arrow background and size */ + background-color: #C9CDD0; + border: none; + height: 12px; + width: 12px; + padding-left: 2px; + padding-right: 2px; + image: url(":/standard_light/rc/arrow_down.png"); +} + +QHeaderView::up-arrow { + background-color: #C9CDD0; + border: none; + height: 12px; + width: 12px; + padding-left: 2px; + padding-right: 2px; + image: url(":/standard_light/rc/arrow_up.png"); +} + +/* QToolBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbox + +--------------------------------------------------------------------------- */ +QToolBox { + padding: 0px; + border: 0px; + border: 1px solid #C9CDD0; +} + +QToolBox:selected { + padding: 0px; + border: 2px solid #9FCBFF; +} + +QToolBox::tab { + background-color: #FAFAFA; + border: 1px solid #C9CDD0; + color: #19232D; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +QToolBox::tab:disabled { + color: #788D9C; +} + +QToolBox::tab:selected { + background-color: #ACB1B6; + border-bottom: 2px solid #9FCBFF; +} + +QToolBox::tab:selected:disabled { + background-color: #C9CDD0; + border-bottom: 2px solid #DAEDFF; +} + +QToolBox::tab:!selected { + background-color: #C9CDD0; + border-bottom: 2px solid #C9CDD0; +} + +QToolBox::tab:!selected:disabled { + background-color: #FAFAFA; +} + +QToolBox::tab:hover { + border-color: #73C7FF; + border-bottom: 2px solid #73C7FF; +} + +QToolBox QScrollArea QWidget QWidget { + padding: 0px; + border: 0px; + background-color: #FAFAFA; +} + +/* QFrame ----------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe +https://doc.qt.io/qt-5/qframe.html#-prop +https://doc.qt.io/qt-5/qframe.html#details +https://stackoverflow.com/questions/14581498/qt-stylesheet-for-hline-vline-color + +--------------------------------------------------------------------------- */ +/* (dot) .QFrame fix #141, #126, #123 */ +.QFrame { + border-radius: 4px; + border: 1px solid #C9CDD0; + /* No frame */ + /* HLine */ + /* HLine */ +} + +.QFrame[frameShape="0"] { + border-radius: 4px; + border: 1px transparent #C9CDD0; +} + +.QFrame[frameShape="4"] { + max-height: 2px; + border: none; + background-color: #C9CDD0; +} + +.QFrame[frameShape="5"] { + max-width: 2px; + border: none; + background-color: #C9CDD0; +} + +/* QSplitter -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsplitter + +--------------------------------------------------------------------------- */ +QSplitter { + background-color: #C9CDD0; + spacing: 0px; + padding: 0px; + margin: 0px; +} + +QSplitter::handle { + background-color: #C9CDD0; + border: 0px solid #FAFAFA; + spacing: 0px; + padding: 1px; + margin: 0px; +} + +QSplitter::handle:hover { + background-color: #788D9C; +} + +QSplitter::handle:horizontal { + width: 5px; + image: url(":/standard_light/rc/line_vertical.png"); +} + +QSplitter::handle:vertical { + height: 5px; + image: url(":/standard_light/rc/line_horizontal.png"); +} + +/* QDateEdit, QDateTimeEdit ----------------------------------------------- + +--------------------------------------------------------------------------- */ +QDateEdit, QDateTimeEdit { + selection-background-color: #9FCBFF; + border-style: solid; + border: 1px solid #C9CDD0; + border-radius: 4px; + /* This fixes 103, 111 */ + padding-top: 2px; + /* This fixes 103, 111 */ + padding-bottom: 2px; + padding-left: 4px; + padding-right: 4px; + min-width: 10px; +} + +QDateEdit:on, QDateTimeEdit:on { + selection-background-color: #9FCBFF; +} + +QDateEdit::drop-down, QDateTimeEdit::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 12px; + border-left: 1px solid #C9CDD0; +} + +QDateEdit::down-arrow, QDateTimeEdit::down-arrow { + image: url(":/standard_light/rc/arrow_down_disabled.png"); + height: 8px; + width: 8px; +} + +QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, QDateEdit::down-arrow:focus, QDateTimeEdit::down-arrow:on, QDateTimeEdit::down-arrow:hover, QDateTimeEdit::down-arrow:focus { + image: url(":/standard_light/rc/arrow_down.png"); +} + +QDateEdit QAbstractItemView, QDateTimeEdit QAbstractItemView { + background-color: #FAFAFA; + border-radius: 4px; + border: 1px solid #C9CDD0; + selection-background-color: #9FCBFF; +} + +/* QAbstractView ---------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QAbstractView:hover { + border: 1px solid #9FCBFF; + color: #19232D; +} + +QAbstractView:selected { + background: #9FCBFF; + color: #C9CDD0; +} + +/* PlotWidget ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +PlotWidget { + /* Fix cut labels in plots #134 */ + padding: 0px; +} + +/**********************************/ +/* RetroShare specific part */ +/**********************************/ + +/**** Fix QTreeView Items ****/ + +QTreeView::item, +QListView::item, +QTableView::item, +QColumnView::item { + color: #101010; + background: transparent; +} +QTreeView:branch:!selected:hover, +QTreeView:branch:selected:!active { + color: #19232D; + background-color: #CED1D4; +} + +/**** Fix QSplitter ****/ + +QSplitter { + background-color: white; +} + +QSplitter::handle { + background-color: #C9CDD0; + border: 0px solid #C9CDD0; + border-radius: 4px; +} + + +/**** Standard rules ****/ + +QFrame[objectName^="feedFrame"],/* Frame used in Feeds*/ +QFrame[objectName^="plainFrame"],/* Frame used in Widget with plain background*/ +QFrame[objectName^="plainBFrame"] {/* Frame used in Widget with plain bordered background*/ + background-color: white; +} +QFrame[objectName^="plainBFrame"] { + border: 1px solid #CCCCCC; +} + +/* Frame used in old Feeds*/ +QFrame#feedFrame[new=false] { + background-color: #white; +} +/* Frame used in new Feeds*/ +QFrame#feedFrame[new=true] { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #F0F8FD, stop:0.8 #E6F2FD, stop: 0.81 #E6F2FD, stop: 1 #D2E7FD); +} +QFrame#feedFrame QLabel { + background: transparent; +} + +QFrame[objectName^="gradFrame"],/* Frame used in Widget with gradient colored background*/ +QFrame#bottomFrame,/* Frame used at the bottom of dialog*/ +QFrame#toasterFrame,/* Frame used in Toasters*/ +QFrame#toolBarFrame {/* Frame used for buttons*/ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FEFEFE, stop:1 #E8E8E8); + border: 1px solid #CCCCCC; +} +QFrame#toolBarFrame > LineEditClear { + background-color: white; +} +QFrame[objectName^="gradFrame"] QComboBox, +QFrame[objectName^="gradFrame"] QLineEdit, +QFrame[objectName^="gradFrame"] QTextEdit { + background-color: white; +} +QFrame[objectName^="gradFrame"] QComboBox QAbstractItemView { + background-color: #CCCCCC; + selection-background-color: #1464A0; +} + +QLabel#avatarLabel{ + border: 2px solid #CCCCCC; + border-radius: 4px; +} + + +/* HeaderFrame & TitleBarFrame */ + +QFrame[objectName^="headerFrame"], +QFrame[objectName^="headerBFrame"], +QToolBar#headerToolBar, +QFrame#titleBarFrame { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #9BDBF9, stop:1 #1592CD); + border: 0px; +} +QFrame[objectName^="#headerBFrame"] { + border: 1px; + border-radius: 4px; +} +QFrame[objectName^="headerFrame"] > *:!hover, +QFrame[objectName^="headerBFrame"] > *:!hover, +QFrame#titleBarFrame > *:!hover { + background: transparent; + color: white; +} +QFrame#titleBarFrame QComboBox, +QFrame#titleBarFrame QLineEdit, +QFrame#titleBarFrame QTextEdit { + background: white; +} + +/**** Special Page tweak ****/ + + +/* ConnectFriendWizard */ + +ConnectFriendWizard QPlainTextEdit#friendCertEdit { + border: none; + background: white; + color: black; +} + +ConnectFriendWizard QFrame#friendFrame { + border: 2px solid #0099cc; + border-radius: 6px; + background: white; +} + +ConnectFriendWizard QWizardPage#ConclusionPage > QGroupBox#peerDetailsFrame { + border: 2px solid #039bd5; + border-radius:6px; + background: white; + color: black; + padding: 12 12px; +} + +ConnectFriendWizard QGroupBox::title#peerDetailsFrame +{ + padding: 4 12px; + background: transparent; + padding: 4 12px; + background: #039bd5; + color: white; +} + + +/* GetStartedDialog */ + +GetStartedDialog QTextEdit { + border: 1px solid #B8B6B1; + border-radius: 6px; + background: white; + color: black; +} + + +/* HomePage */ + +HomePage QLabel#userCertLabel { + color: #0099cc; +} + + +/* Chat lobby */ + +ChatLobbyWidget QGroupBox#lobbyinfo_groupBox +{ + color: black; + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 #FEFEFE, stop:1 #E8E8E8); + border-radius: 6px; + border: 1px solid #CCCCCC; + + padding: 14 6px; + +} +ChatLobbyWidget QGroupBox#lobbyinfo_groupBox > QLabel +{ + color: black;/*Needed for white font system*/ +} + +ChatLobbyWidget QGroupBox::title#lobbyinfo_groupBox +{ + padding: 4 12px; + background: #039bd5; + color: white; +} + +ChatLobbyDialog QListWidget#participantsList { + border: 1px solid #B8B6B1; + border-radius: 6px; + background: white; + color: black; +} + +CreateLobbyDialog QFrame#roomFrame { + border: 2px solid #CCCCCC; + border-radius:6px; + background: white; +} + +ChatWidget QTextEdit#chatTextEdit, +ChatWidget QTextBrowser#textBrowser { + border: 1px solid #0099cc; + border-radius: 6px; + background: white; + color: black; +} + + +/* MessagesDialog */ + +MessagesDialog QWidget#messageTreeWidget::item { + padding: 2px; +} + +MessagesDialog QWidget#messageTreeWidget::item:selected { + background-color: #cde8ff; + color: black; +} + +MessagesDialog QWidget#messageTreeWidget::item:hover { + background-color: #e5f3ff; + color: black; +} + + +/* Forums */ + +GxsForumThreadWidget QWidget#threadTreeWidget { + selection-background-color: #cde8ff; + show-decoration-selected: 1; +} + +GxsForumThreadWidget QWidget#threadTreeWidget::item { + padding: 2px; +} + +GxsForumThreadWidget QWidget#threadTreeWidget::item:selected:active , +GxsForumThreadWidget QWidget#threadTreeWidget::item:selected:!active { + background-color: #cde8ff; +} + +/* GxsCreateCommentDialog */ + +GxsCreateCommentDialog QTextEdit#commentTextEdit { + border: 2px solid #0099cc; + border-radius: 6px; + background: white; + color: black;/*Needed for white font system*/ +} + + +/* GxsCommentDialog */ + +GxsCommentDialog QComboBox#sortBox { + color: #0099cc; +} + + +/* GxsGroupDialog */ + +GxsGroupDialog QLabel#groupLogo{ + border: 2px solid #CCCCCC; + border-radius: 3px; +} + + +/* Settings */ + +PluginItem > QFrame#pluginFrame { + border: 2px solid #A8B8D1; + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #FCFDFE, stop: 1 #E2E8EF); + border-radius: 0px +} +PluginItem QLabel#infoLabel { + color: #054A02; +} + + +/* Feeds */ + +AttachFileItem > QFrame#frame { + border: 2px solid black; + background: white; +} + +GxsChannelPostItem QLabel#newLabel{ + border: 1px solid #167BE7; + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2291E0, stop: 1 #3EB3FF); + border-radius: 3px; + color: white; +} +GxsChannelPostItem QFrame#msgFrame { + border: 2px solid #82B9F4; + border-radius: 3px; +} +GxsChannelPostItem QLabel#logoLabel { + border: 2px solid #D3D3D3; + background-color: black; +} + +SubFileItem QProgressBar#progressBar { + border: 1px solid black; + text-align: center; + color: white; + padding: 1px; + border-top-left-radius: 7px; + border-bottom-left-radius: 7px; + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #fff, stop: 0.4999 #eee, stop: 0.5 #ddd, stop: 1 #eee); + min-width: 15px; +} +SubFileItem QProgressBar#progressBar::chunk { + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #78d, stop: 0.4999 #46a, stop: 0.5 #45a, stop: 1 #238); + border-top-left-radius: 7px; + border-bottom-left-radius: 7px; + border: 1px solid black; + min-width: 15px; +} + + +/* Posted */ + +BoardPostDisplayWidget_compact QFrame#voteFrame, +BoardPostDisplayWidget_card QFrame#voteFrame, +PostedItem QFrame#voteFrame { + background: rgba( 20, 20, 20, 20% ); +} + +BoardPostDisplayWidget_card QToolButton#voteUpButton, +BoardPostDisplayWidget_compact QToolButton#voteUpButton { + background: #32CD32; + border: none; + border-radius: 4px; +} +BoardPostDisplayWidget_card QToolButton#voteDownButton, +BoardPostDisplayWidget_compact QToolButton#voteDownButton { + background: #CD3232; + border: none; + border-radius: 4px; +} + +BoardPostDisplayWidget_card QToolButton#voteUpButton:hover, +BoardPostDisplayWidget_compact QToolButton#voteUpButton:hover { + background: #32CD32; + border: 2px solid #808080; + border-radius: 4px; +} +BoardPostDisplayWidget_card QToolButton#voteDownButton:hover, +BoardPostDisplayWidget_compact QToolButton#voteDownButton:hover { + background: #CD3232; + border: 2px solid #808080; + border-radius: 4px; +} + +BoardPostDisplayWidget_card QToolButton#voteUpButton:disabled, +BoardPostDisplayWidget_compact QToolButton#voteUpButton:disabled, +BoardPostDisplayWidget_card QToolButton#voteDownButton:disabled, +BoardPostDisplayWidget_compact QToolButton#voteDownButton:disabled { + background: transparent; + border: none; +} + +BoardPostDisplayWidget_compact QLabel#pictureLabel { + border: 2px solid #CCCCCC; + border-radius: 3px; +} + +PostedListWidgetWithModel QComboBox#sortStrategy_CB { + color: #0099cc; +} + +PostedListWidgetWithModel QTextBrowser#infoDescription { + background: transparent; + border: none; +} + +BoardPostDisplayWidget_compact QLabel#fromBoldLabel, +BoardPostDisplayWidget_compact QLabel#fromLabel, +BoardPostDisplayWidget_compact QLabel#dateLabel, +BoardPostDisplayWidget_compact QLabel#siteBoldLabel, +BoardPostDisplayWidget_card QLabel#fromBoldLabel, +BoardPostDisplayWidget_card QLabel#fromLabel, +BoardPostDisplayWidget_card QLabel#dateLabel, +BoardPostDisplayWidget_card QLabel#siteBoldLabel { + color: #787c7e; +} + + +/* MessengerWindow */ + +MessengerWindow QFrame#messengerframetop{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #9BDBF9, stop:1 #1592CD); + border: 0px; +} + + +/*************** Optional ***************/ + +/**** WikiPoos ****/ +WikiEditDialog QPushButton#pushButton_History { + color: white; + background: #5bb62b; + border-radius: 4px; + max-height: 20px; + min-width: 4em; + padding: 2px; + padding-left: 6px; + padding-right: 6px; +} + +WikiEditDialog QPushButton#pushButton_History:hover { + background: #57af29; +} + + +/**** The Wire ****/ + +WireGroupItem QFrame#wire_frame:hover { + background-color: #7ecbfb; +} +WireGroupItem QFrame#wire_frame > QLabel { + color: black; +} + +PulseTopLevel QFrame#plainFrame, +PulseViewGroup QFrame#plainFrame, +PulseReply QFrame#plainFrame { + border: 2px solid #c4cfd6; + background: white; +} + +PulseAddDialog QTextEdit#textEdit_Pulse { + border: 2px solid #c4cfd6; + border-radius: 6px; + background: white; + color: black; +} + +PulseReply #line_replyLine, +PulseMessage #line{ + color: #c4cfd6; +} + +PulseReply QLabel#label_groupName{ + color: #5b7083; +} + +/**** PhotoShare ****/ +AlbumItem QFrame#albumFrame { + border: 2px solid #CCCCCC; + border-radius: 10px +} + +PhotoItem QFrame#photoFrame { + border: 2px solid #CCCCCC; + border-radius: 10px +} + +PhotoItem QWidget:hover { + background-color: #7ecbfb; +} diff --git a/retroshare-gui/src/gui/qss/stylesheet/default.qss b/retroshare-gui/src/gui/qss/stylesheet/default.qss new file mode 100644 index 000000000..40d0b06ea --- /dev/null +++ b/retroshare-gui/src/gui/qss/stylesheet/default.qss @@ -0,0 +1,448 @@ +/* Default stylesheet + This file is used as default for all stylesheets and can be overloaded + Don't use font-size or font-weight, they are defined in .ui files. + Icon size are defined in .cpp files. + + For decoration, use px (pixel or dot) + For horizontal size, use em (width of M char) + For vertical size, use ex (height of x char to respect DotPerInch of your system) + See: https://doc.qt.io/qt-5/stylesheet-reference.html#length + https://doc.qt.io/qt-5/stylesheet-syntax.html + */ + +/**** Standard rules ****/ + +/* Transparent background objects = name starting by trans_*/ +QObject[objectName^="trans_"] { + background: transparent; +} +/* Specific for scrollarea contents */ +QScrollArea[objectName^="trans_"] > QWidget > QWidget { + background: transparent; +} + +/* Informatives background objects = name starting by info*/ +QObject[objectName^="info_"]:enabled {/*enabled is needed for not be overrided :https://doc.qt.io/qt-5/stylesheet-syntax.html#conflict-resolution*/ + color: black; + border: 1px solid #DCDC41; + border-radius: 6px; + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); +} +/* For label inside informative frame */ +QFrame[objectName^="info_"] > QLabel +{ + color: black; + background: transparent; +} + +/* Specifics Buttons */ +QPushButton#applyButton:enabled,/*enabled is needed for not be overrided :https://doc.qt.io/qt-5/stylesheet-syntax.html#conflict-resolution*/ +QPushButton#createButton:enabled, +QPushButton#postButton:enabled, +QToolButton#addButton:enabled, +QToolButton#followButton:enabled { + color: white; + background: #0099cc; + border-radius: 4px; + min-height: 4ex; + /*max-height: 4ex; This doesn't work on windows*/ + min-width: 4em; + padding-left: 6px; + padding-right: 6px; +} + +QPushButton#applyButton:disabled, +QPushButton#createButton:disabled, +QPushButton#postButton:disabled, +QToolButton#addButton:disabled, +QToolButton#followButton:disabled { + color: white; + background: #d40000; + border-radius: 4px; + padding-left: 6px; + padding-right: 6px; +} + +QPushButton#applyButton:hover, +QPushButton#createButton:hover, +QPushButton#postButton:hover, +QToolButton#addButton:hover, +QToolButton#followButton:hover { + color: white; + background: #03b1f3; + border-radius: 4px; + padding-left: 6px; + padding-right: 6px; +} + +QPushButton#searchButton:enabled, +QPushButton#addButton:enabled { + color: white; + background: #32CD32; + border-radius: 4px; + min-height: 4ex; + /*max-height: 4ex; This doesn't work on windows*/ + min-width: 4em; + padding: 4px; +} + +QPushButton#searchButton:hover, +QPushButton#addButton:hover { + color: white; + background: #5AD75A; + border-radius: 4px; + padding: 4px; +} + +QToolButton#subscribeToolButton:enabled { + color: white; + background: #0099cc; + border-radius: 4px; + min-height: 4ex; + /*max-height: 4ex; This doesn't work on windows*/ +} + +QToolButton#subscribeToolButton:disabled { + background: gray; + border-radius: 4px; + border: 1px solid gray; + color: lightgray; +} + +QToolButton#subscribeToolButton:hover { + background: #03b1f3; + border-radius: 4px; +} + +QToolButton#subscribeToolButton:pressed { + background: #03b1f3; + border-radius: 4px; + border: 1px solid gray; +} + +QToolButton#subscribeToolButton[popupMode="1"]{ + padding-right: 0px; +} + +QToolButton#subscribeToolButton::menu-arrow{ + image: none; +} + +QToolButton#subscribeToolButton::menu-button{ + image: none; +} + + +QLabel#newLabel:enabled { + border: 1px solid #167BE7; + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2291E0, stop: 1 #3EB3FF); + border-radius: 3px; + color: black; +} + + +/* StartDialog + To get the same style for all user and not use last connected one. */ + +StartDialog QFrame#loginframe{ + border-image: url(:/images/logo/background_lessblue.png) 0 0 0 0 stretch stretch; + border-width: 0px; +} +StartDialog QFrame#loginframe QCheckBox, +StartDialog QFrame#loginframe QLabel { + background: transparent; +} +StartDialog QGroupBox#profilGBox { + background: rgba(0,0,0,10%); + border-radius: 3px; + border-width: 0px; +} + +StartDialog QGroupBox#profilGBox * { + background-color: white; + color: black; +} + +StartDialog QPushButton#loadButton { + background: transparent; + border-image: url(:/images/btn_blue.png) 4; + border-width: 4; + color: white; +} +StartDialog QPushButton#loadButton:hover { + background: transparent; + border-image: url(:/images/btn_blue_hover.png) 4; +} + + + +/* GenCertDialog + Change colors here because GUI is not started yet so no user StyleSheet loads */ + +GenCertDialog QFrame#profileframe{ + border-image: url(:/images/logo/background.png) 0 0 0 0 stretch stretch; + border-width: 0px; +} +GenCertDialog QFrame#profileframe QCheckBox, +GenCertDialog QFrame#profileframe QLabel { + background: transparent; +} + +GenCertDialog QLabel#info_Label:enabled { + color: black; + border: 1px solid #DCDC41; + border-radius: 6px; + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2); +} + +GenCertDialog QGroupBox#groupBox, +GenCertDialog QGroupBox#profile_groupBox { + background: rgba(0,0,0,10%); +} +GenCertDialog QGroupBox#profile_groupBox QComboBox, +GenCertDialog QGroupBox#profile_groupBox QSpinBox, +GenCertDialog QGroupBox#profile_groupBox QLineEdit, +GenCertDialog QComboBox#genPGPuser { + border: 2px solid #0099cc; + border-radius: 6px; + background: white; + color: black; +} + +GenCertDialog QPushButton#genButton { + border-image: url(:/images/btn_blue.png) 4; + border-width: 4; + color: white; +} +GenCertDialog QPushButton#genButton:hover { + border-image: url(:/images/btn_blue_hover.png) 4; +} +GenCertDialog QPushButton#genButton:disabled { + border-image: url(:/images/btn_27.png) 4; + color: black; +} + + +/* AvatarWidget */ + +AvatarWidget{border-width: 10px;} +AvatarWidget[frameState="NORMAL"]{border-image:url(:/images/avatarstatus-bg-116.png);} +AvatarWidget[frameState="OFFLINE"]{border-image:url(:/images/avatarstatus-bg-offline-116.png);} +AvatarWidget[frameState="INACTIVE"]{border-image:url(:/images/avatarstatus-bg-idle-116.png);} +AvatarWidget[frameState="ONLINE"]{border-image:url(:/images/avatarstatus-bg-online-116.png);} +AvatarWidget[frameState="AWAY"]{border-image:url(:/images/avatarstatus-bg-away-116.png);} +AvatarWidget[frameState="BUSY"]{border-image:url(:/images/avatarstatus-bg-busy-116.png);} + + +/* ConnectFriendWizard */ + +ConnectFriendWizard { +/* QWizard cannot be resized horizontal when banner pixmap is set + qproperty-bannerPixmap: url(:/images/connect/connectFriendBanner1.png);*/ + qproperty-titleFontSize: 16; + qproperty-titleFontWeight: 500; +/* qproperty-titleColor: white; */ +} + + +/* GxsChannelFilesStatusWidget */ + +GxsChannelFilesStatusWidget QToolButton#openFolderToolButton[popupMode="0"] { + padding-right: 0px; +} + +GxsChannelFilesStatusWidget QToolButton#openFolderToolButton::menu-indicator { + image: none; +} + + +/* Forums */ + +GxsForumThreadWidget QLabel#forumName +{ + color: #0099cc; +} + + +/* Posted */ + +BoardPostDisplayWidget_compact QFrame#voteFrame, +BoardPostDisplayWidget_card QFrame#voteFrame, +PostedItem QFrame#voteFrame { + background: rgba( 20, 20, 20, 20% ); +} + +BoardPostDisplayWidget_card QToolButton#voteUpButton, +BoardPostDisplayWidget_compact QToolButton#voteUpButton { + background: rgba(50,205,50,50%); + border: none; + border-radius: 4px; +} +BoardPostDisplayWidget_card QToolButton#voteDownButton, +BoardPostDisplayWidget_compact QToolButton#voteDownButton { + background: rgba(205,50,50,50%); + border: none; + border-radius: 4px; +} + +BoardPostDisplayWidget_card QToolButton#voteUpButton:hover, +BoardPostDisplayWidget_compact QToolButton#voteUpButton:hover { + background: rgba(50,205,50,75%); + border: 2px solid #808080; + border-radius: 4px; +} +BoardPostDisplayWidget_card QToolButton#voteDownButton:hover, +BoardPostDisplayWidget_compact QToolButton#voteDownButton:hover { + background: rgba(205,50,50,75%); + border: 2px solid #808080; + border-radius: 4px; +} + +BoardPostDisplayWidget_card QToolButton#voteUpButton:disabled, +BoardPostDisplayWidget_compact QToolButton#voteUpButton:disabled, +BoardPostDisplayWidget_card QToolButton#voteDownButton:disabled, +BoardPostDisplayWidget_compact QToolButton#voteDownButton:disabled { + background: transparent; + border: none; +} + + +/**** Color definitions ****/ + +ForumsDialog, GxsForumThreadWidget +{ + qproperty-textColorRead: darkgray; + qproperty-textColorUnread: black; + qproperty-textColorUnreadChildren: darkgray; + qproperty-textColorNotSubscribed: black; + qproperty-textColorMissing: darkRed; + qproperty-textColorPinned: darkOrange; + + qproperty-backgroundColorPinned: rgb(255, 200, 180); + qproperty-backgroundColorFiltered: rgb(255, 240, 210); +} + +FriendSelectionWidget +{ + qproperty-textColorOnline: blue; +} + +GroupTreeWidget +{ + qproperty-textColorCategory: rgb(79, 79, 79); + qproperty-textColorPrivateKey: rgb(35,91,159); +} + +MessagesDialog +{ + qproperty-textColorInbox: rgb(49, 106, 197); +} + +NetworkDialog +{ + qproperty-backgroundColorSelf: yellow; + qproperty-backgroundColorOwnSign: rgb(69, 255, 69); + qproperty-backgroundColorAcceptConnection: rgb(67, 192, 67); + qproperty-backgroundColorHasSignedMe: rgb(178, 66, 178); + qproperty-backgroundColorDenied: lightGray; + qproperty-textColor: black; +} + +NewFriendList +{ + qproperty-textColorStatusOffline: black; + qproperty-textColorStatusAway: gray; + qproperty-textColorStatusBusy: gray; + qproperty-textColorStatusOnline: darkGreen; + qproperty-textColorStatusInactive: gray; + qproperty-textColorGroup: rgb(123, 123, 123); +} + +SearchDialog +{ + qproperty-textColorLocal: red; + qproperty-textColorDownloading: green; + qproperty-textColorNoSources: rgb(0, 0, 19); + qproperty-textColorLowSources: rgb(0, 0, 38); + qproperty-textColorHighSources: rgb(0, 0, 228); +} + +RSTextBrowser, MimeTextEdit +{ + /*qproperty-textColorQuote: rgb(120, 153, 34);*/ + qproperty-textColorQuotes: ColorList(#789922 #039bd5 #800000 #800080 #008080 #b10dc9 #85144b #3d9970); +} + +/* OpModeStatus need to be at end to overload other values*/ + +OpModeStatus { + qproperty-opMode_Full_Color: #CCFFCC; + qproperty-opMode_NoTurtle_Color: #CCCCFF; + qproperty-opMode_Gaming_Color: #FFFFCC; + qproperty-opMode_Minimal_Color: #FFCCCC; +} +OpModeStatus[opMode="Full"] { + color: black; + background: #CCFFCC; +} +OpModeStatus[opMode="NoTurtle"] { + color: black; + background: #CCCCFF; +} +OpModeStatus[opMode="Gaming"] { + color: black; + background: #FFFFCC; +} +OpModeStatus[opMode="Minimal"] { + color: black; + background: #FFCCCC; +} + +/*Property Values at end to overwrite other settings*/ + +[new=false] { + /*background: rgba(248,248,248,75%);*/ +} +[new=true] { + background: rgba(220,236,253,75%); +} + +[valid=true] { + background: rgba(0,255,0,15%); +} + +[valid=false] { + background: rgba(255,0,0,15%); +} + +[WrongValue="true"] { + background-color: #FF8080; +} + +/* HeaderFrame & TitleBarFrame */ + +QFrame[objectName^="headerFrame"], +QFrame[objectName^="headerBFrame"] { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #9BDBF9, stop:1 #1592CD); + border: 1px; + border-radius: 4px; +} +QFrame[objectName^="#headerBFrame"] { + border: 1px; + border-radius: 4px; +} +QFrame[objectName^="headerFrame"] > *:!hover, +QFrame[objectName^="headerBFrame"] > *:!hover{ + background: transparent; + color: white; +} + +QFrame#toolBarFrame, QFrame#toolBarFrameTop { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FEFEFE, stop:1 #E8E8E8); + border: 1px solid #CCCCCC; +} + +ChatWidget QFrame#titleBarFrame { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FEFEFE, stop:1 #E8E8E8); + border: 1px solid #CCCCCC; +} diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/Standard_Dark.qrc b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/Standard_Dark.qrc new file mode 100644 index 000000000..be5703005 --- /dev/null +++ b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/Standard_Dark.qrc @@ -0,0 +1,214 @@ + + + rc/.keep + rc/arrow_down.png + rc/arrow_down@2x.png + rc/arrow_down_disabled.png + rc/arrow_down_disabled@2x.png + rc/arrow_down_focus.png + rc/arrow_down_focus@2x.png + rc/arrow_down_pressed.png + rc/arrow_down_pressed@2x.png + rc/arrow_left.png + rc/arrow_left@2x.png + rc/arrow_left_disabled.png + rc/arrow_left_disabled@2x.png + rc/arrow_left_focus.png + rc/arrow_left_focus@2x.png + rc/arrow_left_pressed.png + rc/arrow_left_pressed@2x.png + rc/arrow_right.png + rc/arrow_right@2x.png + rc/arrow_right_disabled.png + rc/arrow_right_disabled@2x.png + rc/arrow_right_focus.png + rc/arrow_right_focus@2x.png + rc/arrow_right_pressed.png + rc/arrow_right_pressed@2x.png + rc/arrow_up.png + rc/arrow_up@2x.png + rc/arrow_up_disabled.png + rc/arrow_up_disabled@2x.png + rc/arrow_up_focus.png + rc/arrow_up_focus@2x.png + rc/arrow_up_pressed.png + rc/arrow_up_pressed@2x.png + rc/base_icon.png + rc/base_icon@2x.png + rc/base_icon_disabled.png + rc/base_icon_disabled@2x.png + rc/base_icon_focus.png + rc/base_icon_focus@2x.png + rc/base_icon_pressed.png + rc/base_icon_pressed@2x.png + rc/branch_closed.png + rc/branch_closed@2x.png + rc/branch_closed_disabled.png + rc/branch_closed_disabled@2x.png + rc/branch_closed_focus.png + rc/branch_closed_focus@2x.png + rc/branch_closed_pressed.png + rc/branch_closed_pressed@2x.png + rc/branch_end.png + rc/branch_end@2x.png + rc/branch_end_disabled.png + rc/branch_end_disabled@2x.png + rc/branch_end_focus.png + rc/branch_end_focus@2x.png + rc/branch_end_pressed.png + rc/branch_end_pressed@2x.png + rc/branch_line.png + rc/branch_line@2x.png + rc/branch_line_disabled.png + rc/branch_line_disabled@2x.png + rc/branch_line_focus.png + rc/branch_line_focus@2x.png + rc/branch_line_pressed.png + rc/branch_line_pressed@2x.png + rc/branch_more.png + rc/branch_more@2x.png + rc/branch_more_disabled.png + rc/branch_more_disabled@2x.png + rc/branch_more_focus.png + rc/branch_more_focus@2x.png + rc/branch_more_pressed.png + rc/branch_more_pressed@2x.png + rc/branch_open.png + rc/branch_open@2x.png + rc/branch_open_disabled.png + rc/branch_open_disabled@2x.png + rc/branch_open_focus.png + rc/branch_open_focus@2x.png + rc/branch_open_pressed.png + rc/branch_open_pressed@2x.png + rc/checkbox_checked.png + rc/checkbox_checked@2x.png + rc/checkbox_checked_disabled.png + rc/checkbox_checked_disabled@2x.png + rc/checkbox_checked_focus.png + rc/checkbox_checked_focus@2x.png + rc/checkbox_checked_pressed.png + rc/checkbox_checked_pressed@2x.png + rc/checkbox_indeterminate.png + rc/checkbox_indeterminate@2x.png + rc/checkbox_indeterminate_disabled.png + rc/checkbox_indeterminate_disabled@2x.png + rc/checkbox_indeterminate_focus.png + rc/checkbox_indeterminate_focus@2x.png + rc/checkbox_indeterminate_pressed.png + rc/checkbox_indeterminate_pressed@2x.png + rc/checkbox_unchecked.png + rc/checkbox_unchecked@2x.png + rc/checkbox_unchecked_disabled.png + rc/checkbox_unchecked_disabled@2x.png + rc/checkbox_unchecked_focus.png + rc/checkbox_unchecked_focus@2x.png + rc/checkbox_unchecked_pressed.png + rc/checkbox_unchecked_pressed@2x.png + rc/line_horizontal.png + rc/line_horizontal@2x.png + rc/line_horizontal_disabled.png + rc/line_horizontal_disabled@2x.png + rc/line_horizontal_focus.png + rc/line_horizontal_focus@2x.png + rc/line_horizontal_pressed.png + rc/line_horizontal_pressed@2x.png + rc/line_vertical.png + rc/line_vertical@2x.png + rc/line_vertical_disabled.png + rc/line_vertical_disabled@2x.png + rc/line_vertical_focus.png + rc/line_vertical_focus@2x.png + rc/line_vertical_pressed.png + rc/line_vertical_pressed@2x.png + rc/radio_checked.png + rc/radio_checked@2x.png + rc/radio_checked_disabled.png + rc/radio_checked_disabled@2x.png + rc/radio_checked_focus.png + rc/radio_checked_focus@2x.png + rc/radio_checked_pressed.png + rc/radio_checked_pressed@2x.png + rc/radio_unchecked.png + rc/radio_unchecked@2x.png + rc/radio_unchecked_disabled.png + rc/radio_unchecked_disabled@2x.png + rc/radio_unchecked_focus.png + rc/radio_unchecked_focus@2x.png + rc/radio_unchecked_pressed.png + rc/radio_unchecked_pressed@2x.png + rc/toolbar_move_horizontal.png + rc/toolbar_move_horizontal@2x.png + rc/toolbar_move_horizontal_disabled.png + rc/toolbar_move_horizontal_disabled@2x.png + rc/toolbar_move_horizontal_focus.png + rc/toolbar_move_horizontal_focus@2x.png + rc/toolbar_move_horizontal_pressed.png + rc/toolbar_move_horizontal_pressed@2x.png + rc/toolbar_move_vertical.png + rc/toolbar_move_vertical@2x.png + rc/toolbar_move_vertical_disabled.png + rc/toolbar_move_vertical_disabled@2x.png + rc/toolbar_move_vertical_focus.png + rc/toolbar_move_vertical_focus@2x.png + rc/toolbar_move_vertical_pressed.png + rc/toolbar_move_vertical_pressed@2x.png + rc/toolbar_separator_horizontal.png + rc/toolbar_separator_horizontal@2x.png + rc/toolbar_separator_horizontal_disabled.png + rc/toolbar_separator_horizontal_disabled@2x.png + rc/toolbar_separator_horizontal_focus.png + rc/toolbar_separator_horizontal_focus@2x.png + rc/toolbar_separator_horizontal_pressed.png + rc/toolbar_separator_horizontal_pressed@2x.png + rc/toolbar_separator_vertical.png + rc/toolbar_separator_vertical@2x.png + rc/toolbar_separator_vertical_disabled.png + rc/toolbar_separator_vertical_disabled@2x.png + rc/toolbar_separator_vertical_focus.png + rc/toolbar_separator_vertical_focus@2x.png + rc/toolbar_separator_vertical_pressed.png + rc/toolbar_separator_vertical_pressed@2x.png + rc/transparent.png + rc/transparent@2x.png + rc/transparent_disabled.png + rc/transparent_disabled@2x.png + rc/transparent_focus.png + rc/transparent_focus@2x.png + rc/transparent_pressed.png + rc/transparent_pressed@2x.png + rc/window_close.png + rc/window_close@2x.png + rc/window_close_disabled.png + rc/window_close_disabled@2x.png + rc/window_close_focus.png + rc/window_close_focus@2x.png + rc/window_close_pressed.png + rc/window_close_pressed@2x.png + rc/window_grip.png + rc/window_grip@2x.png + rc/window_grip_disabled.png + rc/window_grip_disabled@2x.png + rc/window_grip_focus.png + rc/window_grip_focus@2x.png + rc/window_grip_pressed.png + rc/window_grip_pressed@2x.png + rc/window_minimize.png + rc/window_minimize@2x.png + rc/window_minimize_disabled.png + rc/window_minimize_disabled@2x.png + rc/window_minimize_focus.png + rc/window_minimize_focus@2x.png + rc/window_minimize_pressed.png + rc/window_minimize_pressed@2x.png + rc/window_undock.png + rc/window_undock@2x.png + rc/window_undock_disabled.png + rc/window_undock_disabled@2x.png + rc/window_undock_focus.png + rc/window_undock_focus@2x.png + rc/window_undock_pressed.png + rc/window_undock_pressed@2x.png + + + diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/.keep b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/.keep new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/.keep @@ -0,0 +1 @@ + diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down.png new file mode 100644 index 000000000..5575ab5ce Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down@2x.png new file mode 100644 index 000000000..4596a5ce8 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_disabled.png new file mode 100644 index 000000000..bdf8c1abb Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_disabled@2x.png new file mode 100644 index 000000000..dc1bcb524 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_focus.png new file mode 100644 index 000000000..94fcdc359 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_focus@2x.png new file mode 100644 index 000000000..2b12f74d0 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_pressed.png new file mode 100644 index 000000000..4058c58b3 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_pressed@2x.png new file mode 100644 index 000000000..d43b0affa Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_down_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left.png new file mode 100644 index 000000000..7fbc35065 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left@2x.png new file mode 100644 index 000000000..dc649ca70 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_disabled.png new file mode 100644 index 000000000..fa3b282cc Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_disabled@2x.png new file mode 100644 index 000000000..87c928ea3 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_focus.png new file mode 100644 index 000000000..52a0d9102 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_focus@2x.png new file mode 100644 index 000000000..0ee702924 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_pressed.png new file mode 100644 index 000000000..c04ce0943 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_pressed@2x.png new file mode 100644 index 000000000..02218c80d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_left_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right.png new file mode 100644 index 000000000..fd31b4f2a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right@2x.png new file mode 100644 index 000000000..4dbc93120 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_disabled.png new file mode 100644 index 000000000..bb4cdb036 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_disabled@2x.png new file mode 100644 index 000000000..50f173096 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_focus.png new file mode 100644 index 000000000..9dd8f0f0b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_focus@2x.png new file mode 100644 index 000000000..1ac9d5c9e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_pressed.png new file mode 100644 index 000000000..8ce10fcbe Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_pressed@2x.png new file mode 100644 index 000000000..86e3b9286 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_right_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up.png new file mode 100644 index 000000000..2ea571e47 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up@2x.png new file mode 100644 index 000000000..51b1d7234 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_disabled.png new file mode 100644 index 000000000..146b65f16 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_disabled@2x.png new file mode 100644 index 000000000..cacee7f74 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_focus.png new file mode 100644 index 000000000..ab33162c7 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_focus@2x.png new file mode 100644 index 000000000..0c8ef33f4 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_pressed.png new file mode 100644 index 000000000..c3368d096 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_pressed@2x.png new file mode 100644 index 000000000..a63819665 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/arrow_up_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon.png new file mode 100644 index 000000000..1aeed5554 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon@2x.png new file mode 100644 index 000000000..f42fc6610 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_disabled.png new file mode 100644 index 000000000..1aeed5554 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_disabled@2x.png new file mode 100644 index 000000000..f42fc6610 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_focus.png new file mode 100644 index 000000000..1aeed5554 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_focus@2x.png new file mode 100644 index 000000000..f42fc6610 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_pressed.png new file mode 100644 index 000000000..1aeed5554 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_pressed@2x.png new file mode 100644 index 000000000..f42fc6610 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/base_icon_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed.png new file mode 100644 index 000000000..d484c324b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed@2x.png new file mode 100644 index 000000000..f49651b70 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_disabled.png new file mode 100644 index 000000000..aa622523c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_disabled@2x.png new file mode 100644 index 000000000..ac318f5b1 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_focus.png new file mode 100644 index 000000000..0a98eab66 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_focus@2x.png new file mode 100644 index 000000000..39fd0d0e2 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_pressed.png new file mode 100644 index 000000000..049f4bfe5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_pressed@2x.png new file mode 100644 index 000000000..f58ae2238 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_closed_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end.png new file mode 100644 index 000000000..210984565 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end@2x.png new file mode 100644 index 000000000..91f3bd02d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_disabled.png new file mode 100644 index 000000000..fe819bc14 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_disabled@2x.png new file mode 100644 index 000000000..580247709 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_focus.png new file mode 100644 index 000000000..9a978c0cc Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_focus@2x.png new file mode 100644 index 000000000..ece9b825d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_pressed.png new file mode 100644 index 000000000..1d4050997 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_pressed@2x.png new file mode 100644 index 000000000..4822745c4 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_end_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line.png new file mode 100644 index 000000000..75cc027f8 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line@2x.png new file mode 100644 index 000000000..727370558 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_disabled.png new file mode 100644 index 000000000..01c6cffa7 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_disabled@2x.png new file mode 100644 index 000000000..57789e942 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_focus.png new file mode 100644 index 000000000..599626230 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_focus@2x.png new file mode 100644 index 000000000..34e7d603f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_pressed.png new file mode 100644 index 000000000..6a54b0948 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_pressed@2x.png new file mode 100644 index 000000000..fb74fd324 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_line_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more.png new file mode 100644 index 000000000..045f963fa Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more@2x.png new file mode 100644 index 000000000..ccde09316 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_disabled.png new file mode 100644 index 000000000..8630b91c9 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_disabled@2x.png new file mode 100644 index 000000000..37d2cdbbd Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_focus.png new file mode 100644 index 000000000..38067367f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_focus@2x.png new file mode 100644 index 000000000..d80ccb8cc Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_pressed.png new file mode 100644 index 000000000..a306eb288 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_pressed@2x.png new file mode 100644 index 000000000..7044b2822 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_more_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open.png new file mode 100644 index 000000000..445ec7181 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open@2x.png new file mode 100644 index 000000000..febb31878 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_disabled.png new file mode 100644 index 000000000..3b840d767 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_disabled@2x.png new file mode 100644 index 000000000..d6c5b40ed Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_focus.png new file mode 100644 index 000000000..fecf8733e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_focus@2x.png new file mode 100644 index 000000000..296d17553 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_pressed.png new file mode 100644 index 000000000..8a7cffab5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_pressed@2x.png new file mode 100644 index 000000000..24e282c85 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/branch_open_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked.png new file mode 100644 index 000000000..aa5f56720 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked@2x.png new file mode 100644 index 000000000..60b4fb2ae Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_disabled.png new file mode 100644 index 000000000..208f3709e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_disabled@2x.png new file mode 100644 index 000000000..7c8ad0c58 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_focus.png new file mode 100644 index 000000000..a35def37f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_focus@2x.png new file mode 100644 index 000000000..925cd3620 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_pressed.png new file mode 100644 index 000000000..f95dc13eb Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_pressed@2x.png new file mode 100644 index 000000000..641c047ae Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_checked_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate.png new file mode 100644 index 000000000..02de1ad2c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate@2x.png new file mode 100644 index 000000000..8fabf6ea4 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_disabled.png new file mode 100644 index 000000000..df99affe0 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_disabled@2x.png new file mode 100644 index 000000000..3102eaa3f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_focus.png new file mode 100644 index 000000000..370454348 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_focus@2x.png new file mode 100644 index 000000000..8da0a8c98 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_pressed.png new file mode 100644 index 000000000..b971d7fae Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_pressed@2x.png new file mode 100644 index 000000000..9e37b8433 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_indeterminate_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked.png new file mode 100644 index 000000000..80bcf2b66 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked@2x.png new file mode 100644 index 000000000..df0fa4d5a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_disabled.png new file mode 100644 index 000000000..ede58c818 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_disabled@2x.png new file mode 100644 index 000000000..6721b38f5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_focus.png new file mode 100644 index 000000000..3883d2d5a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_focus@2x.png new file mode 100644 index 000000000..35c061c0d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_pressed.png new file mode 100644 index 000000000..d98639eed Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_pressed@2x.png new file mode 100644 index 000000000..88a52460d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/checkbox_unchecked_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal.png new file mode 100644 index 000000000..bc858c8d0 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal@2x.png new file mode 100644 index 000000000..7ea4f9c1c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_disabled.png new file mode 100644 index 000000000..72e073a78 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_disabled@2x.png new file mode 100644 index 000000000..09a439df9 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_focus.png new file mode 100644 index 000000000..c84512bb5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_focus@2x.png new file mode 100644 index 000000000..8dd58f609 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_pressed.png new file mode 100644 index 000000000..7ca2605bd Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_pressed@2x.png new file mode 100644 index 000000000..bd9661781 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_horizontal_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical.png new file mode 100644 index 000000000..49a910526 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical@2x.png new file mode 100644 index 000000000..cbb017ee6 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_disabled.png new file mode 100644 index 000000000..965854688 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_disabled@2x.png new file mode 100644 index 000000000..7836a9465 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_focus.png new file mode 100644 index 000000000..512ee7d23 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_focus@2x.png new file mode 100644 index 000000000..af503251d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_pressed.png new file mode 100644 index 000000000..b8dd21535 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_pressed@2x.png new file mode 100644 index 000000000..e1d43a83e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/line_vertical_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked.png new file mode 100644 index 000000000..2a1d26a4f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked@2x.png new file mode 100644 index 000000000..eb2cbb46c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_disabled.png new file mode 100644 index 000000000..f78c15360 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_disabled@2x.png new file mode 100644 index 000000000..30168e86b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_focus.png new file mode 100644 index 000000000..6d9c9801c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_focus@2x.png new file mode 100644 index 000000000..63476a075 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_pressed.png new file mode 100644 index 000000000..421ecb44a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_pressed@2x.png new file mode 100644 index 000000000..9030e1013 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_checked_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked.png new file mode 100644 index 000000000..23b06ced3 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked@2x.png new file mode 100644 index 000000000..41e790ac7 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_disabled.png new file mode 100644 index 000000000..075ca8557 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_disabled@2x.png new file mode 100644 index 000000000..61cd48ffe Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_focus.png new file mode 100644 index 000000000..d58758039 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_focus@2x.png new file mode 100644 index 000000000..0f12c860b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_pressed.png new file mode 100644 index 000000000..37c09a6d8 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_pressed@2x.png new file mode 100644 index 000000000..9e424e4b3 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/radio_unchecked_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal.png new file mode 100644 index 000000000..9d2f51f06 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal@2x.png new file mode 100644 index 000000000..c35b46532 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_disabled.png new file mode 100644 index 000000000..013ac4578 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_disabled@2x.png new file mode 100644 index 000000000..f713dd4d0 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_focus.png new file mode 100644 index 000000000..6d0d42588 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_focus@2x.png new file mode 100644 index 000000000..0a5ca39b1 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_pressed.png new file mode 100644 index 000000000..e414c0c52 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_pressed@2x.png new file mode 100644 index 000000000..e8e8af20f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_horizontal_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical.png new file mode 100644 index 000000000..140846d75 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical@2x.png new file mode 100644 index 000000000..7edf454a3 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_disabled.png new file mode 100644 index 000000000..5cd85dd72 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_disabled@2x.png new file mode 100644 index 000000000..07d5ae1bf Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_focus.png new file mode 100644 index 000000000..9aac0365a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_focus@2x.png new file mode 100644 index 000000000..c3b1d1805 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_pressed.png new file mode 100644 index 000000000..30b3921e2 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_pressed@2x.png new file mode 100644 index 000000000..bd0120745 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_move_vertical_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal.png new file mode 100644 index 000000000..96e2689ff Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal@2x.png new file mode 100644 index 000000000..5944e44c9 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_disabled.png new file mode 100644 index 000000000..941e14509 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_disabled@2x.png new file mode 100644 index 000000000..e44a33be6 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_focus.png new file mode 100644 index 000000000..590b31471 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_focus@2x.png new file mode 100644 index 000000000..ca88313f6 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_pressed.png new file mode 100644 index 000000000..38004682a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_pressed@2x.png new file mode 100644 index 000000000..d4b88c047 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_horizontal_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical.png new file mode 100644 index 000000000..b503c8093 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical@2x.png new file mode 100644 index 000000000..2725a7fa1 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_disabled.png new file mode 100644 index 000000000..6aa1fbdd7 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_disabled@2x.png new file mode 100644 index 000000000..8e54cfa8e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_focus.png new file mode 100644 index 000000000..fcdfc0f21 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_focus@2x.png new file mode 100644 index 000000000..51b083965 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_pressed.png new file mode 100644 index 000000000..9d6f84d51 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_pressed@2x.png new file mode 100644 index 000000000..3876a8e87 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/toolbar_separator_vertical_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent.png new file mode 100644 index 000000000..3a95111e5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent@2x.png new file mode 100644 index 000000000..4c4b95225 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_disabled.png new file mode 100644 index 000000000..3a95111e5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_disabled@2x.png new file mode 100644 index 000000000..4c4b95225 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_focus.png new file mode 100644 index 000000000..3a95111e5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_focus@2x.png new file mode 100644 index 000000000..4c4b95225 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_pressed.png new file mode 100644 index 000000000..3a95111e5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_pressed@2x.png new file mode 100644 index 000000000..4c4b95225 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/transparent_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close.png new file mode 100644 index 000000000..0115ca3f3 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close@2x.png new file mode 100644 index 000000000..41dcd8160 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_disabled.png new file mode 100644 index 000000000..55144fff8 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_disabled@2x.png new file mode 100644 index 000000000..766aef7c1 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_focus.png new file mode 100644 index 000000000..61df25f82 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_focus@2x.png new file mode 100644 index 000000000..2ea50b1a9 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_pressed.png new file mode 100644 index 000000000..042311def Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_pressed@2x.png new file mode 100644 index 000000000..b54d9a16d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_close_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip.png new file mode 100644 index 000000000..9ea1c438f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip@2x.png new file mode 100644 index 000000000..b31309e8b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_disabled.png new file mode 100644 index 000000000..b66e23b99 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_disabled@2x.png new file mode 100644 index 000000000..ee3d0ba88 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_focus.png new file mode 100644 index 000000000..400af158c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_focus@2x.png new file mode 100644 index 000000000..83c9ec634 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_pressed.png new file mode 100644 index 000000000..f71dd8c9a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_pressed@2x.png new file mode 100644 index 000000000..109878a35 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_grip_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize.png new file mode 100644 index 000000000..07517b943 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize@2x.png new file mode 100644 index 000000000..434bb07cd Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_disabled.png new file mode 100644 index 000000000..a1ee4aeda Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_disabled@2x.png new file mode 100644 index 000000000..8454ad832 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_focus.png new file mode 100644 index 000000000..3b56123f1 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_focus@2x.png new file mode 100644 index 000000000..a66fb71ec Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_pressed.png new file mode 100644 index 000000000..9b70c0ade Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_pressed@2x.png new file mode 100644 index 000000000..5750a8e7e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_minimize_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock.png new file mode 100644 index 000000000..9be9cdf77 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock@2x.png new file mode 100644 index 000000000..40345ab94 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_disabled.png new file mode 100644 index 000000000..ea92aee04 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_disabled@2x.png new file mode 100644 index 000000000..fb8d5483c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_focus.png new file mode 100644 index 000000000..5b0338d9b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_focus@2x.png new file mode 100644 index 000000000..9fea75b09 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_pressed.png new file mode 100644 index 000000000..4bc657b21 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_pressed@2x.png new file mode 100644 index 000000000..2ea0c2c71 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/dark/rc/window_undock_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/Standard_Light.qrc b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/Standard_Light.qrc new file mode 100644 index 000000000..f6af4ae87 --- /dev/null +++ b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/Standard_Light.qrc @@ -0,0 +1,214 @@ + + + rc/.keep + rc/arrow_down.png + rc/arrow_down@2x.png + rc/arrow_down_disabled.png + rc/arrow_down_disabled@2x.png + rc/arrow_down_focus.png + rc/arrow_down_focus@2x.png + rc/arrow_down_pressed.png + rc/arrow_down_pressed@2x.png + rc/arrow_left.png + rc/arrow_left@2x.png + rc/arrow_left_disabled.png + rc/arrow_left_disabled@2x.png + rc/arrow_left_focus.png + rc/arrow_left_focus@2x.png + rc/arrow_left_pressed.png + rc/arrow_left_pressed@2x.png + rc/arrow_right.png + rc/arrow_right@2x.png + rc/arrow_right_disabled.png + rc/arrow_right_disabled@2x.png + rc/arrow_right_focus.png + rc/arrow_right_focus@2x.png + rc/arrow_right_pressed.png + rc/arrow_right_pressed@2x.png + rc/arrow_up.png + rc/arrow_up@2x.png + rc/arrow_up_disabled.png + rc/arrow_up_disabled@2x.png + rc/arrow_up_focus.png + rc/arrow_up_focus@2x.png + rc/arrow_up_pressed.png + rc/arrow_up_pressed@2x.png + rc/base_icon.png + rc/base_icon@2x.png + rc/base_icon_disabled.png + rc/base_icon_disabled@2x.png + rc/base_icon_focus.png + rc/base_icon_focus@2x.png + rc/base_icon_pressed.png + rc/base_icon_pressed@2x.png + rc/branch_closed.png + rc/branch_closed@2x.png + rc/branch_closed_disabled.png + rc/branch_closed_disabled@2x.png + rc/branch_closed_focus.png + rc/branch_closed_focus@2x.png + rc/branch_closed_pressed.png + rc/branch_closed_pressed@2x.png + rc/branch_end.png + rc/branch_end@2x.png + rc/branch_end_disabled.png + rc/branch_end_disabled@2x.png + rc/branch_end_focus.png + rc/branch_end_focus@2x.png + rc/branch_end_pressed.png + rc/branch_end_pressed@2x.png + rc/branch_line.png + rc/branch_line@2x.png + rc/branch_line_disabled.png + rc/branch_line_disabled@2x.png + rc/branch_line_focus.png + rc/branch_line_focus@2x.png + rc/branch_line_pressed.png + rc/branch_line_pressed@2x.png + rc/branch_more.png + rc/branch_more@2x.png + rc/branch_more_disabled.png + rc/branch_more_disabled@2x.png + rc/branch_more_focus.png + rc/branch_more_focus@2x.png + rc/branch_more_pressed.png + rc/branch_more_pressed@2x.png + rc/branch_open.png + rc/branch_open@2x.png + rc/branch_open_disabled.png + rc/branch_open_disabled@2x.png + rc/branch_open_focus.png + rc/branch_open_focus@2x.png + rc/branch_open_pressed.png + rc/branch_open_pressed@2x.png + rc/checkbox_checked.png + rc/checkbox_checked@2x.png + rc/checkbox_checked_disabled.png + rc/checkbox_checked_disabled@2x.png + rc/checkbox_checked_focus.png + rc/checkbox_checked_focus@2x.png + rc/checkbox_checked_pressed.png + rc/checkbox_checked_pressed@2x.png + rc/checkbox_indeterminate.png + rc/checkbox_indeterminate@2x.png + rc/checkbox_indeterminate_disabled.png + rc/checkbox_indeterminate_disabled@2x.png + rc/checkbox_indeterminate_focus.png + rc/checkbox_indeterminate_focus@2x.png + rc/checkbox_indeterminate_pressed.png + rc/checkbox_indeterminate_pressed@2x.png + rc/checkbox_unchecked.png + rc/checkbox_unchecked@2x.png + rc/checkbox_unchecked_disabled.png + rc/checkbox_unchecked_disabled@2x.png + rc/checkbox_unchecked_focus.png + rc/checkbox_unchecked_focus@2x.png + rc/checkbox_unchecked_pressed.png + rc/checkbox_unchecked_pressed@2x.png + rc/line_horizontal.png + rc/line_horizontal@2x.png + rc/line_horizontal_disabled.png + rc/line_horizontal_disabled@2x.png + rc/line_horizontal_focus.png + rc/line_horizontal_focus@2x.png + rc/line_horizontal_pressed.png + rc/line_horizontal_pressed@2x.png + rc/line_vertical.png + rc/line_vertical@2x.png + rc/line_vertical_disabled.png + rc/line_vertical_disabled@2x.png + rc/line_vertical_focus.png + rc/line_vertical_focus@2x.png + rc/line_vertical_pressed.png + rc/line_vertical_pressed@2x.png + rc/radio_checked.png + rc/radio_checked@2x.png + rc/radio_checked_disabled.png + rc/radio_checked_disabled@2x.png + rc/radio_checked_focus.png + rc/radio_checked_focus@2x.png + rc/radio_checked_pressed.png + rc/radio_checked_pressed@2x.png + rc/radio_unchecked.png + rc/radio_unchecked@2x.png + rc/radio_unchecked_disabled.png + rc/radio_unchecked_disabled@2x.png + rc/radio_unchecked_focus.png + rc/radio_unchecked_focus@2x.png + rc/radio_unchecked_pressed.png + rc/radio_unchecked_pressed@2x.png + rc/toolbar_move_horizontal.png + rc/toolbar_move_horizontal@2x.png + rc/toolbar_move_horizontal_disabled.png + rc/toolbar_move_horizontal_disabled@2x.png + rc/toolbar_move_horizontal_focus.png + rc/toolbar_move_horizontal_focus@2x.png + rc/toolbar_move_horizontal_pressed.png + rc/toolbar_move_horizontal_pressed@2x.png + rc/toolbar_move_vertical.png + rc/toolbar_move_vertical@2x.png + rc/toolbar_move_vertical_disabled.png + rc/toolbar_move_vertical_disabled@2x.png + rc/toolbar_move_vertical_focus.png + rc/toolbar_move_vertical_focus@2x.png + rc/toolbar_move_vertical_pressed.png + rc/toolbar_move_vertical_pressed@2x.png + rc/toolbar_separator_horizontal.png + rc/toolbar_separator_horizontal@2x.png + rc/toolbar_separator_horizontal_disabled.png + rc/toolbar_separator_horizontal_disabled@2x.png + rc/toolbar_separator_horizontal_focus.png + rc/toolbar_separator_horizontal_focus@2x.png + rc/toolbar_separator_horizontal_pressed.png + rc/toolbar_separator_horizontal_pressed@2x.png + rc/toolbar_separator_vertical.png + rc/toolbar_separator_vertical@2x.png + rc/toolbar_separator_vertical_disabled.png + rc/toolbar_separator_vertical_disabled@2x.png + rc/toolbar_separator_vertical_focus.png + rc/toolbar_separator_vertical_focus@2x.png + rc/toolbar_separator_vertical_pressed.png + rc/toolbar_separator_vertical_pressed@2x.png + rc/transparent.png + rc/transparent@2x.png + rc/transparent_disabled.png + rc/transparent_disabled@2x.png + rc/transparent_focus.png + rc/transparent_focus@2x.png + rc/transparent_pressed.png + rc/transparent_pressed@2x.png + rc/window_close.png + rc/window_close@2x.png + rc/window_close_disabled.png + rc/window_close_disabled@2x.png + rc/window_close_focus.png + rc/window_close_focus@2x.png + rc/window_close_pressed.png + rc/window_close_pressed@2x.png + rc/window_grip.png + rc/window_grip@2x.png + rc/window_grip_disabled.png + rc/window_grip_disabled@2x.png + rc/window_grip_focus.png + rc/window_grip_focus@2x.png + rc/window_grip_pressed.png + rc/window_grip_pressed@2x.png + rc/window_minimize.png + rc/window_minimize@2x.png + rc/window_minimize_disabled.png + rc/window_minimize_disabled@2x.png + rc/window_minimize_focus.png + rc/window_minimize_focus@2x.png + rc/window_minimize_pressed.png + rc/window_minimize_pressed@2x.png + rc/window_undock.png + rc/window_undock@2x.png + rc/window_undock_disabled.png + rc/window_undock_disabled@2x.png + rc/window_undock_focus.png + rc/window_undock_focus@2x.png + rc/window_undock_pressed.png + rc/window_undock_pressed@2x.png + + + diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/.keep b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/.keep new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/.keep @@ -0,0 +1 @@ + diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down.png new file mode 100644 index 000000000..f07aa76f0 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down@2x.png new file mode 100644 index 000000000..b16b9df17 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_disabled.png new file mode 100644 index 000000000..d94e55b95 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_disabled@2x.png new file mode 100644 index 000000000..a1bc87416 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_focus.png new file mode 100644 index 000000000..fcd681205 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_focus@2x.png new file mode 100644 index 000000000..a0463e5e9 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_pressed.png new file mode 100644 index 000000000..bbe79a97e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_pressed@2x.png new file mode 100644 index 000000000..28ae890ae Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_down_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left.png new file mode 100644 index 000000000..070870107 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left@2x.png new file mode 100644 index 000000000..c067c7ac1 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_disabled.png new file mode 100644 index 000000000..76ae59b10 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_disabled@2x.png new file mode 100644 index 000000000..815f33c07 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_focus.png new file mode 100644 index 000000000..c0856669a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_focus@2x.png new file mode 100644 index 000000000..48af7238c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_pressed.png new file mode 100644 index 000000000..f47340e3c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_pressed@2x.png new file mode 100644 index 000000000..51b5b7a07 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_left_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right.png new file mode 100644 index 000000000..45f7857e5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right@2x.png new file mode 100644 index 000000000..bafdf16c9 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_disabled.png new file mode 100644 index 000000000..82d1dd284 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_disabled@2x.png new file mode 100644 index 000000000..8d95d8323 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_focus.png new file mode 100644 index 000000000..3b3c1b6f8 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_focus@2x.png new file mode 100644 index 000000000..8a3870bdd Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_pressed.png new file mode 100644 index 000000000..b4176d59d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_pressed@2x.png new file mode 100644 index 000000000..24dfe4e19 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_right_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up.png new file mode 100644 index 000000000..7e185babf Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up@2x.png new file mode 100644 index 000000000..6925245e3 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_disabled.png new file mode 100644 index 000000000..54394e210 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_disabled@2x.png new file mode 100644 index 000000000..0f582d323 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_focus.png new file mode 100644 index 000000000..4bc54733f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_focus@2x.png new file mode 100644 index 000000000..bdf7f6b2d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_pressed.png new file mode 100644 index 000000000..04bc9e4ec Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_pressed@2x.png new file mode 100644 index 000000000..cd6231f26 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/arrow_up_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon.png new file mode 100644 index 000000000..1aeed5554 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon@2x.png new file mode 100644 index 000000000..f42fc6610 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_disabled.png new file mode 100644 index 000000000..1aeed5554 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_disabled@2x.png new file mode 100644 index 000000000..f42fc6610 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_focus.png new file mode 100644 index 000000000..1aeed5554 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_focus@2x.png new file mode 100644 index 000000000..f42fc6610 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_pressed.png new file mode 100644 index 000000000..1aeed5554 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_pressed@2x.png new file mode 100644 index 000000000..f42fc6610 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/base_icon_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed.png new file mode 100644 index 000000000..f41c767e6 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed@2x.png new file mode 100644 index 000000000..24bb5fba2 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_disabled.png new file mode 100644 index 000000000..2a6b24dea Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_disabled@2x.png new file mode 100644 index 000000000..91d7d6518 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_focus.png new file mode 100644 index 000000000..2058d895f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_focus@2x.png new file mode 100644 index 000000000..18d665af9 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_pressed.png new file mode 100644 index 000000000..35f982fab Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_pressed@2x.png new file mode 100644 index 000000000..2008d6256 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_closed_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end.png new file mode 100644 index 000000000..6b0bfe03d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end@2x.png new file mode 100644 index 000000000..9ce5439cb Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_disabled.png new file mode 100644 index 000000000..dfa9baa8d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_disabled@2x.png new file mode 100644 index 000000000..8ef19e30d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_focus.png new file mode 100644 index 000000000..85f17bad7 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_focus@2x.png new file mode 100644 index 000000000..d756b2919 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_pressed.png new file mode 100644 index 000000000..7a868658e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_pressed@2x.png new file mode 100644 index 000000000..561e6ebf6 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_end_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line.png new file mode 100644 index 000000000..e55608ddc Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line@2x.png new file mode 100644 index 000000000..59967fd60 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_disabled.png new file mode 100644 index 000000000..d758b7b6c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_disabled@2x.png new file mode 100644 index 000000000..a35c3a66d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_focus.png new file mode 100644 index 000000000..800cc587c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_focus@2x.png new file mode 100644 index 000000000..7d21d64a9 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_pressed.png new file mode 100644 index 000000000..638046579 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_pressed@2x.png new file mode 100644 index 000000000..7ca30cd61 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_line_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more.png new file mode 100644 index 000000000..140129295 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more@2x.png new file mode 100644 index 000000000..5a3b1e98f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_disabled.png new file mode 100644 index 000000000..d801611bb Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_disabled@2x.png new file mode 100644 index 000000000..2505e2a7c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_focus.png new file mode 100644 index 000000000..be5b2cbfa Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_focus@2x.png new file mode 100644 index 000000000..ca0f99e0e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_pressed.png new file mode 100644 index 000000000..6e744b78e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_pressed@2x.png new file mode 100644 index 000000000..fdaf01f03 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_more_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open.png new file mode 100644 index 000000000..e43b940cb Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open@2x.png new file mode 100644 index 000000000..691e38c18 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_disabled.png new file mode 100644 index 000000000..9e445449e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_disabled@2x.png new file mode 100644 index 000000000..246bdbbed Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_focus.png new file mode 100644 index 000000000..a4b332e3e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_focus@2x.png new file mode 100644 index 000000000..27c8dcacf Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_pressed.png new file mode 100644 index 000000000..205f9414e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_pressed@2x.png new file mode 100644 index 000000000..d09878a61 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/branch_open_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked.png new file mode 100644 index 000000000..f63f2b38f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked@2x.png new file mode 100644 index 000000000..7617ed7dc Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_disabled.png new file mode 100644 index 000000000..2eab1ba0c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_disabled@2x.png new file mode 100644 index 000000000..518d55d5e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_focus.png new file mode 100644 index 000000000..fccb71edc Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_focus@2x.png new file mode 100644 index 000000000..e12217d0a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_pressed.png new file mode 100644 index 000000000..d93ca9903 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_pressed@2x.png new file mode 100644 index 000000000..7ee1d3514 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_checked_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate.png new file mode 100644 index 000000000..8f4d0f161 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate@2x.png new file mode 100644 index 000000000..3d106399b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_disabled.png new file mode 100644 index 000000000..0a093c819 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_disabled@2x.png new file mode 100644 index 000000000..06db251f9 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_focus.png new file mode 100644 index 000000000..33fd572bd Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_focus@2x.png new file mode 100644 index 000000000..691ddf1da Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_pressed.png new file mode 100644 index 000000000..2aff90928 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_pressed@2x.png new file mode 100644 index 000000000..fb4e03861 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_indeterminate_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked.png new file mode 100644 index 000000000..3c0608784 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked@2x.png new file mode 100644 index 000000000..fa0648786 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_disabled.png new file mode 100644 index 000000000..bba927e50 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_disabled@2x.png new file mode 100644 index 000000000..592d5949a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_focus.png new file mode 100644 index 000000000..7e460184a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_focus@2x.png new file mode 100644 index 000000000..3f96917b5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_pressed.png new file mode 100644 index 000000000..5fd771d1a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_pressed@2x.png new file mode 100644 index 000000000..57f25fbae Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/checkbox_unchecked_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal.png new file mode 100644 index 000000000..22a0b1e2b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal@2x.png new file mode 100644 index 000000000..8bd474944 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_disabled.png new file mode 100644 index 000000000..3dc9c69e0 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_disabled@2x.png new file mode 100644 index 000000000..a2d3664af Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_focus.png new file mode 100644 index 000000000..136faa84c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_focus@2x.png new file mode 100644 index 000000000..398d22432 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_pressed.png new file mode 100644 index 000000000..e2027b14e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_pressed@2x.png new file mode 100644 index 000000000..24b83299b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_horizontal_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical.png new file mode 100644 index 000000000..0a4c5f364 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical@2x.png new file mode 100644 index 000000000..e67ccf52b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_disabled.png new file mode 100644 index 000000000..9700752d9 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_disabled@2x.png new file mode 100644 index 000000000..0f57c568f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_focus.png new file mode 100644 index 000000000..15ef20825 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_focus@2x.png new file mode 100644 index 000000000..a35e97ed0 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_pressed.png new file mode 100644 index 000000000..7399cd38e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_pressed@2x.png new file mode 100644 index 000000000..e018b9af8 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/line_vertical_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked.png new file mode 100644 index 000000000..878b6c53c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked@2x.png new file mode 100644 index 000000000..ed20cd4cf Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_disabled.png new file mode 100644 index 000000000..1aa26ee00 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_disabled@2x.png new file mode 100644 index 000000000..72b69d59b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_focus.png new file mode 100644 index 000000000..90a54c6e1 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_focus@2x.png new file mode 100644 index 000000000..81771885f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_pressed.png new file mode 100644 index 000000000..10170e374 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_pressed@2x.png new file mode 100644 index 000000000..378608298 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_checked_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked.png new file mode 100644 index 000000000..639a55480 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked@2x.png new file mode 100644 index 000000000..a2f23fd6f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_disabled.png new file mode 100644 index 000000000..6f7424ca7 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_disabled@2x.png new file mode 100644 index 000000000..bf9330f24 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_focus.png new file mode 100644 index 000000000..2316d7872 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_focus@2x.png new file mode 100644 index 000000000..9695890ba Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_pressed.png new file mode 100644 index 000000000..2f2a7ba21 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_pressed@2x.png new file mode 100644 index 000000000..22a7e7139 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/radio_unchecked_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal.png new file mode 100644 index 000000000..a1109caf8 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal@2x.png new file mode 100644 index 000000000..69bb6347d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_disabled.png new file mode 100644 index 000000000..e11055a6a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_disabled@2x.png new file mode 100644 index 000000000..9085b627e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_focus.png new file mode 100644 index 000000000..3c0be5a0e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_focus@2x.png new file mode 100644 index 000000000..f01973d05 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_pressed.png new file mode 100644 index 000000000..94c0f5b6d Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_pressed@2x.png new file mode 100644 index 000000000..612ea774f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_horizontal_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical.png new file mode 100644 index 000000000..b16c48c40 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical@2x.png new file mode 100644 index 000000000..853962cd6 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_disabled.png new file mode 100644 index 000000000..9b3caec07 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_disabled@2x.png new file mode 100644 index 000000000..bdda6796a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_focus.png new file mode 100644 index 000000000..6a432a4ba Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_focus@2x.png new file mode 100644 index 000000000..817a8da55 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_pressed.png new file mode 100644 index 000000000..50228af7b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_pressed@2x.png new file mode 100644 index 000000000..1946791ad Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_move_vertical_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal.png new file mode 100644 index 000000000..f6661b4b1 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal@2x.png new file mode 100644 index 000000000..77cadc217 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_disabled.png new file mode 100644 index 000000000..a65e13e46 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_disabled@2x.png new file mode 100644 index 000000000..77b9abcaf Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_focus.png new file mode 100644 index 000000000..843633ffa Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_focus@2x.png new file mode 100644 index 000000000..21d4011fc Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_pressed.png new file mode 100644 index 000000000..edf05752f Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_pressed@2x.png new file mode 100644 index 000000000..977ec62a9 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_horizontal_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical.png new file mode 100644 index 000000000..2776d87b5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical@2x.png new file mode 100644 index 000000000..ab9e773a8 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_disabled.png new file mode 100644 index 000000000..cb443940b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_disabled@2x.png new file mode 100644 index 000000000..f4e241ab2 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_focus.png new file mode 100644 index 000000000..4a45d55c0 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_focus@2x.png new file mode 100644 index 000000000..c58d8d120 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_pressed.png new file mode 100644 index 000000000..408fa169a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_pressed@2x.png new file mode 100644 index 000000000..92feb3652 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/toolbar_separator_vertical_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent.png new file mode 100644 index 000000000..3a95111e5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent@2x.png new file mode 100644 index 000000000..4c4b95225 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_disabled.png new file mode 100644 index 000000000..3a95111e5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_disabled@2x.png new file mode 100644 index 000000000..4c4b95225 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_focus.png new file mode 100644 index 000000000..3a95111e5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_focus@2x.png new file mode 100644 index 000000000..4c4b95225 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_pressed.png new file mode 100644 index 000000000..3a95111e5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_pressed@2x.png new file mode 100644 index 000000000..4c4b95225 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/transparent_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close.png new file mode 100644 index 000000000..607170bae Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close@2x.png new file mode 100644 index 000000000..607f894a6 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_disabled.png new file mode 100644 index 000000000..449deec63 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_disabled@2x.png new file mode 100644 index 000000000..eda9fb4ce Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_focus.png new file mode 100644 index 000000000..1cd49c73e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_focus@2x.png new file mode 100644 index 000000000..a13da2129 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_pressed.png new file mode 100644 index 000000000..c5e2a9143 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_pressed@2x.png new file mode 100644 index 000000000..278288ed1 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_close_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip.png new file mode 100644 index 000000000..c03b1dce3 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip@2x.png new file mode 100644 index 000000000..7074bd6d2 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_disabled.png new file mode 100644 index 000000000..3c479884b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_disabled@2x.png new file mode 100644 index 000000000..eb4a063a7 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_focus.png new file mode 100644 index 000000000..46c77d37a Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_focus@2x.png new file mode 100644 index 000000000..f487c6adb Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_pressed.png new file mode 100644 index 000000000..a4d075905 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_pressed@2x.png new file mode 100644 index 000000000..54dc3d8a8 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_grip_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize.png new file mode 100644 index 000000000..9e1a7f12c Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize@2x.png new file mode 100644 index 000000000..dcd2570cc Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_disabled.png new file mode 100644 index 000000000..9fd0ef169 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_disabled@2x.png new file mode 100644 index 000000000..251cefcce Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_focus.png new file mode 100644 index 000000000..4d748783b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_focus@2x.png new file mode 100644 index 000000000..97901fed5 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_pressed.png new file mode 100644 index 000000000..78de6557b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_pressed@2x.png new file mode 100644 index 000000000..6b961459b Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_minimize_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock.png new file mode 100644 index 000000000..4da192f33 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock@2x.png new file mode 100644 index 000000000..5cfe75ccc Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_disabled.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_disabled.png new file mode 100644 index 000000000..b0db9c7a7 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_disabled.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_disabled@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_disabled@2x.png new file mode 100644 index 000000000..9468c9f32 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_disabled@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_focus.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_focus.png new file mode 100644 index 000000000..85fb0468e Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_focus.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_focus@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_focus@2x.png new file mode 100644 index 000000000..e13b2f075 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_focus@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_pressed.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_pressed.png new file mode 100644 index 000000000..d368cc9ad Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_pressed.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_pressed@2x.png b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_pressed@2x.png new file mode 100644 index 000000000..b30f0dbb6 Binary files /dev/null and b/retroshare-gui/src/gui/qss/stylesheet/qdarkstyle/light/rc/window_undock_pressed@2x.png differ diff --git a/retroshare-gui/src/gui/qss/stylesheet/qss.default b/retroshare-gui/src/gui/qss/stylesheet/qss.default deleted file mode 100644 index 7e1ecf8b2..000000000 --- a/retroshare-gui/src/gui/qss/stylesheet/qss.default +++ /dev/null @@ -1,275 +0,0 @@ -/* Default stylesheet - This file is used as default for all stylesheets and can be overloaded */ - -/* AvatarWidget */ - -AvatarWidget{border-width: 10px;} -AvatarWidget[frameState="NORMAL"]{border-image:url(:/images/avatarstatus-bg-116.png);} -AvatarWidget[frameState="OFFLINE"]{border-image:url(:/images/avatarstatus-bg-offline-116.png);} -AvatarWidget[frameState="INACTIVE"]{border-image:url(:/images/avatarstatus-bg-idle-116.png);} -AvatarWidget[frameState="ONLINE"]{border-image:url(:/images/avatarstatus-bg-online-116.png);} -AvatarWidget[frameState="AWAY"]{border-image:url(:/images/avatarstatus-bg-away-116.png);} -AvatarWidget[frameState="BUSY"]{border-image:url(:/images/avatarstatus-bg-busy-116.png);} - -/* Font */ - -QLabel#titleBarLabel -{ - font-weight: bold; - qproperty-fontSizeFactor: 115; -} - -QLabel#toasterLabel -{ - font-weight: bold; -} - -ChatWidget QLabel#titleLabel, ChatWidget QLabel#statusLabel -{ - qproperty-fontSizeFactor: 125; -} - -ChatWidget QFrame#pluginTitleFrame, QFrame#pluginTopFrame -{ - background: transparent; -} - -FriendsDialog QLabel#nicknameLabel -{ - qproperty-fontSizeFactor: 200; -} - -ChatMsgItem QLabel#peerNameLabel -{ - qproperty-fontSizeFactor: 175; -} - -PeerItem QLabel#peerNameLabel -{ - qproperty-fontSizeFactor: 175; -} - -SecurityItem QLabel#peerNameLabel, SecurityItem QLabel#requestLabel -{ - qproperty-fontSizeFactor: 175; -} - -SecurityIpItem QLabel#titleLabel -{ - qproperty-fontSizeFactor: 175; -} - -PostedItem QLabel#titleLabel -{ - qproperty-fontSizeFactor: 120; -} - -PostedItem QLabel#scoreLabel -{ - qproperty-fontSizeFactor: 140; -} - -GxsChannelPostItem QLabel#titleLabel -{ - qproperty-fontSizeFactor: 125; -} - -PluginItem QLabel#subjectLabel -{ - qproperty-fontSizeFactor: 125; -} - -RSettingsWin QLabel#pageName -{ - qproperty-fontSizeFactor: 125; -} - -ConfCertDialog QLabel#servicePermissionsLabel -{ - qproperty-fontSizeFactor: 125; -} - -GxsChannelPostsWidgetWithModel QLabel#channelName_LB -{ - qproperty-fontSizeFactor: 250; -} - -PostedListWidgetWithModel QLabel#namelabel -{ - qproperty-fontSizeFactor: 250; -} - -CreateLobbyDialog QLabel#lobbyInfoLabel -{ - qproperty-fontSizeFactor: 150; -} - -HeaderFrame QLabel#headerLabel -{ - qproperty-fontSizeFactor: 225; -} - -ConnectFrientWizard QLabel#fr_label -{ - qproperty-fontSizeFactor: 125; -} - -ConnectFrientWizard QLabel#requestinfolabel -{ - qproperty-fontSizeFactor: 125; -} - -ShareManager QLabel#labelInstructions -{ - qproperty-fontSizeFactor: 125; -} - -CryptoPage QLabel#publicLabel, CryptoPage QLabel#otherLabel -{ - qproperty-fontSizeFactor: 125; -} - -ProfileWidget QLabel#publicLabel, ProfileWidget QLabel#otherLabel, ProfileWidget QLabel#myLabel -{ - qproperty-fontSizeFactor: 125; -} - -PostedCreatePostDialog QLabel#info_label -{ - qproperty-fontSizeFactor: 125; -} - -/* Color definitions */ - -ForumsDialog, GxsForumThreadWidget -{ - qproperty-textColorRead: darkgray; - qproperty-textColorUnread: black; - qproperty-textColorUnreadChildren: darkgray; - qproperty-textColorNotSubscribed: black; - qproperty-textColorMissing: darkRed; - qproperty-textColorPinned: darkOrange; - - qproperty-backgroundColorPinned: rgb(255, 200, 180); - qproperty-backgroundColorFiltered: rgb(255, 240, 210); -} - -GxsForumThreadWidget StyledElidedLabel#forumName -{ - padding: 2px; - font: bold; - font-size: 15pt; -} - -GroupTreeWidget -{ - qproperty-textColorCategory: rgb(79, 79, 79); - qproperty-textColorPrivateKey: rgb(35,91,159); -} - -FriendSelectionWidget -{ - qproperty-textColorOnline: blue; -} - -MessagesDialog -{ - qproperty-textColorInbox: rgb(49, 106, 197); -} - -NewFriendList -{ - qproperty-textColorStatusOffline: black; - qproperty-textColorStatusAway: gray; - qproperty-textColorStatusBusy: gray; - qproperty-textColorStatusOnline: darkGreen; - qproperty-textColorStatusInactive: gray; - qproperty-textColorGroup: rgb(123, 123, 123); -} - -SearchDialog -{ - qproperty-textColorLocal: red; - qproperty-textColorDownloading: green; - qproperty-textColorNoSources: rgb(0, 0, 19); - qproperty-textColorLowSources: rgb(0, 0, 38); - qproperty-textColorHighSources: rgb(0, 0, 228); -} - -NetworkDialog -{ - qproperty-backgroundColorSelf: yellow; - qproperty-backgroundColorOwnSign: rgb(69, 255, 69); - qproperty-backgroundColorAcceptConnection: rgb(67, 192, 67); - qproperty-backgroundColorHasSignedMe: rgb(178, 66, 178); - qproperty-backgroundColorDenied: lightGray; -} - -RSTextBrowser, MimeTextEdit -{ - /*qproperty-textColorQuote: rgb(120, 153, 34);*/ - qproperty-textColorQuotes: ColorList(#789922 #039bd5 #800000 #800080 #008080 #b10dc9 #85144b #3d9970); -} - -QLabel#headerTextLabel_Person -{ - qproperty-fontSizeFactor: 225; -} - -QLabel#headerTextLabel_Circles -{ - qproperty-fontSizeFactor: 225; -} - -IdEditDialog QLabel#info_label -{ - qproperty-fontSizeFactor: 125; -} - -GenCertDialog QLabel#header_label -{ - qproperty-fontSizeFactor: 120; -} - -GenCertDialog QLabel#genprofileinfo_label -{ - qproperty-fontSizeFactor: 120; -} - -GenCertDialog QLabel#entropy_label -{ - qproperty-fontSizeFactor: 115; -} - -/* OpModeStatus need to be at end to overload other values*/ -OpModeStatus { - qproperty-opMode_Full_Color: #CCFFCC; - qproperty-opMode_NoTurtle_Color: #CCCCFF; - qproperty-opMode_Gaming_Color: #FFFFCC; - qproperty-opMode_Minimal_Color: #FFCCCC; -} -OpModeStatus[opMode="Full"] { - background: #CCFFCC; -} -OpModeStatus[opMode="NoTurtle"] { - background: #CCCCFF; -} -OpModeStatus[opMode="Gaming"] { - background: #FFFFCC; -} -OpModeStatus[opMode="Minimal"] { - background: #FFCCCC; -} - -/*Property Values at end to overwrite other settings*/ - -[new=false] { - background: #F8F8F8; -} -[new=true] { - background: #DCECFD; -} - -[WrongValue="true"] { - background-color: #FF8080; -} diff --git a/retroshare-gui/src/gui/settings/AppearancePage.cpp b/retroshare-gui/src/gui/settings/AppearancePage.cpp index 407d5c061..2fb86e5a2 100755 --- a/retroshare-gui/src/gui/settings/AppearancePage.cpp +++ b/retroshare-gui/src/gui/settings/AppearancePage.cpp @@ -18,20 +18,13 @@ * * *******************************************************************************/ -#include -#include -#include -#include -#include -#include - -#include "lang/languagesupport.h" -#include #include "AppearancePage.h" -#include "rsharesettings.h" -#include "util/misc.h" + +#include "rshare.h" #include "gui/MainWindow.h" #include "gui/notifyqt.h" +#include "gui/common/FilesDefs.h" +#include "gui/settings/rsharesettings.h" #include "gui/statusbar/peerstatus.h" #include "gui/statusbar/natstatus.h" #include "gui/statusbar/dhtstatus.h" @@ -42,7 +35,18 @@ #include "gui/statusbar/SoundStatus.h" #include "gui/statusbar/ToasterDisable.h" #include "gui/statusbar/SysTrayStatus.h" -#include "gui/common/FilesDefs.h" +#include "lang/languagesupport.h" +#include "util/misc.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include /** Constructor */ AppearancePage::AppearancePage(QWidget * parent, Qt::WindowFlags flags) @@ -51,8 +55,6 @@ AppearancePage::AppearancePage(QWidget * parent, Qt::WindowFlags flags) /* Invoke the Qt Designer generated object setup routine */ ui.setupUi(this); - connect(ui.cmboStyleSheet, SIGNAL(activated(int)), this, SLOT(loadStyleSheet(int))); - connect(ui.grpStatus, SIGNAL(toggled(bool)), this /* pMainWindow->statusBar(), */, SLOT(switch_status_grpStatus(bool))); connect(ui.checkBoxStatusCompactMode, SIGNAL(toggled(bool)), this /* pMainWindow, */, SLOT(switch_status_compactMode(bool))); connect(ui.checkBoxDisableSysTrayToolTip, SIGNAL(toggled(bool)), this /* pMainWindow, */, SLOT(switch_status_showToolTip(bool))); @@ -70,15 +72,12 @@ AppearancePage::AppearancePage(QWidget * parent, Qt::WindowFlags flags) /* Populate combo boxes */ foreach (QString code, LanguageSupport::languageCodes()) { - ui.cmboLanguage->addItem(FilesDefs::getIconFromQtResourcePath(":/images/flags/" + code + ".png"), LanguageSupport::languageName(code), code); + ui.cmboLanguage->addItem(FilesDefs::getIconFromQtResourcePath(":/images/flags/" + code + ".png"), LanguageSupport::languageName(code), code); } foreach (QString style, QStyleFactory::keys()) { ui.cmboStyle->addItem(style, style.toLower()); } - // add empty entry representing "no style sheet" - ui.cmboStyleSheet->addItem("", ""); - QMap styleSheets; Rshare::getAvailableStyleSheets(styleSheets); @@ -92,7 +91,8 @@ AppearancePage::AppearancePage(QWidget * parent, Qt::WindowFlags flags) connect(ui.cmboLanguage, SIGNAL(currentIndexChanged(int)), this, SLOT(updateLanguageCode() )); connect(ui.cmboStyle, SIGNAL(currentIndexChanged(int)), this, SLOT(updateInterfaceStyle() )); connect(ui.cmboStyleSheet, SIGNAL(currentIndexChanged(int)), this, SLOT(updateSheetName() )); - connect(ui.checkBoxDisableSysTrayToolTip, SIGNAL(toggled(bool)), this, SLOT(updateStatusToolTip() )); + connect(ui.cmboStyleSheet, SIGNAL(activated(int)) , this, SLOT(loadStyleSheet(int) )); + connect(ui.checkBoxDisableSysTrayToolTip, SIGNAL(toggled(bool)) , this, SLOT(updateStatusToolTip() )); connect(ui.mainPageButtonType_CB, SIGNAL(currentIndexChanged(int)), this, SLOT(updateRbtPageOnToolBar() )); // connect(ui.menuItemsButtonType_CB, SIGNAL(currentIndexChanged(int)), this, SLOT(updateActionButtonLoc() )); @@ -128,10 +128,31 @@ void AppearancePage::switch_status(MainWindow::StatusElement s,const QString& ke void AppearancePage::updateLanguageCode() { Settings->setLanguageCode(LanguageSupport::languageCode(ui.cmboLanguage->currentText())); } void AppearancePage::updateInterfaceStyle() { - Rshare::setStyle(ui.cmboStyle->currentText()); - Settings->setInterfaceStyle(ui.cmboStyle->currentText()); +#ifndef QT_NO_CURSOR + QApplication::setOverrideCursor(Qt::WaitCursor); +#endif + Rshare::setStyle(ui.cmboStyle->currentText()); + Settings->setInterfaceStyle(ui.cmboStyle->currentText()); +#ifndef QT_NO_CURSOR + QApplication::restoreOverrideCursor(); +#endif } -void AppearancePage::updateSheetName() { Settings->setSheetName(ui.cmboStyleSheet->itemData(ui.cmboStyleSheet->currentIndex()).toString()); } +void AppearancePage::updateSheetName() +{ + Settings->setSheetName(ui.cmboStyleSheet->itemData(ui.cmboStyleSheet->currentIndex()).toString()); +} + +void AppearancePage::loadStyleSheet(int index) +{ +#ifndef QT_NO_CURSOR + QApplication::setOverrideCursor(Qt::WaitCursor); +#endif + Rshare::loadStyleSheet(ui.cmboStyleSheet->itemData(index).toString()); +#ifndef QT_NO_CURSOR + QApplication::restoreOverrideCursor(); +#endif +} + void AppearancePage::updateRbtPageOnToolBar() { Settings->setPageButtonLoc(!ui.mainPageButtonType_CB->currentIndex()); @@ -334,8 +355,3 @@ void AppearancePage::load() whileBlocking(ui.checkBoxShowSystrayOnStatus)->setChecked(Settings->valueFromGroup("StatusBar", "ShowSysTrayOnStatusBar", QVariant(false)).toBool()); } - -void AppearancePage::loadStyleSheet(int index) -{ - Rshare::loadStyleSheet(ui.cmboStyleSheet->itemData(index).toString()); -} diff --git a/retroshare-gui/src/gui/settings/AppearancePage.ui b/retroshare-gui/src/gui/settings/AppearancePage.ui index a06a4933e..96e5effe8 100755 --- a/retroshare-gui/src/gui/settings/AppearancePage.ui +++ b/retroshare-gui/src/gui/settings/AppearancePage.ui @@ -45,7 +45,7 @@ - + 150 @@ -105,7 +105,7 @@ - + 150 @@ -146,7 +146,7 @@ - + 150 @@ -209,7 +209,7 @@ - + Buttons @@ -253,7 +253,7 @@ 0 - + Icon Only @@ -303,7 +303,7 @@
- + Icon Size = 8x8 @@ -466,6 +466,13 @@
+ + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
diff --git a/retroshare-gui/src/gui/settings/ChatPage.cpp b/retroshare-gui/src/gui/settings/ChatPage.cpp index 357f2698c..b240e216d 100644 --- a/retroshare-gui/src/gui/settings/ChatPage.cpp +++ b/retroshare-gui/src/gui/settings/ChatPage.cpp @@ -18,26 +18,27 @@ * * *******************************************************************************/ +#include "ChatPage.h" + +#include "rsharesettings.h" +#include "gui/MainWindow.h" +#include "gui/notifyqt.h" +#include "gui/RetroShareLink.h" +#include "gui/chat/ChatDialog.h" +#include "util/misc.h" + +#include "retroshare/rsconfig.h" +#include "retroshare/rshistory.h" +#include "retroshare/rsmsgs.h" +#include "retroshare/rsnotify.h" +#include "retroshare/rspeers.h" + #include #include #include + #include -#include -#include -#include -#include "ChatPage.h" -#include "gui/MainWindow.h" -#include -#include "gui/chat/ChatDialog.h" -#include "gui/notifyqt.h" -#include "rsharesettings.h" -#include "util/misc.h" -#include - -#include -#include - #define VARIANT_STANDARD "Standard" #define IMAGE_CHAT_CREATE ":/icons/png/add.png" #define IMAGE_CHAT_OPEN ":/icons/png/typing.png" @@ -295,6 +296,29 @@ ChatPage::ChatPage(QWidget * parent, Qt::WindowFlags flags) connect(ui.privateStyle, SIGNAL(currentIndexChanged(int)), this,SLOT(on_privateList_currentRowChanged(int))); connect(ui.historyStyle, SIGNAL(currentIndexChanged(int)), this,SLOT(on_historyList_currentRowChanged(int))); + //Resize system size square + qreal logicalPPCX = ui.systemSize_Frame->logicalDpiX()/2.54; + qreal logicalPPCY = ui.systemSize_Frame->logicalDpiY()/2.54; + + ui.systemSize_Frame->setMinimumSize(logicalPPCX,logicalPPCY); + ui.systemSize_Frame->setMaximumSize(logicalPPCX,logicalPPCY); + ui.systemSize_Frame->setToolTip(QString("Your system reports a screen with %1 DPI (Dots Per Inches) = %2 PPC (Pixels Per Centimeters).") + .arg(ui.systemSize_Frame->logicalDpiX()).arg(logicalPPCX)); + + //Resize system font size square + qreal ptFontSize = (qreal)QApplication::font().pointSize(); + qreal pxFontSize = (qreal)QFontMetrics(QApplication::font()).height(); + qreal px1ptSize = pxFontSize / ptFontSize; + //1 pt = 1/72 inch = 2.54/72 cm + qreal px1cmSize = (px1ptSize * 72.0) / 2.54; + + ui.systemFontSize_Frame->setMinimumSize(px1cmSize,px1cmSize); + ui.systemFontSize_Frame->setMaximumSize(px1cmSize,px1cmSize); + + ui.systemFontSize_Frame->setToolTip(QString("Your default font is %1 points high = %2 mm. Qt print it with %3 pixels.\nSo Font use %4 PPC (Pixels Per Centimeters).") + .arg(ptFontSize).arg((ptFontSize*25.4)/72.0).arg(pxFontSize).arg(px1cmSize)); + + /* Add user notify */ const QList &userNotifyList = MainWindow::getInstance()->getUserNotifyList() ; QList::const_iterator it; diff --git a/retroshare-gui/src/gui/settings/ChatPage.ui b/retroshare-gui/src/gui/settings/ChatPage.ui index 484a632f8..f33362563 100644 --- a/retroshare-gui/src/gui/settings/ChatPage.ui +++ b/retroshare-gui/src/gui/settings/ChatPage.ui @@ -395,6 +395,78 @@
+ + + + + + If your system is set up correctly, this next square should measure 1 cm. + + + true + + + + + + + + 64 + 64 + + + + + 64 + 64 + + + + QFrame::Box + + + QFrame::Plain + + + + + + + + + + + This next square is scaled accordingly to your system font size. + + + true + + + + + + + + 64 + 64 + + + + + 64 + 64 + + + + QFrame::Box + + + QFrame::Plain + + + + + @@ -527,7 +599,7 @@ - + @@ -543,7 +615,7 @@ - + 0 @@ -644,7 +716,7 @@ - + Everyone @@ -725,7 +797,7 @@ - + @@ -741,7 +813,7 @@ - + 0 @@ -1176,7 +1248,7 @@ - + @@ -1192,7 +1264,7 @@ - + 0 @@ -1285,6 +1357,11 @@ QComboBox
gui/gxs/GxsIdChooser.h
+ + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
diff --git a/retroshare-gui/src/gui/settings/CryptoPage.ui b/retroshare-gui/src/gui/settings/CryptoPage.ui index 6f45b9ea8..86b8e38b9 100755 --- a/retroshare-gui/src/gui/settings/CryptoPage.ui +++ b/retroshare-gui/src/gui/settings/CryptoPage.ui @@ -211,9 +211,10 @@
- + + 12 75 true @@ -302,9 +303,10 @@ - + + 12 75 true @@ -396,9 +398,10 @@ - + + 12 75 true @@ -638,13 +641,6 @@
- - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
-
diff --git a/retroshare-gui/src/gui/settings/MessagePage.ui b/retroshare-gui/src/gui/settings/MessagePage.ui index 58da48b9f..fd55218e8 100644 --- a/retroshare-gui/src/gui/settings/MessagePage.ui +++ b/retroshare-gui/src/gui/settings/MessagePage.ui @@ -24,7 +24,7 @@ - + Everyone @@ -75,7 +75,7 @@ - +
@@ -174,6 +174,13 @@
+ + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
diff --git a/retroshare-gui/src/gui/settings/NotifyPage.ui b/retroshare-gui/src/gui/settings/NotifyPage.ui index 8abfa09d9..fba357bcf 100755 --- a/retroshare-gui/src/gui/settings/NotifyPage.ui +++ b/retroshare-gui/src/gui/settings/NotifyPage.ui @@ -382,7 +382,7 @@ - + 0 @@ -495,6 +495,13 @@ systray_ChatLobby pushButtonDisableAll + + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
diff --git a/retroshare-gui/src/gui/settings/PluginItem.ui b/retroshare-gui/src/gui/settings/PluginItem.ui index 063c27377..202baf819 100644 --- a/retroshare-gui/src/gui/settings/PluginItem.ui +++ b/retroshare-gui/src/gui/settings/PluginItem.ui @@ -10,12 +10,21 @@ 177
- - + + + 0 + + + 0 + + + 0 + + 0 - + true @@ -28,11 +37,11 @@ QFrame::StyledPanel - + - + - + QLayout::SetDefaultConstraint @@ -73,16 +82,22 @@ - + + + + 75 + true + + TextLabel - + 0 @@ -91,6 +106,7 @@ + 12 75 true @@ -104,7 +120,7 @@ - + @@ -140,7 +156,7 @@ p, li { white-space: pre-wrap; } - + Qt::Horizontal @@ -196,7 +212,7 @@ p, li { white-space: pre-wrap; } - + @@ -205,9 +221,9 @@ p, li { white-space: pre-wrap; } QFrame::Raised - + - + File name: @@ -230,7 +246,7 @@ p, li { white-space: pre-wrap; } - + File hash: @@ -253,7 +269,7 @@ p, li { white-space: pre-wrap; } - + Status: @@ -285,13 +301,6 @@ p, li { white-space: pre-wrap; } - - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
-
diff --git a/retroshare-gui/src/gui/settings/ServerPage.cpp b/retroshare-gui/src/gui/settings/ServerPage.cpp index e17fc9919..8addc4349 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.cpp +++ b/retroshare-gui/src/gui/settings/ServerPage.cpp @@ -47,6 +47,8 @@ #include #include +#include + #define ICON_STATUS_UNKNOWN ":/images/ledoff1.png" #define ICON_STATUS_WORKING ":/images/yellowled.png" #define ICON_STATUS_OK ":/images/ledon1.png" @@ -64,11 +66,11 @@ /// // Tabs numbers *after* non relevant tabs are removed. So do not use them to add/remove tabs!! -const static uint32_t TAB_HIDDEN_SERVICE_OUTGOING = 0; +//nst static uint32_t TAB_HIDDEN_SERVICE_OUTGOING = 0; const static uint32_t TAB_HIDDEN_SERVICE_INCOMING = 1; -const static uint32_t TAB_HIDDEN_SERVICE_I2P_BOB = 2; +const static uint32_t TAB_HIDDEN_SERVICE_I2P = 2; -const static uint32_t TAB_NETWORK = 0; +//nst static uint32_t TAB_NETWORK = 0; const static uint32_t TAB_HIDDEN_SERVICE = 1; const static uint32_t TAB_IP_FILTERS = 2; const static uint32_t TAB_RELAYS = 3; @@ -79,14 +81,14 @@ ServerPage::ServerPage(QWidget * parent, Qt::WindowFlags flags) : ConfigPage(parent, flags) , manager(NULL), mOngoingConnectivityCheck(-1) , mIsHiddenNode(false), mHiddenType(RS_HIDDEN_TYPE_NONE) - , mBobAccessible(false) + , mSamAccessible(false) , mEventHandlerId(0) { /* Invoke the Qt Designer generated object setup routine */ ui.setupUi(this); -#ifndef RS_USE_I2P_BOB - ui.hiddenServiceTab->removeTab(TAB_HIDDEN_SERVICE_I2P_BOB); // warning: the order of operation here is very important. +#ifndef RS_USE_I2P_SAM3 + ui.hiddenServiceTab->removeTab(TAB_HIDDEN_SERVICE_I2P); // warning: the order of operation here is very important. #endif if(RsAccounts::isHiddenNode()) @@ -103,15 +105,15 @@ ServerPage::ServerPage(QWidget * parent, Qt::WindowFlags flags) ui.hiddenpage_proxyPort_i2p->hide() ; ui.label_i2p_outgoing->hide() ; ui.iconlabel_i2p_outgoing->hide() ; - ui.plainTextEdit->hide() ; + ui.info_SocksProxy->hide() ; ui.hiddenpage_configuration->hide() ; ui.l_hiddenpage_configuration->hide() ; - ui.hiddenpageInHelpPlainTextEdit->hide() ; + ui.info_HiddenPageInHelp->hide() ; ui.hiddenpage_outHeader->setText(tr("Tor has been automatically configured by Retroshare. You shouldn't need to change anything here.")) ; ui.hiddenpage_inHeader->setText(tr("Tor has been automatically configured by Retroshare. You shouldn't need to change anything here.")) ; - ui.hiddenServiceTab->removeTab(TAB_HIDDEN_SERVICE_I2P_BOB); // warning: the order of operation here is very important. + ui.hiddenServiceTab->removeTab(TAB_HIDDEN_SERVICE_I2P); // warning: the order of operation here is very important. } } else @@ -153,8 +155,8 @@ ServerPage::ServerPage(QWidget * parent, Qt::WindowFlags flags) ui.leBobB32Addr->hide(); ui.pbBobGenAddr->hide(); - QObject::connect(ui.filteredIpsTable,SIGNAL(customContextMenuRequested(const QPoint&)),this,SLOT(ipFilterContextMenu(const QPoint&))) ; - QObject::connect(ui.whiteListIpsTable,SIGNAL(customContextMenuRequested(const QPoint&)),this,SLOT(ipWhiteListContextMenu(const QPoint&))) ; + QObject::connect(ui.filteredIpsTable,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(ipFilterContextMenu(QPoint))) ; + QObject::connect(ui.whiteListIpsTable,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(ipWhiteListContextMenu(QPoint))) ; QObject::connect(ui.denyAll_CB,SIGNAL(toggled(bool)),this,SLOT(toggleIpFiltering(bool))); QObject::connect(ui.includeFromDHT_CB,SIGNAL(toggled(bool)),this,SLOT(toggleAutoIncludeDHT(bool))); QObject::connect(ui.includeFromFriends_CB,SIGNAL(toggled(bool)),this,SLOT(toggleAutoIncludeFriends(bool))); @@ -162,18 +164,18 @@ ServerPage::ServerPage(QWidget * parent, Qt::WindowFlags flags) QObject::connect(ui.groupIPRanges_SB,SIGNAL(valueChanged(int)),this,SLOT(setGroupIpLimit(int))); QObject::connect(ui.ipInputAddBlackList_PB,SIGNAL(clicked()),this,SLOT(addIpRangeToBlackList())); QObject::connect(ui.ipInputAddWhiteList_PB,SIGNAL(clicked()),this,SLOT(addIpRangeToWhiteList())); - QObject::connect(ui.ipInput_LE,SIGNAL(textChanged(const QString&)),this,SLOT(checkIpRange(const QString&))); + QObject::connect(ui.ipInput_LE,SIGNAL(textChanged(QString)),this,SLOT(checkIpRange(QString))); QObject::connect(ui.filteredIpsTable,SIGNAL(currentCellChanged(int,int,int,int)),this,SLOT(updateSelectedBlackListIP(int,int,int,int))); QObject::connect(ui.whiteListIpsTable,SIGNAL(currentCellChanged(int,int,int,int)),this,SLOT(updateSelectedWhiteListIP(int,int,int,int))); - QObject::connect(ui.pbBobStart, SIGNAL(clicked()), this, SLOT(startBOB())); - QObject::connect(ui.pbBobRestart, SIGNAL(clicked()), this, SLOT(restartBOB())); - QObject::connect(ui.pbBobStop, SIGNAL(clicked()), this, SLOT(stopBOB())); + QObject::connect(ui.pbBobStart, SIGNAL(clicked()), this, SLOT(startSam())); + QObject::connect(ui.pbBobRestart, SIGNAL(clicked()), this, SLOT(restartSam())); + QObject::connect(ui.pbBobStop, SIGNAL(clicked()), this, SLOT(stopSam())); QObject::connect(ui.pbBobGenAddr, SIGNAL(clicked()), this, SLOT(getNewKey())); QObject::connect(ui.pbBobLoadKey, SIGNAL(clicked()), this, SLOT(loadKey())); - QObject::connect(ui.cb_enableBob, SIGNAL(toggled(bool)), this, SLOT(enableBob(bool))); + QObject::connect(ui.cb_enableBob, SIGNAL(toggled(bool)), this, SLOT(enableSam(bool))); - QObject::connect(ui.cbBobAdvanced, SIGNAL(toggled(bool)), this, SLOT(toggleBobAdvancedSettings(bool))); + QObject::connect(ui.cbBobAdvanced, SIGNAL(toggled(bool)), this, SLOT(toggleSamAdvancedSettings(bool))); QObject::connect(ui.sbBobLengthIn, SIGNAL(valueChanged(int)), this, SLOT(tunnelSettingsChanged(int))); QObject::connect(ui.sbBobLengthOut, SIGNAL(valueChanged(int)), this, SLOT(tunnelSettingsChanged(int))); @@ -182,23 +184,19 @@ ServerPage::ServerPage(QWidget * parent, Qt::WindowFlags flags) QObject::connect(ui.sbBobVarianceIn, SIGNAL(valueChanged(int)), this, SLOT(tunnelSettingsChanged(int))); QObject::connect(ui.sbBobVarianceOut, SIGNAL(valueChanged(int)), this, SLOT(tunnelSettingsChanged(int))); - // These two spin boxes are used for the same thing - keep them in sync! - QObject::connect(ui.hiddenpage_proxyPort_i2p, SIGNAL(valueChanged(int)), this, SLOT(syncI2PProxyPortNormal(int))); - QObject::connect(ui.hiddenpage_proxyPort_i2p_2, SIGNAL(valueChanged(int)), this, SLOT(syncI2PProxyPortBob(int))); - // These two line edits are used for the same thing - keep them in sync! QObject::connect(ui.hiddenpage_proxyAddress_i2p, SIGNAL(textChanged(QString)), this, SLOT(syncI2PProxyAddrNormal(QString))); - QObject::connect(ui.hiddenpage_proxyAddress_i2p_2, SIGNAL(textChanged(QString)), this, SLOT(syncI2PProxyAddrBob(QString))); + QObject::connect(ui.hiddenpage_proxyAddress_i2p_2, SIGNAL(textChanged(QString)), this, SLOT(syncI2PProxyAddrSam(QString))); connect(NotifyQt::getInstance(), SIGNAL(connectionWithoutCert()), this, SLOT(connectionWithoutCert())); QObject::connect(ui.localPort,SIGNAL(valueChanged(int)),this,SLOT(saveAddresses())); QObject::connect(ui.extPort,SIGNAL(valueChanged(int)),this,SLOT(saveAddresses())); - connect( ui.netModeComboBox, SIGNAL( activated ( int ) ), this, SLOT( toggleUPnP( ) ) ); - connect( ui.allowIpDeterminationCB, SIGNAL( toggled( bool ) ), this, SLOT( toggleIpDetermination(bool) ) ); - connect( ui.cleanKnownIPs_PB, SIGNAL( clicked( ) ), this, SLOT( clearKnownAddressList() ) ); - connect( ui.testIncoming_PB, SIGNAL( clicked( ) ), this, SLOT( saveAndTestInProxy() ) ); + connect( ui.netModeComboBox, SIGNAL( activated(int) ), this, SLOT( toggleUPnP() ) ); + connect( ui.allowIpDeterminationCB, SIGNAL( toggled(bool) ), this, SLOT( toggleIpDetermination(bool) ) ); + connect( ui.cleanKnownIPs_PB, SIGNAL( clicked() ), this, SLOT( clearKnownAddressList() ) ); + connect( ui.testIncoming_PB, SIGNAL( clicked() ), this, SLOT( saveAndTestInProxy() ) ); #ifdef SERVER_DEBUG std::cerr << "ServerPage::ServerPage() called"; @@ -230,7 +228,7 @@ ServerPage::ServerPage(QWidget * parent, Qt::WindowFlags flags) QObject::connect(ui.addPushButton,SIGNAL(clicked()),this,SLOT(addServer())); QObject::connect(ui.removePushButton,SIGNAL(clicked()),this,SLOT(removeServer())); - QObject::connect(ui.DhtLineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(checkKey())); + QObject::connect(ui.DhtLineEdit,SIGNAL(textChanged(QString)),this,SLOT(checkKey())); QObject::connect(ui.enableCheckBox,SIGNAL(stateChanged(int)),this,SLOT(updateEnabled())); QObject::connect(ui.serverCheckBox,SIGNAL(stateChanged(int)),this,SLOT(updateEnabled())); @@ -373,7 +371,7 @@ void ServerPage::load() } mIsHiddenNode = (detail.netMode == RS_NETMODE_HIDDEN); - rsAutoProxyMonitor::taskSync(autoProxyType::I2PBOB, autoProxyTask::getSettings, &mBobSettings); + rsAutoProxyMonitor::taskSync(autoProxyType::I2PSAM3, autoProxyTask::getSettings, &mSamSettings); loadCommon(); updateStatus(); @@ -435,8 +433,8 @@ void ServerPage::load() { if (detail.vs_disc != RS_VS_DISC_OFF) netIndex = 1; // PRIVATE - else - netIndex = 3; // NONE + //else //Use default value + // netIndex = 3; // NONE } whileBlocking(ui.discComboBox)->setCurrentIndex(netIndex); @@ -461,6 +459,7 @@ void ServerPage::load() whileBlocking(ui.ipAddressList)->clear(); + detail.ipAddressList.sort(); for(std::list::const_iterator it(detail.ipAddressList.begin());it!=detail.ipAddressList.end();++it) whileBlocking(ui.ipAddressList)->addItem(QString::fromStdString(*it)); @@ -826,10 +825,10 @@ void ServerPage::ipWhiteListContextMenu(const QPoint& /* point */) return ; } - QString range0 = RsNetUtil::printAddrRange(addr,0) ; - QString range1 = RsNetUtil::printAddrRange(addr,1) ; - QString range2 = RsNetUtil::printAddrRange(addr,2) ; - +// QString range0 = RsNetUtil::printAddrRange(addr,0) ; +// QString range1 = RsNetUtil::printAddrRange(addr,1) ; +// QString range2 = RsNetUtil::printAddrRange(addr,2) ; +// // contextMenu.addAction(QObject::tr("Whitelist only IP " )+range0,this,SLOT(enableBannedIp()))->setEnabled(false) ; //#warning UNIMPLEMENTED CODE // contextMenu.addAction(QObject::tr("Whitelist entire range ")+range1,this,SLOT(enableBannedIp()))->setEnabled(false) ; @@ -870,9 +869,9 @@ void ServerPage::updateStatus() loadFilteredIps() ; - updateStatusBob(); + updateStatusSam(); - // this is used by BOB + // this is used by SAM if (mOngoingConnectivityCheck > 0) { mOngoingConnectivityCheck--; @@ -932,6 +931,28 @@ void ServerPage::updateStatus() else ui.iconlabel_ext->setPixmap(FilesDefs::getPixmapFromQtResourcePath(":/images/ledoff1.png")); + if (ui.ipAddressList->isEnabled() ) + { + whileBlocking(ui.ipAddressList)->clear(); + detail.ipAddressList.sort(); + for(auto& it : detail.ipAddressList) + whileBlocking(ui.ipAddressList)->addItem(QString::fromStdString(it).replace("sec",tr("sec")).replace("loc",tr("local")).replace("ext",tr("external"))); + } + + QString toolTip = tr("List of OpenDns servers used."); + if (ui.IPServersLV->isEnabled() ) + { + std::list ip_list; + rsPeers->getCurrentExtIPList(ip_list); + if ( !ip_list.empty() ) + { + toolTip += tr("\n\nList of found external IP:\n"); + for(std::list::const_iterator it(ip_list.begin());it!=ip_list.end();++it) + toolTip += " " + QString::fromStdString(*it) +"\n" ; + } + } + if(ui.IPServersLV->toolTip() != toolTip) + ui.IPServersLV->setToolTip(toolTip); } void ServerPage::toggleUPnP() @@ -1098,7 +1119,7 @@ void ServerPage::loadHiddenNode() ui.iconlabel_upnp->hide(); ui.label_nat->hide(); - ui.label_warningBandwidth->hide(); + ui.info_warningBandwidth->hide(); ui.iconlabel_netLimited->hide(); ui.textlabel_netLimited->hide(); ui.iconlabel_ext->hide(); @@ -1160,6 +1181,7 @@ void ServerPage::loadHiddenNode() // show what we have in ipAddresses. (should be nothing!) ui.ipAddressList->clear(); + detail.ipAddressList.sort(); for(std::list::const_iterator it(detail.ipAddressList.begin());it!=detail.ipAddressList.end();++it) whileBlocking(ui.ipAddressList)->addItem(QString::fromStdString(*it)); @@ -1349,32 +1371,33 @@ void ServerPage::updateOutProxyIndicator() ui.iconlabel_tor_outgoing->setToolTip(tr("Tor proxy is not enabled")) ; } - // I2P - socket.connectToHost(ui.hiddenpage_proxyAddress_i2p->text(),ui.hiddenpage_proxyPort_i2p->text().toInt()); - if(socket.waitForConnected(500)) - { - socket.disconnectFromHost(); - ui.iconlabel_i2p_outgoing->setPixmap(FilesDefs::getPixmapFromQtResourcePath(ICON_STATUS_OK)) ; - ui.iconlabel_i2p_outgoing->setToolTip(tr("Proxy seems to work.")) ; - } - else - { - ui.iconlabel_i2p_outgoing->setPixmap(FilesDefs::getPixmapFromQtResourcePath(ICON_STATUS_UNKNOWN)) ; - ui.iconlabel_i2p_outgoing->setToolTip(tr("I2P proxy is not enabled")) ; - } + // I2P - SAM + // Note: there is only "the SAM port", there is no additional proxy port! + samStatus ss; + rsAutoProxyMonitor::taskSync(autoProxyType::I2PSAM3, autoProxyTask::status, &ss); + if(ss.state == samStatus::samState::online) + { + socket.disconnectFromHost(); + ui.iconlabel_i2p_outgoing->setPixmap(FilesDefs::getPixmapFromQtResourcePath(ICON_STATUS_OK)) ; + ui.iconlabel_i2p_outgoing->setToolTip(tr("Proxy seems to work.")) ; + } + else + { + ui.iconlabel_i2p_outgoing->setPixmap(FilesDefs::getPixmapFromQtResourcePath(ICON_STATUS_UNKNOWN)) ; + ui.iconlabel_i2p_outgoing->setToolTip(tr("I2P proxy is not enabled")) ; + } - // I2P - BOB - socket.connectToHost(ui.hiddenpage_proxyAddress_i2p_2->text(), 2827); - if(true == (mBobAccessible = socket.waitForConnected(500))) + socket.connectToHost(ui.hiddenpage_proxyAddress_i2p_2->text(), 7656); + if(true == (mSamAccessible = socket.waitForConnected(1000))) { socket.disconnectFromHost(); ui.iconlabel_i2p_outgoing_2->setPixmap(FilesDefs::getPixmapFromQtResourcePath(ICON_STATUS_OK)) ; - ui.iconlabel_i2p_outgoing_2->setToolTip(tr("BOB is running and accessible")) ; + ui.iconlabel_i2p_outgoing_2->setToolTip(tr("SAMv3 is running and accessible")) ; } else { ui.iconlabel_i2p_outgoing_2->setPixmap(FilesDefs::getPixmapFromQtResourcePath(ICON_STATUS_UNKNOWN)) ; - ui.iconlabel_i2p_outgoing_2->setToolTip(tr("BOB is not accessible! Is it running?")) ; + ui.iconlabel_i2p_outgoing_2->setToolTip(tr("SAMv3 is not accessible! Is i2p running and SAM enabled?")) ; } } @@ -1385,28 +1408,18 @@ void ServerPage::updateInProxyIndicator() if(!mIsHiddenNode) return ; - //ui.iconlabel_tor_incoming->setPixmap(FilesDefs::getPixmapFromQtResourcePath(ICON_STATUS_UNKNOWN)) ; + //ui.iconlabel_tor_incoming->setPixmap(FilesDefs::getPixmapFromQtResourcePath(ICON_STATUS_UNKNOWN)) ; //ui.testIncomingTor_PB->setIcon(FilesDefs::getIconFromQtResourcePath(":/loader/circleball-16.gif")) ; QMovie *movie = new QMovie(":/images/loader/circleball-16.gif"); ui.iconlabel_service_incoming->setMovie(movie); movie->start(); - if (mHiddenType == RS_HIDDEN_TYPE_I2P && mBobSettings.enable) { - - QTcpSocket tcpSocket; - - const QString host = ui.hiddenpage_proxyAddress_i2p->text(); - qint16 port = ui.hiddenpage_proxyPort_i2p->text().toInt(); - QByteArray addr = ui.leBobB32Addr->text().toUtf8(); - addr.push_back('\n'); - - mOngoingConnectivityCheck = 5; // timeout in sec - - tcpSocket.connectToHost(host, port); - tcpSocket.write(addr); // write addr - tcpSocket.write(addr); // trigger connection error since RS expects a tls connection - tcpSocket.close(); - tcpSocket.waitForDisconnected(5 * 1000); + if (mHiddenType == RS_HIDDEN_TYPE_I2P && mSamSettings.enable) { + // there is no inproxy for SAMv3, since every connection goes through sam itself + auto secw = new samEstablishConnectionWrapper(); + secw->address = mSamSettings.address; + secw->connection = nullptr; + rsAutoProxyMonitor::taskAsync(autoProxyType::I2PSAM3, autoProxyTask::establishConnection, this, secw); return; } @@ -1419,18 +1432,10 @@ void ServerPage::updateInProxyIndicator() QNetworkProxy proxy ; proxy.setType(QNetworkProxy::Socks5Proxy); - switch (mHiddenType) { - case RS_HIDDEN_TYPE_I2P: - proxy.setHostName(ui.hiddenpage_proxyAddress_i2p->text()); - proxy.setPort(ui.hiddenpage_proxyPort_i2p->text().toInt()); - break; - case RS_HIDDEN_TYPE_TOR: - proxy.setHostName(ui.hiddenpage_proxyAddress_tor->text()); - proxy.setPort(ui.hiddenpage_proxyPort_tor->text().toInt()); - break; - default: - return; - } + + proxy.setHostName(ui.hiddenpage_proxyAddress_tor->text()); + proxy.setPort(ui.hiddenpage_proxyPort_tor->text().toInt()); + proxy.setCapabilities(QNetworkProxy::HostNameLookupCapability | proxy.capabilities()) ; QNetworkProxy::setApplicationProxy(proxy) ; @@ -1445,53 +1450,58 @@ void ServerPage::updateInProxyIndicator() QNetworkProxy::setApplicationProxy(QNetworkProxy::NoProxy) ; } -void ServerPage::startBOB() +void ServerPage::startSam() { - rsAutoProxyMonitor::taskAsync(autoProxyType::I2PBOB, autoProxyTask::start); + rsAutoProxyMonitor::taskAsync(autoProxyType::I2PSAM3, autoProxyTask::start); updateStatus(); } -void ServerPage::restartBOB() +void ServerPage::restartSam() { - rsAutoProxyMonitor::taskAsync(autoProxyType::I2PBOB, autoProxyTask::stop); - rsAutoProxyMonitor::taskAsync(autoProxyType::I2PBOB, autoProxyTask::start); + rsAutoProxyMonitor::taskAsync(autoProxyType::I2PSAM3, autoProxyTask::stop); + rsAutoProxyMonitor::taskAsync(autoProxyType::I2PSAM3, autoProxyTask::start); updateStatus(); } -void ServerPage::stopBOB() +void ServerPage::stopSam() { - rsAutoProxyMonitor::taskAsync(autoProxyType::I2PBOB, autoProxyTask::stop); + rsAutoProxyMonitor::taskAsync(autoProxyType::I2PSAM3, autoProxyTask::stop); updateStatus(); } void ServerPage::getNewKey() { - bobSettings *bs = new bobSettings(); - - rsAutoProxyMonitor::taskAsync(autoProxyType::I2PBOB, autoProxyTask::receiveKey, this, bs); - - updateStatus(); + i2p::address *addr = new i2p::address(); + rsAutoProxyMonitor::taskAsync(autoProxyType::I2PSAM3, autoProxyTask::receiveKey, this, addr); } void ServerPage::loadKey() { - mBobSettings.address.privateKey = ui.pteBobServerKey->toPlainText().toStdString(); - mBobSettings.address.publicKey = i2p::publicKeyFromPrivate(mBobSettings.address.privateKey); - mBobSettings.address.base32 = i2p::keyToBase32Addr(mBobSettings.address.publicKey); + auto priv = ui.pteBobServerKey->toPlainText().toStdString(); + auto pub = i2p::publicKeyFromPrivate(priv); + if (pub.empty()) { + // something went wrong! + ui.pteBobServerKey->setPlainText("FAILED! Something went wrong while parsing the key!"); + return; + } - rsAutoProxyMonitor::taskSync(autoProxyType::I2PBOB, autoProxyTask::setSettings, &mBobSettings); + mSamSettings.address.privateKey = priv; + mSamSettings.address.publicKey = pub; + mSamSettings.address.base32 = i2p::keyToBase32Addr(mSamSettings.address.publicKey); + + rsAutoProxyMonitor::taskSync(autoProxyType::I2PSAM3, autoProxyTask::setSettings, &mSamSettings); } -void ServerPage::enableBob(bool checked) +void ServerPage::enableSam(bool checked) { - mBobSettings.enable = checked; + mSamSettings.enable = checked; - rsAutoProxyMonitor::taskSync(autoProxyType::I2PBOB, autoProxyTask::setSettings, &mBobSettings); + rsAutoProxyMonitor::taskSync(autoProxyType::I2PSAM3, autoProxyTask::setSettings, &mSamSettings); - setUpBobElements(); + setUpSamElements(); } int8_t fitRange(int i, int min, int max) { @@ -1513,21 +1523,21 @@ void ServerPage::tunnelSettingsChanged(int) vi = ui.sbBobVarianceIn->value(); vo = ui.sbBobVarianceOut->value(); - mBobSettings.inLength = fitRange(li, 0, 7); - mBobSettings.outLength = fitRange(lo, 0, 7); - mBobSettings.inQuantity = fitRange(qi, 1, 16); - mBobSettings.outQuantity = fitRange(qo, 1, 16); - mBobSettings.inVariance = fitRange(vi, -1, 2); - mBobSettings.outVariance = fitRange(vo, -1, 2); + mSamSettings.inLength = fitRange(li, 0, 7); + mSamSettings.outLength = fitRange(lo, 0, 7); + mSamSettings.inQuantity = fitRange(qi, 1, 16); + mSamSettings.outQuantity = fitRange(qo, 1, 16); + mSamSettings.inVariance = fitRange(vi, -1, 2); + mSamSettings.outVariance = fitRange(vo, -1, 2); - rsAutoProxyMonitor::taskSync(autoProxyType::I2PBOB, autoProxyTask::setSettings, &mBobSettings); + rsAutoProxyMonitor::taskSync(autoProxyType::I2PSAM3, autoProxyTask::setSettings, &mSamSettings); } -void ServerPage::toggleBobAdvancedSettings(bool checked) +void ServerPage::toggleSamAdvancedSettings(bool checked) { ui.swBobAdvanced->setCurrentIndex(checked ? 1 : 0); - if (!mBobSettings.address.privateKey.empty()) { + if (!mSamSettings.address.privateKey.empty()) { if (checked) { ui.pbBobGenAddr->show(); } else { @@ -1536,57 +1546,89 @@ void ServerPage::toggleBobAdvancedSettings(bool checked) } } -void ServerPage::syncI2PProxyPortNormal(int i) -{ - ui.hiddenpage_proxyPort_i2p_2->setValue(i); -} - -void ServerPage::syncI2PProxyPortBob(int i) -{ - ui.hiddenpage_proxyPort_i2p->setValue(i); - - // update port - saveBob(); - rsAutoProxyMonitor::taskSync(autoProxyType::I2PBOB, autoProxyTask::reloadConfig); -} - void ServerPage::syncI2PProxyAddrNormal(QString t) { ui.hiddenpage_proxyAddress_i2p_2->setText(t); } -void ServerPage::syncI2PProxyAddrBob(QString t) +void ServerPage::syncI2PProxyAddrSam(QString t) { ui.hiddenpage_proxyAddress_i2p->setText(t); // update addr - saveBob(); - rsAutoProxyMonitor::taskSync(autoProxyType::I2PBOB, autoProxyTask::reloadConfig); + saveSam(); + rsAutoProxyMonitor::taskSync(autoProxyType::I2PSAM3, autoProxyTask::reloadConfig); } void ServerPage::taskFinished(taskTicket *&ticket) { - if (ticket->task == autoProxyTask::receiveKey) { - bobSettings *s = NULL; - switch (ticket->types.front()) { - case autoProxyType::I2PBOB: - // update settings - s = (struct bobSettings *)ticket->data; - mBobSettings = *s; - delete s; - s = NULL; - ticket->data = NULL; - break; - default: - break; - } - } + switch (ticket->task) { + case autoProxyTask::receiveKey: + { + i2p::address *addr = nullptr; + addr = static_cast(ticket->data); + + if (ticket->types.front() != autoProxyType::I2PSAM3) + RS_WARN("auto proxy task finished but not for SMA, not exptected! Also not a serious problem."); + else { + // update settings + auto copy = *addr; + RsQThreadUtils::postToObject( + [this, copy]() + { + mSamSettings.address = copy; + rsAutoProxyMonitor::taskSync(autoProxyType::I2PSAM3, autoProxyTask::setSettings, &mSamSettings); + updateStatusSam(); + + }); + } + + delete addr; + addr = nullptr; + ticket->data = nullptr; + + + break; + } + case autoProxyTask::establishConnection: + { + samEstablishConnectionWrapper *secw = nullptr; + secw = static_cast(ticket->data); + + if (ticket->types.front() != autoProxyType::I2PSAM3) + RS_WARN("auto proxy task finished but not for SMA, not exptected! Also not a serious problem."); + else { + bool res = ticket->result == autoProxyStatus::ok && !!secw->connection->ses; + // update settings + if (res) { + sam3CloseConnection(secw->connection); + secw->connection = nullptr; // freed by above call + } + + RsQThreadUtils::postToObject( + [this, res]() + { + updateInProxyIndicatorResult(res); + + }); + } + + if (secw->connection) + delete secw->connection; + delete secw; + secw = nullptr; + ticket->data = nullptr; + break; + } + default: + RS_DBG("unsupported task!", ticket->task); + } if (ticket->data) std::cerr << "(WW) ServerPage::taskFinished data set. This should NOT happen - check the code!" << std::endl; delete ticket; - ticket = NULL; + ticket = nullptr; } void ServerPage::connectionWithoutCert() @@ -1613,14 +1655,13 @@ void ServerPage::loadCommon() // I2P rsPeers->getProxyServer(RS_HIDDEN_TYPE_I2P, proxyaddr, proxyport, status); whileBlocking(ui.hiddenpage_proxyAddress_i2p) -> setText(QString::fromStdString(proxyaddr)); - whileBlocking(ui.hiddenpage_proxyAddress_i2p_2)->setText(QString::fromStdString(proxyaddr)); // this one is for bob tab + whileBlocking(ui.hiddenpage_proxyAddress_i2p_2)->setText(QString::fromStdString(proxyaddr)); // this one is for sam tab whileBlocking(ui.hiddenpage_proxyPort_i2p) -> setValue(proxyport); - whileBlocking(ui.hiddenpage_proxyPort_i2p_2)->setValue(proxyport); // this one is for bob tab // don't use whileBlocking here - ui.cb_enableBob->setChecked(mBobSettings.enable); + ui.cb_enableBob->setChecked(mSamSettings.enable); - if (!mBobSettings.address.privateKey.empty()) { + if (!mSamSettings.address.privateKey.empty()) { ui.lBobB32Addr->show(); ui.leBobB32Addr->show(); } @@ -1642,10 +1683,10 @@ void ServerPage::saveCommon() rsPeers->setProxyServer(RS_HIDDEN_TYPE_TOR, new_proxyaddr, new_proxyport); } - saveBob(); + saveSam(); } -void ServerPage::saveBob() +void ServerPage::saveSam() { std::string orig_proxyaddr, new_proxyaddr; uint16_t orig_proxyport, new_proxyport; @@ -1656,20 +1697,29 @@ void ServerPage::saveBob() new_proxyaddr = ui.hiddenpage_proxyAddress_i2p -> text().toStdString(); new_proxyport = ui.hiddenpage_proxyPort_i2p -> value(); - if ((new_proxyaddr != orig_proxyaddr) || (new_proxyport != orig_proxyport)) { + // SAMv3 has no proxy port, everything goes through the SAM port. + if ((new_proxyaddr != orig_proxyaddr) /* || (new_proxyport != orig_proxyport) */) { rsPeers->setProxyServer(RS_HIDDEN_TYPE_I2P, new_proxyaddr, new_proxyport); } } -void ServerPage::updateStatusBob() +void ServerPage::updateStatusSam() { - QString addr = QString::fromStdString(mBobSettings.address.base32); + QString addr = QString::fromStdString(mSamSettings.address.base32); if (ui.leBobB32Addr->text() != addr) { ui.leBobB32Addr->setText(addr); ui.hiddenpage_serviceAddress->setText(addr); - ui.pteBobServerKey->setPlainText(QString::fromStdString(mBobSettings.address.privateKey)); + ui.pteBobServerKey->setPlainText(QString::fromStdString(mSamSettings.address.privateKey)); - if (!mBobSettings.address.privateKey.empty()) { + std::string signingKeyType, cryptoKeyType; + if (i2p::getKeyTypes(mSamSettings.address.publicKey, signingKeyType, cryptoKeyType)) + ui.samKeyInfo->setText(tr("Your key uses the following algorithms: %1 and %2"). + arg(QString::fromStdString(signingKeyType)). + arg(QString::fromStdString(cryptoKeyType))); + else + ui.samKeyInfo->setText(tr("unkown key type")); + + if (!mSamSettings.address.privateKey.empty()) { // we have an addr -> show fields ui.lBobB32Addr->show(); ui.leBobB32Addr->show(); @@ -1686,128 +1736,82 @@ void ServerPage::updateStatusBob() ui.pbBobGenAddr->hide(); } - saveAddresses(); + saveAddresses(); } - bobStates bs; - rsAutoProxyMonitor::taskSync(autoProxyType::I2PBOB, autoProxyTask::status, &bs); + samStatus ss; + rsAutoProxyMonitor::taskSync(autoProxyType::I2PSAM3, autoProxyTask::status, &ss); QString bobSimpleText = QString(); - bobSimpleText.append(tr("RetroShare uses BOB to set up a %1 tunnel at %2:%3 (named %4)\n\n" - "When changing options (e.g. port) use the buttons at the bottom to restart BOB.\n\n"). - arg(mBobSettings.address.privateKey.empty() ? tr("client") : tr("server"), + bobSimpleText.append(tr("RetroShare uses SAMv3 to set up a %1 tunnel at %2:%3\n(id: %4)\n\n" + "When changing options use the buttons at the bottom to restart SAMv3.\n\n"). + arg(mSamSettings.address.privateKey.empty() ? tr("client") : tr("server"), ui.hiddenpage_proxyAddress_i2p_2->text(), - ui.hiddenpage_proxyPort_i2p_2->text(), - bs.tunnelName.empty() ? tr("unknown") : - QString::fromStdString(bs.tunnelName))); + "7656", + ss.sessionName.empty() ? tr("unknown") : + QString::fromStdString(ss.sessionName))); - // update BOB UI based on state - std::string errorString; - switch (bs.cs) { - case csDoConnect: - case csConnected: - case csDoDisconnect: - case csWaitForBob: - ui.iconlabel_i2p_bob->setPixmap(FilesDefs::getPixmapFromQtResourcePath(ICON_STATUS_WORKING)); - ui.iconlabel_i2p_bob->setToolTip(tr("BOB is processing a request")); + // update SAM UI based on state + QString s; + QString icon; + switch (ss.state) { + case samStatus::samState::offline: + enableSamElements(false); - enableBobElements(false); + ui.pbBobStart->setEnabled(true); + ui.pbBobRestart->setEnabled(false); + ui.pbBobStop->setEnabled(false); - { - QString s; - switch (bs.ct) { - case ctRunCheck: - s = tr("connectivity check"); - break; - case ctRunGetKeys: - s = tr("generating key"); - break; - case ctRunSetUp: - s = tr("starting up"); - break; - case ctRunShutDown: - s = tr("shuting down"); - default: - break; - } - bobSimpleText.append(tr("BOB is processing a request: %1").arg(s)); - } + s = tr("Offline, no SAM session is established yet.\n"); + icon = ICON_STATUS_ERROR; + break; + case samStatus::samState::connectSession: + enableSamElements(false); - ui.pbBobStart->setEnabled(false); - ui.pbBobRestart->setEnabled(false); - ui.pbBobStop->setEnabled(false); - break; - case csError: - // get error msg from bob - rsAutoProxyMonitor::taskSync(autoProxyType::I2PBOB, autoProxyTask::getErrorInfo, &errorString); - - ui.iconlabel_i2p_bob->setPixmap(FilesDefs::getPixmapFromQtResourcePath(ICON_STATUS_ERROR)); - ui.iconlabel_i2p_bob->setToolTip(tr("BOB is broken\n") + QString::fromStdString(errorString)); - - enableBobElements(false); - - bobSimpleText.append(tr("BOB encountered an error:\n")); - bobSimpleText.append(QString::fromStdString(errorString)); - - ui.pbBobStart->setEnabled(true); - ui.pbBobRestart->setEnabled(false); + ui.pbBobStart->setEnabled(false); + ui.pbBobRestart->setEnabled(false); ui.pbBobStop->setEnabled(true); - break; - case csDisconnected: - case csIdel: - switch (bs.ct) { - case ctRunSetUp: - ui.iconlabel_i2p_bob->setPixmap(FilesDefs::getPixmapFromQtResourcePath(ICON_STATUS_OK)); - ui.iconlabel_i2p_bob->setToolTip(tr("BOB tunnel is running")); - enableBobElements(false); + s = tr("SAM is trying to establish a session ... this can take some time.\n"); + icon = ICON_STATUS_WORKING; + break; + case samStatus::samState::connectForward: + enableSamElements(false); - bobSimpleText.append(tr("BOB is working fine: tunnel established")); + ui.pbBobStart->setEnabled(false); + ui.pbBobRestart->setEnabled(false); + ui.pbBobStop->setEnabled(true); - ui.pbBobStart->setEnabled(false); - ui.pbBobRestart->setEnabled(true); - ui.pbBobStop->setEnabled(true); - break; - case ctRunCheck: - case ctRunGetKeys: - ui.iconlabel_i2p_bob->setPixmap(FilesDefs::getPixmapFromQtResourcePath(ICON_STATUS_WORKING)); - ui.iconlabel_i2p_bob->setToolTip(tr("BOB is processing a request")); + s = tr("SAM session established! Now setting up a forward session ...\n"); + icon = ICON_STATUS_WORKING; + break; + case samStatus::samState::online: + enableSamElements(true); - enableBobElements(false); + ui.pbBobStart->setEnabled(false); + ui.pbBobRestart->setEnabled(true); + ui.pbBobStop->setEnabled(true); - bobSimpleText.append(tr("BOB is processing a request")); + s = tr("Online, SAM is working as exptected\n"); + icon = ICON_STATUS_OK; + break; + } + ui.iconlabel_i2p_bob->setPixmap(icon); + ui.iconlabel_i2p_bob->setToolTip(s); + bobSimpleText.append(s); - ui.pbBobStart->setEnabled(false); - ui.pbBobRestart->setEnabled(false); - ui.pbBobStop->setEnabled(false); - break; - case ctRunShutDown: - case ctIdle: - ui.iconlabel_i2p_bob->setPixmap(FilesDefs::getPixmapFromQtResourcePath(ICON_STATUS_UNKNOWN)); - ui.iconlabel_i2p_bob->setToolTip(tr("BOB tunnel is not running")); - enableBobElements(true); + ui.info_BobSimple->setPlainText(bobSimpleText); - bobSimpleText.append(tr("BOB is inactive: tunnel closed")); - - ui.pbBobStart->setEnabled(true); - ui.pbBobRestart->setEnabled(false); - ui.pbBobStop->setEnabled(false); - break; - } - break; - - } - ui.pteBobSimple->setPlainText(bobSimpleText); // disable elements when BOB is not accessible - if (!mBobAccessible) { + if (!mSamAccessible) { ui.pbBobStart->setEnabled(false); - ui.pbBobStart->setToolTip("BOB is not accessible"); + ui.pbBobStart->setToolTip("SAMv3 is not accessible"); ui.pbBobRestart->setEnabled(false); - ui.pbBobRestart->setToolTip("BOB is not accessible"); - // don't disable the stop button! (in case bob is running you are otherwise unable to stop and disable it) - ui.pbBobStop->setToolTip("BOB is not accessible"); + ui.pbBobRestart->setToolTip("SAMv3 is not accessible"); + // don't disable the stop button! (in case SAM is running you are otherwise unable to stop and disable it) + ui.pbBobStop->setToolTip("SAMv3 is not accessible"); } else { ui.pbBobStart->setToolTip(""); ui.pbBobRestart->setToolTip(""); @@ -1815,26 +1819,34 @@ void ServerPage::updateStatusBob() } } -void ServerPage::setUpBobElements() +void ServerPage::setUpSamElements() { - ui.gbBob->setEnabled(mBobSettings.enable); - if (mBobSettings.enable) { + ui.gbBob->setEnabled(mSamSettings.enable); + if (mSamSettings.enable) { ui.hiddenpage_proxyAddress_i2p->setEnabled(false); - ui.hiddenpage_proxyAddress_i2p->setToolTip("Use I2P/BOB settings to change this value"); + ui.hiddenpage_proxyAddress_i2p->setToolTip("Use I2P settings to change this value"); ui.hiddenpage_proxyPort_i2p->setEnabled(false); - ui.hiddenpage_proxyPort_i2p->setToolTip("Use I2P/BOB settings to change this value"); + ui.hiddenpage_proxyPort_i2p->setToolTip("Use I2P settings to change this value"); - ui.leBobB32Addr->setText(QString::fromStdString(mBobSettings.address.base32)); - ui.pteBobServerKey->setPlainText(QString::fromStdString(mBobSettings.address.privateKey)); + ui.leBobB32Addr->setText(QString::fromStdString(mSamSettings.address.base32)); + ui.pteBobServerKey->setPlainText(QString::fromStdString(mSamSettings.address.privateKey)); + + std::string signingKeyType, cryptoKeyType; + if (i2p::getKeyTypes(mSamSettings.address.publicKey, signingKeyType, cryptoKeyType)) + ui.samKeyInfo->setText(tr("You key uses %1 for signing and %2 for crypto"). + arg(QString::fromStdString(signingKeyType)). + arg(QString::fromStdString(cryptoKeyType))); + else + ui.samKeyInfo->setText(tr("unkown key type")); // cast to int to avoid problems int li, lo, qi, qo, vi, vo; - li = mBobSettings.inLength; - lo = mBobSettings.outLength; - qi = mBobSettings.inQuantity; - qo = mBobSettings.outQuantity; - vi = mBobSettings.inVariance; - vo = mBobSettings.outVariance; + li = mSamSettings.inLength; + lo = mSamSettings.outLength; + qi = mSamSettings.inQuantity; + qo = mSamSettings.outQuantity; + vi = mSamSettings.inVariance; + vo = mSamSettings.outVariance; ui.sbBobLengthIn ->setValue(li); ui.sbBobLengthOut ->setValue(lo); @@ -1850,7 +1862,7 @@ void ServerPage::setUpBobElements() } } -void ServerPage::enableBobElements(bool enable) +void ServerPage::enableSamElements(bool enable) { if (enable) { ui.pbBobGenAddr->setEnabled(true); @@ -1863,13 +1875,13 @@ void ServerPage::enableBobElements(bool enable) ui.cb_enableBob->setToolTip(tr("")); } else { ui.pbBobGenAddr->setEnabled(false); - ui.pbBobGenAddr->setToolTip(tr("stop BOB tunnel first to generate a new key")); + ui.pbBobGenAddr->setToolTip(tr("stop SAM tunnel first to generate a new key")); ui.pbBobLoadKey->setEnabled(false); - ui.pbBobLoadKey->setToolTip(tr("stop BOB tunnel first to load a key")); + ui.pbBobLoadKey->setToolTip(tr("stop SAM tunnel first to load a key")); ui.cb_enableBob->setEnabled(false); - ui.cb_enableBob->setToolTip(tr("stop BOB tunnel first to disable BOB")); + ui.cb_enableBob->setToolTip(tr("stop SAM tunnel first to disable SAM")); } } @@ -1896,6 +1908,7 @@ void ServerPage::handleNetworkReply(QNetworkReply *reply) { int error = reply->error() ; + RS_INFO("error:", error); if(reply->isOpen() && error == QNetworkReply::SslHandshakeFailedError) updateInProxyIndicatorResult(true); else diff --git a/retroshare-gui/src/gui/settings/ServerPage.h b/retroshare-gui/src/gui/settings/ServerPage.h index de971881b..7d82f2190 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.h +++ b/retroshare-gui/src/gui/settings/ServerPage.h @@ -34,7 +34,7 @@ #endif #include -#include +#include #include "retroshare-gui/configpage.h" #include "retroshare-gui/RsAutoUpdatePage.h" @@ -97,22 +97,19 @@ private slots: void handleNetworkReply(QNetworkReply *reply); void updateInProxyIndicator(); - // i2p bob - void startBOB(); - void restartBOB(); - void stopBOB(); + // i2p SAMv3 + void startSam(); + void restartSam(); + void stopSam(); void getNewKey(); void loadKey(); - void enableBob(bool checked); + void enableSam(bool checked); void tunnelSettingsChanged(int); - void toggleBobAdvancedSettings(bool checked); - - void syncI2PProxyPortNormal(int i); - void syncI2PProxyPortBob(int i); + void toggleSamAdvancedSettings(bool checked); void syncI2PProxyAddrNormal(QString); - void syncI2PProxyAddrBob(QString); + void syncI2PProxyAddrSam(QString); void connectionWithoutCert(); @@ -133,11 +130,11 @@ public: private: void loadCommon(); void saveCommon(); - void saveBob(); - void updateStatusBob(); + void saveSam(); + void updateStatusSam(); - void setUpBobElements(); - void enableBobElements(bool enable); + void setUpSamElements(); + void enableSamElements(bool enable); void updateInProxyIndicatorResult(bool success); @@ -160,8 +157,8 @@ private: bool mIsHiddenNode; uint32_t mHiddenType; - bobSettings mBobSettings; - bool mBobAccessible; // keeps track wether bob is accessable or not to en/disable the corresponding buttons + samSettings mSamSettings; + bool mSamAccessible; // keeps track wether SAM is accessable or not to en/disable the corresponding buttons RsEventsHandlerId_t mEventHandlerId; void handleEvent(std::shared_ptr event); diff --git a/retroshare-gui/src/gui/settings/ServerPage.ui b/retroshare-gui/src/gui/settings/ServerPage.ui index 5ef7308b1..6b78b988c 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.ui +++ b/retroshare-gui/src/gui/settings/ServerPage.ui @@ -6,8 +6,8 @@ 0 0 - 712 - 502 + 726 + 579
@@ -195,7 +195,7 @@
- + Automatic (UPnP) @@ -214,7 +214,7 @@ - + 200 @@ -416,7 +416,224 @@ - + + + + + + + + 0 + 0 + 0 + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 154 + 154 + 154 + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + border: 1px solid #DCDC41; border-radius: 6px; @@ -487,7 +704,7 @@ connecting when you have few friends. It also helps if you're behind a firewall or a VPN. - Allow RetroShare to ask my ip to these websites: + Allow RetroShare to ask my ip to these DNS servers: true @@ -502,6 +719,9 @@ behind a firewall or a VPN. 0 + + List of OpenDns servers used. + QAbstractItemView::NoEditTriggers @@ -665,7 +885,7 @@ behind a firewall or a VPN. - + 0 @@ -861,7 +1081,7 @@ You can connect to Hidden Nodes, even if you are running a standard Node, so why - + 0 @@ -908,9 +1128,9 @@ If you have issues connecting over Tor check the Tor logs too. - + - Automatic I2P/BOB + Automatic I2P @@ -918,7 +1138,7 @@ If you have issues connecting over Tor check the Tor logs too. - Enable I2P BOB - changing this requires a restart to fully take effect + Enable I2P SAMv3 - changing this requires a restart to fully take effect @@ -950,7 +1170,7 @@ If you have issues connecting over Tor check the Tor logs too. - I2P Basic Open Bridge + I2P Simple Anonymous Messaging @@ -982,21 +1202,17 @@ If you have issues connecting over Tor check the Tor logs too. - - - I2P proxy port + + + Qt::Horizontal - - - - - - 10 + + + 40 + 20 + - - 65535 - - + @@ -1016,7 +1232,7 @@ If you have issues connecting over Tor check the Tor logs too. <html><head/><body><p>This led is green when the port listen on the left is active on your computer. It does not</p><p>mean that your Retroshare traffic transits though I2P. It will do so only if </p><p>you connect to Hidden nodes, or if you are running a Hidden node yourself.</p></body></html> - BOB accessible + SAM accessible @@ -1073,12 +1289,12 @@ If you have issues connecting over Tor check the Tor logs too. true - 1 + 0 - + 0 @@ -1304,6 +1520,13 @@ If you have issues connecting over Tor check the Tor logs too. + + + + <key info> + + + @@ -1359,7 +1582,7 @@ If you have issues connecting over Tor check the Tor logs too. - BOB status + SAM status @@ -1959,13 +2182,230 @@ If you have issues connecting over Tor check the Tor logs too. - + 0 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 154 + 154 + 154 + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + border: 1px solid #DCDC41; border-radius: 6px; @@ -2037,13 +2477,230 @@ If you have issues connecting over Tor check the Tor logs too. - + 0 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 154 + 154 + 154 + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + + + + 255 + 255 + 215 + + + + + 255 + 255 + 178 + + + + + + + + border: 1px solid #DCDC41; border-radius: 6px; @@ -2080,6 +2737,13 @@ If you have issues connecting over Tor check the Tor logs too. + + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
localAddress localPort diff --git a/retroshare-gui/src/gui/settings/ServicePermissionsPage.cpp b/retroshare-gui/src/gui/settings/ServicePermissionsPage.cpp index 15a0bf70f..84df07589 100644 --- a/retroshare-gui/src/gui/settings/ServicePermissionsPage.cpp +++ b/retroshare-gui/src/gui/settings/ServicePermissionsPage.cpp @@ -35,10 +35,10 @@ ServicePermissionsPage::ServicePermissionsPage(QWidget * parent, Qt::WindowFlags ui.cb_hideOffline->setChecked(true); - connect(ui.cb_hideOffline, SIGNAL(toggled(bool)), ui.frame, SLOT(setHideOffline(bool))); + connect(ui.cb_hideOffline, SIGNAL(toggled(bool)), ui.gradFrame, SLOT(setHideOffline(bool))); //QObject::connect(ui.tableWidget,SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(tableItemChanged(QTableWidgetItem *))); - ui.frame->setHideOffline(ui.cb_hideOffline->isChecked()); + ui.gradFrame->setHideOffline(ui.cb_hideOffline->isChecked()); // Not implemented? ui.pushButton->hide(); diff --git a/retroshare-gui/src/gui/settings/ServicePermissionsPage.ui b/retroshare-gui/src/gui/settings/ServicePermissionsPage.ui index 488ba9518..2dd6f7bc1 100644 --- a/retroshare-gui/src/gui/settings/ServicePermissionsPage.ui +++ b/retroshare-gui/src/gui/settings/ServicePermissionsPage.ui @@ -10,7 +10,7 @@ 331 - + @@ -45,16 +45,16 @@ 0 - + - + - + ServicePermissions @@ -71,7 +71,7 @@ - + Qt::Horizontal diff --git a/retroshare-gui/src/gui/settings/TransferPage.ui b/retroshare-gui/src/gui/settings/TransferPage.ui index 4c925ebb1..982df905e 100644 --- a/retroshare-gui/src/gui/settings/TransferPage.ui +++ b/retroshare-gui/src/gui/settings/TransferPage.ui @@ -401,7 +401,7 @@ p, li { white-space: pre-wrap; } - + true @@ -467,7 +467,7 @@ p, li { white-space: pre-wrap; } - + <html><head/><body><p>Anonymous tunnels can be end-o-end encrypted. In order to maintain backward compatibility, this can be made optional (choosing &quot;Accepted&quot;), but in the end, all Retroshare nodes will be switched to &quot;Enforced&quot;, meaning that all anonymous transfers will be end-to-end encrypted. With &quot;Accepted&quot;, it is likely that you will transfer using twice as many tunnels, since there is no way to know that an encrypted and a clear tunnel actually transfer from the same source.</p></body></html> @@ -484,7 +484,7 @@ p, li { white-space: pre-wrap; } - + <html><head/><body><p>How RS manage direct download setting.</p></body></html> @@ -538,6 +538,13 @@ p, li { white-space: pre-wrap; } + + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
diff --git a/retroshare-gui/src/gui/settings/WebuiPage.cpp b/retroshare-gui/src/gui/settings/WebuiPage.cpp index 8bdc11146..f0006fec3 100644 --- a/retroshare-gui/src/gui/settings/WebuiPage.cpp +++ b/retroshare-gui/src/gui/settings/WebuiPage.cpp @@ -65,6 +65,9 @@ void WebuiPage::selectWebInterfaceDirectory() return; whileBlocking(ui.webInterfaceFiles_LE)->setText(dirname); + + QString S; + updateParams(S); } bool WebuiPage::updateParams(QString &errmsg) @@ -82,6 +85,8 @@ bool WebuiPage::updateParams(QString &errmsg) // store config Settings->setWebinterfaceEnabled(ui.enableWebUI_CB->isChecked()); Settings->setWebinterfaceFilesDirectory(ui.webInterfaceFiles_LE->text()); + + rsWebUi->setHtmlFilesDirectory(ui.webInterfaceFiles_LE->text().toStdString()); } return ok; } @@ -196,6 +201,9 @@ void WebuiPage::onApplyClicked() { rsWebUi->setUserPassword(ui.password_LE->text().toStdString()); + QString errmsg; + updateParams(errmsg); + if(!restart()) { QMessageBox::warning(0, tr("failed to start Webinterface"), "Failed to start the webinterface."); diff --git a/retroshare-gui/src/gui/settings/rsettingswin.cpp b/retroshare-gui/src/gui/settings/rsettingswin.cpp index 6d3f10bbc..deb82c9ad 100644 --- a/retroshare-gui/src/gui/settings/rsettingswin.cpp +++ b/retroshare-gui/src/gui/settings/rsettingswin.cpp @@ -226,8 +226,8 @@ SettingsPage::setNewPage(int page) mHelpBrowser->clear(); return ; } - ui.pageName->setText(pagew->pageName()); - ui.pageicon->setPixmap(pagew->iconPixmap()) ; + ui.pageNameLabel->setText(pagew->pageName()); + ui.pageIconLabel->setPixmap(pagew->iconPixmap()) ; ui.stackedWidget->setCurrentIndex(page); ui.listWidget->setCurrentRow(page); diff --git a/retroshare-gui/src/gui/settings/rsettingswin.h b/retroshare-gui/src/gui/settings/rsettingswin.h index a3242aaa4..74fb0d40c 100755 --- a/retroshare-gui/src/gui/settings/rsettingswin.h +++ b/retroshare-gui/src/gui/settings/rsettingswin.h @@ -30,7 +30,7 @@ class FloatingHelpBrowser; -#define IMAGE_PREFERENCES ":/icons/png/options.png" +#define PREF_IMAGE_PREFERENCES ":/icons/png/options.png" class SettingsPage: public MainPage { @@ -46,7 +46,7 @@ public: void postModDirectories(bool update_local); - virtual QIcon iconPixmap() const { return FilesDefs::getIconFromQtResourcePath(IMAGE_PREFERENCES) ; } //MainPage + virtual QIcon iconPixmap() const { return FilesDefs::getIconFromQtResourcePath(PREF_IMAGE_PREFERENCES) ; } //MainPage virtual QString pageName() const { return tr("Preferences") ; } //MainPage protected: diff --git a/retroshare-gui/src/gui/settings/rsharesettings.cpp b/retroshare-gui/src/gui/settings/rsharesettings.cpp index 86a93559e..3411c78f7 100644 --- a/retroshare-gui/src/gui/settings/rsharesettings.cpp +++ b/retroshare-gui/src/gui/settings/rsharesettings.cpp @@ -129,7 +129,7 @@ void RshareSettings::initSettings() #endif setDefault(SETTING_LANGUAGE, LanguageSupport::defaultLanguageCode()); - setDefault(SETTING_SHEETNAME, ":Standard"); + setDefault(SETTING_SHEETNAME, ":Standard_Light"); /* defaults here are not ideal.... but dusent matter */ diff --git a/retroshare-gui/src/gui/settings/settings.ui b/retroshare-gui/src/gui/settings/settings.ui index 8d774dce2..18b910fb3 100755 --- a/retroshare-gui/src/gui/settings/settings.ui +++ b/retroshare-gui/src/gui/settings/settings.ui @@ -47,7 +47,7 @@ - + 0 @@ -56,6 +56,7 @@ + 12 75 true @@ -66,7 +67,7 @@ - + 24 @@ -215,13 +216,6 @@ - - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
-
diff --git a/retroshare-gui/src/gui/settings/settingsw.ui b/retroshare-gui/src/gui/settings/settingsw.ui index fa6f197db..d1cbd3caf 100644 --- a/retroshare-gui/src/gui/settings/settingsw.ui +++ b/retroshare-gui/src/gui/settings/settingsw.ui @@ -78,7 +78,7 @@
- + 24 @@ -91,7 +91,7 @@ - + 0 @@ -100,6 +100,7 @@ + 12 75 true @@ -169,13 +170,6 @@
- - - StyledLabel - QLabel -
gui/common/StyledLabel.h
-
-
diff --git a/retroshare-gui/src/gui/statistics/BandwidthStatsWidget.ui b/retroshare-gui/src/gui/statistics/BandwidthStatsWidget.ui index dc36efbad..f62171aa1 100644 --- a/retroshare-gui/src/gui/statistics/BandwidthStatsWidget.ui +++ b/retroshare-gui/src/gui/statistics/BandwidthStatsWidget.ui @@ -49,7 +49,7 @@
- + 0 @@ -69,7 +69,7 @@ - + Up @@ -90,7 +90,7 @@ - + 0 @@ -110,7 +110,7 @@ - + @@ -120,7 +120,7 @@ - + Current @@ -141,7 +141,7 @@ - + Default @@ -179,6 +179,11 @@
gui/statistics/BWGraph.h
1 + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
diff --git a/retroshare-gui/src/gui/statusbar/OpModeStatus.cpp b/retroshare-gui/src/gui/statusbar/OpModeStatus.cpp index f44f6d29c..994974342 100644 --- a/retroshare-gui/src/gui/statusbar/OpModeStatus.cpp +++ b/retroshare-gui/src/gui/statusbar/OpModeStatus.cpp @@ -30,7 +30,7 @@ #include OpModeStatus::OpModeStatus(QWidget *parent) - : QComboBox(parent) + : RSComboBox(parent) { onUpdate = false; opMode_Full_Color = QColor("#CCFFCC"); diff --git a/retroshare-gui/src/gui/statusbar/OpModeStatus.h b/retroshare-gui/src/gui/statusbar/OpModeStatus.h index 80fc111a5..9ffe282a3 100644 --- a/retroshare-gui/src/gui/statusbar/OpModeStatus.h +++ b/retroshare-gui/src/gui/statusbar/OpModeStatus.h @@ -21,9 +21,9 @@ #ifndef OP_MODE_STATUS_H #define OP_MODE_STATUS_H -#include +#include "gui/common/RSComboBox.h" -class OpModeStatus : public QComboBox +class OpModeStatus : public RSComboBox { Q_OBJECT Q_PROPERTY(QColor opMode_Full_Color READ getOpMode_Full_Color WRITE setOpMode_Full_Color DESIGNABLE true) diff --git a/retroshare-gui/src/gui/style/StyleDialog.ui b/retroshare-gui/src/gui/style/StyleDialog.ui index 312453628..1da590d9b 100644 --- a/retroshare-gui/src/gui/style/StyleDialog.ui +++ b/retroshare-gui/src/gui/style/StyleDialog.ui @@ -102,7 +102,7 @@
- + 0 @@ -183,6 +183,11 @@
gui/common/HeaderFrame.h
1 + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
diff --git a/retroshare-gui/src/gui/toaster/ChatLobbyToaster.ui b/retroshare-gui/src/gui/toaster/ChatLobbyToaster.ui index b6408ed93..e45b87103 100644 --- a/retroshare-gui/src/gui/toaster/ChatLobbyToaster.ui +++ b/retroshare-gui/src/gui/toaster/ChatLobbyToaster.ui @@ -22,30 +22,48 @@ 100
- + 0 - + + 0 + + + 0 + + + 0 + + 0 - + QFrame::WinPanel QFrame::Raised - - + + + 2 + + + 2 + + + 2 + + 2 2 - + 6 @@ -79,13 +97,20 @@ + + + 12 + 75 + true + + Name - + Qt::Horizontal @@ -123,7 +148,7 @@ - + 2 diff --git a/retroshare-gui/src/gui/toaster/ChatToaster.ui b/retroshare-gui/src/gui/toaster/ChatToaster.ui index 8b517684b..1c6ee5ae2 100644 --- a/retroshare-gui/src/gui/toaster/ChatToaster.ui +++ b/retroshare-gui/src/gui/toaster/ChatToaster.ui @@ -22,30 +22,48 @@ 100 - + 0 - + + 0 + + + 0 + + + 0 + + 0 - + QFrame::WinPanel QFrame::Raised - - + + + 2 + + + 2 + + + 2 + + 2 2 - + 6 @@ -79,13 +97,20 @@ + + + 12 + 75 + true + + Name - + Qt::Horizontal @@ -123,7 +148,7 @@ - + 2 diff --git a/retroshare-gui/src/gui/toaster/DownloadToaster.ui b/retroshare-gui/src/gui/toaster/DownloadToaster.ui index de68906b7..86ef2a666 100644 --- a/retroshare-gui/src/gui/toaster/DownloadToaster.ui +++ b/retroshare-gui/src/gui/toaster/DownloadToaster.ui @@ -22,30 +22,48 @@ 100 - + 0 - + + 0 + + + 0 + + + 0 + + 0 - + QFrame::WinPanel QFrame::Raised - - + + + 2 + + + 2 + + + 2 + + 2 2 - + 6 @@ -82,13 +100,20 @@ + + + 12 + 75 + true + + Download completed - + Qt::Horizontal @@ -126,7 +151,7 @@ - + diff --git a/retroshare-gui/src/gui/toaster/FriendRequestToaster.ui b/retroshare-gui/src/gui/toaster/FriendRequestToaster.ui index ae203707a..e420b68b4 100644 --- a/retroshare-gui/src/gui/toaster/FriendRequestToaster.ui +++ b/retroshare-gui/src/gui/toaster/FriendRequestToaster.ui @@ -22,30 +22,48 @@ 100 - + 0 - + + 0 + + + 0 + + + 0 + + 0 - + QFrame::WinPanel QFrame::Raised - - + + + 2 + + + 2 + + + 2 + + 2 2 - + 6 @@ -79,13 +97,20 @@ + + + 12 + 75 + true + + Friend Request - + Qt::Horizontal @@ -123,7 +148,7 @@ - + 2 diff --git a/retroshare-gui/src/gui/toaster/GroupChatToaster.ui b/retroshare-gui/src/gui/toaster/GroupChatToaster.ui index 83ffdfd9a..9f701023a 100644 --- a/retroshare-gui/src/gui/toaster/GroupChatToaster.ui +++ b/retroshare-gui/src/gui/toaster/GroupChatToaster.ui @@ -22,30 +22,48 @@ 100 - + 0 - + + 0 + + + 0 + + + 0 + + 0 - + QFrame::WinPanel QFrame::Raised - - + + + 2 + + + 2 + + + 2 + + 2 2 - + 6 @@ -79,13 +97,20 @@ + + + 12 + 75 + true + + Name - + Qt::Horizontal @@ -123,7 +148,7 @@ - + 2 diff --git a/retroshare-gui/src/gui/toaster/MessageToaster.ui b/retroshare-gui/src/gui/toaster/MessageToaster.ui index 89dcb79a4..1dce4be57 100644 --- a/retroshare-gui/src/gui/toaster/MessageToaster.ui +++ b/retroshare-gui/src/gui/toaster/MessageToaster.ui @@ -22,30 +22,48 @@ 100 - + 0 - + + 0 + + + 0 + + + 0 + + 0 - + QFrame::WinPanel QFrame::Raised - - + + + 2 + + + 2 + + + 2 + + 2 2 - + 6 @@ -79,13 +97,20 @@ + + + 12 + 75 + true + + 1 new Message from - + Qt::Horizontal @@ -123,7 +148,7 @@ - + 2 diff --git a/retroshare-gui/src/gui/toaster/OnlineToaster.ui b/retroshare-gui/src/gui/toaster/OnlineToaster.ui index a40f9f80c..248870e66 100644 --- a/retroshare-gui/src/gui/toaster/OnlineToaster.ui +++ b/retroshare-gui/src/gui/toaster/OnlineToaster.ui @@ -22,30 +22,48 @@ 100 - + 0 - + + 0 + + + 0 + + + 0 + + 0 - + QFrame::WinPanel QFrame::Raised - - + + + 2 + + + 2 + + + 2 + + 2 2 - + 6 @@ -79,13 +97,20 @@ + + + 12 + 75 + true + + RetroShare - + Qt::Horizontal @@ -123,7 +148,7 @@ - + 2 diff --git a/retroshare-gui/src/gui/unfinished/ApplicationWindow.ui b/retroshare-gui/src/gui/unfinished/ApplicationWindow.ui index ffa98afbd..df4f39a2c 100644 --- a/retroshare-gui/src/gui/unfinished/ApplicationWindow.ui +++ b/retroshare-gui/src/gui/unfinished/ApplicationWindow.ui @@ -53,6 +53,15 @@ + + + + 0 + 0 + 0 + + + @@ -73,6 +82,15 @@ + + + + 0 + 0 + 0 + + + @@ -93,6 +111,15 @@ + + + + 154 + 154 + 154 + + + diff --git a/retroshare-gui/src/gui/unfinished/CalDialog.ui b/retroshare-gui/src/gui/unfinished/CalDialog.ui index 8615caa12..598e7f870 100644 --- a/retroshare-gui/src/gui/unfinished/CalDialog.ui +++ b/retroshare-gui/src/gui/unfinished/CalDialog.ui @@ -1,7 +1,8 @@ - + + CalDialog - - + + 0 0 @@ -9,76 +10,68 @@ 540 - + Form - - + + 0 - + 6 - + 0 - + 6 - + 0 - - - + + + QTabWidget::Rounded - + 0 - + Qt::ElideNone - - - - 0 - 0 - 734 - 501 - - - + + Local Calendars - - - - + + + + QLayout::SetMaximumSize - - - + + + 75 true - + Shared Calendar List - - - - + + + + 0 0 - + 289 0 @@ -88,154 +81,154 @@ - - - + + + 75 true - + Share Details - - - + + + QLayout::SetMaximumSize - - - + + + Name: - - + + - - - + + + Location: - - - + + + QLayout::SetMaximumSize - - - - + + + + 0 0 - - - - + + + + 0 0 - + 30 0 - + 0 16777215 - + 0 0 - + ... - - - + + + Status: - - - + + + 100 0 - + 0 16777215 - + Private - + Public - - - + + + Allow List: - + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - + + - - <Disabled> + + <Disabled> - - - + + + QLayout::SetMaximumSize - + Qt::Horizontal - + 40 20 @@ -244,15 +237,15 @@ - - + + Add - - + + Remove @@ -261,16 +254,8 @@ - - - - 26 - 45 - 760 - 509 - - - + + Peer Calendars @@ -278,8 +263,15 @@ + + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
- +
diff --git a/retroshare-gui/src/gui/unfinished/GamesDialog.ui b/retroshare-gui/src/gui/unfinished/GamesDialog.ui index 074504d9d..95c5a4daf 100644 --- a/retroshare-gui/src/gui/unfinished/GamesDialog.ui +++ b/retroshare-gui/src/gui/unfinished/GamesDialog.ui @@ -77,7 +77,7 @@ p, li { white-space: pre-wrap; }
- + GameType: 0. Want to Add your Game here? @@ -326,6 +326,13 @@ p, li { white-space: pre-wrap; }
+ + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
diff --git a/retroshare-gui/src/gui/unfinished/LibraryDialog.ui b/retroshare-gui/src/gui/unfinished/LibraryDialog.ui index da20212c0..e7bb8319a 100644 --- a/retroshare-gui/src/gui/unfinished/LibraryDialog.ui +++ b/retroshare-gui/src/gui/unfinished/LibraryDialog.ui @@ -169,7 +169,7 @@
- + 0 @@ -805,6 +805,13 @@ p, li { white-space: pre-wrap; }
+ + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
diff --git a/retroshare-gui/src/gui/unfinished/PhotoShow.ui b/retroshare-gui/src/gui/unfinished/PhotoShow.ui index 112a63e4d..49e0be621 100644 --- a/retroshare-gui/src/gui/unfinished/PhotoShow.ui +++ b/retroshare-gui/src/gui/unfinished/PhotoShow.ui @@ -68,7 +68,7 @@ - + 320 x 320 @@ -94,7 +94,7 @@ - + 1 Sec @@ -243,8 +243,15 @@ + + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
- + diff --git a/retroshare-gui/src/gui/unfinished/StatisticDialog.ui b/retroshare-gui/src/gui/unfinished/StatisticDialog.ui index 9543c0b83..6904b8b8f 100644 --- a/retroshare-gui/src/gui/unfinished/StatisticDialog.ui +++ b/retroshare-gui/src/gui/unfinished/StatisticDialog.ui @@ -486,7 +486,16 @@ 6 - + + 9 + + + 9 + + + 9 + + 9 @@ -496,7 +505,7 @@ - + 0 0 @@ -862,9 +871,9 @@
- + - + 1 0 @@ -879,11 +888,20 @@ 6 - + + 9 + + + 9 + + + 9 + + 9 - + 120 @@ -900,7 +918,16 @@ 6 - + + 0 + + + 0 + + + 0 + + 0 @@ -938,7 +965,7 @@ - + 0 0 @@ -968,7 +995,16 @@ 6 - + + 9 + + + 9 + + + 9 + + 9 @@ -976,7 +1012,16 @@ 6 - + + 3 + + + 3 + + + 3 + + 3 @@ -1060,7 +1105,16 @@ 3 - + + 0 + + + 0 + + + 0 + + 0 @@ -1068,7 +1122,16 @@ 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -1173,7 +1236,16 @@ 1 - + + 0 + + + 0 + + + 0 + + 0 diff --git a/retroshare-gui/src/gui/unfinished/profile/ProfileEdit.ui b/retroshare-gui/src/gui/unfinished/profile/ProfileEdit.ui index a4cdaf000..d1ff3203a 100644 --- a/retroshare-gui/src/gui/unfinished/profile/ProfileEdit.ui +++ b/retroshare-gui/src/gui/unfinished/profile/ProfileEdit.ui @@ -1,56 +1,57 @@ - + + ProfileEdit - - + + 0 0 - 540 + 571 469 - + Profile Edit - + Qt::LeftToRight - - - - + + + + Qt::Vertical - - + + - - + + 75 true - + Profile - - + + Qt::CustomContextMenu - + false - + Category - + Thoughts @@ -58,99 +59,99 @@ - - - - - + + + + + 75 true - + Edit Profile Category - - + + - + Birthday - + School - + University - + Phone Number - + Favourite Books - + Favourite Music - + Favourite Films - - - + + + Qt::RightToLeft - + or Custom Entry - - + + - - + + - - + + - - + + Add Entry - - + + :/images/add_24x24.png:/images/add_24x24.png - + Qt::Horizontal - + 71 28 @@ -159,36 +160,36 @@ - - + + Qt::RightToLeft - + Move - - + + :/images/down.png:/images/down.png - - + + Move - - + + :/images/up.png:/images/up.png - + Qt::Horizontal - + 71 28 @@ -197,15 +198,15 @@ - - + + Qt::RightToLeft - + Close Editor - - + + :/images/close_normal.png:/images/close_normal.png @@ -214,8 +215,15 @@ + + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
+
- +
diff --git a/retroshare-gui/src/qss/blacknight/check_sel.png b/retroshare-gui/src/qss/blacknight/check_sel.png deleted file mode 100644 index 300de11ee..000000000 Binary files a/retroshare-gui/src/qss/blacknight/check_sel.png and /dev/null differ diff --git a/retroshare-gui/src/qss/blacknight/check_unsel.png b/retroshare-gui/src/qss/blacknight/check_unsel.png deleted file mode 100644 index 50ca1d0a5..000000000 Binary files a/retroshare-gui/src/qss/blacknight/check_unsel.png and /dev/null differ diff --git a/retroshare-gui/src/qss/blacknight/clbg.png b/retroshare-gui/src/qss/blacknight/clbg.png deleted file mode 100644 index 45ce37337..000000000 Binary files a/retroshare-gui/src/qss/blacknight/clbg.png and /dev/null differ diff --git a/retroshare-gui/src/qss/blacknight/down.png b/retroshare-gui/src/qss/blacknight/down.png deleted file mode 100644 index ce161569b..000000000 Binary files a/retroshare-gui/src/qss/blacknight/down.png and /dev/null differ diff --git a/retroshare-gui/src/qss/blacknight/radio_sel.png b/retroshare-gui/src/qss/blacknight/radio_sel.png deleted file mode 100644 index 1239b6dc8..000000000 Binary files a/retroshare-gui/src/qss/blacknight/radio_sel.png and /dev/null differ diff --git a/retroshare-gui/src/qss/blacknight/radio_unsel.png b/retroshare-gui/src/qss/blacknight/radio_unsel.png deleted file mode 100644 index 4c895c9da..000000000 Binary files a/retroshare-gui/src/qss/blacknight/radio_unsel.png and /dev/null differ diff --git a/retroshare-gui/src/qss/blacknight/up.png b/retroshare-gui/src/qss/blacknight/up.png deleted file mode 100644 index 38d747789..000000000 Binary files a/retroshare-gui/src/qss/blacknight/up.png and /dev/null differ diff --git a/retroshare-gui/src/qss/blue.qss b/retroshare-gui/src/qss/blue.qss deleted file mode 100644 index 894196f68..000000000 --- a/retroshare-gui/src/qss/blue.qss +++ /dev/null @@ -1,199 +0,0 @@ -.QWidget { - background-color: #c4dafa; - border-color: transparent; -} - -QFrame#titleBarFrame, QFrame#toolBarFrame { - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #E3EFFF, stop: 1 #87ADE4); - border: 1px solid #87ADE4; -} - -FriendsDialog QFrame#headFrame { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #E3EFFF, stop: 1 #87ADE4); - border: 1px solid #87ADE4; - border: 1px; - border-radius: 4px; -} - -HeaderFrame { - background-image: url(:/images/headerFrame.png); - border: 0px; -} - -QDialog{ - background-color: #c4dafa; - -} - -QWidget#chatcentralwidget{ - background-color: #c4dafa; - -} - -QToolBar#chattoolBar{ - border-image: url(%THISPATH%/blue/blue.png); - - -} - - -/* Customize the toolbar. */ -QToolBar#toolBarPage { - border-image: url(%THISPATH%/blue/blue.png); - -} - -QToolBar#toolBarAction { - border-image: url(%THISPATH%/blue/blue.png); - -} - -QTabBar::tab { - border-image: url(%THISPATH%/blue/tab1.png); - min-width: 8ex; - padding: 4px; - - -} - -QTabBar::tab:!selected { - margin-top: 2px; /* make non-selected tabs look smaller */ - -} - -QTabBar::tab:selected, QTabBar::tab:hover { - - border-image: url(%THISPATH%/blue/tab_hover.png); - - -} - -QTabBar::tab:selected { - border-image: url(%THISPATH%/blue/tabselected.png); -} - -QPushButton#okButton { - min-height: 27px; - min-width: 77px; -} - -QPushButton#cancelprefButton { - min-height: 27px; - min-width: 77px; -} - -QPushButton#cancelButton { - min-height: 25px; - max-height: 25px; - min-width: 75px; -} - - -QPushButton#applyButton { - - min-height: 25px; - max-height: 25px; - min-width: 75px; -} - - - -QMenu::item:selected { /* when user selects item using mouse or keyboard */ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #E3EFFF, stop: 1 #87ADE4); -} - -QListWidget::item:selected { /* when user selects item using mouse or keyboard */ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #E3EFFF, stop: 1 #87ADE4); -} - -QTreeWidget::item:selected { /* when user selects item using mouse or keyboard */ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #E3EFFF, stop: 1 #87ADE4); -} - -QStatusBar{ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #E3EFFF, stop: 1 #87ADE4); -} - - -QFrame#messengerframetop{ - - border-image: url(%THISPATH%/blue/blue.png); - -} - -QFrame#Chatbuttonframe{ - - border-image: url(%THISPATH%/blue/blue.png); - -} - -QLabel#subjectText{ - font: bold 12px; - -} - -QLabel#subjectlabel{ - font: bold 12px; - -} - -QLabel#fromlabel{ - font: bold 12px; - -} - -QLabel#datelabel{ - font: bold 12px; - -} - -QLabel#tolabel{ - font: bold 12px; - -} - -QLabel#fromText{ - font: bold ; - color: blue; - -} -QSplitter#splitter{ - border-image: url(%THISPATH%/blue/blue.png); - -} - -HomePage QToolButton#addButton { - font: bold; - font-size: 15pt; - color: white; - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #E3EFFF, stop: 1 #87ADE4); - border: 1px solid #87ADE4; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -HomePage QToolButton#addButton:hover { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e3e5ff, stop: 1 #879ae4); - border: 1px solid #879ae4; - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - -MainWindow QListWidget { - font-size: 12pt; -} - diff --git a/retroshare-gui/src/qss/blue/blue.png b/retroshare-gui/src/qss/blue/blue.png deleted file mode 100644 index 28a723edd..000000000 Binary files a/retroshare-gui/src/qss/blue/blue.png and /dev/null differ diff --git a/retroshare-gui/src/qss/blue/blue2.png b/retroshare-gui/src/qss/blue/blue2.png deleted file mode 100644 index 7671a1649..000000000 Binary files a/retroshare-gui/src/qss/blue/blue2.png and /dev/null differ diff --git a/retroshare-gui/src/qss/blue/tab1.png b/retroshare-gui/src/qss/blue/tab1.png deleted file mode 100644 index 68d6960b4..000000000 Binary files a/retroshare-gui/src/qss/blue/tab1.png and /dev/null differ diff --git a/retroshare-gui/src/qss/blue/tab_hover.png b/retroshare-gui/src/qss/blue/tab_hover.png deleted file mode 100644 index 1a5fc3ef4..000000000 Binary files a/retroshare-gui/src/qss/blue/tab_hover.png and /dev/null differ diff --git a/retroshare-gui/src/qss/blue/tabselected.png b/retroshare-gui/src/qss/blue/tabselected.png deleted file mode 100644 index 78a819cb8..000000000 Binary files a/retroshare-gui/src/qss/blue/tabselected.png and /dev/null differ diff --git a/retroshare-gui/src/qss/groove.qss b/retroshare-gui/src/qss/groove.qss deleted file mode 100644 index 51f8d8c4b..000000000 --- a/retroshare-gui/src/qss/groove.qss +++ /dev/null @@ -1,94 +0,0 @@ -.QWidget{ - - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #6799B3, stop: 1 #377a90); -} - -QFrame#titleBarFrame, QFrame#toolBarFrame { - - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #6799B3, stop: 0.3 #377a90, - stop: 0.31 #0e5e73, stop: 1 #4b8598); - - border: 1px solid #4b8598; -} - -HeaderFrame { - -} - -QDialog{ - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #6799B3, stop: 1 #377a90); - -} - -QWidget#chatcentralwidget{ - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #6799B3, stop: 1 #377a90); - - -} - -QToolBar#chattoolBar{ - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #6799B3, stop: 0.3 #377a90, - stop: 0.31 #0e5e73, stop: 1 #4b8598); - - border: 1px solid #4b8598; -} - -QFrame#Chatbuttonframe{ - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #6799B3, stop: 0.3 #377a90, - stop: 0.31 #0e5e73, stop: 1 #4b8598); - - border: 1px solid #4b8598; -} - -QStatusBar{ - - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #6799B3, stop: 1 #377a90); - -} - -/* Customize the toolbar. */ -QToolBar { - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #6799B3, stop: 0.3 #377a90, - stop: 0.31 #0e5e73, stop: 1 #4b8598); - - border: 1px solid #4b8598; -} - -QTreeWidget::item:selected { /* when user selects item using mouse or keyboard */ - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #6799B3, stop: 0.3 #377a90, - stop: 0.31 #0e5e73, stop: 1 #4b8598); - -} - -HomePage QToolButton#addButton { - font: bold; - font-size: 15pt; - color: white; - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #6799B3, stop: 0.3 #377a90, - stop: 0.31 #0e5e73, stop: 1 #4b8598); - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -HomePage QToolButton#addButton:hover { - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #719cb2, stop: 0.3 #5e9bab, - stop: 0.31 #0e5e69, stop: 1 #4b9897); - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - -MainWindow QListWidget { - font-size: 12pt; -} - - diff --git a/retroshare-gui/src/qss/orangesurfer.qss b/retroshare-gui/src/qss/orangesurfer.qss deleted file mode 100644 index a3c7c6174..000000000 --- a/retroshare-gui/src/qss/orangesurfer.qss +++ /dev/null @@ -1,231 +0,0 @@ -.QWidget { - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07); - -} - -QFrame#titleBarFrame, QFrame#toolBarFrame { - - border-image: url(%THISPATH%/orangesurfer/main.png); -} - -HeaderFrame { - background-image: url(:/images/headerFrame.png); - border: 0px; -} - -QDialog, QMainWindow{ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07); -} - -QWidget#chatcentralwidget{ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07); - -} - -QToolBar#chattoolBar{ - border-image: url(%THISPATH%/orangesurfer/main.png); - - -} - -/* Customize the toolbar. */ -QToolBar#toolBarPage { - border-image: url(%THISPATH%/orangesurfer/main.png); - -} - -QToolBar#toolBarAction { - border-image: url(%THISPATH%/orangesurfer/main.png); - -} - - -QTabBar::tab { - border-image: url(%THISPATH%/orangesurfer/tab_normal.png); - border-top-left-radius: 4px; - border-top-right-radius: 4px; - min-width: 8ex; - padding: 4px; - - -} - -QTabBar::tab:!selected { - margin-top: 2px; /* make non-selected tabs look smaller */ - -} - -QTabBar::tab:selected, QTabBar::tab:hover { - - border-image: url(%THISPATH%/orangesurfer/tab_hover.png); - - -} - -QTabBar::tab:selected { - border-image: url(%THISPATH%/orangesurfer/tab_pressed.png); -} - - -QPushButton#okButton { - min-height: 27px; - min-width: 77px; -} - -QPushButton#cancelprefButton { - min-height: 27px; - min-width: 77px; -} - -QPushButton#cancelButton { - min-height: 25px; - max-height: 25px; - min-width: 75px; -} - - -QPushButton#applyButton { - - min-height: 25px; - max-height: 25px; - min-width: 75px; -} - - - -QStatusBar{ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #67768D, stop: 0.4 #EDEEFD); - -} - -QSizeGrip { - image: url(%THISPATH%/orangesurfer/sizegrip.png); - width: 16px; - height: 16px; -} - -QMenu { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #67768D, stop: 0.4 #EDEEFD); - border: 1px solid black; -} - -QMenu::item:selected { /* when user selects item using mouse or keyboard */ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07); -} - -QListWidget::item:selected { /* when user selects item using mouse or keyboard */ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07); -} - - -QTreeWidget { /* when user selects item using mouse or keyboard */ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07); - - -} -QTreeWidget::item:selected { /* when user selects item using mouse or keyboard */ - - - - border-image: url(%THISPATH%/orangesurfer/border.png); - -} - -QTreeView { /* when user selects item using mouse or keyboard */ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07); - - -} - -QTreeView::item:selected { /* when user selects item using mouse or keyboard */ - - /*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07);*/ - - border-image: url(%THISPATH%/orangesurfer/border.png); - -} - -QFrame#messengerframetop{ - - border-image: url(%THISPATH%/orangesurfer/main.png); - - /*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07);*/ -} - -QFrame#Chatbuttonframe{ - - border-image: url(%THISPATH%/orangesurfer/main.png); - -} - -QLabel#subjectText{ - font: bold 12px; - -} - -QLabel#subjectlabel{ - font: bold 12px; - -} - -QLabel#fromlabel{ - font: bold 12px; - -} - -QLabel#datelabel{ - font: bold 12px; - -} - -QLabel#tolabel{ - font: bold 12px; - -} - -QLabel#fromText{ - font: bold ; - color: blue; - -} - -HomePage QToolButton#addButton { - font: bold; - font-size: 15pt; - color: white; - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #F7B552, stop: 1 #FF5E07); - border: 1px solid #FF5E07; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -HomePage QToolButton#addButton:hover { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #fac26e, stop: 1 #f87d3b); - border: 1px solid #f87d3b; - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - -MainWindow QListWidget { - font-size: 12pt; -} diff --git a/retroshare-gui/src/qss/orangesurfer/border.png b/retroshare-gui/src/qss/orangesurfer/border.png deleted file mode 100644 index e8bd39f07..000000000 Binary files a/retroshare-gui/src/qss/orangesurfer/border.png and /dev/null differ diff --git a/retroshare-gui/src/qss/orangesurfer/main.png b/retroshare-gui/src/qss/orangesurfer/main.png deleted file mode 100644 index 2605e0d4d..000000000 Binary files a/retroshare-gui/src/qss/orangesurfer/main.png and /dev/null differ diff --git a/retroshare-gui/src/qss/orangesurfer/main2.png b/retroshare-gui/src/qss/orangesurfer/main2.png deleted file mode 100644 index e977b4812..000000000 Binary files a/retroshare-gui/src/qss/orangesurfer/main2.png and /dev/null differ diff --git a/retroshare-gui/src/qss/orangesurfer/sizegrip.png b/retroshare-gui/src/qss/orangesurfer/sizegrip.png deleted file mode 100644 index be6cd102c..000000000 Binary files a/retroshare-gui/src/qss/orangesurfer/sizegrip.png and /dev/null differ diff --git a/retroshare-gui/src/qss/orangesurfer/tab_hover.png b/retroshare-gui/src/qss/orangesurfer/tab_hover.png deleted file mode 100644 index 1a5fc3ef4..000000000 Binary files a/retroshare-gui/src/qss/orangesurfer/tab_hover.png and /dev/null differ diff --git a/retroshare-gui/src/qss/orangesurfer/tab_normal.png b/retroshare-gui/src/qss/orangesurfer/tab_normal.png deleted file mode 100644 index f3a4b4694..000000000 Binary files a/retroshare-gui/src/qss/orangesurfer/tab_normal.png and /dev/null differ diff --git a/retroshare-gui/src/qss/orangesurfer/tab_pressed.png b/retroshare-gui/src/qss/orangesurfer/tab_pressed.png deleted file mode 100644 index eeae9b138..000000000 Binary files a/retroshare-gui/src/qss/orangesurfer/tab_pressed.png and /dev/null differ diff --git a/retroshare-gui/src/qss/orangesurfer/toolbar.png b/retroshare-gui/src/qss/orangesurfer/toolbar.png deleted file mode 100644 index 2aae1f8ff..000000000 Binary files a/retroshare-gui/src/qss/orangesurfer/toolbar.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle-v2.qss b/retroshare-gui/src/qss/qdarkstyle-v2.qss deleted file mode 100644 index a98b1e08f..000000000 --- a/retroshare-gui/src/qss/qdarkstyle-v2.qss +++ /dev/null @@ -1,2329 +0,0 @@ -/* QDarkStyleSheet -------------------------------------------------------- - -This is the main style sheet, the palette has nine main colors. -It is based on three selecting colors, three greyish (background) colors -plus three whitish (foreground) colors. Each set of widgets of the same -type have a header like this: - - ------------------ - GroupName -------- - ------------------ - -And each widget is separated with a header like this: - - QWidgetName ------ - -This makes more easy to find and change some css field. The basic -configuration is described bellow. - - SELECTION ------------ - - sel_light #179AE0 #148CD2 (selection/hover/active) - sel_normal #3375A3 #1464A0 (selected) - sel_dark #18465D #14506E (selected disabled) - - FOREGROUND ----------- - - for_light #EFF0F1 #F0F0F0 (texts/labels) - for_normal #AAAAAA (not used yet) - for_dark #505F69 #787878 (disabled texts) - - BACKGROUND ----------- - - bac_light #4D545B #505F69 (unpressed) - bac_normal #31363B #32414B (border, disabled, pressed, checked, toolbars, menus) - bac_dark #232629 #19232D (background) - -If a stranger configuration is required because of a bugfix or anything -else, keep the comment on that line to nobodys changed it, including the -issue number. ---------------------------------------------------------------------------- */ - - - -/* QWidget ---------------------------------------------------------------- */ - -QWidget { - background-color: #19232D; - border: 0px solid #32414B; - padding: 0px; - color: #F0F0F0; - selection-background-color: #1464A0; - selection-color: #F0F0F0; -} -QTreeView::item, QTreeWidget::item, QListWidget::item{ - color: #F0F0F0; -} - -QWidget:disabled { - background-color: #19232D; - color: #787878; - selection-background-color: #14506E; - selection-color: #787878; -} - -QWidget:item:selected { - background-color: #1464A0; -} - -QWidget:item:hover { - background-color: #148CD2; - color: #32414B; -} - -/* QMainWindow ------------------------------------------------------------ */ -/* This adjusts the splitter in the dock widget, not qsplitter */ - - -QMainWindow::separator { - background-color: #32414B; - border: 0 solid #19232D; - spacing: 0; - padding: 2px; -} - -QMainWindow::separator:hover { - background-color: #505F69; - border: 0px solid #148CD2; -} - -QMainWindow::separator:horizontal { - width: 5px; - margin-top: 2px; - margin-bottom: 2px; - image: url(%THISPATH%/qdarkstyle/rc/Vsepartoolbar.png); -} - -QMainWindow::separator:vertical { - height: 5px; - margin-left: 2px; - margin-right: 2px; - image: url(%THISPATH%/qdarkstyle/rc/Hsepartoolbar.png); -} - -/* QToolTip --------------------------------------------------------------- */ - -QToolTip { - background-color: #148CD2; - border: 1px solid #19232D; - color: #19232D; - padding: 0; /*remove padding, for fix combo box tooltip*/ - opacity: 230; /*reducing transparency to read better*/ -} - -/* QStatusBar ------------------------------------------------------------- */ - -QStatusBar { - border: 1px solid #32414B; - background: #32414B; /*fixes spyder #9120,#9121*/ -} - -QStatusBar QToolTip { - background-color: #148CD2; - border: 1px solid #19232D; - color: #19232D; - padding: 0; /*remove padding, for fix combo box tooltip*/ - opacity: 230; /*reducing transparency to read better*/ -} - -QStatusBar QLabel { - background-color: transparent; /*fixes spyder #9120,#9121*/ -} - -/* QCheckBox -------------------------------------------------------------- */ - -QCheckBox { - background-color: #19232D; - color: #F0F0F0; - spacing: 4px; - outline: none; - padding-top: 4px; - padding-bottom: 4px; -} - -QCheckBox:focus { - border: none; -} - -QCheckBox QWidget:disabled { - background-color: #19232D; - color: #787878; -} - -QCheckBox::indicator { - margin-left: 4px; - width: 16px; - height: 16px; -} - -QCheckBox::indicator:unchecked { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_unchecked.png); -} - -QCheckBox::indicator:unchecked:hover, -QCheckBox::indicator:unchecked:focus, -QCheckBox::indicator:unchecked:pressed { - border: none; - image: url(%THISPATH%/qdarkstyle/rc/checkbox_unchecked_focus.png); -} - -QCheckBox::indicator:unchecked:disabled { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_unchecked_disabled.png); -} - -QCheckBox::indicator:checked { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_checked.png); -} - -QCheckBox::indicator:checked:hover, -QCheckBox::indicator:checked:focus, -QCheckBox::indicator:checked:pressed { - border: none; - image: url(%THISPATH%/qdarkstyle/rc/checkbox_checked_focus.png); -} - -QCheckBox::indicator:checked:disabled{ - image: url(%THISPATH%/qdarkstyle/rc/checkbox_checked_disabled.png); -} - -QCheckBox::indicator:indeterminate { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_indeterminate.png); -} - -QCheckBox::indicator:indeterminate:disabled { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_indeterminate_disabled.png); -} - -QCheckBox::indicator:indeterminate:focus, -QCheckBox::indicator:indeterminate:hover, -QCheckBox::indicator:indeterminate:pressed { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_indeterminate_focus.png); -} - -/* QGroupBox -------------------------------------------------------------- */ - -QGroupBox { - font-weight: bold; - border: 1px solid #32414B; - border-radius: 4px; - padding: 4px; - margin-top: 16px; -} - - - -QGroupBox::title { - subcontrol-origin: margin; - subcontrol-position: top left; - left: 3px; - padding-left: 3px; - padding-right: 5px; - padding-top: 8px; - padding-bottom: 16px; -} - -QGroupBox::indicator { - margin-left: 4px; - width: 16px; - height: 16px; -} - -QGroupBox::indicator { - margin-left: 2px; -} - -QGroupBox::indicator:unchecked:hover, -QGroupBox::indicator:unchecked:focus, -QGroupBox::indicator:unchecked:pressed { - border: none; - image: url(%THISPATH%/qdarkstyle/rc/checkbox_unchecked_focus.png); -} - -QGroupBox::indicator:checked:hover, -QGroupBox::indicator:checked:focus, -QGroupBox::indicator:checked:pressed { - border: none; - image: url(%THISPATH%/qdarkstyle/rc/checkbox_checked_focus.png); -} - -QGroupBox::indicator:checked:disabled { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_checked_disabled.png); -} - -QGroupBox::indicator:unchecked:disabled { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_unchecked_disabled.png); -} - -/* QRadioButton ----------------------------------------------------------- */ - -QRadioButton { - background-color: #19232D; - color: #F0F0F0; - spacing: 0; - padding: 0; - border: none; - outline: none; -} - -QRadioButton:focus { - border: none; -} - -QRadioButton:disabled { - background-color: #19232D; - color: #787878; - border: none; - outline: none; -} - -QRadioButton QWidget { - background-color: #19232D; - color: #F0F0F0; - spacing: 0px; - padding: 0px; - outline: none; - border: none; -} - -QRadioButton::indicator { - border: none; - outline: none; - margin-bottom: 2px; - width: 25px; - height: 25px; -} - -QRadioButton::indicator:unchecked { - image: url(%THISPATH%/qdarkstyle/rc/radio_unchecked.png); -} - -QRadioButton::indicator:unchecked:hover, -QRadioButton::indicator:unchecked:focus, -QRadioButton::indicator:unchecked:pressed { - border: none; - outline: none; - image: url(%THISPATH%/qdarkstyle/rc/radio_unchecked_focus.png); -} - -QRadioButton::indicator:checked { - border: none; - outline: none; - image: url(%THISPATH%/qdarkstyle/rc/radio_checked.png); -} - -QRadioButton::indicator:checked:hover, -QRadioButton::indicator:checked:focus, -QRadioButton::indicator:checked:pressed { - border: none; - outline: none; - image: url(%THISPATH%/qdarkstyle/rc/radio_checked_focus.png); -} - -QRadioButton::indicator:checked:disabled { - outline: none; - image: url(%THISPATH%/qdarkstyle/rc/radio_checked_disabled.png); -} - -QRadioButton::indicator:unchecked:disabled { - image: url(%THISPATH%/qdarkstyle/rc/radio_unchecked_disabled.png); -} - -/* QMenuBar --------------------------------------------------------------- */ - -QMenuBar { - background-color: #32414B; - padding: 2px; - border: 1px solid #19232D; - color: #F0F0F0; -} - -QMenuBar:focus { - border: 1px solid #148CD2; -} - -QMenuBar::item { - background: transparent; - padding: 4px; -} - -QMenuBar::item:selected { - padding: 4px; - background: transparent; - border: 0px solid #32414B; -} - -QMenuBar::item:pressed { - padding: 4px; - border: 0px solid #32414B; - background-color: #148CD2; - color: #F0F0F0; - margin-bottom: 0px; - padding-bottom: 0px; -} - -/* QMenu ------------------------------------------------------------------ */ - -QMenu { - border: 0px solid #32414B; - color: #F0F0F0; - margin: 0px; -} - -QMenu::separator { - height: 2px; - background-color: #505F69; - color: #F0F0F0; - padding-left: 4px; - margin-left: 2px; - margin-right: 2px; -} - -QMenu::icon { - margin: 0px; - padding-left:4px; -} - -QMenu::item { - padding: 4px 24px 4px 24px; - border: 1px transparent #32414B; /* reserve space for selection border */ -} - -QMenu::item:selected { - color: #F0F0F0; -} - - - -QMenu::indicator { - width: 12px; - height: 12px; - padding-left:6px; -} - -/* non-exclusive indicator = check box style indicator (see QActionGroup::setExclusive) */ - -QMenu::indicator:non-exclusive:unchecked { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_unchecked.png); -} - -QMenu::indicator:non-exclusive:unchecked:selected { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_unchecked_disabled.png); -} - -QMenu::indicator:non-exclusive:checked { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_checked.png); -} - -QMenu::indicator:non-exclusive:checked:selected { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_checked_disabled.png); -} - -/* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ - -QMenu::indicator:exclusive:unchecked { - image: url(%THISPATH%/qdarkstyle/rc/radio_unchecked.png); -} - -QMenu::indicator:exclusive:unchecked:selected { - image: url(%THISPATH%/qdarkstyle/rc/radio_unchecked_disabled.png); -} - -QMenu::indicator:exclusive:checked { - image: url(%THISPATH%/qdarkstyle/rc/radio_checked.png); -} - -QMenu::indicator:exclusive:checked:selected { - image: url(%THISPATH%/qdarkstyle/rc/radio_checked_disabled.png); -} - -QMenu::right-arrow { - margin: 5px; - image: url(%THISPATH%/qdarkstyle/rc/right_arrow.png) -} - -/* QAbstractItemView ------------------------------------------------------ */ - -QAbstractItemView { - alternate-background-color: #19232D; - color: #F0F0F0; - border: 1px solid #32414B; - border-radius: 4px; -} - -QAbstractItemView QLineEdit { - padding: 2px; -} - -/* QAbstractScrollArea ---------------------------------------------------- */ - -QAbstractScrollArea { - background-color: #19232D; - border: 1px solid #32414B; - border-radius: 4px; - padding: 4px; - color: #F0F0F0; -} - -QAbstractScrollArea:disabled { - color: #787878; -} - -/* QScrollArea ------------------------------------------------------------ */ - -QScrollArea QWidget QWidget:disabled { - background-color: #19232D; -} - -/* QScrollBar ------------------------------------------------------------- */ - -QScrollBar:horizontal { - height: 16px; - margin: 2px 16px 2px 16px; - border: 1px solid #32414B; - border-radius: 4px; - background-color: #19232D; -} - -QScrollBar::handle:horizontal { - background-color: #787878; - border: 1px solid #32414B; - border-radius: 4px; - min-width: 8px; - -} - -QScrollBar::handle:horizontal:hover { - background-color: #148CD2; - border: 1px solid #148CD2; - border-radius: 4px; - min-width: 8px; -} - -QScrollBar::add-line:horizontal { - margin: 0px 0px 0px 0px; - border-image: url(%THISPATH%/qdarkstyle/rc/right_arrow_disabled.png); - width: 10px; - height: 10px; - subcontrol-position: right; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:horizontal { - margin: 0px 3px 0px 3px; - border-image: url(%THISPATH%/qdarkstyle/rc/left_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: left; - subcontrol-origin: margin; -} - -QScrollBar::add-line:horizontal:hover, -QScrollBar::add-line:horizontal:on { - border-image: url(%THISPATH%/qdarkstyle/rc/right_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: right; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:horizontal:hover, -QScrollBar::sub-line:horizontal:on { - border-image: url(%THISPATH%/qdarkstyle/rc/left_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: left; - subcontrol-origin: margin; -} - -QScrollBar::up-arrow:horizontal, -QScrollBar::down-arrow:horizontal { - background: none; -} - -QScrollBar::add-page:horizontal, -QScrollBar::sub-page:horizontal { - background: none; -} - -QScrollBar:vertical { - background-color: #19232D; - width: 16px; - margin: 16px 2px 16px 2px; - border: 1px solid #32414B; - border-radius: 4px; -} - -QScrollBar::handle:vertical { - background-color: #787878; - border: 1px solid #32414B; - min-height: 8px; - border-radius: 4px; -} - -QScrollBar::handle:vertical:hover { - background-color: #148CD2; - border: 1px solid #148CD2; - border-radius: 4px; - min-height: 8px; - -} - -QScrollBar::sub-line:vertical { - margin: 3px 0px 3px 0px; - border-image: url(%THISPATH%/qdarkstyle/rc/up_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: top; - subcontrol-origin: margin; -} - -QScrollBar::add-line:vertical { - margin: 3px 0px 3px 0px; - border-image: url(%THISPATH%/qdarkstyle/rc/down_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: bottom; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:vertical:hover, -QScrollBar::sub-line:vertical:on { - border-image: url(%THISPATH%/qdarkstyle/rc/up_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: top; - subcontrol-origin: margin; -} - -QScrollBar::add-line:vertical:hover, -QScrollBar::add-line:vertical:on { - border-image: url(%THISPATH%/qdarkstyle/rc/down_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: bottom; - subcontrol-origin: margin; -} - -QScrollBar::up-arrow:vertical, -QScrollBar::down-arrow:vertical { - background: none; -} - -QScrollBar::add-page:vertical, -QScrollBar::sub-page:vertical { - background: none; -} - -/* QTextEdit--------------------------------------------------------------- */ - -QTextEdit { - background-color: #19232D; - color: #F0F0F0; - border: 1px solid #32414B; -} - -QTextEdit:hover { - border: 1px solid #148CD2; - color: #F0F0F0; -} - -QTextEdit:selected { - background: #1464A0; - color: #32414B; -} - -/* QPlainTextEdit --------------------------------------------------------- */ - -QPlainTextEdit { - background-color: #19232D; - color: #F0F0F0; - border-radius: 4px; - border: 1px solid #32414B; -} - -QPlainTextEdit:hover { - border: 1px solid #148CD2; - color: #F0F0F0; -} - -QPlainTextEdit:selected { - background: #1464A0; - color: #32414B; -} - -/* QSizeGrip --------------------------------------------------------------- */ - -QSizeGrip { - image: url(%THISPATH%/qdarkstyle/rc/sizegrip.png); - width: 12px; - height: 12px; -} - -/* QStackedWidget --------------------------------------------------------- */ - -QStackedWidget { - padding: 4px; - border: 1px solid #32414B; - border: 1px solid #19232D; -} - -/* QToolBar --------------------------------------------------------------- */ - -QToolBar { - background-color: #32414B; - border-bottom: 1px solid #19232D; - padding: 2px; - font-weight: bold; -} - -QToolBar QToolButton{ - background-color: #32414B; -} - -QToolBar::handle:horizontal { - width: 6px; - image: url(%THISPATH%/qdarkstyle/rc/Hmovetoolbar.png); -} - -QToolBar::handle:vertical { - height: 6px; - image: url(%THISPATH%/qdarkstyle/rc/Vmovetoolbar.png); -} - -QToolBar::separator:horizontal { - width: 3px; - image: url(%THISPATH%/qdarkstyle/rc/Hsepartoolbar.png); -} - -QToolBar::separator:vertical { - height: 3px; - image: url(%THISPATH%/qdarkstyle/rc/Vsepartoolbar.png); -} - -QToolButton#qt_toolbar_ext_button { - background: #32414B; - border: 0px; - color: #F0F0F0; - image: url(%THISPATH%/qdarkstyle/rc/right_arrow.png); -} - -/* QAbstractSpinBox ------------------------------------------------------- */ - -QAbstractSpinBox { - background-color: #19232D; - border: 1px solid #32414B; - color: #F0F0F0; - padding-top: 2px; /* This fix 103, 111*/ - padding-bottom: 2px; /* This fix 103, 111*/ - padding-left: 4px; - padding-right: 4px; - border-radius: 4px; - /* min-width: 5px; removed to fix 109 */ -} - -QAbstractSpinBox:up-button { - background-color: transparent #19232D; - subcontrol-origin: border; - subcontrol-position: top right; - border-left: 1px solid #32414B; - margin: 1px; -} - -QAbstractSpinBox::up-arrow, -QAbstractSpinBox::up-arrow:disabled, -QAbstractSpinBox::up-arrow:off { - image: url(%THISPATH%/qdarkstyle/rc/up_arrow_disabled.png); - width: 9px; - height: 9px; -} - -QAbstractSpinBox::up-arrow:hover { - image: url(%THISPATH%/qdarkstyle/rc/up_arrow.png); -} - -QAbstractSpinBox:down-button { - background-color: transparent #19232D; - subcontrol-origin: border; - subcontrol-position: bottom right; - border-left: 1px solid #32414B; - margin: 1px; -} - -QAbstractSpinBox::down-arrow, -QAbstractSpinBox::down-arrow:disabled, -QAbstractSpinBox::down-arrow:off { - image: url(%THISPATH%/qdarkstyle/rc/down_arrow_disabled.png); - width: 9px; - height: 9px; -} - -QAbstractSpinBox::down-arrow:hover { - image: url(%THISPATH%/qdarkstyle/rc/down_arrow.png); -} - -QAbstractSpinBox:hover{ - border: 1px solid #148CD2; - color: #F0F0F0; -} - -QAbstractSpinBox:selected { - background: #1464A0; - color: #32414B; -} - -/* ------------------------------------------------------------------------ */ -/* DISPLAYS --------------------------------------------------------------- */ -/* ------------------------------------------------------------------------ */ - -/* QLabel ----------------------------------------------------------------- */ - -QLabel { - background-color: #19232D; - border: 0px solid #32414B; - padding: 2px; - margin: 0px; - color: #F0F0F0 -} - -QLabel::disabled { - background-color: #19232D; - border: 0px solid #32414B; - color: #787878; -} - -/* QTextBrowser ----------------------------------------------------------- */ - -QTextBrowser { - background-color: #19232D; - border: 1px solid #32414B; - color: #F0F0F0; - border-radius: 4px; -} - -QTextBrowser:disabled { - background-color: #19232D; - border: 1px solid #32414B; - color: #787878; - border-radius: 4px; -} - -QTextBrowser:hover, -QTextBrowser:!hover, -QTextBrowser::selected, -QTextBrowser::pressed { - border: 1px solid #32414B; -} - -/* QGraphicsView --------------------------------------------------------- */ - -QGraphicsView { - background-color: #19232D; - border: 1px solid #32414B; - color: #F0F0F0; - border-radius: 4px; -} - -QGraphicsView:disabled { - background-color: #19232D; - border: 1px solid #32414B; - color: #787878; - border-radius: 4px; -} - -QGraphicsView:hover, -QGraphicsView:!hover, -QGraphicsView::selected, -QGraphicsView::pressed { - border: 1px solid #32414B; -} - -/* QCalendarWidget -------------------------------------------------------- */ - -QCalendarWidget { - border: 1px solid #32414B; - border-radius: 4px; -} - -QCalendarWidget:disabled { - background-color: #19232D; - color: #787878; -} - -/* QLCDNumber ------------------------------------------------------------- */ - -QLCDNumber { - background-color: #19232D; - color: #F0F0F0; -} - -QLCDNumber:disabled { - background-color: #19232D; - color: #787878; -} - -/* QProgressBar ----------------------------------------------------------- */ - -QProgressBar { - background-color: #19232D; - border: 1px solid #32414B; - color: #F0F0F0; - border-radius: 4px; - text-align: center; -} - -QProgressBar:disabled { - background-color: #19232D; - border: 1px solid #32414B; - color: #787878; - border-radius: 4px; - text-align: center; -} - -QProgressBar::chunk { - background-color: #1464A0; - color: #19232D; - border-radius: 4px; -} - -QProgressBar::chunk:disabled { - background-color: #14506E; - color: #787878; - border-radius: 4px; -} - - -/* ------------------------------------------------------------------------ */ -/* BUTTONS ---------------------------------------------------------------- */ -/* ------------------------------------------------------------------------ */ - -/* QPushButton ------------------------------------------------------------ */ - -QPushButton { - background-color: #505F69 ; - border: 1px solid #32414B; - color: #F0F0F0; - border-radius: 4px; - padding: 3px; - outline: none; -} - -QPushButton:disabled { - background-color: #32414B; - border: 1px solid #32414B; - color: #787878; - border-radius: 4px; - padding: 3px; -} - - -QPushButton:checked { - background-color: #32414B; - border: 1px solid #32414B; - border-radius: 4px; - padding: 3px; - outline: none; -} - -QPushButton:checked:disabled { - background-color: #19232D; - border: 1px solid #32414B; - color: #787878; - border-radius: 4px; - padding: 3px; - outline: none; -} - -QPushButton::menu-indicator { - subcontrol-origin: padding; - subcontrol-position: bottom right; - bottom: 4px; - -} - -QPushButton:pressed { - background-color: #19232D; - border: 1px solid #19232D; -} - -QPushButton:hover, -QPushButton:checked:hover{ - border: 1px solid #148CD2; - color: #F0F0F0; -} - -QPushButton:pressed:hover{ - border: 1px solid #1464A0; -} - -QPushButton:selected, -QPushButton:checked:selected{ - background: #1464A0; - color: #32414B; -} - -/* QToolButton ------------------------------------------------------------ */ - -QToolButton { - background-color: transparent; - border: 1px solid #32414B; - border-radius: 4px; - margin: 0px; - padding: 2px; -} - -QToolButton:checked { - background-color: #19232D; - border: 1px solid #19232D; -} - -QToolButton:pressed { - background-color: #19232D; - border: 1px solid #19232D; - -} - -QToolButton:disabled { - border: 1px solid #32414B; -} - -QToolButton:hover, -QToolButton:checked:hover{ - border: 1px solid #148CD2; -} -QToolButton:pressed:hover{ - border: 1px solid #1464A0; -} - -/* the subcontrols below are used only in the MenuButtonPopup mode */ - -QToolButton[popupMode="1"] { - padding: 2px; - padding-right: 12px; /* only for MenuButtonPopup */ - border: 1px solid #32414B; /* make way for the popup button */ - border-radius: 4px; -} - -/* The subcontrol below is used only in the InstantPopup or DelayedPopup mode */ - -QToolButton[popupMode="2"] { - padding: 2px; - padding-right: 12px; /* only for InstantPopup */ - border: 1px solid #32414B; /* make way for the popup button */ -} - -QToolButton::menu-button { - padding: 2px; - border-radius: 4px; - border: 1px solid #32414B; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - /* 16px width + 4px for border = 20px allocated above */ - width: 16px; - outline: none; -} - -QToolButton::menu-button:hover, -QToolButton::menu-button:checked:hover { - border: 1px solid #148CD2; -} - -QToolButton::menu-indicator { - image: url(%THISPATH%/qdarkstyle/rc/down_arrow.png); - top: -8px; /* shift it a bit */ - left: -4px; /* shift it a bit */ -} - -QToolButton::menu-arrow { - image: url(%THISPATH%/qdarkstyle/rc/down_arrow.png); -} - -QToolButton::menu-arrow:open { - border: 1px solid #32414B; -} - -/* QCommandLinkButton ----------------------------------------------------- */ - -QCommandLinkButton { - background-color: transparent; - border: 1px solid #32414B; - color: #F0F0F0; - border-radius: 4px; - padding: 0px; - margin: 0px; -} - -QCommandLinkButton:disabled { - background-color: transparent; - color: #787878; -} - -/* ------------------------------------------------------------------------ */ -/* INPUTS - NO FIELDS ----------------------------------------------------- */ -/* ------------------------------------------------------------------------ */ - -/* QCombobox -------------------------------------------------------------- */ -QComboBox { - border: 1px solid #32414B; - border-radius: 4px; - selection-background-color: #1464A0; - padding-left: 4px; - padding-right: 4px; - min-height: 1.5em; /* fix #103, #111 */ - /* padding-top: 2px; removed to fix #132 */ - /* padding-bottom: 2px; removed to fix #132 */ - /* min-width: 75px; removed to fix #109 */ -} - -QComboBox QAbstractItemView { - background-color: #19232d; - border-radius: 4px; - border: 1px solid #32414B; - selection-color: #148CD2; - selection-background-color: #32414B; -} - -QComboBox:disabled { - background-color: #19232D; - color: #787878; -} - -QComboBox:hover{ - border: 1px solid #148CD2; -} - -QComboBox:on { - selection-background-color: #19232D; -} - -/* Needed to remove indicator - fix #132 */ -QComboBox::indicator { - background-color:transparent; - selection-background-color:transparent; - color:transparent; - selection-color:transparent; -} - -/* Needed to remove indicator - fix #132 */ -QComboBox::item:alternate { - background: #19232D; -} - -QComboBox::item:checked { - /*font-weight: bold;*/ - background-color: #148CD2; -} - -QComboBox::item:selected { - border: 0px solid transparent; -} - -QComboBox::drop-down { - subcontrol-origin: padding; - subcontrol-position: top right; - width: 20px; - border-left-width: 0px; - border-left-color: #32414B; - border-left-style: solid; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} - -QComboBox::down-arrow { - image: url(%THISPATH%/qdarkstyle/rc/down_arrow_disabled.png); -} - -QComboBox::down-arrow:on, -QComboBox::down-arrow:hover, -QComboBox::down-arrow:focus { - image: url(%THISPATH%/qdarkstyle/rc/down_arrow.png); -} - -/* QSlider ---------------------------------------------------------------- */ - -QSlider:disabled { - background: #19232D; -} - -QSlider:focus { - border: none; -} - -QSlider::groove:horizontal { - background: #32414B; - border: 1px solid #32414B; - height: 4px; - margin: 0px; - border-radius: 4px; -} - -QSlider::sub-page:horizontal { - background: #1464A0; - border: 1px solid #32414B; - height: 4px; - margin: 0px; - border-radius: 4px; -} - -QSlider::sub-page:horizontal:disabled { - background: #14506E; -} - -QSlider::handle:horizontal { - background: #787878; - border: 1px solid #32414B; - width: 8px; - height: 8px; - margin: -8px 0; - border-radius: 4px; -} - -QSlider::handle:horizontal:hover { - background: #148CD2; - border: 1px solid #148CD2; -} - -QSlider::groove:vertical { - background: #32414B; - border: 1px solid #32414B; - width: 4px; - margin: 0px; - border-radius: 4px; -} - -QSlider::sub-page:vertical { - background: #1464A0; - border: 1px solid #32414B; - width: 4px; - margin: 0px; - border-radius: 4px; -} - -QSlider::sub-page:vertical:disabled { - background: #14506E; -} - -QSlider::handle:vertical { - background: #787878; - border: 1px solid #32414B; - width: 8px; - height: 8px; - margin: 0 -8px; - border-radius: 4px; -} - -QSlider::handle:vertical:hover { - background: #148CD2; - border: 1px solid #148CD2; -} - -/* QLine ------------------------------------------------------------------ */ - -QLineEdit { - background-color: #19232D; - padding-top: 2px; /* This QLineEdit fix 103, 111 */ - padding-bottom: 2px; /* This QLineEdit fix 103, 111 */ - padding-left: 4px; - padding-right: 4px; - border-style: solid; - border: 1px solid #32414B; - border-radius: 4px; - color: #F0F0F0; -} - -QLineEdit:disabled { - background-color: #19232D; - color: #787878; -} - -QLineEdit:hover{ - border: 1px solid #148CD2; - color: #F0F0F0; -} - -QLineEdit:selected{ - background: #1464A0; - color: #32414B; -} - -/* QTabWiget -------------------------------------------------------------- */ - -QTabWidget { - padding: 2px; - selection-background-color: #32414B; -} - - -QTabWidget QWidget QWidget /* add wanted borders fix #141, #126, #123 */ -QTabWidget QFrame { - border: 1px solid #32414B; -} - -QTabWidget QLabel { - border: 0px solid #32414B; /* label derived from frame, remove border #141 */ -} - -QTabWidget::pane { - border: 1px solid #32414B; - border-radius: 4px; - padding: 0px; /* fixes double border inside pane wit pyqt5 */ - margin: 0px; -} - -QTabWidget::pane:selected { - background-color: #32414B; - border: 1px solid #1464A0; -} - -/* QTabBar ---------------------------------------------------------------- */ - -QTabBar { - qproperty-drawBase: 0; - border-radius: 4px; - margin: 0px; - padding: 2px; - border: 0; - - /* left: 5px; move to the right by 5px - removed for fix */ - } - -QTabBar::close-button { - border: 0; - margin: 2px; - padding: 0; - image: url(%THISPATH%/qdarkstyle/rc/close.png); -} - -QTabBar::close-button:hover { - image: url(%THISPATH%/qdarkstyle/rc/close-hover.png); -} - -QTabBar::close-button:pressed { - image: url(%THISPATH%/qdarkstyle/rc/close-pressed.png); -} - -/* QTabBar::tab - selected ----------------------------------------------- */ - -QTabBar::tab:top:selected:disabled { - border-bottom: 3px solid #14506E; - color: #787878; - background-color: #32414B; -} - -QTabBar::tab:bottom:selected:disabled { - border-top: 3px solid #14506E; - color: #787878; - background-color: #32414B; -} - -QTabBar::tab:left:selected:disabled { - border-left: 3px solid #14506E; - color: #787878; - background-color: #32414B; -} - -QTabBar::tab:right:selected:disabled { - border-right: 3px solid #14506E; - color: #787878; - background-color: #32414B; -} - -/* QTabBar::tab - !selected and disabled ---------------------------------- */ - -QTabBar::tab:top:!selected:disabled { - border-bottom: 3px solid #19232D; - color: #787878; - background-color: #19232D; -} - -QTabBar::tab:bottom:!selected:disabled { - border-top: 3px solid #19232D; - color: #787878; - background-color: #19232D; -} - -QTabBar::tab:left:!selected:disabled { - border-right: 3px solid #19232D; - color: #787878; - background-color: #19232D; -} - -QTabBar::tab:right:!selected:disabled { - border-left: 3px solid #19232D; - color: #787878; - background-color: #19232D; -} - -/* QTabBar::tab - selected ----------------------------------------------- */ - -QTabBar::tab:top:!selected { - border-bottom: 2px solid #19232D; - margin-top: 2px; -} - -QTabBar::tab:bottom:!selected { - border-top: 2px solid #19232D; - margin-bottom: 3px; -} - -QTabBar::tab:left:!selected { - border-left: 2px solid #19232D; - margin-right: 2px; -} - -QTabBar::tab:right:!selected { - border-right: 2px solid #19232D; - margin-left: 2px; -} - - -QTabBar::tab:top { - background-color: #32414B; - color: #F0F0F0; - margin-left: 2px; - padding-left: 4px; - padding-right: 4px; - padding-top: 2px; - padding-bottom: 2px; - min-width: 5px; - border-bottom: 3px solid #32414B; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} - -QTabBar::tab:top:selected { - background-color: #505F69; - color: #F0F0F0; - border-bottom: 3px solid #1464A0; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} - -QTabBar::tab:top:!selected:hover { - border: 1px solid #148CD2; - border-bottom: 3px solid #148CD2; - padding: 0px; -} - -QTabBar::tab:bottom { - color: #F0F0F0; - border-top: 3px solid #32414B; - background-color: #32414B; - margin-left: 2px; - padding-left: 4px; - padding-right: 4px; - padding-top: 2px; - padding-bottom: 2px; - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; - min-width: 5px; -} - -QTabBar::tab:bottom:selected { - color: #F0F0F0; - background-color: #505F69; - border-top: 3px solid #1464A0; - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; -} - -QTabBar::tab:bottom:!selected:hover { - border: 1px solid #148CD2; - border-top: 3px solid #148CD2; - padding: 0px; -} - -QTabBar::tab:left { - color: #F0F0F0; - background-color: #32414B; - margin-top: 2px; - padding-left: 2px; - padding-right: 2px; - padding-top: 4px; - padding-bottom: 4px; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - min-height: 5px; -} - -QTabBar::tab:left:selected { - color: #F0F0F0; - background-color: #505F69; - border-left: 3px solid #1464A0; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} - -QTabBar::tab:left:!selected:hover { - border: 1px solid #148CD2; - border-left: 3px solid #148CD2; - padding: 0px; -} - -QTabBar::tab:right { - color: #F0F0F0; - background-color: #32414B; - margin-top: 2px; - padding-left: 2px; - padding-right: 2px; - padding-top: 4px; - padding-bottom: 4px; - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; - min-height: 5px; -} - -QTabBar::tab:right:selected { - color: #F0F0F0; - background-color: #505F69; - border-right: 3px solid #1464A0; - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} - -QTabBar::tab:right:!selected:hover { - border: 1px solid #148CD2; - border-right: 3px solid #148CD2; - padding: 0px; -} - -QTabBar QToolButton::right-arrow:enabled { - image: url(%THISPATH%/qdarkstyle/rc/right_arrow.png); -} - -QTabBar QToolButton::left-arrow:enabled { - image: url(%THISPATH%/qdarkstyle/rc/left_arrow.png); -} - -QTabBar QToolButton::right-arrow:disabled { - image: url(%THISPATH%/qdarkstyle/rc/right_arrow_disabled.png); -} - -QTabBar QToolButton::left-arrow:disabled { - image: url(%THISPATH%/qdarkstyle/rc/left_arrow_disabled.png); -} - -QTabBar QToolButton{ - background-color: #32414B; /* fixes #136 */ - width: 16px; - height: 16px; -} - -/* QDockWiget ------------------------------------------------------------- */ - -QDockWidget { - outline: 1px solid #32414B; - background-color: #19232D; - border: 1px solid #32414B; - border-radius: 4px; - titlebar-close-icon: url(%THISPATH%/qdarkstyle/rc/close.png); - titlebar-normal-icon: url(%THISPATH%/qdarkstyle/rc/undock.png); -} - -QDockWidget::title { - padding: 6px; /* better size for title bar */ - border: none; - background-color: #32414B; -} - -QDockWidget::close-button { - background-color: #32414B; - border-radius: 4px; - border: none; -} - -QDockWidget::close-button:hover { - border: 1px solid #32414B; -} - -QDockWidget::close-button:pressed { - border: 1px solid #32414B; -} - -QDockWidget::float-button { - background-color: #32414B; - border-radius: 4px; - border: none; -} - -QDockWidget::float-button:hover { - border: 1px solid #32414B; -} - -QDockWidget::float-button:pressed { - border: 1px solid #32414B; -} - - -/* QTreeView QTableView QListView ----------------------------------------- */ - -QTreeView:branch:selected, -QTreeView:branch:hover { - background: url(%THISPATH%/qdarkstyle/rc/transparent.png); -} - -QTreeView::branch:has-siblings:!adjoins-item { - border-image: url(%THISPATH%/qdarkstyle/rc/transparent.png); -} - -QTreeView::branch:has-siblings:adjoins-item { - border-image: url(%THISPATH%/qdarkstyle/rc/transparent.png); -} - -QTreeView::branch:!has-children:!has-siblings:adjoins-item { - border-image: url(%THISPATH%/qdarkstyle/rc/transparent.png); -} - -QTreeView::branch:has-children:!has-siblings:closed, -QTreeView::branch:closed:has-children:has-siblings { - image: url(%THISPATH%/qdarkstyle/rc/branch_closed.png); -} - -QTreeView::branch:open:has-children:!has-siblings, -QTreeView::branch:open:has-children:has-siblings { - image: url(%THISPATH%/qdarkstyle/rc/branch_open.png); -} - -QTreeView::branch:has-children:!has-siblings:closed:hover, -QTreeView::branch:closed:has-children:has-siblings:hover { - image: url(%THISPATH%/qdarkstyle/rc/branch_closed-on.png); -} - -QTreeView::branch:open:has-children:!has-siblings:hover, -QTreeView::branch:open:has-children:has-siblings:hover { - image: url(%THISPATH%/qdarkstyle/rc/branch_open-on.png); -} - -QListView::item:!selected:hover, -QTreeView::item:!selected:hover, -QTableView::item:!selected:hover, -QColumnView::item:!selected:hover { - outline: 0; - color: #148CD2; - background-color: #32414B; -} - -QListView::item:selected:hover, -QTreeView::item:selected:hover, -QTableView::item:selected:hover, -QColumnView::item:selected:hover { - background: #1464A0; - color: #19232D; -} - -QTreeView::indicator:checked, -QListView::indicator:checked { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_checked.png); -} - -QTreeView::indicator:unchecked, -QListView::indicator:unchecked { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_unchecked.png); -} - -QTreeView::indicator:checked:hover, -QTreeView::indicator:checked:focus, -QTreeView::indicator:checked:pressed, -QListView::indicator:checked:hover, -QListView::indicator:checked:focus, -QListView::indicator:checked:pressed { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_checked_focus.png); -} - -QTreeView::indicator:unchecked:hover, -QTreeView::indicator:unchecked:focus, -QTreeView::indicator:unchecked:pressed, -QListView::indicator:unchecked:hover, -QListView::indicator:unchecked:focus, -QListView::indicator:unchecked:pressed { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_unchecked_focus.png); -} - -QTreeView::indicator:indeterminate:hover, -QTreeView::indicator:indeterminate:focus, -QTreeView::indicator:indeterminate:pressed, -QListView::indicator:indeterminate:hover, -QListView::indicator:indeterminate:focus, -QListView::indicator:indeterminate:pressed { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_indeterminate_focus.png); -} - -QTreeView::indicator:indeterminate, -QListView::indicator:indeterminate { - image: url(%THISPATH%/qdarkstyle/rc/checkbox_indeterminate.png); -} - -QListView, -QTreeView, -QTableView, -QColumnView { - background-color: #19232D; - border: 1px solid #32414B; - color: #F0F0F0; - gridline-color: #32414B; - border-radius: 4px; -} - -QListView:disabled, -QTreeView:disabled, -QTableView:disabled, -QColumnView:disabled { - background-color: #19232D; - color: #787878; -} - -QListView:selected, -QTreeView:selected, -QTableView:selected, -QColumnView:selected { - background: #1464A0; - color: #32414B; -} - -QListView:hover, -QTreeView::hover, -QTableView::hover, -QColumnView::hover { - background-color: #19232D; - border: 1px solid #148CD2; -} - -QListView::item:pressed, -QTreeView::item:pressed, -QTableView::item:pressed, -QColumnView::item:pressed { - background-color: #1464A0; -} - -QListView::item:selected:active, -QTreeView::item:selected:active, -QTableView::item:selected:active, -QColumnView::item:selected:active { - background-color: #1464A0; -} - -QTableCornerButton::section { - background-color: #19232D; - border: 1px transparent #32414B; - border-radius: 0px; -} - -/* QHeaderView ------------------------------------------------------------ */ - -QHeaderView { - background-color: #32414B; - border: 0px transparent #32414B; - padding: 0px; - margin: 0px; - border-radius: 0px; -} - -QHeaderView:disabled { - background-color: #32414B; - border: 1px transparent #32414B; - padding: 2px; -} - -QHeaderView::section { - background-color: #32414B; - color: #F0F0F0; - padding: 2px; - border-radius: 0px; - text-align: left; -} - -QHeaderView::section:checked { - color: #F0F0F0; - background-color: #1464A0; -} - -QHeaderView::section:checked:disabled { - color: #787878; - background-color: #14506E; -} - -QHeaderView::section::horizontal:disabled, -QHeaderView::section::vertical:disabled { - color: #787878; -} - -QHeaderView::section::vertical::first, -QHeaderView::section::vertical::only-one { - border-top: 1px solid #32414B; -} - -QHeaderView::section::vertical { - border-top: 1px solid #19232D; -} - -QHeaderView::section::horizontal::first, -QHeaderView::section::horizontal::only-one { - border-left: 1px solid #32414B; -} - -QHeaderView::section::horizontal { - border-left: 1px solid #19232D; -} - -/* Those settings (border/width/height/background-color) solve bug */ -/* transparent arrow background and size */ - -QHeaderView::down-arrow { - background-color: #32414B; - width: 16px; - height: 16px; - border-right: 1px solid #19232D; - image: url(%THISPATH%/qdarkstyle/rc/down_arrow.png); -} - -QHeaderView::up-arrow { - background-color: #32414B; - width: 16px; - height: 16px; - border-right: 1px solid #19232D; - image: url(%THISPATH%/qdarkstyle/rc/up_arrow.png); -} - -/* QToolBox -------------------------------------------------------------- */ - -QToolBox { - padding: 0px; - border: 1px solid #32414B; -} - -QToolBox::selected { - padding: 0px; - border: 2px solid #1464A0; -} - -QToolBox::tab { - background-color: #19232D; - border: 1px solid #32414B; - color: #F0F0F0; - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} - -QToolBox::tab:disabled { - color: #787878; -} - -QToolBox::tab:selected { - background-color: #505F69; - border-bottom: 2px solid #1464A0; -} - -QToolBox::tab:!selected { - background-color: #32414B; - border-bottom: 2px solid #32414B; -} - -QToolBox::tab:selected:disabled { - background-color: #32414B; - border-bottom: 2px solid #14506E; -} - -QToolBox::tab:!selected:disabled { - background-color: #19232D; -} - -QToolBox::tab:hover { - border-color: #148CD2; - border-bottom: 2px solid #148CD2; -} - -QToolBox QScrollArea QWidget QWidget { - padding: 0px; - background-color: #19232D; -} - -/* QFrame ----------------------------------------------------------------- */ - -QFrame { - border-radius: 4px; - border: 1px solid #32414B; - -} - -QFrame[frameShape="0"] { - border-radius: 4px; - border: 1px transparent #32414B; -} - -QFrame[height="3"], -QFrame[width="3"] { - background-color: #19232D; -} - -/* QSplitter -------------------------------------------------------------- */ - -QSplitter { - background-color: #32414B; - spacing: 0; - padding: 0; - margin: 0; -} - -QSplitter::separator { - background-color: #32414B; - border: 0 solid #19232D; - spacing: 0; - padding: 1px; - margin: 0; -} - -QSplitter::separator:hover { - background-color: #787878; -} - -QSplitter::separator:horizontal { - width: 5px; - image: url(%THISPATH%/qdarkstyle/rc/Vsepartoolbar.png); -} - -QSplitter::separator:vertical { - height: 5px; - image: url(%THISPATH%/qdarkstyle/rc/Hsepartoolbar.png); -} - - -/* QDateEdit-------------------------------------------------------------- */ - -QDateEdit { - selection-background-color: #1464A0; - border-style: solid; - border: 1px solid #32414B; - border-radius: 4px; - padding-top: 2px; /* This fix #103, #111*/ - padding-bottom: 2px; /* This fix #103, #111*/ - padding-left: 4px; - padding-right: 4px; - min-width: 10px; -} - -QDateEdit:on { - selection-background-color: #1464A0; -} - -QDateEdit::drop-down { - subcontrol-origin: padding; - subcontrol-position: top right; - width: 20px; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} - -QDateEdit::down-arrow { - image: url(%THISPATH%/qdarkstyle/rc/down_arrow_disabled.png); -} - -QDateEdit::down-arrow:on, -QDateEdit::down-arrow:hover, -QDateEdit::down-arrow:focus { - image: url(%THISPATH%/qdarkstyle/rc/down_arrow.png); -} - -QDateEdit QAbstractItemView { - background-color: #19232D; - border-radius: 4px; - border: 1px solid #32414B; - selection-background-color: #1464A0; -} - -QAbstractView:hover{ - border: 1px solid #148CD2; - color: #F0F0F0; -} - -QAbstractView:selected { - background: #1464A0; - color: #32414B; -} - - -PlotWidget { - padding: 0px; /* to fix cut labels in plots #134 */ -} - -NewFriendList { - qproperty-textColorStatusAway: #4040A0; - qproperty-textColorStatusBusy: #A04040; - qproperty-textColorStatusOnline: #40A040; - qproperty-textColorStatusInactive: #A0A040; - qproperty-textColorStatusOffline: gray; - qproperty-textColorGroup: rgb(123, 123, 123); -} - -NetworkDialog { - qproperty-backgroundColorSelf: darkred; - qproperty-backgroundColorOwnSign: darkred; - qproperty-backgroundColorAcceptConnection: black; - qproperty-backgroundColorHasSignedMe: darkred; - qproperty-backgroundColorDenied: #201F1F; -} - -RSTreeWidget#idTreeWidget::item:!selected { - color: #C0C0C0; -} - -GxsChannelPostItem > QFrame#mainFrame[new=true] { - border: 3px solid #82B9F4; - border-radius: 10px; -} - -GxsForumThreadWidget QPushButton#forumName -{ - qproperty-fontSizeFactor: 140; - color: #0099cc; - font-size: 14pt; - font: bold; -} - -ForumsDialog, GxsForumThreadWidget -{ - qproperty-textColorRead: darkgray; - qproperty-textColorUnread: white; - qproperty-textColorUnreadChildren: red; - qproperty-textColorNotSubscribed: white; - qproperty-textColorMissing: darkred; - qproperty-textColorPinned: #D07000; - - qproperty-backgroundColorPinned: #19232D; - qproperty-backgroundColorFiltered: darkGreen; -} - -GxsForumThreadWidget QWidget#threadTreeWidget { - selection-background-color: #005599; - show-decoration-selected: 1; -} - -GxsForumThreadWidget QWidget#threadTreeWidget::item { - padding: 2px; -} - -GxsForumThreadWidget QWidget#threadTreeWidget::item:selected:active , -GxsForumThreadWidget QWidget#threadTreeWidget::item:selected:!active { - background-color: #005599; -} - -QTreeView [new=true]{ - color: #0099cc; - -} - -/* changes for the subscribe Button */ - -PostedListWidgetWithModel QToolButton#subscribeToolButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; -} - -PostedListWidgetWithModel QToolButton#subscribeToolButton:hover { - background: #03b1f3; - border-radius: 4px; -} - -GxsForumThreadWidget QToolButton#subscribeToolButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; -} - -GxsForumThreadWidget QToolButton#subscribeToolButton:hover { - background: #03b1f3; - border-radius: 4px; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton:hover { - background: #03b1f3; - border-radius: 4px; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton:pressed { - background: #03b1f3; - border-radius: 4px; - border: 1px solid gray; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton:disabled { - background: gray; - border-radius: 4px; - border: 1px solid gray; - color: lightgray; -} - -/* only for MenuButtonPopup */ -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton[popupMode="1"] { - padding-right: 0px; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton::menu-arrow { - image: none; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton::menu-button { - image: none; - -} - -CreateGxsChannelMsg QPushButton#postButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -CreateGxsChannelMsg QPushButton#postButton:hover { - background: #03b1f3; - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - -CreateCircleDialog QPushButton#createButton, CreateLobbyDialog QPushButton#createButton, -IdEditDialog QPushButton#createButton, CreateGxsForumMsg QPushButton#postButton, -GxsCreateCommentDialog QPushButton#postButton, GxsGroupDialog QPushButton#createButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -CreateCircleDialog QPushButton#createButton:hover, CreateLobbyDialog QPushButton#createButton:hover, -IdEditDialog QPushButton#createButton:hover, CreateGxsForumMsg QPushButton#postButton:hover, -GxsCreateCommentDialog QPushButton#postButton:hover, GxsGroupDialog QPushButton#createButton:hover { - background: #03b1f3; - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - -CreateGxsForumMsg QPushButton#postButton:disabled, PostedCreatePostDialog QPushButton#submitButton:disabled, -CreateGxsChannelMsg QPushButton#postButton:disabled, GxsCreateCommentDialog QPushButton#postButton:disabled { - font: bold; - font-size: 12pt; - color: white; - background: #d40000; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -QTabBar#smTab::tab{ - height: 32px; - width: 32px; -} - -QLabel#avatarLabel{ - border: 2px solid #CCCCCC; - border-radius: 4px; -} - -PostedCreatePostDialog QPushButton#submitButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - min-width: 2em; - -} - -PostedCreatePostDialog QPushButton#submitButton:hover { - background: #03b1f3; - border-radius: 4px; - min-width: 2em; - -} - -BoardPostDisplayWidget_compact QFrame#mainFrame { - border-radius: 4px; - border: 1px solid #32414B; - background-color: #19232D; -} - -BoardPostDisplayWidget_compact QFrame#mainFrame [new=false]{ - background: #19232D; -} - -BoardPostDisplayWidget_compact QFrame#mainFrame[new=true] { - background-color: #1464a0; -} - -GxsChannelPostItem QFrame#mainFrame { - border-radius: 4px; - border: 1px solid #32414B; - background-color: #19232D; -} - -GxsChannelPostItem QLabel#subjectLabel, GxsChannelPostItem QLabel#titleLabel { - font: 12pt; - font: bold italic; -} - -BoardPostDisplayWidget_compact QPushButton#shareButton { - background-color: transparent; - min-width: 80px; - max-height: 22px; -} - -BoardPostDisplayWidget_compact QFrame#voteFrame { - background: #141415; -} - -BoardPostDisplayWidget_compact QToolButton#voteDownButton, QToolButton#voteUpButton, -BoardPostDisplayWidget_card QToolButton#voteDownButton, QToolButton#voteUpButton -{ - border: none; -} - -BoardPostDisplayWidget_compact QLabel#pictureLabel{ - border: 2px solid #CCCCCC; - border-radius: 3px; -} - -BoardPostDisplayWidget_compact QLabel#scoreLabel, QLabel#titleLabel, QLabel#fromBoldLabel , QLabel#fromLabel, QLabel#dateLabel, -BoardPostDisplayWidget_card QLabel#scoreLabel, QLabel#titleLabel{ - background-color: transparent; -} - -BoardPostDisplayWidget_compact QLabel#newLabel, -BoardPostDisplayWidget_card QLabel#newLabel { - border: 1px solid #00B712; - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #5AFF15, stop: 1 #00B712); - border-radius: 3px; - color: black; -} - -BoardPostDisplayWidget_card QPushButton#shareButton{ - background-color: transparent; - min-width: 80px; - max-height: 22px; -} - -BoardPostDisplayWidget_card QFrame#voteFrame { - background: #141415; -} - -BoardPostDisplayWidget_card QFrame#mainFrame { - background-color: #19232D; -} - -BoardPostDisplayWidget_card QFrame#mainFrame [new=false]{ - background: #19232D; -} - -BoardPostDisplayWidget_card QFrame#mainFrame[new=true] { - background-color: #1464a0; -} - -BoardPostDisplayWidget_compact QLabel#titleLabel, -BoardPostDisplayWidget_card QLabel#titleLabel{ - font-size: 12pt; - font: bold; -} - -GxsForumMsgItem QFrame#frame{ - background-color: #19232D; -} - -PostedItem QFrame#mainFrame{ - background: #19232D; -} - -WireGroupItem QFrame#wire_frame{ - background: transparent; -} - -GxsChannelDialog GroupTreeWidget QTreeWidget#treeWidget::item{ - /*background-color: #F00000;*/ - /*padding: 2px;*/ -} - -RSTextBrowser, MimeTextEdit -{ - /*qproperty-textColorQuote: rgb(125, 125, 255);*/ - qproperty-textColorQuotes: ColorList(#789922 #039bd5 #800000 #800080 #008080 #b10dc9 #85144b #3d9970); -} - -PulseTopLevel QFrame#frame, PulseViewGroup QFrame#frame, PulseReply QFrame#frame { - border: 2px solid #38444d; - border-radius: 6px; -} - -MainWindow QListWidget { - font-size: 12pt; -} - -ChatLobbyWidget QTreeWidget#lobbyTreeWidget{ - font-size: 10pt; -} - -NewFriendList QTreeView#peerTreeWidget { - font-size: 12pt; -} - -ChannelsCommentsItem QFrame#mainFrame, BoardsCommentsItem QFrame#mainFrame { - background: #19232D; -} - -ChannelsCommentsItem QLabel#newCommentLabel, BoardsCommentsItem QLabel#newCommentLabel { - font: 12pt; - font: bold; -} - -ChannelsCommentsItem QLabel#subjectLabel, ChannelsCommentsItem QLabel#titleLabel , QLabel#nameLabel { - font: 12pt; - font: bold; -} - -BoardsCommentsItem QLabel#subjectLabel, QLabel#titleLabel , QLabel#nameLabel { - font: 12pt; - font: bold; -} - -HomePage QToolButton#addButton { - font: bold; - font-size: 15pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -HomePage QToolButton#addButton:hover { - background: #03b1f3; - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - -NewFriendList QTreeView#peerTreeWidget { - font-size: 12pt; -} diff --git a/retroshare-gui/src/qss/qdarkstyle.qss b/retroshare-gui/src/qss/qdarkstyle.qss deleted file mode 100644 index bac32c219..000000000 --- a/retroshare-gui/src/qss/qdarkstyle.qss +++ /dev/null @@ -1,1558 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) <2013-2014> - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -QProgressBar:horizontal { - border: 1px solid #3A3939; - text-align: center; - padding: 1px; - background: #201F1F; - width: 15px; -} -QProgressBar::chunk:horizontal { - background-color: qlineargradient(spread:reflect, x1:1, y1:0.545, x2:1, y2:0, stop:0 rgba(28, 66, 111, 255), stop:1 rgba(37, 87, 146, 255)); - width: 15px; -} - -QFrame#titleBarFrame, QFrame#toolBarFrame -{ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #616161, stop: 0.5 #505050, - stop: 0.6 #434343, stop:1 #656565); -} - -QToolTip -{ - border: 1px solid #3A3939; - background-color: rgb(90, 102, 117); - color: white; - padding: 1px; - opacity: 200; -} - -QWidget -{ - color: silver; - background-color: #302F2F; - selection-background-color:#78879b; - selection-color: black; - background-clip: border; - border-image: none; - outline: 0; -} -QTreeView::item, QTreeWidget::item, QListWidget::item{ - color: silver; -} - -QWidget:item:hover -{ - background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #78879b, stop: 1 #78879b); - color: black; -} - -QWidget:item:selected -{ - background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #78879b, stop: 1 #78879b); -} - -QTableWidget::item { - color: #C0C0C0; - background-color: #201F1F; -} - -QTableWidget::item:selected { - color: black; -} - -ForumsDialog, GxsForumThreadWidget -{ - qproperty-textColorRead: darkgray; - qproperty-textColorUnread: white; - qproperty-textColorUnreadChildren: red; - qproperty-textColorNotSubscribed: white; - qproperty-textColorMissing: darkred; - qproperty-textColorPinned: #D07000; - - qproperty-backgroundColorPinned: #202020; - qproperty-backgroundColorFiltered: darkGreen; -} - -QMenuBar -{ - background-color: #302F2F; - color: silver; -} - -QMenuBar::item -{ - background: transparent; -} - -QMenuBar::item:selected -{ - background: transparent; - border: 1px solid #3A3939; -} - -QMenuBar::item:pressed -{ - border: 1px solid #3A3939; - background-color: #78879b; - color: black; - margin-bottom:-1px; - padding-bottom:1px; -} - -QMenu -{ - border: 1px solid #3A3939; - color: silver; - margin: 2px; -} - -QMenu::icon -{ - margin: 5px; -} - -QMenu::item -{ - padding: 5px 30px 5px 30px; - margin-left: 5px; - border: 1px solid transparent; /* reserve space for selection border */ -} - -QMenu::item:selected -{ - color: black; -} - -QWidget:disabled -{ - color: #404040; - background-color: #302F2F; -} - -QAbstractItemView -{ - alternate-background-color: #3A3939; - color: silver; - border: 1px solid 3A3939; - border-radius: 3px; - padding: 1px; -} - -QWidget:focus, QMenuBar:focus -{ - border: 1px solid rgba(48, 86, 111); -} - -QTabWidget:focus, QCheckBox:focus, QRadioButton:focus -{ - border: none; -} - -QLineEdit -{ - background-color: #201F1F; - padding: 2px; - border-style: solid; - border: 1px solid #3A3939; - border-radius: 3px; - color: silver; -} - -QGroupBox { - border:1px solid #3A3939; - border-radius: 7px; - margin-top: 2ex; -} - -QGroupBox::title { - subcontrol-origin: margin; - subcontrol-position: top center; - padding-left: 10px; - padding-right: 10px; -} - -QAbstractScrollArea -{ - border-radius: 3px; - border: 1px solid #3A3939; -} - -QScrollBar:horizontal -{ - height: 15px; - margin: 0px 11px 0px 11px; - border: 1px solid #3A3939; - border-radius: 6px; - background-color: QLinearGradient( x1: 0, y1: 1, x2: 0, y2: 0, - stop: 0 #302F2F, stop: 1 #484846); -} - -QScrollBar::handle:horizontal -{ - background-color: QLinearGradient( x1: 0, y1: 1, x2: 0, y2: 0, - stop: 0 #605F5F, stop: 1 #787876); - min-width: 5px; - border-radius: 5px; -} - -QScrollBar::sub-line:horizontal -{ - border-image: url(%THISPATH%/qdarkstyle/right_arrow_disabled.png); - width: 10px; - height: 10px; - subcontrol-position: right; - subcontrol-origin: margin; -} - -QScrollBar::add-line:horizontal -{ - border-image: url(%THISPATH%/qdarkstyle/left_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: left; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:horizontal:hover,QScrollBar::sub-line:horizontal:on -{ - border-image: url(%THISPATH%/qdarkstyle/right_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: right; - subcontrol-origin: margin; -} - - -QScrollBar::add-line:horizontal:hover, QScrollBar::add-line:horizontal:on -{ - border-image: url(%THISPATH%/qdarkstyle/left_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: left; - subcontrol-origin: margin; -} - -QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal -{ - background: none; -} - - -QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal -{ - background: none; -} - -QScrollBar:vertical -{ - background-color: QLinearGradient( x1: 1, y1: 0, x2: 0, y2: 0, - stop: 0 #302F2F, stop: 1 #484846); - width: 15px; - margin: 11px 0 11px 0; - border: 1px solid #3A3939; - border-radius: 6px; -} - -QScrollBar::handle:vertical -{ - background-color: QLinearGradient( x1: 1, y1: 0, x2: 0, y2: 0, - stop: 0 #605F5F, stop: 1 #787876); - min-height: 5px; - border-radius: 5px; -} - -QScrollBar::sub-line:vertical -{ - border-image: url(%THISPATH%/qdarkstyle/up_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: top; - subcontrol-origin: margin; -} - -QScrollBar::add-line:vertical -{ - - border-image: url(%THISPATH%/qdarkstyle/down_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: bottom; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:vertical:hover,QScrollBar::sub-line:vertical:on -{ - - border-image: url(%THISPATH%/qdarkstyle/up_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: top; - subcontrol-origin: margin; -} - - -QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on -{ - border-image: url(%THISPATH%/qdarkstyle/down_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: bottom; - subcontrol-origin: margin; -} - -QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical -{ - background: none; -} - - -QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical -{ - background: none; -} - -QTextEdit -{ - background-color: #201F1F; - color: silver; - border: 1px solid #3A3939; -} - -QPlainTextEdit -{ - background-color: #201F1F; - color: silver; - border-radius: 3px; - border: 1px solid #3A3939; -} - -QHeaderView::section -{ - background-color: #3A3939; - color: silver; - padding-left: 4px; - border: 1px solid #6c6c6c; -} - -QCheckBox:disabled -{ - color: #404040; -} - -QSizeGrip { - image: url(%THISPATH%/qdarkstyle/sizegrip.png); - width: 12px; - height: 12px; -} - - -QMainWindow::separator -{ - background-color: #302F2F; - color: white; - padding-left: 4px; - spacing: 2px; - border: 1px dashed #3A3939; -} - -QMainWindow::separator:hover -{ - - background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #58677b, - stop:0.5 #78879b stop:1 #58677b); - color: white; - padding-left: 4px; - border: 1px solid #3A3939; - spacing: 2px; -} - - -QMenu::separator -{ - height: 1px; - background-color: #3A3939; - color: white; - padding-left: 4px; - margin-left: 10px; - margin-right: 5px; -} - - - -QRadioButton::indicator:checked, QRadioButton::indicator:unchecked{ - color: #b1b1b1; - background-color: #302F2F; - border: 1px solid silver; - border-radius: 5px; -} - - - -QRadioButton::indicator:checked -{ - background-color: qradialgradient( - cx: 0.5, cy: 0.5, - fx: 0.5, fy: 0.5, - radius: 1.0, - stop: 0.25 #78879b, - stop: 0.3 #302F2F - ); -} - -QCheckBox, QRadioButton -{ - padding: 3px; - outline: none; -} - -QCheckBox::indicator{ - color: #b1b1b1; - background-color: #302F2F; - border: 1px solid silver; - width: 9px; - height: 9px; -} - -QRadioButton::indicator -{ - border-radius: 7px; - width: 9px; - height: 9px; -} - -QCheckBox::indicator:pressed -{ - border: 1px solid #78879b; -} - -QRadioButton::indicator:hover, QCheckBox::indicator:hover -{ - border: 1px solid #78879b; -} - -QCheckBox::indicator:checked -{ - background-color: qradialgradient( - cx: 0.5, cy: 0.5, - fx: 0.5, fy: 0.5, - radius: 1.0, - stop: 0.25 #78879b, - stop: 0.3 #302F2F - ); - -} - -QCheckBox::indicator:disabled, QRadioButton::indicator:disabled -{ - border: 1px solid #444; -} - -QFrame -{ - border-radius: 3px; -} - -QStackedWidget -{ - border: none; -} - -QToolBar { - border: 1px solid #393838; - background: 1px solid #302F2F; - font-weight: bold; -} - -QToolBar::handle:horizontal { - image: url(%THISPATH%/qdarkstyle/Hmovetoolbar.png); -} -QToolBar::handle:vertical { - image: url(%THISPATH%/qdarkstyle/Vmovetoolbar.png); -} -QToolBar::separator:horizontal { - image: url(%THISPATH%/qdarkstyle/Hsepartoolbar.png); -} -QToolBar::separator:vertical { - image: url(%THISPATH%/qdarkstyle/Vsepartoolbars.png); -} - -QPushButton -{ - color: silver; - background-color: QLinearGradient( x1: 0, y1: 1, x2: 0, y2: 0, - stop: 0 #302F2F, stop: 1 #484846); - border-width: 1px; - border-color: #4A4949; - border-style: solid; - padding-top: 5px; - padding-bottom: 5px; - padding-left: 5px; - padding-right: 5px; - border-radius: 5px; - outline: none; -} - -QPushButton:disabled -{ - background-color: #302F2F; - border-width: 1px; - border-color: #3A3939; - border-style: solid; - padding-top: 5px; - padding-bottom: 5px; - padding-left: 10px; - padding-right: 10px; - /*border-radius: 3px;*/ - color: #454545; -} - -QComboBox -{ - selection-background-color: #78879b; - background-color: #201F1F; - border-style: solid; - border: 1px solid #3A3939; - border-radius: 3px; - padding: 2px; - min-width: 75px; -} - -QComboBox:hover,QPushButton:hover,QAbstractSpinBox:hover,QLineEdit:hover,QTextEdit:hover,QPlainTextEdit:hover,QAbstractView:hover,QTreeView:hover -{ - border: 1px solid #78879b; - color: silver; -} - -QComboBox:on -{ - background-color: #626873; - padding-top: 3px; - padding-left: 4px; - selection-background-color: #4a4a4a; -} - -/* Needed to remove indicator - fix #132 */ -QComboBox::indicator { - background-color:transparent; - selection-background-color:transparent; - color:transparent; - selection-color:transparent; -} - -QComboBox QAbstractItemView -{ - background-color: #201F1F; - border-radius: 3px; - border: 1px solid #3A3939; - selection-background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #78879b, stop: 1 #78879b); -} - -QComboBox::drop-down -{ - subcontrol-origin: padding; - subcontrol-position: top right; - width: 15px; - - border-left-width: 0px; - border-left-color: darkgray; - border-left-style: solid; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} - -QComboBox::down-arrow -{ - image: url(%THISPATH%/qdarkstyle/down_arrow_disabled.png); -} - -QComboBox::down-arrow:on, QComboBox::down-arrow:hover, -QComboBox::down-arrow:focus -{ - image: url(%THISPATH%/qdarkstyle/down_arrow.png); -} - -QPushButton:pressed -{ - background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #302F2F, stop: 1 #484846); -} - -QAbstractSpinBox { - padding-top: 2px; - padding-bottom: 2px; - border: 1px solid #3A3939; - background-color: #201F1F; - color: silver; - border-radius: 3px; - min-width: 75px; -} - -QAbstractSpinBox:up-button -{ - background-color: transparent; - subcontrol-origin: border; - subcontrol-position: center right; -} - -QAbstractSpinBox:down-button -{ - background-color: transparent; - subcontrol-origin: border; - subcontrol-position: center left; -} - -QAbstractSpinBox::up-arrow,QAbstractSpinBox::up-arrow:disabled,QAbstractSpinBox::up-arrow:off { - image: url(%THISPATH%/qdarkstyle/up_arrow_disabled.png); - width: 10px; - height: 10px; -} -QAbstractSpinBox::up-arrow:hover -{ - image: url(%THISPATH%/qdarkstyle/up_arrow.png); -} - - -QAbstractSpinBox::down-arrow,QAbstractSpinBox::down-arrow:disabled,QAbstractSpinBox::down-arrow:off -{ - image: url(%THISPATH%/qdarkstyle/down_arrow_disabled.png); - width: 10px; - height: 10px; -} -QAbstractSpinBox::down-arrow:hover -{ - image: url(%THISPATH%/qdarkstyle/down_arrow.png); -} - - -QLabel -{ - background-color: transparent; /*fixes spyder #9120,#9121*/ -} - - -QTabWidget::pane { - border: 1px solid #3A3939; -} - -QTabBar -{ - qproperty-drawBase: 0; - padding-right: 15px; -} - -QTabBar:focus -{ - border: 0px transparent black; -} - -QTabBar::close-button { - image: url(%THISPATH%/qdarkstyle/close.png); - background: transparent; - icon-size: 10px; - padding: 5px; -} - -QTabBar::close-button:hover -{ - background: rgba(255, 255, 255, 20); - border-radius: 3px; -} - -QTabBar::close-button:pressed { - padding: 5px 4px 4px 5px; -} - -/* TOP - BOTTOM TABS */ -QTabBar::tab:top { - color: #b1b1b1; - border: 1px solid #3A3939; - background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, - stop:1 #302F2F, stop:0 #5A5959); - padding-left: 5px; - padding-right: 5px; - padding-top: 3px; - padding-bottom: 2px; - margin-right: -1px; - - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} - -QTabBar::tab:bottom { - color: #b1b1b1; - border: 1px solid #3A3939; - background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, - stop:1 #302F2F, stop:0 #5A5959); - padding-left: 5px; - padding-right: 5px; - padding-top: 3px; - padding-bottom: 2px; - margin-right: -1px; - - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; -} - -QTabBar::tab:top:last, QTabBar::tab:bottom:last -{ - margin-right: 0; -} - -QTabBar::tab:top:first:!selected, QTabBar::tab:bottom:first:!selected -{ - margin-left: 0px; -} - -QTabBar::tab:top:!selected -{ - color: #b1b1b1; - margin-top: 3px; - background-color: #302F2F; -} - -QTabBar::tab:top:selected -{ - margin-bottom: 0px; -} - -QTabBar::tab:bottom:!selected -{ - color: #b1b1b1; - margin-bottom: 3px; - background-color: #302F2F; -} - -QTabBar::tab:bottom:selected -{ - margin-top: 0px; -} - -/* LEFT - RIGHT TABS */ -QTabBar::tab:left { - color: #b1b1b1; - border: 1px solid #3A3939; - background-color: QLinearGradient(x1:1, y1:0, x2:0, y2:0, - stop:1 #302F2F, stop:0 #5A5959); - padding-left: 3px; - padding-right: 2px; - padding-top: 5px; - padding-bottom: 5px; - margin-bottom: -1px; - - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} - -QTabBar::tab:right { - color: #b1b1b1; - border: 1px solid #3A3939; - background-color: QLinearGradient(x1:0, y1:0, x2:1, y2:0, - stop:1 #302F2F, stop:0 #5A5959); - padding-left: 3px; - padding-right: 2px; - padding-top: 5px; - padding-bottom: 5px; - margin-bottom: -1px; - - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} - -QTabBar::tab:left:!selected -{ - color: #b1b1b1; - margin-right: 3px; - background-color: #302F2F; -} - -QTabBar::tab:left:selected -{ - margin-left: 0px; -} - -QTabBar::tab:right:!selected -{ - color: #b1b1b1; - margin-left: 3px; - background-color: #302F2F; -} - -QTabBar::tab:right:selected -{ - margin-right: 0px; -} - -QTabBar QToolButton::right-arrow:enabled { - image: url(%THISPATH%/qdarkstyle/right_arrow.png); - } - - QTabBar QToolButton::left-arrow:enabled { - image: url(%THISPATH%/qdarkstyle/left_arrow.png); - } - -QTabBar QToolButton::right-arrow:disabled { - image: url(%THISPATH%/qdarkstyle/right_arrow_disabled.png); - } - - QTabBar QToolButton::left-arrow:disabled { - image: url(%THISPATH%/qdarkstyle/left_arrow_disabled.png); - } - - -QDockWidget { - border: 1px solid #403F3F; - titlebar-close-icon: url(%THISPATH%/qdarkstyle/close.png); - titlebar-normal-icon: url(%THISPATH%/qdarkstyle/undock.png); -} - -QDockWidget::close-button, QDockWidget::float-button { - border: 1px solid transparent; - border-radius: 3px; - background: transparent; - icon-size: 10px; -} - -QDockWidget::close-button:hover, QDockWidget::float-button:hover { - background: rgba(255, 255, 255, 10); -} - -QDockWidget::close-button:pressed, QDockWidget::float-button:pressed { - padding: 1px -1px -1px 1px; - background: rgba(255, 255, 255, 10); -} - -NewFriendList { - qproperty-textColorStatusAway: #4040A0; - qproperty-textColorStatusBusy: #A04040; - qproperty-textColorStatusOnline: #40A040; - qproperty-textColorStatusInactive: #A0A040; - qproperty-textColorStatusOffline: gray; - qproperty-textColorGroup: rgb(123, 123, 123); -} - -QTreeView, QListView -{ - border: 1px solid #78879b; - background-color: #201F1F; -} - -QTreeView::item { - background-color: #201F1F; -} - -QTreeView::item:selected { - color: black; -} - -RSTreeWidget#idTreeWidget::item:!selected { - color: #C0C0C0; -} - -NetworkDialog { - qproperty-backgroundColorSelf: darkred; - qproperty-backgroundColorOwnSign: darkred; - qproperty-backgroundColorAcceptConnection: black; - qproperty-backgroundColorHasSignedMe: darkred; - qproperty-backgroundColorDenied: #201F1F; -} - -QTreeView:branch:selected, QTreeView:branch:hover -{ - background: url(%THISPATH%/qdarkstyle/transparent.png); -} - -QTreeView::branch:has-siblings:!adjoins-item { - border-image: url(%THISPATH%/qdarkstyle/transparent.png); -} - -QTreeView::branch:has-siblings:adjoins-item { - border-image: url(%THISPATH%/qdarkstyle/transparent.png); -} - -QTreeView::branch:!has-children:!has-siblings:adjoins-item { - border-image: url(%THISPATH%/qdarkstyle/transparent.png); -} - -QTreeView::branch:has-children:!has-siblings:closed, -QTreeView::branch:closed:has-children:has-siblings { - image: url(%THISPATH%/qdarkstyle/branch_closed.png); -} - -QTreeView::branch:open:has-children:!has-siblings, -QTreeView::branch:open:has-children:has-siblings { - image: url(%THISPATH%/qdarkstyle/branch_open.png); -} - -QTreeView::branch:has-children:!has-siblings:closed:hover, -QTreeView::branch:closed:has-children:has-siblings:hover { - image: url(%THISPATH%/qdarkstyle/branch_closed-on.png); - } - -QTreeView::branch:open:has-children:!has-siblings:hover, -QTreeView::branch:open:has-children:has-siblings:hover { - image: url(%THISPATH%/qdarkstyle/branch_open-on.png); - } - -QListView::item:!selected:hover, QTableView::item:!selected:hover, QTreeView::item:!selected:hover { - background: rgba(0, 0, 0, 0); - outline: 0; - color: #FFFFFF; -} - -QListView::item:selected:hover, QTableView::item:selected:hover, QTreeView::item:selected:hover { - background: #78879b; - color: #FFFFFF; -} - -QSlider::groove:horizontal { - border: 1px solid #3A3939; - height: 8px; - background: #201F1F; - margin: 2px 0; - border-radius: 4px; -} - -QSlider::handle:horizontal { - background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0.0 silver, stop: 0.2 #a8a8a8, stop: 1 #727272); - border: 1px solid #3A3939; - width: 14px; - height: 14px; - margin: -4px 0; - border-radius: 7px; -} - -QSlider::groove:vertical { - border: 1px solid #3A3939; - width: 8px; - background: #201F1F; - margin: 0 0px; - border-radius: 4px; -} - -QSlider::handle:vertical { - background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0.0 silver, - stop: 0.2 #a8a8a8, stop: 1 #727272); - border: 1px solid #3A3939; - width: 14px; - height: 14px; - margin: 0 -4px; - border-radius: 7px; -} - -QToolButton { - background-color: transparent; - border: 1px solid #3A3939; - border-radius: 3px; - margin: 3px; -} - -QToolButton:pressed, QToolButton::menu-button:pressed { - background-color: #4A4949; - border: 1px solid silver; -} - -QToolButton:hover, QToolButton::menu-button:hover { - background-color: #4A4949; - border: 1px solid gray; -} - -QToolButton[popupMode="1"] { /* only for MenuButtonPopup */ - padding-right: 20px; /* make way for the popup button */ -} - -QToolButton[popupMode="2"] { /* only for MenuButtonPopup */ - padding-right: 10px; /* make way for the popup button */ -} - -/* the subcontrols below are used only in the MenuButtonPopup mode */ -QToolButton::menu-button { - border: 1px solid #3A3939; - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; - /* 16px width + 4px for border = 20px allocated above */ - width: 16px; -} - -QToolButton::menu-arrow { - image: url(%THISPATH%/qdarkstyle/down_arrow.png); -} - -QToolButton::menu-arrow:open { - top: 1px; left: 1px; /* shift it a bit */ -} - -QPushButton::menu-indicator { - subcontrol-origin: padding; - subcontrol-position: bottom right; - -} - -QTableView -{ - border: transparent; - gridline-color: #6c6c6c; - background-color: #201F1F; -} - - -QTableView, QHeaderView -{ - border-radius: 0px; -} - -QTableView::item:pressed, QListView::item:pressed, QTreeView::item:pressed { - background: #78879b; - color: #FFFFFF; -} - -QTableView::item:selected:active, QTreeView::item:selected:active, QListView::item:selected:active { - background: #78879b; - color: #FFFFFF; -} - - -QHeaderView -{ - border: 1px transparent; - margin: 0px; - padding: 0px; -} - -QHeaderView::section { - background-color: #3A3939; - color: silver; - padding: 4px; - border: 1px solid #6c6c6c; - border-radius: 0px; - text-align: center; -} - -QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one -{ - border-top: 1px solid #6c6c6c; -} - -QHeaderView::section::vertical -{ - border-top: transparent; -} - -QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one -{ - border-left: 1px solid #6c6c6c; -} - -QHeaderView::section::horizontal -{ - border-left: transparent; -} - - -QHeaderView::section:checked - { - color: white; - background-color: #5A5959; - } - - /* style the sort indicator */ -QHeaderView::down-arrow { - image: url(%THISPATH%/qdarkstyle/down_arrow.png); -} - -QHeaderView::up-arrow { - image: url(%THISPATH%/qdarkstyle/up_arrow.png); -} - - -QTableCornerButton::section { - background-color: #3A3939; - border: 1px solid #3A3939; - border-radius: 0px; -} - -QToolBox::tab { - background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, - stop:1 #302F2F, stop:0 #5A5959); - padding-left: 3px; - padding-right: 2px; - padding-top: 5px; - padding-bottom: 5px; - margin-bottom: -1px; - - border-top-left-radius: 3px; - border-top-right-radius: 3px; - color: darkgray; - } - - QToolBox::tab:selected { /* italicize selected tabs */ - font: italic bold; - color: white; - } - -QStatusBar::item { - border: 1px solid #3A3939; - border-radius: 3px; - } - -/* OpModeStatus need to be at end to overload other values*/ -OpModeStatus { - qproperty-opMode_Full_Color: #007000; - qproperty-opMode_NoTurtle_Color: #000070; - qproperty-opMode_Gaming_Color: #707000; - qproperty-opMode_Minimal_Color: #700000; -} -OpModeStatus[opMode="Full"] { - background: #007000; -} -OpModeStatus[opMode="NoTurtle"] { - background: #000070; -} -OpModeStatus[opMode="Gaming"] { - background: #707000; -} -OpModeStatus[opMode="Minimal"] { - background: #700000; -} - -/*Property Values at end to overwrite other settings*/ - -[new=false] { - background: #202020; -} -[new=true] { - background: #005000; -} - -[WrongValue="true"] { - background-color: #702020; -} - -/* changes for the subscribe Button */ - -PostedListWidgetWithModel QToolButton#subscribeToolButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; -} - -PostedListWidgetWithModel QToolButton#subscribeToolButton:hover { - background: #03b1f3; - border-radius: 4px; -} - -GxsForumThreadWidget QToolButton#subscribeToolButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; -} - -GxsForumThreadWidget QToolButton#subscribeToolButton:hover { - background: #03b1f3; - border-radius: 4px; -} - -GxsForumThreadWidget QWidget#threadTreeWidget { - selection-background-color: #445566; - show-decoration-selected: 1; -} - -GxsForumThreadWidget QWidget#threadTreeWidget::item { - padding: 2px; -} - -GxsForumThreadWidget QWidget#threadTreeWidget::item:selected:active , -GxsForumThreadWidget QWidget#threadTreeWidget::item:selected:!active { - background-color: #445566; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton:hover { - background: #03b1f3; - border-radius: 4px; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton:pressed { - background: #03b1f3; - border-radius: 4px; - border: 1px solid gray; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton:disabled { - background: gray; - border-radius: 4px; - border: 1px solid gray; - color: lightgray; -} - -/* only for MenuButtonPopup */ -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton[popupMode="1"] { - padding-right: 0px; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton::menu-arrow { - image: none; -} - -GxsChannelPostsWidgetWithModel QToolButton#subscribeToolButton::menu-button { - image: none; - -} - -GxsChannelPostItem QFrame#mainFrame { - background: #302F2F; -} - -GxsChannelPostItem > QFrame#mainFrame [new=false]{ - background: #302F2F; -} - -GxsChannelPostItem > QFrame#mainFrame[new=true] { - background-color: #005000; -} - -GxsChannelPostItem QLabel#subjectLabel, GxsChannelPostItem QLabel#titleLabel { - font: 12pt; - font: bold italic; -} - -CreateGxsChannelMsg QPushButton#postButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -CreateGxsChannelMsg QPushButton#postButton:hover { - background: #03b1f3; - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - -CreateCircleDialog QPushButton#createButton, CreateLobbyDialog QPushButton#createButton, -IdEditDialog QPushButton#createButton, CreateGxsForumMsg QPushButton#postButton, -GxsCreateCommentDialog QPushButton#postButton, GxsGroupDialog QPushButton#createButton, -PulseAddDialog QPushButton#pushButton_Post, PulseTopLevel QToolButton#toolButton_follow, -PulseViewGroup QToolButton#toolButton_follow { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 20px; - min-width: 4em; - padding: 2px; - padding-left: 6px; - padding-right: 6px; -} - -CreateCircleDialog QPushButton#createButton:hover, CreateLobbyDialog QPushButton#createButton:hover, -IdEditDialog QPushButton#createButton:hover, CreateGxsForumMsg QPushButton#postButton:hover, -GxsCreateCommentDialog QPushButton#postButton:hover, GxsGroupDialog QPushButton#createButton:hover, -ShareManager QPushButton#closeButton:hover, PulseAddDialog QPushButton#pushButton_Post:hover, -PulseTopLevel QToolButton#toolButton_follow:hover, PulseViewGroup QToolButton#toolButton_follow:hover{ - background: #03b1f3; - border-radius: 4px; - min-width: 4em; - padding-left: 6px; - padding-right: 6px; -} - -CreateGxsForumMsg QPushButton#postButton:disabled, PostedCreatePostDialog QPushButton#submitButton:disabled, -CreateGxsChannelMsg QPushButton#postButton:disabled, GxsCreateCommentDialog QPushButton#postButton:disabled, -PulseAddDialog QPushButton#pushButton_Post:disabled { - font: bold; - font-size: 12pt; - color: white; - background: #d40000; - border-radius: 4px; - max-height: 20px; - min-width: 4em; - padding: 2px; - padding-left: 6px; - padding-right: 6px; -} - -ShareManager QPushButton#closeButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; - padding-left: 6px; - padding-right: 6px; -} - -ShareManager QPushButton#addButton { - font: bold; - font-size: 12pt; - color: white; - background: #32CD32; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 4px; -} - -ShareManager QPushButton#addButton:hover { - background: #5AD75A; - border-radius: 4px; - min-width: 4em; - padding: 4px; -} - -QTabBar#smTab::tab{ - height: 32px; - width: 32px; -} - -QLabel#avatarLabel{ - border: 2px solid #CCCCCC; - border-radius: 4px; -} - -PostedCreatePostDialog QPushButton#submitButton { - font: bold; - font-size: 12pt; - color: white; - background: #0099cc; - border-radius: 4px; - min-width: 2em; - -} - -PostedCreatePostDialog QPushButton#submitButton:hover { - background: #03b1f3; - border-radius: 4px; - min-width: 2em; - -} - -GxsForumThreadWidget QPushButton#forumName -{ - qproperty-fontSizeFactor: 140; - color: #0099cc; - font-size: 14pt; - font: bold; -} - -GxsForumMsgItem QFrame#frame{ - background: #302F2F; -} - -PostedItem QFrame#mainFrame{ - background: #302F2F; -} - -BoardPostDisplayWidget_compact QPushButton#shareButton -{ - background-color: transparent; - border: none; - min-width: 75px; - max-height: 22px; -} - -BoardPostDisplayWidget_card QPushButton#shareButton -{ - background-color: transparent; - border: none; - min-width: 75px; -} - -BoardPostDisplayWidget_compact QFrame#voteFrame { - background: #141415; -} - -BoardPostDisplayWidget_card QFrame#voteFrame { - background: #141415; -} - -QPushButton#shareButton:hover, QPushButton#shareButton::menu-button:hover { - background-color: #4A4949; - border: 1px solid gray; -} - -BoardPostDisplayWidget_compact QToolButton#voteDownButton, QToolButton#voteUpButton, QToolButton#expandButton, QToolButton#readButton, -QToolButton#commentButton, QToolButton#notesButton -{ - border: none; -} - -BoardPostDisplayWidget_compact QLabel#pictureLabel{ - border: 2px solid #CCCCCC; - border-radius: 3px; -} - -BoardPostDisplayWidget_compact > QFrame#frame [new=false]{ - background: #302F2F; -} - -BoardPostDisplayWidget_compact > QFrame#frame[new=true] { - background-color: #005000; -} - -BoardPostDisplayWidget_card QToolButton#voteDownButton, QToolButton#voteUpButton -{ - border: none; -} - -BoardPostDisplayWidget_card QFrame#frame{ - background: #302F2F; -} - -BoardPostDisplayWidget_card > QFrame#frame [new=false]{ - background: #302F2F; -} - -BoardPostDisplayWidget_card > QFrame#frame[new=true] { - background-color: #005000; -} - -BoardPostDisplayWidget_compact QLabel#newLabel { - border: 1px solid #00B712; - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #5AFF15, stop: 1 #00B712); - border-radius: 3px; - color: black; -} - -BoardPostDisplayWidget_card QLabel#newLabel { - border: 1px solid #00B712; - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #5AFF15, stop: 1 #00B712); - border-radius: 3px; - color: black; -} - -BoardPostDisplayWidget_compact QLabel#titleLabel, -BoardPostDisplayWidget_card QLabel#titleLabel{ - font-size: 12pt; - font: bold; -} - -WireGroupItem QFrame#wire_frame -{ - border: 1px solid #38444d; - background: transparent; -} - -PulseReply #line_replyLine , PulseMessage #line{ - color: #38444d; -} - -RSTextBrowser, MimeTextEdit -{ - /*qproperty-textColorQuote: rgb(125, 125, 255);*/ - qproperty-textColorQuotes: ColorList(#789922 #039bd5 #800000 #800080 #008080 #b10dc9 #85144b #3d9970); -} - -PulseTopLevel QFrame#frame, PulseViewGroup QFrame#frame, PulseReply QFrame#frame { - border: 2px solid #38444d; - border-radius: 6px; -} - -MainWindow QListWidget { - font-size: 12pt; -} - -PhotoShare QPushButton#pushButton_YourAlbums, QPushButton#pushButton_SubscribedAlbums, -QPushButton#pushButton_SharedAlbums { - font-size: 12pt; -} - -PhotoItem QFrame#photoFrame{ - border: 2px solid #3A3939; -} - -AlbumItem QFrame#albumFrame { - border: 2px solid #3A3939; - border-radius: 10px -} - -ChannelsCommentsItem QFrame#mainFrame, BoardsCommentsItem QFrame#mainFrame { - background: #302F2F; -} - -ChannelsCommentsItem QLabel#newCommentLabel, BoardsCommentsItem QLabel#newCommentLabel { - font: 12pt; - font: bold; -} - -ChannelsCommentsItem QLabel#subjectLabel, ChannelsCommentsItem QLabel#titleLabel , QLabel#nameLabel { - font: 12pt; - font: bold; -} - -BoardsCommentsItem QLabel#subjectLabel, QLabel#titleLabel , QLabel#nameLabel { - font: 12pt; - font: bold; -} - -HomePage QToolButton#addButton { - font: bold; - font-size: 15pt; - color: white; - background: #0099cc; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -HomePage QToolButton#addButton:hover { - background: #03b1f3; - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - -NewFriendList QTreeView#peerTreeWidget { - font-size: 12pt; -} diff --git a/retroshare-gui/src/qss/qdarkstyle/Hmovetoolbar.png b/retroshare-gui/src/qss/qdarkstyle/Hmovetoolbar.png deleted file mode 100644 index 520c3aac3..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/Hmovetoolbar.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/Hsepartoolbar.png b/retroshare-gui/src/qss/qdarkstyle/Hsepartoolbar.png deleted file mode 100644 index 401bfb40a..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/Hsepartoolbar.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/Vmovetoolbar.png b/retroshare-gui/src/qss/qdarkstyle/Vmovetoolbar.png deleted file mode 100644 index 512edcecd..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/Vmovetoolbar.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/Vsepartoolbar.png b/retroshare-gui/src/qss/qdarkstyle/Vsepartoolbar.png deleted file mode 100644 index d9dc1561b..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/Vsepartoolbar.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/branch_closed-on.png b/retroshare-gui/src/qss/qdarkstyle/branch_closed-on.png deleted file mode 100644 index d081e9b3b..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/branch_closed-on.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/branch_closed.png b/retroshare-gui/src/qss/qdarkstyle/branch_closed.png deleted file mode 100644 index d652159a3..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/branch_closed.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/branch_open-on.png b/retroshare-gui/src/qss/qdarkstyle/branch_open-on.png deleted file mode 100644 index ec372b27d..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/branch_open-on.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/branch_open.png b/retroshare-gui/src/qss/qdarkstyle/branch_open.png deleted file mode 100644 index 66f8e1ac6..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/branch_open.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/checkbox.png b/retroshare-gui/src/qss/qdarkstyle/checkbox.png deleted file mode 100644 index b4a9aa3b5..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/checkbox.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/close.png b/retroshare-gui/src/qss/qdarkstyle/close.png deleted file mode 100644 index ffdec9a14..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/close.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/down_arrow.png b/retroshare-gui/src/qss/qdarkstyle/down_arrow.png deleted file mode 100644 index e271f7f90..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/down_arrow.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/down_arrow_disabled.png b/retroshare-gui/src/qss/qdarkstyle/down_arrow_disabled.png deleted file mode 100644 index 5805d9842..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/down_arrow_disabled.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/left_arrow.png b/retroshare-gui/src/qss/qdarkstyle/left_arrow.png deleted file mode 100644 index f808d2d72..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/left_arrow.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/left_arrow_disabled.png b/retroshare-gui/src/qss/qdarkstyle/left_arrow_disabled.png deleted file mode 100644 index f5b9af8a3..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/left_arrow_disabled.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/Hmovetoolbar.png b/retroshare-gui/src/qss/qdarkstyle/rc/Hmovetoolbar.png deleted file mode 100644 index cead99ed1..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/Hmovetoolbar.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/Hsepartoolbar.png b/retroshare-gui/src/qss/qdarkstyle/rc/Hsepartoolbar.png deleted file mode 100644 index 7f183c8b3..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/Hsepartoolbar.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/Vmovetoolbar.png b/retroshare-gui/src/qss/qdarkstyle/rc/Vmovetoolbar.png deleted file mode 100644 index ac6a655e2..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/Vmovetoolbar.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/Vsepartoolbar.png b/retroshare-gui/src/qss/qdarkstyle/rc/Vsepartoolbar.png deleted file mode 100644 index 7bf62f168..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/Vsepartoolbar.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/branch_closed-on.png b/retroshare-gui/src/qss/qdarkstyle/rc/branch_closed-on.png deleted file mode 100644 index d081e9b3b..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/branch_closed-on.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/branch_closed.png b/retroshare-gui/src/qss/qdarkstyle/rc/branch_closed.png deleted file mode 100644 index d652159a3..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/branch_closed.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/branch_open-on.png b/retroshare-gui/src/qss/qdarkstyle/rc/branch_open-on.png deleted file mode 100644 index ec372b27d..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/branch_open-on.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/branch_open.png b/retroshare-gui/src/qss/qdarkstyle/rc/branch_open.png deleted file mode 100644 index 66f8e1ac6..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/branch_open.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked.png deleted file mode 100644 index 4007c2ed3..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked@2x.png deleted file mode 100644 index b9c3204f1..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked_disabled.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked_disabled.png deleted file mode 100644 index 4762561b3..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked_disabled.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked_disabled@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked_disabled@2x.png deleted file mode 100644 index 98bf5470c..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked_disabled@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked_focus.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked_focus.png deleted file mode 100644 index 91cb16c9f..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked_focus.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked_focus@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked_focus@2x.png deleted file mode 100644 index 04b3bb514..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_checked_focus@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate.png deleted file mode 100644 index 6b846365c..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate@2x.png deleted file mode 100644 index baa502017..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate_disabled.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate_disabled.png deleted file mode 100644 index 435048a08..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate_disabled.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate_disabled@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate_disabled@2x.png deleted file mode 100644 index 3e7f76c7c..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate_disabled@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate_focus.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate_focus.png deleted file mode 100644 index 4bf4d53c1..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate_focus.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate_focus@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate_focus@2x.png deleted file mode 100644 index 1f5cb3e88..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_indeterminate_focus@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked.png deleted file mode 100644 index 54044babf..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked@2x.png deleted file mode 100644 index 1259a9841..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked_disabled.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked_disabled.png deleted file mode 100644 index 75f049024..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked_disabled.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked_disabled@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked_disabled@2x.png deleted file mode 100644 index e4ecef9d5..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked_disabled@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked_focus.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked_focus.png deleted file mode 100644 index 5b0a18f01..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked_focus.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked_focus@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked_focus@2x.png deleted file mode 100644 index 14bec86c2..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/checkbox_unchecked_focus@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/close-hover.png b/retroshare-gui/src/qss/qdarkstyle/rc/close-hover.png deleted file mode 100644 index fdbaf9bf0..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/close-hover.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/close-pressed.png b/retroshare-gui/src/qss/qdarkstyle/rc/close-pressed.png deleted file mode 100644 index 9b243bfe8..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/close-pressed.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/close.png b/retroshare-gui/src/qss/qdarkstyle/rc/close.png deleted file mode 100644 index 89407de72..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/close.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/down_arrow.png b/retroshare-gui/src/qss/qdarkstyle/rc/down_arrow.png deleted file mode 100644 index e271f7f90..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/down_arrow.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/down_arrow_disabled.png b/retroshare-gui/src/qss/qdarkstyle/rc/down_arrow_disabled.png deleted file mode 100644 index 5805d9842..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/down_arrow_disabled.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/left_arrow.png b/retroshare-gui/src/qss/qdarkstyle/rc/left_arrow.png deleted file mode 100644 index f808d2d72..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/left_arrow.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/left_arrow_disabled.png b/retroshare-gui/src/qss/qdarkstyle/rc/left_arrow_disabled.png deleted file mode 100644 index f5b9af8a3..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/left_arrow_disabled.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked.png b/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked.png deleted file mode 100644 index 368acce58..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked@2x.png deleted file mode 100644 index b5f5eed9b..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked_disabled.png b/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked_disabled.png deleted file mode 100644 index 73ff735f2..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked_disabled.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked_disabled@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked_disabled@2x.png deleted file mode 100644 index 827e5928b..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked_disabled@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked_focus.png b/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked_focus.png deleted file mode 100644 index ad6d2cf82..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked_focus.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked_focus@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked_focus@2x.png deleted file mode 100644 index 7e5930563..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/radio_checked_focus@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked.png b/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked.png deleted file mode 100644 index 82f2abb8c..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked@2x.png deleted file mode 100644 index 793719b3b..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked_disabled.png b/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked_disabled.png deleted file mode 100644 index 5c54ee9df..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked_disabled.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked_disabled@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked_disabled@2x.png deleted file mode 100644 index d50153d1d..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked_disabled@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked_focus.png b/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked_focus.png deleted file mode 100644 index f42d85c7f..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked_focus.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked_focus@2x.png b/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked_focus@2x.png deleted file mode 100644 index 0927b4959..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/radio_unchecked_focus@2x.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/right_arrow.png b/retroshare-gui/src/qss/qdarkstyle/rc/right_arrow.png deleted file mode 100644 index 9b0a4e6a7..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/right_arrow.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/right_arrow_disabled.png b/retroshare-gui/src/qss/qdarkstyle/rc/right_arrow_disabled.png deleted file mode 100644 index 5c0bee402..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/right_arrow_disabled.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/sizegrip.png b/retroshare-gui/src/qss/qdarkstyle/rc/sizegrip.png deleted file mode 100644 index 350583aaa..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/sizegrip.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/stylesheet-branch-end.png b/retroshare-gui/src/qss/qdarkstyle/rc/stylesheet-branch-end.png deleted file mode 100644 index cb5d3b51f..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/stylesheet-branch-end.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/stylesheet-branch-more.png b/retroshare-gui/src/qss/qdarkstyle/rc/stylesheet-branch-more.png deleted file mode 100644 index 62711409d..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/stylesheet-branch-more.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/stylesheet-vline.png b/retroshare-gui/src/qss/qdarkstyle/rc/stylesheet-vline.png deleted file mode 100644 index 87536cce1..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/stylesheet-vline.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/transparent.png b/retroshare-gui/src/qss/qdarkstyle/rc/transparent.png deleted file mode 100644 index 483df2513..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/transparent.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/undock.png b/retroshare-gui/src/qss/qdarkstyle/rc/undock.png deleted file mode 100644 index 58cde37b8..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/undock.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/up_arrow.png b/retroshare-gui/src/qss/qdarkstyle/rc/up_arrow.png deleted file mode 100644 index abcc72452..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/up_arrow.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/rc/up_arrow_disabled.png b/retroshare-gui/src/qss/qdarkstyle/rc/up_arrow_disabled.png deleted file mode 100644 index b9c8e3b53..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/rc/up_arrow_disabled.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/right_arrow.png b/retroshare-gui/src/qss/qdarkstyle/right_arrow.png deleted file mode 100644 index 9b0a4e6a7..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/right_arrow.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/right_arrow_disabled.png b/retroshare-gui/src/qss/qdarkstyle/right_arrow_disabled.png deleted file mode 100644 index 5c0bee402..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/right_arrow_disabled.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/sizegrip.png b/retroshare-gui/src/qss/qdarkstyle/sizegrip.png deleted file mode 100644 index 350583aaa..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/sizegrip.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/stylesheet-branch-end.png b/retroshare-gui/src/qss/qdarkstyle/stylesheet-branch-end.png deleted file mode 100644 index cb5d3b51f..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/stylesheet-branch-end.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/stylesheet-branch-more.png b/retroshare-gui/src/qss/qdarkstyle/stylesheet-branch-more.png deleted file mode 100644 index 62711409d..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/stylesheet-branch-more.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/stylesheet-vline.png b/retroshare-gui/src/qss/qdarkstyle/stylesheet-vline.png deleted file mode 100644 index 87536cce1..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/stylesheet-vline.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/transparent.png b/retroshare-gui/src/qss/qdarkstyle/transparent.png deleted file mode 100644 index 483df2513..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/transparent.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/undock.png b/retroshare-gui/src/qss/qdarkstyle/undock.png deleted file mode 100644 index 804547aed..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/undock.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/up_arrow.png b/retroshare-gui/src/qss/qdarkstyle/up_arrow.png deleted file mode 100644 index abcc72452..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/up_arrow.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qdarkstyle/up_arrow_disabled.png b/retroshare-gui/src/qss/qdarkstyle/up_arrow_disabled.png deleted file mode 100644 index b9c8e3b53..000000000 Binary files a/retroshare-gui/src/qss/qdarkstyle/up_arrow_disabled.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qlive.qss b/retroshare-gui/src/qss/qlive.qss deleted file mode 100644 index d7df00f76..000000000 --- a/retroshare-gui/src/qss/qlive.qss +++ /dev/null @@ -1,141 +0,0 @@ -.QWidget{ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #77AEF1, stop: 0.4 #86BBF7); -} - -QDialog{ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #77AEF1, stop: 0.4 #86BBF7); -} - -QFrame#titleBarFrame, QFrame#toolBarFrame { - - border-image: url(%THISPATH%/qlive/qb.png); -} - -HeaderFrame { - background-image: url(:/images/headerFrame.png); - border: 0px; -} - -/* Customize the toolbar. */ -QToolBar#toolBarAction { - border-image: url(%THISPATH%/qlive/qb.png); - -} - -QToolBar#toolBarPage { - border-image: url(%THISPATH%/qlive/qb.png); - -} - -QToolBar#chattoolBar{ - border-image: url(%THISPATH%/qlive/qb.png); - -} - -QMenu { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #77AEF1, stop: 0.4 #86BBF7); - - border: 1px solid black; - } - -QMenu::item:selected { /* when user selects item using mouse or keyboard */ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F6F9FA, stop: 1 #C6D3E5); -} - -QListWidget::item:selected { /* when user selects item using mouse or keyboard */ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F6F9FA, stop: 1 #C6D3E5); -} -QTreeWidget { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #77AEF1, stop: 0.4 #86BBF7); - - } - - -QTreeWidget::item:selected { /* when user selects item using mouse or keyboard */ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F6F9FA, stop: 1 #C6D3E5); - -} - -QTreeView::item:selected { /* when user selects item using mouse or keyboard */ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F6F9FA, stop: 1 #C6D3E5); - -} - -QFrame#messengerframetop{ - - border-image: url(%THISPATH%/qlive/qb.png); - -} - -QFrame#Chatbuttonframe{ - - border-image: url(%THISPATH%/qlive/qb.png); - -} - -QLabel#subjectText{ - font: bold 12px; - -} - -QLabel#subjectlabel{ - font: bold 12px; - -} - -QLabel#fromlabel{ - font: bold 12px; - -} - -QLabel#datelabel{ - font: bold 12px; - -} - -QLabel#tolabel{ - font: bold 12px; - -} - -QLabel#fromText{ - font: bold ; - color: blue; - -} -QStatusBar{ - border-image: url(%THISPATH%/qlive/qb.png); -} - -HomePage QToolButton#addButton { - font: bold; - font-size: 15pt; - color: white; - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #77AEF1, stop: 0.4 #86BBF7); - border: 1px solid #86BBF7; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -HomePage QToolButton#addButton:hover { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #7fb0ec, stop: 1 #90a1e2); - border: 1px solid #90a1e2; - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - -MainWindow QListWidget { - font-size: 12pt; -} \ No newline at end of file diff --git a/retroshare-gui/src/qss/qlive/qb.png b/retroshare-gui/src/qss/qlive/qb.png deleted file mode 100644 index cde1a8588..000000000 Binary files a/retroshare-gui/src/qss/qlive/qb.png and /dev/null differ diff --git a/retroshare-gui/src/qss/qlive/qb2.png b/retroshare-gui/src/qss/qlive/qb2.png deleted file mode 100644 index abd2f0b74..000000000 Binary files a/retroshare-gui/src/qss/qlive/qb2.png and /dev/null differ diff --git a/retroshare-gui/src/qss/redscorpion.qss b/retroshare-gui/src/qss/redscorpion.qss deleted file mode 100644 index d0fb8d0ed..000000000 --- a/retroshare-gui/src/qss/redscorpion.qss +++ /dev/null @@ -1,321 +0,0 @@ -.QWidget { - background-color: #3E1716; -} - -QFrame#titleBarFrame, QFrame#toolBarFrame { - - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F55332, stop: 0.5 #C82B18, - stop: 0.51 #B71502, stop: 1 #900907); - border: 1px solid #7A3C37; -} - - -QDialog{ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 red, stop: 1 darkred); -} - -HeaderFrame { - background-image: url(:/images/headerFrame.png); - border: 0px; -} - -/* Customize the toolbar. */ -QToolBar#toolBarPage { - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F55332, stop: 0.5 #C82B18, - stop: 0.51 #B71502, stop: 1 #900907); - border: 1px solid #7A3C37; - -} - -QToolBar#toolBarAction { - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F55332, stop: 0.5 #C82B18, - stop: 0.51 #B71502, stop: 1 #900907); - border: 1px solid #7A3C37; - - -} - -QToolBar#chattoolBar{ - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F55332, stop: 0.5 #C82B18, - stop: 0.51 #B71502, stop: 1 #900907); - border: 1px solid #7A3C37; - -} - - -/* it works only at the moment with vista Thema on XP*/ -QToolButton::hover { - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #FFD200, stop: 1 #FF6400); - - -} - -QToolButton::pressed { - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #FFD200, stop: 1 #FF6400); - - -} - -QPushButton { - /* background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 red, stop: 1 darkred);*/ -} - -QPushButton#okButton { - min-height: 27px; - min-width: 77px; -} - -QPushButton#cancelprefButton { - min-height: 27px; - min-width: 77px; -} - -QPushButton#cancelButton { - min-height: 25px; - max-height: 25px; - min-width: 75px; -} - - -QPushButton#applyButton { - - min-height: 25px; - max-height: 25px; - min-width: 75px; -} - -QToolButton { - color: black; -} - - QTabWidget::tab-bar { - left: 0px; /* move to the right by 5px */ - } - - /* Style the tab using the tab sub-control. Note that - it reads QTabBar _not_ QTabWidget */ - QTabBar::tab { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 red, stop: 1 darkred); - border: 2px solid #C4C4C3; - border-bottom-color: #C2C7CB; /* same as the pane color */ - border-top-left-radius: 4px; - border-top-right-radius: 4px; - min-width: 8ex; - padding: 2px; - } - - QTabBar::tab:selected, QTabBar::tab:hover { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 darkred, stop: 1 red); - } - - QTabBar::tab:selected { - border-color: #9B9B9B; - border-bottom-color: #C2C7CB; /* same as pane color */ - } - - QTabBar::tab:!selected { - margin-top: 2px; /* make non-selected tabs look smaller */ - } - -QStatusBar{ - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F55332, stop: 0.5 #C82B18, - stop: 0.51 #B71502, stop: 1 #900907); - border: 1px solid #7A3C37; - -} - -QToolTip{ - background-color: darkred; -} - -QMenu { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 red, stop: 1 darkred); - border: 1px solid black; - } - -QMenu::item { - /* sets background of menu item. set this to something non-transparent - if you want menu color and menu item color to be different */ - background-color: transparent; - } - -QMenu::item:selected { /* when user selects item using mouse or keyboard */ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #FFD200, stop: 1 #FF6400); - } - -QListWidget::item:selected { /* when user selects item using mouse or keyboard */ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 red, stop: 1 darkred); -} - -QTreeWidget::item:selected { /* when user selects item using mouse or keyboard */ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 red, stop: 1 darkred); -} - -QTreeView::item:selected { /* when user selects item using mouse or keyboard */ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 red, stop: 1 darkred); - -} - -QFrame#messengerframetop{ - - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F55332, stop: 0.5 #C82B18, - stop: 0.51 #B71502, stop: 1 #900907); - border: 1px solid #7A3C37; -} - -QFrame#Chatbuttonframe{ - - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F55332, stop: 0.5 #C82B18, - stop: 0.51 #B71502, stop: 1 #900907); - border: 1px solid #7A3C37; - -} - -QFrame#frame_2{ - border-image: url(%THISPATH%/redscorpion/red.png); - - -border: 1px solid #CCCCCC; -} - -QFrame#buttonframe{ - border-image: url(%THISPATH%/redscorpion/red.png); - - -border: 1px solid #CCCCCC; -} - -QFrame#frame{ - border-image: url(%THISPATH%/redscorpion/red.png); - - border: 1px solid #CCCCCC; -} - -QFrame#chheaderframe{ - border-image: url(%THISPATH%/redscorpion/red.png); - - -border: 1px solid #CCCCCC; -} - - -QLabel#subjectText{ - font: bold 12px; - -} - -QLabel#subjectlabel{ - font: bold 12px; - -} - -QLabel#fromlabel{ - font: bold 12px; - -} - -QLabel#datelabel{ - font: bold 12px; - -} - -QLabel#tolabel{ - font: bold 12px; - -} - -QLabel#fromText{ - font: bold ; - color: blue; - -} - -QLabel#infolabel{ - color: darkred; -} - -QLabel#friendstitlellabel{ - color: black; -} - -QLabel#networklabel{ - color: black; -} - -QLabel#labeltext{ - color: black; -} - -QRadioButton{ - color: white; -} - -QLabel{ - - color: white; -} - -QLabel#forumName{ - border: 2px solid red; - border-radius: 10px; - background: white; - color: black; -} - -QLabel#threadTitle{ - border: 2px solid red; - border-radius: 10px; - background: white; - color: black; -} - -HomePage QToolButton#addButton { - font: bold; - font-size: 15pt; - color: white; - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F55332, stop: 0.5 #C82B18, - stop: 0.51 #B71502, stop: 1 #900907); - border: 1px solid #7A3C37; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -HomePage QToolButton#addButton:hover { - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F55332, stop: 0.5 #C82B18, - stop: 0.51 #ca1b06, stop: 1 #ac0c0a); - border: 1px solid #7A3C37; - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - -MainWindow QListWidget { - font-size: 12pt; -} - -MainWindow QToolButton { - color: white; -} diff --git a/retroshare-gui/src/qss/redscorpion/red.png b/retroshare-gui/src/qss/redscorpion/red.png deleted file mode 100644 index 8c2246cdb..000000000 Binary files a/retroshare-gui/src/qss/redscorpion/red.png and /dev/null differ diff --git a/retroshare-gui/src/qss/redscorpion/red2.png b/retroshare-gui/src/qss/redscorpion/red2.png deleted file mode 100644 index 0b2a36121..000000000 Binary files a/retroshare-gui/src/qss/redscorpion/red2.png and /dev/null differ diff --git a/retroshare-gui/src/qss/silver.qss b/retroshare-gui/src/qss/silver.qss deleted file mode 100644 index 32025e8fa..000000000 --- a/retroshare-gui/src/qss/silver.qss +++ /dev/null @@ -1,164 +0,0 @@ -.QWidget{ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F9F9FF, stop: 1 #9F9DB9); -} - -QFrame#titleBarFrame, QFrame#toolBarFrame { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F9F9FF, stop: 1 #9F9DB9); -} - -FriendsDialog QFrame#headFrame { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F9F9FF, stop: 1 #9F9DB9); - border: 1px; - border-radius: 4px; -} - -HeaderFrame { - background-image: url(:/images/headerFrame.png); - border: 0px; -} - -/* Customize the toolbar. */ -QToolBar#toolBarAction { - border-image: url(%THISPATH%/silver/silver.png); - -} - -/* Customize the toolbar. */ -QToolBar#toolBarPage { - border-image: url(%THISPATH%/silver/silver.png); - -} - -QToolBar#chattoolBar{ - border-image: url(%THISPATH%/silver/silver.png); - -} - -QDialog{ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F9F9FF, stop: 1 #9F9DB9); -} - -QPushButton#okButton { - min-height: 27px; - min-width: 77px; -} - -QPushButton#cancelprefButton { - min-height: 27px; - min-width: 77px; -} - -QPushButton#cancelButton { - min-height: 25px; - max-height: 25px; - min-width: 75px; -} - - -QPushButton#applyButton { - - min-height: 25px; - max-height: 25px; - min-width: 75px; -} - -QMenu::item:selected { /* when user selects item using mouse or keyboard */ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F9F9FF, stop: 1 #9F9DB9); -} - -QListWidget::item:selected { /* when user selects item using mouse or keyboard */ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F9F9FF, stop: 1 #9F9DB9); -} - -QTreeWidget::item:selected { /* when user selects item using mouse or keyboard */ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F9F9FF, stop: 1 #9F9DB9); -} - -QStatusBar{ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F9F9FF, stop: 1 #9F9DB9); -} - -QFrame#messengerframetop{ - - border-image: url(%THISPATH%/silver/silver.png); - - - /*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07);*/ -} - -QFrame#Chatbuttonframe{ - - border-image: url(%THISPATH%/silver/silver.png); - -} - -QLabel#subjectText{ - font: bold 12px; - -} - -QLabel#subjectlabel{ - font: bold 12px; - -} - -QLabel#fromlabel{ - font: bold 12px; - -} - -QLabel#datelabel{ - font: bold 12px; - -} - -QLabel#tolabel{ - font: bold 12px; - -} - -QLabel#fromText{ - font: bold ; - color: blue; - -} - -HomePage QToolButton#addButton { - font: bold; - font-size: 15pt; - color: white; - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F9F9FF, stop: 1 #9F9DB9); - border: 1px solid #9F9DB9; - border-radius: 4px; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -HomePage QToolButton#addButton:hover { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #eaeaff, stop: 1 #9f9dbc); - border: 1px solid #9F9DB9; - border-radius: 4px; - min-width: 4em; - padding: 2px; -} - -MainWindow QListWidget { - font-size: 12pt; -} - diff --git a/retroshare-gui/src/qss/silver/silver.png b/retroshare-gui/src/qss/silver/silver.png deleted file mode 100644 index 2559aa8d8..000000000 Binary files a/retroshare-gui/src/qss/silver/silver.png and /dev/null differ diff --git a/retroshare-gui/src/qss/silver/silver2.png b/retroshare-gui/src/qss/silver/silver2.png deleted file mode 100644 index fe875f925..000000000 Binary files a/retroshare-gui/src/qss/silver/silver2.png and /dev/null differ diff --git a/retroshare-gui/src/qss/uus.qss b/retroshare-gui/src/qss/uus.qss deleted file mode 100644 index ee1e7b82a..000000000 --- a/retroshare-gui/src/qss/uus.qss +++ /dev/null @@ -1,317 +0,0 @@ -.QWidget { - /*background-color: black;*/ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #376D85, stop: 0.4 #185772); - -} - -QFrame#titleBarFrame, QFrame#toolBarFrame { - - border-image: url(%THISPATH%/uus/uus.png); -} - -FriendsDialog QFrame#headFrame { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); - border: 1px; - border-radius: 4px; -} - -HeaderFrame { - background-image: url(:/images/headerFrame.png); - border: 0px; -} - -QDialog{ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #376D85, stop: 0.4 #185772); -} - - -/* Customize the toolbar. */ -QToolBar#toolBarAction { - border-image: url(%THISPATH%/uus/uus.png); - -} -QToolBar#toolBarPage { - border-image: url(%THISPATH%/uus/uus.png); - -} - -QToolBar#chattoolBar{ - border-image: url(%THISPATH%/uus/uus.png); - - -} - -QFrame#frame_2{ -background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #376D85, stop: 0.4 #185772); - border: 1px solid #CCCCCC; - -} - -QFrame#buttonframe{ -background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #FEFEFE, stop:1 #E8E8E8); -} - -/* it works only at the moment with vista Thema on XP*/ -QToolButton::hover { - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); - - -} - -QToolButton::pressed { - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); - - -} - -/* Style the tab using the tab sub-control. Note that - it reads QTabBar _not_ QTabWidget */ -QTabBar::tab { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); - border: 2px solid #BDDF7D; - border-bottom-color: #49881F; /* same as the pane color */ - border-top-left-radius: 4px; - border-top-right-radius: 4px; - min-width: 8ex; - padding: 2px; - -} - -QTabBar::tab:!selected { - margin-top: 2px; /* make non-selected tabs look smaller */ - -} - -QTabBar::tab:selected, QTabBar::tab:hover { - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F0F8CB, stop: 1 #F0F8CD); - -} - -QTabBar::tab:selected { - border-color: #9B9B9B; - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F5FFBC, stop: 1 #609C08); -} - -QHeaderView::section { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); - color: white; - padding-left: 4px; - border: 1px solid #6c6c6c; - } - -QPushButton#okButton { - min-height: 27px; - min-width: 77px; -} - -QPushButton#cancelprefButton { - min-height: 27px; - min-width: 77px; -} - -QPushButton#cancelButton { - min-height: 25px; - max-height: 25px; - min-width: 75px; -} - - -QPushButton#applyButton { - - min-height: 25px; - max-height: 25px; - min-width: 75px; -} - -QPushButton { - /*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); - border: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F);*/ -} - - -QPushButton::hover { - /*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F0F8CB, stop: 1 #F0F8CD);*/ -} - -QPushButton::pressed { - /*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F5FFBC, stop: 1 #609C08);*/ -} - - -QLabel -{ -color: white; -} - -QStatusBar{ - border-image: url(%THISPATH%/uus/uus.png); - -} - -QMenu { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #376D85, stop: 1 #185772); - border: 1px solid black; - } - -QMenu::item:selected { /* when user selects item using mouse or keyboard */ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); -} - -QListWidget::item:selected { /* when user selects item using mouse or keyboard */ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); -} - -QTreeWidget { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #376D85, stop: 1 #185772); - - } - - -QTreeWidget::item:selected { /* when user selects item using mouse or keyboard */ - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); - -} - -QTreeView { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #376D85, stop: 1 #185772); - - } - -QTreeView::item:selected { /* when user selects item using mouse or keyboard */ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); - -} - -QToolTip{ - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07); -} - -QFrame#messengerframetop{ - - border-image: url(%THISPATH%/uus/uus.png); - - /*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07);*/ -} - -QFrame#Chatbuttonframe{ - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); - -} - -QLabel#subjectText{ - font: bold 12px; - -} - -QLabel#subjectlabel{ - font: bold 12px; - -} - -QLabel#fromlabel{ - font: bold 12px; - -} - -QLabel#datelabel{ - font: bold 12px; - -} - -QLabel#tolabel{ - font: bold 12px; - -} - -QLabel#fromText{ - font: bold ; - color: blue; - -} - -QLabel#friendstitlellabel{ - color: black; -} - -QLabel#friendslabel{ - color: black; -} - -QLabel#networklabel{ - color: black; -} - -QLabel#channellabel{ - color: black; -} - -QLabel#forumslabel{ - color: black; -} - -QLabel#downloadslabel{ - color: black; -} - -QLabel#forumName{ - color: black; -} - -QLabel#threadTitle{ - color: black; -} - - -QLabel#labeltext{ - color: black; -} - -QStatusBar { - - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); - -} - -HomePage QToolButton#addButton { - font: bold; - font-size: 15pt; - color: #49881F; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -MainWindow QListWidget { - font-size: 12pt; -} - diff --git a/retroshare-gui/src/qss/uus/uus.png b/retroshare-gui/src/qss/uus/uus.png deleted file mode 100644 index 1e4f98f98..000000000 Binary files a/retroshare-gui/src/qss/uus/uus.png and /dev/null differ diff --git a/retroshare-gui/src/qss/uus/uus2.png b/retroshare-gui/src/qss/uus/uus2.png deleted file mode 100644 index 6036684b0..000000000 Binary files a/retroshare-gui/src/qss/uus/uus2.png and /dev/null differ diff --git a/retroshare-gui/src/qss/yaba.qss b/retroshare-gui/src/qss/yaba.qss deleted file mode 100644 index 06d35b9ad..000000000 --- a/retroshare-gui/src/qss/yaba.qss +++ /dev/null @@ -1,228 +0,0 @@ -.QWidget { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #6F6F6F, stop:1 #979797); - } - - -QFrame#titleBarFrame, QFrame#toolBarFrame { - - border-image: url(%THISPATH%/yaba/yaba.png); -} - -HeaderFrame { - background-image: url(:/images/headerFrame.png); - border: 0px; -} - -FriendsDialog QFrame#headFrame { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #FBC957, stop:1 #D79704); - border: 1px; - border-radius: 4px; -} - -QFrame#titleBarFrame, QFrame#toolBarFrame { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #FBC957, stop:1 #D79704); - -} - -QDialog, QMainWindow, QStatusBar{ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #6F6F6F, stop:1 #979797); -} - -QWidget#chatcentralwidget{ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #6F6F6F, stop:1 #979797); -} - - -/* Channels */ - -ChannelFeed QFrame#headerFrame { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #FBC957, stop:1 #D79704); - border: 1px solid #CCCCCC; -} - -/* Customize the toolbar. */ -QToolBar#toolBarAction { - border-image: url(%THISPATH%/yaba/yaba.png); - -} - -QToolBar#toolBarPage { - border-image: url(%THISPATH%/yaba/yaba.png); - -} - -QFrame#frame_2{ - border-image: url(%THISPATH%/yaba/yaba3.png); - -} - -QFrame#buttonframe{ - border-image: url(%THISPATH%/yaba/yaba3.png); - -} - -QFrame#chheaderframe{ - border-image: url(%THISPATH%/yaba/yaba3.png); - -} -QFrame#frame{ - border-image: url(%THISPATH%/yaba/yaba3.png); - -} - -QHeaderView::section { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #616161, stop: 0.5 #505050, - stop: 0.6 #434343, stop:1 #656565); - color: white; - padding-left: 4px; - border: 1px solid #6c6c6c; - } - - - QMenuBar { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #626262, stop:1 #989898); - } - - QTabWidget::pane { /* The tab widget frame */ - border-top: 2px solid #C2C7CB; - } - - QTabWidget::tab-bar { - left: 0px; /* move to the right by 5px */ - } - - /* Style the tab using the tab sub-control. Note that - it reads QTabBar _not_ QTabWidget */ - QTabBar::tab { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, - stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); - border: 2px solid #C4C4C3; - border-bottom-color: #C2C7CB; /* same as the pane color */ - border-top-left-radius: 4px; - border-top-right-radius: 4px; - min-width: 8ex; - padding: 2px; - } - - QTabBar::tab:selected, QTabBar::tab:hover { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #fafafa, stop: 0.4 #f4f4f4, - stop: 0.5 #e7e7e7, stop: 1.0 #fafafa); - } - - QTabBar::tab:selected { - border-color: #9B9B9B; - border-bottom-color: #C2C7CB; /* same as pane color */ - } - - QTabBar::tab:!selected { - margin-top: 2px; /* make non-selected tabs look smaller */ - } - -QMenu { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #6F6F6F, stop:1 #979797); - border: 1px solid black; - } - - -QMenu::item { - /* sets background of menu item. set this to something non-transparent - if you want menu color and menu item color to be different */ - background-color: transparent; - } - -QMenu::item:selected { /* when user selects item using mouse or keyboard */ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #FBC957, stop:1 #D79704); - } - -QListWidget::item:selected { /* when user selects item using mouse or keyboard */ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #FBC957, stop:1 #D79704); -} - -QTreeWidget::item:selected { /* when user selects item using mouse or keyboard */ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #FBC957, stop:1 #D79704); -} - -QTreeView::item:selected { /* when user selects item using mouse or keyboard */ - - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #FBC957, stop: 1 #D79704); - -} - -QFrame#messengerframetop{ - - border-image: url(%THISPATH%/yaba/yaba.png); - - /*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07);*/ -} - -QFrame#Chatbuttonframe{ - - border-image: url(%THISPATH%/yaba/yaba.png); - -} - -QLabel#subjectText{ - font: bold 12px; - -} - -QLabel#subjectlabel{ - font: bold 12px; - -} - -QLabel#fromlabel{ - font: bold 12px; - -} - -QLabel#datelabel{ - font: bold 12px; - -} - -QLabel#tolabel{ - font: bold 12px; - -} - -QLabel#fromText{ - font: bold ; - color: blue; - -} - -QToolBar#chattoolBar{ - border-image: url(%THISPATH%/yaba/yaba.png); - -} - -HomePage QToolButton#addButton { - font: bold; - font-size: 15pt; - color: #979797; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -MainWindow QListWidget { - font-size: 12pt; -} - diff --git a/retroshare-gui/src/qss/yaba/yaba.png b/retroshare-gui/src/qss/yaba/yaba.png deleted file mode 100644 index e8659f66d..000000000 Binary files a/retroshare-gui/src/qss/yaba/yaba.png and /dev/null differ diff --git a/retroshare-gui/src/qss/yaba/yaba2.png b/retroshare-gui/src/qss/yaba/yaba2.png deleted file mode 100644 index af6be6117..000000000 Binary files a/retroshare-gui/src/qss/yaba/yaba2.png and /dev/null differ diff --git a/retroshare-gui/src/qss/yaba/yaba3.png b/retroshare-gui/src/qss/yaba/yaba3.png deleted file mode 100644 index 5dd5a2a32..000000000 Binary files a/retroshare-gui/src/qss/yaba/yaba3.png and /dev/null differ diff --git a/retroshare-gui/src/qss/yeah.qss b/retroshare-gui/src/qss/yeah.qss deleted file mode 100644 index b154b7f53..000000000 --- a/retroshare-gui/src/qss/yeah.qss +++ /dev/null @@ -1,183 +0,0 @@ -.QWidget { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 lightgray, stop:1 darkgray); -} - -FriendsDialog QFrame#headFrame { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #FBC957, stop:1 #D79704); - border: 1px; - border-radius: 4px; -} - -QFrame#titleBarFrame, QFrame#toolBarFrame { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #FBC957, stop:1 #D79704); - border: 1px solid #CCCCCC; -} - -HeaderFrame { - background-image: url(:/images/headerFrame.png); - border: 0px; -} - -QDialog{ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 lightgray, stop:1 darkgray); -} - - -/* Customize the toolbar. */ -QToolBar { - border-image: url(%THISPATH%/yeah/yeah.png); - -} - -QStatusBar{ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 lightgray, stop:1 darkgray); -} - - -QHeaderView::section { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #616161, stop: 0.5 #505050, - stop: 0.6 #434343, stop:1 #656565); - color: white; - padding-left: 4px; - border: 1px solid #6c6c6c; -} - - -QMenuBar { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 lightgray, stop:1 darkgray); -} - - QTabWidget::pane { /* The tab widget frame */ - border-top: 2px solid #C2C7CB; - } - - QTabWidget::tab-bar { - left: 0px; /* move to the right by 5px */ - } - - /* Style the tab using the tab sub-control. Note that - it reads QTabBar _not_ QTabWidget */ - QTabBar::tab { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, - stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); - border: 2px solid #C4C4C3; - border-bottom-color: #C2C7CB; /* same as the pane color */ - border-top-left-radius: 4px; - border-top-right-radius: 4px; - min-width: 8ex; - padding: 2px; - } - - QTabBar::tab:selected, QTabBar::tab:hover { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #fafafa, stop: 0.4 #f4f4f4, - stop: 0.5 #e7e7e7, stop: 1.0 #fafafa); - } - - QTabBar::tab:selected { - border-color: #9B9B9B; - border-bottom-color: #C2C7CB; /* same as pane color */ - } - - QTabBar::tab:!selected { - margin-top: 2px; /* make non-selected tabs look smaller */ - } - - QMenu { - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 lightgray, stop:1 darkgray); - border: 1px solid black; - } - -QMenu::item { - /* sets background of menu item. set this to something non-transparent - if you want menu color and menu item color to be different */ - background-color: transparent; - } - -QMenu::item:selected { /* when user selects item using mouse or keyboard */ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #FBC957, stop:1 #D79704); - } - -QListWidget::item:selected { /* when user selects item using mouse or keyboard */ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #FBC957, stop:1 #D79704); -} - -QTreeWidget::item:selected { /* when user selects item using mouse or keyboard */ - background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 #FBC957, stop:1 #D79704); -} - -QTreeView::item:selected { /* when user selects item using mouse or keyboard */ - - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #FBC957, stop: 1 #D79704); - -} - -QFrame#messengerframetop{ - - border-image: url(%THISPATH%/yeah/yeah.png); - - /*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #F7B552, stop: 1 #FF5E07);*/ -} - -QFrame#Chatbuttonframe{ - - border-image: url(%THISPATH%/yeah/yeah.png); - -} - -QLabel#subjectText{ - font: bold 12px; - -} - -QLabel#subjectlabel{ - font: bold 12px; - -} - -QLabel#fromlabel{ - font: bold 12px; - -} - -QLabel#datelabel{ - font: bold 12px; - -} - -QLabel#tolabel{ - font: bold 12px; - -} -QLabel#fromText{ - font: bold ; - color: blue; - -} - -HomePage QToolButton#addButton { - font: bold; - font-size: 15pt; - color: #979797; - max-height: 27px; - min-width: 4em; - padding: 2px; -} - -MainWindow QListWidget { - font-size: 12pt; -} diff --git a/retroshare-gui/src/qss/yeah/yeah.png b/retroshare-gui/src/qss/yeah/yeah.png deleted file mode 100644 index bd31010f7..000000000 Binary files a/retroshare-gui/src/qss/yeah/yeah.png and /dev/null differ diff --git a/retroshare-gui/src/retroshare-gui.pro b/retroshare-gui/src/retroshare-gui.pro index 47f1517e6..73787b65a 100644 --- a/retroshare-gui/src/retroshare-gui.pro +++ b/retroshare-gui/src/retroshare-gui.pro @@ -113,7 +113,6 @@ CONFIG += gxscircles # Other Disabled Bits. #CONFIG += framecatcher -#CONFIG += blogs ## To enable unfinished services #CONFIG += wikipoos @@ -531,6 +530,7 @@ HEADERS += rshare.h \ gui/common/TagDefs.h \ gui/common/GroupDefs.h \ gui/common/Emoticons.h \ + gui/common/RSComboBox.h \ gui/common/RSListWidgetItem.h \ gui/common/RSTextEdit.h \ gui/common/RSPlainTextEdit.h \ @@ -566,8 +566,6 @@ HEADERS += rshare.h \ gui/common/RsBanListToolButton.h \ gui/common/FlowLayout.h \ gui/common/PictureFlow.h \ - gui/common/StyledLabel.h \ - gui/common/StyledElidedLabel.h \ gui/common/ToasterNotify.h \ gui/style/RSStyle.h \ gui/style/StyleDialog.h \ @@ -860,6 +858,7 @@ SOURCES += main.cpp \ gui/common/TagDefs.cpp \ gui/common/GroupDefs.cpp \ gui/common/Emoticons.cpp \ + gui/common/RSComboBox.cpp \ gui/common/RSListWidgetItem.cpp \ gui/common/RSTextEdit.cpp \ gui/common/RSPlainTextEdit.cpp \ @@ -895,8 +894,6 @@ SOURCES += main.cpp \ gui/common/RsBanListToolButton.cpp \ gui/common/FlowLayout.cpp \ gui/common/PictureFlow.cpp \ - gui/common/StyledLabel.cpp \ - gui/common/StyledElidedLabel.cpp \ gui/common/ToasterNotify.cpp \ gui/style/RSStyle.cpp \ gui/style/StyleDialog.cpp \ @@ -1007,7 +1004,9 @@ SOURCES += main.cpp \ # gui/feeds/ChanNewItem.cpp \ # gui/feeds/ChanMsgItem.cpp \ -RESOURCES += gui/images.qrc gui/icons.qrc lang/lang.qrc gui/help/content/content.qrc gui/emojione.qrc +RESOURCES += gui/images.qrc gui/icons.qrc lang/lang.qrc gui/help/content/content.qrc gui/emojione.qrc \ + gui/qss/stylesheet/qdarkstyle/dark/Standard_Dark.qrc \ + gui/qss/stylesheet/qdarkstyle/light/Standard_Light.qrc TRANSLATIONS += \ lang/retroshare_ca_ES.ts \ diff --git a/retroshare-gui/src/rshare.cpp b/retroshare-gui/src/rshare.cpp index cbed6698a..60c152759 100644 --- a/retroshare-gui/src/rshare.cpp +++ b/retroshare-gui/src/rshare.cpp @@ -174,17 +174,17 @@ Rshare::Rshare(QStringList args, int &argc, char **argv, const QString &dir) if(args.empty()) sendArgsToRunningInstance = false; // if we find non-forwardable args, start a new instance - for(int i = 0; i < args.size(); ++i) + for(int iCurs = 0; iCurs < args.size(); ++iCurs) { const char* const* argit = forwardableArgs; bool found = false; - while(*argit && i < args.size()) + while(*argit && iCurs < args.size()) { - if(args.value(i) == "-"+QString(*argit) || args.value(i) == "--"+QString(*argit)) + if(args.value(iCurs) == "-"+QString(*argit) || args.value(iCurs) == "--"+QString(*argit)) { found = true; if(argNeedsValue(*argit)) - i++; + iCurs++; } argit++; } @@ -464,12 +464,12 @@ Rshare::showUsageMessageBox() /** Returns true if the specified argument expects a value. */ bool -Rshare::argNeedsValue(QString argName) +Rshare::argNeedsValue(const QString &argName) { return ( argName == ARG_DATADIR || argName == ARG_LOGFILE || - argName == ARG_LOGLEVEL || + argName == ARG_LOGLEVEL || argName == ARG_GUISTYLE || argName == ARG_GUISTYLESHEET || argName == ARG_LANGUAGE || @@ -486,25 +486,26 @@ Rshare::argNeedsValue(QString argName) void Rshare::parseArguments(QStringList args, bool firstRun) { - QString arg, value; + QString arg, argl, value; /* Loop through all command-line args/values and put them in a map */ - for (int i = 0; i < args.size(); ++i) { + for (int iCurs = 0; iCurs < args.size(); ++iCurs) { /* Get the argument name and set a blank value */ - arg = args.at(i);//.toLower(); Need Upper case for file name. - if (arg.toLower() == "empty") continue; + arg = args.at(iCurs);//.toLower(); Need Upper case for file name. + argl = arg.toLower(); + if (argl == "empty") continue; value = ""; /* Check if it starts with a - or -- */ if (arg.startsWith("-")) { arg = arg.mid((arg.startsWith("--") ? 2 : 1)); /* Check if it takes a value and there is one on the command-line */ - if (i < args.size()-1 && argNeedsValue(arg.toLower())) { - value = args.at(++i); + if (iCurs < args.size()-1 && argNeedsValue(arg)) { + value = args.at(++iCurs); } } else { /* Check if links or files without arg */ - if (arg.toLower().startsWith("retroshare://")) { + if (argl.startsWith("retroshare://")) { value = arg; arg = ARG_RSLINK_L; } else { @@ -518,8 +519,8 @@ Rshare::parseArguments(QStringList args, bool firstRun) /* handle opmode that could be change while running.*/ QString omValue = QString(value).prepend(";").append(";").toLower(); QString omValues = QString(";full;noturtle;gaming;minimal;"); - if ((arg == ARG_OPMODE_S || arg == ARG_OPMODE_L ) && - omValues.contains(omValue)) { + if ((arg == ARG_OPMODE_S || arg == ARG_OPMODE_L ) + && omValues.contains(omValue)) { _opmode = value; } @@ -542,8 +543,8 @@ Rshare::validateArguments(QString &errmsg) /* Check for a writable log file */ if (_args.contains(ARG_LOGFILE) && !_log.isOpen()) { errmsg = tr("Unable to open log file '%1': %2") - .arg(_args.value(ARG_LOGFILE)) - .arg(_log.errorString()); + .arg( _args.value(ARG_LOGFILE) + , _log.errorString()); return false; } /* Check for a valid log level */ @@ -688,8 +689,8 @@ void Rshare::resetLanguageAndStyle() // RetroShare: // Default: -// :/qss/stylesheet/qss.default -// :/qss/stylesheet/qss. +// :/qss/stylesheet/default.qss +// :/qss/stylesheet/.qss // Internal: // :/qss/stylesheet/.qss // External: @@ -699,8 +700,8 @@ void Rshare::resetLanguageAndStyle() // // Plugin: // Default: -// :/qss/stylesheet//_qss.default -// :/qss/stylesheet//_qss. +// :/qss/stylesheet//_default.qss +// :/qss/stylesheet//_.qss // Internal: // :/qss/stylesheet//_.qss // External: @@ -719,8 +720,8 @@ void Rshare::loadStyleSheet(const QString &sheetName) /* Get stylesheet from plugins */ if (rsPlugins) { int count = rsPlugins->nbPlugins(); - for (int i = 0; i < count; ++i) { - RsPlugin* plugin = rsPlugins->plugin(i); + for (int iCurs = 0; iCurs < count; ++iCurs) { + RsPlugin* plugin = rsPlugins->plugin(iCurs); if (plugin) { QString pluginStyleSheetName = QString::fromUtf8(plugin->qt_stylesheet().c_str()); if (!pluginStyleSheetName.isEmpty()) { @@ -732,22 +733,22 @@ void Rshare::loadStyleSheet(const QString &sheetName) foreach (QString name, names) { /* load the default stylesheet */ - QFile file(QString(":/qss/stylesheet/%1qss.default").arg(name)); + QFile file(QString(":/qss/stylesheet/%1default.qss").arg(name)); if (file.open(QFile::ReadOnly)) { styleSheet += QLatin1String(file.readAll()) + "\n"; file.close(); } /* load locale depended default stylesheet */ - file.setFileName(QString(":/qss/stylesheet/%1qss.%2").arg(name, locale)); + file.setFileName(QString(":/qss/stylesheet/%1%2.qss").arg(name, locale)); if (file.open(QFile::ReadOnly)) { styleSheet += QLatin1String(file.readAll()) + "\n"; file.close(); } - if (!sheetName.isEmpty()) { + if (!sheetName.isEmpty() && (sheetName != ":default")) { /* load stylesheet */ - if (sheetName.left(1) == ":") { + if (sheetName.at(0) == ":") { /* internal stylesheet */ file.setFileName(QString(":/qss/stylesheet/%1%2.qss").arg(name, sheetName.mid(1))); } else { @@ -786,7 +787,7 @@ void Rshare::getAvailableStyleSheets(QMap &styleSheets) foreach (fileInfo, fileInfoList) { if (fileInfo.isFile()) { QString name = fileInfo.baseName(); - styleSheets.insert(QString("%1 (%2)").arg(name, tr("built-in")), ":" + name); + styleSheets.insert(QString(" %1 (%2)").arg(name, tr("built-in")), ":" + name);//Add space to name to get them up because QMap sort by Key. } } fileInfoList = QDir(QString::fromUtf8(RsAccounts::ConfigDirectory().c_str()) + "/qss/").entryInfoList(QStringList("*.qss")); @@ -880,7 +881,7 @@ Rshare::createDataDirectory(QString *errmsg) } /** Set Rshare's data directory - externally */ -bool Rshare::setConfigDirectory(QString dir) +bool Rshare::setConfigDirectory(const QString& dir) { useConfigDir = true; configDir = dir; diff --git a/retroshare-gui/src/rshare.h b/retroshare-gui/src/rshare.h index e1b68f6b6..2b59b7875 100644 --- a/retroshare-gui/src/rshare.h +++ b/retroshare-gui/src/rshare.h @@ -38,7 +38,7 @@ #include "retroshare/rstypes.h" /** Pointer to this RetroShare application instance. */ -#define rApp ((Rshare *)qApp) +#define rApp (static_cast(qApp)) #define rDebug(fmt) (rApp->log(Log::Debug, (fmt))) #define rInfo(fmt) (rApp->log(Log::Info, (fmt))) @@ -130,7 +130,7 @@ public: static Log::LogMessage log(Log::LogLevel level, QString msg); /** Creates Rshare's data directory, if it doesn't already exist. */ - static bool setConfigDirectory(QString dir); + static bool setConfigDirectory(const QString &dir); /** Enters the main event loop and waits until exit() is called. The signal * running() will be emitted when the event loop has started. */ @@ -177,7 +177,7 @@ private: static void customizeDateFormat(); /** Returns true if the specified arguments wants a value. */ - static bool argNeedsValue(QString argName); + static bool argNeedsValue(const QString &argName); static QMap _args; /**< List of command-line arguments. */ static Log _log; /**< Logs debugging messages to file or stdout. */ @@ -185,7 +185,7 @@ private: static QString _stylesheet; /**< The current GUI stylesheet. */ static QString _language; /**< The current language. */ static QString _dateformat; /**< The format for dates in feed items etc. */ - static QString _opmode; /**< The operating mode passed by args. */ + static QString _opmode; /**< The operating mode passed by args. */ static QStringList _links; /**< List of links passed by arguments. */ static QStringList _files; /**< List of files passed by arguments. */ static QDateTime mStartupTime; // startup time diff --git a/retroshare-gui/src/util/HandleRichText.cpp b/retroshare-gui/src/util/HandleRichText.cpp index 409d37aa6..bba7c03af 100644 --- a/retroshare-gui/src/util/HandleRichText.cpp +++ b/retroshare-gui/src/util/HandleRichText.cpp @@ -334,6 +334,29 @@ void RsHtml::replaceAnchorWithImg(QDomDocument &doc, QDomElement &element, QText element.appendChild(img); } +void RsHtml::filterEmbeddedImages(QDomDocument &doc, QDomElement ¤tElement) +{ + QDomNodeList children = currentElement.childNodes(); + for(uint index = 0; index < (uint)children.length(); index++) { + QDomNode node = children.item(index); + if(node.isElement()) { + QDomElement element = node.toElement(); + if(element.tagName().toLower() == "img") { + if(element.hasAttribute("src")) { + QString src = element.attribute("src"); + // Do not allow things in the image source, except these: + // :/ internal resource needed for emotes + // data:image base64 embedded image needed for stickers + if(!src.startsWith(":/") && !src.startsWith("data:image", Qt::CaseInsensitive)) { + element.setAttribute("src", ":/images/imageblocked_24.png"); + } + } + } + filterEmbeddedImages(doc, element); + } + } +} + int RsHtml::indexInWithValidation(QRegExp &rx, const QString &text, EmbedInHtml &embedInfos, int pos) { int index = rx.indexIn(text, pos); @@ -636,6 +659,7 @@ QString RsHtml::formatText(QTextDocument *textDocument, const QString &text, ulo } QDomElement body = doc.documentElement(); + filterEmbeddedImages(doc, body); // This should be first, becuse it should not overwrite embedded custom smileys if (flag & RSHTML_FORMATTEXT_EMBED_SMILEYS) { embedHtml(textDocument, doc, body, defEmbedImg, flag); } diff --git a/retroshare-gui/src/util/HandleRichText.h b/retroshare-gui/src/util/HandleRichText.h index 8189e4ce1..9462ba865 100644 --- a/retroshare-gui/src/util/HandleRichText.h +++ b/retroshare-gui/src/util/HandleRichText.h @@ -82,6 +82,7 @@ public: protected: void embedHtml(QTextDocument *textDocument, QDomDocument &doc, QDomElement ¤tElement, EmbedInHtml& embedInfos, ulong flag); void replaceAnchorWithImg(QDomDocument& doc, QDomElement &element, QTextDocument *textDocument, const RetroShareLink &link); + void filterEmbeddedImages(QDomDocument &doc, QDomElement ¤tElement); virtual bool canReplaceAnchor(QDomDocument &doc, QDomElement &element, const RetroShareLink &link); virtual void anchorTextForImg(QDomDocument &doc, QDomElement &element, const RetroShareLink &link, QString &text); diff --git a/retroshare-gui/src/util/RichTextEdit.ui b/retroshare-gui/src/util/RichTextEdit.ui index 7b5ffc6ae..63e624b5e 100644 --- a/retroshare-gui/src/util/RichTextEdit.ui +++ b/retroshare-gui/src/util/RichTextEdit.ui @@ -48,7 +48,7 @@ 0
- + Qt::ClickFocus @@ -61,7 +61,7 @@ - + MS Sans Serif @@ -595,6 +595,11 @@ QTextEdit
gui/common/MimeTextEdit.h
+ + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
f_textedit diff --git a/retroshare.pri b/retroshare.pri index 8e59df32d..d0439e5e2 100644 --- a/retroshare.pri +++ b/retroshare.pri @@ -1,7 +1,8 @@ # RetroShare common qmake build script # -# Copyright (C) 2004-2019, Retroshare Team -# Copyright (C) 2016-2019, Gioacchino Mazzurco +# Copyright (C) 2004-2021 Retroshare Team +# Copyright (C) 2016-2021 Gioacchino Mazzurco +# Copyright (C) 2021 Asociación Civil Altermundi # # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU Lesser General Public License as published by the @@ -140,10 +141,10 @@ rs_macos10.15:CONFIG -= rs_macos10.11 CONFIG *= no_rs_jsonapi rs_jsonapi:CONFIG -= no_rs_jsonapi -# Disable i2p BOB support for automatically setting up an i2p tunnel for RS -# "CONFIG+=no_rs_bob" -CONFIG *= rs_bob -no_rs_bob:CONFIG -= rs_bob +# To enable forums indexing append the following assignation to qmake command +# line "CONFIG+=rs_deep_forums_index" +CONFIG *= no_rs_deep_forums_index +rs_deep_forums_index:CONFIG -= no_rs_deep_forums_index # To enable channel indexing append the following assignation to qmake command # line "CONFIG+=rs_deep_channels_index" @@ -204,10 +205,16 @@ no_rs_service_terminal_login:CONFIG -= rs_service_terminal_login CONFIG+=rs_dh_init_check no_rs_dh_init_check:CONFIG -= rs_dh_init_check -# To export all symbols for the plugins on Windows build we need to build libretroshare as -# shared library. Fix linking error (ld.exe: Error: export ordinal too large) due to too -# many exported symbols. -retroshare_plugins:win32:CONFIG *= libretroshare_shared +# To disable I2P sam3 support append the following assignation to qmake command +# line "CONFIG+=no_rs_sam3" +CONFIG *= rs_sam3 +no_rs_sam3:CONFIG -= rs_sam3 + +# To disable I2P sam3 library submodule build append the following assignation +# to qmake command line "CONFIG+=no_rs_sam3_libsam3" +CONFIG *= rs_sam3_libsam3 +no_rs_sam3_libsam3:CONFIG -= rs_sam3_libsam3 + # Specify host precompiled jsonapi-generator path, appending the following # assignation to qmake command line @@ -559,10 +566,7 @@ rs_webui { DEFINES *= RS_WEBUI } -rs_bob { - DEFINES *= RS_USE_I2P_BOB -} - +rs_deep_forums_index:DEFINES *= RS_DEEP_FORUMS_INDEX rs_deep_channels_index:DEFINES *= RS_DEEP_CHANNEL_INDEX rs_deep_files_index:DEFINES *= RS_DEEP_FILES_INDEX @@ -576,6 +580,13 @@ rs_broadcast_discovery:DEFINES *= RS_BROADCAST_DISCOVERY no_rs_dh_init_check:DEFINES *= RS_DISABLE_DIFFIE_HELLMAN_INIT_CHECK +rs_sam3: { + DEFINES *= RS_USE_I2P_SAM3 + # this allows a downgrade from a SAMv3 build to a BOB build, can be removed in the future + DEFINES *= RS_I2P_SAM3_BOB_COMPAT +} +rs_sam3_libsam3: DEFINES *= RS_USE_I2P_SAM3_LIBSAM3 + debug { rs_mutex_debug:DEFINES *= RS_MUTEX_DEBUG @@ -648,6 +659,11 @@ android-* { RS_THREAD_LIB = } +# To export all symbols for the plugins on Windows build we need to build +# libretroshare as shared library. Fix linking error (ld.exe: Error: export +# ordinal too large) due to too many exported symbols. +retroshare_plugins:win32:CONFIG *= libretroshare_shared + win32-g++|win32-clang-g++ { !isEmpty(EXTERNAL_LIB_DIR) { message(Use pre-compiled libraries in $${EXTERNAL_LIB_DIR}.) diff --git a/supportlibs/libsam3 b/supportlibs/libsam3 new file mode 160000 index 000000000..8623304b6 --- /dev/null +++ b/supportlibs/libsam3 @@ -0,0 +1 @@ +Subproject commit 8623304b62294dafbe477573f321a464fef721dd diff --git a/tests/test_JSON_API_DirDetails_handle_correct_64bit_integer_type.sh b/tests/test_JSON_API_DirDetails_handle_correct_64bit_integer_type.sh new file mode 100755 index 000000000..03b99a94e --- /dev/null +++ b/tests/test_JSON_API_DirDetails_handle_correct_64bit_integer_type.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +# Copyright (C) 2021 Gioacchino Mazzurco +# Copyright (C) 2021 Asociación Civil Altermundi +# +# This program is free software: you can redistribute it and/or modify it under +# the terms of the GNU Affero General Public License as published by the +# Free Software Foundation, version 3. +# +# 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License along +# with this program. If not, see +# +# SPDX-FileCopyrightText: Retroshare Team +# SPDX-License-Identifier: AGPL-3.0-only + + +## Define default value for variable, take two arguments, $1 variable name, +## $2 default variable value, if the variable is not already define define it +## with default value. +function define_default_value() +{ + VAR_NAME="${1}" + DEFAULT_VALUE="${2}" + + [ -z "${!VAR_NAME}" ] && export ${VAR_NAME}="${DEFAULT_VALUE}" || true +} + +define_default_value API_BASE_URL "http://127.0.0.1:9092" +define_default_value API_TOKEN "0000:0000" + +function tLog() +{ + local mCategory="$1" ; shift + echo "$mCategory $(date) $@" >&2 +} + +mCmd="curl -u $API_TOKEN $API_BASE_URL/rsFiles/requestDirDetails" + +mReply="$($mCmd)" +mCurlRet="$?" + +if [ "$mCurlRet" != 0 ]; then + tLog E "$mCmd failed: $mCurlRet '$mReply'" + exit -3 +fi + +[ "$(echo "$mReply" | jq '.retval')" == "true" ] || +{ + tLog E "/rsFiles/requestDirDetails failed: '$mReply'" + exit -1 +} + +[ "$(echo "$mReply" | jq '.details.handle')" != "0" ] || +{ + tLog E ".details.handle has wrong type int: '$mReply'" + exit -1 +} + +[ "$(echo "$mReply" | jq '.details.handle.xstr64')" == "\"0\"" ] && + [ "$(echo "$mReply" | jq '.details.handle.xint64')" == "0" ] && +{ + tLog I '.details.handle has correct type' + exit 0 +} + +tLog E "Unkown error in test $0: '$mReply'" +exit -2