├── .gitattributes ├── .github ├── FUNDING.yml ├── scripts │ ├── jpackage.bat │ └── jpackage.sh └── workflows │ ├── build.yml │ ├── delete-all-artifacts.yml │ ├── init.yml │ └── release.yml ├── .gitignore ├── LICENSE ├── README.md ├── assets ├── AppImage │ ├── AppRun │ └── Stream-Pi Client.desktop ├── launchers │ ├── aarch64-native │ │ ├── run_console │ │ └── run_desktop │ └── arm-jvm │ │ ├── run_console │ │ └── run_desktop ├── linux-icon.png ├── macos-icon.icns └── windows-icon.ico ├── i18n.md ├── logo.png ├── pom.xml ├── src ├── android │ ├── AndroidManifest.xml │ ├── mods │ │ └── MainActivity.java │ └── res │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ └── mipmap-xxxhdpi │ │ └── ic_launcher.png ├── ios │ └── assets │ │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── 100.png │ │ │ ├── 1024.png │ │ │ ├── 114.png │ │ │ ├── 120.png │ │ │ ├── 144.png │ │ │ ├── 152.png │ │ │ ├── 167.png │ │ │ ├── 180.png │ │ │ ├── 20.png │ │ │ ├── 29.png │ │ │ ├── 40.png │ │ │ ├── 50.png │ │ │ ├── 57.png │ │ │ ├── 58.png │ │ │ ├── 60.png │ │ │ ├── 72.png │ │ │ ├── 76.png │ │ │ ├── 80.png │ │ │ ├── 87.png │ │ │ └── Contents.json │ │ └── Contents.json │ │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── MainScreen.storyboard │ │ ├── Default-375w-667h@2x~iphone.png │ │ ├── Default-375w-812h-landscape@3x~iphone.png │ │ ├── Default-375w-812h@3x~iphone.png │ │ ├── Default-414w-736h-landscape@3x~iphone.png │ │ ├── Default-414w-736h@3x~iphone.png │ │ ├── Default-414w-896h-landscape@3x~iphone.png │ │ ├── Default-414w-896h@3x~iphone.png │ │ ├── Default-568h@2x~iphone.png │ │ ├── Default-landscape@2x~ipad.png │ │ ├── Default-landscape~ipad.png │ │ ├── Default-portrait@2x~ipad.png │ │ ├── Default-portrait~ipad.png │ │ ├── Default@2x~iphone.png │ │ ├── iTunesArtwork.png │ │ └── iTunesArtwork@2x.png └── main │ ├── java │ ├── com │ │ └── stream_pi │ │ │ └── client │ │ │ ├── Main.java │ │ │ ├── combobox │ │ │ └── LanguageChooserComboBox.java │ │ │ ├── connection │ │ │ └── Client.java │ │ │ ├── controller │ │ │ ├── ClientExecutorService.java │ │ │ ├── ClientListener.java │ │ │ ├── Controller.java │ │ │ ├── ScreenMover.java │ │ │ └── ScreenSaver.java │ │ │ ├── i18n │ │ │ └── I18N.java │ │ │ ├── info │ │ │ ├── ClientInfo.java │ │ │ └── StartupFlags.java │ │ │ ├── io │ │ │ └── Config.java │ │ │ ├── profile │ │ │ ├── ClientAction.java │ │ │ ├── ClientProfile.java │ │ │ └── ClientProfiles.java │ │ │ └── window │ │ │ ├── Base.java │ │ │ ├── ExceptionAndAlertHandler.java │ │ │ ├── dashboard │ │ │ ├── DashboardBase.java │ │ │ └── actiongridpane │ │ │ │ ├── ActionBox.java │ │ │ │ ├── ActionGridPane.java │ │ │ │ └── ActionGridPaneListener.java │ │ │ ├── firsttimeuse │ │ │ ├── FinalConfigPane.java │ │ │ ├── FirstTimeUse.java │ │ │ ├── LicensePane.java │ │ │ ├── WelcomePane.java │ │ │ └── WindowName.java │ │ │ └── settings │ │ │ ├── GeneralTab.java │ │ │ ├── SettingsBase.java │ │ │ └── about │ │ │ ├── About.java │ │ │ ├── ContactTab.java │ │ │ ├── ContributorsTab.java │ │ │ └── LicenseTab.java │ └── module-info.java │ └── resources │ ├── META-INF │ └── native-image │ │ ├── resource-config.json │ │ └── serialization-config.json │ └── com │ └── stream_pi │ └── client │ ├── Default.zip │ ├── default_icons.css │ ├── i18n │ ├── i18n.properties │ ├── lang_de_DE.properties │ ├── lang_en.properties │ ├── lang_en_GB.properties │ ├── lang_en_IN.properties │ ├── lang_en_US.properties │ ├── lang_es_ES.properties │ ├── lang_fr.properties │ ├── lang_hi.properties │ ├── lang_it.properties │ ├── lang_mr.properties │ └── lang_nl_NL.properties │ ├── icons │ ├── 16x16.png │ ├── 24x24.png │ ├── 256x256.png │ ├── 32x32.png │ └── 48x48.png │ ├── info │ ├── LICENSE │ └── build.properties │ └── style.css └── style_classes.txt /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | *.bat text eol=crlf 4 | 5 | *.zip -text 6 | *.png -text -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | patreon: streampi 2 | -------------------------------------------------------------------------------- /.github/scripts/jpackage.bat: -------------------------------------------------------------------------------- 1 | :: 2 | :: Stream-Pi - Free & Open-Source Modular Cross-Platform Programmable Macro Pad 3 | :: Copyright (C) 2019-2021 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | :: 5 | :: This program is free software: you can redistribute it and/or modify 6 | :: it under the terms of the GNU General Public License as published by 7 | :: the Free Software Foundation, either version 3 of the License, or 8 | :: (at your option) any later version. 9 | :: This program is distributed in the hope that it will be useful, 10 | :: but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | :: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | :: GNU General Public License for more details. 13 | :: 14 | 15 | set /p REQ_MODULES=> $GITHUB_ENV 40 | - name: Set Build Number 41 | run: | 42 | RAW_BUILD_NUMBER=$(sed '4q;d' src/main/resources/com/stream_pi/client/info/build.properties) 43 | echo "BUILD_NUMBER=${RAW_BUILD_NUMBER#*=}" >> $GITHUB_ENV 44 | - name: Calculate required modules 45 | run: | 46 | JDEPS_MODULES=$(jdeps --module-path $JAVAFX_SDK/:target/lib/ --print-module-deps --ignore-missing-deps target/lib/client-$VERSION.jar) 47 | echo "REQ_MODULES=$JDEPS_MODULES" >> $GITHUB_ENV 48 | env: 49 | JAVAFX_SDK: /tmp/javafx-sdk-18/lib/ 50 | - name: Saving REQ_MODULES 51 | run: | 52 | echo $REQ_MODULES > req_modules.txt 53 | - name: Uploading REQ_MODULES 54 | uses: actions/upload-artifact@v2 55 | with: 56 | name: req_modules 57 | path: req_modules.txt 58 | - name: Saving VERSION 59 | run: | 60 | echo $VERSION > version.txt 61 | - name: Uploading VERSION 62 | uses: actions/upload-artifact@v2 63 | with: 64 | name: version 65 | path: version.txt 66 | - name: Saving BUILD_NUMBER 67 | run: | 68 | echo $BUILD_NUMBER > build_number.txt 69 | - name: Uploading BUILD_NUMBER 70 | uses: actions/upload-artifact@v2 71 | with: 72 | name: build_number 73 | path: build_number.txt 74 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | workflow_run: 5 | workflows: ["Build"] 6 | types: 7 | - completed 8 | 9 | jobs: 10 | release: 11 | runs-on: ubuntu-20.04 12 | steps: 13 | - name: Download VERSION 14 | uses: dawidd6/action-download-artifact@v2 15 | with: 16 | workflow: init.yml 17 | name: version 18 | - name: Add Version to environment 19 | run: | 20 | echo "VERSION=$(> $GITHUB_ENV 21 | - name: Download BUILD_NUMBER 22 | uses: dawidd6/action-download-artifact@v2 23 | with: 24 | workflow: init.yml 25 | name: build_number 26 | - name: Add BUILD_NUMBER to environment 27 | run: | 28 | echo "BUILD_NUMBER=$(> $GITHUB_ENV 29 | - name: Download windows x64 msi 30 | uses: dawidd6/action-download-artifact@v2 31 | with: 32 | workflow: build.yml 33 | name: windows-msi-x64 34 | path: target/install 35 | - name: Download linux x64 deb 36 | uses: dawidd6/action-download-artifact@v2 37 | with: 38 | workflow: build.yml 39 | name: linux-deb-x64 40 | path: target/install 41 | - name: Download linux x64 rpm 42 | uses: dawidd6/action-download-artifact@v2 43 | with: 44 | workflow: build.yml 45 | name: linux-rpm-x64 46 | path: target/install 47 | - name: Download linux x64 AppImage 48 | uses: dawidd6/action-download-artifact@v2 49 | with: 50 | workflow: build.yml 51 | name: linux-app-image-x64 52 | path: target/install 53 | - name: Download Linux x86 deb 54 | uses: dawidd6/action-download-artifact@v2 55 | with: 56 | workflow: build.yml 57 | name: linux-deb-x86 58 | path: target/install 59 | - name: Download Linux x86 rpm 60 | uses: dawidd6/action-download-artifact@v2 61 | with: 62 | workflow: build.yml 63 | name: linux-rpm-x86 64 | path: target/install 65 | - name: Download Linux x86 AppImage 66 | uses: dawidd6/action-download-artifact@v2 67 | with: 68 | workflow: build.yml 69 | name: linux-app-image-x86 70 | path: target/install 71 | - name: Download MacOS x64 PKG 72 | uses: dawidd6/action-download-artifact@v2 73 | with: 74 | workflow: build.yml 75 | name: macos-pkg-x64 76 | path: target/install 77 | - name: Download Android aarch64 APK 78 | uses: dawidd6/action-download-artifact@v2 79 | with: 80 | workflow: build.yml 81 | name: android-apk-aarch64 82 | path: target/install 83 | - name: Download Linux ARM32 ZIP 84 | uses: dawidd6/action-download-artifact@v2 85 | with: 86 | workflow: build.yml 87 | name: linux-zip-arm32 88 | path: target/install 89 | - name: Download Linux native aarch64 ZIP 90 | uses: dawidd6/action-download-artifact@v2 91 | with: 92 | workflow: build.yml 93 | name: linux-zip-aarch64-native 94 | path: target/install 95 | - name: Download Linux jvm aarch64 ZIP 96 | uses: dawidd6/action-download-artifact@v2 97 | with: 98 | workflow: build.yml 99 | name: linux-zip-aarch64-jvm 100 | path: target/install 101 | - name: Delete old release if exists 102 | uses: dev-drprasad/delete-tag-and-release@v0.2.0 103 | continue-on-error: true 104 | with: 105 | delete_release: true 106 | tag_name: ${{ env.VERSION }} 107 | env: 108 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 109 | - name: Create release body 110 | run: | 111 | touch body.md 112 | 113 | echo Build Number : \`$BUILD_NUMBER\` >> body.md 114 | 115 | if [[ $VERSION == *"SNAPSHOT"* ]]; then 116 | echo "**These are snapshot builds. Untested and not recommended for daily use.**" >> body.md 117 | echo "PRE_RELEASE=true" >> $GITHUB_ENV 118 | else 119 | echo "PRE_RELEASE=false" >> $GITHUB_ENV 120 | fi 121 | - name: Release nightly build 122 | uses: ncipollo/release-action@v1.8.6 123 | with: 124 | allowUpdates: true 125 | name: ${{ env.VERSION }} 126 | artifacts: target/install/* 127 | token: ${{ secrets.GITHUB_TOKEN }} 128 | tag: ${{ env.VERSION }} 129 | bodyFile: "body.md" 130 | prerelease: ${{ env.PRE_RELEASE }} 131 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Maven 2 | target/ 3 | 4 | # IntelliJ IDEA 5 | .idea/ 6 | *.iml 7 | 8 | # Eclipse 9 | .settings/ 10 | .project 11 | .factorypath 12 | .classpath 13 | 14 | # Misc 15 | gen/ 16 | data/ 17 | .dccache 18 | 19 | #VS Code 20 | .vscode/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | logo 3 | 4 | # Stream-Pi Client 5 | 6 | *Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad* 7 | 8 | Client Software for the Stream-Pi Platform 9 | 10 | ![version](https://img.shields.io/badge/Version-2.0.0--SNAPSHOT-green) 11 | 12 | [![Discord](https://discordapp.com/api/guilds/582313435149238295/widget.png?style=shield)](https://discord.gg/BExqGmk) 13 | [![Matrix](https://img.shields.io/matrix/stream-pi-general:matrix.org?label=Matrix)](https://matrix.to/#/!hTwUYZonUXThjkMhCD:matrix.org?via=matrix.org) 14 | [![Become a patron](https://img.shields.io/badge/dynamic/json?color=%23e85b46&label=Donate&query=data.attributes.patron_count&suffix=%20patrons&url=https%3A%2F%2Fwww.patreon.com%2Fapi%2Fcampaigns%2F5789155)](https://www.patreon.com/streampi) 15 | ![Total Downloads](https://img.shields.io/github/downloads/stream-pi/client/total?label=Total%20Downloads) 16 | 17 | ### [Website](https://stream-pi.com) 18 | #### [Download latest release](https://github.com/stream-pi/client/releases/tag/1.0.0-EA%2B3) | [Download latest snapshot](https://github.com/stream-pi/client/releases/tag/2.0.0-SNAPSHOT) 19 | #### [Help us Translate!](https://github.com/stream-pi/client/blob/master/i18n.md) 20 |
21 | 22 | 23 | ## Compile and Run from source 24 | 25 | ### Prerequisites 26 | 27 | - Java >= 11 28 | - Maven >= 3.6.3 29 | 30 | ### Run 31 | 32 | Run `mvn clean javafx:run` 33 | 34 | 35 | ## Bugs and Support 36 | 37 | If you found a bug in the client, please report it by creating a [GitHub issue](https://github.com/stream-pi/client/issues). 38 | 39 | You may also reach us via any of the following platforms: 40 | * [E-mail](mailto:contact@stream-pi.com) 41 | * [Matrix](https://matrix.to/#/!hTwUYZonUXThjkMhCD:matrix.org?via=matrix.org) 42 | * [Discord](https://discord.gg/BExqGmk) 43 | * [Twitter](https://twitter.com/stream_pi) 44 | 45 | 46 | ## License 47 | 48 | This software is licensed to [GNU General Public License v3.0](https://github.com/stream-pi/client/blob/master/LICENSE). 49 | ``` 50 | Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 51 | Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 52 | 53 | This program is free software: you can redistribute it and/or modify 54 | it under the terms of the GNU General Public License as published by 55 | the Free Software Foundation, either version 3 of the License, or 56 | (at your option) any later version. 57 | This program is distributed in the hope that it will be useful, 58 | but WITHOUT ANY WARRANTY; without even the implied warranty of 59 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 60 | GNU General Public License for more details. 61 | 62 | 63 | Opensource Libraries/Technology used in Stream-Pi Client: 64 | 65 | 1. JavaFX - GNU General Public License with Classpath Exception 66 | https://openjdk.java.net/legal/gplv2+ce.html 67 | 68 | 2. Ikonli - Apache License 69 | https://github.com/kordamp/ikonli/blob/master/LICENSE 70 | 71 | 3. ControlsFX - BSD 3-Clause License 72 | https://github.com/controlsfx/controlsfx/blob/jfx-13/license.txt 73 | 74 | 4. Medusa - Apache License 2.0 75 | https://github.com/HanSolo/medusa/blob/master/LICENSE 76 | 77 | 5. Gluon Attach - GPL License 78 | https://github.com/gluonhq/attach/blob/master/LICENSE 79 | 80 | 6. Gluon Client Maven Plugin - BSD-3 License 81 | https://github.com/gluonhq/client-maven-plugin/blob/master/LICENSE 82 | ``` -------------------------------------------------------------------------------- /assets/AppImage/AppRun: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Stream-Pi - Free & Open-Source Modular Cross-Platform Programmable Macro Pad 4 | # Copyright (C) 2019-2021 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | 16 | HERE="$(dirname "$(readlink -f "${0}")")" 17 | exec "$HERE/bin/Stream-Pi Client" "Stream-Pi.startupRunnerFileName=$APPIMAGE" "$@" 18 | -------------------------------------------------------------------------------- /assets/AppImage/Stream-Pi Client.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=Stream-Pi Client 3 | Exec="Stream-Pi\ Client %F" 4 | Icon=Stream-Pi Client 5 | Type=Application 6 | Categories=Utility;Audio; 7 | MimeType=inode/directory;audio/flac; 8 | Name[en]=Stream-Pi Server 9 | Terminal=false 10 | StartupNotify=true 11 | NoDisplay=false 12 | -------------------------------------------------------------------------------- /assets/launchers/aarch64-native/run_console: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Stream-Pi - Free & Open-Source Modular Cross-Platform Programmable Macro Pad 4 | # Copyright (C) 2019-2021 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | 16 | cd "${0%/*}" 17 | export ENABLE_GLUON_COMMERCIAL_EXTENSIONS=true 18 | 19 | run() { 20 | if ! ./client -Duse.egl=true -Dcom.sun.javafx.touch=true -Dcom.sun.javafx.isEmbedded=true -Djavafx.verbose=true -Dprism.lcdtext=false -Dprism.verbose=true -Dcom.sun.javafx.virtualKeyboard=javafx -Dembedded=monocle -Dglass.platform=Monocle -Dmonocle.platform=EGL -Degl.displayid=$DISPLAY_CARD Stream-Pi.screenSaverFeature=true Stream-Pi.showShutDownButton=true Stream-Pi.startupRunnerFileName=run_console Stream-Pi.xMode=false Stream-Pi.showFullScreenToggleButton=false Stream-Pi.defaultFullScreenMode=true ; then 21 | echo Keyboard Interrupt / Failed to launch using $DISPLAY_CARD! 22 | fi 23 | } 24 | 25 | if [[ $(ls -dq /sys/class/drm/card0* 2>/dev/null | wc -l) > 1 ]]; then 26 | DISPLAY_CARD=/dev/dri/card0 27 | run 28 | elif [[ $(ls -dq /sys/class/drm/card1* 2>/dev/null | wc -l) > 1 ]]; then 29 | DISPLAY_CARD=/dev/dri/card1 30 | run 31 | else 32 | echo KMS not found. Make sure you have KMS driver enabled! 33 | fi -------------------------------------------------------------------------------- /assets/launchers/aarch64-native/run_desktop: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Stream-Pi - Free & Open-Source Modular Cross-Platform Programmable Macro Pad 4 | # Copyright (C) 2019-2021 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | 16 | cd "${0%/*}" 17 | 18 | DISPLAY=:0 ./client -Djavafx.platform=gtk -Djavafx.verbose=true -Dprism.lcdtext=false -Dprism.forceGPU=true -Dprism.verbose=true -Dcom.sun.javafx.isEmbedded=true -Dcom.sun.javafx.virtualKeyboard=javafx Stream-Pi.showShutDownButton=true Stream-Pi.startupRunnerFileName=run_desktop Stream-Pi.xMode=true Stream-Pi.setFixedMinSize=false Stream-Pi.defaultFullScreenMode=true 19 | -------------------------------------------------------------------------------- /assets/launchers/arm-jvm/run_console: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Stream-Pi - Free & Open-Source Modular Cross-Platform Programmable Macro Pad 4 | # Copyright (C) 2019-2021 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | 16 | cd "${0%/*}" 17 | export ENABLE_GLUON_COMMERCIAL_EXTENSIONS=true 18 | 19 | run() { 20 | if ! jre/bin/java -Xmx700m -Duse.egl=true -Dcom.sun.javafx.touch=true -Dcom.sun.javafx.isEmbedded=true -Djavafx.verbose=true -Dprism.lcdtext=false -Dprism.verbose=true -Dcom.sun.javafx.virtualKeyboard=javafx -Dembedded=monocle -Dglass.platform=Monocle -Dmonocle.platform=EGL -Djava.library.path=. -Dmonocle.egl.lib=./libgluon_drm.so -Degl.displayid=$DISPLAY_CARD --module-path . --add-modules ALL-MODULE-PATH com.stream_pi.client.Main Stream-Pi.screenSaverFeature=true Stream-Pi.showShutDownButton=true Stream-Pi.startupRunnerFileName=run_console Stream-Pi.xMode=false Stream-Pi.showFullScreenToggleButton=false Stream-Pi.defaultFullScreenMode=true ; then 21 | echo Keyboard Interrupt / Failed to launch using $DISPLAY_CARD! 22 | fi 23 | } 24 | 25 | if [[ $(ls -dq /sys/class/drm/card0* 2>/dev/null | wc -l) > 1 ]]; then 26 | DISPLAY_CARD=/dev/dri/card0 27 | run 28 | elif [[ $(ls -dq /sys/class/drm/card1* 2>/dev/null | wc -l) > 1 ]]; then 29 | DISPLAY_CARD=/dev/dri/card1 30 | run 31 | else 32 | echo KMS not found. Make sure you have KMS driver enabled! 33 | fi -------------------------------------------------------------------------------- /assets/launchers/arm-jvm/run_desktop: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Stream-Pi - Free & Open-Source Modular Cross-Platform Programmable Macro Pad 4 | # Copyright (C) 2019-2021 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | 16 | cd "${0%/*}" 17 | 18 | DISPLAY=:0 jre/bin/java -Xmx700m --module-path . --add-modules ALL-MODULE-PATH -Djavafx.platform=gtk -Djavafx.verbose=true -Dprism.lcdtext=false -Dprism.forceGPU=true -Dprism.verbose=true -Dcom.sun.javafx.isEmbedded=true -Dcom.sun.javafx.virtualKeyboard=javafx com.stream_pi.client.Main Stream-Pi.showShutDownButton=true Stream-Pi.startupRunnerFileName=run_desktop Stream-Pi.xMode=true Stream-Pi.setFixedMinSize=false Stream-Pi.defaultFullScreenMode=true 19 | -------------------------------------------------------------------------------- /assets/linux-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/assets/linux-icon.png -------------------------------------------------------------------------------- /assets/macos-icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/assets/macos-icon.icns -------------------------------------------------------------------------------- /assets/windows-icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/assets/windows-icon.ico -------------------------------------------------------------------------------- /i18n.md: -------------------------------------------------------------------------------- 1 | # Translation 2 | 3 | Clone this repository, create a new file `lang_.properties` in `src/main/resources/com/stream_pi/client/i18n/lang/`. 4 | 5 | Example: `lang_en_IN.properties` 6 | 7 | You can get the list of valid [ISO locales from here](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html). 8 | 9 | You can use the [English pack][fallback-locale] as a reference and begin translating all the strings on the right-hand side of the `=` sign. 10 | 11 | **Do not modify the comments and formatting strings (`%s`).** 12 | 13 | After that edit the file `i18n.properties` in `src/main/resources/com/stream_pi/client/i18n/` to add your new language pack in the following format: 14 | 15 | ` = ` 16 | 17 | Example: 18 | 19 | ``` 20 | hi = हिंदी 21 | ``` 22 | 23 | When you are done, send a pull request to get it accepted. 24 | 25 | You may also send a PR with appropriate details if you want to improve an existing translation. 26 | 27 | 28 | ### Supported Languages 29 | 30 | *Languages marked with `*` are community translations. Stream-Pi is not responsible for any malicious/incorrect translations in them. If you find any discrepancy, please report to the owners/core team immediately.* 31 | 32 | | Locale | Language | 33 | | ------------------------- | ----------- | 34 | | [`en`][fallback-locale] | English (Fallback) | 35 | | [`de_DE`][de_DE] | 🇩🇪 German - Germany (Deutsch - Deutschland) * | 36 | | [`en_GB`][en_GB] | 🇬🇧 English - Great Britain | 37 | | [`en_IN`][en_IN] | 🇮🇳 English - India | 38 | | [`en_US`][en_US] | 🇺🇸 English - United States | 39 | | [`es_ES`][es_ES] | 🇪🇸 Spanish - Spain * | 40 | | [`fr`][fr] | 🇫🇷 French (Français) * | 41 | | [`hi`][hi] | 🇮🇳 Hindi (हिंदी) | 42 | | [`mr`][mr] | 🇮🇳 Marathi (मराठी) * | 43 | | [`nl_NL`][nl_NL] | 🇮🇳 Dutch - Netherlands (Nederlands - Nederland) * | 44 | 45 | 46 | 47 | 48 | [fallback-locale]: https://github.com/stream-pi/client/blob/master/src/main/resources/com/stream_pi/client/i18n/lang_en.properties 49 | [de_DE]: https://github.com/stream-pi/client/blob/master/src/main/resources/com/stream_pi/client/i18n/lang_de_DE.properties 50 | [en_GB]: https://github.com/stream-pi/client/blob/master/src/main/resources/com/stream_pi/client/i18n/lang_en_GB.properties 51 | [en_IN]: https://github.com/stream-pi/client/blob/master/src/main/resources/com/stream_pi/client/i18n/lang_en_IN.properties 52 | [en_US]: https://github.com/stream-pi/client/blob/master/src/main/resources/com/stream_pi/client/i18n/lang_en_US.properties 53 | [es_ES]: https://github.com/stream-pi/client/blob/master/src/main/resources/com/stream_pi/client/i18n/lang_en_ES.properties 54 | [fr]: https://github.com/stream-pi/client/blob/master/src/main/resources/com/stream_pi/client/i18n/lang_fr.properties 55 | [hi]: https://github.com/stream-pi/client/blob/master/src/main/resources/com/stream_pi/client/i18n/lang_hi.properties 56 | [mr]: https://github.com/stream-pi/client/blob/master/src/main/resources/com/stream_pi/client/i18n/lang_mr.properties 57 | [nl_NL]: https://github.com/stream-pi/client/blob/master/src/main/resources/com/stream_pi/client/i18n/lang_nl_NL.properties 58 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/logo.png -------------------------------------------------------------------------------- /src/android/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 25 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/android/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/android/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /src/android/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/android/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /src/android/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/android/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /src/android/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/android/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /src/android/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/android/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/100.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/114.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/144.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/152.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/167.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/20.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/50.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/57.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/72.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/76.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Assets.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | {"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"}]} -------------------------------------------------------------------------------- /src/ios/assets/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /src/ios/assets/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/ios/assets/Base.lproj/MainScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/ios/assets/Default-375w-667h@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Default-375w-667h@2x~iphone.png -------------------------------------------------------------------------------- /src/ios/assets/Default-375w-812h-landscape@3x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Default-375w-812h-landscape@3x~iphone.png -------------------------------------------------------------------------------- /src/ios/assets/Default-375w-812h@3x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Default-375w-812h@3x~iphone.png -------------------------------------------------------------------------------- /src/ios/assets/Default-414w-736h-landscape@3x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Default-414w-736h-landscape@3x~iphone.png -------------------------------------------------------------------------------- /src/ios/assets/Default-414w-736h@3x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Default-414w-736h@3x~iphone.png -------------------------------------------------------------------------------- /src/ios/assets/Default-414w-896h-landscape@3x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Default-414w-896h-landscape@3x~iphone.png -------------------------------------------------------------------------------- /src/ios/assets/Default-414w-896h@3x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Default-414w-896h@3x~iphone.png -------------------------------------------------------------------------------- /src/ios/assets/Default-568h@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Default-568h@2x~iphone.png -------------------------------------------------------------------------------- /src/ios/assets/Default-landscape@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Default-landscape@2x~ipad.png -------------------------------------------------------------------------------- /src/ios/assets/Default-landscape~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Default-landscape~ipad.png -------------------------------------------------------------------------------- /src/ios/assets/Default-portrait@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Default-portrait@2x~ipad.png -------------------------------------------------------------------------------- /src/ios/assets/Default-portrait~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Default-portrait~ipad.png -------------------------------------------------------------------------------- /src/ios/assets/Default@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/Default@2x~iphone.png -------------------------------------------------------------------------------- /src/ios/assets/iTunesArtwork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/iTunesArtwork.png -------------------------------------------------------------------------------- /src/ios/assets/iTunesArtwork@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/ios/assets/iTunesArtwork@2x.png -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/Main.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client; 16 | 17 | import com.stream_pi.client.controller.Controller; 18 | import com.stream_pi.client.info.ClientInfo; 19 | 20 | import com.stream_pi.client.info.StartupFlags; 21 | import com.stream_pi.util.exception.GlobalUncaughtExceptionHandler; 22 | import javafx.application.Application; 23 | import javafx.scene.Scene; 24 | import javafx.stage.Stage; 25 | 26 | public class Main extends Application 27 | { 28 | @Override 29 | public void start(Stage stage) 30 | { 31 | StartupFlags.init(getParameters()); 32 | GlobalUncaughtExceptionHandler.init(); 33 | Controller d = new Controller(); 34 | Scene s = new Scene(d); 35 | stage.setScene(s); 36 | d.setHostServices(getHostServices()); 37 | d.init(); 38 | } 39 | 40 | 41 | public static void main(String[] args) 42 | { 43 | launch(args); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/combobox/LanguageChooserComboBox.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.combobox; 16 | 17 | import com.stream_pi.client.i18n.I18N; 18 | import com.stream_pi.util.combobox.StreamPiComboBox; 19 | import com.stream_pi.util.combobox.StreamPiComboBoxFactory; 20 | import com.stream_pi.util.i18n.language.Language; 21 | 22 | import java.util.Locale; 23 | 24 | public class LanguageChooserComboBox extends StreamPiComboBox 25 | { 26 | public LanguageChooserComboBox() 27 | { 28 | setStreamPiComboBoxFactory(new StreamPiComboBoxFactory<>() { 29 | @Override 30 | public String getOptionDisplayText(Language language) { 31 | return language.getDisplayName(); 32 | } 33 | }); 34 | setOptions(I18N.getLanguages()); 35 | } 36 | 37 | public Locale getSelectedLocale() 38 | { 39 | return getCurrentSelectedItem().getLocale(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/controller/ClientExecutorService.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.controller; 16 | 17 | import java.util.concurrent.ExecutorService; 18 | import java.util.concurrent.Executors; 19 | 20 | public class ClientExecutorService 21 | { 22 | private static ExecutorService executorService = null; 23 | 24 | public static ExecutorService getExecutorService() 25 | { 26 | if (executorService == null) 27 | { 28 | executorService = Executors.newCachedThreadPool(); 29 | } 30 | 31 | return executorService; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/controller/ClientListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.controller; 16 | 17 | import com.stream_pi.action_api.action.Action; 18 | import com.stream_pi.client.connection.Client; 19 | import com.stream_pi.client.profile.ClientAction; 20 | import com.stream_pi.client.profile.ClientProfile; 21 | import com.stream_pi.client.profile.ClientProfiles; 22 | import com.stream_pi.client.window.dashboard.actiongridpane.ActionBox; 23 | import com.stream_pi.theme_api.Theme; 24 | import com.stream_pi.theme_api.Themes; 25 | import com.stream_pi.util.comms.DisconnectReason; 26 | import com.stream_pi.util.exception.SevereException; 27 | import javafx.geometry.Orientation; 28 | import javafx.scene.input.MouseEvent; 29 | import javafx.scene.input.TouchEvent; 30 | 31 | import java.util.concurrent.ExecutorService; 32 | 33 | public interface ClientListener 34 | { 35 | void onActionFailed(String profileID, String actionID); 36 | 37 | ClientProfiles getClientProfiles(); 38 | 39 | Themes getThemes(); 40 | 41 | Client getClient(); 42 | 43 | void renderRootDefaultProfile(); 44 | 45 | void setConnected(boolean isConnected); 46 | boolean isConnected(); 47 | 48 | void setIsConnecting(boolean isConnecting); 49 | boolean isConnecting(); 50 | 51 | void renderProfile(ClientProfile clientProfile, boolean freshRender); 52 | 53 | void clearActionBox(int col, int row, int colSpan, int rowSpan); 54 | void renderAction(String currentProfileID, ClientAction action); 55 | void refreshGridIfCurrentProfile(String currentProfileID); 56 | 57 | ClientProfile getCurrentProfile(); 58 | 59 | String getCurrentParent(); 60 | 61 | Theme getCurrentTheme(); 62 | 63 | void initLogger() throws SevereException; 64 | void init(); 65 | 66 | void disconnect(); 67 | 68 | void setupClientConnection(); 69 | 70 | void setupClientConnection(Runnable onConnect); 71 | 72 | void updateSettingsConnectDisconnectButton(); 73 | 74 | void onQuitApp(); 75 | 76 | void loadSettings(); 77 | 78 | double getStageWidth(); 79 | double getStageHeight(); 80 | 81 | void onDisconnect(); 82 | 83 | boolean getToggleStatus(String profileID, String actionID); 84 | 85 | ActionBox getActionBoxByProfileAndID(String profileID, String actionID); 86 | 87 | void openURL(String URL); 88 | 89 | void factoryReset(); 90 | void exitApp(); 91 | 92 | void setFirstRun(boolean firstRun); 93 | 94 | ScreenSaver getScreenSaver(); 95 | 96 | void initThemes() throws SevereException; 97 | 98 | long getLastClientFailSystemMills(); 99 | void setLastClientFailSystemMills(); 100 | 101 | void restart(); 102 | } 103 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/controller/ScreenMover.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.controller; 16 | 17 | import com.stream_pi.client.window.Base; 18 | import com.stream_pi.util.exception.SevereException; 19 | import javafx.animation.*; 20 | import javafx.application.Platform; 21 | import javafx.concurrent.Task; 22 | import javafx.scene.Node; 23 | import javafx.scene.Scene; 24 | import javafx.scene.layout.StackPane; 25 | import javafx.stage.Stage; 26 | import javafx.util.Duration; 27 | 28 | import java.util.Timer; 29 | import java.util.TimerTask; 30 | 31 | public class ScreenMover 32 | { 33 | private Timer timer; 34 | 35 | private long interval; 36 | 37 | private boolean isOldLocation; 38 | private double originalX, originalY; 39 | private double changeX, changeY; 40 | 41 | private Stage stage; 42 | 43 | public ScreenMover(Stage stage, long interval, int changeX, int changeY) 44 | { 45 | this.stage = stage; 46 | this.changeX = changeX; 47 | this.changeY = changeY; 48 | this.originalX = stage.getX(); 49 | this.originalY = stage.getY(); 50 | this.isOldLocation = true; 51 | this.interval = interval; 52 | 53 | startTimer(); 54 | } 55 | 56 | 57 | public void stop() 58 | { 59 | isOldLocation = true; 60 | shiftScreen(); 61 | 62 | stopTimer(); 63 | } 64 | 65 | public void restart() 66 | { 67 | stop(); 68 | startTimer(); 69 | } 70 | 71 | private void shiftScreen() 72 | { 73 | Platform.runLater(()->{ 74 | if(isOldLocation) 75 | { 76 | isOldLocation = false; 77 | 78 | stage.setX(originalX+changeX); 79 | stage.setY(originalY+changeY); 80 | } 81 | else 82 | { 83 | isOldLocation = true; 84 | 85 | stage.setX(originalX); 86 | stage.setY(originalY); 87 | } 88 | }); 89 | } 90 | 91 | public void setInterval(int seconds) 92 | { 93 | this.interval = seconds; 94 | } 95 | 96 | private void stopTimer() 97 | { 98 | if(timer != null) 99 | { 100 | timer.cancel(); 101 | timer.purge(); 102 | } 103 | } 104 | 105 | private void startTimer() 106 | { 107 | timer = new Timer(); 108 | timer.scheduleAtFixedRate(new TimerTask() 109 | { 110 | @Override 111 | public void run() 112 | { 113 | shiftScreen(); 114 | } 115 | },interval, interval); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/controller/ScreenSaver.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.controller; 16 | 17 | import com.stream_pi.client.window.Base; 18 | import com.stream_pi.client.window.ExceptionAndAlertHandler; 19 | import com.stream_pi.util.exception.SevereException; 20 | import javafx.animation.*; 21 | import javafx.application.Platform; 22 | import javafx.concurrent.Task; 23 | import javafx.scene.Node; 24 | import javafx.scene.layout.StackPane; 25 | import javafx.util.Duration; 26 | 27 | import java.io.BufferedWriter; 28 | import java.io.File; 29 | import java.io.FileWriter; 30 | import java.io.IOException; 31 | import java.util.Timer; 32 | import java.util.TimerTask; 33 | import java.util.logging.Level; 34 | import java.util.logging.Logger; 35 | 36 | public class ScreenSaver extends StackPane 37 | { 38 | private Timer timer; 39 | 40 | private Timeline showScreenSaverTimeline; 41 | private long timeout; 42 | private Logger logger; 43 | private final String rpiOfficialScreenBacklightPowerLocation = "/sys/class/backlight/rpi_backlight/bl_power"; 44 | private boolean isChangeRpiScreenBacklightPower = false; 45 | 46 | public ScreenSaver(Base base, int timeout, Logger logger) 47 | { 48 | this.timeout = timeout* 1000L; 49 | this.logger = logger; 50 | 51 | setOpacity(0); 52 | getStyleClass().add("screensaver"); 53 | 54 | 55 | showScreenSaverTimeline = new Timeline(); 56 | showScreenSaverTimeline.setCycleCount(1); 57 | showScreenSaverTimeline.setOnFinished(actionEvent -> setRaspberryPiBacklightState(false)); 58 | 59 | 60 | showScreenSaverTimeline.getKeyFrames().addAll( 61 | new KeyFrame(Duration.millis(0.0D), 62 | new KeyValue(opacityProperty(), 63 | 0.0D, Interpolator.EASE_IN)), 64 | new KeyFrame(Duration.seconds(15D), 65 | new KeyValue(opacityProperty(), 66 | 1.0D, Interpolator.LINEAR)) 67 | ); 68 | 69 | isChangeRpiScreenBacklightPower = new File(rpiOfficialScreenBacklightPowerLocation).exists(); 70 | 71 | logger.info("Is Rpi Screen detected ? "+isChangeRpiScreenBacklightPower); 72 | 73 | startTimer(); 74 | 75 | base.setOnMouseClicked(mouseEvent -> { 76 | restart(); 77 | }); 78 | 79 | } 80 | 81 | public void restart() 82 | { 83 | close(); 84 | restartTimer(); 85 | } 86 | 87 | 88 | 89 | public void stop() 90 | { 91 | stopTimer(); 92 | setOpacity(0); 93 | toBack(); 94 | } 95 | 96 | 97 | private void show() 98 | { 99 | Platform.runLater(()->{ 100 | setOpacity(0); 101 | toFront(); 102 | showScreenSaverTimeline.play(); 103 | }); 104 | } 105 | 106 | private void close() 107 | { 108 | Platform.runLater(()->{ 109 | if(showScreenSaverTimeline.getStatus() == Animation.Status.RUNNING) 110 | { 111 | showScreenSaverTimeline.stop(); 112 | } 113 | 114 | setRaspberryPiBacklightState(true); 115 | setOpacity(0.0); 116 | toBack(); 117 | }); 118 | 119 | restartTimer(); 120 | } 121 | 122 | public void setTimeout(int seconds) 123 | { 124 | this.timeout = seconds* 1000L; 125 | } 126 | 127 | public void restartTimer() 128 | { 129 | stopTimer(); 130 | startTimer(); 131 | } 132 | 133 | private void stopTimer() 134 | { 135 | if(timer != null) 136 | { 137 | timer.cancel(); 138 | timer.purge(); 139 | } 140 | } 141 | 142 | private void startTimer() 143 | { 144 | timer = new Timer(); 145 | timer.schedule(new TimerTask() 146 | { 147 | @Override 148 | public void run() 149 | { 150 | show(); 151 | } 152 | },timeout); 153 | } 154 | 155 | private void setRaspberryPiBacklightState(boolean state) 156 | { 157 | if (!isChangeRpiScreenBacklightPower) 158 | return; 159 | 160 | try 161 | { 162 | BufferedWriter writer = new BufferedWriter(new FileWriter(rpiOfficialScreenBacklightPowerLocation)); 163 | 164 | if(state) // ON 165 | { 166 | writer.write("0"); 167 | } 168 | else // OFF 169 | { 170 | writer.write("1"); 171 | } 172 | 173 | writer.close(); 174 | } 175 | catch (IOException e) 176 | { 177 | e.printStackTrace(); 178 | 179 | logger.warning("Unable to change backlight power ..."); 180 | logger.log(Level.WARNING, e.getMessage(), e); 181 | 182 | logger.warning("Disable backlight changer ..."); 183 | isChangeRpiScreenBacklightPower = false; 184 | } 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/i18n/I18N.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.i18n; 16 | 17 | import com.stream_pi.util.exception.SevereException; 18 | import com.stream_pi.util.i18n.language.Language; 19 | 20 | import java.io.BufferedReader; 21 | import java.io.FileReader; 22 | import java.io.InputStreamReader; 23 | import java.net.URI; 24 | import java.nio.charset.StandardCharsets; 25 | import java.nio.file.Files; 26 | import java.nio.file.Path; 27 | import java.nio.file.Paths; 28 | import java.util.*; 29 | import java.util.stream.Stream; 30 | 31 | public class I18N 32 | { 33 | public static Locale BASE_LOCALE = new Locale("en"); 34 | private static ResourceBundle RESOURCE_BUNDLE; 35 | private static ResourceBundle BASE_RESOURCE_BUNDLE; 36 | 37 | public static void init(Locale locale) 38 | { 39 | RESOURCE_BUNDLE = ResourceBundle.getBundle(I18N.class.getPackageName()+".lang", locale); 40 | } 41 | 42 | public static String getString(String key, Object... args) 43 | { 44 | String result; 45 | 46 | if (RESOURCE_BUNDLE.containsKey(key)) 47 | { 48 | result = RESOURCE_BUNDLE.getString(key); 49 | } 50 | else 51 | { 52 | if (BASE_RESOURCE_BUNDLE == null) 53 | { 54 | BASE_RESOURCE_BUNDLE = ResourceBundle.getBundle(I18N.class.getPackageName()+".lang", new Locale("en")); 55 | } 56 | 57 | result = BASE_RESOURCE_BUNDLE.getString(key); 58 | } 59 | 60 | if (args.length == 0) 61 | { 62 | return result; 63 | } 64 | else 65 | { 66 | return String.format(result, args); 67 | } 68 | } 69 | 70 | private static List languages; 71 | 72 | public static void initAvailableLanguages() throws SevereException 73 | { 74 | try 75 | { 76 | languages = new ArrayList<>(); 77 | 78 | BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( 79 | Objects.requireNonNull(I18N.class.getResourceAsStream("i18n.properties")), 80 | StandardCharsets.UTF_8 81 | )); 82 | 83 | while(true) 84 | { 85 | String line = bufferedReader.readLine(); 86 | 87 | if(line == null) 88 | { 89 | break; 90 | } 91 | else if (line.startsWith("#") || line.startsWith("!") || !line.contains("=")) 92 | { 93 | continue; 94 | } 95 | 96 | 97 | String[] lineParts = line.split("="); 98 | 99 | String localeStr = lineParts[0].strip(); 100 | String displayName = lineParts[1].strip(); 101 | 102 | String[] localeArr = localeStr.split("_"); 103 | 104 | Locale locale; 105 | 106 | if(localeArr.length == 1) 107 | { 108 | locale = new Locale(localeArr[0]); 109 | } 110 | else if(localeArr.length == 2) 111 | { 112 | locale = new Locale(localeArr[0], localeArr[1]); 113 | } 114 | else 115 | { 116 | locale = new Locale(localeArr[0], localeArr[1], localeArr[2]); 117 | } 118 | 119 | 120 | languages.add(new Language(locale, displayName)); 121 | } 122 | } 123 | catch (Exception e) 124 | { 125 | e.printStackTrace(); 126 | throw new SevereException("Unable to parse initialise i18n.\n"+e.getMessage()); 127 | } 128 | } 129 | 130 | public static boolean isLanguageAvailable(Locale locale) 131 | { 132 | return getLanguage(locale) != null; 133 | } 134 | 135 | public static Language getLanguage(Locale locale) 136 | { 137 | for (Language eachLanguage : languages) 138 | { 139 | if(eachLanguage.getLocale().equals(locale)) 140 | { 141 | return eachLanguage; 142 | } 143 | } 144 | 145 | return null; 146 | } 147 | 148 | public static List getLanguages() 149 | { 150 | return languages; 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/info/ClientInfo.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | /* 16 | ServerInfo.java 17 | 18 | Stores basic information about the server - name, platform type 19 | 20 | Contributors: Debayan Sutradhar (@rnayabed) 21 | */ 22 | 23 | package com.stream_pi.client.info; 24 | 25 | import com.gluonhq.attach.orientation.OrientationService; 26 | import com.gluonhq.attach.storage.StorageService; 27 | import com.stream_pi.util.exception.MinorException; 28 | import com.stream_pi.util.exception.SevereException; 29 | import com.stream_pi.util.platform.Platform; 30 | import com.stream_pi.util.platform.ReleaseStatus; 31 | import com.stream_pi.util.version.Version; 32 | import javafx.geometry.Orientation; 33 | 34 | import java.io.*; 35 | import java.nio.charset.StandardCharsets; 36 | import java.util.Objects; 37 | import java.util.Optional; 38 | import java.util.Properties; 39 | import java.util.function.Function; 40 | import java.util.logging.Level; 41 | import java.util.logging.Logger; 42 | 43 | public class ClientInfo 44 | { 45 | private final Version version; 46 | private final ReleaseStatus releaseStatus; 47 | private final Platform platform; 48 | private String prePath; 49 | private final Version communicationProtocolVersion; 50 | private String buildNumber; 51 | private String license; 52 | private Orientation orientation = null; 53 | 54 | private static ClientInfo instance = null; 55 | 56 | private ClientInfo() 57 | { 58 | version = new Version(2,0,0); 59 | communicationProtocolVersion = new Version(2,0,0); 60 | 61 | releaseStatus = ReleaseStatus.EA; 62 | 63 | String osName = System.getProperty("os.name").toLowerCase(); 64 | 65 | String prePrePath = "Stream-Pi" + File.separator + "Client" + File.separator; 66 | 67 | prePath = System.getProperty("user.home") + File.separator + prePrePath; 68 | 69 | if(osName.contains("windows")) 70 | { 71 | platform = Platform.WINDOWS; 72 | } 73 | else if (osName.contains("linux")) 74 | { 75 | platform = Platform.LINUX; 76 | } 77 | else if(osName.contains("android") || osName.contains("ios")) 78 | { 79 | StorageService.create().ifPresent(s-> s.getPrivateStorage().ifPresentOrElse(sp-> prePath = sp.getAbsolutePath() + File.separator + prePrePath, 80 | ()-> prePath = null)); 81 | 82 | platform = Platform.valueOf(osName.toUpperCase()); 83 | } 84 | else if (osName.contains("mac")) 85 | { 86 | platform = Platform.MAC; 87 | } 88 | else 89 | { 90 | platform = Platform.UNKNOWN; 91 | } 92 | 93 | 94 | if (isPhone()) 95 | { 96 | OrientationService.create().ifPresent(orientationService -> 97 | { 98 | if(orientationService.getOrientation().isPresent()) 99 | { 100 | orientationService.orientationProperty().addListener((observableValue, oldOrientation, newOrientation) -> 101 | { 102 | if (oldOrientation != newOrientation) 103 | { 104 | orientation = newOrientation; 105 | } 106 | }); 107 | } 108 | }); 109 | } 110 | 111 | 112 | 113 | try 114 | { 115 | InputStream inputStream = ClientInfo.class.getResourceAsStream("build.properties"); 116 | if (inputStream != null) 117 | { 118 | Properties properties = new Properties(); 119 | properties.load(inputStream); 120 | inputStream.close(); 121 | 122 | buildNumber = properties.getProperty("build.number"); 123 | } 124 | } 125 | catch (IOException e) 126 | { 127 | e.printStackTrace(); 128 | Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Unable to fetch build.properties!", e); 129 | } 130 | 131 | try 132 | { 133 | BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( 134 | Objects.requireNonNull(ClientInfo.class.getResourceAsStream("LICENSE")), 135 | StandardCharsets.UTF_8 136 | )); 137 | 138 | StringBuilder licenseTxt = new StringBuilder(); 139 | while(true) 140 | { 141 | String line = bufferedReader.readLine(); 142 | 143 | if(line == null) 144 | { 145 | break; 146 | } 147 | 148 | licenseTxt.append(line).append("\n"); 149 | } 150 | 151 | license = licenseTxt.toString(); 152 | } 153 | catch (IOException e) 154 | { 155 | e.printStackTrace(); 156 | Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Unable to fetch LICENSE!", e); 157 | } 158 | 159 | } 160 | 161 | public static synchronized ClientInfo getInstance() 162 | { 163 | if(instance == null) 164 | { 165 | instance = new ClientInfo(); 166 | } 167 | 168 | return instance; 169 | } 170 | 171 | public String getPrePath() 172 | { 173 | return prePath; 174 | } 175 | 176 | public Platform getPlatform() 177 | { 178 | return platform; 179 | } 180 | 181 | public Version getVersion() { 182 | return version; 183 | } 184 | 185 | public ReleaseStatus getReleaseStatus() 186 | { 187 | return releaseStatus; 188 | } 189 | 190 | public Version getCommunicationProtocolVersion() 191 | { 192 | return communicationProtocolVersion; 193 | } 194 | 195 | public boolean isPhone() 196 | { 197 | return getPlatform() == Platform.ANDROID || getPlatform() == Platform.IOS; 198 | } 199 | 200 | public String getBuildNumber() 201 | { 202 | return buildNumber; 203 | } 204 | 205 | public String getLicense() 206 | { 207 | return license; 208 | } 209 | 210 | public Orientation getOrientation() 211 | { 212 | return orientation; 213 | } 214 | } 215 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/info/StartupFlags.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.info; 16 | 17 | import javafx.application.Application; 18 | 19 | import java.util.ArrayList; 20 | import java.util.HashMap; 21 | import java.util.List; 22 | 23 | public class StartupFlags 24 | { 25 | public static String RUNNER_FILE_NAME = null; 26 | public static boolean SHOW_SHUT_DOWN_BUTTON = false; 27 | public static boolean X_MODE = true; 28 | public static boolean SCREEN_SAVER_FEATURE= false; 29 | public static boolean DEFAULT_FULLSCREEN_MODE=false; 30 | public static boolean SHOW_FULLSCREEN_TOGGLE_BUTTON=true; 31 | public static boolean APPEND_PATH_BEFORE_RUNNER_FILE_TO_OVERCOME_JPACKAGE_LIMITATION = false; 32 | public static boolean ALLOW_ROOT = false; 33 | public static boolean SET_FIXED_MIN_SIZE = true; 34 | 35 | private static final String RUNNER_FILE_NAME_ARG = "Stream-Pi.startupRunnerFileName"; 36 | private static final String SHOW_SHUT_DOWN_BUTTON_ARG = "Stream-Pi.showShutDownButton"; 37 | private static final String X_MODE_ARG = "Stream-Pi.xMode"; 38 | private static final String SHOW_FULLSCREEN_TOGGLE_BUTTON_ARG = "Stream-Pi.showFullScreenToggleButton"; 39 | private static final String DEFAULT_FULLSCREEN_MODE_ARG = "Stream-Pi.defaultFullScreenMode"; 40 | private static final String SCREEN_SAVER_FEATURE_ARG = "Stream-Pi.screenSaverFeature"; 41 | private static final String APPEND_PATH_BEFORE_RUNNER_FILE_TO_OVERCOME_JPACKAGE_LIMITATION_ARG = "Stream-Pi.appendPathBeforeRunnerFileToOvercomeJPackageLimitation"; 42 | private static final String ALLOW_ROOT_ARG = "Stream-Pi.allowRoot"; 43 | private static final String SET_FIXED_MIN_SIZE_ARG = "Stream-Pi.setFixedMinSize"; 44 | 45 | public static void init(Application.Parameters parameters) 46 | { 47 | for (String arg : parameters.getRaw()) 48 | { 49 | String[] arr = arg.split("="); 50 | 51 | if (arr.length == 2) 52 | { 53 | String val = arr[1].strip(); 54 | switch(arr[0]) 55 | { 56 | case RUNNER_FILE_NAME_ARG: RUNNER_FILE_NAME = val; break; 57 | case SHOW_SHUT_DOWN_BUTTON_ARG: SHOW_SHUT_DOWN_BUTTON = val.equals("true"); break; 58 | case X_MODE_ARG: X_MODE = val.equals("true"); break; 59 | case SHOW_FULLSCREEN_TOGGLE_BUTTON_ARG: SHOW_FULLSCREEN_TOGGLE_BUTTON = val.equals("true"); break; 60 | case DEFAULT_FULLSCREEN_MODE_ARG: DEFAULT_FULLSCREEN_MODE = val.equals("true"); break; 61 | case SCREEN_SAVER_FEATURE_ARG: SCREEN_SAVER_FEATURE = val.equals("true"); break; 62 | case APPEND_PATH_BEFORE_RUNNER_FILE_TO_OVERCOME_JPACKAGE_LIMITATION_ARG: APPEND_PATH_BEFORE_RUNNER_FILE_TO_OVERCOME_JPACKAGE_LIMITATION = val.equals("true"); break; 63 | case ALLOW_ROOT_ARG: ALLOW_ROOT = val.equals("true"); break; 64 | case SET_FIXED_MIN_SIZE_ARG: SET_FIXED_MIN_SIZE = val.equals("true"); break; 65 | } 66 | } 67 | } 68 | } 69 | 70 | public static String[] generateRuntimeArgumentsForStartOnBoot() 71 | { 72 | List arrayList = new ArrayList<>(); 73 | 74 | if (RUNNER_FILE_NAME!=null) 75 | { 76 | arrayList.add(RUNNER_FILE_NAME_ARG+"='"+RUNNER_FILE_NAME+"'"); 77 | } 78 | 79 | arrayList.add(SHOW_SHUT_DOWN_BUTTON_ARG+"="+SHOW_SHUT_DOWN_BUTTON); 80 | arrayList.add(X_MODE_ARG+"="+X_MODE); 81 | arrayList.add(SHOW_FULLSCREEN_TOGGLE_BUTTON_ARG+"="+SHOW_FULLSCREEN_TOGGLE_BUTTON); 82 | arrayList.add(DEFAULT_FULLSCREEN_MODE_ARG+"="+DEFAULT_FULLSCREEN_MODE); 83 | arrayList.add(SCREEN_SAVER_FEATURE_ARG+"="+SCREEN_SAVER_FEATURE); 84 | arrayList.add(APPEND_PATH_BEFORE_RUNNER_FILE_TO_OVERCOME_JPACKAGE_LIMITATION_ARG+"="+APPEND_PATH_BEFORE_RUNNER_FILE_TO_OVERCOME_JPACKAGE_LIMITATION); 85 | arrayList.add(ALLOW_ROOT_ARG+"="+StartupFlags.ALLOW_ROOT); 86 | arrayList.add(SET_FIXED_MIN_SIZE_ARG+"="+StartupFlags.SET_FIXED_MIN_SIZE); 87 | 88 | return arrayList.toArray(new String[0]); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/profile/ClientAction.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.profile; 16 | 17 | import com.stream_pi.action_api.action.Action; 18 | import com.stream_pi.action_api.action.ActionType; 19 | 20 | public class ClientAction extends Action 21 | { 22 | private String uniqueID; 23 | 24 | public ClientAction(String id, ActionType actionType) 25 | { 26 | super(id, actionType); 27 | } 28 | 29 | public void setUniqueID(String uniqueID) 30 | { 31 | this.uniqueID = uniqueID; 32 | } 33 | 34 | @Override 35 | public String getUniqueID() 36 | { 37 | return uniqueID; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/profile/ClientProfiles.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.profile; 16 | 17 | import com.stream_pi.client.i18n.I18N; 18 | import com.stream_pi.client.io.Config; 19 | import com.stream_pi.util.exception.MinorException; 20 | import com.stream_pi.util.exception.SevereException; 21 | 22 | import java.io.File; 23 | import java.util.ArrayList; 24 | import java.util.HashMap; 25 | import java.util.logging.Logger; 26 | 27 | public class ClientProfiles { 28 | 29 | 30 | private File profilesFolder; 31 | private String defaultProfileID; 32 | 33 | private Logger logger; 34 | 35 | public ClientProfiles(File profilesFolder, String defaultProfileID) throws SevereException 36 | { 37 | logger = Logger.getLogger(ClientProfiles.class.getName()); 38 | 39 | this.defaultProfileID = defaultProfileID; 40 | this.profilesFolder = profilesFolder; 41 | clientProfiles = new HashMap<>(); 42 | loadingErrors = new ArrayList<>(); 43 | 44 | loadProfiles(); 45 | } 46 | 47 | public void addProfile(ClientProfile clientProfile) throws CloneNotSupportedException { 48 | clientProfiles.put(clientProfile.getID(), (ClientProfile) clientProfile.clone()); 49 | } 50 | 51 | public void deleteProfile(ClientProfile clientProfile) 52 | { 53 | clientProfile.deleteProfile(); 54 | clientProfiles.remove(clientProfile.getID()); 55 | } 56 | 57 | private ArrayList loadingErrors; 58 | private HashMap clientProfiles; 59 | 60 | public void loadProfiles() throws SevereException 61 | { 62 | logger.info("Loading profiles ..."); 63 | 64 | 65 | String iconsPath = Config.getInstance().getIconsPath(); 66 | 67 | clientProfiles.clear(); 68 | loadingErrors.clear(); 69 | 70 | if(!profilesFolder.isDirectory()) 71 | { 72 | throw new SevereException(I18N.getString("profile.ClientProfiles.profileFolderNotADirectoryOrDoesNotExist", profilesFolder.getAbsolutePath())); 73 | } 74 | 75 | 76 | File[] profilesFiles = profilesFolder.listFiles(); 77 | if(profilesFiles == null) 78 | { 79 | throw new SevereException(I18N.getString("profile.ClientProfiles.profileFoldersIsNull", profilesFolder.getAbsolutePath())); 80 | } 81 | 82 | for(File eachProfileFile : profilesFiles) 83 | { 84 | try 85 | { 86 | ClientProfile profile = new ClientProfile(eachProfileFile, iconsPath); 87 | try 88 | { 89 | addProfile(profile); 90 | } 91 | catch (CloneNotSupportedException e) 92 | { 93 | e.printStackTrace(); 94 | throw new SevereException(e.getMessage()); 95 | } 96 | } 97 | catch (MinorException e) 98 | { 99 | if(eachProfileFile.getName().replace(".xml","").equals(defaultProfileID)) 100 | { 101 | throw new SevereException(I18N.getString("profile.ClientProfiles.defaultProfileBad", defaultProfileID, e.getMessage())); 102 | } 103 | 104 | loadingErrors.add(new MinorException(e.getMessage()+" ("+eachProfileFile.getName().replace(".xml", ""))); 105 | 106 | e.printStackTrace(); 107 | } 108 | } 109 | 110 | logger.info("Loaded all profiles!"); 111 | } 112 | 113 | public ArrayList getLoadingErrors() 114 | { 115 | return loadingErrors; 116 | } 117 | 118 | public ArrayList getClientProfiles() 119 | { 120 | ArrayList p = new ArrayList<>(); 121 | for(String profile : clientProfiles.keySet()) 122 | p.add(clientProfiles.get(profile)); 123 | return p; 124 | } 125 | 126 | public ClientProfile getProfileFromID(String profileID) 127 | { 128 | return clientProfiles.getOrDefault(profileID, null); 129 | } 130 | 131 | 132 | 133 | } 134 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/window/ExceptionAndAlertHandler.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.window; 16 | 17 | import com.stream_pi.util.alert.StreamPiAlert; 18 | import com.stream_pi.util.alert.StreamPiAlertType; 19 | import com.stream_pi.util.exception.MinorException; 20 | import com.stream_pi.util.exception.SevereException; 21 | 22 | public interface ExceptionAndAlertHandler 23 | { 24 | StreamPiAlert handleMinorException(MinorException e); 25 | StreamPiAlert handleMinorException(String message, MinorException e); 26 | StreamPiAlert handleSevereException(SevereException e); 27 | StreamPiAlert handleSevereException(String message, SevereException e); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/window/dashboard/DashboardBase.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.window.dashboard; 16 | 17 | import com.stream_pi.client.controller.ClientListener; 18 | import com.stream_pi.client.profile.ClientProfile; 19 | import com.stream_pi.client.window.ExceptionAndAlertHandler; 20 | import com.stream_pi.client.window.dashboard.actiongridpane.ActionGridPane; 21 | 22 | import javafx.beans.value.ChangeListener; 23 | import javafx.beans.value.ObservableValue; 24 | import javafx.geometry.Insets; 25 | import javafx.geometry.Orientation; 26 | import javafx.geometry.Pos; 27 | import javafx.scene.CacheHint; 28 | import javafx.scene.Node; 29 | import javafx.scene.control.Button; 30 | import javafx.scene.control.ScrollBar; 31 | import javafx.scene.control.Skin; 32 | import javafx.scene.layout.AnchorPane; 33 | import javafx.scene.layout.HBox; 34 | import javafx.scene.layout.VBox; 35 | import org.kordamp.ikonli.javafx.FontIcon; 36 | 37 | public class DashboardBase extends AnchorPane 38 | { 39 | private ExceptionAndAlertHandler exceptionAndAlertHandler; 40 | 41 | private ActionGridPane actionGridPane; 42 | private Button settingsButton; 43 | 44 | public DashboardBase(ExceptionAndAlertHandler exceptionAndAlertHandler, ClientListener clientListener) 45 | { 46 | this.exceptionAndAlertHandler = exceptionAndAlertHandler; 47 | 48 | actionGridPane = new ActionGridPane(exceptionAndAlertHandler, clientListener); 49 | AnchorPane.setTopAnchor(actionGridPane, 0.0); 50 | AnchorPane.setBottomAnchor(actionGridPane, 0.0); 51 | AnchorPane.setLeftAnchor(actionGridPane, 0.0); 52 | AnchorPane.setRightAnchor(actionGridPane, 0.0); 53 | 54 | FontIcon fontIcon = new FontIcon("fas-cog"); 55 | fontIcon.getStyleClass().addAll("dashboard_settings_button_icon"); 56 | 57 | settingsButton = new Button(); 58 | settingsButton.getStyleClass().addAll("dashboard_settings_button"); 59 | settingsButton.setGraphic(fontIcon); 60 | AnchorPane.setBottomAnchor(settingsButton, 10.0); 61 | AnchorPane.setRightAnchor(settingsButton, 10.0); 62 | 63 | if (actionGridPane.getSkin() == null) 64 | { 65 | ChangeListener> skinChangeListener = new ChangeListener<>() { 66 | @Override 67 | public void changed(ObservableValue> observable, Skin oldValue, Skin newValue) { 68 | actionGridPane.skinProperty().removeListener(this); 69 | modifySettingsButtonToPreventOverlappingScrollBars(); 70 | } 71 | }; 72 | actionGridPane.skinProperty().addListener(skinChangeListener); 73 | } 74 | else 75 | { 76 | modifySettingsButtonToPreventOverlappingScrollBars(); 77 | } 78 | 79 | getChildren().addAll(actionGridPane,settingsButton); 80 | 81 | getStyleClass().add("dashboard"); 82 | 83 | setCache(true); 84 | setCacheHint(CacheHint.QUALITY); 85 | } 86 | 87 | private void modifySettingsButtonToPreventOverlappingScrollBars() 88 | { 89 | for (Node n : actionGridPane.lookupAll(".scroll-bar")) 90 | { 91 | if (n instanceof ScrollBar) 92 | { 93 | ScrollBar bar = (ScrollBar) n; 94 | if (bar.getOrientation().equals(Orientation.VERTICAL)) 95 | { 96 | bar.visibleProperty().addListener((observableValue, oldValue, newVal) -> 97 | { 98 | if (newVal) 99 | { 100 | AnchorPane.setRightAnchor(settingsButton, 20.0); 101 | } 102 | else 103 | { 104 | AnchorPane.setRightAnchor(settingsButton, 10.0); 105 | } 106 | }); 107 | } 108 | else if (bar.getOrientation().equals(Orientation.HORIZONTAL)) 109 | { 110 | bar.visibleProperty().addListener((observableValue, oldValue, newVal) -> 111 | { 112 | if (newVal) 113 | { 114 | AnchorPane.setBottomAnchor(settingsButton, 20.0); 115 | } 116 | else 117 | { 118 | AnchorPane.setBottomAnchor(settingsButton, 10.0); 119 | } 120 | }); 121 | } 122 | } 123 | } 124 | } 125 | 126 | public void renderProfile(ClientProfile clientProfile, boolean freshRender) 127 | { 128 | renderProfile(clientProfile, "root", freshRender); 129 | } 130 | 131 | public void renderProfile(ClientProfile clientProfile, String currentParent, boolean freshRender) 132 | { 133 | actionGridPane.setClientProfile(clientProfile); 134 | actionGridPane.setCurrentParent(currentParent); 135 | actionGridPane.setFreshRender(freshRender); 136 | 137 | actionGridPane.renderGrid(); 138 | actionGridPane.renderActions(); 139 | } 140 | 141 | public ActionGridPane getActionGridPane() { 142 | return actionGridPane; 143 | } 144 | 145 | public Button getSettingsButton() { 146 | return settingsButton; 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/window/dashboard/actiongridpane/ActionGridPaneListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.window.dashboard.actiongridpane; 16 | 17 | import com.stream_pi.client.controller.ClientListener; 18 | 19 | public interface ActionGridPaneListener 20 | { 21 | void renderFolder(String ID); 22 | 23 | ClientListener getClientListener(); 24 | 25 | boolean isConnected(); 26 | 27 | ActionBox getActionBox(int col, int row); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/window/firsttimeuse/FinalConfigPane.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.window.firsttimeuse; 16 | 17 | import com.gluonhq.attach.orientation.OrientationService; 18 | import com.stream_pi.client.controller.ClientListener; 19 | import com.stream_pi.client.i18n.I18N; 20 | import com.stream_pi.client.info.StartupFlags; 21 | import com.stream_pi.client.io.Config; 22 | import com.stream_pi.client.info.ClientInfo; 23 | import com.stream_pi.client.profile.ClientProfile; 24 | import com.stream_pi.client.window.ExceptionAndAlertHandler; 25 | import com.stream_pi.util.alert.StreamPiAlert; 26 | import com.stream_pi.util.alert.StreamPiAlertType; 27 | import com.stream_pi.util.exception.MinorException; 28 | import com.stream_pi.util.exception.SevereException; 29 | import com.stream_pi.util.rootchecker.RootChecker; 30 | import com.stream_pi.util.uihelper.ActionGridRowsAndColsCalculator; 31 | import com.stream_pi.util.uihelper.HBoxInputBox; 32 | 33 | import javafx.application.Platform; 34 | import javafx.concurrent.Task; 35 | import javafx.geometry.Orientation; 36 | import javafx.geometry.Pos; 37 | import javafx.scene.control.*; 38 | import javafx.scene.layout.Priority; 39 | import javafx.scene.layout.VBox; 40 | 41 | import javax.xml.transform.TransformerException; 42 | import java.io.File; 43 | import java.net.InetAddress; 44 | import java.net.UnknownHostException; 45 | import java.util.logging.Logger; 46 | 47 | public class FinalConfigPane extends ScrollPane 48 | { 49 | private TextField clientNameTextField; 50 | private TextField serverIPHostNameTextField; 51 | private TextField serverPortTextField; 52 | private Button nextButton; 53 | private ExceptionAndAlertHandler exceptionAndAlertHandler; 54 | private ClientListener clientListener; 55 | 56 | public FinalConfigPane(ExceptionAndAlertHandler exceptionAndAlertHandler, ClientListener clientListener, 57 | Button nextButton) 58 | { 59 | this.exceptionAndAlertHandler = exceptionAndAlertHandler; 60 | this.clientListener = clientListener; 61 | this.nextButton = nextButton; 62 | 63 | getStyleClass().add("first_time_use_pane_final_config"); 64 | 65 | Label label = new Label(I18N.getString("firsttimeuse.FinalConfigPane.subHeading")); 66 | label.setWrapText(true); 67 | VBox.setVgrow(label, Priority.ALWAYS); 68 | label.getStyleClass().add("first_time_use_pane_final_config_label"); 69 | 70 | clientNameTextField = new TextField(); 71 | serverIPHostNameTextField = new TextField(); 72 | serverPortTextField = new TextField(); 73 | 74 | Label securityWarningLabel = new Label(I18N.getString("firsttimeuse.FinalConfigPane.securityWarning")); 75 | securityWarningLabel.setWrapText(true); 76 | securityWarningLabel.prefWidthProperty().bind(widthProperty()); 77 | securityWarningLabel.getStyleClass().add("first_time_use_pane_final_config_security_warning_label"); 78 | 79 | 80 | 81 | HBoxInputBox clientNameInputBox = new HBoxInputBox(I18N.getString("name"), clientNameTextField, 150); 82 | HBoxInputBox serverIPHostNameInputBox = new HBoxInputBox(I18N.getString("serverHostNameOrIP"), serverIPHostNameTextField, 150); 83 | HBoxInputBox serverIPPortInputBox = new HBoxInputBox(I18N.getString("serverPort"), serverPortTextField, 150); 84 | 85 | VBox vBox = new VBox(label, clientNameInputBox, serverIPHostNameInputBox, serverIPPortInputBox, securityWarningLabel); 86 | vBox.getStyleClass().add("first_time_use_pane_final_config_vbox"); 87 | vBox.setSpacing(10.0); 88 | 89 | setContent(vBox); 90 | setFitToWidth(true); 91 | 92 | setVisible(false); 93 | 94 | try 95 | { 96 | clientNameTextField.setText(InetAddress.getLocalHost().getHostName()); 97 | } 98 | catch (UnknownHostException e) 99 | { 100 | Logger.getLogger(getClass().getName()).warning("Hostname lookup failed! Not setting any placeholder for clientNameTextField."); 101 | } 102 | } 103 | 104 | public void makeChangesToNextButton() 105 | { 106 | nextButton.setText(I18N.getString("firsttimeuse.FinalConfigPane.confirm")); 107 | nextButton.setOnAction(actionEvent -> new Thread(new Task() { 108 | @Override 109 | protected Void call() 110 | { 111 | onConfirmButtonClicked(); 112 | return null; 113 | } 114 | }).start()); 115 | } 116 | 117 | private void onConfirmButtonClicked() 118 | { 119 | Platform.runLater(()->nextButton.setDisable(true)); 120 | 121 | StringBuilder errors = new StringBuilder(); 122 | 123 | if(clientNameTextField.getText().isBlank()) 124 | { 125 | errors.append("* ").append(I18N.getString("nameCannotBeBlank")).append("\n"); 126 | } 127 | 128 | if(serverIPHostNameTextField.getText().isBlank()) 129 | { 130 | errors.append("* ").append(I18N.getString("serverHostNameOrIPCannotBeBlank")).append("\n"); 131 | } 132 | 133 | int port = -1; 134 | try 135 | { 136 | port = Integer.parseInt(serverPortTextField.getText()); 137 | 138 | if(port < 1024 && !RootChecker.isRoot(ClientInfo.getInstance().getPlatform())) 139 | { 140 | errors.append("* ").append(I18N.getString("serverPortMustBeGreaterThan1024")).append("\n"); 141 | } 142 | else if(port > 65535) 143 | { 144 | errors.append("* ").append(I18N.getString("serverPortMustBeLesserThan65535")).append("\n"); 145 | } 146 | } 147 | catch (NumberFormatException exception) 148 | { 149 | errors.append("* ").append(I18N.getString("serverPortMustBeInteger")).append("\n"); 150 | } 151 | 152 | if(errors.toString().isEmpty()) 153 | { 154 | try 155 | { 156 | Config.getInstance().setName(clientNameTextField.getText()); 157 | Config.getInstance().setServerHostNameOrIP(serverIPHostNameTextField.getText()); 158 | Config.getInstance().setServerPort(port); 159 | Config.getInstance().setFirstTimeUse(false); 160 | 161 | if(ClientInfo.getInstance().isPhone()) 162 | { 163 | Config.getInstance().setScreenMoverEnabled(true); 164 | } 165 | 166 | Config.getInstance().save(); 167 | 168 | ClientProfile clientProfile = new ClientProfile(new File(Config.getInstance().getProfilesPath()+ File.separator + 169 | Config.getInstance().getStartupProfileID()+".xml"), Config.getInstance().getIconsPath()); 170 | 171 | ActionGridRowsAndColsCalculator actionGridRowsAndColsCalculator = new ActionGridRowsAndColsCalculator(ClientInfo.getInstance().getOrientation(), 172 | clientProfile.getActionSize(), clientProfile.getActionGap(), clientListener.getStageWidth(), clientListener.getStageHeight()); 173 | 174 | clientProfile.setCols(actionGridRowsAndColsCalculator.getCols()); 175 | clientProfile.setRows(actionGridRowsAndColsCalculator.getRows()); 176 | 177 | clientProfile.saveProfileDetails(); 178 | 179 | Platform.runLater(()-> { 180 | clientListener.init(); 181 | clientListener.setupClientConnection(); 182 | }); 183 | } 184 | catch(Exception e) 185 | { 186 | e.printStackTrace(); 187 | exceptionAndAlertHandler.handleSevereException(new SevereException(e.getMessage())); 188 | } 189 | } 190 | else 191 | { 192 | Platform.runLater(()->nextButton.setDisable(false)); 193 | new StreamPiAlert(I18N.getString("validationError", errors), StreamPiAlertType.ERROR).show(); 194 | } 195 | } 196 | } 197 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/window/firsttimeuse/FirstTimeUse.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.window.firsttimeuse; 16 | 17 | import com.stream_pi.client.Main; 18 | import com.stream_pi.client.controller.ClientListener; 19 | import com.stream_pi.client.i18n.I18N; 20 | import com.stream_pi.client.window.ExceptionAndAlertHandler; 21 | import com.stream_pi.util.uihelper.SpaceFiller; 22 | 23 | import javafx.geometry.Insets; 24 | import javafx.scene.control.Button; 25 | import javafx.scene.control.Label; 26 | import javafx.scene.layout.HBox; 27 | import javafx.scene.layout.Priority; 28 | import javafx.scene.layout.StackPane; 29 | import javafx.scene.layout.VBox; 30 | import javafx.scene.text.Font; 31 | 32 | public class FirstTimeUse extends VBox 33 | { 34 | public FirstTimeUse(ExceptionAndAlertHandler exceptionAndAlertHandler, ClientListener clientListener) 35 | { 36 | getStyleClass().add("first_time_use_pane"); 37 | 38 | setSpacing(10.0); 39 | 40 | headingLabel = new Label(); 41 | headingLabel.getStyleClass().add("first_time_use_pane_heading_label"); 42 | 43 | StackPane stackPane = new StackPane(); 44 | stackPane.getStyleClass().add("first_time_use_pane_stackpane"); 45 | 46 | VBox.setVgrow(stackPane, Priority.ALWAYS); 47 | 48 | nextButton = new Button(I18N.getString("firsttimeuse.FirstTimeUse.next")); 49 | nextButton.setOnAction(event-> onNextButtonClicked()); 50 | 51 | previousButton = new Button(I18N.getString("firsttimeuse.FirstTimeUse.previous")); 52 | previousButton.setOnAction(event-> onPreviousButtonClicked()); 53 | 54 | HBox buttonBar = new HBox(previousButton, SpaceFiller.horizontal(), nextButton); 55 | buttonBar.getStyleClass().add("first_time_use_pane_button_bar"); 56 | buttonBar.setSpacing(10.0); 57 | 58 | welcomePane = new WelcomePane(exceptionAndAlertHandler, clientListener); 59 | licensePane = new LicensePane(); 60 | finalConfigPane = new FinalConfigPane(exceptionAndAlertHandler, clientListener, nextButton); 61 | 62 | stackPane.getChildren().addAll( 63 | welcomePane, 64 | licensePane, 65 | finalConfigPane 66 | ); 67 | 68 | getChildren().addAll(headingLabel, stackPane, buttonBar); 69 | 70 | setWindow(WindowName.WELCOME); 71 | } 72 | 73 | private Label headingLabel; 74 | private Button nextButton; 75 | private Button previousButton; 76 | private WelcomePane welcomePane; 77 | private LicensePane licensePane; 78 | private FinalConfigPane finalConfigPane; 79 | 80 | private WindowName windowName; 81 | 82 | private void onNextButtonClicked() 83 | { 84 | if(windowName == WindowName.WELCOME) 85 | { 86 | setWindow(WindowName.LICENSE); 87 | } 88 | else if(windowName == WindowName.LICENSE) 89 | { 90 | setWindow(WindowName.FINAL); 91 | } 92 | } 93 | 94 | private void onPreviousButtonClicked() 95 | { 96 | nextButton.setText("Next"); 97 | 98 | if(windowName == WindowName.FINAL) 99 | { 100 | setWindow(WindowName.LICENSE); 101 | } 102 | else if(windowName == WindowName.LICENSE) 103 | { 104 | setWindow(WindowName.WELCOME); 105 | } 106 | } 107 | 108 | private void setWindow(WindowName windowName) 109 | { 110 | if (windowName == WindowName.WELCOME) 111 | { 112 | this.windowName = WindowName.WELCOME; 113 | welcomePane.toFront(); 114 | welcomePane.setVisible(true); 115 | licensePane.setVisible(false); 116 | finalConfigPane.setVisible(false); 117 | 118 | headingLabel.setText(""); 119 | 120 | nextButton.setText(I18N.getString("firsttimeuse.FirstTimeUse.next")); 121 | nextButton.setOnAction(event-> onNextButtonClicked()); 122 | previousButton.setVisible(false); 123 | } 124 | else if (windowName == WindowName.LICENSE) 125 | { 126 | this.windowName = WindowName.LICENSE; 127 | licensePane.toFront(); 128 | welcomePane.setVisible(false); 129 | licensePane.setVisible(true); 130 | finalConfigPane.setVisible(false); 131 | 132 | headingLabel.setText(I18N.getString("firsttimeuse.FirstTimeUse.licenseAgreement")); 133 | 134 | nextButton.setText(I18N.getString("firsttimeuse.FirstTimeUse.agreeAndContinue")); 135 | nextButton.setOnAction(event-> onNextButtonClicked()); 136 | previousButton.setVisible(true); 137 | } 138 | else if (windowName == WindowName.FINAL) 139 | { 140 | this.windowName = WindowName.FINAL; 141 | finalConfigPane.toFront(); 142 | welcomePane.setVisible(false); 143 | licensePane.setVisible(false); 144 | finalConfigPane.setVisible(true); 145 | 146 | headingLabel.setText(I18N.getString("firsttimeuse.FirstTimeUse.finishingUp")); 147 | 148 | finalConfigPane.makeChangesToNextButton(); 149 | previousButton.setVisible(true); 150 | } 151 | } 152 | 153 | 154 | 155 | } 156 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/window/firsttimeuse/LicensePane.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.window.firsttimeuse; 16 | 17 | import com.stream_pi.client.info.ClientInfo; 18 | 19 | import javafx.scene.control.Label; 20 | import javafx.scene.control.TextArea; 21 | import javafx.scene.layout.Priority; 22 | import javafx.scene.layout.VBox; 23 | 24 | public class LicensePane extends VBox { 25 | public LicensePane() 26 | { 27 | getStyleClass().add("first_time_use_pane_license"); 28 | 29 | TextArea licenseTextArea = new TextArea(ClientInfo.getInstance().getLicense()); 30 | licenseTextArea.setWrapText(false); 31 | licenseTextArea.setEditable(false); 32 | 33 | licenseTextArea.prefWidthProperty().bind(widthProperty()); 34 | VBox.setVgrow(licenseTextArea, Priority.ALWAYS); 35 | 36 | getChildren().addAll(licenseTextArea); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/window/firsttimeuse/WelcomePane.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.window.firsttimeuse; 16 | 17 | import com.stream_pi.client.Main; 18 | import com.stream_pi.client.combobox.LanguageChooserComboBox; 19 | import com.stream_pi.client.controller.ClientListener; 20 | import com.stream_pi.client.i18n.I18N; 21 | import com.stream_pi.client.io.Config; 22 | import com.stream_pi.client.window.ExceptionAndAlertHandler; 23 | import com.stream_pi.util.combobox.StreamPiComboBoxListener; 24 | import com.stream_pi.util.exception.SevereException; 25 | import com.stream_pi.util.i18n.language.Language; 26 | import javafx.geometry.Insets; 27 | import javafx.geometry.Pos; 28 | import javafx.scene.control.Label; 29 | import javafx.scene.image.Image; 30 | import javafx.scene.image.ImageView; 31 | import javafx.scene.layout.VBox; 32 | 33 | import java.util.Locale; 34 | import java.util.Objects; 35 | 36 | public class WelcomePane extends VBox 37 | { 38 | private ImageView appIconImageView; 39 | public WelcomePane(ExceptionAndAlertHandler exceptionAndAlertHandler, ClientListener clientListener) 40 | { 41 | getStyleClass().add("first_time_use_welcome_pane"); 42 | 43 | Image appIcon = new Image(Objects.requireNonNull(Main.class.getResourceAsStream("icons/256x256.png"))); 44 | appIconImageView = new ImageView(appIcon); 45 | appIconImageView.managedProperty().bind(appIconImageView.visibleProperty()); 46 | VBox.setMargin(appIconImageView, new Insets(10, 0, 10, 0)); 47 | appIconImageView.setFitHeight(128); 48 | appIconImageView.setFitWidth(128); 49 | 50 | Label welcomeLabel = new Label(I18N.getString("firsttimeuse.WelcomePane.welcome")); 51 | welcomeLabel.setWrapText(true); 52 | welcomeLabel.setAlignment(Pos.CENTER); 53 | welcomeLabel.getStyleClass().add("first_time_use_welcome_pane_welcome_label"); 54 | 55 | LanguageChooserComboBox languageChooserComboBox = new LanguageChooserComboBox(); 56 | languageChooserComboBox.getStyleClass().add("first_time_use_welcome_pane_language_chooser_combo_box"); 57 | 58 | try 59 | { 60 | languageChooserComboBox.setCurrentSelectedItem(I18N.getLanguage(Config.getInstance().getCurrentLanguageLocale())); 61 | } 62 | catch (SevereException e) 63 | { 64 | exceptionAndAlertHandler.handleSevereException(e); 65 | } 66 | 67 | languageChooserComboBox.setStreamPiComboBoxListener(new StreamPiComboBoxListener<>() { 68 | @Override 69 | public void onNewItemSelected(Language oldLanguage, Language newLanguage) { 70 | try 71 | { 72 | if (oldLanguage != newLanguage) 73 | { 74 | Config.getInstance().setCurrentLanguageLocale(newLanguage.getLocale()); 75 | Config.getInstance().save(); 76 | 77 | clientListener.setFirstRun(true); 78 | clientListener.init(); 79 | } 80 | } 81 | catch (SevereException e) 82 | { 83 | exceptionAndAlertHandler.handleSevereException(e); 84 | } 85 | 86 | } 87 | }); 88 | 89 | heightProperty().addListener((observableValue, oldVal, newVal) -> appIconImageView.setVisible(clientListener.getStageHeight() >= 450)); 90 | 91 | getChildren().addAll(appIconImageView, welcomeLabel, languageChooserComboBox); 92 | 93 | 94 | 95 | setVisible(false); 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/window/firsttimeuse/WindowName.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.window.firsttimeuse; 16 | 17 | public enum WindowName 18 | { 19 | WELCOME, LICENSE, FINAL 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/window/settings/SettingsBase.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.window.settings; 16 | 17 | import com.stream_pi.client.controller.ClientListener; 18 | import com.stream_pi.client.i18n.I18N; 19 | import com.stream_pi.client.window.ExceptionAndAlertHandler; 20 | import com.stream_pi.client.window.settings.about.About; 21 | 22 | import javafx.application.HostServices; 23 | import javafx.event.Event; 24 | import javafx.geometry.Insets; 25 | import javafx.geometry.Pos; 26 | import javafx.scene.CacheHint; 27 | import javafx.scene.control.*; 28 | import javafx.scene.input.SwipeEvent; 29 | import javafx.scene.layout.Priority; 30 | import javafx.scene.layout.VBox; 31 | 32 | public class SettingsBase extends VBox 33 | { 34 | private TabPane tabPane; 35 | 36 | private GeneralTab generalTab; 37 | 38 | private Button closeButton; 39 | 40 | private HostServices hostServices; 41 | private ExceptionAndAlertHandler exceptionAndAlertHandler; 42 | 43 | public SettingsBase(HostServices hostServices, ExceptionAndAlertHandler exceptionAndAlertHandler, 44 | ClientListener clientListener) 45 | { 46 | this.exceptionAndAlertHandler = exceptionAndAlertHandler; 47 | this.hostServices = hostServices; 48 | 49 | tabPane = new TabPane(); 50 | tabPane.addEventFilter(SwipeEvent.ANY, Event::consume); 51 | tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE); 52 | VBox.setVgrow(tabPane, Priority.ALWAYS); 53 | 54 | Tab generalSettingsTab = new Tab(I18N.getString("window.settings.SettingsBase.settings")); 55 | generalTab = new GeneralTab(exceptionAndAlertHandler, clientListener, hostServices); 56 | generalSettingsTab.setContent(generalTab); 57 | 58 | Tab aboutTab = new Tab(I18N.getString("window.settings.SettingsBase.about")); 59 | aboutTab.setContent(new About(clientListener)); 60 | 61 | tabPane.getTabs().addAll(generalSettingsTab, aboutTab); 62 | 63 | setAlignment(Pos.TOP_RIGHT); 64 | 65 | closeButton = new Button(I18N.getString("window.settings.SettingsBase.close")); 66 | VBox.setMargin(closeButton, new Insets(10.0)); 67 | 68 | getChildren().addAll(tabPane, closeButton); 69 | 70 | getStyleClass().add("settings_base"); 71 | 72 | setCache(true); 73 | setCacheHint(CacheHint.QUALITY); 74 | } 75 | 76 | public void setDefaultTabToGeneral() 77 | { 78 | tabPane.getSelectionModel().selectFirst(); 79 | } 80 | 81 | public Button getCloseButton() 82 | { 83 | return closeButton; 84 | } 85 | 86 | public GeneralTab getGeneralTab() 87 | { 88 | return generalTab; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/window/settings/about/About.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.window.settings.about; 16 | 17 | import com.stream_pi.action_api.ActionAPI; 18 | import com.stream_pi.client.i18n.I18N; 19 | import com.stream_pi.theme_api.ThemeAPI; 20 | import com.stream_pi.util.Util; 21 | import com.stream_pi.client.Main; 22 | import com.stream_pi.client.controller.ClientListener; 23 | import com.stream_pi.client.info.ClientInfo; 24 | import javafx.event.Event; 25 | import javafx.geometry.Insets; 26 | import javafx.geometry.Pos; 27 | import javafx.scene.CacheHint; 28 | import javafx.scene.control.*; 29 | import javafx.scene.image.Image; 30 | import javafx.scene.image.ImageView; 31 | import javafx.scene.input.SwipeEvent; 32 | import javafx.scene.layout.HBox; 33 | import javafx.scene.layout.Priority; 34 | import javafx.scene.layout.VBox; 35 | 36 | import java.io.IOException; 37 | import java.io.InputStream; 38 | import java.lang.management.ManagementFactory; 39 | import java.util.Objects; 40 | import java.util.Properties; 41 | import java.util.logging.Logger; 42 | 43 | public class About extends ScrollPane 44 | { 45 | private final ClientListener clientListener; 46 | 47 | private ContributorsTab contributorsTab; 48 | private VBox mainVBox; 49 | 50 | public About(ClientListener clientListener) 51 | { 52 | this.clientListener = clientListener; 53 | 54 | getStyleClass().add("settings_about_tab"); 55 | 56 | 57 | mainVBox = new VBox(); 58 | mainVBox.getStyleClass().add("settings_about_tab_vbox"); 59 | 60 | 61 | mainVBox.setAlignment(Pos.TOP_CENTER); 62 | 63 | Image appIcon = new Image(Objects.requireNonNull(Main.class.getResourceAsStream("icons/256x256.png"))); 64 | ImageView appIconImageView = new ImageView(appIcon); 65 | VBox.setMargin(appIconImageView, new Insets(10, 0, 10, 0)); 66 | appIconImageView.setFitHeight(128); 67 | appIconImageView.setFitWidth(128); 68 | 69 | Tab contributorsT = new Tab(I18N.getString("window.settings.about.About.contributorsTabHeading")); 70 | contributorsTab = new ContributorsTab(clientListener); 71 | contributorsT.setContent(contributorsTab); 72 | 73 | 74 | TabPane tabPane = new TabPane(); 75 | tabPane.addEventFilter(SwipeEvent.ANY, Event::consume); 76 | 77 | tabPane.getStyleClass().add("settings_about_tab_internal"); 78 | tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE); 79 | tabPane.setMaxWidth(600); 80 | VBox.setVgrow(tabPane, Priority.ALWAYS); 81 | 82 | Tab licenseTab = new Tab(I18N.getString("window.settings.about.About.licenseTabHeading")); 83 | licenseTab.setContent(new LicenseTab()); 84 | 85 | 86 | 87 | Tab contactTab = new Tab(I18N.getString("window.settings.about.About.contactTabHeading")); 88 | contactTab.setContent(new ContactTab(clientListener)); 89 | 90 | tabPane.getTabs().addAll(licenseTab, contributorsT, contactTab); 91 | 92 | 93 | Hyperlink donateButton = new Hyperlink(I18N.getString("window.settings.about.About.donate")); 94 | donateButton.setOnAction(event -> openWebpage("https://www.patreon.com/streampi")); 95 | donateButton.getStyleClass().add("about_donate_hyperlink"); 96 | 97 | 98 | ClientInfo clientInfo = ClientInfo.getInstance(); 99 | Label versionText = new Label(clientInfo.getVersion().getText() + " - "+ clientInfo.getPlatform().getUIName() + " - "+ clientInfo.getReleaseStatus().getUIName()); 100 | versionText.getStyleClass().add("about_version_label"); 101 | 102 | Label commStandardLabel = new Label(I18N.getString("window.settings.about.About.serverCommunicationProtocolVersion", clientInfo.getCommunicationProtocolVersion().getText())); 103 | commStandardLabel.getStyleClass().add("about_comm_standard_label"); 104 | 105 | Label currentActionAPILabel = new Label("Action API " + ActionAPI.VERSION.getText()); 106 | currentActionAPILabel.getStyleClass().add("about_current_action_api_label"); 107 | 108 | Label currentUtilLabel = new Label("Util " + Util.VERSION.getText()); 109 | currentUtilLabel.getStyleClass().add("about_current_util_label"); 110 | 111 | 112 | Label javaVersionLabel = new Label("Java " + System.getProperty("java.version") + ", " + System.getProperty("java.vm.name")); 113 | javaVersionLabel.getStyleClass().add("about_java_version"); 114 | 115 | Label javafxVersionLabel = new Label("JavaFX " + System.getProperty("javafx.version")); 116 | javafxVersionLabel.getStyleClass().add("about_javafx_version"); 117 | 118 | Label javaGCLabel = new Label("GC: " + ManagementFactory.getGarbageCollectorMXBeans().get(0).getName()); 119 | javaGCLabel.getStyleClass().add("about_java_gc"); 120 | 121 | VBox vBox = new VBox( 122 | versionText, 123 | commStandardLabel, 124 | currentActionAPILabel, 125 | currentUtilLabel, 126 | javaVersionLabel, 127 | javafxVersionLabel, 128 | javaGCLabel 129 | ); 130 | 131 | vBox.setAlignment(Pos.CENTER); 132 | vBox.setSpacing(5); 133 | 134 | if(clientInfo.getBuildNumber() != null) 135 | { 136 | Label buildNumberLabel = new Label(I18N.getString("window.settings.about.About.buildNumber", clientInfo.getBuildNumber())); 137 | buildNumberLabel.getStyleClass().add("about_build_number_label"); 138 | vBox.getChildren().addAll(buildNumberLabel); 139 | } 140 | 141 | 142 | mainVBox.getChildren().addAll(appIconImageView, tabPane, 143 | donateButton, vBox); 144 | 145 | setFitToWidth(true); 146 | 147 | setContent(mainVBox); 148 | 149 | 150 | setCache(true); 151 | setCacheHint(CacheHint.SPEED); 152 | } 153 | 154 | private Label getSep() 155 | { 156 | Label label = new Label("|"); 157 | label.getStyleClass().add("separator_ui_label"); 158 | return label; 159 | } 160 | 161 | public void openWebpage(String url) 162 | { 163 | clientListener.openURL(url); 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/window/settings/about/ContactTab.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.window.settings.about; 16 | 17 | import com.stream_pi.client.controller.ClientListener; 18 | import com.stream_pi.client.i18n.I18N; 19 | import com.stream_pi.util.links.Links; 20 | import javafx.scene.control.Hyperlink; 21 | import javafx.scene.control.ScrollPane; 22 | import javafx.scene.layout.VBox; 23 | 24 | 25 | public class ContactTab extends ScrollPane 26 | { 27 | private final ClientListener clientListener; 28 | 29 | public ContactTab(ClientListener clientListener) 30 | { 31 | this.clientListener = clientListener; 32 | 33 | getStyleClass().add("about_contact_tab_scroll_pane"); 34 | 35 | Hyperlink github = new Hyperlink(I18N.getString("window.settings.about.ContactTab.github")); 36 | github.setOnAction(event -> openWebpage(Links.getGitHub())); 37 | 38 | Hyperlink discord = new Hyperlink(I18N.getString("window.settings.about.ContactTab.discord")); 39 | discord.setOnAction(event -> openWebpage(Links.getDiscord())); 40 | 41 | Hyperlink website = new Hyperlink(I18N.getString("window.settings.about.ContactTab.website")); 42 | website.setOnAction(event -> openWebpage(Links.getWebsite())); 43 | 44 | Hyperlink twitter = new Hyperlink(I18N.getString("window.settings.about.ContactTab.twitter")); 45 | twitter.setOnAction(event -> openWebpage(Links.getTwitter())); 46 | 47 | Hyperlink matrix = new Hyperlink(I18N.getString("window.settings.about.ContactTab.matrix")); 48 | matrix.setOnAction(event -> openWebpage(Links.getMatrix())); 49 | 50 | 51 | VBox vBox = new VBox(github, discord, website, twitter, matrix); 52 | vBox.setSpacing(10.0); 53 | 54 | setContent(vBox); 55 | } 56 | 57 | 58 | public void openWebpage(String url) 59 | { 60 | clientListener.openURL(url); 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/window/settings/about/ContributorsTab.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.window.settings.about; 16 | 17 | import com.stream_pi.client.controller.ClientListener; 18 | import com.stream_pi.client.i18n.I18N; 19 | import com.stream_pi.util.links.Links; 20 | import javafx.scene.control.*; 21 | import javafx.scene.layout.VBox; 22 | 23 | public class ContributorsTab extends ScrollPane 24 | { 25 | private final ClientListener clientListener; 26 | public ContributorsTab(ClientListener clientListener) 27 | { 28 | this.clientListener = clientListener; 29 | 30 | getStyleClass().add("about_contributors_tab_scroll_pane"); 31 | 32 | Hyperlink team = new Hyperlink(I18N.getString("window.settings.about.ContributorsTab.team")); 33 | team.setOnAction(event -> openWebpage(Links.getWebsiteAbout())); 34 | 35 | Hyperlink server = new Hyperlink(I18N.getString("window.settings.about.ContributorsTab.server")); 36 | server.setOnAction(event -> openWebpage(Links.getServerContributors())); 37 | 38 | Hyperlink client = new Hyperlink(I18N.getString("window.settings.about.ContributorsTab.client")); 39 | client.setOnAction(event -> openWebpage(Links.getClientContributors())); 40 | 41 | Hyperlink action_api = new Hyperlink(I18N.getString("window.settings.about.ContributorsTab.actionAPI")); 42 | action_api.setOnAction(event -> openWebpage(Links.getActionAPIContributors())); 43 | 44 | Hyperlink theme_api = new Hyperlink(I18N.getString("window.settings.about.ContributorsTab.themeAPI")); 45 | theme_api.setOnAction(event -> openWebpage(Links.getThemeAPIContributors())); 46 | 47 | Hyperlink util = new Hyperlink(I18N.getString("window.settings.about.ContributorsTab.util")); 48 | util.setOnAction(event -> openWebpage(Links.getUtilContributors())); 49 | 50 | VBox vBox = new VBox(team, server, client, action_api, theme_api, util); 51 | vBox.setSpacing(10.0); 52 | 53 | setContent(vBox); 54 | } 55 | 56 | 57 | public void openWebpage(String url) 58 | { 59 | clientListener.openURL(url); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/stream_pi/client/window/settings/about/LicenseTab.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | package com.stream_pi.client.window.settings.about; 16 | 17 | 18 | import com.stream_pi.client.info.ClientInfo; 19 | import javafx.scene.control.TextArea; 20 | 21 | public class LicenseTab extends TextArea 22 | { 23 | public LicenseTab() 24 | { 25 | setText(ClientInfo.getInstance().getLicense()); 26 | getStyleClass().add("about_license_text_area"); 27 | setWrapText(false); 28 | setEditable(false); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/module-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | module com.stream_pi.client 16 | { 17 | requires javafx.base; 18 | requires javafx.graphics; 19 | requires javafx.controls; 20 | requires org.kordamp.ikonli.javafx; 21 | 22 | requires com.gluonhq.attach.lifecycle; 23 | requires com.gluonhq.attach.util; 24 | requires com.gluonhq.attach.storage; 25 | requires com.gluonhq.attach.browser; 26 | requires com.gluonhq.attach.vibration; 27 | requires com.gluonhq.attach.orientation; 28 | 29 | requires eu.hansolo.medusa; 30 | 31 | requires java.management; 32 | 33 | requires java.xml; 34 | 35 | opens com.stream_pi.client.window.settings.about to javafx.base; 36 | 37 | requires com.stream_pi.util; 38 | requires com.stream_pi.theme_api; 39 | requires com.stream_pi.action_api; 40 | 41 | requires org.kordamp.ikonli.fontawesome5; 42 | 43 | requires org.controlsfx.controls; 44 | 45 | exports com.stream_pi.client; 46 | } -------------------------------------------------------------------------------- /src/main/resources/META-INF/native-image/resource-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "bundles": [ 3 | {"name": "com.stream_pi.client.i18n.lang"}, 4 | {"name": "com.stream_pi.util.i18n.lang"}, 5 | {"name": "com.stream_pi.theme_api.i18n.lang"}, 6 | {"name": "com.stream_pi.action_api.i18n.lang"}, 7 | {"name": "com.sun.org.apache.xerces.internal.impl.msg.XMLMessages"} 8 | ], 9 | "resources": [ 10 | {"pattern": ".*/i18n.properties$"}, 11 | {"pattern": ".*/lang.*properties$"}, 12 | {"pattern": ".*/Default.zip$"}, 13 | {"pattern": ".*/LICENSE$"}, 14 | {"pattern": ".*/build.properties$"}, 15 | {"pattern": ".*/(EmailBoard|NumericBoard|TextBoard|UriBoard).txt$"} 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/native-image/serialization-config.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"name": "com.stream_pi.util.comms.Message"}, 3 | {"name": "com.stream_pi.action_api.actionproperty.gaugeproperties.GaugeProperties"}, 4 | {"name": "com.stream_pi.action_api.actionproperty.gaugeproperties.GaugeSection"}, 5 | {"name": "com.stream_pi.action_api.actionproperty.gaugeproperties.SerializableColor"}, 6 | {"name": "eu.hansolo.medusa.Gauge$SkinType"}, 7 | {"name": "java.util.ArrayList"}, 8 | {"name": "java.lang.String"}, 9 | {"name": "java.lang.String[]"}, 10 | {"name": "byte"}, 11 | {"name": "byte[]"}, 12 | {"name": "int"}, 13 | {"name": "int[]"}, 14 | {"name": "double"}, 15 | {"name": "double[]"}, 16 | {"name": "java.util.HashMap"}, 17 | {"name": "com.stream_pi.util.version.Version"}, 18 | {"name": "com.stream_pi.action_api.action.Action"}, 19 | {"name": "boolean"}, 20 | {"name": "com.stream_pi.action_api.actionproperty.property.Type"}, 21 | {"name": "com.stream_pi.util.platform.ReleaseStatus"}, 22 | {"name": "com.stream_pi.util.platform.Platform"}, 23 | {"name": "java.lang.Number"}, 24 | {"name": "java.lang.Double"}, 25 | {"name": "java.lang.Boolean"}, 26 | {"name": "java.lang.Integer"}, 27 | {"name": "com.stream_pi.action_api.action.ActionType"}, 28 | {"name": "com.stream_pi.action_api.action.DisplayTextAlignment"}, 29 | {"name": "com.stream_pi.action_api.action.Location"}, 30 | {"name": "javafx.event.EventType"}, 31 | {"name": "javafx.event.EventType$EventTypeSerialization"}, 32 | {"name": "com.stream_pi.action_api.externalplugin.inputevent.StreamPiInputEvent"}, 33 | {"name": "com.stream_pi.action_api.externalplugin.inputevent.StreamPiMouseEvent"}, 34 | {"name": "com.stream_pi.action_api.externalplugin.inputevent.StreamPiRotateEvent"}, 35 | {"name": "com.stream_pi.action_api.externalplugin.inputevent.StreamPiSwipeEvent"}, 36 | {"name": "com.stream_pi.action_api.externalplugin.inputevent.StreamPiTouchEvent"}, 37 | {"name": "com.stream_pi.action_api.externalplugin.inputevent.StreamPiZoomEvent"} 38 | ] -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/Default.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/main/resources/com/stream_pi/client/Default.zip -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/default_icons.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | .alert_error_icon 16 | { 17 | -fx-icon-color: RED; 18 | } 19 | 20 | .alert_information_icon 21 | { 22 | -fx-icon-color: BLUE; 23 | } 24 | 25 | .alert_warning_icon 26 | { 27 | -fx-icon-color: #ffcc00; 28 | } 29 | 30 | .action_box_error_icon{ 31 | -fx-icon-color:red; 32 | } 33 | 34 | .action_box_toggle_on 35 | { 36 | -fx-icon-code: fas-toggle-on; 37 | } 38 | 39 | .action_box_toggle_off 40 | { 41 | -fx-icon-code: fas-toggle-off; 42 | } -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/i18n/i18n.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | # Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | # 5 | # This program is free software: you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation, either version 3 of the License, or 8 | # (at your option) any later version. 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | 15 | # Available Languages 16 | 17 | en = English 18 | de_DE = Deutsch (Deutschland) 19 | en_GB = English (Great Britain) 20 | en_IN = English (India) 21 | en_US = English (United States) 22 | es_ES = Español (Spain) 23 | fr = Français 24 | hi = हिन्दी 25 | mr = मराठी 26 | nl_NL = Nederlands (Nederland) 27 | -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/i18n/lang_en.properties: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 4 | # Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | 16 | # Common 17 | 18 | windowTitle = Stream-Pi Client 19 | validationError = Please rectify the following errors and try again:\n%s 20 | nameCannotBeBlank = Name cannot be blank. 21 | serverHostNameOrIPCannotBeBlank = Server Hostname/IP cannot be blank. 22 | serverPortMustBeGreaterThan1024 = Server Port must be greater than 1024. 23 | serverPortMustBeLesserThan65535 = Server Port must be lesser than 65535. 24 | serverPortMustBeInteger = Server Port must be integer. 25 | serverHostNameOrIP = Server Host Name/IP 26 | serverPort = Server Port 27 | name = Name 28 | 29 | # ==================================== 30 | # controller 31 | # ==================================== 32 | 33 | # Controller 34 | controller.Controller.noBrowserDetected = No browser detected! 35 | controller.Controller.failedToStartBrowser = Failed to start browser!\n%s 36 | controller.Controller.browserNotSupportedInFBMode = Browser is not supported in framebuffer (Console mode)! 37 | controller.Controller.unableToDeleteStarterFile = Unable to delete the starter file. This happened probably because you ran Stream-Pi as root before. Restart stream pi as root, turn off Start On Boot, then exit and restart Stream-Pi as normal user. 38 | controller.Controller.factoryResetUnsuccessful = Unable to successfully factory reset. Please delete directory\n%s 39 | 40 | 41 | 42 | # ==================================== 43 | # actiongridpane 44 | # ==================================== 45 | 46 | # ActionGridPane 47 | actiongridpane.ActionGridPane.failedToRenderActions = Unable to render following actions:\n%s 48 | actiongridpane.ActionGridPane.actionOutOfBounds = Action (%s) (%s) is out of bounds. Consider increasing rows/columns of current profile and relocating/deleting it. 49 | 50 | 51 | # ==================================== 52 | # firsttimeuse 53 | # ==================================== 54 | 55 | # FinalConfigPane 56 | firsttimeuse.FinalConfigPane.subHeading = We're almost finished setting things up. All that's needed now is for you to enter in the following details and you'll be good to go! 57 | firsttimeuse.FinalConfigPane.securityWarning = Stream-Pi is not encrypted yet. Use this only in absolutely private networks. Do not use this in a public network (Railway Station, Park).\nStream-Pi project is not responsible if your computer is compromised because of connecting Stream-Pi to a malicious network. 58 | firsttimeuse.FinalConfigPane.confirm = Confirm 59 | 60 | # FirstTimeUse 61 | firsttimeuse.FirstTimeUse.next = Next 62 | firsttimeuse.FirstTimeUse.previous = Previous 63 | firsttimeuse.FirstTimeUse.licenseAgreement = License Agreement 64 | firsttimeuse.FirstTimeUse.agreeAndContinue = Agree and continue 65 | firsttimeuse.FirstTimeUse.finishingUp = Finishing Up ... 66 | 67 | # Welcome Pane 68 | firsttimeuse.WelcomePane.welcome = Welcome! 69 | 70 | 71 | # ==================================== 72 | # settings 73 | # ==================================== 74 | 75 | 76 | # ================ 77 | # about 78 | # ================ 79 | 80 | # About 81 | window.settings.about.About.licenseTabHeading = License 82 | window.settings.about.About.contributorsTabHeading = Contributors 83 | window.settings.about.About.contactTabHeading = Contact 84 | window.settings.about.About.serverCommunicationProtocolVersion = Communication Protocol %s 85 | window.settings.about.About.buildNumber = Build Number: %s 86 | window.settings.about.About.donate = DONATE 87 | 88 | # ContactTab 89 | window.settings.about.ContactTab.github = GitHub 90 | window.settings.about.ContactTab.discord = Discord 91 | window.settings.about.ContactTab.website = Website 92 | window.settings.about.ContactTab.twitter = Twitter 93 | window.settings.about.ContactTab.matrix = Matrix 94 | 95 | # ContributorsTab 96 | window.settings.about.ContributorsTab.team = Team 97 | window.settings.about.ContributorsTab.server = Server 98 | window.settings.about.ContributorsTab.client = Client 99 | window.settings.about.ContributorsTab.actionAPI = Action API 100 | window.settings.about.ContributorsTab.themeAPI = Theme API 101 | window.settings.about.ContributorsTab.util = Util 102 | 103 | # ================ 104 | 105 | 106 | # GeneralTab 107 | window.settings.GeneralTab.startOnBoot = Start On Boot 108 | window.settings.GeneralTab.screenSaver = Screen Saver 109 | window.settings.GeneralTab.oledBurnInProtector = OLED Burn-In Protector 110 | window.settings.GeneralTab.tryConnectToServerOnActionClick = Try connecting to server on action click 111 | window.settings.GeneralTab.fullScreen = Full Screen 112 | window.settings.GeneralTab.vibrateOnActionClick = Vibrate on Action Click 113 | window.settings.GeneralTab.connectOnStartup = Connect On Startup 114 | window.settings.GeneralTab.showCursor = Show Cursor 115 | window.settings.GeneralTab.invertGridOnRotate = Invert Grid on Rotate 116 | window.settings.GeneralTab.themes = Themes 117 | window.settings.GeneralTab.icons = Icons 118 | window.settings.GeneralTab.profiles = Profiles 119 | window.settings.GeneralTab.checkForUpdates = Check For Updates 120 | window.settings.GeneralTab.factoryReset = Factory Reset 121 | window.settings.GeneralTab.screenTimeoutInSeconds = Screen Timeout (seconds) 122 | window.settings.GeneralTab.save = Save 123 | window.settings.GeneralTab.connect = Connect 124 | window.settings.GeneralTab.exit = Exit 125 | window.settings.GeneralTab.shutdown = Shutdown 126 | window.settings.GeneralTab.connection = Connection 127 | window.settings.GeneralTab.client = Client 128 | window.settings.GeneralTab.currentProfile = Current Profile 129 | window.settings.GeneralTab.theme = Theme 130 | window.settings.GeneralTab.locations = Locations 131 | window.settings.GeneralTab.others = Others 132 | window.settings.GeneralTab.language = Language 133 | window.settings.GeneralTab.resetAreYouSure = Are you sure?\nThis will erase everything. 134 | window.settings.GeneralTab.disconnect = Disconnect 135 | window.settings.GeneralTab.screenTimeoutCannotBeBelow15Seconds = Screen Timeout cannot be below 15 seconds. 136 | window.settings.GeneralTab.screenTimeoutMustBeInteger = Screen Timeout must be integer. 137 | window.settings.GeneralTab.unableToDeleteStarterFile = Unable to delete starter file. 138 | window.settings.GeneralTab.vibrationNotSupported = Vibration not supported. 139 | window.settings.GeneralTab.restart = Restart 140 | window.settings.GeneralTab.failedToShutdown = Failed to shutdown!\n%s 141 | window.settings.GeneralTab.restartPromptWarning = Restart?\nAll your current connections will be disconnected. 142 | 143 | 144 | # SettingsBase 145 | window.settings.SettingsBase.settings = Settings 146 | window.settings.SettingsBase.about = About 147 | window.settings.SettingsBase.close = Close 148 | 149 | 150 | # ==================================== 151 | # base 152 | # ==================================== 153 | 154 | # Base 155 | window.Base.failedToAccessFileSystem = Failed to access file system! 156 | window.Base.defaultThemeCorrupt = Default theme (%s) is corrupt. \nPlease restore the theme or reinstall. 157 | window.Base.failedToLoadThemes = Failed to load themes.\n%s 158 | window.Base.revertedToDefaultTheme = Reverted to default theme (%s) 159 | 160 | 161 | # ==================================== 162 | # io 163 | # ==================================== 164 | 165 | # Config 166 | 167 | io.config.unableToReadConfig = Unable to read config.\n%s 168 | io.config.unableToSaveConfig = Unable to save config.\n%s 169 | 170 | 171 | # ==================================== 172 | # profile 173 | # ==================================== 174 | 175 | # ClientProfile 176 | profile.ClientProfile.failedToParseProfile = Failed to parse profile at %s.\n%s 177 | profile.ClientProfile.unableToCreateProfileFile = Unable to create profile file. 178 | profile.ClientProfile.duplicateProfileFileExists = Duplicate profile file with same name %s already exists. 179 | 180 | # ClientProfiles 181 | profile.ClientProfiles.profileFolderNotADirectoryOrDoesNotExist = Profile folder (%s) is not a directory or does not exist. 182 | profile.ClientProfiles.profileFoldersIsNull = Profile folder (%s) files are null. 183 | profile.ClientProfiles.defaultProfileBad = Default profile (%s) corrupt.\n%s 184 | 185 | 186 | # ==================================== 187 | # connection 188 | # ==================================== 189 | 190 | # Client 191 | connection.Client.failedToConnectToServer = Unable to connect to server. Please check settings and network and try again. 192 | connection.Client.failedToSetUpIOStreams = Failed to set up IO Streams.\n%s 193 | connection.Client.failedToWriteToIOStream = Failed to write to IO Stream.\n%s 194 | connection.Client.accidentallyDisconnectedFromServer = Accidentally disconnected from %s. 195 | connection.Client.disconnectedFromServer = Disconnected from %s. -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/i18n/lang_en_GB.properties: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 4 | # Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | 16 | # Common 17 | 18 | windowTitle = Stream-Pi Client 19 | validationError = Please rectify the following errors and try again:\n%s 20 | nameCannotBeBlank = Name cannot be blank. 21 | serverHostNameOrIPCannotBeBlank = Server Hostname/IP cannot be blank. 22 | serverPortMustBeGreaterThan1024 = Server Port must be greater than 1024. 23 | serverPortMustBeLesserThan65535 = Server Port must be lesser than 65535. 24 | serverPortMustBeInteger = Server Port must be integer. 25 | serverHostNameOrIP = Server Host Name/IP 26 | serverPort = Server Port 27 | name = Name 28 | 29 | # ==================================== 30 | # controller 31 | # ==================================== 32 | 33 | # Controller 34 | controller.Controller.noBrowserDetected = No browser detected! 35 | controller.Controller.failedToStartBrowser = Failed to start browser!\n%s 36 | controller.Controller.browserNotSupportedInFBMode = Browser is not supported in framebuffer (Console mode)! 37 | controller.Controller.unableToDeleteStarterFile = Unable to delete the starter file. This happened probably because you ran Stream-Pi as root before. Restart stream pi as root, turn off Start On Boot, then exit and restart Stream-Pi as normal user. 38 | controller.Controller.factoryResetUnsuccessful = Unable to successfully factory reset. Please delete directory\n%s 39 | 40 | 41 | 42 | # ==================================== 43 | # actiongridpane 44 | # ==================================== 45 | 46 | # ActionGridPane 47 | actiongridpane.ActionGridPane.failedToRenderActions = Unable to render following actions:\n%s 48 | actiongridpane.ActionGridPane.actionOutOfBounds = Action (%s) (%s) is out of bounds. Consider increasing rows/columns of current profile and relocating/deleting it. 49 | 50 | 51 | # ==================================== 52 | # firsttimeuse 53 | # ==================================== 54 | 55 | # FinalConfigPane 56 | firsttimeuse.FinalConfigPane.subHeading = We're almost finished setting things up. All that's needed now is for you to enter in the following details and you'll be good to go! 57 | firsttimeuse.FinalConfigPane.securityWarning = Stream-Pi is not encrypted yet. Use this only in absolutely private networks. Do not use this in a public network (Railway Station, Park).\nStream-Pi project is not responsible if your computer is compromised because of connecting Stream-Pi to a malicious network. 58 | firsttimeuse.FinalConfigPane.confirm = Confirm 59 | 60 | # FirstTimeUse 61 | firsttimeuse.FirstTimeUse.next = Next 62 | firsttimeuse.FirstTimeUse.previous = Previous 63 | firsttimeuse.FirstTimeUse.licenseAgreement = License Agreement 64 | firsttimeuse.FirstTimeUse.agreeAndContinue = Agree and continue 65 | firsttimeuse.FirstTimeUse.finishingUp = Finishing Up ... 66 | 67 | # Welcome Pane 68 | firsttimeuse.WelcomePane.welcome = Welcome! 69 | 70 | 71 | # ==================================== 72 | # settings 73 | # ==================================== 74 | 75 | 76 | # ================ 77 | # about 78 | # ================ 79 | 80 | # About 81 | window.settings.about.About.licenseTabHeading = License 82 | window.settings.about.About.contributorsTabHeading = Contributors 83 | window.settings.about.About.contactTabHeading = Contact 84 | window.settings.about.About.serverCommunicationProtocolVersion = Communication Protocol %s 85 | window.settings.about.About.buildNumber = Build Number: %s 86 | window.settings.about.About.donate = DONATE 87 | 88 | # ContactTab 89 | window.settings.about.ContactTab.github = GitHub 90 | window.settings.about.ContactTab.discord = Discord 91 | window.settings.about.ContactTab.website = Website 92 | window.settings.about.ContactTab.twitter = Twitter 93 | window.settings.about.ContactTab.matrix = Matrix 94 | 95 | # ContributorsTab 96 | window.settings.about.ContributorsTab.team = Team 97 | window.settings.about.ContributorsTab.server = Server 98 | window.settings.about.ContributorsTab.client = Client 99 | window.settings.about.ContributorsTab.actionAPI = Action API 100 | window.settings.about.ContributorsTab.themeAPI = Theme API 101 | window.settings.about.ContributorsTab.util = Util 102 | 103 | # ================ 104 | 105 | 106 | # GeneralTab 107 | window.settings.GeneralTab.startOnBoot = Start On Boot 108 | window.settings.GeneralTab.screenSaver = Screen Saver 109 | window.settings.GeneralTab.oledBurnInProtector = OLED Burn-In Protector 110 | window.settings.GeneralTab.tryConnectToServerOnActionClick = Try connecting to server on action click 111 | window.settings.GeneralTab.fullScreen = Full Screen 112 | window.settings.GeneralTab.vibrateOnActionClick = Vibrate on Action Click 113 | window.settings.GeneralTab.connectOnStartup = Connect On Startup 114 | window.settings.GeneralTab.showCursor = Show Cursor 115 | window.settings.GeneralTab.invertGridOnRotate = Invert Grid on Rotate 116 | window.settings.GeneralTab.themes = Themes 117 | window.settings.GeneralTab.icons = Icons 118 | window.settings.GeneralTab.profiles = Profiles 119 | window.settings.GeneralTab.checkForUpdates = Check For Updates 120 | window.settings.GeneralTab.factoryReset = Factory Reset 121 | window.settings.GeneralTab.screenTimeoutInSeconds = Screen Timeout (seconds) 122 | window.settings.GeneralTab.save = Save 123 | window.settings.GeneralTab.connect = Connect 124 | window.settings.GeneralTab.exit = Exit 125 | window.settings.GeneralTab.shutdown = Shutdown 126 | window.settings.GeneralTab.connection = Connection 127 | window.settings.GeneralTab.client = Client 128 | window.settings.GeneralTab.currentProfile = Current Profile 129 | window.settings.GeneralTab.theme = Theme 130 | window.settings.GeneralTab.locations = Locations 131 | window.settings.GeneralTab.others = Others 132 | window.settings.GeneralTab.language = Language 133 | window.settings.GeneralTab.resetAreYouSure = Are you sure?\nThis will erase everything. 134 | window.settings.GeneralTab.disconnect = Disconnect 135 | window.settings.GeneralTab.screenTimeoutCannotBeBelow15Seconds = Screen Timeout cannot be below 15 seconds. 136 | window.settings.GeneralTab.screenTimeoutMustBeInteger = Screen Timeout must be integer. 137 | window.settings.GeneralTab.unableToDeleteStarterFile = Unable to delete starter file. 138 | window.settings.GeneralTab.vibrationNotSupported = Vibration not supported. 139 | window.settings.GeneralTab.restart = Restart 140 | window.settings.GeneralTab.failedToShutdown = Failed to shutdown!\n%s 141 | window.settings.GeneralTab.restartPromptWarning = Restart?\nAll your current connections will be disconnected. 142 | 143 | 144 | # SettingsBase 145 | window.settings.SettingsBase.settings = Settings 146 | window.settings.SettingsBase.about = About 147 | window.settings.SettingsBase.close = Close 148 | 149 | 150 | # ==================================== 151 | # base 152 | # ==================================== 153 | 154 | # Base 155 | window.Base.failedToAccessFileSystem = Failed to access file system! 156 | window.Base.defaultThemeCorrupt = Default theme (%s) is corrupt. \nPlease restore the theme or reinstall. 157 | window.Base.failedToLoadThemes = Failed to load themes.\n%s 158 | window.Base.revertedToDefaultTheme = Reverted to default theme (%s) 159 | 160 | 161 | # ==================================== 162 | # io 163 | # ==================================== 164 | 165 | # Config 166 | 167 | io.config.unableToReadConfig = Unable to read config.\n%s 168 | io.config.unableToSaveConfig = Unable to save config.\n%s 169 | 170 | 171 | # ==================================== 172 | # profile 173 | # ==================================== 174 | 175 | # ClientProfile 176 | profile.ClientProfile.failedToParseProfile = Failed to parse profile at %s.\n%s 177 | profile.ClientProfile.unableToCreateProfileFile = Unable to create profile file. 178 | profile.ClientProfile.duplicateProfileFileExists = Duplicate profile file with same name %s already exists. 179 | 180 | # ClientProfiles 181 | profile.ClientProfiles.profileFolderNotADirectoryOrDoesNotExist = Profile folder (%s) is not a directory or does not exist. 182 | profile.ClientProfiles.profileFoldersIsNull = Profile folder (%s) files are null. 183 | profile.ClientProfiles.defaultProfileBad = Default profile (%s) corrupt.\n%s 184 | 185 | 186 | # ==================================== 187 | # connection 188 | # ==================================== 189 | 190 | # Client 191 | connection.Client.failedToConnectToServer = Unable to connect to server. Please check settings and network and try again. 192 | connection.Client.failedToSetUpIOStreams = Failed to set up IO Streams.\n%s 193 | connection.Client.failedToWriteToIOStream = Failed to write to IO Stream.\n%s 194 | connection.Client.accidentallyDisconnectedFromServer = Accidentally disconnected from %s. 195 | connection.Client.disconnectedFromServer = Disconnected from %s. -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/i18n/lang_en_IN.properties: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 4 | # Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | 16 | # Common 17 | 18 | windowTitle = Stream-Pi Client 19 | validationError = Please rectify the following errors and try again:\n%s 20 | nameCannotBeBlank = Name cannot be blank. 21 | serverHostNameOrIPCannotBeBlank = Server Hostname/IP cannot be blank. 22 | serverPortMustBeGreaterThan1024 = Server Port must be greater than 1024. 23 | serverPortMustBeLesserThan65535 = Server Port must be lesser than 65535. 24 | serverPortMustBeInteger = Server Port must be integer. 25 | serverHostNameOrIP = Server Host Name/IP 26 | serverPort = Server Port 27 | name = Name 28 | 29 | # ==================================== 30 | # controller 31 | # ==================================== 32 | 33 | # Controller 34 | controller.Controller.noBrowserDetected = No browser detected! 35 | controller.Controller.failedToStartBrowser = Failed to start browser!\n%s 36 | controller.Controller.browserNotSupportedInFBMode = Browser is not supported in framebuffer (Console mode)! 37 | controller.Controller.unableToDeleteStarterFile = Unable to delete the starter file. This happened probably because you ran Stream-Pi as root before. Restart stream pi as root, turn off Start On Boot, then exit and restart Stream-Pi as normal user. 38 | controller.Controller.factoryResetUnsuccessful = Unable to successfully factory reset. Please delete directory\n%s 39 | 40 | 41 | 42 | # ==================================== 43 | # actiongridpane 44 | # ==================================== 45 | 46 | # ActionGridPane 47 | actiongridpane.ActionGridPane.failedToRenderActions = Unable to render following actions:\n%s 48 | actiongridpane.ActionGridPane.actionOutOfBounds = Action (%s) (%s) is out of bounds. Consider increasing rows/columns of current profile and relocating/deleting it. 49 | 50 | 51 | # ==================================== 52 | # firsttimeuse 53 | # ==================================== 54 | 55 | # FinalConfigPane 56 | firsttimeuse.FinalConfigPane.subHeading = We're almost finished setting things up. All that's needed now is for you to enter in the following details and you'll be good to go! 57 | firsttimeuse.FinalConfigPane.securityWarning = Stream-Pi is not encrypted yet. Use this only in absolutely private networks. Do not use this in a public network (Railway Station, Park).\nStream-Pi project is not responsible if your computer is compromised because of connecting Stream-Pi to a malicious network. 58 | firsttimeuse.FinalConfigPane.confirm = Confirm 59 | 60 | # FirstTimeUse 61 | firsttimeuse.FirstTimeUse.next = Next 62 | firsttimeuse.FirstTimeUse.previous = Previous 63 | firsttimeuse.FirstTimeUse.licenseAgreement = License Agreement 64 | firsttimeuse.FirstTimeUse.agreeAndContinue = Agree and continue 65 | firsttimeuse.FirstTimeUse.finishingUp = Finishing Up ... 66 | 67 | # Welcome Pane 68 | firsttimeuse.WelcomePane.welcome = Welcome! 69 | 70 | 71 | # ==================================== 72 | # settings 73 | # ==================================== 74 | 75 | 76 | # ================ 77 | # about 78 | # ================ 79 | 80 | # About 81 | window.settings.about.About.licenseTabHeading = License 82 | window.settings.about.About.contributorsTabHeading = Contributors 83 | window.settings.about.About.contactTabHeading = Contact 84 | window.settings.about.About.serverCommunicationProtocolVersion = Communication Protocol %s 85 | window.settings.about.About.buildNumber = Build Number: %s 86 | window.settings.about.About.donate = DONATE 87 | 88 | # ContactTab 89 | window.settings.about.ContactTab.github = GitHub 90 | window.settings.about.ContactTab.discord = Discord 91 | window.settings.about.ContactTab.website = Website 92 | window.settings.about.ContactTab.twitter = Twitter 93 | window.settings.about.ContactTab.matrix = Matrix 94 | 95 | # ContributorsTab 96 | window.settings.about.ContributorsTab.team = Team 97 | window.settings.about.ContributorsTab.server = Server 98 | window.settings.about.ContributorsTab.client = Client 99 | window.settings.about.ContributorsTab.actionAPI = Action API 100 | window.settings.about.ContributorsTab.themeAPI = Theme API 101 | window.settings.about.ContributorsTab.util = Util 102 | 103 | # ================ 104 | 105 | 106 | # GeneralTab 107 | window.settings.GeneralTab.startOnBoot = Start On Boot 108 | window.settings.GeneralTab.screenSaver = Screen Saver 109 | window.settings.GeneralTab.oledBurnInProtector = OLED Burn-In Protector 110 | window.settings.GeneralTab.tryConnectToServerOnActionClick = Try connecting to server on action click 111 | window.settings.GeneralTab.fullScreen = Full Screen 112 | window.settings.GeneralTab.vibrateOnActionClick = Vibrate on Action Click 113 | window.settings.GeneralTab.connectOnStartup = Connect On Startup 114 | window.settings.GeneralTab.showCursor = Show Cursor 115 | window.settings.GeneralTab.invertGridOnRotate = Invert Grid on Rotate 116 | window.settings.GeneralTab.themes = Themes 117 | window.settings.GeneralTab.icons = Icons 118 | window.settings.GeneralTab.profiles = Profiles 119 | window.settings.GeneralTab.checkForUpdates = Check For Updates 120 | window.settings.GeneralTab.factoryReset = Factory Reset 121 | window.settings.GeneralTab.screenTimeoutInSeconds = Screen Timeout (seconds) 122 | window.settings.GeneralTab.save = Save 123 | window.settings.GeneralTab.connect = Connect 124 | window.settings.GeneralTab.exit = Exit 125 | window.settings.GeneralTab.shutdown = Shutdown 126 | window.settings.GeneralTab.connection = Connection 127 | window.settings.GeneralTab.client = Client 128 | window.settings.GeneralTab.currentProfile = Current Profile 129 | window.settings.GeneralTab.theme = Theme 130 | window.settings.GeneralTab.locations = Locations 131 | window.settings.GeneralTab.others = Others 132 | window.settings.GeneralTab.language = Language 133 | window.settings.GeneralTab.resetAreYouSure = Are you sure?\nThis will erase everything. 134 | window.settings.GeneralTab.disconnect = Disconnect 135 | window.settings.GeneralTab.screenTimeoutCannotBeBelow15Seconds = Screen Timeout cannot be below 15 seconds. 136 | window.settings.GeneralTab.screenTimeoutMustBeInteger = Screen Timeout must be integer. 137 | window.settings.GeneralTab.unableToDeleteStarterFile = Unable to delete starter file. 138 | window.settings.GeneralTab.vibrationNotSupported = Vibration not supported. 139 | window.settings.GeneralTab.restart = Restart 140 | window.settings.GeneralTab.failedToShutdown = Failed to shutdown!\n%s 141 | window.settings.GeneralTab.restartPromptWarning = Restart?\nAll your current connections will be disconnected. 142 | 143 | 144 | # SettingsBase 145 | window.settings.SettingsBase.settings = Settings 146 | window.settings.SettingsBase.about = About 147 | window.settings.SettingsBase.close = Close 148 | 149 | 150 | # ==================================== 151 | # base 152 | # ==================================== 153 | 154 | # Base 155 | window.Base.failedToAccessFileSystem = Failed to access file system! 156 | window.Base.defaultThemeCorrupt = Default theme (%s) is corrupt. \nPlease restore the theme or reinstall. 157 | window.Base.failedToLoadThemes = Failed to load themes.\n%s 158 | window.Base.revertedToDefaultTheme = Reverted to default theme (%s) 159 | 160 | 161 | # ==================================== 162 | # io 163 | # ==================================== 164 | 165 | # Config 166 | 167 | io.config.unableToReadConfig = Unable to read config.\n%s 168 | io.config.unableToSaveConfig = Unable to save config.\n%s 169 | 170 | 171 | # ==================================== 172 | # profile 173 | # ==================================== 174 | 175 | # ClientProfile 176 | profile.ClientProfile.failedToParseProfile = Failed to parse profile at %s.\n%s 177 | profile.ClientProfile.unableToCreateProfileFile = Unable to create profile file. 178 | profile.ClientProfile.duplicateProfileFileExists = Duplicate profile file with same name %s already exists. 179 | 180 | # ClientProfiles 181 | profile.ClientProfiles.profileFolderNotADirectoryOrDoesNotExist = Profile folder (%s) is not a directory or does not exist. 182 | profile.ClientProfiles.profileFoldersIsNull = Profile folder (%s) files are null. 183 | profile.ClientProfiles.defaultProfileBad = Default profile (%s) corrupt.\n%s 184 | 185 | 186 | # ==================================== 187 | # connection 188 | # ==================================== 189 | 190 | # Client 191 | connection.Client.failedToConnectToServer = Unable to connect to server. Please check settings and network and try again. 192 | connection.Client.failedToSetUpIOStreams = Failed to set up IO Streams.\n%s 193 | connection.Client.failedToWriteToIOStream = Failed to write to IO Stream.\n%s 194 | connection.Client.accidentallyDisconnectedFromServer = Accidentally disconnected from %s. 195 | connection.Client.disconnectedFromServer = Disconnected from %s. -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/i18n/lang_en_US.properties: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 4 | # Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | 16 | # Common 17 | 18 | windowTitle = Stream-Pi Client 19 | validationError = Please rectify the following errors and try again:\n%s 20 | nameCannotBeBlank = Name cannot be blank. 21 | serverHostNameOrIPCannotBeBlank = Server Hostname/IP cannot be blank. 22 | serverPortMustBeGreaterThan1024 = Server Port must be greater than 1024. 23 | serverPortMustBeLesserThan65535 = Server Port must be lesser than 65535. 24 | serverPortMustBeInteger = Server Port must be integer. 25 | serverHostNameOrIP = Server Host Name/IP 26 | serverPort = Server Port 27 | name = Name 28 | 29 | # ==================================== 30 | # controller 31 | # ==================================== 32 | 33 | # Controller 34 | controller.Controller.noBrowserDetected = No browser detected! 35 | controller.Controller.failedToStartBrowser = Failed to start browser!\n%s 36 | controller.Controller.browserNotSupportedInFBMode = Browser is not supported in framebuffer (Console mode)! 37 | controller.Controller.unableToDeleteStarterFile = Unable to delete the starter file. This happened probably because you ran Stream-Pi as root before. Restart stream pi as root, turn off Start On Boot, then exit and restart Stream-Pi as normal user. 38 | controller.Controller.factoryResetUnsuccessful = Unable to successfully factory reset. Please delete directory\n%s 39 | 40 | 41 | 42 | # ==================================== 43 | # actiongridpane 44 | # ==================================== 45 | 46 | # ActionGridPane 47 | actiongridpane.ActionGridPane.failedToRenderActions = Unable to render following actions:\n%s 48 | actiongridpane.ActionGridPane.actionOutOfBounds = Action (%s) (%s) is out of bounds. Consider increasing rows/columns of current profile and relocating/deleting it. 49 | 50 | 51 | # ==================================== 52 | # firsttimeuse 53 | # ==================================== 54 | 55 | # FinalConfigPane 56 | firsttimeuse.FinalConfigPane.subHeading = We're almost finished setting things up. All that's needed now is for you to enter in the following details and you'll be good to go! 57 | firsttimeuse.FinalConfigPane.securityWarning = Stream-Pi is not encrypted yet. Use this only in absolutely private networks. Do not use this in a public network (Railway Station, Park).\nStream-Pi project is not responsible if your computer is compromised because of connecting Stream-Pi to a malicious network. 58 | firsttimeuse.FinalConfigPane.confirm = Confirm 59 | 60 | # FirstTimeUse 61 | firsttimeuse.FirstTimeUse.next = Next 62 | firsttimeuse.FirstTimeUse.previous = Previous 63 | firsttimeuse.FirstTimeUse.licenseAgreement = License Agreement 64 | firsttimeuse.FirstTimeUse.agreeAndContinue = Agree and continue 65 | firsttimeuse.FirstTimeUse.finishingUp = Finishing Up ... 66 | 67 | # Welcome Pane 68 | firsttimeuse.WelcomePane.welcome = Welcome! 69 | 70 | 71 | # ==================================== 72 | # settings 73 | # ==================================== 74 | 75 | 76 | # ================ 77 | # about 78 | # ================ 79 | 80 | # About 81 | window.settings.about.About.licenseTabHeading = License 82 | window.settings.about.About.contributorsTabHeading = Contributors 83 | window.settings.about.About.contactTabHeading = Contact 84 | window.settings.about.About.serverCommunicationProtocolVersion = Communication Protocol %s 85 | window.settings.about.About.buildNumber = Build Number: %s 86 | window.settings.about.About.donate = DONATE 87 | 88 | # ContactTab 89 | window.settings.about.ContactTab.github = GitHub 90 | window.settings.about.ContactTab.discord = Discord 91 | window.settings.about.ContactTab.website = Website 92 | window.settings.about.ContactTab.twitter = Twitter 93 | window.settings.about.ContactTab.matrix = Matrix 94 | 95 | # ContributorsTab 96 | window.settings.about.ContributorsTab.team = Team 97 | window.settings.about.ContributorsTab.server = Server 98 | window.settings.about.ContributorsTab.client = Client 99 | window.settings.about.ContributorsTab.actionAPI = Action API 100 | window.settings.about.ContributorsTab.themeAPI = Theme API 101 | window.settings.about.ContributorsTab.util = Util 102 | 103 | # ================ 104 | 105 | 106 | # GeneralTab 107 | window.settings.GeneralTab.startOnBoot = Start On Boot 108 | window.settings.GeneralTab.screenSaver = Screen Saver 109 | window.settings.GeneralTab.oledBurnInProtector = OLED Burn-In Protector 110 | window.settings.GeneralTab.tryConnectToServerOnActionClick = Try connecting to server on action click 111 | window.settings.GeneralTab.fullScreen = Full Screen 112 | window.settings.GeneralTab.vibrateOnActionClick = Vibrate on Action Click 113 | window.settings.GeneralTab.connectOnStartup = Connect On Startup 114 | window.settings.GeneralTab.showCursor = Show Cursor 115 | window.settings.GeneralTab.invertGridOnRotate = Invert Grid on Rotate 116 | window.settings.GeneralTab.themes = Themes 117 | window.settings.GeneralTab.icons = Icons 118 | window.settings.GeneralTab.profiles = Profiles 119 | window.settings.GeneralTab.checkForUpdates = Check For Updates 120 | window.settings.GeneralTab.factoryReset = Factory Reset 121 | window.settings.GeneralTab.screenTimeoutInSeconds = Screen Timeout (seconds) 122 | window.settings.GeneralTab.save = Save 123 | window.settings.GeneralTab.connect = Connect 124 | window.settings.GeneralTab.exit = Exit 125 | window.settings.GeneralTab.shutdown = Shutdown 126 | window.settings.GeneralTab.connection = Connection 127 | window.settings.GeneralTab.client = Client 128 | window.settings.GeneralTab.currentProfile = Current Profile 129 | window.settings.GeneralTab.theme = Theme 130 | window.settings.GeneralTab.locations = Locations 131 | window.settings.GeneralTab.others = Others 132 | window.settings.GeneralTab.language = Language 133 | window.settings.GeneralTab.resetAreYouSure = Are you sure?\nThis will erase everything. 134 | window.settings.GeneralTab.disconnect = Disconnect 135 | window.settings.GeneralTab.screenTimeoutCannotBeBelow15Seconds = Screen Timeout cannot be below 15 seconds. 136 | window.settings.GeneralTab.screenTimeoutMustBeInteger = Screen Timeout must be integer. 137 | window.settings.GeneralTab.unableToDeleteStarterFile = Unable to delete starter file. 138 | window.settings.GeneralTab.vibrationNotSupported = Vibration not supported. 139 | window.settings.GeneralTab.restart = Restart 140 | window.settings.GeneralTab.failedToShutdown = Failed to shutdown!\n%s 141 | window.settings.GeneralTab.restartPromptWarning = Restart?\nAll your current connections will be disconnected. 142 | 143 | 144 | # SettingsBase 145 | window.settings.SettingsBase.settings = Settings 146 | window.settings.SettingsBase.about = About 147 | window.settings.SettingsBase.close = Close 148 | 149 | 150 | # ==================================== 151 | # base 152 | # ==================================== 153 | 154 | # Base 155 | window.Base.failedToAccessFileSystem = Failed to access file system! 156 | window.Base.defaultThemeCorrupt = Default theme (%s) is corrupt. \nPlease restore the theme or reinstall. 157 | window.Base.failedToLoadThemes = Failed to load themes.\n%s 158 | window.Base.revertedToDefaultTheme = Reverted to default theme (%s) 159 | 160 | 161 | # ==================================== 162 | # io 163 | # ==================================== 164 | 165 | # Config 166 | 167 | io.config.unableToReadConfig = Unable to read config.\n%s 168 | io.config.unableToSaveConfig = Unable to save config.\n%s 169 | 170 | 171 | # ==================================== 172 | # profile 173 | # ==================================== 174 | 175 | # ClientProfile 176 | profile.ClientProfile.failedToParseProfile = Failed to parse profile at %s.\n%s 177 | profile.ClientProfile.unableToCreateProfileFile = Unable to create profile file. 178 | profile.ClientProfile.duplicateProfileFileExists = Duplicate profile file with same name %s already exists. 179 | 180 | # ClientProfiles 181 | profile.ClientProfiles.profileFolderNotADirectoryOrDoesNotExist = Profile folder (%s) is not a directory or does not exist. 182 | profile.ClientProfiles.profileFoldersIsNull = Profile folder (%s) files are null. 183 | profile.ClientProfiles.defaultProfileBad = Default profile (%s) corrupt.\n%s 184 | 185 | 186 | # ==================================== 187 | # connection 188 | # ==================================== 189 | 190 | # Client 191 | connection.Client.failedToConnectToServer = Unable to connect to server. Please check settings and network and try again. 192 | connection.Client.failedToSetUpIOStreams = Failed to set up IO Streams.\n%s 193 | connection.Client.failedToWriteToIOStream = Failed to write to IO Stream.\n%s 194 | connection.Client.accidentallyDisconnectedFromServer = Accidentally disconnected from %s. 195 | connection.Client.disconnectedFromServer = Disconnected from %s. -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/i18n/lang_hi.properties: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 4 | # Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | 16 | # Common 17 | 18 | windowTitle = Stream-Pi क्लाइंट 19 | validationError = निम्नलिखित गलतियों को ठीक करके फिर से कोशिश करे:\n%s 20 | nameCannotBeBlank = नाम खली नहीं हो सकता है। 21 | serverHostNameOrIPCannotBeBlank = सर्वर होस्टनेम/IP खली नहीं हो सकता है। 22 | serverPortMustBeGreaterThan1024 = सर्वर पोर्ट 1024 से ज़्यादा होना चाहिए। 23 | serverPortMustBeLesserThan65535 = सर्वर पोर्ट 65535 से कम होना चाहिए। 24 | serverPortMustBeInteger = सर्वर पोर्ट का मूल्य पूर्णांक होना चाहिए। 25 | serverHostNameOrIP = सर्वर होस्टनेम/IP 26 | serverPort = सर्वर पोर्ट 27 | name = नाम 28 | 29 | # ==================================== 30 | # controller 31 | # ==================================== 32 | 33 | # Controller 34 | controller.Controller.noBrowserDetected = कोई ब्राउज़र नहीं मिला! 35 | controller.Controller.failedToStartBrowser = ब्राउज़र चालू नहीं किया जा सका!\n%s 36 | controller.Controller.browserNotSupportedInFBMode = फ्रेमबफर (कंसोल मोड) में ब्राउज़र समर्थित नहीं है! 37 | controller.Controller.unableToDeleteStarterFile = स्टार्टर फाइल डिलीट नहीं किया जा सका। ये हुआ क्युकी आप Stream-Pi को रुट प्रिविलेज से चलाये हो। कृपया Stream-Pi को रुट प्रिविलेज सहित रीस्टार्ट करें, बूट पे चालु फीचर को बंद करें, और Stream-Pi को नार्मल प्रिविलेज सहित स्टार्ट करें। 38 | controller.Controller.factoryResetUnsuccessful = पूरी तरह से फैक्ट्री रिसेट नहीं किया जा सका। कृपया %s फोल्डर को डिलीट करें।\n%s 39 | 40 | 41 | 42 | # ==================================== 43 | # actiongridpane 44 | # ==================================== 45 | 46 | # ActionGridPane 47 | actiongridpane.ActionGridPane.failedToRenderActions = निम्नलिखित एक्शन्स को रेंडर नहीं किया जा सका:\n%s 48 | actiongridpane.ActionGridPane.actionOutOfBounds = एक्शन (%s) (%s) बॉन्ड्स के बाहर है। कृपया वर्तमान प्रोफाइल के रौस या कलुमंस को बराये और एक्शन को दूसरा जगह ले जाये या मिटा दे। 49 | 50 | 51 | # ==================================== 52 | # firsttimeuse 53 | # ==================================== 54 | 55 | # FinalConfigPane 56 | firsttimeuse.FinalConfigPane.subHeading = थोड़ा सा और आवश्यक जानकारी दीजिये और Stream-Pi के मज़े लीजिए। 57 | firsttimeuse.FinalConfigPane.securityWarning = Stream-Pi अभी के लिए एन्क्रिप्टेड नहीं है। इसका इस्तमाल केवल अपने प्राइवेट क्या भरोसेमंद नेटवर्क्स में ही करे।\nयदि आपके कंप्यूटर को कुछ हो गया तो इसमें Stream-Pi प्रोजेक्ट जिम्मेदार नहीं है। 58 | firsttimeuse.FinalConfigPane.confirm = कन्फर्म 59 | 60 | # FirstTimeUse 61 | firsttimeuse.FirstTimeUse.next = अगला 62 | firsttimeuse.FirstTimeUse.previous = पिछला 63 | firsttimeuse.FirstTimeUse.licenseAgreement = लाइसेंस एग्रीमेंट 64 | firsttimeuse.FirstTimeUse.agreeAndContinue = माने और आगे बढ़े 65 | firsttimeuse.FirstTimeUse.finishingUp = और थोड़ा सा ... 66 | 67 | # Welcome Pane 68 | firsttimeuse.WelcomePane.welcome = नमस्ते! 69 | 70 | 71 | # ==================================== 72 | # settings 73 | # ==================================== 74 | 75 | 76 | # ================ 77 | # about 78 | # ================ 79 | 80 | # About 81 | window.settings.about.About.licenseTabHeading = लाइसेंस 82 | window.settings.about.About.contributorsTabHeading = कंट्रीब्युटर्स 83 | window.settings.about.About.contactTabHeading = संपर्क 84 | window.settings.about.About.serverCommunicationProtocolVersion = Comm स्टैण्डर्ड %s 85 | window.settings.about.About.buildNumber = निर्माण संख्या: %s 86 | window.settings.about.About.donate = दान करे 87 | 88 | # ContactTab 89 | window.settings.about.ContactTab.github = GitHub 90 | window.settings.about.ContactTab.discord = Discord 91 | window.settings.about.ContactTab.website = Website 92 | window.settings.about.ContactTab.twitter = Twitter 93 | window.settings.about.ContactTab.matrix = Matrix 94 | 95 | # ContributorsTab 96 | window.settings.about.ContributorsTab.team = टीम 97 | window.settings.about.ContributorsTab.server = सर्वर 98 | window.settings.about.ContributorsTab.client = क्लाइंट 99 | window.settings.about.ContributorsTab.actionAPI = Action API 100 | window.settings.about.ContributorsTab.themeAPI = Theme API 101 | window.settings.about.ContributorsTab.util = Util 102 | 103 | # ================ 104 | 105 | 106 | # GeneralTab 107 | window.settings.GeneralTab.startOnBoot = बूट पे स्टार्ट करे 108 | window.settings.GeneralTab.screenSaver = स्क्रीन सवेर 109 | window.settings.GeneralTab.oledBurnInProtector = OLED बर्न-इन रक्षक 110 | window.settings.GeneralTab.tryConnectToServerOnActionClick = एक्शन क्लिक करने पर सर्वर को कनेक्ट करने का कोशिश करे 111 | window.settings.GeneralTab.fullScreen = फुल स्क्रीन 112 | window.settings.GeneralTab.vibrateOnActionClick = एक्शन क्लिक करने पर वाइब्रेट करे 113 | window.settings.GeneralTab.connectOnStartup = स्टार्ट करने पर कनेक्ट करे 114 | window.settings.GeneralTab.showCursor = कर्सर दिखाए 115 | window.settings.GeneralTab.invertGridOnRotate = रोटेट करने पर ग्रिड रोटेट करे 116 | window.settings.GeneralTab.themes = थीम्स 117 | window.settings.GeneralTab.icons = आइकन्स 118 | window.settings.GeneralTab.profiles = प्रोफाइल्स 119 | window.settings.GeneralTab.checkForUpdates = उपडेट्स ढूंढे 120 | window.settings.GeneralTab.factoryReset = फैक्ट्री रिसेट 121 | window.settings.GeneralTab.screenTimeoutInSeconds = स्क्रीन टाइमआउट (सेकण्ड्स) 122 | window.settings.GeneralTab.save = सहेजें 123 | window.settings.GeneralTab.connect = कनेक्ट 124 | window.settings.GeneralTab.exit = निकास 125 | window.settings.GeneralTab.shutdown = शटडाउन 126 | window.settings.GeneralTab.connection = कनेक्शन 127 | window.settings.GeneralTab.client = क्लाइंट 128 | window.settings.GeneralTab.currentProfile = वर्तमान प्रोफाइल 129 | window.settings.GeneralTab.theme = थीम 130 | window.settings.GeneralTab.locations = लोकेशंस 131 | window.settings.GeneralTab.others = अन्य चीज़े 132 | window.settings.GeneralTab.language = भाषा 133 | window.settings.GeneralTab.resetAreYouSure = क्या आपको यकीन है?\nसब कुछ मिट जाएगा। 134 | window.settings.GeneralTab.disconnect = डिसकनेक्ट 135 | window.settings.GeneralTab.screenTimeoutCannotBeBelow15Seconds = स्क्रीन टाइमआउट 15 सेकंड से निचे नहीं हो सकता है। 136 | window.settings.GeneralTab.screenTimeoutMustBeInteger = स्क्रीन टाइमआउट का मूल्य पूर्णांक होना चाहिए। 137 | window.settings.GeneralTab.unableToDeleteStarterFile = स्टार्टर फाइल डिलीट नहीं किया जा सका। 138 | window.settings.GeneralTab.vibrationNotSupported = वाइब्रेशन सपोर्टेड नहीं है। 139 | window.settings.GeneralTab.restart = रीस्टार्ट 140 | window.settings.GeneralTab.failedToShutdown = शटडाउन विफल!\n%s 141 | window.settings.GeneralTab.restartPromptWarning = रीस्टार्ट करे ?\nइससे सारा क्लाइंट्स डिसकनेक्टे हो जायेगा। 142 | 143 | 144 | # SettingsBase 145 | window.settings.SettingsBase.settings = सेटिंग्स 146 | window.settings.SettingsBase.about = बारे में 147 | window.settings.SettingsBase.close = बंद करे 148 | 149 | 150 | # ==================================== 151 | # base 152 | # ==================================== 153 | 154 | # Base 155 | window.Base.failedToAccessFileSystem = फाइल सिस्टम एक्सेस नहीं किया जा सका! 156 | window.Base.defaultThemeCorrupt = डिफ़ॉल्ट थीम (%s) कोर्रुप्त है। कृपया थीम को रिस्टोर करे या रीइंस्टॉल करे। 157 | window.Base.failedToLoadThemes = कुछ थीम्स लोड नहीं किया जा सका.।\n%s 158 | window.Base.revertedToDefaultTheme = डिफ़ॉल्ट थीम (%s) सेट किया गया। 159 | 160 | 161 | # ==================================== 162 | # io 163 | # ==================================== 164 | 165 | # Config 166 | 167 | io.config.unableToReadConfig = कॉन्फिग रीड नहीं किया जा सका।\n%s 168 | io.config.unableToSaveConfig = कॉन्फिग सेव नहीं किया जा सका।\n%s 169 | 170 | 171 | # ==================================== 172 | # profile 173 | # ==================================== 174 | 175 | # ClientProfile 176 | profile.ClientProfile.failedToParseProfile = प्रोफाइल %s पार्स नहीं किया जा सका।\n%s 177 | profile.ClientProfile.unableToCreateProfileFile = प्रोफाइल फाइल बनाया नहीं जा सका। 178 | profile.ClientProfile.duplicateProfileFileExists = एक ही नाम (%s) का प्रोफाइल पहले से ही मौजूद है। 179 | 180 | # ClientProfiles 181 | profile.ClientProfiles.profileFolderNotADirectoryOrDoesNotExist = प्रोफाइल फोल्डर (%s) एक फोल्डर नहीं है या फिर मौजूद नहीं है। 182 | profile.ClientProfiles.profileFoldersIsNull = प्रोफाइल फोल्डर (%s) का फाइल्स null है। 183 | profile.ClientProfiles.defaultProfileBad = डिफ़ॉल्ट प्रोफाइल (%s) कोर्रुप्त है।\n%s 184 | 185 | 186 | # ==================================== 187 | # connection 188 | # ==================================== 189 | 190 | # Client 191 | connection.Client.failedToConnectToServer = सर्वर से कनेक्ट नहीं किया जा सका। कृपया सेटिंग और नेटवर्क चेक करके फिर से कोशिश करे। 192 | connection.Client.failedToSetUpIOStreams = IO स्ट्रीम्स का निर्माण नहीं किया जा सका।\n%s 193 | connection.Client.failedToWriteToIOStream = IO स्ट्रीम में लिखा नहीं जा सका।\n%s 194 | connection.Client.accidentallyDisconnectedFromServer = अचानक से %s से डिसकनेक्ट किया गया। 195 | connection.Client.disconnectedFromServer = %s से डिसकनेक्ट किया गया। -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/i18n/lang_it.properties: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 4 | # Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | 16 | # Common 17 | 18 | windowTitle = Stream-Pi Client 19 | validationError = Per favore sistema i seguenti errori e riprova:\n%s 20 | nameCannotBeBlank = Non può essere vuoto. 21 | serverHostNameOrIPCannotBeBlank = Server Hostname/IP non può essere vuoto. 22 | serverPortMustBeGreaterThan1024 = Server Port deve essere superiore a 1024. 23 | serverPortMustBeLesserThan65535 = Server Port deve essere inferiore a 65535. 24 | serverPortMustBeInteger = Server Port deve essere un intero. 25 | serverHostNameOrIP = Server Host Name/IP 26 | serverPort = Server Port 27 | name = Name 28 | 29 | # ==================================== 30 | # controller 31 | # ==================================== 32 | 33 | # Controller 34 | controller.Controller.noBrowserDetected = Nessun browser rilevato! 35 | controller.Controller.failedToStartBrowser = Non sono riuscito ad avviare il browser!\n%s 36 | controller.Controller.browserNotSupportedInFBMode = Browser non supportato in framebuffer (modalità Console)! 37 | controller.Controller.unableToDeleteStarterFile = Impossibile cancellare il file di avvio. Questo è dovuto probabilmente ad un precedente avvio come root. Riavvia stream pi come root, disattiva Start On Boot, poi esci e riavvia Stream-Pi come utente normale. 38 | controller.Controller.factoryResetUnsuccessful = Impossibile resettare alle impostazioni di fabbrica. Per favore cancella la cartella\n%s 39 | 40 | 41 | 42 | # ==================================== 43 | # actiongridpane 44 | # ==================================== 45 | 46 | # ActionGridPane 47 | actiongridpane.ActionGridPane.failedToRenderActions = Impossibile renderizzare le seguenti azioni:\n%s 48 | actiongridpane.ActionGridPane.actionOutOfBounds = Azione (%s) (%s) è fuori dai limiti. Valuta l'incremento di righe/colonne del profilo corrente o riallocarla/cancellarla. 49 | 50 | 51 | # ==================================== 52 | # firsttimeuse 53 | # ==================================== 54 | 55 | # FinalConfigPane 56 | firsttimeuse.FinalConfigPane.subHeading = Abbiamo quasi finito di configurare. Quello che manca è solo inserire i seguenti dettagli e sei pronto ad iniziare! 57 | firsttimeuse.FinalConfigPane.securityWarning = Stream-Pi non è ancora crittografato. Usalo solo in reti assolutamente private. Non utilizzarlo in una rete pubblica (stazione ferroviaria, parco).\nIl progetto Stream-Pi non è responsabile se il tuo computer è compromesso a causa della connessione di Stream-Pi a una rete dannosa. 58 | firsttimeuse.FinalConfigPane.confirm = Conferma 59 | 60 | # FirstTimeUse 61 | firsttimeuse.FirstTimeUse.next = Prossimo 62 | firsttimeuse.FirstTimeUse.previous = Precedente 63 | firsttimeuse.FirstTimeUse.licenseAgreement = Contratto di licenza 64 | firsttimeuse.FirstTimeUse.agreeAndContinue = Accetta e continua 65 | firsttimeuse.FirstTimeUse.finishingUp = Finendo ... 66 | 67 | # Welcome Pane 68 | firsttimeuse.WelcomePane.welcome = Benvenuto! 69 | 70 | 71 | # ==================================== 72 | # settings 73 | # ==================================== 74 | 75 | 76 | # ================ 77 | # about 78 | # ================ 79 | 80 | # About 81 | window.settings.about.About.licenseTabHeading = Licenza 82 | window.settings.about.About.contributorsTabHeading = Contributori 83 | window.settings.about.About.contactTabHeading = Contatti 84 | window.settings.about.About.serverCommunicationProtocolVersion = Protocollo di comunicazione %s 85 | window.settings.about.About.buildNumber = Numero di build: %s 86 | window.settings.about.About.donate = DONA 87 | 88 | # ContactTab 89 | window.settings.about.ContactTab.github = GitHub 90 | window.settings.about.ContactTab.discord = Discord 91 | window.settings.about.ContactTab.website = Website 92 | window.settings.about.ContactTab.twitter = Twitter 93 | window.settings.about.ContactTab.matrix = Matrix 94 | 95 | # ContributorsTab 96 | window.settings.about.ContributorsTab.team = Team 97 | window.settings.about.ContributorsTab.server = Server 98 | window.settings.about.ContributorsTab.client = Client 99 | window.settings.about.ContributorsTab.actionAPI = Action API 100 | window.settings.about.ContributorsTab.themeAPI = Theme API 101 | window.settings.about.ContributorsTab.util = Util 102 | 103 | # ================ 104 | 105 | 106 | # GeneralTab 107 | window.settings.GeneralTab.startOnBoot = Avviare al Boot 108 | window.settings.GeneralTab.screenSaver = Screen Saver 109 | window.settings.GeneralTab.oledBurnInProtector = Pretezione bruciature OLED 110 | window.settings.GeneralTab.tryConnectToServerOnActionClick = Prova collegarti al server al click su azione 111 | window.settings.GeneralTab.fullScreen = Schermo pieno 112 | window.settings.GeneralTab.vibrateOnActionClick = Vibra al Click Azione 113 | window.settings.GeneralTab.connectOnStartup = Connetti all'avvio 114 | window.settings.GeneralTab.showCursor = Visualizza Cursore 115 | window.settings.GeneralTab.invertGridOnRotate = Inverti Griglia su Ruota 116 | window.settings.GeneralTab.themes = Temi 117 | window.settings.GeneralTab.icons = Icone 118 | window.settings.GeneralTab.profiles = Profili 119 | window.settings.GeneralTab.checkForUpdates = Verifica Aggiornamenti 120 | window.settings.GeneralTab.factoryReset = Impostazioni di fabbrica 121 | window.settings.GeneralTab.screenTimeoutInSeconds = Timeout Schermo (secondi) 122 | window.settings.GeneralTab.save = Salva 123 | window.settings.GeneralTab.connect = Collegati 124 | window.settings.GeneralTab.exit = Esci 125 | window.settings.GeneralTab.shutdown = Spegni 126 | window.settings.GeneralTab.connection = Connessione 127 | window.settings.GeneralTab.client = Client 128 | window.settings.GeneralTab.currentProfile = Profilo Corrente 129 | window.settings.GeneralTab.theme = Tema 130 | window.settings.GeneralTab.locations = Posizioni 131 | window.settings.GeneralTab.others = Altri 132 | window.settings.GeneralTab.language = Linguaggio 133 | window.settings.GeneralTab.resetAreYouSure = Sei sicuro?\nQuesto eliminerà tutto. 134 | window.settings.GeneralTab.disconnect = Disconnetti 135 | window.settings.GeneralTab.screenTimeoutCannotBeBelow15Seconds = Timeout dello Schermo non può essere inferiore a 15 secondi. 136 | window.settings.GeneralTab.screenTimeoutMustBeInteger = Timeout dello Schermo deve essere un intero. 137 | window.settings.GeneralTab.unableToDeleteStarterFile = Impossibile eliminare file di avvio. 138 | window.settings.GeneralTab.vibrationNotSupported = Vibrazione non supportata. 139 | window.settings.GeneralTab.restart = Riavvia 140 | window.settings.GeneralTab.failedToShutdown = Spegnimento non riuscito!\n%s 141 | window.settings.GeneralTab.restartPromptWarning = Riavviare?\nTutte le connessioni attive saranno disconnesse. 142 | 143 | 144 | # SettingsBase 145 | window.settings.SettingsBase.settings = Impostazioni 146 | window.settings.SettingsBase.about = Informazioni 147 | window.settings.SettingsBase.close = Chiudi 148 | 149 | 150 | # ==================================== 151 | # base 152 | # ==================================== 153 | 154 | # Base 155 | window.Base.failedToAccessFileSystem = Impossibile accedere al file system! 156 | window.Base.defaultThemeCorrupt = Il tema di default (%s) è corrotto. \nPer favore ripristina il tema o reinstalla. 157 | window.Base.failedToLoadThemes = Impossibile caricare i Temi.\n%s 158 | window.Base.revertedToDefaultTheme = Reimposta il Tema di Default (%s) 159 | 160 | 161 | # ==================================== 162 | # io 163 | # ==================================== 164 | 165 | # Config 166 | 167 | io.config.unableToReadConfig = Impossibile leggere la configurazione.\n%s 168 | io.config.unableToSaveConfig = Impossibile salvare la configurazione.\n%s 169 | 170 | 171 | # ==================================== 172 | # profile 173 | # ==================================== 174 | 175 | # ClientProfile 176 | profile.ClientProfile.failedToParseProfile = Impossibile analizzare il profilo in %s.\n%s 177 | profile.ClientProfile.unableToCreateProfileFile = Impossibile creare il file del profilo. 178 | profile.ClientProfile.duplicateProfileFileExists = Esiste già un file di profilo duplicato con lo stesso nome %s. 179 | 180 | # ClientProfiles 181 | profile.ClientProfiles.profileFolderNotADirectoryOrDoesNotExist = La cartella del profilo (%s) non è una directory o non esiste. 182 | profile.ClientProfiles.profileFoldersIsNull = I file della cartella del profilo (%s) sono nulli. 183 | profile.ClientProfiles.defaultProfileBad = Profilo predefinito (%s) danneggiato.\n%s 184 | 185 | 186 | # ==================================== 187 | # connection 188 | # ==================================== 189 | 190 | # Client 191 | connection.Client.failedToConnectToServer = Impossibile stabilire una connessione al server. Controlla le impostazioni e la rete e riprova. 192 | connection.Client.failedToSetUpIOStreams = Impossibile configurare IO Streams.\n%s 193 | connection.Client.failedToWriteToIOStream = Impossibile scrivere su IO Stream.\n%s 194 | connection.Client.accidentallyDisconnectedFromServer = Disconnesso accidentalmente da %s. 195 | connection.Client.disconnectedFromServer = Disconnesso da %s. -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/i18n/lang_mr.properties: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 4 | # Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | 16 | # Common 17 | 18 | windowTitle = Stream-Pi क्लाइंट 19 | validationError = कृपया निम्नलिखित त्रुटियों को सुधारें और पुनः प्रयास करें:\n%s 20 | nameCannotBeBlank = नाम खाली नहीं हो सकता 21 | serverHostNameOrIPCannotBeBlank = सर्वर होस्टनाम/आईपी खाली नहीं हो सकता 22 | serverPortMustBeGreaterThan1024 = सर्वर पोर्ट 1024 से बड़ा होना चाहिए 23 | serverPortMustBeLesserThan65535 = सर्वर पोर्ट 65535 से कम होना चाहिए 24 | serverPortMustBeInteger = सर्वर पोर्ट पूर्णांक होना चाहिए 25 | serverHostNameOrIP = सर्वर होस्टनाम/आईपी 26 | serverPort = सर्वर पोर्ट 27 | name = नाम 28 | 29 | # ==================================== 30 | # controller 31 | # ==================================== 32 | 33 | # Controller 34 | controller.Controller.noBrowserDetected = ब्राउझर सुरू करण्यात अयशस्वी! 35 | controller.Controller.failedToStartBrowser = ब्राउझर सुरू करण्यात अयशस्वी!\n%s 36 | controller.Controller.browserNotSupportedInFBMode = ब्राउझर फ्रेमबफर (कन्सोल मोड) मध्ये समर्थित नाही! 37 | controller.Controller.unableToDeleteStarterFile = स्टार्टर फाइल हटवण्यात अक्षम। हे कदाचित घडले कारण तुम्ही आधी Stream-Pi रूट म्हणून चालवला होता। रूट म्हणून Stream-Pi रीस्टार्ट करा, स्टार्ट ऑन बूट बंद करा, नंतर बाहेर पडा आणि सामान्य वापरकर्ता म्हणून स्ट्रीम-पी रीस्टार्ट करा। 38 | controller.Controller.factoryResetUnsuccessful = यशस्वीरित्या फॅक्टरी रीसेट करण्यात अक्षम. कृपया निर्देशिका हटवा\n%s 39 | 40 | 41 | #==================================== 42 | # actiongridpane 43 | #==================================== 44 | 45 | # ActionGridPane 46 | actiongridpane.ActionGridPane.failedToRenderActions = निम्नलिखित क्रियाओं को प्रस्तुत करने में असमर्थ:\n%s 47 | actiongridpane.ActionGridPane.actionOutOfBounds = कार्रवाई (%s) (%s) सीमा से बाहर हो जाती है। वर्तमान प्रोफ़ाइल की पंक्तियों/स्तंभों को बढ़ाने और इसे स्थानांतरित/हटाने पर विचार करें। 48 | 49 | 50 | #==================================== 51 | # firsttimeuse 52 | #==================================== 53 | 54 | # FinalConfigPane 55 | firsttimeuse.FinalConfigPane.subHeading = हमने चीजों को सेट करना लगभग पूरा कर लिया है। अब आपको केवल निम्नलिखित विवरण दर्ज करने की आवश्यकता है और फिर आप आगे बढ़ सकते हैं! 56 | firsttimeuse.FinalConfigPane.securityWarning = Stream-Pi अभी एन्क्रिप्टेड नहीं है। इसका उपयोग केवल पूर्ण रूप से निजी नेटवर्क में करें। किसी सार्वजनिक नेटवर्क (रेलवे स्टेशन, पार्क) में इसका उपयोग न करें।\nयदि Stream-Pi को किसी दुर्भावनापूर्ण नेटवर्क से जोड़ने के कारण आपके कंप्यूटर से छेड़छाड़ की जाती है तो Stream-Pi परियोजना जिम्मेदार नहीं है। 57 | firsttimeuse.FinalConfigPane.confirm = पुष्टि करें 58 | 59 | # FirstTimeUse 60 | firsttimeuse.FirstTimeUse.next = अगला 61 | firsttimeuse.FirstTimeUse.previous = पिछला 62 | firsttimeuse.FirstTimeUse.licenseAgreement = अनुज्ञा समझौता 63 | firsttimeuse.FirstTimeUse.agreeAndContinue = स्वीकार करें एवं आगे बढ़ें 64 | firsttimeuse.FirstTimeUse.finishingUp = खत्म कर रहे है ... 65 | 66 | # Welcome Pane 67 | firsttimeuse.WelcomePane.welcome = आपका स्वागत है! 68 | 69 | 70 | #==================================== 71 | # settings 72 | #==================================== 73 | 74 | 75 | #================ 76 | # about 77 | #================ 78 | 79 | # About 80 | window.settings.about.About.licenseTabHeading = अनुज्ञाप‍त्र 81 | window.settings.about.About.contributorsTabHeading = योगदानकर्ता 82 | window.settings.about.About.contactTabHeading = संपर्क 83 | window.settings.about.About.serverCommunicationProtocolVersion = संचार मानक %s 84 | window.settings.about.About.buildNumber = निर्माण संख्या: %s 85 | window.settings.about.About.donate = दान 86 | 87 | # ContactTab 88 | window.settings.about.ContactTab.github = गिटहब 89 | window.settings.about.ContactTab.discord = डिसकॉर्ड 90 | window.settings.about.ContactTab.website = वेबसाइट 91 | window.settings.about.ContactTab.twitter = ट्विटर 92 | window.settings.about.ContactTab.matrix = मैट्रिक्स 93 | 94 | # ContributorsTab 95 | window.settings.about.ContributorsTab.team = समूह 96 | window.settings.about.ContributorsTab.server = सर्वर 97 | window.settings.about.ContributorsTab.client = ग्राहक 98 | window.settings.about.ContributorsTab.actionAPI = एक्शन एपीआई 99 | window.settings.about.ContributorsTab.themeAPI = थीम एपीआई 100 | window.settings.about.ContributorsTab.util = उपयोगिता 101 | 102 | #================ 103 | 104 | 105 | # GeneralTab 106 | window.settings.GeneralTab.startOnBoot = बूट पर शुरूआत 107 | window.settings.GeneralTab.screenSaver = स्क्रीन सेवर 108 | window.settings.GeneralTab.oledBurnInProtector = ओलेड बर्न-इन प्रोटेक्टर 109 | window.settings.GeneralTab.tryConnectToServerOnActionClick = क्रिया क्लिक पर सर्वर से कनेक्ट करने का प्रयास करें 110 | window.settings.GeneralTab.fullScreen = पूर्ण स्क्रीन 111 | window.settings.GeneralTab.vibrateOnActionClick = एक्शन क्लिक पर कंपन करें 112 | window.settings.GeneralTab.connectOnStartup = स्टार्टअप पर कनेक्ट करें 113 | window.settings.GeneralTab.showCursor = कर्सर दिखाएं 114 | window.settings.GeneralTab.invertGridOnRotate = घुमाने पर ग्रिड को उल्टा करें 115 | window.settings.GeneralTab.themes = थीम 116 | window.settings.GeneralTab.icons = प्रतीक 117 | window.settings.GeneralTab.profiles = प्रोफाइल 118 | window.settings.GeneralTab.checkForUpdates = अद्यतन के लिए जाँच 119 | window.settings.GeneralTab.factoryReset = नए यंत्र जैसी सेटिंग 120 | window.settings.GeneralTab.screenTimeoutInSeconds = स्क्रीन मध्यांतर (सेकंड्‌स) 121 | window.settings.GeneralTab.save = सहेजें 122 | window.settings.GeneralTab.connect = जोड़ना 123 | window.settings.GeneralTab.exit = निकास 124 | window.settings.GeneralTab.shutdown = समाप्ति 125 | window.settings.GeneralTab.connection = संपर्क 126 | window.settings.GeneralTab.client = ग्राहक 127 | window.settings.GeneralTab.currentProfile = वर्तमान प्रोफ़ाइल 128 | window.settings.GeneralTab.theme = थीम 129 | window.settings.GeneralTab.locations = स्थान 130 | window.settings.GeneralTab.others = अन्य 131 | window.settings.GeneralTab.language = भाषा 132 | window.settings.GeneralTab.resetAreYouSure = क्या आप निश्चित हैं?\nइससे सब कुछ मिट जाएगा. 133 | window.settings.GeneralTab.disconnect = डिस्कनेक्ट 134 | window.settings.GeneralTab.screenTimeoutCannotBeBelow15Seconds = स्क्रीन टाइमआउट 15 सेकंड से कम नहीं हो सकता। 135 | window.settings.GeneralTab.screenTimeoutMustBeInteger = स्क्रीन टाइमआउट पूर्णांक होना चाहिए। 136 | window.settings.GeneralTab.unableToDeleteStarterFile = स्टार्टर फ़ाइल को हटाने में असमर्थ। 137 | window.settings.GeneralTab.vibrationNotSupported = कंपन समर्थित नहीं है। 138 | window.settings.GeneralTab.restart = रीस्टार्ट 139 | window.settings.GeneralTab.failedToShutdown = बंद करण्यात अयशस्वी!\n%s 140 | window.settings.GeneralTab.restartPromptWarning = रीस्टार्ट करायचे?\nतुमची सर्व वर्तमान कनेक्शन डिस्कनेक्ट केली जातील. 141 | 142 | 143 | # SettingsBase 144 | window.settings.SettingsBase.settings = समायोजन 145 | window.settings.SettingsBase.about = बारे में 146 | window.settings.SettingsBase.close = बंद करे 147 | 148 | 149 | # ==================================== 150 | # base 151 | # ==================================== 152 | 153 | # Base 154 | window.Base.failedToAccessFileSystem = फ़ाइल सिस्टम तक पहुँचने में विफल! 155 | window.Base.defaultThemeCorrupt = डिफ़ॉल्ट थीम प्राप्त करने में असमर्थ (%s)।\nकृपया थीम को पुनर्स्थापित करें. 156 | window.Base.failedToLoadThemes = थीम लोड करने की समस्या।\n%s 157 | window.Base.revertedToDefaultTheme = डिफ़ॉल्ट थीम पर वापस लाया गया (%s) 158 | 159 | 160 | # ==================================== 161 | # io 162 | # ==================================== 163 | 164 | # Config 165 | 166 | io.config.unableToReadConfig = कॉन्फिग पढ़ने में असमर्थ। \n%s 167 | io.config.unableToSaveConfig = कॉन्फिग को सेव करने में असमर्थ। \n%s 168 | 169 | 170 | # ==================================== 171 | # profile 172 | # ==================================== 173 | 174 | # ClientProfile 175 | profile.ClientProfile.failedToParseProfile = प्रोफ़ाइल पार्स करने में विफल %s.\n%s 176 | profile.ClientProfile.unableToCreateProfileFile = प्रोफाइल फाइल तयार करण्यात अक्षम. 177 | profile.ClientProfile.duplicateProfileFileExists = %s नावाची डुप्लिकेट प्रोफाइल फाइल आधीपासूनच अस्तित्वात आहे. 178 | 179 | # ClientProfiles 180 | profile.ClientProfiles.profileFolderNotADirectoryOrDoesNotExist = प्रोफ़ाइल फ़ोल्डर (%s) निर्देशिका नहीं है या मौजूद नहीं है. 181 | profile.ClientProfiles.profileFoldersIsNull = प्रोफ़ाइल फ़ोल्डर (%s) फ़ाइलें रिक्त हैं. 182 | profile.ClientProfiles.defaultProfileBad = डिफ़ॉल्ट प्रोफ़ाइल (%s) दूषित हैं. \n%s 183 | 184 | 185 | # ==================================== 186 | # connection 187 | # ==================================== 188 | 189 | # Client 190 | connection.Client.failedToConnectToServer = सर्वर से कनेक्ट करने में असमर्थ है। कृपया सेटिंग्स और कनेक्शन जांचें और पुनः प्रयास करें। 191 | connection.Client.failedToSetUpIOStreams = आईओ स्ट्रीम सेट करने में विफल। कनेक्शन जांचें और पुन: प्रयास करें। \n%s 192 | connection.Client.failedToWriteToIOStream = आईओ स्ट्रीम को लिखने में विफल.\n%s 193 | connection.Client.accidentallyDisconnectedFromServer = %s से गलती से डिस्कनेक्ट हो गया। 194 | connection.Client.disconnectedFromServer = %s से डिस्कनेक्ट किया गया। -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/icons/16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/main/resources/com/stream_pi/client/icons/16x16.png -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/icons/24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/main/resources/com/stream_pi/client/icons/24x24.png -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/icons/256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/main/resources/com/stream_pi/client/icons/256x256.png -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/main/resources/com/stream_pi/client/icons/32x32.png -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/icons/48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stream-pi/client/29119dda22bbac8d25b78a67151ea31f6b71e62c/src/main/resources/com/stream_pi/client/icons/48x48.png -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/info/LICENSE: -------------------------------------------------------------------------------- 1 | Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 2 | Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | This program is distributed in the hope that it will be useful, 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | GNU General Public License for more details. 12 | 13 | 14 | Opensource Libraries/Technology used in Stream-Pi Client: 15 | 16 | 1. JavaFX - GNU General Public License with Classpath Exception 17 | https://openjdk.java.net/legal/gplv2+ce.html 18 | 19 | 2. Ikonli - Apache License 20 | https://github.com/kordamp/ikonli/blob/master/LICENSE 21 | 22 | 3. ControlsFX - BSD 3-Clause License 23 | https://github.com/controlsfx/controlsfx/blob/jfx-13/license.txt 24 | 25 | 4. Medusa - Apache License 2.0 26 | https://github.com/HanSolo/medusa/blob/master/LICENSE 27 | 28 | 5. Gluon Attach - GPL License 29 | https://github.com/gluonhq/attach/blob/master/LICENSE 30 | 31 | 6. Gluon Client Maven Plugin - BSD-3 License 32 | https://github.com/gluonhq/client-maven-plugin/blob/master/LICENSE -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/info/build.properties: -------------------------------------------------------------------------------- 1 | #maven.buildNumber.plugin properties file 2 | #Tue Dec 27 13:54:06 IST 2022 3 | build.number=${buildNumber} 4 | buildNumber=98 5 | -------------------------------------------------------------------------------- /src/main/resources/com/stream_pi/client/style.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Stream-Pi - Free, Open-Source, Modular, Cross-Platform and Programmable Macro Pad 3 | * Copyright (C) 2019-2022 Debayan Sutradhar (rnayabed), Samuel Quiñones (SamuelQuinones) 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | */ 14 | 15 | .action_box 16 | { 17 | -fx-border-width: 1px; 18 | -fx-border-color : grey; 19 | } 20 | 21 | .action_box_display_text_label 22 | { 23 | 24 | } 25 | 26 | .action_box_icon_present 27 | { 28 | 29 | } 30 | 31 | .action_box_onclick 32 | { 33 | 34 | } 35 | 36 | .alert_header 37 | { 38 | -fx-padding: 10; 39 | } 40 | 41 | .alert_pane 42 | { 43 | -fx-border-width : 5; 44 | -fx-border-radius : 5; 45 | -fx-background-radius : 5; 46 | -fx-max-width : 400; 47 | -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0.0 , 0 ); 48 | } 49 | 50 | .alert_header_icon 51 | { 52 | -fx-icon-size : 30; 53 | } 54 | 55 | .alert_content_pane 56 | { 57 | -fx-padding: 5; 58 | } 59 | 60 | .alert_pane_popup_node_parent, .combobox_pane_popup_node_parent 61 | { 62 | -fx-background-color : rgba(0,0,0,0.5); 63 | -fx-padding: 10; 64 | } 65 | 66 | .alert_pane_header_text 67 | { 68 | -fx-font-size: 1.5em; 69 | } 70 | 71 | .alert_button_bar 72 | { 73 | -fx-alignment: CENTER_RIGHT; 74 | -fx-spacing: 5; 75 | -fx-padding: 5; 76 | } 77 | 78 | .alert_scroll_pane 79 | { 80 | -fx-max-height : 300; 81 | } 82 | 83 | 84 | .combo_box 85 | { 86 | -fx-alignment:CENTER_LEFT; 87 | -fx-pref-width:200; 88 | -fx-padding: 5; 89 | -fx-border-width : 0 0 1 0; 90 | -fx-border-color : grey; 91 | -fx-border-radius : 3 3 0 0; 92 | -fx-background-radius: 3 3 0 0; 93 | } 94 | 95 | .combo_box_popup 96 | { 97 | -fx-border-width : 5; 98 | -fx-border-radius : 5; 99 | -fx-background-radius : 5; 100 | -fx-max-height : 300; 101 | -fx-max-width : 410; 102 | -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0.0 , 0 ); 103 | } 104 | 105 | .combo_box_popup_vbox 106 | { 107 | -fx-padding: 5 5 0 5; 108 | -fx-spacing:5; 109 | } 110 | 111 | .combo_box_drop_down_icon 112 | { 113 | -fx-icon-code: fas-caret-down; 114 | -fx-icon-size: 14; 115 | } 116 | 117 | .action_grid_pane_parent 118 | { 119 | -fx-background-color: transparent; 120 | } 121 | 122 | .first_time_use_pane 123 | { 124 | -fx-padding : 10; 125 | } 126 | 127 | .settings_general_tab_button_bar 128 | { 129 | -fx-padding: 0 10 0 0; 130 | -fx-spacing: 10; 131 | } 132 | 133 | .first_time_use_pane_heading_label 134 | { 135 | -fx-font-size: 2em; 136 | } 137 | 138 | .first_time_use_pane_stackpane 139 | { 140 | 141 | } 142 | 143 | .first_time_use_pane_license 144 | { 145 | -fx-spacing : 10; 146 | } 147 | 148 | .first_time_use_pane_final_config, .first_time_use_pane_final_config > .viewport 149 | { 150 | -fx-background-color:transparent; 151 | } 152 | 153 | .first_time_use_pane_final_config_vbox 154 | { 155 | -fx-padding: 0 5 0 0; 156 | } 157 | 158 | .first_time_use_pane_final_config_label 159 | { 160 | -fx-padding: 0 0 15 0; 161 | } 162 | 163 | .first_time_use_welcome_pane 164 | { 165 | -fx-spacing: 10.0; 166 | -fx-alignment: CENTER; 167 | } 168 | 169 | .first_time_use_welcome_pane_welcome_label 170 | { 171 | -fx-font-size: 2.5em; 172 | } 173 | 174 | .first_time_use_welcome_pane_next_to_continue_label 175 | { 176 | -fx-padding: 0 0 0 0; 177 | } 178 | 179 | .scroll-pane:focused 180 | { 181 | -fx-background-color: transparent, transparent, transparent; 182 | -fx-background-insets: 0, 1, 2; 183 | -fx-background-radius: 5, 4, 3; 184 | } 185 | .alert_pane 186 | { 187 | -fx-background-color : white; 188 | -fx-border-color : white; 189 | } 190 | 191 | .alert_content_pane 192 | { 193 | -fx-background-color: white; 194 | -fx-padding: 5; 195 | } 196 | 197 | .alert_scroll_pane 198 | { 199 | -fx-background: white; 200 | -fx-border-color:white; 201 | } 202 | 203 | .alert_button_bar 204 | { 205 | -fx-background-color:white; 206 | } 207 | 208 | 209 | .about_donate_hyperlink 210 | { 211 | -fx-padding : 10 0 0 0; 212 | -fx-font-size : 2em; 213 | -fx-border-color: transparent; 214 | } 215 | 216 | .screensaver 217 | { 218 | -fx-background-color: black; 219 | } 220 | 221 | .separator_ui_label 222 | { 223 | -fx-text-fill: grey; 224 | } 225 | 226 | 227 | .action_grid_pane_parent, .action_grid_pane 228 | { 229 | -fx-background: transparent; 230 | } 231 | 232 | .general_settings_sub_heading 233 | { 234 | -fx-font-size: 1.5em; 235 | -fx-padding: 10 0 5 0; 236 | } 237 | 238 | .first_time_use_pane_final_config_security_warning_label 239 | { 240 | -fx-padding: 15 20 0 20; 241 | -fx-alignment: center; 242 | -fx-text-alignment: center; 243 | -fx-font-weight: bold; 244 | } 245 | 246 | .settings_general_tab_vbox, .settings_about_tab_vbox 247 | { 248 | -fx-spacing: 10; 249 | -fx-padding: 5; 250 | } 251 | 252 | 253 | .dashboard_settings_button 254 | { 255 | -fx-background-color: none; 256 | } -------------------------------------------------------------------------------- /style_classes.txt: -------------------------------------------------------------------------------- 1 | This list is outdated. Some classes are missing/no longer work. This will be updated soon 2 | 3 | 4 | Dashboard - dashboard 5 | Settings HBox Bar - dashboard_settings_button_parent 6 | Settings Button - dashboard_settings_button 7 | Icon - dashboard_settings_button_icon 8 | 9 | 10 | Action Grid Pane Parent - action_grid_pane_parent 11 | Action Grid Pane (Grid Pane) - action_grid_pane 12 | Action Box - action_box 13 | if folder back button : 14 | Icon : folder_action_back_button_icon 15 | 16 | Is Icon Present ? 17 | yes : action_box_icon_present 18 | no : action_box_icon_not_present 19 | Is Action Valid (is plugin by module name found) ? 20 | yes : action_box_valid 21 | no : action_box_invalid 22 | 23 | Action On Click : action_box_onclick 24 | 25 | Error Icon - action_box_error_icon 26 | 27 | Display Text Label - action_box_display_text_label 28 | 29 | Settings - settings_base 30 | Settings heading label - settings_heading_label 31 | Scroll Pane - settings_base_scroll_pane 32 | Base VBox - settings_base_vbox 33 | 34 | Button Bar - settings_button_bar 35 | 36 | First Time Use - first_time_use_pane 37 | Heading Label - first_time_use_pane_heading_label 38 | Stack Pane - first_time_use_pane_stackpane 39 | Welcome Pane - first_time_use_pane_welcome 40 | Head - first_time_use_welcome_pane_welcome_label 41 | Small Label - first_time_use_welcome_pane_next_to_continue_label 42 | License Pane - first_time_use_pane_license 43 | Final Config - first_time_use_pane_final_config 44 | Scroll Pane - first_time_use_final_config_pane_scroll_pane 45 | Button Bar - first_time_use_pane_button_bar --------------------------------------------------------------------------------