diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6192f27dfd..cc71eb7d26 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,7 +45,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: false @@ -176,10 +176,11 @@ jobs: - name: Coveralls if: ${{ startsWith( matrix.task, 'coverage') }} - uses: coverallsapp/github-action@1.1.3 + uses: coverallsapp/github-action@v2 with: github-token: ${{ secrets.GITHUB_TOKEN }} - path-to-lcov: coverage/coverage.info + file: coverage/coverage.info + format: lcov - name: Install if: ${{ ! startsWith( matrix.task, 'coverage') }} @@ -202,7 +203,7 @@ jobs: - name: Store original install artifacts before stripping and AppImage # Activate for debugging if: ${{ false && ! startsWith( matrix.task, 'coverage') }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.task }}-files path: ${{ env.INSTALL_ROOT }} @@ -246,7 +247,7 @@ jobs: - name: Store AppImage artifacts if: ${{ ! startsWith( matrix.task, 'coverage') }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.task }}-AppImage path: qlcplus-${{env.TASK}}-${{env.APPVERSION}}-${{env.BUILD_DATE}}-${{env.GIT_REV}}.AppImage @@ -266,12 +267,12 @@ jobs: QMAKESPEC: win32-g++ QT_MODULES: qtscript - CC: /mingw32/bin/i686-w64-mingw32-gcc.exe - CXX: /mingw32/bin/i686-w64-mingw32-g++.exe + CC: /mingw64/bin/x86_64-w64-mingw32-gcc.exe + CXX: /mingw64/bin/x86_64-w64-mingw32-g++.exe steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: false @@ -321,52 +322,52 @@ jobs: - name: Update and install MSYS2 uses: msys2/setup-msys2@v2 with: - msystem: mingw32 + msystem: mingw64 release: true update: false path-type: inherit install: >- wget unzip - mingw-w64-i686-gcc - mingw-w64-i686-gcc-libs - mingw-w64-i686-cmake - mingw-w64-i686-libmad - mingw-w64-i686-libsndfile - mingw-w64-i686-flac - mingw-w64-i686-fftw - mingw-w64-i686-libusb - mingw-w64-i686-python-lxml - mingw-w64-i686-qt5-base - mingw-w64-i686-qt5-multimedia - mingw-w64-i686-qt5-serialport - mingw-w64-i686-qt5-script - mingw-w64-i686-qt5-tools - mingw-w64-i686-qt5-imageformats - mingw-w64-i686-qt5-svg - mingw-w64-i686-qt5-declarative - mingw-w64-i686-qt5-quickcontrols - mingw-w64-i686-qt5-quickcontrols2 - mingw-w64-i686-qt5-3d - mingw-w64-i686-qt5-quick3d - mingw-w64-i686-nsis + mingw-w64-x86_64-gcc + mingw-w64-x86_64-gcc-libs + mingw-w64-x86_64-cmake + mingw-w64-x86_64-libmad + mingw-w64-x86_64-libsndfile + mingw-w64-x86_64-flac + mingw-w64-x86_64-fftw + mingw-w64-x86_64-libusb + mingw-w64-x86_64-python-lxml + mingw-w64-x86_64-qt5-base + mingw-w64-x86_64-qt5-multimedia + mingw-w64-x86_64-qt5-serialport + mingw-w64-x86_64-qt5-script + mingw-w64-x86_64-qt5-tools + mingw-w64-x86_64-qt5-imageformats + mingw-w64-x86_64-qt5-svg + mingw-w64-x86_64-qt5-declarative + mingw-w64-x86_64-qt5-quickcontrols + mingw-w64-x86_64-qt5-quickcontrols2 + mingw-w64-x86_64-qt5-3d + mingw-w64-x86_64-qt5-quick3d + mingw-w64-x86_64-nsis - name: D2XX SDK shell: msys2 {0} run: | - set MSYSTEM=MINGW32 - mkdir -p /c/Qt/D2XXSDK - wget https://ftdichip.com/wp-content/uploads/2023/09/CDM-v2.12.36.4-WHQL-Certified.zip -O /c/Qt/D2XXSDK/cdm.zip - cd /c/Qt/D2XXSDK + set MSYSTEM=MINGW64 + mkdir -p /c/projects/D2XXSDK + wget https://ftdichip.com/wp-content/uploads/2023/09/CDM-v2.12.36.4-WHQL-Certified.zip -O /c/projects/D2XXSDK/cdm.zip + cd /c/projects/D2XXSDK unzip cdm.zip - cd i386 - gendef.exe - ftd2xx.dll > ftd2xx.def - dlltool -k --input-def ftd2xx.def --dllname ftd2xx.dll --output-lib libftd2xx.a + cd amd64 + gendef.exe - ftd2xx64.dll > ftd2xx.def + dlltool -k --input-def ftd2xx.def --dllname ftd2xx64.dll --output-lib libftd2xx.a - name: Print program versions shell: msys2 {0} run: | - set MSYSTEM=MINGW32 + set MSYSTEM=MINGW64 echo "pwd:" pwd echo "CXX:" @@ -381,19 +382,21 @@ jobs: #if: false shell: msys2 {0} run: | - set MSYSTEM=MINGW32 + set MSYSTEM=MINGW64 + # force a release build + sed -i -e 's/Debug/Release/g' CMakeLists.txt # disable Velleman plugin sed -i -e 's/ add_subdirectory(velleman)/# add_subdirectory(velleman)/g' plugins/CMakeLists.txt # fix MSYS2 system path sed -i -e 's/$ENV{SystemDrive}\/msys64/D:\/a\/_temp\/msys64/g' platforms/windows/CMakeLists.txt # fix project path in NSIS script - sed -i -e 's/c\:\\Qt/d:\\a\\qlcplus/g' platforms/windows/${{env.NSIS_SCRIPT}} + sed -i -e 's/c\:\\projects/d:\\a\\qlcplus/g' platforms/windows/${{env.NSIS_SCRIPT}} - name: Configure v4 build for Windows shell: msys2 {0} if: ${{ matrix.task == 'compile-qt5' }} run: | - set MSYSTEM=MINGW32 + set MSYSTEM=MINGW64 mkdir build cd build cmake -G "Unix Makefiles" .. @@ -402,7 +405,7 @@ jobs: shell: msys2 {0} if: ${{ matrix.task == 'compile-qt5qml' }} run: | - set MSYSTEM=MINGW32 + set MSYSTEM=MINGW64 mkdir build cd build cmake -G "Unix Makefiles" -Dqmlui=ON .. @@ -410,14 +413,14 @@ jobs: - name: Build for Windows shell: msys2 {0} run: | - set MSYSTEM=MINGW32 + set MSYSTEM=MINGW64 cd build make -j${NPROC} - name: Install on Windows shell: msys2 {0} run: | - set MSYSTEM=MINGW32 + set MSYSTEM=MINGW64 #echo 'Silently installing QLC+...' cd build make install/fast @@ -427,14 +430,14 @@ jobs: - name: Build installation package shell: msys2 {0} run: | - set MSYSTEM=MINGW32 + set MSYSTEM=MINGW64 cd /c/qlcplus echo 'Creating package...' makensis -X'SetCompressor /FINAL lzma' ${{env.NSIS_SCRIPT}} mv /c/qlcplus/${{env.OUTFILE}} /d/a/qlcplus/qlcplus - name: Store executable artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: QLC+-${{env.TASK}}-${{env.APPVERSION}}-${{env.BUILD_DATE}}-${{env.GIT_REV}}.exe path: ${{env.OUTFILE}} diff --git a/CMakeLists.txt b/CMakeLists.txt index a6c93a4e84..db94657018 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,9 @@ cmake_minimum_required(VERSION 3.16) -project(qlcplus VERSION 4.12.8 LANGUAGES C CXX) +project(qlcplus VERSION 4.13.0 LANGUAGES C CXX) # Set Release build type by default if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) + set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) endif() # Prevent CMake make install strips off non-standard build paths @@ -20,6 +20,18 @@ if(UNIX) endif() endif() +if (ANDROID OR IOS) + set(qmlui ON) +endif() + +if (ANDROID) + if(QT_VERSION_MAJOR GREATER 5) + set(QT_ANDROID_PACKAGE_SOURCE_DIR ${PROJECT_SOURCE_DIR}/platforms/android CACHE INTERNAL "") + else() + set(ANDROID_PACKAGE_SOURCE_DIR ${PROJECT_SOURCE_DIR}/platforms/android CACHE INTERNAL "") + endif() +endif() + set(CMAKE_INCLUDE_CURRENT_DIR ON) # Set up AUTOMOC and some sensible defaults for runtime execution @@ -32,6 +44,9 @@ find_package(QT NAMES Qt5 Qt6 REQUIRED COMPONENTS Core) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Gui Multimedia MultimediaWidgets Network PrintSupport Qml Quick Svg Test Widgets LinguistTools) if(qmlui) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS 3DCore 3DInput 3DQuick 3DQuickExtras 3DRender) + if(ANDROID) + find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Concurrent OpenGL) + endif() endif() message("Found Qt version ${QT_VERSION_MAJOR}: ${QT_DIR}") diff --git a/README.md b/README.md index 5361556bc8..a6685dcf0f 100644 --- a/README.md +++ b/README.md @@ -3,17 +3,26 @@ # Q Light Controller Plus -![GitHub release)](https://img.shields.io/github/v/release/mcallegari/qlcplus) -![QLC+ Github Actions CI Build](https://github.com/mcallegari/qlcplus/actions/workflows/build.yml/badge.svg) +[![GitHub release](https://img.shields.io/github/v/release/mcallegari/qlcplus) +![GitHub Release Date - Published_At](https://img.shields.io/github/release-date/mcallegari/qlcplus)](https://github.com/mcallegari/qlcplus/releases/latest) + +https://www.qlcplus.org/download ## Introduction -QLC+ is a powerful and user-friendly software designed for lighting control. Whether you're an experienced lighting professional or just getting started, QLC+ empowers you to take control of your lighting fixtures with ease. The primary goal of this project is to bring QLC+ to the level of available commercial software. +QLC+ is powerful and user-friendly software designed to control lighting. Whether you're an experienced lighting professional or just getting started, QLC+ empowers you to take control of your lighting fixtures with ease. The primary goal of this project is to bring QLC+ to the level of available commercial software. QLC+ runs on Linux, Windows (7+), macOS (10.7+) and the Raspberry Pi. Copyright © Heikki Junnila, Massimo Callegari - - -### Key Resources: +### Supported Protocols +[![MIDI](https://img.shields.io/badge/MIDI-%23323330.svg?style=for-the-badge&logo=midi&logoColor=%23F7DF1E)](https://docs.qlcplus.org/v4/plugins/midi) +[![OSC](https://img.shields.io/badge/OSC-%23323330.svg?style=for-the-badge&logo=aiohttp&logoColor=%23F7DF1E)](https://docs.qlcplus.org/v4/plugins/osc) +[![HID](https://img.shields.io/badge/HID-%23323330.svg?style=for-the-badge&logo=applearcade&logoColor=%23F7DF1E)](https://docs.qlcplus.org/v4/plugins/hid) +[![DMX](https://img.shields.io/badge/DMX-%23323330.svg?style=for-the-badge&logo=amazonec2&logoColor=%23F7DF1E)](https://docs.qlcplus.org/v4/plugins/dmx-usb) +[![ArtNet](https://img.shields.io/badge/ArtNet-%23323330.svg?style=for-the-badge&logo=aiohttp&logoColor=%23F7DF1E)](https://docs.qlcplus.org/v4/plugins/art-net) +[![E1.31/S.ACN](https://img.shields.io/badge/E1.31%20S.ACN-%23323330.svg?style=for-the-badge&logo=aiohttp&logoColor=%23F7DF1E)](https://docs.qlcplus.org/v4/plugins/e1-31-sacn) +[![OS2L](https://img.shields.io/badge/OS2L-%23323330.svg?style=for-the-badge&logo=aiohttp&logoColor=%23F7DF1E)](https://docs.qlcplus.org/v4/plugins/os2l) + +### Key Resources @@ -41,71 +50,60 @@ Copyright © Heikki Junnila, Massimo Callegari
-### QLC+ Social Media: +### QLC+ Social Media [![Instagram](https://img.shields.io/badge/Instagram-%23E4405F.svg?style=for-the-badge&logo=Instagram&logoColor=white)](https://www.instagram.com/qlcplus/) [![YouTube](https://img.shields.io/badge/YouTube-%23FF0000.svg?style=for-the-badge&logo=YouTube&logoColor=white)](https://www.youtube.com/watch?v=I9bccwcYQpM&list=PLHT-wIriuitDiW4A9oKSDr__Z_jcmMVdi) [![Facebook](https://img.shields.io/badge/Facebook-%231877F2.svg?style=for-the-badge&logo=Facebook&logoColor=white)](https://www.facebook.com/qlcplus) - - ## Contributing We welcome contributions from the community to help make QLC+ even better. Before diving into coding, we encourage you to start a discussion in our [Software Development](https://www.qlcplus.org/forum/viewforum.php?f=12) forum if you're considering adding a new feature or making significant changes. This provides an opportunity for feedback, collaboration, and ensuring alignment with the project's goals. Further guidelines are available in the [CONTRIBUTING.md](CONTRIBUTING.md) document. +### Help wanted +Click the badge below to see the currently confirmed issues with QLC+. Perhaps you can find a solution? + +[![GitHub issues by-label](https://img.shields.io/github/issues/mcallegari/qlcplus/issue%20confirmed?logo=github&color=red)](https://github.com/mcallegari/qlcplus/issues?q=is%3Aopen+is%3Aissue+label%3A%22issue+confirmed%22) -### 🚧 DEVELOPERS AT WORK 🚧 +### 🚧 Developers at work 🚧 +If you're regularly updating QLC+ sources with git pull, you may encounter compiler warnings, errors, or unresolved symbols. This is because the source package is still in development. We strive to keep the GIT master branch free of critical errors; However, dependencies between objects can sometimes cause issues, requiring a full package recompilation rather than just updating recent changes. -If you're compiling QLC+ from sources and you regularly do "git pull" -to get the latest sources, you probably end up seeing some -compiler warnings and errors from time to time. Since the whole source package -is under development, you might even encounter unresolved symbols etc. If such a thing occurs, you should do a "make -distclean" on qlcplus (top-most source directory) and then "qmake" and "make" -again. We attempt to keep the GIT master free of fatal errors and it should -compile all the time. However, some inter-object dependencies do get mixed up -sometimes and you need to compile the whole package instead of just the latest -changes. Sometimes even that doesn't work, because QLC+ installs its common -libraries to system directories, where (at least unixes) fetch them instead -of the source directory. In those cases, you might try going to the libs -directory, compile it with "make" and install with "make install" and then -attempt to re-compile the whole package with "make". +[![QLC+ Github Actions CI Build](https://github.com/mcallegari/qlcplus/actions/workflows/build.yml/badge.svg)](https://github.com/mcallegari/qlcplus/actions) [![Coverage Status](https://coveralls.io/repos/github/mcallegari/qlcplus/badge.svg?branch=master)](https://coveralls.io/github/mcallegari/qlcplus?branch=master) +[![GitHub commits since latest release (by SemVer including pre-releases)](https://img.shields.io/github/commits-since/mcallegari/qlcplus/latest/master)](https://github.com/mcallegari/qlcplus/commits/master/) ![GitHub commit activity (branch)](https://img.shields.io/github/commit-activity/w/mcallegari/qlcplus) -## Compiling And Installation +## Compiling and installation Please refer to the online wiki pages: https://github.com/mcallegari/qlcplus/wiki ## Requirements ### Linux - -* Qt >= 5.0 development libraries & tools -* libudev-dev, libmad0-dev, libsndfile1-dev, libfftw3-dev -* DMX USB plugin: libftdi-dev, pkg-config -* MIDI plugin: libasound, libasound-dev, pkg-config -* OLA plugin: libola, ola-dev, pkg-config (see libs/olaout/README) -* uDMX plugin: libusb, libusb-dev, pkg-config -* Peperoni plugin: libusb, libusb-dev, pkg-config -* Velleman plugin: **Not available** +* Qt >= 5.0 development libraries & tools +* libudev-dev, libmad0-dev, libsndfile1-dev, libfftw3-dev +* DMX USB plugin: libftdi-dev, pkg-config +* MIDI plugin: libasound, libasound-dev, pkg-config +* OLA plugin: libola, ola-dev, pkg-config (see libs/olaout/README) +* uDMX plugin: libusb, libusb-dev, pkg-config +* Peperoni plugin: libusb, libusb-dev, pkg-config +* Velleman plugin: **Not available** ### Windows -* MSYS2 environment (https://msys2.github.io/) -* DMX USB plugin: D2XX driver & development package (http://www.ftdichip.com/Drivers/D2XX.htm) -* ENTTEC Wing plugin: D2XX driver & development package (http://www.ftdichip.com/Drivers/D2XX.htm) -* OLA plugin: **Not available** -* Velleman plugin: K8062 SDK from www.velleman.eu - +* MSYS2 environment (https://msys2.github.io/) +* DMX USB plugin: D2XX driver & development package (http://www.ftdichip.com/Drivers/D2XX.htm) +* ENTTEC Wing plugin: D2XX driver & development package (http://www.ftdichip.com/Drivers/D2XX.htm) +* OLA plugin: **Not available** +* Velleman plugin: K8062 SDK from www.velleman.eu ### Mac OS X -* XCode (http://developer.apple.com/technologies/tools/xcode.html) -* Qt >= 5.0.x (http://download.qt.io/official_releases/qt/) -* macports (https://www.macports.org/) -* DMX USB plugin: macports, libftdi-dev, pkg-config -* OLA plugin: libola, ola-dev, pkg-config (see libs/olaout/README) -* uDMX plugin: macports, libusb-compat, pkg-config -* Peperoni plugin: macports, libusb-compat, pkg-config -* Velleman plugin: **Not available** - +* XCode (http://developer.apple.com/technologies/tools/xcode.html) +* Qt >= 5.0.x (http://download.qt.io/official_releases/qt/) +* macports (https://www.macports.org/) +* DMX USB plugin: macports, libftdi-dev, pkg-config +* OLA plugin: libola, ola-dev, pkg-config (see libs/olaout/README) +* uDMX plugin: macports, libusb-compat, pkg-config +* Peperoni plugin: macports, libusb-compat, pkg-config +* Velleman plugin: **Not available** ## Support & Bug Reports @@ -116,58 +114,64 @@ For developers wiki and code patches, go to: https://github.com/mcallegari/qlcplus ## Contributors + QLC+ owes its success to the dedication and expertise of numerous individuals who have generously contributed their time and skills. The following list recognizes those whose remarkable contributions have played a pivotal role in shaping QLC+ into what it is today. -### QLC+ 5: - -* Eric Arnebäck (3D preview features) -* Santiago Benejam Torres (Catalan translation) -* Luis García Tornel (Spanish translation) -* Nils Van Zuijlen, Jérôme Lebleu (French translation) -* Felix Edelmann, Florian Edelmann (fixture definitions, German translation) -* Jannis Achstetter (German translation) -* Dai Suetake (Japanese translation) -* Hannes Bossuyt (Dutch translation) -* Aleksandr Gusarov (Russian translation) -* Vadim Syniuhin (Ukrainian translation) -* Mateusz Kędzierski (Polish translation) - -### QLC+ 4: - -* Jano Svitok (bugfix, new features and improvements) -* David Garyga (bugfix, new features and improvements) -* Lukas Jähn (bugfix, new features) -* Robert Box (fixtures review) -* Thomas Achtner (ENTTEC wing improvements) -* Joep Admiraal (MIDI SysEx init messages, Dutch translation) -* Florian Euchner (FX5 USB DMX support) -* Stefan Riemens (new features) -* Bartosz Grabias (new features) -* Simon Newton, Peter Newman (OLA plugin) -* Janosch Frank (webaccess improvements) -* Karri Kaksonen (DMX USB Eurolite USB DMX512 Pro support) -* Stefan Krupop (HID DMXControl Projects e.V. Nodle U1 support) -* Nathan Durnan (RGB scripts, new features) -* Giorgio Rebecchi (new features) -* Florian Edelmann (code cleanup, German translation) -* Heiko Fanieng, Jannis Achstetter (German translation) -* NiKoyes, Jérôme Lebleu, Olivier Humbert, Nils Van Zuijlen (French translation) -* Raymond Van Laake (Dutch translation) -* Luis García Tornel (Spanish translation) -* Jan Lachman (Czech translation) -* Nuno Almeida, Carlos Eduardo Porto de Oliveira (Portuguese translation) -* Santiago Benejam Torres (Catalan translation) -* Koichiro Saito, Dai Suetake (Japanese translation) - -### QLC: - -* Stefan Krumm (Bugfixes, new features) -* Christian Suehs (Bugfixes, new features) -* Christopher Staite (Bugfixes) -* Klaus Weidenbach (Bugfixes, German translation) -* Lutz Hillebrand (uDMX plugin) -* Matthew Jaggard (Velleman plugin) -* Ptit Vachon (French translation) +![GitHub contributors](https://img.shields.io/github/contributors/mcallegari/qlcplus) +### QLC+ 5 + +* Eric Arnebäck (3D preview features) +* Santiago Benejam Torres (Catalan translation) +* Luis García Tornel (Spanish translation) +* Nils Van Zuijlen, Jérôme Lebleu (French translation) +* Felix Edelmann, Florian Edelmann (fixture definitions, German translation) +* Jannis Achstetter (German translation) +* Dai Suetake (Japanese translation) +* Hannes Bossuyt (Dutch translation) +* Aleksandr Gusarov (Russian translation) +* Vadim Syniuhin (Ukrainian translation) +* Mateusz Kędzierski (Polish translation) + +### QLC+ 4 + +* Jano Svitok (bugfix, new features and improvements) +* David Garyga (bugfix, new features and improvements) +* Lukas Jähn (bugfix, new features) +* Robert Box (fixtures review) +* Thomas Achtner (ENTTEC wing improvements) +* Joep Admiraal (MIDI SysEx init messages, Dutch translation) +* Florian Euchner (FX5 USB DMX support) +* Stefan Riemens (new features) +* Bartosz Grabias (new features) +* Simon Newton, Peter Newman (OLA plugin) +* Janosch Frank (webaccess improvements) +* Karri Kaksonen (DMX USB Eurolite USB DMX512 Pro support) +* Stefan Krupop (HID DMXControl Projects e.V. Nodle U1 support) +* Nathan Durnan (RGB scripts, new features) +* Giorgio Rebecchi (new features) +* Florian Edelmann (code cleanup, German translation) +* Heiko Fanieng, Jannis Achstetter (German translation) +* NiKoyes, Jérôme Lebleu, Olivier Humbert, Nils Van Zuijlen (French translation) +* Raymond Van Laake (Dutch translation) +* Luis García Tornel (Spanish translation) +* Jan Lachman (Czech translation) +* Nuno Almeida, Carlos Eduardo Porto de Oliveira (Portuguese translation) +* Santiago Benejam Torres (Catalan translation) +* Koichiro Saito, Dai Suetake (Japanese translation) + +### Q Light Controller + +* Stefan Krumm (Bugfixes, new features) +* Christian Suehs (Bugfixes, new features) +* Christopher Staite (Bugfixes) +* Klaus Weidenbach (Bugfixes, German translation) +* Lutz Hillebrand (uDMX plugin) +* Matthew Jaggard (Velleman plugin) +* Ptit Vachon (French translation) + + + + ## Apache 2.0 ![GitHub License](https://img.shields.io/github/license/mcallegari/qlcplus) diff --git a/create-dmg.sh b/create-dmg.sh index 4e14a3edd8..9aba03f771 100755 --- a/create-dmg.sh +++ b/create-dmg.sh @@ -42,13 +42,13 @@ fi OUTDIR=$PWD cd platforms/macos/dmg ./create-dmg --volname "Q Light Controller Plus $VERSION" \ - --volicon $OUTDIR/resources/icons/qlcplus.icns \ - --background background.png \ - --window-size 400 300 \ - --window-pos 200 100 \ - --icon-size 64 \ - --icon "QLC+" 0 150 \ - --app-drop-link 200 150 \ - $OUTDIR/QLC+_$VERSION.dmg \ - ~/QLC+.app + --volicon $OUTDIR/resources/icons/qlcplus.icns \ + --background background.png \ + --window-size 400 300 \ + --window-pos 200 100 \ + --icon-size 64 \ + --icon "QLC+" 0 150 \ + --app-drop-link 200 150 \ + $OUTDIR/QLC+_$VERSION.dmg \ + ~/QLC+.app cd - diff --git a/debian/changelog b/debian/changelog index d6ff84904f..72bf1c2d08 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,32 +1,68 @@ -qlcplus (4.12.8) stable; urgency=low +qlcplus (4.13.1) stable; urgency=low + + * engine: fix blackout not working + * engine: include relative EFX in blackout + * engine: fix RGB Matrix clone control mode + * Show Manager: improve resume after pause + * Virtual Console: fix OSC feedback regression + * Virtual Console/Slider: add an optional button to flash in playback mode + * Virtual Console/XY Pad: copy presets when cloning (thanks to Hans-Jürgen Tappe) + * Plugins/DMX USB: restore Vince DMX512 output (thanks to Jérôme Lebleu) + * Web Access: added getWidgetSubIdList API and Animation widget sub-control example (API test page updated) + * New fixtures: beamZ BAC500 and BAC506 (thanks to Olivier Michel) + * New fixtures: American DJ Par Z4, beamZ SB400, OXO ColorBeam 7 FCW IR, Pro-Lights Pixie Spot (thanks to Dmitry Kolesnikov) + * New fixtures: BoomToneDJ LED PAR 7X10W 5in1, BoomToneDJ Maxi Spot 60, Mac Mah FLAT PAR 7x12W 6in1, Eurolite LED PIX-16 QCL Bar (thanks to Cédric Monféfoul) + * New fixture: Showtec ACT PC 60 RGBW (thanks to Michel Sliepenbeek) + * New fixtures: Robe LEDBeam 350, Robe LEDBeam 350 RGBA, Briteq COB Blinder 2x100W, Ayrton MiniPanel FX (thanks to Giacomo Gorini) + * New fixture: Elation ELED B48 (thanks to Xoneoo) + * New fixture: beamZ PS10W (thanks to Jesper Korsen) + * New fixtures: Ayra ComPar 10 and ERO 406 (thanks to René Knuvers) + * New fixtures: Mac Mah Moving-FX Bar, Varytec LED Pad Bar Compact ST RGB, Laserworld EL-400RGB MK2 (thanks to Clément Delabroye) + * New fixtures: Electroconcept Club Scan 30, Club Scan 120, LED Blinder, Profile 120 Spot LED, Micro Spot 60 LED (thanks to Clément Delabroye) + + -- Massimo Callegari Sun, 30 Jun 2024 12:13:14 +0200 + +qlcplus (4.13.0) stable; urgency=low * engine: fix Chaser random startup (thanks to Dennis Suermann) * engine: do not fade out looped audio + * engine: further rework to properly handle 16bit fading * engine: fix stopping audio with fade in and fade out while fading in * engine: new EFX algorithm: SquareTrue (thanks to Justin Hornsby) * engine: handle 'string' and 'float' types in RGB Scripts + * UI: save the geometry of all the dialogs (thanks to Nils Tijtgat) + * UI: add color lookup table to input profiles and a dedicated dialog for custom feedback * Virtual Console/Slider: fix switching from playback to submaster mode * Virtual Console/Slider: fix submaster @0 not affecting function intensity * Virtual Console/XY Pad: fix Scene preset controlling wrong channels * Virtual Console/Clock: fix running a schedule the day after * Virtual Console/Button: Scene flashing can force LTP and override (thanks to Dennis Suermann) + * Virtual Console/Button: add monitoring feedback value to custom feedback (thanks to ditcheshurt) * Virtual Console/Cue List: fix off by one offset error in steps mode (thanks to kpr0th) + * Virtual Console/Audio Triggers: fix attached VC Slider not updating values + * Virtual Console/Audio Triggers: fix loading a project with DMX bars with no channels set + * Virtual Console/Audio Triggers: fix enable button feedback to external controllers * Plugins/ArtNet: add default standard transmission mode as per protocol specifications * Plugins/ArtNet,E1.31,OSC: add a parameter to wait for interfaces to be ready * Plugins/DMX USB: add support for DMXKing MAX products * Plugins/DMX USB: FTDI USB device no longer disappear after closing QLC+ on Linux * Fixture Editor: fix aliases not updated when renaming a mode * Web Access: add support for Cue List side fader and buttons layout (thanks to Itay Lifshitz) + * Web Access: add support for Cue List note editing (thanks to Itay Lifshitz) * Web Access: add support for Slider knob appearance (thanks to Itay Lifshitz) - * Web Access: add VC Animation widget support (thanks to Itay Lifshitz) + * Web Access: add support for VC Frame disable button (thanks to Itay Lifshitz) + * Web Access: add Virtual Console Animation widget support (thanks to Itay Lifshitz) + * Web Access: add Virtual Console Grand Master (thanks to Itay Lifshitz) * Web Access: add event to notify Function start/stop * Input profiles: added PMJ 9 Faders Controller, Circus and MidiKey + * Input profiles: added Worlde Easypad.12 (thanks to Christoph Müllner) + * Input profiles: added Worlde Orca PAD16 * New fixture: Ibiza Mini Moving Star Wash (thanks to Chris Shucksmith) * New fixtures: FOS Technologies IQ Par, IQ 28x12 Wash, Iridium 75W Spot (thanks to Maurizio Aru) * New fixture: Varytec Hero Spot 60 (thanks to Hans-Jürgen Tappe) * New fixture: beamZ BAC503 (thanks to archlinette) * New fixtures: Cameo Flat Pro 7, 12 and 18 (thanks to Janosch Frank) - * New fixture: Eurolite LED TMH-X4 (thanks to Tolmino Muccitelli) + * New fixtures: Eurolite LED TMH-X4, lightmaXX Vector ARC Flood II (thanks to Tolmino Muccitelli) * New fixtures: Cameo Q-Spot 40 RGBW, Varytec LED PAR 14x8W, Varytec LED Typhoon PAR Outdoor (12x10) (thanks to Jochen Becker) * New fixtures: Audibax Iowa 70, Pro-Lights CromoWash100 (thanks to Cristian) * New fixtures: Showtec Spectral M1000 Q4, Showtec Kanjo Wash RGB (thanks to Michel Sliepenbeek) @@ -46,13 +82,33 @@ qlcplus (4.12.8) stable; urgency=low * New fixture: Shehds GalaxyJet Waterproof IP65 380W 19R Beam Moving Head (thanks to István Király, Feiyu Shehds) * New fixture: Martin Ego X6 (thanks to Michael Tosatto) * New fixture: Blizzard Lighting LB Hex Unplugged (thanks to David Sparks) - * New fixture: Eurolite LED Strobe SMD PRO 132 DMX RGB (thanks to Fede79) + * New fixtures: Eurolite LED Strobe SMD PRO 132 DMX RGB, Briteq BT Theatre HD2, Eurolite KLS-180-6, BoomToneDJ KUB 500 RGB (thanks to Fede79) * New fixture: Eurolite LED PLL-480 CW/WW (thanks to Benjamin Drung) * New fixture: Robe Spiider (thanks to Nicolò) * New fixture: Betopper LB230 (thanks to Viktor) + * New fixtures: EK R3 Wash, Chauvet Intimidator Spot 475ZX, Chauvet Intimidator Wash Zoom 450 IRC (thanks to Harrison Bostock) * New fixtures: Varytec Typhoon True Kid 720Z RGBW IP65, Showtec Performer 2000 RGBAL (thanks to Clément Delabroye) - - -- Massimo Callegari Sun, 17 Dec 2023 12:13:14 +0200 + * New fixtures: Showtec LED Par 64 Short V2, Bright XBAR (thanks to Øystein Steimler) + * New fixtures: AFX CLUB-MIX3 19x10W RGBW, Eurolite LED Theatre COB 200 RGB+WW (thanks to Florian Faber) + * New fixture: Chauvet COLORado Batten 72x (thanks to Greg Perrone) + * New fixtures: Talent SSL2, Cameo P2 FC + * New fixture: Tecshow Nebula 6 (thanks to Federico) + * New fixture: beamZ Radical II (thanks to Matt Muller) + * New fixtures: Eurolite LED PARty TCL spot, Expolite TourSpot 50 Mini, Fun Generation LED Pot 12x1W QCL RGB WW (thanks to Christian Prison) + * New fixtures: Chauvet COLORband Q3BT, Shehds LED Beam+Wash 19x15W RGBW Zoom (thanks to Paul Schuh) + * New fixtures: Eliminator Lighting Stealth Beam and Stealth Wash Zoom Lighting (thanks to Paul Schuh) + * New fixture: Varytec Blitz Bar 240 (thanks to Stefan Lohmann) + * New fixture: Eurolite LED KLS Scan Pro Next FX Light (thanks to Kevin) + * New fixtures: Elumen8 MP 60 Mk1, MP 60 Mk2, MP 120 (thanks to Keith Baker) + * New fixture: Elation Paladin (thanks to Nicholas Harvey) + * New fixtures: Acme Oxygen, Dotline180, Dotline260 and Super Dotline, Chauvet Intimidator Spot Duo 155 (thank to Michael Tosatto) + * New fixtures: Laserworld EL-900RGB, Chauvet COLORdash Par-Quad 18, Event Lighting StrobeX and StrobeX RGB (thank to Michael Tosatto) + * New fixture: Chauvet Wash FX Hex (thanks to Clément Delabroye) + * New fixture: Shehds Wash Zoom LED 36x18W RGBWA+UV (thanks to Ioannis Iliopoulos) + * New fixture: UKing ZQ-02319 (thanks to Mike Ubl) + * New fixtures: DTS Jack, Robe LEDBeam 350 (thanks to Tomas Hastings) + + -- Massimo Callegari Sun, 17 Mar 2024 12:13:14 +0200 qlcplus (4.12.7) stable; urgency=low @@ -487,538 +543,3 @@ qlcplus (4.12.0) stable; urgency=low * New fixtures: Pro-Lights Genesis, BB5 Pix (thanks to Lorenzo Andreani) -- Massimo Callegari Sat, 10 Nov 2018 12:13:14 +0200 - -qlcplus (4.11.2) stable; urgency=low - - * engine: fix crash caused by an invalid IO mapping - * engine: fix intensity override not considered during fade outs - * UI/Function Manager: fixed keyboard shortcut conflicts and document them - * UI/Function Manager: allow to import multiple of audio/video files at once - * UI/Channel Groups: added expand/collapse all button helpers - * UI/Chaser Editor: add a button to shuffle the selected Chaser steps (thanks to Felix Edelmann) - * UI/RGBMatrix Editor: fix preview not updating on pattern change when play button is on - * Show Manager: fix crash when adding a Sequence after deleting one - * Show Manager: fix crash when editing a Sequence bound to a deleted Scene - * Show Manager: fix items start time indication when dragging - * Virtual Console/Slider: fix submaster initial value not applied and inverted mode - * Virtual Console/Slider: added 'value catching' option for external controller faders (Lukas Jähn proposal) - * Virtual Console/Slider: fix values range when switching between Slider and Knob appearance - * Virtual Console/Slider: react on Scene flashing when in playback mode - * Virtual Console/Knob: fix DMX values not updated when interacting with the mouse wheel - * Virtual Console/Cue List: allow to select a step with next/previous buttons during pause - * Virtual Console/Cue List: go to the right chaser step after a pause (thanks to Krzysztof Walo) - * Virtual Console/Frame: fix regression preventing to send the disable feedback - * Web Access: added support for VC Buttons in Flash mode (Sylvain Laugié) - * Web Access: added support for VC Frame circular page scrolling (Sylvain Laugié) - * Web Access: update AudioTriggers state when changed from QLC+ (Sylvain Laugié) - * plugins/udmx: added 'channels' configuration parameter (see documentation) - * plugins/E1.31: fix crash on wrong packet length (David Garyga) - * New fixture: DTS XR7 Spot (thanks to Nicolò Zanon) - * New fixture: Ledj Slimline 12Q5 Batten (thanks to Dean Clough) - * New fixture: Ayra Compar Kit 1 (thanks to eigenaardiger) - * New fixtures: GLP Impression X4 S, Eurolite LED KLS-2500 (thanks to Mitsch) - * New fixture: Chauvet Intimidator Spot 255 IRC (thanks to Ham Sadler) - * New fixtures: Chauvet Geyser RGB, Geyser P6 (thanks to Andrew) - * New fixture: Chauvet Rotosphere Q3 (thanks to Eric Sherlock) - * New fixture: Showtec Compact Par 7 Q4 (thanks to Alexander) - * New fixture: Contest Delirium (thanks to Vincent) - * New fixture: Solena Mini Par 12, Max Bar 28 RGB (thanks to Nathan Durnan) - * New fixtures: Showtec Phantom 65, Laserworld PRO-800RGB (thanks to Piotr Nowik) - * New fixture: Chauvet MiN Spot RGBW (thanks to Jungle Jim) - * New fixtures: Showtec Shark Wash One, American DJ Vizi Hex Wash7 (thanks to Georg Müller) - * New fixture: Showtec Shark Beam FX One (thanks to Mats Lourenco) - * New fixture: Stairville novaWash Quad LED (thanks to Luke Bonett) - * New fixtures: Eurolite Party TCL Spot RGB, Expolite TourSpot 60, Expolite TourStick 72 RGBWA (thanks to Dirk J) - * New fixture: Chauvet Hemisphere 5.1, Trident, Scorpion Storm RGX (thanks to Francois Blanchette) - * New fixture: Briteq COB Slim 100-RGB (thanks to Thierry) - * New fixture: American DJ UB 12H (thanks to Jason R Johnston) - * New fixture: American DJ Mega Hex Par (thanks to Ben C) - * New fixture: Cameo Q SPOT 15 RGBW (thanks to Antoine Houbron) - * New fixture: lightmaXX Platinum Line Flat Par COB (thanks to Leonardo) - * New fixture: Stairville LED Blinder 2 COB 2x65W (thanks to chritoep) - * New fixture: lightmaXX LED PAR 64 (thanks to Johannes Felber) - * New fixture: Cameo Thunder Wash Series (thanks to JP) - * New fixtures: Briteq BT 575S, Stairville MH-x30 LED Beam (thanks to Andres Robles) - * New fixture: beamZ LED FlatPAR-154 (thanks to Jászberényi Szabolcs) - * New fixtures: Eurolite THA-100F COB, Cameo Tribar 200 IR (thanks to David Morgenschweis) - * New fixture: beamZ BT310 LED FlatPAR 12x8W 4-1 DMX IR (thanks to Mark) - * New fixture: Fun Generation PicoWash 40 Pixel Quad LED (thanks to Harm Aldick) - * New fixtures: American DJ Entourage, Elumen8 MS-700PE, Ibiza PAR LED 712IR (thanks to Tim Cullingworth) - * New fixtures: Martin MAC 401 Dual RGB Zoom, MAC 401 Dual CT Zoom, Stairville MH-z720 (thanks to Tim Cullingworth) - * New fixture: Fun Generation SePar Quad UV (thanks to Helmet) - - -- Massimo Callegari Thu, 19 Apr 2018 20:21:22 +0200 - -qlcplus (4.11.1) stable; urgency=low - - * engine: fixed audio files detection by prioritizing sndfile over mad - * engine: fixed HTP/LTP forced channels not set correctly - * engine: keep track of input/output device lines even if they are disconnected - * engine/Script: add blackout:on and blackout:off commands (Jano Svitok) - * engine/Script: do not keep empty trailing lines when saving a workspace - * UI: it is now possible to detach a QLC+ context tab on a separate window by double clicking on it - * UI/RGB Panel: added RBG pixel type (thanks to Peter Marks) - * UI/Remap: fixed RGB Panels remapping - * UI/Input Output Manager: added a button to enable/disable USB hotplugging (disabled by default) - * UI/Function Live Edit: restore basic live editing of Sequences - * UI/RGB Matrix Editor: fixed save to Sequence feature - * UI/Function Manager: when cloning a Sequence, clone the bound Scene too - * Virtual Console/Button: highlight border with orange color when in "monitoring" state - * Virtual Console/Slider: fix DMX values not updated when interacting with the mouse wheel, keyboard or Click And Go button - * Virtual Console/Slider: fix level mode values range scaling - * Virtual Console/XYPad: the speed of a running EFX preset can now be controlled by a Speed Dial widget - * RGB Scripts: added "Noise", "3D Starfield", "Random pixel per row" and "Random pixel per row multicolor" (thanks to Doug Puckett) - * Web access: added basic authentication support (thanks to Bartosz Grabias) - * Web access: fixed solo frames collapse state - * Web access: update feedbacks when a slider is moved - * New fixtures: IMG Stageline BEAM-40 WS/RGBW, Fun-Generation LED Diamond Dome (thanks to Tolmino Muccitelli) - * New fixture: Elation Cuepix Batten (thanks to Saul Vielmetti) - * New fixture: Clay Paky Tiger Scan HMI 575/1200 (thanks to Daris Tomasoni) - * New fixture: Litecraft WashX.21 (thanks to Hannes Braun) - * New fixtures: Briteq Stagepainter 12, Nicols IP Wash 120, Showtec LED Powerline 16 Bar (thanks to Fredje Gallon) - * New fixtures: Nicols Movelight, Nicols Birdy Wash 122, Briteq Giga Flash RGB (thanks to Fredje Gallon) - * New fixtures: Litecraft PowerBar AT10.sx, Stairville MH-z1915 (thanks to Thorben / Fredje) - * New fixtures: Martin MAC 700 Wash, ADB Warp M (thanks to Thorben) - * New fixture: Laserworld CS-1000RGB Mk II (thanks to Piotr Nowik) - * New fixture: Chauvet COLORrail IRC (thanks to Lane Parsons) - * New fixtures: American DJ COB Cannon Wash DW, lightmaXX Vega Zoom Wash Beam (thanks to Florian Gerstenlauer) - * New fixture: Martin Rush MH5 Profile (thanks to Falko) - * New fixture: Cameo Flash Bar 150 (thanks to Kevin Wimmer) - * New fixtures: Chauvet FXpar 9, IMG Stageline Wash-40 LED (thanks to PeterK) - * New fixtures: JB Systems iRock 5C, JB Systems LED Devil (thanks to Andres Robles) - * New fixtures: beamZ BAC406, Geni Mojo Color Moc (thanks to Mark Sy) - * New fixtures: Stairville MH-250 S, Chauvet GigBAR 2, Pro-Lights Onyx (thanks to Freasy) - * New fixtures: Coemar ProSpot 250 LX, Showtec Kanjo Spot 60 (thanks to Flo Edelmann) - - -- Massimo Callegari Sat, 28 Oct 2017 12:13:14 +0200 - -qlcplus (4.11.0) stable; urgency=low - - * engine: fixed setting start/end color while a RGB Matrix is running - * engine: fixed crash when pausing a Show with an unavailable audio file - * engine: major rework of Sequences. Projects using them need to be migrated - * UI: enabled Alt key combinations on macOS to behave like other platforms (thanks to Matt Mayfield) - * UI/RGB Panel: added panel direction (thanks to Raivis Rengelis) - * UI/Fixture Manager: added weight and power consumption information on fixtures/universe selection (Chris de Rock idea) - * UI/Scene Editor: preserve fixture tab order when fixtures with no channels set are present - * UI/RGB Matrix Editor: allow the preview to run even in operate mode - * UI/Audio Editor: added the possibility to loop an audio file (thanks to Raivis Rengelis) - * UI/Simple Desk: fixed crash when changing values from a channel group in "fixtures view" mode - * Virtual Console: prevent unwanted feedbacks from widgets in inactive Frame pages (thanks to Lukas Jähn) - * Virtual Console: fixed manual selection of input channels not considering Frame pages (thanks to Lukas Jähn) - * Virtual Console: fixed input profiles channels not honored on frame pages other than the first (thanks to Lukas Jähn) - * Virtual Console/Slider: improved level monitoring with the possibility to act like a Simple Desk slider (see documentation) - * Virtual Console/Frame: fixed 4.10.5b regression disabling widgets when switching page in design mode - * Virtual Console/Frame: fixed key controls not copied when cloning a frame (thanks to Lukas Jähn) - * Virtual Console/Frame: added the possibility to jump directly to a page and assign page names (thanks to Lukas Jähn) - * Virtual Console/Cue List: improved linked crossfade to perform an additive blending between steps (see documentation) - * Virtual Console/Speed Dial: improved tap button blinking and feedbacks (thanks to Lukas Jähn) - * Virtual Console/Speed Dial: it is now possible to copy/paste factors (thanks to Jan Dahms) - * Virtual Console/Clock: added external input support for countdown and stopwatch modes (thanks to Lukas Jähn) - * Plugins/OSC: added channel number calculator in configuration page to help integrating new controllers - * Plugins/Loopback: fixed spurious values emitted when a lot of channels are looped - * Web access: fixed VC Slider in percentage mode and inverted appearance (thanks to Bartosz Grabias) - * Web access: support VC Slider reduced range when in level mode - * Web access: improved getChannelsValues and added Simple Desk reset per-channel (sdResetChannel API) - * Web access: implemented keypad increase/decrease buttons (thanks to Santiago Benejam Torres) - * New input profile: Zoom R16 (thanks to Benedict Stein) - * New MIDI template: Akai APC40 MK2 Ableton mode (thanks to Branson Matheson) - * New fixture: American DJ FREQ 5 Strobe (thanks to Martin Bochenek) - * New fixture: Martin Rush MH3 (thanks to Ed Middlebrooks) - * New fixture: Eurolite LED ACS BAR-12 (thanks to Michael Horber) - * New fixtures: Martin Rush MH6 Wash, Cameo Studio PAR 64 RGBWA UV 12W (thanks to Piotr Nowik) - * New fixtures: ETEC Moving Spot 60E, Cameo CLM PAR COB 1, Showtec Compact Power Lightset COB (thanks to Freasy) - * New fixture: Stairville Tri Flat PAR Profile 5x3W RGB (thanks to Freasy) - * New fixture: American DJ Punch LED Pro (thanks to Benedict Stein) - * New fixtures: Contest Mini-Head 10W, Contest Evora B2R (thanks to Fredje Gallon) - * New fixture: Robe DJ Scan 150 XT (thanks to Allan Madsen) - * New fixtures: Futurelight PRO Slim PAR-12 HCL, PRO Slim PAR-12 MK2 HCL, Showtec Power Spot 9 Q5 (thanks to Lukas Jähn) - * New fixture: Showtec XS-1W Mini Moving Beam (thanks to Habefaro) - * New fixtures: Stage Right Stage Wash 18Wx18 LED PAR, Stage Right 7x20W COB LED Theater PAR (thanks to Collin Ong) - * New fixture: Cameo CLPIXBAR450PRO, CLPIXBAR650PRO (thanks to Jean-Daniel Garcia & Jeremie Odermatt) - * New fixture: Clay Paky Alpha Beam 1500 (thanks to Louis Gutenschwager) - * New fixture: Stairville AFH-600 (thanks to Hannes Braun) - * New fixture: Involight LED MH77S (thanks to Jászberényi Szabolcs) - * New fixtures: ETEC LED PAR 64 18x10W RGBWA, LED PAR 64 18x15W RGBWA Zoom (thanks to Simon Orlob) - * New fixture: Chauvet Swarm Wash FX (thanks to Stephen Olah) - * New fixture: Clay Paky Alpha Spot HPE 575 (thanks to Rohmer) - * New fixture: Robe LED Blinder 196LT (thanks to Tim Cullingworth) - * New fixture: Chauvet COLORband T3 USB (thanks to Ian Nault) - * New fixtures: American DJ Dotz Matrix, Martin Jem Compact Hazer Pro,Geni Mojo Spin Master Series (thanks to Sam Brooks) - * New fixture: American DJ XS 400 (thanks to Jared) - * New fixture: Velleman VDP1500SM (thanks to Freddy Hoogstoel) - * New fixture: Chauvet Intimidator Spot 355Z IRC (thanks to Michael Clements) - * New fixture: CLF Tricolor Mini Par (thanks to Jaron Blazer) - * New fixture: Varytec LED Easy Move Mini Beam & Wash RGBW (thanks to Erik) - * New fixtures: Smoke Factory Tour-Hazer II, JB Systems Panther, Robe Spot 160 XT (thanks to Thierry Rodolfo) - * New fixture: American DJ LED Trispot (thanks to Patrick) - * New fixtures: Contest STB-520 1500W Strobe, Elumen8 COB Tri 4 Pixel Batten, Briteq Tornado 7 (thanks to Robert Box) - * New fixtures: American DJ 5P Hex, Pro-Lights Moonstone, Chauvet Intimidator Hybrid 140SR (thanks to Robert Box) - * New fixtures: Robe Robin DLX Spot (thanks to Robert Box) - * New fixture: ETC ColorSource PAR (thanks to Jon Rosen) - * New fixture: lightmaXX 5ive STAR LED (thanks to Thomas Weber) - * New fixture: Talent BL252A (thanks to Massimiliano Palmieri) - * New fixtures: Showtec: Infinity iW-1915, Infinity XPLO-15 LED Strobe (thanks to Daniele Fogale) - * New fixtures: Showtec: Infinity iB-5R, Compact Par 18 MKII, Phantom 20 LED Beam (thanks to Nicolò Zanon) - * New fixture: Griven Gobostorm Plus MK2 (thanks to Attilio Bongiorni) - * New fixture: Chauvet Freedom Stick (thanks to Jay Szewczyk) - * New fixture: Eurolite TMH-14, Chauvet Intimidator Trio (thanks to Chris de Rock) - * New fixture: Chauvet Scorpion Dual (thanks to Alan Chavis) - * New fixture: American DJ Ultra Hex Bar 12 (thanks to Rhavin) - * New fixture: Equinox Photon - * New fixture: QTX MHS-60 (thanks to Nerijus Mongirdas) - * New fixture: Eurolite LED TMH FE-600, MARQ Colormax Par64, Stairville CLB2.4 Compact LED PAR System (thanks to Klaus Muth) - * New fixture: Chauvet SlimPar Hex 6 (thanks to Yinon Sahar) - * New fixture: IMG Stageline PARL 20 DMX (thanks to Felix Pickenäcker) - * New fixtures: Pro-Lights SmartBatHEX, Fury FY250W, Fury FY250S (thanks to Lorenzo Andreani) - * New fixture: American DJ Ikon Profile (thanks to Ham Sadler) - * New fixture: HQ Power Aeron Wash 575, JB Systems Space Color Laser (thanks to Ricardo Mendes) - * New fixture: American DJ VPar (thanks to Eric Eskam) - * New fixtures: MARQ Gesture Beam/Wash 102, Colormax Bat, Gesture Spot 100 (thanks to John Yiannikakis) - * New fixtures: Chauvet COLORado 3P, Legend 330SR Spot, SlimPar HEX 3 (thanks to Kevin Zepp) - * New fixture: American DJ Mini Dekker (thanks to Chris Davis) - * New fixtures: American DJ Vizi BSW 300, Blizzard Lighting Flurry 5 (thanks to George Qualley) - * New fixtures: Pro-Lights PIXIEWASH, Accent1Q, CromoSpot300 (thanks to Tolmino Muccitelli) - * New fixtures: Involight LED MH50S, LED PAR 180, SBL 2000 (thanks to Facek) - * New fixture: Pro-Lights Miniruby (thanks to Dario Gonzalez) - * New fixture: Sagitter Smart DL Wash (thanks to Simu) - * New fixtures: Eurolite LED THA-250F, Pro-Lights StudioCOBFC (thanks to Andrea Ugolini) - * New fixture: American DJ Stinger Spot (thanks to Jason R. Johnston) - * New fixture: Stairville Blade Sting 8 RGBW Beam Mover - - -- Massimo Callegari Sat, 24 Jun 2017 12:13:14 +0200 - -qlcplus (4.10.5b) stable; urgency=high - - * engine: fixed 4.10.5 regression on RGB Matrix preset step color calculation - * Virtual Console/Frame: fixed widgets disable state when switching pages - * Virtual Console: fixed SpeedDial and Animation widget presets feedbacks, and allow to use custom feedbacks - * Plugins/DMX USB: fixed 4.10.5 regression preventing to receive data from PRO devices - * Plugins/DMX USB: [Windows] fixed a long standing bug causing random crashes when receiving DMX data - * Plugins/MIDI: [macOS] further changes to support virtual ports - * New fixtures: Stairville M-Fog 1000 DMX, Cameo Superfly XS (thanks to Konni) - * New fixture: ColorKey WaferPar Quad-W 12 (thanks to Taylor) - * New fixture: Eurolite LED PARty RGBW (thanks to Heiko Fanieng) - * New fixture: lightmaXX Platinum CLS-1 (thanks to Marc Geonet) - - -- Massimo Callegari Mon, 26 Dec 2016 12:13:14 +0200 - -qlcplus (4.10.5a) stable; urgency=high - - * engine: fixed playback of a chaser within a chaser - - -- Massimo Callegari Mon, 12 Dec 2016 12:13:14 +0200 - -qlcplus (4.10.5) stable; urgency=low - - * Engine: added indigo to fixture channel colors (thanks to Axel Metzke) - * Engine: properly handle RGB Matrices with generic dimmers (Jano Svitok) - * UI/Function Manager: fix crash when trying to clone a folder (David Garyga) - * UI/RGB Matrix Editor: editor preview doesn't stop when testing the Function - * UI/Collection Editor: allow multiple selection and added Function reordering buttons - * UI/Remap: fixed universes list in target mapping - * UI/Remap: fixed wrong Scene remapping when mixing cloned and new fixtures - * UI/Remap: added remapping also of Fixture Groups - * Virtual Console/Frame: Show page number when collapsed (thanks to Matthias Gubisch) - * Virtual Console/Cue List: allow to choose playback buttons layout (Play/Pause + Stop or Play/Stop + Pause) - * Plugins/DMX USB: fixed crash happening on PRO devices when receiving a full universe - * Plugins/DMX USB: [MacOS] fixed regression caused by the Qt libraries on PRO devices - * Plugins/MIDI: [MacOS] added support for virtual ports, show only active devices and properly handle hotplug - * Fixture Editor: fixed minimum value of a new capability not updating correctly - * RGB Scripts: added One by one (Jano Svitok) - * New fixtures: Pro-Lights LumiPIX 12Q, Proel PLLEDMLBG (thanks to Andrea Ugolini) - * New fixtures: Stairville DCL Flat Par 18x4W CW/WW, Cameo LED MultiPAR CLM-PAR-COB1 (thanks to Freasy) - * New fixtures: High End Systems Studio Beam, lightmaXX EASY Wash 5IVE LED (thanks to Freasy) - * New fixture: iSolution iColor 4 (thanks to withlime) - * New fixtures: ETC ColorSource Spot, Blizzard Lighting LB-Par Hex (thanks to Robert Box) - * New fixtures: American DJ: Chameleon QBar Pro,DJ Vizi Beam RXONE, XS 600, Focus Spot Three Z (thanks to Robert Box) - * New fixture: JB-Lighting Varyscan P6, Cameo Wookie series, Cameo Hydrabeam series (thanks to Andres Robles) - * New fixture: Chauvet RotoSphere LED (thanks to Carl Eisenbeis) - * New fixture: Briteq Spectra 3D Laser (thanks to Robert Box + Freasy) - * New fixture: Martin MH2 Wash (thanks to John Yiannikakis + Freasy) - * New fixture: American DJ Flat Par Tri7X (thanks to Brian) - * New fixtures: Ledj Stage Color 24, 59 7Q5 RGBW, 59 7Q5 RGBA (thanks to Paul Wilton) - * New fixtures: American DJ: Inno Spot Elite, Stinger, Tri Phase (thanks to Piotr Nowik) - * New fixtures: Showtec Phantom 95 LED Spot, Futurelight PHS-260 (thanks to Piotr Nowik) - * New fixture: Blizzard Lighting Rocklite RGBAW (thanks to Larry Wall) - * New fixture: American DJ Comscan LED (thanks to Chris) - * New fixtures: PR Lighting XL 250/XL 700 Wash/XL 700 Spot, American DJ Accu Fog 1000 (thanks to István Király) - * New fixtures: Equinox Ultra Scan LED, Kam Powercan84W, QTX HZ-3 (thanks to Chris Moses) - * New fixture: Eurolite TMH-10 (thank to exmatrikulator) - * New fixture: Eurolite LED SLS 5 BCL, Robe Fog 1500 FT (thanks to Christian Hollbjär) - * New fixture: SGM Giotto Spot 400 (thanks to Mihai Andrei) - * New fixture: Pulse LEDBAR 320 (thanks to Allan Rhynas) - * New fixture: Equinox Swing Batten (thanks to Dean Clough) - * New fixture: Cameo Pixbar 600 PRO, Chauvet COLORado 1 Quad Zoom Tour (thanks to Andrew Hallmark) - * New fixture: Involight FM900 DMX (thanks to Jászberény Szabolcs) - * New fixture: Showtec Stage Blinder Series (thanks to Antoni J. Canós) - * New fixture: MARQ Gamut PAR H7 (thanks to Lance Lyda) - * New fixtures: Chauvet: SlimPAR QUV12 USB, SlimPAR PRO H USB, Scorpion Bar RG (thanks to Pete Mueller) - * New fixture: Stairville CLB8 Compact LED PAR System (thanks to Detlef Fossan) - * New fixture: Chauvet Cubix 2.0 (thanks to Jungle Jim) - * New fixture: Showtec Giant XL LED (thanks to Samuel Hofmann) - * New fixtures: SGM: Idea Beam 300, Idea Led Bar 100, Idea Spot 700, Newton 1200 (thanks to Oscar Cervesato) - * New fixtures: Pro Lights LumiPAR18QTour, Elation SIXPAR 200IP (thanks to Oscar Cervesato) - * New fixture: Stairville Beam Moving Head B5R, American DJ Flat Par TW12, Varytec Easy Scan XT Mini (thanks to Thierry Rodolfo) - - -- Massimo Callegari Sat, 3 Dec 2016 12:13:14 +0200 - -qlcplus (4.10.4) stable; urgency=low - - * Scripts: Fix 4.10.3a regression that breaks values parsing (David Garyga) - * Engine: fix relative paths when opening a project from the command line - * Engine: improved the start/stop mechanism of Functions within a Show - * Chaser Editor: a newly created step is now selected automatically - * Scene Editor: fixed the tab order of the fixtures - * Show Manager: added the possibility to pause a Show leaving the lights on - * Show Manager/Audio: allow to display the waveform preview while playing a file - * UI/Function Selection: fix crash on workspaces where a scene ID is bigger than its sequence ID (David Garyga) - * UI/Video: fixed the fullscreen positioning on Windows - * Virtual Console/Animation: fix behavior issue when changing the associated function (David Garyga) - * Virtual Console/Frames: send feedbacks for the enable button - * Virtual Console/Frames: fix 4.10.3 regression causing frames to resize after configuration - * Virtual Console/Cue List: playback can now be paused and resumed (see documentation) - * Virtual Console/Cue List: added a dedicated stop button, with external controls - * Virtual Console/XYPad: fixed computation of reversed fixture position (Luca Ugolini) - * Plugins/OSC: fixed regression of receiving data from the wrong interface (David Garyga) - * Plugins/OSC: fixed regression causing not receiving data anymore when changing the input profile (David Garyga) - * Plugins/MIDI: distinguish MIDI beat clock start and stop (see documentation) - * Input Profiles Editor: it is now possible to define button custom feedbacks in a profile (see documentation) - * New input profile: Novation Launchpad Pro (thanks to David Giardi) - * New RGB script: Balls (color) (thanks to Rob Nieuwenhuizen) - * Fixture updated: Starway MaxKolor-18 (thanks to Thierry Rodolfo and Robert Box) - * Fixture updated: Cameo LED RGBW PAR64 18x8W (thanks to Lukas) - * New fixture: American DJ Mega QA Par38 (thanks to Nathan Durnan) - * New fixture: Martin MAC 250 Wash (thanks to Robert Box) - * New fixture: Luxibel LX161 (thanks to Freddy Hoogstoel) - * New fixture: Stairville MH-X60th LED Spot (thanks to Jasper Zevering) - * New fixture: Cameo CLHB400RGBW (thanks to Mihai Andrei) - * New fixture: Showlite Flood Light Panel 144x10mm LED RGBW (thanks to Ex) - * New fixture: Color Imagination LedSpot 90 (SI-052), Robe Spot 575 XT (thanks to DJ Ladonin) - * New fixture: Chauvet Mini Kinta (thanks to Jonathan Wilson) - * New fixture: Eurolite LED ML-56 QCL RGBW-RGBA 18x8W (thanks to Matthijs ten Berge) - * New fixture: High End Systems TechnoSpot (thanks to Tom Moeller) - * New fixtures: American DJ Inno Pocket Spot Twins, Fog Fury 3000 WiFly, Event Bar Pro (thanks to MaBonzo) - * New fixtures: American DJ Galaxian Gem IR, Vizi Roller Beam 2R (thanks to MaBonzo) - * New fixture: Ayra ERO 506 (thanks to Bert Heikamp) - * New fixture: Ayrton Arcaline 100 RGB, Martin Magnum Hazer (thanks to Thierry Rodolfo) - * New fixtures: American DJ Asteroid 1200, Eurolite GKF-60, Eurolite LED FE-700 (thanks to Flox Garden) - * New fixtures: Antari X-310 Pro Fazer, lightmaXX CLS-2 (thanks to Flox Garden) - * New fixture: Beamz MHL90 Wash 5x18W RGBAW-UV (thanks to Hans Erik Tjelum) - * New fixture: PR Lighting Pilot 150 (thanks to David Read) - * New fixture: lightmaXX Platinum CLS-1 (thanks to Marc Geonet) - - -- Massimo Callegari Sun, 29 May 2016 12:13:14 +0200 - -qlcplus (4.10.3a) stable; urgency=low - - * Scripts: Fix 4.10.3 regression that breaks time values parsing (David Garyga) - * RGBMatrix Editor: Fix 4.10.3 regression where QLC+ hangs on duration < 20ms (David Garyga) - - -- Massimo Callegari Wed, 9 Mar 2016 22:03:14 +0200 - -qlcplus (4.10.3) stable; urgency=low - - * Engine: Fix intensity channels forced back to HTP after LTP not working correctly (David Garyga) - * Engine: Fix functions with low intensity killing current fade outs (David Garyga) - * Audio Capture: Fix crash when selecting another audio input while a capture is running (David Garyga) - * Audio Capture: Fix crash when trying to use a wrongly configured audio input (David Garyga) - * Scene Editor: Remember Channels Groups values when saving and loading a workspace (David Garyga) - * Scene Editor: Remember fixtures even with no activated channel (David Garyga) - * RGBMatrix Editor: Fix preview now working when fade in > 0 (David Garyga) - * RGBMatrix Editor: Fix length of fadeout on the preview (David Garyga) - * Show Manager: Fix crash when editing the total time of an empty chaser (David Garyga) - * Show Manager/Function Selection: Fix sequences always displayed even with Chasers and Scenes both filtered out (David Garyga) - * Speed Dials: Fix display and input of the milliseconds field, update precision from 10ms to 1ms (David Garyga) - * Input/Output Manager: Forbid deleting universes in the middle of the list, this prevents a lot of bugs and crashes (David Garyga) - * Simple Desk: the number of faders is now dynamic depending on the window size (unless forced via config file) - * Plugins/ArtNet: Fix input and output initialization conflict that results in no input (David Garyga) - * Plugins/ArtNet: Allow sending and receiving ArtNet on several different interfaces (David Garyga) - * Plugins/ArtNet: Allow selecting a different ArtNet input universe (David Garyga) - * Plugins/ArtNet: Fix configuration issue that prevents setting a parameter back to its default value (David Garyga) - * Plugins/OSC: Fix configuration issue that prevents setting a parameter back to its default value (David Garyga) - * Plugins/OSC: OSC Output values range from 0.0 to 1.0 - * Plugins/OSC: Properly handle OSC bundles (restores Lemur compatibility) - * Virtual Console: Fix copy of a frame containing a submaster slider resulting in a broken submaster (David Garyga) - * Virtual Console/Slider: Enable function filters in playback function selection (David Garyga) - * Virtual Console/Slider: Allow to force to LTP color channels controlled by a Click & Go button - * Virtual Console/Solo Frame: Fix sliders in playback mode not actually stopping the attached function when the slider reaches 0 (David Garyga, thanks to Tubby) - * Virtual Console/Animation: Can now be used in solo frames (David Garyga) - * Virtual Console/Frames: fix page cloning of a nested multipage frame - * Virtual Console/Frames: fix disabling frame pages. Now widgets get actually deleted - * Web access: fixed custom fixtures loading - * Web access: added a DMX keypad that can be accessed from the Simple Desk (thanks to Santiago Benejam Torres) - * Input profiles: added Behringer BCR2000 (thanks to Michael Trojacher) - * Input profiles: added Lemur iPad Studio Combo - * RGB Scripts: added Strobe script (thanks to Rob Nieuwenhuizen) - * New fixtures: Stellar Labs ECO LED PAR56, Chauvet Colorpalette II (thanks to Jimmy Traylor) - * New fixtures: Chauvet: COLORado 1 Solo, Ovation FD-165WW, Rogue RH1 Hybrid, COLORdash Par Hex 12, COLORdash Accent Quad (thanks to Robert Box) - * New fixtures: Chauvet: Vue 1.1, Intimidator Spot 100 IRC, Abyss USB, COREpar 40 USB, COREpar UV USB (thanks to Robert Box) - * New fixtures: Chauvet: Intimidator Scan 305 IRC, Intimidator Barrel 305 IRC, SlimPAR T6 USB, SlimBANK TRI-18 (thanks to Robert Box) - * New fixtures: Eurolite LED CLS-9 QCL RGBW 9x8W 12, JB-Lighting A12 Tunable White, SGM G-Profile (thanks to Robert Box) - * New fixtures: Coemar Par Lite LED RGB, OXO LED Funstrip DMX, American DJ Stinger II (thanks to Robert Box) - * New fixture: Chauvet LED PAR 64 Tri-C (thanks to Jungle Jim and Robert Box) - * New fixtures: American DJ VBar, American DJ Jellydome, Briteq LDP Powerbar 6TC/12TC (thanks to Thierry Rodolfo) - * New fixture: Sagitter Slimpar 18 RGB (thanks to Daniele Fogale) - * New fixture: Microh LED Tri Bar (thanks to Michael Tughan) - * New fixture: American DJ 12P Hex Pearl (thanks to Ethan Moses) - * New fixture: JB-Lighting JBLED A7 (thanks to BLACKsun) - * New fixture: Chauvet COREpar 80 USB (thanks to Chris Gill) - * New fixture: Stairville DJ Lase 25+25-G MK-II (thanks to galaris) - * New fixtures: PR Lighting XR 230 Spot, PR Lighting XLED 1037 (thanks to Ovidijus Cepukas) - * New fixtures: Futurelight DJ-Scan 600, Eurolite LED PAR-64 RGBW+UV (thanks to Ovidijus Cepukas) - * New fixtures: Varytec LED Pad 7 BA-D, American DJ X-Scan LED Plus, Showtec Blade Runner (thanks to DjProWings) - * New fixture: Involight LED CC60S (thanks to Stephane Hofman) - * New fixture: Stairville MH-x200 Pro Spot (thanks to Mirek Škop) - * New fixtures: Varytec LED Giga Bar 4 MKII, Eurolite LED KLS Laser Bar FX Light Set (thanks to Daniel Schauder) - * New fixture: Chauvet Mayhem (thanks to Jonathan Wilson) - * New fixture: Ayra TDC Agaricus (thanks to Rob Nieuwenhuizen) - * New fixture: American DJ Pinspot LED Quad DMX (thanks to Christian Polzer) - * New fixture: Stairville AF-180 LED Fogger Co2 FX (thanks to Johannes Uhl) - - -- Massimo Callegari Sun, 6 Mar 2016 20:21:22 +0200 - -qlcplus (4.10.2) stable; urgency=low - - * Engine: added support for devices hotplug (DMX USB, MIDI, HID, Peperoni) - * Engine: Universe passthrough data is now merged with QLC+ output, it is not affected by QLC+ processing - (except for blackout) and it appears in the DMX monitor (Jano Svitok) - * Audio: fixed playback of 24/32 bit wave files and Show Manager waveform preview - * DMX Dump: it is now possible to dump DMX values on an existing Scene - * ClickAndGo Widgets: Preset widgets now display the channel name on top of the capability list (David Garyga) - * Function Manager: fix startup Function not cleared when deleting it (David Garyga) - * Function Manager: highlight current startup Function when opening the Function selection dialog (David Garyga) - * Function Selection: Don't lose the current selection when changing the function type filter (David Garyga) - * Show Manager: fixed looped functions never stopping with certain durations (Jano Svitok) - * Show Manager: fixed copy/paste of an existing Chaser - * Show Manager: fix crashes when copying a sequence on an empty track (David Garyga) - * Show Manager: repair conflicting sequences when loading a broken workspace (David Garyga) - * EFX Editor: removed the intensity control. Please use separate Scenes for that - * Virtual Console/Slider: fixed copy of the channel monitor mode (David Garyga) - * Virtual Console/Slider: in level mode, activate only in operate mode and don't hold forced LTP channels (David Garyga) - * Virtual Console/Slider: in playback mode, ignore the fade in/fade out of the attached Function (David Garyga) - * Virtual Console/XYPad: added Fixture Group preset, to control a subgroup of Fixtures (see documentation) - * Virtual Console/XYPad Properties: fixture ranges can now be set in degrees, percentage or DMX values - * Virtual Console/XYPad Properties: fix manual input selection for presets (David Garyga) - * Virtual Console/Cue List: improved mixed usage of crossfader and next/previous buttons (David Garyga) - * Virtual Console/Cue List: fix effect of a submaster slider on a Cue List in crossfader mode (David Garyga) - * Virtual Console/Cue List: fix crash when adding steps to the chaser being run by a Cue List (David Garyga) - * Virtual Console/Audio Triggers: fix virtual console buttons triggering (David Garyga) - * Virtual Console/Input Selection: allow custom feedbacks only on an assigned source and don't crash (David Garyga) - * DMX Monitor: Fix strobing in 2D view (Jano Svitok) - * Fixture Editor: Fix crash in the Channel Editor (David Garyga) - * Plugins/uDMX: added support for AVLdiy.cn clone (thanks to Vitalii Husach) - * Plugins/DMXUSB: (Linux) fixed data transmission of DMX4ALL NanoDMX - * Input Profiles: added an option for Buttons to always generate a press/release event - * New input profile: Touch OSC Automat5 - * New input profile: Novation Launch Control (thanks to Giacomo Gorini) - * Updated fixture: Stairville xBrick Full-Colour 16X3W (thanks to Rico Hansen) - * Updated fixture: Stairville MH-100 Beam 36x3 LED (thanks to Antoni J. Canos) - * Updated fixture: American DJ Revo 3 (thanks to David Pilato) - * New fixture: American DJ Dotz Flood - * New fixture: Chauvet COLORdash Par Quad-7 - * New fixtures: Robe ColorWash 1200E AT, American DJ Starburst, Chauvet LED PAR 64 Tri-B (thanks to Robert Box) - * New fixtures: Cameo Multi Par 3, HQ Power VDPL110CC LED Tri Spot, Showtec LED Pixel Track Pro (thanks to Robert Box) - * New fixtures: American DJ: Inno Pocket Z4, On-X, WiFly EXR Dotz Par, WiFly EXR HEX5 IP, COB Cannon Wash Pearl (thanks to Robert Box) - * New fixtures: BoomTone DJ Sky bar 288 LED, BoomToneDJ Strob LED 18, BoomToneDJ Froggy LED RGBW (thanks to Didou) - * New fixture: iSolution iMove 250W (thanks to Thierry Rodolfo) - * New fixture: Talent BL63 10" LED Bar (thanks to FooSchnickens) - * New fixtures: Contest Oz-37x15QC, Evora DUO B2R, Evora Beam 5R, Evora Beam 15R (thanks to Jan Lachman) - * New fixtures: Blizzard Lighting Lil G, Pixellicious, Lo-Pro CSI (thanks to Alton Olson) - * New fixtures: Stairville LED Matrix Blinder 5x5, Showtec Power Spot 9 Q6 Tour V1 (thanks to Samuel) - * New fixture: Blizzard Lighting StormChaser (thanks to Brent) - * New fixtures: Showtec Explorer 250 Pro MKII, Showtec Pixel Bar 12 (thanks to Henk de Gunst) - * New fixture: Philips Selecon PLProfile1 MkII (thanks to Freasy) - * New fixture: PSL Strip Led RGB code K2014 (thanks to Lorenzo Andreani) - * New fixture: Chauvet SlimPar Pro Tri (thank to Bulle) - * New fixture: Chauvet GigBar IRC (thanks to JD-HP-DV7 and Jungle Jim) - * New fixtures: Ghost Green 30, KOOLlight 3D RGB Laser, Mac Mah Mac FOG DMX (thanks to David Pilato) - - -- Massimo Callegari Sun, 13 Dec 2015 20:21:22 +0200 - -qlcplus (4.10.1) stable; urgency=high - - * Virtual Console/Cue List: improved step fader behaviour (David Garyga) - * Plugins/DMXUSB: Fixed regression affecting Linux users and OSX users using the libFTDI interface - * Plugins/ArtNet/E1.31/OSC: Improved network interfaces detection - * New fixture: Enterius EC-133DMX (thanks to Krzysztof Ratynski) - * New fixture: Showtec Dragon F-350 (thanks to Jasper Zevering) - * New fixtures: JB Systems Lounge Laser DMX, JB Systems Super Solar RGBW (thanks to Robert Box) - - -- Massimo Callegari Wed, 21 Oct 2015 20:21:22 +0200 - -qlcplus (4.10.0) stable; urgency=low - - * Channel Groups: Fix crashes related to invalid channels (David Garyga) - * Chaser: Fix flickering issue when chaser order is Random (David Garyga) - * Engine: some more fixes on forced HTP/LTP channels - * Engine: fixed 4.9.x regression causing QLC+ to hang at the end of audio playback - * RGB Matrix Audio Spectrum: Fix crash when audio input volume is set to zero (David Garyga) - * RGB Matrix: Fix 4.9.1 regression which makes fading of green and blue colors not smooth (David Garyga) - * RGB Matrix: Introduced blending mode between matrices (see documentation) - * Audio Input: Fix crashes when selecting another audio input device while an audio input driven function/widget is running (David Garyga) - * Audio Input: It is now possible to select the audio input format (sample rate and channels) - * Video: fixed playback from a time offset (where possible) - * Video: (Windows) Videos now have a black background, like all the other platforms - * Add Fixture dialog: Generic fixtures don't take the number of channels of the previously selected fixture (David Garyga) - * Add Fixture dialog: Fix address 512 not usable by adding several fixtures at a time (David Garyga) - * Scene Editor: correctly select the fixture tab when switching from tabbed/all channels view - * EFX Editor: it is now possible to use an EFX on RGB channels (thanks to Giorgio Rebecchi) - * Collection Editor: added preview button (thanks to Giorgio Rebecchi) - * Fixture Remap: fixed remapping of EFX functions - * Function Wizard: improved creation of color scenes for RGB panels - * Function Wizard: automatically set a gobo picture (if available) on buttons attached to gobo Scenes - * Show Manager: Fix some cursor teleportation issues (David Garyga) - * Simple Desk: Fix cue playback on universes 2+ (David Garyga) - * Simple Desk: Fix crash when selecting recently added universe (David Garyga) - * Simple Desk: Added reset buttons to reset a single channel - * Simple Desk: Fix page count when channels per page does not divide 512 (Jano Svitok, reported by Florian) - * Virtual Console: fixed Grand Master not sending feedbacks - * Virtual Console/Input Controls: implemented custom feebacks. For now used only by VC buttons - * Virtual Console/Solo Frame: Option to allow mixing of sliders in playback mode (David Garyga) - * Virtual Console/Speed Dial: Introduced multiplier/divisor, apply and presets buttons (see documentation) - * Virtual Console/Button: allow to set a background picture - * Virtual Console/Cue List: Options for the Next/Previous buttons behavior (David Garyga) - * Virtual Console/Cue List: Fixed playback of a Chaser in reverse order (David Garyga) - * Virtual Console/Cue List: Added a new "Steps" mode for the side faders (see documentation) - * Virtual Console/Cue List: Allow to resize columns to 0 pixels, to completely hide them - * Virtual Console/XYPad: Introduced presets, including the usage of existing EFX and Scenes (see documentation) - * Virtual Console/XYPad: Fix DMX output not working when going to Operate mode while the XYPad is disabled (David Garyga, thanks to bestdani) - * Input Profiles: added an option for MIDI profiles to feedback a Note Off or a Note On with 0 velocity. APCMini now works out of the box. (Jano Svitok) - * Input Profiles: Improved BCF2000 Input profile (thanks to Lorenzo Andreani) - * Plugins/MIDI: (Linux) Fixed data transmission to multiple devices (thanks to Adrian Kapka) - * Plugins/MIDI: fixed Program Change handling on OSX and Windows - * Plugins/MIDI: (Windows) do not close the device when sending SysEx data - * Plugins/ArtNet: it is now possible to enter an arbitrary output IP - * Plugins/OSC: it is now possible to enter an arbitrary output IP - * Plugins/E1.31: added stream priority to configuration (thanks to Nathan Durnan) - * Plugins/E1.31: added unicast support (David Garyga) - * Plugins/DMXUSB: fixed close/open sequence on a Enttec Pro input line - * Web Access: implemented frames collapse functionality - * RGB Scripts: added Plasma Colors script (thanks to Nathan Durnan) - * Fixture Editor: Channel capability editing is now done in a single window - * Updated fixture: Showtec Indigo 6500 (thanks to Jochen Becker) - * New fixture: Ayra ComPar 20 (thanks to Rob Nieuwenhuizen) - * New fixture: XStatic X-240Bar RGB (thanks to Nathan Durnan) - * New fixture: Venue ThinPAR 38 (thanks to Thierry Rodolfo) - * New fixtures: Contest MiniCube-6TCb, Eurolite LED FE-1500, Lightronics FXLD618C2I, JB Systems COB-4BAR (thanks to Robert Box) - * New fixtures: Eurolite LED KLS-401, Chauvet Intimidator Wash Zoom 350 IRC, Equinox Party Par LED PAR 56 (thanks to Robert Box) - * New fixtures: Robe Robin MiniMe, PR Lighting Pilot 575, Stairville DJ Lase 150-RGY MkII, JB Systems Dynaspot (thanks to Robert Box) - * New fixtures: American DJ Hyper Gem LED, Robe ColorSpot 575 AT, Kam iLink All Colour Models (thanks to Robert Box) - * New fixtures: Chauvet Intimidator Wave 360 IRC, Varytec LED PAR56 (thanks to Habefaro) - * New fixture: American DJ Fog Fury Jett (thanks to Dean Clough) - * New fixtures: Eurolite TB-250, Futurelight DJ-HEAD 575 SPOT, GLX Lighting Power LED Beam 38 Narrow (thanks to Ovidijus Cepukas) - * New fixture: Pro-Lights UVStrip18 (thanks to Alessandro Grechi) - * New fixtures: American DJ Inno Pocket Beam Q4, Martin ZR24/7 Hazer, Blizzard Lighting Stimul-Eye (thanks to George Qualley) - * New fixture: American DJ Mega TriPar Profile Plus (thanks to George Qualley) - * New fixtures: Pro-Lights SmartBat, Robe ClubWash 600 CT (thanks to Lorenzo Andreani) - * New fixture: Stairville Show Bar Tri 18x3W RGB (thanks to Udo Besenreuther) - * New fixtures: Blizzard Lighting Rokbox Infiniwhite, Chauvet COREpar 80 (thanks to Chris Gill) - * New fixture: Cameo CL Superfly HP (thanks to Stuart Brown) - * New fixture: American DJ Event Bar Q4 (thanks to Maxime Bissonnette-Théorêt) - * New fixture: Cameo LED Moving Head 60W CLMHR60W (thanks to Jasper Zevering) - * New fixtures: Proel PLLED64RGB, Litecraft LED PAR 64 AT3, Robe Robin 300E Beam (thanks to Mihai Andrei) - * New fixture: Electroconcept SPC029 (thanks to Bulle) - * New fixture: Microh Plasmawave 1 RGB (thanks to Rommel) - - -- Massimo Callegari Sun, 18 Oct 2015 20:21:22 +0200 diff --git a/debian/changelog-old b/debian/changelog-old index 118149f319..e02a5031a2 100644 --- a/debian/changelog-old +++ b/debian/changelog-old @@ -1,3 +1,538 @@ +qlcplus (4.11.2) stable; urgency=low + + * engine: fix crash caused by an invalid IO mapping + * engine: fix intensity override not considered during fade outs + * UI/Function Manager: fixed keyboard shortcut conflicts and document them + * UI/Function Manager: allow to import multiple of audio/video files at once + * UI/Channel Groups: added expand/collapse all button helpers + * UI/Chaser Editor: add a button to shuffle the selected Chaser steps (thanks to Felix Edelmann) + * UI/RGBMatrix Editor: fix preview not updating on pattern change when play button is on + * Show Manager: fix crash when adding a Sequence after deleting one + * Show Manager: fix crash when editing a Sequence bound to a deleted Scene + * Show Manager: fix items start time indication when dragging + * Virtual Console/Slider: fix submaster initial value not applied and inverted mode + * Virtual Console/Slider: added 'value catching' option for external controller faders (Lukas Jähn proposal) + * Virtual Console/Slider: fix values range when switching between Slider and Knob appearance + * Virtual Console/Slider: react on Scene flashing when in playback mode + * Virtual Console/Knob: fix DMX values not updated when interacting with the mouse wheel + * Virtual Console/Cue List: allow to select a step with next/previous buttons during pause + * Virtual Console/Cue List: go to the right chaser step after a pause (thanks to Krzysztof Walo) + * Virtual Console/Frame: fix regression preventing to send the disable feedback + * Web Access: added support for VC Buttons in Flash mode (Sylvain Laugié) + * Web Access: added support for VC Frame circular page scrolling (Sylvain Laugié) + * Web Access: update AudioTriggers state when changed from QLC+ (Sylvain Laugié) + * plugins/udmx: added 'channels' configuration parameter (see documentation) + * plugins/E1.31: fix crash on wrong packet length (David Garyga) + * New fixture: DTS XR7 Spot (thanks to Nicolò Zanon) + * New fixture: Ledj Slimline 12Q5 Batten (thanks to Dean Clough) + * New fixture: Ayra Compar Kit 1 (thanks to eigenaardiger) + * New fixtures: GLP Impression X4 S, Eurolite LED KLS-2500 (thanks to Mitsch) + * New fixture: Chauvet Intimidator Spot 255 IRC (thanks to Ham Sadler) + * New fixtures: Chauvet Geyser RGB, Geyser P6 (thanks to Andrew) + * New fixture: Chauvet Rotosphere Q3 (thanks to Eric Sherlock) + * New fixture: Showtec Compact Par 7 Q4 (thanks to Alexander) + * New fixture: Contest Delirium (thanks to Vincent) + * New fixture: Solena Mini Par 12, Max Bar 28 RGB (thanks to Nathan Durnan) + * New fixtures: Showtec Phantom 65, Laserworld PRO-800RGB (thanks to Piotr Nowik) + * New fixture: Chauvet MiN Spot RGBW (thanks to Jungle Jim) + * New fixtures: Showtec Shark Wash One, American DJ Vizi Hex Wash7 (thanks to Georg Müller) + * New fixture: Showtec Shark Beam FX One (thanks to Mats Lourenco) + * New fixture: Stairville novaWash Quad LED (thanks to Luke Bonett) + * New fixtures: Eurolite Party TCL Spot RGB, Expolite TourSpot 60, Expolite TourStick 72 RGBWA (thanks to Dirk J) + * New fixture: Chauvet Hemisphere 5.1, Trident, Scorpion Storm RGX (thanks to Francois Blanchette) + * New fixture: Briteq COB Slim 100-RGB (thanks to Thierry) + * New fixture: American DJ UB 12H (thanks to Jason R Johnston) + * New fixture: American DJ Mega Hex Par (thanks to Ben C) + * New fixture: Cameo Q SPOT 15 RGBW (thanks to Antoine Houbron) + * New fixture: lightmaXX Platinum Line Flat Par COB (thanks to Leonardo) + * New fixture: Stairville LED Blinder 2 COB 2x65W (thanks to chritoep) + * New fixture: lightmaXX LED PAR 64 (thanks to Johannes Felber) + * New fixture: Cameo Thunder Wash Series (thanks to JP) + * New fixtures: Briteq BT 575S, Stairville MH-x30 LED Beam (thanks to Andres Robles) + * New fixture: beamZ LED FlatPAR-154 (thanks to Jászberényi Szabolcs) + * New fixtures: Eurolite THA-100F COB, Cameo Tribar 200 IR (thanks to David Morgenschweis) + * New fixture: beamZ BT310 LED FlatPAR 12x8W 4-1 DMX IR (thanks to Mark) + * New fixture: Fun Generation PicoWash 40 Pixel Quad LED (thanks to Harm Aldick) + * New fixtures: American DJ Entourage, Elumen8 MS-700PE, Ibiza PAR LED 712IR (thanks to Tim Cullingworth) + * New fixtures: Martin MAC 401 Dual RGB Zoom, MAC 401 Dual CT Zoom, Stairville MH-z720 (thanks to Tim Cullingworth) + * New fixture: Fun Generation SePar Quad UV (thanks to Helmet) + + -- Massimo Callegari Thu, 19 Apr 2018 20:21:22 +0200 + +qlcplus (4.11.1) stable; urgency=low + + * engine: fixed audio files detection by prioritizing sndfile over mad + * engine: fixed HTP/LTP forced channels not set correctly + * engine: keep track of input/output device lines even if they are disconnected + * engine/Script: add blackout:on and blackout:off commands (Jano Svitok) + * engine/Script: do not keep empty trailing lines when saving a workspace + * UI: it is now possible to detach a QLC+ context tab on a separate window by double clicking on it + * UI/RGB Panel: added RBG pixel type (thanks to Peter Marks) + * UI/Remap: fixed RGB Panels remapping + * UI/Input Output Manager: added a button to enable/disable USB hotplugging (disabled by default) + * UI/Function Live Edit: restore basic live editing of Sequences + * UI/RGB Matrix Editor: fixed save to Sequence feature + * UI/Function Manager: when cloning a Sequence, clone the bound Scene too + * Virtual Console/Button: highlight border with orange color when in "monitoring" state + * Virtual Console/Slider: fix DMX values not updated when interacting with the mouse wheel, keyboard or Click And Go button + * Virtual Console/Slider: fix level mode values range scaling + * Virtual Console/XYPad: the speed of a running EFX preset can now be controlled by a Speed Dial widget + * RGB Scripts: added "Noise", "3D Starfield", "Random pixel per row" and "Random pixel per row multicolor" (thanks to Doug Puckett) + * Web access: added basic authentication support (thanks to Bartosz Grabias) + * Web access: fixed solo frames collapse state + * Web access: update feedbacks when a slider is moved + * New fixtures: IMG Stageline BEAM-40 WS/RGBW, Fun-Generation LED Diamond Dome (thanks to Tolmino Muccitelli) + * New fixture: Elation Cuepix Batten (thanks to Saul Vielmetti) + * New fixture: Clay Paky Tiger Scan HMI 575/1200 (thanks to Daris Tomasoni) + * New fixture: Litecraft WashX.21 (thanks to Hannes Braun) + * New fixtures: Briteq Stagepainter 12, Nicols IP Wash 120, Showtec LED Powerline 16 Bar (thanks to Fredje Gallon) + * New fixtures: Nicols Movelight, Nicols Birdy Wash 122, Briteq Giga Flash RGB (thanks to Fredje Gallon) + * New fixtures: Litecraft PowerBar AT10.sx, Stairville MH-z1915 (thanks to Thorben / Fredje) + * New fixtures: Martin MAC 700 Wash, ADB Warp M (thanks to Thorben) + * New fixture: Laserworld CS-1000RGB Mk II (thanks to Piotr Nowik) + * New fixture: Chauvet COLORrail IRC (thanks to Lane Parsons) + * New fixtures: American DJ COB Cannon Wash DW, lightmaXX Vega Zoom Wash Beam (thanks to Florian Gerstenlauer) + * New fixture: Martin Rush MH5 Profile (thanks to Falko) + * New fixture: Cameo Flash Bar 150 (thanks to Kevin Wimmer) + * New fixtures: Chauvet FXpar 9, IMG Stageline Wash-40 LED (thanks to PeterK) + * New fixtures: JB Systems iRock 5C, JB Systems LED Devil (thanks to Andres Robles) + * New fixtures: beamZ BAC406, Geni Mojo Color Moc (thanks to Mark Sy) + * New fixtures: Stairville MH-250 S, Chauvet GigBAR 2, Pro-Lights Onyx (thanks to Freasy) + * New fixtures: Coemar ProSpot 250 LX, Showtec Kanjo Spot 60 (thanks to Flo Edelmann) + + -- Massimo Callegari Sat, 28 Oct 2017 12:13:14 +0200 + +qlcplus (4.11.0) stable; urgency=low + + * engine: fixed setting start/end color while a RGB Matrix is running + * engine: fixed crash when pausing a Show with an unavailable audio file + * engine: major rework of Sequences. Projects using them need to be migrated + * UI: enabled Alt key combinations on macOS to behave like other platforms (thanks to Matt Mayfield) + * UI/RGB Panel: added panel direction (thanks to Raivis Rengelis) + * UI/Fixture Manager: added weight and power consumption information on fixtures/universe selection (Chris de Rock idea) + * UI/Scene Editor: preserve fixture tab order when fixtures with no channels set are present + * UI/RGB Matrix Editor: allow the preview to run even in operate mode + * UI/Audio Editor: added the possibility to loop an audio file (thanks to Raivis Rengelis) + * UI/Simple Desk: fixed crash when changing values from a channel group in "fixtures view" mode + * Virtual Console: prevent unwanted feedbacks from widgets in inactive Frame pages (thanks to Lukas Jähn) + * Virtual Console: fixed manual selection of input channels not considering Frame pages (thanks to Lukas Jähn) + * Virtual Console: fixed input profiles channels not honored on frame pages other than the first (thanks to Lukas Jähn) + * Virtual Console/Slider: improved level monitoring with the possibility to act like a Simple Desk slider (see documentation) + * Virtual Console/Frame: fixed 4.10.5b regression disabling widgets when switching page in design mode + * Virtual Console/Frame: fixed key controls not copied when cloning a frame (thanks to Lukas Jähn) + * Virtual Console/Frame: added the possibility to jump directly to a page and assign page names (thanks to Lukas Jähn) + * Virtual Console/Cue List: improved linked crossfade to perform an additive blending between steps (see documentation) + * Virtual Console/Speed Dial: improved tap button blinking and feedbacks (thanks to Lukas Jähn) + * Virtual Console/Speed Dial: it is now possible to copy/paste factors (thanks to Jan Dahms) + * Virtual Console/Clock: added external input support for countdown and stopwatch modes (thanks to Lukas Jähn) + * Plugins/OSC: added channel number calculator in configuration page to help integrating new controllers + * Plugins/Loopback: fixed spurious values emitted when a lot of channels are looped + * Web access: fixed VC Slider in percentage mode and inverted appearance (thanks to Bartosz Grabias) + * Web access: support VC Slider reduced range when in level mode + * Web access: improved getChannelsValues and added Simple Desk reset per-channel (sdResetChannel API) + * Web access: implemented keypad increase/decrease buttons (thanks to Santiago Benejam Torres) + * New input profile: Zoom R16 (thanks to Benedict Stein) + * New MIDI template: Akai APC40 MK2 Ableton mode (thanks to Branson Matheson) + * New fixture: American DJ FREQ 5 Strobe (thanks to Martin Bochenek) + * New fixture: Martin Rush MH3 (thanks to Ed Middlebrooks) + * New fixture: Eurolite LED ACS BAR-12 (thanks to Michael Horber) + * New fixtures: Martin Rush MH6 Wash, Cameo Studio PAR 64 RGBWA UV 12W (thanks to Piotr Nowik) + * New fixtures: ETEC Moving Spot 60E, Cameo CLM PAR COB 1, Showtec Compact Power Lightset COB (thanks to Freasy) + * New fixture: Stairville Tri Flat PAR Profile 5x3W RGB (thanks to Freasy) + * New fixture: American DJ Punch LED Pro (thanks to Benedict Stein) + * New fixtures: Contest Mini-Head 10W, Contest Evora B2R (thanks to Fredje Gallon) + * New fixture: Robe DJ Scan 150 XT (thanks to Allan Madsen) + * New fixtures: Futurelight PRO Slim PAR-12 HCL, PRO Slim PAR-12 MK2 HCL, Showtec Power Spot 9 Q5 (thanks to Lukas Jähn) + * New fixture: Showtec XS-1W Mini Moving Beam (thanks to Habefaro) + * New fixtures: Stage Right Stage Wash 18Wx18 LED PAR, Stage Right 7x20W COB LED Theater PAR (thanks to Collin Ong) + * New fixture: Cameo CLPIXBAR450PRO, CLPIXBAR650PRO (thanks to Jean-Daniel Garcia & Jeremie Odermatt) + * New fixture: Clay Paky Alpha Beam 1500 (thanks to Louis Gutenschwager) + * New fixture: Stairville AFH-600 (thanks to Hannes Braun) + * New fixture: Involight LED MH77S (thanks to Jászberényi Szabolcs) + * New fixtures: ETEC LED PAR 64 18x10W RGBWA, LED PAR 64 18x15W RGBWA Zoom (thanks to Simon Orlob) + * New fixture: Chauvet Swarm Wash FX (thanks to Stephen Olah) + * New fixture: Clay Paky Alpha Spot HPE 575 (thanks to Rohmer) + * New fixture: Robe LED Blinder 196LT (thanks to Tim Cullingworth) + * New fixture: Chauvet COLORband T3 USB (thanks to Ian Nault) + * New fixtures: American DJ Dotz Matrix, Martin Jem Compact Hazer Pro,Geni Mojo Spin Master Series (thanks to Sam Brooks) + * New fixture: American DJ XS 400 (thanks to Jared) + * New fixture: Velleman VDP1500SM (thanks to Freddy Hoogstoel) + * New fixture: Chauvet Intimidator Spot 355Z IRC (thanks to Michael Clements) + * New fixture: CLF Tricolor Mini Par (thanks to Jaron Blazer) + * New fixture: Varytec LED Easy Move Mini Beam & Wash RGBW (thanks to Erik) + * New fixtures: Smoke Factory Tour-Hazer II, JB Systems Panther, Robe Spot 160 XT (thanks to Thierry Rodolfo) + * New fixture: American DJ LED Trispot (thanks to Patrick) + * New fixtures: Contest STB-520 1500W Strobe, Elumen8 COB Tri 4 Pixel Batten, Briteq Tornado 7 (thanks to Robert Box) + * New fixtures: American DJ 5P Hex, Pro-Lights Moonstone, Chauvet Intimidator Hybrid 140SR (thanks to Robert Box) + * New fixtures: Robe Robin DLX Spot (thanks to Robert Box) + * New fixture: ETC ColorSource PAR (thanks to Jon Rosen) + * New fixture: lightmaXX 5ive STAR LED (thanks to Thomas Weber) + * New fixture: Talent BL252A (thanks to Massimiliano Palmieri) + * New fixtures: Showtec: Infinity iW-1915, Infinity XPLO-15 LED Strobe (thanks to Daniele Fogale) + * New fixtures: Showtec: Infinity iB-5R, Compact Par 18 MKII, Phantom 20 LED Beam (thanks to Nicolò Zanon) + * New fixture: Griven Gobostorm Plus MK2 (thanks to Attilio Bongiorni) + * New fixture: Chauvet Freedom Stick (thanks to Jay Szewczyk) + * New fixture: Eurolite TMH-14, Chauvet Intimidator Trio (thanks to Chris de Rock) + * New fixture: Chauvet Scorpion Dual (thanks to Alan Chavis) + * New fixture: American DJ Ultra Hex Bar 12 (thanks to Rhavin) + * New fixture: Equinox Photon + * New fixture: QTX MHS-60 (thanks to Nerijus Mongirdas) + * New fixture: Eurolite LED TMH FE-600, MARQ Colormax Par64, Stairville CLB2.4 Compact LED PAR System (thanks to Klaus Muth) + * New fixture: Chauvet SlimPar Hex 6 (thanks to Yinon Sahar) + * New fixture: IMG Stageline PARL 20 DMX (thanks to Felix Pickenäcker) + * New fixtures: Pro-Lights SmartBatHEX, Fury FY250W, Fury FY250S (thanks to Lorenzo Andreani) + * New fixture: American DJ Ikon Profile (thanks to Ham Sadler) + * New fixture: HQ Power Aeron Wash 575, JB Systems Space Color Laser (thanks to Ricardo Mendes) + * New fixture: American DJ VPar (thanks to Eric Eskam) + * New fixtures: MARQ Gesture Beam/Wash 102, Colormax Bat, Gesture Spot 100 (thanks to John Yiannikakis) + * New fixtures: Chauvet COLORado 3P, Legend 330SR Spot, SlimPar HEX 3 (thanks to Kevin Zepp) + * New fixture: American DJ Mini Dekker (thanks to Chris Davis) + * New fixtures: American DJ Vizi BSW 300, Blizzard Lighting Flurry 5 (thanks to George Qualley) + * New fixtures: Pro-Lights PIXIEWASH, Accent1Q, CromoSpot300 (thanks to Tolmino Muccitelli) + * New fixtures: Involight LED MH50S, LED PAR 180, SBL 2000 (thanks to Facek) + * New fixture: Pro-Lights Miniruby (thanks to Dario Gonzalez) + * New fixture: Sagitter Smart DL Wash (thanks to Simu) + * New fixtures: Eurolite LED THA-250F, Pro-Lights StudioCOBFC (thanks to Andrea Ugolini) + * New fixture: American DJ Stinger Spot (thanks to Jason R. Johnston) + * New fixture: Stairville Blade Sting 8 RGBW Beam Mover + + -- Massimo Callegari Sat, 24 Jun 2017 12:13:14 +0200 + +qlcplus (4.10.5b) stable; urgency=high + + * engine: fixed 4.10.5 regression on RGB Matrix preset step color calculation + * Virtual Console/Frame: fixed widgets disable state when switching pages + * Virtual Console: fixed SpeedDial and Animation widget presets feedbacks, and allow to use custom feedbacks + * Plugins/DMX USB: fixed 4.10.5 regression preventing to receive data from PRO devices + * Plugins/DMX USB: [Windows] fixed a long standing bug causing random crashes when receiving DMX data + * Plugins/MIDI: [macOS] further changes to support virtual ports + * New fixtures: Stairville M-Fog 1000 DMX, Cameo Superfly XS (thanks to Konni) + * New fixture: ColorKey WaferPar Quad-W 12 (thanks to Taylor) + * New fixture: Eurolite LED PARty RGBW (thanks to Heiko Fanieng) + * New fixture: lightmaXX Platinum CLS-1 (thanks to Marc Geonet) + + -- Massimo Callegari Mon, 26 Dec 2016 12:13:14 +0200 + +qlcplus (4.10.5a) stable; urgency=high + + * engine: fixed playback of a chaser within a chaser + + -- Massimo Callegari Mon, 12 Dec 2016 12:13:14 +0200 + +qlcplus (4.10.5) stable; urgency=low + + * Engine: added indigo to fixture channel colors (thanks to Axel Metzke) + * Engine: properly handle RGB Matrices with generic dimmers (Jano Svitok) + * UI/Function Manager: fix crash when trying to clone a folder (David Garyga) + * UI/RGB Matrix Editor: editor preview doesn't stop when testing the Function + * UI/Collection Editor: allow multiple selection and added Function reordering buttons + * UI/Remap: fixed universes list in target mapping + * UI/Remap: fixed wrong Scene remapping when mixing cloned and new fixtures + * UI/Remap: added remapping also of Fixture Groups + * Virtual Console/Frame: Show page number when collapsed (thanks to Matthias Gubisch) + * Virtual Console/Cue List: allow to choose playback buttons layout (Play/Pause + Stop or Play/Stop + Pause) + * Plugins/DMX USB: fixed crash happening on PRO devices when receiving a full universe + * Plugins/DMX USB: [MacOS] fixed regression caused by the Qt libraries on PRO devices + * Plugins/MIDI: [MacOS] added support for virtual ports, show only active devices and properly handle hotplug + * Fixture Editor: fixed minimum value of a new capability not updating correctly + * RGB Scripts: added One by one (Jano Svitok) + * New fixtures: Pro-Lights LumiPIX 12Q, Proel PLLEDMLBG (thanks to Andrea Ugolini) + * New fixtures: Stairville DCL Flat Par 18x4W CW/WW, Cameo LED MultiPAR CLM-PAR-COB1 (thanks to Freasy) + * New fixtures: High End Systems Studio Beam, lightmaXX EASY Wash 5IVE LED (thanks to Freasy) + * New fixture: iSolution iColor 4 (thanks to withlime) + * New fixtures: ETC ColorSource Spot, Blizzard Lighting LB-Par Hex (thanks to Robert Box) + * New fixtures: American DJ: Chameleon QBar Pro,DJ Vizi Beam RXONE, XS 600, Focus Spot Three Z (thanks to Robert Box) + * New fixture: JB-Lighting Varyscan P6, Cameo Wookie series, Cameo Hydrabeam series (thanks to Andres Robles) + * New fixture: Chauvet RotoSphere LED (thanks to Carl Eisenbeis) + * New fixture: Briteq Spectra 3D Laser (thanks to Robert Box + Freasy) + * New fixture: Martin MH2 Wash (thanks to John Yiannikakis + Freasy) + * New fixture: American DJ Flat Par Tri7X (thanks to Brian) + * New fixtures: Ledj Stage Color 24, 59 7Q5 RGBW, 59 7Q5 RGBA (thanks to Paul Wilton) + * New fixtures: American DJ: Inno Spot Elite, Stinger, Tri Phase (thanks to Piotr Nowik) + * New fixtures: Showtec Phantom 95 LED Spot, Futurelight PHS-260 (thanks to Piotr Nowik) + * New fixture: Blizzard Lighting Rocklite RGBAW (thanks to Larry Wall) + * New fixture: American DJ Comscan LED (thanks to Chris) + * New fixtures: PR Lighting XL 250/XL 700 Wash/XL 700 Spot, American DJ Accu Fog 1000 (thanks to István Király) + * New fixtures: Equinox Ultra Scan LED, Kam Powercan84W, QTX HZ-3 (thanks to Chris Moses) + * New fixture: Eurolite TMH-10 (thank to exmatrikulator) + * New fixture: Eurolite LED SLS 5 BCL, Robe Fog 1500 FT (thanks to Christian Hollbjär) + * New fixture: SGM Giotto Spot 400 (thanks to Mihai Andrei) + * New fixture: Pulse LEDBAR 320 (thanks to Allan Rhynas) + * New fixture: Equinox Swing Batten (thanks to Dean Clough) + * New fixture: Cameo Pixbar 600 PRO, Chauvet COLORado 1 Quad Zoom Tour (thanks to Andrew Hallmark) + * New fixture: Involight FM900 DMX (thanks to Jászberény Szabolcs) + * New fixture: Showtec Stage Blinder Series (thanks to Antoni J. Canós) + * New fixture: MARQ Gamut PAR H7 (thanks to Lance Lyda) + * New fixtures: Chauvet: SlimPAR QUV12 USB, SlimPAR PRO H USB, Scorpion Bar RG (thanks to Pete Mueller) + * New fixture: Stairville CLB8 Compact LED PAR System (thanks to Detlef Fossan) + * New fixture: Chauvet Cubix 2.0 (thanks to Jungle Jim) + * New fixture: Showtec Giant XL LED (thanks to Samuel Hofmann) + * New fixtures: SGM: Idea Beam 300, Idea Led Bar 100, Idea Spot 700, Newton 1200 (thanks to Oscar Cervesato) + * New fixtures: Pro Lights LumiPAR18QTour, Elation SIXPAR 200IP (thanks to Oscar Cervesato) + * New fixture: Stairville Beam Moving Head B5R, American DJ Flat Par TW12, Varytec Easy Scan XT Mini (thanks to Thierry Rodolfo) + + -- Massimo Callegari Sat, 3 Dec 2016 12:13:14 +0200 + +qlcplus (4.10.4) stable; urgency=low + + * Scripts: Fix 4.10.3a regression that breaks values parsing (David Garyga) + * Engine: fix relative paths when opening a project from the command line + * Engine: improved the start/stop mechanism of Functions within a Show + * Chaser Editor: a newly created step is now selected automatically + * Scene Editor: fixed the tab order of the fixtures + * Show Manager: added the possibility to pause a Show leaving the lights on + * Show Manager/Audio: allow to display the waveform preview while playing a file + * UI/Function Selection: fix crash on workspaces where a scene ID is bigger than its sequence ID (David Garyga) + * UI/Video: fixed the fullscreen positioning on Windows + * Virtual Console/Animation: fix behavior issue when changing the associated function (David Garyga) + * Virtual Console/Frames: send feedbacks for the enable button + * Virtual Console/Frames: fix 4.10.3 regression causing frames to resize after configuration + * Virtual Console/Cue List: playback can now be paused and resumed (see documentation) + * Virtual Console/Cue List: added a dedicated stop button, with external controls + * Virtual Console/XYPad: fixed computation of reversed fixture position (Luca Ugolini) + * Plugins/OSC: fixed regression of receiving data from the wrong interface (David Garyga) + * Plugins/OSC: fixed regression causing not receiving data anymore when changing the input profile (David Garyga) + * Plugins/MIDI: distinguish MIDI beat clock start and stop (see documentation) + * Input Profiles Editor: it is now possible to define button custom feedbacks in a profile (see documentation) + * New input profile: Novation Launchpad Pro (thanks to David Giardi) + * New RGB script: Balls (color) (thanks to Rob Nieuwenhuizen) + * Fixture updated: Starway MaxKolor-18 (thanks to Thierry Rodolfo and Robert Box) + * Fixture updated: Cameo LED RGBW PAR64 18x8W (thanks to Lukas) + * New fixture: American DJ Mega QA Par38 (thanks to Nathan Durnan) + * New fixture: Martin MAC 250 Wash (thanks to Robert Box) + * New fixture: Luxibel LX161 (thanks to Freddy Hoogstoel) + * New fixture: Stairville MH-X60th LED Spot (thanks to Jasper Zevering) + * New fixture: Cameo CLHB400RGBW (thanks to Mihai Andrei) + * New fixture: Showlite Flood Light Panel 144x10mm LED RGBW (thanks to Ex) + * New fixture: Color Imagination LedSpot 90 (SI-052), Robe Spot 575 XT (thanks to DJ Ladonin) + * New fixture: Chauvet Mini Kinta (thanks to Jonathan Wilson) + * New fixture: Eurolite LED ML-56 QCL RGBW-RGBA 18x8W (thanks to Matthijs ten Berge) + * New fixture: High End Systems TechnoSpot (thanks to Tom Moeller) + * New fixtures: American DJ Inno Pocket Spot Twins, Fog Fury 3000 WiFly, Event Bar Pro (thanks to MaBonzo) + * New fixtures: American DJ Galaxian Gem IR, Vizi Roller Beam 2R (thanks to MaBonzo) + * New fixture: Ayra ERO 506 (thanks to Bert Heikamp) + * New fixture: Ayrton Arcaline 100 RGB, Martin Magnum Hazer (thanks to Thierry Rodolfo) + * New fixtures: American DJ Asteroid 1200, Eurolite GKF-60, Eurolite LED FE-700 (thanks to Flox Garden) + * New fixtures: Antari X-310 Pro Fazer, lightmaXX CLS-2 (thanks to Flox Garden) + * New fixture: Beamz MHL90 Wash 5x18W RGBAW-UV (thanks to Hans Erik Tjelum) + * New fixture: PR Lighting Pilot 150 (thanks to David Read) + * New fixture: lightmaXX Platinum CLS-1 (thanks to Marc Geonet) + + -- Massimo Callegari Sun, 29 May 2016 12:13:14 +0200 + +qlcplus (4.10.3a) stable; urgency=low + + * Scripts: Fix 4.10.3 regression that breaks time values parsing (David Garyga) + * RGBMatrix Editor: Fix 4.10.3 regression where QLC+ hangs on duration < 20ms (David Garyga) + + -- Massimo Callegari Wed, 9 Mar 2016 22:03:14 +0200 + +qlcplus (4.10.3) stable; urgency=low + + * Engine: Fix intensity channels forced back to HTP after LTP not working correctly (David Garyga) + * Engine: Fix functions with low intensity killing current fade outs (David Garyga) + * Audio Capture: Fix crash when selecting another audio input while a capture is running (David Garyga) + * Audio Capture: Fix crash when trying to use a wrongly configured audio input (David Garyga) + * Scene Editor: Remember Channels Groups values when saving and loading a workspace (David Garyga) + * Scene Editor: Remember fixtures even with no activated channel (David Garyga) + * RGBMatrix Editor: Fix preview now working when fade in > 0 (David Garyga) + * RGBMatrix Editor: Fix length of fadeout on the preview (David Garyga) + * Show Manager: Fix crash when editing the total time of an empty chaser (David Garyga) + * Show Manager/Function Selection: Fix sequences always displayed even with Chasers and Scenes both filtered out (David Garyga) + * Speed Dials: Fix display and input of the milliseconds field, update precision from 10ms to 1ms (David Garyga) + * Input/Output Manager: Forbid deleting universes in the middle of the list, this prevents a lot of bugs and crashes (David Garyga) + * Simple Desk: the number of faders is now dynamic depending on the window size (unless forced via config file) + * Plugins/ArtNet: Fix input and output initialization conflict that results in no input (David Garyga) + * Plugins/ArtNet: Allow sending and receiving ArtNet on several different interfaces (David Garyga) + * Plugins/ArtNet: Allow selecting a different ArtNet input universe (David Garyga) + * Plugins/ArtNet: Fix configuration issue that prevents setting a parameter back to its default value (David Garyga) + * Plugins/OSC: Fix configuration issue that prevents setting a parameter back to its default value (David Garyga) + * Plugins/OSC: OSC Output values range from 0.0 to 1.0 + * Plugins/OSC: Properly handle OSC bundles (restores Lemur compatibility) + * Virtual Console: Fix copy of a frame containing a submaster slider resulting in a broken submaster (David Garyga) + * Virtual Console/Slider: Enable function filters in playback function selection (David Garyga) + * Virtual Console/Slider: Allow to force to LTP color channels controlled by a Click & Go button + * Virtual Console/Solo Frame: Fix sliders in playback mode not actually stopping the attached function when the slider reaches 0 (David Garyga, thanks to Tubby) + * Virtual Console/Animation: Can now be used in solo frames (David Garyga) + * Virtual Console/Frames: fix page cloning of a nested multipage frame + * Virtual Console/Frames: fix disabling frame pages. Now widgets get actually deleted + * Web access: fixed custom fixtures loading + * Web access: added a DMX keypad that can be accessed from the Simple Desk (thanks to Santiago Benejam Torres) + * Input profiles: added Behringer BCR2000 (thanks to Michael Trojacher) + * Input profiles: added Lemur iPad Studio Combo + * RGB Scripts: added Strobe script (thanks to Rob Nieuwenhuizen) + * New fixtures: Stellar Labs ECO LED PAR56, Chauvet Colorpalette II (thanks to Jimmy Traylor) + * New fixtures: Chauvet: COLORado 1 Solo, Ovation FD-165WW, Rogue RH1 Hybrid, COLORdash Par Hex 12, COLORdash Accent Quad (thanks to Robert Box) + * New fixtures: Chauvet: Vue 1.1, Intimidator Spot 100 IRC, Abyss USB, COREpar 40 USB, COREpar UV USB (thanks to Robert Box) + * New fixtures: Chauvet: Intimidator Scan 305 IRC, Intimidator Barrel 305 IRC, SlimPAR T6 USB, SlimBANK TRI-18 (thanks to Robert Box) + * New fixtures: Eurolite LED CLS-9 QCL RGBW 9x8W 12, JB-Lighting A12 Tunable White, SGM G-Profile (thanks to Robert Box) + * New fixtures: Coemar Par Lite LED RGB, OXO LED Funstrip DMX, American DJ Stinger II (thanks to Robert Box) + * New fixture: Chauvet LED PAR 64 Tri-C (thanks to Jungle Jim and Robert Box) + * New fixtures: American DJ VBar, American DJ Jellydome, Briteq LDP Powerbar 6TC/12TC (thanks to Thierry Rodolfo) + * New fixture: Sagitter Slimpar 18 RGB (thanks to Daniele Fogale) + * New fixture: Microh LED Tri Bar (thanks to Michael Tughan) + * New fixture: American DJ 12P Hex Pearl (thanks to Ethan Moses) + * New fixture: JB-Lighting JBLED A7 (thanks to BLACKsun) + * New fixture: Chauvet COREpar 80 USB (thanks to Chris Gill) + * New fixture: Stairville DJ Lase 25+25-G MK-II (thanks to galaris) + * New fixtures: PR Lighting XR 230 Spot, PR Lighting XLED 1037 (thanks to Ovidijus Cepukas) + * New fixtures: Futurelight DJ-Scan 600, Eurolite LED PAR-64 RGBW+UV (thanks to Ovidijus Cepukas) + * New fixtures: Varytec LED Pad 7 BA-D, American DJ X-Scan LED Plus, Showtec Blade Runner (thanks to DjProWings) + * New fixture: Involight LED CC60S (thanks to Stephane Hofman) + * New fixture: Stairville MH-x200 Pro Spot (thanks to Mirek Škop) + * New fixtures: Varytec LED Giga Bar 4 MKII, Eurolite LED KLS Laser Bar FX Light Set (thanks to Daniel Schauder) + * New fixture: Chauvet Mayhem (thanks to Jonathan Wilson) + * New fixture: Ayra TDC Agaricus (thanks to Rob Nieuwenhuizen) + * New fixture: American DJ Pinspot LED Quad DMX (thanks to Christian Polzer) + * New fixture: Stairville AF-180 LED Fogger Co2 FX (thanks to Johannes Uhl) + + -- Massimo Callegari Sun, 6 Mar 2016 20:21:22 +0200 + +qlcplus (4.10.2) stable; urgency=low + + * Engine: added support for devices hotplug (DMX USB, MIDI, HID, Peperoni) + * Engine: Universe passthrough data is now merged with QLC+ output, it is not affected by QLC+ processing + (except for blackout) and it appears in the DMX monitor (Jano Svitok) + * Audio: fixed playback of 24/32 bit wave files and Show Manager waveform preview + * DMX Dump: it is now possible to dump DMX values on an existing Scene + * ClickAndGo Widgets: Preset widgets now display the channel name on top of the capability list (David Garyga) + * Function Manager: fix startup Function not cleared when deleting it (David Garyga) + * Function Manager: highlight current startup Function when opening the Function selection dialog (David Garyga) + * Function Selection: Don't lose the current selection when changing the function type filter (David Garyga) + * Show Manager: fixed looped functions never stopping with certain durations (Jano Svitok) + * Show Manager: fixed copy/paste of an existing Chaser + * Show Manager: fix crashes when copying a sequence on an empty track (David Garyga) + * Show Manager: repair conflicting sequences when loading a broken workspace (David Garyga) + * EFX Editor: removed the intensity control. Please use separate Scenes for that + * Virtual Console/Slider: fixed copy of the channel monitor mode (David Garyga) + * Virtual Console/Slider: in level mode, activate only in operate mode and don't hold forced LTP channels (David Garyga) + * Virtual Console/Slider: in playback mode, ignore the fade in/fade out of the attached Function (David Garyga) + * Virtual Console/XYPad: added Fixture Group preset, to control a subgroup of Fixtures (see documentation) + * Virtual Console/XYPad Properties: fixture ranges can now be set in degrees, percentage or DMX values + * Virtual Console/XYPad Properties: fix manual input selection for presets (David Garyga) + * Virtual Console/Cue List: improved mixed usage of crossfader and next/previous buttons (David Garyga) + * Virtual Console/Cue List: fix effect of a submaster slider on a Cue List in crossfader mode (David Garyga) + * Virtual Console/Cue List: fix crash when adding steps to the chaser being run by a Cue List (David Garyga) + * Virtual Console/Audio Triggers: fix virtual console buttons triggering (David Garyga) + * Virtual Console/Input Selection: allow custom feedbacks only on an assigned source and don't crash (David Garyga) + * DMX Monitor: Fix strobing in 2D view (Jano Svitok) + * Fixture Editor: Fix crash in the Channel Editor (David Garyga) + * Plugins/uDMX: added support for AVLdiy.cn clone (thanks to Vitalii Husach) + * Plugins/DMXUSB: (Linux) fixed data transmission of DMX4ALL NanoDMX + * Input Profiles: added an option for Buttons to always generate a press/release event + * New input profile: Touch OSC Automat5 + * New input profile: Novation Launch Control (thanks to Giacomo Gorini) + * Updated fixture: Stairville xBrick Full-Colour 16X3W (thanks to Rico Hansen) + * Updated fixture: Stairville MH-100 Beam 36x3 LED (thanks to Antoni J. Canos) + * Updated fixture: American DJ Revo 3 (thanks to David Pilato) + * New fixture: American DJ Dotz Flood + * New fixture: Chauvet COLORdash Par Quad-7 + * New fixtures: Robe ColorWash 1200E AT, American DJ Starburst, Chauvet LED PAR 64 Tri-B (thanks to Robert Box) + * New fixtures: Cameo Multi Par 3, HQ Power VDPL110CC LED Tri Spot, Showtec LED Pixel Track Pro (thanks to Robert Box) + * New fixtures: American DJ: Inno Pocket Z4, On-X, WiFly EXR Dotz Par, WiFly EXR HEX5 IP, COB Cannon Wash Pearl (thanks to Robert Box) + * New fixtures: BoomTone DJ Sky bar 288 LED, BoomToneDJ Strob LED 18, BoomToneDJ Froggy LED RGBW (thanks to Didou) + * New fixture: iSolution iMove 250W (thanks to Thierry Rodolfo) + * New fixture: Talent BL63 10" LED Bar (thanks to FooSchnickens) + * New fixtures: Contest Oz-37x15QC, Evora DUO B2R, Evora Beam 5R, Evora Beam 15R (thanks to Jan Lachman) + * New fixtures: Blizzard Lighting Lil G, Pixellicious, Lo-Pro CSI (thanks to Alton Olson) + * New fixtures: Stairville LED Matrix Blinder 5x5, Showtec Power Spot 9 Q6 Tour V1 (thanks to Samuel) + * New fixture: Blizzard Lighting StormChaser (thanks to Brent) + * New fixtures: Showtec Explorer 250 Pro MKII, Showtec Pixel Bar 12 (thanks to Henk de Gunst) + * New fixture: Philips Selecon PLProfile1 MkII (thanks to Freasy) + * New fixture: PSL Strip Led RGB code K2014 (thanks to Lorenzo Andreani) + * New fixture: Chauvet SlimPar Pro Tri (thank to Bulle) + * New fixture: Chauvet GigBar IRC (thanks to JD-HP-DV7 and Jungle Jim) + * New fixtures: Ghost Green 30, KOOLlight 3D RGB Laser, Mac Mah Mac FOG DMX (thanks to David Pilato) + + -- Massimo Callegari Sun, 13 Dec 2015 20:21:22 +0200 + +qlcplus (4.10.1) stable; urgency=high + + * Virtual Console/Cue List: improved step fader behaviour (David Garyga) + * Plugins/DMXUSB: Fixed regression affecting Linux users and OSX users using the libFTDI interface + * Plugins/ArtNet/E1.31/OSC: Improved network interfaces detection + * New fixture: Enterius EC-133DMX (thanks to Krzysztof Ratynski) + * New fixture: Showtec Dragon F-350 (thanks to Jasper Zevering) + * New fixtures: JB Systems Lounge Laser DMX, JB Systems Super Solar RGBW (thanks to Robert Box) + + -- Massimo Callegari Wed, 21 Oct 2015 20:21:22 +0200 + +qlcplus (4.10.0) stable; urgency=low + + * Channel Groups: Fix crashes related to invalid channels (David Garyga) + * Chaser: Fix flickering issue when chaser order is Random (David Garyga) + * Engine: some more fixes on forced HTP/LTP channels + * Engine: fixed 4.9.x regression causing QLC+ to hang at the end of audio playback + * RGB Matrix Audio Spectrum: Fix crash when audio input volume is set to zero (David Garyga) + * RGB Matrix: Fix 4.9.1 regression which makes fading of green and blue colors not smooth (David Garyga) + * RGB Matrix: Introduced blending mode between matrices (see documentation) + * Audio Input: Fix crashes when selecting another audio input device while an audio input driven function/widget is running (David Garyga) + * Audio Input: It is now possible to select the audio input format (sample rate and channels) + * Video: fixed playback from a time offset (where possible) + * Video: (Windows) Videos now have a black background, like all the other platforms + * Add Fixture dialog: Generic fixtures don't take the number of channels of the previously selected fixture (David Garyga) + * Add Fixture dialog: Fix address 512 not usable by adding several fixtures at a time (David Garyga) + * Scene Editor: correctly select the fixture tab when switching from tabbed/all channels view + * EFX Editor: it is now possible to use an EFX on RGB channels (thanks to Giorgio Rebecchi) + * Collection Editor: added preview button (thanks to Giorgio Rebecchi) + * Fixture Remap: fixed remapping of EFX functions + * Function Wizard: improved creation of color scenes for RGB panels + * Function Wizard: automatically set a gobo picture (if available) on buttons attached to gobo Scenes + * Show Manager: Fix some cursor teleportation issues (David Garyga) + * Simple Desk: Fix cue playback on universes 2+ (David Garyga) + * Simple Desk: Fix crash when selecting recently added universe (David Garyga) + * Simple Desk: Added reset buttons to reset a single channel + * Simple Desk: Fix page count when channels per page does not divide 512 (Jano Svitok, reported by Florian) + * Virtual Console: fixed Grand Master not sending feedbacks + * Virtual Console/Input Controls: implemented custom feebacks. For now used only by VC buttons + * Virtual Console/Solo Frame: Option to allow mixing of sliders in playback mode (David Garyga) + * Virtual Console/Speed Dial: Introduced multiplier/divisor, apply and presets buttons (see documentation) + * Virtual Console/Button: allow to set a background picture + * Virtual Console/Cue List: Options for the Next/Previous buttons behavior (David Garyga) + * Virtual Console/Cue List: Fixed playback of a Chaser in reverse order (David Garyga) + * Virtual Console/Cue List: Added a new "Steps" mode for the side faders (see documentation) + * Virtual Console/Cue List: Allow to resize columns to 0 pixels, to completely hide them + * Virtual Console/XYPad: Introduced presets, including the usage of existing EFX and Scenes (see documentation) + * Virtual Console/XYPad: Fix DMX output not working when going to Operate mode while the XYPad is disabled (David Garyga, thanks to bestdani) + * Input Profiles: added an option for MIDI profiles to feedback a Note Off or a Note On with 0 velocity. APCMini now works out of the box. (Jano Svitok) + * Input Profiles: Improved BCF2000 Input profile (thanks to Lorenzo Andreani) + * Plugins/MIDI: (Linux) Fixed data transmission to multiple devices (thanks to Adrian Kapka) + * Plugins/MIDI: fixed Program Change handling on OSX and Windows + * Plugins/MIDI: (Windows) do not close the device when sending SysEx data + * Plugins/ArtNet: it is now possible to enter an arbitrary output IP + * Plugins/OSC: it is now possible to enter an arbitrary output IP + * Plugins/E1.31: added stream priority to configuration (thanks to Nathan Durnan) + * Plugins/E1.31: added unicast support (David Garyga) + * Plugins/DMXUSB: fixed close/open sequence on a Enttec Pro input line + * Web Access: implemented frames collapse functionality + * RGB Scripts: added Plasma Colors script (thanks to Nathan Durnan) + * Fixture Editor: Channel capability editing is now done in a single window + * Updated fixture: Showtec Indigo 6500 (thanks to Jochen Becker) + * New fixture: Ayra ComPar 20 (thanks to Rob Nieuwenhuizen) + * New fixture: XStatic X-240Bar RGB (thanks to Nathan Durnan) + * New fixture: Venue ThinPAR 38 (thanks to Thierry Rodolfo) + * New fixtures: Contest MiniCube-6TCb, Eurolite LED FE-1500, Lightronics FXLD618C2I, JB Systems COB-4BAR (thanks to Robert Box) + * New fixtures: Eurolite LED KLS-401, Chauvet Intimidator Wash Zoom 350 IRC, Equinox Party Par LED PAR 56 (thanks to Robert Box) + * New fixtures: Robe Robin MiniMe, PR Lighting Pilot 575, Stairville DJ Lase 150-RGY MkII, JB Systems Dynaspot (thanks to Robert Box) + * New fixtures: American DJ Hyper Gem LED, Robe ColorSpot 575 AT, Kam iLink All Colour Models (thanks to Robert Box) + * New fixtures: Chauvet Intimidator Wave 360 IRC, Varytec LED PAR56 (thanks to Habefaro) + * New fixture: American DJ Fog Fury Jett (thanks to Dean Clough) + * New fixtures: Eurolite TB-250, Futurelight DJ-HEAD 575 SPOT, GLX Lighting Power LED Beam 38 Narrow (thanks to Ovidijus Cepukas) + * New fixture: Pro-Lights UVStrip18 (thanks to Alessandro Grechi) + * New fixtures: American DJ Inno Pocket Beam Q4, Martin ZR24/7 Hazer, Blizzard Lighting Stimul-Eye (thanks to George Qualley) + * New fixture: American DJ Mega TriPar Profile Plus (thanks to George Qualley) + * New fixtures: Pro-Lights SmartBat, Robe ClubWash 600 CT (thanks to Lorenzo Andreani) + * New fixture: Stairville Show Bar Tri 18x3W RGB (thanks to Udo Besenreuther) + * New fixtures: Blizzard Lighting Rokbox Infiniwhite, Chauvet COREpar 80 (thanks to Chris Gill) + * New fixture: Cameo CL Superfly HP (thanks to Stuart Brown) + * New fixture: American DJ Event Bar Q4 (thanks to Maxime Bissonnette-Théorêt) + * New fixture: Cameo LED Moving Head 60W CLMHR60W (thanks to Jasper Zevering) + * New fixtures: Proel PLLED64RGB, Litecraft LED PAR 64 AT3, Robe Robin 300E Beam (thanks to Mihai Andrei) + * New fixture: Electroconcept SPC029 (thanks to Bulle) + * New fixture: Microh Plasmawave 1 RGB (thanks to Rommel) + + -- Massimo Callegari Sun, 18 Oct 2015 20:21:22 +0200 + qlcplus (4.9.1) stable; urgency=high * RGBMatrix: SingleShot RGBMatrix make use of FadeOut time (David Garyga) diff --git a/engine/audio/src/CMakeLists.txt b/engine/audio/src/CMakeLists.txt index 9aa7dd7bc4..cd51c39823 100644 --- a/engine/audio/src/CMakeLists.txt +++ b/engine/audio/src/CMakeLists.txt @@ -9,6 +9,7 @@ add_library(${module_name} audioplugincache.cpp audioplugincache.h audiorenderer.cpp audiorenderer.h ) +set_property(TARGET ${module_name} PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(${module_name} PUBLIC ../../../plugins/interfaces ../../src diff --git a/engine/audio/src/audiocapture.h b/engine/audio/src/audiocapture.h index 58a9484101..f6fefd73c0 100644 --- a/engine/audio/src/audiocapture.h +++ b/engine/audio/src/audiocapture.h @@ -135,6 +135,7 @@ class AudioCapture : public QThread signals: void dataProcessed(double *spectrumBands, int size, double maxMagnitude, quint32 power); + void volumeChanged(int volume); protected: /*! diff --git a/engine/audio/src/audiocapture_qt5.cpp b/engine/audio/src/audiocapture_qt5.cpp index 79920b42e3..cd9bb3fb78 100644 --- a/engine/audio/src/audiocapture_qt5.cpp +++ b/engine/audio/src/audiocapture_qt5.cpp @@ -113,9 +113,14 @@ qint64 AudioCaptureQt6::latency() void AudioCaptureQt6::setVolume(qreal volume) { + if (volume == m_volume) + return; + m_volume = volume; if (m_audioInput != NULL) m_audioInput->setVolume(volume); + + emit volumeChanged(volume * 100.0); } void AudioCaptureQt6::suspend() diff --git a/engine/audio/src/audiocapture_qt6.cpp b/engine/audio/src/audiocapture_qt6.cpp index 3911c90301..6e3db68a61 100644 --- a/engine/audio/src/audiocapture_qt6.cpp +++ b/engine/audio/src/audiocapture_qt6.cpp @@ -113,9 +113,14 @@ qint64 AudioCaptureQt6::latency() void AudioCaptureQt6::setVolume(qreal volume) { + if (volume == m_volume) + return; + m_volume = volume; if (m_audioSource != NULL) m_audioSource->setVolume(volume); + + emit volumeChanged(volume * 100.0); } void AudioCaptureQt6::suspend() diff --git a/engine/src/CMakeLists.txt b/engine/src/CMakeLists.txt index 428d31c089..54597e5a91 100644 --- a/engine/src/CMakeLists.txt +++ b/engine/src/CMakeLists.txt @@ -44,6 +44,7 @@ add_library(${module_name} SHARED qlcfixturemode.cpp qlcfixturemode.h qlci18n.cpp qlci18n.h qlcinputchannel.cpp qlcinputchannel.h + qlcinputfeedback.cpp qlcinputfeedback.h qlcinputprofile.cpp qlcinputprofile.h qlcinputsource.cpp qlcinputsource.h qlcmodifierscache.cpp qlcmodifierscache.h diff --git a/engine/src/chaser.cpp b/engine/src/chaser.cpp index 3a127628e9..a00b3b3f76 100644 --- a/engine/src/chaser.cpp +++ b/engine/src/chaser.cpp @@ -132,6 +132,7 @@ bool Chaser::addStep(const ChaserStep& step, int index) } emit changed(this->id()); + emit stepsListChanged(this->id()); return true; } else @@ -150,6 +151,7 @@ bool Chaser::removeStep(int index) } emit changed(this->id()); + emit stepsListChanged(this->id()); return true; } else diff --git a/engine/src/chaser.h b/engine/src/chaser.h index e7d0ebc511..15bf706173 100644 --- a/engine/src/chaser.h +++ b/engine/src/chaser.h @@ -157,6 +157,7 @@ public slots: signals: void stepChanged(int index); + void stepsListChanged(quint32 fid); protected: QList m_steps; diff --git a/engine/src/chaserrunner.cpp b/engine/src/chaserrunner.cpp index 3ea2a8a436..ee2a495668 100644 --- a/engine/src/chaserrunner.cpp +++ b/engine/src/chaserrunner.cpp @@ -52,7 +52,7 @@ ChaserRunner::ChaserRunner(const Doc *doc, const Chaser *chaser, quint32 startTi m_pendingAction.m_fadeMode = Chaser::FromFunction; m_pendingAction.m_stepIndex = -1; - if (m_chaser->type() == Function::SequenceType && startTime > 0) + if (startTime > 0) { qDebug() << "[ChaserRunner] startTime:" << startTime; int idx = 0; @@ -577,7 +577,7 @@ void ChaserRunner::startNewStep(int index, MasterTimer *timer, qreal mIntensity, newStep->m_intensityOverrideId = func->requestAttributeOverride(Function::Intensity, mIntensity * sIntensity); } - // Start the fire up ! + // Start the fire up! func->start(timer, functionParent(), 0, newStep->m_fadeIn, newStep->m_fadeOut, func->defaultSpeed(), m_chaser->tempoType()); m_runnerSteps.append(newStep); diff --git a/engine/src/efx.cpp b/engine/src/efx.cpp index b8ef16de40..3a3d408874 100644 --- a/engine/src/efx.cpp +++ b/engine/src/efx.cpp @@ -272,7 +272,7 @@ void EFX::preview(QPolygonF &polygon, Function::Direction direction, int startOf } } -void EFX::calculatePoint(Function::Direction direction, int startOffset, float iterator, float* x, float* y) const +void EFX::calculatePoint(Function::Direction direction, int startOffset, float iterator, float *x, float *y) const { iterator = calculateDirection(direction, iterator); iterator += convertOffset(startOffset + getAttributeValue(StartOffset)); @@ -283,7 +283,7 @@ void EFX::calculatePoint(Function::Direction direction, int startOffset, float i calculatePoint(iterator, x, y); } -void EFX::rotateAndScale(float* x, float* y) const +void EFX::rotateAndScale(float *x, float *y) const { float xx = *x; float yy = *y; @@ -330,7 +330,7 @@ float EFX::calculateDirection(Function::Direction direction, float iterator) con } // this function should map from 0..M_PI * 2 -> -1..1 -void EFX::calculatePoint(float iterator, float* x, float* y) const +void EFX::calculatePoint(float iterator, float *x, float *y) const { switch (algorithm()) { @@ -1081,6 +1081,7 @@ QSharedPointer EFX::getFader(QList universes, quint32 fader->setBlendMode(blendMode()); fader->setName(name()); fader->setParentFunctionID(id()); + fader->setHandleSecondary(true); m_fadersMap[universeID] = fader; } @@ -1094,7 +1095,7 @@ void EFX::preRun(MasterTimer* timer) QListIterator it(m_fixtures); while (it.hasNext() == true) { - EFXFixture* ef = it.next(); + EFXFixture *ef = it.next(); Q_ASSERT(ef != NULL); ef->setSerialNumber(serialNumber++); } diff --git a/engine/src/efx.h b/engine/src/efx.h index 3c248bdf94..1c7d3e6767 100644 --- a/engine/src/efx.h +++ b/engine/src/efx.h @@ -183,7 +183,7 @@ class EFX : public Function * @param x Used to store the calculated X coordinate (output) * @param y Used to store the calculated Y coordinate (output) */ - void calculatePoint(Function::Direction direction, int startOffset, float iterator, float* x, float* y) const; + void calculatePoint(Function::Direction direction, int startOffset, float iterator, float *x, float *y) const; private: diff --git a/engine/src/efxfixture.cpp b/engine/src/efxfixture.cpp index 144b2ec524..45420be61e 100644 --- a/engine/src/efxfixture.cpp +++ b/engine/src/efxfixture.cpp @@ -53,6 +53,11 @@ EFXFixture::EFXFixture(const EFX* parent) , m_started(false) , m_elapsed(0) , m_currentAngle(0) + + , m_firstMsbChannel(QLCChannel::invalid()) + , m_firstLsbChannel(QLCChannel::invalid()) + , m_secondMsbChannel(QLCChannel::invalid()) + , m_secondLsbChannel(QLCChannel::invalid()) { Q_ASSERT(parent != NULL); @@ -382,8 +387,52 @@ uint EFXFixture::timeOffset() const * Running *****************************************************************************/ -void EFXFixture::start() +void EFXFixture::start(QSharedPointer fader) { + Fixture *fxi = doc()->fixture(head().fxi); + + /* Cache channels to reduce processing while running */ + switch (m_mode) + { + case PanTilt: + { + m_firstMsbChannel = fxi->channelNumber(QLCChannel::Pan, QLCChannel::MSB, head().head); + m_firstLsbChannel = fxi->channelNumber(QLCChannel::Pan, QLCChannel::LSB, head().head); + m_secondMsbChannel = fxi->channelNumber(QLCChannel::Tilt, QLCChannel::MSB, head().head); + m_secondLsbChannel = fxi->channelNumber(QLCChannel::Tilt, QLCChannel::LSB, head().head); + + /* Check for non-contiguous channels */ + if ((m_firstLsbChannel != QLCChannel::invalid() && m_firstLsbChannel - m_firstMsbChannel != 1) || + (m_secondLsbChannel != QLCChannel::invalid() && m_secondLsbChannel - m_secondMsbChannel != 1)) + { + fader->setHandleSecondary(false); + } + } + break; + + case RGB: + break; + + case Dimmer: + { + m_firstMsbChannel = fxi->channelNumber(QLCChannel::Intensity, QLCChannel::MSB, head().head); + if (m_firstMsbChannel != QLCChannel::invalid()) + { + m_firstLsbChannel = fxi->channelNumber(QLCChannel::Intensity, QLCChannel::LSB, head().head); + + /* Check for non-contiguous channels */ + if (m_firstLsbChannel != QLCChannel::invalid() && m_firstLsbChannel - m_firstMsbChannel != 1) + { + fader->setHandleSecondary(false); + } + } + else + { + m_firstMsbChannel = fxi->masterIntensityChannel(); + } + } + break; + } m_started = true; } @@ -432,7 +481,7 @@ void EFXFixture::nextStep(QList universes, QSharedPointerloopDuration(); @@ -463,7 +512,7 @@ void EFXFixture::nextStep(QList universes, QSharedPointersetStart(fc->current()); fc->setTarget(value); @@ -475,80 +524,97 @@ void EFXFixture::updateFaderValues(FadeChannel *fc, uchar value) void EFXFixture::setPointPanTilt(QList universes, QSharedPointer fader, float pan, float tilt) { - Fixture* fxi = doc()->fixture(head().fxi); - Q_ASSERT(fxi != NULL); + if (fader.isNull()) + return; + Universe *uni = universes[universe()]; //qDebug() << "Pan value: " << pan << ", tilt value:" << tilt; - quint32 panMsbChannel = fxi->channelNumber(QLCChannel::Pan, QLCChannel::MSB, head().head); - quint32 panLsbChannel = fxi->channelNumber(QLCChannel::Pan, QLCChannel::LSB, head().head); - quint32 tiltMsbChannel = fxi->channelNumber(QLCChannel::Tilt, QLCChannel::MSB, head().head); - quint32 tiltLsbChannel = fxi->channelNumber(QLCChannel::Tilt, QLCChannel::LSB, head().head); + /* Check for outbound values */ + if (pan < 0) + pan = 0; + + if (tilt < 0) + tilt = 0; - /* Write coarse point data to universes */ - if (panMsbChannel != QLCChannel::invalid() && !fader.isNull()) + /* Write full 16bit point data to universes */ + if (m_firstMsbChannel != QLCChannel::invalid()) { - FadeChannel *fc = fader->getChannelFader(doc(), uni, fxi->id(), panMsbChannel); + quint32 panValue = quint32(pan); + FadeChannel *fc = fader->getChannelFader(doc(), uni, head().fxi, m_firstMsbChannel); + if (m_firstLsbChannel != QLCChannel::invalid()) + { + if (fader->handleSecondary()) + { + fc = fader->getChannelFader(doc(), uni, head().fxi, m_firstLsbChannel); + panValue = (panValue << 8) + quint32((pan - floor(pan)) * float(UCHAR_MAX)); + } + else + { + FadeChannel *lsbFc = fader->getChannelFader(doc(), uni, head().fxi, m_firstLsbChannel); + updateFaderValues(lsbFc, quint32((pan - floor(pan)) * float(UCHAR_MAX))); + } + } if (m_parent->isRelative()) fc->addFlag(FadeChannel::Relative); - updateFaderValues(fc, static_cast(pan)); + + updateFaderValues(fc, panValue); } - if (tiltMsbChannel != QLCChannel::invalid() && !fader.isNull()) + if (m_secondMsbChannel != QLCChannel::invalid()) { - FadeChannel *fc = fader->getChannelFader(doc(), uni, fxi->id(), tiltMsbChannel); + quint32 tiltValue = quint32(tilt); + FadeChannel *fc = fader->getChannelFader(doc(), uni, head().fxi, m_secondMsbChannel); + if (m_secondLsbChannel != QLCChannel::invalid()) + { + if (fader->handleSecondary()) + { + fc = fader->getChannelFader(doc(), uni, head().fxi, m_secondLsbChannel); + tiltValue = (tiltValue << 8) + quint32((tilt - floor(tilt)) * float(UCHAR_MAX)); + } + else + { + FadeChannel *lsbFc = fader->getChannelFader(doc(), uni, head().fxi, m_secondLsbChannel); + updateFaderValues(lsbFc, quint32((tilt - floor(tilt)) * float(UCHAR_MAX))); + } + } if (m_parent->isRelative()) fc->addFlag(FadeChannel::Relative); - updateFaderValues(fc, static_cast(tilt)); - } - - /* Write fine point data to universes if applicable */ - if (panLsbChannel != QLCChannel::invalid() && !fader.isNull()) - { - /* Leave only the fraction */ - float value = ((pan - floor(pan)) * float(UCHAR_MAX)); - FadeChannel *fc = fader->getChannelFader(doc(), uni, fxi->id(), panLsbChannel); - updateFaderValues(fc, static_cast(value)); - } - if (tiltLsbChannel != QLCChannel::invalid() && !fader.isNull()) - { - /* Leave only the fraction */ - float value = ((tilt - floor(tilt)) * float(UCHAR_MAX)); - FadeChannel *fc = fader->getChannelFader(doc(), uni, fxi->id(), tiltLsbChannel); - updateFaderValues(fc, static_cast(value)); + updateFaderValues(fc, tiltValue); } } void EFXFixture::setPointDimmer(QList universes, QSharedPointer fader, float dimmer) { - Fixture *fxi = doc()->fixture(head().fxi); - Q_ASSERT(fxi != NULL); - Universe *uni = universes[universe()]; + if (fader.isNull()) + return; - quint32 intChannel = fxi->channelNumber(QLCChannel::Intensity, QLCChannel::MSB, head().head); + Universe *uni = universes[universe()]; /* Don't write dimmer data directly to universes but use FadeChannel to avoid steps at EFX loop restart */ - if (intChannel != QLCChannel::invalid()) - { - if (!fader.isNull()) - { - FadeChannel *fc = fader->getChannelFader(doc(), uni, fxi->id(), intChannel); - updateFaderValues(fc, dimmer); - } - } - else if (fxi->masterIntensityChannel() != QLCChannel::invalid()) + if (m_firstMsbChannel != QLCChannel::invalid()) { - if (!fader.isNull()) + quint32 dimmerValue = quint32(dimmer); + FadeChannel *fc = fader->getChannelFader(doc(), uni, head().fxi, m_firstMsbChannel); + + if (m_firstLsbChannel != QLCChannel::invalid()) { - FadeChannel *fc = fader->getChannelFader(doc(), uni, fxi->id(), fxi->masterIntensityChannel()); - updateFaderValues(fc, dimmer); + if (fader->handleSecondary()) + { + fc = fader->getChannelFader(doc(), uni, head().fxi, m_firstLsbChannel); + dimmerValue = (dimmerValue << 8) + quint32((dimmer - floor(dimmer)) * float(UCHAR_MAX)); + } } + updateFaderValues(fc, dimmerValue); } } void EFXFixture::setPointRGB(QList universes, QSharedPointer fader, float x, float y) { + if (fader.isNull()) + return; + Fixture* fxi = doc()->fixture(head().fxi); Q_ASSERT(fxi != NULL); Universe *uni = universes[universe()]; diff --git a/engine/src/efxfixture.h b/engine/src/efxfixture.h index a2b52a2984..d98c8fa36a 100644 --- a/engine/src/efxfixture.h +++ b/engine/src/efxfixture.h @@ -188,19 +188,26 @@ class EFXFixture * Running *************************************************************************/ private: - void start(); + void start(QSharedPointer fader); void stop(); /** Calculate the next step data for this fixture */ void nextStep(QList universes, QSharedPointer fader); - void updateFaderValues(FadeChannel *fc, uchar value); + /** Set a 16bit value on a fader gotten from the engine */ + void updateFaderValues(FadeChannel *fc, quint32 value); /** Write this EFXFixture's channel data to universe faders */ void setPointPanTilt(QList universes, QSharedPointer fader, float pan, float tilt); void setPointDimmer(QList universes, QSharedPointer fader, float dimmer); void setPointRGB (QList universes, QSharedPointer fader, float x, float y); +private: + quint32 m_firstMsbChannel; + quint32 m_firstLsbChannel; + quint32 m_secondMsbChannel; + quint32 m_secondLsbChannel; + private: static QImage m_rgbGradient; }; diff --git a/engine/src/fadechannel.cpp b/engine/src/fadechannel.cpp index d1e3fd13dc..2e5a8755ee 100644 --- a/engine/src/fadechannel.cpp +++ b/engine/src/fadechannel.cpp @@ -20,6 +20,7 @@ #include #include +#include "qlcfixturemode.h" #include "fadechannel.h" #include "qlcchannel.h" #include "universe.h" @@ -29,8 +30,9 @@ FadeChannel::FadeChannel() : m_flags(0) , m_fixture(Fixture::invalidId()) , m_universe(Universe::invalid()) - , m_channel(QLCChannel::invalid()) + , m_primaryChannel(QLCChannel::invalid()) , m_address(QLCChannel::invalid()) + , m_channelRef(NULL) , m_start(0) , m_target(0) , m_current(0) @@ -44,8 +46,10 @@ FadeChannel::FadeChannel(const FadeChannel& ch) : m_flags(ch.m_flags) , m_fixture(ch.m_fixture) , m_universe(ch.m_universe) - , m_channel(ch.m_channel) + , m_primaryChannel(ch.m_primaryChannel) + , m_channels(ch.m_channels) , m_address(ch.m_address) + , m_channelRef(ch.m_channelRef) , m_start(ch.m_start) , m_target(ch.m_target) , m_current(ch.m_current) @@ -59,7 +63,7 @@ FadeChannel::FadeChannel(const FadeChannel& ch) FadeChannel::FadeChannel(const Doc *doc, quint32 fxi, quint32 channel) : m_flags(0) , m_fixture(fxi) - , m_channel(channel) + , m_channelRef(NULL) , m_start(0) , m_target(0) , m_current(0) @@ -67,6 +71,7 @@ FadeChannel::FadeChannel(const Doc *doc, quint32 fxi, quint32 channel) , m_fadeTime(0) , m_elapsed(0) { + m_channels.append(channel); autoDetect(doc); } @@ -81,7 +86,9 @@ FadeChannel &FadeChannel::operator=(const FadeChannel &fc) m_flags = fc.m_flags; m_fixture = fc.m_fixture; m_universe = fc.m_universe; - m_channel = fc.m_channel; + m_primaryChannel = fc.m_primaryChannel; + m_channels = fc.m_channels; + m_channelRef = fc.m_channelRef; m_address = fc.m_address; m_start = fc.m_start; m_target = fc.m_target; @@ -96,7 +103,7 @@ FadeChannel &FadeChannel::operator=(const FadeChannel &fc) bool FadeChannel::operator==(const FadeChannel& ch) const { - return (m_fixture == ch.m_fixture && m_channel == ch.m_channel); + return (m_fixture == ch.m_fixture && channel() == ch.channel()); } int FadeChannel::flags() const @@ -143,54 +150,48 @@ void FadeChannel::autoDetect(const Doc *doc) } else { + QLCFixtureMode *mode = fixture->fixtureMode(); m_universe = fixture->universe(); m_address = fixture->address(); // if the fixture was invalid at the beginning of this method // it means channel was an absolute address, so, fix it if (fixtureWasInvalid) - m_channel -= fixture->address(); + m_channels[0] -= fixture->address(); - const QLCChannel *channel = fixture->channel(m_channel); + quint32 chIndex = channel(); + m_primaryChannel = mode ? mode->primaryChannel(chIndex) : QLCChannel::invalid(); + m_channelRef = fixture->channel(chIndex); // non existing channel within fixture - if (channel == NULL) + if (m_channelRef == NULL) { addFlag(FadeChannel::HTP | FadeChannel::Intensity | FadeChannel::CanFade); return; } // autodetect the channel type - if (fixture->channelCanFade(m_channel)) + if (fixture->channelCanFade(chIndex)) addFlag(FadeChannel::CanFade); - if (channel != NULL && channel->group() == QLCChannel::Intensity) + if (m_channelRef != NULL && m_channelRef->group() == QLCChannel::Intensity) addFlag(FadeChannel::HTP | FadeChannel::Intensity); else addFlag(FadeChannel::LTP); - if (fixture->forcedHTPChannels().contains(int(m_channel))) + if (fixture->forcedHTPChannels().contains(int(chIndex))) { removeFlag(FadeChannel::LTP); addFlag(FadeChannel::HTP); } - else if (fixture->forcedLTPChannels().contains(int(m_channel))) + else if (fixture->forcedLTPChannels().contains(int(chIndex))) { removeFlag(FadeChannel::HTP); addFlag(FadeChannel::LTP); } - - if (channel != NULL && channel->controlByte() == QLCChannel::LSB) - addFlag(FadeChannel::Fine); } } -void FadeChannel::setFixture(const Doc *doc, quint32 id) -{ - m_fixture = id; - autoDetect(doc); -} - quint32 FadeChannel::fixture() const { return m_fixture; @@ -203,15 +204,42 @@ quint32 FadeChannel::universe() const return m_universe; } -void FadeChannel::setChannel(const Doc *doc, quint32 num) +void FadeChannel::addChannel(quint32 num) { - m_channel = num; - autoDetect(doc); + m_channels.append(num); + qDebug() << "[FadeChannel] ADD channel" << num << "count:" << m_channels.count(); + + // on secondary channel, shift values 8bits up + if (m_channels.count() > 1) + { + m_start = m_start << 8; + m_target = m_target << 8; + m_current = m_current << 8; + } +} + +int FadeChannel::channelCount() const +{ + if (m_channels.isEmpty()) + return 1; + + return m_channels.count(); } quint32 FadeChannel::channel() const { - return m_channel; + return m_channels.isEmpty() ? QLCChannel::invalid() : m_channels.first(); +} + +int FadeChannel::channelIndex(quint32 channel) +{ + int idx = m_channels.indexOf(channel); + return idx < 0 ? 0 : idx; +} + +quint32 FadeChannel::primaryChannel() const +{ + return m_primaryChannel; } quint32 FadeChannel::address() const @@ -224,42 +252,85 @@ quint32 FadeChannel::address() const quint32 FadeChannel::addressInUniverse() const { - return address() % UNIVERSE_SIZE; + quint32 addr = address(); + if (addr == QLCChannel::invalid()) + return QLCChannel::invalid(); + + return addr % UNIVERSE_SIZE; } -void FadeChannel::setStart(uchar value) +/************************************************************************ + * Values + ************************************************************************/ + +void FadeChannel::setStart(uchar value, int index) +{ + ((uchar *)&m_start)[channelCount() - 1 - index] = value; +} + +void FadeChannel::setStart(quint32 value) { m_start = value; } -uchar FadeChannel::start() const +uchar FadeChannel::start(int index) const +{ + return ((uchar *)&m_start)[channelCount() - 1 - index]; +} + +quint32 FadeChannel::start() const { - return uchar(m_start); + return m_start; } -void FadeChannel::setTarget(uchar value) +void FadeChannel::setTarget(uchar value, int index) +{ + ((uchar *)&m_target)[channelCount() - 1 - index] = value; +} + +void FadeChannel::setTarget(quint32 value) { m_target = value; } -uchar FadeChannel::target() const +uchar FadeChannel::target(int index) const +{ + return ((uchar *)&m_target)[channelCount() - 1 - index]; +} + +quint32 FadeChannel::target() const +{ + return m_target; +} + +void FadeChannel::setCurrent(uchar value, int index) { - return uchar(m_target); + ((uchar *)&m_current)[channelCount() - 1 - index] = value; } -void FadeChannel::setCurrent(uchar value) +void FadeChannel::setCurrent(quint32 value) { m_current = value; } -uchar FadeChannel::current() const +uchar FadeChannel::current(int index) const { - return uchar(m_current); + return ((uchar *)&m_current)[channelCount() - 1 - index]; +} + +quint32 FadeChannel::current() const +{ + return m_current; } -uchar FadeChannel::current(qreal intensity) const +uchar FadeChannel::current(qreal intensity, int index) const { - return uchar(floor((qreal(m_current) * intensity) + 0.5)); + return uchar(floor((qreal(current(index)) * intensity) + 0.5)); +} + +quint32 FadeChannel::current(qreal intensity) const +{ + return quint32(floor((qreal(m_current) * intensity) + 0.5)); } void FadeChannel::setReady(bool rdy) @@ -301,6 +372,7 @@ uchar FadeChannel::nextStep(uint ms) { if (elapsed() < UINT_MAX) setElapsed(elapsed() + ms); + return calculateCurrent(fadeTime(), elapsed()); } @@ -319,14 +391,11 @@ uchar FadeChannel::calculateCurrent(uint fadeTime, uint elapsedTime) } else { - // 16 bit fading works as long as MSB and LSB channels - // are targeting the same value. E.g. Red and Red Fine both at 158 - float val = (float(m_target - m_start) * (float(elapsedTime) / float(fadeTime))) + float(m_start); - long rval = lrintf(val * 256); - if (m_flags & Fine) - m_current = rval & 0xff; - else - m_current = rval / 256; + bool rampUp = m_target > m_start ? true : false; + m_current = rampUp ? m_target - m_start : m_start - m_target; + m_current = m_current * (qreal(elapsedTime) / qreal(fadeTime)); + m_current = rampUp ? m_start + m_current : m_start - m_current; + //qDebug() << "channel" << channel() << "start" << m_start << "target" << m_target << "current" << m_current << "fade" << fadeTime << "elapsed" << elapsedTime ; } return uchar(m_current); diff --git a/engine/src/fadechannel.h b/engine/src/fadechannel.h index 9f09fe05bb..01d129077f 100644 --- a/engine/src/fadechannel.h +++ b/engine/src/fadechannel.h @@ -81,59 +81,84 @@ class FadeChannel void addFlag(int flag); void removeFlag(int flag); -protected: - void autoDetect(const Doc *doc); - -private: - /** Bitmask including the channel type - * and, if needed, more flags */ - int m_flags; - - /************************************************************************ - * Values - ************************************************************************/ -public: - /** Set the Fixture that is being controlled. */ - void setFixture(const Doc *doc, quint32 id); - /** Get the Fixture that is being controlled. */ quint32 fixture() const; /** Get the universe of the Fixture that is being controlled. */ quint32 universe() const; - /** Set channel within the Fixture. */ - void setChannel(const Doc* doc, quint32 num); + /** Add another channel to be handled by this fader */ + void addChannel(quint32 num); - /** Get channel within the Fixture. */ + /** Get the number of channels handled by this fader */ + int channelCount() const; + + /** Get the first (or master) channel handled by this fader */ quint32 channel() const; + /** Get the index of the provided $channel. This is useful only + * when multiple channels are handled and caller doesn't know + * if it is targeting primary or secondary */ + int channelIndex(quint32 channel); + + /** Get (if present) the index of the primary channel this fader relate to */ + quint32 primaryChannel() const; + /** Get the absolute address for this channel. */ quint32 address() const; /** Get the absolute address in its universe for this channel. */ quint32 addressInUniverse() const; +protected: + void autoDetect(const Doc *doc); + +private: + /** Bitmask representing all the channel specificities + * such as fading, overriding, flashing, etc. */ + int m_flags; + + quint32 m_fixture; + quint32 m_universe; + quint32 m_primaryChannel; + QVector m_channels; + quint32 m_address; + + /** Cache channel reference for faster lookup */ + const QLCChannel *m_channelRef; + + /************************************************************************ + * Values + ************************************************************************/ +public: + /** Set starting value. */ - void setStart(uchar value); + void setStart(uchar value, int index); + void setStart(quint32 value); /** Get starting value. */ - uchar start() const; + uchar start(int index) const; + quint32 start() const; /** Set target value. */ - void setTarget(uchar value); + void setTarget(uchar value, int index); + void setTarget(quint32 value); /** Get target value. */ - uchar target() const; + uchar target(int index) const; + quint32 target() const; /** Set the current value. */ - void setCurrent(uchar value); + void setCurrent(uchar value, int index); + void setCurrent(quint32 value); /** Get the current value. */ - uchar current() const; + uchar current(int index) const; + quint32 current() const; /** Get the current value, modified by $intensity. */ - uchar current(qreal intensity) const; + uchar current(qreal intensity, int index) const; + quint32 current(qreal intensity) const; /** Mark this channel as ready (useful for writing LTP values only once). */ void setReady(bool rdy); @@ -177,14 +202,9 @@ class FadeChannel uchar calculateCurrent(uint fadeTime, uint elapsedTime); private: - quint32 m_fixture; - quint32 m_universe; - quint32 m_channel; - quint32 m_address; - - int m_start; - int m_target; - int m_current; + quint32 m_start; + quint32 m_target; + quint32 m_current; bool m_ready; uint m_fadeTime; diff --git a/engine/src/genericfader.cpp b/engine/src/genericfader.cpp index 0802b2073e..44f6461004 100644 --- a/engine/src/genericfader.cpp +++ b/engine/src/genericfader.cpp @@ -17,7 +17,6 @@ limitations under the License. */ -#include #include #include "genericfader.h" @@ -28,6 +27,7 @@ GenericFader::GenericFader(QObject *parent) : QObject(parent) , m_fid(Function::invalidId()) , m_priority(Universe::Auto) + , m_handleSecondary(false) , m_intensity(1.0) , m_parentIntensity(1.0) , m_paused(false) @@ -73,6 +73,16 @@ void GenericFader::setPriority(int priority) m_priority = priority; } +bool GenericFader::handleSecondary() +{ + return m_handleSecondary; +} + +void GenericFader::setHandleSecondary(bool enable) +{ + m_handleSecondary = enable; +} + quint32 GenericFader::channelHash(quint32 fixtureID, quint32 channel) { return ((fixtureID & 0x0000FFFF) << 16) | (channel & 0x0000FFFF); @@ -130,15 +140,41 @@ void GenericFader::requestDelete() FadeChannel *GenericFader::getChannelFader(const Doc *doc, Universe *universe, quint32 fixtureID, quint32 channel) { FadeChannel fc(doc, fixtureID, channel); - quint32 hash = channelHash(fc.fixture(), fc.channel()); + quint32 primary = fc.primaryChannel(); + quint32 hash; + + // calculate hash depending on primary channel presence + if (handleSecondary() && primary != QLCChannel::invalid()) + hash = channelHash(fc.fixture(), primary); + else + hash = channelHash(fc.fixture(), fc.channel()); + + // search for existing FadeChannel QHash::iterator channelIterator = m_channels.find(hash); if (channelIterator != m_channels.end()) - return &channelIterator.value(); + { + FadeChannel *fcFound = &channelIterator.value(); + + if (handleSecondary() && + fcFound->channelCount() == 1 && + primary != QLCChannel::invalid()) + { + qDebug() << "Adding channel to primary" << channel; + fcFound->addChannel(channel); + if (universe) + fcFound->setCurrent(universe->preGMValue(fcFound->address() + 1), 1); + } + return fcFound; + } - fc.setCurrent(universe->preGMValue(fc.address())); + // set current universe value + if (universe) + fc.setCurrent(universe->preGMValue(fc.address())); + // new channel. Add to GenericFader m_channels[hash] = fc; //qDebug() << "Added new fader with hash" << hash; + return &m_channels[hash]; } @@ -159,26 +195,31 @@ void GenericFader::write(Universe *universe) qreal compIntensity = intensity() * parentIntensity(); + //qDebug() << "[GenericFader] writing channels: " << this << m_channels.count(); + QMutableHashIterator it(m_channels); while (it.hasNext() == true) { FadeChannel& fc(it.next().value()); int flags = fc.flags(); int address = int(fc.addressInUniverse()); - uchar value; + int channelCount = fc.channelCount(); + + // iterate through all the channels handled by this fader if (flags & FadeChannel::SetTarget) { fc.removeFlag(FadeChannel::SetTarget); fc.addFlag(FadeChannel::AutoRemove); - fc.setTarget(universe->preGMValue(address)); + for (int i = 0; i < channelCount; i++) + fc.setTarget(universe->preGMValue(address + i), i); } // Calculate the next step - if (m_paused) - value = fc.current(); - else - value = fc.nextStep(MasterTimer::tick()); + if (m_paused == false) + fc.nextStep(MasterTimer::tick()); + + quint32 value = fc.current(); // Apply intensity to channels that can fade if (fc.canFade()) @@ -186,7 +227,7 @@ void GenericFader::write(Universe *universe) if ((flags & FadeChannel::CrossFade) && fc.fadeTime() == 0) { // morph start <-> target depending on intensities - value = uchar(((qreal(fc.target() - fc.start()) * intensity()) + fc.start()) * parentIntensity()); + value = quint32(((qreal(fc.target() - fc.start()) * intensity()) + fc.start()) * parentIntensity()); } else if (flags & FadeChannel::Intensity) { @@ -194,7 +235,7 @@ void GenericFader::write(Universe *universe) } } - //qDebug() << "[GenericFader] >>> uni:" << universe->id() << ", address:" << address << ", value:" << value << "int:" << compIntensity; + //qDebug() << "[GenericFader] >>> uni:" << universe->id() << ", address:" << (address + i) << ", value:" << value << "int:" << compIntensity; if (flags & FadeChannel::Override) { universe->write(address, value, true); @@ -202,16 +243,17 @@ void GenericFader::write(Universe *universe) } else if (flags & FadeChannel::Relative) { - universe->writeRelative(address, value); + universe->writeRelative(address, value, channelCount); } else if (flags & FadeChannel::Flashing) { - universe->write(address, value, flags & FadeChannel::ForceLTP); + universe->writeMultiple(address, value, channelCount); continue; } else { - universe->writeBlended(address, value, m_blendMode); + // treat value as a whole, so do this just once per FadeChannel + universe->writeBlended(address, value, channelCount, m_blendMode); } if (((flags & FadeChannel::Intensity) && @@ -287,24 +329,24 @@ void GenericFader::setFadeOut(bool enable, uint fadeTime) { m_fadeOut = enable; - if (fadeTime) + if (fadeTime == 0) + return; + + QMutableHashIterator it(m_channels); + while (it.hasNext() == true) { - QMutableHashIterator it(m_channels); - while (it.hasNext() == true) - { - FadeChannel& fc(it.next().value()); - - // non-intensity channels (eg LTP) should fade - // to the current universe value - if ((fc.flags() & FadeChannel::Intensity) == 0) - fc.addFlag(FadeChannel::SetTarget); - - fc.setStart(fc.current()); - fc.setTarget(0); - fc.setElapsed(0); - fc.setReady(false); - fc.setFadeTime(fc.canFade() ? fadeTime : 0); - } + FadeChannel& fc(it.next().value()); + + // non-intensity channels (eg LTP) should fade + // to the current universe value + if ((fc.flags() & FadeChannel::Intensity) == 0) + fc.addFlag(FadeChannel::SetTarget); + + fc.setStart(fc.current()); + fc.setTarget(0); + fc.setElapsed(0); + fc.setReady(false); + fc.setFadeTime(fc.canFade() ? fadeTime : 0); } } diff --git a/engine/src/genericfader.h b/engine/src/genericfader.h index 7eba714329..4177c8d8fa 100644 --- a/engine/src/genericfader.h +++ b/engine/src/genericfader.h @@ -25,6 +25,7 @@ #include #include "universe.h" +#include "scenevalue.h" class FadeChannel; @@ -32,6 +33,14 @@ class FadeChannel; * @{ */ +/** + * GenericFader represents all the fading channels for one Function (or feature) + * and one Universe. For example a Scene will request one GenericFader for all the + * channels of all the fixtures on a specific Universe. + * In this way, Universes will handle a list of dedicated faders, without + * any lookup + */ + class GenericFader : public QObject { Q_OBJECT @@ -54,6 +63,11 @@ class GenericFader : public QObject int priority() const; void setPriority(int priority); + /** Get/Set if this fader should handle primary/secondary channels + * when a caller requests a FadeChannel */ + bool handleSecondary(); + void setHandleSecondary(bool enable); + /** Build a hash for a fader channel which is unique in a Universe. * This is used to map channels and access them quickly */ static quint32 channelHash(quint32 fixtureID, quint32 channel); @@ -137,6 +151,7 @@ class GenericFader : public QObject /** Enable/disable universe monitoring before writing new data */ void setMonitoring(bool enable); + /** Remove the Crossfade flag from every fader handled by this class */ void resetCrossfade(); signals: @@ -148,6 +163,7 @@ class GenericFader : public QObject QString m_name; quint32 m_fid; int m_priority; + bool m_handleSecondary; QHash m_channels; qreal m_intensity; qreal m_parentIntensity; diff --git a/engine/src/inputoutputmap.cpp b/engine/src/inputoutputmap.cpp index f4c6cae17f..1cf53b67f5 100644 --- a/engine/src/inputoutputmap.cpp +++ b/engine/src/inputoutputmap.cpp @@ -41,12 +41,11 @@ #include "qlcfile.h" #include "doc.h" -#include "../../plugins/midi/src/common/midiprotocol.h" - InputOutputMap::InputOutputMap(Doc *doc, quint32 universes) : QObject(doc) , m_blackout(false) , m_universeChanged(false) + , m_currentBPM(0) , m_beatTime(new QElapsedTimer()) { m_grandMaster = new GrandMaster(this); @@ -102,6 +101,9 @@ bool InputOutputMap::setBlackout(bool blackout) if (op != NULL) op->setBlackout(blackout); } + + const QByteArray postGM = universe->postGMValues()->mid(0, universe->usedChannels()); + universe->dumpOutput(postGM, true); } emit blackoutChanged(m_blackout); @@ -408,10 +410,10 @@ bool InputOutputMap::setInputPatch(quint32 universe, const QString &pluginName, currProfile = currInPatch->profile(); disconnect(currInPatch, SIGNAL(inputValueChanged(quint32,quint32,uchar,const QString&)), this, SIGNAL(inputValueChanged(quint32,quint32,uchar,const QString&))); - if (currInPatch->pluginName() == "MIDI") + if (currInPatch->plugin()->capabilities() & QLCIOPlugin::Beats) { disconnect(currInPatch, SIGNAL(inputValueChanged(quint32,quint32,uchar,const QString&)), - this, SLOT(slotMIDIBeat(quint32,quint32,uchar))); + this, SLOT(slotPluginBeat(quint32,quint32,uchar,const QString&))); } } InputPatch *ip = NULL; @@ -441,10 +443,10 @@ bool InputOutputMap::setInputPatch(quint32 universe, const QString &pluginName, { connect(ip, SIGNAL(inputValueChanged(quint32,quint32,uchar,const QString&)), this, SIGNAL(inputValueChanged(quint32,quint32,uchar,const QString&))); - if (ip->pluginName() == "MIDI") + if (ip->plugin()->capabilities() & QLCIOPlugin::Beats) { connect(ip, SIGNAL(inputValueChanged(quint32,quint32,uchar,const QString&)), - this, SLOT(slotMIDIBeat(quint32,quint32,uchar))); + this, SLOT(slotPluginBeat(quint32,quint32,uchar,const QString&))); } } } @@ -749,7 +751,7 @@ QString InputOutputMap::outputPluginStatus(const QString& pluginName, quint32 ou } } -bool InputOutputMap::sendFeedBack(quint32 universe, quint32 channel, uchar value, const QString& key) +bool InputOutputMap::sendFeedBack(quint32 universe, quint32 channel, uchar value, const QVariant ¶ms) { if (universe >= universesCount()) return false; @@ -758,7 +760,7 @@ bool InputOutputMap::sendFeedBack(quint32 universe, quint32 channel, uchar value if (patch != NULL && patch->isPatched()) { - patch->plugin()->sendFeedBack(universe, patch->output(), channel, value, key); + patch->plugin()->sendFeedBack(universe, patch->output(), channel, value, params); return true; } else @@ -997,7 +999,7 @@ void InputOutputMap::setBeatGeneratorType(InputOutputMap::BeatGeneratorType type doc()->masterTimer()->setBeatSourceType(MasterTimer::Internal); setBpmNumber(doc()->masterTimer()->bpmNumber()); break; - case MIDI: + case Plugin: doc()->masterTimer()->setBeatSourceType(MasterTimer::External); // reset the current BPM number and detect it from the MIDI beats setBpmNumber(0); @@ -1024,6 +1026,29 @@ InputOutputMap::BeatGeneratorType InputOutputMap::beatGeneratorType() const return m_beatGeneratorType; } +QString InputOutputMap::beatTypeToString(BeatGeneratorType type) const +{ + switch (type) + { + case Internal: return "Internal"; + case Plugin: return "Plugin"; + case Audio: return "Audio"; + default: return "Disabled"; + } +} + +InputOutputMap::BeatGeneratorType InputOutputMap::stringToBeatType(QString str) +{ + if (str == "Internal") + return Internal; + else if (str == "Plugin") + return Plugin; + else if (str == "Audio") + return Audio; + + return Disabled; +} + void InputOutputMap::setBpmNumber(int bpm) { if (m_beatGeneratorType == Disabled || bpm == m_currentBPM) @@ -1054,35 +1079,32 @@ void InputOutputMap::slotMasterTimerBeat() emit beat(); } -void InputOutputMap::slotMIDIBeat(quint32 universe, quint32 channel, uchar value) +void InputOutputMap::slotPluginBeat(quint32 universe, quint32 channel, uchar value, const QString &key) { Q_UNUSED(universe) - // not interested in synthetic release event or non-MBC ones - if (m_beatGeneratorType != MIDI || value == 0 || channel < CHANNEL_OFFSET_MBC_PLAYBACK) + // not interested in synthetic release or non-beat event + if (m_beatGeneratorType != Plugin || value == 0 || key != "beat") return; - qDebug() << "MIDI MBC:" << channel << m_beatTime->elapsed(); + qDebug() << "Plugin beat:" << channel << m_beatTime->elapsed(); // process the timer as first thing, to avoid wasting time // with the operations below int elapsed = m_beatTime->elapsed(); m_beatTime->restart(); - if (channel == CHANNEL_OFFSET_MBC_BEAT) - { - int bpm = qRound(60000.0 / (float)elapsed); - float currBpmTime = 60000.0 / (float)m_currentBPM; - // here we check if the difference between the current BPM duration - // and the current time elapsed is within a range of +/-1ms. - // If it isn't, then the BPM number has really changed, otherwise - // it's just a tiny time drift - if (qAbs((float)elapsed - currBpmTime) > 1) - setBpmNumber(bpm); - - doc()->masterTimer()->requestBeat(); - emit beat(); - } + int bpm = qRound(60000.0 / (float)elapsed); + float currBpmTime = 60000.0 / (float)m_currentBPM; + // here we check if the difference between the current BPM duration + // and the current time elapsed is within a range of +/-1ms. + // If it isn't, then the BPM number has really changed, otherwise + // it's just a tiny time drift + if (qAbs((float)elapsed - currBpmTime) > 1) + setBpmNumber(bpm); + + doc()->masterTimer()->requestBeat(); + emit beat(); } void InputOutputMap::slotAudioSpectrum(double *spectrumBands, int size, double maxMagnitude, quint32 power) @@ -1270,6 +1292,18 @@ bool InputOutputMap::loadXML(QXmlStreamReader &root) uni->loadXML(root, m_universeArray.count() - 1, this); } } + else if (root.name() == KXMLIOBeatGenerator) + { + QXmlStreamAttributes attrs = root.attributes(); + + if (attrs.hasAttribute(KXMLIOBeatType)) + setBeatGeneratorType(stringToBeatType(attrs.value(KXMLIOBeatType).toString())); + + if (attrs.hasAttribute(KXMLIOBeatsPerMinute)) + setBpmNumber(attrs.value(KXMLIOBeatsPerMinute).toInt()); + + root.skipCurrentElement(); + } else { qWarning() << Q_FUNC_INFO << "Unknown IO Map tag:" << root.name(); @@ -1287,6 +1321,11 @@ bool InputOutputMap::saveXML(QXmlStreamWriter *doc) const /* IO Map Instance entry */ doc->writeStartElement(KXMLIOMap); + doc->writeStartElement(KXMLIOBeatGenerator); + doc->writeAttribute(KXMLIOBeatType, beatTypeToString(m_beatGeneratorType)); + doc->writeAttribute(KXMLIOBeatsPerMinute, QString::number(m_currentBPM)); + doc->writeEndElement(); + foreach (Universe *uni, m_universeArray) uni->saveXML(doc); @@ -1294,5 +1333,3 @@ bool InputOutputMap::saveXML(QXmlStreamWriter *doc) const return true; } - - diff --git a/engine/src/inputoutputmap.h b/engine/src/inputoutputmap.h index 82ea794025..2fa0b4c153 100644 --- a/engine/src/inputoutputmap.h +++ b/engine/src/inputoutputmap.h @@ -42,7 +42,10 @@ class Doc; * @{ */ -#define KXMLIOMap QString("InputOutputMap") +#define KXMLIOMap QString("InputOutputMap") +#define KXMLIOBeatGenerator QString("BeatGenerator") +#define KXMLIOBeatType QString("BeatType") +#define KXMLIOBeatsPerMinute QString("BPM") class InputOutputMap : public QObject { @@ -499,7 +502,7 @@ class InputOutputMap : public QObject * Send feedback value to the input profile e.g. to move a motorized * sliders & knobs, set indicator leds etc. */ - bool sendFeedBack(quint32 universe, quint32 channel, uchar value, const QString& key = 0); + bool sendFeedBack(quint32 universe, quint32 channel, uchar value, const QVariant ¶ms); private: /** In case of duplicate strings, append a number to make them unique */ @@ -580,19 +583,22 @@ private slots: { Disabled, //! No one is generating beats Internal, //! MasterTimer is the beat generator - MIDI, //! A MIDI plugin is the beat generator + Plugin, //! A plugin is the beat generator Audio //! An audio input device is the beat generator }; void setBeatGeneratorType(BeatGeneratorType type); BeatGeneratorType beatGeneratorType() const; + QString beatTypeToString(BeatGeneratorType type) const; + BeatGeneratorType stringToBeatType(QString str); + void setBpmNumber(int bpm); int bpmNumber() const; protected slots: void slotMasterTimerBeat(); - void slotMIDIBeat(quint32 universe, quint32 channel, uchar value); + void slotPluginBeat(quint32 universe, quint32 channel, uchar value, const QString &key); void slotAudioSpectrum(double *spectrumBands, int size, double maxMagnitude, quint32 power); signals: diff --git a/engine/src/qlcfixturemode.cpp b/engine/src/qlcfixturemode.cpp index 08baaaf329..9ae993c882 100644 --- a/engine/src/qlcfixturemode.cpp +++ b/engine/src/qlcfixturemode.cpp @@ -252,6 +252,11 @@ quint32 QLCFixtureMode::masterIntensityChannel() const return m_masterIntensityChannel; } +quint32 QLCFixtureMode::primaryChannel(quint32 chIndex) +{ + return m_secondaryMap.value(chIndex, QLCChannel::invalid()); +} + quint32 QLCFixtureMode::channelActsOn(quint32 chIndex) { return m_actsOnMap.value(chIndex, QLCChannel::invalid()); @@ -308,22 +313,39 @@ int QLCFixtureMode::headForChannel(quint32 chnum) const void QLCFixtureMode::cacheHeads() { + QLCChannel *lastChannel = NULL; + for (int i = 0; i < m_heads.size(); i++) { QLCFixtureHead& head(m_heads[i]); head.cacheChannels(this); } - for (int i = 0; i < m_channels.size(); i++) + for (quint32 i = 0; i < quint32(m_channels.size()); i++) { - if (m_channels.at(i)->group() == QLCChannel::Intensity && - m_channels.at(i)->controlByte() == QLCChannel::MSB && - m_channels.at(i)->colour() == QLCChannel::NoColour && + QLCChannel *channel = m_channels.at(i); + + /** Auto-detect master intensity channel */ + if (m_masterIntensityChannel == QLCChannel::invalid() && + channel->group() == QLCChannel::Intensity && + channel->controlByte() == QLCChannel::MSB && + channel->colour() == QLCChannel::NoColour && headForChannel(i) == -1) { m_masterIntensityChannel = i; - break; } + + /** Map secondary channels */ + if (lastChannel != NULL && + channel->group() == lastChannel->group() && + lastChannel->controlByte() == QLCChannel::MSB && + channel->controlByte() == QLCChannel::LSB) + { + //qDebug() << "Channel" << lastChannel->name() << "is primary and" << channel->name() << "is secondary"; + m_secondaryMap[i] = i - 1; + } + + lastChannel = channel; } } diff --git a/engine/src/qlcfixturemode.h b/engine/src/qlcfixturemode.h index adca973026..54485f3e1a 100644 --- a/engine/src/qlcfixturemode.h +++ b/engine/src/qlcfixturemode.h @@ -206,8 +206,13 @@ class QLCFixtureMode */ quint32 channelNumber(QLCChannel::Group group, QLCChannel::ControlByte cByte = QLCChannel::MSB) const; + /** Return the auto-detected channel index of the Fixture master dimmer for this mode */ quint32 masterIntensityChannel() const; + /** Return the index of the primary channel $chIndex relates to. + * Return invalid if not present */ + quint32 primaryChannel(quint32 chIndex); + /** Return the channel index on which the given $chIndex acts on. * Return invalid if not present */ quint32 channelActsOn(quint32 chIndex); @@ -218,9 +223,14 @@ class QLCFixtureMode QVector m_channels; /** Map of channel indices that act on other channels. - * These are stored as: < index, acts on index> */ + * These are stored as: */ QMap m_actsOnMap; + /** Map of channel indices that relate to some other primary channel. + * For example Pan Fine vs Pan, Red Fine vs Red, etc + * These are stored as: */ + QMap m_secondaryMap; + quint32 m_masterIntensityChannel; /********************************************************************* diff --git a/engine/src/qlcinputchannel.cpp b/engine/src/qlcinputchannel.cpp index e4b8ee6f3c..db99554c19 100644 --- a/engine/src/qlcinputchannel.cpp +++ b/engine/src/qlcinputchannel.cpp @@ -34,8 +34,9 @@ QLCInputChannel::QLCInputChannel() , m_movementType(Absolute) , m_movementSensitivity(20) , m_sendExtraPress(false) - , m_lower(0) - , m_upper(UCHAR_MAX) + , m_lowerValue(0) + , m_upperValue(UCHAR_MAX) + , m_lowerChannel(-1) { } @@ -47,6 +48,7 @@ QLCInputChannel *QLCInputChannel::createCopy() copy->setMovementType(this->movementType()); copy->setMovementSensitivity(this->movementSensitivity()); copy->setSendExtraPress(this->sendExtraPress()); + copy->setLowerChannel(this->lowerChannel()); copy->setRange(this->lowerValue(), this->upperValue()); return copy; @@ -244,32 +246,46 @@ void QLCInputChannel::setRange(uchar lower, uchar upper) uchar QLCInputChannel::lowerValue() const { - return m_lower; + return m_lowerValue; } void QLCInputChannel::setLowerValue(const uchar value) { - if (value == m_lower) + if (value == m_lowerValue) return; - - m_lower = value; + + m_lowerValue = value; emit lowerValueChanged(); } uchar QLCInputChannel::upperValue() const { - return m_upper; + return m_upperValue; } void QLCInputChannel::setUpperValue(const uchar value) { - if (value == m_upper) + if (value == m_upperValue) return; - - m_upper = value; + + m_upperValue = value; emit upperValueChanged(); } +int QLCInputChannel::lowerChannel() const +{ + return m_lowerChannel; +} + +void QLCInputChannel::setLowerChannel(const int channel) +{ + if (channel == m_lowerChannel) + return; + + m_lowerChannel = channel; + emit midiChannelChanged(); +} + /**************************************************************************** * Load & Save ****************************************************************************/ @@ -305,16 +321,21 @@ bool QLCInputChannel::loadXML(QXmlStreamReader &root) if (root.readElementText() == KXMLQLCInputChannelRelative) setMovementType(Relative); } - else if (root.name() == KXMLQLCInputChannelFeedbacks) + else if (root.name() == KXMLQLCInputChannelFeedback) { + QXmlStreamAttributes attrs = root.attributes(); uchar min = 0, max = UCHAR_MAX; + int fbChannel = -1; - if (root.attributes().hasAttribute(KXMLQLCInputChannelLowerValue)) - min = uchar(root.attributes().value(KXMLQLCInputChannelLowerValue).toString().toUInt()); - if (root.attributes().hasAttribute(KXMLQLCInputChannelUpperValue)) - max = uchar(root.attributes().value(KXMLQLCInputChannelUpperValue).toString().toUInt()); + if (attrs.hasAttribute(KXMLQLCInputChannelLowerValue)) + min = uchar(attrs.value(KXMLQLCInputChannelLowerValue).toString().toUInt()); + if (attrs.hasAttribute(KXMLQLCInputChannelUpperValue)) + max = uchar(attrs.value(KXMLQLCInputChannelUpperValue).toString().toUInt()); + if (attrs.hasAttribute(KXMLQLCInputChannelMidiChannel)) + fbChannel = attrs.value(KXMLQLCInputChannelMidiChannel).toInt(); setRange(min, max); + setLowerChannel(fbChannel); root.skipCurrentElement(); } else @@ -357,11 +378,13 @@ bool QLCInputChannel::saveXML(QXmlStreamWriter *doc, quint32 channelNumber) cons } else if (type() == Button && (lowerValue() != 0 || upperValue() != UCHAR_MAX)) { - doc->writeStartElement(KXMLQLCInputChannelFeedbacks); + doc->writeStartElement(KXMLQLCInputChannelFeedback); if (lowerValue() != 0) doc->writeAttribute(KXMLQLCInputChannelLowerValue, QString::number(lowerValue())); if (upperValue() != UCHAR_MAX) doc->writeAttribute(KXMLQLCInputChannelUpperValue, QString::number(upperValue())); + if (lowerChannel() != -1) + doc->writeAttribute(KXMLQLCInputChannelMidiChannel, QString::number(lowerChannel())); doc->writeEndElement(); } diff --git a/engine/src/qlcinputchannel.h b/engine/src/qlcinputchannel.h index 27edabae82..88dad0bc73 100644 --- a/engine/src/qlcinputchannel.h +++ b/engine/src/qlcinputchannel.h @@ -32,25 +32,26 @@ class QString; * @{ */ -#define KXMLQLCInputChannel QString("Channel") -#define KXMLQLCInputChannelName QString("Name") -#define KXMLQLCInputChannelType QString("Type") -#define KXMLQLCInputChannelNumber QString("Number") -#define KXMLQLCInputChannelSlider QString("Slider") -#define KXMLQLCInputChannelKnob QString("Knob") -#define KXMLQLCInputChannelEncoder QString("Encoder") -#define KXMLQLCInputChannelButton QString("Button") -#define KXMLQLCInputChannelPageUp QString("Next Page") -#define KXMLQLCInputChannelPageDown QString("Previous Page") -#define KXMLQLCInputChannelPageSet QString("Page Set") -#define KXMLQLCInputChannelNone QString("None") -#define KXMLQLCInputChannelMovement QString("Movement") -#define KXMLQLCInputChannelRelative QString("Relative") -#define KXMLQLCInputChannelSensitivity QString("Sensitivity") -#define KXMLQLCInputChannelExtraPress QString("ExtraPress") -#define KXMLQLCInputChannelFeedbacks QString("Feedbacks") -#define KXMLQLCInputChannelLowerValue QString("LowerValue") -#define KXMLQLCInputChannelUpperValue QString("UpperValue") +#define KXMLQLCInputChannel QString("Channel") +#define KXMLQLCInputChannelName QString("Name") +#define KXMLQLCInputChannelType QString("Type") +#define KXMLQLCInputChannelNumber QString("Number") +#define KXMLQLCInputChannelSlider QString("Slider") +#define KXMLQLCInputChannelKnob QString("Knob") +#define KXMLQLCInputChannelEncoder QString("Encoder") +#define KXMLQLCInputChannelButton QString("Button") +#define KXMLQLCInputChannelPageUp QString("Next Page") +#define KXMLQLCInputChannelPageDown QString("Previous Page") +#define KXMLQLCInputChannelPageSet QString("Page Set") +#define KXMLQLCInputChannelNone QString("None") +#define KXMLQLCInputChannelMovement QString("Movement") +#define KXMLQLCInputChannelRelative QString("Relative") +#define KXMLQLCInputChannelSensitivity QString("Sensitivity") +#define KXMLQLCInputChannelExtraPress QString("ExtraPress") +#define KXMLQLCInputChannelFeedback QString("Feedback") +#define KXMLQLCInputChannelLowerValue QString("LowerValue") +#define KXMLQLCInputChannelUpperValue QString("UpperValue") +#define KXMLQLCInputChannelMidiChannel QString("MidiChannel") class QLCInputChannel : public QObject { @@ -190,14 +191,22 @@ class QLCInputChannel : public QObject uchar upperValue() const; void setUpperValue(const uchar value); + int lowerChannel() const; + void setLowerChannel(const int channel); + + int upperChannel() const; + void setUpperChannel(const int channel); + signals: void sendExtraPressChanged(); void lowerValueChanged(); void upperValueChanged(); + void midiChannelChanged(); protected: bool m_sendExtraPress; - uchar m_lower, m_upper; + uchar m_lowerValue, m_upperValue; + int m_lowerChannel, m_upperChannel; /******************************************************************** * Load & Save diff --git a/engine/src/qlcinputfeedback.cpp b/engine/src/qlcinputfeedback.cpp new file mode 100644 index 0000000000..48980fc2bb --- /dev/null +++ b/engine/src/qlcinputfeedback.cpp @@ -0,0 +1,71 @@ +/* + Q Light Controller Plus + qlcinputfeedback.cpp + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "qlcinputfeedback.h" + + +QLCInputFeedback::QLCInputFeedback() + : m_type(Undefinded) + , m_value(0) +{ +} + +QLCInputFeedback *QLCInputFeedback::createCopy() +{ + QLCInputFeedback *copy = new QLCInputFeedback(); + copy->setType(this->type()); + copy->setValue(this->value()); + copy->setExtraParams(this->extraParams()); + + return copy; +} + +QLCInputFeedback::~QLCInputFeedback() +{ +} + +QLCInputFeedback::FeedbackType QLCInputFeedback::type() const +{ + return m_type; +} + +void QLCInputFeedback::setType(FeedbackType type) +{ + m_type = type; +} + +uchar QLCInputFeedback::value() const +{ + return m_value; +} + +void QLCInputFeedback::setValue(uchar value) +{ + m_value = value; +} + +QVariant QLCInputFeedback::extraParams() const +{ + return m_extraParams; +} + +void QLCInputFeedback::setExtraParams(QVariant params) +{ + m_extraParams = params; +} diff --git a/engine/src/qlcinputfeedback.h b/engine/src/qlcinputfeedback.h new file mode 100644 index 0000000000..360ff98e56 --- /dev/null +++ b/engine/src/qlcinputfeedback.h @@ -0,0 +1,70 @@ +/* + Q Light Controller Plus + qlcinputfeedback.h + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef QLCINPUTFEEDBACK_H +#define QLCINPUTFEEDBACK_H + +#include +#include + +class QLCInputFeedback : public QObject +{ + Q_OBJECT + + /******************************************************************** + * Initialization + ********************************************************************/ +public: + /** Standard constructor */ + QLCInputFeedback(); + + /** Copy constructor */ + QLCInputFeedback *createCopy(); + + /** Destructor */ + virtual ~QLCInputFeedback(); + + /** Feedback type */ + enum FeedbackType + { + Undefinded = -1, + LowerValue = 0, + UpperValue = 1, + MonitorValue = 2 + }; +#if QT_VERSION >= 0x050500 + Q_ENUM(FeedbackType) +#endif + + FeedbackType type() const; + void setType(FeedbackType type); + + uchar value() const; + void setValue(uchar value); + + QVariant extraParams() const; + void setExtraParams(QVariant params); + +protected: + FeedbackType m_type; + uchar m_value; + QVariant m_extraParams; +}; + +#endif /* QLCINPUTFEEDBACK_H */ diff --git a/engine/src/qlcinputprofile.cpp b/engine/src/qlcinputprofile.cpp index 3d1a8b2872..e0377de014 100644 --- a/engine/src/qlcinputprofile.cpp +++ b/engine/src/qlcinputprofile.cpp @@ -35,6 +35,9 @@ #define KXMLQLCInputProfileTypeDmx "DMX" #define KXMLQLCInputProfileTypeEnttec "Enttec" +#define KXMLQLCInputProfileValue "Value" +#define KXMLQLCInputProfileLabel "Label" +#define KXMLQLCInputProfileColorRGB "RGB" /**************************************************************************** * Initialization @@ -71,6 +74,23 @@ QLCInputProfile *QLCInputProfile::createCopy() copy->insertChannel(it.key(), it.value()->createCopy()); } + /* Copy the other profile's color table */ + QMapIterator > it2(this->colorTable()); + while (it2.hasNext() == true) + { + it2.next(); + QPair lc = it2.value(); + copy->addColor(it2.key(), lc.first, lc.second); + } + + /* Copy the other profile's MIDI channel tabel */ + QMapIterator it3(this->midiChannelTable()); + while (it3.hasNext() == true) + { + it3.next(); + copy->addMidiChannel(it3.key(), it3.value()); + } + return copy; } @@ -90,12 +110,29 @@ QLCInputProfile& QLCInputProfile::operator=(const QLCInputProfile& profile) destroyChannels(); /* Copy the other profile's channels */ - QMapIterator it(profile.m_channels); + QMapIterator it(profile.m_channels); while (it.hasNext() == true) { it.next(); insertChannel(it.key(), it.value()->createCopy()); } + + /* Copy the other profile's color table */ + QMapIterator > it2(profile.m_colorTable); + while (it2.hasNext() == true) + { + it2.next(); + QPair lc = it2.value(); + addColor(it2.key(), lc.first, lc.second); + } + + /* Copy the other profile's MIDI channel tabel */ + QMapIterator it3(profile.m_midiChannelTable); + while (it3.hasNext() == true) + { + it3.next(); + addMidiChannel(it3.key(), it3.value()); + } } return *this; @@ -300,6 +337,19 @@ QMap QLCInputProfile::channels() const return m_channels; } +QVariant QLCInputProfile::channelExtraParams(const QLCInputChannel* channel) const +{ + if (channel == NULL) + return QVariant(); + + switch (m_type) + { + case OSC: return channel->name(); + case MIDI: return channel->lowerChannel(); + default: return QVariant(); + } +} + void QLCInputProfile::destroyChannels() { /* Delete existing channels but leave the pointers there */ @@ -311,6 +361,53 @@ void QLCInputProfile::destroyChannels() m_channels.clear(); } +bool QLCInputProfile::hasColorTable() +{ + return m_colorTable.isEmpty() ? false : true; +} + +void QLCInputProfile::addColor(uchar value, QString label, QColor color) +{ + QPair lc; + lc.first = label; + lc.second = color; + m_colorTable.insert(value, lc); +} + +void QLCInputProfile::removeColor(uchar value) +{ + m_colorTable.remove(value); +} + +QMap > QLCInputProfile::colorTable() +{ + return m_colorTable; +} + +/******************************************************************** + * MIDI Channel table + ********************************************************************/ + +bool QLCInputProfile::hasMidiChannelTable() +{ + return m_midiChannelTable.isEmpty() ? false : true; +} + +void QLCInputProfile::addMidiChannel(uchar channel, QString label) +{ + m_midiChannelTable.insert(channel, label); +} + +void QLCInputProfile::removeMidiChannel(uchar channel) +{ + m_midiChannelTable.remove(channel); +} + +QMap QLCInputProfile::midiChannelTable() +{ + return m_midiChannelTable; +} + /**************************************************************************** * Load & Save ****************************************************************************/ @@ -345,6 +442,65 @@ QLCInputProfile* QLCInputProfile::loader(const QString& path) return profile; } +bool QLCInputProfile::loadColorTableXML(QXmlStreamReader &tableRoot) +{ + if (tableRoot.name() != KXMLQLCInputProfileColorTable) + { + qWarning() << Q_FUNC_INFO << "Color table node not found"; + return false; + } + + tableRoot.readNextStartElement(); + + do + { + if (tableRoot.name() == KXMLQLCInputProfileColor) + { + /* get value & color */ + uchar value = tableRoot.attributes().value(KXMLQLCInputProfileValue).toInt(); + QString label = tableRoot.attributes().value(KXMLQLCInputProfileLabel).toString(); + QColor color = QColor(tableRoot.attributes().value(KXMLQLCInputProfileColorRGB).toString()); + addColor(value, label, color); + } + else + { + qWarning() << Q_FUNC_INFO << "Unknown color table tag:" << tableRoot.name().toString(); + } + tableRoot.skipCurrentElement(); + } while (tableRoot.readNextStartElement()); + + return true; +} + +bool QLCInputProfile::loadMidiChannelTableXML(QXmlStreamReader &tableRoot) +{ + if (tableRoot.name() != KXMLQLCInputProfileMidiChannelTable) + { + qWarning() << Q_FUNC_INFO << "MIDI channel table node not found"; + return false; + } + + tableRoot.readNextStartElement(); + + do + { + if (tableRoot.name() == KXMLQLCInputProfileMidiChannel) + { + /* get value & color */ + uchar value = tableRoot.attributes().value(KXMLQLCInputProfileValue).toInt(); + QString label = tableRoot.attributes().value(KXMLQLCInputProfileLabel).toString(); + addMidiChannel(value, label); + } + else + { + qWarning() << Q_FUNC_INFO << "Unknown MIDI channel table tag:" << tableRoot.name().toString(); + } + tableRoot.skipCurrentElement(); + } while (tableRoot.readNextStartElement()); + + return true; +} + bool QLCInputProfile::loadXML(QXmlStreamReader& doc) { if (doc.readNextStartElement() == false) @@ -393,6 +549,19 @@ bool QLCInputProfile::loadXML(QXmlStreamReader& doc) else doc.skipCurrentElement(); } + else if (doc.name() == KXMLQLCInputProfileColorTable) + { + loadColorTableXML(doc); + } + else if (doc.name() == KXMLQLCInputProfileMidiChannelTable) + { + loadMidiChannelTableXML(doc); + } + else + { + qWarning() << Q_FUNC_INFO << "Unknown input profile tag:" << doc.name().toString(); + doc.skipCurrentElement(); + } } return true; @@ -433,10 +602,48 @@ bool QLCInputProfile::saveXML(const QString& fileName) it.value()->saveXML(&doc, it.key()); } + if (hasColorTable()) + { + doc.writeStartElement(KXMLQLCInputProfileColorTable); + + QMapIterator > it(m_colorTable); + while (it.hasNext() == true) + { + it.next(); + QPair lc = it.value(); + doc.writeStartElement(KXMLQLCInputProfileColor); + doc.writeAttribute(KXMLQLCInputProfileValue, QString::number(it.key())); + doc.writeAttribute(KXMLQLCInputProfileLabel, lc.first); + doc.writeAttribute(KXMLQLCInputProfileColorRGB, lc.second.name()); + doc.writeEndElement(); + } + + doc.writeEndElement(); + } + + if (hasMidiChannelTable()) + { + doc.writeStartElement(KXMLQLCInputProfileMidiChannelTable); + + QMapIterator it(m_midiChannelTable); + while (it.hasNext() == true) + { + it.next(); + doc.writeStartElement(KXMLQLCInputProfileMidiChannel); + doc.writeAttribute(KXMLQLCInputProfileValue, QString::number(it.key())); + doc.writeAttribute(KXMLQLCInputProfileLabel, it.value()); + doc.writeEndElement(); + + } + doc.writeEndElement(); + } + m_path = fileName; + /* End the document and close all the open elements */ doc.writeEndDocument(); file.close(); return true; } + diff --git a/engine/src/qlcinputprofile.h b/engine/src/qlcinputprofile.h index 70027ce437..69c6aaa200 100644 --- a/engine/src/qlcinputprofile.h +++ b/engine/src/qlcinputprofile.h @@ -40,6 +40,10 @@ class QXmlStreamReader; #define KXMLQLCInputProfileModel QString("Model") #define KXMLQLCInputProfileType QString("Type") #define KXMLQLCInputProfileMidiSendNoteOff QString("MIDISendNoteOff") +#define KXMLQLCInputProfileColorTable QString("ColorTable") +#define KXMLQLCInputProfileColor QString("Color") +#define KXMLQLCInputProfileMidiChannelTable QString("MidiChannelTable") +#define KXMLQLCInputProfileMidiChannel QString("Channel") class QLCInputProfile : public QObject { @@ -165,7 +169,7 @@ class QLCInputProfile : public QObject * @param channel The number of the channel to get. * @return A QLCInputChannel* or NULL if not found. */ - QLCInputChannel* channel(quint32 channel) const; + QLCInputChannel *channel(quint32 channel) const; /** * Get the channel number for the given input channel. @@ -180,6 +184,12 @@ class QLCInputProfile : public QObject */ QMap channels() const; + /** + * Retrieve additional parameters to be passed to plugins + * when sending feedback. + */ + QVariant channelExtraParams(const QLCInputChannel *channel) const; + private: /** Delete and remove all channels */ void destroyChannels(); @@ -189,6 +199,32 @@ class QLCInputProfile : public QObject QList because not all channels might be present. */ QMap m_channels; + /******************************************************************** + * Color Translation Table + ********************************************************************/ +public: + bool hasColorTable(); + void addColor(uchar value, QString label, QColor color); + void removeColor(uchar value); + + QMap> colorTable(); + +protected: + QMap> m_colorTable; + + /******************************************************************** + * MIDI Channel table + ********************************************************************/ +public: + bool hasMidiChannelTable(); + void addMidiChannel(uchar channel, QString label); + void removeMidiChannel(uchar channel); + + QMap midiChannelTable(); + +protected: + QMap m_midiChannelTable; + /******************************************************************** * Load & Save ********************************************************************/ @@ -199,6 +235,12 @@ class QLCInputProfile : public QObject /** Save an input profile into a given file name */ bool saveXML(const QString& fileName); + /** Load an optional color table for RGB LED feedback */ + bool loadColorTableXML(QXmlStreamReader &tableRoot); + + /** Load an optional MIDI channel table */ + bool loadMidiChannelTableXML(QXmlStreamReader &tableRoot); + /** Load an input profile from the given document */ bool loadXML(QXmlStreamReader &doc); }; diff --git a/engine/src/qlcinputsource.cpp b/engine/src/qlcinputsource.cpp index b418b1b39c..ad7eb151a2 100644 --- a/engine/src/qlcinputsource.cpp +++ b/engine/src/qlcinputsource.cpp @@ -36,8 +36,6 @@ QLCInputSource::QLCInputSource(QThread *parent) , m_universe(invalidUniverse) , m_channel(invalidChannel) , m_id(invalidID) - , m_lower(0) - , m_upper(255) , m_workingMode(Absolute) , m_sensitivity(20) , m_emitExtraPressRelease(false) @@ -45,14 +43,18 @@ QLCInputSource::QLCInputSource(QThread *parent) , m_outputValue(0) , m_running(false) { + m_lower.setType(QLCInputFeedback::LowerValue); + m_lower.setValue(0); + m_upper.setType(QLCInputFeedback::UpperValue); + m_upper.setValue(UCHAR_MAX); + m_monitor.setType(QLCInputFeedback::MonitorValue); + m_monitor.setValue(UCHAR_MAX); } QLCInputSource::QLCInputSource(quint32 universe, quint32 channel, QThread *parent) : QThread(parent) , m_universe(universe) , m_channel(channel) - , m_lower(0) - , m_upper(255) , m_workingMode(Absolute) , m_sensitivity(20) , m_emitExtraPressRelease(false) @@ -60,6 +62,12 @@ QLCInputSource::QLCInputSource(quint32 universe, quint32 channel, QThread *paren , m_outputValue(0) , m_running(false) { + m_lower.setType(QLCInputFeedback::LowerValue); + m_lower.setValue(0); + m_upper.setType(QLCInputFeedback::UpperValue); + m_upper.setValue(UCHAR_MAX); + m_monitor.setType(QLCInputFeedback::MonitorValue); + m_monitor.setValue(UCHAR_MAX); } QLCInputSource::~QLCInputSource() @@ -120,20 +128,66 @@ quint32 QLCInputSource::id() const return m_id; } -void QLCInputSource::setRange(uchar lower, uchar upper) +/********************************************************************* + * Custom feedback + *********************************************************************/ + +uchar QLCInputSource::feedbackValue(QLCInputFeedback::FeedbackType type) const +{ + switch (type) + { + case QLCInputFeedback::LowerValue: return m_lower.value(); + case QLCInputFeedback::UpperValue: return m_upper.value(); + case QLCInputFeedback::MonitorValue: return m_monitor.value(); + default: return 0; + } +} + +void QLCInputSource::setFeedbackValue(QLCInputFeedback::FeedbackType type, uchar value) { - m_lower = lower; - m_upper = upper; + switch (type) + { + case QLCInputFeedback::LowerValue: + m_lower.setValue(value); + break; + case QLCInputFeedback::UpperValue: + m_upper.setValue(value); + break; + case QLCInputFeedback::MonitorValue: + m_monitor.setValue(value); + break; + default: + break; + } } -uchar QLCInputSource::lowerValue() const +QVariant QLCInputSource::feedbackExtraParams(QLCInputFeedback::FeedbackType type) const { - return m_lower; + switch (type) + { + case QLCInputFeedback::LowerValue: return m_lower.extraParams(); + case QLCInputFeedback::UpperValue: return m_upper.extraParams(); + case QLCInputFeedback::MonitorValue: return m_monitor.extraParams(); + default: return 0; + } } -uchar QLCInputSource::upperValue() const +void QLCInputSource::setFeedbackExtraParams(QLCInputFeedback::FeedbackType type, QVariant params) { - return m_upper; + switch (type) + { + case QLCInputFeedback::LowerValue: + m_lower.setExtraParams(params); + break; + case QLCInputFeedback::UpperValue: + m_upper.setExtraParams(params); + break; + case QLCInputFeedback::MonitorValue: + m_monitor.setExtraParams(params); + break; + default: + break; + } } /********************************************************************* @@ -210,8 +264,8 @@ void QLCInputSource::updateInputValue(uchar value) else if (m_emitExtraPressRelease == true) { locker.unlock(); - emit inputValueChanged(m_universe, m_channel, m_upper); - emit inputValueChanged(m_universe, m_channel, m_lower); + emit inputValueChanged(m_universe, m_channel, m_upper.value()); + emit inputValueChanged(m_universe, m_channel, m_lower.value()); } else m_inputValue = value; diff --git a/engine/src/qlcinputsource.h b/engine/src/qlcinputsource.h index 42b762a98d..b1b7b52829 100644 --- a/engine/src/qlcinputsource.h +++ b/engine/src/qlcinputsource.h @@ -20,9 +20,12 @@ #ifndef QLCINPUTSOURCE_H #define QLCINPUTSOURCE_H +#include #include #include +#include "qlcinputfeedback.h" + /** @addtogroup engine Engine * @{ */ @@ -76,12 +79,20 @@ class QLCInputSource: public QThread * Custom feedback *********************************************************************/ public: - void setRange(uchar lower, uchar upper); - uchar lowerValue() const; - uchar upperValue() const; + uchar feedbackValue(QLCInputFeedback::FeedbackType type) const; + void setFeedbackValue(QLCInputFeedback::FeedbackType type, uchar value); + + /** Get/set specific plugins params. + * OSC: a string with the command path + * MIDI: a channel modifier + */ + QVariant feedbackExtraParams(QLCInputFeedback::FeedbackType type) const; + void setFeedbackExtraParams(QLCInputFeedback::FeedbackType type, QVariant params); protected: - uchar m_lower, m_upper; + QLCInputFeedback m_lower; + QLCInputFeedback m_upper; + QLCInputFeedback m_monitor; /********************************************************************* * Working mode diff --git a/engine/src/rgbmatrix.cpp b/engine/src/rgbmatrix.cpp index 7b551b2c11..fb63da39e5 100644 --- a/engine/src/rgbmatrix.cpp +++ b/engine/src/rgbmatrix.cpp @@ -168,6 +168,7 @@ bool RGBMatrix::copyFrom(const Function* function) setAlgorithm(NULL); setStartColor(mtx->startColor()); setEndColor(mtx->endColor()); + setControlMode(mtx->controlMode()); return Function::copyFrom(function); } diff --git a/engine/src/scene.cpp b/engine/src/scene.cpp index 688ff2fb25..25f6350554 100644 --- a/engine/src/scene.cpp +++ b/engine/src/scene.cpp @@ -161,7 +161,7 @@ void Scene::setValue(const SceneValue& scv, bool blind, bool checkHTP) m_fadersMap[universe]->add(fc); } } - } + } } emit changed(this->id()); @@ -723,12 +723,13 @@ void Scene::processValue(MasterTimer *timer, QList ua, uint fadeIn, S fader->setBlendMode(blendMode()); fader->setName(name()); fader->setParentFunctionID(id()); - m_fadersMap[universe] = fader; - fader->setParentIntensity(getAttributeValue(ParentIntensity)); + fader->setHandleSecondary(true); + m_fadersMap[universe] = fader; } FadeChannel *fc = fader->getChannelFader(doc(), ua[universe], scv.fxi, scv.channel); + int chIndex = fc->channelIndex(scv.channel); /** If a blend Function has been set, check if this channel needs to * be blended from a previous value. If so, mark it for crossfade @@ -739,18 +740,18 @@ void Scene::processValue(MasterTimer *timer, QList ua, uint fadeIn, S if (blendScene != NULL && blendScene->checkValue(scv)) { fc->addFlag(FadeChannel::CrossFade); - fc->setCurrent(blendScene->value(scv.fxi, scv.channel)); + fc->setCurrent(blendScene->value(scv.fxi, scv.channel), chIndex); qDebug() << "----- BLEND from Scene" << blendScene->name() << ", fixture:" << scv.fxi << ", channel:" << scv.channel << ", value:" << fc->current(); } } else { - qDebug() << "Scene" << name() << "add channel" << scv.channel << "from" << fc->current() << "to" << scv.value; + qDebug() << "Scene" << name() << "add channel" << scv.channel << "from" << fc->current(chIndex) << "to" << scv.value; } - fc->setStart(fc->current()); - fc->setTarget(scv.value); + fc->setStart(fc->current(chIndex), chIndex); + fc->setTarget(scv.value, chIndex); if (fc->canFade() == false) { diff --git a/engine/src/scriptrunner.cpp b/engine/src/scriptrunner.cpp index 7a883210c3..d41260367e 100644 --- a/engine/src/scriptrunner.cpp +++ b/engine/src/scriptrunner.cpp @@ -517,6 +517,18 @@ bool ScriptRunner::setBlackout(bool enable) return true; } +bool ScriptRunner::setBPM(int bpm) +{ + if (m_running == false) + return false; + + qDebug() << Q_FUNC_INFO; + + m_doc->inputOutputMap()->setBpmNumber(bpm); + + return true; +} + int ScriptRunner::random(QString minTime, QString maxTime) { if (m_running == false) diff --git a/engine/src/scriptrunner.h b/engine/src/scriptrunner.h index 6afc23f024..f5e0c835b4 100644 --- a/engine/src/scriptrunner.h +++ b/engine/src/scriptrunner.h @@ -173,6 +173,14 @@ public slots: */ bool setBlackout(bool enable); + /** + * Set the BPM (beat per minute) number of the internal beat generator + * + * @param bpm the number of beats per minute requested + * @return true if successful. False on error. + */ + bool setBPM(int bpm); + /** * Handle "random" command (string version) * diff --git a/engine/src/showrunner.cpp b/engine/src/showrunner.cpp index 37a37eaa59..ffe2eb1368 100644 --- a/engine/src/showrunner.cpp +++ b/engine/src/showrunner.cpp @@ -90,11 +90,11 @@ ShowRunner::ShowRunner(const Doc* doc, quint32 showID, quint32 startTime) #if 1 qDebug() << "Ordered list of ShowFunctions (time):"; foreach (ShowFunction *sfunc, m_timeFunctions) - qDebug() << "ID:" << sfunc->functionID() << "st:" << sfunc->startTime() << "dur:" << sfunc->duration(m_doc); + qDebug() << "[Show] Function ID:" << sfunc->functionID() << "start time:" << sfunc->startTime() << "duration:" << sfunc->duration(m_doc); qDebug() << "Ordered list of ShowFunctions (beats):"; foreach (ShowFunction *sfunc, m_beatFunctions) - qDebug() << "ID:" << sfunc->functionID() << "st:" << sfunc->startTime() << "dur:" << sfunc->duration(m_doc); + qDebug() << "[Show] Function ID:" << sfunc->functionID() << "start time:" << sfunc->startTime() << "duration:" << sfunc->duration(m_doc); #endif m_runningQueue.clear(); diff --git a/engine/src/src.pro b/engine/src/src.pro index d6694d2039..3ac314b9b0 100644 --- a/engine/src/src.pro +++ b/engine/src/src.pro @@ -51,6 +51,7 @@ HEADERS += avolitesd4parser.h \ qlcfixturemode.h \ qlci18n.h \ qlcinputchannel.h \ + qlcinputfeedback.h \ qlcinputprofile.h \ qlcinputsource.h \ qlcmodifierscache.h \ @@ -131,6 +132,7 @@ SOURCES += avolitesd4parser.cpp \ qlcfixturemode.cpp \ qlci18n.cpp \ qlcinputchannel.cpp \ + qlcinputfeedback.cpp \ qlcinputprofile.cpp \ qlcinputsource.cpp \ qlcmodifierscache.cpp \ diff --git a/engine/src/universe.cpp b/engine/src/universe.cpp index 1008e5e4c0..eceeeee709 100644 --- a/engine/src/universe.cpp +++ b/engine/src/universe.cpp @@ -35,7 +35,8 @@ #include "qlcfile.h" #include "utils.h" -#define RELATIVE_ZERO 127 +#define RELATIVE_ZERO_8BIT 0x7F +#define RELATIVE_ZERO_16BIT 0x7F00 #define KXMLUniverseNormalBlend "Normal" #define KXMLUniverseMaskBlend "Mask" @@ -62,7 +63,6 @@ Universe::Universe(quint32 id, GrandMaster *gm, QObject *parent) , m_blackoutValues(new QByteArray(UNIVERSE_SIZE, char(0))) , m_passthroughValues() { - m_relativeValues.fill(0, UNIVERSE_SIZE); m_modifiers.fill(NULL, UNIVERSE_SIZE); m_name = QString("Universe %1").arg(id + 1); @@ -228,7 +228,8 @@ QSharedPointer Universe::requestFader(Universe::FaderPriority prio m_faders.insert(insertPos, fader); } - qDebug() << "Generic fader with priority" << fader->priority() << "registered at pos" << insertPos << ", count" << m_faders.count(); + qDebug() << "[Universe]" << id() << ": Generic fader with priority" << fader->priority() + << "registered at pos" << insertPos << ", count" << m_faders.count(); return fader; } @@ -265,7 +266,8 @@ void Universe::requestFaderPriority(QSharedPointer fader, Universe if (newPos != pos) { m_faders.move(pos, newPos); - qDebug() << "Generic fader moved from" << pos << "to" << m_faders.indexOf(fader) << ". Count:" << m_faders.count(); + qDebug() << "[Universe]" << id() << ": Generic fader moved from" << pos + << "to" << m_faders.indexOf(fader) << ". Count:" << m_faders.count(); } } @@ -296,7 +298,6 @@ void Universe::processFaders() { flushInput(); zeroIntensityChannels(); - zeroRelativeValues(); QMutableListIterator > it(m_faders); while (it.hasNext()) @@ -364,14 +365,10 @@ void Universe::reset() m_blackoutValues->fill(0); if (m_passthrough) - { (*m_postGMValues) = (*m_passthroughValues); - } else - { m_postGMValues->fill(0); - } - zeroRelativeValues(); + m_modifiers.fill(NULL, UNIVERSE_SIZE); m_passthrough = false; // not releasing m_passthroughValues, see comment in setPassthrough } @@ -386,7 +383,6 @@ void Universe::reset(int address, int range) memset(m_preGMValues->data() + address, 0, range * sizeof(*m_preGMValues->data())); memset(m_blackoutValues->data() + address, 0, range * sizeof(*m_blackoutValues->data())); - memset(m_relativeValues.data() + address, 0, range * sizeof(*m_relativeValues.data())); memcpy(m_postGMValues->data() + address, m_modifiedZeroValues->data() + address, range * sizeof(*m_postGMValues->data())); applyPassthroughValues(address, range); @@ -443,11 +439,6 @@ const QByteArray* Universe::postGMValues() const return m_postGMValues.data(); } -void Universe::zeroRelativeValues() -{ - memset(m_relativeValues.data(), 0, UNIVERSE_SIZE * sizeof(*m_relativeValues.data())); -} - Universe::BlendMode Universe::stringToBlendMode(QString mode) { if (mode == KXMLUniverseNormalBlend) @@ -495,17 +486,6 @@ uchar Universe::preGMValue(int address) const return static_cast(m_preGMValues->at(address)); } -uchar Universe::applyRelative(int channel, uchar value) -{ - if (m_relativeValues[channel] != 0) - { - int val = m_relativeValues[channel] + value; - return CLAMP(val, 0, (int)UCHAR_MAX); - } - - return value; -} - uchar Universe::applyGM(int channel, uchar value) { if ((m_grandMaster->channelMode() == GrandMaster::Intensity && m_channelsMask->at(channel) & Intensity) || @@ -546,8 +526,6 @@ void Universe::updatePostGMValue(int channel) { uchar value = preGMValue(channel); - value = applyRelative(channel, value); - if (value != 0) value = applyGM(channel, value); @@ -661,21 +639,21 @@ bool Universe::setFeedbackPatch(QLCIOPlugin *plugin, quint32 output) { delete m_fbPatch; m_fbPatch = NULL; - emit hasFeedbacksChanged(); + emit hasFeedbackChanged(); return true; } } if (m_fbPatch != NULL) { bool result = m_fbPatch->set(plugin, output); - emit hasFeedbacksChanged(); + emit hasFeedbackChanged(); return result; } return false; } -bool Universe::hasFeedbacks() const +bool Universe::hasFeedback() const { return m_fbPatch != NULL ? true : false; } @@ -925,97 +903,143 @@ void Universe::updateIntensityChannelsRanges() * Writing ****************************************************************************/ -bool Universe::write(int channel, uchar value, bool forceLTP) +bool Universe::write(int address, uchar value, bool forceLTP) { - Q_ASSERT(channel < UNIVERSE_SIZE); - - //qDebug() << "Universe write channel" << channel << ", value:" << value; + Q_ASSERT(address < UNIVERSE_SIZE); - if (channel >= m_usedChannels) - m_usedChannels = channel + 1; + //qDebug() << "[Universe]" << id() << ": write channel" << address << ", value:" << value; - if ((m_channelsMask->at(channel) & HTP) == false) - (*m_blackoutValues)[channel] = char(value); + if (address >= m_usedChannels) + m_usedChannels = address + 1; - if (forceLTP == false && (m_channelsMask->at(channel) & HTP) && value < (uchar)m_preGMValues->at(channel)) + if (m_channelsMask->at(address) & HTP) { - qDebug() << "[Universe] HTP check not passed" << channel << value; - return false; + if (forceLTP == false && value < (uchar)m_preGMValues->at(address)) + { + qDebug() << "[Universe] HTP check not passed" << address << value; + return false; + } + } + else + { + // preserve non HTP channels for blackout + (*m_blackoutValues)[address] = char(value); } - (*m_preGMValues)[channel] = char(value); + (*m_preGMValues)[address] = char(value); - updatePostGMValue(channel); + updatePostGMValue(address); return true; } -bool Universe::writeRelative(int channel, uchar value) +bool Universe::writeMultiple(int address, quint32 value, int channelCount) { - Q_ASSERT(channel < UNIVERSE_SIZE); + for (int i = 0; i < channelCount; i++) + { + //qDebug() << "[Universe]" << id() << ": write channel" << (address + i) << ", value:" << QString::number(((uchar *)&value)[channelCount - 1 - i]); - //qDebug() << "Write relative channel" << channel << value; + // preserve non HTP channels for blackout + if ((m_channelsMask->at(address + i) & HTP) == 0) + (*m_blackoutValues)[address + i] = ((uchar *)&value)[channelCount - 1 - i]; - if (channel >= m_usedChannels) - m_usedChannels = channel + 1; + (*m_preGMValues)[address + i] = ((uchar *)&value)[channelCount - 1 - i]; - if (value == RELATIVE_ZERO) - return true; + updatePostGMValue(address + i); + } + + return true; +} + +bool Universe::writeRelative(int address, quint32 value, int channelCount) +{ + Q_ASSERT(address < UNIVERSE_SIZE); - m_relativeValues[channel] += value - RELATIVE_ZERO; + //qDebug() << "Write relative channel" << address << "value" << value; - updatePostGMValue(channel); + if (address + channelCount >= m_usedChannels) + m_usedChannels = address + channelCount; + + if (channelCount == 1) + { + short newVal = uchar((*m_preGMValues)[address]); + newVal += short(value) - RELATIVE_ZERO_8BIT; + (*m_preGMValues)[address] = char(CLAMP(newVal, 0, UCHAR_MAX)); + (*m_blackoutValues)[address] = char(CLAMP(newVal, 0, UCHAR_MAX)); + updatePostGMValue(address); + } + else + { + quint32 currentValue = 0; + for (int i = 0; i < channelCount; i++) + currentValue = (currentValue << 8) + uchar(m_preGMValues->at(address + i)); + + currentValue += (value - RELATIVE_ZERO_16BIT); + + for (int i = 0; i < channelCount; i++) + { + (*m_preGMValues)[address + i] = ((uchar *)¤tValue)[channelCount - 1 - i]; + (*m_blackoutValues)[address + i] = ((uchar *)¤tValue)[channelCount - 1 - i]; + updatePostGMValue(address + i); + } + } return true; } -bool Universe::writeBlended(int channel, uchar value, Universe::BlendMode blend) +bool Universe::writeBlended(int address, quint32 value, int channelCount, Universe::BlendMode blend) { - if (channel >= m_usedChannels) - m_usedChannels = channel + 1; + if (address + channelCount >= m_usedChannels) + m_usedChannels = address + channelCount; + + quint32 currentValue = 0; + for (int i = 0; i < channelCount; i++) + currentValue = (currentValue << 8) + uchar(m_preGMValues->at(address + i)); switch (blend) { case NormalBlend: - return write(channel, value); - + { + if ((m_channelsMask->at(address) & HTP) && value < currentValue) + { + qDebug() << "[Universe] HTP check not passed" << address << value; + return false; + } + } + break; case MaskBlend: { if (value) { - float currValue = (float)uchar(m_preGMValues->at(channel)); - if (currValue) - value = currValue * ((float)value / 255.0); + qDebug() << "Current value" << currentValue << "value" << value; + if (currentValue) + value = float(currentValue) * (float(value) / pow(255.0, channelCount)); else value = 0; } - (*m_preGMValues)[channel] = char(value); } break; case AdditiveBlend: { - uchar currVal = uchar(m_preGMValues->at(channel)); //qDebug() << "Universe write additive channel" << channel << ", value:" << currVal << "+" << value; - value = qMin(int(currVal) + value, 255); - (*m_preGMValues)[channel] = char(value); + value = fmin(float(currentValue + value), pow(255.0, channelCount)); } break; case SubtractiveBlend: { - uchar currVal = uchar(m_preGMValues->at(channel)); - if (value >= currVal) + if (value >= currentValue) value = 0; else - value = currVal - value; - (*m_preGMValues)[channel] = char(value); + value = currentValue - value; } break; default: qDebug() << "[Universe] Blend mode not handled. Implement me!" << blend; + return false; break; } - updatePostGMValue(channel); + writeMultiple(address, value, channelCount); return true; } diff --git a/engine/src/universe.h b/engine/src/universe.h index 6c4ad00c7a..a8571739ab 100644 --- a/engine/src/universe.h +++ b/engine/src/universe.h @@ -74,7 +74,7 @@ class Universe: public QThread Q_PROPERTY(bool passthrough READ passthrough WRITE setPassthrough NOTIFY passthroughChanged) Q_PROPERTY(InputPatch *inputPatch READ inputPatch NOTIFY inputPatchChanged) Q_PROPERTY(int outputPatchesCount READ outputPatchesCount NOTIFY outputPatchesCountChanged) - Q_PROPERTY(bool hasFeedbacks READ hasFeedbacks NOTIFY hasFeedbacksChanged) + Q_PROPERTY(bool hasFeedback READ hasFeedback NOTIFY hasFeedbackChanged) public: /** Construct a new Universe */ @@ -171,7 +171,6 @@ protected slots: */ uchar applyGM(int channel, uchar value); - uchar applyRelative(int channel, uchar value); uchar applyModifiers(int channel, uchar value); void updatePostGMValue(int channel); @@ -210,7 +209,7 @@ protected slots: bool setFeedbackPatch(QLCIOPlugin *plugin, quint32 output); /** Flag that indicates if this Universe has a patched feedback line */ - bool hasFeedbacks() const; + bool hasFeedback() const; /** * Get the reference to the input plugin associated to this universe. @@ -259,7 +258,7 @@ protected slots: void outputPatchesCountChanged(); /** Notify the listeners that a feedback line has been patched/unpatched */ - void hasFeedbacksChanged(); + void hasFeedbackChanged(); private: /** Reference to the input patch associated to this universe. */ @@ -437,9 +436,6 @@ public slots: /** Return a list with intensity channels and their values */ QHash intensityChannels(); - /** Set all channel relative values to zero */ - void zeroRelativeValues(); - protected: void applyPassthroughValues(int address, int range); @@ -488,8 +484,6 @@ public slots: /** Array of values from input line, when passtrhough is enabled */ QScopedPointer m_passthroughValues; - QVector m_relativeValues; - /* impl speedup */ void updateIntensityChannelsRanges(); @@ -518,36 +512,48 @@ public slots: * Write a value to a DMX channel, taking Grand Master and HTP into * account, if applicable. * - * @param channel The channel number to write to + * @param address The DMX start address to write to * @param value The value to write * * @return true if successful, otherwise false */ - bool write(int channel, uchar value, bool forceLTP = false); + bool write(int address, uchar value, bool forceLTP = false); + + /** + * Write a value representing one or multiple channels + * + * @param address The DMX start address to write to + * @param value the DMX value(s) to set + * @param channelCount number of channels that value represents + * @return always true + */ + bool writeMultiple(int address, quint32 value, int channelCount); /** * Write a relative value to a DMX channel, taking Grand Master and HTP into * account, if applicable. * - * @param channel The channel number to write to + * @param address The DMX start address to write to * @param value The value to write + * @param channelCount number of channels that value represents * * @return true if successful, otherwise false */ - bool writeRelative(int channel, uchar value); + bool writeRelative(int address, quint32 value, int channelCount); /** * Write DMX values with the given blend mode. * If blend == NormalBlend the generic write method is called * and all the HTP/LTP checks are performed * - * @param channel The channel number to write to + * @param address The DMX start address to write to * @param value The value to write + * @param channelCount The number of channels that value represents * @param blend The blend mode to be used on $value * * @return true if successful, otherwise false */ - bool writeBlended(int channel, uchar value, BlendMode blend = NormalBlend); + bool writeBlended(int address, quint32 value, int channelCount, BlendMode blend); /********************************************************************* * Load & Save diff --git a/engine/test/efxfixture/efxfixture_test.cpp b/engine/test/efxfixture/efxfixture_test.cpp index ee3d638f1b..2da38bb912 100644 --- a/engine/test/efxfixture/efxfixture_test.cpp +++ b/engine/test/efxfixture/efxfixture_test.cpp @@ -454,6 +454,7 @@ void EFXFixture_Test::setPoint8bit() Universe *universe = ua[0]; QSharedPointer fader = universe->requestFader(); + ef.start(fader); ef.setPointPanTilt(ua, fader, 5.4, 1.5); // PMSB: 5, PLSB: 0.4, TMSB: 1 (102), TLSB: 0.5(127) QCOMPARE(fader->channels().count(), 2); universe->processFaders(); @@ -474,6 +475,7 @@ void EFXFixture_Test::setPoint16bit() Universe *universe = ua[0]; QSharedPointer fader = universe->requestFader(); + ef.start(fader); ef.setPointPanTilt(ua, fader, 5.4, 1.5); // PMSB: 5, PLSB: 0.4, TMSB: 1 (102), TLSB: 0.5(127) QCOMPARE(fader->channels().count(), 4); universe->processFaders(); @@ -493,6 +495,7 @@ void EFXFixture_Test::setPointPanOnly() Universe *universe = ua[0]; QSharedPointer fader = universe->requestFader(); + ef.start(fader); ef.setPointPanTilt(ua, fader, 5.4, 1.5); // PMSB: 5, PLSB: 0.4, TMSB: 1 (102), TLSB: 0.5(127) QCOMPARE(fader->channels().count(), 1); universe->processFaders(); @@ -512,6 +515,7 @@ void EFXFixture_Test::setPointLedBar() Universe *universe = ua[0]; QSharedPointer fader = universe->requestFader(); + ef.start(fader); ef.setPointPanTilt(ua, fader, 5.4, 1.5); // PMSB: 5, PLSB: 0.4, TMSB: 1 (102), TLSB: 0.5(127) QCOMPARE(fader->channels().count(), 1); universe->processFaders(); diff --git a/engine/test/fadechannel/fadechannel_test.cpp b/engine/test/fadechannel/fadechannel_test.cpp index fcef4ef4f4..b52352b7c3 100644 --- a/engine/test/fadechannel/fadechannel_test.cpp +++ b/engine/test/fadechannel/fadechannel_test.cpp @@ -41,15 +41,14 @@ void FadeChannel_Test::address() fxi->setChannels(5); doc.addFixture(fxi); - FadeChannel fc; - fc.setChannel(&doc, 2); + FadeChannel fc(&doc, Fixture::invalidId(), 2); QCOMPARE(fc.address(), quint32(2)); - fc.setFixture(&doc, fxi->id()); - QCOMPARE(fc.address(), quint32(402)); + FadeChannel fc1(&doc, fxi->id(), 2); + QCOMPARE(fc1.address(), quint32(402)); - fc.setFixture(&doc, 12345); - QCOMPARE(fc.address(), quint32(2)); + FadeChannel fc2(&doc, 12345, QLCChannel::invalid()); + QCOMPARE(fc2.address(), QLCChannel::invalid()); } void FadeChannel_Test::addressInUniverse() @@ -60,45 +59,34 @@ void FadeChannel_Test::addressInUniverse() fxi->setChannels(5); doc.addFixture(fxi); - FadeChannel fc; - fc.setChannel(&doc, 2); + FadeChannel fc(&doc, Fixture::invalidId(), 2); QCOMPARE(fc.addressInUniverse(), quint32(2)); - fc.setFixture(&doc, fxi->id()); - QCOMPARE(fc.addressInUniverse(), quint32(2)); + FadeChannel fc1(&doc, fxi->id(), QLCChannel::invalid()); + QCOMPARE(fc1.addressInUniverse(), QLCChannel::invalid()); - fc.setFixture(&doc, 12345); - QCOMPARE(fc.addressInUniverse(), quint32(2)); + FadeChannel fc2(&doc, 12345, QLCChannel::invalid()); + QCOMPARE(fc2.addressInUniverse(), QLCChannel::invalid()); } void FadeChannel_Test::comparison() { Doc doc(this); - FadeChannel ch1; - ch1.setFixture(&doc, 0); - ch1.setChannel(&doc, 0); - - FadeChannel ch2; - ch2.setFixture(&doc, 1); - ch2.setChannel(&doc, 0); - QVERIFY((ch1 == ch2) == false); - - ch1.setFixture(&doc, 1); - QVERIFY((ch1 == ch2) == true); - - ch1.setChannel(&doc, 1); + FadeChannel ch1(&doc, 0, 0); + FadeChannel ch2(&doc, 1, 0); + FadeChannel ch3(&doc, 0, 0); QVERIFY((ch1 == ch2) == false); + QVERIFY((ch1 == ch3) == true); } void FadeChannel_Test::type() { Doc doc(this); - FadeChannel fc; + FadeChannel fc(&doc, Fixture::invalidId(), 2); // Only a channel given, no fixture at the address -> intensity - fc.setChannel(&doc, 2); QCOMPARE(fc.flags() & FadeChannel::HTP, (int)FadeChannel::HTP); QCOMPARE(fc.flags() & FadeChannel::Intensity, (int)FadeChannel::Intensity); QCOMPARE(fc.flags() & FadeChannel::CanFade, (int)FadeChannel::CanFade); @@ -109,10 +97,10 @@ void FadeChannel_Test::type() doc.addFixture(fxi); // Fixture and channel given, fixture is a dimmer -> intensity - fc.setFixture(&doc, fxi->id()); - QCOMPARE(fc.flags() & FadeChannel::HTP, (int)FadeChannel::HTP); - QCOMPARE(fc.flags() & FadeChannel::Intensity, (int)FadeChannel::Intensity); - QCOMPARE(fc.flags() & FadeChannel::CanFade, (int)FadeChannel::CanFade); + FadeChannel fc1(&doc, fxi->id(), 2); + QCOMPARE(fc1.flags() & FadeChannel::HTP, (int)FadeChannel::HTP); + QCOMPARE(fc1.flags() & FadeChannel::Intensity, (int)FadeChannel::Intensity); + QCOMPARE(fc1.flags() & FadeChannel::CanFade, (int)FadeChannel::CanFade); QDir dir(INTERNAL_FIXTUREDIR); dir.setFilter(QDir::Files); @@ -131,44 +119,39 @@ void FadeChannel_Test::type() doc.addFixture(fxi); // Fixture and channel given, but channel is beyond fixture's channels -> intensity - fc.setFixture(&doc, fxi->id()); - fc.setChannel(&doc, 50); - QCOMPARE(fc.flags() & FadeChannel::HTP, (int)FadeChannel::HTP); - QCOMPARE(fc.flags() & FadeChannel::Intensity, (int)FadeChannel::Intensity); - QCOMPARE(fc.flags() & FadeChannel::CanFade, (int)FadeChannel::CanFade); + FadeChannel fc2(&doc, fxi->id(), 50); + QCOMPARE(fc2.flags() & FadeChannel::HTP, (int)FadeChannel::HTP); + QCOMPARE(fc2.flags() & FadeChannel::Intensity, (int)FadeChannel::Intensity); + QCOMPARE(fc2.flags() & FadeChannel::CanFade, (int)FadeChannel::CanFade); // Only a channel given, no fixture given but a fixture occupies the address. // Check that reverse address -> fixture lookup works. - fc.setFixture(&doc, Fixture::invalidId()); - fc.setChannel(&doc, 2); - QCOMPARE(fc.flags() & FadeChannel::LTP, (int)FadeChannel::LTP); - QCOMPARE(fc.flags() & FadeChannel::CanFade, (int)FadeChannel::CanFade); + FadeChannel fc3(&doc, Fixture::invalidId(), 2); + QCOMPARE(fc3.flags() & FadeChannel::LTP, (int)FadeChannel::LTP); + QCOMPARE(fc3.flags() & FadeChannel::CanFade, (int)FadeChannel::CanFade); // Fixture and channel given, but fixture doesn't exist -> intensity - fc.setFixture(&doc, 12345); - fc.setChannel(&doc, 2); - QCOMPARE(fc.flags() & FadeChannel::HTP, (int)FadeChannel::HTP); - QCOMPARE(fc.flags() & FadeChannel::Intensity, (int)FadeChannel::Intensity); - QCOMPARE(fc.flags() & FadeChannel::CanFade, (int)FadeChannel::CanFade); + FadeChannel fc4(&doc, 12345, 2); + QCOMPARE(fc4.flags() & FadeChannel::HTP, (int)FadeChannel::HTP); + QCOMPARE(fc4.flags() & FadeChannel::Intensity, (int)FadeChannel::Intensity); + QCOMPARE(fc4.flags() & FadeChannel::CanFade, (int)FadeChannel::CanFade); // channel 3 cannot fade fxi->setChannelCanFade(3, false); - fc.setFixture(&doc, fxi->id()); - fc.setChannel(&doc, 3); - QCOMPARE(fc.flags() & FadeChannel::LTP, (int)FadeChannel::LTP); - QCOMPARE(fc.flags() & FadeChannel::CanFade, 0); + FadeChannel fc5(&doc, fxi->id(), 3); + QCOMPARE(fc5.flags() & FadeChannel::LTP, (int)FadeChannel::LTP); + QCOMPARE(fc5.flags() & FadeChannel::CanFade, 0); // force channel 0 (Pan) to be HTP QList forced; forced << 0; fxi->setForcedHTPChannels(forced); - fc.setFixture(&doc, fxi->id()); - fc.setChannel(&doc, 0); - QCOMPARE(fc.flags() & FadeChannel::HTP, (int)FadeChannel::HTP); - QCOMPARE(fc.flags() & FadeChannel::LTP, 0); - QCOMPARE(fc.flags() & FadeChannel::CanFade, (int)FadeChannel::CanFade); + FadeChannel fc6(&doc, fxi->id(), 0); + QCOMPARE(fc6.flags() & FadeChannel::HTP, (int)FadeChannel::HTP); + QCOMPARE(fc6.flags() & FadeChannel::LTP, 0); + QCOMPARE(fc6.flags() & FadeChannel::CanFade, (int)FadeChannel::CanFade); // add another generic dimmer fxi = new Fixture(&doc); @@ -180,11 +163,10 @@ void FadeChannel_Test::type() fxi->setForcedLTPChannels(forced); doc.addFixture(fxi); - fc.setFixture(&doc, fxi->id()); - fc.setChannel(&doc, 2); - QCOMPARE(fc.flags() & FadeChannel::LTP, (int)FadeChannel::LTP); - QCOMPARE(fc.flags() & FadeChannel::HTP, 0); - QCOMPARE(fc.flags() & FadeChannel::CanFade, (int)FadeChannel::CanFade); + FadeChannel fc7(&doc, fxi->id(), 2); + QCOMPARE(fc7.flags() & FadeChannel::LTP, (int)FadeChannel::LTP); + QCOMPARE(fc7.flags() & FadeChannel::HTP, 0); + QCOMPARE(fc7.flags() & FadeChannel::CanFade, (int)FadeChannel::CanFade); // unset a flag fc.removeFlag(FadeChannel::CanFade); @@ -371,24 +353,24 @@ void FadeChannel_Test::calculateCurrent() fch.setTarget(101); fch.setReady(false); QCOMPARE(fch.calculateCurrent(200, 0), uchar(245)); - QCOMPARE(fch.calculateCurrent(200, 1), uchar(244)); - QCOMPARE(fch.calculateCurrent(200, 2), uchar(243)); - QCOMPARE(fch.calculateCurrent(200, 3), uchar(242)); - QCOMPARE(fch.calculateCurrent(200, 4), uchar(242)); - QCOMPARE(fch.calculateCurrent(200, 5), uchar(241)); - QCOMPARE(fch.calculateCurrent(200, 6), uchar(240)); - QCOMPARE(fch.calculateCurrent(200, 7), uchar(239)); - QCOMPARE(fch.calculateCurrent(200, 8), uchar(239)); - QCOMPARE(fch.calculateCurrent(200, 9), uchar(238)); - QCOMPARE(fch.calculateCurrent(200, 10), uchar(237)); - QCOMPARE(fch.calculateCurrent(200, 11), uchar(237)); + QCOMPARE(fch.calculateCurrent(200, 1), uchar(245)); + QCOMPARE(fch.calculateCurrent(200, 2), uchar(244)); + QCOMPARE(fch.calculateCurrent(200, 3), uchar(243)); + QCOMPARE(fch.calculateCurrent(200, 4), uchar(243)); + QCOMPARE(fch.calculateCurrent(200, 5), uchar(242)); + QCOMPARE(fch.calculateCurrent(200, 6), uchar(241)); + QCOMPARE(fch.calculateCurrent(200, 7), uchar(240)); + QCOMPARE(fch.calculateCurrent(200, 8), uchar(240)); + QCOMPARE(fch.calculateCurrent(200, 9), uchar(239)); + QCOMPARE(fch.calculateCurrent(200, 10), uchar(238)); + QCOMPARE(fch.calculateCurrent(200, 11), uchar(238)); // Skip... QCOMPARE(fch.calculateCurrent(200, 100), uchar(173)); - QCOMPARE(fch.calculateCurrent(200, 101), uchar(172)); - QCOMPARE(fch.calculateCurrent(200, 102), uchar(171)); + QCOMPARE(fch.calculateCurrent(200, 101), uchar(173)); + QCOMPARE(fch.calculateCurrent(200, 102), uchar(172)); // Skip... - QCOMPARE(fch.calculateCurrent(200, 198), uchar(102)); - QCOMPARE(fch.calculateCurrent(200, 199), uchar(101)); + QCOMPARE(fch.calculateCurrent(200, 198), uchar(103)); + QCOMPARE(fch.calculateCurrent(200, 199), uchar(102)); QCOMPARE(fch.calculateCurrent(200, 200), uchar(101)); } diff --git a/engine/test/genericfader/genericfader_test.cpp b/engine/test/genericfader/genericfader_test.cpp index a80c524e2d..3a26c1b214 100644 --- a/engine/test/genericfader/genericfader_test.cpp +++ b/engine/test/genericfader/genericfader_test.cpp @@ -67,12 +67,10 @@ void GenericFader_Test::addRemove() QList ua = m_doc->inputOutputMap()->universes(); QSharedPointer fader = QSharedPointer(new GenericFader()); - FadeChannel fc; - fc.setFixture(m_doc, 0); - fc.setChannel(m_doc, 0); - - FadeChannel wrong; - fc.setFixture(m_doc, 0); + FadeChannel fc(m_doc, 0, 0); + FadeChannel fc1(m_doc, 0, 1); + FadeChannel fc2(m_doc, 0, 2); + FadeChannel wrong(m_doc, 0, QLCChannel::invalid()); quint32 chHash = GenericFader::channelHash(fc.fixture(), fc.channel()); QCOMPARE(fader->m_channels.count(), 0); @@ -86,22 +84,19 @@ void GenericFader_Test::addRemove() QVERIFY(fader->m_channels.contains(chHash) == true); QCOMPARE(fader->m_channels.count(), 1); - FadeChannel *fc1 = fader->getChannelFader(m_doc, ua[0], 0, 0); - fader->remove(fc1); + FadeChannel *fc3 = fader->getChannelFader(m_doc, ua[0], 0, 0); + fader->remove(fc3); QVERIFY(fader->m_channels.contains(chHash) == false); QCOMPARE(fader->m_channels.count(), 0); - fc.setChannel(m_doc, 0); fader->add(fc); QVERIFY(fader->m_channels.contains(chHash) == true); - fc.setChannel(m_doc, 1); - fader->add(fc); + fader->add(fc1); chHash = GenericFader::channelHash(fc.fixture(), fc.channel()); QVERIFY(fader->m_channels.contains(chHash) == true); - fc.setChannel(m_doc, 2); - fader->add(fc); + fader->add(fc2); chHash = GenericFader::channelHash(fc.fixture(), fc.channel()); QVERIFY(fader->m_channels.contains(chHash) == true); QCOMPARE(fader->m_channels.count(), 3); @@ -109,8 +104,6 @@ void GenericFader_Test::addRemove() fader->removeAll(); QCOMPARE(fader->m_channels.count(), 0); - fc.setFixture(m_doc, 0); - fc.setChannel(m_doc, 0); fc.setTarget(127); fader->add(fc); chHash = GenericFader::channelHash(fc.fixture(), fc.channel()); @@ -133,9 +126,7 @@ void GenericFader_Test::writeZeroFade() QList ua = m_doc->inputOutputMap()->universes(); QSharedPointer fader = ua[0]->requestFader(); - FadeChannel fc; - fc.setFixture(m_doc, 0); - fc.setChannel(m_doc, 5); + FadeChannel fc(m_doc, 0, 5); fc.setStart(0); fc.setTarget(255); fc.setFadeTime(0); @@ -151,9 +142,7 @@ void GenericFader_Test::writeLoop() QList ua = m_doc->inputOutputMap()->universes(); QSharedPointer fader = ua[0]->requestFader(); - FadeChannel fc; - fc.setFixture(m_doc, 0); - fc.setChannel(m_doc, 5); + FadeChannel fc(m_doc, 0, 5); fc.setStart(0); fc.setTarget(250); fc.setFadeTime(1000); @@ -178,19 +167,20 @@ void GenericFader_Test::adjustIntensity() QList ua = m_doc->inputOutputMap()->universes(); QSharedPointer fader = ua[0]->requestFader(); - FadeChannel fc; + FadeChannel fc(m_doc, 0, 5); + FadeChannel fc1(m_doc, 0, 0); // HTP channel - fc.setFixture(m_doc, 0); - fc.setChannel(m_doc, 5); fc.setStart(0); fc.setTarget(250); fc.setFadeTime(1000); fader->add(fc); // LTP channel - fc.setChannel(m_doc, 0); - fader->add(fc); + fc1.setStart(0); + fc1.setTarget(250); + fc1.setFadeTime(1000); + fader->add(fc1); qreal intensity = 0.5; fader->adjustIntensity(intensity); diff --git a/engine/test/universe/universe_test.cpp b/engine/test/universe/universe_test.cpp index 0702f3ed37..de42bfbdb9 100644 --- a/engine/test/universe/universe_test.cpp +++ b/engine/test/universe/universe_test.cpp @@ -112,26 +112,26 @@ void Universe_Test::blendModes() QCOMPARE(quint8(m_uni->postGMValues()->at(11)), quint8(0)); /* check masking on 0 remains 0 */ - QVERIFY(m_uni->writeBlended(11, 128, Universe::MaskBlend) == true); + QVERIFY(m_uni->writeBlended(11, 128, 1, Universe::MaskBlend) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(11)), quint8(0)); /* check 180 masked on 128 gets halved */ - QVERIFY(m_uni->writeBlended(4, 180, Universe::MaskBlend) == true); + QVERIFY(m_uni->writeBlended(4, 180, 1, Universe::MaskBlend) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(4)), quint8(90)); /* chek adding 50 to 100 is actually 150 */ - QVERIFY(m_uni->writeBlended(9, 50, Universe::AdditiveBlend) == true); + QVERIFY(m_uni->writeBlended(9, 50, 1, Universe::AdditiveBlend) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(9)), quint8(150)); /* chek subtracting 55 to 255 is actually 200 */ - QVERIFY(m_uni->writeBlended(0, 55, Universe::SubtractiveBlend) == true); + QVERIFY(m_uni->writeBlended(0, 55, 1, Universe::SubtractiveBlend) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(0)), quint8(200)); - QVERIFY(m_uni->writeBlended(0, 255, Universe::SubtractiveBlend) == true); + QVERIFY(m_uni->writeBlended(0, 255, 1, Universe::SubtractiveBlend) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(0)), quint8(0)); /* check an unknown blend mode */ - QVERIFY(m_uni->writeBlended(9, 255, Universe::BlendMode(42)) == true); + QVERIFY(m_uni->writeBlended(9, 255, 1, Universe::BlendMode(42)) == false); QCOMPARE(quint8(m_uni->postGMValues()->at(9)), quint8(150)); } @@ -338,57 +338,46 @@ void Universe_Test::write() void Universe_Test::writeRelative() { // 127 == 0 - QVERIFY(m_uni->writeRelative(9, 127) == true); - QCOMPARE(m_uni->m_relativeValues[9], short(0)); - QCOMPARE(m_uni->m_relativeValues[4], short(0)); - QCOMPARE(m_uni->m_relativeValues[0], short(0)); + QVERIFY(m_uni->writeRelative(9, 127, 1) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(9)), quint8(0)); QCOMPARE(quint8(m_uni->postGMValues()->at(4)), quint8(0)); QCOMPARE(quint8(m_uni->postGMValues()->at(0)), quint8(0)); // 255 == +128 - QVERIFY(m_uni->writeRelative(9, 255) == true); - QCOMPARE(m_uni->m_relativeValues[9], short(128)); // 0 + 128 - QCOMPARE(m_uni->m_relativeValues[4], short(0)); - QCOMPARE(m_uni->m_relativeValues[0], short(0)); + QVERIFY(m_uni->writeRelative(9, 255, 1) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(9)), quint8(128)); QCOMPARE(quint8(m_uni->postGMValues()->at(4)), quint8(0)); QCOMPARE(quint8(m_uni->postGMValues()->at(0)), quint8(0)); // 0 == -127 - QVERIFY(m_uni->writeRelative(9, 0) == true); - QCOMPARE(m_uni->m_relativeValues[9], short(1)); // 128 - 127 - QCOMPARE(m_uni->m_relativeValues[4], short(0)); - QCOMPARE(m_uni->m_relativeValues[0], short(0)); + QVERIFY(m_uni->writeRelative(9, 0, 1) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(9)), quint8(1)); QCOMPARE(quint8(m_uni->postGMValues()->at(4)), quint8(0)); QCOMPARE(quint8(m_uni->postGMValues()->at(0)), quint8(0)); m_uni->reset(); - QCOMPARE(m_uni->m_relativeValues[9], short(0)); QVERIFY(m_uni->write(9, 85) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(9)), quint8(85)); - QVERIFY(m_uni->writeRelative(9, 117) == true); - QCOMPARE(m_uni->m_relativeValues[9], short(-10)); + QVERIFY(m_uni->writeRelative(9, 117, 1) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(9)), quint8(75)); QVERIFY(m_uni->write(9, 65) == true); - QCOMPARE(quint8(m_uni->postGMValues()->at(9)), quint8(55)); + QCOMPARE(quint8(m_uni->postGMValues()->at(9)), quint8(65)); m_uni->reset(); QVERIFY(m_uni->write(9, 255) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(9)), quint8(255)); - QVERIFY(m_uni->writeRelative(9, 255) == true); + QVERIFY(m_uni->writeRelative(9, 255, 1) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(9)), quint8(255)); m_uni->reset(); QVERIFY(m_uni->write(9, 0) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(9)), quint8(0)); - QVERIFY(m_uni->writeRelative(9, 0) == true); + QVERIFY(m_uni->writeRelative(9, 0, 1) == true); QCOMPARE(quint8(m_uni->postGMValues()->at(9)), quint8(0)); } diff --git a/fixtureeditor/CMakeLists.txt b/fixtureeditor/CMakeLists.txt index 94261267a3..489ee519a9 100644 --- a/fixtureeditor/CMakeLists.txt +++ b/fixtureeditor/CMakeLists.txt @@ -547,6 +547,8 @@ set(qlcui_resource_files "../ui/src/../../resources/icons/png/laser.png" "../ui/src/../../resources/icons/png/ledbar_beams.png" "../ui/src/../../resources/icons/png/ledbar_pixels.png" + "../ui/src/../../resources/icons/png/lightning.png" + "../ui/src/../../resources/icons/png/lightning_off.png" "../ui/src/../../resources/icons/png/liveedit.png" "../ui/src/../../resources/icons/png/liveedit_vc.png" "../ui/src/../../resources/icons/png/lock.png" diff --git a/fixtureeditor/app.cpp b/fixtureeditor/app.cpp index b34ccab0bf..8e79211004 100644 --- a/fixtureeditor/app.cpp +++ b/fixtureeditor/app.cpp @@ -106,7 +106,7 @@ App::~App() QString App::longName() { - return QString("%1 - %2").arg(APPNAME).arg(FXEDNAME); + return QString("%1 - %2").arg(APPNAME, FXEDNAME); } QString App::version() @@ -120,9 +120,9 @@ void App::loadFixtureDefinition(const QString& path) /* Attempt to create a fixture definition from the selected file */ QString error(tr("Unrecognized file extension: %1").arg(path)); - if (path.toLower().endsWith(KExtFixture) == true) + if (path.endsWith(KExtFixture, Qt::CaseInsensitive) == true) fixtureDef = loadQXF(path, error); - else if (path.toLower().endsWith(KExtAvolitesFixture) == true) + else if (path.endsWith(KExtAvolitesFixture, Qt::CaseInsensitive) == true) fixtureDef = loadD4(path, error); else fixtureDef = NULL; @@ -138,6 +138,10 @@ void App::loadFixtureDefinition(const QString& path) sub->setAttribute(Qt::WA_DeleteOnClose); qobject_cast (centralWidget())->addSubWindow(sub); + // check if sub-window is outside main area + if (sub->x() >= this->width() || sub->y() >= this->height()) + sub->setGeometry(0, 0, sub->width(), sub->height()); + editor->show(); sub->show(); } @@ -367,9 +371,7 @@ void App::slotFileOpen() QVariant var = settings.value(SETTINGS_OPENDIALOGSTATE); if (var.isValid() == true) - { dialog.restoreState(var.toByteArray()); - } dialog.setDirectory(m_workingDirectory); diff --git a/fixtureeditor/main.cpp b/fixtureeditor/main.cpp index 38740f0026..96393292d6 100644 --- a/fixtureeditor/main.cpp +++ b/fixtureeditor/main.cpp @@ -90,33 +90,34 @@ void printUsage() * * @return true to continue with application launch; otherwise false */ -bool parseArgs(int argc, char **argv) +bool parseArgs() { - for (int i = 1; i < argc; i++) + QStringListIterator it(QCoreApplication::arguments()); + while (it.hasNext() == true) { - if (::strcmp(argv[i], "-v") == 0 || - ::strcmp(argv[i], "--version") == 0) + QString arg(it.next()); + + if (arg == "-v" || arg == "--version") { /* Don't print anything, since version is always printed before anything else. Just make the app exit by returning false. */ return false; } - else if (::strcmp(argv[i], "-h") == 0 || - ::strcmp(argv[i], "--help") == 0) + else if (arg == "-h" || arg == "--help") { printUsage(); return false; } - else if (::strcmp(argv[i], "-o") == 0 || - ::strcmp(argv[i], "--open") == 0) + else if (arg == "-o" || arg == "--open") { - FXEDArgs::fixture = QString(argv[++i]); + if (it.hasNext() == true) + FXEDArgs::fixture = it.next(); } - else if (::strcmp(argv[i], "-l") == 0 || - ::strcmp(argv[i], "--locale") == 0) + else if (arg == "-l" || arg == "--locale") { - FXEDArgs::locale = QString(argv[++i]); + if (it.hasNext() == true) + FXEDArgs::locale = it.next(); } } @@ -168,7 +169,7 @@ int main(int argc, char** argv) printVersion(); /* Parse command-line arguments */ - if (parseArgs(argc, argv) == false) + if (parseArgs() == false) return 0; /* Load translation for current locale */ diff --git a/hotplugmonitor/src/CMakeLists.txt b/hotplugmonitor/src/CMakeLists.txt index 72ed66d7e6..957d313f63 100644 --- a/hotplugmonitor/src/CMakeLists.txt +++ b/hotplugmonitor/src/CMakeLists.txt @@ -1,6 +1,7 @@ add_library(hotplugmonitor hotplugmonitor.cpp hotplugmonitor.h ) +set_property(TARGET hotplugmonitor PROPERTY POSITION_INDEPENDENT_CODE ON) target_link_libraries(hotplugmonitor PUBLIC Qt${QT_MAJOR_VERSION}::Core diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 8a84ad7127..2c42d80c52 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -19,7 +19,7 @@ else() qt5_add_translation(QM_FILES ${TS_FILES}) endif() -add_executable(${module_name} WIN32 MACOSX_BUNDLE +add_executable(${module_name} MACOSX_BUNDLE launcher.cpp launcher.h main.cpp ${QM_FILES} @@ -36,7 +36,6 @@ target_link_libraries(${module_name} PRIVATE Qt${QT_MAJOR_VERSION}::Widgets ) - # Resources: set_source_files_properties("../resources/icons/png/qlcplus-fixtureeditor.png" PROPERTIES QT_RESOURCE_ALIAS "qlcplus-fixtureeditor.png" @@ -49,12 +48,20 @@ set(launcher_resource_files "../resources/icons/png/qlcplus.png" ) -qt_add_resources(${module_name} "launcher" +if(QT_VERSION_MAJOR GREATER 5) + qt_add_resources(${module_name} "launcher" PREFIX "/" + BASE + "." FILES ${launcher_resource_files} ) +else() + qt5_add_resources($launcher.qrc) + target_sources(${module_name} PRIVATE + ${launcher_resource_files}) +endif() install(TARGETS ${module_name} DESTINATION ${INSTALLROOT}/${BINDIR} diff --git a/main/main.cpp b/main/main.cpp index b788e21355..7e505fe4dc 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -95,7 +95,7 @@ namespace QLCArgs QRect closeButtonRect = QRect(); /** Debug output level */ - QtMsgType debugLevel = QtSystemMsg; + QtMsgType debugLevel = QtCriticalMsg; /** Log to file flag */ bool logToFile = false; diff --git a/platforms/android/.gitignore b/platforms/android/.gitignore new file mode 100644 index 0000000000..f40fe0502b --- /dev/null +++ b/platforms/android/.gitignore @@ -0,0 +1 @@ +assets \ No newline at end of file diff --git a/platforms/android/AndroidManifest.xml b/platforms/android/AndroidManifest.xml index ce0538fc30..f0b5fee054 100644 --- a/platforms/android/AndroidManifest.xml +++ b/platforms/android/AndroidManifest.xml @@ -31,12 +31,10 @@ - - - + @@ -57,6 +55,7 @@ "applicationStateChanged(Qt::ApplicationSuspended)" signal is sent! --> + diff --git a/platforms/android/build.gradle b/platforms/android/build.gradle new file mode 100644 index 0000000000..d64b086a03 --- /dev/null +++ b/platforms/android/build.gradle @@ -0,0 +1,77 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.0.0' + } +} + +repositories { + google() + jcenter() +} + +apply plugin: 'com.android.application' + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) +} + +android { + /******************************************************* + * The following variables: + * - androidBuildToolsVersion, + * - androidCompileSdkVersion + * - qt5AndroidDir - holds the path to qt android files + * needed to build any Qt application + * on Android. + * + * are defined in gradle.properties file. This file is + * updated by QtCreator and androiddeployqt tools. + * Changing them manually might break the compilation! + *******************************************************/ + + compileSdkVersion androidCompileSdkVersion.toInteger() + + // buildToolsVersion '28.0.3' + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java'] + aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl'] + res.srcDirs = [qt5AndroidDir + '/res', 'res'] + resources.srcDirs = ['resources'] + renderscript.srcDirs = ['src'] + assets.srcDirs = ['assets'] + jniLibs.srcDirs = ['libs'] + } + } + + tasks.withType(JavaCompile) { + options.incremental = true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + lintOptions { + abortOnError false + } + + // Do not compress Qt binary resources file + aaptOptions { + noCompress 'rcc' + } + + defaultConfig { + resConfig "en" + minSdkVersion = qtMinSdkVersion + targetSdkVersion = qtTargetSdkVersion + } +} diff --git a/platforms/android/gradle.properties b/platforms/android/gradle.properties new file mode 100644 index 0000000000..fded106b17 --- /dev/null +++ b/platforms/android/gradle.properties @@ -0,0 +1,11 @@ +# Project-wide Gradle settings. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m + +# Gradle caching allows reusing the build artifacts from a previous +# build with the same inputs. However, over time, the cache size will +# grow. Uncomment the following line to enable it. +#org.gradle.caching=true diff --git a/platforms/android/gradle/wrapper/gradle-wrapper.jar b/platforms/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..f6b961fd5a Binary files /dev/null and b/platforms/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/platforms/android/gradle/wrapper/gradle-wrapper.properties b/platforms/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..fbce071a31 --- /dev/null +++ b/platforms/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-all.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/platforms/android/gradlew b/platforms/android/gradlew new file mode 100755 index 0000000000..cccdd3d517 --- /dev/null +++ b/platforms/android/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/platforms/android/gradlew.bat b/platforms/android/gradlew.bat new file mode 100644 index 0000000000..f9553162f1 --- /dev/null +++ b/platforms/android/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/platforms/android/res/drawable/icon.png b/platforms/android/res/drawable/icon.png index a6f851d2b3..578101578a 100644 Binary files a/platforms/android/res/drawable/icon.png and b/platforms/android/res/drawable/icon.png differ diff --git a/platforms/linux/CMakeLists.txt b/platforms/linux/CMakeLists.txt index cc92fae4f0..ef1679b4ca 100644 --- a/platforms/linux/CMakeLists.txt +++ b/platforms/linux/CMakeLists.txt @@ -1,16 +1,12 @@ project(icons) -set(desktop_FILES - qlcplus.desktop -) +set(desktop_FILES qlcplus.desktop) if(NOT qmlui) - set(APPEND desktop_FILES qlcplus-fixtureeditor.desktop) + list(APPEND desktop_FILES qlcplus-fixtureeditor.desktop) endif() install(FILES ${desktop_FILES} DESTINATION ${INSTALLROOT}/share/applications/) -set(icons_SRCS - ../../resources/icons/png/qlcplus.png -) +set(icons_SRCS ../../resources/icons/png/qlcplus.png) if(NOT qmlui) list(APPEND icons_SRCS ../../resources/icons/png/qlcplus-fixtureeditor.png) endif() @@ -18,9 +14,7 @@ install(FILES ${icons_SRCS} DESTINATION ${INSTALLROOT}/share/pixmaps/) install(FILES qlcplus.xml DESTINATION ${INSTALLROOT}/share/mime/packages) -set(appdata_FILES - org.qlcplus.QLCPlus.appdata.xml -) +set(appdata_FILES org.qlcplus.QLCPlus.appdata.xml) if(NOT qmlui) list(APPEND appdata_FILES org.qlcplus.QLCPlusFixtureEditor.appdata.xml) endif() @@ -32,6 +26,7 @@ if(NOT qmlui) endif() # install(FILES ../Sample.qxw DESTINATION ${INSTALLROOT}/${DATADIR}) +# install(FILES qlcplus-start.sh DESTINATION ${INSTALLROOT}/sbin) if(appimage) if (QT_DIR STREQUAL "/usr/lib/x86_64-linux-gnu/cmake/Qt5") diff --git a/platforms/linux/qlcplus-start.sh b/platforms/linux/qlcplus-start.sh new file mode 100644 index 0000000000..3d1a1b2616 --- /dev/null +++ b/platforms/linux/qlcplus-start.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# +# Q Light Controller Plus +# qlcplus-start.sh +# +# Copyright (c) 2024 Massimo Callegari +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# detect HDMI plug state +QTPLATFORM="eglfs" +kmsprint -m | grep connected > /dev/null +if [ $? -eq 1 ]; then + QTPLATFORM="offscreen" +fi + +QLCPLUS_OPTS="-platform $QTPLATFORM --nowm --web --web-auth --operate --overscan" + +if [ ! -f $HOME/.qlcplus/eglfs.json ]; then + mkdir -p $HOME/.qlcplus + echo '{ "device": "/dev/dri/card1" }' > $HOME/.qlcplus/eglfs.json +fi + +if [ -f $HOME/.qlcplus/autostart.qxw ]; then + QLCPLUS_OPTS="$QLCPLUS_OPTS --open $HOME/.qlcplus/autostart.qxw" +fi + +# if NTP hasn't done its job already, set the date to modern age... +CURRDATE=`date +%Y` +if [ "$CURRDATE" -lt "2024" ]; then + date +%Y%m%d -s "20240313" +fi + +export QT_QPA_EGLFS_PHYSICAL_WIDTH=320 +export QT_QPA_EGLFS_PHYSICAL_HEIGHT=200 +export QT_QPA_EGLFS_ALWAYS_SET_MODE=1 +export QT_QPA_EGLFS_KMS_CONFIG=$HOME/.qlcplus/eglfs.json + +/usr/bin/qlcplus $QLCPLUS_OPTS diff --git a/platforms/linux/qlcplus.service b/platforms/linux/qlcplus.service new file mode 100644 index 0000000000..919be83f19 --- /dev/null +++ b/platforms/linux/qlcplus.service @@ -0,0 +1,14 @@ +[Unit] +Description=Q Light Controller Plus +Documentation=man:qlcplus(1) +After=basic.target + +[Service] +Type=simple +User=pi +Restart=on-failure +RestartSec=3 +ExecStart=/usr/sbin/qlcplus-start.sh + +[Install] +WantedBy=multi-user.target diff --git a/platforms/macos/libsndfile-nametool.pri b/platforms/macos/libsndfile-nametool.pri index 9c81804103..c57ecec527 100644 --- a/platforms/macos/libsndfile-nametool.pri +++ b/platforms/macos/libsndfile-nametool.pri @@ -5,7 +5,7 @@ LIBSNDFILE_FILEPATH = $$LIBSNDFILE_DIR/$$LIBSNDFILE_FILE LIBOGG_FILE = libogg.0.dylib LIBOGG_PATH = $$system("pkg-config --variable libdir ogg") LIBOGG_FILEPATH = $$LIBOGG_PATH/$$LIBOGG_FILE -LIBFLAC_FILE = libFLAC.8.dylib +LIBFLAC_FILE = libFLAC.12.dylib LIBFLAC_PATH = $$system("pkg-config --variable libdir flac") LIBFLAC_FILEPATH = $$LIBFLAC_PATH/$$LIBFLAC_FILE LIBVORBIS_FILE = libvorbis.0.dylib diff --git a/platforms/macos/svg2icns.sh b/platforms/macos/svg2icns.sh new file mode 100644 index 0000000000..9afdd8735b --- /dev/null +++ b/platforms/macos/svg2icns.sh @@ -0,0 +1,30 @@ +#!/bin/sh -x + +set -e + +SIZES=" +16,16x16 +32,16x16@2x +32,32x32 +64,32x32@2x +128,128x128 +256,128x128@2x +256,256x256 +512,256x256@2x +512,512x512 +1024,512x512@2x +" + +for SVG in "$@"; do + BASE=$(basename "$SVG" | sed 's/\.[^\.]*$//') + ICONSET="$BASE.iconset" + mkdir -p "$ICONSET" + for PARAMS in $SIZES; do + SIZE=$(echo $PARAMS | cut -d, -f1) + LABEL=$(echo $PARAMS | cut -d, -f2) + svg2png -w $SIZE -h $SIZE "$SVG" "$ICONSET"/icon_$LABEL.png + done + + iconutil -c icns "$ICONSET" + rm -rf "$ICONSET" +done diff --git a/platforms/windows/CMakeLists.txt b/platforms/windows/CMakeLists.txt index ca890c7256..660754c859 100644 --- a/platforms/windows/CMakeLists.txt +++ b/platforms/windows/CMakeLists.txt @@ -20,7 +20,7 @@ endif() get_filename_component(QT_LIBS_PATH ${QT_DIR}/../../../bin ABSOLUTE) get_filename_component(QT_PLUGINS_PATH ${QT_LIBS_PATH}/../share/${QT_P}/plugins ABSOLUTE) get_filename_component(QT_QML_PATH ${QT_LIBS_PATH}/../share/${QT_P}/qml ABSOLUTE) -set(SYS_LIBS_PATH $ENV{SystemDrive}/msys64/mingw32/bin) +set(SYS_LIBS_PATH $ENV{SystemDrive}/msys64/mingw64/bin) # set(SYS_LIBS_PATH D:/msys64/mingw32/bin) # Qt library dependencies @@ -172,7 +172,7 @@ endif() # MSYS2 libraries set(msys_path "${INSTALLROOT}/${LIBSDIR}") set(msys_files "${SYS_LIBS_PATH}/libstdc++-6.dll" - "${SYS_LIBS_PATH}/libgcc_s_dw2-1.dll" + "${SYS_LIBS_PATH}/libgcc_s_seh-1.dll" "${SYS_LIBS_PATH}/libwinpthread-1.dll" "${SYS_LIBS_PATH}/libicuin74.dll" "${SYS_LIBS_PATH}/libicuuc74.dll" diff --git a/platforms/windows/qlcplus4Qt5.nsi b/platforms/windows/qlcplus4Qt5.nsi index 185a902d94..6a7271ee9e 100644 --- a/platforms/windows/qlcplus4Qt5.nsi +++ b/platforms/windows/qlcplus4Qt5.nsi @@ -4,7 +4,7 @@ ;-------------------------------- ;Defines -!define QLCPLUS_HOME "c:\Qt\qlcplus" +!define QLCPLUS_HOME "c:\projects\qlcplus" !define MUI_ICON "${QLCPLUS_HOME}\resources\icons\qlcplus.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-uninstall.ico" !define MUI_HEADERIMAGE @@ -15,7 +15,7 @@ ;-------------------------------- ;General Name "Q Light Controller Plus" -OutFile "QLC+_4.12.8.exe" +OutFile "QLC+_4.13.1.exe" InstallDir C:\QLC+ InstallDirRegKey HKCU "Software\qlcplus" "Install_Dir" RequestExecutionLevel user @@ -91,7 +91,6 @@ Section File /r styles File Sample.qxw File *.qm - File /r Documents File /r Fixtures File /r Gobos File /r InputProfiles @@ -133,7 +132,6 @@ Section "Uninstall" RMDir /r $INSTDIR\styles Delete $INSTDIR\Sample.qxw Delete $INSTDIR\*.qm - RMDir /r $INSTDIR\Documents RMDir /r $INSTDIR\Fixtures RMDir /r $INSTDIR\Gobos RMDir /r $INSTDIR\InputProfiles diff --git a/platforms/windows/qlcplus4Qt6.nsi b/platforms/windows/qlcplus4Qt6.nsi index b60944b728..f211c12393 100644 --- a/platforms/windows/qlcplus4Qt6.nsi +++ b/platforms/windows/qlcplus4Qt6.nsi @@ -4,7 +4,7 @@ ;-------------------------------- ;Defines -!define QLCPLUS_HOME "c:\Qt\qlcplus" +!define QLCPLUS_HOME "c:\projects\qlcplus" !define MUI_ICON "${QLCPLUS_HOME}\resources\icons\qlcplus.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-uninstall.ico" !define MUI_HEADERIMAGE @@ -15,7 +15,7 @@ ;-------------------------------- ;General Name "Q Light Controller Plus" -OutFile "QLC+_4.12.8.exe" +OutFile "QLC+_4.13.1.exe" InstallDir C:\QLC+ InstallDirRegKey HKCU "Software\qlcplus" "Install_Dir" RequestExecutionLevel user @@ -90,7 +90,6 @@ Section File /r styles File Sample.qxw File *.qm - File /r Documents File /r Fixtures File /r Gobos File /r InputProfiles @@ -131,7 +130,6 @@ Section "Uninstall" RMDir /r $INSTDIR\styles Delete $INSTDIR\Sample.qxw Delete $INSTDIR\*.qm - RMDir /r $INSTDIR\Documents RMDir /r $INSTDIR\Fixtures RMDir /r $INSTDIR\Gobos RMDir /r $INSTDIR\InputProfiles diff --git a/platforms/windows/qlcplus5Qt5.nsi b/platforms/windows/qlcplus5Qt5.nsi index 569017bfd3..3653be3645 100644 --- a/platforms/windows/qlcplus5Qt5.nsi +++ b/platforms/windows/qlcplus5Qt5.nsi @@ -4,7 +4,7 @@ ;-------------------------------- ;Defines -!define QLCPLUS_HOME "c:\Qt\qlcplus" +!define QLCPLUS_HOME "c:\projects\qlcplus" !define MUI_ICON "${QLCPLUS_HOME}\resources\icons\qlcplus.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-uninstall.ico" !define MUI_HEADERIMAGE @@ -15,7 +15,7 @@ ;-------------------------------- ;General Name "Q Light Controller Plus" -OutFile "QLC+_5.0.0_beta3.exe" +OutFile "QLC+_5.0.0_beta4.exe" InstallDir C:\QLC+5 InstallDirRegKey HKCU "Software\qlcplus" "Install_Dir" RequestExecutionLevel user diff --git a/plugins/artnet/src/artnetcontroller.cpp b/plugins/artnet/src/artnetcontroller.cpp index 9ebe075bcf..08abf77b6f 100644 --- a/plugins/artnet/src/artnetcontroller.cpp +++ b/plugins/artnet/src/artnetcontroller.cpp @@ -24,7 +24,7 @@ #include #include -#define POLL_INTERVAL_MS 5000 +#define POLL_INTERVAL_MS 3000 #define SEND_INTERVAL_MS 2000 #define TRANSMIT_STANDARD "Standard" @@ -429,9 +429,16 @@ bool ArtNetController::handleArtNetPoll(QByteArray const& datagram, QHostAddress qDebug() << "[ArtNet] ArtPoll received"; #endif QByteArray pollReplyPacket; - m_packetizer->setupArtNetPollReply(pollReplyPacket, m_ipAddr, m_MACAddress); - m_udpSocket->writeDatagram(pollReplyPacket, senderAddress, ARTNET_PORT); - ++m_packetSent; + for (QMap::iterator it = m_universeMap.begin(); it != m_universeMap.end(); ++it) + { + quint32 universe = it.key(); + UniverseInfo &info = it.value(); + bool isInput = (info.type & Input) ? true : false; + + m_packetizer->setupArtNetPollReply(pollReplyPacket, m_ipAddr, m_MACAddress, universe, isInput); + m_udpSocket->writeDatagram(pollReplyPacket, senderAddress, ARTNET_PORT); + ++m_packetSent; + } ++m_packetReceived; return true; } @@ -451,7 +458,7 @@ bool ArtNetController::handleArtNetDmx(QByteArray const& datagram, QHostAddress #if _DEBUG_RECEIVED_PACKETS qDebug() << "[ArtNet] DMX data received. Universe:" << artnetUniverse << ", Data size:" << dmxData.size() << ", data[0]=" << (int)dmxData[0] - << ", from=" << senderAddress.toString(); + << ", from=" << QHostAddress(senderAddress.toIPv4Address()).toString(); #endif for (QMap::iterator it = m_universeMap.begin(); it != m_universeMap.end(); ++it) @@ -524,7 +531,7 @@ bool ArtNetController::handlePacket(QByteArray const& datagram, QHostAddress con // return false; #if _DEBUG_RECEIVED_PACKETS - qDebug() << "Received packet with size: " << datagram.size() << ", host: " << senderAddress.toString(); + qDebug() << "Received packet with size: " << datagram.size() << ", host: " << QHostAddress(senderAddress.toIPv4Address()).toString(); #endif quint16 opCode = -1; diff --git a/plugins/artnet/src/artnetpacketizer.cpp b/plugins/artnet/src/artnetpacketizer.cpp index 98a60f49aa..969605d4ba 100644 --- a/plugins/artnet/src/artnetpacketizer.cpp +++ b/plugins/artnet/src/artnetpacketizer.cpp @@ -63,7 +63,7 @@ void ArtNetPacketizer::setupArtNetPoll(QByteArray& data) data.append('\0'); // Priority } -void ArtNetPacketizer::setupArtNetPollReply(QByteArray &data, QHostAddress ipAddr, QString MACaddr) +void ArtNetPacketizer::setupArtNetPollReply(QByteArray &data, QHostAddress ipAddr, QString MACaddr, quint32 universe, bool isInput) { int i = 0; data.clear(); @@ -87,28 +87,42 @@ void ArtNetPacketizer::setupArtNetPollReply(QByteArray &data, QHostAddress ipAdd data.append((char)0xF0); // Status1 - Ready and booted data.append((char)0xFF); // ESTA Manufacturer MSB data.append((char)0xFF); // ESTA Manufacturer LSB + data.append("QLC+"); // Short Name for (i = 0; i < 14; i++) data.append((char)0x00); // 14 bytes of stuffing data.append("Q Light Controller Plus - ArtNet interface"); // Long Name for (i = 0; i < 22; i++) // 64-42 bytes of stuffing. 42 is the length of the long name data.append((char)0x00); + for (i = 0; i < 64; i++) data.append((char)0x00); // Node report - data.append((char)0x00); // NumPort MSB - // FIXME: this should reflect the actual state of QLC+ output ports ! - data.append((char)0x01); // NumPort LSB - data.append((char)0x80); // Port 1 type: can output DMX512 data - data.append((char)0x80); // Port 2 type: can output DMX512 data - data.append((char)0x80); // Port 3 type: can output DMX512 data - data.append((char)0x80); // Port 4 type: can output DMX512 data - // FIXME: this should reflect the actual state of QLC+ output ports ! - for (i = 0; i < 12; i++) - data.append((char)0x00); // Set GoodInput[4], GoodOutput[4] and SwIn[4] all to unknown state - data.append((char)0x00); // SwOut0 - output 0 - data.append((char)0x01); // SwOut1 - output 1 - data.append((char)0x02); // SwOut2 - output 2 - data.append((char)0x03); // SwOut3 - output 3 + data.append((char)0x00); // NumPortsHi + data.append((char)0x01); // NumPortsLo + data.append(isInput ? (char)0x40 : (char)0x80); // PortTypes[0]: can input or output DMX512 data + data.append((char)0x00); // PortTypes[1]: nothing + data.append((char)0x00); // PortTypes[2]: nothing + data.append((char)0x00); // PortTypes[3]: nothing + + data.append(isInput ? (char)0x80 : (char)0x00); // GoodInput[0] - input status port 1 + data.append((char)0x00); // GoodInput[1] - input status port 2 + data.append((char)0x00); // GoodInput[2] - input status port 3 + data.append((char)0x00); // GoodInput[3] - input status port 4 + + data.append(isInput ? (char)0x00 : (char)0x80); // GoodOutputA[0] - output status port 1 + data.append((char)0x00); // GoodOutputA[0] - output status port 2 + data.append((char)0x00); // GoodOutputA[0] - output status port 3 + data.append((char)0x00); // GoodOutputA[0] - output status port 4 + + data.append(isInput ? (char)universe : (char)0x00); // SwIn[0] - port 1 + data.append((char)0x00); // SwIn[1] - port 2 + data.append((char)0x00); // SwIn[2] - port 3 + data.append((char)0x00); // SwIn[3] - port 4 + + data.append(isInput ? (char)0x00 : (char)universe); // SwOut[0] - port 1 + data.append((char)0x00); // SwOut[1] - port 2 + data.append((char)0x00); // SwOut[2] - port 3 + data.append((char)0x00); // SwOut[3] - port 4 for (i = 0; i < 7; i++) data.append((char)0x00); // SwVideo, SwMacro, SwRemote and 4 spare bytes QStringList MAC = MACaddr.split(":"); @@ -208,7 +222,7 @@ bool ArtNetPacketizer::checkPacketAndCode(QByteArray const& data, quint16 &code) if (data.at(7) != 0x00) return false; - code = ((int)data.at(9) << 8) + data.at(8); + code = (quint16(data.at(9)) << 8) + quint16(data.at(8)); return true; } diff --git a/plugins/artnet/src/artnetpacketizer.h b/plugins/artnet/src/artnetpacketizer.h index 5409bf0f96..a7113636dd 100644 --- a/plugins/artnet/src/artnetpacketizer.h +++ b/plugins/artnet/src/artnetpacketizer.h @@ -86,7 +86,8 @@ class ArtNetPacketizer void setupArtNetPoll(QByteArray& data); /** Prepare an ArtNetPollReply packet */ - void setupArtNetPollReply(QByteArray &data, QHostAddress ipAddr, QString MACaddr); + void setupArtNetPollReply(QByteArray &data, QHostAddress ipAddr, + QString MACaddr, quint32 universe, bool isInput); /** Prepare an ArtNetDmx packet */ void setupArtNetDmx(QByteArray& data, const int& universe, const QByteArray &values); diff --git a/plugins/artnet/src/artnetplugin.cpp b/plugins/artnet/src/artnetplugin.cpp index b866f63404..6f2ae27b72 100644 --- a/plugins/artnet/src/artnetplugin.cpp +++ b/plugins/artnet/src/artnetplugin.cpp @@ -441,7 +441,7 @@ void ArtNetPlugin::slotReadyRead() void ArtNetPlugin::handlePacket(QByteArray const& datagram, QHostAddress const& senderAddress) { - // A firts filter: look for a controller on the same subnet as the sender. + // A first filter: look for a controller on the same subnet as the sender. // This allows having the same ArtNet Universe on 2 different network interfaces. foreach (ArtNetIO io, m_IOmapping) { diff --git a/plugins/artnet/src/configureartnet.cpp b/plugins/artnet/src/configureartnet.cpp index 85b6ef7d0c..55a7584b29 100644 --- a/plugins/artnet/src/configureartnet.cpp +++ b/plugins/artnet/src/configureartnet.cpp @@ -95,7 +95,7 @@ void ConfigureArtNet::fillNodesTree() it.next(); QTreeWidgetItem* nitem = new QTreeWidgetItem(pitem); ArtNetNodeInfo nInfo = it.value(); - nitem->setText(KNodesColumnIP, it.key().toString()); + nitem->setText(KNodesColumnIP, QHostAddress(it.key().toIPv4Address()).toString()); nitem->setText(KNodesColumnShortName, nInfo.shortName); nitem->setText(KNodesColumnLongName, nInfo.longName); } diff --git a/plugins/dmxusb/src/CMakeLists.txt b/plugins/dmxusb/src/CMakeLists.txt index 7c717d5aac..3d902bab46 100644 --- a/plugins/dmxusb/src/CMakeLists.txt +++ b/plugins/dmxusb/src/CMakeLists.txt @@ -27,8 +27,8 @@ add_library(${module_name} ) if(WIN32) - set(FTD2XXDIR "C:/Qt/D2XXSDK") - target_link_libraries(${module_name} PRIVATE ${FTD2XXDIR}/i386/libftd2xx.a) + set(FTD2XXDIR "C:/projects/D2XXSDK") + target_link_libraries(${module_name} PRIVATE ${FTD2XXDIR}/amd64/libftd2xx.a) target_include_directories(${module_name} PRIVATE ${FTD2XXDIR}) message("Building with FTD2xx support.") set(WITH_D2XX TRUE) @@ -151,11 +151,6 @@ if(WITH_D2XX) target_compile_definitions(${module_name} PRIVATE FTD2XX) endif() -if((WITH_D2XX) AND (WIN32)) - target_include_directories(${module_name} PRIVATE ${FTD2XXDIR}) - target_link_libraries(${module_name} PRIVATE ${FTD2XXDIR}/i386/libftd2xx.a) -endif() - if(WITH_LIBFTDI) target_sources(${module_name} PUBLIC libftdi-interface.cpp libftdi-interface.h) endif() @@ -166,6 +161,9 @@ if (UNIX AND NOT APPLE) DESTINATION ${UDEVRULESDIR}) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/org.qlcplus.QLCPlus.dmxusb.metainfo.xml" DESTINATION ${METAINFODIR}) +elseif (WITH_D2XX) + install(FILES ${FTD2XXDIR}/amd64/ftd2xx64.dll + DESTINATION ${INSTALLROOT}/${LIBSDIR}) endif() install(TARGETS ${module_name} diff --git a/plugins/dmxusb/src/enttecdmxusbopen.cpp b/plugins/dmxusb/src/enttecdmxusbopen.cpp index 1c1b160099..261bd07e3c 100644 --- a/plugins/dmxusb/src/enttecdmxusbopen.cpp +++ b/plugins/dmxusb/src/enttecdmxusbopen.cpp @@ -20,7 +20,6 @@ #include #include -#include #include #include "enttecdmxusbopen.h" diff --git a/plugins/dmxusb/src/src.pro b/plugins/dmxusb/src/src.pro index 2e775f3d02..aae7b4f956 100644 --- a/plugins/dmxusb/src/src.pro +++ b/plugins/dmxusb/src/src.pro @@ -40,7 +40,7 @@ CONFIG(ftd2xx) { win32 { # Windows target - FTD2XXDIR = C:/Qt/D2XXSDK + FTD2XXDIR = C:/projects/D2XXSDK LIBS += -L$$FTD2XXDIR/i386 -lftd2xx LIBS += $$FTD2XXDIR/i386/libftd2xx.a INCLUDEPATH += $$FTD2XXDIR diff --git a/plugins/dmxusb/src/vinceusbdmx512.cpp b/plugins/dmxusb/src/vinceusbdmx512.cpp index f033249711..563dee50e9 100644 --- a/plugins/dmxusb/src/vinceusbdmx512.cpp +++ b/plugins/dmxusb/src/vinceusbdmx512.cpp @@ -18,16 +18,20 @@ */ #include + #include "vinceusbdmx512.h" -VinceUSBDMX512::VinceUSBDMX512(DMXInterface *interface, quint32 outputLine) - : DMXUSBWidget(interface, outputLine, DEFAULT_OUTPUT_FREQUENCY) +VinceUSBDMX512::VinceUSBDMX512(DMXInterface *iface, quint32 outputLine) + : QThread(NULL) + , DMXUSBWidget(iface, outputLine, DEFAULT_OUTPUT_FREQUENCY) + , m_running(false) { // TODO: Check if DMX IN is available } VinceUSBDMX512::~VinceUSBDMX512() { + stopOutputThread(); } DMXUSBWidget::Type VinceUSBDMX512::type() const @@ -35,26 +39,6 @@ DMXUSBWidget::Type VinceUSBDMX512::type() const return DMXUSBWidget::VinceTX; } -/**************************************************************************** - * Name & Serial - ****************************************************************************/ - -QString VinceUSBDMX512::additionalInfo() const -{ - QString info; - - info += QString("

"); - info += QString("%1: %2 (%3)").arg(QObject::tr("Protocol")) - .arg("Vince USB-DMX512") - .arg(QObject::tr("Output")); - info += QString("
"); - info += QString("%1: %2").arg(QObject::tr("Serial number")) - .arg(serial()); - info += QString("

"); - - return info; -} - /**************************************************************************** * Open & Close ****************************************************************************/ @@ -74,104 +58,94 @@ bool VinceUSBDMX512::open(quint32 line, bool input) if (iface()->write(QByteArray(2, 0x00)) == false) return false; - // Request start DMX command - return this->writeData(VinceUSBDMX512::StartDMX); + QByteArray startSequence; + + startSequence.append(QByteArray(2, VINCE_START_OF_MSG)); + startSequence.append(VINCE_CMD_START_DMX); + startSequence.append(QByteArray(2, 0x00)); + startSequence.append(VINCE_END_OF_MSG); + + if (iface()->write(startSequence) == false) + qWarning() << Q_FUNC_INFO << name() << "START command failed"; + + start(); + + return true; } bool VinceUSBDMX512::close(quint32 line, bool input) { - Q_UNUSED(line) Q_UNUSED(input) - if (isOpen() == false) - return true; + stopOutputThread(); + + QByteArray stopSequence; - // Reqest stop DMX command - if (this->writeData(VinceUSBDMX512::StopDMX) == true) - return DMXUSBWidget::close(); + stopSequence.append(QByteArray(2, VINCE_START_OF_MSG)); + stopSequence.append(VINCE_CMD_STOP_DMX); + stopSequence.append(QByteArray(2, 0x00)); + stopSequence.append(VINCE_END_OF_MSG); - return false; + if (iface()->write(stopSequence) == false) + qWarning() << Q_FUNC_INFO << name() << "STOP command failed"; + + return DMXUSBWidget::close(line); } /**************************************************************************** - * Write & Read + * Inputs ****************************************************************************/ -bool VinceUSBDMX512::writeData(Command command, const QByteArray &data) +int readData(DMXInterface *iface, QByteArray &payload) { - QByteArray message(1, command); // Command - message.prepend(QByteArray(2, VINCE_START_OF_MSG)); // Start condition - if (data.size() == 0) - message.append(QByteArray(2, 0x00)); // Data length - else - { - message.append(int((data.size() + 2) / 256)); // Data length - message.append(int((data.size() + 2) % 256)); - message.append(QByteArray(2, 0x00)); // Gap with data - message.append(data); // Data - } - message.append(VINCE_END_OF_MSG); // Stop condition - - return iface()->write(message); -} - -QByteArray VinceUSBDMX512::readData(bool* ok) -{ - uchar byte = 0; + bool ok; + char byte; ushort dataLength = 0; - QByteArray data = QByteArray(); // Read headers for (int i = 0; i < 6; i++) { - *ok = false; - // Attempt to read byte - byte = iface()->readByte(ok); - if (*ok == false) - return data; + byte = iface->readByte(&ok); + + if (ok == false) + return 0; // Retrieve response (4th byte) - if (i == 3 && byte != VINCE_RESP_OK) + if (i == 3) { - qWarning() << Q_FUNC_INFO << "Error" << byte << "in readed message"; - *ok = false; + if (byte != VINCE_RESP_OK) + { + qWarning() << Q_FUNC_INFO << "Unable to find start of next message"; + return 0; + } } - // Retrieve length (5th & 6th bytes) + // Retrieve data length (5th & 6th bytes) else if (i == 4) dataLength = ushort(byte) * 256; else if (i == 5) dataLength += ushort(byte); } - // Read data if (dataLength > 0) { qDebug() << Q_FUNC_INFO << "Attempt to read" << dataLength << "bytes"; - ushort i; - for (i = 0; i < dataLength; i++) - { - byte = iface()->readByte(ok); - if (*ok == false) - { - qWarning() << Q_FUNC_INFO << "No available byte to read (" << (dataLength - i) << "missing bytes)"; - return data; - } - data.append(byte); - } + // Read the whole payload + payload.clear(); + payload = iface->read(dataLength); } // Read end of message - byte = iface()->readByte(); - if (byte != VINCE_END_OF_MSG) - { + if ((byte = iface->readByte()) != VINCE_END_OF_MSG) qWarning() << Q_FUNC_INFO << "Incorrect end of message received:" << byte; - *ok = false; - } - return data; + return dataLength; } +/**************************************************************************** + * Outputs + ****************************************************************************/ + bool VinceUSBDMX512::writeUniverse(quint32 universe, quint32 output, const QByteArray& data, bool dataChanged) { Q_UNUSED(universe) @@ -180,28 +154,89 @@ bool VinceUSBDMX512::writeUniverse(quint32 universe, quint32 output, const QByte if (isOpen() == false) return false; - // Write only if universe has changed - if (!dataChanged) - return true; + if (m_outputLines[0].m_universeData.size() == 0) + { + m_outputLines[0].m_universeData.append(data); + m_outputLines[0].m_universeData.append(DMX_CHANNELS - data.size(), 0); + } - if (writeData(VinceUSBDMX512::UpdateDMX, data) == false) + if (dataChanged) + m_outputLines[0].m_universeData.replace(0, data.size(), data); + + return true; +} + +void VinceUSBDMX512::stopOutputThread() +{ + if (isRunning() == true) { - qWarning() << Q_FUNC_INFO << name() << "will not accept DMX data"; - return false; + m_running = false; + wait(); } - else +} + +void VinceUSBDMX512::run() +{ + qDebug() << "OUTPUT thread started"; + + QElapsedTimer timer; + + m_running = true; + + while (m_running == true) { - bool ok = false; - QByteArray resp = this->readData(&ok); + timer.restart(); + + int dataLen = m_outputLines[0].m_universeData.length(); - // Check the interface reponse - if (ok == false || resp.size() > 0) + if (dataLen > 0) { - qWarning() << Q_FUNC_INFO << name() << "doesn't respond properly"; - return false; + QByteArray request; + request.append(QByteArray(2, VINCE_START_OF_MSG)); // Start byte + request.append(VINCE_CMD_UPDATE_DMX); // Command + request.append(int((dataLen + 2) / 256)); // Data length + request.append(int((dataLen + 2) % 256)); + request.append(QByteArray(2, 0x00)); // Gap with data + request.append(m_outputLines[0].m_universeData); + request.append(VINCE_END_OF_MSG); // Stop byte + + if (iface()->write(request) == false) + qWarning() << Q_FUNC_INFO << name() << "Will not accept DMX data"; + else + { + QByteArray reply; + + if (readData(iface(), reply) > 0) + qWarning() << Q_FUNC_INFO << name() << "Invalid response"; + } } - m_universe = data; - return true; + int timetoSleep = m_frameTimeUs - (timer.nsecsElapsed() / 1000); + if (timetoSleep < 0) + qWarning() << "DMX output is running late !"; + else + usleep(timetoSleep); } + + qDebug() << "OUTPUT thread terminated"; +} + +/**************************************************************************** + * Serial & name + ****************************************************************************/ + +QString VinceUSBDMX512::additionalInfo() const +{ + QString info; + + info += QString("

"); + info += QString("%1: %2 (%3)").arg(QObject::tr("Protocol")) + .arg("Vince USB-DMX512") + .arg(QObject::tr("Output")); + info += QString("
"); + info += QString("%1: %2").arg(QObject::tr("Serial number")) + .arg(serial()); + info += QString("

"); + + return info; } diff --git a/plugins/dmxusb/src/vinceusbdmx512.h b/plugins/dmxusb/src/vinceusbdmx512.h index 08c3001f30..ab68d5aa4d 100644 --- a/plugins/dmxusb/src/vinceusbdmx512.h +++ b/plugins/dmxusb/src/vinceusbdmx512.h @@ -21,7 +21,7 @@ #define VINCEUSBDMX512_H #include -#include +#include #include "dmxusbwidget.h" @@ -39,38 +39,18 @@ #define VINCE_RESP_IO_ERR char(0x10) //! CMD_IO_ERR #define VINCE_RESP_PARAM_ERR char(0x11) //! CMD_PARAM_ERR -/** - * This is the base interface class for Vince USB-DMX512 widgets. - */ -class VinceUSBDMX512 : public DMXUSBWidget +class VinceUSBDMX512 : public QThread, public DMXUSBWidget { - /************************************************************************ - * Initialization - ************************************************************************/ + Q_OBJECT + public: - VinceUSBDMX512(DMXInterface *interface, quint32 outputLine); + VinceUSBDMX512(DMXInterface *iface, quint32 outputLine); + virtual ~VinceUSBDMX512(); /** @reimp */ Type type() const; -protected: - /** Requests commands */ - enum Command - { - StartDMX = VINCE_CMD_START_DMX, - StopDMX = VINCE_CMD_STOP_DMX, - ResetDMX = VINCE_CMD_RESET_DMX, - UpdateDMX = VINCE_CMD_UPDATE_DMX - }; - - /**************************************************************************** - * Name & Serial - ****************************************************************************/ -public: - /** @reimp */ - QString additionalInfo() const; - /**************************************************************************** * Open & Close ****************************************************************************/ @@ -79,38 +59,31 @@ class VinceUSBDMX512 : public DMXUSBWidget bool open(quint32 line = 0, bool input = false); /** @reimp */ - virtual bool close(quint32 line = 0, bool input = false); - - /************************************************************************ - * Write & Read - ************************************************************************/ -protected: - /** - * Format and write data to the opened interface. - * - * @param command The request type - * @param data The data to write - * @return true if the values were sent successfully, otherwise false - */ - bool writeData(enum Command command, const QByteArray& data = QByteArray()); - - /** - * Read and extract data from the opened interface. - * - * @param ok A pointer which tells if data was read or not - * @return The available data - */ - QByteArray readData(bool* ok = NULL); - - /************************************************************************ - * Write universe - ************************************************************************/ + bool close(quint32 line = 0, bool input = false); + + /******************************************************************** + * Outputs + ********************************************************************/ public: /** @reimp */ bool writeUniverse(quint32 universe, quint32 output, const QByteArray& data, bool dataChanged); private: - QByteArray m_universe; + /** Stop the output thread */ + void stopOutputThread(); + + /** Output thread worker method */ + void run(); + +private: + bool m_running; + + /**************************************************************************** + * Serial & name + ****************************************************************************/ +public: + /** @reimp */ + QString additionalInfo() const; }; #endif diff --git a/plugins/dummy/dummyplugin.cpp b/plugins/dummy/dummyplugin.cpp index 97bacc3a26..bf64e6a3dc 100644 --- a/plugins/dummy/dummyplugin.cpp +++ b/plugins/dummy/dummyplugin.cpp @@ -200,13 +200,13 @@ QString DummyPlugin::inputInfo(quint32 input) return str; } -void DummyPlugin::sendFeedBack(quint32 universe, quint32 output, quint32 channel, uchar value, const QString &key) +void DummyPlugin::sendFeedBack(quint32 universe, quint32 output, quint32 channel, uchar value, const QVariant ¶ms) { Q_UNUSED(universe) Q_UNUSED(output) Q_UNUSED(channel) Q_UNUSED(value) - Q_UNUSED(key) + Q_UNUSED(params) /** * If the device support this feature, this is the method to send data back for diff --git a/plugins/dummy/dummyplugin.h b/plugins/dummy/dummyplugin.h index 0811dfec3f..7a5e7f558a 100644 --- a/plugins/dummy/dummyplugin.h +++ b/plugins/dummy/dummyplugin.h @@ -85,7 +85,7 @@ class DummyPlugin : public QLCIOPlugin QString inputInfo(quint32 input); /** @reimp */ - void sendFeedBack(quint32 universe, quint32 output, quint32 channel, uchar value, const QString& key); + void sendFeedBack(quint32 universe, quint32 output, quint32 channel, uchar value, const QVariant ¶ms); protected: /** Place here the variables used by this plugin */ diff --git a/plugins/enttecwing/src/enttecwing.cpp b/plugins/enttecwing/src/enttecwing.cpp index de77ac6e87..7d81253b50 100644 --- a/plugins/enttecwing/src/enttecwing.cpp +++ b/plugins/enttecwing/src/enttecwing.cpp @@ -169,7 +169,7 @@ QString EnttecWing::inputInfo(quint32 input) } void EnttecWing::sendFeedBack(quint32 universe, quint32 input, - quint32 channel, uchar value, const QString &) + quint32 channel, uchar value, const QVariant &) { Q_UNUSED(universe) diff --git a/plugins/enttecwing/src/enttecwing.h b/plugins/enttecwing/src/enttecwing.h index 4f497016ca..34baf921e0 100644 --- a/plugins/enttecwing/src/enttecwing.h +++ b/plugins/enttecwing/src/enttecwing.h @@ -78,7 +78,7 @@ class EnttecWing : public QLCIOPlugin QString inputInfo(quint32 input); /** @reimp */ - void sendFeedBack(quint32 universe, quint32 input, quint32 channel, uchar value, const QString& key); + void sendFeedBack(quint32 universe, quint32 input, quint32 channel, uchar value, const QVariant ¶ms); /************************************************************************* * Outputs diff --git a/plugins/gpio/gpioplugin.cpp b/plugins/gpio/gpioplugin.cpp index 68dee2608e..bb2b134241 100644 --- a/plugins/gpio/gpioplugin.cpp +++ b/plugins/gpio/gpioplugin.cpp @@ -139,6 +139,7 @@ QString GPIOPlugin::outputInfo(quint32 output) void GPIOPlugin::writeUniverse(quint32 universe, quint32 output, const QByteArray &data, bool dataChanged) { Q_UNUSED(universe) + Q_UNUSED(dataChanged) if (output != 0) return; diff --git a/plugins/interfaces/qlcioplugin.cpp b/plugins/interfaces/qlcioplugin.cpp index 03d2e6747b..2faabdd58f 100644 --- a/plugins/interfaces/qlcioplugin.cpp +++ b/plugins/interfaces/qlcioplugin.cpp @@ -86,13 +86,13 @@ QString QLCIOPlugin::inputInfo(quint32 input) } void QLCIOPlugin::sendFeedBack(quint32 universe, quint32 inputLine, - quint32 channel, uchar value, const QString &key) + quint32 channel, uchar value, const QVariant ¶ms) { Q_UNUSED(universe) Q_UNUSED(inputLine) Q_UNUSED(channel) Q_UNUSED(value) - Q_UNUSED(key) + Q_UNUSED(params) } /************************************************************************* diff --git a/plugins/interfaces/qlcioplugin.h b/plugins/interfaces/qlcioplugin.h index 4b46f09cf0..72588f64f9 100644 --- a/plugins/interfaces/qlcioplugin.h +++ b/plugins/interfaces/qlcioplugin.h @@ -129,7 +129,8 @@ class QLCIOPlugin : public QObject Input = 1 << 1, Feedback = 1 << 2, Infinite = 1 << 3, - RDM = 1 << 4 + RDM = 1 << 4, + Beats = 1 << 5 }; /** @@ -263,7 +264,7 @@ class QLCIOPlugin : public QObject * @param key a string to identify a channel by name (ATM used only by OSC) */ virtual void sendFeedBack(quint32 universe, quint32 inputLine, - quint32 channel, uchar value, const QString& key = 0); + quint32 channel, uchar value, const QVariant ¶ms); signals: /** diff --git a/plugins/loopback/src/loopback.cpp b/plugins/loopback/src/loopback.cpp index 37e3335791..47b417a337 100644 --- a/plugins/loopback/src/loopback.cpp +++ b/plugins/loopback/src/loopback.cpp @@ -206,7 +206,7 @@ void Loopback::writeUniverse(quint32 universe, quint32 output, const QByteArray } } -void Loopback::sendFeedBack(quint32 universe, quint32 input, quint32 channel, uchar value, const QString &) +void Loopback::sendFeedBack(quint32 universe, quint32 input, quint32 channel, uchar value, const QVariant &) { if (!m_inputMap.contains(input)) return; diff --git a/plugins/loopback/src/loopback.h b/plugins/loopback/src/loopback.h index 546e0bb323..cc3979e875 100644 --- a/plugins/loopback/src/loopback.h +++ b/plugins/loopback/src/loopback.h @@ -86,7 +86,7 @@ class QLC_DECLSPEC Loopback : public QLCIOPlugin QString inputInfo(quint32 input); /** @reimp */ - void sendFeedBack(quint32 universe, quint32 input, quint32 channel, uchar value, const QString& key); + void sendFeedBack(quint32 universe, quint32 input, quint32 channel, uchar value, const QVariant ¶ms); private: //! loopback line -> channel data diff --git a/plugins/midi/src/common/midiplugin.cpp b/plugins/midi/src/common/midiplugin.cpp index 452a690b7d..8d04c9ba8b 100644 --- a/plugins/midi/src/common/midiplugin.cpp +++ b/plugins/midi/src/common/midiplugin.cpp @@ -66,7 +66,7 @@ QString MidiPlugin::name() int MidiPlugin::capabilities() const { - return QLCIOPlugin::Output | QLCIOPlugin::Input | QLCIOPlugin::Feedback; + return QLCIOPlugin::Output | QLCIOPlugin::Input | QLCIOPlugin::Feedback | QLCIOPlugin::Beats; } /***************************************************************************** @@ -285,7 +285,7 @@ QString MidiPlugin::inputInfo(quint32 input) return str; } -void MidiPlugin::sendFeedBack(quint32 universe, quint32 output, quint32 channel, uchar value, const QString &) +void MidiPlugin::sendFeedBack(quint32 universe, quint32 output, quint32 channel, uchar value, const QVariant ¶ms) { Q_UNUSED(universe) @@ -297,7 +297,11 @@ void MidiPlugin::sendFeedBack(quint32 universe, quint32 output, quint32 channel, qDebug() << "[sendFeedBack] Dev:" << dev->name() << ", channel:" << channel << ", value:" << value << dev->sendNoteOff(); uchar cmd = 0; uchar data1 = 0, data2 = 0; - if (QLCMIDIProtocol::feedbackToMidi(channel, value, dev->midiChannel(), dev->sendNoteOff(), + int midiChannel = dev->midiChannel(); + if (params.isValid() && params.toInt() >= 0) + midiChannel += params.toInt(); + + if (QLCMIDIProtocol::feedbackToMidi(channel, value, midiChannel, dev->sendNoteOff(), &cmd, &data1, &data2) == true) { qDebug() << "[sendFeedBack] cmd:" << cmd << "data1:" << data1 << "data2:" << data2; @@ -330,7 +334,8 @@ void MidiPlugin::slotValueChanged(const QVariant& uid, ushort channel, uchar val MidiInputDevice* dev = m_enumerator->inputDevices().at(i); if (dev->uid() == uid) { - emit valueChanged(UINT_MAX, i, channel, value); + emit valueChanged(UINT_MAX, i, channel, value, + channel == CHANNEL_OFFSET_MBC_BEAT ? "beat" : ""); break; } } diff --git a/plugins/midi/src/common/midiplugin.h b/plugins/midi/src/common/midiplugin.h index cb00cc2415..b9764d53c8 100644 --- a/plugins/midi/src/common/midiplugin.h +++ b/plugins/midi/src/common/midiplugin.h @@ -110,7 +110,7 @@ class MidiPlugin : public QLCIOPlugin QString inputInfo(quint32 input); /** @reimp */ - void sendFeedBack(quint32 universe, quint32 output, quint32 channel, uchar value, const QString& key); + void sendFeedBack(quint32 universe, quint32 output, quint32 channel, uchar value, const QVariant ¶ms); void sendSysEx(quint32 output, const QByteArray &data); diff --git a/plugins/os2l/os2lplugin.cpp b/plugins/os2l/os2lplugin.cpp index 7c18228ed6..75850d3f9b 100644 --- a/plugins/os2l/os2lplugin.cpp +++ b/plugins/os2l/os2lplugin.cpp @@ -48,7 +48,7 @@ QString OS2LPlugin::name() int OS2LPlugin::capabilities() const { - return QLCIOPlugin::Input | QLCIOPlugin::Feedback; + return QLCIOPlugin::Input | QLCIOPlugin::Feedback | QLCIOPlugin::Beats; } QString OS2LPlugin::pluginInfo() @@ -127,23 +127,6 @@ QString OS2LPlugin::inputInfo(quint32 input) return str; } -void OS2LPlugin::sendFeedBack(quint32 universe, quint32 output, quint32 channel, uchar value, const QString &key) -{ - Q_UNUSED(universe) - Q_UNUSED(output) - Q_UNUSED(channel) - Q_UNUSED(value) - Q_UNUSED(key) - - /** - * If the device support this feature, this is the method to send data back for - * visual feedback. - * To implement such method, the plugin must have an input line corresponding - * to the specified output line. - * Basically feedback data must return to the same line where it came from - */ -} - quint32 OS2LPlugin::universe() const { return m_inputUniverse; diff --git a/plugins/os2l/os2lplugin.h b/plugins/os2l/os2lplugin.h index 99ec246584..5c1ec5457c 100644 --- a/plugins/os2l/os2lplugin.h +++ b/plugins/os2l/os2lplugin.h @@ -70,9 +70,6 @@ class OS2LPlugin : public QLCIOPlugin /** @reimp */ QString inputInfo(quint32 input); - /** @reimp */ - void sendFeedBack(quint32 universe, quint32 output, quint32 channel, uchar value, const QString& key); - quint32 universe() const; protected: diff --git a/plugins/osc/oscplugin.cpp b/plugins/osc/oscplugin.cpp index e807898b80..d3ce296b92 100644 --- a/plugins/osc/oscplugin.cpp +++ b/plugins/osc/oscplugin.cpp @@ -293,14 +293,14 @@ QString OSCPlugin::inputInfo(quint32 input) } void OSCPlugin::sendFeedBack(quint32 universe, quint32 input, - quint32 channel, uchar value, const QString &key) + quint32 channel, uchar value, const QVariant ¶ms) { if (input >= (quint32)m_IOmapping.count()) return; OSCController *controller = m_IOmapping[input].controller; if (controller != NULL) - controller->sendFeedback(universe, channel, value, key); + controller->sendFeedback(universe, channel, value, params.toString()); } /********************************************************************* diff --git a/plugins/osc/oscplugin.h b/plugins/osc/oscplugin.h index 87f0db73b0..6050db1c1c 100644 --- a/plugins/osc/oscplugin.h +++ b/plugins/osc/oscplugin.h @@ -108,7 +108,7 @@ class OSCPlugin : public QLCIOPlugin QString inputInfo(quint32 input); /** @reimp */ - void sendFeedBack(quint32 universe, quint32 input, quint32 channel, uchar value, const QString& key); + void sendFeedBack(quint32 universe, quint32 input, quint32 channel, uchar value, const QVariant ¶ms); /********************************************************************* * Configuration diff --git a/plugins/uart/uartplugin.cpp b/plugins/uart/uartplugin.cpp index c4ef329617..d6fbd8918b 100644 --- a/plugins/uart/uartplugin.cpp +++ b/plugins/uart/uartplugin.cpp @@ -130,6 +130,7 @@ QString UARTPlugin::outputInfo(quint32 output) void UARTPlugin::writeUniverse(quint32 universe, quint32 output, const QByteArray &data, bool dataChanged) { Q_UNUSED(universe) + Q_UNUSED(dataChanged) if (output < quint32(m_widgets.count())) m_widgets.at(output)->writeUniverse(data); @@ -184,20 +185,3 @@ QString UARTPlugin::inputInfo(quint32 input) return str; } - -void UARTPlugin::sendFeedBack(quint32 universe, quint32 output, quint32 channel, uchar value, const QString &key) -{ - Q_UNUSED(universe) - Q_UNUSED(output) - Q_UNUSED(channel) - Q_UNUSED(value) - Q_UNUSED(key) - - /** - * If the device support this feature, this is the method to send data back for - * visual feedback. - * To implement such method, the plugin must have an input line corresponding - * to the specified output line. - * Basically feedback data must return to the same line where it came from - */ -} diff --git a/plugins/uart/uartplugin.h b/plugins/uart/uartplugin.h index 02d6892bd3..1db50cc366 100644 --- a/plugins/uart/uartplugin.h +++ b/plugins/uart/uartplugin.h @@ -85,9 +85,6 @@ class UARTPlugin : public QLCIOPlugin /** @reimp */ QString inputInfo(quint32 input); - - /** @reimp */ - void sendFeedBack(quint32 universe, quint32 output, quint32 channel, uchar value, const QString& key); }; #endif diff --git a/plugins/uart/uartwidget.cpp b/plugins/uart/uartwidget.cpp index d2e5ee34fd..1e5a1522d4 100644 --- a/plugins/uart/uartwidget.cpp +++ b/plugins/uart/uartwidget.cpp @@ -18,7 +18,7 @@ */ #include -#include +#include #include #include @@ -141,7 +141,7 @@ void UARTWidget::run() int frameTime = (int) floor(((double)1000 / 30) + (double)0.5); m_granularity = Bad; - QTime time; + QElapsedTimer time; time.start(); usleep(1000); if (time.elapsed() <= 3) diff --git a/qlc.pro b/qlc.pro index fe7a4452bd..6ae1c69626 100644 --- a/qlc.pro +++ b/qlc.pro @@ -47,7 +47,9 @@ win32:coverage.commands = @echo Get a better OS. # Translations translations.target = translate -QMAKE_EXTRA_TARGETS += translations +!android: { + QMAKE_EXTRA_TARGETS += translations +} qmlui: { translations.commands += ./translate.sh "qmlui" } else { @@ -59,7 +61,9 @@ appimage: { } else { translations.path = $$INSTALLROOT/$$TRANSLATIONDIR } -INSTALLS += translations +!android: { + INSTALLS += translations +} QMAKE_DISTCLEAN += $$translations.files # run diff --git a/qmlui/CMakeLists.txt b/qmlui/CMakeLists.txt index ad1e0bf867..cf26f1828c 100644 --- a/qmlui/CMakeLists.txt +++ b/qmlui/CMakeLists.txt @@ -19,7 +19,7 @@ else() qt5_add_translation(QM_FILES ${TS_FILES}) endif() -add_executable(${module_name} WIN32 MACOSX_BUNDLE +set(SRC_FILES app.cpp app.h audioeditor.cpp audioeditor.h chasereditor.cpp chasereditor.h @@ -63,6 +63,8 @@ add_executable(${module_name} WIN32 MACOSX_BUNDLE uimanager.cpp uimanager.h videoeditor.cpp videoeditor.h videoprovider.cpp videoprovider.h + virtualconsole/vcanimation.cpp virtualconsole/vcanimation.h + virtualconsole/vcaudiotrigger.cpp virtualconsole/vcaudiotrigger.h virtualconsole/vcbutton.cpp virtualconsole/vcbutton.h virtualconsole/vcclock.cpp virtualconsole/vcclock.h virtualconsole/vccuelist.cpp virtualconsole/vccuelist.h @@ -72,10 +74,26 @@ add_executable(${module_name} WIN32 MACOSX_BUNDLE virtualconsole/vcslider.cpp virtualconsole/vcslider.h virtualconsole/vcsoloframe.cpp virtualconsole/vcsoloframe.h virtualconsole/vcwidget.cpp virtualconsole/vcwidget.h + virtualconsole/vcxypad.cpp virtualconsole/vcxypad.h + virtualconsole/vcspeeddial.cpp virtualconsole/vcspeeddial.h virtualconsole/virtualconsole.cpp virtualconsole/virtualconsole.h - ${QM_FILES} ) +if(ANDROID) + add_library(${module_name} SHARED + ${SRC_FILES} + ${QM_FILES} + ) + set_target_properties( + ${module_name} + PROPERTIES LIBRARY_OUTPUT_NAME qlcplus) +else() + add_executable(${module_name} WIN32 MACOSX_BUNDLE + ${SRC_FILES} + ${QM_FILES} + ) +endif() + if(WIN32) target_sources(${module_name} PRIVATE qmlui.rc @@ -111,6 +129,17 @@ target_link_libraries(${module_name} PRIVATE qlcplusengine ) +if(ANDROID) + target_link_libraries(${module_name} PRIVATE + Qt${QT_MAJOR_VERSION}::Concurrent + Qt${QT_MAJOR_VERSION}::OpenGL + GLESv2 + log + z + c++_shared + ) +endif() + if(lupdate_only) target_sources(${module_name} PRIVATE qml/*.qml diff --git a/qmlui/contextmanager.cpp b/qmlui/contextmanager.cpp index b06952bf70..a5752e4b49 100644 --- a/qmlui/contextmanager.cpp +++ b/qmlui/contextmanager.cpp @@ -1381,6 +1381,8 @@ void ContextManager::slotNewFixtureCreated(quint32 fxID, qreal x, qreal y, qreal qDebug() << "[ContextManager] New fixture created" << fxID; + if (m_uniGridView->isEnabled()) + m_monProps->setFixturePosition(fxID, 0, 0, QVector3D(0, 0, 0)); if (m_DMXView->isEnabled()) m_DMXView->createFixtureItem(fxID); if (m_2DView->isEnabled()) @@ -1626,6 +1628,9 @@ void ContextManager::slotUniverseWritten(quint32 idx, const QByteArray &ua) void ContextManager::slotFunctionEditingChanged(bool status) { + if (status == m_editingEnabled) + return; + resetFixtureSelection(); m_editingEnabled = status; } @@ -1643,7 +1648,7 @@ void ContextManager::setDumpValue(quint32 fxID, quint32 channel, uchar value, bo currentVal.setValue(SceneValue(fxID, channel, currDmxValue)); newVal.setValue(sValue); - if (currentVal != newVal || value != currDmxValue) + //if (currentVal != newVal || value != currDmxValue) { if (output) { diff --git a/qmlui/fixtureeditor/editorview.cpp b/qmlui/fixtureeditor/editorview.cpp index 5c864bc272..307a71fb61 100644 --- a/qmlui/fixtureeditor/editorview.cpp +++ b/qmlui/fixtureeditor/editorview.cpp @@ -374,6 +374,24 @@ QString EditorView::checkFixture() errors.append(tr("
  • Empty capability description provided in channel '%1'
  • ").arg(channel->name())); } } + + for (QLCFixtureMode *mode : m_fixtureDef->modes()) + { + if (mode->name().isEmpty()) + errors.append(tr("
  • Empty mode name provided
  • ")); + + if (mode->channels().count() == 0) + errors.append(tr("
  • Mode '%1' has no channels defined
  • ").arg(mode->name())); + + quint32 chIndex = 0; + for (QLCChannel *channel : mode->channels()) + { + + if (mode->channelActsOn(chIndex) == chIndex) + errors.append(tr("
  • In mode '%1', channel '%2' cannot act on itself
  • ").arg(mode->name(), channel->name())); + chIndex++; + } + } } if (m_fixtureDef->modes().count() == 0) diff --git a/qmlui/fixtureeditor/modeedit.cpp b/qmlui/fixtureeditor/modeedit.cpp index f30e235c6f..cead486ac2 100644 --- a/qmlui/fixtureeditor/modeedit.cpp +++ b/qmlui/fixtureeditor/modeedit.cpp @@ -100,6 +100,33 @@ bool ModeEdit::deleteChannel(QLCChannel *channel) return res; } +QStringList ModeEdit::actsOnChannels() +{ + QStringList list; + list << "-"; + + for (QLCChannel *channel : m_mode->channels()) + list << channel->name(); + + return list; +} + +int ModeEdit::actsOnChannel(int index) +{ + quint32 actsOnChannelIndex = m_mode->channelActsOn(index); + + if (actsOnChannelIndex != QLCChannel::invalid()) + return actsOnChannelIndex + 1; + else + return 0; +} + +void ModeEdit::setActsOnChannel(int sourceIndex, int destIndex) +{ + quint32 actsOnChannel = destIndex == 0 ? QLCChannel::invalid() : destIndex - 1; + m_mode->setChannelActsOn(sourceIndex, actsOnChannel); +} + void ModeEdit::updateChannelList() { m_channelList->clear(); @@ -113,6 +140,7 @@ void ModeEdit::updateChannelList() } emit channelsChanged(); + emit actsOnChannelsChanged(); } /************************************************************************ diff --git a/qmlui/fixtureeditor/modeedit.h b/qmlui/fixtureeditor/modeedit.h index 8fd9341397..ef6ebbd18a 100644 --- a/qmlui/fixtureeditor/modeedit.h +++ b/qmlui/fixtureeditor/modeedit.h @@ -37,6 +37,7 @@ class ModeEdit : public QObject Q_PROPERTY(QVariant heads READ heads NOTIFY headsChanged) Q_PROPERTY(bool useGlobalPhysical READ useGlobalPhysical CONSTANT) Q_PROPERTY(PhysicalEdit *physical READ physical CONSTANT) + Q_PROPERTY(QStringList actsOnChannels READ actsOnChannels NOTIFY actsOnChannelsChanged) public: ModeEdit(QLCFixtureMode *mode, QObject *parent = nullptr); @@ -73,11 +74,20 @@ class ModeEdit : public QObject /** Delete the given $channel from the mode being edited */ Q_INVOKABLE bool deleteChannel(QLCChannel *channel); + /** Return a simple list with the possible channels to act on */ + QStringList actsOnChannels(); + + /** Return the channel where channel at $index acts on */ + Q_INVOKABLE int actsOnChannel(int index); + + Q_INVOKABLE void setActsOnChannel(int sourceIndex, int destIndex); + private: void updateChannelList(); signals: void channelsChanged(); + void actsOnChannelsChanged(); private: /** Reference to a channel list usable in QML */ diff --git a/qmlui/fixturemanager.cpp b/qmlui/fixturemanager.cpp index 5c8f6201d6..0cb0f0a2bd 100644 --- a/qmlui/fixturemanager.cpp +++ b/qmlui/fixturemanager.cpp @@ -274,7 +274,7 @@ bool FixtureManager::addFixture(QString manuf, QString model, QString mode, QStr { Fixture *fxi = new Fixture(m_doc); //quint32 fxAddress = address + (i * channels) + (i * gap); - if (fxAddress + channels >= UNIVERSE_SIZE) + if (fxAddress + channels > UNIVERSE_SIZE) { uniIdx++; if (m_doc->inputOutputMap()->getUniverseID(uniIdx) == m_doc->inputOutputMap()->invalidUniverse()) @@ -1054,6 +1054,9 @@ void FixtureManager::slotFixtureAdded(quint32 id, QVector3D pos) else { Fixture *fixture = m_doc->fixture(id); + if (fixture == nullptr) + return; + QStringList uniNames = m_doc->inputOutputMap()->universeNames(); QString universeName = uniNames.at(fixture->universe()); int matchMask = 0; diff --git a/qmlui/inputoutputmanager.cpp b/qmlui/inputoutputmanager.cpp index 1b2e3a813a..5e244b7587 100644 --- a/qmlui/inputoutputmanager.cpp +++ b/qmlui/inputoutputmanager.cpp @@ -93,6 +93,20 @@ QStringList InputOutputManager::universeNames() const return m_ioMap->universeNames(); } +QString InputOutputManager::universeName(quint32 universeId) +{ + if (universeId == Universe::invalid()) + return tr("All universes"); + else + { + Universe *uni = m_ioMap->universe(universeId); + if (uni != nullptr) + return uni->name(); + } + + return QString(); +} + QVariant InputOutputManager::universesListModel() const { QVariantList universesList; @@ -718,20 +732,20 @@ QVariant InputOutputManager::beatGeneratorsList() internalMap.insert("privateName", ""); genList.append(internalMap); - // add the currently open MIDI input devices + // add the currently open input devices that support beats foreach (Universe *uni, m_ioMap->universes()) { InputPatch *ip = uni->inputPatch(); - if (ip == nullptr || ip->pluginName() != "MIDI") + if (ip == nullptr || (ip->plugin()->capabilities() & QLCIOPlugin::Beats) == 0) continue; - QVariantMap midiInMap; - midiInMap.insert("type", "MIDI"); - midiInMap.insert("name", ip->inputName()); - midiInMap.insert("uni", uni->id()); - midiInMap.insert("line", ip->input()); - midiInMap.insert("privateName", ""); - genList.append(midiInMap); + QVariantMap pluginMap; + pluginMap.insert("type", "PLUGIN"); + pluginMap.insert("name", ip->inputName()); + pluginMap.insert("uni", uni->id()); + pluginMap.insert("line", ip->input()); + pluginMap.insert("privateName", ip->pluginName()); + genList.append(pluginMap); } // add the currently selected audio input device @@ -789,8 +803,8 @@ void InputOutputManager::setBeatType(QString beatType) if (m_beatType == "INTERNAL") m_ioMap->setBeatGeneratorType(InputOutputMap::Internal); - else if (m_beatType == "MIDI") - m_ioMap->setBeatGeneratorType(InputOutputMap::MIDI); + else if (m_beatType == "PLUGIN") + m_ioMap->setBeatGeneratorType(InputOutputMap::Plugin); else if (m_beatType == "AUDIO") m_ioMap->setBeatGeneratorType(InputOutputMap::Audio); else @@ -806,7 +820,7 @@ void InputOutputManager::slotBeatTypeChanged() switch(m_ioMap->beatGeneratorType()) { case InputOutputMap::Internal: m_beatType = "INTERNAL"; break; - case InputOutputMap::MIDI: m_beatType = "MIDI"; break; + case InputOutputMap::Plugin: m_beatType = "PLUGIN"; break; case InputOutputMap::Audio: m_beatType = "AUDIO"; break; case InputOutputMap::Disabled: default: diff --git a/qmlui/inputoutputmanager.h b/qmlui/inputoutputmanager.h index 5445e137c9..4bac8c40ee 100644 --- a/qmlui/inputoutputmanager.h +++ b/qmlui/inputoutputmanager.h @@ -70,6 +70,7 @@ protected slots: public: QVariant universes(); QStringList universeNames() const; + Q_INVOKABLE QString universeName(quint32 universeId); QVariant universesListModel() const; /** Get/Set the currently selected universe index */ diff --git a/qmlui/js/FixtureDrag.js b/qmlui/js/FixtureDrag.js index ba38ec72f0..4563ced4a4 100644 --- a/qmlui/js/FixtureDrag.js +++ b/qmlui/js/FixtureDrag.js @@ -87,21 +87,19 @@ function handleDrag(mouse) function endDrag(mouse) { if (draggedItem == null) - { return; - } var currContext = previewLoader.item.contextName; var offset = 0; - console.log("Current context: " + currContext); + console.log("[FixtureDrag] Current context: " + currContext); + if (currContext === "2D") - { offset = View2D.gridPosition.x; - } + var x = draggedItem.x - leftSidePanel.width - offset; var y = draggedItem.y - previewLoader.y - viewToolbar.height; - console.log("Item x: " + x + ", y: " + y); + console.log("[FixtureDrag] Item x: " + x + ", y: " + y); if (x >= 0 && y >= 0) { diff --git a/qmlui/js/GenericHelpers.js b/qmlui/js/GenericHelpers.js index 0f317b16e5..051c9ff385 100644 --- a/qmlui/js/GenericHelpers.js +++ b/qmlui/js/GenericHelpers.js @@ -19,7 +19,7 @@ function pluginIconFromName(name) { - switch(name) + switch (name) { case "ArtNet": return "qrc:/artnetplugin.svg"; case "DMX USB": return "qrc:/dmxusbplugin.svg"; diff --git a/qmlui/main.cpp b/qmlui/main.cpp index 005418dee6..391cf6c78e 100644 --- a/qmlui/main.cpp +++ b/qmlui/main.cpp @@ -99,6 +99,7 @@ int main(int argc, char *argv[]) parser.process(app); +#if !defined Q_OS_ANDROID if (!parser.isSet(threedSupportOption)) { QSurfaceFormat format; @@ -107,7 +108,7 @@ int main(int argc, char *argv[]) format.setProfile(QSurfaceFormat::CoreProfile); QSurfaceFormat::setDefaultFormat(format); } - +#endif if (parser.isSet(debugOption)) qInstallMessageHandler(debugMessageHandler); diff --git a/qmlui/mainview3d.cpp b/qmlui/mainview3d.cpp index 6bcf45a857..cc1d8c0a02 100644 --- a/qmlui/mainview3d.cpp +++ b/qmlui/mainview3d.cpp @@ -90,6 +90,8 @@ MainView3D::MainView3D(QQuickView *view, Doc *doc, QObject *parent) QStringList listRoles; listRoles << "itemID" << "name" << "isSelected"; m_genericItemsList->setRoleNames(listRoles); + + resetCameraPosition(); } MainView3D::~MainView3D() @@ -164,13 +166,11 @@ void MainView3D::resetItems() { it.next(); SceneItem *e = it.value(); - //if (e->m_headItem) - // delete e->m_headItem; - //if (e->m_armItem) - // delete e->m_armItem; delete e->m_goboTexture; - // delete e->m_rootItem; // TODO: with this -> segfault delete e->m_selectionBox; + // delete e->m_rootItem; // TODO: with this -> segfault + e->m_rootItem->setProperty("enabled", false); // workaround for the above + delete e; } //const auto end = m_entitiesMap.end(); @@ -196,6 +196,52 @@ void MainView3D::resetItems() setFrameCountEnabled(false); } +void MainView3D::resetCameraPosition() +{ + setCameraPosition(QVector3D(0.0, 3.0, 7.5)); + setCameraUpVector(QVector3D(0.0, 1.0, 0.0)); + setCameraViewCenter(QVector3D(0.0, 1.0, 0.0)); +} + +QVector3D MainView3D::cameraPosition() const +{ + return m_cameraPosition; +} + +void MainView3D::setCameraPosition(const QVector3D &newCameraPosition) +{ + if (m_cameraPosition == newCameraPosition) + return; + m_cameraPosition = newCameraPosition; + emit cameraPositionChanged(); +} + +QVector3D MainView3D::cameraUpVector() const +{ + return m_cameraUpVector; +} + +void MainView3D::setCameraUpVector(const QVector3D &newCameraUpVector) +{ + if (m_cameraUpVector == newCameraUpVector) + return; + m_cameraUpVector = newCameraUpVector; + emit cameraUpVectorChanged(); +} + +QVector3D MainView3D::cameraViewCenter() const +{ + return m_cameraViewCenter; +} + +void MainView3D::setCameraViewCenter(const QVector3D &newCameraViewCenter) +{ + if (m_cameraViewCenter == newCameraViewCenter) + return; + m_cameraViewCenter = newCameraViewCenter; + emit cameraViewCenterChanged(); +} + QString MainView3D::meshDirectory() const { QDir dir = QDir::cleanPath(QLCFile::systemDirectory(MESHESDIR).path()); @@ -1454,8 +1500,11 @@ void MainView3D::removeFixtureItem(quint32 itemID) SceneItem *mesh = m_entitiesMap.take(itemID); - delete mesh->m_rootItem; + delete mesh->m_goboTexture; delete mesh->m_selectionBox; + delete mesh->m_rootTransform; +// delete mesh->m_rootItem; // this will cause a segfault + mesh->m_rootItem->setProperty("enabled", false); // workaround for the above delete mesh; } diff --git a/qmlui/mainview3d.h b/qmlui/mainview3d.h index 477a3366b1..961360aece 100644 --- a/qmlui/mainview3d.h +++ b/qmlui/mainview3d.h @@ -94,6 +94,10 @@ class MainView3D : public PreviewContext { Q_OBJECT + Q_PROPERTY(QVector3D cameraPosition READ cameraPosition WRITE setCameraPosition NOTIFY cameraPositionChanged FINAL) + Q_PROPERTY(QVector3D cameraUpVector READ cameraUpVector WRITE setCameraUpVector NOTIFY cameraUpVectorChanged FINAL) + Q_PROPERTY(QVector3D cameraViewCenter READ cameraViewCenter WRITE setCameraViewCenter NOTIFY cameraViewCenterChanged FINAL) + Q_PROPERTY(RenderQuality renderQuality READ renderQuality WRITE setRenderQuality NOTIFY renderQualityChanged) Q_PROPERTY(QString meshDirectory READ meshDirectory CONSTANT) Q_PROPERTY(QStringList stagesList READ stagesList CONSTANT) @@ -123,8 +127,24 @@ class MainView3D : public PreviewContext /** @reimp */ void setUniverseFilter(quint32 universeFilter); + /** Cleanup all the items in the scene */ void resetItems(); + /** Reset the camera position to initial values */ + void resetCameraPosition(); + + /** Get set the scene camera position */ + QVector3D cameraPosition() const; + void setCameraPosition(const QVector3D &newCameraPosition); + + /** Get set the scene camera position */ + QVector3D cameraUpVector() const; + void setCameraUpVector(const QVector3D &newCameraUpVector); + + /** Get set the scene camera position */ + QVector3D cameraViewCenter() const; + void setCameraViewCenter(const QVector3D &newCameraViewCenter); + protected: /** Returns a string with the mesh location, suitable to be used by QML */ QString meshDirectory() const; @@ -135,6 +155,11 @@ public slots: /** @reimp */ void slotRefreshView(); +signals: + void cameraPositionChanged(); + void cameraUpVectorChanged(); + void cameraViewCenterChanged(); + private: /** Reference to the Doc Monitor properties */ MonitorProperties *m_monProps; @@ -147,6 +172,10 @@ public slots: QQmlComponent *m_fillGBufferLayer; int m_createItemCount; + QVector3D m_cameraPosition; + QVector3D m_cameraUpVector; + QVector3D m_cameraViewCenter; + /********************************************************************* * Frame counter *********************************************************************/ diff --git a/qmlui/mainviewdmx.cpp b/qmlui/mainviewdmx.cpp index a1aae20cc0..6084f5955b 100644 --- a/qmlui/mainviewdmx.cpp +++ b/qmlui/mainviewdmx.cpp @@ -103,6 +103,9 @@ void MainViewDMX::createFixtureItem(quint32 fxID) MonitorProperties *monProps = m_doc->monitorProperties(); quint32 itemFlags = monProps->fixtureFlags(fxID, 0, 0); + if (monProps->containsFixture(fxID) == false) + monProps->setFixturePosition(fxID, 0, 0, QVector3D(0, 0, 0)); + newFixtureItem->setParentItem(contextItem()); newFixtureItem->setProperty("fixtureObj", QVariant::fromValue(fixture)); if (itemFlags & MonitorProperties::HiddenFlag) diff --git a/qmlui/qml/ActionsMenu.qml b/qmlui/qml/ActionsMenu.qml index cc0f53c6bf..3d43d00fb4 100644 --- a/qmlui/qml/ActionsMenu.qml +++ b/qmlui/qml/ActionsMenu.qml @@ -161,6 +161,7 @@ Popup border.width: 1 border.color: UISettings.bgStronger color: UISettings.bgStrong + height: actionsMenuEntries.height } Column @@ -307,6 +308,7 @@ Popup ContextMenuEntry { Layout.fillWidth: true + Layout.fillHeight: true imgSource: "qrc:/undo.svg" entryText: qsTr("Undo") onEntered: submenuItem = null @@ -320,6 +322,7 @@ Popup ContextMenuEntry { Layout.fillWidth: true + Layout.fillHeight: true imgSource: "qrc:/redo.svg" entryText: qsTr("Redo") onEntered: submenuItem = null diff --git a/qmlui/qml/BeatGeneratorsPanel.qml b/qmlui/qml/BeatGeneratorsPanel.qml index 6c2a4b9d59..2e9acfa967 100644 --- a/qmlui/qml/BeatGeneratorsPanel.qml +++ b/qmlui/qml/BeatGeneratorsPanel.qml @@ -20,6 +20,8 @@ import QtQuick 2.6 import QtQuick.Controls 2.1 import QtQuick.Layouts 1.1 + +import "GenericHelpers.js" as Helpers import "." Rectangle @@ -89,6 +91,7 @@ Rectangle width: parent.width height: UISettings.bigItemHeight * 2 + clip: true boundsBehavior: Flickable.StopAtBounds delegate: @@ -99,11 +102,11 @@ Rectangle Component.onCompleted: { - if (modelData.type === "MIDI") + if (modelData.type === "PLUGIN") { iconBox.color = "white" iconBox.visible = true - genIcon.source = "qrc:/midiplugin.svg" + genIcon.source = Helpers.pluginIconFromName(modelData.privateName) } else if (modelData.type === "AUDIO") { @@ -151,6 +154,7 @@ Rectangle { id: keyPadBox width: parent.width + height: UISettings.iconSizeDefault * 6 showDMXcontrol: false showTapButton: true visible: ioManager.beatType === "INTERNAL" diff --git a/qmlui/qml/ChannelToolLoader.qml b/qmlui/qml/ChannelToolLoader.qml index 011b41d81a..c00368254f 100644 --- a/qmlui/qml/ChannelToolLoader.qml +++ b/qmlui/qml/ChannelToolLoader.qml @@ -23,10 +23,10 @@ import QtQuick.Controls 2.5 import org.qlcplus.classes 1.0 import "." -Popup +Item { - id: popupRoot - padding: 0 + id: itemRoot + visible: false property int fixtureId: -1 property int channelType: -1 @@ -39,13 +39,14 @@ Popup function loadChannelTool(cItem, fxId, chIdx, val) { channelType = fixtureManager.channelType(fxId, chIdx) + if (channelType === QLCChannel.NoGroup || channelType === QLCChannel.Nothing) return var map = cItem.mapToItem(parent, cItem.x, cItem.y) toolLoader.source = "" - x = map.x - yPos = map.y + x = map.x + UISettings.iconSizeMedium + y = map.y fixtureId = fxId channelIndex = chIdx channelValue = val @@ -59,7 +60,6 @@ Popup case QLCChannel.Tilt: toolLoader.source = "qrc:/SingleAxisTool.qml" break - case QLCChannel.Colour: case QLCChannel.Gobo: case QLCChannel.Speed: @@ -82,34 +82,35 @@ Popup onLoaded: { - popupRoot.y = popupRoot.yPos - height - popupRoot.width = width - popupRoot.height = height + itemRoot.width = width + itemRoot.height = height item.showPalette = false - //item.closeOnSelect = true - - popupRoot.open() + if (item.hasOwnProperty('dragTarget')) + item.dragTarget = itemRoot if (channelType >= 0xFF) { - item.currentValue = popupRoot.channelValue - item.targetColor = popupRoot.channelType + item.currentValue = itemRoot.channelValue + item.targetColor = itemRoot.channelType } else if (channelType == QLCChannel.Intensity) { - item.currentValue = popupRoot.channelValue + item.show(itemRoot.channelValue) } else if (channelType == QLCChannel.Pan || channelType == QLCChannel.Tilt) { - item.currentValue = popupRoot.channelValue - item.maxDegrees = fixtureManager.channelDegrees(popupRoot.fixtureId, popupRoot.channelIndex) + item.currentValue = itemRoot.channelValue + item.maxDegrees = fixtureManager.channelDegrees(itemRoot.fixtureId, itemRoot.channelIndex) } else { - item.updatePresets(fixtureManager.presetChannel(popupRoot.fixtureId, popupRoot.channelIndex)) + item.updatePresets(fixtureManager.presetChannel(itemRoot.fixtureId, itemRoot.channelIndex)) } + + item.closeOnSelect = true + itemRoot.visible = true } Connections @@ -118,7 +119,12 @@ Popup target: toolLoader.item function onValueChanged() { - popupRoot.valueChanged(popupRoot.fixtureId, popupRoot.channelIndex, target.currentValue) + itemRoot.valueChanged(itemRoot.fixtureId, itemRoot.channelIndex, target.currentValue) + } + function onClose() + { + itemRoot.visible = false + toolLoader.source = "" } } } diff --git a/qmlui/qml/ColorTool.qml b/qmlui/qml/ColorTool.qml index 7cbd048994..5f92b432a6 100644 --- a/qmlui/qml/ColorTool.qml +++ b/qmlui/qml/ColorTool.qml @@ -33,6 +33,7 @@ Rectangle color: UISettings.bgMedium property bool closeOnSelect: false + property var dragTarget: null property int colorsMask: 0 property color currentRGB property color currentWAUV @@ -164,7 +165,7 @@ Rectangle { Layout.fillWidth: true height: colorToolBar.height - drag.target: paletteBox.isEditing ? null : colorToolBox + drag.target: paletteBox.isEditing ? null : (colorToolBox.dragTarget ? colorToolBox.dragTarget : colorToolBox) } GenericButton { diff --git a/qmlui/qml/ColorToolFull.qml b/qmlui/qml/ColorToolFull.qml index 1d9af3b3aa..8bd92eb0ba 100644 --- a/qmlui/qml/ColorToolFull.qml +++ b/qmlui/qml/ColorToolFull.qml @@ -125,6 +125,7 @@ Rectangle bSpin.value = b*/ currentRGB = Qt.rgba(r / 255, g / 255, b / 255, 1.0) + colorChanged(currentRGB.r, currentRGB.g, currentRGB.b, currentWAUV.r, currentWAUV.g, currentWAUV.b) } onPressed: setPickedColor(mouse) diff --git a/qmlui/qml/ColorToolPrimary.qml b/qmlui/qml/ColorToolPrimary.qml index f3be683beb..5240ebe99e 100644 --- a/qmlui/qml/ColorToolPrimary.qml +++ b/qmlui/qml/ColorToolPrimary.qml @@ -38,6 +38,7 @@ Rectangle property bool showPalette: false signal valueChanged(int value) + signal close() Canvas { @@ -92,7 +93,8 @@ Rectangle { anchors.fill: parent - onClicked: { + function calculateValue(mouse) + { var val = 0 if (mouse.x < width * 0.1) @@ -112,6 +114,20 @@ Rectangle boxRoot.currentValue = val boxRoot.valueChanged(val) } + + onPressed: calculateValue() + onPositionChanged: + { + if (!pressed) + return + + calculateValue(mouse) + } + onReleased: + { + if (closeOnSelect) + boxRoot.close() + } } } } diff --git a/qmlui/qml/ExternalControlDelegate.qml b/qmlui/qml/ExternalControlDelegate.qml index ea01b2bc72..e7398a7963 100644 --- a/qmlui/qml/ExternalControlDelegate.qml +++ b/qmlui/qml/ExternalControlDelegate.qml @@ -155,7 +155,7 @@ Column Layout.fillWidth: true height: UISettings.listItemHeight visible: customFeedback - label: qsTr("Custom feedbacks") + label: qsTr("Custom feedback") color: UISettings.bgMedium } diff --git a/qmlui/qml/GenericMultiDragItem.qml b/qmlui/qml/GenericMultiDragItem.qml index e3ca4e4759..b354a9d6ee 100644 --- a/qmlui/qml/GenericMultiDragItem.qml +++ b/qmlui/qml/GenericMultiDragItem.qml @@ -1,6 +1,6 @@ /* Q Light Controller Plus - FunctionDragItem.qml + GenericMultiDragItem.qml Copyright (c) Massimo Callegari diff --git a/qmlui/qml/KeyPad.qml b/qmlui/qml/KeyPad.qml index 217e1db541..ffa0f51c0e 100644 --- a/qmlui/qml/KeyPad.qml +++ b/qmlui/qml/KeyPad.qml @@ -34,7 +34,7 @@ Rectangle property bool showDMXcontrol: true property bool showTapButton: false - + property alias commandString: commandBox.text property real itemHeight: Math.max(UISettings.iconSizeDefault, keyPadRoot.height / keyPadGrid.rows) - 3 @@ -109,15 +109,15 @@ Rectangle else { var currTime = new Date().getTime() - + if (lastTap != 0 && currTime - lastTap < 1500) { var newTime = currTime - lastTap - + tapHistory.push(newTime) tapTimeValue = TimeUtils.calculateBPMByTapIntervals(tapHistory) - + keyPadRoot.tapTimeChanged(tapTimeValue) tapTimer.interval = tapTimeValue tapTimer.restart() diff --git a/qmlui/qml/MainView.qml b/qmlui/qml/MainView.qml index 58ef1fc426..5204b48b1a 100644 --- a/qmlui/qml/MainView.qml +++ b/qmlui/qml/MainView.qml @@ -144,6 +144,7 @@ Rectangle MenuBarEntry { id: actEntry + Layout.alignment: Qt.AlignTop imgSource: "qrc:/qlcplus.svg" entryText: qsTr("Actions") onPressed: actionsMenu.open() @@ -165,6 +166,7 @@ Rectangle { id: fnfEntry property string ctxName: "FIXANDFUNC" + Layout.alignment: Qt.AlignTop property string ctxRes: "qrc:/FixturesAndFunctions.qml" imgSource: "qrc:/editor.svg" @@ -180,6 +182,7 @@ Rectangle MenuBarEntry { id: vcEntry + Layout.alignment: Qt.AlignTop property string ctxName: "VC" property string ctxRes: "qrc:/VirtualConsole.qml" @@ -201,6 +204,7 @@ Rectangle MenuBarEntry { id: sdEntry + Layout.alignment: Qt.AlignTop property string ctxName: "SDESK" property string ctxRes: "qrc:/SimpleDesk.qml" @@ -222,6 +226,7 @@ Rectangle MenuBarEntry { id: smEntry + Layout.alignment: Qt.AlignTop property string ctxName: "SHOWMGR" property string ctxRes: "qrc:/ShowManager.qml" @@ -243,6 +248,7 @@ Rectangle MenuBarEntry { id: ioEntry + Layout.alignment: Qt.AlignTop property string ctxName: "IOMGR" property string ctxRes: "qrc:/InputOutputManager.qml" @@ -265,7 +271,7 @@ Rectangle { // acts like an horizontal spacer Layout.fillWidth: true - height: parent.height + implicitHeight: parent.height color: "transparent" } RobotoText @@ -273,6 +279,9 @@ Rectangle label: "BPM: " + (ioManager.bpmNumber > 0 ? ioManager.bpmNumber : qsTr("Off")) color: gsMouseArea.containsMouse ? UISettings.bgLight : "transparent" fontSize: UISettings.textSizeDefault + Layout.alignment: Qt.AlignTop + implicitWidth: width + implicitHeight: parent.height MouseArea { @@ -294,8 +303,9 @@ Rectangle Rectangle { id: beatIndicator - width: height - height: parent.height * 0.5 + implicitWidth: height + implicitHeight: parent.height * 0.5 + Layout.alignment: Qt.AlignVCenter radius: height / 2 border.width: 2 border.color: "#333" @@ -324,8 +334,9 @@ Rectangle IconButton { id: stopAllButton - width: UISettings.iconSizeDefault - height: UISettings.iconSizeDefault + implicitWidth: UISettings.iconSizeDefault + implicitHeight: UISettings.iconSizeDefault + Layout.alignment: Qt.AlignTop enabled: runningCount ? true : false bgColor: "transparent" imgSource: "qrc:/stop.svg" diff --git a/qmlui/qml/QLCPlusKnob.qml b/qmlui/qml/QLCPlusKnob.qml index f9b1de0c46..f30cfffdf1 100644 --- a/qmlui/qml/QLCPlusKnob.qml +++ b/qmlui/qml/QLCPlusKnob.qml @@ -17,8 +17,8 @@ limitations under the License. */ -import QtQuick 2.0 -import QtQuick.Controls 2.0 +import QtQuick 2.14 +import QtQuick.Controls 2.14 import "CanvasDrawFunctions.js" as DrawFuncs import "." @@ -33,6 +33,8 @@ Dial from: 0 to: 255 + stepSize: 1.0 + wheelEnabled: true onPositionChanged: kCanvas.requestPaint() onHeightChanged: kCanvas.requestPaint() diff --git a/qmlui/qml/SimpleDesk.qml b/qmlui/qml/SimpleDesk.qml index a9570025a8..0f0beb57d5 100644 --- a/qmlui/qml/SimpleDesk.qml +++ b/qmlui/qml/SimpleDesk.qml @@ -46,6 +46,7 @@ Rectangle { anchors.fill: parent orientation: Qt.Vertical + z: 1 // Top view (faders) Rectangle @@ -254,7 +255,8 @@ Rectangle from: 0 to: 255 value: model.chValue - onMoved: { + onMoved: + { model.isOverride = true model.chValue = valueAt(position) simpleDesk.setValue(fixtureObj ? fixtureObj.id : -1, fixtureObj ? model.chIndex : index, model.chValue) @@ -274,7 +276,8 @@ Rectangle padding: 0 horizontalAlignment: Qt.AlignHCenter value: dmxValues ? model.chValue : (model.chValue / 255.0) * 100.0 - onValueModified: { + onValueModified: + { model.isOverride = true model.chValue = value * (dmxValues ? 1.0 : 2.55) simpleDesk.setValue(fixtureObj ? fixtureObj.id : -1, fixtureObj ? model.chIndex : index, model.chValue) diff --git a/qmlui/qml/SingleAxisTool.qml b/qmlui/qml/SingleAxisTool.qml index 965492cd8f..9d773934d0 100644 --- a/qmlui/qml/SingleAxisTool.qml +++ b/qmlui/qml/SingleAxisTool.qml @@ -39,6 +39,7 @@ Rectangle property bool showPalette: false signal valueChanged(int value) + signal close() GridLayout { @@ -60,6 +61,11 @@ Rectangle currentValue = Math.round((valueAt(position) * 255.0) / maxDegrees) boxRoot.valueChanged(currentValue) } + onPressedChanged: + { + if (!pressed && closeOnSelect) + boxRoot.close() + } } RobotoText diff --git a/qmlui/qml/TreeNodeDelegate.qml b/qmlui/qml/TreeNodeDelegate.qml index f421b52760..1b9f1bea3c 100644 --- a/qmlui/qml/TreeNodeDelegate.qml +++ b/qmlui/qml/TreeNodeDelegate.qml @@ -103,6 +103,7 @@ Column id: nodeLabel width: nodeBgRect.width - x - 1 text: cRef ? cRef.name : textLabel + originalText: text onTextConfirmed: nodeContainer.pathChanged(nodePath, text) } diff --git a/qmlui/qml/UISettingsEditor.qml b/qmlui/qml/UISettingsEditor.qml index 664a6b9595..7afe49446b 100644 --- a/qmlui/qml/UISettingsEditor.qml +++ b/qmlui/qml/UISettingsEditor.qml @@ -30,13 +30,16 @@ Rectangle anchors.fill: parent color: "transparent" - property real origItemHeight: UISettings.listItemHeight - property real origIconMedium: UISettings.iconSizeMedium + property real origItemHeight: { origItemHeight = UISettings.listItemHeight } + property real origIconMedium: { origIconMedium = UISettings.iconSizeMedium } + property real origTextSizeDefault: { origTextSizeDefault = UISettings.textSizeDefault} + property real origIconDefault: {origIconDefault = UISettings.iconSizeDefault} onVisibleChanged: { origItemHeight = UISettings.listItemHeight origIconMedium = UISettings.iconSizeMedium + origTextSizeDefault = UISettings.textSizeDefault sfRestore.origScaleFactor = qlcplus.uiScaleFactor } @@ -135,6 +138,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Scaling factor") } RowLayout @@ -153,6 +157,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: sfSlider.value.toFixed(2) + "x" } @@ -181,6 +186,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Background darker") } Loader @@ -199,6 +205,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Background dark") } Loader @@ -218,6 +225,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Background medium") } Loader @@ -236,6 +244,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Background light") } Loader @@ -255,6 +264,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Background lighter") } Loader @@ -273,6 +283,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Controls background") } Loader @@ -292,6 +303,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Foreground main") } Loader @@ -310,6 +322,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Foreground medium") } Loader @@ -329,6 +342,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Foreground light") } Loader @@ -347,6 +361,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Toolbar gradient start") } Loader @@ -366,6 +381,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Sub-toolbar gradient start") } Loader @@ -384,6 +400,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Toolbar gradient end") } Loader @@ -403,6 +420,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Toolbar hover gradient start") } Loader @@ -422,6 +440,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Toolbar hover gradient end") } Loader @@ -441,6 +460,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Toolbar selection") } Loader @@ -460,6 +480,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Sub-toolbar selection") } Loader @@ -479,6 +500,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Section header") } Loader @@ -497,6 +519,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Section header divider") } Loader @@ -516,6 +539,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Item highlight") } Loader @@ -534,6 +558,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Item highlight pressed") } Loader @@ -553,6 +578,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Item hover") } Loader @@ -571,6 +597,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Item selection") } Loader @@ -590,6 +617,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("VC Frame drop area") } Loader @@ -608,6 +636,7 @@ Rectangle RobotoText { height: origItemHeight + fontSize: origTextSizeDefault label: qsTr("Item dark border") } Loader @@ -628,6 +657,8 @@ Rectangle Layout.columnSpan: 4 Layout.alignment: Qt.AlignHCenter width: origIconMedium * 10 + height: origIconDefault + fontSize: origTextSizeDefault label: qsTr("Save to file") onClicked: { diff --git a/qmlui/qml/fixtureeditor/ModeEditor.qml b/qmlui/qml/fixtureeditor/ModeEditor.qml index d3e05b8e1d..1deab6a26f 100644 --- a/qmlui/qml/fixtureeditor/ModeEditor.qml +++ b/qmlui/qml/fixtureeditor/ModeEditor.qml @@ -294,10 +294,15 @@ Rectangle iSrc: mcDelegate.cRef ? mcDelegate.cRef.getIconNameFromGroup(mcDelegate.cRef.group, true) : "" } Rectangle { width: 1; height: UISettings.listItemHeight } + CustomComboBox { implicitWidth: UISettings.bigItemHeight * 2 height: UISettings.listItemHeight + model: mode ? mode.actsOnChannels : null + textRole: "" + currentIndex: mode ? mode.actsOnChannel(index) : -1 + onCurrentIndexChanged: if (mode) mode.setActsOnChannel(index, currentIndex) } } diff --git a/qmlui/qml/fixturesfunctions/3DView/3DView.qml b/qmlui/qml/fixturesfunctions/3DView/3DView.qml index 393f6fb2cb..c88a28baee 100644 --- a/qmlui/qml/fixturesfunctions/3DView/3DView.qml +++ b/qmlui/qml/fixturesfunctions/3DView/3DView.qml @@ -323,16 +323,6 @@ Rectangle objectName: "scene3DEntity" Component.onCompleted: contextManager.enableContext("3D", true, scene3d) -/* - OrbitCameraController - { - id: camController - camera: sceneEntity.camera - linearSpeed: 40.0 - lookSpeed: 300.0 - } -*/ - // Global elements Camera { @@ -343,9 +333,9 @@ Rectangle aspectRatio: viewSize.width / viewSize.height nearPlane: 1.0 farPlane: 1000.0 - position: Qt.vector3d(0.0, 3.0, 7.5) - upVector: Qt.vector3d(0.0, 1.0, 0.0) - viewCenter: Qt.vector3d(0.0, 1.0, 0.0) + position: View3D.cameraPosition + upVector: View3D.cameraUpVector + viewCenter: View3D.cameraViewCenter function setZoom(amount) { @@ -455,6 +445,10 @@ Rectangle viewCamera.panAboutViewCenter(-xDelta, Qt.vector3d(0, 1, 0)) if (!mouse.modifiers || (mouse.modifiers & Qt.ShiftModifier && direction == Qt.Vertical)) viewCamera.tiltAboutViewCenter(yDelta, Qt.vector3d(1, 0, 0)) + + View3D.cameraPosition = viewCamera.position + View3D.cameraUpVector = viewCamera.upVector + View3D.cameraViewCenter = viewCamera.viewCenter } else if (mouse.buttons === Qt.MiddleButton) // camera translation { @@ -462,6 +456,10 @@ Rectangle viewCamera.translate(Qt.vector3d(-xDelta / 100, 0, 0)) if (!mouse.modifiers || (mouse.modifiers & Qt.ShiftModifier && direction == Qt.Vertical)) viewCamera.translate(Qt.vector3d(0, yDelta / 100, 0)) + + View3D.cameraPosition = viewCamera.position + View3D.cameraUpVector = viewCamera.upVector + View3D.cameraViewCenter = viewCamera.viewCenter } startPoint = Qt.point(mouse.x, mouse.y) } diff --git a/qmlui/qml/fixturesfunctions/DMXView.qml b/qmlui/qml/fixturesfunctions/DMXView.qml index a4df0b86ab..f471b579d5 100644 --- a/qmlui/qml/fixturesfunctions/DMXView.qml +++ b/qmlui/qml/fixturesfunctions/DMXView.qml @@ -83,7 +83,7 @@ Rectangle } Component.onCompleted: contextManager.enableContext("DMX", true, flowLayout) - Component.onDestruction: if(contextManager) contextManager.enableContext("DMX", false, flowLayout) + Component.onDestruction: if (contextManager) contextManager.enableContext("DMX", false, flowLayout) } ScrollBar.vertical: CustomScrollBar { } diff --git a/qmlui/qml/fixturesfunctions/FixtureNodeDelegate.qml b/qmlui/qml/fixturesfunctions/FixtureNodeDelegate.qml index 9a44a25cd9..739e084412 100644 --- a/qmlui/qml/fixturesfunctions/FixtureNodeDelegate.qml +++ b/qmlui/qml/fixturesfunctions/FixtureNodeDelegate.qml @@ -132,6 +132,7 @@ Column id: nodeLabel Layout.fillWidth: true text: textLabel + originalText: text onTextConfirmed: { diff --git a/qmlui/qml/fixturesfunctions/FixtureProperties.qml b/qmlui/qml/fixturesfunctions/FixtureProperties.qml index 8633e93f17..e6a18e6cf4 100644 --- a/qmlui/qml/fixturesfunctions/FixtureProperties.qml +++ b/qmlui/qml/fixturesfunctions/FixtureProperties.qml @@ -18,7 +18,7 @@ */ import QtQuick 2.3 -import QtQuick.Controls 2.1 +import QtQuick.Controls 2.14 import QtQuick.Layouts 1.1 import "." diff --git a/qmlui/qml/fixturesfunctions/FixturesAndFunctions.qml b/qmlui/qml/fixturesfunctions/FixturesAndFunctions.qml index 2593da1142..69dac04182 100644 --- a/qmlui/qml/fixturesfunctions/FixturesAndFunctions.qml +++ b/qmlui/qml/fixturesfunctions/FixturesAndFunctions.qml @@ -135,6 +135,8 @@ Rectangle onCheckedChanged: loadContext(checked, "qrc:/UniverseGridView.qml", "UNIGRID") onRightClicked: { + if (checked) + dmxView.checked = true uniView.visible = false contextManager.detachContext("UNIGRID") } @@ -151,6 +153,8 @@ Rectangle onCheckedChanged: loadContext(checked, "qrc:/DMXView.qml", "DMX") onRightClicked: { + if (checked) + uniView.checked = true dmxView.visible = false contextManager.detachContext("DMX") } @@ -168,6 +172,8 @@ Rectangle onCheckedChanged: loadContext(checked, "qrc:/2DView.qml", "2D") onRightClicked: { + if (checked) + dmxView.checked = true twodView.visible = false contextManager.detachContext("2D") } @@ -193,6 +199,8 @@ Rectangle } onRightClicked: { + if (checked) + twodView.checked = true threedView.visible = false contextManager.detachContext("3D") } diff --git a/qmlui/qml/fixturesfunctions/GridEditor.qml b/qmlui/qml/fixturesfunctions/GridEditor.qml index c8e2eac887..165a6f7b27 100644 --- a/qmlui/qml/fixturesfunctions/GridEditor.qml +++ b/qmlui/qml/fixturesfunctions/GridEditor.qml @@ -222,17 +222,31 @@ Rectangle onTriggered: calculateCellSize() } + Text + { + id: ttText + + property string tooltipText: "" + visible: false + x: gridMouseArea.mouseX + y: gridMouseArea.mouseY + ToolTip.visible: ttText.visible + ToolTip.timeout: 3000 + ToolTip.text: tooltipText + } + Timer { id: ttTimer + repeat: false interval: 1000 - running: gridMouseArea.containsMouse + running: false onTriggered: { var xPos = parseInt(gridMouseArea.mouseX / cellSize) var yPos = parseInt(gridMouseArea.mouseY / cellSize) - var tooltip = getTooltip(xPos, yPos) - Tooltip.showText(gridMouseArea, Qt.point(gridMouseArea.mouseX, gridMouseArea.mouseY), tooltip) + ttText.tooltipText = getTooltip(xPos, yPos) + ttText.visible = true } } @@ -343,6 +357,7 @@ Rectangle onPositionChanged: { + ttText.visible = false ttTimer.restart() if (movingSelection == false) @@ -368,8 +383,7 @@ Rectangle updateViewSelection(selectionOffset) } - onExited: Tooltip.hideText() - onCanceled: Tooltip.hideText() + onExited: ttTimer.stop() } DropArea diff --git a/qmlui/qml/fixturesfunctions/IntensityTool.qml b/qmlui/qml/fixturesfunctions/IntensityTool.qml index 61ebe7ca3f..8192a71950 100644 --- a/qmlui/qml/fixturesfunctions/IntensityTool.qml +++ b/qmlui/qml/fixturesfunctions/IntensityTool.qml @@ -35,6 +35,7 @@ Rectangle property bool dmxValues: true property bool closeOnSelect: false + property var dragTarget: null property alias showPalette: paletteBox.visible property alias currentValue: spinBox.value @@ -55,34 +56,34 @@ Rectangle else { var val = relativeValue ? currentValue - previousValue : currentValue - intRoot.valueChanged(dmxValues ? val : val * 2.55) - if (closeOnSelect) - intRoot.visible = false + if (intRoot.visible) + intRoot.valueChanged(dmxValues ? val : val * 2.55) + //if (closeOnSelect) + // intRoot.close() } previousValue = currentValue } onVisibleChanged: { - if (visible) + if (!visible) + paletteBox.checked = false + } + + function show(value) + { + previousValue = 0 + if (value === -1) { - previousValue = 0 - var val = contextManager.getCurrentValue(QLCChannel.Intensity, false) - if (val === -1) - { - relativeValue = true - currentValue = 0 - } - else - { - relativeValue = false - currentValue = dmxValues ? Math.round(val) : Math.round(val / 2.55) - } + relativeValue = true + currentValue = 0 } else { - paletteBox.checked = false + relativeValue = false + currentValue = dmxValues ? Math.round(value) : Math.round(value / 2.55) } + visible = true } function loadPalette(pId) @@ -137,7 +138,7 @@ Rectangle MouseArea { anchors.fill: parent - drag.target: intRoot + drag.target: intRoot.dragTarget ? intRoot.dragTarget : intRoot } GenericButton @@ -232,7 +233,7 @@ Rectangle suffix: dmxValues ? "" : "%" to: dmxValues ? 255 : 100 - onValueChanged: currentValue = value + onValueModified: currentValue = value } DMXPercentageButton diff --git a/qmlui/qml/fixturesfunctions/LeftPanel.qml b/qmlui/qml/fixturesfunctions/LeftPanel.qml index afab32e9f5..0d170aff97 100644 --- a/qmlui/qml/fixturesfunctions/LeftPanel.qml +++ b/qmlui/qml/fixturesfunctions/LeftPanel.qml @@ -99,7 +99,10 @@ SidePanel onToggled: { if (checked == true) + { loaderSource = "qrc:/FixtureGroupManager.qml" + fixtureManager.searchFilter = "" + } animatePanel(checked) } } @@ -133,7 +136,16 @@ SidePanel tooltip: qsTr("Intensity") counter: 0 ButtonGroup.group: capabilitiesGroup - onCheckedChanged: intTool.visible = !intTool.visible + onCheckedChanged: + { + if (checked) + { + var val = contextManager.getCurrentValue(QLCChannel.Intensity, false) + intTool.show(val) + } + else + intTool.visible = false + } onCounterChanged: if (counter == 0) intTool.visible = false IntensityTool diff --git a/qmlui/qml/fixturesfunctions/PresetCapabilityItem.qml b/qmlui/qml/fixturesfunctions/PresetCapabilityItem.qml index a1a0a5d3af..922fe02773 100644 --- a/qmlui/qml/fixturesfunctions/PresetCapabilityItem.qml +++ b/qmlui/qml/fixturesfunctions/PresetCapabilityItem.qml @@ -27,6 +27,7 @@ Rectangle id: iRoot width: UISettings.bigItemHeight * 1.5 height: UISettings.iconSizeDefault * 1.2 + color: capMouseArea.pressed ? UISettings.bgLight : "white" border.width: 1 border.color: UISettings.borderColorDark @@ -63,7 +64,7 @@ Rectangle if (Qt.platform.os === "android") pic.source = resArray[0] else - pic.source = "file:/" + resArray[0] + pic.source = "file:" + resArray[0] } } @@ -137,14 +138,13 @@ Rectangle } MouseArea { + id: capMouseArea anchors.fill: parent hoverEnabled: true preventStealing: false onPositionChanged: capBar.width = mouse.x onExited: capBar.width = 0 - onPressed: iRoot.color = UISettings.bgLight - onReleased: iRoot.color = "white" onClicked: { var value = ((capability.max - capability.min) * capBar.width) / iRoot.width diff --git a/qmlui/qml/fixturesfunctions/PresetsTool.qml b/qmlui/qml/fixturesfunctions/PresetsTool.qml index 17d07bd963..f239becbda 100644 --- a/qmlui/qml/fixturesfunctions/PresetsTool.qml +++ b/qmlui/qml/fixturesfunctions/PresetsTool.qml @@ -38,6 +38,8 @@ Rectangle property int selectedChannel: -1 property bool showPalette: false property int currentValue: 0 // as DMX value + property int rangeLowLimit: 0 + property int rangeHighLimit: 255 signal presetSelected(QLCCapability cap, int fxID, int chIdx, int value) signal valueChanged(int value) @@ -152,11 +154,13 @@ Rectangle { capability: modelData capIndex: index + 1 + visible: (capability.min <= toolRoot.rangeHighLimit || capability.max <= toolRoot.rangeLowLimit) onValueChanged: { - toolRoot.currentValue = value - toolRoot.presetSelected(capability, selectedFixture, selectedChannel, value) - toolRoot.valueChanged(value) + var val = Math.min(Math.max(value, rangeLowLimit), rangeHighLimit) + toolRoot.currentValue = val + toolRoot.presetSelected(capability, selectedFixture, selectedChannel, val) + toolRoot.valueChanged(val) if (closeOnSelect) toolRoot.visible = false } diff --git a/qmlui/qml/fixturesfunctions/RGBPanelProperties.qml b/qmlui/qml/fixturesfunctions/RGBPanelProperties.qml index c6251b69a9..bfcbee19fd 100644 --- a/qmlui/qml/fixturesfunctions/RGBPanelProperties.qml +++ b/qmlui/qml/fixturesfunctions/RGBPanelProperties.qml @@ -18,6 +18,7 @@ */ import QtQuick 2.3 +import QtQuick.Controls 2.14 import QtQuick.Layouts 1.1 import org.qlcplus.classes 1.0 diff --git a/qmlui/qml/fixturesfunctions/UniverseGridView.qml b/qmlui/qml/fixturesfunctions/UniverseGridView.qml index 1c6eb4c200..81694b84c0 100644 --- a/qmlui/qml/fixturesfunctions/UniverseGridView.qml +++ b/qmlui/qml/fixturesfunctions/UniverseGridView.qml @@ -30,8 +30,9 @@ Flickable boundsBehavior: Flickable.StopAtBounds contentHeight: uniGrid.height + topbar.height + UISettings.bigItemHeight + property alias contextItem: uniGrid property string contextName: "UNIGRID" - property int uniStartAddr: viewUniverseCombo.currentIndex * 512 + property int uniStartAddr: contextManager.universeFilter * 512 property var fixtureClipboard: null function hasSettings() @@ -44,7 +45,7 @@ Flickable id: errorPopup standardButtons: Dialog.Ok title: qsTr("Error") - message: qsTr("Unable to perform the operation.\nThere is either not enough space or the target universe in invalid") + message: qsTr("Unable to perform the operation.\nThere is either not enough space or the target universe is invalid") onAccepted: close() } @@ -60,7 +61,7 @@ Flickable id: uniText height: UISettings.textSizeDefault * 2 labelColor: UISettings.fgLight - label: viewUniverseCombo.currentText + label: ioManager.universeName(contextManager.universeFilter) fontSize: UISettings.textSizeDefault * 1.5 fontBold: true } @@ -101,13 +102,16 @@ Flickable x: UISettings.iconSizeMedium anchors.top: topbar.bottom width: parent.width - (UISettings.iconSizeMedium * 3) - height: cellSize * gridSize.height + height: 32 * gridSize.height showIndices: 512 gridSize: Qt.size(24, 22) gridLabels: fixtureManager.fixtureNamesMap gridData: fixtureManager.fixturesMap + Component.onCompleted: contextManager.enableContext("UNIGRID", true, uniGrid) + Component.onDestruction: if (contextManager) contextManager.enableContext("UNIGRID", false, uniGrid) + property int prevFixtureID: -1 function getItemIcon(itemID, chNumber) @@ -135,6 +139,7 @@ Flickable if (multiSelection === 0) contextManager.resetFixtureSelection() + console.log("prevFixtureID: " + prevFixtureID + "currentItemID: " + currentItemID) if (prevFixtureID != currentItemID && multiSelection === 0) contextManager.setFixtureIDSelection(prevFixtureID, false) diff --git a/qmlui/qml/fixturesfunctions/qmldir b/qmlui/qml/fixturesfunctions/qmldir index 9c33c9b773..c270f28276 100644 --- a/qmlui/qml/fixturesfunctions/qmldir +++ b/qmlui/qml/fixturesfunctions/qmldir @@ -7,6 +7,7 @@ ColorToolFull 0.1 ../ColorToolFull.qml ContextMenuEntry 0.1 ../ContextMenuEntry.qml CustomCheckBox 0.1 ../CustomCheckBox.qml CustomComboBox 0.1 ../CustomComboBox.qml +CustomPopupDialog 0.1 ../popup/CustomPopupDialog.qml CustomScrollBar 0.1 ../CustomScrollBar.qml CustomSpinBox 0.1 ../CustomSpinBox.qml CustomDoubleSpinBox 0.1 ../CustomDoubleSpinBox.qml diff --git a/qmlui/qml/inputoutput/UniverseIOItem.qml b/qmlui/qml/inputoutput/UniverseIOItem.qml index 8a4816d87c..688ebc820d 100644 --- a/qmlui/qml/inputoutput/UniverseIOItem.qml +++ b/qmlui/qml/inputoutput/UniverseIOItem.qml @@ -151,7 +151,7 @@ Rectangle z: 10 patchesNumber: inputPatchesNumber - showFeedback: universe ? universe.hasFeedbacks : false + showFeedback: universe ? universe.hasFeedback : false } // Input patch drop area @@ -266,8 +266,8 @@ Rectangle checkedColor: "green" imgSource: "" checkable: true - checked: universe ? universe.hasFeedbacks : false - tooltip: qsTr("Enable/Disable feedbacks") + checked: universe ? universe.hasFeedback : false + tooltip: qsTr("Enable/Disable feedback") onToggled: { if (universe) diff --git a/qmlui/qml/popup/PopupAbout.qml b/qmlui/qml/popup/PopupAbout.qml index 41b4fa9deb..5282488cbe 100644 --- a/qmlui/qml/popup/PopupAbout.qml +++ b/qmlui/qml/popup/PopupAbout.qml @@ -57,6 +57,8 @@ CustomPopupDialog " " + qsTr("Apache 2.0 license") + "." onLinkActivated: Qt.openUrlExternally(link) + Layout.fillWidth: true + wrapMode: Text.WordWrap MouseArea { diff --git a/qmlui/qml/virtualconsole/VCAnimationItem.qml b/qmlui/qml/virtualconsole/VCAnimationItem.qml new file mode 100644 index 0000000000..c855c09ea1 --- /dev/null +++ b/qmlui/qml/virtualconsole/VCAnimationItem.qml @@ -0,0 +1,66 @@ +/* + Q Light Controller Plus + VCAnimationItem.qml + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import QtQuick 2.0 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 2.2 + +import org.qlcplus.classes 1.0 +import "." + +VCWidgetItem +{ + id: animationRoot + property VCAnimation animationObj: null + + clip: true + + onAnimationObjChanged: + { + setCommonProperties(animationObj) + } + + Row + { + anchors.fill: parent + + // value text box + Text + { + width: parent.width + height: parent.height + color: "#bbb" + lineHeight: 0.8 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + textFormat: Text.RichText + wrapMode: Text.Wrap + text: "VCAnimation not implemented yet.
    See QML Status" + + onLinkActivated: Qt.openUrlExternally(link) + + MouseArea + { + anchors.fill: parent + acceptedButtons: Qt.NoButton + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor + } + } + } +} diff --git a/qmlui/qml/virtualconsole/VCAnimationProperties.qml b/qmlui/qml/virtualconsole/VCAnimationProperties.qml new file mode 100644 index 0000000000..d0b061f249 --- /dev/null +++ b/qmlui/qml/virtualconsole/VCAnimationProperties.qml @@ -0,0 +1,66 @@ +/* + Q Light Controller Plus + VCAnimationProperties.qml + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 2.1 + +import org.qlcplus.classes 1.0 +import "." + +Rectangle +{ + id: propsRoot + color: "transparent" + height: animationPropsColumn.height + + property VCAnimation widgetRef: null + + property int gridItemsHeight: UISettings.listItemHeight + + Column + { + id: animationPropsColumn + width: parent.width + spacing: 5 + + SectionBox + { + id: animationProp + sectionLabel: qsTr("Animation Properties") + + sectionContents: + GridLayout + { + width: parent.width + columns: 2 + columnSpacing: 5 + rowSpacing: 4 + + // row 1 + RobotoText + { + height: gridItemsHeight + Layout.fillWidth: true + label: "Not implemented." + } + } // GridLayout + } // SectionBox + } // Column +} diff --git a/qmlui/qml/virtualconsole/VCAudioTriggerItem.qml b/qmlui/qml/virtualconsole/VCAudioTriggerItem.qml new file mode 100644 index 0000000000..f93186d298 --- /dev/null +++ b/qmlui/qml/virtualconsole/VCAudioTriggerItem.qml @@ -0,0 +1,66 @@ +/* + Q Light Controller Plus + VCAudioTriggerItem.qml + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import QtQuick 2.0 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 2.2 + +import org.qlcplus.classes 1.0 +import "." + +VCWidgetItem +{ + id: audioTriggerRoot + property VCAudioTrigger audioTriggerObj: null + + clip: true + + onAudioTriggerObjChanged: + { + setCommonProperties(audioTriggerObj) + } + + Row + { + anchors.fill: parent + + // value text box + Text + { + width: parent.width + height: parent.height + color: "#bbb" + lineHeight: 0.8 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + textFormat: Text.RichText + wrapMode: Text.Wrap + text: "VCAudioTrigger not implemented yet.
    See QML Status" + + onLinkActivated: Qt.openUrlExternally(link) + + MouseArea + { + anchors.fill: parent + acceptedButtons: Qt.NoButton + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor + } + } + } +} diff --git a/qmlui/qml/virtualconsole/VCAudioTriggerProperties.qml b/qmlui/qml/virtualconsole/VCAudioTriggerProperties.qml new file mode 100644 index 0000000000..3e8dd5d1db --- /dev/null +++ b/qmlui/qml/virtualconsole/VCAudioTriggerProperties.qml @@ -0,0 +1,66 @@ +/* + Q Light Controller Plus + VCAudioTriggerProperties.qml + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 2.1 + +import org.qlcplus.classes 1.0 +import "." + +Rectangle +{ + id: propsRoot + color: "transparent" + height: audioTriggerPropsColumn.height + + property VCAudioTrigger widgetRef: null + + property int gridItemsHeight: UISettings.listItemHeight + + Column + { + id: audioTriggerPropsColumn + width: parent.width + spacing: 5 + + SectionBox + { + id: audioTriggerProp + sectionLabel: qsTr("Audio Trigger Properties") + + sectionContents: + GridLayout + { + width: parent.width + columns: 2 + columnSpacing: 5 + rowSpacing: 4 + + // row 1 + RobotoText + { + height: gridItemsHeight + Layout.fillWidth: true + label: "Not implemented." + } + } // GridLayout + } // SectionBox + } // Column +} diff --git a/qmlui/qml/virtualconsole/VCSliderItem.qml b/qmlui/qml/virtualconsole/VCSliderItem.qml index dcea323ffe..2209ca1954 100644 --- a/qmlui/qml/virtualconsole/VCSliderItem.qml +++ b/qmlui/qml/virtualconsole/VCSliderItem.qml @@ -17,7 +17,7 @@ limitations under the License. */ -import QtQuick 2.0 +import QtQuick 2.14 import QtQuick.Layouts 1.1 import org.qlcplus.classes 1.0 @@ -149,7 +149,7 @@ VCWidgetItem to: sliderObj ? sliderObj.rangeHighLimit : 255 value: sliderValue - onMoved: if (sliderObj) sliderObj.value = value // position * 255 + onValueChanged: if (sliderObj) sliderObj.value = value } // widget name text box @@ -194,6 +194,24 @@ VCWidgetItem onClicked: if (sliderObj) sliderObj.isOverriding = false } + IconButton + { + visible: sliderObj ? sliderObj.adjustFlashEnabled : false + Layout.alignment: Qt.AlignHCenter + imgSource: "qrc:/flash.svg" + tooltip: qsTr("Flash the controlled Function") + onPressed: + { + if (sliderObj) + sliderObj.flashFunction(true) + } + onReleased: + { + if (sliderObj) + sliderObj.flashFunction(false) + } + } + // Click & Go button IconButton { @@ -230,7 +248,7 @@ VCWidgetItem if (Qt.platform.os === "android") presetImageBox.source = cngResource else - presetImageBox.source = "file:/" + cngResource + presetImageBox.source = "file:" + cngResource } onClicked: colorToolLoader.toggleVisibility() @@ -285,6 +303,11 @@ VCWidgetItem { item.visible = false item.closeOnSelect = true + if (sliderObj && clickAndGoButton.cngType == VCSlider.CnGPreset) + { + item.rangeLowLimit = sliderObj.rangeLowLimit + item.rangeHighLimit = sliderObj.rangeHighLimit + } } Connections diff --git a/qmlui/qml/virtualconsole/VCSliderProperties.qml b/qmlui/qml/virtualconsole/VCSliderProperties.qml index 33e77ab8f7..fd7c087e49 100644 --- a/qmlui/qml/virtualconsole/VCSliderProperties.qml +++ b/qmlui/qml/virtualconsole/VCSliderProperties.qml @@ -257,6 +257,21 @@ Rectangle currentIndex: widgetRef ? widgetRef.controlledAttribute : 0 onCurrentIndexChanged: if (widgetRef) widgetRef.controlledAttribute = currentIndex } + + CustomCheckBox + { + implicitWidth: UISettings.iconSizeMedium + implicitHeight: implicitWidth + checked: widgetRef ? widgetRef.adjustFlashEnabled : false + onClicked: if (widgetRef) widgetRef.adjustFlashEnabled = checked + } + + RobotoText + { + height: gridItemsHeight + Layout.fillWidth: true + label: qsTr("Show flash button") + } } // GridLayout } // SectionBox Function control diff --git a/qmlui/qml/virtualconsole/VCSpeedDialItem.qml b/qmlui/qml/virtualconsole/VCSpeedDialItem.qml new file mode 100644 index 0000000000..e653de4c4c --- /dev/null +++ b/qmlui/qml/virtualconsole/VCSpeedDialItem.qml @@ -0,0 +1,66 @@ +/* + Q Light Controller Plus + VCSpeedDialItem.qml + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import QtQuick 2.0 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 2.2 + +import org.qlcplus.classes 1.0 +import "." + +VCWidgetItem +{ + id: speedDialRoot + property VCSpeedDial speedDialObj: null + + clip: true + + onSpeedDialObjChanged: + { + setCommonProperties(speedDialObj) + } + + Row + { + anchors.fill: parent + + // value text box + Text + { + width: parent.width + height: parent.height + color: "#bbb" + lineHeight: 0.8 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + textFormat: Text.RichText + wrapMode: Text.Wrap + text: "VCSpeedDial not implemented yet.
    See QML Status" + + onLinkActivated: Qt.openUrlExternally(link) + + MouseArea + { + anchors.fill: parent + acceptedButtons: Qt.NoButton + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor + } + } + } +} diff --git a/qmlui/qml/virtualconsole/VCSpeedDialProperties.qml b/qmlui/qml/virtualconsole/VCSpeedDialProperties.qml new file mode 100644 index 0000000000..476993e100 --- /dev/null +++ b/qmlui/qml/virtualconsole/VCSpeedDialProperties.qml @@ -0,0 +1,66 @@ +/* + Q Light Controller Plus + VCSpeedDialProperties.qml + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 2.1 + +import org.qlcplus.classes 1.0 +import "." + +Rectangle +{ + id: propsRoot + color: "transparent" + height: speedDialPropsColumn.height + + property VCSpeedDial widgetRef: null + + property int gridItemsHeight: UISettings.listItemHeight + + Column + { + id: speedDialPropsColumn + width: parent.width + spacing: 5 + + SectionBox + { + id: speedDialProp + sectionLabel: qsTr("Speed Dial Properties") + + sectionContents: + GridLayout + { + width: parent.width + columns: 2 + columnSpacing: 5 + rowSpacing: 4 + + // row 1 + RobotoText + { + height: gridItemsHeight + Layout.fillWidth: true + label: "Not implemented." + } + } // GridLayout + } // SectionBox + } // Column +} diff --git a/qmlui/qml/virtualconsole/VCXYPadItem.qml b/qmlui/qml/virtualconsole/VCXYPadItem.qml new file mode 100644 index 0000000000..bf3f813f89 --- /dev/null +++ b/qmlui/qml/virtualconsole/VCXYPadItem.qml @@ -0,0 +1,66 @@ +/* + Q Light Controller Plus + VCXYPadItem.qml + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import QtQuick 2.0 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 2.2 + +import org.qlcplus.classes 1.0 +import "." + +VCWidgetItem +{ + id: xyPadRoot + property VCXYPad xyPadObj: null + + clip: true + + onXyPadObjChanged: + { + setCommonProperties(xyPadObj) + } + + Row + { + anchors.fill: parent + + // value text box + Text + { + width: parent.width + height: parent.height + color: "#bbb" + lineHeight: 0.8 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + textFormat: Text.RichText + wrapMode: Text.Wrap + text: "VCXYPad not implemented yet.
    See QML Status" + + onLinkActivated: Qt.openUrlExternally(link) + + MouseArea + { + anchors.fill: parent + acceptedButtons: Qt.NoButton + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor + } + } + } +} diff --git a/qmlui/qml/virtualconsole/VCXYPadProperties.qml b/qmlui/qml/virtualconsole/VCXYPadProperties.qml new file mode 100644 index 0000000000..519a51b4fb --- /dev/null +++ b/qmlui/qml/virtualconsole/VCXYPadProperties.qml @@ -0,0 +1,66 @@ +/* + Q Light Controller Plus + VCXYPadProperties.qml + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 2.1 + +import org.qlcplus.classes 1.0 +import "." + +Rectangle +{ + id: propsRoot + color: "transparent" + height: xyPadPropsColumn.height + + property VCXYPad widgetRef: null + + property int gridItemsHeight: UISettings.listItemHeight + + Column + { + id: xyPadPropsColumn + width: parent.width + spacing: 5 + + SectionBox + { + id: xyPadProp + sectionLabel: qsTr("XY Pad Properties") + + sectionContents: + GridLayout + { + width: parent.width + columns: 2 + columnSpacing: 5 + rowSpacing: 4 + + // row 1 + RobotoText + { + height: gridItemsHeight + Layout.fillWidth: true + label: "Not implemented." + } + } // GridLayout + } // SectionBox + } // Column +} diff --git a/qmlui/qml/virtualconsole/qmldir b/qmlui/qml/virtualconsole/qmldir index 15add3510b..2d813e6045 100644 --- a/qmlui/qml/virtualconsole/qmldir +++ b/qmlui/qml/virtualconsole/qmldir @@ -22,6 +22,7 @@ IconPopupButton 0.1 ../IconPopupButton.qml IconTextEntry 0.1 ../IconTextEntry.qml MenuBarEntry 0.1 ../MenuBarEntry.qml QLCPlusFader 0.1 ../QLCPlusFader.qml +QLCPlusKnob 0.1 ../QLCPlusKnob.qml RobotoText 0.1 ../RobotoText.qml SectionBox 0.1 ../SectionBox.qml SidePanel 0.1 ../SidePanel.qml diff --git a/qmlui/qmlui.pro b/qmlui/qmlui.pro index 41473b6f3a..9eec79c66b 100644 --- a/qmlui/qmlui.pro +++ b/qmlui/qmlui.pro @@ -23,7 +23,14 @@ INCLUDEPATH += ../plugins/interfaces INCLUDEPATH += ../plugins/midi/src/common DEPENDPATH += ../engine/src QMAKE_LIBDIR += ../engine/src -LIBS += -lqlcplusengine + +android { + LIBS += -lqlcplusengine_$${QT_ARCH} +} else { + LIBS += -lqlcplusengine +} + + #win32:QMAKE_LFLAGS += -shared win32:RC_FILE = qmlui.rc @@ -126,6 +133,10 @@ HEADERS += \ virtualconsole/vcbutton.h \ virtualconsole/vclabel.h \ virtualconsole/vcslider.h \ + virtualconsole/vcanimation.h \ + virtualconsole/vcaudiotrigger.h \ + virtualconsole/vcxypad.h \ + virtualconsole/vcspeeddial.h \ virtualconsole/vcclock.h \ virtualconsole/vccuelist.h @@ -138,6 +149,10 @@ SOURCES += \ virtualconsole/vcbutton.cpp \ virtualconsole/vclabel.cpp \ virtualconsole/vcslider.cpp \ + virtualconsole/vcanimation.cpp \ + virtualconsole/vcaudiotrigger.cpp \ + virtualconsole/vcxypad.cpp \ + virtualconsole/vcspeeddial.cpp \ virtualconsole/vcclock.cpp \ virtualconsole/vccuelist.cpp diff --git a/qmlui/qmlui.qrc b/qmlui/qmlui.qrc index ec4b6dfdd8..e0c168ee2b 100644 --- a/qmlui/qmlui.qrc +++ b/qmlui/qmlui.qrc @@ -233,6 +233,14 @@ qml/virtualconsole/VCLabelItem.qml qml/virtualconsole/VCSliderItem.qml qml/virtualconsole/VCSliderProperties.qml + qml/virtualconsole/VCAnimationItem.qml + qml/virtualconsole/VCAnimationProperties.qml + qml/virtualconsole/VCAudioTriggerItem.qml + qml/virtualconsole/VCAudioTriggerProperties.qml + qml/virtualconsole/VCXYPadItem.qml + qml/virtualconsole/VCXYPadProperties.qml + qml/virtualconsole/VCSpeedDialItem.qml + qml/virtualconsole/VCSpeedDialProperties.qml qml/virtualconsole/VCClockItem.qml qml/virtualconsole/VCClockProperties.qml qml/virtualconsole/VCCueListItem.qml diff --git a/qmlui/treemodel.cpp b/qmlui/treemodel.cpp index bbd8881ad3..b4ca42f743 100644 --- a/qmlui/treemodel.cpp +++ b/qmlui/treemodel.cpp @@ -136,7 +136,7 @@ TreeModelItem *TreeModel::addItem(QString label, QVariantList data, QString path QStringList pathList = path.split(TreeModel::separator()); if (m_itemsPathMap.contains(pathList.at(0))) { - item = m_itemsPathMap[pathList.at(0)]; + item = m_itemsPathMap.value(pathList.at(0), nullptr); } else { @@ -202,7 +202,10 @@ TreeModelItem *TreeModel::itemAtPath(QString path) return nullptr; } - TreeModelItem *item = m_itemsPathMap[pathList.at(0)]; + TreeModelItem *item = m_itemsPathMap.value(pathList.at(0), nullptr); + if (item == nullptr) + return nullptr; + QString subPath = path.mid(path.indexOf(TreeModel::separator()) + 1); return item->children()->itemAtPath(subPath); } @@ -236,7 +239,10 @@ bool TreeModel::removeItem(QString path) } else { - TreeModelItem *item = m_itemsPathMap[pathList.at(0)]; + TreeModelItem *item = m_itemsPathMap.value(pathList.at(0), nullptr); + if (item == nullptr) + return false; + QString subPath = path.mid(path.indexOf(TreeModel::separator()) + 1); item->children()->removeItem(subPath); } @@ -270,7 +276,10 @@ void TreeModel::setItemRoleData(QString path, const QVariant &value, int role) } else { - TreeModelItem *item = m_itemsPathMap[pathList.at(0)]; + TreeModelItem *item = m_itemsPathMap.value(pathList.at(0), nullptr); + if (item == nullptr) + return; + QString subPath = path.mid(path.indexOf(TreeModel::separator()) + 1); item->children()->setItemRoleData(subPath, value, role); } @@ -300,18 +309,18 @@ void TreeModel::setPathData(QString path, QVariantList data) return; QStringList pathList = path.split(TreeModel::separator()); - if (m_itemsPathMap.contains(pathList.at(0))) + TreeModelItem *item = m_itemsPathMap.value(pathList.at(0), nullptr); + if (item == nullptr) + return; + + if (pathList.count() == 1) { - TreeModelItem *item = m_itemsPathMap[pathList.at(0)]; - if (pathList.count() == 1) - { - item->setData(data); - } - else if (item->hasChildren()) - { - QString subPath = path.mid(path.indexOf(TreeModel::separator()) + 1); - item->children()->setPathData(subPath, data); - } + item->setData(data); + } + else if (item->hasChildren()) + { + QString subPath = path.mid(path.indexOf(TreeModel::separator()) + 1); + item->children()->setPathData(subPath, data); } } diff --git a/qmlui/virtualconsole/vcanimation.cpp b/qmlui/virtualconsole/vcanimation.cpp new file mode 100644 index 0000000000..1ddd37e6d9 --- /dev/null +++ b/qmlui/virtualconsole/vcanimation.cpp @@ -0,0 +1,169 @@ +/* + Q Light Controller Plus + vcanimation.cpp + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include +#include +#include + +#include "doc.h" +#include "vcanimation.h" + +VCAnimation::VCAnimation(Doc *doc, QObject *parent) + : VCWidget(doc, parent) +{ + setType(VCWidget::AnimationWidget); +} + +VCAnimation::~VCAnimation() +{ + if (m_item) + delete m_item; +} + +QString VCAnimation::defaultCaption() +{ + return tr("Animation %1").arg(id() + 1); +} + +void VCAnimation::setupLookAndFeel(qreal pixelDensity, int page) +{ + setPage(page); + QFont wFont = font(); + wFont.setBold(true); + wFont.setPointSize(pixelDensity * 5.0); + setFont(wFont); +} + +void VCAnimation::render(QQuickView *view, QQuickItem *parent) +{ + if (view == nullptr || parent == nullptr) + return; + + QQmlComponent *component = new QQmlComponent(view->engine(), QUrl("qrc:/VCAnimationItem.qml")); + + if (component->isError()) + { + qDebug() << component->errors(); + return; + } + + m_item = qobject_cast(component->create()); + + m_item->setParentItem(parent); + m_item->setProperty("animationObj", QVariant::fromValue(this)); +} + +QString VCAnimation::propertiesResource() const +{ + return QString("qrc:/VCAnimationProperties.qml"); +} + +VCWidget *VCAnimation::createCopy(VCWidget *parent) +{ + Q_ASSERT(parent != nullptr); + + VCAnimation *animation = new VCAnimation(m_doc, parent); + if (animation->copyFrom(this) == false) + { + delete animation; + animation = nullptr; + } + + return animation; +} + +bool VCAnimation::copyFrom(const VCWidget *widget) +{ + const VCAnimation *animation = qobject_cast (widget); + if (animation == nullptr) + return false; + + /* Copy and set properties */ + + /* Copy object lists */ + + /* Common stuff */ + return VCWidget::copyFrom(widget); +} + +FunctionParent VCAnimation::functionParent() const +{ + return FunctionParent(FunctionParent::AutoVCWidget, id()); +} + +/********************************************************************* + * Load & Save + *********************************************************************/ + +bool VCAnimation::loadXML(QXmlStreamReader &root) +{ + if (root.name() != KXMLQLCVCAnimation) + { + qWarning() << Q_FUNC_INFO << "Animation node not found"; + return false; + } + + QXmlStreamAttributes attrs = root.attributes(); + + /* Widget commons */ + loadXMLCommon(root); + + while (root.readNextStartElement()) + { + if (root.name() == KXMLQLCWindowState) + { + bool visible = false; + int x = 0, y = 0, w = 0, h = 0; + loadXMLWindowState(root, &x, &y, &w, &h, &visible); + setGeometry(QRect(x, y, w, h)); + } + else if (root.name() == KXMLQLCVCWidgetAppearance) + { + loadXMLAppearance(root); + } + else + { + qWarning() << Q_FUNC_INFO << "Unknown animation tag:" << root.name().toString(); + root.skipCurrentElement(); + } + } + + return true; +} + +bool VCAnimation::saveXML(QXmlStreamWriter *doc) +{ + Q_ASSERT(doc != nullptr); + + /* VC object entry */ + doc->writeStartElement(KXMLQLCVCAnimation); + + saveXMLCommon(doc); + + /* Window state */ + saveXMLWindowState(doc); + + /* Appearance */ + saveXMLAppearance(doc); + + /* Write the tag */ + doc->writeEndElement(); + + return true; +} diff --git a/qmlui/virtualconsole/vcanimation.h b/qmlui/virtualconsole/vcanimation.h new file mode 100644 index 0000000000..bf7259512a --- /dev/null +++ b/qmlui/virtualconsole/vcanimation.h @@ -0,0 +1,103 @@ +/* + Q Light Controller Plus + vcanimation.h + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef VCANIMATION_H +#define VCANIMATION_H + +#include "vcwidget.h" + +#define KXMLQLCVCAnimation QString("Control") +#define KXMLQLCVCAnimationID QString("ID") +#define KXMLQLCVCAnimationType QString("Type") +#define KXMLQLCVCAnimationColor QString("Color") +#define KXMLQLCVCAnimationResource QString("Resource") +#define KXMLQLCVCAnimationProperty QString("Property") +#define KXMLQLCVCAnimationPropertyName QString("Name") + +class VCAnimation : public VCWidget +{ + Q_OBJECT + + /********************************************************************* + * Initialization + *********************************************************************/ +public: + VCAnimation(Doc* doc = nullptr, QObject *parent = nullptr); + virtual ~VCAnimation(); + + /** @reimp */ + QString defaultCaption(); + + /** @reimp */ + void setupLookAndFeel(qreal pixelDensity, int page); + + /** @reimp */ + void render(QQuickView *view, QQuickItem *parent); + + /** @reimp */ + QString propertiesResource() const; + + /** @reimp */ + VCWidget *createCopy(VCWidget *parent); + +protected: + /** @reimp */ + bool copyFrom(const VCWidget* widget); + +private: + FunctionParent functionParent() const; + + /********************************************************************* + * Type + *********************************************************************/ +public: + +signals: + +private: + + /********************************************************************* + * Data + *********************************************************************/ +public: + +protected slots: + +signals: + +private: + + /********************************************************************* + * Functions connections + *********************************************************************/ +public: + +signals: + +private: + + /********************************************************************* + * Load & Save + *********************************************************************/ +public: + bool loadXML(QXmlStreamReader &root); + bool saveXML(QXmlStreamWriter *doc); +}; + +#endif diff --git a/qmlui/virtualconsole/vcaudiotrigger.cpp b/qmlui/virtualconsole/vcaudiotrigger.cpp new file mode 100644 index 0000000000..3e5773bd60 --- /dev/null +++ b/qmlui/virtualconsole/vcaudiotrigger.cpp @@ -0,0 +1,169 @@ +/* + Q Light Controller Plus + vcaudiotrigger.cpp + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include +#include +#include + +#include "doc.h" +#include "vcaudiotrigger.h" + +VCAudioTrigger::VCAudioTrigger(Doc *doc, QObject *parent) + : VCWidget(doc, parent) +{ + setType(VCWidget::AudioTriggersWidget); +} + +VCAudioTrigger::~VCAudioTrigger() +{ + if (m_item) + delete m_item; +} + +QString VCAudioTrigger::defaultCaption() +{ + return tr("Audio Trigger %1").arg(id() + 1); +} + +void VCAudioTrigger::setupLookAndFeel(qreal pixelDensity, int page) +{ + setPage(page); + QFont wFont = font(); + wFont.setBold(true); + wFont.setPointSize(pixelDensity * 5.0); + setFont(wFont); +} + +void VCAudioTrigger::render(QQuickView *view, QQuickItem *parent) +{ + if (view == nullptr || parent == nullptr) + return; + + QQmlComponent *component = new QQmlComponent(view->engine(), QUrl("qrc:/VCAudioTriggerItem.qml")); + + if (component->isError()) + { + qDebug() << component->errors(); + return; + } + + m_item = qobject_cast(component->create()); + + m_item->setParentItem(parent); + m_item->setProperty("audioTriggerObj", QVariant::fromValue(this)); +} + +QString VCAudioTrigger::propertiesResource() const +{ + return QString("qrc:/VCAudioTriggerProperties.qml"); +} + +VCWidget *VCAudioTrigger::createCopy(VCWidget *parent) +{ + Q_ASSERT(parent != nullptr); + + VCAudioTrigger *audioTrigger = new VCAudioTrigger(m_doc, parent); + if (audioTrigger->copyFrom(this) == false) + { + delete audioTrigger; + audioTrigger = nullptr; + } + + return audioTrigger; +} + +bool VCAudioTrigger::copyFrom(const VCWidget *widget) +{ + const VCAudioTrigger *audioTrigger = qobject_cast (widget); + if (audioTrigger == nullptr) + return false; + + /* Copy and set properties */ + + /* Copy object lists */ + + /* Common stuff */ + return VCWidget::copyFrom(widget); +} + +FunctionParent VCAudioTrigger::functionParent() const +{ + return FunctionParent(FunctionParent::AutoVCWidget, id()); +} + +/********************************************************************* + * Load & Save + *********************************************************************/ + +bool VCAudioTrigger::loadXML(QXmlStreamReader &root) +{ + if (root.name() != KXMLQLCVCAudioTriggers) + { + qWarning() << Q_FUNC_INFO << "Audio trigger node not found"; + return false; + } + + QXmlStreamAttributes attrs = root.attributes(); + + /* Widget commons */ + loadXMLCommon(root); + + while (root.readNextStartElement()) + { + if (root.name() == KXMLQLCWindowState) + { + bool visible = false; + int x = 0, y = 0, w = 0, h = 0; + loadXMLWindowState(root, &x, &y, &w, &h, &visible); + setGeometry(QRect(x, y, w, h)); + } + else if (root.name() == KXMLQLCVCWidgetAppearance) + { + loadXMLAppearance(root); + } + else + { + qWarning() << Q_FUNC_INFO << "Unknown audio trigger tag:" << root.name().toString(); + root.skipCurrentElement(); + } + } + + return true; +} + +bool VCAudioTrigger::saveXML(QXmlStreamWriter *doc) +{ + Q_ASSERT(doc != nullptr); + + /* VC object entry */ + doc->writeStartElement(KXMLQLCVCAudioTriggers); + + saveXMLCommon(doc); + + /* Window state */ + saveXMLWindowState(doc); + + /* Appearance */ + saveXMLAppearance(doc); + + /* Write the tag */ + doc->writeEndElement(); + + return true; +} diff --git a/qmlui/virtualconsole/vcaudiotrigger.h b/qmlui/virtualconsole/vcaudiotrigger.h new file mode 100644 index 0000000000..c12b3bd7c8 --- /dev/null +++ b/qmlui/virtualconsole/vcaudiotrigger.h @@ -0,0 +1,97 @@ +/* + Q Light Controller Plus + vcaudiotrigger.h + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef VCAUDIOTRIGGER_H +#define VCAUDIOTRIGGER_H + +#include "vcwidget.h" + +#define KXMLQLCVCAudioTriggers QString("AudioTriggers") + +class VCAudioTrigger : public VCWidget +{ + Q_OBJECT + + /********************************************************************* + * Initialization + *********************************************************************/ +public: + VCAudioTrigger(Doc* doc = nullptr, QObject *parent = nullptr); + virtual ~VCAudioTrigger(); + + /** @reimp */ + QString defaultCaption(); + + /** @reimp */ + void setupLookAndFeel(qreal pixelDensity, int page); + + /** @reimp */ + void render(QQuickView *view, QQuickItem *parent); + + /** @reimp */ + QString propertiesResource() const; + + /** @reimp */ + VCWidget *createCopy(VCWidget *parent); + +protected: + /** @reimp */ + bool copyFrom(const VCWidget* widget); + +private: + FunctionParent functionParent() const; + + /********************************************************************* + * Type + *********************************************************************/ +public: + +signals: + +private: + + /********************************************************************* + * Data + *********************************************************************/ +public: + +protected slots: + +signals: + +private: + + /********************************************************************* + * Functions connections + *********************************************************************/ +public: + +signals: + +private: + + /********************************************************************* + * Load & Save + *********************************************************************/ +public: + bool loadXML(QXmlStreamReader &root); + bool saveXML(QXmlStreamWriter *doc); +}; + +#endif diff --git a/qmlui/virtualconsole/vcbutton.cpp b/qmlui/virtualconsole/vcbutton.cpp index 84debd96e8..740e05fdda 100644 --- a/qmlui/virtualconsole/vcbutton.cpp +++ b/qmlui/virtualconsole/vcbutton.cpp @@ -514,6 +514,8 @@ void VCButton::updateFeedback() if (m_state == Inactive) sendFeedback(0, INPUT_PRESSURE_ID, VCWidget::LowerValue); + else if (m_state == Monitoring) + sendFeedback(0, INPUT_PRESSURE_ID, VCWidget::MonitorValue); else sendFeedback(UCHAR_MAX, INPUT_PRESSURE_ID, VCWidget::UpperValue); } diff --git a/qmlui/virtualconsole/vccuelist.cpp b/qmlui/virtualconsole/vccuelist.cpp index efc90202db..d7edee1be9 100644 --- a/qmlui/virtualconsole/vccuelist.cpp +++ b/qmlui/virtualconsole/vccuelist.cpp @@ -488,6 +488,8 @@ void VCCueList::setChaserID(quint32 fid) this, SLOT(slotCurrentStepChanged(int))); connect(function, SIGNAL(stepChanged(int)), this, SLOT(slotStepChanged(int))); + connect(function, SIGNAL(stepsListChanged(quint32)), + this, SLOT(slotStepsListChanged(quint32))); emit chaserIDChanged(fid); } @@ -524,6 +526,15 @@ void VCCueList::slotStepChanged(int index) ChaserEditor::updateStepInListModel(m_doc, chaser(), m_stepsList, step, index); } +void VCCueList::slotStepsListChanged(quint32 fid) +{ + if (fid == m_chaserID) + { + ChaserEditor::updateStepsList(m_doc, chaser(), m_stepsList); + emit stepsListChanged(); + } +} + void VCCueList::slotFunctionNameChanged(quint32 fid) { if (fid == m_chaserID) diff --git a/qmlui/virtualconsole/vccuelist.h b/qmlui/virtualconsole/vccuelist.h index 8d7bfe6c63..a6db069d14 100644 --- a/qmlui/virtualconsole/vccuelist.h +++ b/qmlui/virtualconsole/vccuelist.h @@ -188,6 +188,7 @@ private slots: void slotFunctionRemoved(quint32 fid); void slotFunctionNameChanged(quint32 fid); void slotStepChanged(int index); + void slotStepsListChanged(quint32 fid); private: FunctionParent functionParent() const; diff --git a/qmlui/virtualconsole/vcframe.cpp b/qmlui/virtualconsole/vcframe.cpp index b3b103a259..5679a65445 100644 --- a/qmlui/virtualconsole/vcframe.cpp +++ b/qmlui/virtualconsole/vcframe.cpp @@ -31,6 +31,10 @@ #include "vccuelist.h" #include "vcsoloframe.h" #include "simplecrypt.h" +#include "vcanimation.h" +#include "vcaudiotrigger.h" +#include "vcxypad.h" +#include "vcspeeddial.h" #include "virtualconsole.h" #define INPUT_NEXT_PAGE_ID 0 @@ -289,6 +293,54 @@ void VCFrame::addWidget(QQuickItem *parent, QString wType, QPoint pos) slider->render(m_vc->view(), parent); } break; + case AnimationWidget: + { + VCAnimation *animation = new VCAnimation(m_doc, this); + QQmlEngine::setObjectOwnership(animation, QQmlEngine::CppOwnership); + m_vc->addWidgetToMap(animation); + Tardis::instance()->enqueueAction(Tardis::VCWidgetCreate, this->id(), QVariant(), + Tardis::instance()->actionToByteArray(Tardis::VCWidgetCreate, animation->id())); + animation->setGeometry(QRect(pos.x(), pos.y(), m_vc->pixelDensity() * 25, m_vc->pixelDensity() * 8)); + setupWidget(animation, currentPage()); + animation->render(m_vc->view(), parent); + } + break; + case AudioTriggersWidget: + { + VCAudioTrigger *audioTrigger = new VCAudioTrigger(m_doc, this); + QQmlEngine::setObjectOwnership(audioTrigger, QQmlEngine::CppOwnership); + m_vc->addWidgetToMap(audioTrigger); + Tardis::instance()->enqueueAction(Tardis::VCWidgetCreate, this->id(), QVariant(), + Tardis::instance()->actionToByteArray(Tardis::VCWidgetCreate, audioTrigger->id())); + audioTrigger->setGeometry(QRect(pos.x(), pos.y(), m_vc->pixelDensity() * 25, m_vc->pixelDensity() * 8)); + setupWidget(audioTrigger, currentPage()); + audioTrigger->render(m_vc->view(), parent); + } + break; + case XYPadWidget: + { + VCXYPad *xyPad = new VCXYPad(m_doc, this); + QQmlEngine::setObjectOwnership(xyPad, QQmlEngine::CppOwnership); + m_vc->addWidgetToMap(xyPad); + Tardis::instance()->enqueueAction(Tardis::VCWidgetCreate, this->id(), QVariant(), + Tardis::instance()->actionToByteArray(Tardis::VCWidgetCreate, xyPad->id())); + xyPad->setGeometry(QRect(pos.x(), pos.y(), m_vc->pixelDensity() * 25, m_vc->pixelDensity() * 8)); + setupWidget(xyPad, currentPage()); + xyPad->render(m_vc->view(), parent); + } + break; + case SpeedDialWidget: + { + VCSpeedDial *speedDial = new VCSpeedDial(m_doc, this); + QQmlEngine::setObjectOwnership(speedDial, QQmlEngine::CppOwnership); + m_vc->addWidgetToMap(speedDial); + Tardis::instance()->enqueueAction(Tardis::VCWidgetCreate, this->id(), QVariant(), + Tardis::instance()->actionToByteArray(Tardis::VCWidgetCreate, speedDial->id())); + speedDial->setGeometry(QRect(pos.x(), pos.y(), m_vc->pixelDensity() * 25, m_vc->pixelDensity() * 8)); + setupWidget(speedDial, currentPage()); + speedDial->render(m_vc->view(), parent); + } + break; case ClockWidget: { VCClock *clock = new VCClock(m_doc, this); @@ -1034,6 +1086,66 @@ bool VCFrame::loadWidgetXML(QXmlStreamReader &root, bool render) slider->render(m_vc->view(), m_item); } } + else if (root.name() == KXMLQLCVCAnimation) + { + /* Create a new clock into its parent */ + VCAnimation *animation = new VCAnimation(m_doc, this); + if (animation->loadXML(root) == false) + delete animation; + else + { + QQmlEngine::setObjectOwnership(animation, QQmlEngine::CppOwnership); + setupWidget(animation, animation->page()); + m_vc->addWidgetToMap(animation); + if (render && m_item) + animation->render(m_vc->view(), m_item); + } + } + else if (root.name() == KXMLQLCVCAudioTriggers) + { + /* Create a new clock into its parent */ + VCAudioTrigger *audioTrigger = new VCAudioTrigger(m_doc, this); + if (audioTrigger->loadXML(root) == false) + delete audioTrigger; + else + { + QQmlEngine::setObjectOwnership(audioTrigger, QQmlEngine::CppOwnership); + setupWidget(audioTrigger, audioTrigger->page()); + m_vc->addWidgetToMap(audioTrigger); + if (render && m_item) + audioTrigger->render(m_vc->view(), m_item); + } + } + else if (root.name() == KXMLQLCVCSpeedDial) + { + /* Create a new speedDial into its parent */ + VCSpeedDial *speedDial = new VCSpeedDial(m_doc, this); + if (speedDial->loadXML(root) == false) + delete speedDial; + else + { + QQmlEngine::setObjectOwnership(speedDial, QQmlEngine::CppOwnership); + setupWidget(speedDial, speedDial->page()); + m_vc->addWidgetToMap(speedDial); + if (render && m_item) + speedDial->render(m_vc->view(), m_item); + } + } + else if (root.name() == KXMLQLCVCXYPad) + { + /* Create a new xyPad into its parent */ + VCXYPad *xyPad = new VCXYPad(m_doc, this); + if (xyPad->loadXML(root) == false) + delete xyPad; + else + { + QQmlEngine::setObjectOwnership(xyPad, QQmlEngine::CppOwnership); + setupWidget(xyPad, xyPad->page()); + m_vc->addWidgetToMap(xyPad); + if (render && m_item) + xyPad->render(m_vc->view(), m_item); + } + } else if (root.name() == KXMLQLCVCClock) { /* Create a new clock into its parent */ diff --git a/qmlui/virtualconsole/vcslider.cpp b/qmlui/virtualconsole/vcslider.cpp index 8d22e3902e..6747ca542d 100644 --- a/qmlui/virtualconsole/vcslider.cpp +++ b/qmlui/virtualconsole/vcslider.cpp @@ -38,6 +38,7 @@ #define INPUT_SLIDER_CONTROL_ID 0 #define INPUT_SLIDER_RESET_ID 1 +#define INPUT_SLIDER_FLASH_ID 2 VCSlider::VCSlider(Doc *doc, QObject *parent) : VCWidget(doc, parent) @@ -64,12 +65,14 @@ VCSlider::VCSlider(Doc *doc, QObject *parent) , m_controlledAttributeId(Function::invalidAttributeId()) , m_attributeMinValue(0) , m_attributeMaxValue(UCHAR_MAX) + , m_adjustFlashEnabled(false) { setType(VCWidget::SliderWidget); setSliderMode(Adjust); registerExternalControl(INPUT_SLIDER_CONTROL_ID, tr("Slider Control"), false); registerExternalControl(INPUT_SLIDER_RESET_ID, tr("Reset Control"), false); + registerExternalControl(INPUT_SLIDER_FLASH_ID, tr("Flash Control"), true); } VCSlider::~VCSlider() @@ -676,7 +679,7 @@ QVariantList VCSlider::clickAndGoPresetsList() return prList; /* Find the first valid channel and return it to QML */ - for (SceneValue scv : m_levelChannels) + for (SceneValue &scv : m_levelChannels) { Fixture *fixture = m_doc->fixture(scv.fxi); if (fixture == nullptr) @@ -849,7 +852,7 @@ void VCSlider::adjustIntensity(qreal val) if (sliderMode() == Adjust) { - Function* function = m_doc->function(m_controlledFunctionId); + Function *function = m_doc->function(m_controlledFunctionId); if (function == nullptr) return; @@ -882,7 +885,7 @@ void VCSlider::slotControlledFunctionStopped(quint32 fid) if (m_controlledAttributeIndex == Function::Intensity) setValue(0, false, true); - Function* function = m_doc->function(fid); + Function *function = m_doc->function(fid); function->releaseAttributeOverride(m_controlledAttributeId); m_controlledAttributeId = Function::invalidAttributeId(); } @@ -898,7 +901,7 @@ void VCSlider::setControlledAttribute(int attributeIndex) if (m_controlledAttributeIndex == attributeIndex) return; - Function* function = m_doc->function(m_controlledFunctionId); + Function *function = m_doc->function(m_controlledFunctionId); if (function == nullptr || attributeIndex >= function->attributes().count()) return; @@ -944,15 +947,46 @@ void VCSlider::adjustFunctionAttribute(Function *f, qreal value) f->adjustAttribute(value, m_controlledAttributeId); } +bool VCSlider::adjustFlashEnabled() const +{ + return m_adjustFlashEnabled; +} + +void VCSlider::setAdjustFlashEnabled(bool enable) +{ + if (enable == m_adjustFlashEnabled) + return; + + m_adjustFlashEnabled = enable; + emit adjustFlashEnabledChanged(enable); +} + +void VCSlider::flashFunction(bool on) +{ + Function *function = m_doc->function(m_controlledFunctionId); + if (function == nullptr) + return; + + if (on) + { + if (m_controlledAttributeId == Function::invalidAttributeId()) + m_adjustFlashPreviousValue = 0; + else + m_adjustFlashPreviousValue = function->getAttributeValue(m_controlledAttributeIndex); + } + + adjustFunctionAttribute(function, on ? 1.0 : m_adjustFlashPreviousValue); +} + QStringList VCSlider::availableAttributes() const { QStringList list; - Function* function = m_doc->function(m_controlledFunctionId); + Function *function = m_doc->function(m_controlledFunctionId); if (function == nullptr) return list; - for (Attribute attr : function->attributes()) + for (Attribute &attr : function->attributes()) list << attr.m_name; return list; @@ -1029,7 +1063,7 @@ void VCSlider::writeDMXLevel(MasterTimer* timer, QList universes) if (clickAndGoType() == CnGColors) { - float f = SCALE(float(m_value), rangeLowLimit(), rangeHighLimit(), 0.0, 200.0); + float f = SCALE(float(modLevel), rangeLowLimit(), rangeHighLimit(), 0.0, 200.0); if ((uchar)f != 0) { @@ -1053,7 +1087,7 @@ void VCSlider::writeDMXLevel(MasterTimer* timer, QList universes) bool mixedDMXlevels = false; int monitorSliderValue = -1; - for (SceneValue scv : m_levelChannels) + for (SceneValue &scv : m_levelChannels) { Fixture* fxi = m_doc->fixture(scv.fxi); if (fxi != nullptr) @@ -1108,7 +1142,7 @@ void VCSlider::writeDMXLevel(MasterTimer* timer, QList universes) if (m_levelValueChanged) { - for (SceneValue scv : m_levelChannels) + for (SceneValue &scv : m_levelChannels) { Fixture* fxi = m_doc->fixture(scv.fxi); if (fxi == nullptr) @@ -1136,6 +1170,10 @@ void VCSlider::writeDMXLevel(MasterTimer* timer, QList universes) if (m_isOverriding) fc->addFlag(FadeChannel::Override); + // request to autoremove LTP channels when set + if (! (chType & FadeChannel::Intensity)) + fc->addFlag(FadeChannel::AutoRemove); + if (chType & FadeChannel::Intensity && clickAndGoType() == CnGColors) { const QLCChannel *qlcch = fxi->channel(scv.channel); @@ -1176,7 +1214,7 @@ void VCSlider::writeDMXAdjust(MasterTimer* timer, QList ua) if (m_adjustChangeCounter == 0) return; - Function* function = m_doc->function(m_controlledFunctionId); + Function *function = m_doc->function(m_controlledFunctionId); if (function == nullptr) return; @@ -1233,15 +1271,22 @@ void VCSlider::updateFeedback() void VCSlider::slotInputValueChanged(quint8 id, uchar value) { + int scaledValue = SCALE(float(value), float(0), float(UCHAR_MAX), + float(rangeLowLimit()), + float(rangeHighLimit())); + switch (id) { case INPUT_SLIDER_CONTROL_ID: - setValue(value, true, false); + setValue(scaledValue, true, false); break; case INPUT_SLIDER_RESET_ID: if (value) setIsOverriding(false); break; + case INPUT_SLIDER_FLASH_ID: + flashFunction(value ? true : false); + break; } } @@ -1323,6 +1368,11 @@ bool VCSlider::loadXML(QXmlStreamReader &root) { loadXMLAdjust(root); } + else if (root.name() == KXMLQLCVCSliderFunctionFlash) + { + setAdjustFlashEnabled(true); + loadXMLSources(root, INPUT_SLIDER_FLASH_ID); + } else if (root.name() == KXMLQLCVCSliderPlayback) // LEGACY { loadXMLLegacyPlayback(root); @@ -1451,6 +1501,11 @@ bool VCSlider::loadXMLLegacyPlayback(QXmlStreamReader &pb_root) setControlledFunction(pb_root.readElementText().toUInt()); setControlledAttribute(Function::Intensity); } + else if (pb_root.name() == KXMLQLCVCSliderFunctionFlash) + { + setAdjustFlashEnabled(true); + loadXMLSources(pb_root, INPUT_SLIDER_FLASH_ID); + } else { qWarning() << Q_FUNC_INFO << "Unknown slider playback tag:" << pb_root.name().toString(); @@ -1524,7 +1579,7 @@ bool VCSlider::saveXML(QXmlStreamWriter *doc) doc->writeAttribute(KXMLQLCVCSliderLevelValue, QString::number(value())); /* Level channels */ - for (SceneValue scv : m_levelChannels) + for (SceneValue &scv : m_levelChannels) { doc->writeStartElement(KXMLQLCVCSliderChannel); doc->writeAttribute(KXMLQLCVCSliderChannelFixture, QString::number(scv.fxi)); @@ -1545,6 +1600,13 @@ bool VCSlider::saveXML(QXmlStreamWriter *doc) doc->writeAttribute(KXMLQLCVCSliderControlledFunction, QString::number(controlledFunction())); /* End the tag */ doc->writeEndElement(); + + if (adjustFlashEnabled()) + { + //doc->writeStartElement(KXMLQLCVCSliderFunctionFlash); + saveXMLInputControl(doc, INPUT_SLIDER_FLASH_ID, KXMLQLCVCSliderFunctionFlash); + //doc->writeEndElement(); + } } /* End the tag */ diff --git a/qmlui/virtualconsole/vcslider.h b/qmlui/virtualconsole/vcslider.h index 573ee4ab1f..b624a271fe 100644 --- a/qmlui/virtualconsole/vcslider.h +++ b/qmlui/virtualconsole/vcslider.h @@ -44,6 +44,7 @@ #define KXMLQLCVCSliderLevelValue QString("Value") #define KXMLQLCVCSliderLevelMonitor QString("Monitor") #define KXMLQLCVCSliderOverrideReset QString("Reset") +#define KXMLQLCVCSliderFunctionFlash QString("Flash") #define KXMLQLCVCSliderChannel QString("Channel") #define KXMLQLCVCSliderChannelFixture QString("Fixture") @@ -75,6 +76,8 @@ class VCSlider : public VCWidget, public DMXSource Q_PROPERTY(int monitorValue READ monitorValue NOTIFY monitorValueChanged) Q_PROPERTY(bool isOverriding READ isOverriding WRITE setIsOverriding NOTIFY isOverridingChanged) + Q_PROPERTY(bool adjustFlashEnabled READ adjustFlashEnabled WRITE setAdjustFlashEnabled NOTIFY adjustFlashEnabledChanged) + Q_PROPERTY(quint32 controlledFunction READ controlledFunction WRITE setControlledFunction NOTIFY controlledFunctionChanged) Q_PROPERTY(int controlledAttribute READ controlledAttribute WRITE setControlledAttribute NOTIFY controlledAttributeChanged) Q_PROPERTY(QStringList availableAttributes READ availableAttributes NOTIFY availableAttributesChanged) @@ -372,6 +375,12 @@ protected slots: void adjustFunctionAttribute(Function *f, qreal value); + /** Get/Set the status of the flash button enablement */ + bool adjustFlashEnabled() const; + void setAdjustFlashEnabled(bool enable); + + Q_INVOKABLE void flashFunction(bool on); + /** Get the list of the available attributes for the Function to control */ QStringList availableAttributes() const; @@ -388,6 +397,7 @@ protected slots: signals: void controlledFunctionChanged(quint32 fid); void controlledAttributeChanged(int attr); + void adjustFlashEnabledChanged(bool enable); void availableAttributesChanged(); void attributeMinValueChanged(); void attributeMaxValueChanged(); @@ -404,6 +414,9 @@ protected slots: qreal m_attributeMinValue; qreal m_attributeMaxValue; + bool m_adjustFlashEnabled; + qreal m_adjustFlashPreviousValue; + /********************************************************************* * Submaster *********************************************************************/ diff --git a/qmlui/virtualconsole/vcspeeddial.cpp b/qmlui/virtualconsole/vcspeeddial.cpp new file mode 100644 index 0000000000..337ae16e36 --- /dev/null +++ b/qmlui/virtualconsole/vcspeeddial.cpp @@ -0,0 +1,169 @@ +/* + Q Light Controller Plus + vcspeeddial.cpp + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include +#include +#include + +#include "doc.h" +#include "vcspeeddial.h" + +VCSpeedDial::VCSpeedDial(Doc *doc, QObject *parent) + : VCWidget(doc, parent) +{ + setType(VCWidget::SpeedDialWidget); +} + +VCSpeedDial::~VCSpeedDial() +{ + if (m_item) + delete m_item; +} + +QString VCSpeedDial::defaultCaption() +{ + return tr("Speed Dial %1").arg(id() + 1); +} + +void VCSpeedDial::setupLookAndFeel(qreal pixelDensity, int page) +{ + setPage(page); + QFont wFont = font(); + wFont.setBold(true); + wFont.setPointSize(pixelDensity * 5.0); + setFont(wFont); +} + +void VCSpeedDial::render(QQuickView *view, QQuickItem *parent) +{ + if (view == nullptr || parent == nullptr) + return; + + QQmlComponent *component = new QQmlComponent(view->engine(), QUrl("qrc:/VCSpeedDialItem.qml")); + + if (component->isError()) + { + qDebug() << component->errors(); + return; + } + + m_item = qobject_cast(component->create()); + + m_item->setParentItem(parent); + m_item->setProperty("speedDialObj", QVariant::fromValue(this)); +} + +QString VCSpeedDial::propertiesResource() const +{ + return QString("qrc:/VCSpeedDialProperties.qml"); +} + +VCWidget *VCSpeedDial::createCopy(VCWidget *parent) +{ + Q_ASSERT(parent != nullptr); + + VCSpeedDial *speedDial = new VCSpeedDial(m_doc, parent); + if (speedDial->copyFrom(this) == false) + { + delete speedDial; + speedDial = nullptr; + } + + return speedDial; +} + +bool VCSpeedDial::copyFrom(const VCWidget *widget) +{ + const VCSpeedDial *speedDial = qobject_cast (widget); + if (speedDial == nullptr) + return false; + + /* Copy and set properties */ + + /* Copy object lists */ + + /* Common stuff */ + return VCWidget::copyFrom(widget); +} + +FunctionParent VCSpeedDial::functionParent() const +{ + return FunctionParent(FunctionParent::AutoVCWidget, id()); +} + +/********************************************************************* + * Load & Save + *********************************************************************/ + +bool VCSpeedDial::loadXML(QXmlStreamReader &root) +{ + if (root.name() != KXMLQLCVCSpeedDial) + { + qWarning() << Q_FUNC_INFO << "Speed dial node not found"; + return false; + } + + QXmlStreamAttributes attrs = root.attributes(); + + /* Widget commons */ + loadXMLCommon(root); + + while (root.readNextStartElement()) + { + if (root.name() == KXMLQLCWindowState) + { + bool visible = false; + int x = 0, y = 0, w = 0, h = 0; + loadXMLWindowState(root, &x, &y, &w, &h, &visible); + setGeometry(QRect(x, y, w, h)); + } + else if (root.name() == KXMLQLCVCWidgetAppearance) + { + loadXMLAppearance(root); + } + else + { + qWarning() << Q_FUNC_INFO << "Unknown speed dial tag:" << root.name().toString(); + root.skipCurrentElement(); + } + } + + return true; +} + +bool VCSpeedDial::saveXML(QXmlStreamWriter *doc) +{ + Q_ASSERT(doc != nullptr); + + /* VC object entry */ + doc->writeStartElement(KXMLQLCVCSpeedDial); + + saveXMLCommon(doc); + + /* Window state */ + saveXMLWindowState(doc); + + /* Appearance */ + saveXMLAppearance(doc); + + /* Write the tag */ + doc->writeEndElement(); + + return true; +} diff --git a/qmlui/virtualconsole/vcspeeddial.h b/qmlui/virtualconsole/vcspeeddial.h new file mode 100644 index 0000000000..0684b10227 --- /dev/null +++ b/qmlui/virtualconsole/vcspeeddial.h @@ -0,0 +1,118 @@ +/* + Q Light Controller Plus + vcspeeddial.h + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef VCSPEEDDIAL_H +#define VCSPEEDDIAL_H + +#include "vcwidget.h" + +#define KXMLQLCVCSpeedDial QString("SpeedDial") +#define KXMLQLCVCSpeedDialSpeedTypes QString("SpeedTypes") +#define KXMLQLCVCSpeedDialAbsoluteValue QString("AbsoluteValue") +#define KXMLQLCVCSpeedDialAbsoluteValueMin QString("Minimum") +#define KXMLQLCVCSpeedDialAbsoluteValueMax QString("Maximum") +#define KXMLQLCVCSpeedDialTap QString("Tap") +#define KXMLQLCVCSpeedDialMult QString("Mult") +#define KXMLQLCVCSpeedDialDiv QString("Div") +#define KXMLQLCVCSpeedDialMultDivReset QString("MultDivReset") +#define KXMLQLCVCSpeedDialApply QString("Apply") +#define KXMLQLCVCSpeedDialTapKey QString("Key") +#define KXMLQLCVCSpeedDialMultKey QString("MultKey") +#define KXMLQLCVCSpeedDialDivKey QString("DivKey") +#define KXMLQLCVCSpeedDialMultDivResetKey QString("MultDivResetKey") +#define KXMLQLCVCSpeedDialApplyKey QString("ApplyKey") +#define KXMLQLCVCSpeedDialResetFactorOnDialChange QString("ResetFactorOnDialChange") +#define KXMLQLCVCSpeedDialVisibilityMask QString("Visibility") +#define KXMLQLCVCSpeedDialTime QString("Time") + +// Legacy: infinite checkbox +#define KXMLQLCVCSpeedDialInfinite QString("Infinite") +#define KXMLQLCVCSpeedDialInfiniteKey QString("InfiniteKey") + +class VCSpeedDial : public VCWidget +{ + Q_OBJECT + + /********************************************************************* + * Initialization + *********************************************************************/ +public: + VCSpeedDial(Doc* doc = nullptr, QObject *parent = nullptr); + virtual ~VCSpeedDial(); + + /** @reimp */ + QString defaultCaption(); + + /** @reimp */ + void setupLookAndFeel(qreal pixelDensity, int page); + + /** @reimp */ + void render(QQuickView *view, QQuickItem *parent); + + /** @reimp */ + QString propertiesResource() const; + + /** @reimp */ + VCWidget *createCopy(VCWidget *parent); + +protected: + /** @reimp */ + bool copyFrom(const VCWidget* widget); + +private: + FunctionParent functionParent() const; + + /********************************************************************* + * Type + *********************************************************************/ +public: + +signals: + +private: + + /********************************************************************* + * Data + *********************************************************************/ +public: + +protected slots: + +signals: + +private: + + /********************************************************************* + * Functions connections + *********************************************************************/ +public: + +signals: + +private: + + /********************************************************************* + * Load & Save + *********************************************************************/ +public: + bool loadXML(QXmlStreamReader &root); + bool saveXML(QXmlStreamWriter *doc); +}; + +#endif diff --git a/qmlui/virtualconsole/vcwidget.cpp b/qmlui/virtualconsole/vcwidget.cpp index 65fa66700f..ae49e1c482 100644 --- a/qmlui/virtualconsole/vcwidget.cpp +++ b/qmlui/virtualconsole/vcwidget.cpp @@ -120,7 +120,12 @@ bool VCWidget::copyFrom(const VCWidget* widget) { QSharedPointer dst(new QLCInputSource(src->universe(), src->channel())); dst->setID(src->id()); - dst->setRange(src->lowerValue(), src->upperValue()); + dst->setFeedbackValue(QLCInputFeedback::LowerValue, src->feedbackValue(QLCInputFeedback::LowerValue)); + dst->setFeedbackValue(QLCInputFeedback::UpperValue, src->feedbackValue(QLCInputFeedback::UpperValue)); + dst->setFeedbackValue(QLCInputFeedback::MonitorValue, src->feedbackValue(QLCInputFeedback::MonitorValue)); + dst->setFeedbackExtraParams(QLCInputFeedback::LowerValue, src->feedbackExtraParams(QLCInputFeedback::LowerValue)); + dst->setFeedbackExtraParams(QLCInputFeedback::UpperValue, src->feedbackExtraParams(QLCInputFeedback::UpperValue)); + dst->setFeedbackExtraParams(QLCInputFeedback::MonitorValue, src->feedbackExtraParams(QLCInputFeedback::MonitorValue)); addInputSource(dst); } @@ -659,6 +664,16 @@ void VCWidget::addInputSource(QSharedPointer const& source) QLCInputChannel *ich = ip->profile()->channel(source->channel() & 0x0000FFFF); if (ich != nullptr) { + QLCInputProfile *profile = ip->profile(); + + // retrieve plugin specific params for feedback + if (source->feedbackExtraParams(QLCInputFeedback::LowerValue).toInt() == -1) + source->setFeedbackExtraParams(QLCInputFeedback::LowerValue, profile->channelExtraParams(ich)); + if (source->feedbackExtraParams(QLCInputFeedback::UpperValue).toInt() == -1) + source->setFeedbackExtraParams(QLCInputFeedback::UpperValue, profile->channelExtraParams(ich)); + if (source->feedbackExtraParams(QLCInputFeedback::MonitorValue).toInt() == -1) + source->setFeedbackExtraParams(QLCInputFeedback::MonitorValue, profile->channelExtraParams(ich)); + if (ich->movementType() == QLCInputChannel::Relative) { source->setWorkingMode(QLCInputSource::Relative); @@ -682,9 +697,16 @@ void VCWidget::addInputSource(QSharedPointer const& source) this, SLOT(slotInputSourceValueChanged(quint32,quint32,uchar))); } - // user custom feedbacks have precedence over input profile custom feedbacks - source->setRange((source->lowerValue() != 0) ? source->lowerValue() : ich->lowerValue(), - (source->upperValue() != UCHAR_MAX) ? source->upperValue() : ich->upperValue()); + // user custom feedback have precedence over input profile custom feedback + uchar lower = source->feedbackValue(QLCInputFeedback::LowerValue) != 0 ? + source->feedbackValue(QLCInputFeedback::LowerValue) : + ich->lowerValue(); + uchar upper = source->feedbackValue(QLCInputFeedback::UpperValue) != UCHAR_MAX ? + source->feedbackValue(QLCInputFeedback::UpperValue) : + ich->upperValue(); + + source->setFeedbackValue(QLCInputFeedback::LowerValue, lower); + source->setFeedbackValue(QLCInputFeedback::UpperValue, upper); } } } @@ -725,7 +747,8 @@ bool VCWidget::updateInputSourceRange(quint32 universe, quint32 channel, quint8 { if (source->universe() == universe && source->channel() == channel) { - source->setRange(lower, upper); + source->setFeedbackValue(QLCInputFeedback::LowerValue, lower); + source->setFeedbackValue(QLCInputFeedback::UpperValue, upper); return true; } } @@ -787,16 +810,20 @@ QVariantList VCWidget::inputSourcesList() } QVariantMap sourceMap; + uchar lower = source->feedbackValue(QLCInputFeedback::LowerValue); + uchar upper = source->feedbackValue(QLCInputFeedback::UpperValue); + if (source->isValid() == false) sourceMap.insert("invalid", true); + sourceMap.insert("type", Controller); sourceMap.insert("id", source->id()); sourceMap.insert("uniString", uniName); sourceMap.insert("chString", chName); sourceMap.insert("universe", source->universe()); sourceMap.insert("channel", source->channel()); - sourceMap.insert("lower", source->lowerValue() != 0 ? source->lowerValue() : min); - sourceMap.insert("upper", source->upperValue() != UCHAR_MAX ? source->upperValue() : max); + sourceMap.insert("lower", lower != 0 ? lower : min); + sourceMap.insert("upper", upper != UCHAR_MAX ? upper : max); sourceMap.insert("customFeedback", supportCustomFeedback); m_sourcesList.append(sourceMap); } @@ -863,9 +890,11 @@ void VCWidget::sendFeedback(int value, quint8 id, SourceValueType type) continue; if (type == LowerValue) - value = source->lowerValue(); + value = source->feedbackValue(QLCInputFeedback::LowerValue); else if (type == UpperValue) - value = source->upperValue(); + value = source->feedbackValue(QLCInputFeedback::UpperValue); + else if (type == MonitorValue) + value = source->feedbackValue(QLCInputFeedback::MonitorValue); // if in relative mode, send a "feedback" to this // input source so it can continue to emit values @@ -1084,7 +1113,7 @@ bool VCWidget::loadXMLInputSource(QXmlStreamReader &root, const quint8 &id) quint32 uni = attrs.value(KXMLQLCVCWidgetInputUniverse).toString().toUInt(); quint32 ch = attrs.value(KXMLQLCVCWidgetInputChannel).toString().toUInt(); - uchar min = 0, max = UCHAR_MAX; + uchar min = 0, max = UCHAR_MAX, mon = UCHAR_MAX; QSharedPointerinputSource = QSharedPointer(new QLCInputSource(uni, ch)); inputSource->setID(id); @@ -1093,8 +1122,20 @@ bool VCWidget::loadXMLInputSource(QXmlStreamReader &root, const quint8 &id) min = uchar(attrs.value(KXMLQLCVCWidgetInputLowerValue).toString().toUInt()); if (attrs.hasAttribute(KXMLQLCVCWidgetInputUpperValue)) max = uchar(attrs.value(KXMLQLCVCWidgetInputUpperValue).toString().toUInt()); + if (attrs.hasAttribute(KXMLQLCVCWidgetInputMonitorValue)) + mon = uchar(attrs.value(KXMLQLCVCWidgetInputMonitorValue).toString().toUInt()); + + inputSource->setFeedbackValue(QLCInputFeedback::LowerValue, min); + inputSource->setFeedbackValue(QLCInputFeedback::UpperValue, max); + inputSource->setFeedbackValue(QLCInputFeedback::MonitorValue, mon); - inputSource->setRange(min, max); + // load feedback extra params + if (attrs.hasAttribute(KXMLQLCVCWidgetInputLowerParams)) + inputSource->setFeedbackExtraParams(QLCInputFeedback::LowerValue, attrs.value(KXMLQLCVCWidgetInputLowerParams).toInt()); + if (attrs.hasAttribute(KXMLQLCVCWidgetInputUpperParams)) + inputSource->setFeedbackExtraParams(QLCInputFeedback::UpperValue, attrs.value(KXMLQLCVCWidgetInputUpperParams).toInt()); + if (attrs.hasAttribute(KXMLQLCVCWidgetInputMonitorParams)) + inputSource->setFeedbackExtraParams(QLCInputFeedback::MonitorValue, attrs.value(KXMLQLCVCWidgetInputMonitorParams).toInt()); addInputSource(inputSource); @@ -1262,10 +1303,29 @@ bool VCWidget::saveXMLInputControl(QXmlStreamWriter *doc, quint8 controlId, QStr doc->writeStartElement(KXMLQLCVCWidgetInput); doc->writeAttribute(KXMLQLCVCWidgetInputUniverse, QString("%1").arg(source->universe())); doc->writeAttribute(KXMLQLCVCWidgetInputChannel, QString("%1").arg(source->channel())); - if (source->lowerValue() != 0) - doc->writeAttribute(KXMLQLCVCWidgetInputLowerValue, QString::number(source->lowerValue())); - if (source->upperValue() != UCHAR_MAX) - doc->writeAttribute(KXMLQLCVCWidgetInputUpperValue, QString::number(source->upperValue())); + if (source->feedbackValue(QLCInputFeedback::LowerValue) != 0) + doc->writeAttribute(KXMLQLCVCWidgetInputLowerValue, QString::number(source->feedbackValue(QLCInputFeedback::LowerValue))); + if (source->feedbackValue(QLCInputFeedback::UpperValue) != UCHAR_MAX) + doc->writeAttribute(KXMLQLCVCWidgetInputUpperValue, QString::number(source->feedbackValue(QLCInputFeedback::UpperValue))); + if (source->feedbackValue(QLCInputFeedback::MonitorValue) != UCHAR_MAX) + doc->writeAttribute(KXMLQLCVCWidgetInputMonitorValue, QString::number(source->feedbackValue(QLCInputFeedback::MonitorValue))); + + // save feedback extra params + QVariant extraParams = source->feedbackExtraParams(QLCInputFeedback::LowerValue); + + if (extraParams.isValid() && extraParams.type() == QVariant::Int && extraParams.toInt() != -1) + doc->writeAttribute(KXMLQLCVCWidgetInputLowerParams, QString::number(extraParams.toInt())); + + extraParams = source->feedbackExtraParams(QLCInputFeedback::UpperValue); + + if (extraParams.isValid() && extraParams.type() == QVariant::Int && extraParams.toInt() != -1) + doc->writeAttribute(KXMLQLCVCWidgetInputUpperParams, QString::number(extraParams.toInt())); + + extraParams = source->feedbackExtraParams(QLCInputFeedback::MonitorValue); + + if (extraParams.isValid() && extraParams.type() == QVariant::Int && extraParams.toInt() != -1) + doc->writeAttribute(KXMLQLCVCWidgetInputMonitorParams, QString::number(extraParams.toInt())); + doc->writeEndElement(); } diff --git a/qmlui/virtualconsole/vcwidget.h b/qmlui/virtualconsole/vcwidget.h index e63ee77d70..67bf43e613 100644 --- a/qmlui/virtualconsole/vcwidget.h +++ b/qmlui/virtualconsole/vcwidget.h @@ -54,12 +54,16 @@ #define KXMLQLCWindowStateWidth QString("Width") #define KXMLQLCWindowStateHeight QString("Height") -#define KXMLQLCVCWidgetKey QString("Key") -#define KXMLQLCVCWidgetInput QString("Input") -#define KXMLQLCVCWidgetInputUniverse QString("Universe") -#define KXMLQLCVCWidgetInputChannel QString("Channel") -#define KXMLQLCVCWidgetInputLowerValue QString("LowerValue") -#define KXMLQLCVCWidgetInputUpperValue QString("UpperValue") +#define KXMLQLCVCWidgetKey QString("Key") +#define KXMLQLCVCWidgetInput QString("Input") +#define KXMLQLCVCWidgetInputUniverse QString("Universe") +#define KXMLQLCVCWidgetInputChannel QString("Channel") +#define KXMLQLCVCWidgetInputLowerValue QString("LowerValue") +#define KXMLQLCVCWidgetInputUpperValue QString("UpperValue") +#define KXMLQLCVCWidgetInputMonitorValue QString("MonitorValue") +#define KXMLQLCVCWidgetInputLowerParams QString("LowerParams") +#define KXMLQLCVCWidgetInputUpperParams QString("UpperParams") +#define KXMLQLCVCWidgetInputMonitorParams QString("MonitorParams") typedef struct { @@ -480,7 +484,7 @@ class VCWidget : public QObject * Input sources *********************************************************************/ public: - enum SourceValueType { ExactValue, LowerValue, UpperValue }; + enum SourceValueType { ExactValue, LowerValue, UpperValue, MonitorValue }; Q_ENUM(SourceValueType) /** diff --git a/qmlui/virtualconsole/vcxypad.cpp b/qmlui/virtualconsole/vcxypad.cpp new file mode 100644 index 0000000000..539176aa14 --- /dev/null +++ b/qmlui/virtualconsole/vcxypad.cpp @@ -0,0 +1,169 @@ +/* + Q Light Controller Plus + vcxypad.cpp + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include +#include +#include + +#include "doc.h" +#include "vcxypad.h" + +VCXYPad::VCXYPad(Doc *doc, QObject *parent) + : VCWidget(doc, parent) +{ + setType(VCWidget::XYPadWidget); +} + +VCXYPad::~VCXYPad() +{ + if (m_item) + delete m_item; +} + +QString VCXYPad::defaultCaption() +{ + return tr("XY Pad %1").arg(id() + 1); +} + +void VCXYPad::setupLookAndFeel(qreal pixelDensity, int page) +{ + setPage(page); + QFont wFont = font(); + wFont.setBold(true); + wFont.setPointSize(pixelDensity * 5.0); + setFont(wFont); +} + +void VCXYPad::render(QQuickView *view, QQuickItem *parent) +{ + if (view == nullptr || parent == nullptr) + return; + + QQmlComponent *component = new QQmlComponent(view->engine(), QUrl("qrc:/VCXYPadItem.qml")); + + if (component->isError()) + { + qDebug() << component->errors(); + return; + } + + m_item = qobject_cast(component->create()); + + m_item->setParentItem(parent); + m_item->setProperty("xyPadObj", QVariant::fromValue(this)); +} + +QString VCXYPad::propertiesResource() const +{ + return QString("qrc:/VCXYPadProperties.qml"); +} + +VCWidget *VCXYPad::createCopy(VCWidget *parent) +{ + Q_ASSERT(parent != nullptr); + + VCXYPad *XYPad = new VCXYPad(m_doc, parent); + if (XYPad->copyFrom(this) == false) + { + delete XYPad; + XYPad = nullptr; + } + + return XYPad; +} + +bool VCXYPad::copyFrom(const VCWidget *widget) +{ + const VCXYPad *XYPad = qobject_cast (widget); + if (XYPad == nullptr) + return false; + + /* Copy and set properties */ + + /* Copy object lists */ + + /* Common stuff */ + return VCWidget::copyFrom(widget); +} + +FunctionParent VCXYPad::functionParent() const +{ + return FunctionParent(FunctionParent::AutoVCWidget, id()); +} + +/********************************************************************* + * Load & Save + *********************************************************************/ + +bool VCXYPad::loadXML(QXmlStreamReader &root) +{ + if (root.name() != KXMLQLCVCXYPad) + { + qWarning() << Q_FUNC_INFO << "XY Pad node not found"; + return false; + } + + QXmlStreamAttributes attrs = root.attributes(); + + /* Widget commons */ + loadXMLCommon(root); + + while (root.readNextStartElement()) + { + if (root.name() == KXMLQLCWindowState) + { + bool visible = false; + int x = 0, y = 0, w = 0, h = 0; + loadXMLWindowState(root, &x, &y, &w, &h, &visible); + setGeometry(QRect(x, y, w, h)); + } + else if (root.name() == KXMLQLCVCWidgetAppearance) + { + loadXMLAppearance(root); + } + else + { + qWarning() << Q_FUNC_INFO << "Unknown XY pad tag:" << root.name().toString(); + root.skipCurrentElement(); + } + } + + return true; +} + +bool VCXYPad::saveXML(QXmlStreamWriter *doc) +{ + Q_ASSERT(doc != nullptr); + + /* VC object entry */ + doc->writeStartElement(KXMLQLCVCXYPad); + + saveXMLCommon(doc); + + /* Window state */ + saveXMLWindowState(doc); + + /* Appearance */ + saveXMLAppearance(doc); + + /* Write the tag */ + doc->writeEndElement(); + + return true; +} diff --git a/qmlui/virtualconsole/vcxypad.h b/qmlui/virtualconsole/vcxypad.h new file mode 100644 index 0000000000..6cd6434eba --- /dev/null +++ b/qmlui/virtualconsole/vcxypad.h @@ -0,0 +1,112 @@ +/* + Q Light Controller Plus + vcxypad.h + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef VCXYPAD_H +#define VCXYPAD_H + +#include "vcwidget.h" + +#define KXMLQLCVCXYPad QString("XYPad") +#define KXMLQLCVCXYPadPan QString("Pan") +#define KXMLQLCVCXYPadTilt QString("Tilt") +#define KXMLQLCVCXYPadWidth QString("Width") +#define KXMLQLCVCXYPadHeight QString("Height") +#define KXMLQLCVCXYPadPosition QString("Position") +#define KXMLQLCVCXYPadRangeWindow QString("Window") +#define KXMLQLCVCXYPadRangeHorizMin QString("hMin") +#define KXMLQLCVCXYPadRangeHorizMax QString("hMax") +#define KXMLQLCVCXYPadRangeVertMin QString("vMin") +#define KXMLQLCVCXYPadRangeVertMax QString("vMax") + +#define KXMLQLCVCXYPadPositionX "X" // Legacy +#define KXMLQLCVCXYPadPositionY "Y" // Legacy + +#define KXMLQLCVCXYPadInvertedAppearance "InvertedAppearance" + +class VCXYPad : public VCWidget +{ + Q_OBJECT + + /********************************************************************* + * Initialization + *********************************************************************/ +public: + VCXYPad(Doc* doc = nullptr, QObject *parent = nullptr); + virtual ~VCXYPad(); + + /** @reimp */ + QString defaultCaption(); + + /** @reimp */ + void setupLookAndFeel(qreal pixelDensity, int page); + + /** @reimp */ + void render(QQuickView *view, QQuickItem *parent); + + /** @reimp */ + QString propertiesResource() const; + + /** @reimp */ + VCWidget *createCopy(VCWidget *parent); + +protected: + /** @reimp */ + bool copyFrom(const VCWidget* widget); + +private: + FunctionParent functionParent() const; + + /********************************************************************* + * Type + *********************************************************************/ +public: + +signals: + +private: + + /********************************************************************* + * Data + *********************************************************************/ +public: + +protected slots: + +signals: + +private: + + /********************************************************************* + * Functions connections + *********************************************************************/ +public: + +signals: + +private: + + /********************************************************************* + * Load & Save + *********************************************************************/ +public: + bool loadXML(QXmlStreamReader &root); + bool saveXML(QXmlStreamWriter *doc); +}; + +#endif diff --git a/qmlui/virtualconsole/virtualconsole.cpp b/qmlui/virtualconsole/virtualconsole.cpp index bc17556a08..92664ee582 100644 --- a/qmlui/virtualconsole/virtualconsole.cpp +++ b/qmlui/virtualconsole/virtualconsole.cpp @@ -33,6 +33,10 @@ #include "vcslider.h" #include "vcframe.h" #include "vclabel.h" +#include "vcanimation.h" +#include "vcaudiotrigger.h" +#include "vcxypad.h" +#include "vcspeeddial.h" #include "vcclock.h" #include "vcpage.h" #include "tardis.h" @@ -96,6 +100,10 @@ VirtualConsole::VirtualConsole(QQuickView *view, Doc *doc, qmlRegisterType("org.qlcplus.classes", 1, 0, "VCButton"); qmlRegisterType("org.qlcplus.classes", 1, 0, "VCLabel"); qmlRegisterType("org.qlcplus.classes", 1, 0, "VCSlider"); + qmlRegisterType("org.qlcplus.classes", 1, 0, "VCAnimation"); + qmlRegisterType("org.qlcplus.classes", 1, 0, "VCAudioTrigger"); + qmlRegisterType("org.qlcplus.classes", 1, 0, "VCXYPad"); + qmlRegisterType("org.qlcplus.classes", 1, 0, "VCSpeedDial"); qmlRegisterType("org.qlcplus.classes", 1, 0, "VCClock"); qmlRegisterType("org.qlcplus.classes", 1, 0, "VCClockSchedule"); qmlRegisterType("org.qlcplus.classes", 1, 0, "VCCueList"); diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index 01910ebf6d..42ff4fe251 100644 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -7,9 +7,6 @@ add_subdirectory(miditemplates) add_subdirectory(modifierstemplates) add_subdirectory(rgbscripts) add_subdirectory(samples) -if(NOT qmlui) - add_subdirectory(docs) -endif() if(qmlui) add_subdirectory(colorfilters) add_subdirectory(meshes) diff --git a/resources/colorfilters/CMakeLists.txt b/resources/colorfilters/CMakeLists.txt index 73aeb6c5b9..bbfb7df23e 100644 --- a/resources/colorfilters/CMakeLists.txt +++ b/resources/colorfilters/CMakeLists.txt @@ -2,4 +2,15 @@ project(colorfilters) file(GLOB COLOR_FILTER_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.qxcf") -install(FILES ${COLOR_FILTER_FILES} DESTINATION ${INSTALLROOT}/${COLORFILTERSDIR}) \ No newline at end of file +if(ANDROID) + set(COLOR_FILTERS_ASSETS_DIR "${ANDROID_PACKAGE_SOURCE_DIR}/${COLORFILTERSDIR}") + # Create the assets directory if it doesn't exist + file(MAKE_DIRECTORY ${COLOR_FILTERS_ASSETS_DIR}) + + # Copy the color filter files to the assets directory + foreach(COLOR_FILTER_FILE ${COLOR_FILTER_FILES}) + file(COPY ${COLOR_FILTER_FILE} DESTINATION ${COLOR_FILTERS_ASSETS_DIR}) + endforeach() +endif() + +install(FILES ${COLOR_FILTER_FILES} DESTINATION ${INSTALLROOT}/${COLORFILTERSDIR}) diff --git a/resources/docs/CMakeLists.txt b/resources/docs/CMakeLists.txt index ddc718d5b3..5097d7837f 100644 --- a/resources/docs/CMakeLists.txt +++ b/resources/docs/CMakeLists.txt @@ -1,7 +1,28 @@ project(docs) file(GLOB HTML_FILES "${CMAKE_CURRENT_SOURCE_DIR}/html_en_EN/*.html") -install(FILES ${HTML_FILES} DESTINATION ${INSTALLROOT}/${DOCSDIR}/html) - file(GLOB IMAGE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/*.png") -install(FILES ${IMAGE_FILES} DESTINATION ${INSTALLROOT}/${DOCSDIR}/images) \ No newline at end of file + +# Only perform the copy if we're building for Android +if(ANDROID) + # Define the destination directories for the HTML and image files within the Android package + set(HTML_ASSETS_DIR "${ANDROID_PACKAGE_SOURCE_DIR}/${DOCSDIR}/html") + set(IMAGES_ASSETS_DIR "${ANDROID_PACKAGE_SOURCE_DIR}/${DOCSDIR}/images") + + # Create the assets directories if they don't exist + file(MAKE_DIRECTORY ${HTML_ASSETS_DIR}) + file(MAKE_DIRECTORY ${IMAGES_ASSETS_DIR}) + + # Copy the HTML files to the assets directory + foreach(HTML_FILE IN LISTS HTML_FILES) + file(COPY ${HTML_FILE} DESTINATION ${HTML_ASSETS_DIR}) + endforeach() + + # Copy the image files to the assets directory + foreach(IMAGE_FILE IN LISTS IMAGE_FILES) + file(COPY ${IMAGE_FILE} DESTINATION ${IMAGES_ASSETS_DIR}) + endforeach() +endif() + +install(FILES ${HTML_FILES} DESTINATION ${INSTALLROOT}/${DOCSDIR}/html) +install(FILES ${IMAGE_FILES} DESTINATION ${INSTALLROOT}/${DOCSDIR}/images) diff --git a/resources/docs/html_en_EN/fixturemanager.html b/resources/docs/html_en_EN/fixturemanager.html index 70a3c1d41c..e92cc2332d 100644 --- a/resources/docs/html_en_EN/fixturemanager.html +++ b/resources/docs/html_en_EN/fixturemanager.html @@ -100,6 +100,13 @@

    Controls

    Opens the Fixtures remapping window. + + + + Enables or disables the Highlight Fixtures features. When enabled, this will set the selected features to max brightness + so you can easily verify these fixture are patched correctly. + + diff --git a/resources/docs/html_en_EN/supported-input-devices.html b/resources/docs/html_en_EN/supported-input-devices.html index d514f394d4..c8eb035b88 100644 --- a/resources/docs/html_en_EN/supported-input-devices.html +++ b/resources/docs/html_en_EN/supported-input-devices.html @@ -336,6 +336,16 @@

    Supported Input Devices

    + +Worlde Easypad.12 +MIDI +1 +Worlde Easypad.12 +none +no +No bank button and slider (require SYSEX support) + + Zoom R16 MIDI diff --git a/resources/fixtures/AFX/AFX-CLUB-MIX3-19x10W-RGBW.qxf b/resources/fixtures/AFX/AFX-CLUB-MIX3-19x10W-RGBW.qxf new file mode 100644 index 0000000000..dd3765e445 --- /dev/null +++ b/resources/fixtures/AFX/AFX-CLUB-MIX3-19x10W-RGBW.qxf @@ -0,0 +1,167 @@ + + + + + Q Light Controller Plus + 4.12.8 GIT + Florian Faber + + AFX + CLUB-MIX3 19x10W RGBW + Color Changer + + + Shutter + Shutter closed + Shutter open + Strobe effect slow to fast + Shutter open + Pulse-effect in sequences slow to fast + Shutter open + Random strobe effect slow to fast + Shutter open + + + + + + + Colour + No function + Red + Green + Blue + White + Red + Green + Red + Blue + Red + White + Green + Blue + Green + White + Blue + White + R + G + B + R + G + B + W + 2700K + 3200K + 3500K + 5000K + 5500K + 6000K + 6500K + 7000K + 8000K + + + Colour + No Function + Below 3200K + 3200K-3500K + 3500K-5000K + 5000K-5500K + 5500K-6000K + 6000K-6500K + 6500K-7000K + 7000K-8000K + + + Effect + No Function + Macro Run 1 + Macro Run 2 + Macro Run 3 + Macro Run 4 + Macro Run 5 + Macro Run 6 + Macro Run 7 + Macro Run 8 + Macro Sound 1 + Macro Sound 2 + Macro Sound 3 + Macro Sound 4 + Macro Sound 5 + Macro Sound 7 + + + Speed + Macro Speed from Slow to Fast + + + + + + + + + + + + + + + Master dimmer + Strobe + Red + Green + Blue + White + Macro Color + Color Temp + Macro Run + Macro Speed + + + Master dimmer + Strobe + Red + Green + Blue + White + Red 1 + Green 1 + Blue 1 + White 1 + Red 2 + Green 2 + Blue 2 + White 2 + Red 3 + Green 3 + Blue 3 + White 3 + Macro Color + Color Temp + Macro Run + Macro Speed + + 2 + 3 + 4 + 5 + + + 6 + 7 + 8 + 9 + + + 10 + 11 + 12 + 13 + + + 14 + 16 + 15 + 17 + + + + + + + + + + + diff --git a/resources/fixtures/Acme/Acme-Dotline180.qxf b/resources/fixtures/Acme/Acme-Dotline180.qxf new file mode 100644 index 0000000000..b67157debb --- /dev/null +++ b/resources/fixtures/Acme/Acme-Dotline180.qxf @@ -0,0 +1,187 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Michael Tosatto + + Acme + Dotline180 + Moving Head + + + + Speed + Auto speed + Tilt (Slow to fast) + Auto speed + + + + + + Shutter + Shutter closed + Shutter open + Strobe effect (Fast to slow) + Shutter open + Pulse-effect in sequences + Shutter open + Random strobe effect (Slow to fast) + Shutter open + + + + + + + + + + + + + + + + + + + + + + + + + + + Maintenance + No function + Black out when Tilt moving + Disable Black out when Tilt moving + Reset All Motor + Reset Tilt Motor + Reset Zoom Motor + Dimmer Speed: Smooth + Dimmer Speed: Fast + No function + + + Effect + No function + Macro 1 + Macro 2 + Macro 3 + Macro 4 + Macro 5 + Macro 6 + Macro 7 + + + Colour + Foreground Color + + + Colour + Background Color + + + + + + + Tilt + Tilt fine + Tilt speed + Zoom + Dimmer + Dimmer fine + Strobe + LED1 Red + LED1 Green + LED1 Blue + LED1 White + LED2 Red + LED2 Green + LED2 Blue + LED2 White + LED3 Red + LED3 Green + LED3 Blue + LED3 White + LED4 Red + LED4 Green + LED4 Blue + LED4 White + LED5 Red + LED5 Green + LED5 Blue + LED5 White + LED6 Red + LED6 Green + LED6 Blue + LED6 White + Special Function + + 7 + 8 + 9 + 10 + + + 11 + 12 + 13 + 14 + + + 15 + 16 + 17 + 18 + + + 19 + 20 + 21 + 22 + + + 23 + 24 + 25 + 26 + + + 27 + 28 + 29 + 30 + + + + Tilt + Tilt fine + Zoom + Dimmer + Dimmer fine + Strobe + Macro + Foreground Color + Background Color + Red + Green + Blue + White + Special Function + + + + + + + + + + diff --git a/resources/fixtures/Acme/Acme-Dotline360.qxf b/resources/fixtures/Acme/Acme-Dotline360.qxf new file mode 100644 index 0000000000..a6a44680a5 --- /dev/null +++ b/resources/fixtures/Acme/Acme-Dotline360.qxf @@ -0,0 +1,409 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Michael Tosatto + + Acme + Dotline360 + Moving Head + + + + Speed + Auto speed + Tilt (Slow to fast) + Auto speed + + + + + + Shutter + Shutter closed + Shutter open + Strobe effect (Fast to slow) + Shutter open + Pulse-effect in sequences + Shutter open + Random strobe effect (Slow to fast) + Shutter open + + + + + + + + + + + + + + + + + + + + + + + + + + + Maintenance + No function + Black out when Tilt moving + Disable Black out when Tilt moving + Reset All Motor + Reset Tilt Motor + Reset Zoom Motor + Dimmer Speed: Smooth + Dimmer Speed: Fast + Invert Pixel Order: No + Invert Pixel Order: Yes + No function + + + Effect + No function + Macro 1 + Macro 2 + Macro 3 + Macro 4 + Macro 5 + Macro 6 + Macro 7 + + + Colour + Foreground Color + + + Colour + Background Color + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tilt + Tilt fine + Tilt speed + Zoom 1 + Zoom 2 + Dimmer + Dimmer fine + Strobe + LED1 Red + LED1 Green + LED1 Blue + LED1 White + LED2 Red + LED2 Green + LED2 Blue + LED2 White + LED3 Red + LED3 Green + LED3 Blue + LED3 White + LED4 Red + LED4 Green + LED4 Blue + LED4 White + LED5 Red + LED5 Green + LED5 Blue + LED5 White + LED6 Red + LED6 Green + LED6 Blue + LED6 White + LED7 Red + LED7 Green + LED7 Blue + LED7 White + LED8 Red + LED8 Green + LED8 Blue + LED8 White + LED9 Red + LED9 Green + LED9 Blue + LED9 White + LED10 Red + LED10 Green + LED10 Blue + LED10 White + LED11 Red + LED11 Green + LED11 Blue + LED11 White + LED12 Red + LED12 Green + LED12 Blue + LED12 White + Special Function + + 8 + 9 + 10 + 11 + + + 12 + 13 + 14 + 15 + + + 16 + 17 + 18 + 19 + + + 20 + 21 + 22 + 23 + + + 24 + 25 + 26 + 27 + + + 28 + 29 + 30 + 31 + + + 34 + 33 + 32 + 35 + + + 39 + 38 + 37 + 36 + + + 43 + 42 + 41 + 40 + + + 47 + 46 + 45 + 44 + + + 51 + 50 + 49 + 48 + + + 55 + 54 + 53 + 52 + + + + Tilt + Tilt fine + Zoom + Dimmer + Dimmer fine + Strobe + Macro + Foreground Color + Background Color + Red + Green + Blue + White + Special Function + + + Tilt + Tilt fine + Tilt speed + Zoom 1 + Zoom 2 + Dimmer + Dimmer fine + Strobe + Special Function + + + LED1 Red + LED1 Green + LED1 Blue + LED1 White + LED2 Red + LED2 Green + LED2 Blue + LED2 White + LED3 Red + LED3 Green + LED3 Blue + LED3 White + LED4 Red + LED4 Green + LED4 Blue + LED4 White + LED5 Red + LED5 Green + LED5 Blue + LED5 White + LED6 Red + LED6 Green + LED6 Blue + LED6 White + LED7 Red + LED7 Green + LED7 Blue + LED7 White + LED8 Red + LED8 Green + LED8 Blue + LED8 White + LED9 Red + LED9 Green + LED9 Blue + LED9 White + LED10 Red + LED10 Green + LED10 Blue + LED10 White + LED11 Red + LED11 Green + LED11 Blue + LED11 White + LED12 Red + LED12 Green + LED12 Blue + LED12 White + + 0 + 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 + 34 + 35 + + + 36 + 37 + 38 + 39 + + + 40 + 41 + 42 + 43 + + + 45 + 46 + 47 + 44 + + + + + + + + + + + diff --git a/resources/fixtures/Acme/Acme-Oxygen.qxf b/resources/fixtures/Acme/Acme-Oxygen.qxf new file mode 100644 index 0000000000..11429cba75 --- /dev/null +++ b/resources/fixtures/Acme/Acme-Oxygen.qxf @@ -0,0 +1,363 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Michael Tosatto + + Acme + Oxygen + Moving Head + + + + + + + + + Shutter + Close + Open + Strobe (Slow to fast) + Open + Fast Close Slow Open (Slow to fast) + Open + Fast Open Slow Close (Slow to fast) + Open + Random Strobe (Slow to fast) + Open + + + + + + + Colour + Null + 8000K + 7900K + 7800K + 7700K + 7600K + 7500K + 7400K + 7300K + 7200K + 7100K + 7000K + 6900K + 6800K + 6700K + 6600K + 6500K + 6400K + 6300K + 6200K + 6100K + 6000K + 5900K + 5800K + 5700K + 5600K + 5500K + 5400K + 5300K + 5200K + 5100K + 5000K + 4900K + 4800K + 4700K + 4600K + 4500K + 4400K + 4300K + 4200K + 4100K + 4000K + 3900K + 3800K + 3700K + 3600K + 3500K + 3400K + 3300K + 3200K + 3100K + 3000K + 2900K + 2800K + 2700K + 2600K + 2500K + + + Colour + Null + Color 1 + Color 2 + Color 3 + Color 4 + Color 5 + Color 6 + Color 7 + Color 8 + Color 9 + Color 10 + Color 11 + Color 12 + Color 13 + Color 14 + Color 15 + Color 16 + Color 17 + Color 18 + Color 19 + Color 20 + Color 21 + Color 22 + Color 23 + Color 24 + Color 25 + Color 26 + Color 27 + Color 28 + Color 29 + Color 30 + Color 31 + Color 32 + Clockwise Rotation, Fast to Slow + Counter-Clockwise Rotation, Slow to Fast + Red>Green (Fast to slow) + Red>Blue (Fast to slow) + Red>White (Fast to slow) + Green>Blue (Fast to slow) + Green>White (Fast to slow) + Blue>White (Fast to slow) + + + Beam + Open + Pattern 1 + Pattern 2 + Pattern 3 + Pattern 4 + Pattern 5 + Pattern 6 + Pattern 7 + Pattern 8 + Pattern 9 + Pattern 10 + Pattern 11 + Pattern 12 + Pattern 13 + Pattern 14 + Pattern 15 + Pattern 16 + Pattern 17 + Pattern 18 + Pattern 19 + Pattern 20 + Pattern 21 + Pattern 22 + Pattern 23 + Pattern 24 + Pattern 25 + Pattern 26 + Pattern 27 + Pattern 28 + Pattern 29 + Pattern 30 + Pattern 31 + Pattern 32 + Pattern 33 + Pattern 34 + Pattern 35 + Pattern 36 + Pattern 37 + Pattern 38 + Pattern 39 + Pattern 40 + Pattern 41 + Pattern 42 + Pattern 43 + Pattern 44 + Pattern 45 + Pattern 46 + Pattern 47 + Pattern 48 + Pattern 49 + Pattern 50 + Pattern 51 + Pattern 52 + Pattern 53 + Pattern 54 + Pattern 55 + Pattern 56 + Pattern 57 + Pattern 58 + Pattern 59 + Pattern 60 + Random (Pattern 1-7) + Pattern 61 + Open + + + Effect + Null + Clockwise rotation (Fast to slow) + Null + Counter-Clockwise Rotation (Slow to fast) + Null + + + Maintenance + Null + Dimmer Speed: Smooth + Dimmer Speed: Fast + Null + Pan/Tilt Reset + Effect Reset + Null + Reset All + Null + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pan + Pan fine + Tilt + Tilt fine + Zoom + Dimmer + Dimmer fine + Strobe + Red + Green + Blue + White + CTO + Color macro + Pixel select + Pixel rotation + Function + + + Pan + Pan fine + Tilt + Tilt fine + Zoom + Dimmer + Dimmer fine + Strobe + Red 1 + Green 1 + Blue 1 + White 1 + Red 2 + Green 2 + Blue 2 + White 2 + Red 3 + Green 3 + Blue 3 + White 3 + Red 4 + Green 4 + Blue 4 + White 4 + Red 5 + Green 5 + Blue 5 + White 5 + Red 6 + Green 6 + Blue 6 + White 6 + Red 7 + Green 7 + Blue 7 + White 7 + Function + + 8 + 9 + 10 + 11 + + + 14 + 13 + 12 + 15 + + + 19 + 18 + 17 + 16 + + + 20 + 21 + 22 + 23 + + + 24 + 25 + 27 + 26 + + + 28 + 29 + 30 + 31 + + + 32 + 33 + 34 + 35 + + + + + + + + + + + diff --git a/resources/fixtures/Acme/Acme-Super-Dotline.qxf b/resources/fixtures/Acme/Acme-Super-Dotline.qxf new file mode 100644 index 0000000000..fff8798f29 --- /dev/null +++ b/resources/fixtures/Acme/Acme-Super-Dotline.qxf @@ -0,0 +1,2484 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Michael Tosatto + + Acme + Super Dotline + Moving Head + + + + + + Shutter + Close + Open + Strobe (Slow to fast) + Open + Slow Open Fast Close (Slow to fast) + Open + Fast Open Slow Close (Slow to fast) + Open + Random Strobe (Slow to fast) + Open + + + + + + + + + + + + + + + + + + + + + + + + + + + Maintenance + Null + Dimmer Curve: Linear + Dimmer Curve: Square Law + Dimmer Curve: Inv SQ Law + Dimmer Curve: S Curve + Power Mode: Standard + Null + Power Mode: Quiet + LED Frequency Setting Enable + LED Frequency Setting Disable + Null + 900Hz + 1000Hz + 1100Hz + 1200Hz + 1300Hz + 1400Hz + 1500Hz + 2500Hz + 4000Hz + 5000Hz + 6000Hz + 10KHz + 15KHz + 20KHz + 25KHz + Null + Tilt Reset + Effect Reset + CCT Calibration: On + CCT Calibration: Off + Null + All Reset + Dimmer Speed: Fast + Dimmer Speed: Smooth + Line Power Mode: Off + Line Power Mode: On + Null + + + Effect + No function + Macro 1 + Macro 2 + Macro 3 + Macro 4 + Macro 5 + Macro 6 + Macro 7 + + + + + + + + + + + + + + + + + + + + + + + Shutter + Close + Open + Strobe (Slow to fast) + Open + Slow Open Fast Close (Slow to fast) + Open + Fast Open Slow Close (Slow to fast) + Open + Random Strobe (Slow to fast) + Open + + + Shutter + Close + Open + Strobe (Slow to fast) + Open + Slow Open Fast Close (Slow to fast) + Open + Fast Open Slow Close (Slow to fast) + Open + Random Strobe (Slow to fast) + Open + + + + + + + + Colour + Null + 8000K + 7900K + 7800K + 7700K + 7600K + 7500K + 7400K + 7300K + 7200K + 7100K + 7000K + 6900K + 6800K + 6700K + 6600K + 6500K + 6400K + 6300K + 6200K + 6100K + 6000K + 5900K + 5800K + 5700K + 5600K + 5500K + 5400K + 5300K + 5200K + 5100K + 5000K + 4900K + 4800K + 4700K + 4600K + 4500K + 4400K + 4300K + 4200K + 4100K + 4000K + 3900K + 3800K + 3700K + 3600K + 3500K + 3400K + 3300K + 3200K + 3100K + 3000K + 2900K + 2800K + 2700K + 2600K + 2500K + + + Colour + Null + Color 1 + Color 2 + Color 3 + Color 4 + Color 5 + Color 6 + Color 7 + Color 8 + Color 9 + Color 10 + Color 11 + Color 12 + Color 13 + Color 14 + Color 15 + Color 16 + Color 17 + Color 18 + Color 19 + Color 20 + Color 21 + Color 22 + Color 23 + Color 24 + Color 25 + Color 26 + Color 27 + Color 28 + Color 29 + Color 30 + Color 31 + + + Effect + Null + Built-in Effect 1 + Built-in Effect 2 + Built-in Effect 3 + Built-in Effect 4 + Built-in Effect 5 + Built-in Effect 6 + Built-in Effect 7 + Built-in Effect 8 + Built-in Effect 9 + Built-in Effect 10 + Built-in Effect 11 + Built-in Effect 12 + Built-in Effect 13 + Built-in Effect 14 + Built-in Effect 15 + Built-in Effect 16 + Built-in Effect 17 + Built-in Effect 18 + Built-in Effect 19 + Built-in Effect 20 + Built-in Effect 21 + Built-in Effect 22 + Built-in Effect 23 + Null + + + Speed + Slow to Fast without Fade + Slow to Fast with Fade + + + Colour + Null + 6500K + 6400K + 6300K + 6200K + 6100K + 6000K + 5900K + 5800K + 5700K + 5600K + 5500K + 5400K + 5300K + 5200K + 5100K + 5000K + 4900K + 4800K + 4700K + 4600K + 4500K + 4400K + 4300K + 4200K + 4100K + 4000K + 3900K + 3800K + 3700K + 3600K + 3500K + 3400K + 3300K + 3200K + 3100K + 3000K + 2900K + 2800K + 2700K + 2600K + 2500K + + + Effect + Null + Built-in Effect 1 + Built-in Effect 2 + Built-in Effect 3 + Built-in Effect 4 + Built-in Effect 5 + Built-in Effect 6 + Built-in Effect 7 + Built-in Effect 8 + Built-in Effect 9 + Built-in Effect 10 + Built-in Effect 11 + Built-in Effect 12 + Built-in Effect 13 + Built-in Effect 14 + Built-in Effect 15 + Built-in Effect 16 + Built-in Effect 17 + Built-in Effect 18 + Built-in Effect 19 + Built-in Effect 20 + Built-in Effect 21 + Built-in Effect 22 + Built-in Effect 23 + Null + + + Speed + Slow to Fast without Fade + Slow to Fast with Fade + + + Colour + Null + Color 1 + Color 2 + Color 3 + Color 4 + Color 5 + Color 6 + Color 7 + Color 8 + Color 9 + Color 10 + Color 11 + Color 12 + Color 13 + Color 14 + Color 15 + Color 16 + Color 17 + Color 18 + Color 19 + Color 20 + Color 21 + Color 22 + Color 23 + Color 24 + Color 25 + Color 26 + Color 27 + Color 28 + Color 29 + Color 30 + Color 31 + + + Effect + Null + Built-in Effect 1 + Built-in Effect 2 + Built-in Effect 3 + Built-in Effect 4 + Built-in Effect 5 + Built-in Effect 6 + Built-in Effect 7 + Built-in Effect 8 + Built-in Effect 9 + Built-in Effect 10 + Built-in Effect 11 + Built-in Effect 12 + Built-in Effect 13 + Built-in Effect 14 + Built-in Effect 15 + Built-in Effect 16 + Built-in Effect 17 + Built-in Effect 18 + Built-in Effect 19 + Built-in Effect 20 + Built-in Effect 21 + Built-in Effect 22 + Built-in Effect 23 + Null + + + Speed + Slow to Fast without Fade + Slow to Fast with Fade + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tilt + Tilt fine + Zoom + Dimmer + Main Strobe + LINE_W Strobe + LINE_RGB Strobe + Special Function + Main Red + Main Green + Main Blue + Main White + LINE_W CW + LINE_W WW + LINE_RGB Red + LINE_RGB Green + LINE_RGB Blue + + 4 + 8 + 9 + 10 + 11 + 2 + + + 5 + 13 + 12 + + + 6 + 16 + 15 + 14 + + + + + + + + + + + + Tilt + Tilt fine + Zoom + Dimmer + Main Strobe + LINE_W Strobe + LINE_RGB Strobe + Special Function + Main Red + Main Green + Main Blue + Main White + Main CCT + Main Color + Main Macro + Main Macro Speed + LINE_W WW + LINE_W CW + LINE_W CCT + LINE_W Macro + LINE_W Macro Speed + LINE_RGB Red + LINE_RGB Green + LINE_RGB Blue + LINE_RGB Color + LINE_RGB Macro + LINE_RGB Macro Speed + + 8 + 9 + 10 + 11 + 4 + 15 + 14 + 13 + 12 + 2 + + + 5 + 16 + 17 + 18 + 19 + 20 + + + 6 + 21 + 22 + 23 + 24 + 25 + 26 + + + + Tilt + Tilt fine + Zoom + Dimmer + Main Strobe + LINE_W Strobe + LINE_RGB Strobe + Special Function + Main Red 1 + Main Green 1 + Main Blue 1 + Main White 1 + Main Red 2 + Main Green 2 + Main Blue 2 + Main White 2 + Main Red 3 + Main Green 3 + Main Blue 3 + Main White 3 + Main Red 4 + Main Green 4 + Main Blue 4 + Main White 4 + Main Red 5 + Main Green 5 + Main Blue 5 + Main White 5 + Main Red 6 + Main Green 6 + Main Blue 6 + Main White 6 + Main Red 7 + Main Green 7 + Main Blue 7 + Main White 7 + Main Red 8 + Main Green 8 + Main Blue 8 + Main White 8 + Main Red 9 + Main Green 9 + Main Blue 9 + Main White 9 + Main Red 10 + Main Green 10 + Main Blue 10 + Main White 10 + LINE_W CW 1 + LINE_W WW 1 + LINE_W CW 2 + LINE_W WW 2 + LINE_W CW 3 + LINE_W WW 3 + LINE_W CW 4 + LINE_W WW 4 + LINE_W CW 5 + LINE_W WW 5 + LINE_W CW 6 + LINE_W WW 6 + LINE_W CW 7 + LINE_W WW 7 + LINE_W CW 8 + LINE_W WW 8 + LINE_W CW 9 + LINE_W WW 9 + LINE_W CW 10 + LINE_W WW 10 + LINE_W CW 11 + LINE_W WW 11 + LINE_W CW 12 + LINE_W WW 12 + LINE_W CW 13 + LINE_W WW 13 + LINE_W CW 14 + LINE_W WW 14 + LINE_W CW 15 + LINE_W WW 15 + LINE_W CW 16 + LINE_W WW 16 + LINE_W CW 17 + LINE_W WW 17 + LINE_W CW 18 + LINE_W WW 18 + LINE_W CW 19 + LINE_W WW 19 + LINE_W CW 20 + LINE_W WW 20 + LINE_W CW 21 + LINE_W WW 21 + LINE_W CW 22 + LINE_W WW 22 + LINE_W CW 23 + LINE_W WW 23 + LINE_W CW 24 + LINE_W WW 24 + LINE_RGB Red + LINE_RGB Green + LINE_RGB Blue + + 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 + 34 + 35 + + + 36 + 37 + 38 + 39 + + + 40 + 41 + 42 + 43 + + + 44 + 45 + 46 + 47 + + + 48 + 49 + + + 50 + 51 + + + 52 + 53 + + + 54 + 55 + + + 56 + 57 + + + 58 + 59 + + + 60 + 61 + + + 62 + 63 + + + 64 + 65 + + + 66 + 67 + + + 68 + 69 + + + 70 + 71 + + + 72 + 73 + + + 74 + 75 + + + 76 + 77 + + + 78 + 79 + + + 80 + 81 + + + 82 + 83 + + + 84 + 85 + + + 86 + 87 + + + 88 + 89 + + + 90 + 91 + + + 92 + 93 + + + 94 + 95 + + + 96 + 97 + 98 + + + + Tilt + Tilt fine + Zoom + Dimmer + Main Strobe + LINE_W Strobe + LINE_RGB Strobe + Special Function + Main Red 1 + Main Green 1 + Main Blue 1 + Main White 1 + Main Red 2 + Main Green 2 + Main Blue 2 + Main White 2 + Main Red 3 + Main Green 3 + Main Blue 3 + Main White 3 + Main Red 4 + Main Green 4 + Main Blue 4 + Main White 4 + Main Red 5 + Main Green 5 + Main Blue 5 + Main White 5 + Main Red 6 + Main Green 6 + Main Blue 6 + Main White 6 + Main Red 7 + Main Green 7 + Main Blue 7 + Main White 7 + Main Red 8 + Main Green 8 + Main Blue 8 + Main White 8 + Main Red 9 + Main Green 9 + Main Blue 9 + Main White 9 + Main Red 10 + Main Green 10 + Main Blue 10 + Main White 10 + LINE_W CW 1 + LINE_W WW 1 + LINE_W CW 2 + LINE_W WW 2 + LINE_W CW 3 + LINE_W WW 3 + LINE_W CW 4 + LINE_W WW 4 + LINE_W CW 5 + LINE_W WW 5 + LINE_W CW 6 + LINE_W WW 6 + LINE_W CW 7 + LINE_W WW 7 + LINE_W CW 8 + LINE_W WW 8 + LINE_W CW 9 + LINE_W WW 9 + LINE_W CW 10 + LINE_W WW 10 + LINE_W CW 11 + LINE_W WW 11 + LINE_W CW 12 + LINE_W WW 12 + LINE_RGB Red 1 + LINE_RGB Green 1 + LINE_RGB Blue 1 + LINE_RGB Red 2 + LINE_RGB Green 2 + LINE_RGB Blue 2 + LINE_RGB Red 3 + LINE_RGB Green 3 + LINE_RGB Blue 3 + LINE_RGB Red 4 + LINE_RGB Green 4 + LINE_RGB Blue 4 + LINE_RGB Red 5 + LINE_RGB Green 5 + LINE_RGB Blue 5 + LINE_RGB Red 6 + LINE_RGB Green 6 + LINE_RGB Blue 6 + LINE_RGB Red 7 + LINE_RGB Green 7 + LINE_RGB Blue 7 + LINE_RGB Red 8 + LINE_RGB Green 8 + LINE_RGB Blue 8 + LINE_RGB Red 9 + LINE_RGB Green 9 + LINE_RGB Blue 9 + LINE_RGB Red 10 + LINE_RGB Green 10 + LINE_RGB Blue 10 + LINE_RGB Red 11 + LINE_RGB Green 11 + LINE_RGB Blue 11 + LINE_RGB Red 12 + LINE_RGB Green 12 + LINE_RGB Blue 12 + + 8 + 9 + 10 + 11 + + + 12 + 13 + 14 + 15 + + + 16 + 17 + 18 + 19 + + + 20 + 21 + 22 + 23 + + + 27 + 26 + 25 + 24 + + + 28 + 29 + 30 + 31 + + + 32 + 33 + 34 + 35 + + + 36 + 37 + 38 + 39 + + + 40 + 41 + 42 + 43 + + + 44 + 45 + 46 + 47 + + + 48 + 49 + + + 50 + 51 + + + 52 + 53 + + + 54 + 55 + + + 56 + 57 + + + 58 + 59 + + + 60 + 61 + + + 62 + 63 + + + 64 + 65 + + + 66 + 67 + + + 68 + 69 + + + 70 + 71 + + + 72 + 73 + 74 + + + 75 + 76 + 77 + + + 78 + 79 + 80 + + + 81 + 82 + 83 + + + 84 + 85 + 86 + + + 87 + 88 + 89 + + + 90 + 91 + 92 + + + 93 + 94 + 95 + + + 96 + 97 + 98 + + + 99 + 100 + 101 + + + 102 + 103 + 104 + + + 105 + 106 + 107 + + + + + + + + + + + + Tilt + Tilt fine + Zoom + Dimmer + Main Strobe + LINE_W Strobe + LINE_RGB Strobe + Special Function + Main Red 1 + Main Green 1 + Main Blue 1 + Main White 1 + Main Red 2 + Main Green 2 + Main Blue 2 + Main White 2 + Main Red 3 + Main Green 3 + Main Blue 3 + Main White 3 + Main Red 4 + Main Green 4 + Main Blue 4 + Main White 4 + Main Red 5 + Main Green 5 + Main Blue 5 + Main White 5 + Main Red 6 + Main Green 6 + Main Blue 6 + Main White 6 + Main Red 7 + Main Green 7 + Main Blue 7 + Main White 7 + Main Red 8 + Main Green 8 + Main Blue 8 + Main White 8 + Main Red 9 + Main Green 9 + Main Blue 9 + Main White 9 + Main Red 10 + Main Green 10 + Main Blue 10 + Main White 10 + LINE_W CW 1 + LINE_W WW 1 + LINE_W CW 2 + LINE_W WW 2 + LINE_W CW 3 + LINE_W WW 3 + LINE_W CW 4 + LINE_W WW 4 + LINE_W CW 5 + LINE_W WW 5 + LINE_W CW 6 + LINE_W WW 6 + LINE_W CW 7 + LINE_W WW 7 + LINE_W CW 8 + LINE_W WW 8 + LINE_W CW 9 + LINE_W WW 9 + LINE_W CW 10 + LINE_W WW 10 + LINE_W CW 11 + LINE_W WW 11 + LINE_W CW 12 + LINE_W WW 12 + LINE_W CW 13 + LINE_W WW 13 + LINE_W CW 14 + LINE_W WW 14 + LINE_W CW 15 + LINE_W WW 15 + LINE_W CW 16 + LINE_W WW 16 + LINE_W CW 17 + LINE_W WW 17 + LINE_W CW 18 + LINE_W WW 18 + LINE_W CW 19 + LINE_W WW 19 + LINE_W CW 20 + LINE_W WW 20 + LINE_W CW 21 + LINE_W WW 21 + LINE_W CW 22 + LINE_W WW 22 + LINE_W CW 23 + LINE_W WW 23 + LINE_W CW 24 + LINE_W WW 24 + LINE_RGB Red 1 + LINE_RGB Green 1 + LINE_RGB Blue 1 + LINE_RGB Red 2 + LINE_RGB Green 2 + LINE_RGB Blue 2 + LINE_RGB Red 3 + LINE_RGB Green 3 + LINE_RGB Blue 3 + LINE_RGB Red 4 + LINE_RGB Green 4 + LINE_RGB Blue 4 + LINE_RGB Red 5 + LINE_RGB Green 5 + LINE_RGB Blue 5 + LINE_RGB Red 6 + LINE_RGB Green 6 + LINE_RGB Blue 6 + LINE_RGB Red 7 + LINE_RGB Green 7 + LINE_RGB Blue 7 + LINE_RGB Red 8 + LINE_RGB Green 8 + LINE_RGB Blue 8 + LINE_RGB Red 9 + LINE_RGB Green 9 + LINE_RGB Blue 9 + LINE_RGB Red 10 + LINE_RGB Green 10 + LINE_RGB Blue 10 + LINE_RGB Red 11 + LINE_RGB Green 11 + LINE_RGB Blue 11 + LINE_RGB Red 12 + LINE_RGB Green 12 + LINE_RGB Blue 12 + LINE_RGB Red 13 + LINE_RGB Green 13 + LINE_RGB Blue 13 + LINE_RGB Red 14 + LINE_RGB Green 14 + LINE_RGB Blue 14 + LINE_RGB Red 15 + LINE_RGB Green 15 + LINE_RGB Blue 15 + LINE_RGB Red 16 + LINE_RGB Green 16 + LINE_RGB Blue 16 + LINE_RGB Red 17 + LINE_RGB Green 17 + LINE_RGB Blue 17 + LINE_RGB Red 18 + LINE_RGB Green 18 + LINE_RGB Blue 18 + LINE_RGB Red 19 + LINE_RGB Green 19 + LINE_RGB Blue 19 + LINE_RGB Red 20 + LINE_RGB Green 20 + LINE_RGB Blue 20 + LINE_RGB Red 21 + LINE_RGB Green 21 + LINE_RGB Blue 21 + LINE_RGB Red 22 + LINE_RGB Green 22 + LINE_RGB Blue 22 + LINE_RGB Red 23 + LINE_RGB Green 23 + LINE_RGB Blue 23 + LINE_RGB Red 24 + LINE_RGB Green 24 + LINE_RGB Blue 24 + + 8 + 9 + 10 + 11 + + + 12 + 13 + 14 + 15 + + + 16 + 17 + 18 + 19 + + + 20 + 21 + 22 + 23 + + + 24 + 25 + 26 + 27 + + + 28 + 29 + 30 + 31 + + + 33 + 32 + 34 + 35 + + + 36 + 37 + 38 + 39 + + + 40 + 41 + 42 + 43 + + + 44 + 45 + 46 + 47 + + + 48 + 49 + + + 50 + 51 + + + 52 + 53 + + + 54 + 55 + + + 56 + 57 + + + 58 + 59 + + + 60 + 61 + + + 62 + 63 + + + 64 + 65 + + + 66 + 67 + + + 68 + 69 + + + 70 + 71 + + + 72 + 73 + + + 74 + 75 + + + 76 + 77 + + + 78 + 79 + + + 80 + 81 + + + 82 + 83 + + + 84 + 85 + + + 86 + 87 + + + 88 + 89 + + + 90 + 91 + + + 92 + 93 + + + 94 + 95 + + + 96 + 97 + 98 + + + 99 + 100 + 101 + + + 102 + 103 + 104 + + + 105 + 106 + 107 + + + 108 + 109 + 110 + + + 111 + 112 + 113 + + + 114 + 115 + 116 + + + 117 + 118 + 119 + + + 120 + 121 + 122 + + + 123 + 124 + 125 + + + 126 + 127 + 128 + + + 129 + 130 + 131 + + + 132 + 133 + 134 + + + 135 + 136 + 137 + + + 138 + 139 + 140 + + + 141 + 142 + 143 + + + 144 + 145 + 146 + + + 147 + 148 + 149 + + + 150 + 151 + 152 + + + 153 + 154 + 155 + + + 156 + 157 + 158 + + + 159 + 160 + 161 + + + 162 + 163 + 164 + + + 165 + 166 + 167 + + + + + + + + + + + + Tilt + Tilt fine + Zoom + Dimmer + Main Strobe + LINE_W Strobe + LINE_RGB Strobe + Special Function + + 4 + 2 + + + 5 + + + 6 + + + + Main Red 1 + Main Green 1 + Main Blue 1 + Main White 1 + Main Red 2 + Main Green 2 + Main Blue 2 + Main White 2 + Main Red 3 + Main Green 3 + Main Blue 3 + Main White 3 + Main Red 4 + Main Green 4 + Main Blue 4 + Main White 4 + Main Red 5 + Main Green 5 + Main Blue 5 + Main White 5 + Main Red 6 + Main Green 6 + Main Blue 6 + Main White 6 + Main Red 7 + Main Green 7 + Main Blue 7 + Main White 7 + Main Red 8 + Main Green 8 + Main Blue 8 + Main White 8 + Main Red 9 + Main Green 9 + Main Blue 9 + Main White 9 + Main Red 10 + Main Green 10 + Main Blue 10 + Main White 10 + LINE_W CW 1 + LINE_W WW 1 + LINE_W CW 2 + LINE_W WW 2 + LINE_W CW 3 + LINE_W WW 3 + LINE_W CW 4 + LINE_W WW 4 + LINE_W CW 5 + LINE_W WW 5 + LINE_W CW 6 + LINE_W WW 6 + LINE_W CW 7 + LINE_W WW 7 + LINE_W CW 8 + LINE_W WW 8 + LINE_W CW 9 + LINE_W WW 9 + LINE_W CW 10 + LINE_W WW 10 + LINE_W CW 11 + LINE_W WW 11 + LINE_W CW 12 + LINE_W WW 12 + LINE_RGB Red 1 + LINE_RGB Green 1 + LINE_RGB Blue 1 + LINE_RGB Red 2 + LINE_RGB Green 2 + LINE_RGB Blue 2 + LINE_RGB Red 3 + LINE_RGB Green 3 + LINE_RGB Blue 3 + LINE_RGB Red 4 + LINE_RGB Green 4 + LINE_RGB Blue 4 + LINE_RGB Red 5 + LINE_RGB Green 5 + LINE_RGB Blue 5 + LINE_RGB Red 6 + LINE_RGB Green 6 + LINE_RGB Blue 6 + LINE_RGB Red 7 + LINE_RGB Green 7 + LINE_RGB Blue 7 + LINE_RGB Red 8 + LINE_RGB Green 8 + LINE_RGB Blue 8 + LINE_RGB Red 9 + LINE_RGB Green 9 + LINE_RGB Blue 9 + LINE_RGB Red 10 + LINE_RGB Green 10 + LINE_RGB Blue 10 + LINE_RGB Red 11 + LINE_RGB Green 11 + LINE_RGB Blue 11 + LINE_RGB Red 12 + LINE_RGB Green 12 + LINE_RGB Blue 12 + + 0 + 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 + 34 + 35 + + + 36 + 37 + 38 + 39 + + + 40 + 41 + + + 42 + 43 + + + 44 + 45 + + + 46 + 47 + + + 48 + 49 + + + 50 + 51 + + + 52 + 53 + + + 54 + 55 + + + 56 + 57 + + + 58 + 59 + + + 60 + 61 + + + 62 + 63 + + + 64 + 65 + 66 + + + 68 + 67 + 69 + + + 70 + 71 + 72 + + + 73 + 74 + 75 + + + 76 + 77 + 78 + + + 79 + 80 + 81 + + + 82 + 83 + 84 + + + 85 + 86 + 87 + + + 88 + 89 + 90 + + + 91 + 92 + 93 + + + 94 + 95 + 96 + + + 97 + 98 + 99 + + + + + + + + + + + + Tilt + Tilt fine + Zoom + Dimmer + Main Strobe + LINE_W Strobe + LINE_RGB Strobe + Special Function + + 4 + 2 + + + 5 + + + 6 + + + + + + + + + + + + Main Red 1 + Main Green 1 + Main Blue 1 + Main White 1 + Main Red 2 + Main Green 2 + Main Blue 2 + Main White 2 + Main Red 3 + Main Green 3 + Main Blue 3 + Main White 3 + Main Red 4 + Main Green 4 + Main Blue 4 + Main White 4 + Main Red 5 + Main Green 5 + Main Blue 5 + Main White 5 + Main Red 6 + Main Green 6 + Main Blue 6 + Main White 6 + Main Red 7 + Main Green 7 + Main Blue 7 + Main White 7 + Main Red 8 + Main Green 8 + Main Blue 8 + Main White 8 + Main Red 9 + Main Green 9 + Main Blue 9 + Main White 9 + Main Red 10 + Main Green 10 + Main Blue 10 + Main White 10 + LINE_W CW 1 + LINE_W WW 1 + LINE_W CW 2 + LINE_W WW 2 + LINE_W CW 3 + LINE_W WW 3 + LINE_W CW 4 + LINE_W WW 4 + LINE_W CW 5 + LINE_W WW 5 + LINE_W CW 6 + LINE_W WW 6 + LINE_W CW 7 + LINE_W WW 7 + LINE_W CW 8 + LINE_W WW 8 + LINE_W CW 9 + LINE_W WW 9 + LINE_W CW 10 + LINE_W WW 10 + LINE_W CW 11 + LINE_W WW 11 + LINE_W CW 12 + LINE_W WW 12 + LINE_W CW 13 + LINE_W WW 13 + LINE_W CW 14 + LINE_W WW 14 + LINE_W CW 15 + LINE_W WW 15 + LINE_W CW 16 + LINE_W WW 16 + LINE_W CW 17 + LINE_W WW 17 + LINE_W CW 18 + LINE_W WW 18 + LINE_W CW 19 + LINE_W WW 19 + LINE_W CW 20 + LINE_W WW 20 + LINE_W CW 21 + LINE_W WW 21 + LINE_W CW 22 + LINE_W WW 22 + LINE_W CW 23 + LINE_W WW 23 + LINE_W CW 24 + LINE_W WW 24 + LINE_RGB Red 1 + LINE_RGB Green 1 + LINE_RGB Blue 1 + LINE_RGB Red 2 + LINE_RGB Green 2 + LINE_RGB Blue 2 + LINE_RGB Red 3 + LINE_RGB Green 3 + LINE_RGB Blue 3 + LINE_RGB Red 4 + LINE_RGB Green 4 + LINE_RGB Blue 4 + LINE_RGB Red 5 + LINE_RGB Green 5 + LINE_RGB Blue 5 + LINE_RGB Red 6 + LINE_RGB Green 6 + LINE_RGB Blue 6 + LINE_RGB Red 7 + LINE_RGB Green 7 + LINE_RGB Blue 7 + LINE_RGB Red 8 + LINE_RGB Green 8 + LINE_RGB Blue 8 + LINE_RGB Red 9 + LINE_RGB Green 9 + LINE_RGB Blue 9 + LINE_RGB Red 10 + LINE_RGB Green 10 + LINE_RGB Blue 10 + LINE_RGB Red 11 + LINE_RGB Green 11 + LINE_RGB Blue 11 + LINE_RGB Red 12 + LINE_RGB Green 12 + LINE_RGB Blue 12 + LINE_RGB Red 13 + LINE_RGB Green 13 + LINE_RGB Blue 13 + LINE_RGB Red 14 + LINE_RGB Green 14 + LINE_RGB Blue 14 + LINE_RGB Red 15 + LINE_RGB Green 15 + LINE_RGB Blue 15 + LINE_RGB Red 16 + LINE_RGB Green 16 + LINE_RGB Blue 16 + LINE_RGB Red 17 + LINE_RGB Green 17 + LINE_RGB Blue 17 + LINE_RGB Red 18 + LINE_RGB Green 18 + LINE_RGB Blue 18 + LINE_RGB Red 19 + LINE_RGB Green 19 + LINE_RGB Blue 19 + LINE_RGB Red 20 + LINE_RGB Green 20 + LINE_RGB Blue 20 + LINE_RGB Red 21 + LINE_RGB Green 21 + LINE_RGB Blue 21 + LINE_RGB Red 22 + LINE_RGB Green 22 + LINE_RGB Blue 22 + LINE_RGB Red 23 + LINE_RGB Green 23 + LINE_RGB Blue 23 + LINE_RGB Red 24 + LINE_RGB Green 24 + LINE_RGB Blue 24 + + 8 + 9 + 10 + 11 + + + 12 + 13 + 14 + 15 + + + 16 + 17 + 18 + 19 + + + 20 + 21 + 22 + 23 + + + 24 + 25 + 26 + 27 + + + 28 + 29 + 30 + 31 + + + 33 + 32 + 34 + 35 + + + 36 + 37 + 38 + 39 + + + 40 + 41 + 42 + 43 + + + 44 + 45 + 46 + 47 + + + 48 + 49 + + + 50 + 51 + + + 52 + 53 + + + 54 + 55 + + + 56 + 57 + + + 58 + 59 + + + 60 + 61 + + + 62 + 63 + + + 64 + 65 + + + 66 + 67 + + + 68 + 69 + + + 70 + 71 + + + 72 + 73 + + + 74 + 75 + + + 76 + 77 + + + 78 + 79 + + + 80 + 81 + + + 82 + 83 + + + 84 + 85 + + + 86 + 87 + + + 88 + 89 + + + 90 + 91 + + + 92 + 93 + + + 94 + 95 + + + 96 + 97 + 98 + + + 99 + 100 + 101 + + + 102 + 103 + 104 + + + 105 + 106 + 107 + + + 108 + 109 + 110 + + + 111 + 112 + 113 + + + 114 + 115 + 116 + + + 117 + 118 + 119 + + + 120 + 121 + 122 + + + 123 + 124 + 125 + + + 126 + 127 + 128 + + + 129 + 130 + 131 + + + 132 + 133 + 134 + + + 135 + 136 + 137 + + + 138 + 139 + 140 + + + 141 + 142 + 143 + + + 144 + 145 + 146 + + + 147 + 148 + 149 + + + 150 + 151 + 152 + + + 153 + 154 + 155 + + + 156 + 157 + 158 + + + 159 + 160 + 161 + + + 162 + 163 + 164 + + + 165 + 166 + 167 + + + + Tilt + Tilt fine + Zoom + Dimmer + Main Strobe + LINE_W Strobe + LINE_RGB Strobe + Special Function + Main Red + Main Green + Main Blue + Main White + LINE_W CW + LINE_W WW + LINE_RGB Red + LINE_RGB Green + LINE_RGB Blue + Main Red 11&12 + Main Green 11&12 + Main Blue 11&12 + Main White 11&12 + + 8 + 9 + 10 + 11 + + + 12 + 13 + + + 14 + 15 + 16 + + + 17 + 18 + 19 + 20 + + + + + + + + + + + diff --git a/resources/fixtures/American_DJ/American-DJ-Par-Z4.qxf b/resources/fixtures/American_DJ/American-DJ-Par-Z4.qxf new file mode 100644 index 0000000000..7503d12243 --- /dev/null +++ b/resources/fixtures/American_DJ/American-DJ-Par-Z4.qxf @@ -0,0 +1,86 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Dmitry Kolesnikov + + American DJ + Par Z4 + Color Changer + + + + + + Shutter + LED OFF + LED ON + STROBING SLOW - FAST + LED ON + SLOW OPEN - FAST CLOSE + LED ON + SLOW CLOSE - FAST OPEN + LED ON + RANDOM STROBE SLOW - FAST + LED ON + + + + Effect + STANDARD + STAGE + TV + ARCHITECTURAL + THEATRE + DEFAULT DIMMER SETTING + + + + Effect + 7200K - 3200K + + + Red + Green + Blue + White + + + Red + Green + Blue + White + Shutter/Strobe + Master dimmer + + + Red + Green + Blue + White + Color macro + Shutter/Strobe + Master dimmer + Dimmer Curves + + + Red + Green + Blue + White + Color macro + Shutter/Strobe + Master dimmer + Dimmer Curves + Color Temp + + + + + + + + + diff --git a/resources/fixtures/Ayra/Ayra-ComPar-10.qxf b/resources/fixtures/Ayra/Ayra-ComPar-10.qxf new file mode 100644 index 0000000000..3de538d5d1 --- /dev/null +++ b/resources/fixtures/Ayra/Ayra-ComPar-10.qxf @@ -0,0 +1,76 @@ + + + + + Q Light Controller Plus + 5.0.0 Beta 3 + René Knuvers + + Ayra + ComPar 10 + Color Changer + + + + + + + + + Effect + Blackout + Color Macro + Color Jumping + Color Fading + Sound Control (mic sens) + + + Shutter + No function + Strobe slow to fast + + + Dimmer + Color macro + + + Red + Green + Blue + + + Dimmer + Strobe + Effect + + + Red + Green + Blue + White + + + Red + Green + Blue + White + Amber + + + Dimmer + Strobe + Red + Green + Blue + White + Amber + Effect + + + + + + + + + diff --git a/resources/fixtures/Ayra/Ayra-ERO-406.qxf b/resources/fixtures/Ayra/Ayra-ERO-406.qxf new file mode 100644 index 0000000000..797ea1ba54 --- /dev/null +++ b/resources/fixtures/Ayra/Ayra-ERO-406.qxf @@ -0,0 +1,82 @@ + + + + + Q Light Controller Plus + 5.0.0 Beta 3 + René Knuvers + + Ayra + ERO 406 + Moving Head + + + + + + + + + + + + + + + Effect + No Function + Reset After 3s + No Function + Sound Controlled + + + Shutter + Blackout + Open + Stroboscope slow - fast + Open + Shutter slow open, close fast, slow-fast + Open + Shutter slow closed, open fast, slow-fast + Open + Random strobe + Open + + + Pan + Tilt + Shutter + Red + Green + Blue + White + Amber + UV + Dimmer + Diverse Functions + + + Pan + Pan fine + Tilt + Tilt fine + Pan/Tilt speed + Shutter + Red + Green + Blue + White + Amber + UV + Dimmer + Color macro + Diverse Functions + + + + + + + + + diff --git a/resources/fixtures/Ayrton/Ayrton-MiniPanel-FX.qxf b/resources/fixtures/Ayrton/Ayrton-MiniPanel-FX.qxf new file mode 100644 index 0000000000..b47f935251 --- /dev/null +++ b/resources/fixtures/Ayrton/Ayrton-MiniPanel-FX.qxf @@ -0,0 +1,278 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Giacomo Gorini + + Ayrton + MiniPanel FX + Moving Head + + + + + + Speed + max to min speed + blackout by movement + no function + + + Pan + no function + Forwards Pan rotation from fast to slow + No Rotation + Backwards Pan rotation from slow to fast + + + Tilt + no function + Forwards Tilt rotation from fast to slow + No Rotation + Backwards Tilt rotation from slow to fast + + + + + + + Shutter + Led turn off + Led turn on + Strobe effect slow to fast + Led turn on + Pulse-effect in sequences + Led turn on + Random strobe effect slow to fast + Led turn on + + + + Colour + No function + red to yellow + yellow to green + green to cyan + cyan to blue + blue to magenta + magenta to red + red to white + Crossfading colours from slow to fast + + + Colour + No function + White 2700k + White 3200k + White 4200k + White 5600k + White 6500k + White 8000k + Yellow + Magenta + Cyan + Salmon + Turquoise + Light Green + Steel Blue + Orange + Straw + Pale Lavander + Pink + Red + Green + Blue + White + Rainbow1 + Rainbow2 + Rainbow3 + Reserved + + + + Effect + Led Turn off + Chase 1 + Chase 2 + Chase 3 + Chase 4 + Chase 5 + Chase 6 + Chase 7 + Chase 8 + Chase 9 + Chase 10 + Chase 11 + Chase 12 + Chase 13 + Chase 14 + Chase 15 + Chase 16 + Chase 17 + Chase 18 + Chase 19 + Chase 20 + Reserved + + + Speed + Fast to Slow Backward + Stop + Slow to Fast Forward + + + Effect + Fade Chase + + + Maintenance + Normal + All motor reset + Scan motor reset + no function + no function + no function + Others motor reset + Internal Program 1 + Internal Program 2 + Internal Program 3 + Internal Program 4 + Internal Program 5 + Internal Program 6 + Internal Program 7 + Reserved + + + + + + + + + + + + + + + + + + + + + Pan Movement + Pan Fine + Tilt Movement + Tilt Fine + Speed Pan/Tilt + Pan Motor continuous rotation + Tilt Motor continuous rotation + Red LED - all arrays + Green LED - all arrays + Blue LED - all arrays + White LED - all arrays + Shutter, strobe + Dimmer Intensity + Color Macro + Color Presets + Color Preset Dimmer + Chase Patterns + Chase Speed + Chase Fade + Zoom + Zoom fine + Reset, Internal programs + + + Pan Movement + Tilt Movement + Speed Pan/Tilt + Pan Motor continuous rotation + Tilt Motor continuous rotation + Red LED - all arrays + Green LED - all arrays + Blue LED - all arrays + White LED - all arrays + Shutter, strobe + Dimmer Intensity + Color Macro + Color Presets + Color Preset Dimmer + Chase Patterns + Chase Speed + Chase Fade + Zoom + Reset, Internal programs + + + Pan Movement + Pan Fine + Tilt Movement + Tilt Fine + Speed Pan/Tilt + Pan Motor continuous rotation + Tilt Motor continuous rotation + Shutter, strobe + Dimmer Intensity + Color Macro + Color Presets + Color Preset Dimmer + Chase Patterns + Chase Speed + Chase Fade + Zoom + Zoom fine + Reset, Internal programs + Red LED-array 1 + Green LED-array 1 + Blue LED-array 1 + White LED-array 1 + Red LED-array 2 + Green LED-array 2 + Blue LED-array 2 + White LED-array 2 + Red LED-array 3 + Green LED-array 3 + Blue LED-array 3 + White LED-array 3 + Red LED-array 4 + Green LED-array 4 + Blue LED-array 4 + White LED-array 4 + + 18 + 19 + 20 + 21 + + + 22 + 23 + 24 + 25 + + + 26 + 27 + 28 + 29 + + + 30 + 31 + 32 + 33 + + + + + + + + + + + diff --git a/resources/fixtures/BoomToneDJ/BoomToneDJ-KUB-500-RGB.qxf b/resources/fixtures/BoomToneDJ/BoomToneDJ-KUB-500-RGB.qxf new file mode 100644 index 0000000000..a2f7b4ee8c --- /dev/null +++ b/resources/fixtures/BoomToneDJ/BoomToneDJ-KUB-500-RGB.qxf @@ -0,0 +1,97 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Fede79 + + BoomToneDJ + KUB 500 RGB + Laser + + Maintenance + Laser light off + DMX control mode + Automatic control mode + Line effect automatic control mode + Animation effect sound control mode + Automatic effect sound control mode + Manual control sound mode + + + Gobo + Pattern group A + + + Gobo + Pattern group B + + + Gobo + Rotation angle adjustment + Rotation clockwise rotation(from slow to fast) + Rotation anti-clockwise rotation(from slow to fast) + + + Gobo + Left and right rotation angle selection + Left and right reverse rotation speed (from slow to fast) + + + Gobo + Up and down rotation angle selection + Up and down reverse rotation speed adjustment(from slow to fast) + + + Gobo + Left and right moving angle selection + Left and right moving speed (from slow to fast) + + + Gobo + Up and down moving angle selection + Up and down moving speed(from slow to fast) + + + Beam + Size adjustment + Size zooming speed (from big to small) + Size zooming speed (from small to big) + Zooming (from slow to fast) + + + Effect + Running gradual drawing effect(from slow to fast) + + + Speed + Scanning speed adjustment + Running dot effect + + + Colour + Laser color selection + + + Pattern controlling mode + Pattern selection A + Pattern selection B + Pattern rotation + Pattern left and right reverse rotation + Pattern up and down reverse rotation + Pattern left and right movement + Pattern up and down movement + Pattern size + Pattern gradual drawing + Pattern controlling + Color selection + + + + + + + + + diff --git a/resources/fixtures/BoomToneDJ/BoomToneDJ-LED-PAR-7X10W-5in1.qxf b/resources/fixtures/BoomToneDJ/BoomToneDJ-LED-PAR-7X10W-5in1.qxf new file mode 100644 index 0000000000..288e8fac48 --- /dev/null +++ b/resources/fixtures/BoomToneDJ/BoomToneDJ-LED-PAR-7X10W-5in1.qxf @@ -0,0 +1,45 @@ + + + + + Q Light Controller Plus + 5.0.0 Beta 3 + Cédric Monféfoul + + BoomToneDJ + LED PAR 7X10W 5in1 + Color Changer + + + + + + + + + Effect + Auto Show + + + Speed + Speed Auto Show + + + Master Dimmer + Red + Green + Blue + White + Amber + Strobe + Auto Show + Speed Auto Show + + + + + + + + + diff --git a/resources/fixtures/BoomToneDJ/BoomToneDJ-Maxi-Spot-60.qxf b/resources/fixtures/BoomToneDJ/BoomToneDJ-Maxi-Spot-60.qxf new file mode 100644 index 0000000000..0b5d0edea2 --- /dev/null +++ b/resources/fixtures/BoomToneDJ/BoomToneDJ-Maxi-Spot-60.qxf @@ -0,0 +1,103 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Cédric Monféfoul + + BoomToneDJ + Maxi Spot 60 + Moving Head + + + + + Colour + White + White + Red + Red + Red + Green + Green + Green + Blue + Blue + Blue + Yellow + Yellow + Yellow + Magenta + Magenta + Magenta + Cyan + Cyan + Cyan + Orange + Orange + Rotating rainbow effect From slow to fast + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Gobo Wheel auto rotate from slow to fast + Open + White Shake + Gobo 1 Shake + Gobo 2 Shake + Gobo 3 Shake + Gobo 4 Shake + Gobo 5 Shake + Gobo 6 Shake + Gobo 7 Shake + + + + Shutter + No function + Strobe from slow to fast + Random mode and pulse + + + Maintenance + No function + Blackout while Pan/Tilt Move + Blackout while Color Change + Blackout while Gobo change + Blackout while Pan/Tilt, Color, Gobo move + Reset + Sound Mode + + + + + Pan + Tilt + Pan / Tilt Speed + Colors + Gobos + Dimmer + Shutter + Function + + + Pan + Pan Fine + Tilt + Tilt Fine + Pan / Tilt Speed + Colors + Gobos + Dimmer + Shutter + Function + + + + + + + + + diff --git a/resources/fixtures/Bright/Bright-XBAR.qxf b/resources/fixtures/Bright/Bright-XBAR.qxf new file mode 100644 index 0000000000..abc7c75a49 --- /dev/null +++ b/resources/fixtures/Bright/Bright-XBAR.qxf @@ -0,0 +1,612 @@ + + + + + Q Light Controller Plus + 4.12.7 + Øystein Steimler + + Bright + XBAR + LED Bar (Beams) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Shutter + Shutter closed + Shutter open + Strobe (Slow -> fast / 1-25Hz) + Shutter open + Strobe random (Slow -> fast) + Shutter open + Strobe Audio (Slow -> fast) + Shutter open + + + Maintenance + Instant Response + Short rise-time + Medium rise-time + Long rise-time + Extra-long rise-time + [Reserved] + [Reserved] + [Reserved] + + + Colour + Straw + Warm white + White + Cool white + Blue + Magenta + Red + Orange + Yellow + Green + Teal + Cyan + Blue + UV + + + Colour + Straw + Warm white + White + Cool white + Blue + Magenta + Red + Orange + Yellow + Green + Teal + Cyan + Blue + UV + Black + + + Gobo + No function (Cell color ignored) + 4 Step 1 -> 4 + Single 1 -> 12 + Twin 1 -> 12 + Quad 1 -> 12 + Random Few -> many + All cells + + + Dimmer + Color + + + Red + Green + Blue + + + Red + Green + Blue + White + Amber + UV + Dimmer + Dimmer fine + Strobe + Curve + Cell Color + Cell select + + + Dimmer1 + Dimmer fine1 + Dimmer2 + Dimmer fine2 + Dimmer3 + Dimmer fine3 + Dimmer4 + Dimmer fine4 + Dimmer5 + Dimmer fine5 + Dimmer6 + Dimmer fine6 + Dimmer7 + Dimmer fine7 + Dimmer8 + Dimmer fine8 + Dimmer9 + Dimmer fine9 + Dimmer10 + Dimmer fine10 + Dimmer11 + Dimmer fine11 + Dimmer12 + Dimmer fine12 + Red + Green + Blue + White + Amber + UV + Strobe + Curve + + + Red1 + Green1 + Blue1 + Dimmer1 + Dimmer fine1 + Red2 + Green2 + Blue2 + Dimmer2 + Dimmer fine2 + Red3 + Green3 + Blue3 + Dimmer3 + Dimmer fine3 + Red4 + Green4 + Blue4 + Dimmer4 + Dimmer fine4 + Red5 + Green5 + Blue5 + Dimmer5 + Dimmer fine5 + Red6 + Green6 + Blue6 + Dimmer6 + Dimmer fine6 + Red7 + Green7 + Blue7 + Dimmer7 + Dimmer fine7 + Red8 + Green8 + Blue8 + Dimmer8 + Dimmer fine8 + Red9 + Green9 + Blue9 + Dimmer9 + Dimmer fine9 + Red10 + Green10 + Blue10 + Dimmer10 + Dimmer fine10 + Red11 + Green11 + Blue11 + Dimmer11 + Dimmer fine11 + Red12 + Green12 + Blue12 + Dimmer12 + Dimmer fine12 + + 0 + 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 + 34 + + + 35 + 36 + 37 + 38 + 39 + + + 40 + 41 + 42 + 43 + 44 + + + 45 + 46 + 47 + 48 + 49 + + + 50 + 51 + 52 + 53 + 54 + + + 55 + 56 + 57 + 58 + 59 + + + + Red1 + Green1 + Blue1 + White1 + Amber1 + UV1 + Dimmer1 + Dimmer fine1 + Red2 + Green2 + Blue2 + White2 + Amber2 + UV2 + Dimmer2 + Dimmer fine2 + Red3 + Green3 + Blue3 + White3 + Amber3 + UV3 + Dimmer3 + Dimmer fine3 + Red4 + Green4 + Blue4 + White4 + Amber4 + UV4 + Dimmer4 + Dimmer fine4 + Red5 + Green5 + Blue5 + White5 + Amber5 + UV5 + Dimmer5 + Dimmer fine5 + Red6 + Green6 + Blue6 + White6 + Amber6 + UV6 + Dimmer6 + Dimmer fine6 + Red7 + Green7 + Blue7 + White7 + Amber7 + UV7 + Dimmer7 + Dimmer fine7 + Red8 + Green8 + Blue8 + White8 + Amber8 + UV8 + Dimmer8 + Dimmer fine8 + Red9 + Green9 + Blue9 + White9 + Amber9 + UV9 + Dimmer9 + Dimmer fine9 + Red10 + Green10 + Blue10 + White10 + Amber10 + UV10 + Dimmer10 + Dimmer fine10 + Red11 + Green11 + Blue11 + White11 + Amber11 + UV11 + Dimmer11 + Dimmer fine11 + Red12 + Green12 + Blue12 + White12 + Amber12 + UV12 + Dimmer12 + Dimmer fine12 + + 0 + 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 + 34 + 35 + 36 + 37 + 38 + 39 + + + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + + + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + + + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + + + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + + + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + + + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + + + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + + + + + + + + + + + diff --git a/resources/fixtures/Briteq/Briteq-BT-Theatre-HD2.qxf b/resources/fixtures/Briteq/Briteq-BT-Theatre-HD2.qxf new file mode 100644 index 0000000000..84fbc9b523 --- /dev/null +++ b/resources/fixtures/Briteq/Briteq-BT-Theatre-HD2.qxf @@ -0,0 +1,221 @@ + + + + + Q Light Controller Plus + 4.12.7 + Fede79 + + Briteq + BT Theatre HD2 + Color Changer + + + + + Colour + No function + 1800K + 2200K + 2700K + 3000K + 3200K + 4000K + 4500K + 5000K + 5600K + 6000K + 6500K + 7000K + 8000K + 10000K + + + Shutter + No function + Strobe from slow to fast 0-25Hz + No function + Thunder Strobe + No function + Random Strobe + + + + + + + + + + Effect + No function + L176 Loving Amber + R40 Light Salmon + L024 Scarlet + L164 Flame Red + L747 Easy White + R303 Warm Peach + L008 Dark Salmon + L025 Sunset Red + L004 Medium Bastard Amber + L237 C.I.D. (To Tungsten) + R321 Soft Golden Amber + L652 Urban Sodium + L212 L.C.T. Yellow (Y1) + L765 LEE Yellow + L513 Ice and a Slice + L100 Spring Yellow + L244 LEE Plus Green + R4430 Cal Color 30 Green + L122 Fern Green + L090 Dark Yellow Green + L243 LEE Fluorescent 3600K + R92 Turquoise + R94 Kelly Green + L327 Forest Green + L191 Cosmetic Aqua Blue + L728 Steel Green + L117 Steel Blue + L354 Special Steel Blue + L053 Paler Lavender + L501 New Color Blue + L174 Dark Steel Blue + L165 Daylight Blue + L136 Pale Lavender + L194 Surprise Pink + L142 Pale Violet + L700 Perfect Lavender + L035 Light Pink + L794 Pretty n Pink + L328 Follies Pink + L795 Magical Magenta + L154 Pale Rose + L127 Smokey Pink + L192 Flesh Pink + L332 Special Rose Pink + L790 Moroccan Pink + L157 Pink + R332 Cherry Rose + L128 Bright Pink + No Function + + + Effect + No function + Auto 1 + Auto 2 + Auto3 + Auto4 + Auto5 + Auto6 + Auto7 + Auto8 + Auto9 + Auto10 + Program 1 + Program 2 + No Function + + + Speed + Auto Speed Adjustement + + + + + + + + + Maintenance + No Function + Reserved + Reserved + Reserved + Reserved + Reserved + Fan Mode = Live + Fan Mode = Studio + Fan Mode = Power + Reserved + Dimmer Mode = Off + Dimmer Mode = Dim4 + Reserved + Reserved + Reserved + LED PWM = 1200Hz + LED PWM = 2400Hz + LED PWM = 4000Hz + LED PWM = 6000Hz + LED PWM = 25000Hz + All Reset + Zoom Reset + Reserved + Reserved + Reserved + + + Master Dimmer + Hue + Hue Fine + Saturation + CCT + Strobe + Zoom + Control + + + Master Dimmer + Red + Green + Blue + Amber + Lime + Strobe + Zoom + Control + + + Master Dimmer + Red + Green + Blue + Amber + Lime + Preset Color + CCT + Strobe + Zoom + Auto + Auto Speed Adjustment + Control + + + Master Dimmer + Master Dimmer Fine + Red + Red Fine + Green + Green Fine + Blue + Blue Fine + Amber + Amber Fine + Lime + Lime Fine + Preset Color + CCT + Strobe + Zoom + Auto + Auto Speed Adjustment + Control + + + + + + + + + diff --git a/resources/fixtures/Briteq/Briteq-COB-Blinder-2x100W.qxf b/resources/fixtures/Briteq/Briteq-COB-Blinder-2x100W.qxf new file mode 100644 index 0000000000..28f0e3b7e2 --- /dev/null +++ b/resources/fixtures/Briteq/Briteq-COB-Blinder-2x100W.qxf @@ -0,0 +1,61 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Giacomo Gorini + + Briteq + COB Blinder 2x100W + Strobe + + + + + Maintenance + Fixture Selected Curve + Linear Curve + Square Curve + + + + Dim Left + + 0 + + + 0 + + + + Dimmer + Strobe + + 0 + + + 0 + + + + Dim Left + Dim Right + Strobe + Dimmer Curve + + 0 + + + 1 + + + + + + + + + + + diff --git a/resources/fixtures/CMakeLists.txt b/resources/fixtures/CMakeLists.txt index aeb9c9bc15..f8441a41f6 100644 --- a/resources/fixtures/CMakeLists.txt +++ b/resources/fixtures/CMakeLists.txt @@ -1,13 +1,35 @@ project(fixtures) # Install FixturesMap.xml and all subdirectories (except ./scripts and .) -file(GLOB FILES_AND_DIRECTORIES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*) -list(FILTER FILES_AND_DIRECTORIES EXCLUDE REGEX "^scripts$") -list(REMOVE_ITEM FILES_AND_DIRECTORIES ".") +file(GLOB FIXTURES_FILES_AND_DIRECTORIES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*) +list(FILTER FIXTURES_FILES_AND_DIRECTORIES EXCLUDE REGEX "^scripts$") +list(REMOVE_ITEM FIXTURES_FILES_AND_DIRECTORIES ".") -foreach(FILE_AND_DIRECTORY ${FILES_AND_DIRECTORIES}) - if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${FILE_AND_DIRECTORY}") - install(DIRECTORY ${FILE_AND_DIRECTORY} DESTINATION ${INSTALLROOT}/${FIXTUREDIR}) +# Only perform the copy if we're building for Android +if(ANDROID) + # Loop through each file and directory and copy them to the assets directory, excluding the scripts directory + foreach(FIXTURE_FILE_AND_DIRECTORY ${FIXTURES_FILES_AND_DIRECTORIES}) + if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${FIXTURE_FILE_AND_DIRECTORY}") + # Calculate the full path to the source directory + set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${FIXTURE_FILE_AND_DIRECTORY}") + + # Calculate the full path to the destination directory within the Android package + set(DESTINATION_DIR "${ANDROID_PACKAGE_SOURCE_DIR}/${FIXTUREDIR}") + + # Copy the directory to the assets directory + file(COPY ${SOURCE_DIR} DESTINATION ${DESTINATION_DIR}) + endif() + endforeach() + + # Copy the FixturesMap.xml file to the assets directory + set(SOURCE_FIXTURES_MAP "${CMAKE_CURRENT_SOURCE_DIR}/FixturesMap.xml") + set(DESTINATION_FIXTURES_MAP "${ANDROID_PACKAGE_SOURCE_DIR}/${FIXTUREDIR}") + file(COPY ${SOURCE_FIXTURES_MAP} DESTINATION ${DESTINATION_FIXTURES_MAP}) +endif() + +foreach(FIXTURE_FILE_AND_DIRECTORY ${FIXTURES_FILES_AND_DIRECTORIES}) + if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${FIXTURE_FILE_AND_DIRECTORY}") + install(DIRECTORY ${FIXTURE_FILE_AND_DIRECTORY} DESTINATION ${INSTALLROOT}/${FIXTUREDIR}) endif() endforeach() diff --git a/resources/fixtures/Cameo/Cameo-P2-FC.qxf b/resources/fixtures/Cameo/Cameo-P2-FC.qxf new file mode 100644 index 0000000000..22d4e74e98 --- /dev/null +++ b/resources/fixtures/Cameo/Cameo-P2-FC.qxf @@ -0,0 +1,292 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Christoph Müllner, Massimo Callegari + + Cameo + P2 FC + Color Changer + + + + Colour + Warm white + Warm white -> 2700K + Bulb white (2700K) + 2700K -> 3200K + Halogen white (3200K) + 3200K -> 4000K + Neutral white (4000K) + 4000K -> 5600K + Studio white (5600K) + 5600K -> 6500K + Daylight white (6500K) + 6500K -> cold daylight + Cold daylight + + + + + + + + + + + + + + + Colour + Off + Magenta -> neutral + Neutral + Neutral -> green + + + Shutter + Strobe open + Strobe closed + Ramp up/down slow to fast + Ramp up/down random, slow to fast + Ramp up, slow to fast + Ramp up random, slow to fast + Ramp down, slow to fast + Ramp down random, slow to fast + Random strobe effect, slow to fast + Strobe break effect, 5s...1s (short burst with break) + Strobe slow to fast < 1Hz - 20Hz + Strobe open + + + Colour + No function + 46 Dark Magenta + 29 Plasa Red + 26 Bright Red + 127 Smokey Pink + 36 Medium Pink + 19 Fire + 135 Deep Golden Amber + 778 Millennium Gold + 21 Gold Amber + 157 Pink + 110 Middle Rose + 109 Light Salmon + 35 Light Pink + 134 Golden Amber + 17 Surprise Peach + 746 Brown + 105 Orange + 20 Medium Amber + 768 Egg Yolk Yellow + 15 Deep Straw + 767 Oklahoma Yellow + 101 Yellow + 100 Spring Yellow + 88 Lime Green + 121 LEE Green + 738 Jas Green + 89 Moss Green + 139 Primary Green + 124 Dark Green + 323 Jade + 354 Special Steel Blue + 116 Medium Blue-Green + 183 Moonlight Blue + 132 Medium Blue + 119 Dark Blue + 716 Mikkel Blue + 71 Tokyo Blue + 181 Congo Blue + 799 Special KH Lavender + 707 Ultimate Violet + 343 Special Medium Lavender + 798 Chrysalis Pink + 701 Provence + 797 Deep Purple + 48 Rose Purple + 345 Fuchsia Pink + 795 Magical Magenta + 128 Bright Pink + 2 Rose Pink + User Colour_1 + User Colour_2 + User Colour_3 + User Colour_4 + User Colour_5 + User Colour_6 + User Colour_7 + User Colour_8 + No function + + + Maintenance + No function + Record User Colour 1 (hold 3s) + Record User Colour 2 (hold 3s) + Record User Colour 3 (hold 3s) + Record User Colour 4 (hold 3s) + Record User Colour 5 (hold 3s) + Record User Colour 6 (hold 3s) + Record User Colour 7 (hold 3s) + Record User Colour 8 (hold 3s) + No function + Dimmer Response LED (hold 3s) + Dimmer Response Halogen (hold 3s) + No function + DTW (Redshift) on (hold 1,5s) + DTW (Redshift) off (hold 1,5s) + No function + Auto Fan (hold 3s) + Fan Off (hold 3s) + Constant Low Fan (hold 3s) + Constant Mid Fan (hold 3s) + Constant High Fan (hold 3s) + No function + LED Frequency 600Hz (hold 3s) + LED Frequency 1200Hz (hold 3s) + LED Frequency 2000Hz (hold 3s) + LED Frequency 4000Hz (hold 3s) + LED Frequency 6000Hz (hold 3s) + LED Frequency 18.9kHz (hold 3s) + LED Frequency 25kHz (hold 3s) + RAW (hold 3s) + Calibrated (hold 3s) + User Calibrated (hold 3s) + Smart Calibration (hold 3s) + Display on (hold 3s) + Display off (hold 3s) + No function + Dimmer Curve Linear (hold 3s) + Dimmer Curve Exponential (hold 3s) + Dimmer Curve Logarithmic (hold 3s) + Dimmer Curve S-Curve (hold 3s) + No function + Default set (except DMX-Address, DMX-Mode) (hold 3s) + Default set (except DMX-Address, DMX-Mode and User +Colour/Loops) (hold 3s) + No function + + + Effect + 0s + 0,1s - 10s (0,1s Steps) + 11s - 119s (1s Steps) + 2m - 4m50s (10s Steps) + 5m - 15m (1m Steps) + + + Dimmer + Colour Temperature + + + Red + Green + Blue + + + Red + Green + Blue + Amber + Lime + + + Red + Red fine + Green + Green fine + Blue + Blue fine + Amber + Amber fine + Lime + Lime fine + + + Dimmer + Dimmer fine + Colour Temperature + Tint + + + Dimmer + Dimmer fine + Hue + Saturation + Colour Temperature + Tint + + + Dimmer + Dimmer fine + Red + Green + Blue + Colour Temperature + Tint + + + Dimmer + + + Dimmer + Dimmer fine + + + Dimmer + Dimmer fine + Strobe Functions + Red + Green + Blue + Amber + Lime + Colour Temperature + Tint + Device Settings + + + Dimmer + Dimmer fine + Strobe Functions + Hue + Saturation + Colour Temperature + Tint + Colour Presets + Colour Preset Crossfade + Device Settings + + + Dimmer + Dimmer fine + Strobe Functions + Red + Red fine + Green + Green fine + Blue + Blue fine + Amber + Amber fine + Lime + Lime fine + Colour Temperature + Tint + Colour Presets + Colour Preset Crossfade + Device Settings + + + + + + + + + diff --git a/resources/fixtures/Chauvet/Chauvet-COLORado-Batten-72x.qxf b/resources/fixtures/Chauvet/Chauvet-COLORado-Batten-72x.qxf new file mode 100644 index 0000000000..17bcb89f9e --- /dev/null +++ b/resources/fixtures/Chauvet/Chauvet-COLORado-Batten-72x.qxf @@ -0,0 +1,814 @@ + + + + + Q Light Controller Plus + 4.12.8 GIT + Greg Perrone + + Chauvet + COLORado Batten 72x + Color Changer + + + + + + Shutter + No Function + Strobe, slow to fast + No Function + Pulse Strobe, slow to fast + No Function + Random strobe, slow to fast + + + Colour + No function + R:100%, G:0-100%, B:0, A:0%, W:0% + R:100-0%, G:100%, B:0%, A:0%, W:0% + R:0%, G:100%, B:0-100%, A:0%, W:0% + R:0%, G:100-0%, B:100%, A:0%, W:0% + R:0-100%, G:0%, B:100%, A:0%, W:0% + R:100%, G:0%, B:100-0%, A:0%, W:0% + R:100%, G:100-0%, B:0-100%, A:0%, W:0% + R:100-0%, G:100-0%, B:100%, A:0%, W:0% + R:100%, G:100%, B:100%, A:100%, W:100% + + + Intensity + White + No function + White 1 + White 2 + White 3 + White 4 + White 5 + White 6 + White 7 + White 8 + White 9 + White 10 + White 11 + White 12 + White 13 + White 14 + + + + + + + + + + Shutter + No Function + Strobe, slow to fast + No Function + Pulse Strobe, slow to fast + No Function + Random strobe, slow to fast + + + Shutter + No Function + Strobe, slow to fast + No Function + Pulse Strobe, slow to fast + No Function + Random strobe, slow to fast + + + Colour + No function + R:100%, G:0-100%, B:0, A:0%, W:0% + R:100-0%, G:100%, B:0%, A:0%, W:0% + R:0%, G:100%, B:0-100%, A:0%, W:0% + R:0%, G:100-0%, B:100%, A:0%, W:0% + R:0-100%, G:0%, B:100%, A:0%, W:0% + R:100%, G:0%, B:100-0%, A:0%, W:0% + R:100%, G:100-0%, B:0-100%, A:0%, W:0% + R:100-0%, G:100-0%, B:100%, A:0%, W:0% + R:100%, G:100%, B:100%, A:100%, W:100% + + + Colour + No function + R:100%, G:0-100%, B:0, A:0%, W:0% + R:100-0%, G:100%, B:0%, A:0%, W:0% + R:0%, G:100%, B:0-100%, A:0%, W:0% + R:0%, G:100-0%, B:100%, A:0%, W:0% + R:0-100%, G:0%, B:100%, A:0%, W:0% + R:100%, G:0%, B:100-0%, A:0%, W:0% + R:100%, G:100-0%, B:0-100%, A:0%, W:0% + R:100-0%, G:100-0%, B:100%, A:0%, W:0% + R:100%, G:100%, B:100%, A:100%, W:100% + + + Intensity + White + No function + White 1 + White 2 + White 3 + White 4 + White 5 + White 6 + White 7 + White 8 + White 9 + White 10 + White 11 + White 12 + White 13 + White 14 + + + Intensity + White + No function + White 1 + White 2 + White 3 + White 4 + White 5 + White 6 + White 7 + White 8 + White 9 + White 10 + White 11 + White 12 + White 13 + White 14 + + + + Speed + Preset dimmer speed from display menu + Dimmer speed mode off + Dimmer speed mode 1 (fastest) + Dimmer speed mode 2 + Dimmer speed mode 3 + Dimmer speed mode 4 (slowest) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Shutter + No Function + Strobe, slow to fast + No Function + Pulse Strobe, slow to fast + No Function + Random strobe, slow to fast + + + + + + + + Shutter + No Function + Strobe, slow to fast + No Function + Pulse Strobe, slow to fast + No Function + Random strobe, slow to fast + + + Colour + No function + R:100%, G:0-100%, B:0, A:0%, W:0% + R:100-0%, G:100%, B:0%, A:0%, W:0% + R:0%, G:100%, B:0-100%, A:0%, W:0% + R:0%, G:100-0%, B:100%, A:0%, W:0% + R:0-100%, G:0%, B:100%, A:0%, W:0% + R:100%, G:0%, B:100-0%, A:0%, W:0% + R:100%, G:100-0%, B:0-100%, A:0%, W:0% + R:100-0%, G:100-0%, B:100%, A:0%, W:0% + R:100%, G:100%, B:100%, A:100%, W:100% + + + Intensity + White + No function + White 1 + White 2 + White 3 + White 4 + White 5 + White 6 + White 7 + White 8 + White 9 + White 10 + White 11 + White 12 + White 13 + White 14 + + + + + + + + + + + + + Dimmer 1 + Hue 1 + Fine Hue 1 + Saturation 1 + Strobe 1 + Color Macros 1 + Color Temperature 1 + Dimmer 2 + Hue 2 + Fine Hue 2 + Saturation 2 + Strobe 2 + Color Macros 2 + Color Temperature 2 + Dimmer 3 + Hue 3 + Fine Hue 3 + Saturation 3 + Strobe 3 + Color Macros 3 + Color Temperature 3 + Dimmer Speed + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + + + 7 + 8 + 9 + 10 + 11 + 12 + 13 + + + 14 + 15 + 16 + 17 + 18 + 19 + 20 + + + + Dimmer + Fine Dimmer + Red 1 + Fine Red 1 + Green 1 + Fine Green 1 + Blue 1 + Fine Blue 1 + Amber 1 + Fine Amber 1 + White 1 + Fine White 1 + Color Macros 1 + Color Temperature 1 + Strobe 1 + Red 2 + Fine Red 2 + Green 2 + Fine Green 2 + Blue 2 + Fine Blue 2 + Amber 2 + Fine Amber 2 + White 2 + Fine White 2 + Color Macros 2 + Color Temperature 2 + Strobe 2 + Red 3 + Fine Red 3 + Green 3 + Fine Green 3 + Blue 3 + Fine Blue 3 + Amber 3 + Fine Amber 3 + White 3 + Fine White 3 + Color Macros 3 + Color Temperature 3 + Strobe 3 + Strobe All + Dimmer Speed + + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 27 + 26 + 25 + 24 + 23 + 22 + + + 40 + 39 + 38 + 37 + 36 + 35 + 34 + 33 + 32 + 31 + 30 + 29 + 28 + + + + Red 1 + Fine Red 1 + Green 1 + Fine Green 1 + Blue 1 + Fine Blue 1 + Amber 1 + Fine Amber 1 + White 1 + Fine White 1 + Red 2 + Fine Red 2 + Green 2 + Fine Green 2 + Blue 2 + Fine Blue 2 + Amber 2 + Fine Amber 2 + White 2 + Fine White 2 + Red 3 + Fine Red 3 + Green 3 + Fine Green 3 + Blue 3 + Fine Blue 3 + Amber 3 + Fine Amber 3 + White 3 + Fine White 3 + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + + + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + + + 20 + 29 + 28 + 27 + 26 + 25 + 24 + 23 + 22 + 21 + + + + Dimmer + Fine Dimmer + Red 1 + Green 1 + Blue 1 + Amber 1 + White 1 + Color Macros 1 + Color Temperature 1 + Strobe 1 + Red 2 + Green 2 + Blue 2 + Amber 2 + White 2 + Color Macros 2 + Color Temperature 2 + Strobe 2 + Red 3 + Green 3 + Blue 3 + Amber 3 + White 3 + Color Macros 3 + Color Temperature 3 + Strobe 3 + Strobe All + + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + + + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + + + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + + + + Red 1 + Green 1 + Blue 1 + Amber 1 + White 1 + Red 2 + Green 2 + Blue 2 + Amber 2 + White 2 + Red 3 + Green 3 + Blue 3 + Amber 3 + White 3 + + 0 + 1 + 2 + 3 + 4 + + + 5 + 6 + 7 + 8 + 9 + + + 10 + 11 + 12 + 13 + 14 + + + + Dimmer + Fine Dimmer + Red 1 + Green 1 + Blue 1 + Amber 1 + Color Macros 1 + Color Temperature 1 + Strobe 1 + Red 2 + Green 2 + Blue 2 + Amber 2 + Color Macros 2 + Color Temperature 2 + Strobe 2 + Red 3 + Green 3 + Blue 3 + Amber 3 + Color Macros 3 + Color Temperature 3 + Strobe 3 + Strobe All + + 2 + 3 + 4 + 5 + 6 + 7 + 8 + + + 9 + 10 + 11 + 12 + 13 + 14 + 15 + + + 16 + 17 + 18 + 19 + 20 + 21 + 22 + + + + Red 1 + Green 1 + Blue 1 + Amber 1 + Red 2 + Green 2 + Blue 2 + Amber 2 + Red 3 + Green 3 + Blue 3 + Amber 3 + + 0 + 1 + 2 + 3 + + + 4 + 5 + 6 + 7 + + + 8 + 9 + 10 + 11 + + + + Dimmer + Fine Dimmer + Red 1 + Green 1 + Blue 1 + Color Macros 1 + Color Temperature 1 + Strobe 1 + Red 2 + Green 2 + Blue 2 + Color Macros 2 + Color Temperature 2 + Strobe 2 + Red 3 + Green 3 + Blue 3 + Color Macros 3 + Color Temperature 3 + Strobe 3 + Strobe All + + 2 + 3 + 4 + 5 + 6 + 7 + + + 8 + 9 + 10 + 11 + 12 + 13 + + + 14 + 15 + 16 + 17 + 18 + 19 + + + + Red 1 + Green 1 + Blue 1 + Red 2 + Green 2 + Blue 2 + Red 3 + Green 3 + Blue 3 + + 0 + 1 + 2 + + + 3 + 4 + 5 + + + 6 + 7 + 8 + + + + Dimmer + Hue + Fine Hue + Saturation + Strobe + Color Macros + Color Temperature + Dimmer Speed + + + Dimmer + Fine Dimmer + Red + Fine Red + Green + Fine Green + Blue + Fine Blue + Amber + Fine Amber + White + Fine White + Color Macros + Color Temperature + Strobe + Dimmer Speed + + + Red + Fine Red + Green + Fine Green + Blue + Fine Blue + Amber + Fine Amber + White + Fine White + + + Dimmer + Fine Dimmer + Red + Green + Blue + Amber + White + Color Macros + Color Temperature + Strobe + + + Red + Green + Blue + Amber + White + + + Dimmer + Fine Dimmer + Red + Green + Blue + Amber + Color Macros + Color Temperature + Strobe + + + Red + Green + Blue + Amber + + + Dimmer + Fine Dimmer + Red + Green + Blue + Color Macros + Color Temperature + Strobe + + + Red + Green + Blue + + + + + + + + + + diff --git a/resources/fixtures/Chauvet/Chauvet-COLORband-Q3BT.qxf b/resources/fixtures/Chauvet/Chauvet-COLORband-Q3BT.qxf new file mode 100644 index 0000000000..222fcbe3ba --- /dev/null +++ b/resources/fixtures/Chauvet/Chauvet-COLORband-Q3BT.qxf @@ -0,0 +1,108 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Paul Schuh + + Chauvet + COLORband Q3BT + LED Bar (Beams) + + + + + + + + + + + + + + Shutter + No function + Strobe - slow to fast + + + Effect + No Function + Auto Program 1 + Auto Program 2 + Auto Program 3 + Auto Program 4 + Auto Program 5 + Auto Program 6 + Auto Program 7 + Auto Program 8 + + + Speed + Program Speed - slow to fast + Sound active mode + + + + + + + + Red 1 + Green 1 + Blue 1 + Amber 1 + Red 2 + Green 2 + Blue 2 + Amber 2 + Red 3 + Green 3 + Blue 3 + Amber 3 + Strobe + Auto Programs + Auto Speed + Dimmer + + 0 + 1 + 2 + 3 + + + 4 + 5 + 6 + 7 + + + 8 + 9 + 10 + 11 + + + + Red + Green + Blue + Amber + Dimmer + Strobe + + + Red + Green + Blue + Amber + + + + + + + + + diff --git a/resources/fixtures/Chauvet/Chauvet-COLORdash-Par-Quad-18.qxf b/resources/fixtures/Chauvet/Chauvet-COLORdash-Par-Quad-18.qxf new file mode 100644 index 0000000000..e3597cc322 --- /dev/null +++ b/resources/fixtures/Chauvet/Chauvet-COLORdash-Par-Quad-18.qxf @@ -0,0 +1,100 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Michael Tosatto + + Chauvet + COLORdash Par-Quad 18 + Color Changer + + + + + + + Shutter + No Function + Strobe (Slow to Fast) + + + Effect + No Function + R: 100% G: 0-100% B: 0 + R: 100%-0 G:100% B: 0 + R: 0 G: 100% B: 0-100% + R: 0 G: 100%-0 B: 100% + R: 0-100% G: 0 B: 100% + R: 100% G: 0 B: 100%-0 + R: 100% G: 0-100% B: 0-100% + R: 100%-0 G: 100%-0 B: 100% + R: 100% G: 100% B: 100% A: 100% + White 1 + White 2 + White 3 + White 4 + White 5 + White 6 + White 7 + White 8 + White 9 + White 10 + White 11 + + + Effect + No Function + Auto 1 + Auto 2 + Auto 3 + Auto 4 + Auto 5 + + + Speed + Slow to Fast + + + Speed + Preset Dimmer + Linear Dimmer + Nonlinear Dimming Curve 1 (Fastest) + Nonlinear Dimming Curve 2 + Nonlinear Dimming Curve 3 (Slowest) + + + Red + Green + Blue + Amber + + + Dimmer + Red + Green + Blue + Amber + Strobe + + + Dimmer + Red + Green + Blue + Amber + Strobe + Color Macro + White Balance + Auto Program + Auto Speed + Dimmer Speed + + + + + + + + + diff --git a/resources/fixtures/Chauvet/Chauvet-Intimidator-Spot-375Z-IRC.qxf b/resources/fixtures/Chauvet/Chauvet-Intimidator-Spot-375Z-IRC.qxf index bfc92b07bd..a9a1d77223 100644 --- a/resources/fixtures/Chauvet/Chauvet-Intimidator-Spot-375Z-IRC.qxf +++ b/resources/fixtures/Chauvet/Chauvet-Intimidator-Spot-375Z-IRC.qxf @@ -3,7 +3,7 @@ Q Light Controller Plus - 4.12.6 + 4.12.8 GIT Andrew Pavlin Chauvet @@ -40,13 +40,13 @@ Gobo 5 Gobo 6 Gobo 7 - Gobo 7 shake, slow to fast - Gobo 6 shake, slow to fast - Gobo 5 shake, slow to fast - Gobo 4 shake, slow to fast - Gobo 3 shake, slow to fast - Gobo 2 shake, slow to fast - Gobo 1 shake, slow to fast + Gobo 7 shake, slow to fast + Gobo 6 shake, slow to fast + Gobo 5 shake, slow to fast + Gobo 4 shake, slow to fast + Gobo 3 shake, slow to fast + Gobo 2 shake, slow to fast + Gobo 1 shake, slow to fast Open Cycle gobos, slow to fast Stop diff --git a/resources/fixtures/Chauvet/Chauvet-Intimidator-Spot-475ZX.qxf b/resources/fixtures/Chauvet/Chauvet-Intimidator-Spot-475ZX.qxf new file mode 100644 index 0000000000..18e8d48662 --- /dev/null +++ b/resources/fixtures/Chauvet/Chauvet-Intimidator-Spot-475ZX.qxf @@ -0,0 +1,188 @@ + + + + + Q Light Controller Plus + 4.12.8 GIT + Harrison Bostock + + Chauvet + Intimidator Spot 475ZX + Moving Head + + + + + + + Colour + White + Orange + Lime green + Cyan + Red + Green + Magenta + Yellow + White + Color indexing + Color cycling rainbox, fast to slow + Stop + Color cycling rainbox, slow to fast + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Gobo 7 shake, slow to fast + Gobo 6 shake, slow to fast + Gobo 5 shake, slow to fast + Gobo 4 shake, slow to fast + Gobo 3 shake, slow to fast + Gobo 2 shake, slow to fast + Gobo 1 shake, slow to fast + Open + Cycle gobos, slow to fast + Stop + Reverse cycle gobos, slow to fast + + + Gobo + Gobo Indexing + Gobo rotation, slow to fast + Stop + Reverse gobo rotation, slow to fast + Gobo bounce, slow to fast + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Gobo 8 + Gobo 8 Shake Slow to fast + Gobo 7 Shake Slow to fast + Gobo 6 Shake Slow to fast + Gobo 5 Shake Slow to fast + Gobo 4 Shake Slow to fast + Gobo 3 Shake Slow to fast + Gobo 2 Shake Slow to fast + Gobo 1 Shake Slow to fast + Open + Reverse Cycle Effect Slow to fast + Cycle Effect slow to fast + + + Prism + Nothing + Prism 1 Round + Rotation Slow to fast + Reverse Rotation Slow to fast + Prism 1 Round + No function + Prism 2 Linear + Rotation Slow to fast + Reverse rotation Slow to fast + Prism 2 Linear + + + + + + Shutter + Off + On + Strobe, Slow to fast + Pulse Strobe slow to fast + Random Strobe slow to fast + On + + + Maintenance + Nothing + Blackout on Pantilt + Blackout on Colour Wheel move + Blackout on Gobo Wheels move + Blackout on Pan/tilt/colour wheel move + Blackout on pan/tilt/gobo wheels move + Blackout on pan/tilt/colour wheel/gobo wheels move + Nothing + Pan Reset + Tilt reset + Colour wheel reset + Gobo wheels reset + Nothing + Prism reset + Nothing + All Reset + Nothing + + + Effect + Nothing + Movement macro 1 + Movement Macro 2 + Movement Macro 3 + Movement Macro 4 + Movement Macro 5 + Movement Macro 6 + Movement Macro 7 + Movement Macro 8 + Sound-Active movement macro 1 + Sound-Active movement macro 2 + Sound-Active movement macro 3 + Sound-Active movement macro 4 + Sound-Active movement macro 5 + Sound-Active movement macro 6 + Sound-Active movement macro 7 + Sound-Active movement macro 8 + + + Pan + Pan fine + Tilt + Tilt fine + Pan/Tilt speed + Color wheel + Gobo wheel + Gobo Rotation + Static Gobo 2 + Prism + Focus + Zoom + Dimmer + Strobe + Control + Movement Macros + + + Pan + Tilt + Color wheel + Gobo wheel + Gobo Rotation + Static Gobo 2 + Prism + Focus + Zoom + Strobe + + + + + + + + + diff --git a/resources/fixtures/Chauvet/Chauvet-Intimidator-Spot-Duo-155.qxf b/resources/fixtures/Chauvet/Chauvet-Intimidator-Spot-Duo-155.qxf new file mode 100644 index 0000000000..3adc162a78 --- /dev/null +++ b/resources/fixtures/Chauvet/Chauvet-Intimidator-Spot-Duo-155.qxf @@ -0,0 +1,363 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Michael Tosatto + + Chauvet + Intimidator Spot Duo 155 + Moving Head + + + + + + + Colour + White + Yellow + Magenta + Green + Red + Cyan + Orange + Blue + Light green + Amber + White + yellow + Yellow + magenta + Magenta + green + Green + red + Red + cyan + Cyan + orange + Orange + blue + Blue + light green + Light green + amber + Amber + white + Color cycling rainbow with increasing speed + Reverse color cycling rainbow with increasing speed + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Gobo 8 + Gobo 9 + Gobo 9 shake, from slow to fast + Gobo 8 shake, from slow to fast + Gobo 7 shake, from slow to fast + Gobo 6 shake, from slow to fast + Gobo 5 shake, from slow to fast + Gobo 4 shake, from slow to fast + Gobo 3 shake, from slow to fast + Gobo 2 shake, from slow to fast + Gobo 1 shake, from slow to fast + Open + Cycle effect with increasing speed + Reverse cycle effect with increasing speed + + + Shutter + Closed + Open + Strobe effect 0-17 Hz + Pulse strobe (Slow to fast) + Random strobe (Slow to fast) + Open + + + + Maintenance + No function + Pan/Tilt blackout + Color blackout + Gobo blackout + Pan/Tilt/Color blackout + Pan/Tilt/Gobo blackout + Color/Gobo blackout + Pan/Tilt/Color/Gobo blackout + No function + First two heads setting + Latter two heads setting + Cancel four heads + No function + Reset + No function + Reverse pan/tilt for both heads + Reverse pan for head 1 + Reverse pan for head 2 + Reverse tilt for head 1 + Reverse tilt for head 2 + Cancel reverse pan for head 1 + Cancel reverse pan for head 2 + Cancel reverse tilt for head 1 + Cancel reverse tilt for head 2 + Cancel reverse pan/tilt for both heads + No function + Strone pattern 1 (Slow to fast) + Strobe pattern 2 (Slow to fast) + Strobe pattern 3 (Slow to fast) + + + Maintenance + No function + Movement macro 1 + Movement macro 2 + Movement macro 3 + Movement macro 4 + Movement macro 5 + Movement macro 6 + Movement macro 7 + Movement macro 8 + Movement macro 9 + Movement macro 10 + Movement macro 11 + Movement macro 12 + Movement macro 13 + Movement macro 14 + Movement macro 15 + All movement macros 1-15 + Sound-Active Mode + + + + + + + + + + + Colour + White + Yellow + Magenta + Green + Red + Cyan + Orange + Blue + Light green + Amber + White + yellow + Yellow + magenta + Magenta + green + Green + red + Red + cyan + Cyan + orange + Orange + blue + Blue + light green + Light green + amber + Amber + white + Color cycling rainbow with increasing speed + Reverse color cycling rainbow with increasing speed + + + Colour + White + Yellow + Magenta + Green + Red + Cyan + Orange + Blue + Light green + Amber + White + yellow + Yellow + magenta + Magenta + green + Green + red + Red + cyan + Cyan + orange + Orange + blue + Blue + light green + Light green + amber + Amber + white + Color cycling rainbow with increasing speed + Reverse color cycling rainbow with increasing speed + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Gobo 8 + Gobo 9 + Gobo 9 shake, from slow to fast + Gobo 8 shake, from slow to fast + Gobo 7 shake, from slow to fast + Gobo 6 shake, from slow to fast + Gobo 5 shake, from slow to fast + Gobo 4 shake, from slow to fast + Gobo 3 shake, from slow to fast + Gobo 2 shake, from slow to fast + Gobo 1 shake, from slow to fast + Open + Cycle effect with increasing speed + Reverse cycle effect with increasing speed + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Gobo 8 + Gobo 9 + Gobo 9 shake, from slow to fast + Gobo 8 shake, from slow to fast + Gobo 7 shake, from slow to fast + Gobo 6 shake, from slow to fast + Gobo 5 shake, from slow to fast + Gobo 4 shake, from slow to fast + Gobo 3 shake, from slow to fast + Gobo 2 shake, from slow to fast + Gobo 1 shake, from slow to fast + Open + Cycle effect with increasing speed + Reverse cycle effect with increasing speed + + + + + Speed + Movement Macro Speed (Fast to slow) + + + Shutter + Closed + Open + Strobe effect 0-17 Hz + Pulse strobe (Slow to fast) + Random strobe (Slow to fast) + Open + + + Shutter + Closed + Open + Strobe effect 0-17 Hz + Pulse strobe (Slow to fast) + Random strobe (Slow to fast) + Open + + + Pan 1 + Fine Pan 1 + Tilt 1 + Fine Tilt 1 + Pan 2 + Fine Pan 2 + Tilt 2 + Fine Tilt 2 + Speed + Color Wheel 1 + Color Wheel 2 + Gobo Wheel 1 + Gobo Wheel 2 + Dimmer 1 + Dimmer 2 + Shutter 1 + Shutter 2 + Control Functions + Movement Macros + Movement Macro Speed + + 0 + 1 + 2 + 3 + 9 + 11 + 13 + 15 + + + 4 + 5 + 6 + 7 + 10 + 12 + 14 + 16 + + + + Pan 1 + Fine Pan 1 + Tilt 1 + Fine Tilt 1 + Pan 2 + Fine Pan 2 + Tilt 2 + Fine Tilt 2 + Speed + Color Wheel + Gobo Wheel + Dimmer 1 + Dimmer 2 + Shutter + Control Functions + Movement Macros + Movement Macro Speed + + 0 + 1 + 2 + 3 + 11 + + + 4 + 5 + 6 + 7 + 12 + + + + Pan + Tilt + Color Wheel + Gobo Wheel + Dimmer 1 + Dimmer 2 + Shutter + Control Functions + Movement Macros + Movement Macro Speed + + 4 + + + 5 + + + + + + + + + + + diff --git a/resources/fixtures/Chauvet/Chauvet-Intimidator-Wash-Zoom-450-IRC.qxf b/resources/fixtures/Chauvet/Chauvet-Intimidator-Wash-Zoom-450-IRC.qxf new file mode 100644 index 0000000000..574db54d51 --- /dev/null +++ b/resources/fixtures/Chauvet/Chauvet-Intimidator-Wash-Zoom-450-IRC.qxf @@ -0,0 +1,234 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Harrison Bostock + + Chauvet + Intimidator Wash Zoom 450 IRC + Moving Head + + + + + + + + + + + + + + + + + + + + + + + Colour + No function + Color 1 + Color 2 + Color 3 + Color 4 + Color 5 + Color 6 + Color 7 + Color 8 + Color 9 + Color 10 + Color 11 + Color 12 + Color 13 + Color 14 + Color 15 + Color 16 + Color 17 + Color 18 + Color 19 + Color 20 + Color 21 + Color 22 + Color 23 + Color 24 + Color 25 + Color 26 + Color 27 + Color 28 + Color 29 + Color 30 + Color 31 + Color 32 + Color 33 + Color 34 + No function + Clockwise color change (fast to slow) + Stop (color stays in the current color) + Counter-clockwise color change (fast to slow) + No function + Color jump (fast to slow) + Sound-Active colors + + + Maintenance + Nothing + Zone macro 1 + Zone macro 2 + Zone macro 3 + Zone macro 4 + Zone macro 5 + Zone macro 6 + Zone macro 7 (macro 1-6) + Built-in Auto 1 + Built-in Auto 2 + Built-in Auto 3 + Built-in Auto 4 + Built-in Auto 5 + Built-in Auto 6 + Built-in Auto 7 + Built-in Auto 8 (Built-in Auto 1-7) + + + Speed + Zone macros and Built-in auto speed (slow to fast) + + + + Shutter + Closed + Open + Strobe Fast-slow + Open + Fast on slow off (fast slow) + Open + Slow on, Fast off (fast to slow) + Open + Random shutter (fast to slow) + Open + Random fast on slow off (fast to slow) + Open + Random slow on fast off (fast to slow) + Open + pulse effect 1 (fast to slow) + Open + Pulse effect 2 (fast to slow) + Open + Gradually on and off (fast to slow) + Open + pulse effect 3 (fast to slow) + Open + + + + Maintenance + Nothing + Blackout while panning/tilting + Nothing + Reserved for future use + Reset pan + Reset tilt + Reset zoom + Reset rotation + Reset all + Nothing + Reverse pan/tilt + Reverse pan + Reverse tilt + Cancel reverse pan + Cancel reverse tilt + Cancel reverse pan/tilt + Pan/tilt normal speed + Pan/tilt fast speed + Pan/tilt slow speed + Fan full speed + Fan auto speed + Dimmer fast + Dimmer smooth + Nothing + + + + Pan + Pan fine + Tilt + Tilt fine + Pan/Tilt speed + Red + Green + Blue + White + Red 1 + Green 1 + Blue 1 + White 1 + Red 2 + Green 2 + Blue 2 + White 2 + Red 3 + Green 3 + Blue 3 + White 3 + Color macro + Builtin Control + Builtin Speed + Dimmer + Shutter + Zoom + Control function + No function + + 5 + 6 + 7 + 8 + + + 9 + 10 + 11 + 12 + + + 13 + 14 + 15 + 16 + + + 17 + 18 + 19 + 20 + + + + Pan + Tilt + Pan/Tilt speed + Red + Green + Blue + White + Builtin Control + Builtin Speed + Dimmer + Shutter + Zoom + Control function + No function + + + + + + + + + diff --git a/resources/fixtures/Chauvet/Chauvet-Legend-330SR-Spot.qxf b/resources/fixtures/Chauvet/Chauvet-Legend-330SR-Spot.qxf index b72072fa51..ca1035e8b2 100644 --- a/resources/fixtures/Chauvet/Chauvet-Legend-330SR-Spot.qxf +++ b/resources/fixtures/Chauvet/Chauvet-Legend-330SR-Spot.qxf @@ -1,4 +1,4 @@ - + @@ -54,7 +54,7 @@ Gobo Open Gobo 1 - Gobo 2 + Gobo 2 Gobo 3 Gobo 4 Gobo 5 diff --git a/resources/fixtures/Chauvet/Chauvet-Rogue-R2-Spot.qxf b/resources/fixtures/Chauvet/Chauvet-Rogue-R2-Spot.qxf index 7fd1e3fc61..e286b47708 100644 --- a/resources/fixtures/Chauvet/Chauvet-Rogue-R2-Spot.qxf +++ b/resources/fixtures/Chauvet/Chauvet-Rogue-R2-Spot.qxf @@ -1,4 +1,4 @@ - + @@ -76,7 +76,7 @@ Gobo 4 Gobo 5 Gobo 6 - Gobo 7 + Gobo 7 Gobo Shake 1-7 (Slow -> Fast) Open Clockwise Gobo Scroll (Slow -> Fast) diff --git a/resources/fixtures/Chauvet/Chauvet-Wash-FX-Hex.qxf b/resources/fixtures/Chauvet/Chauvet-Wash-FX-Hex.qxf new file mode 100644 index 0000000000..58b468e814 --- /dev/null +++ b/resources/fixtures/Chauvet/Chauvet-Wash-FX-Hex.qxf @@ -0,0 +1,354 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Clément Delabroye + + Chauvet + Wash FX Hex + Flower + + Effect + No function + Auto program 1 + Auto program 2 + Auto program 3 + Auto program 4 + Auto program 5 + Auto program 6 + Auto program 7 + Auto program 8 + Auto program 9 + Auto program 10 + Auto program 11 + Auto program 12 + Auto program 13 + Auto program 14 + Auto program 15 + Auto program 16 + + + Speed + Speed, slow to fast + Sound-active Mode + + + + + + + + + + Effect + No function + Zone macro + + + + Intensity + Red + 0 -100 % + + + Intensity + Red + 0 -100 % + + + Intensity + Red + 0 -100 % + + + Intensity + Red + 0 -100 % + + + Intensity + Red + 0 -100 % + + + Intensity + Red + 0 -100 % + + + Intensity + Green + 0 -100 % + + + Intensity + Green + 0 -100 % + + + Intensity + Green + 0 -100 % + + + Intensity + Green + 0 -100 % + + + Intensity + Green + 0 -100 % + + + Intensity + Green + 0 -100 % + + + Intensity + Blue + 0 -100 % + + + Intensity + Blue + 0 -100 % + + + Intensity + Blue + 0 -100 % + + + Intensity + Blue + 0 -100 % + + + Intensity + Blue + 0 -100 % + + + Intensity + Blue + 0 -100 % + + + Intensity + Amber + 0 -100 % + + + Intensity + Amber + 0 -100 % + + + Intensity + Amber + 0 -100 % + + + Intensity + Amber + 0 -100 % + + + Intensity + Amber + 0 -100 % + + + Intensity + Amber + 0 -100 % + + + Intensity + White + 0 -100 % + + + Intensity + White + 0 -100 % + + + Intensity + White + 0 -100 % + + + Intensity + White + 0 -100 % + + + Intensity + White + 0 -100 % + + + Intensity + White + 0 -100 % + + + Intensity + UV + 0 -100 % + + + Intensity + UV + 0 -100 % + + + Intensity + UV + 0 -100 % + + + Intensity + UV + 0 -100 % + + + Intensity + UV + 0 -100 % + + + Intensity + UV + 0 -100 % + + + Auto programs + Auto program speed + Dimmer + + + Red + Green + Blue + Amber + White + UV + + + Red + Green + Blue + Amber + White + UV + Strobe + Auto programs + Zone macro + Auto program speed + Dimmer + + + Auto programs + Auto program speed + Dimmer + Strobe + Red zone 1 + Green zone 1 + Blue zone 1 + Amber zone 1 + White zone 1 + UV zone 1 + Red zone 2 + Green zone 2 + Blue zone 2 + Amber zone 2 + White zone 2 + UV zone 2 + Red zone 3 + Green zone 3 + Blue zone 3 + Amber zone 3 + White zone 3 + UV zone 3 + Red zone 4 + Green zone 4 + Blue zone 4 + Amber zone 4 + White zone 4 + UV zone 4 + Red zone 5 + Green zone 5 + Blue zone 5 + Amber zone 5 + White zone 5 + UV zone 5 + Red zone 6 + Green zone 6 + Blue zone 6 + Amber zone 6 + White zone 6 + UV zone 6 + + 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 + + + 34 + 35 + 36 + 37 + 38 + 39 + + + + + + + + + + + diff --git a/resources/fixtures/DTS/DTS-Jack.qxf b/resources/fixtures/DTS/DTS-Jack.qxf new file mode 100644 index 0000000000..4e85bf9f12 --- /dev/null +++ b/resources/fixtures/DTS/DTS-Jack.qxf @@ -0,0 +1,278 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Tomas Hastings + + DTS + Jack + Moving Head + + + + + + Speed + Standard + Fast Movement + Vector Mode from Fast to Slow + Variable time reaction to DMX Signal (fast to slow) + Silent Movement + + + Pan + Pan Far Settings + + + + Shutter + Blackout + Open + Blackout + Strobe random speed + Strobe speed 1 + Strobe speed 2 + Strobe speed 3 + Strobe speed 4 + Strobe speed 5 + Strobe speed 6 + Flash open speed 1 + Flash open speed 2 + Flash open speed 3 + Flash open speed 4 + Flash closed speed 1 + Flash closed speed 2 + Flash closed speed 3 + Flash closed speed 4 + Colours / Gobo in black-out + Pan / Tilt in black-out + Open + + + Colour + Colour 1 + Colour 2 + Colour 3 + Colour 4 + Colour 5 + Colour 6 + Colour 7 + Colour 8 + Colour 9 + Colour 10 + Colour 11 + Colour 12 + Colour 13 + Colour 14 + Colour 15 + Colour 16 + Colour 17 + Colour 18 + + + Colour + Full Colour + Half Colour + Proportional Colour + Rainbow + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Gobo 8 + Gobo 9 + Speed Rotation 1 (min) + Speed Rotation 2 + Speed Rotation 3 + Speed Rotation 4 + Speed Rotation 5 + Speed Rotation 6 + Speed Rotation 7 + Speed Rotation 8 (max) + + + Gobo + Gobo Rotation Mode + Gobo Index Mode + + + Gobo + Stop + Left Rotation (max to min) + Stop + Right Rotation (min to max) + + + Gobo + Gobo Index Fine + + + Gobo + Stop + Gobo Shake R-L Speed 1 + Gobo Shake R-L Speed 2 + Gobo Shake R-L Speed 3 + Gobo Shake R-L Speed 4 + Gobo Shake R-L Speed 5 + Gobo Shake R-L Speed 6 + Gobo Shake R-L Speed 7 + Gobo Shake R-L Speed 8 + Gobo Shake R-L Speed 9 + Stop + Gobo Shake L-R Speed 1 + Gobo Shake L-R Speed 2 + Gobo Shake L-R Speed 3 + Gobo Shake L-R Speed 4 + Gobo Shake L-R Speed 5 + Gobo Shake L-R Speed 6 + Gobo Shake L-R Speed 7 + Gobo Shake L-R Speed 8 + Gobo Shake L-R Speed 9 + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Gobo 8 + Gobo 9 + Gobo 10 + Speed Rotation 1 (min) + Speed Rotation 2 + Speed Rotation 3 + Speed Rotation 4 + Speed Rotation 5 + Speed Rotation 6 + Speed Rotation 7 (max) + + + Gobo + Stop + Gobo shake R-L speed 1 + Gobo shake R-L speed 2 + Gobo shake R-L speed 3 + Gobo shake R-L speed 4 + Gobo shake R-L speed 5 + Gobo shake R-L speed 6 + Gobo shake R-L speed 7 + Gobo shake R-L speed 8 + Gobo shake R-L speed 9 + Stop + Gobo shake L-R speed 1 + Gobo shake L-R speed 2 + Gobo shake L-R speed 3 + Gobo shake L-R speed 4 + Gobo shake L-R speed 5 + Gobo shake L-R speed 6 + Gobo shake L-R speed 7 + Gobo shake L-R speed 8 + Gobo shake L-R speed 9 + + + Shutter + Open + Linear iris from open to closed + Closed + + + Maintenance + No effect + Iris pulse at different speed from min to max + Iris pulse with flash closing from min to max + Iris pulse with flash opening from min to max + Iris pulse with flash closing combined with zoom from min to max + Iris pulse with flash opening combined with zoom from min to max + + + Maintenance + Iris Macros + Beam Macros + Wash Macros + Spot Macros + + + Prism + No Effect + Prism Inserted + + + + + + Maintenance + No Effect + Lamp Off (3 sec) + No Effect + Lamp On (3 sec) + No Effect + Internal Motor Reset + Total Reset + + + Pan + Pan Fine + Tilt + Tilt Fine + Pan/Tilt speed + Pan Far + Dimmer + Shutter + Colour + Colour Mode + Gobo + Gobo Mode + Gobo Rotation + Gobo Index Fine + Gobo Shake + Fixed Gobo + Fixed Gobo Shake + Iris + Macros + Macros Mode + Prism + Focus + Focus Fine + Zoom + Reset + Lamp + + + Pan + Pan Fine + Tilt + Tilt Fine + Pan/Tilt speed + Pan Far + Dimmer + Shutter + Colour + Gobo + Gobo Rotation + Fixed Gobo + Iris + Prism + Focus + Zoom + Reset + Lamp + + + + + + + + + diff --git a/resources/fixtures/EK/EK-R3-Wash.qxf b/resources/fixtures/EK/EK-R3-Wash.qxf new file mode 100644 index 0000000000..c01c048219 --- /dev/null +++ b/resources/fixtures/EK/EK-R3-Wash.qxf @@ -0,0 +1,197 @@ + + + + + Q Light Controller Plus + 4.12.8 GIT + Harrison Bostock + + EK + R3 Wash + Moving Head + + + + + + + + + + Colour + OFF + 8000K~7000K + 7000K~6000K + 6000K~5600K + 5000K~4000K + 4000K~3200K + 3200K~2500K + 2500K + + + Colour + Macro Color OFF + Red + Green + Blue + Cyan + Yellow + Magenta + White 7000 K + White 3700 K + White 5000 K + Black + Medium Yellow + Straw Tint + Surprise Peach + Fire + Medium Amber + Gold Amber + Dark Amber + Sunrise Red + Light Pink + Medium Pink + Pink Carnation + Light Lavender + Lavender + Sky Blue + Just Blue + Dark Yellow Green + Spring Yellow + Light Amber + Straw + Deep Amber + Orange + Light Rose + English Rose + Light Salmon + Middle Rose + Dark Pink + Magenta2 + Peacock Blue + Med Blue Green + Steel Blue + Light Blue + Dark Blue + Leaf Green + Dark Green + Mauve + Bright Pink + Medium Blue + Deep Golden Amber + Pale Lavender + Special Lavender + Primary Green + Bright Blue + Apricot + Pale Gold + Deep Orange + Bastard Amber + Flame Red + Daylight Blue + Lilac Tint + Deep Lavender + Dark Steel Blue + Congo Blue + Alice Blue + Dirty White + White + + + Shutter + closed + slow to fast Strobe 1-25hz + open + Slow to fast Pulse + Open + Random Slow Strobe + Randum Medium Strobe + Random Fast Strobe + Open + + + + + + + + + + Maintenance + none + Fast P&T speed + Normal P&T speed + Dimmer Curve 1 (D) + Dimmer Curve 2 + Dimmer Curve 3 + Dimmer Curve 4 + Raw color Channels Gamma 1 + Raw color Channels Gamma 1.5 + Raw color Channels Gamma 2.2 (D) + Color Calibration OFF (D) + Color Calibration Adjust + Color Calibration Calibration (Only Base mode0 + FREE + PWM frequency=600Hz + PWM frequency=1200Hz (Default) + PWM frequency=2000Hz + PWM frequency=4000Hz + PWM frequency=6000Hz + PWM frequency=25000Hz + Default function recall + + + Maintenance + none + Zoom Reset HOLD 5s + Pan/Tilt Reset HOLD 5s + Complete Reset HOLD 5s + + + Red + Green + Blue + White + CTO + Macro + Strobe + Master dimmer + Master dimmer fine + Pan + Pan fine + Tilt + Tilt fine + Zoom + Function + Reset + + + Red + Red fine + Green + Green fine + Blue + Blue fine + White + White fine + CTO + Macro + Strobe + Master dimmer + Master dimmer fine + Pan + Pan fine + Tilt + Tilt fine + Zoom + Function + Reset + + + + + + + + + diff --git a/resources/fixtures/Elation/Elation-ELED-B48.qxf b/resources/fixtures/Elation/Elation-ELED-B48.qxf new file mode 100644 index 0000000000..6a9f34e13d --- /dev/null +++ b/resources/fixtures/Elation/Elation-ELED-B48.qxf @@ -0,0 +1,98 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Xoneoo + + Elation + ELED B48 + Color Changer + + + + + + Shutter + Static + Strobing slow --> fast + + + Effect + No effect + Auto color mix + Auto mix using channel 1, 2, & 3 + 24 Auto mode programs + Suond active flash + Sound active + + + Effect + Nothing + Color macro + + + + + + + + + + + + + + + Red + Green + Blue + Macro + Strobing/Speed Control + Auto Mode + Dimming + + + RED 1 + GREEN 1 + BLUE 1 + RED 2 + GREEN 2 + BLUE 2 + RED 3 + GREEN 3 + BLUE 3 + RED 4 + GREEN 4 + BLUE 4 + + 0 + 1 + 2 + + + 3 + 4 + 5 + + + 6 + 7 + 8 + + + 9 + 10 + 11 + + + + + + + + + + + diff --git a/resources/fixtures/Elation/Elation-Paladin.qxf b/resources/fixtures/Elation/Elation-Paladin.qxf new file mode 100644 index 0000000000..dd6b0e9bdc --- /dev/null +++ b/resources/fixtures/Elation/Elation-Paladin.qxf @@ -0,0 +1,309 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Nicholas Harvey + + Elation + Paladin + Color Changer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Shutter + LED Off + LED On + Strobe Effect Slow to Fast + LED On + Pulse Effect in Sequences + LED On + Random Strobe Effect Slow to Fast + LED On + + + + + + Effect + LEDs On + LEDs Off + Program Macro 1 + Program Macro 2 + Program Macro 3 + Program Macro 4 + Program Macro 5 + Program Macro 6 + Program Macro 7 + Program Macro 8 + Program Macro 9 + Program Macro 10 + Program Macro 11 + Program Macro 12 + Program Macro 13 + Program Macro 14 + Program Macro 15 + + + Speed + Program Macro Speed Slow to Fast + + + Effect + Program Macro Fade Slow to Fast + + + Colour + Off + Color Preset 1 + Color Preset 2 + Color Preset 3 + Color Preset 4 + Color Preset 5 + Color Preset 6 + Color Preset 7 + Color Preset 8 + Color Preset 9 + Color Preset 10 + Color Preset 11 + Color Preset 12 + Color Preset 13 + Color Preset 14 + Color Preset 15 + Color Preset 16 + Color Preset 17 + Color Preset 18 + Color Preset 19 + Color Preset 20 + Color Preset 21 + Color Preset 22 + Color Preset 23 + Color Preset 24 + Color Preset 25 + Color Preset 26 + Color Preset 27 + Color Preset 28 + Color Preset 29 + Color Preset 30 + Color Preset 31 + Color Preset 32 + Color Preset 33 + Color Preset 34 + Color Preset 35 + Color Preset 36 + Color Preset 37 + Color Preset 38 + Color Preset 39 + Color Preset 40 + Color Preset 41 + Color Preset 42 + Color Preset 43 + Color Preset 44 + Color Preset 45 + Color Preset 46 + Color Preset 47 + Color Preset 48 + Color Preset 49 + Color Preset 50 + Color Preset 51 + Color Preset 52 + Color Preset 53 + Color Preset 54 + Color Preset 55 + Color Preset 56 + Color Preset 57 + Color Preset 58 + Color Preset 59 + Color Preset 60 + Color Preset 61 + Color Preset 62 + Color Preset 63 + Color Preset 64 + + + Maintenance + Standard + Stage + TV + Architectural + Theatre + Default to Unit Setting + + + Red (All LEDs) + Green (All LEDs) + Blue (All LEDs) + White (All LEDs) + Shutter / Strobe + Dimmer Intensity + Zoom + Program Macros + Program Macro Speed + Program Macro Fade + Color Presets + Dimming Curve Modes + + + + + + + + + + + Red (Pixel Set #1) + Green (Pixel Set #1) + Blue (Pixel Set #1) + White (Pixel Set #1) + Red (Pixel Set #2) + Green (Pixel Set #2) + Blue (Pixel Set #2) + White (Pixel Set #2) + Red (Pixel Set #3) + Green (Pixel Set #3) + Blue (Pixel Set #3) + White (Pixel Set #3) + Shutter / Strobe + Dimmer Intensity + Dimmer Intensity Fine + Zoom + Program Macros + Program Macro Speed + Program Macro Fade + Color Presets + Dimming Curve Modes + + 0 + 1 + 2 + 3 + + + 4 + 5 + 6 + 7 + + + 8 + 9 + 10 + 11 + + + + + + + + + + + + Red (Pixel Set #1) + Green (Pixel Set #1) + Blue (Pixel Set #1) + White (Pixel Set #1) + Red (Pixel Set #2) + Green (Pixel Set #2) + Blue (Pixel Set #2) + White (Pixel Set #2) + Red (Pixel Set #3) + Green (Pixel Set #3) + Blue (Pixel Set #3) + White (Pixel Set #3) + Red (Pixel Set #4) + Green (Pixel Set #4) + Blue (Pixel Set #4) + White (Pixel Set #4) + Red (Pixel Set #5) + Green (Pixel Set #5) + Blue (Pixel Set #5) + White (Pixel Set #5) + Red (Pixel Set #6) + Green (Pixel Set #6) + Blue (Pixel Set #6) + White (Pixel Set #6) + Shutter / Strobe + Dimmer Intensity + Dimmer Intensity Fine + Zoom + Program Macros + Program Macro Speed + Program Macro Fade + Color Presets + Dimming Curve Modes + + 0 + 1 + 2 + 3 + + + 4 + 5 + 6 + 7 + + + 8 + 9 + 10 + 11 + + + 12 + 13 + 14 + 15 + + + 16 + 17 + 18 + 19 + + + 20 + 21 + 22 + 23 + + + + + + + + + + + diff --git a/resources/fixtures/Electroconcept/Electroconcept-Club-Scan-120.qxf b/resources/fixtures/Electroconcept/Electroconcept-Club-Scan-120.qxf new file mode 100644 index 0000000000..acf9767bb2 --- /dev/null +++ b/resources/fixtures/Electroconcept/Electroconcept-Club-Scan-120.qxf @@ -0,0 +1,191 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Clément Delabroye + + Electroconcept + Club Scan 120 + Scanner + + + + + + + Shutter + Closed + Strobe ( Slow to Fast) + Open + + + + Colour + White + White + Red + Red + Red + Orange + Orange + Orange + Green + Green + Green + Cyan + Cyan + Cyan + Purple + Purple + Purple + Yellow + Yellow + Yellow + Blue + Blue + Blue + Pink + Pink + Pink + White + Rotation (Slow to Fast) + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Clockwise rotation ( Slow to Fast ) + Stop + Counterclockwise rotation( Slow to Fast ) + Gobo 1 Shake + Gobo 2 Shake + Gobo 3 Shake + Gobo 4 Shake + Gobo 5 Shake + Gobo 6 Shake + Gobo 7 Shake + + + Gobo + Angle adjustment + Counterclockwise Gobo Rotation + Clockwise Gobo Rotation + Gobo Shake rotation (Slow to Fast) + + + + Prism + No effect + Prism Effect + + + Prism + Angle adjustment + Counterclockwise Prism Rotation + Clockwise Prism Rotation + Prism Shake (Slow to Fast) + + + Effect + Led gradual extinction + Led instant extinction + No Effect + Program 1 + Program 2 + Program 3 + + + Maintenance + No function + Reset Wheel + Reset Pan / Tilt + Reset All + + + Colour + White + White + Red + Red + Red + Orange + Orange + Orange + Green + Green + Green + Cyan + Cyan + Cyan + Purple + Purple + Purple + Yellow + Yellow + Yellow + Blue + Blue + Blue + Pink + Pink + Pink + White + White + Red + Orange + Green + Cyan + Purple + Yellow + Blue + Pink + White + + + Speed + Color Effect Wheel Speed (Fast to Slow) + + + Speed + Prism Rotation Speed (Fast to Slow) + + + Speed + Gobo Wheel Speed (Fast to Slow) + + + Pan + Pan fine + Tilt + Tilt fine + Pan/Tilt speed + Shutter + Dimmer + Color + Gobo + Gobo Rotation + Focus + Prism + Prism Rotation + Macro + Reset + + + Pan + Pan fine + Tilt + Tilt fine + Pan/Tilt speed + Shutter + Dimmer + Color + Gobo + Gobo Rotation + Focus + Prism + Prism Rotation + Macro + Reset + Color Effect + Color Effect Speed + Prism Rotation Speed + Gobo Wheel Speed + + + + + + + + + diff --git a/resources/fixtures/Electroconcept/Electroconcept-Club-Scan-30.qxf b/resources/fixtures/Electroconcept/Electroconcept-Club-Scan-30.qxf new file mode 100644 index 0000000000..7bb975ddc0 --- /dev/null +++ b/resources/fixtures/Electroconcept/Electroconcept-Club-Scan-30.qxf @@ -0,0 +1,107 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Clément Delabroye + + Electroconcept + Club Scan 30 + Scanner + + + + Colour + White + Red + Green + Blue + Yellow + Purple + Cyan + Orange + Orange + Cyan + Cyan + Purple + Purple + Yellow + Yellow + Blue + Blue + Green + Green + Red + Rotation (Slow to fast) + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Open + Gobo 1 Shake + Gobo 2 Shake + Gobo 3 Shake + Gobo 4 Shake + Gobo 5 Shake + Gobo 6 Shake + Gobo 7 Shake + Rotation ( Slow to Fast) + + + Shutter + Closed + Strobe ( Slow to Fast) + Open + + + + + Effect + No function + Program + Auto + sound + + + Maintenance + No function + Reset Pan + Reset Tilt + Reset Pan/Tilt + Reset All + + + + + Pan + Tilt + Color + Gobo + Shutter + Dimmer + Pan/Tilt speed + Show modes + Reset + + + Pan + Pan fine + Tilt + Tilt fine + Color + Gobo + Shutter + Dimmer + Pan/Tilt speed + Show modes + Reset + + + + + + + + + diff --git a/resources/fixtures/Electroconcept/Electroconcept-LED-Blinder.qxf b/resources/fixtures/Electroconcept/Electroconcept-LED-Blinder.qxf new file mode 100644 index 0000000000..b78f875671 --- /dev/null +++ b/resources/fixtures/Electroconcept/Electroconcept-LED-Blinder.qxf @@ -0,0 +1,25 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Clément Delabroye + + Electroconcept + LED Blinder + Strobe + + + + Master dimmer + Strobe + + + + + + + + + diff --git a/resources/fixtures/Electroconcept/Electroconcept-Micro-Spot-60-LED.qxf b/resources/fixtures/Electroconcept/Electroconcept-Micro-Spot-60-LED.qxf new file mode 100644 index 0000000000..47ae4bbb8b --- /dev/null +++ b/resources/fixtures/Electroconcept/Electroconcept-Micro-Spot-60-LED.qxf @@ -0,0 +1,148 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Clément Delabroye + + Electroconcept + Micro Spot 60 LED + Moving Head + + + + + + + Shutter + Closed + Strobe (Slow to Fast) + Open + + + + Colour + White + Red + Green + Blue + Yellow + Magenta + Cyan + Orange + Pink + Pink + White + White + Red + Red + Green + Green + Blue + Blue + Yellow + Yellow + Magenta + Magenta + Cyan + Cyan + Orange + Orange + Pink + Counterclockwise rotation ( Fast to Slow) + Clockwise rotation (Slow to Fast) + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Clockwise rotation ( Slow to Fast ) + Stop + Counterclockwise rotation( Slow to Fast ) + Gobo 1 Shake + Gobo 2 Shake + Gobo 3 Shake + Gobo 4 Shake + Gobo 5 Shake + Gobo 6 Shake + Gobo 7 Shake + + + Gobo + Angle adjustment + Clockwise Gobo Rotation (Fast to Slow) + Stop + Counterclockwise Rotation (Slow to Fast) + + + Prism + No effect + Prism Effect + + + Effect + No Effect + Program 1 + Program 2 + Program 3 Sound + + + Maintenance + No function + Reset Wheel + Reset Pan / Tilt + Reset All + + + Colour + White + White + Red + Red + Red + Green + Green + Green + Blue + Blue + Blue + Yellow + Yellow + Yellow + Magenta + Magenta + Magenta + Cyan + Cyan + Cyan + Orange + Orange + Orange + Pink + Pink + Pink + White + White + Red + Green + Blue + Yellow + Magenta + Cyan + Orange + Pink + White + + + Pan + Pan fine + Tilt + Tilt fine + Pan/Tilt speed + Shutter + Dimmer + Color + Gobo + Gobo Rotation + Prism + Color Effect + Macro + Reset + + + + + + + + + diff --git a/resources/fixtures/Electroconcept/Electroconcept-Profile-120-Spot-LED.qxf b/resources/fixtures/Electroconcept/Electroconcept-Profile-120-Spot-LED.qxf new file mode 100644 index 0000000000..5b3458bc6f --- /dev/null +++ b/resources/fixtures/Electroconcept/Electroconcept-Profile-120-Spot-LED.qxf @@ -0,0 +1,191 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Clément Delabroye + + Electroconcept + Profile 120 Spot LED + Moving Head + + + + + + + Shutter + Closed + Strobe (Slow to Fast) + Open + + + + Colour + White + White + Red + Red + Red + Orange + Orange + Orange + Green + Green + Green + Cyan + Cyan + Cyan + Purple + Purple + Purple + Yellow + Yellow + Yellow + Blue + Blue + Blue + Pink + Pink + Pink + White + Rotation (Slow to Fast) + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Clockwise rotation ( Slow to Fast ) + Stop + Counterclockwise rotation( Slow to Fast ) + Gobo 1 Shake + Gobo 2 Shake + Gobo 3 Shake + Gobo 4 Shake + Gobo 5 Shake + Gobo 6 Shake + Gobo 7 Shake + + + Gobo + Angle adjustment + Counterclockwise Gobo Rotation + Clockwise Gobo Rotation + Gobo Shake rotation (Slow to Fast) + + + + Prism + No effect + Prism Effect + + + Prism + Angle adjustment + Counterclockwise Prism Rotation + Clockwise Prism Rotation + Prism Shake (Slow to Fast) + + + Effect + Led gradual extinction + Led instant extinction + No Effect + Program 1 + Program 2 + Program 3 + + + Maintenance + No function + Reset Wheel + Reset Pan / Tilt + Reset All + + + Colour + White + White + Red + Red + Red + Orange + Orange + Orange + Green + Green + Green + Cyan + Cyan + Cyan + Purple + Purple + Purple + Yellow + Yellow + Yellow + Blue + Blue + Blue + Pink + Pink + Pink + White + White + Red + Orange + Green + Cyan + Purple + Yellow + Blue + Pink + White + + + Speed + Color Effect Wheel Speed (Fast to Slow) + + + Speed + Prism Rotation Speed (Fast to Slow) + + + Speed + Gobo Wheel Speed (Fast to Slow) + + + Pan + Pan fine + Tilt + Tilt fine + Pan/Tilt speed + Shutter + Dimmer + Color + Gobo + Gobo Rotation + Focus + Prism + Prism Rotation + Macro + Reset + + + Pan + Pan fine + Tilt + Tilt fine + Pan/Tilt speed + Shutter + Dimmer + Color + Gobo + Gobo Rotation + Focus + Prism + Prism Rotation + Macro + Reset + Color Effect + Color Effect Speed + Prism Rotation Speed + Gobo Wheel Speed + + + + + + + + + diff --git a/resources/fixtures/Eliminator_Lighting/Eliminator-Lighting-Stealth-Beam.qxf b/resources/fixtures/Eliminator_Lighting/Eliminator-Lighting-Stealth-Beam.qxf new file mode 100644 index 0000000000..fee62c2818 --- /dev/null +++ b/resources/fixtures/Eliminator_Lighting/Eliminator-Lighting-Stealth-Beam.qxf @@ -0,0 +1,120 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Paul Schuh + + Eliminator Lighting + Stealth Beam + Moving Head + + + + Colour + Nothing + Red + Green + Blue + White + Red/Green + Green/Blue + Blue/White + Red/White + Red/Green/Blue + Green/Blue/White + Red/Blue/White + Red/Green/White + Red/Green/Blue/White + Macro Color Change + Macro Color Line + Sound Active Change + + + Speed + Slow - Fast + + + Effect + Nothing + Program 1 + Program 2 + Program 3 + Program 4 + Program 5 + Program 6 + Program 7 + Program 8 + Program 9 + Sond active + + + + + + + + + + Shutter + Shutter Closed + Strobing Slow-Fast + Shutter Open + + + Effect + Nothing + Pan moves clockwise (slow to fast) + Pan moves counter-clockwise (fast to slow) + + + Effect + Nothing + Tilt moves clockwise (slow to fast) + Tilt moves counter-clockwise (fast to slow) + + + Speed + Nothing + Speed mode to high (10s) + Nothing + Speed mode to low (10s) + Nothing + Reset (will take 10s to reset) + + + + Pan + Tilt + Color Effect + Color change/Fade Speed + Pan/Tilt Programs + + + Pan + Pan Fine + Tilt + Tilt Fine + Red + Green + Blue + White + Color Effect + Master Dimmer + Shutter/Strobe + Pan Movement + Pan Movement Speed + Tilt Movement + Color change/Fade Speed + Pan/Tilt Programs + Pan/Tilt Program Speed + + + + + + + + + diff --git a/resources/fixtures/Eliminator_Lighting/Eliminator-Lighting-Stealth-Wash-Zoom.qxf b/resources/fixtures/Eliminator_Lighting/Eliminator-Lighting-Stealth-Wash-Zoom.qxf new file mode 100644 index 0000000000..90aebec270 --- /dev/null +++ b/resources/fixtures/Eliminator_Lighting/Eliminator-Lighting-Stealth-Wash-Zoom.qxf @@ -0,0 +1,106 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Paul Schuh + + Eliminator Lighting + Stealth Wash Zoom + Moving Head + + + + Colour + Nothing + Red + Green + Blue + White + Red + Green + Green + Blue + Blue + White + Red + Blue + Green + White + Red + White + Red + Green + Blue + Red + Green + White + Green + Blue + White + Red + Green + Blue + White + Color Change - Slow to Fast + Nothing + Color fade - Slow to Fast + + + Effect + Nothing + Program 1 + Program 2 + Program 3 + Program 4 + Program 5 + Program 6 + Program 7 + Program 8 + Nothing + Motor Reset + Nothing + + + + + + + + + + + Shutter + Shutter Closed + Strobing - Slow to Fast + Shutter Open + + + Colour + Color Temperatures + + + Speed + Nothing + Color fade - slow to fast + + + + Pan + Tilt + Colors + Internal Programs + Focus + + + Pan + Pan Fine + Tilt + Tilt Fine + Red + Green + Blue + White + Master Dimmer + Shutter/Strobing + Focus + Color Temperatures + Colors + Color Fade + Pan/Tilt Speed + Internal Programs + + + + + + + + + diff --git a/resources/fixtures/Elumen8/Elumen8-MP-120.qxf b/resources/fixtures/Elumen8/Elumen8-MP-120.qxf new file mode 100644 index 0000000000..c7c62e3cea --- /dev/null +++ b/resources/fixtures/Elumen8/Elumen8-MP-120.qxf @@ -0,0 +1,27 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Keith Baker + + Elumen8 + MP 120 + Color Changer + + + + + Master Dimmer + Fine Dimmer + Strobe + + + + + + + + + diff --git a/resources/fixtures/Elumen8/Elumen8-MP-60-Mk1.qxf b/resources/fixtures/Elumen8/Elumen8-MP-60-Mk1.qxf new file mode 100644 index 0000000000..4b89e13ec1 --- /dev/null +++ b/resources/fixtures/Elumen8/Elumen8-MP-60-Mk1.qxf @@ -0,0 +1,23 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Keith Baker + + Elumen8 + MP 60 Mk1 + Color Changer + + + Master dimmer + + + + + + + + + diff --git a/resources/fixtures/Elumen8/Elumen8-MP-60-Mk2.qxf b/resources/fixtures/Elumen8/Elumen8-MP-60-Mk2.qxf new file mode 100644 index 0000000000..5f67d12ec7 --- /dev/null +++ b/resources/fixtures/Elumen8/Elumen8-MP-60-Mk2.qxf @@ -0,0 +1,23 @@ + + + + + Q Light Controller Plus + 4.12.2 + Keith Baker + + Elumen8 + MP 60 Mk2 + Color Changer + + + Master dimmer + + + + + + + + + diff --git a/resources/fixtures/Elumen8/Elumen8-MS-700PE.qxf b/resources/fixtures/Elumen8/Elumen8-MS-700PE.qxf index 6672dbe1b5..256fca3b8f 100644 --- a/resources/fixtures/Elumen8/Elumen8-MS-700PE.qxf +++ b/resources/fixtures/Elumen8/Elumen8-MS-700PE.qxf @@ -1,4 +1,4 @@ - + @@ -79,7 +79,7 @@ Gobo Open Gobo 1 - Gobo 2 + Gobo 2 Gobo 3 Gobo 4 Gobo 5 @@ -87,7 +87,7 @@ Gobo 7 Gobo 8 Gobo 1 Shaking - Gobo 2 Shaking + Gobo 2 Shaking Gobo 3 Shaking Gobo 4 Shaking Gobo 5 Shaking diff --git a/resources/fixtures/Eurolite/Eurolite-KLS-180-6.qxf b/resources/fixtures/Eurolite/Eurolite-KLS-180-6.qxf new file mode 100644 index 0000000000..07720b5f24 --- /dev/null +++ b/resources/fixtures/Eurolite/Eurolite-KLS-180-6.qxf @@ -0,0 +1,600 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Fede79 + + Eurolite + KLS-180-6 + Color Changer + + + + + + + Shutter + No function + Strobe slow to fast + + + Colour + No function + Red + Green + Blue + White + Yellow + Magenta + Cyan + Dark orange + Green yellow + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Pink + All on + + + Shutter + No function + Strobe slow to fast + + + Effect + No function + Different patterns + Different patterns with increasing speed + + + Effect + No function + Auto program 1,slow > fast + Auto program 2,slow > fast + Auto program 3,slow > fast + Auto program 4,slow > fast + Sound program 1, slow > fast + Sound program 2, slow > fast + Sound program 3, slow > fast + Sound program 4, slow > fast + + + Colour + No function + Red + Green + Blue + White + Yellow + Magenta + Cyan + Dark orange + Green yellow + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Pink + All on + + + Colour + No function + Red + Green + Blue + White + Yellow + Magenta + Cyan + Dark orange + Green yellow + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Pink + All on + + + Colour + No function + Red + Green + Blue + White + Yellow + Magenta + Cyan + Dark orange + Green yellow + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Pink + All on + + + Colour + No function + Red + Green + Blue + White + Yellow + Magenta + Cyan + Dark orange + Green yellow + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Pink + All on + + + Effect + No function + Auto mode via DMX with increasing speed + Sound control via DMX with increasing speed + + + Colour + No function + Red + Green + Blue + White + Yellow + Magenta + Cyan + Dark orange + Green yellow + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Pink + All on + + + Colour + No function + Red + Green + Blue + White + Yellow + Magenta + Cyan + Dark orange + Green yellow + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Pink + All on + + + Colour + No function + Red + Green + Blue + White + Yellow + Magenta + Cyan + Dark orange + Green yellow + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Pink + All on + + + Colour + No function + Red + Green + Blue + White + Yellow + Magenta + Cyan + Dark orange + Green yellow + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Pink + All on + + + Effect + Internal program with increasing speed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Red + Green + Blue + + + Red + Green + Blue + White + + + Master dimmer + Spots Strobe Effect + Spots Preset colors + Bar Strobe Effect + Bar + Internal programs + + + + + + + + + + + Master dimmer + Spots Strobe Effect + Spot 1 Preset colors + Spot 2+3 Preset colors + Spot 4+5 Preset colors + Spot 6 Preset colors + Bar Strobe Effect + Programs via DMX + + 2 + + + 3 + + + 4 + + + 5 + + + + Master dimmer + Spots Strobe Effect + Red + Green + Blue + White + Bar Strobe Effect + Bar + Internal programs + + + + + + + + + + + Master dimmer + Spots Strobe Effect + Spot 1 Preset colors + Spot 2 Preset colors + Spot 3 Preset colors + Spot 4 Preset colors + Spot 5 Preset colors + Spot 6 Preset colors + Bar Strobe Effect + Bar + Internal programs + + 2 + + + 3 + + + 4 + + + 5 + + + 6 + + + 7 + + + + + + + + + + + + Master dimmer + Spots Strobe Effect + Bar Program + Bar Strobe Effect + Red Spot 1 + Green Spot 1 + Blue Spot 1 + White Spot 1 + Red Spot 2+3 + Green Spot 2+3 + Blue Spot 2+3 + White Spot 2+3 + Red Spot 4+5 + Green Spot 4+5 + Blue Spot 4+5 + White Spot 4+5 + Red Spot 6 + Green Spot 6 + Blue Spot 6 + White Spot 6 + Programs via DMX + + 4 + 5 + 6 + 7 + + + 8 + 9 + 10 + 11 + + + 12 + 13 + 14 + 15 + + + 16 + 17 + 18 + 19 + + + + + + + + + + + + Red Spot 1 + Green Spot 1 + Blue Spot 1 + White Spot 1 + Red Spot 2 + Green Spot 2 + Blue Spot 2 + White Spot 2 + Red Spot 3 + Green Spot 3 + Blue Spot 3 + White Spot 3 + Red Spot 4 + Green Spot 4 + Blue Spot 4 + White Spot 4 + Red Spot 5 + Green Spot 5 + Blue Spot 5 + White Spot 5 + Red Spot 6 + Green Spot 6 + Blue Spot 6 + White Spot 6 + + 0 + 1 + 2 + 3 + + + 4 + 5 + 6 + 7 + + + 8 + 9 + 10 + 11 + + + 12 + 13 + 14 + 15 + + + 16 + 17 + 18 + 19 + + + 20 + 21 + 22 + 23 + + + + + + + + + + + + Master dimmer + Spots Strobe Effect + Red Spot 1 + Green Spot 1 + Blue Spot 1 + White Spot 1 + Red Spot 2 + Green Spot 2 + Blue Spot 2 + White Spot 2 + Red Spot 3 + Green Spot 3 + Blue Spot 3 + White Spot 3 + Red Spot 4 + Green Spot 4 + Blue Spot 4 + White Spot 4 + Red Spot 5 + Green Spot 5 + Blue Spot 5 + White Spot 5 + Red Spot 6 + Green Spot 6 + Blue Spot 6 + White Spot 6 + Bar Strobe Effect + Bar + Internal programs + + 2 + 3 + 4 + 5 + + + 6 + 7 + 8 + 9 + + + 10 + 11 + 12 + 13 + + + 14 + 15 + 16 + 17 + + + 18 + 19 + 20 + 21 + + + 22 + 23 + 24 + 25 + + + + + + + + + + diff --git a/resources/fixtures/Eurolite/Eurolite-LED-KLS-Scan-Pro-Next-FX-Light.qxf b/resources/fixtures/Eurolite/Eurolite-LED-KLS-Scan-Pro-Next-FX-Light.qxf new file mode 100644 index 0000000000..32ca212c46 --- /dev/null +++ b/resources/fixtures/Eurolite/Eurolite-LED-KLS-Scan-Pro-Next-FX-Light.qxf @@ -0,0 +1,491 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Kevin + + Eurolite + LED KLS Scan Pro Next FX Light + Other + + + Effect + No function + Automatic / sound program 1 + Automatic / sound program 2 + Automatic / sound program 3 + Automatic / sound program 4 + Automatic / sound program 5 + Automatic / sound program 6 + Automatic / sound program 7 + Automatic / sound program 8 + Automatic / sound program 9 + Automatic / sound program 10 + Automatic / sound program 11 + Automatic / sound program 12 + Automatic / sound program 13 + Automatic / sound program 14 + Automatic / sound program 15 + Automatic / sound program 16 + Automatic / sound program 17 + Automatic / sound program 18 + Automatic / sound program 19 + Automatic / sound program 20 + + + Effect + Automatic program with color change + Automatic program with color fade + Sound program with color change + Sound program with color fade + + + + + + + Effect + No function + Program 1 (slow to fast) + Program 2 (slow to fast) + Program 3 (slow to fast) + Program 4 (slow to fast) + Program 5 (slow to fast) + + + Effect + No function + Pan-/Tilt Program 1 + Pan-/Tilt Program 2 + Pan-/Tilt Program 3 + Pan-/Tilt Program 4 + Pan-/Tilt Program 5 + Pan-/Tilt Program 6 + Pan-/Tilt Program 7 + Pan-/Tilt Program 8 + + + Shutter + No function + On + Strobe speed (slow to fast) + + + Effect + Stop + Rotation clockwise (slow to fast) + Stop + Rotation counterclockwise (slow to fast) + + + + + + Colour + Open + Violet + Green + Yellow + Cyan + Red + Orange + Blue + Open + Violet + Green + Yellow + Cyan + Red + Orange + Blue + Open + Green + Violet + Yellow + Cyan + Orange + Red + Blue + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Gobo open+1 + Gobo 2+3 + Gobo 4+5 + Gobo 6+7 + Gobo open+7 + Gobo 1+6 + Gobo 2+5 + Gobo 3+4 + + + + Shutter + On + Off + Strobe effect (slow to fast) + Pulsating strobe effect (slow to fast) + Random strobe effect (slow to fast) + On + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Shutter + No function + Strobe effect 1 (slow to fast) + Strobe effect 2 (slow to fast) + Strobe effect 3 (slow to fast) + Strobe effect 4 (slow to fast) + Strobe effect 5 (slow to fast) + + + + + + Colour + Open + Violet + Green + Yellow + Cyan + Red + Orange + Blue + Open + Violet + Green + Yellow + Cyan + Red + Orange + Blue + Open + Green + Violet + Yellow + Cyan + Orange + Red + Blue + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Gobo open+1 + Gobo 2+3 + Gobo 4+5 + Gobo 6+7 + Gobo open+7 + Gobo 1+6 + Gobo 2+5 + Gobo 3+4 + + + + Shutter + On + Off + Strobe effect (slow to fast) + Pulsating strobe effect (slow to fast) + Random strobe effect (slow to fast) + On + + + + + + Colour + Open + Violet + Green + Yellow + Cyan + Red + Orange + Blue + Open + Violet + Green + Yellow + Cyan + Red + Orange + Blue + Open + Green + Violet + Yellow + Cyan + Orange + Red + Blue + + + Gobo + Open + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Gobo open+1 + Gobo 2+3 + Gobo 4+5 + Gobo 6+7 + Gobo open+7 + Gobo 1+6 + Gobo 2+5 + Gobo 3+4 + + + + Shutter + On + Off + Strobe effect (slow to fast) + Pulsating strobe effect (slow to fast) + Random strobe effect (slow to fast) + On + + + Dimmer Spots + Derby + Integrated show programs + Automatic Mode / Sound Control + + + Spots Red + Spots Green + Spots Blue + Spots White + Derby + Scanner + Strobe + + + Spots Red + Spots Green + Spots Blue + Spots White + Derby motor + Scanner Pan + Scanner Tilt + Scanner Pan/Tilt Speed + Scanner Color wheel + Scanner Gobos + Scanner Dimmer + Scanner strobe effect + UV Dimmer + + + Spots 1+4 Red + Spots 1+4 Green + Spots 1+4 Blue + Spots 1+4 White + Spots 2+3 Red + Spots 2+3 Green + Spots 2+3 Blue + Spots 2+3 White + Derby Red + Derby Green + Derby Blue + Derby motor + Scanner + UV Dimmer + + + Spots Red + Spots Green + Spots Blue + Spots White + Derby motor + Scanner Pan + Scanner Tilt + Scanner Pan/Tilt Speed + Scanner Color wheel + Scanner Gobos + Scanner Dimmer + Scanner strobe effect + UV Dimmer + Integrated show programs + Automatic Mode / Sound Control + + + Spots 1+4 Red + Spots 1+4 Green + Spots 1+4 Blue + Spots 1+4 White + Spots 2+3 Red + Spots 2+3 Green + Spots 2+3 Blue + Spots 2+3 White + Derby Red + Derby Green + Derby Blue + Derby motor + Scanner + Scanner Color wheel + Scanner Gobos + Master dimmer + Scanner strobe effect + UV Dimmer + + + Spot 1 Red + Spot 1 Green + Spot 1 Blue + Spot 1 White + Spot 2 Red + Spot 2 Green + Spot 2 Blue + Spot 2 White + Spot 3 Red + Spot 3 Green + Spot 3 Blue + Spot 3 White + Spot 4 Red + Spot 4 Green + Spot 4 Blue + Spot 4 White + Derby + Scanner + UV Dimmer + + + Spot 1 Red + Spot 1 Green + Spot 1 Blue + Spot 1 White + Spot 2 Red + Spot 2 Green + Spot 2 Blue + Spot 2 White + Spot 3 Red + Spot 3 Green + Spot 3 Blue + Spot 3 White + Spot 4 Red + Spot 4 Green + Spot 4 Blue + Spot 4 White + Derby Red + Derby Green + Derby Blue + Derby motor + Master dimmer + Strobe effect + Scanner Pan + Scanner Tilt + Scanner Pan/Tilt Speed + Scanner Color wheel + Scanner Gobos + Scanner Dimmer + Scanner strobe effect + UV Dimmer + + + Spot 1 Red + Spot 1 Green + Spot 1 Blue + Spot 1 White + Spot 2 Red + Spot 2 Green + Spot 2 Blue + Spot 2 White + Spot 3 Red + Spot 3 Green + Spot 3 Blue + Spot 3 White + Spot 4 Red + Spot 4 Green + Spot 4 Blue + Spot 4 White + Derby Red + Derby Green + Derby Blue + Derby motor + Master dimmer + Strobe effect + Scanner Pan + Scanner Tilt + Scanner Pan/Tilt Speed + Scanner Color wheel + Scanner Gobos + Scanner Dimmer + Scanner strobe effect + UV Dimmer + Integrated show programs + Automatic Mode / Sound Control + + + Spot 1 Red + Spot 1 Green + Spot 1 Blue + Spot 1 White + Spot 2 Red + Spot 2 Green + Spot 2 Blue + Spot 2 White + Spot 3 Red + Spot 3 Green + Spot 3 Blue + Spot 3 White + Spot 4 Red + Spot 4 Green + Spot 4 Blue + Spot 4 White + Derby Red + Derby Green + Derby Blue + Derby motor + Master dimmer + Strobe effect + Scanner 1 Pan + Scanner 1 Tilt + Scanner 1 Pan/Tilt Speed + Scanner 1 Color wheel + Scanner 1 Gobos + Scanner 1 Dimmer + Scanner 1 strobe effect + Scanner 2 Pan + Scanner 2 Tilt + Scanner 2 Pan/Tilt Speed + Scanner 2 Color wheel + Scanner 2 Gobos + Scanner 2 Dimmer + Scanner 2 strobe effect + UV Dimmer + Integrated show programs + Automatic Mode / Sound Control + + + + + + + + + + diff --git a/resources/fixtures/Eurolite/Eurolite-LED-PARty-TCL-spot.qxf b/resources/fixtures/Eurolite/Eurolite-LED-PARty-TCL-spot.qxf new file mode 100644 index 0000000000..bf9100df8e --- /dev/null +++ b/resources/fixtures/Eurolite/Eurolite-LED-PARty-TCL-spot.qxf @@ -0,0 +1,37 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Christian Prison + + Eurolite + LED PARty TCL spot + Color Changer + + + + + + Effect + No function + Sound control + No function + Strobe (slow to fast) + + + Red + Green + Blue + Dimmer + Functions + + + + + + + + + diff --git a/resources/fixtures/Eurolite/Eurolite-LED-PIX-16-QCL-Bar.qxf b/resources/fixtures/Eurolite/Eurolite-LED-PIX-16-QCL-Bar.qxf new file mode 100644 index 0000000000..99e9772a02 --- /dev/null +++ b/resources/fixtures/Eurolite/Eurolite-LED-PIX-16-QCL-Bar.qxf @@ -0,0 +1,566 @@ + + + + + Q Light Controller Plus + 5.0.0 Beta 3 + Cédric Monféfoul + + Eurolite + LED PIX-16 QCL Bar + LED Bar (Beams) + + + + + + + Shutter + No Function + Strobe (Slow to fast) + + + Effect + No Function + Effect 1 + Effect 2 + Effect 3 + Effect 4 + Effect 5 + Effect 6 + Effect 7 + Effect 8 + Effect 9 + Effect 10 + Effect 11 + Effect 12 + Effect 13 + Effect 14 + Effect 15 + Effect 16 + Effect 17 + Effect 18 + Effect 19 + Effect 20 + + + Speed + Speed of the color effects, increasing + + + Colour + No Function + Red + Green + Blue + White + Red + Green + Red + Blue + Red + White + Green + Blue + Green + White + Blue + White + Red + Green + Blue + Red + Green + White + Red + Blue + White + Green + Blue + white + + + Intensity + Background Effect Color from Bright to Dark + + + Intensity + Run Direction Forwards + Run Direction Backards + + + Intensity + R1/R2/R3/R4 Dimmer (0 - 100%) + + + Intensity + G1/G2/G3/G4 Dimmer (0 - 100%) + + + Intensity + B1/B2/B3/B4 Dimmer (0 - 100%) + + + Intensity + W1/W2/W3/W4 Dimmer (0 - 100%) + + + Intensity + R5/R6/R7/R6 Dimmer (0 - 100%) + + + Intensity + G5/G6/G7/G8 Dimmer (0 - 100%) + + + Intensity + B5/B6/B7/B8 Dimmer (0 - 100%) + + + Intensity + W5/W6/W7/W8 Dimmer (0 - 100%) + + + Intensity + R9/R10/R11/R12 Dimmer (0 - 100%) + + + Intensity + G9/G10/G11/G12 Dimmer (0 - 100%) + + + Intensity + B9/B10/B11/B12 Dimmer (0 - 100%) + + + Intensity + W9/W10/W11/W12 Dimmer (0 - 100%) + + + Intensity + R13/R14/R15/R16 Dimmer (0 - 100%) + + + Intensity + G13/G14/G15/G16 Dimmer (0 - 100%) + + + Intensity + B13/B14/B15/B16 Dimmer (0 - 100%) + + + Intensity + W13/W14/W15/W16 Dimmer (0 - 100%) + + + Effect + Internal programs (See 11CH mode, Channel 7 for overview) + + + Speed + Speed and microphone sensitivity for internal programs + + + Maintenance + Auto Program + Sound Controlled Program + + + Intensity + R1/R5/R9/R13 Dimmer (0 - 100%) + + + Intensity + G1/G5/G9/G13 Dimmer (0 - 100%) + + + Intensity + B1/B5/B9/B13 Dimmer (0 - 100%) + + + Intensity + W1/W5/W9/W13 Dimmer (0 - 100%) + + + Intensity + R2/R6/R10/R14 Dimmer (0 - 100%) + + + Intensity + G2/G6/G10/G14 Dimmer (0 - 100%) + + + Intensity + B2/B6/B10/B14 Dimmer (0 - 100%) + + + Intensity + W2/W6/W10/W14 Dimmer (0 - 100%) + + + Intensity + R3/R7/R11/R15 Dimmer (0 - 100%) + + + Intensity + G3/G7/G11/G15 Dimmer (0 - 100%) + + + Intensity + B3/B7/B11/B15 Dimmer (0 - 100%) + + + Intensity + W3/W7/W11/W15 Dimmer (0 - 100%) + + + Intensity + R4/R8/R12/R16 Dimmer (0 - 100%) + + + Intensity + G4/G8/G12/G16 Dimmer (0 - 100%) + + + Intensity + B4/B8/B12/B16 Dimmer (0 - 100%) + + + Intensity + W4/W8/W12/W16 Dimmer (0 - 100%) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Red 1 + Green 1 + Blue 1 + + + Red 1 + Green 1 + Blue 1 + White 1 + + + Master dimmer + Strobe + Red 1 + Green 1 + Blue 1 + White 1 + Color Effects + Color Effects Speed + Background Colors + Background Effect Color + Direction Forwards + + + R1/R2/R3/R4 Dimmer + G1/G2/G3/G4 Dimmer + B1/B2/B3/B4 Dimmer + W1/W2/W3/W4 Dimmer + R5/R6/R7/R8 Dimmer + G5/G6/G7/G8 Dimmer + B5/B6/B7/B8 Dimmer + W5/W6/W7/W8 Dimmer + R9/R10/R11/R12 Dimmer + G9/G10/G11/G12 Dimmer + B9/B10/B11/B12 Dimmer + W9/W10/W11/W12 Dimmer + R13/R14/R15/R16 Dimmer + G13/G14/G15/G16 Dimmer + B13/B14/B15/B16 Dimmer + W13/W14/W15/W16 Dimmer + Master dimmer + Strobe + Internals Programs + Micro Sensitivity and Speed + Auto / Sound + + 0 + 1 + 3 + 2 + + + 4 + 5 + 6 + 7 + + + 8 + 9 + 10 + 11 + + + 12 + 13 + 14 + 15 + + + + R1/R5/R9/R13 Dimmer + G1/G5/G9/G13 Dimmer + B1/B5/B9/B13 Dimmer + W1/W5/W9/W13 Dimmer + R2/R6/R10/R14 Dimmer + G2/G6/G10/G14 Dimmer + B2/B6/B10/B14 Dimmer + W2/W6/W10/W14 Dimmer + R3/R7/R11/R15 Dimmer + G3/G7/G11/G15 Dimmer + B3/B7/B11/B15 Dimmer + W3/W7/W11/W15 Dimmer + R4/R8/R12/R16 Dimmer + G4/G8/G12/G16 Dimmer + B4/B8/B12/B16 Dimmer + W4/W8/W12/W16 Dimmer + Master dimmer + Strobe + Internals Programs + Micro Sensitivity and Speed + Auto / Sound + + 0 + 1 + 2 + 3 + + + 4 + 5 + 6 + 7 + + + 8 + 9 + 10 + 11 + + + 12 + 13 + 14 + 15 + + + + Red 1 + Green 1 + Blue 1 + White 1 + Red 2 + Green 2 + Blue 2 + White 2 + Red 3 + Green 3 + Blue 3 + White 3 + Red 4 + Green 4 + Blue 4 + White 4 + Red 5 + Green 5 + Blue 5 + White 5 + Red 6 + Green 6 + Blue 6 + White 6 + Red 7 + Green 7 + Blue 7 + White 7 + Red 8 + Green 8 + Blue 8 + White 8 + Red 9 + Green 9 + Blue 9 + White 9 + Red 10 + Green 10 + Blue 10 + White 10 + Red 11 + Green 11 + Blue 11 + White 11 + Red 12 + Green 12 + Blue 12 + White 12 + Red 13 + Green 13 + Blue 13 + White 13 + Red 14 + Green 14 + Blue 14 + White 14 + Red 15 + Green 15 + Blue 15 + White 15 + Red 16 + Green 16 + Blue 16 + White 16 + + 0 + 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 + 34 + 35 + + + 36 + 37 + 38 + 39 + + + 40 + 41 + 42 + 43 + + + 44 + 45 + 46 + 47 + + + 48 + 49 + 50 + 51 + + + 52 + 53 + 54 + 55 + + + 56 + 57 + 58 + 59 + + + 60 + 61 + 62 + 63 + + + + + + + + + + + diff --git a/resources/fixtures/Eurolite/Eurolite-LED-Theatre-COB-200-RGB+WW.qxf b/resources/fixtures/Eurolite/Eurolite-LED-Theatre-COB-200-RGB+WW.qxf new file mode 100644 index 0000000000..f2b4aab4c3 --- /dev/null +++ b/resources/fixtures/Eurolite/Eurolite-LED-Theatre-COB-200-RGB+WW.qxf @@ -0,0 +1,128 @@ + + + + + Q Light Controller Plus + 4.12.8 GIT + Florian Faber + + Eurolite + LED Theatre COB 200 RGB+WW + Color Changer + + + + + + + Shutter + Sound Control + Strobe + + + Colour + No function + 1800K + 2200K + 2700K + 3200K + 4300K + 5600K + 6500K + 8000K + + + Colour + No function + Red + Green + Blue + Warm white + Yellow + Magenta + Cyan + Dark orange + Green yellow + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Pink + Full on + + + Effect + No function + Auto program 1 + Auto program 2 + Auto program 3 + Auto program 4 + Auto program 5 + Auto program 6 + Auto program 7 + Auto program 8 + Auto program 9 + Sound control program 1 + Sound control program 2 + Sound control program 3 + Sound control program 4 + Sound control program 5 + Sound control program 6 + Sound control program 7 + Sound control program 8 + Sound control program 9 + + + Speed + Speed internal programs, increasing + + + Red + Green + Blue + White + Master dimmer + Strobe + + + Red + Green + Blue + White + + + Master dimmer + Strobe + Red + Green + Blue + White + Preset Colors + Internal programs + Speed Internal programs + Color temperature + + + Red + Green + Blue + + + Master dimmer + Strobe + Preset Colors + Internal programs + Speed Internal programs + + + + + + + + + diff --git a/resources/fixtures/Event_Lighting/Event-Lighting-StrobeX-RGB.qxf b/resources/fixtures/Event_Lighting/Event-Lighting-StrobeX-RGB.qxf new file mode 100644 index 0000000000..f5a1fa5d02 --- /dev/null +++ b/resources/fixtures/Event_Lighting/Event-Lighting-StrobeX-RGB.qxf @@ -0,0 +1,282 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Michael Tosatto + + Event Lighting + StrobeX RGB + Strobe + + Intensity + No Function + Master Dimmer (0 - 100%) + + + Shutter + No Function + Strobe speed (Slow to fast) + + + Shutter + Strobe On Duration Short to Long + + + + + + Shutter + Random Strobe (Slow to fast) + + + Effect + Special Effect + + + Speed + Speed of Special Effect + + + Shutter + Open + Strobe (Slow to Fast) + + + Shutter + Open + Strobe (Slow to Fast) + + + Shutter + Open + Strobe (Slow to Fast) + + + Colour + No function + Red + Red + Green + Green + Green + Blue + Blue + Red + Blue + Red + Green + Blue + + + + + + + + + + + + + + + Shutter + Open + Strobe (Slow to Fast) + + + Shutter + Open + Strobe (Slow to Fast) + + + Shutter + Open + Strobe (Slow to Fast) + + + Shutter + Open + Strobe (Slow to Fast) + + + Shutter + Open + Strobe (Slow to Fast) + + + Shutter + Open + Strobe (Slow to Fast) + + + Shutter + Open + Strobe (Slow to Fast) + + + Shutter + Open + Strobe (Slow to Fast) + + + Shutter + Open + Strobe (Slow to Fast) + + + Shutter + Open + Strobe (Slow to Fast) + + + Shutter + Open + Strobe (Slow to Fast) + + + Shutter + Open + Strobe (Slow to Fast) + + + Red + Green + Blue + + + Master Dimmer + Strobe On Duration + Strobe Rate + Random Strobe + Special Effect + Speed of Special Effect + + + Master Dimmer + Red + Green + Blue + Strobe On Duration + Strobe Rate + Random Strobe + Special Effect + Speed of Special Effect + + + Master Dimmer + Red + Strobe Rate for Red + Green + Strobe Rate for Green + Blue + Strobe Rate for Blue + Color Macro + Special Effect + Speed of Special Effect + + + Master Dimmer + Block 1 Red + Block 1 Green + Block 1 Blue + Block 2 Red + Block 2 Green + Block 2 Blue + Block 3 Red + Block 3 Green + Block 3 Blue + Block 4 Red + Block 4 Green + Block 4 Blue + Strobe On Duration + Strobe Rate + Random Strobe + Special Effect + Speed of Special Effect + + 1 + 2 + 3 + + + 4 + 5 + 6 + + + 7 + 8 + 9 + + + 10 + 11 + 12 + + + + Master Dimmer + Block 1 Red + Strobe Rate for Red 1 + Block 1 Green + Strobe Rate for Green 1 + Block 1 Blue + Strobe Rate for Blue 1 + Block 2 Red + Strobe Rate for Red 2 + Block 2 Green + Strobe Rate for Green 2 + Block 2 Blue + Strobe Rate for Blue 2 + Block 3 Red + Strobe Rate for Red 3 + Block 3 Green + Strobe Rate for Green 3 + Block 3 Blue + Strobe Rate for Blue 3 + Block 4 Red + Strobe Rate for Red 4 + Block 4 Green + Strobe Rate for Green 4 + Block 4 Blue + Strobe Rate for Blue 4 + + 1 + 2 + 3 + 4 + 5 + 6 + + + 7 + 8 + 9 + 10 + 11 + 12 + + + 13 + 14 + 15 + 16 + 17 + 18 + + + 19 + 20 + 21 + 22 + 23 + 24 + + + + + + + + + + + diff --git a/resources/fixtures/Event_Lighting/Event-Lighting-StrobeX.qxf b/resources/fixtures/Event_Lighting/Event-Lighting-StrobeX.qxf new file mode 100644 index 0000000000..85d301120b --- /dev/null +++ b/resources/fixtures/Event_Lighting/Event-Lighting-StrobeX.qxf @@ -0,0 +1,221 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Michael Tosatto + + Event Lighting + StrobeX + Strobe + + Intensity + No Function + Master Dimmer (0 - 100%) + + + Intensity + No Function + Intensity (0 - 100%) + + + Speed + No Function + Strobe speed (Slow to fast) + + + Shutter + No Function + Strobe speed (Slow to fast) + + + Shutter + No Function + Strobe speed (Slow to fast) + + + Shutter + No Function + Strobe speed (Slow to fast) + + + Shutter + No Function + Strobe speed (Slow to fast) + + + Intensity + No Function + Intensity (0 - 100%) + + + Intensity + No Function + Intensity (0 - 100%) + + + Intensity + No Function + Intensity (0 - 100%) + + + Intensity + No Function + Intensity (0 - 100%) + + + Shutter + Strobe On Duration Short to Long + + + Shutter + No Function + Strobe effect 1 + Strobe effect 2 + Strobe effect 3 + + + Effect + No Function + Block 1 only + Block 2 only + Block 3 only + Block 4 only + Block 1, 2, 4 only + Block 1, 3 only + Block 3, 4 only + Auto chase 1 + Auto chase 2 + Auto chase 3 + Auto combination + + + Speed + Auto Run Speed (Slow to fast) + + + Effect + No Function + Auto chase 1 + Auto chase 2 + Auto chase 3 + Auto combination + + + + + + + + + + Strobe Speed + + + + + + + + + + Master Dimmer + Strobe Speed + + + + + + + + + + Master Dimmer + Intensity + Strobe Speed + + + Block 1 Strobe + Block 2 Strobe + Block 3 Strobe + Block 4 Strobe + + 0 + + + 1 + + + 2 + + + 3 + + + + Block 1 Dimmer + Block 2 Dimmer + Block 3 Dimmer + Block 4 Dimmer + + 0 + + + 1 + + + 2 + + + 3 + + + + + + + + + + + Master Dimmer + Strobe On Duration + Strobe Speed + Strobe Effect + Run Mode + Auto Run Speed + + + Master Dimmer + Block 1 Dimmer + Block 2 Dimmer + Block 3 Dimmer + Block 4 Dimmer + Strobe On Duration + Strobe Speed + Strobe Effect + Auto Mode + Auto Run Speed + + 1 + + + 2 + + + 3 + + + 4 + + + + + + + + + + + diff --git a/resources/fixtures/Expolite/Expolite-TourSpot-50-Mini.qxf b/resources/fixtures/Expolite/Expolite-TourSpot-50-Mini.qxf new file mode 100644 index 0000000000..e2b4afdd59 --- /dev/null +++ b/resources/fixtures/Expolite/Expolite-TourSpot-50-Mini.qxf @@ -0,0 +1,117 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Christian Prison + + Expolite + TourSpot 50 Mini + Moving Head + + + + + + + Gobo + No function + Forward gobo rotation (fast to slow) + Gobo rotation stop + Backward gobo rotation (slow to fast) + + + Shutter + Shutter closed + Shutter open + Strobe effect (slow to fast) + Shutter open + Pulse-effect in sequences (slow to fast) + Shutter open + Random strobe effect (slow to fast) + Shutter open + + + Speed + speed (min to max) + blackout by movement + blackout by all wheel changing + no function + + + + + Prism + OFF + ON + rotating (slow to fast) + + + Maintenance + no function + reset all motors + reset scan motor + reset color motor + reset gobo motor + reset shutter&dimmer motor + reset other motors + internal program 1 + internal program 2 + internal program 3 + internal program 4 + internal program 5 + internal program 6 + internal program 7 + internal sound program 1 + + + Colour + Open / white + Red + Cyan + Green + Yellow + Rose carmine + Blue + Orange + Forward rainbow effect (fast..slow) + Color rotation stop + Backwards rainbow effect (slow..fast) + + + Pan + Pan fine + Tilt + Tilt fine + Speed pan/tilt + Color Wheel + Gobo wheel + Gobo rotation + Shutter + Dimmer + Focus + Prism & Rotating + Special Function + + + Pan + Tilt + Speed pan/tilt + Color Wheel + Gobo wheel + Gobo rotation + Shutter + Dimmer + Focus + Prism & Rotating + Special Function + + + + + + + + + diff --git a/resources/fixtures/FixturesMap.xml b/resources/fixtures/FixturesMap.xml index ec99ea65aa..aff08b79c7 100644 --- a/resources/fixtures/FixturesMap.xml +++ b/resources/fixtures/FixturesMap.xml @@ -5,12 +5,19 @@ + + + + + + + @@ -121,6 +128,7 @@ + @@ -201,9 +209,11 @@ + + @@ -215,12 +225,15 @@ + + + @@ -233,7 +246,10 @@ + + + @@ -268,6 +284,9 @@ + + + @@ -280,6 +299,9 @@ + + + @@ -289,11 +311,13 @@ + + @@ -348,6 +372,7 @@ + @@ -388,9 +413,11 @@ + + @@ -399,6 +426,7 @@ + @@ -452,6 +480,8 @@ + + @@ -459,6 +489,7 @@ + @@ -534,6 +565,7 @@ + @@ -626,6 +658,7 @@ + @@ -641,6 +674,7 @@ + @@ -648,10 +682,12 @@ + + @@ -665,7 +701,12 @@ + + + + + @@ -673,9 +714,14 @@ + + + + + @@ -721,6 +767,7 @@ + @@ -741,6 +788,7 @@ + @@ -752,6 +800,8 @@ + + @@ -774,6 +824,7 @@ + @@ -826,6 +877,8 @@ + + @@ -834,6 +887,7 @@ + @@ -850,6 +904,7 @@ + @@ -1060,6 +1115,8 @@ + + @@ -1106,6 +1163,7 @@ + @@ -1146,8 +1204,10 @@ + + @@ -1267,6 +1327,7 @@ + @@ -1312,6 +1373,7 @@ + @@ -1375,6 +1437,8 @@ + + @@ -1447,8 +1511,10 @@ + + @@ -1457,6 +1523,7 @@ + @@ -1488,6 +1555,7 @@ + @@ -1668,6 +1736,10 @@ + + + + @@ -1687,6 +1759,7 @@ + @@ -1703,6 +1776,7 @@ + @@ -1726,6 +1800,7 @@ + diff --git a/resources/fixtures/Fun-Generation/Fun-Generation-LED-Pot-12x1W-QCL-RGB-WW.qxf b/resources/fixtures/Fun-Generation/Fun-Generation-LED-Pot-12x1W-QCL-RGB-WW.qxf new file mode 100644 index 0000000000..20861cc347 --- /dev/null +++ b/resources/fixtures/Fun-Generation/Fun-Generation-LED-Pot-12x1W-QCL-RGB-WW.qxf @@ -0,0 +1,91 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Christian Prison + + Fun Generation + LED Pot 12x1W QCL RGB WW + Color Changer + + + + + + + Effect + No function + Program 1 + Program 2 + Program 3 + Program 4 + Program 5 + Program 6 + Program 7 + Program 8 + Program 9 + Program 10 + Program 11 + Program 12 + Program 13 + Program 14 + Music controlled mode + + + Colour + RGBW 0000 if ch6=1..16 + RGBW 255000 if ch6=1..16 + RGBW 025500 if ch6=1..16 + RGBW 002550 if ch6=1..16 + RGBW 000255 if ch6=1..16 + RGBW 25515000 if ch6=1..16 + RGBW 25518000 if ch6=1..16 + RGBW 25525500 if ch6=1..16 + RGBW 25502550 if ch6=1..16 + RGBW 25501400 if ch6=1..16 + RGBW 02552550 if ch6=1..16 + RGBW 25500210 if ch6=1..16 + RGBW 02550210 if ch6=1..16 + RGBW 00255210 if ch6=1..16 + RGBW 255200040090 if ch6=1..16 + RGB 255255255255 if ch6=1..16 + + + Shutter + no function + Strobe effect (0 ... 100%) + + + Dimmer + Red + Green + Blue + White + Program selection + Colour macro program 01 + Strobe + + + Red + Green + Blue + White + + + Dimmer + Red + Green + Blue + White + Strobe + + + + + + + + + diff --git a/resources/fixtures/Laserworld/Laserworld-EL-400RGB-MK2.qxf b/resources/fixtures/Laserworld/Laserworld-EL-400RGB-MK2.qxf new file mode 100644 index 0000000000..d8479720fe --- /dev/null +++ b/resources/fixtures/Laserworld/Laserworld-EL-400RGB-MK2.qxf @@ -0,0 +1,55 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Clément Delabroye + + Laserworld + EL-400RGB MK2 + Laser + + Effect + Laser off + Sound mode + Automatic mode + Static pattern (DMX mode) + Dynamic pattern (DMX mode) + + + Gobo + Pattern selection + + + + + Speed + Scanning speed + + + Speed + Dynamic pattern speed + + + + + + Style + Pattern selection + X axis positioning + Y axis positioning + Scanning speed + Dynamic pattern speed + Zoom / size + Color + Color segment + + + + + + + + + diff --git a/resources/fixtures/Laserworld/Laserworld-EL-900RGB.qxf b/resources/fixtures/Laserworld/Laserworld-EL-900RGB.qxf new file mode 100644 index 0000000000..2c47bf8e7b --- /dev/null +++ b/resources/fixtures/Laserworld/Laserworld-EL-900RGB.qxf @@ -0,0 +1,110 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Michael Tosatto + + Laserworld + EL-900RGB + Laser + + Effect + Laser off + Sound mode + Automatic mode + Static patterns of DMX mode + Dynamic patterns of DMX mode + + + Gobo + Circle Fast + Circle Slow + Scan Horizontal Fast + Scan Horizontal Slow + Scan Vertical Fast + Scan Vertical Slow + Fan Diagonal In Fast + Fan Diagonal In Slow + Fan Diagonal Out Fast + Fan Diagonal Out Slow + A Fast (HIGH) + A Slow (HIGH) + V Fast (LOW) + V Slow (LOW) + Triangle Up Fast (HIGH) + Triangle Up Slow (HIGH) + Triangle Down Fast (LOW) + Triangle Down Slow (LOW) + Square Fast + Square Slow + Square Tall Fast + Square Tall Slow + Square Wide Fast + Square Wide Slow + + + x + Fan Horizontal Fast + Fan Horizonttal Slow + Fan Shake Horizontal Fast + Fan Shake Horizontal Slow + Fan Shake Vertical Fast 1 + Fan Shake Vertical Fast 2 + Fan Shake Vertical Medium + Fan Shake Vertical Slow + Square Diagonal In + Square Diagonal Out + Vertical Boxes 1 + Vertical Boxes 2 + Ninja Star + + Ninja Star x + Star 1 + Star 1 U-S Down + Star 2 Fast + Star 2 Slow + Waves Fast + Waves Slow + Spiral + + + + Colour + White color + Yellow color + Purple color + Cyan color + Red color + Green color + Blue color + + + + + Speed + Scan speed + + + Speed + Dynamic patterns speed + + + + Mode + Pattern selection + Strobe effect + Color + X Axis Positioning + Y Axis Positioning + Scan Speed + Dynamic Patterns Speed + Zoom + + + + + + + + + diff --git a/resources/fixtures/Mac_Mah/Mac-Mah-FLAT-PAR-7x12W-6in1.qxf b/resources/fixtures/Mac_Mah/Mac-Mah-FLAT-PAR-7x12W-6in1.qxf new file mode 100644 index 0000000000..6cffddbb24 --- /dev/null +++ b/resources/fixtures/Mac_Mah/Mac-Mah-FLAT-PAR-7x12W-6in1.qxf @@ -0,0 +1,92 @@ + + + + + Q Light Controller Plus + 5.0.0 Beta 3 + Cédric Monféfoul + + Mac Mah + FLAT PAR 7x12W 6in1 + Color Changer + + Colour + No Function + Red + Green + Blue + White + Amber + UV + Red + Green + Red + Blue + Red + White + Red + Amber + Red + UV + Green + Blue + Green + White + Green + Amber + Green + UV + Blue + White + Blue + Amber + Blue + UV + White + Amber + White + UV + Amber + UV + Red + Green + Blue + Red + Blue + Amber + Red + Green + Blue + White + Ambre + UV + + + Shutter + No Function + Strobe Speed (Slow to Fast) + + + Maintenance + No Function + Auto DMX + Sound DMX + + + Speed + Auto DMX / Sound Speed (from slow to fast) + + + + + + + + + + Shutter + No Function + LED Strobe (from slow to fast) + + + Colors + Strobe + Auto / Sound + Auto DMX / Sound Speed + + + Red + Green + Blue + White + Amber + UV + Dimming + LED Strobe + Auto / Sound + Auto DMX / Sound Speed + + + + + + + + + diff --git a/resources/fixtures/Mac_Mah/Mac-Mah-Moving-FX-Bar.qxf b/resources/fixtures/Mac_Mah/Mac-Mah-Moving-FX-Bar.qxf new file mode 100644 index 0000000000..3c1c7dbd33 --- /dev/null +++ b/resources/fixtures/Mac_Mah/Mac-Mah-Moving-FX-Bar.qxf @@ -0,0 +1,478 @@ + + + + + Q Light Controller Plus + 5.0.0 Beta 3 + Clément Delabroye + + Mac Mah + Moving-FX Bar + Other + + + Effect + No function + Auto 1 program + Auto 2 program + Auto 3 program + Auto 4 program + Auto 5 program + Auto 6 program + Auto 7 program + Auto 8 program + Auto 9 program + Auto 10 program + Sound 1 program + Sound 2 program + Sound 3 program + Sound 4 program + Sound 5 program + Sound 6 program + Sound 7 program + Sound 8 program + Sound 9 program + Sound 10 program + + + Speed + Slow to Fast + + + Maintenance + No function + Reset to 0 + No function + + + + + + + Colour + White + Red + Amber + Yellow + Green + Blue + Cyan + Violet + White + Red + Red + Amber + Amber + yellow + Yellow + green + Green + Blue + Blue + Azure + Azure + violet + + + Gobo + Open + GOBO 1 + GOBO 2 + GOBO 3 + GOBO 4 + GOBO 5 + GOBO 6 + GOBO 7 + SPOT SHAKE + GOBO 1 SHAKE + GOBO 2 SHAKE + GOBO 3 SHAKE + GOBO 4 SHAKE + GOBO 5 SHAKE + GOBO 6 SHAKE + GOBO 7 SHAKE + + + + + + Colour + White + Red + Amber + Yellow + Green + Blue + Cyan + Violet + White + Red + Red + Amber + Amber + yellow + Yellow + green + Green + Blue + Blue + Azure + Azure + violet + + + Gobo + Open + GOBO 1 + GOBO 2 + GOBO 3 + GOBO 4 + GOBO 5 + GOBO 6 + GOBO 7 + SPOT SHAKE + GOBO 1 SHAKE + GOBO 2 SHAKE + GOBO 3 SHAKE + GOBO 4 SHAKE + GOBO 5 SHAKE + GOBO 6 SHAKE + GOBO 7 SHAKE + + + + Colour + No function + Red + Green + Blue + UV + Yellow + Magenta + Cyan + Dark orange + Yellow green + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Rose + Full + + + Colour + No function + Red + Green + Blue + UV + Yellow + Magenta + Cyan + Dark orange + Yellow green + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Rose + Full + + + + Colour + No function + Red + Green + Blue + White + Amber + Rose + Red + Green + Pink + Red + Blue + Pink + Red + White + Pink + Red + Amber + Pink + Green + Blue + Pink + Green + White + Pink + Green + Amber + Pink + Blue + White + Pink + Blue + Amber + Pink + White + Amber + Pink + Red + Green + Blue + Red + Blue + White + Red + White + Amber + Red + Green + Amber + Red + Blue + Amber + Green +Blue + White + Green + White + Amber + Green + Blue + Amber + ALL LEDs ON + + + Colour + No function + Red + Green + Blue + White + Amber + Rose + Red + Green + Pink + Red + Blue + Pink + Red + White + Pink + Red + Amber + Pink + Green + Blue + Pink + Green + White + Pink + Green + Amber + Pink + Blue + White + Pink + Blue + Amber + Pink + White + Amber + Pink + Red + Green + Blue + Red + Blue + White + Red + White + Amber + Red + Green + Amber + Red + Blue + Amber + Green +Blue + White + Green + White + Amber + Green + Blue + Amber + ALL LEDs ON + + + Speed + No function + Derby Motor Speed + + + Colour + No function + Laser red + Laser green + Laser red + green + Laser R+G effect group(speed lowhigh) + + + Speed + No function + Clockwise rotation + Counterclockwise rotation + + + + Effect + No function + Bar-4 white LED ON + Different case + Different case running + + + + + + + + + + + + + + + + + + + + + + + + + + + Master dimmer + Program + Auto and Sound programme speed setting + Reset + + + Master dimmer + Moving - Strobe + Moving L - Dimmer + Moving L - Pan + Moving L - Tilt + Moving L - Color + Moving L - Gobo + Moving R - Dimmer + Moving R - Pan + Moving R - Tilt + Moving R - Color + Moving R - Gobo + PAR - Strobe + PAR L - Color + PAR R - Color + Derby - Strobe + Derby L - Color + Derby R - Color + Derby - Motor Speed + Laser - Color + Laser - Speed + Led Bar - Strobe + Led Bar - Effect + Program + Auto and Sound programme speed setting + Reset + + 0 + 2 + 3 + 4 + 5 + 6 + + + 0 + 7 + 8 + 9 + 10 + 11 + + + 13 + 0 + + + 14 + 0 + + + 16 + 0 + + + 17 + 0 + + + 19 + 20 + 0 + + + 21 + 0 + + + + Master dimmer + Moving - Strobe + Moving L - Dimmer + Moving L - Pan + Moving L - Pan macro speed + Moving L - Tilt + Moving L - Tilt macro speed + Moving L - Color + Moving L - Gobo + Moving R - Dimmer + Moving R - Pan + Moving R - Pan macro speed + Moving R - Tilt + Moving R - Tilt macro speed + Moving R - Color + Moving R - Gobo + PAR - Strobe + PAR L - Red + PAR L - Green + PAR L - Blue + PAR L - UV + PAR R - Red + PAR R - Green + PAR R - Blue + PAR R - UV + Derby - Strobe + Derby L - Red + Derby L - Green + Derby L - Blue + Derby L - White + Derby L - Amber + Derby L - Pink + Derby R - Red + Derby R - Green + Derby R - Blue + Derby R - White + Derby R - Amber + Derby R - Pink + Derby - Motor Speed + Laser - Color + Laser - Speed + Led Bar - Strobe + Led Bar - Effect + Program + Auto and Sound programme speed setting + Reset + + 0 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + + + 0 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + + + 0 + 17 + 18 + 19 + 20 + + + 0 + 21 + 22 + 23 + 24 + + + 0 + 26 + 27 + 28 + 29 + 30 + 31 + + + 0 + 32 + 33 + 34 + 35 + 36 + 37 + + + 0 + 39 + 40 + + + 0 + 41 + 42 + + + + + + + + + + + diff --git a/resources/fixtures/Martin/Martin-MAC-Aura.qxf b/resources/fixtures/Martin/Martin-MAC-Aura.qxf index 654cd864ec..f491bba266 100644 --- a/resources/fixtures/Martin/Martin-MAC-Aura.qxf +++ b/resources/fixtures/Martin/Martin-MAC-Aura.qxf @@ -3,13 +3,13 @@ Q Light Controller Plus - 4.12.4 - Thierry Rodolfo + 4.13.1 GIT + Thierry Rodolfo, Giacomo Gorini Martin MAC Aura Moving Head - + Shutter Shutter closed Shutter open @@ -100,9 +100,9 @@ LEE 135 - Deep Golden Amber LEE 164 - Flame Red Open - Color rotation fast → slow + Color wheel clockwise fast → slow Stop Rot - Color rotation slow → fast + Color wheel c-clockwise slow → fast Open Random color Fast Random color Medium @@ -114,9 +114,9 @@ - Intensity - Disabled - 10 000K → 2 500K + Colour + Beam CTC Disabled + Beam CTC 10000K → 2500K Effect @@ -218,30 +218,30 @@ Sync random No sync, random - + Shutter - closed - open - Strobe 1 (fast → slow) - Open - Strobe 2: opening pulse (fast → slow) - open - Strobe 3: closing pulse (fast → slow) - open - Strobe 4: random strobe (fast → slow) - open - Strobe 5: random opening pulse (fast → slow) - open - Strobe 6: random closing pulse (fast → slow) - open - Strobe 7: burst pulse (fast → slow) - open - Strobe 8: random burst pulse (fast → slow) - open - Strobe 9: sine wave (fast → slow) - Open - Strobe 10: burst (fast → slow) - open + Shutter aura closed + Shutter aura open + Strobe aura 1 (fast → slow) + Shutter aura open + Strobe aura 2: opening pulse (fast → slow) + Shutter aura open + Strobe aura 3: closing pulse (fast → slow) + Shutter aura open + Strobe aura 4: random strobe (fast → slow) + Shutter aura open + Strobe aura 5: random opening pulse (fast → slow) + Shutter aura open + Strobe aura 6: random closing pulse (fast → slow) + Shutter aura open + Strobe aura 7: burst pulse (fast → slow) + Shutter aura open + Strobe aura 8: random burst pulse (fast → slow) + Shutter aura open + Strobe aura 9: sine wave (fast → slow) + Shutter aura open + Strobe aura 10: burst (fast → slow) + Shutter aura open @@ -281,9 +281,9 @@ LEE 135 - Deep Golden Amber LEE 164 - Flame Red Open - Color rotation fast → slow + Color wheel clockwise fast → slow Stop Rot - Color rotation slow → fast + Color wheel c-clockwise slow → fast Open Random color Fast Random color Medium @@ -293,7 +293,7 @@ - + Beam electronic shutter effect Beam dimmer Zoom @@ -320,14 +320,13 @@ Aura Green Aura Blue + 0 + 1 8 9 10 - 12 11 - 13 - 1 - 0 + 12 19 @@ -335,9 +334,10 @@ 21 22 23 + 24 - + Beam electronic shutter effect Beam dimmer Zoom @@ -354,10 +354,10 @@ Beam CTC - - + + - - + + diff --git a/resources/fixtures/Martin/Martin-RUSH-Par-2-RGBW-Zoom.qxf b/resources/fixtures/Martin/Martin-RUSH-Par-2-RGBW-Zoom.qxf index d6e2defc2a..405c1454ab 100644 --- a/resources/fixtures/Martin/Martin-RUSH-Par-2-RGBW-Zoom.qxf +++ b/resources/fixtures/Martin/Martin-RUSH-Par-2-RGBW-Zoom.qxf @@ -3,17 +3,17 @@ Q Light Controller Plus - 4.12.5 GIT - jeremy-AMMD + 5.0.0 Beta 3 + jeremy-AMMD, Giacomo Gorini Martin RUSH Par 2 RGBW Zoom Color Changer - - - - - + + + + + @@ -63,39 +63,39 @@ Random color, medium Random color, slow - + Shutter Off Open Strobe - slow~fast Open Pulse - fast close & slow open - Open - Pulse - slow close & fast open + Open + Pulse - slow close & fast open Open Random strobe Open - Red 1 - Green 1 - Blue 1 - White 1 + Red + Green + Blue + White Zoom Dimmer Dimmer Fine Strobe - Red 1 - Green 1 - Blue 1 - White 1 + Red + Green + Blue + White Color wheel Zoom - + diff --git a/resources/fixtures/OXO/OXO-ColorBeam-7-FCW-IR.qxf b/resources/fixtures/OXO/OXO-ColorBeam-7-FCW-IR.qxf new file mode 100644 index 0000000000..dc0a1f689f --- /dev/null +++ b/resources/fixtures/OXO/OXO-ColorBeam-7-FCW-IR.qxf @@ -0,0 +1,70 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Dmitry Kolesnikov + + OXO + ColorBeam 7 FCW IR + Color Changer + + Effect + 35 colors setting + black + + + Effect + Luminance + + + + + + + Speed + Static + + + Effect + No out / RGB/Strobe / 35 colors macro mode + Light mode + Dim mode + Light and Dim mode + Auto mix color mode + 3 colors strobe + 7 colors strobe + 7 colors audio control / Light changes with sound value + + + + Macro + + + Macro + Luminance + + + Red + Green + Blue + White + + + Red + Green + Blue + White + Macro + Speed/Strobe + Mode + Master dimmer + + + + + + + + + diff --git a/resources/fixtures/Pro-Lights/Pro-Lights-Pixie-Spot.qxf b/resources/fixtures/Pro-Lights/Pro-Lights-Pixie-Spot.qxf new file mode 100644 index 0000000000..96018dbd2e --- /dev/null +++ b/resources/fixtures/Pro-Lights/Pro-Lights-Pixie-Spot.qxf @@ -0,0 +1,220 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Dmitry Kolesnikov + + Pro-Lights + Pixie Spot + Moving Head + + + + + + + Maintenance + No function + Reset (Hold 3 Seconds) + No function + + + + + + + Colour + No function + Red + Yellow + Green + Cyan + Blue + Magenta + White + Full + Clockwise rotation (Fast to Slow) + Stop Run + Counterclockwise rotation (Slow to Fast) + + + Gobo + Gobo wheel presets + Gobo 1 + Gobo 2 + Gobo 3 + Gobo 4 + Gobo 5 + Gobo 6 + Gobo 7 + Gobo 1 Shaking + Gobo 2 Shaking + Gobo 3 Shaking + Gobo 4 Shaking + Gobo 5 Shaking + Gobo 6 Shaking + Gobo 7 Shaking + Clockwise rotation (Fast to Slow) + Stop Rotation + Counterclockwise rotation (Slow to Fast) + + + Gobo + Stop Rotation + Clockwise rotation (Fast to Slow) + Stop Rotation + Counterclockwise rotation (Slow to Fast) + + + Prism + Prism Off + Prism On + Clockwise rotation (Fast to Slow) + Stop Rotation + Counterclockwise rotation (Slow to Fast) + + + Shutter + Shutter Closed + No Function (Shutter open) + Strobe Effect (Slow to Fast) + No function (Shutter open) + Pulse-effect in sequence + No function (Shutter open) + Random Strobe Effect (Slow to Fast) + No Function (Shutter open) + + + + + Colour + No Function + R:100% / G:0~100% / B:0 / W:0 + R:100%~0 / G:100% / B:0 / W:0 + R:0 / G:100% / B:0~100% / W:0 + R:0 / G:100%~0 / B:100% / W:0 + R:0~100% / G:0 / B:100% / W:0 + R:100% / G:0 / B:100%~0 / W:0 + R:100% / G:0~100% / B:0~100% / W:0 + R:100%~0 / G:100%~0 / B:100% / W:0 + R:100% / G:100% / B:100% / W:100% + Color 1 + Color 2 + Color 3 + Color 4 + Color 5 + Color 6 + Color 7 + Color 8 + Color 9 + Color 10 + Color 11 + + + Effect + No Function + 4 Colours Snap + 4 Colours Fade + 15 Colours Snap + 15 Colours Fade + Sound Control + + + Speed + Speed (Slow to Fast) / Sound Sensitivity OFF + Control the Sound Sensitivity + + + Effect + No Function + Motor Show 1 + Motor Show 2 + Motor Show 3 + Motor Show 4 + Motor Show 5 (Motor Show 1 - 4) + Motor Show 6 + + + Speed + Speed (Slow to Fast) + + + Speed + Preset dimmer speed from display menu + Dimmer speed mode off + Dimmer speed mode 1 + Dimmer speed mode 2 + Dimmer speed mode 3 + + + Pan + Pan fine + Tilt + Tilt fine + Pan/Tilt speed + Special Function + Red + Green + Blue + White + Gobo wheel + Gobo Rotation + Prism rotation + Strobe + Focus + + + Pan + Pan fine + Tilt + Tilt fine + Pan/Tilt speed + Special Function + Red + Green + Blue + White + Color wheel + Gobo wheel + Gobo Rotation + Prism rotation + Strobe + Focus + Dimmer + Dimmer Speed Mode + + + Pan + Pan fine + Tilt + Tilt fine + Pan/Tilt speed + Special Function + Red + Green + Blue + White + Color wheel + Gobo wheel + Gobo Rotation + Prism rotation + Strobe + Focus + Dimmer + Color macro + Auto Program + Auto Program Speed + Motor Show + Motor Show Speed + Dimmer Speed Mode + + + + + + + + + diff --git a/resources/fixtures/Robe/Robe-LEDBeam-350-RGBA.qxf b/resources/fixtures/Robe/Robe-LEDBeam-350-RGBA.qxf new file mode 100644 index 0000000000..adb9136445 --- /dev/null +++ b/resources/fixtures/Robe/Robe-LEDBeam-350-RGBA.qxf @@ -0,0 +1,273 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Giacomo Gorini + + Robe + LEDBeam 350 RGBA + Moving Head + + + + + + Speed + Standard mode + Max Speed mode + P/T Speed mode: Speed from max. to min. - P/T Time mode: Time from 0.2 sec to 25.5 sec + + + Maintenance + Reserved + Display ON + Display OFF + RGBW colour mixing mode + CMY colour mixing mode + Pan/Tilt speed mode + Pan/Tilt time mode + Blackout while pan/tilt moving + Disabled blackout while pan/tilt moving + Dimmer curve - square law + Dimmer curve - linear + Fans mode: Auto + Fans mode: High + White point 8000K ON + White point 8000K OFF + Reserved + Pan 540 + Pan 450 + Quiet mode: Fans On at blackout + Quiet mode: Fans Off at blackout + Reserved + Reserved + Pan/Tilt reset + Zoom reset + Reserved + Tungsten effect simulation (750W) On + Tungsten effect simulation (1000W) On + Tungsten effect simulation (1200W) On + Tungsten effect simulation (2000W) On + Tungsten effect simulation (2500W) On + Tungsten effect simulation Off + Reserved + Total Fixture Reset + Reserved + RoboSpot enabled + RoboSpot disabled - except handle faders and pan/tilt + RoboSpot fully disabled + Reserved + Disabled "Quiet mode" + Quiet mode - fan noise control from min to max + + + Maintenance + PWM frequency from Display menu + 300 Hz + 600 Hz (10=default) + 1200 Hz + 2400 Hz + High + Reserved (fixture utilizes PWM frequency set in the display menu item Frequency Setup) + + + Maintenance + Selected LED Frequency + LED Frequency (step -126 > -1) + Selected LED Frequency (128=default) + LED Frequency (step +1 > +126) + Selected LED Frequency + + + Colour + No function + Filter 4 (Medium Bastard Amber) + Filter 25 (Sunset Red) + Filter 19 (Fire) + Filter 26 (Bright Red) + Filter 58 (Lavender) + Filter 68 (Sky Blue) + Filter 36 (Medium Pink) + Filter 89 (Moss Green) + Filter 88 (Lime Green) + Filter 90 (Dark Yellow Green) + Filter 49 (Medium Purple) + Filter 52 (Light Lavender) + Filter 102 (Light Amber) + Filter 103 (Straw) + Filter 140 (Summer Blue) + Filter 124 (Dark Green) + Filter 106 (Primary Red) + Filter 111 (Dark Pink) + Filter 115 (Peacock Blue) + Filter 126 (Mauve) + Filter 117 (Steel Blue) + Filter 118 (Light Blue) + Filter 122 (Fern Green) + Filter 182 (Light Red) + Filter 121 (Filter Green) + Filter 128 (Bright Pink) + Filter 131 (Marine Blue) + Filter 132 (Medium Blue) + Filter 134 (Golden Amber) + Filter 135 (Deep Golden Amber) + Filter 136 (Pale Lavender) + Filter 137 (Special Lavender) + Filter 138 (Pale Green) + Filter 798 (Chrysalis Pink) + Filter 141 (Bright Blue) + Filter 147 (Apricot) + Filter 148 (Bright Rose) + Filter 152 (Pale Gold) + Filter 154 (Pale Rose) + Filter 157 (Pink) + Filter 143 (Pale Navy Blue) + Filter 162 (Bastard Amber) + Filter 164 (Flame Red) + Filter 165 (Daylight Blue) + Filter 169 (Lilac Tint) + Filter 170 (Deep Lavender) + Filter 172 (Lagoon Blue) + Filter 194 (Surprise Pink) + Filter 180 (Dark Lavender) + Filter 181 (Congo Blue) + Filter 197 (Alice Blue) + Filter 201 (Full C.T. Blue) + Filter 202 (Half C.T. Blue) + Filter 203 (Quarter C.T. Blue) + Filter 204 (Full C.T. Orange) + Filter 219 (Fluorescent Green) + Filter 206 (Quarter C.T. Orange) + Filter 247 (Filter Minus Green) + Filter 248 (Half Minus Green) + Filter 281 (Three Quarter C.T. Blue) + Filter 285 (Three Quarter C.T. Orange) + Filter 352 (Glacier Blue) + Filter 353 (Lighter Blue) + Filter 507 (Madge) + Filter 778 (Millennium Gold) + Filter 793 (Vanity Fair) + Raw DMX + Rainbow effect (with fade time) from slow -> fast + Rainbow effect (without fade time) from slow -> fast + + + + + + + + + + + Colour + If function "White Point 8000K" ON: Col. temperature correction from 8000K to 2700K for whites only. If function "White Point 8000K" OFF: Colour temperature correction from cool white to 2700K + + + Colour + Virtual colors ("Virtual" has priority) + Maximum mode (highest values have priority) + Minimum mode (lowest values have priority) + Multiply mode (multiply Virtual and Colour Mix) + Addition mode (Virtual + Colour mix) + Subtraction mode (Virtual - Colour mix) + Inverted Subtration mode (Virtual - Colour mix) + Reserved + Virtual colors (virtual has priority) + Crossfade (crossfade between Virtual and Colour mix) + Colour channels ("Colour mix" has priority) + + + + + Shutter + Shutter closed + Shutter open + Stobe-effect from slow to fast + Shutter open + Opening pulse in sequences from slow to fast + Closing pulse in sequences from fast to slow + Shutter open + Random strobe-effect from slow to fast + Shutter open + + + + + Pan + Pan Fine + Tilt + Tilt Fine + Pan/Tilt Speed - Pan/Tilt Time + Power/Special Functions + Virtual Colour Wheel + Red/Cyan + Red/Cyan Fine + Green/Magenta + Green/Magenta Fine + Blue/Yellow + Blue/Yellow Fine + Amber + Amber Fine + CTC + Color Mix Control + Zoom + Zoom Fine + Shutter/Strobe + Dimmer Intensity + Dimmer Intensity Fine + + + Pan + Pan Fine + Tilt + Tilt Fine + Pan/Tilt Speed - Pan/Tilt Time + Power/Special Functions + Virtual Colour Wheel + Red/Cyan + Green/Magenta + Blue/Yellow + Amber + CTC + Color Mix Control + Zoom + Shutter/Strobe + Dimmer Intensity + + + Pan + Pan Fine + Tilt + Tilt Fine + Pan/Tilt Speed - Pan/Tilt Time + Power/Special Functions + LED frequency selection + LED frequency fine adjusting + Virtual Colour Wheel + Red/Cyan + Red/Cyan Fine + Green/Magenta + Green/Magenta Fine + Blue/Yellow + Blue/Yellow Fine + Amber + Amber Fine + CTC + Color Mix Control + Zoom + Zoom Fine + Shutter/Strobe + Dimmer Intensity + Dimmer Intensity Fine + + + + + + + + + diff --git a/resources/fixtures/Robe/Robe-LEDBeam-350.qxf b/resources/fixtures/Robe/Robe-LEDBeam-350.qxf new file mode 100644 index 0000000000..1867f09c34 --- /dev/null +++ b/resources/fixtures/Robe/Robe-LEDBeam-350.qxf @@ -0,0 +1,273 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Giacomo Gorini + + Robe + LEDBeam 350 + Moving Head + + + + + + Speed + Standard mode + Max Speed mode + P/T Speed mode: Speed from max. to min. - P/T Time mode: Time from 0.2 sec to 25.5 sec + + + Maintenance + Reserved + Display ON + Display OFF + RGBW colour mixing mode + CMY colour mixing mode + Pan/Tilt speed mode + Pan/Tilt time mode + Blackout while pan/tilt moving + Disabled blackout while pan/tilt moving + Dimmer curve - square law + Dimmer curve - linear + Fans mode: Auto + Fans mode: High + White point 8000K ON + White point 8000K OFF + Reserved + Pan 540 + Pan 450 + Quiet mode: Fans On at blackout + Quiet mode: Fans Off at blackout + Reserved + Reserved + Pan/Tilt reset + Zoom reset + Reserved + Tungsten effect simulation (750W) On + Tungsten effect simulation (1000W) On + Tungsten effect simulation (1200W) On + Tungsten effect simulation (2000W) On + Tungsten effect simulation (2500W) On + Tungsten effect simulation Off + Reserved + Total Fixture Reset + Reserved + RoboSpot enabled + RoboSpot disabled - except handle faders and pan/tilt + RoboSpot fully disabled + Reserved + Disabled "Quiet mode" + Quiet mode - fan noise control from min to max + + + Maintenance + PWM frequency from Display menu + 300 Hz + 600 Hz (10=default) + 1200 Hz + 2400 Hz + High + Reserved (fixture utilizes PWM frequency set in the display menu item Frequency Setup) + + + Maintenance + Selected LED Frequency + LED Frequency (step -126 > -1) + Selected LED Frequency (128=default) + LED Frequency (step +1 > +126) + Selected LED Frequency + + + Colour + No function + Filter 4 (Medium Bastard Amber) + Filter 25 (Sunset Red) + Filter 19 (Fire) + Filter 26 (Bright Red) + Filter 58 (Lavender) + Filter 68 (Sky Blue) + Filter 36 (Medium Pink) + Filter 89 (Moss Green) + Filter 88 (Lime Green) + Filter 90 (Dark Yellow Green) + Filter 49 (Medium Purple) + Filter 52 (Light Lavender) + Filter 102 (Light Amber) + Filter 103 (Straw) + Filter 140 (Summer Blue) + Filter 124 (Dark Green) + Filter 106 (Primary Red) + Filter 111 (Dark Pink) + Filter 115 (Peacock Blue) + Filter 126 (Mauve) + Filter 117 (Steel Blue) + Filter 118 (Light Blue) + Filter 122 (Fern Green) + Filter 182 (Light Red) + Filter 121 (Filter Green) + Filter 128 (Bright Pink) + Filter 131 (Marine Blue) + Filter 132 (Medium Blue) + Filter 134 (Golden Amber) + Filter 135 (Deep Golden Amber) + Filter 136 (Pale Lavender) + Filter 137 (Special Lavender) + Filter 138 (Pale Green) + Filter 798 (Chrysalis Pink) + Filter 141 (Bright Blue) + Filter 147 (Apricot) + Filter 148 (Bright Rose) + Filter 152 (Pale Gold) + Filter 154 (Pale Rose) + Filter 157 (Pink) + Filter 143 (Pale Navy Blue) + Filter 162 (Bastard Amber) + Filter 164 (Flame Red) + Filter 165 (Daylight Blue) + Filter 169 (Lilac Tint) + Filter 170 (Deep Lavender) + Filter 172 (Lagoon Blue) + Filter 194 (Surprise Pink) + Filter 180 (Dark Lavender) + Filter 181 (Congo Blue) + Filter 197 (Alice Blue) + Filter 201 (Full C.T. Blue) + Filter 202 (Half C.T. Blue) + Filter 203 (Quarter C.T. Blue) + Filter 204 (Full C.T. Orange) + Filter 219 (Fluorescent Green) + Filter 206 (Quarter C.T. Orange) + Filter 247 (Filter Minus Green) + Filter 248 (Half Minus Green) + Filter 281 (Three Quarter C.T. Blue) + Filter 285 (Three Quarter C.T. Orange) + Filter 352 (Glacier Blue) + Filter 353 (Lighter Blue) + Filter 507 (Madge) + Filter 778 (Millennium Gold) + Filter 793 (Vanity Fair) + Raw DMX + Rainbow effect (with fade time) from slow -> fast + Rainbow effect (without fade time) from slow -> fast + + + + + + + + + + + Colour + If function "White Point 8000K" ON: Col. temperature correction from 8000K to 2700K for whites only. If function "White Point 8000K" OFF: Colour temperature correction from cool white to 2700K + + + Colour + Virtual colors ("Virtual" has priority) + Maximum mode (highest values have priority) + Minimum mode (lowest values have priority) + Multiply mode (multiply Virtual and Colour Mix) + Addition mode (Virtual + Colour mix) + Subtraction mode (Virtual - Colour mix) + Inverted Subtration mode (Virtual - Colour mix) + Reserved + Virtual colors (virtual has priority) + Crossfade (crossfade between Virtual and Colour mix) + Colour channels ("Colour mix" has priority) + + + + + Shutter + Shutter closed + Shutter open + Stobe-effect from slow to fast + Shutter open + Opening pulse in sequences from slow to fast + Closing pulse in sequences from fast to slow + Shutter open + Random strobe-effect from slow to fast + Shutter open + + + + + Pan + Pan Fine + Tilt + Tilt Fine + Pan/Tilt Speed - Pan/Tilt Time + Power/Special Functions + Virtual Colour Wheel + Red/Cyan + Red/Cyan Fine + Green/Magenta + Green/Magenta Fine + Blue/Yellow + Blue/Yellow Fine + White + White Fine + CTC + Color Mix Control + Zoom + Zoom Fine + Shutter/Strobe + Dimmer Intensity + Dimmer Intensity Fine + + + Pan + Pan Fine + Tilt + Tilt Fine + Pan/Tilt Speed - Pan/Tilt Time + Power/Special Functions + Virtual Colour Wheel + Red/Cyan + Green/Magenta + Blue/Yellow + White + CTC + Color Mix Control + Zoom + Shutter/Strobe + Dimmer Intensity + + + Pan + Pan Fine + Tilt + Tilt Fine + Pan/Tilt Speed - Pan/Tilt Time + Power/Special Functions + LED frequency selection + LED frequency fine adjusting + Virtual Colour Wheel + Red/Cyan + Red/Cyan Fine + Green/Magenta + Green/Magenta Fine + Blue/Yellow + Blue/Yellow Fine + White + White Fine + CTC + Color Mix Control + Zoom + Zoom Fine + Shutter/Strobe + Dimmer Intensity + Dimmer Intensity Fine + + + + + + + + + diff --git a/resources/fixtures/Shehds/Shehds-LED-Beam+Wash-19x15W-RGBW-Zoom.qxf b/resources/fixtures/Shehds/Shehds-LED-Beam+Wash-19x15W-RGBW-Zoom.qxf new file mode 100644 index 0000000000..0cd8bc3804 --- /dev/null +++ b/resources/fixtures/Shehds/Shehds-LED-Beam+Wash-19x15W-RGBW-Zoom.qxf @@ -0,0 +1,128 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Paul Schuh + + Shehds + LED Beam+Wash 19x15W RGBW Zoom Lighting + Moving Head + + + + + + + + + + + + + + + + + + + + + + Effect + Preset Color + Program Jump + Program Gradient + Program Pulse + + + Speed + Program Speed Adjustment + + + Effect + No Function + Program Activation + Self-propelled mode (1) + Self-propelled mode (2) + Audio control mode + + + Maintenance + Reset + + + + + + + X axis rotation + X-axis fine-tuning + Y axis rotation + Y-axis fine-tuning + XY speed adjustment + Master Dimmer + Strobe + Red Dimmer + Green Dimmer + Blue Dimmer + White Dimmer + Focus + Program Selection + Program Speed + Program Activation + Reset + + + X axis rotation + X-axis fine-tuning + Y axis rotation + Y-axis fine-tuning + XY speed adjustment + Focus + Master Dimmer + Strobe + Red 1 Dimmer + Green 1 Dimmer + Blue 1 Dimmer + White 1 Dimmer + Red 2 Dimmer + Green 2 Dimmer + Blue 2 Dimmer + White 2 Dimmer + Red 3 Dimmer + Green 3 Dimmer + Blue 3 Dimmer + White 3 Dimmer + Program Selection + Program Speed + Program Activation + Reset + + 8 + 9 + 10 + 11 + + + 12 + 13 + 14 + 15 + + + 16 + 17 + 18 + 19 + + + + + + + + + + diff --git a/resources/fixtures/Shehds/Shehds-Wash-Zoom-36x18W.qxf b/resources/fixtures/Shehds/Shehds-Wash-Zoom-36x18W.qxf new file mode 100644 index 0000000000..2da951fa60 --- /dev/null +++ b/resources/fixtures/Shehds/Shehds-Wash-Zoom-36x18W.qxf @@ -0,0 +1,98 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Ioannis Iliopoulos + + Shehds + Wash Zoom LED 36x18W RGBWA+UV + Moving Head + + + + + + + + + + + + Shutter + Open + Off + Strobe + + + + Effect + No Function + Pan Auto Mode + Tilt Auto Mode + Pan & Tilt Auto Mode + Sound Control Mode + + + Colour + No Function + Gradient Color Mode + Pulse Color Mode + Jump Color Mode + + + + + Maintenance + No Function + Reset System + + + Colour + No Function + CTO + Macro Color + + + Pan + Tilt + Pan/Tilt speed - Pan/Tilt time + Dimmer + Red + Green + Blue + White + Amber + Violet + Strobe + Zoom + + + Pan + Tilt + Pan/Tilt speed - Pan/Tilt time + Dimmer + Red + Green + Blue + White + Amber + Violet + Strobe + Zoom + Pan/Tilt Auto + Color Auto + Pan Fine + Tilt Fine + Reset System + Macro Color + + + + + + + + + diff --git a/resources/fixtures/Showtec/Showtec-ACT-PC-60-RGBW.qxf b/resources/fixtures/Showtec/Showtec-ACT-PC-60-RGBW.qxf new file mode 100644 index 0000000000..433c29f700 --- /dev/null +++ b/resources/fixtures/Showtec/Showtec-ACT-PC-60-RGBW.qxf @@ -0,0 +1,156 @@ + + + + + Q Light Controller Plus + 5.0.0 Beta 3 + Michel Sliepenbeek + + Showtec + ACT PC 60 RGBW + Color Changer + + + + + + Colour + No Function + Color 1 - Red + Color 2 + Color 3 + Color 4 + Color 5 + Color 6 + Color 7 + Color 8 - Orange + Color 9 + Color 10 + Color 11 + Color 12 + Color 13 + Color 14 + Color 15 + Color 16 - Yellow + Color 17 + Color 18 + Color 19 + Color 20 + Color 21 + Color 22 + Color 23 + Color 24 + Color 25 + Color 26 + Color 27 + Color 28 + Color 29 + Color 30 + Color 31 + Color 32 + Color 33 + Color 34 + Color 35 + Color 36 + Color 37 + Color 38 + Color 39 + Color 40 + Color 41 + Color 42 + Color 43 + Color 44 + Color 45 + Color 46 + Color 47 + Color 48 + Color 49 - Blue + Color 50 + Color 51 + Color 52 + Color 53 + Color 54 + Color 55 + Color 56 + Color 57 + Color 58 + Color 59 + Color 60 + Color 61 + Color 62 + Color 63 + Color 64 + + + Shutter + Closed (No Light Output) + Open + Strobe, from Low to High Frequency + Open + Strobe, from Low to High Rate + Open + Random Strobe, from Low to High Rate + Open + + + + Colour + No Function + Color Temperature from Warm (3000 K) to Cold (7200K) + + + + Effect + No Function + Chase 1 + Chase 2 + Chase 3 + Chase 4 + Chase 5 + Chase 6 + Chase 7 + Chase 8 + Chase 9 + Chase 10 + + + Speed + Speed of Chases: Slow to Fast + + + Red + Green + Blue + White + Color Macros + Strobe + Master Dimmer + Color Temperature + Zoom + Chases + Speed + + + Red + Green + Blue + White + Zoom + + + Red + Green + Blue + White + Strobe + Master Dimmer + Zoom + + + + + + + + + diff --git a/resources/fixtures/Showtec/Showtec-LED-Par-64-Short-V2.qxf b/resources/fixtures/Showtec/Showtec-LED-Par-64-Short-V2.qxf new file mode 100644 index 0000000000..ebc1cf2832 --- /dev/null +++ b/resources/fixtures/Showtec/Showtec-LED-Par-64-Short-V2.qxf @@ -0,0 +1,66 @@ + + + + + Q Light Controller Plus + 4.12.7 + Oystein Steimler + + Showtec + LED Par 64 Short V2 + Color Changer + + + + + + Shutter + No Function + Full on + Strobe (Slow to fast) + + + Effect + No function + Program 1: 7-color fading + Program 2: 7-color jump + Program 3: Color dreaming + Program 4: Red fading + Program 5: Green fading + Program 6: Blue fading + Sound active (Ch 2 is audio sensivity) + + + Speed + Speed from slow to fast / Audio sensitivity from low to high + + + + + Red + Green + Blue + Dimmer + Strobe with dead zone + + + Built-in programs / Sound-controlled + Speed / Sensitivity + Strobe + + + Red + Green + Blue + + + Macro Colors + + + + + + + + + diff --git a/resources/fixtures/Talent/Talent-SSL2.qxf b/resources/fixtures/Talent/Talent-SSL2.qxf new file mode 100644 index 0000000000..1eb55c0bcb --- /dev/null +++ b/resources/fixtures/Talent/Talent-SSL2.qxf @@ -0,0 +1,83 @@ + + + + + Q Light Controller Plus + 4.12.8 GIT + Ken Dreyer + + Talent + SSL2 + Moving Head + + + + Shutter + off + dimming + strobe flash + constant on + + + + + + + + + + Colour + 231 kinds of color choosing + full color jump + + + Speed + Color jumping speed + + + Effect + off + fast auto + slow auto + sound active mode + + + Maintenance + Nothing + Reset + + + Pan + Tilt + Functions control + Red + Green + Blue + White + Speed + Reset + + + Pan + Pan fine + Tilt + Tilt fine + Speed + Functions control + Red + Green + Blue + White + Color macros + Color jumping speed + Auto programs + Reset + + + + + + + + + diff --git a/resources/fixtures/Tecshow/Tecshow-Nebula-6.qxf b/resources/fixtures/Tecshow/Tecshow-Nebula-6.qxf new file mode 100644 index 0000000000..6a9267330d --- /dev/null +++ b/resources/fixtures/Tecshow/Tecshow-Nebula-6.qxf @@ -0,0 +1,66 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Mariano Olmedo (edit by Fedegh) + + Tecshow + Nebula 6 + Color Changer + + + + + + + + + Shutter + No function + Strobe (from slow to fast) + Strobe (from fast to slow) + Strobe effect 1 + Strobe effect 2 + Strobe, the fastest strobe effect + + + Colour + No function + RGBAUvW + + + Effect + No function + Color auto speed + Sound control + + + Red + Green + Blue + White + Amber + UV + Master dimmer + Strobe + Color walking + Sound Control + + + Red + Green + Blue + White + Amber + UV + + + + + + + + + diff --git a/resources/fixtures/UKing/UKing-ZQ-02319.qxf b/resources/fixtures/UKing/UKing-ZQ-02319.qxf new file mode 100644 index 0000000000..e20b9577e6 --- /dev/null +++ b/resources/fixtures/UKing/UKing-ZQ-02319.qxf @@ -0,0 +1,57 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Mike Ubl + + UKing + ZQ-02319 + Moving Head + + + + + + + + + + + + + Effect + No effect + Auto Mode 1 + Auto Mode 2 + Sound Control + + + Maintenance + No Effect + Reset + + + Pan + Pan-Fine + Tilt + Tilt-Fine + Speed + Dimming + Strobe + Red + Green + Blue + White + Auto-Mode + Reset + + + + + + + + + diff --git a/resources/fixtures/Varytec/Varytec-Blitz-Bar-240.qxf b/resources/fixtures/Varytec/Varytec-Blitz-Bar-240.qxf new file mode 100644 index 0000000000..fdea131838 --- /dev/null +++ b/resources/fixtures/Varytec/Varytec-Blitz-Bar-240.qxf @@ -0,0 +1,1109 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Stefan Lohmann + + Varytec + Blitz Bar 240 + LED Bar (Pixels) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Intensity + Red + Red + + + Intensity + Green + Green + + + Intensity + Blue + Blue + + + + Effect + No function + Automatic show white 1 + Automatic show white 2 + Automatic show white 3 + Automatic show white 4 + Automatic show white 5 + Automatic show white 6 + Automatic show white 7 + Automatic show white 8 + Automatic show white 9 + Automatic show white 10 + Automatic show white 11 + Automatic show white 12 + Automatic show white 13 + Automatic show white 14 + Automatic show white 15 + Automatic show white 16 + Automatic show white 17 + Automatic show white 18 + Automatic show white 19 + Automatic show white 20 + + + Speed + Running speed of automatic show white, increasing + + + Effect + No function + Automatic show RGB 1 + Automatic show RGB 2 + Automatic show RGB 3 + Automatic show RGB 4 + Automatic show RGB 5 + Automatic show RGB 6 + Automatic show RGB 7 + Automatic show RGB 8 + Automatic show RGB 9 + Automatic show RGB 10 + Automatic show RGB 11 + Automatic show RGB 12 + Automatic show RGB 13 + Automatic show RGB 14 + Automatic show RGB 15 + Automatic show RGB 16 + Automatic show RGB 17 + Automatic show RGB 18 + Automatic show RGB 19 + Automatic show RGB 20 + Automatic show RGB 21 + Automatic show RGB 22 + Automatic show RGB 23 + Automatic show RGB 24 + Automatic show RGB 25 + Automatic show RGB 26 + Automatic show RGB 27 + Automatic show RGB 28 + Automatic show RGB 29 + Automatic show RGB 30 + Automatic show RGB 31 + Automatic show RGB 32 + Automatic show RGB 33 + Automatic show RGB 34 + Automatic show RGB 35 + Automatic show RGB 36 + Automatic show RGB 37 + Automatic show RGB 38 + Automatic show RGB 39 + Automatic show RGB 40 + Automatic show RGB 41 + Automatic show RGB 42 + Automatic show RGB 43 + Automatic show RGB 44 + Automatic show RGB 45 + Automatic show RGB 46 + Automatic show RGB 47 + Automatic show RGB 48 + Automatic show RGB 49 + Automatic show RGB 50 + Automatic show RGB 51 + Automatic show RGB 52 + Automatic show RGB 53 + Automatic show RGB 54 + Automatic show RGB 55 + Automatic show RGB 56 + Automatic show RGB 57 + Automatic show RGB 58 + Automatic show RGB 59 + Automatic show RGB 60 + Automatic show RGB 61 + Automatic show RGB 62 + + + Speed + Running speed of automatic show RGB, increasing + + + Intensity + White + White + + + Shutter + No function + Strobe, increasing speed + + + Shutter + No function + RGB strobe, increasing speed + + + Intensity + Red + Background red + + + Intensity + Green + Background green + + + Intensity + Blue + Background blue + + + Effect + Direction normal + Direction inverted + + + + + + + + + + + White 1 + White 2 + White 3 + White 4 + White 5 + White 6 + White 7 + White 8 + White 9 + White 10 + White 11 + White 12 + White 13 + White 14 + White 15 + White 16 + White 17 + White 18 + White 19 + White 20 + White 21 + White 22 + White 23 + White 24 + White 25 + White 26 + White 27 + White 28 + White 29 + White 30 + White 31 + White 32 + White 33 + White 34 + White 35 + White 36 + White 37 + White 38 + White 39 + White 40 + Red 1 + Green 1 + Blue 1 + Red 2 + Green 2 + Blue 2 + Red 3 + Green 3 + Blue 3 + Red 4 + Green 4 + Blue 4 + Red 5 + Green 5 + Blue 5 + Red 6 + Green 6 + Blue 6 + Red 7 + Green 7 + Blue 7 + Red 8 + Green 8 + Blue 8 + Red 9 + Green 9 + Blue 9 + Red 10 + Green 10 + Blue 10 + Red 11 + Green 11 + Blue 11 + Red 12 + Green 12 + Blue 12 + Red 13 + Green 13 + Blue 13 + Red 14 + Green 14 + Blue 14 + Red 15 + Green 15 + Blue 15 + Red 16 + Green 16 + Blue 16 + Red 17 + Green 17 + Blue 17 + Red 18 + Green 18 + Blue 18 + Red 19 + Green 19 + Blue 19 + Red 20 + Green 20 + Blue 20 + Red 21 + Green 21 + Blue 21 + Red 22 + Green 22 + Blue 22 + Red 23 + Green 23 + Blue 23 + Red 24 + Green 24 + Blue 24 + Red 25 + Green 25 + Blue 25 + Red 26 + Green 26 + Blue 26 + Red 27 + Green 27 + Blue 27 + Red 28 + Green 28 + Blue 28 + Red 29 + Green 29 + Blue 29 + Red 30 + Green 30 + Blue 30 + Red 31 + Green 31 + Blue 31 + Red 32 + Green 32 + Blue 32 + Red 33 + Green 33 + Blue 33 + Red 34 + Green 34 + Blue 34 + Red 35 + Green 35 + Blue 35 + Red 36 + Green 36 + Blue 36 + Red 37 + Green 37 + Blue 37 + Red 38 + Green 38 + Blue 38 + Red 39 + Green 39 + Blue 39 + Red 40 + Green 40 + Blue 40 + Red 41 + Green 41 + Blue 41 + Red 42 + Green 42 + Blue 42 + Red 43 + Green 43 + Blue 43 + Red 44 + Green 44 + Blue 44 + Red 45 + Green 45 + Blue 45 + Red 46 + Green 46 + Blue 46 + Red 47 + Green 47 + Blue 47 + Red 48 + Green 48 + Blue 48 + Red 49 + Green 49 + Blue 49 + Red 50 + Green 50 + Blue 50 + Red 51 + Green 51 + Blue 51 + Red 52 + Green 52 + Blue 52 + Red 53 + Green 53 + Blue 53 + Red 54 + Green 54 + Blue 54 + Red 55 + Green 55 + Blue 55 + Red 56 + Green 56 + Blue 56 + Red 57 + Green 57 + Blue 57 + Red 58 + Green 58 + Blue 58 + Red 59 + Green 59 + Blue 59 + Red 60 + Green 60 + Blue 60 + Red 61 + Green 61 + Blue 61 + Red 62 + Green 62 + Blue 62 + Red 63 + Green 63 + Blue 63 + Red 64 + Green 64 + Blue 64 + + 0 + + + 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 + + + 34 + + + 35 + + + 36 + + + 37 + + + 38 + + + 39 + + + 40 + 41 + 42 + + + 43 + 44 + 45 + + + 46 + 47 + 48 + + + 49 + 50 + 51 + + + 52 + 53 + 54 + + + 55 + 56 + 57 + + + 58 + 59 + 60 + + + 61 + 62 + 63 + + + 64 + 65 + 66 + + + 67 + 68 + 69 + + + 70 + 71 + 72 + + + 73 + 74 + 75 + + + 76 + 77 + 78 + + + 79 + 80 + 81 + + + 82 + 83 + 84 + + + 85 + 86 + 87 + + + 88 + 89 + 90 + + + 91 + 92 + 93 + + + 94 + 95 + 96 + + + 97 + 98 + 99 + + + 100 + 101 + 102 + + + 103 + 104 + 105 + + + 106 + 107 + 108 + + + 109 + 110 + 111 + + + 112 + 113 + 114 + + + 115 + 116 + 117 + + + 118 + 119 + 120 + + + 121 + 122 + 123 + + + 124 + 125 + 126 + + + 127 + 128 + 129 + + + 130 + 131 + 132 + + + 133 + 134 + 135 + + + 136 + 137 + 138 + + + 139 + 140 + 141 + + + 142 + 143 + 144 + + + 145 + 146 + 147 + + + 148 + 149 + 150 + + + 151 + 152 + 153 + + + 154 + 155 + 156 + + + 157 + 158 + 159 + + + 160 + 161 + 162 + + + 163 + 164 + 165 + + + 166 + 167 + 168 + + + 169 + 170 + 171 + + + 172 + 173 + 174 + + + 175 + 176 + 177 + + + 178 + 179 + 180 + + + 181 + 182 + 183 + + + 184 + 185 + 186 + + + 187 + 188 + 189 + + + 190 + 191 + 192 + + + 193 + 194 + 195 + + + 196 + 197 + 198 + + + 199 + 200 + 201 + + + 202 + 203 + 204 + + + 205 + 206 + 207 + + + 208 + 209 + 210 + + + 211 + 212 + 213 + + + 214 + 215 + 216 + + + 217 + 218 + 219 + + + 220 + 221 + 222 + + + 223 + 224 + 225 + + + 226 + 227 + 228 + + + 229 + 230 + 231 + + + + Red + Green + Blue + Strobe, colours + Automatic show white + Running speed of automatic show white + Automatic show RGB + Running speed of automatic show RGB + + + Red + Green + Blue + White + Automatic show white + Running speed of automatic show white + Strobe White + Automatic show RGB + Running speed of automatic show RGB + Strobe RGB + Background Red + Background Green + Background Blue + RGB Direction + + + + + + + + + + diff --git a/resources/fixtures/Varytec/Varytec-LED-Pad-Bar-Compact-ST-RGB.qxf b/resources/fixtures/Varytec/Varytec-LED-Pad-Bar-Compact-ST-RGB.qxf new file mode 100644 index 0000000000..d16a202989 --- /dev/null +++ b/resources/fixtures/Varytec/Varytec-LED-Pad-Bar-Compact-ST-RGB.qxf @@ -0,0 +1,157 @@ + + + + + Q Light Controller Plus + 5.0.0 Beta 3 + Clément Delabroye + + Varytec + LED Pad Bar Compact ST RGB + LED Bar (Beams) + + Effect + No function + Automatic programmes + Stroboscope programmes + Shows + Automatic programmes sound mode + Stroboscope programmes sound mode + Shows sound mode + + + Effect + Sub program select + + + Speed + Program Speed + + + + + + Shutter + Dimmer (0 % to 100 %) + Strobe effect sound mode, increasing speed + Strobe effect, increasing speed + All LEDs on + + + + + + + + + + + + + + + + + + + + + + + + Shutter + Strobe + + + Shutter + Strobe + + + Shutter + Strobe + + + Shutter + Strobe + + + Program select + Sub program select + Program Speed (Slow to fast) + + + Red + Green + Blue + Dimmer & Strobe + Strobe + + + Spot 1 - Red + Spot 1 - Green + Spot 1 - Blue + Spot 1 - Dimmer + Spot 1 - Strobe + Spot 2 - Red + Spot 2 -Green fine + Spot 2 -Blue + Spot 2 -Dimmer + Spot 2 - Strobe + Spot 3 - Red + Spot 3 - Green + Spot 3 - Blue + Spot 3 - Dimmer + Spot 3 - Strobe + Spot 4 - Red + Spot 4 - Green + Spot 4 - Blue + Spot 4 - Dimmer + Spot 4 - Strobe + LED 1 - Strobe + LED 2 - Strobe + LED 3 - Strobe + LED 4 - Strobe + + 0 + 4 + 3 + 2 + 1 + + + 5 + 6 + 7 + 8 + 9 + + + 10 + 11 + 12 + 13 + 14 + + + 15 + 16 + 17 + 18 + 19 + + + 20 + 21 + 22 + 23 + + + + + + + + + + + diff --git a/resources/fixtures/beamZ/beamZ-BAC500.qxf b/resources/fixtures/beamZ/beamZ-BAC500.qxf new file mode 100644 index 0000000000..8c627f40ac --- /dev/null +++ b/resources/fixtures/beamZ/beamZ-BAC500.qxf @@ -0,0 +1,110 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Olivier Michel + + beamZ + BAC500 + Color Changer + + + + + + Intensity + White + Warm white intensity (0 - 100%) + + + + + + + Colour + No function + Red + Green + Blue + White + Warm white + Amber + UV + Yellow + Magenta + Cyan + Dark orange + Green yellow + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Pink + + + Effect + No function + Colour blending (rate) + Colour change (rate) + Sound colour blending (rate) + Sound color change (rate) + + + Effect + No function + White 2700K + White 3200K + White 4300K + White 5600K + White 6500K + White 8000K + + + Red + Green + Blue + + + Dimmer + Strobe + Preset colours + Mode + Colour temperature + + + Red + Green + Blue + White + Warm white + Amber + UV + + + Dimmer + Strobe + Red + Green + Blue + White + Warm white + Amber + UV + Preset colours + Mode + Colour temperature + + + + + + + + + diff --git a/resources/fixtures/beamZ/beamZ-BAC506.qxf b/resources/fixtures/beamZ/beamZ-BAC506.qxf new file mode 100644 index 0000000000..27b1681470 --- /dev/null +++ b/resources/fixtures/beamZ/beamZ-BAC506.qxf @@ -0,0 +1,106 @@ + + + + + Q Light Controller Plus + 4.13.0 + Olivier Michel + + beamZ + BAC506 + Color Changer + + + + + + + + + + Colour + No function + Red + Green + Blue + White + Amber + UV + Yellow + Magenta + Cyan + Dark orange + Green yellow + Salmon + Turquoise + Light green + Orange + Straw + Lavender + Light blue + Dark blue + Pink + + + Effect + No function + Colour blending (rate) + Colour change (rate) + Sound colour blending (rate) + Sound colour change (rate) + + + Effect + No function + White 2700K + White 3200K + White 4300K + White 5600K + White 6500K + White 8000K + + + Dimmer + Preset colours + + + Red + Green + Blue + + + Dimmer + Strobe + Preset colours + Mode + Colour temperature + + + Red + Green + Blue + White + Amber + UV + + + Dimmer + Strobe + Red + Green + Blue + White + Amber + UV + Preset colours + Mode + Colour temperature + + + + + + + + + diff --git a/resources/fixtures/beamZ/beamZ-PS10W.qxf b/resources/fixtures/beamZ/beamZ-PS10W.qxf new file mode 100644 index 0000000000..302fe20168 --- /dev/null +++ b/resources/fixtures/beamZ/beamZ-PS10W.qxf @@ -0,0 +1,49 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Jesper Korsen + + beamZ + PS10W + Color Changer + + + + + + + Shutter + Lamp on + Strobe (Slow to fast) + + + Colour + No function + Colour random, from slow to fast + + + Red + Green + Blue + White + + + Dimmer + Red + Green + Blue + White + Strobe + Auto + + + + + + + + + diff --git a/resources/fixtures/beamZ/beamZ-Radical-II.qxf b/resources/fixtures/beamZ/beamZ-Radical-II.qxf new file mode 100644 index 0000000000..2eca2c5982 --- /dev/null +++ b/resources/fixtures/beamZ/beamZ-Radical-II.qxf @@ -0,0 +1,74 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Matt Muller + + beamZ + Radical II + Scanner + + Effect + No Function + Laser motor clockwise rotation(From slow to fast) + Stop + Laser motor counter clockwise rotation(From slow to fast) + Stop + back and forward movement with increasing speed + + + Pan + Motor location + back and forward movement with increasing speed + + + Colour + No Fuction + Red + Green + Blue + White + Red + Green + Green + Blue + Blue + White + Red + White + Red + Blue + Green + White + Blue + Green + White + Red + Blue + White + Red + Green + White + Red + Green + Blue + All LED on + Rainbow Group effect 1 + Rainbow Group effect 2 + Rainbow Group effect 3 + Rainbow Group effect 4 + Rainbow Group effect 5 + Rainbow Group effect with strobe 1 + Rainbow Group effect with strobe 2 + Rainbow Group effect with strobe 3 + Rainbow Group effect with strobe 4 + Rainbow Group effect with strobe 5 + + + Effect + No function + Auto DMX ( From slow to fast ) + Sound DMX ( From slow to fast ) + + + Laser + Motor rotation + Colours macro + Auto/Sound + + + + + + + + + diff --git a/resources/fixtures/beamZ/beamZ-SB400.qxf b/resources/fixtures/beamZ/beamZ-SB400.qxf new file mode 100644 index 0000000000..5baaf2dd46 --- /dev/null +++ b/resources/fixtures/beamZ/beamZ-SB400.qxf @@ -0,0 +1,45 @@ + + + + + Q Light Controller Plus + 4.13.1 GIT + Dmitry Kolesnikov + + beamZ + SB400 + Strobe + + + + Effect + No function + Macro function + No function + + + Speed + Macro function speed adjustable + + + + + + + Master dimmer + Strobe + Macro + Macro Speed + LED 1 + LED 2 + LED 3 + LED 4 + + + + + + + + + diff --git a/resources/fixtures/lightmaXX/lightmaXX-Vector-ARC-Flood-II.qxf b/resources/fixtures/lightmaXX/lightmaXX-Vector-ARC-Flood-II.qxf new file mode 100644 index 0000000000..877fe53fa5 --- /dev/null +++ b/resources/fixtures/lightmaXX/lightmaXX-Vector-ARC-Flood-II.qxf @@ -0,0 +1,44 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Tolmino Muccitelli + + lightmaXX + Vector ARC Flood II + Color Changer + + + + + + + + + + + Speed + Macro function Speed adjust + + + Master dimmer + Red + Green + Blue + White + Amber + UV + Strobe + Color macro + Macro function Speed adjust + + + + + + + + + diff --git a/resources/gobos/CMakeLists.txt b/resources/gobos/CMakeLists.txt index d601f570f4..c6c3593155 100644 --- a/resources/gobos/CMakeLists.txt +++ b/resources/gobos/CMakeLists.txt @@ -2,4 +2,22 @@ project(gobo) set(GOBO_FILES Chauvet ClayPaky GLP Others Robe SGM SGM-Color) +# Only perform the copy if we're building for Android +if(ANDROID) + # Define the destination directory for the gobo files within the Android package + set(GOBO_ASSETS_DIR "${ANDROID_PACKAGE_SOURCE_DIR}/${GOBODIR}") + + # Loop through each directory and copy it to the assets directory + foreach(GOBO_DIR IN LISTS GOBO_FILES) + # Calculate the full path to the source gobo directory + set(SOURCE_GOBOS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${GOBO_DIR}") + + # Calculate the full path to the destination gobo directory + set(DESTINATION_GOBOS_DIR "${GOBO_ASSETS_DIR}") + + # Copy the gobo directory to the assets directory + file(COPY ${SOURCE_GOBOS_DIR} DESTINATION ${DESTINATION_GOBOS_DIR}) + endforeach() +endif() + install(DIRECTORY ${GOBO_FILES} DESTINATION ${INSTALLROOT}/${GOBODIR}) diff --git a/resources/gobos/Chauvet/gobo00051.svg b/resources/gobos/Chauvet/gobo00051.svg new file mode 100644 index 0000000000..5088f33e52 --- /dev/null +++ b/resources/gobos/Chauvet/gobo00051.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/gobos/Chauvet/gobo00060.png b/resources/gobos/Chauvet/gobo00060.png deleted file mode 100644 index 1b13975e6c..0000000000 Binary files a/resources/gobos/Chauvet/gobo00060.png and /dev/null differ diff --git a/resources/gobos/Chauvet/gobo00060.svg b/resources/gobos/Chauvet/gobo00060.svg new file mode 100644 index 0000000000..fb96d195a1 --- /dev/null +++ b/resources/gobos/Chauvet/gobo00060.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/icons/png/lightning.png b/resources/icons/png/lightning.png new file mode 100644 index 0000000000..9865481225 Binary files /dev/null and b/resources/icons/png/lightning.png differ diff --git a/resources/icons/png/lightning_off.png b/resources/icons/png/lightning_off.png new file mode 100644 index 0000000000..bb1d03d7af Binary files /dev/null and b/resources/icons/png/lightning_off.png differ diff --git a/resources/icons/qlcplus.icns b/resources/icons/qlcplus.icns index c57461df10..a8bb999afe 100644 Binary files a/resources/icons/qlcplus.icns and b/resources/icons/qlcplus.icns differ diff --git a/resources/icons/svg/lightning.svg b/resources/icons/svg/lightning.svg new file mode 100644 index 0000000000..ab0a5b219f --- /dev/null +++ b/resources/icons/svg/lightning.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/svg/lightning_off.svg b/resources/icons/svg/lightning_off.svg new file mode 100644 index 0000000000..97138ea414 --- /dev/null +++ b/resources/icons/svg/lightning_off.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + diff --git a/resources/inputprofiles/Akai-APC40-mkII.qxi b/resources/inputprofiles/Akai-APC40-mkII.qxi index 557b89dcdc..b5c90a47a2 100644 --- a/resources/inputprofiles/Akai-APC40-mkII.qxi +++ b/resources/inputprofiles/Akai-APC40-mkII.qxi @@ -99,202 +99,202 @@ Button 5-1 Button - + Button 5-2 Button - + Button 5-3 Button - + Button 5-4 Button - + Button 5-5 Button - + Button 5-6 Button - + Button 5-7 Button - + Button 5-8 Button - + Button 4-1 Button - + Button 4-2 Button - + Button 4-3 Button - + Button 4-4 Button - + Button 4-5 Button - + Button 4-6 Button - + Button 4-7 Button - + Button 4-8 Button - + Button 3-1 Button - + Button 3-2 Button - + Button 3-3 Button - + Button 3-4 Button - + Button 3-5 Button - + Button 3-6 Button - + Button 3-7 Button - + Button 3-8 Button - + Button 2-1 Button - + Button 2-2 Button - + Button 2-3 Button - + Button 2-4 Button - + Button 2-5 Button - + Button 2-6 Button - + Button 2-7 Button - + Button 2-8 Button - + Button 1-1 Button - + Button 1-2 Button - + Button 1-3 Button - + Button 1-4 Button - + Button 1-5 Button - + Button 1-6 Button - + Button 1-7 Button - + Button 1-8 Button - + R 1 @@ -355,7 +355,7 @@ Master Button - + Stop all clips diff --git a/resources/inputprofiles/Akai-APCMini-mk2.qxi b/resources/inputprofiles/Akai-APCMini-mk2.qxi index 0a3e727d1d..44a30c2ecb 100644 --- a/resources/inputprofiles/Akai-APCMini-mk2.qxi +++ b/resources/inputprofiles/Akai-APCMini-mk2.qxi @@ -48,406 +48,554 @@ Button 1-8 Button - + Button 2-8 Button - + Button 3-8 Button - + Button 4-8 Button - + Button 5-8 Button - + Button 6-8 Button - + Button 7-8 Button - + Button 8-8 Button - + Button 1-7 Button - + Button 2-7 Button - + Button 3-7 Button - + Button 4-7 Button - + Button 5-7 Button - + Button 6-7 Button - + Button 7-7 Button - + Button 8-7 Button - + Button 1-6 Button - + Button 2-6 Button - + Button 3-6 Button - + Button 4-6 Button - + Button 5-6 Button - + Button 6-6 Button - + Button 7-6 Button - + Button 8-6 Button - + Button 1-5 Button - + Button 2-5 Button - + Button 3-5 Button - + Button 4-5 Button - + Button 5-5 Button - + Button 6-5 Button - + Button 7-5 Button - + Button 8-5 Button - + Button 1-4 Button - + Button 2-4 Button - + Button 3-4 Button - + Button 4-4 Button - + Button 5-4 Button - + Button 6-4 Button - + Button 7-4 Button - + Button 8-4 Button - + Button 1-3 Button - + Button 2-3 Button - + Button 3-3 Button - + Button 4-3 Button - + Button 5-3 Button - + Button 6-3 Button - + Button 7-3 Button - + Button 8-3 Button - + Button 1-2 Button - + Button 2-2 Button - + Button 3-2 Button - + Button 4-2 Button - + Button 5-2 Button - + Button 6-2 Button - + Button 7-2 Button - + Button 8-2 Button - + Button 1-1 Button - + Button 2-1 Button - + Button 3-1 Button - + Button 4-1 Button - + Button 5-1 Button - + Button 6-1 Button - + Button 7-1 Button - + Button 8-1 Button - + Volume Button Button - + Pan Button Button - + Send Button Button - + Device Button Button - + Up Button Button - + Down Button Button - + Left Button Button - + Right Button Button - + Clip stop Button Button - + Solo Button Button - + Mute Button Button - + Rec arm Button Button - + Select Button Button - + Drum Button Button - + Note Button Button - + Stop all clips Button Button - + Shift Button Button - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/inputprofiles/Akai-APCMini.qxi b/resources/inputprofiles/Akai-APCMini.qxi index 25ba13734e..1af7e7918e 100644 --- a/resources/inputprofiles/Akai-APCMini.qxi +++ b/resources/inputprofiles/Akai-APCMini.qxi @@ -3,7 +3,7 @@ Q Light Controller Plus - 4.8.0 + 4.13.0 Maikel Boerebach Akai @@ -370,4 +370,14 @@ Shift Button Button + + + + + + + + + + diff --git a/resources/inputprofiles/CMakeLists.txt b/resources/inputprofiles/CMakeLists.txt index 0b3d1d8914..20ca4428a3 100644 --- a/resources/inputprofiles/CMakeLists.txt +++ b/resources/inputprofiles/CMakeLists.txt @@ -2,4 +2,18 @@ project(profiles) file(GLOB PROFILE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.qxi") +# Only perform the copy if we're building for Android +if(ANDROID) + # Define the destination directory for the profile files within the Android package + set(PROFILES_ASSETS_DIR "${ANDROID_PACKAGE_SOURCE_DIR}/${INPUTPROFILEDIR}") + + # Create the profiles assets directory if it doesn't exist + file(MAKE_DIRECTORY ${PROFILES_ASSETS_DIR}) + + # Copy the profile .qxi files to the assets directory + foreach(PROFILE_FILE IN LISTS PROFILE_FILES) + file(COPY ${PROFILE_FILE} DESTINATION ${PROFILES_ASSETS_DIR}) + endforeach() +endif() + install(FILES ${PROFILE_FILES} DESTINATION ${INSTALLROOT}/${INPUTPROFILEDIR}) \ No newline at end of file diff --git a/resources/inputprofiles/Novation-LaunchPadMiniMK3.qxi b/resources/inputprofiles/Novation-LaunchPadMiniMK3.qxi index d4fef4c79f..b3cbdff10e 100644 --- a/resources/inputprofiles/Novation-LaunchPadMiniMK3.qxi +++ b/resources/inputprofiles/Novation-LaunchPadMiniMK3.qxi @@ -12,406 +12,406 @@ Stop Solo Mute Button - + Row 2 Arrow Button - + Row 3 Arrow Button - + Row 4 Arrow Button - + Row 5 Arrow Button - + Row 6 Arrow Button - + Row 7 Arrow Button - + Row 8 Arrow Button - + Up Button - + Down Button - + Left Button - + Right Button - + Session Button - + Drums Button - + Keys Button - + User Button - + Logo Button - + Pad 1-1 Button - + Pad 1-2 Button - + Pad 1-3 Button - + Pad 1-4 Button - + Pad 1-5 Button - + Pad 1-6 Button - + Pad 1-7 Button - + Pad 1-8 Button - + Pad 2-1 Button - + Pad 2-2 Button - + Pad 2-3 Button - + Pad 2-4 Button - + Pad 2-5 Button - + Pad 2-6 Button - + Pad 2-7 Button - + Pad 2-8 Button - + Pad 3-1 Button - + Pad 3-2 Button - + Pad 3-3 Button - + Pad 3-4 Button - + Pad 3-5 Button - + Pad 3-6 Button - + Pad 3-7 Button - + Pad 3-8 Button - + Pad 4-1 Button - + Pad 4-2 Button - + Pad 4-3 Button - + Pad 4-4 Button - + Pad 4-5 Button - + Pad 4-6 Button - + Pad 4-7 Button - + Pad 4-8 Button - + Pad 5-1 Button - + Pad 5-2 Button - + Pad 5-3 Button - + Pad 5-4 Button - + Pad 5-5 Button - + Pad 5-6 Button - + Pad 5-7 Button - + Pad 5-8 Button - + Pad 6-1 Button - + Pad 6-2 Button - + Pad 6-3 Button - + Pad 6-4 Button - + Pad 6-5 Button - + Pad 6-6 Button - + Pad 6-7 Button - + Pad 6-8 Button - + Pad 7-1 Button - + Pad 7-2 Button - + Pad 7-3 Button - + Pad 7-4 Button - + Pad 7-5 Button - + Pad 7-6 Button - + Pad 7-7 Button - + Pad 7-8 Button - + Pad 8-1 Button - + Pad 8-2 Button - + Pad 8-3 Button - + Pad 8-4 Button - + Pad 8-5 Button - + Pad 8-6 Button - + Pad 8-7 Button - + Pad 8-8 Button - + diff --git a/resources/inputprofiles/Worlde-Easypad.12.qxi b/resources/inputprofiles/Worlde-Easypad.12.qxi new file mode 100644 index 0000000000..3c715e5581 --- /dev/null +++ b/resources/inputprofiles/Worlde-Easypad.12.qxi @@ -0,0 +1,96 @@ + + + + + Q Light Controller Plus + 4.13.0 GIT + Christoph Müllner + + Worlde + Easypad.12 + MIDI + + XY Fader + Slider + + + Record + Button + + + Play + Button + + + Stop + Button + + + Back + Button + + + Next + Button + + + Refresh + Button + + + Left + Button + + + Right + Button + + + Pad 7 + Button + + + Pad 8 + Button + + + Pad 1 + Button + + + Pad 9 + Button + + + Pad 10 + Button + + + Pad 4 + Button + + + Pad 11 + Button + + + Pad 3 + Button + + + Pad 12 + Button + + + Pad 2 + Button + + + Pad 6 + Button + + + Pad 5 + Button + + diff --git a/resources/inputprofiles/Worlde-OrcaPAD16.qxi b/resources/inputprofiles/Worlde-OrcaPAD16.qxi new file mode 100644 index 0000000000..d25fd99081 --- /dev/null +++ b/resources/inputprofiles/Worlde-OrcaPAD16.qxi @@ -0,0 +1,101 @@ + + + + + Q Light Controller Plus + 4.13.0 + Massimo Callegari + + Worlde + Orca PAD16 + MIDI + False + + R1 + Knob + + + R2 + Knob + + + R3 + Knob + + + R4 + Knob + + + R5 + Knob + + + R6 + Knob + + + PAD1 + Button + + + PAD2 + Button + + + PAD3 + Button + + + PAD4 + Button + + + PAD5 + Button + + + PAD6 + Button + + + PAD7 + Button + + + PAD8 + Button + + + PAD9 + Button + + + PAD10 + Button + + + PAD11 + Button + + + PAD12 + Button + + + PAD13 + Button + + + PAD14 + Button + + + PAD15 + Button + + + PAD16 + Button + + diff --git a/resources/meshes/fixtures/CMakeLists.txt b/resources/meshes/fixtures/CMakeLists.txt index f69efed064..37caf67ec2 100644 --- a/resources/meshes/fixtures/CMakeLists.txt +++ b/resources/meshes/fixtures/CMakeLists.txt @@ -2,4 +2,18 @@ project(fixture_meshes) file(GLOB FIXTURE_MESH_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.dae") +# Only perform the copy if we're building for Android +if(ANDROID) + # Define the destination directory for the fixture mesh files within the Android package + set(FIXTURE_MESHES_ASSETS_DIR "${ANDROID_PACKAGE_SOURCE_DIR}/${MESHESDIR}/fixtures") + + # Create the fixture meshes assets directory if it doesn't exist + file(MAKE_DIRECTORY ${FIXTURE_MESHES_ASSETS_DIR}) + + # Copy the fixture mesh .dae files to the assets directory + foreach(FIXTURE_MESH_FILE IN LISTS FIXTURE_MESH_FILES) + file(COPY ${FIXTURE_MESH_FILE} DESTINATION ${FIXTURE_MESHES_ASSETS_DIR}) + endforeach() +endif() + install(FILES ${FIXTURE_MESH_FILES} DESTINATION ${INSTALLROOT}/${MESHESDIR}/fixtures) \ No newline at end of file diff --git a/resources/meshes/generic/CMakeLists.txt b/resources/meshes/generic/CMakeLists.txt index c6675cd7d4..6c3b384abb 100644 --- a/resources/meshes/generic/CMakeLists.txt +++ b/resources/meshes/generic/CMakeLists.txt @@ -2,4 +2,18 @@ project(generic_meshes) file(GLOB GENERIC_MESH_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.obj") +# Only perform the copy if we're building for Android +if(ANDROID) + # Define the destination directory for the generic mesh files within the Android package + set(GENERIC_MESHES_ASSETS_DIR "${ANDROID_PACKAGE_SOURCE_DIR}/${MESHESDIR}/generic") + + # Create the generic meshes assets directory if it doesn't exist + file(MAKE_DIRECTORY ${GENERIC_MESHES_ASSETS_DIR}) + + # Copy the generic mesh .obj files to the assets directory + foreach(GENERIC_MESH_FILE IN LISTS GENERIC_MESH_FILES) + file(COPY ${GENERIC_MESH_FILE} DESTINATION ${GENERIC_MESHES_ASSETS_DIR}) + endforeach() +endif() + install(FILES ${GENERIC_MESH_FILES} DESTINATION ${INSTALLROOT}/${MESHESDIR}/generic) \ No newline at end of file diff --git a/resources/meshes/stage/CMakeLists.txt b/resources/meshes/stage/CMakeLists.txt index f69501c915..ff879832ee 100644 --- a/resources/meshes/stage/CMakeLists.txt +++ b/resources/meshes/stage/CMakeLists.txt @@ -2,4 +2,18 @@ project(stage_meshes) file(GLOB STAGE_MESH_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.obj") +# Only perform the copy if we're building for Android +if(ANDROID) + # Define the destination directory for the stage mesh files within the Android package + set(STAGE_MESHES_ASSETS_DIR "${ANDROID_PACKAGE_SOURCE_DIR}/${MESHESDIR}/stage") + + # Create the stage meshes assets directory if it doesn't exist + file(MAKE_DIRECTORY ${STAGE_MESHES_ASSETS_DIR}) + + # Copy the stage mesh .obj files to the assets directory + foreach(STAGE_MESH_FILE IN LISTS STAGE_MESH_FILES) + file(COPY ${STAGE_MESH_FILE} DESTINATION ${STAGE_MESHES_ASSETS_DIR}) + endforeach() +endif() + install(FILES ${STAGE_MESH_FILES} DESTINATION ${INSTALLROOT}/${MESHESDIR}/stage) \ No newline at end of file diff --git a/resources/miditemplates/CMakeLists.txt b/resources/miditemplates/CMakeLists.txt index b8944b099c..4cd9a87b68 100644 --- a/resources/miditemplates/CMakeLists.txt +++ b/resources/miditemplates/CMakeLists.txt @@ -2,4 +2,18 @@ project(miditemplates) file(GLOB MIDITEMPLATE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.qxm") +# Only perform the copy if we're building for Android +if(ANDROID) + # Define the destination directory for the miditemplate files within the Android package + set(MIDITEMPLATES_ASSETS_DIR "${ANDROID_PACKAGE_SOURCE_DIR}/${MIDITEMPLATEDIR}") + + # Create the miditemplates assets directory if it doesn't exist + file(MAKE_DIRECTORY ${MIDITEMPLATES_ASSETS_DIR}) + + # Copy the miditemplate .qxm files to the assets directory + foreach(MIDITEMPLATE_FILE IN LISTS MIDITEMPLATE_FILES) + file(COPY ${MIDITEMPLATE_FILE} DESTINATION ${MIDITEMPLATES_ASSETS_DIR}) + endforeach() +endif() + install(FILES ${MIDITEMPLATE_FILES} DESTINATION ${INSTALLROOT}/${MIDITEMPLATEDIR}) \ No newline at end of file diff --git a/resources/modifierstemplates/CMakeLists.txt b/resources/modifierstemplates/CMakeLists.txt index 001068d9ee..5ff28a0698 100644 --- a/resources/modifierstemplates/CMakeLists.txt +++ b/resources/modifierstemplates/CMakeLists.txt @@ -2,4 +2,18 @@ project(modtemplates) file(GLOB MODTEMPLATE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.qxmt") +# Only perform the copy if we're building for Android +if(ANDROID) + # Define the destination directory for the modtemplate files within the Android package + set(MODTEMPLATES_ASSETS_DIR "${ANDROID_PACKAGE_SOURCE_DIR}/${MODIFIERSTEMPLATEDIR}") + + # Create the modtemplates assets directory if it doesn't exist + file(MAKE_DIRECTORY ${MODTEMPLATES_ASSETS_DIR}) + + # Copy the modtemplate .qxmt files to the assets directory + foreach(MODTEMPLATE_FILE IN LISTS MODTEMPLATE_FILES) + file(COPY ${MODTEMPLATE_FILE} DESTINATION ${MODTEMPLATES_ASSETS_DIR}) + endforeach() +endif() + install(FILES ${MODTEMPLATE_FILES} DESTINATION ${INSTALLROOT}/${MODIFIERSTEMPLATEDIR}) \ No newline at end of file diff --git a/resources/rgbscripts/CMakeLists.txt b/resources/rgbscripts/CMakeLists.txt index acd4510d1b..2089106f74 100644 --- a/resources/rgbscripts/CMakeLists.txt +++ b/resources/rgbscripts/CMakeLists.txt @@ -42,4 +42,18 @@ set(SCRIPT_FILES waves.js ) +# Only perform the copy if we're building for Android +if(ANDROID) + # Define the destination directory for the script files within the Android package + set(SCRIPTS_ASSETS_DIR "${ANDROID_PACKAGE_SOURCE_DIR}/${INSTALLROOT}/${RGBSCRIPTDIR}") + + # Create the scripts assets directory if it doesn't exist + file(MAKE_DIRECTORY ${SCRIPTS_ASSETS_DIR}) + + # Copy the script files to the assets directory + foreach(SCRIPT_FILE IN LISTS SCRIPT_FILES) + file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/${SCRIPT_FILE} DESTINATION ${SCRIPTS_ASSETS_DIR}) + endforeach() +endif() + install(FILES ${SCRIPT_FILES} DESTINATION ${INSTALLROOT}/${RGBSCRIPTDIR}) diff --git a/resources/samples/CMakeLists.txt b/resources/samples/CMakeLists.txt index b3a2ba2a0c..c1caac94ad 100644 --- a/resources/samples/CMakeLists.txt +++ b/resources/samples/CMakeLists.txt @@ -2,4 +2,18 @@ project(samples) file(GLOB SAMPLE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.qxw") -install(FILES ${SAMPLE_FILES} DESTINATION ${SAMPLESDIR}) \ No newline at end of file +# Only perform the copy if we're building for Android +if(ANDROID) + # Define the destination directory for the sample files within the Android package + set(SAMPLES_ASSETS_DIR "${ANDROID_PACKAGE_SOURCE_DIR}/${SAMPLESDIR}") + + # Create the samples assets directory if it doesn't exist + file(MAKE_DIRECTORY ${SAMPLES_ASSETS_DIR}) + + # Copy the sample .qxw files to the assets directory + foreach(SAMPLE_FILE ${SAMPLE_FILES}) + file(COPY ${SAMPLE_FILE} DESTINATION ${SAMPLES_ASSETS_DIR}) + endforeach() +endif() + +install(FILES ${SAMPLE_FILES} DESTINATION ${SAMPLESDIR}) diff --git a/ui/src/CMakeLists.txt b/ui/src/CMakeLists.txt index 21c4e8a265..d7781d0af3 100644 --- a/ui/src/CMakeLists.txt +++ b/ui/src/CMakeLists.txt @@ -60,8 +60,8 @@ add_library(${module_name} createfixturegroup.cpp createfixturegroup.h createfixturegroup.ui ctkrangeslider.cpp ctkrangeslider.h cuestackmodel.cpp cuestackmodel.h + customfeedbackdialog.cpp customfeedbackdialog.h customfeedbackdialog.ui dmxdumpfactory.cpp dmxdumpfactory.h dmxdumpfactory.ui - docbrowser.cpp docbrowser.h efxeditor.cpp efxeditor.h efxeditor.ui efxpreviewarea.cpp efxpreviewarea.h fixtureconsole.cpp fixtureconsole.h @@ -434,6 +434,12 @@ set_source_files_properties("../../resources/icons/png/ledbar_beams.png" set_source_files_properties("../../resources/icons/png/ledbar_pixels.png" PROPERTIES QT_RESOURCE_ALIAS "ledbar_pixels.png" ) +set_source_files_properties("../../resources/icons/png/lightning.png" + PROPERTIES QT_RESOURCE_ALIAS "lightning.png" +) +set_source_files_properties("../../resources/icons/png/lightning_off.png" + PROPERTIES QT_RESOURCE_ALIAS "lightning_off.png" +) set_source_files_properties("../../resources/icons/png/liveedit.png" PROPERTIES QT_RESOURCE_ALIAS "liveedit.png" ) @@ -678,6 +684,8 @@ set(qlcui_resource_files "../../resources/icons/png/laser.png" "../../resources/icons/png/ledbar_beams.png" "../../resources/icons/png/ledbar_pixels.png" + "../../resources/icons/png/lightning.png" + "../../resources/icons/png/lightning_off.png" "../../resources/icons/png/liveedit.png" "../../resources/icons/png/liveedit_vc.png" "../../resources/icons/png/lock.png" diff --git a/ui/src/addchannelsgroup.h b/ui/src/addchannelsgroup.h index 4482deb9a9..fd9f2c7a6d 100644 --- a/ui/src/addchannelsgroup.h +++ b/ui/src/addchannelsgroup.h @@ -23,7 +23,6 @@ #include #include "ui_addchannelsgroup.h" -#include "qlcinputsource.h" class InputSelectionWidget; class ChannelsGroup; @@ -55,8 +54,8 @@ class AddChannelsGroup : public QDialog, public Ui_AddChannelsGroup void accept(); private: - Doc* m_doc; - ChannelsGroup* m_chansGroup; + Doc *m_doc; + ChannelsGroup *m_chansGroup; InputSelectionWidget *m_inputSelWidget; protected: diff --git a/ui/src/addfixture.cpp b/ui/src/addfixture.cpp index 948e64f675..d9fa15add5 100644 --- a/ui/src/addfixture.cpp +++ b/ui/src/addfixture.cpp @@ -72,8 +72,8 @@ AddFixture::AddFixture(QWidget* parent, const Doc* doc, const Fixture* fxi) this, SLOT(slotSelectionChanged())); connect(m_tree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(slotTreeDoubleClicked(QTreeWidgetItem*))); - connect(m_modeCombo, SIGNAL(activated(const QString&)), - this, SLOT(slotModeActivated(const QString&))); + connect(m_modeCombo, SIGNAL(activated(int)), + this, SLOT(slotModeActivated(int))); connect(m_universeCombo, SIGNAL(activated(int)), this, SLOT(slotUniverseActivated(int))); connect(m_addressSpin, SIGNAL(valueChanged(int)), @@ -130,7 +130,7 @@ AddFixture::AddFixture(QWidget* parent, const Doc* doc, const Fixture* fxi) { m_channelsSpin->setValue(fxi->channels()); m_modeCombo->setCurrentIndex(index); - slotModeActivated(m_modeCombo->itemText(index)); + slotModeActivated(index); } } else @@ -347,7 +347,7 @@ void AddFixture::fillModeCombo(const QString& text) /* Select the first mode by default */ m_modeCombo->setCurrentIndex(0); - slotModeActivated(m_modeCombo->currentText()); + slotModeActivated(0); } } @@ -445,12 +445,12 @@ bool AddFixture::checkAddressAvailability(int value, int channels) * Slots *****************************************************************************/ -void AddFixture::slotModeActivated(const QString& modeName) +void AddFixture::slotModeActivated(int modeIndex) { if (m_fixtureDef == NULL) return; - m_mode = m_fixtureDef->mode(modeName); + m_mode = m_fixtureDef->modes().at(modeIndex); if (m_mode == NULL) { /* Generic dimmers don't have modes, so bail out */ diff --git a/ui/src/addfixture.h b/ui/src/addfixture.h index e8e3d7d82a..840733355d 100644 --- a/ui/src/addfixture.h +++ b/ui/src/addfixture.h @@ -164,7 +164,7 @@ class AddFixture : public QDialog, public Ui_AddFixture *********************************************************************/ protected slots: /** Callback for mode selection changes */ - void slotModeActivated(const QString& modeName); + void slotModeActivated(int modeIndex); /** Callback for universe combo activations */ void slotUniverseActivated(int universe); diff --git a/ui/src/app.cpp b/ui/src/app.cpp index 03a44b6c32..70d06416ca 100644 --- a/ui/src/app.cpp +++ b/ui/src/app.cpp @@ -39,7 +39,6 @@ #include "mastertimer.h" #include "addresstool.h" #include "simpledesk.h" -#include "docbrowser.h" #include "aboutbox.h" #include "monitor.h" #include "vcframe.h" @@ -1198,7 +1197,7 @@ void App::slotControlFullScreen(bool usingGeometry) void App::slotHelpIndex() { - DocBrowser::createAndShow(this); + QDesktopServices::openUrl(QUrl("https://docs.qlcplus.org/")); } void App::slotHelpAbout() diff --git a/ui/src/app.h b/ui/src/app.h index 4a6a27b4c5..600e762266 100644 --- a/ui/src/app.h +++ b/ui/src/app.h @@ -31,6 +31,7 @@ #include "doc.h" class QProgressDialog; +class VideoProvider; class QMessageBox; class QToolButton; class QFileDialog; @@ -42,10 +43,6 @@ class QAction; class QLabel; class App; -#if QT_VERSION >= 0x050000 -class VideoProvider; -#endif - /** @addtogroup ui UI * @{ */ @@ -212,9 +209,7 @@ public slots: *********************************************************************/ private: DmxDumpFactoryProperties *m_dumpProperties; -#if QT_VERSION >= 0x050000 VideoProvider *m_videoProvider; -#endif /********************************************************************* * Load & Save diff --git a/ui/src/audiobar.cpp b/ui/src/audiobar.cpp index ec46f5fc98..33b47c817a 100644 --- a/ui/src/audiobar.cpp +++ b/ui/src/audiobar.cpp @@ -191,7 +191,7 @@ void AudioBar::checkWidgetFunctionality() else if (m_widget->type() == VCWidget::SliderWidget) { VCSlider *slider = (VCSlider *)m_widget; - slider->setSliderValue(m_value); + slider->setSliderValue(m_value, true, true); } else if (m_widget->type() == VCWidget::SpeedDialWidget) { @@ -270,7 +270,16 @@ bool AudioBar::loadXML(QXmlStreamReader &root, Doc *doc) break; case AudioBar::DMXBar: { - root.readNextStartElement(); + QXmlStreamReader::TokenType tType = root.readNext(); + + if (tType == QXmlStreamReader::EndElement) + { + root.readNext(); + return true; + } + + if (tType == QXmlStreamReader::Characters) + root.readNext(); if (root.name() == KXMLQLCAudioBarDMXChannels) { diff --git a/ui/src/clickandgowidget.cpp b/ui/src/clickandgowidget.cpp index c75daedcb5..4cd5806fc7 100644 --- a/ui/src/clickandgowidget.cpp +++ b/ui/src/clickandgowidget.cpp @@ -55,6 +55,8 @@ ClickAndGoWidget::ClickAndGoWidget(QWidget *parent) : m_cellBarXpos = 1; m_cellBarYpos = 1; m_cellBarWidth = 0; + m_levelLowLimit = 0; + m_levelHighLimit = 255; } void ClickAndGoWidget::setupGradient(QColor begin, QColor end) @@ -146,6 +148,16 @@ void ClickAndGoWidget::setType(int type, const QLCChannel *chan) m_type = type; } +void ClickAndGoWidget::setLevelLowLimit(int min) +{ + this->m_levelLowLimit = min; +} + +void ClickAndGoWidget::setLevelHighLimit(int max) +{ + this->m_levelHighLimit = max; +} + int ClickAndGoWidget::getType() { return m_type; @@ -212,7 +224,7 @@ QImage ClickAndGoWidget::getImageFromValue(uchar value) { foreach (PresetResource res, m_resources) { - if (value >= res.m_min && value <= res.m_max) + if (value >= res.m_resLowLimit && value <= res.m_resHighLimit) return res.m_thumbnail; } } @@ -315,6 +327,8 @@ void ClickAndGoWidget::setupPresetPicker() for (int i = 0; i < m_resources.size(); i++) { PresetResource res = m_resources.at(i); + if (res.m_resLowLimit > m_levelHighLimit || res.m_resHighLimit < m_levelLowLimit) + continue; painter.setPen(Qt::black); painter.drawRect(x, y, m_cellWidth, CELL_H); painter.drawImage(x + 1, y + 4, res.m_thumbnail); @@ -355,13 +369,13 @@ void ClickAndGoWidget::mousePressEvent(QMouseEvent *event) if (m_hoverCellIdx >= 0 && m_hoverCellIdx < m_resources.length()) { PresetResource res = m_resources.at(m_hoverCellIdx); - qDebug() << "Mouse press. cellW: " << m_cellBarWidth << "min: " << res.m_min << "max:" << res.m_max; + qDebug() << "Mouse press. cellW: " << m_cellBarWidth << "min: " << res.m_resLowLimit << "max:" << res.m_resHighLimit; float f = SCALE(float(m_cellBarWidth), float(0), float(m_cellWidth), - float(0), float(res.m_max - res.m_min)); - emit levelAndPresetChanged((uchar)f + res.m_min, res.m_thumbnail); + float(0), float(res.m_resHighLimit - res.m_resLowLimit)); + emit levelAndPresetChanged((uchar)f + res.m_resLowLimit, res.m_thumbnail); } } QWidget::mousePressEvent(event); @@ -421,8 +435,8 @@ void ClickAndGoWidget::paintEvent(QPaintEvent *event) ClickAndGoWidget::PresetResource::PresetResource(QString path, QString text, uchar min, uchar max) { m_descr = text; - m_min = min; - m_max = max; + m_resLowLimit = min; + m_resHighLimit = max; QImage px(path); m_thumbnail = QImage(40, 40, QImage::Format_RGB32); m_thumbnail.fill(Qt::white); @@ -436,8 +450,8 @@ ClickAndGoWidget::PresetResource::PresetResource(QColor color1, QColor color2, QString text, uchar min, uchar max) { m_descr = text; - m_min = min; - m_max = max; + m_resLowLimit = min; + m_resHighLimit = max; m_thumbnail = QImage(40, 40, QImage::Format_RGB32); if (color2.isValid() == false) m_thumbnail.fill(color1.rgb()); @@ -453,8 +467,8 @@ ClickAndGoWidget::PresetResource::PresetResource(QColor color1, QColor color2, ClickAndGoWidget::PresetResource::PresetResource(int index, QString text, uchar min, uchar max) { m_descr = text; - m_min = min; - m_max = max; + m_resLowLimit = min; + m_resHighLimit = max; m_thumbnail = QImage(40, 40, QImage::Format_RGB32); m_thumbnail.fill(Qt::white); QFont tfont = QApplication::font(); diff --git a/ui/src/clickandgowidget.h b/ui/src/clickandgowidget.h index 01e5bdddde..b802fb0be0 100644 --- a/ui/src/clickandgowidget.h +++ b/ui/src/clickandgowidget.h @@ -64,6 +64,12 @@ class ClickAndGoWidget : public QWidget */ int getType(); + /** Set the low limits from the fader as a preset filter */ + void setLevelLowLimit(int min); + + /** Set the high limits from the fader as a preset filter */ + void setLevelHighLimit(int max); + /** * Returns the color at pos position. * Used with primary colors linear gradient @@ -123,8 +129,8 @@ class ClickAndGoWidget : public QWidget public: QImage m_thumbnail; QString m_descr; - uchar m_min; - uchar m_max; + int m_resLowLimit; + int m_resHighLimit; }; protected: @@ -145,6 +151,10 @@ class ClickAndGoWidget : public QWidget QString m_title; QList m_resources; + /** Fader limits to also limit the presets */ + int m_levelLowLimit; + int m_levelHighLimit; + /** Used to group all the primary colors */ bool m_linearColor; diff --git a/ui/src/consolechannel.cpp b/ui/src/consolechannel.cpp index b075b136bb..4fa56b2c39 100644 --- a/ui/src/consolechannel.cpp +++ b/ui/src/consolechannel.cpp @@ -592,7 +592,11 @@ QIcon ConsoleChannel::colorIcon(const QString& name) index = colorList.indexOf(colname); if (index != -1) { +#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0) color.setNamedColor(colname); +#else + color.fromString(colname); +#endif } else { @@ -609,7 +613,13 @@ QIcon ConsoleChannel::colorIcon(const QString& name) QRegularExpression regex(re, QRegularExpression::CaseInsensitiveOption); index = colorList.indexOf(regex); if (index != -1) + { +#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0) color.setNamedColor(colorList.at(index)); +#else + color.fromString(colorList.at(index)); +#endif + } } if (color.isValid() == true) diff --git a/ui/src/customfeedbackdialog.cpp b/ui/src/customfeedbackdialog.cpp new file mode 100644 index 0000000000..7e3b57fd61 --- /dev/null +++ b/ui/src/customfeedbackdialog.cpp @@ -0,0 +1,200 @@ +/* + Q Light Controller Plus + customfeedbackdialog.cpp + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "customfeedbackdialog.h" +#include "qlcinputchannel.h" +#include "qlcinputsource.h" +#include "doc.h" + +CustomFeedbackDialog::CustomFeedbackDialog(Doc *doc, const QSharedPointer &source, QWidget *parent) + : QDialog(parent) + , m_doc(doc) + , m_profile(NULL) + , m_inputSource(source) + , m_selectedFeedback(None) +{ + setupUi(this); + + bool enableControls = source.isNull() ? false : true; + + if (enableControls) + { + m_lowerSpin->setValue(m_inputSource->feedbackValue(QLCInputFeedback::LowerValue)); + m_upperSpin->setValue(m_inputSource->feedbackValue(QLCInputFeedback::UpperValue)); + m_monitorSpin->setValue(m_inputSource->feedbackValue(QLCInputFeedback::MonitorValue)); + } + + m_lowerSpin->setEnabled(enableControls); + m_upperSpin->setEnabled(enableControls); + + m_monitorLabel->setVisible(false); + m_monitorSpin->setVisible(false); + m_monitorChannelCombo->setVisible(false); + m_profileColorsTree->setVisible(false); + m_midiChannelGroup->hide(); + + if (enableControls) + { + InputPatch *ip = m_doc->inputOutputMap()->inputPatch(m_inputSource->universe()); + if (ip != NULL && ip->profile() != NULL) + { + m_profile = ip->profile(); + if (m_profile->hasColorTable()) + { + m_lowerColor->setVisible(true); + m_upperColor->setVisible(true); + + QMapIterator > it(m_profile->colorTable()); + while (it.hasNext() == true) + { + it.next(); + QPair lc = it.value(); + QTreeWidgetItem *item = new QTreeWidgetItem(m_profileColorsTree); + item->setText(0, QString::number(it.key())); + item->setText(1, lc.first); + + QLabel *colLabel = new QLabel(); + colLabel->setStyleSheet(QString("background-color: %1").arg(lc.second.name())); + + if (it.key() == m_inputSource->feedbackValue(QLCInputFeedback::LowerValue)) + m_lowerColor->setStyleSheet(QString("background-color: %1").arg(lc.second.name())); + + if (it.key() == m_inputSource->feedbackValue(QLCInputFeedback::UpperValue)) + m_upperColor->setStyleSheet(QString("background-color: %1").arg(lc.second.name())); + + if (it.key() == m_inputSource->feedbackValue(QLCInputFeedback::MonitorValue)) + m_monitorColor->setStyleSheet(QString("background-color: %1").arg(lc.second.name())); + + m_profileColorsTree->setItemWidget(item, 2, colLabel); + } + } + if (m_profile->type() == QLCInputProfile::MIDI && m_profile->hasMidiChannelTable()) + { + m_midiChannelGroup->show(); + m_lowerChannelCombo->addItem(tr("From plugin settings")); + m_upperChannelCombo->addItem(tr("From plugin settings")); + m_monitorChannelCombo->addItem(tr("From plugin settings")); + + QMapIterator it(m_profile->midiChannelTable()); + while (it.hasNext() == true) + { + it.next(); + m_lowerChannelCombo->addItem(it.value()); + m_upperChannelCombo->addItem(it.value()); + m_monitorChannelCombo->addItem(it.value()); + } + + QVariant extraParams = m_inputSource->feedbackExtraParams(QLCInputFeedback::LowerValue); + if (extraParams.isValid()) + m_lowerChannelCombo->setCurrentIndex(extraParams.toInt() + 1); + + extraParams = m_inputSource->feedbackExtraParams(QLCInputFeedback::UpperValue); + if (extraParams.isValid()) + m_upperChannelCombo->setCurrentIndex(extraParams.toInt() + 1); + + extraParams = m_inputSource->feedbackExtraParams(QLCInputFeedback::MonitorValue); + if (extraParams.isValid()) + m_monitorChannelCombo->setCurrentIndex(extraParams.toInt() + 1); + } + } + } + + // connect signals + connect(m_lowerColor, SIGNAL(clicked()), + this, SLOT(slotLowerColorButtonClicked())); + connect(m_upperColor, SIGNAL(clicked()), + this, SLOT(slotUpperColorButtonClicked())); + connect(m_monitorColor, SIGNAL(clicked()), + this, SLOT(slotMonitorColorButtonClicked())); + connect(m_profileColorsTree, SIGNAL(itemClicked(QTreeWidgetItem *, int)), + this, SLOT(slotColorSelected(QTreeWidgetItem *))); +} + +CustomFeedbackDialog::~CustomFeedbackDialog() +{ +} + +void CustomFeedbackDialog::setMonitoringVisibility(bool visible) +{ + m_monitorLabel->setVisible(visible); + m_monitorSpin->setVisible(visible); + m_monitorChannelCombo->setVisible(visible); +} + +void CustomFeedbackDialog::accept() +{ + if (m_inputSource.isNull()) + return; + + m_inputSource->setFeedbackValue(QLCInputFeedback::LowerValue, m_lowerSpin->value()); + m_inputSource->setFeedbackValue(QLCInputFeedback::UpperValue, m_upperSpin->value()); + if (m_monitorSpin->isVisible()) + m_inputSource->setFeedbackValue(QLCInputFeedback::MonitorValue, m_monitorSpin->value()); + + if (m_midiChannelGroup->isVisible()) + { + m_inputSource->setFeedbackExtraParams(QLCInputFeedback::LowerValue, m_lowerChannelCombo->currentIndex() - 1); + m_inputSource->setFeedbackExtraParams(QLCInputFeedback::UpperValue, m_upperChannelCombo->currentIndex() - 1); + if (m_monitorSpin->isVisible()) + m_inputSource->setFeedbackExtraParams(QLCInputFeedback::MonitorValue, m_monitorChannelCombo->currentIndex() - 1); + } + + QDialog::accept(); +} + +void CustomFeedbackDialog::slotLowerColorButtonClicked() +{ + m_selectedFeedback = LowerValue; + m_profileColorsTree->setVisible(true); +} + +void CustomFeedbackDialog::slotUpperColorButtonClicked() +{ + m_selectedFeedback = UpperValue; + m_profileColorsTree->setVisible(true); +} + +void CustomFeedbackDialog::slotMonitorColorButtonClicked() +{ + m_selectedFeedback = MonitoringValue; + m_profileColorsTree->setVisible(true); +} + +void CustomFeedbackDialog::slotColorSelected(QTreeWidgetItem *item) +{ + QLabel *label = qobject_cast(m_profileColorsTree->itemWidget(item, 2)); + + if (m_selectedFeedback == LowerValue) + { + m_lowerSpin->setValue(item->text(0).toInt()); + m_lowerColor->setStyleSheet(label->styleSheet()); + } + else if (m_selectedFeedback == UpperValue) + { + m_upperSpin->setValue(item->text(0).toInt()); + m_upperColor->setStyleSheet(label->styleSheet()); + } + else if (m_selectedFeedback == MonitoringValue) + { + m_monitorSpin->setValue(item->text(0).toInt()); + m_monitorColor->setStyleSheet(label->styleSheet()); + } + m_profileColorsTree->setVisible(false); + m_selectedFeedback = None; +} diff --git a/ui/src/customfeedbackdialog.h b/ui/src/customfeedbackdialog.h new file mode 100644 index 0000000000..754adcad90 --- /dev/null +++ b/ui/src/customfeedbackdialog.h @@ -0,0 +1,62 @@ +/* + Q Light Controller Plus + customfeedbackdialog.h + + Copyright (c) Massimo Callegari + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef CUSTOMFEEDBACKDIALOG_H +#define CUSTOMFEEDBACKDIALOG_H + +#include + +#include "ui_customfeedbackdialog.h" + +class Doc; +class QLCInputSource; +class QLCInputProfile; + +class CustomFeedbackDialog : public QDialog, public Ui_CustomFeedbackDialog +{ + Q_OBJECT + + /********************************************************************* + * Initialization + *********************************************************************/ +public: + explicit CustomFeedbackDialog(Doc *doc, QSharedPointer const& source, QWidget *parent = nullptr); + ~CustomFeedbackDialog(); + + enum SelectedFeedback { None, LowerValue, UpperValue, MonitoringValue }; + + void setMonitoringVisibility(bool visible); + + /** @reimp */ + void accept(); + +protected slots: + void slotLowerColorButtonClicked(); + void slotUpperColorButtonClicked(); + void slotMonitorColorButtonClicked(); + void slotColorSelected(QTreeWidgetItem *item); + +private: + Doc *m_doc; + QLCInputProfile *m_profile; + QSharedPointer m_inputSource; + SelectedFeedback m_selectedFeedback; +}; + +#endif // CUSTOMFEEDBACKDIALOG_H diff --git a/ui/src/customfeedbackdialog.ui b/ui/src/customfeedbackdialog.ui new file mode 100644 index 0000000000..b8b0637bf7 --- /dev/null +++ b/ui/src/customfeedbackdialog.ui @@ -0,0 +1,256 @@ + + + CustomFeedbackDialog + + + + 0 + 0 + 595 + 535 + + + + Custom Feedback Configuration + + + + + + + Value + + + + + Label + + + + + Color + + + + + + + + + 0 + 0 + + + + Values + + + + + + + 10 + + + + Lower Value + + + + + + + 255 + + + + + + + 255 + + + + + + + + 10 + + + + Monitor Value + + + + + + + + 10 + + + + Upper Value + + + + + + + 0 + + + 255 + + + 255 + + + + + + + Color Selection + + + + + + + + + + Color Selection + + + + + + + + + + Color Selection + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + MIDI Channel + + + + + + Upper Channel + + + + + + + + 0 + 0 + + + + Lower Channel + + + + + + + + 0 + 0 + + + + + + + + + + + Monitor Channel + + + + + + + + + + + + + + + buttonBox + accepted() + CustomFeedbackDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + CustomFeedbackDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/ui/src/efxeditor.cpp b/ui/src/efxeditor.cpp index fabad0db76..f471766789 100644 --- a/ui/src/efxeditor.cpp +++ b/ui/src/efxeditor.cpp @@ -203,18 +203,20 @@ void EFXEditor::initMovementPage() m_algorithmCombo->addItems(EFX::algorithmList()); QString algo(EFX::algorithmToString(m_efx->algorithm())); + int algoIndex = 0; /* Select the EFX's algorithm from the algorithm combo */ for (int i = 0; i < m_algorithmCombo->count(); i++) { if (m_algorithmCombo->itemText(i) == algo) { m_algorithmCombo->setCurrentIndex(i); + algoIndex = i; break; } } /* Causes the EFX function to update the preview point array */ - slotAlgorithmSelected(algo); + slotAlgorithmSelected(algoIndex); /* Get the algorithm parameters */ m_widthSpin->setValue(m_efx->width()); @@ -269,8 +271,8 @@ void EFXEditor::initMovementPage() connect(m_backward, SIGNAL(clicked()), this, SLOT(slotBackwardClicked())); - connect(m_algorithmCombo, SIGNAL(activated(const QString&)), - this, SLOT(slotAlgorithmSelected(const QString&))); + connect(m_algorithmCombo, SIGNAL(activated(int)), + this, SLOT(slotAlgorithmSelected(int))); connect(m_widthSpin, SIGNAL(valueChanged(int)), this, SLOT(slotWidthSpinChanged(int))); connect(m_heightSpin, SIGNAL(valueChanged(int)), @@ -884,12 +886,11 @@ void EFXEditor::slotFixtureChanged() * Movement page *****************************************************************************/ -void EFXEditor::slotAlgorithmSelected(const QString &text) +void EFXEditor::slotAlgorithmSelected(int algoIndex) { Q_ASSERT(m_efx != NULL); - EFX::Algorithm algo = EFX::stringToAlgorithm(text); - m_efx->setAlgorithm(algo); + m_efx->setAlgorithm(EFX::Algorithm(algoIndex)); if (m_efx->isFrequencyEnabled()) { diff --git a/ui/src/efxeditor.h b/ui/src/efxeditor.h index 6a5085cf35..b23bec9447 100644 --- a/ui/src/efxeditor.h +++ b/ui/src/efxeditor.h @@ -135,7 +135,7 @@ private slots: * Movement page *********************************************************************/ private slots: - void slotAlgorithmSelected(const QString &text); + void slotAlgorithmSelected(int algoIndex); void slotWidthSpinChanged(int value); void slotHeightSpinChanged(int value); void slotXOffsetSpinChanged(int value); diff --git a/ui/src/fixturemanager.cpp b/ui/src/fixturemanager.cpp index 45ed7f9158..9ce6b82c8e 100644 --- a/ui/src/fixturemanager.cpp +++ b/ui/src/fixturemanager.cpp @@ -36,15 +36,18 @@ #include #include #include +#include #include "qlcfixturemode.h" #include "qlcfixturedef.h" #include "qlcchannel.h" +#include "qlccapability.h" #include "qlcfile.h" #include "createfixturegroup.h" #include "fixturegroupeditor.h" #include "fixturetreewidget.h" +#include "genericdmxsource.h" #include "channelsselection.h" #include "addchannelsgroup.h" #include "fixturemanager.h" @@ -72,9 +75,11 @@ FixtureManager* FixtureManager::s_instance = NULL; * Initialization *****************************************************************************/ -FixtureManager::FixtureManager(QWidget* parent, Doc* doc) +FixtureManager::FixtureManager(QTabWidget* parent, Doc* doc) : QWidget(parent) + , m_parent(parent) , m_doc(doc) + , m_highlightFixturesEnabled(false) , m_splitter(NULL) , m_fixtures_tree(NULL) , m_channel_groups_tree(NULL) @@ -116,6 +121,9 @@ FixtureManager::FixtureManager(QWidget* parent, Doc* doc) if (grpItem != NULL) grpItem->setExpanded(true); + connect(m_parent, SIGNAL(currentChanged(int)), + this, SLOT(slotParentTabChanged())); + /* Connect fixture list change signals from the new document object */ connect(m_doc, SIGNAL(fixtureRemoved(quint32)), this, SLOT(slotFixtureRemoved(quint32))); @@ -151,6 +159,11 @@ FixtureManager::~FixtureManager() settings.setValue(SETTINGS_SPLITTER, m_splitter->saveState()); FixtureManager::s_instance = NULL; + QHash::iterator it; + for (it = m_fixtureToSourceMap.begin(); it != m_fixtureToSourceMap.end(); ++it) { + delete it.value(); + } + s_instance = NULL; } @@ -160,9 +173,14 @@ FixtureManager* FixtureManager::instance() } /***************************************************************************** - * Doc signal handlers + * Signal handlers *****************************************************************************/ +void FixtureManager::slotParentTabChanged() +{ + runHighlightFixtures(); +} + void FixtureManager::slotFixtureRemoved(quint32 id) { QList groupsToDelete; @@ -269,6 +287,8 @@ void FixtureManager::slotModeChanged(Doc::Mode mode) m_fadeConfigAction->setEnabled(true); else m_fadeConfigAction->setEnabled(false); + + m_highlightFixturesAction->setEnabled(true); } else { @@ -279,7 +299,10 @@ void FixtureManager::slotModeChanged(Doc::Mode mode) m_fadeConfigAction->setEnabled(false); m_groupAction->setEnabled(false); m_unGroupAction->setEnabled(false); + m_highlightFixturesAction->setEnabled(false); } + + runHighlightFixtures(); } void FixtureManager::slotFixtureGroupRemoved(quint32 id) @@ -494,6 +517,128 @@ void FixtureManager::updateRDMView() m_remapAction->setEnabled(false); } +void FixtureManager::runHighlightFixtures() +{ + QList selectedFixtures = m_fixtures_tree->selectedItems(); + QSet selectedFixtureIds; + foreach (QTreeWidgetItem* item , selectedFixtures) + { + selectedFixtureIds.insert(item->data(KColumnName, PROP_ID).toUInt()); + } + + QSet newlySelectedFixtureIds = selectedFixtureIds.subtract(m_lastSelectedFixtureIds); + QSet deselectedFixtureIds = m_lastSelectedFixtureIds.subtract(selectedFixtureIds); + + if (m_doc->mode() == Doc::Design && m_highlightFixturesEnabled && m_parent->currentIndex() == 0) + { + // Turn on all selected fixtures + QSet::const_iterator it; + for (it = newlySelectedFixtureIds.constBegin(); it != newlySelectedFixtureIds.constEnd(); ++it) + { + highlightFixture(*it); + } + + // Turn all deselected fixtures off + for (it = deselectedFixtureIds.constBegin(); it != deselectedFixtureIds.constEnd(); ++it) + { + unHighlightFixture(*it); + } + } + else + { + // Turn all fixtures off + QHash::iterator it; + foreach(const quint32 &fixtureId, m_fixtureToSourceMap.keys()) + { + unHighlightFixture(fixtureId); + } + } + + m_lastSelectedFixtureIds = selectedFixtureIds; +} + +void FixtureManager::highlightFixture(quint32 id) +{ + Fixture* fxi = m_doc->fixture(id); + if (fxi == NULL) + return; + + GenericDMXSource* source = new GenericDMXSource(m_doc); + m_fixtureToSourceMap.insert(id, source); + + // Set the color of every Fixture to white, pan en tilt to 127, shutter to open and intensity to 255 + for (int i = 0; i < fxi->heads(); i++) + { + QLCFixtureHead head = fxi->head(i); + + quint32 whiteChannel = head.channelNumber(QLCChannel::White, QLCChannel::MSB); + quint32 redChannel = head.channelNumber(QLCChannel::Red, QLCChannel::MSB); + quint32 greenChannel = head.channelNumber(QLCChannel::Green, QLCChannel::MSB); + quint32 blueChannel = head.channelNumber(QLCChannel::Blue, QLCChannel::MSB); + + if (whiteChannel != QLCChannel::invalid()) + { + source->set(fxi->id(), whiteChannel, 255); + } + else if (redChannel != QLCChannel::invalid() && greenChannel != QLCChannel::invalid() && blueChannel != QLCChannel::invalid()) + { + source->set(fxi->id(), redChannel, 255); + source->set(fxi->id(), greenChannel, 255); + source->set(fxi->id(), blueChannel, 255); + } + + quint32 panChannel = head.channelNumber(QLCChannel::Pan, QLCChannel::MSB); + if (panChannel != QLCChannel::invalid()) + { + source->set(fxi->id(), panChannel, 127); + } + + quint32 tiltChannel = head.channelNumber(QLCChannel::Tilt, QLCChannel::MSB); + if (tiltChannel != QLCChannel::invalid()) + { + source->set(fxi->id(), tiltChannel, 127); + } + + QLCFixtureMode* mode = fxi->fixtureMode(); + foreach (quint32 shutter, head.shutterChannels()) + { + QLCChannel *ch = mode->channel(shutter); + if (ch == NULL) + continue; + + foreach (QLCCapability *cap, ch->capabilities()) + { + if (cap->preset() == QLCCapability::ShutterOpen || + cap->preset() == QLCCapability::LampOn) + { + source->set(fxi->id(), i, cap->middle()); + goto setIntensity; + } + + } + } + + setIntensity: + quint32 intensityChannel = head.channelNumber(QLCChannel::Intensity, QLCChannel::MSB); + source->set(fxi->id(), intensityChannel, 255); + } + + source->setOutputEnabled(true); +} + +void FixtureManager::unHighlightFixture(quint32 id) +{ + Fixture* fxi = m_doc->fixture(id); + if (fxi == NULL) + return; + + if (!m_fixtureToSourceMap.contains(id)) + return; + + delete m_fixtureToSourceMap.value(id); + m_fixtureToSourceMap.remove(id); +} + void FixtureManager::fixtureSelected(quint32 id) { Fixture* fxi = m_doc->fixture(id); @@ -504,11 +649,8 @@ void FixtureManager::fixtureSelected(quint32 id) createInfo(); m_info->setText(QString("%1%2") - .arg(fixtureInfoStyleSheetHeader()) - .arg(fxi->status())); - - // Enable/disable actions - slotModeChanged(m_doc->mode()); + .arg(fixtureInfoStyleSheetHeader()) + .arg(fxi->status())); } void FixtureManager::fixtureGroupSelected(FixtureGroup* grp) @@ -936,6 +1078,11 @@ void FixtureManager::initActions() tr("Remap fixtures..."), this); connect(m_remapAction, SIGNAL(triggered(bool)), this, SLOT(slotRemap())); + + m_highlightFixturesAction = new QAction(QIcon(":/lightning.png"), + tr("Enable highlight fixtures..."), this); + connect(m_highlightFixturesAction, SIGNAL(triggered(bool)), + this, SLOT(slotHighlightFixtures())); } void FixtureManager::updateGroupMenu() @@ -985,6 +1132,7 @@ void FixtureManager::initToolBar() toolbar->addAction(m_importAction); toolbar->addAction(m_exportAction); toolbar->addAction(m_remapAction); + toolbar->addAction(m_highlightFixturesAction); QToolButton* btn = qobject_cast (toolbar->widgetForAction(m_groupAction)); Q_ASSERT(btn != NULL); @@ -1515,6 +1663,25 @@ void FixtureManager::slotRemap() updateView(); } +void FixtureManager::slotHighlightFixtures() +{ + if (m_highlightFixturesEnabled) + { + m_highlightFixturesAction->setIcon(QIcon(":/lightning.png")); + m_highlightFixturesAction->setIconText(tr("Enable highlight fixtures")); + m_highlightFixturesAction->setToolTip(tr("Enable highlight fixtures")); + } + else + { + m_highlightFixturesAction->setIcon(QIcon(":/lightning_off.png")); + m_highlightFixturesAction->setIconText(tr("Disable highlight fixtures")); + m_highlightFixturesAction->setToolTip(tr("Disable highlight fixtures")); + } + + m_highlightFixturesEnabled = !m_highlightFixturesEnabled; + slotModeChanged(m_doc->mode()); +} + void FixtureManager::slotUnGroup() { if (QMessageBox::question(this, tr("Ungroup fixtures?"), diff --git a/ui/src/fixturemanager.h b/ui/src/fixturemanager.h index d0a5bed521..4533f0860b 100644 --- a/ui/src/fixturemanager.h +++ b/ui/src/fixturemanager.h @@ -25,6 +25,7 @@ #include "function.h" #include "fixture.h" #include "doc.h" +#include "genericdmxsource.h" class QLCFixtureDefCache; class FixtureGroupEditor; @@ -54,7 +55,7 @@ class FixtureManager : public QWidget * Initialization ********************************************************************/ public: - FixtureManager(QWidget* parent, Doc* doc); + FixtureManager(QTabWidget* parent, Doc* doc); ~FixtureManager(); /** Get the singleton instance */ @@ -65,9 +66,12 @@ class FixtureManager : public QWidget static FixtureManager* s_instance; /******************************************************************** - * Doc signal handlers + * Signal handlers ********************************************************************/ public slots: + /** Callback for QTabWidget::currentChanged() signals */ + void slotParentTabChanged(); + /** Callback for Doc::fixtureRemoved() signals */ void slotFixtureRemoved(quint32 id); @@ -87,7 +91,11 @@ public slots: void slotDocLoaded(); private: + QTabWidget* m_parent; Doc* m_doc; + bool m_highlightFixturesEnabled; + QSet m_lastSelectedFixtureIds; + QHash m_fixtureToSourceMap; /******************************************************************** * Data view @@ -118,6 +126,15 @@ public slots: /** Construct the list view and data view */ void initDataView(); + /** Checks if any fixtures have to be highlighted */ + void runHighlightFixtures(); + + /** Creates a GenericDmxSource and turns the fixture on */ + void highlightFixture(quint32 id); + + /** Turns the fixture off and removes the related GenericDmxSource */ + void unHighlightFixture(quint32 id); + /** Handle single fixture selection */ void fixtureSelected(quint32 id); @@ -199,6 +216,7 @@ private slots: void slotProperties(); void slotFadeConfig(); void slotRemap(); + void slotHighlightFixtures(); void slotUnGroup(); void slotGroupSelected(QAction* action); void slotMoveGroupUp(); @@ -216,6 +234,7 @@ private slots: QAction* m_propertiesAction; QAction* m_fadeConfigAction; QAction* m_remapAction; + QAction* m_highlightFixturesAction; QAction* m_groupAction; QAction* m_unGroupAction; QAction* m_newGroupAction; diff --git a/ui/src/functionselection.cpp b/ui/src/functionselection.cpp index 2aaf8dce08..acccaeb275 100644 --- a/ui/src/functionselection.cpp +++ b/ui/src/functionselection.cpp @@ -445,7 +445,6 @@ void FunctionSelection::slotAudioChecked(bool state) refillTree(); } -#if QT_VERSION >= 0x050000 void FunctionSelection::slotVideoChecked(bool state) { if (state == true) @@ -454,4 +453,3 @@ void FunctionSelection::slotVideoChecked(bool state) m_filter = (m_filter & ~Function::VideoType); refillTree(); } -#endif diff --git a/ui/src/functionselection.h b/ui/src/functionselection.h index c78de680dc..952f5cd159 100644 --- a/ui/src/functionselection.h +++ b/ui/src/functionselection.h @@ -141,9 +141,7 @@ protected slots: void slotRGBMatrixChecked(bool state); void slotShowChecked(bool state); void slotAudioChecked(bool state); -#if QT_VERSION >= 0x050000 void slotVideoChecked(bool state); -#endif private: int m_filter; diff --git a/ui/src/grandmasterslider.cpp b/ui/src/grandmasterslider.cpp index c55f3e11a6..52f60af013 100644 --- a/ui/src/grandmasterslider.cpp +++ b/ui/src/grandmasterslider.cpp @@ -188,6 +188,8 @@ void GrandMasterSlider::slotGrandMasterValueChanged(uchar value) m_slider->blockSignals(true); m_slider->setValue(value); m_slider->blockSignals(false); + + updateDisplayValue(); } void GrandMasterSlider::slotGrandMasterValueModeChanged(GrandMaster::ValueMode mode) diff --git a/ui/src/inputchanneleditor.cpp b/ui/src/inputchanneleditor.cpp index eb2386a20b..5756f2ba54 100644 --- a/ui/src/inputchanneleditor.cpp +++ b/ui/src/inputchanneleditor.cpp @@ -76,8 +76,8 @@ InputChannelEditor::InputChannelEditor(QWidget* parent, this, SLOT(slotNumberChanged(int))); connect(m_nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(slotNameEdited(const QString&))); - connect(m_typeCombo, SIGNAL(activated(const QString&)), - this, SLOT(slotTypeActivated(const QString &))); + connect(m_typeCombo, SIGNAL(activated(int)), + this, SLOT(slotTypeActivated(int))); /* Fill type combo with type icons and names */ QStringListIterator it(QLCInputChannel::types()); @@ -182,9 +182,9 @@ void InputChannelEditor::slotNameEdited(const QString& text) m_name = text; } -void InputChannelEditor::slotTypeActivated(const QString& text) +void InputChannelEditor::slotTypeActivated(int index) { - m_type = QLCInputChannel::stringToType(text); + m_type = QLCInputChannel::stringToType(m_typeCombo->itemText(index)); } /**************************************************************************** diff --git a/ui/src/inputchanneleditor.h b/ui/src/inputchanneleditor.h index e2f511c375..1a12602fbf 100644 --- a/ui/src/inputchanneleditor.h +++ b/ui/src/inputchanneleditor.h @@ -58,7 +58,7 @@ class InputChannelEditor : public QDialog, public Ui_InputChannelEditor protected slots: void slotNumberChanged(int number); void slotNameEdited(const QString& text); - void slotTypeActivated(const QString& text); + void slotTypeActivated(int index); protected: quint32 m_channel; diff --git a/ui/src/inputprofileeditor.cpp b/ui/src/inputprofileeditor.cpp index 778be451e7..095cb556d9 100644 --- a/ui/src/inputprofileeditor.cpp +++ b/ui/src/inputprofileeditor.cpp @@ -18,10 +18,13 @@ */ #include +#include +#include #include #include #include #include +#include #include #include #include @@ -63,6 +66,7 @@ InputProfileEditor::InputProfileEditor(QWidget* parent, QLCInputProfile* profile setupUi(this); m_midiGroupSettings->setVisible(false); + connect(m_typeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotTypeComboChanged(int))); @@ -89,6 +93,18 @@ InputProfileEditor::InputProfileEditor(QWidget* parent, QLCInputProfile* profile this, SLOT(slotLowerValueSpinChanged(int))); connect(m_upperSpin, SIGNAL(valueChanged(int)), this, SLOT(slotUpperValueSpinChanged(int))); + connect(m_midiChannelCombo, SIGNAL(currentIndexChanged(int)), + this, SLOT(slotMidiChannelComboChanged(int))); + + connect(m_addColorButton, SIGNAL(clicked()), + this, SLOT(slotAddColor())); + connect(m_removeColorButton, SIGNAL(clicked()), + this, SLOT(slotRemoveColor())); + + connect(m_addMidiChannelButton, SIGNAL(clicked()), + this, SLOT(slotAddMidiChannel())); + connect(m_removeMidiChannelButton, SIGNAL(clicked()), + this, SLOT(slotRemoveMidiChannel())); /* Listen to input data */ connect(m_ioMap, SIGNAL(inputValueChanged(quint32, quint32, uchar, const QString&)), @@ -135,9 +151,16 @@ InputProfileEditor::InputProfileEditor(QWidget* parent, QLCInputProfile* profile m_behaviourBox->hide(); m_feedbackGroup->hide(); + /* Fill up the tree with profile's channels */ fillTree(); + /* Fill up the tree with color table */ + updateColorsTree(); + + /* Fill up the tree with MIDI channel table */ + updateMidiChannelTree(); + /* Timer that clears the input data icon after a while */ m_timer = new QTimer(this); m_timer->setSingleShot(true); @@ -171,8 +194,57 @@ void InputProfileEditor::fillTree() m_tree->header()->resizeSections(QHeaderView::ResizeToContents); } -void InputProfileEditor::updateChannelItem(QTreeWidgetItem* item, - QLCInputChannel* ch) +void InputProfileEditor::updateColorsTree() +{ + m_colorTableTree->clear(); + + QMapIterator > it(m_profile->colorTable()); + while (it.hasNext() == true) + { + it.next(); + QPair lc = it.value(); + QTreeWidgetItem *item = new QTreeWidgetItem(m_colorTableTree); + item->setText(0, QString::number(it.key())); + item->setText(1, lc.first); + + QLabel *colLabel = new QLabel(); + colLabel->setStyleSheet(QString("background-color: %1").arg(lc.second.name())); + + m_colorTableTree->setItemWidget(item, 2, colLabel); + } +} + +void InputProfileEditor::updateMidiChannelTree() +{ + m_midiChannelsTree->clear(); + m_midiChannelCombo->clear(); + + if (m_profile->hasMidiChannelTable()) + { + m_midiChannelCombo->show(); + m_midiChannelLabel->show(); + m_midiChannelCombo->addItem(tr("From plugin settings")); + } + else + { + m_midiChannelCombo->hide(); + m_midiChannelLabel->hide(); + } + + QMapIterator it(m_profile->midiChannelTable()); + while (it.hasNext() == true) + { + it.next(); + QTreeWidgetItem *item = new QTreeWidgetItem(m_midiChannelsTree); + item->setText(0, QString::number(it.key() + 1)); + item->setText(1, it.value()); + + m_midiChannelCombo->addItem(it.value()); + } +} + +void InputProfileEditor::updateChannelItem(QTreeWidgetItem *item, + QLCInputChannel *ch) { quint32 num; @@ -222,10 +294,15 @@ void InputProfileEditor::setOptionsVisibility(QLCInputChannel::Type type) void InputProfileEditor::slotTypeComboChanged(int) { + bool showMidiSettings = false; + if (currentProfileType() == QLCInputProfile::MIDI) - m_midiGroupSettings->setVisible(true); - else - m_midiGroupSettings->setVisible(false); + { + showMidiSettings = true; + updateMidiChannelTree(); + } + + m_midiGroupSettings->setVisible(showMidiSettings); } /**************************************************************************** @@ -256,7 +333,7 @@ void InputProfileEditor::accept() /* Check that we have at least the bare necessities to save the profile */ if (m_profile->manufacturer().isEmpty() == true || - m_profile->model().isEmpty() == true) + m_profile->model().isEmpty() == true) { QMessageBox::warning(this, tr("Missing information"), tr("Manufacturer and/or model name is missing.")); @@ -501,10 +578,13 @@ void InputProfileEditor::slotItemClicked(QTreeWidgetItem *item, int col) m_extraPressCheck->setChecked(ich->sendExtraPress()); m_lowerSpin->blockSignals(true); m_upperSpin->blockSignals(true); + m_midiChannelCombo->blockSignals(true); m_lowerSpin->setValue(ich->lowerValue()); m_upperSpin->setValue(ich->upperValue()); + m_midiChannelCombo->setCurrentIndex(ich->lowerChannel() + 1); m_lowerSpin->blockSignals(false); m_upperSpin->blockSignals(false); + m_midiChannelCombo->blockSignals(false); } } else @@ -571,6 +651,64 @@ void InputProfileEditor::slotUpperValueSpinChanged(int value) } } +void InputProfileEditor::slotMidiChannelComboChanged(int index) +{ + foreach (QLCInputChannel *channel, selectedChannels()) + { + if (channel->type() == QLCInputChannel::Button) + channel->setLowerChannel(index - 1); + } +} + +void InputProfileEditor::slotAddColor() +{ + bool ok; + int val = QInputDialog::getInt(this, tr("Enter value"), tr("Feedback value"), 0, 0, 255, 1, &ok); + + if (ok) + { + QColor color = QColorDialog::getColor(); + + QString label = QInputDialog::getText(this, tr("Enter label"), tr("Color label")); + m_profile->addColor(val, label, color); + updateColorsTree(); + m_colorTableTree->scrollToBottom(); + } +} + +void InputProfileEditor::slotRemoveColor() +{ + foreach (QTreeWidgetItem *item, m_colorTableTree->selectedItems()) + { + uchar value = uchar(item->text(0).toInt()); + m_profile->removeColor(value); + } + updateColorsTree(); +} + +void InputProfileEditor::slotAddMidiChannel() +{ + bool ok; + int val = QInputDialog::getInt(this, tr("Enter value"), tr("MIDI channel"), 1, 1, 16, 1, &ok); + + if (ok) + { + QString label = QInputDialog::getText(this, tr("Enter label"), tr("MIDI channel label")); + m_profile->addMidiChannel(val - 1, label); + updateMidiChannelTree(); + } +} + +void InputProfileEditor::slotRemoveMidiChannel() +{ + foreach (QTreeWidgetItem *item, m_midiChannelsTree->selectedItems()) + { + uchar value = uchar(item->text(0).toInt()); + m_profile->removeMidiChannel(value); + } + updateMidiChannelTree(); +} + void InputProfileEditor::slotInputValueChanged(quint32 universe, quint32 channel, uchar value, diff --git a/ui/src/inputprofileeditor.h b/ui/src/inputprofileeditor.h index 72d0a61304..38122a5a1c 100644 --- a/ui/src/inputprofileeditor.h +++ b/ui/src/inputprofileeditor.h @@ -47,6 +47,8 @@ class InputProfileEditor : public QDialog, public Ui_InputProfileEditor protected: void fillTree(); + void updateColorsTree(); + void updateMidiChannelTree(); void updateChannelItem(QTreeWidgetItem *item, QLCInputChannel *ch); void setOptionsVisibility(QLCInputChannel::Type type); @@ -80,6 +82,13 @@ protected slots: void slotExtraPressChecked(bool checked); void slotLowerValueSpinChanged(int value); void slotUpperValueSpinChanged(int value); + void slotMidiChannelComboChanged(int index); + + void slotAddColor(); + void slotRemoveColor(); + + void slotAddMidiChannel(); + void slotRemoveMidiChannel(); void slotInputValueChanged(quint32 universe, quint32 channel, uchar value, const QString& key = 0); void slotTimerTimeout(); diff --git a/ui/src/inputprofileeditor.ui b/ui/src/inputprofileeditor.ui index cf90c17e43..86edda917b 100644 --- a/ui/src/inputprofileeditor.ui +++ b/ui/src/inputprofileeditor.ui @@ -26,7 +26,7 @@ 0 0 520 - 476 + 492 @@ -36,8 +36,18 @@ :/input_output.png:/input_output.png - - + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + 0 @@ -121,7 +131,7 @@ - Channels + Input Mapping @@ -348,6 +358,20 @@ 3 + + + + 255 + + + + + + + Lower value + + + @@ -368,35 +392,174 @@ - - + + - Lower value + MIDI channel - - - - 255 - - + + - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - + + + Colors + + + + + + Remove the selected color + + + ... + + + + :/edit_remove.png:/edit_remove.png + + + + 32 + 32 + + + + + + + + Add a new color + + + ... + + + + :/edit_add.png:/edit_add.png + + + + 32 + 32 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Value + + + + + Label + + + + + Color + + + + + + + + + MIDI Channels + + + + + + Add a new MIDI channel + + + + + + + :/edit_add.png:/edit_add.png + + + + 32 + 32 + + + + + + + + Remove the selected MIDI channel + + + + + + + :/edit_remove.png:/edit_remove.png + + + + 32 + 32 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Channel + + + + + Name + + + + + + diff --git a/ui/src/inputselectionwidget.cpp b/ui/src/inputselectionwidget.cpp index ef7e7fc62a..d3c2eedc53 100644 --- a/ui/src/inputselectionwidget.cpp +++ b/ui/src/inputselectionwidget.cpp @@ -19,6 +19,7 @@ #include +#include "customfeedbackdialog.h" #include "inputselectionwidget.h" #include "selectinputchannel.h" #include "qlcinputchannel.h" @@ -26,12 +27,12 @@ #include "inputpatch.h" #include "doc.h" - InputSelectionWidget::InputSelectionWidget(Doc *doc, QWidget *parent) : QWidget(parent) , m_doc(doc) , m_widgetPage(0) , m_emitOdd(false) + , m_supportMonitoring(false) , m_signalsReceived(0) { Q_ASSERT(doc != NULL); @@ -39,9 +40,6 @@ InputSelectionWidget::InputSelectionWidget(Doc *doc, QWidget *parent) setupUi(this); m_customFbButton->setVisible(false); - m_feedbackGroup->setVisible(false); - m_lowerSpin->setEnabled(false); - m_upperSpin->setEnabled(false); connect(m_attachKey, SIGNAL(clicked()), this, SLOT(slotAttachKey())); connect(m_detachKey, SIGNAL(clicked()), this, SLOT(slotDetachKey())); @@ -51,12 +49,8 @@ InputSelectionWidget::InputSelectionWidget(Doc *doc, QWidget *parent) connect(m_chooseInputButton, SIGNAL(clicked()), this, SLOT(slotChooseInputClicked())); - connect(m_customFbButton, SIGNAL(toggled(bool)), - this, SLOT(slotCustomFeedbackToggled(bool))); - connect(m_lowerSpin, SIGNAL(valueChanged(int)), - this, SLOT(slotLowerSpinValueChanged(int))); - connect(m_upperSpin, SIGNAL(valueChanged(int)), - this, SLOT(slotUpperSpinValueChanged(int))); + connect(m_customFbButton, SIGNAL(clicked(bool)), + this, SLOT(slotCustomFeedbackClicked())); } InputSelectionWidget::~InputSelectionWidget() @@ -73,6 +67,11 @@ void InputSelectionWidget::setCustomFeedbackVisibility(bool visible) m_customFbButton->setVisible(visible); } +void InputSelectionWidget::setMonitoringSupport(bool enable) +{ + m_supportMonitoring = enable; +} + void InputSelectionWidget::setTitle(QString title) { m_extInputGroup->setTitle(title); @@ -182,19 +181,11 @@ void InputSelectionWidget::slotChooseInputClicked() } } -void InputSelectionWidget::slotCustomFeedbackToggled(bool checked) -{ - m_feedbackGroup->setVisible(checked); -} - -void InputSelectionWidget::slotLowerSpinValueChanged(int value) +void InputSelectionWidget::slotCustomFeedbackClicked() { - m_inputSource->setRange(uchar(value), uchar(m_upperSpin->value())); -} - -void InputSelectionWidget::slotUpperSpinValueChanged(int value) -{ - m_inputSource->setRange(uchar(m_lowerSpin->value()), uchar(value)); + CustomFeedbackDialog cfDialog(m_doc, m_inputSource, this); + cfDialog.setMonitoringVisibility(m_supportMonitoring); + cfDialog.exec(); } void InputSelectionWidget::updateInputSource() @@ -206,43 +197,6 @@ void InputSelectionWidget::updateInputSource() { uniName = KInputNone; chName = KInputNone; - m_lowerSpin->setEnabled(false); - m_upperSpin->setEnabled(false); - m_customFbButton->setChecked(false); - m_feedbackGroup->setVisible(false); - } - else - { - m_lowerSpin->blockSignals(true); - m_upperSpin->blockSignals(true); - - uchar min = 0, max = UCHAR_MAX; - - InputPatch *ip = m_doc->inputOutputMap()->inputPatch(m_inputSource->universe()); - if (ip != NULL && ip->profile() != NULL) - { - QLCInputChannel *ich = ip->profile()->channel(m_inputSource->channel()); - if (ich != NULL && ich->type() == QLCInputChannel::Button) - { - min = ich->lowerValue(); - max = ich->upperValue(); - } - } - m_lowerSpin->setValue((m_inputSource->lowerValue() != 0) ? m_inputSource->lowerValue() : min); - m_upperSpin->setValue((m_inputSource->upperValue() != UCHAR_MAX) ? m_inputSource->upperValue() : max); - if (m_lowerSpin->value() != 0 || m_upperSpin->value() != UCHAR_MAX) - { - m_customFbButton->setChecked(true); - } - else - { - m_customFbButton->setChecked(false); - m_feedbackGroup->setVisible(false); - } - m_lowerSpin->blockSignals(false); - m_upperSpin->blockSignals(false); - m_lowerSpin->setEnabled(true); - m_upperSpin->setEnabled(true); } m_inputUniverseEdit->setText(uniName); diff --git a/ui/src/inputselectionwidget.h b/ui/src/inputselectionwidget.h index 8c6384e885..02323925c2 100644 --- a/ui/src/inputselectionwidget.h +++ b/ui/src/inputselectionwidget.h @@ -33,11 +33,12 @@ class InputSelectionWidget : public QWidget, public Ui_InputSelectionWidget Q_OBJECT public: - InputSelectionWidget(Doc* doc, QWidget *parent = 0); + InputSelectionWidget(Doc *doc, QWidget *parent = 0); ~InputSelectionWidget(); void setKeyInputVisibility(bool visible); void setCustomFeedbackVisibility(bool visible); + void setMonitoringSupport(bool enable); void setTitle(QString title); void setWidgetPage(int page); bool isAutoDetecting(); @@ -58,9 +59,7 @@ protected slots: void slotInputValueChanged(quint32 universe, quint32 channel); void slotChooseInputClicked(); - void slotCustomFeedbackToggled(bool checked); - void slotLowerSpinValueChanged(int value); - void slotUpperSpinValueChanged(int value); + void slotCustomFeedbackClicked(); signals: void autoDetectToggled(bool checked); @@ -71,11 +70,12 @@ protected slots: void updateInputSource(); private: - Doc* m_doc; + Doc *m_doc; QKeySequence m_keySequence; QSharedPointer m_inputSource; int m_widgetPage; bool m_emitOdd; + bool m_supportMonitoring; quint32 m_signalsReceived; }; diff --git a/ui/src/inputselectionwidget.ui b/ui/src/inputselectionwidget.ui index aeeef1a9df..1249966048 100644 --- a/ui/src/inputselectionwidget.ui +++ b/ui/src/inputselectionwidget.ui @@ -7,14 +7,14 @@ Copyright (c) 2015 Massimo Callegari - Licensed under the Apache License, Version 2.0 (the "License"); + Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.txt Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. @@ -26,7 +26,7 @@ 0 0 504 - 185 + 134 @@ -149,73 +149,7 @@ 4 - - - - Input Universe - - - - - - - The input universe that sends data to this widget - - - true - - - - - - - Custom feedback - - - - 3 - - - 3 - - - - - Lower value - - - - - - - 0 - - - 255 - - - 255 - - - - - - - 255 - - - - - - - Upper value - - - - - - - + The particular input channel within the input universe that sends data to this widget @@ -232,31 +166,15 @@ - + + + + Input Universe + + + + - - - - Custom Feedback - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - @@ -292,8 +210,38 @@ + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Custom Feedback + + + + + + + The input universe that sends data to this widget + + + true + + + diff --git a/ui/src/qlcplus_ca_ES.ts b/ui/src/qlcplus_ca_ES.ts index f9d1978f97..1482c2b902 100644 --- a/ui/src/qlcplus_ca_ES.ts +++ b/ui/src/qlcplus_ca_ES.ts @@ -187,12 +187,12 @@ Model del fixture - + Fixtures found: %1 Fixtures trobats: %1 - + Dimmers Dimmers @@ -522,375 +522,375 @@ App - + Fixtures Fixtures - + Functions Funcions - + Shows Shows - + Virtual Console Consola Virtual - + Simple Desk Taula Simple - + Inputs/Outputs Entrades/Sortides - + Cannot exit in Operate mode No es pot sortir en Mode Operació - + You must switch back to Design mode to close the application. Ha de canviar a Mode Disseny per tancar l'aplicació. - + Close Tancar - + Do you wish to save the current workspace before closing the application? Voleu desar l'espai de treball actual abans de tancar l'aplicació? - + Close the application? Tancar l'aplicacció? - + Do you wish to close the application? Voleu tancar l'aplicació? - + Starting Q Light Controller Plus Iniciant Q Light Controller Plus - + - New Workspace - Nou Espai de treball - + Exit Sortir - + Switch to Design Mode Canviar a Mode Disseny - + There are still running functions. Really stop them and switch back to Design mode? Encara hi ha funcions en execució. Voleu aturar-les i tornar a Mode Disseny? - + Design Disseny - + Switch to design mode Canviar a Mode Disseny - + Operate Operació - - + + Switch to operate mode Canviar a Mode Operació - + &New &Nou - + CTRL+N File|New CTRL+N - + &Open &Obrir - + CTRL+O File|Open CTRL+O - + &Save &Desar - + CTRL+S File|Save CTRL+S - + Save &As... Desar &com... - + &Operate &Operació - + CTRL+F12 Control|Toggle operate/design mode CTRL+F12 - + &Monitor &Monitor - + CTRL+M Control|Monitor CTRL+M - + Address Tool Eina de direccionament - + Toggle &Blackout Activar/Desactivar &Blackout - + Live edit a function Editar funció en viu - + Toggle Virtual Console Live edit Activa/Desactiva l'edició en viu de la Consola Virtual - + Dump DMX values to a function Bolcar valors DMX a una funció - + CTRL+D Control|Dump DMX CTRL+D - + Stop ALL functions! ¡Aturar TOTES les funcions! - + Fade 1 second and stop Esvaiment podria ser una bona alternativa a Fade Out Fade out de 1 segon i aturar - + Fade 5 seconds and stop Fade out de 5 segons i aturar - + Fade 10 second and stop Fade out de 10 segons i aturar - + Fade 30 second and stop Fade out de 30 segons i aturar - + Toggle Full Screen Canviar a Pantalla Completa - + CTRL+F11 Control|Toggle Full Screen CTRL+F11 - + &Index &Index - + SHIFT+F1 Help|Index SHIFT+F1 - + &About QLC+ Sobre &QLC+ - + Quit QLC+ Abandonar QLC+ - + Workspace Espai de Treball - + Unable to read from file Impossible llegir des de l'arxiu - + Unable to write to file Impossible escriure a l'arxiu - + A fatal error occurred S'ha produït un error fatal - + Unable to access resource Impossible accedir al recurs - + Unable to open file for reading or writing Impossible obrir l'ariux per llegir o escriure - + Operation was aborted L'operació s'ha avortat - + Operation timed out Operació temps d'espera esgotat - + An unspecified error has occurred. Nice. Ha ocorregut un error desconegut.Genial. - + File error Error d'arxiu - - - + + + Do you wish to save the current workspace? Changes will be lost if you don't save them. Voleu desar l'espai de treball actual? Els canvis es perdran si no els guarda. - + New Workspace Nou Espai de Treball - - - + + + Open Workspace Obrir Espai de Treball - - + + Workspaces (*%1) Espais de Treball (*%1) - - + + All Files (*.*) Tots els arxius (*.*) - - + + All Files (*) Tots els arxius (*) - + Save Workspace As Desar l'espai de treball com - + Error Error - + File not found! The selected file has been moved or deleted. ¡Arxiu no trobat! L'arxiu seleccionat s'ha mogut o esborrat. - + Warning Advertència - + Some errors occurred while loading the project: S'han produït alguns errors en carregar el projecte: @@ -913,12 +913,12 @@ L'arxiu seleccionat s'ha mogut o esborrat. Tancar automàticament en pressionar una tecla - + Assign Key Assignar Tecla - + Hit the key combination that you wish to assign. You may hit either a single key or a combination using %1, %2, and %3. Premeu la combinació de tecles que voleu assignar. Podeu prémer una sola tecla o una combinació usant%1,%2 o%3. @@ -1045,23 +1045,23 @@ L'arxiu seleccionat s'ha mogut o esborrat. AudioItem - - + + Preview Left Channel Vista prèvia del Canal Esquerra - + Preview Right Channel Vista Prèvia del Canal Dret - + Preview Stereo Channels Vista Prèvia Canals Estèreo - + Preview Mono Vista Prèvia Mono @@ -1129,52 +1129,52 @@ L'arxiu seleccionat s'ha mogut o esborrat. Entrada - + None Cap - + DMX DMX - + Function Funció - + VC Widget Widget de CV - + %1 channels %1 canals - + No function Cap funció - + No widget Cap widget - + Not assigned No assignat - + Volume Bar Barra de volum - + #%1 (%2Hz - %3Hz) #%1 (%2Hz - %3Hz) @@ -1232,12 +1232,12 @@ L'arxiu seleccionat s'ha mogut o esborrat. Desestablir Modificador - + Error Error - + You are trying to overwrite a system template! Please choose another name and the template will be saved in your channel modifier's user folder. Estau intentant sobreescriure una plantilla del sistema ! Si us plau escolliu un altre nom i la plantilla es desarà al directori de modificadors de canal del usuari. @@ -1251,13 +1251,13 @@ L'arxiu seleccionat s'ha mogut o esborrat. - + Name Nom - + Type Tipus @@ -1277,27 +1277,27 @@ L'arxiu seleccionat s'ha mogut o esborrat. Expandeix-ho tot - + Selected Seleccionats - + Channel properties configuration Configuració de propietats de canals - + Can fade Pot fer Fade - + Behaviour Comportament - + Modifier Modificador @@ -1321,19 +1321,19 @@ L'arxiu seleccionat s'ha mogut o esborrat. - + Fade In Fade in - + Hold Manté - + Fade Out Fade Out @@ -1553,47 +1553,47 @@ L'arxiu seleccionat s'ha mogut o esborrat. Barreja els passos - + Cut Tallar - + Copy Copiar - + Paste Enganxa - + Paste error Error d'enganxat - + Trying to paste on an incompatible Scene. Operation canceled. Intentant enganxar una escena incompatible. Operació cancelada. - + Common Fade In Temps de Fade In comú - + Common Fade Out Temps de Fade Out comú - + Common Hold Temps d'espera comú - + Multiple Steps Passos múltiples @@ -1649,12 +1649,12 @@ L'arxiu seleccionat s'ha mogut o esborrat. ConsoleChannel - + Intensity Intensitat - + Reset this channel Restaurar aquest canal @@ -1715,6 +1715,83 @@ L'arxiu seleccionat s'ha mogut o esborrat. Peu + + CustomFeedbackDialog + + + Custom Feedback Configuration + Configuració de Feedback Personalitzat + + + + Value + Valor + + + + Label + Etiqueta + + + + Color + Color + + + + Values + Valors + + + + Lower Value + Valor Inferior + + + + Monitor Value + Valor Monitor + + + + Upper Value + Valor Superior + + + + + + Color Selection + Selecció de Color + + + + MIDI Channel + Canal MIDI + + + + Upper Channel + Canal Superior + + + + Lower Channel + Canal Inferior + + + + Monitor Channel + Canal Monitor + + + + + + From plugin settings + De la configuració del connector + + DmxDumpFactory @@ -1773,49 +1850,16 @@ L'arxiu seleccionat s'ha mogut o esborrat. Bolcar canals seleccionats - + Dump all channels (%1 Universes, %2 Fixtures, %3 Channels) Bolcar tots els canals (%1 Universos, %2Fixtures, %3 Canals) - + New Scene From Live %1 Nova Escena des de Live %1 - - DocBrowser - - - %1 - Document Browser - %1 - Explorador de Documents - - - - Backward - Enrere - - - - Forward - Endavant - - - - Index - Index - - - - About Qt - Sobre Qt - - - - Close this window - Tanca aquesta finestra - - EFXEditor @@ -2097,12 +2141,12 @@ L'arxiu seleccionat s'ha mogut o esborrat. Nom de la funció que s'està editant - + Remove fixtures Treure fixtures - + Do you want to remove the selected fixture(s)? Vol treure els fixtures seleccionats? @@ -2444,88 +2488,88 @@ L'arxiu seleccionat s'ha mogut o esborrat. Reassignar nom de fixtures - - + + (remapped) (reassignat) - + Import Fixtures List Importa la llista de Fixtures - + Fixtures List (*%1) Llista de Fixtures (*%1) - + All Files (*.*) Tots els arxius (*.*) - + All Files (*) Tots els arxius (*) - + Do you want to automatically connect fixtures with the same name? Voleu connectar automàticament els fixtures amb el mateix nom? - + Generic Dimmer Dimmer genèric - + Delete Fixtures Esborrar Fixtures - + Do you want to delete the selected items? Vol esborrar els ítems seleccionats? - + Invalid operation Operació invàlida - + You are trying to clone a fixture on an address already in use. Please fix the target list first. Està tractant de clonar un fixture a una adreça en us. Si us plau arregli la llista de destinació primer. - - - - + + + + Invalid selection Selecció invàlida - - - + + + Please select a source and a target fixture or channel to perform this operation. Si us plau, seleccioni un fixture o canal d'origen i destinació per fer aquesta operació. - + To perform a fixture remap, please select fixtures on both lists. Per fer la reassignació de fixtures, si us plau seleccioni fixtures a ambdues llistes. - + This might take a while... Això pot trigar una estona... - + Cancel Cancelar @@ -2538,12 +2582,12 @@ L'arxiu seleccionat s'ha mogut o esborrat. Seleccioni un fixture - + No fixtures available No hi ha fixtures disponibles - + Go to the Fixture Manager and add some fixtures first. Anar al Gestor de Fixtures i afegir algun fixture primer. @@ -2600,7 +2644,7 @@ L'arxiu seleccionat s'ha mogut o esborrat. FunctionLiveEditDialog - + Function Live Edit Editar la funció en viu @@ -2608,194 +2652,194 @@ L'arxiu seleccionat s'ha mogut o esborrat. FunctionManager - + New &scene Nova e&scena - + New c&haser Nou c&haser - + New se&quence Nova se&qüència - + New c&ollection Nova c&ol·lecció - + New E&FX Nou E&FX - + New &RGB Matrix nova Matriu &RGB - + New scrip&t Nou script&t - + New au&dio Nou au&dio - + New vid&eo Nou &vídeo - + New fo&lder Nova Car&peta - + Select Startup Function Seleccioni Funció d'arranc - + Function &Wizard &Assistent de Funcions - + &Clone &Clonar - + &Delete &Esborrar - + Select &all Seleccionar &tot - + New Scene Nova Escena - + New Chaser Nou Chaser - + New Sequence Nova Seqüència - + New Collection Nova Col·lecció - + New EFX Nou EFX - + New RGB Matrix Nova Matriu RGB - + New Script Nou Script - + Open Audio File Obrir arxiu d'Audio - + Audio Files (%1) Arxius d'Audio (%1) - - + + All Files (*.*) Tots els arxius (*.*) - - + + All Files (*) Tots els arxius (*) - + Unsupported audio file Arxiu d'audio no suportat - + This audio file cannot be played with QLC+. Sorry. Aquest arxiu d'audio no es pot ser reproduir amb QLC+. Ho sento. - + Open Video File Obrir Arxiu de Vídeo - + Video Files (%1) Arxius de Vídeo (%1) - + Unsupported video file Arxiu de vídeo no suportat - + This video file cannot be played with QLC+. Sorry. Aquest vídeo no es pot reproduir amb QLC+. Ho sento. - + Do you want to DELETE folder: Vol ESBORRAR la carpeta: - + Do you want to DELETE functions: Vol ESBORRAR funcions: - + (This will also DELETE: (Això ESBORRARÀ també: - + Delete Functions Esborrar funcions - + Function Funció - + (Copy) (Copiar) @@ -3080,32 +3124,32 @@ p, li { white-space: pre-wrap; } Widgets - + %1 group %1 grup - + Error Error - + %1 has no capability supported by this wizard. %1 no te les capacitats suportades per aquest assistent. - + Presets solo frame Marc de solo presets - + Click & Go RGB RGB Click & Go - + Click & Go Macro Macro Click & Go @@ -3113,27 +3157,27 @@ p, li { white-space: pre-wrap; } GrandMasterSlider - + GM GM - + Grand Master <B>limits</B> the maximum value of Gran Master <B>limita</B> el valor màxim de - + Grand Master <B>reduces</B> the current value of Gran Master <B>redueix</B> el valor actual de - + intensity channels canals d'intensitat - + all channels tor els canals @@ -3234,45 +3278,45 @@ p, li { white-space: pre-wrap; } InputOutputManager - + Add U&niverse Afegir U&nivers - + &Delete Universe &Esborra Univers - + Universe name: Nom del Univers: - + Passthrough pas a través, de moment deix Passthrough Passthrough - - + + Universe %1 Univers %1 - - + + Delete Universe Esborrar Univers - + The universe you are trying to delete is patched. Are you sure you want to delete it? L'univers que està intentant esborrar està assignat. Estau segur de voler esborrar-lo? - + There are some fixtures using the universe you are trying to delete. Are you sure you want to delete it? Alguns fixtures estan emprant l'univers que està intentant esborrar. Està segur de voler-lo esborrar? @@ -3381,20 +3425,20 @@ p, li { white-space: pre-wrap; } Monitor de nivell - - - + + + Error Error - - + + Output line already assigned Línia de Sortida ja assignada - + An error occurred while trying to open the selected device line. This can be caused either by a wrong system configuration or an unsupported input/output mode. Please refer to the plugins documentation to troubleshoot this. @@ -3403,67 +3447,67 @@ Això pot ser degut a una configuració errònea del sistema o a un modus d&apos Si us plau, consulteu la documentació dels plugins per solucionar això. - - + + Existing Input Profile perfil d'Entrada existent - - + + An input profile at %1 already exists. Do you wish to overwrite it? El perfil d'Entrada en %1 ja existeix. El voleu sobreescriure? - - + + Save Input Profile Desar el perfil d'Entrada - - + + Input Profiles (*.qxi) Perfil d'Entrada (*.qxi) - - + + Saving failed Error al Desar - + Unable to save the profile to %1 Impossible desar el perfil a %1 - + Delete profile Esborrar perfil - + Do you wish to permanently delete profile "%1"? Voleu esborar permanentment aquest perfil "%1"? - + File deletion failed Error al eliminar l'arxiu - + Unable to delete file %1 Impossible esborrar l'arxiu %1 - + Unable to save %1 to %2 Impossible desar %1 a %2 - + Default device Dispositu per defecte @@ -3476,188 +3520,272 @@ Si us plau, consulteu la documentació dels plugins per solucionar això.Editor de Perfil d'Entrada - + General General - + The name of the company that made the device Nom de la companyia - + The device's model name Nom del model del dispositiu - + Manufacturer Fabricant - + Model Model - - + + Type Tipus - + MIDI Global Settings Ajustos Globals de MIDI - + When MIDI notes are used, send a Note Off when value is 0 Quan s'utilitzen les notes MIDI, envieu Note Off quan el valor és 0 - - Channels - Canals - - - + + Channel Canal - + + Name Nom - + Custom feedback Feedback personalitzat - + Upper value Valor superior - + Lower value Valor inferior - - + Behaviour Comportament - + Add a new channel description Afegir una nova descripció per el canal - + Remove the selected channels Eliminar els canals seleccionats - + Edit the selected channel Editar el canal selecionat - + Automatically add channels to the list when you wiggle the device's controls Afegir automàticament canals a la llista cuant mogui els controls del dispositiu - + + Input Mapping + Mapatge d'Entrada + + + Movement Moviment - + Absolute Absolut - + Relative Relatiu - + Generate an extra Press/Release when toggled Generar una ordre addicional de Pressionar / Deixar anar Quan S'activa - + + + MIDI channel + Canal MIDI + + + + Colors + Colors + + + + Remove the selected color + Elimina el color seleccionat + + + + Add a new color + Afegir un nou color + + + + Value + Valor + + + + Label + Etiqueta + + + + Color + Color + + + + MIDI Channels + Canals MIDI + + + + Add a new MIDI channel + Afegir un nou canal MIDI + + + + Remove the selected MIDI channel + Elimina el canal MIDI seleccionat + + + Sensitivity Sensibilitat - + File not writable Arxiu només de lectura - + You do not have permission to write to the file %1. You might not be able to save your modifications to the profile. No teniu permissos per escriure al arxiu %1. Pot se que no sigui possible desar les modificacions al perfil. - + + From plugin settings + Des de la configuració del connector + + + Missing information Falta informació - + Manufacturer and/or model name is missing. Falta el nom del fabricant o model. - - + + Channel already exists El canal ja existeix - - + + Channel %1 already exists El Canal %1 ja existeix - + Delete channels Esborrar canals - + Delete all %1 selected channels? Esborrar els %1 canals seleccionats? - + Channel wizard activated Assistent de Canals activat - + You have enabled the input channel wizard. After clicking OK, wiggle your mapped input profile's controls. They should appear into the list. Click the wizard button again to stop channel auto-detection. Note that the wizard cannot tell the difference between a knob and a slider so you will have to do the change manually. Teniu activat l'assistent de canal d'Entrada. Després de prema OK mogui els controls mapejats del seu perfil d'Entrada. Apareixeran a la llista. Premi de nou el botó de l'assistent per atura l'autodetecció de canals. - + + + Enter value + Valor d'Entrada + + + + Feedback value + Valor de Feedback + + + + + Enter label + Etiqueta d'Entrada + + + + Color label + Etiqueta del Color + + + + MIDI channel label + Canal MIDI + + + Button %1 Botó %1 - + Slider %1 Slider %1 @@ -3690,65 +3818,50 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Entrada Externa - + When toggled, you can click an external button to assign it to this widget. Si està actiu, pot pressionar un botó extern per assignar a aquest widget. - + Auto Detect Detectar Automàticament - + Input Universe Univers d'Entrada - + Input Channel Canal d'Entrada - + The input universe that sends data to this widget L'univers d'entrada que envia dades a aquest widget - + Custom Feedback Feedback personalitzat - + The particular input channel within the input universe that sends data to this widget El canal d'Entrada dins aquest univers d'Entrada que envia dades a aquest widget - + Choose an external input universe & channel that this widget should listen to. Triar l'univers i el canal d'Entrada que aquest grup ha d'escoltar. - + Choose... Triar... - - - Custom feedback - Feedback personalitzat - - - - Lower value - Valor inferior - - - - Upper value - Valor superior - Monitor @@ -3905,14 +4018,14 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Fons - - + + Select background image Seleccioni la imatge de fons - - + + Images Imatges @@ -4200,12 +4313,12 @@ Note that the wizard cannot tell the difference between a knob and a slider so y PlaybackSlider - + Select Seleccionar - + Flash Flash @@ -4221,35 +4334,30 @@ Note that the wizard cannot tell the difference between a knob and a slider so y QObject - + Operate Funcionar tal vegada sería millor en aquest cas. Operació - + Design Disseny - - + + Reversed Invertit - + Page: %1 Pàgina: %1 RDMManager - - - Form - Formulari - Scan for RDM devices... @@ -4670,22 +4778,22 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Cap - + No fixture group to control Cap grup per controlar - + Select image Seleccionar imatge - + Images Imatges - + Sequence Seqüències @@ -4746,106 +4854,106 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Activar tots els canals de totos els fixtures - + Enable all channels in current fixture Activar tots els canals de aquest fixture - + Disable all channels in current fixture Desactivar tots els canals d'aquest fixture - + Copy current values to clipboard Copiar els valors actuals al porta-retalls - + Paste clipboard values to current fixture Enganxar els valors del porta-retalls al fixture actual - + Copy current values to all fixtures Copiar els valors actuals a tots els fixtures - + Color tool for CMY/RGB-capable fixtures Eina de color per fixtures amb capacitats CMY/RGB - + Position tool for moving heads/scanners Eina de posicionament per a capçals mòbils o scanners - + Switch between tab view and all channels view Canviar de la vista de pestanyes a la vista de canals - + Toggle blind mode Blind es Cec deix Blind de moment Activar/Desactivar Mode Blind - + Show/Hide speed dial window Mostra/Amaga la finestra del selector de velocitat - + Clone this scene and append as a new step to the selected chaser Clonar aquesta escena i afegir-la com un nou pas al chaser seleccionat - + Go to next fixture tab Anar a la pestanya següent - + Go to previous fixture tab Anar a la pestanya anterior - + None Cap - + Scene name: Nom de la Escena: + - All fixtures Tots els fixtures + - Generic Genèric - + Remove fixtures Eliminar fixtures - + Do you want to remove the selected fixture(s)? Vol eliminar el(s) fixture(s) seleccionats? + - Channels Groups Grups de Canals @@ -5059,7 +5167,7 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Permet universos sense apedaçar - + <Double click here to enter channel number manually> <Faixi doble click aquí per ingressar manualment el número del canal> @@ -5365,119 +5473,119 @@ Durada: %3 SimpleDesk - + View mode Mode Vista - + Previous page Pàgina Anterior - + Current page Pàgina Actual - + Next page Pàgina Següent - + Reset universe Reiniciar Univers - + Universe Univers - - + + Cue Stack Cue Stack - + Playback Reproduir - + Previous cue Cue Anterior - + Stop cue stack Atura cue stack - + Next cue Següent Cue - + Clone cue stack Clonar cue stack - + Edit cue stack Editar Cue Stack - + Record cue Pot ser Record aquí por voler dir gravar????? Desar Cue - + Channel groups Grups de Canals - + Cue Stack - Playback %1 Cue Stack - Playback %1 - + No selection Cap selecció - + Cue name Nom del Cue - + Multiple Cues Múltiples Cues - + Delete cue Esborrar Cue - + Clone Cue Stack Clonar Cue Stack - + Clone To Playback# Clonar a Playback# - + Cue %1 Cue %1 @@ -5485,32 +5593,32 @@ Durada: %3 SpeedDial - + Hours Hores - + Minutes Minuts - + Seconds Segons - + Milliseconds Milisegons - + Infinite Infinit - + Tap Tap @@ -5518,17 +5626,17 @@ Durada: %3 SpeedDialWidget - + Fade In Fade In - + Fade Out Fade Out - + Hold Espera @@ -5618,17 +5726,17 @@ Durada: %3 VCButton - + Choose... Triar... - + None Cap - + Button %1 Botó %1 @@ -5643,17 +5751,17 @@ Durada: %3 Imatges (%1) - + Toggle Blackout Activar/Desactivar Blackout - + Stop ALL functions! Aturar TOTES les funcions! - + Icon Icona @@ -5681,82 +5789,92 @@ Durada: %3 Mode Interruptor on/off - + Flash the assigned function with this button Activa la funció assignada mentre el botó estigui premut - + Flash function (only for scenes) Mode Flash (només per escenes) - + + Override priority + Sobreescriu la prioritat + + + + Force LTP + Força LTP + + + Toggle Blackout Blackout On/Off - + Stop All Functions Atura Totes les Funcions - + Fade time: Durada de Fade: - + Adjust function intensity when it is running Ajusta la intensitat de la funció quant està en execució - + Adjust Function Intensity Ajustar la intensitat de la funció - + Function's adjusted intensity percentage when run Percentatge d'intensitat pre-ajustat de la funció quant s'executa - + General General - + Button label Etiqueta del Botó - + Text to display on the button Texte a mostrar al botó - + Function Funció - + The function that this button controls La funció que es controlada per aquest botó - + Attach a function to this button Enllaçar una funció a aquest botó - + Detach the button's function attachment Desenllaçar la funció del botó - + No function Cap funció @@ -5847,64 +5965,64 @@ Durada: %3 VCCueList - + Show/Hide crossfade sliders Motrar/Amagar els sliders de crossfade - - + + Play/Pause Cue list Reprodueix/Pausa Cue List - - + + Stop Cue list Atura Cue list - + Go to previous step in the list Anar al pas anterior de la llista - + Go to next step in the list Anar al pas seqüent de la llista - + Cue list Lliste de Cues - + Play/Stop Cue list Reproduir/Aturar Llista de Cues - + Pause Cue list Pausar Llista de Cues - + Fade In Fade In - + Fade Out Fade Out - + Duration Durada - + Notes Notes @@ -6069,7 +6187,7 @@ Durada: %3 VCFrame - + Add Afegir @@ -6122,17 +6240,17 @@ Durada: %3 Nom de la pàgina - + External Input - Enable Activar entrada externa - + External Input - Previous Page Entrada Externa - Pàgina Anterior - + External Input - Next Page Entrada Externa - Pàgina Següent @@ -6165,17 +6283,17 @@ Durada: %3 VCLabel - + Label Etiqueta - + Rename Label Reanomenar Etiqueta - + Caption: Títol: @@ -6183,42 +6301,42 @@ Durada: %3 VCMatrix - + Animation %1 Animació %1 - + End Color Reset Restablir el Color Final - + Start color Red component Component Vermell del color inicial - + Start color Green component Component Verd del color inicial - + Start color Blue component Component Blau del color inicial - + End color Red component Component Vermell del color final - + End color Green component Component Verd del color final - + End color Blue component Component Blau del color final @@ -6421,48 +6539,48 @@ Durada: %3 Afegir text - + No function Cap funció - + Start Color Color d'inici - + Start Color Knob Perilla color inicial - + End Color Color de final - + End Color Knob Perilla color final - + End Color Reset Restablir color final - + Animation Animació - - + + Text Text - + Enter a text Entri un text @@ -6713,12 +6831,12 @@ Durada: %3 VCSlider - + Slider %1 Slider %1 - + Reset channels override Restaurar l'override de canals @@ -6736,72 +6854,72 @@ Durada: %3 General - + Value display style Estil de Visualització dels Valors - + Show exact DMX values Mostrar el valor DMX exacte - + Actual Actual - + Show value as percentage Mostrar el valor com a percentatge - + Percentage Percentatge - + Widget name Nom del widget - + Name of the slider Nom del slider - + Slider movement Moviment del slider - + Normal Normal - + Inverted Invertit - + Widget appearance Aparença del widget - + Slider Slider - + Knob Perilla - + Catch up with the external controller input value Actualitzar amb el valor de l'entrada del controlador extern @@ -7269,17 +7387,17 @@ Durada: %3 Mostra el camp milisegons - + Multiply by 2 Input Entrada del Multiplicador per 2 - + Divide by 2 Input Entrada del DIvisor per 2 - + Factor Reset Input Entrada de Reinici de Factor @@ -7287,68 +7405,68 @@ Durada: %3 VCWidget - + Button Botó - + Slider Slider - + XYPad XY Pad - + Frame Marc - + Solo frame Marc Solo - + Speed dial Selector de Velocitat - + Cue list Llista de Cues - + Label Etiqueta - + Audio Triggers Disparador d'Àudio - + Animation Animació - + Clock Rellotge + - Unknown Desconegut - + This widget has no properties Aquest widget no te propietats @@ -7546,12 +7664,12 @@ Durada: %3 Nom del preset - + Pan / Horizontal Axis Pan / Eix horitzontal - + Tilt / Vertical Axis Tilt / Eix vertical @@ -7581,45 +7699,45 @@ Durada: %3 Invertit - + Width Ample - + Height Altura - + Remove fixtures Treure fixtures - + Do you want to remove the selected fixtures? Vol eliminar el fixture seleccionat? - - + + Error Error - + The selected Scene does not include any Pan or Tilt channel. Please select one with such channels. La Escena seleccionada no incloeix cap canal de Pan o Tilt. Si us plau seleccionau un d'aquests canals. - + Please select at least one fixture or head to create this type of preset! Si us plau, seleccioneu al menys un fixture o capçal per crear aquest tipus de preset ! - + Fixture Group Grup de Fixtures @@ -7752,12 +7870,12 @@ Si us plau seleccionau un d'aquests canals. VideoItem - + Fullscreen Pantalla completa - + Screen %1 Pantalla %1 diff --git a/ui/src/qlcplus_cz_CZ.ts b/ui/src/qlcplus_cz_CZ.ts index 8b527f636c..4a56a38a7b 100644 --- a/ui/src/qlcplus_cz_CZ.ts +++ b/ui/src/qlcplus_cz_CZ.ts @@ -188,12 +188,12 @@ Model zařízení - + Fixtures found: %1 Počet nalezených šablon zařízení: %1 - + Dimmers Dimmery Stmívače @@ -525,374 +525,374 @@ App - + Fixtures Zařízení - + Functions Funkce - + Shows Představení - + Virtual Console Virtuální pracoviště - + Simple Desk Jednoduchý pult - + Inputs/Outputs Vstupy/výstupy - + Cannot exit in Operate mode Nelze ukončit v režimu Provoz - + You must switch back to Design mode to close the application. Pro uzavření aplikace se nejprve musíte se přepnout zpět do režimu Návrhu. - + Close Zavřít - + Do you wish to save the current workspace before closing the application? Přejete si uložit rozdělanou práci před ukončením aplikace? - + Close the application? Zavřít aplikaci? - + Do you wish to close the application? Opravdu si přejete uzavřít aplikaci? - + Starting Q Light Controller Plus Startuje se Q Light Controller Plus - + - New Workspace - Nové pracoviště - + Exit Zavřít - + Switch to Design Mode Přepnout do režimu Návrhu - + There are still running functions. Really stop them and switch back to Design mode? Některé funkce stále běží. Opravdu si přejete běžící funkce zastavit a přejít zpět do režimu Návrhu? - + Design Návrh - + Switch to design mode Přepnout do režimu Návrhu - + Operate Provoz - - + + Switch to operate mode Přepnout do režimu Provoz - + &New &Nový - + CTRL+N File|New CTRL+N - + &Open &Otevřít - + CTRL+O File|Open CTRL+O - + &Save &Uložit - + CTRL+S File|Save CTRL+S - + Save &As... Uložit &jako... - + &Operate &Provoz - + CTRL+F12 Control|Toggle operate/design mode CTRL+F12 - + &Monitor &Monitor - + CTRL+M Control|Monitor CTRL+M - + Address Tool Pomocník adresace - + Toggle &Blackout Režim &Blackout - + Live edit a function Live editace funkce - + Toggle Virtual Console Live edit Zapni/vypni úpravy Virtuálního pracoviště - + Dump DMX values to a function Zachytit DMX hodnoty do funkce - + CTRL+D Control|Dump DMX CTRL+D - + Stop ALL functions! Zastavit VŠECHNY funkce! - + Fade 1 second and stop Zeslabení 1 sekundu a poté zastavit - + Fade 5 seconds and stop Zeslabení 5 sekund a poté zastavit - + Fade 10 second and stop Zeslabení 10 sekund a poté zastavit - + Fade 30 second and stop Zeslabení 30 sekund a poté zastavit - + Toggle Full Screen Přepnout na celou obrazovku - + CTRL+F11 Control|Toggle Full Screen CTRL+F11 - + &Index &Index - + SHIFT+F1 Help|Index SHIFT+F1 - + &About QLC+ &O programu QLC+ - + Quit QLC+ Ukončit QLC+ - + Workspace Pracoviště - + Unable to read from file Ze souboru nelze číst - + Unable to write to file Do souboru nelze zapisovat - + A fatal error occurred Nastala kritická chyba - + Unable to access resource K tomuto zdroji se nepodařilo získat přístup - + Unable to open file for reading or writing Nelze otevřít soubor pro čtení nebo zápis - + Operation was aborted Operace byla zrušena - + Operation timed out Časový limit operace vypršel - + An unspecified error has occurred. Nice. No, nastala neočekávaná chyba. Co dodat, mrzí nás to. - + File error Chyba souboru - - - + + + Do you wish to save the current workspace? Changes will be lost if you don't save them. Přejete si uložit rozdělanou práci? Veškeré změny budou zahozeny, pokud je teď neuložíte. - + New Workspace Nové Pracoviště - - - + + + Open Workspace Otevřít Pracoviště - - + + Workspaces (*%1) Pracoviště (*%1) - - + + All Files (*.*) Všechny soubory (*.*) - - + + All Files (*) Všechny soubory (*) - + Save Workspace As Uložit Pracoviště jako - + Error Chyba - + File not found! The selected file has been moved or deleted. Soubor nebyl nalezen! Zvolený soubor byl asi smazán nebo přesunut. - + Warning Výstraha - + Some errors occurred while loading the project: Nastaly nejaké problémy při otevírání projektu: @@ -915,12 +915,12 @@ Zvolený soubor byl asi smazán nebo přesunut. Automaticky zavřít po stisku klávesy - + Assign Key Přiřadit klávesu - + Hit the key combination that you wish to assign. You may hit either a single key or a combination using %1, %2, and %3. Stiskněte kombinaci kláves, kterou chcete přiřadit. Můžete stisknout jen jednu klávesu nebo kombinaci více kláves %1, %2, a %3. @@ -1047,23 +1047,23 @@ Zvolený soubor byl asi smazán nebo přesunut. AudioItem - - + + Preview Left Channel Ukázka levého kanálu - + Preview Right Channel Ukázka pravého kanálu - + Preview Stereo Channels Ukázka v režimu stereo - + Preview Mono Ukázka v režimu mono @@ -1131,52 +1131,52 @@ Zvolený soubor byl asi smazán nebo přesunut. Vstup - + None Nic - + DMX DMX - + Function Funkce - + VC Widget Ovladač Virtuálního pracoviště - + %1 channels %1 kanálů - + No function Bez funkce - + No widget Bez ovladače - + Not assigned Nepřiřazeno - + Volume Bar Regulace hlasitosti - + #%1 (%2Hz - %3Hz) #%1 (%2Hz - %3Hz) @@ -1234,12 +1234,12 @@ Zvolený soubor byl asi smazán nebo přesunut. - + Error Chyba - + You are trying to overwrite a system template! Please choose another name and the template will be saved in your channel modifier's user folder. Pokoušíte se přepsat systémovou šablonu! Zvolte prosím jiný název a šablona bude uložena do Vaší složky modifikací a změn kanálů. @@ -1254,13 +1254,13 @@ Zvolený soubor byl asi smazán nebo přesunut. - + Name Název - + Type Typ @@ -1280,27 +1280,27 @@ Zvolený soubor byl asi smazán nebo přesunut. - + Selected Označen - + Channel properties configuration Konfigurace vlastností kanálu - + Can fade Může být zeslaben - + Behaviour Chování - + Modifier Modifikátor @@ -1324,19 +1324,19 @@ Zvolený soubor byl asi smazán nebo přesunut. - + Fade In Zesílení - + Hold Podržet - + Fade Out Zeslabení @@ -1556,47 +1556,47 @@ Zvolený soubor byl asi smazán nebo přesunut. - + Cut Vyjmout - + Copy Kopírovat - + Paste Vložit - + Paste error Chyba vložení - + Trying to paste on an incompatible Scene. Operation canceled. Pokoušíte se vložit nekompatibilní Scénu. Operace byla zrušena. - + Common Fade In Společné zesílení - + Common Fade Out Společné zeslabení - + Common Hold Společné pozastavení - + Multiple Steps Kroky @@ -1652,12 +1652,12 @@ Zvolený soubor byl asi smazán nebo přesunut. ConsoleChannel - + Intensity Intenzita - + Reset this channel Uvolnit tenhle kanál @@ -1718,6 +1718,83 @@ Zvolený soubor byl asi smazán nebo přesunut. Střih + + CustomFeedbackDialog + + + Custom Feedback Configuration + + + + + Value + Hodnota + + + + Label + Popisek + + + + Color + + + + + Values + Hodnoty + + + + Lower Value + + + + + Monitor Value + + + + + Upper Value + + + + + + + Color Selection + + + + + MIDI Channel + + + + + Upper Channel + + + + + Lower Channel + + + + + Monitor Channel + + + + + + + From plugin settings + + + DmxDumpFactory @@ -1776,49 +1853,16 @@ Zvolený soubor byl asi smazán nebo přesunut. Název Scény: - + Dump all channels (%1 Universes, %2 Fixtures, %3 Channels) Zachytit všechny kanály (%1 Větve, %2 Zařízení, %3 Kanály) - + New Scene From Live %1 Nová scéna z Provozu %1 - - DocBrowser - - - %1 - Document Browser - %1 - Prohlížení dokumentu - - - - Backward - Od konce - - - - Forward - Od začátku - - - - Index - Obsah - - - - About Qt - O aplikaci Qt - - - - Close this window - Zavřít tohle okno - - EFXEditor @@ -2099,12 +2143,12 @@ Zvolený soubor byl asi smazán nebo přesunut. Ukázat co EFX efekt udělá, když poběží - + Remove fixtures Odebrat zařízení - + Do you want to remove the selected fixture(s)? Opravdu si přejete odebrat označená zařízení? @@ -2446,88 +2490,88 @@ Zvolený soubor byl asi smazán nebo přesunut. Přesunout názvy zařízení - - + + (remapped) (přesunuto) - + Import Fixtures List Importovat seznam zařízení - + Fixtures List (*%1) Seznam zařízení (*%1) - + All Files (*.*) Všechny soubory (*.*) - + All Files (*) Všechny soubory (*) - + Do you want to automatically connect fixtures with the same name? - + Generic Dimmer Obecný stmívač - + Delete Fixtures Smazat zařízení - + Do you want to delete the selected items? Opravdu si přejete SMAZAT označená zařízení? - + Invalid operation Neplatná operace - + You are trying to clone a fixture on an address already in use. Please fix the target list first. Snažíte se duplikovat zařízení na adresu, která je už použita. Prosím, nejprve upravte cílový seznam. - - - - + + + + Invalid selection Chybná volba - - - + + + Please select a source and a target fixture or channel to perform this operation. Prosím zvolte zdrojové a cílové zařízení nebo kanál k provedení této operace. - + To perform a fixture remap, please select fixtures on both lists. K provedení přesunu zařízení, prosím zvolte zařízení v obou seznamech. - + This might take a while... Tato operace může nějakou chvilku trvat... - + Cancel Zrušit @@ -2540,12 +2584,12 @@ Zvolený soubor byl asi smazán nebo přesunut. Zvolit zařízení - + No fixtures available Žádná dostupná zařízení - + Go to the Fixture Manager and add some fixtures first. Nejprve přidejte zařízení v panelu Zařízení. @@ -2602,7 +2646,7 @@ Zvolený soubor byl asi smazán nebo přesunut. FunctionLiveEditDialog - + Function Live Edit Live editace funkce @@ -2610,195 +2654,195 @@ Zvolený soubor byl asi smazán nebo přesunut. FunctionManager - + New &scene Nová Scéna (CTRL+&s) - + New c&haser Nové Prolínání (CTRL+&h) - + New se&quence Nová Sekvence (CTRL+&q) - + New c&ollection Nová Kolekce(CTRL+&o) - + New E&FX Nový EFX(CTRL+&f) - + New &RGB Matrix Nová RGB šablona (CTRL+&R) - + New scrip&t Nový skript (CTRL+&t) - + New au&dio Nový zvuk (CTRL+&d) - + New vid&eo Nové vid&eo - + New fo&lder Nová s&ložka - + Select Startup Function Volba funkce při spuštění - + Function &Wizard Tvorba funkcí (CTRL+&W) - + &Clone Duplikovat (CTRL+&C) - + &Delete Smazat (CTRL+&D) - + Select &all Označit vše (CTRL+&a) - + New Scene Nová Scéna - + New Chaser Nové Prolínání - + New Sequence Nová Sekvence - + New Collection Nová Kolekce - + New EFX Nový EFX - + New RGB Matrix Nový RGB šablona - + New Script Nový Skript - + Open Audio File Otevřít soubor zvuku - + Audio Files (%1) Zvukové soubory (%1) - - + + All Files (*.*) Všechny soubory (*.*) - - + + All Files (*) Všechny soubory (*) - + Unsupported audio file Nepodporovaný soubor zvuku - + This audio file cannot be played with QLC+. Sorry. Tento soubor zvuku nemůže být přehrán v QLC+. Je nám to moc líto. - + Open Video File Otevřít soubor videa - + Video Files (%1) Video soubory (%1) - + Unsupported video file Nepodporovaný soubor videa - + This video file cannot be played with QLC+. Sorry. Tento soubor videa nemůže být přehrán v QLC+. Je nám to moc líto. - + Do you want to DELETE folder: Do you want to DELETE foler: Opravdu si přejete si SMAZAT složku: - + Do you want to DELETE functions: Opravdu si přejete SMAZAT funkce: - + (This will also DELETE: Tato operace také VYMAŽE: - + Delete Functions Smazat funkce - + Function Funkce - + (Copy) (kopie) @@ -3085,32 +3129,32 @@ p, li { white-space: pre-wrap; } Odebrat - + %1 group skupina %1 - + Error Chyba - + %1 has no capability supported by this wizard. %1 nemá funkce podporované tímto průvodcem. - + Presets solo frame Přednastavení samostatného rámečku - + Click & Go RGB Rychlá volba RGB - + Click & Go Macro Rychlá volba Makro @@ -3118,27 +3162,27 @@ p, li { white-space: pre-wrap; } GrandMasterSlider - + GM GM - + Grand Master <B>limits</B> the maximum value of GM -Hlavní šavle <B>nastaví</B> omezení maximální úrovně - + Grand Master <B>reduces</B> the current value of GM -Hlavní šavle <B>reguluje</B> aktuální úroveň - + intensity channels intenzity kanálů - + all channels všech kanálů @@ -3239,45 +3283,45 @@ p, li { white-space: pre-wrap; } InputOutputManager - + Add U&niverse Přidat větev - + &Delete Universe Universe Smazat větev - + Universe name: Název větve: - + Passthrough Průhozí - - + + Universe %1 Větev %1 - - + + Delete Universe Zmazat větev - + The universe you are trying to delete is patched. Are you sure you want to delete it? Vetvev, kterou se snažíte smazat je propojená. Opravdu si ji přejete smazat? - + There are some fixtures using the universe you are trying to delete. Are you sure you want to delete it? Některá zařízení používají větev, kterou se pokoušíte smazat. Opravdu ji chcete smazat? @@ -3384,20 +3428,20 @@ p, li { white-space: pre-wrap; } Monitor hlasitosti - - - + + + Error Chyba - - + + Output line already assigned Výstupní linka již byla přiřazena - + An error occurred while trying to open the selected device line. This can be caused either by a wrong system configuration or an unsupported input/output mode. Please refer to the plugins documentation to troubleshoot this. @@ -3406,67 +3450,67 @@ To může být způsobeno nesprávnou konfigurací systému nebo nepodporovaným Použijte nápovědu k pluginu (zásuvnému modulu) pro vyřešení tohoto problému. - - + + Existing Input Profile Existující profil vstupu - - + + An input profile at %1 already exists. Do you wish to overwrite it? Profil vstupu na %1 již existuje. Opravdu si přejete jej přepsat a nahradit? - - + + Save Input Profile Uložit profil vstupu - - + + Input Profiles (*.qxi) Profily vstupu (*.qxi) - - + + Saving failed Uložení se nezdařilo - + Unable to save the profile to %1 Nelze uložit profil do %1 - + Delete profile Smazat profil - + Do you wish to permanently delete profile "%1"? Opravdu si přejete nenávratně SMAZAT profil "%1"? - + File deletion failed Smazání souboru se nezdařilo - + Unable to delete file %1 Nelze smazat soubor %1 - + Unable to save %1 to %2 Nelze uložit %1 do %2 - + Default device Standardní zařízení @@ -3479,188 +3523,272 @@ Použijte nápovědu k pluginu (zásuvnému modulu) pro vyřešení tohoto probl Editor profilu vstupu - + General Obecné - + The name of the company that made the device Název výrobce zařízení - + The device's model name Název modelu zařízení - + Manufacturer Výrobce - + Model Model - - + + Type Typ - + MIDI Global Settings Globální MIDI nastavení - + When MIDI notes are used, send a Note Off when value is 0 Když jsou použity MIDI noty, poslat Note Off když je hodnota 0 - - Channels - Kanály - - - + + Channel Kanál - + + Name Název - + Custom feedback Vlastní odezva - + Upper value Horní hodnota - + Lower value Dolní hodnota - - + Behaviour Chování - + Add a new channel description Přidat nový popis ke kanálu - + Remove the selected channels Odebrat zvolené kanály - + Edit the selected channel Upravit zvolený kanál - + Automatically add channels to the list when you wiggle the device's controls Automaticky přidat kanály do seznamu, když spojíte ovladače zažízení - + + Input Mapping + + + + Movement Pohyb - + Absolute Absolutní - + Relative Relativní - + Generate an extra Press/Release when toggled Generovat extra stlačení/uvolnění - + + + MIDI channel + + + + + Colors + + + + + Remove the selected color + + + + + Add a new color + + + + + Value + Hodnota + + + + Label + Popisek + + + + Color + + + + + MIDI Channels + + + + + Add a new MIDI channel + + + + + Remove the selected MIDI channel + + + + Sensitivity Citlivost - + File not writable Soubor není zapisovatelný - + You do not have permission to write to the file %1. You might not be able to save your modifications to the profile. Nemáte oprávnění zapisovat do souboru %1. Možná nebudete moci uložit Vaše změny v profilu. - + + From plugin settings + + + + Missing information Chybějící informace - + Manufacturer and/or model name is missing. Výrobce a/nebo název modelu nebyl vyplněn. - - + + Channel already exists Kanál již existuje - - + + Channel %1 already exists Kanál %1 již existuje - + Delete channels Smazat kanály - + Delete all %1 selected channels? Smazat všechny %1 zvolené kanály? - + Channel wizard activated Průvodce kanálů je aktivní - + You have enabled the input channel wizard. After clicking OK, wiggle your mapped input profile's controls. They should appear into the list. Click the wizard button again to stop channel auto-detection. Note that the wizard cannot tell the difference between a knob and a slider so you will have to do the change manually. Průvodce vstupních kanálů je aktivní. Po kliknutí na OK, spojíte Vámi přiřazené profily ovládání zařízení, která by se následně měla zobrazit v seznamu. Klikněte opět na tlačítko průvodce pokud chcete proces autodetekce zastavit.\n\n Mějte prosím na paměti, že průvodce nemůže rozlišit rozdíl mezi šavlí a tlačítkem a tak to budete muset později upravit ručně. - + + + Enter value + + + + + Feedback value + + + + + + Enter label + + + + + Color label + + + + + MIDI channel label + + + + Button %1 Tlačítko %1 - + Slider %1 Šavle %1 @@ -3693,65 +3821,50 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Externí vstup - + When toggled, you can click an external button to assign it to this widget. Je-li aktivní, bude dostupná volba externího tlačítka pro přiřazení k řízení tohoto virtuálního tlačítka. - + Auto Detect Automaticky detekovat - + Input Universe Větev vstupu - + Input Channel Vstupní kanál - + The input universe that sends data to this widget Větev vstupů, která bude odesílat data pro tento ovladač - + Custom Feedback Vlastní odezva - + The particular input channel within the input universe that sends data to this widget Kanál větve vstupů, který bude odesílat data pro tento ovladač - + Choose an external input universe & channel that this widget should listen to. Zvolte větev externího vstupu & kanál, který by měl tento ovladač řídit. - + Choose... Zvolit... - - - Custom feedback - Vlastní odezva - - - - Lower value - Dolní hodnota - - - - Upper value - Horní hodnota - Monitor @@ -3908,14 +4021,14 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Obrázek pozadí - - + + Select background image Zvolit obrázek pozadí - - + + Images Obrázky @@ -4205,12 +4318,12 @@ Note that the wizard cannot tell the difference between a knob and a slider so y PlaybackSlider - + Select Zvolit - + Flash Záblesk @@ -4226,34 +4339,29 @@ Note that the wizard cannot tell the difference between a knob and a slider so y QObject - + Operate Provoz - + Design Návrh - - + + Reversed Obrácený - + Page: %1 Strana: %1 RDMManager - - - Form - - Scan for RDM devices... @@ -4673,22 +4781,22 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Nic - + No fixture group to control Žádná skupina zařízení k ovládání - + Select image Volba obrázku - + Images Obrázky - + Sequence @@ -4748,105 +4856,105 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Zapnout všechny kanály zařízení - + Enable all channels in current fixture Zapnout všechny kanály v tomto zařízení - + Disable all channels in current fixture Vypnout všechny kanály v tomto zařízení - + Copy current values to clipboard Kopírovat aktuální hodnoty do schránky - + Paste clipboard values to current fixture Vložit hodnoty ze schránky do tohoto zařízení - + Copy current values to all fixtures Kopírovat aktuální hodnoty do všech zařízení - + Color tool for CMY/RGB-capable fixtures Nástroj volby barev pro typ CMY/RGB zažízení - + Position tool for moving heads/scanners Nástroj pozice pro pohyb hlav/scannerů - + Switch between tab view and all channels view Přepnout mezi zobrazením záložek a zobrazením kanálů - + Toggle blind mode Přepnout řežim ukázky - + Show/Hide speed dial window Zobrazit/Skrýt okno rychlé volby - + Clone this scene and append as a new step to the selected chaser Duplikovat tuto scénu a připojit ji jako nový krok do zvoleného prolínání - + Go to next fixture tab Přejít na další záložku zařízení - + Go to previous fixture tab Přejít na předchozí záložku zařízení - + None Nic - + Scene name: Název scény: + - All fixtures Všechna zařízení + - Generic Obecný - + Remove fixtures Odebrat zařízení - + Do you want to remove the selected fixture(s)? Opravdu si přejete odebrat označená zařízení? + - Channels Groups Skupiny kanálů @@ -5058,7 +5166,7 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Povolit nespojené větve - + <Double click here to enter channel number manually> <klikněte zde pro manuální zadání čísla kanálu> @@ -5364,118 +5472,118 @@ Délka: %3 SimpleDesk - + View mode Režim náhledu - + Previous page Předchozí stana - + Current page Aktuální strana - + Next page Daší strana - + Reset universe Restartovat větev - + Universe Větev - + Playback Přehrávání - - + + Cue Stack Zásobník střihů - + Previous cue Předchozí střih - + Stop cue stack Zastavit zásobník střihů - + Next cue Další střih - + Clone cue stack Duplikovat zásobník sřihů - + Edit cue stack Upravit zásobník střihů - + Record cue Nahrát střih - + Channel groups Skupiny kanálů - + Cue Stack - Playback %1 Zásobník střihů - Přehrávání %1 - + No selection Nevybráno - + Cue name Název střihu - + Multiple Cues Skupina střihů - + Delete cue Smazat sřih - + Clone Cue Stack Duplikovat zásobník střihu - + Clone To Playback# Duplikovat do přehrávání# - + Cue %1 Střih %1 @@ -5483,32 +5591,32 @@ Délka: %3 SpeedDial - + Hours Hodiny - + Minutes Minuty - + Seconds Sekundy - + Milliseconds Milisekundy - + Infinite Nekonečno - + Tap Ťuknout (TAP) @@ -5516,17 +5624,17 @@ Délka: %3 SpeedDialWidget - + Fade In Zesílení - + Fade Out Zeslabení - + Hold Podržet @@ -5616,17 +5724,17 @@ Délka: %3 VCButton - + Choose... Zvolit... - + None Nic - + Button %1 Tlačítko %1 @@ -5641,17 +5749,17 @@ Délka: %3 Obrázky (%1) - + Toggle Blackout Režim Blackout - + Stop ALL functions! Zastavit VŠECHNY funkce! - + Icon Ikona @@ -5664,37 +5772,37 @@ Délka: %3 Vlastnosti tlačítka - + General Obecné - + Button label Popisek tlačítka - + Text to display on the button Text, který se má zobrazit na tlačítku - + Function Funkce - + The function that this button controls Funkce kterou ovládá toto tlačítko - + Attach a function to this button Přiřadit funkci k tomuto tlačítku - + Detach the button's function attachment Odebrat přiřazenou funkci z tlačítka @@ -5714,47 +5822,57 @@ Délka: %3 Zapnout/Vypnout funkci - + Flash the assigned function with this button Bliknout funkcí přiřazenou k tomuto tlačítku - + Flash function (only for scenes) Bliknout funkcí (pouze pro scény) - + + Override priority + + + + + Force LTP + + + + Toggle Blackout Režim Blackout - + Stop All Functions Zastavit VŠECHNY funkce - + Fade time: Čas zesílení/zeslabení: - + Adjust function intensity when it is running Upravit intenzitu funkce pokud běží - + Adjust Function Intensity Upravit intenzitu funkce - + Function's adjusted intensity percentage when run Upravená procentuální intenzita funkce pokud běží - + No function Bez funkce @@ -5845,64 +5963,64 @@ Délka: %3 VCCueList - + Show/Hide crossfade sliders Zobrazit/Skrýt šavle prolínání - - + + Play/Pause Cue list Spustit/pozastavit seznam střihů - - + + Stop Cue list Zastavit seznam střihů - + Go to previous step in the list Přejít na předchotí krok v seznamu - + Go to next step in the list Přejít na další krok v seznamu - + Cue list Seznam střihů - + Play/Stop Cue list - + Pause Cue list - + Fade In Zesílení - + Fade Out Zeslabení - + Duration Délka - + Notes Poznámky @@ -6067,7 +6185,7 @@ Délka: %3 VCFrame - + Add Přidat @@ -6120,17 +6238,17 @@ Délka: %3 - + External Input - Enable Externí vstup - povolit rámeček - + External Input - Previous Page Externí vstup - Předchozí stránka - + External Input - Next Page Externí vstup - Následující stránka @@ -6163,17 +6281,17 @@ Délka: %3 VCLabel - + Label Popisek - + Rename Label Přejmenování popisku - + Caption: Titulek: @@ -6181,42 +6299,42 @@ Délka: %3 VCMatrix - + Animation %1 Animace %1 - + End Color Reset Konec resetu Barvy - + Start color Red component Počátek barvy Červené komponenty - + Start color Green component Počátek barvy Zelené komponenty - + Start color Blue component Počátek barvy Modré komponenty - + End color Red component Konečná barva Červené komponenty - + End color Green component Konečná barva Zelené komponenty - + End color Blue component Cílová barva Modré komponenty @@ -6419,48 +6537,48 @@ Délka: %3 Přidej text - + No function Bez funkce - + Start Color Počáteční barva - + Start Color Knob Knoflík Počáteční barvy - + End Color Konečná barva - + End Color Knob Knoflík konečné barvy - + End Color Reset Konečná barva resetu - + Animation Animace - - + + Text Text - + Enter a text Zadaj text @@ -6711,12 +6829,12 @@ Délka: %3 VCSlider - + Slider %1 Šavle %1 - + Reset channels override @@ -6734,72 +6852,72 @@ Délka: %3 Obecné - + Value display style Styl zobrazení hodnot - + Show exact DMX values Zobrazit přesnou DMX hodnotu - + Actual DMX hodnota - + Show value as percentage Zobrazit hodnotu jako procentuální vyjádření - + Percentage Procenta - + Widget name Název ovladače - + Name of the slider Název šavle - + Slider movement Posun šavle - + Normal Normální - + Inverted Převrácený - + Widget appearance Vzhled ovladače - + Slider Šavle - + Knob Knoflík - + Catch up with the external controller input value @@ -7267,17 +7385,17 @@ Délka: %3 Zobraz milisekundy - + Multiply by 2 Input Násobit vstup dvěma - + Divide by 2 Input Dělit vstup dvěma - + Factor Reset Input Faktor Resetu vstupu @@ -7285,68 +7403,68 @@ Délka: %3 VCWidget - + Button Tlačítko - + Slider Šavle - + XYPad 2D ovladač - + Frame Rámeček - + Solo frame Samostatný rámeček - + Speed dial Rychlá volba - + Cue list Seznam střihů - + Label Popisek - + Audio Triggers Zvukové spoušte - + Animation Animace - + Clock Hodiny + - Unknown Neznámý - + This widget has no properties Tento prvek/ovladač nemá žádné vlastnosti @@ -7544,12 +7662,12 @@ Délka: %3 Název přednastavení - + Pan / Horizontal Axis Otáčení / Vodorovná osa (X) - + Tilt / Vertical Axis Naklápění / Svislá osa (Y) @@ -7579,45 +7697,45 @@ Délka: %3 Převrácený - + Width Šířka - + Height Výška - + Remove fixtures Odebrat zařízení - + Do you want to remove the selected fixtures? Opravdu si přejete odebrat označená zařízení? - - + + Error Chyba - + The selected Scene does not include any Pan or Tilt channel. Please select one with such channels. Zvolená Scéna neobsahuje žádný kanál Natočení/Naklopení (pan/tilt). Vyberte prosím některý z těchto kanálů. - + Please select at least one fixture or head to create this type of preset! Prosím zvolte alespoň jedno zařízení nebo halvu pro vytvoření tohohle presetu! - + Fixture Group Skupina zařízení @@ -7750,12 +7868,12 @@ Vyberte prosím některý z těchto kanálů. VideoItem - + Fullscreen Celá obrazovka - + Screen %1 Obrazovka %1 diff --git a/ui/src/qlcplus_de_DE.ts b/ui/src/qlcplus_de_DE.ts index 89701b02ea..6c40493c84 100644 --- a/ui/src/qlcplus_de_DE.ts +++ b/ui/src/qlcplus_de_DE.ts @@ -189,12 +189,12 @@ Anzahl an leeren Kanälen zwischen den hinzugefügten Geräten - + Fixtures found: %1 Gefundene Geräte: %1 - + Dimmers Dimmer @@ -525,376 +525,376 @@ App - + - New Workspace - Neue Arbeitsfläche - + Cannot exit in Operate mode Im Betriebsmodus kann das Programm nicht beendet werden - + Fixtures Geräte - + Functions Funktionen - + Shows Shows - + Virtual Console Virtuelle Konsole - + Simple Desk Einfache Arbeitsfläche - + Inputs/Outputs Eingänge/Ausgänge - + You must switch back to Design mode to close the application. Du musst in den Designmodus wechseln um das Programm zu schließen. - + Close Schließen - + Do you wish to save the current workspace before closing the application? Willst du die aktuelle Arbeitsfläche vor dem Schließen speichern? - + Switch to Design Mode In den Entwurfsmodus wechseln - + There are still running functions. Really stop them and switch back to Design mode? Es gibt noch laufende Funktionen. Willst du die wirklich stoppen und in den Entwicklungsmodus wechseln? - + Design Entwurf - + Switch to design mode In den Entwurfsmodus wechseln - + Operate Betrieb - - + + Switch to operate mode In den Betriebsmodus wechseln - + &New &Neu - + CTRL+N File|New STRG+N - + &Open Ö&ffnen - + CTRL+O File|Open STRG+O - + &Save &Speichern - + CTRL+S File|Save STRG+S - + Save &As... Speichern &unter ... - + &Operate &Betrieb - + CTRL+F12 Control|Toggle operate/design mode STRG+F12 - + Toggle Virtual Console Live edit Editieren der virtuellen Konsole im Livemodus umschalten - + Fade 1 second and stop Blende 1 Sekunde und stoppe - + Fade 5 seconds and stop Blende 5 Sekunden und stoppe - + Fade 10 second and stop Blende 10 Sekunden und stoppe - + Fade 30 second and stop Blende 30 Sekunden und stoppe - + Quit QLC+ QLC+ beenden - + Error Fehler - + File not found! The selected file has been moved or deleted. Datei nicht gefunden! Die ausgewählte Datei wurde verschoben oder gelöscht. - + Warning Warnung - + Some errors occurred while loading the project: Beim Laden des Projekts sind einige Fehler aufgetreten: - + Starting Q Light Controller Plus Starting Q Light Controller Starte Q Light Controller Plus - + &Monitor &Monitor - + CTRL+M Control|Monitor STRG+M - + Toggle Full Screen Vollbildmodus umschalten - + CTRL+F11 Control|Toggle Full Screen STRG+F11 - + &Index &Handbuch - + SHIFT+F1 Help|Index SHIFT+F1 - + &About QLC+ &About QLC &Über QLC+ - + Close the application? Anwendung beenden? - + Do you wish to close the application? Soll das Programm beendet werden? - + Exit Beenden - + Address Tool Adress-Werkzeug - + Toggle &Blackout &Blackout umschalten - + Live edit a function Livebaearbeitung einer Funktion - + Dump DMX values to a function Abbild (Dump) der DMX-Werte in einer Funktion - + CTRL+D Control|Dump DMX STRG+D - + Stop ALL functions! ALLE Funktionen stoppen! - + Workspace Arbeitsfläche - + Unable to read from file Kann Datei nicht lesen - + Unable to write to file Kann in Datei nicht schreiben - + A fatal error occurred Ein schwerer Fehler ist aufgetreten - + Unable to access resource Ressource nicht erreichbar - + Unable to open file for reading or writing Datei kann nicht zum Lesen oder Schreiben geöffnet werden - + Operation was aborted Vorgang wurde abgebrochen - + Operation timed out Zeitüberschreitung bei Vorgang - + An unspecified error has occurred. Nice. Ein unkategorisierter Fehler ist aufgetreten. Nicht schlecht. - + File error Dateifehler - - - + + + Do you wish to save the current workspace? Changes will be lost if you don't save them. Willst du die aktuelle Arbeitsfläche speichern? Änderungen gehen sonst verloren. - + New Workspace Neue Arbeitsfläche - - - + + + Open Workspace Arbeitsfläche öffnen - - + + Workspaces (*%1) Arbeitsflächen (*%1) - - + + All Files (*.*) Alle Dateien (*.*) - - + + All Files (*) Alle Dateien (*) - + Save Workspace As Arbeitsfläche speichern unter @@ -917,12 +917,12 @@ Changes will be lost if you don't save them. Nach der Tasteneingabe automatisch schließen - + Assign Key Taste zuweisen - + Hit the key combination that you wish to assign. You may hit either a single key or a combination using %1, %2, and %3. Wähle die Tastenkombination aus. Entweder eine einzelne Taste oder eine Kombination %1, %2, und %3. @@ -1049,23 +1049,23 @@ Changes will be lost if you don't save them. AudioItem - - + + Preview Left Channel Vorschau linker Kanal - + Preview Right Channel Vorschau rechter Kanal - + Preview Stereo Channels Vorschau Stereo-Kanäle - + Preview Mono Vorschaue Mono @@ -1133,52 +1133,52 @@ Changes will be lost if you don't save them. Eingang - + None Keine - + DMX DMX - + Function Funktion - + VC Widget Virtuelle Konsole Assistent - + %1 channels %1 Kanäle - + No function Keine Funktion - + No widget Kein Assistent - + Not assigned Nicht zugewiesen - + Volume Bar Lautstärke-Balken - + #%1 (%2Hz - %3Hz) #%1 (%2Hz - %3Hz) @@ -1236,12 +1236,12 @@ Changes will be lost if you don't save them. Modifizierer zurücksetzen - + Error Fehler - + You are trying to overwrite a system template! Please choose another name and the template will be saved in your channel modifier's user folder. Du versuchst, eine Systemvorlage zu überschreiben! Bitte wähle einen anderen Namen. Die Vorlage wird im User-Verzeichnis des Kanaländerungseditors gespeichert. @@ -1256,13 +1256,13 @@ Changes will be lost if you don't save them. - + Name Name - + Type Typ @@ -1282,27 +1282,27 @@ Changes will be lost if you don't save them. Alle ausklappen - + Selected Ausgewählt - + Channel properties configuration Einstellung der Kanaleigenschaften - + Can fade Kann faden - + Behaviour Verhalten - + Modifier Modifizierer @@ -1336,13 +1336,13 @@ Changes will be lost if you don't save them. - + Fade In Einblenden - + Fade Out Ausblenden @@ -1388,7 +1388,7 @@ Changes will be lost if you don't save them. - + Hold Halten @@ -1558,47 +1558,47 @@ Changes will be lost if you don't save them. Rückwärts - + Cut Ausschneiden - + Copy Kopieren - + Paste Einfügen - + Paste error Einfügefehler - + Trying to paste on an incompatible Scene. Operation canceled. Einfügen in eine inkompatible Szene. Ausführung abgebrochen. - + Common Fade In Gemeinsame Einblendung - + Common Fade Out Gemeinsame Ausblendung - + Common Hold Gemeinsamer Halt - + Multiple Steps Mehrere Schritte @@ -1654,12 +1654,12 @@ Changes will be lost if you don't save them. ConsoleChannel - + Intensity Intensität - + Reset this channel Diesen Kanal zurücksetzen @@ -1720,6 +1720,83 @@ Changes will be lost if you don't save them. Cue + + CustomFeedbackDialog + + + Custom Feedback Configuration + + + + + Value + Wert + + + + Label + Beschriftung + + + + Color + + + + + Values + Werte + + + + Lower Value + + + + + Monitor Value + + + + + Upper Value + + + + + + + Color Selection + + + + + MIDI Channel + + + + + Upper Channel + + + + + Lower Channel + + + + + Monitor Channel + + + + + + + From plugin settings + + + DmxDumpFactory @@ -1779,50 +1856,17 @@ Changes will be lost if you don't save them. Szenenname: - + Dump all channels (%1 Universes, %2 Fixtures, %3 Channels) Dump all DMX values (%1 Universes, %2 Fixtures, %3 Channels) Abbild aller Kanäle (%1 Universen, %2 Geräte, %3 Kanäle) - + New Scene From Live %1 Neue Szene aus der Livewiedergabe %1 - - DocBrowser - - - %1 - Document Browser - %1 - Handbuch - - - - Backward - Rückwärts - - - - Forward - Vorwärts - - - - Index - Inhaltsverzeichnis - - - - About Qt - Über Qt - - - - Close this window - Dieses Fenster schließen - - EFXEditor @@ -2103,12 +2147,12 @@ Changes will be lost if you don't save them. Effekt-Vorschau - + Remove fixtures Gerät entfernen - + Do you want to remove the selected fixture(s)? Willst du die ausgewählten Funktionen entfernen? @@ -2453,88 +2497,88 @@ Changes will be lost if you don't save them. Gerätenamen neu zuweisen - - + + (remapped) (neu zugewiesen) - + Import Fixtures List Gerätedefinitionsliste importieren - + Fixtures List (*%1) Gerätedefinitionsliste (*%1) - + All Files (*.*) Alle Dateien (*.*) - + All Files (*) Alle Dateien (*) - + Do you want to automatically connect fixtures with the same name? Geräte mit gleichem Namen automatisch verbinden? - + Generic Dimmer Generischer Dimmer - + Delete Fixtures Geräte löschen - + Do you want to delete the selected items? Ausgewählte Objekte löschen? - + Invalid operation Ungültiger Vorgang - + You are trying to clone a fixture on an address already in use. Please fix the target list first. Geräteadresse für das Klonen bereits belegt. Bitte die Zielliste korrigieren. - - - - + + + + Invalid selection Ungültige Auswahl - - - + + + Please select a source and a target fixture or channel to perform this operation. Bitte Quell- und Zielgerät oder Kanal zur Ausführung auswählen. - + To perform a fixture remap, please select fixtures on both lists. Zur Änderung der Gerätezuweisung bitte Geräte in beiden Listen auswählen. - + This might take a while... Hierzu wird einige Zeit benötigt... - + Cancel Abbrechen @@ -2547,12 +2591,12 @@ Changes will be lost if you don't save them. Gerät auswählen - + No fixtures available Keine Geräte verfügbar - + Go to the Fixture Manager and add some fixtures first. Gehe zum Gerätemanager um Geräte hinzuzufügen. @@ -2609,7 +2653,7 @@ Changes will be lost if you don't save them. FunctionLiveEditDialog - + Function Live Edit Funktionslivebaerbeitung @@ -2617,195 +2661,195 @@ Changes will be lost if you don't save them. FunctionManager - + New &scene Neue &Szene - + New c&haser Neuer C&haser - + New se&quence Neue Se&quenz - + New c&ollection Neue Sa&mmlung - + New E&FX Neuer E&ffekt - + New &RGB Matrix Neue &RGB Matrix - + New scrip&t Neues Scrip&t - + New Scene Neue Szene - + New Chaser Neuer Chaser - + New Sequence Neue Sequenz - + &Clone &Kopieren - + New au&dio Neues &Audio - + New vid&eo Neues vid&eo - + New fo&lder Neuer Ordner - + Select Startup Function Auswahl Start-Funktion - + Function &Wizard Funktionsassistent - + &Delete &Löschen - + Select &all &Alles auswählen - + New Collection Neue Sammlung - + New EFX Neuer Effekt - + New RGB Matrix Neue RGB Matrix - + New Script Neues Skript - + Open Audio File Audio-Datei-öffnen - + Audio Files (%1) Audio Dateien (%1) - - + + All Files (*.*) Alle Dateien (*.*) - - + + All Files (*) Alle Dateien (*) - + Unsupported audio file Nicht unterstützte Audio-Datei - + This audio file cannot be played with QLC+. Sorry. Diese Audiodatei kann mit QLC+ nicht wiedergegeben werden. Sorry. - + Open Video File Videodatei öffnen - + Video Files (%1) Videodateien (%1) - + Unsupported video file Nicht unterstützte Videodatei - + This video file cannot be played with QLC+. Sorry. Dieses Videodatei kann leider nicht mit QLC+ wiedergegeben werden. - + Do you want to DELETE folder: Do you want to DELETE foler: Soll der Ordner GELÖSCHT werden: - + Do you want to DELETE functions: Willst du folgende Funktionen entfernen: - + (This will also DELETE: (Ebenfalls GELÖSCHT wird: - + Delete Functions Funktionen entfernen - + Function Funktion - + (Copy) (Kopie) @@ -3092,32 +3136,32 @@ p, li { white-space: pre-wrap; } Entfernen - + %1 group %1-Gruppe - + Error Fehler - + %1 has no capability supported by this wizard. %1 keine von diesem Assistenten unterstützte Fähigkeit. - + Presets solo frame Voreinstellungen Einzelrahmen - + Click & Go RGB Click & Go RGB - + Click & Go Macro Click & Go Makro @@ -3125,27 +3169,27 @@ p, li { white-space: pre-wrap; } GrandMasterSlider - + GM GM - + Grand Master <B>limits</B> the maximum value of Grand Master <B>Limits</B> Maximalwert von - + Grand Master <B>reduces</B> the current value of Grand Master <B>verringert</B> den aktuellen Wert von - + intensity channels Intensitätskanäle - + all channels alle Kanäle @@ -3246,46 +3290,46 @@ p, li { white-space: pre-wrap; } InputOutputManager - + Add U&niverse U&niversum hinzufüegen - + &Delete Universe Universe Universum entfernen - + Universe name: Name des Universums: - + Passthrough not sure, maybe Durchlauf Passthrough - - + + Universe %1 Universum %1 - - + + Delete Universe Universum entfernen - + The universe you are trying to delete is patched. Are you sure you want to delete it? Das Universum, welchs gelöscht werden soll ist gepatched, soll es wirklich gelöscht werden? - + There are some fixtures using the universe you are trying to delete. Are you sure you want to delete it? Das Universum, welches gelöscht werden soll wird von einigen Geräten verwendet, soll es wirklich gelöscht werden? @@ -3392,20 +3436,20 @@ p, li { white-space: pre-wrap; } Level Monitor - - - + + + Error Fehler - - + + Output line already assigned Ausgang bereits zugewiesen - + An error occurred while trying to open the selected device line. This can be caused either by a wrong system configuration or an unsupported input/output mode. Please refer to the plugins documentation to troubleshoot this. @@ -3414,67 +3458,67 @@ Dies kann entweder an einer fehlerhaften Systemkonfiguration oder einem nicht un Bitte in der Plugindokumentation nachlesen um den Fehler zu beheben. - - + + Existing Input Profile Existierendes Eingangsprofil - - + + An input profile at %1 already exists. Do you wish to overwrite it? Es existiert bereits ein Eingangsprofil in %1. Willst du es überschreiben? - - + + Save Input Profile Eingangsprofil speichern - - + + Input Profiles (*.qxi) Eingangsprofile (*.qxi) - - + + Saving failed Speichern fehlgeschlagen - + Unable to save the profile to %1 Kann das Profil nicht nach %1 speichern - + Delete profile Profil löschen - + Do you wish to permanently delete profile "%1"? Willst du das Profil "%1" permanent löschen? - + File deletion failed Löschen fehlgeschlagen - + Unable to delete file %1 Kann Datei %1 nicht löschen - + Unable to save %1 to %2 Kann %1 nicht nach %2 speichern - + Default device Standardgerät @@ -3487,176 +3531,233 @@ Bitte in der Plugindokumentation nachlesen um den Fehler zu beheben.Eingangsprofil Editor - + General Allgemein - + Manufacturer Hersteller - + The name of the company that made the device Der Name der Firma die dieses Gerät hergestellt hat - + Model Modell - + The device's model name Der Gerätename - - Channels - Kanäle - - - + + Channel Kanal - + + Name Name - - + + Type Typ - + MIDI Global Settings Global MIDI-Einstellungen - + When MIDI notes are used, send a Note Off when value is 0 Wenn MIDI-Noten verwendet werden, sende ein "Note Off", wenn der Wert 0 ist - - + + Input Mapping + + + + Behaviour Verhalten - + Movement Bewegung - + Absolute Absolut - + Relative Relativ - + Generate an extra Press/Release when toggled Ein zusätzliches "Drücken/Loslassen" beim Umschalten generieren - + Custom feedback Benutzerdefinierte Rückmeldung - + Upper value Oberer Wert - + + + MIDI channel + + + + + Colors + + + + + Remove the selected color + + + + + Add a new color + + + + + Value + Wert + + + + Label + Beschriftung + + + + Color + + + + + MIDI Channels + + + + + Add a new MIDI channel + + + + + Remove the selected MIDI channel + + + + Lower value Unterer Wert - + Sensitivity Empfindlichkeit - + Add a new channel description Neue Kanalbeschreibung hinzufügen - + Remove the selected channels Markierten Kanäle löschen - + Edit the selected channel Ausgewählten Kanal bearbeiten - + Automatically add channels to the list when you wiggle the device's controls Kanäle automatisch hinzufügen wenn die externen Bedienelemente betätigt werden - + File not writable Datei nicht beschreibbar - + You do not have permission to write to the file %1. You might not be able to save your modifications to the profile. Du hast keine Schreibrechte für die Datei %1. Du wirst deine Profiländerungen nicht speichern können. - + + From plugin settings + + + + Missing information Fehlende Information - + Manufacturer and/or model name is missing. Hersteller und/oder Modellname fehlen. - - + + Channel already exists Kanal existiert bereits - - + + Channel %1 already exists Kanal %1 existiert bereits - + Delete channels Kanäle löschen - + Delete all %1 selected channels? Alle %1 ausgewählte Kanäle löschen? - + Channel wizard activated Kanalassistent aktiviert - + You have enabled the input channel wizard. After clicking OK, wiggle your mapped input profile's controls. They should appear into the list. Click the wizard button again to stop channel auto-detection. Note that the wizard cannot tell the difference between a knob and a slider so you will have to do the change manually. @@ -3664,12 +3765,39 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Der Assistent kennt keinen Unterschied zwischen einem Schalter und einem Regler, die Änderungen müssen manuell durchgeführt werden. - + + + Enter value + + + + + Feedback value + + + + + + Enter label + + + + + Color label + + + + + MIDI channel label + + + + Button %1 Schalter %1 - + Slider %1 Schieberegler %1 @@ -3702,65 +3830,50 @@ Der Assistent kennt keinen Unterschied zwischen einem Schalter und einem Regler, Externer Eingang - + When toggled, you can click an external button to assign it to this widget. Wenn betätigt kann ein externer Schalter betätigt werden um diesen dem virtuellen Konsolenschalter zuzuweisen. - + Auto Detect Automatische Erkennung - + Input Universe Eingangsuniversum - + Input Channel Eingangskanal - + The input universe that sends data to this widget Das Eingangsuniversum, welches Daten zu diesem Assistenten sendet - + Custom Feedback Benutzerdefinierte Rückmeldung - + The particular input channel within the input universe that sends data to this widget Der bestimmte Eingangskanal im Eingangsuniversum der Daten zu diesem Assistenten sendet - + Choose an external input universe & channel that this widget should listen to. Wähle ein externes Universum & einen Kanal auf den dieser Schalter hören soll. - + Choose... Auswählen ... - - - Custom feedback - Benutzerdefinierte Rückmeldung - - - - Lower value - Unterer Wert - - - - Upper value - Oberer Wert - Monitor @@ -3917,14 +4030,14 @@ Der Assistent kennt keinen Unterschied zwischen einem Schalter und einem Regler, Hintergrund - - + + Select background image Hintergrundbild auswählen - - + + Images Bilder @@ -4214,12 +4327,12 @@ Der Assistent kennt keinen Unterschied zwischen einem Schalter und einem Regler, PlaybackSlider - + Select Auswahl - + Flash Blitz @@ -4235,34 +4348,29 @@ Der Assistent kennt keinen Unterschied zwischen einem Schalter und einem Regler, QObject - + Operate Betrieb - + Design Entwurf - - + + Reversed Umgekehrt - + Page: %1 Seite: %1 RDMManager - - - Form - Formular - Scan for RDM devices... @@ -4682,22 +4790,22 @@ Der Assistent kennt keinen Unterschied zwischen einem Schalter und einem Regler, Nichts - + No fixture group to control Keine Gerätegruppe zu steuern - + Select image Bildauswahl - + Images Bilder - + Sequence Sequenz @@ -4757,105 +4865,105 @@ Der Assistent kennt keinen Unterschied zwischen einem Schalter und einem Regler, Alle Gerätekanäle deaktivieren - + Enable all channels in current fixture Alle Kanäle im aktuellen Gerät aktivieren - + Disable all channels in current fixture Alle Kanäle im aktuellen Gerät deaktivieren - + Copy current values to clipboard Aktuelle Werte in den Zwischenspeicher kopieren - + Paste clipboard values to current fixture Werte aus dem Zwischenspeicher in das aktuelle Gerät kopieren - + Copy current values to all fixtures Aktuelle Werte in alle Geräte kopieren - + Color tool for CMY/RGB-capable fixtures Farbtool für CMY/RGB-fähige Geräte - + Position tool for moving heads/scanners Positionswerkzeug für movingheads/scanner - + Switch between tab view and all channels view Zwischen Tab-Ansischt und allen Kanälen - + Toggle blind mode Blindmodus umschalten - + Show/Hide speed dial window Anzeigen/Ausblenden des Schnellwahlfensters - + Clone this scene and append as a new step to the selected chaser Szene kopieren und als neuen Schritt an den ausgewählten Chaser anfügen - + Go to next fixture tab Zum nächsten Geräte-Tab wechseln - + Go to previous fixture tab Zum vorherigen Geräte-Tab wechseln - + None Nichts - + Scene name: Szenenname: + - All fixtures Alle Geräte + - Channels Groups Kanalgruppen + - Generic Generisch - + Remove fixtures Geräte entfernen - + Do you want to remove the selected fixture(s)? Willst du die ausgewählten Funktionen entfernen? @@ -5067,7 +5175,7 @@ Der Assistent kennt keinen Unterschied zwischen einem Schalter und einem Regler, Erlaube ungepatchte Universen - + <Double click here to enter channel number manually> <Hier klicken um eine Kanalnummer manuell einzugeben> @@ -5374,118 +5482,118 @@ Dauer: %3 SimpleDesk - + Universe Universum - + Next page Nächste Seite - + Current page Aktuelle Seite - + Previous page Vorherige Seite - + View mode Ansischtsmodus - + Reset universe Universum zurücksetzen - + Playback Wiedergabe - - + + Cue Stack Cue-Stapel - + Previous cue Vorheriges Cue - + Stop cue stack Cue-Stapel stoppen - + Next cue Nächste Cue - + Clone cue stack Cue-Stapel kopieren - + Edit cue stack Cue-Stapel bearbeiten - + Record cue Cue aufzeichnen - + Channel groups Kanalgruppen - + Cue Stack - Playback %1 Cue Stapel - Wiedergabe %1 - + No selection Keine Auswahl - + Cue name Cue-Name - + Multiple Cues Mehrere Cues - + Delete cue Cue löschen - + Clone Cue Stack Cue-Stapel kopieren - + Clone To Playback# Zur Wiedergabe kopieren# - + Cue %1 Cue %1 @@ -5493,32 +5601,32 @@ Dauer: %3 SpeedDial - + Hours Stunden - + Minutes Minuten - + Seconds Sekunden - + Milliseconds Millisekunden - + Infinite Unendlich - + Tap Tap @@ -5526,17 +5634,17 @@ Dauer: %3 SpeedDialWidget - + Fade In Einblenden - + Fade Out Ausblenden - + Hold Halten @@ -5626,17 +5734,17 @@ Dauer: %3 VCButton - + Choose... Auswählen ... - + None Kein - + Button %1 Schalter %1 @@ -5651,17 +5759,17 @@ Dauer: %3 Bilder (%1) - + Toggle Blackout Schalte Blackout - + Stop ALL functions! ALLE Funktionen stoppen! - + Icon Symbol @@ -5674,37 +5782,37 @@ Dauer: %3 Schaltereigenschaften - + General Allgemein - + Button label Schalterbeschriftung - + Text to display on the button Text, der auf dem schalter erscheint' - + Function Funktion - + The function that this button controls Die Funktion, die dieser Schalter steuert - + Attach a function to this button Funktion dem Schalter zuweisen - + Detach the button's function attachment Funktion des Schalters zurücknehmen @@ -5724,47 +5832,57 @@ Dauer: %3 Funktion umschalten an/aus - + Flash the assigned function with this button Die Zugewiesene Funktion mit dem Schalter aufleuchten - + Flash function (only for scenes) Flashfunktion (nur für Szenen) - + + Override priority + + + + + Force LTP + + + + Toggle Blackout Schalte Blackout - + Stop All Functions Alle Funktionen stoppen - + Fade time: Überblendzeit: - + Adjust function intensity when it is running Funktionsintensität anpassen wenn es läuft - + Adjust Function Intensity Funktionsintensität anpassen - + Function's adjusted intensity percentage when run Die angepasste Funktionsintensität in Prozent wenn es läuft - + No function Keine Funktion @@ -5855,64 +5973,64 @@ Dauer: %3 VCCueList - + Show/Hide crossfade sliders Anzeigen/Ausblenden Crossfaderegler - - + + Play/Pause Cue list Cue-Liste Abspielen/Pausieren - - + + Stop Cue list Cue-Liste stoppen - + Go to previous step in the list Zum vorherigen Schritt in der Liste wechseln - + Go to next step in the list Zum nächsten Schritt in der Liste wechseln - + Cue list Cue-Liste - + Play/Stop Cue list Cue-Liste Abspielen/Stoppen - + Pause Cue list Cue-Liste pausieren - + Fade In Einblenden - + Fade Out Ausblenden - + Duration Dauer - + Notes Notizen @@ -6078,7 +6196,7 @@ Dauer: %3 VCFrame - + Add Hinzufügen @@ -6131,17 +6249,17 @@ Dauer: %3 Seitenname - + External Input - Enable Externer Eingang - Aktivieren - + External Input - Previous Page Externer Eingang - Vorige Seite - + External Input - Next Page Externer Eingang - Nächste Seite @@ -6174,17 +6292,17 @@ Dauer: %3 VCLabel - + Label Beschriftung - + Rename Label Beschriftung ändern - + Caption: Überschrift: @@ -6192,42 +6310,42 @@ Dauer: %3 VCMatrix - + Animation %1 Animation %1 - + End Color Reset Endfarbenreset - + Start color Red component Anfangsfarbe Rotanteil - + Start color Green component Anfangsfarbe Grünanteil - + Start color Blue component Anfangsfarbe Blauanteil - + End color Red component Endfarbe Rotanteil - + End color Green component Endfarbe Grünanteil - + End color Blue component Endfarbe Blauanteil @@ -6430,48 +6548,48 @@ Dauer: %3 Endfarbenreset hinzufügen - + No function Keine Funktion - + Start Color Anfangsfarbe - + Start Color Knob Schalter für Anfangsfarbe - + End Color Endfarbe - + End Color Knob Schalter für Endfarbe - + End Color Reset Endfarbenreset - + Animation Animation - - + + Text Text - + Enter a text Einen Text eingeben @@ -6723,12 +6841,12 @@ Dauer: %3 VCSlider - + Slider %1 Schieberegler %1 - + Reset channels override Überschreiben zurücksetzen @@ -6746,42 +6864,42 @@ Dauer: %3 Allgemein - + Name of the slider Name des Schiebereglers - + Value display style Werte Anzeigeart - + Show exact DMX values Genauen DMX Wert zeigen - + Show value as percentage Werte als Prozentangabe - + Percentage Prozentual - + Slider movement Regler Bewegung - + Normal Normal - + Inverted Invertiert @@ -6812,32 +6930,32 @@ Dauer: %3 Gobo/Effekt/Makro - + Actual Aktuell - + Widget name Name des Assistenten - + Widget appearance Aussehen des Assistenten - + Slider Schieberegler - + Knob Knopf - + Catch up with the external controller input value Dem Wert des externen Controller-Eingangs folgen @@ -7271,17 +7389,17 @@ Dauer: %3 Millisekundenfeld anzeigen - + Multiply by 2 Input Eingang zum Verdoppeln - + Divide by 2 Input Eingang zum Halbieren - + Factor Reset Input Eingang zum Zurücksetzen des Multiplikationsfaktors @@ -7299,68 +7417,68 @@ Dauer: %3 VCWidget - + Button Schalter - + Slider Schieberegler - + XYPad XY-Pad - + Frame Rahmen - + Solo frame Einzelrahmen - + Speed dial Schnellwahl - + Cue list Cue-Liste - + Label Beschriftung - + Audio Triggers Audiotrigger - + Animation Animation - + Clock Uhr + - Unknown Unbekannt - + This widget has no properties Dieser Assistent hat keine Eigenschaften @@ -7568,12 +7686,12 @@ Dauer: %3 Name der Voreinstellung - + Pan / Horizontal Axis Pan / Horizontale Achsen - + Tilt / Vertical Axis Tilt / Vertikale Achse @@ -7593,45 +7711,45 @@ Dauer: %3 Invertiert - + Width Breite - + Height Höhe - + Remove fixtures Geräte entfernen - + Do you want to remove the selected fixtures? Willst du das ausgewählte Gerät entfernen? - - + + Error Fehler - + The selected Scene does not include any Pan or Tilt channel. Please select one with such channels. I don't understand the context of the second sentence. Which channels? Bitte eine Szene ohne Pan- oder Tilt-Kanäle auswählen. - + Please select at least one fixture or head to create this type of preset! Bitte mindestens ein Gerät oder Kopf auswählen um diese Art Voreinstellung zu erzeugen! - + Fixture Group Gerätegruppe @@ -7764,12 +7882,12 @@ Please select one with such channels. VideoItem - + Fullscreen Vollbild - + Screen %1 Bildschirm %1 diff --git a/ui/src/qlcplus_es_ES.ts b/ui/src/qlcplus_es_ES.ts index 2cee17ca1b..4ea116f9d1 100644 --- a/ui/src/qlcplus_es_ES.ts +++ b/ui/src/qlcplus_es_ES.ts @@ -189,12 +189,12 @@ Cantidad de canales vacíos a dejar entre fixtures añadidos - + Fixtures found: %1 Fixtures encontrados: %1 - + Dimmers Dimmers @@ -525,376 +525,376 @@ App - + Cannot exit in Operate mode No puede salir en Modo Operación - + You must switch back to Design mode to close the application. Tiene que cambiar a Modo Diseño para cerrar la aplicación. - + Close Cerrar - + Do you wish to save the current workspace before closing the application? ¿Desea guardar el espacio de trabajo antes de cerrar la aplicacion? - + Starting Q Light Controller Plus Starting Q Light Controller Iniciando Q Light Controller Plus - + - New Workspace - Nuevo Espacio de trabajo - + Switch to Design Mode Cambiar a Modo Diseño - + There are still running functions. Really stop them and switch back to Design mode? Todavía hay funciones ejecutándose. ¿Desea detenerlas y volver a Modo Diseño? - + Design Diseño - + Switch to design mode Cambiar a Modo Diseño - + Operate Operación - - + + Switch to operate mode Cambiar a Modo Operación - + &New &Nuevo - + CTRL+N File|New - + &Open &Abrir - + CTRL+O File|Open - + &Save &Guardar - + CTRL+S File|Save CTRL+S - + Save &As... Guardar &como... - + &Operate &Operación - + &Monitor &Monitor - + Toggle &Blackout Activar/Desactivar &Blackout - + CTRL+F12 Control|Toggle operate/design mode - + CTRL+M Control|Monitor - + Live edit a function Edita una función en vivo - + Toggle Full Screen Cambiar a Pantalla Completa - + CTRL+F11 Control|Toggle Full Screen - + &Index &Indice - + SHIFT+F1 Help|Index - + &About QLC+ &About QLC Acerca &QLC+ - + Fixtures Fixtures - + Functions Funciones - + Shows Shows - + Virtual Console Consola Virtual - + Simple Desk Mesa Simple - + Inputs/Outputs Entradas/Salidas - + Close the application? ¿Cerrar la aplicación? - + Do you wish to close the application? ¿Desea cerrar la aplicación? - + Exit Salir - + Address Tool Herramienta de Direccionamiento - + Toggle Virtual Console Live edit Activa/Desactiva la edición en vivo de la Consola Virtual - + Dump DMX values to a function Volcar valores DMX a una función - + CTRL+D Control|Dump DMX - + Stop ALL functions! ¡Detener TODAS las funciones! - + Fade 1 second and stop Fade out de 1 segundo y detener - + Fade 5 seconds and stop Fade out de 5 segundos y detener - + Fade 10 second and stop Fade out de 10 segundos y detener - + Fade 30 second and stop Fade out de 30 segundos y detener - + Quit QLC+ Salir de QLC+ - + Workspace Espacio de Trabajo - + Unable to read from file Imposible leer desde archivo - + Unable to write to file Imposible escribir a archivo - + A fatal error occurred Ocurrió un error fatal - + Unable to access resource Imposible acceder a recurso - + Unable to open file for reading or writing Imposible abrir archivo para leer o escribir - + Operation was aborted La operación ha sido abortada - + Operation timed out Operacion caducada - + An unspecified error has occurred. Nice. Ocurrió un error desconocido. Genial. - + File error Error de archivo - - - + + + Do you wish to save the current workspace? Changes will be lost if you don't save them. ¿Desea guardar el espacio de trabajo actual? Los cambios se perderán si no los guarda. - + New Workspace Nuevo Espacio de Trabajo - - - + + + Open Workspace Abrir Espacio de Trabajo - - + + Workspaces (*%1) Espacios de Trabajo (*%1) - - + + All Files (*.*) Todos los archivos (*.*) - - + + All Files (*) Todos los archivos (*) - + Save Workspace As Guardar el espacio de trabajo como - + Error Error - + File not found! The selected file has been moved or deleted. ¡Archivo no encontrado! El archivo seleccionado ha sido movido o borrado. - + Warning Atención - + Some errors occurred while loading the project: Algunos errores ocurrieron al cargar el proyecto: @@ -917,12 +917,12 @@ El archivo seleccionado ha sido movido o borrado. Cerrar automáticamente al presionar una tecla - + Assign Key Asignar Tecla - + Hit the key combination that you wish to assign. You may hit either a single key or a combination using %1, %2, and %3. Presione la combinación de teclas que quiere asignar. Puede presionar una sola tecla o una combinación usando %1, %2 ó %3. @@ -1049,23 +1049,23 @@ El archivo seleccionado ha sido movido o borrado. AudioItem - - + + Preview Left Channel Visualizar Canal Izquierdo - + Preview Right Channel Visualizar Canal Derecho - + Preview Stereo Channels Visualizar Canales Estéreo - + Preview Mono Visualizar Mono @@ -1133,52 +1133,52 @@ El archivo seleccionado ha sido movido o borrado. Entrada - + None Ninguno - + DMX DMX - + Function Función - + VC Widget Widget de CV - + %1 channels %1 canales - + No function Ninguna función - + No widget Ningún widget - + Not assigned No asignado - + Volume Bar Barra de volumen - + #%1 (%2Hz - %3Hz) #%1 (%2Hz - %3Hz) @@ -1236,12 +1236,12 @@ El archivo seleccionado ha sido movido o borrado. Desestablecer Modificador - + Error Error - + You are trying to overwrite a system template! Please choose another name and the template will be saved in your channel modifier's user folder. ¡Está intentando sobreescribir una plantilla del sistema! Por favor escoja otro nombre y la plantilla se guardará en el directorio de modificadores de canal del usuario. @@ -1256,13 +1256,13 @@ El archivo seleccionado ha sido movido o borrado. - + Name Nombre - + Type Tipo @@ -1282,27 +1282,27 @@ El archivo seleccionado ha sido movido o borrado. Expandir todos - + Selected Seleccionados - + Channel properties configuration Configuración de propiedades de canales - + Can fade Puede hacer fade - + Behaviour Comportamiento - + Modifier @@ -1336,13 +1336,13 @@ El archivo seleccionado ha sido movido o borrado. - + Fade In Fade In - + Fade Out Fade Out @@ -1363,7 +1363,7 @@ El archivo seleccionado ha sido movido o borrado. - + Hold Espera @@ -1559,47 +1559,47 @@ El archivo seleccionado ha sido movido o borrado. Atrás - + Cut Cortar - + Copy Copiar - + Paste Pegar - + Paste error Error de pegado - + Trying to paste on an incompatible Scene. Operation canceled. Intentando pegar en una Escena incompatible. Operación cancelada. - + Common Fade In Tiempo de Fade In común - + Common Fade Out Tiempo de Fade Out común - + Common Hold Espera común - + Multiple Steps Pasos múltiples @@ -1655,12 +1655,12 @@ El archivo seleccionado ha sido movido o borrado. ConsoleChannel - + Intensity Intensidad - + Reset this channel Restaurar este canal @@ -1721,6 +1721,83 @@ El archivo seleccionado ha sido movido o borrado. Pie + + CustomFeedbackDialog + + + Custom Feedback Configuration + Configuración de Feedback Personalizado + + + + Value + Valor + + + + Label + Etiqueta + + + + Color + Color + + + + Values + Valores + + + + Lower Value + Valor Inferior + + + + Monitor Value + Valor Monitor + + + + Upper Value + Valor Superior + + + + + + Color Selection + Selección de Color + + + + MIDI Channel + Canal MIDI + + + + Upper Channel + Canal Superior + + + + Lower Channel + Canal Inferior + + + + Monitor Channel + Canal Monitor + + + + + + From plugin settings + De la configuración del conector + + DmxDumpFactory @@ -1780,50 +1857,17 @@ El archivo seleccionado ha sido movido o borrado. Nombre de la Escena: - + Dump all channels (%1 Universes, %2 Fixtures, %3 Channels) Dump all DMX values (%1 Universes, %2 Fixtures, %3 Channels) Volcar todos los canales (%1 Universos, %2 Fixtures, %3 Canales) - + New Scene From Live %1 Nueva Escena desde Live %1 - - DocBrowser - - - %1 - Document Browser - %1 - Explorador de Documentos - - - - Backward - Atrás - - - - Forward - Adelante - - - - Index - Índice - - - - About Qt - Acerca de Qt - - - - Close this window - Cerrar esta ventana - - EFXEditor @@ -2104,12 +2148,12 @@ El archivo seleccionado ha sido movido o borrado. Ver qué hace el EFX cuando se ejecuta - + Remove fixtures Quitar fixtures - + Do you want to remove the selected fixture(s)? ¿Quiere quitar los fixtures seleccionados? @@ -2454,88 +2498,88 @@ El archivo seleccionado ha sido movido o borrado. Reasignar nombre de fixtures - - + + (remapped) (reasignado) - + Import Fixtures List Importa la lista de Fixtures - + Fixtures List (*%1) Lista de Fixtures (*%1) - + All Files (*.*) Todos los archivos (*.*) - + All Files (*) Todos los archivos (*) - + Do you want to automatically connect fixtures with the same name? Queréis conectar automáticamente los fixtures con el mismo nombre? - + Generic Dimmer Dimmer genérico - + Delete Fixtures Eliminar fixture - + Do you want to delete the selected items? ¿Desea borrar los ítems seleccionados? - + Invalid operation Operación inválida - + You are trying to clone a fixture on an address already in use. Please fix the target list first. Está tratando de clonar un fixture en una dirección en uso. Por favor arregle la lista de destino primero. - - - - + + + + Invalid selection Selección inválida - - - + + + Please select a source and a target fixture or channel to perform this operation. Por favor, seleccione un fixture o canal de origen y de destino para realizar esta operación. - + To perform a fixture remap, please select fixtures on both lists. Para realizar la reasignación de fixtures, por favor seleccione fixtures en ambas listas. - + This might take a while... Esto puede tardar un rato... - + Cancel Cancelar @@ -2548,12 +2592,12 @@ El archivo seleccionado ha sido movido o borrado. Seleccione un fixture - + No fixtures available No hay fixtures disponibles - + Go to the Fixture Manager and add some fixtures first. Ir al Gestor de Fixtures y añadir algún fixture primero. @@ -2610,7 +2654,7 @@ El archivo seleccionado ha sido movido o borrado. FunctionLiveEditDialog - + Function Live Edit Editar la función en vivo @@ -2618,195 +2662,195 @@ El archivo seleccionado ha sido movido o borrado. FunctionManager - + New &scene Nueva E&scena - + New c&haser Nuevo c&haser - + New se&quence Nueva &secuencia - + New c&ollection Nueva &colección - + New E&FX Nuevo E&FX - + New &RGB Matrix Nueva Matriz &RGB - + New scrip&t Nuevo srip&t - + New Scene Nueva Escena - + New Chaser Nuevo Chaser - + New Sequence Nueva Secuencia - + &Clone C&lonar - + New au&dio Nuevo au&dio - + New vid&eo Nuevo &video - + New fo&lder Nueva Car&peta - + Select Startup Function Función de arranque - + Function &Wizard &Asistente de Funciones - + &Delete &Eliminar - + Select &all Seleccionar &todo - + New Collection Nueva Colección - + New EFX Nuevo EFX - + New RGB Matrix Nueva Matriz RGB - + New Script Nuevo Script - + Open Audio File Abrir Archivo de Audio - + Audio Files (%1) Archivos de Audio (%1) - - + + All Files (*.*) Todos los archivos (*.*) - - + + All Files (*) Todos los archivos (*) - + Unsupported audio file Archivo de audio no soportado - + This audio file cannot be played with QLC+. Sorry. Este archivo de audio no puede ser reproducido con QLC+. Mil disculpas. - + Open Video File Abrir Archivo de video - + Video Files (%1) Archivos de Video (%1) - + Unsupported video file Archivo de video no soportado - + This video file cannot be played with QLC+. Sorry. Este archivo de video no puede ser reproducido con QLC+. Mil disculpas. - + Do you want to DELETE folder: Do you want to DELETE foler: Desea ELIMINAR la carpeta: - + Do you want to DELETE functions: Quiere ELIMINAR funciones: - + (This will also DELETE: (Esto ELIMINARÁ también: - + Delete Functions Borrar Funciones - + Function Función - + (Copy) (Copiar) @@ -3093,32 +3137,32 @@ p, li { white-space: pre-wrap; } Eliminar - + %1 group %1 grupo - + Error Error - + %1 has no capability supported by this wizard. %1 no tiene capacidades soportadas por este asistente. - + Presets solo frame Marco solo de presets - + Click & Go RGB RGB Click & Go - + Click & Go Macro Macro Click & Go @@ -3126,27 +3170,27 @@ p, li { white-space: pre-wrap; } GrandMasterSlider - + GM GM - + Grand Master <B>limits</B> the maximum value of Gran Master <B>limita</B> el valor máximo de - + Grand Master <B>reduces</B> the current value of Gran Master <B>reduce</B> el valor actual de - + intensity channels canales de intensidad - + all channels todos los canales @@ -3248,45 +3292,45 @@ p, li { white-space: pre-wrap; } InputOutputManager - + Add U&niverse Añadir U&niverso - + &Delete Universe Universe &Borrar Universo - + Universe name: Nombre del Universo: - + Passthrough Passthrough - - + + Universe %1 Universo %1 - - + + Delete Universe Borrar Universo - + The universe you are trying to delete is patched. Are you sure you want to delete it? El universo que está tratando de borrar está patcheado. ¿Está seguro de querer borrarlo? - + There are some fixtures using the universe you are trying to delete. Are you sure you want to delete it? Algunos fixtures están usando el universo que está tratando de borrar. ¿Está seguro de querer borrarlo? @@ -3393,20 +3437,20 @@ p, li { white-space: pre-wrap; } Monitor de nivel - - - + + + Error Error - - + + Output line already assigned Línea de Salida ya asignada - + An error occurred while trying to open the selected device line. This can be caused either by a wrong system configuration or an unsupported input/output mode. Please refer to the plugins documentation to troubleshoot this. @@ -3415,67 +3459,67 @@ Esto puede ser causado por una configuración errónea del sistema o un modo de Por favor, revise la documentación de los plugins para solucionar esto. - - + + Existing Input Profile Perfil de Entrada existente - - + + An input profile at %1 already exists. Do you wish to overwrite it? Un perfil de Entrada en %1 ya existe. ¿Desea sobreescribirlo? - - + + Save Input Profile Guardar el perfil de Entrada - - + + Input Profiles (*.qxi) Perfil de Entrada (*.qxi) - - + + Saving failed Error al Guardar - + Unable to save the profile to %1 Imposible guardar el perfil en %1 - + Delete profile Eliminar perfil - + Do you wish to permanently delete profile "%1"? ¿Desea borrar permanentemente este perfil "%1"? - + File deletion failed Error al eliminar archivo - + Unable to delete file %1 Imposible borrar el archivo %1 - + Unable to save %1 to %2 Imposible guardar %1 en %2 - + Default device Dispositivo por defecto @@ -3488,176 +3532,233 @@ Por favor, revise la documentación de los plugins para solucionar esto.Editor de Perfil de Entrada - + General General - + Manufacturer Fabricante - + The name of the company that made the device Nombre de la compañia - + Model Modelo - + The device's model name El nombre del modelo del dispositivo - - Channels - Canales - - - + + Channel Canal - + + Name Nombre - + Custom feedback Feedback personalizado - + Upper value Valor superior - + Lower value Valor inferior - - + + Type Tipo - + MIDI Global Settings Propiedades Globales MIDI - + When MIDI notes are used, send a Note Off when value is 0 Cuando notas MIDI están siendo usadas, enviar una Nota Off cuando el valor es 0 - - + + Input Mapping + Mapeo de Entrada + + + Behaviour Comportamiento - + Add a new channel description Añadir una nueva descripcion para el canal - + + + MIDI channel + Canal MIDI + + + + Colors + Colores + + + + Remove the selected color + Elimina el color seleccionado + + + + Add a new color + Añadir un nuevo color + + + + Value + Valor + + + + Label + Etiqueta + + + + Color + Color + + + + MIDI Channels + Canales MIDI + + + + Add a new MIDI channel + Añadir un nuevo canal MIDI + + + + Remove the selected MIDI channel + Elimina el canal MIDI seleccionado + + + Remove the selected channels Eliminar los canales seleccionados - + Edit the selected channel Editar el canal seleccionado - + Automatically add channels to the list when you wiggle the device's controls Añadir automáticamente canales a la lista cuando mueva los controles del dispositivo - + Movement Movimiento - + Absolute Absoluto - + Relative Relativo - + Generate an extra Press/Release when toggled Generar comando extra de Presionar/Soltar cuando se active - + Sensitivity Sensibilidad - + File not writable Archivo sólo de lectura - + You do not have permission to write to the file %1. You might not be able to save your modifications to the profile. No tiene permiso para escribir en el archivo %1. Puede que no sea posible guardar las modificaciones al perfil. - + + From plugin settings + Desde la configuración del conector + + + Missing information Información Faltante - + Manufacturer and/or model name is missing. Falta el nombre del fabricante o modelo. - - + + Channel already exists El canal ya existe - - + + Channel %1 already exists Canal %1 ya existe - + Delete channels Eliminar canales - + Delete all %1 selected channels? ¿Eliminar los %1 canales seleccionados? - + Channel wizard activated Asistente de Canales activado - + You have enabled the input channel wizard. After clicking OK, wiggle your mapped input profile's controls. They should appear into the list. Click the wizard button again to stop channel auto-detection. Note that the wizard cannot tell the difference between a knob and a slider so you will have to do the change manually. @@ -3666,12 +3767,39 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Tenga en cuenta que el asistente no puede diferenciar entre una perilla y un slider, así que tendrá que hacer el cambio manualmente. - + + + Enter value + Valor de Entrada + + + + Feedback value + Valor de Feedback + + + + + Enter label + Etiqueta de Entrada + + + + Color label + Etiqueta del Color + + + + MIDI channel label + Canal MIDI + + + Button %1 Botón %1 - + Slider %1 Slider %1 @@ -3704,65 +3832,50 @@ Tenga en cuenta que el asistente no puede diferenciar entre una perilla y un sli Entrada Externa - + When toggled, you can click an external button to assign it to this widget. Si está activo, puede presionar un botón externo para asignarlo a este widget. - + Auto Detect Detectar Automáticamente - + Input Universe Universo de Entrada - + Input Channel Canal de Entrada - + The input universe that sends data to this widget El universo de Entrada que manda datos a este widget - + Custom Feedback Feedback personalizado - + The particular input channel within the input universe that sends data to this widget El canal de Entrada dentro del universo de Entrada que manda datos a este widget - + Choose an external input universe & channel that this widget should listen to. Eligir un universo de Entrada y un canal externos que este widget debe escuchar. - + Choose... Elegir... - - - Custom feedback - Feedback personalizado - - - - Lower value - Valor inferior - - - - Upper value - Valor superior - Monitor @@ -3919,14 +4032,14 @@ Tenga en cuenta que el asistente no puede diferenciar entre una perilla y un sli Fondo - - + + Select background image Seleccione la imagen de fondo - - + + Images Imágenes @@ -4216,12 +4329,12 @@ Tenga en cuenta que el asistente no puede diferenciar entre una perilla y un sli PlaybackSlider - + Select Seleccionar - + Flash Flash @@ -4237,34 +4350,29 @@ Tenga en cuenta que el asistente no puede diferenciar entre una perilla y un sli QObject - + Operate Operación - + Design Diseño - - + + Reversed Invertido - + Page: %1 Página: %1 RDMManager - - - Form - Formulario - Scan for RDM devices... @@ -4684,22 +4792,22 @@ Tenga en cuenta que el asistente no puede diferenciar entre una perilla y un sli Ninguno - + No fixture group to control Ningún grupo para controlar - + Select image Seleccionar imagen - + Images Imágenes - + Sequence Secuencia @@ -4759,105 +4867,105 @@ Tenga en cuenta que el asistente no puede diferenciar entre una perilla y un sli Desactivar todos los canales de todos los fixtures - + Enable all channels in current fixture Activar todos los canales de este fixture - + Disable all channels in current fixture Desactivar todos los canales de este fixture - + Copy current values to clipboard Copiar los valores actuales en el portapapeles - + Paste clipboard values to current fixture Pegar los valores del portapapeles al fixture actual - + Copy current values to all fixtures Copiar los valores actuales a todos los fixtures - + Color tool for CMY/RGB-capable fixtures Herramienta de color para fixtures con capacidad CMY/RGB - + Position tool for moving heads/scanners Herramienta de posicionamiento para cabezas móviles o scanners - + Switch between tab view and all channels view Pasar de la vista de pestañas a la vista de canales - + Toggle blind mode Activar/Desactivar Modo Blind - + Show/Hide speed dial window Mostrar/Ocultar ventana de selector de velocidad - + Clone this scene and append as a new step to the selected chaser Clonar esta escena y añadirla como un nuevo paso en el chaser selecionado - + Go to next fixture tab Ir a la pestaña del siguiente fixture - + Go to previous fixture tab Ir a la pestaña del fixture anterior - + None Ninguno - + Scene name: Nombre de la Escena: + - All fixtures Todos los fixtures + - Channels Groups Grupos de Canales + - Generic Genérico - + Remove fixtures Eliminar fixtures - + Do you want to remove the selected fixture(s)? ¿Desea eliminar los fixtures seleccionados? @@ -5069,7 +5177,7 @@ Tenga en cuenta que el asistente no puede diferenciar entre una perilla y un sli Permitir universos sin patchear - + <Double click here to enter channel number manually> <Haga doble click aqui para ingresar manualmente el número del canal> @@ -5375,118 +5483,118 @@ Duración: %3 SimpleDesk - + Universe Universo - + Next page Página Siguiente - + Current page Página Actual - + Previous page Página Anterior - + View mode Modo Vista - + Reset universe Reiniciar universo - + Playback Reproducir - - + + Cue Stack Cue Stack - + Previous cue Cue Anterior - + Stop cue stack Detener cue stack - + Next cue Siguiente Cue - + Clone cue stack Clonar cue stack - + Edit cue stack Editar Cue Stack - + Record cue Guardar Cue - + Channel groups Grupos de canales - + Cue Stack - Playback %1 Cue Stack - Playback %1 - + No selection Ninguna selección - + Cue name Nombre del Cue - + Multiple Cues Múltiples Cues - + Delete cue Borrar Cue - + Clone Cue Stack Clonar Cue stack - + Clone To Playback# Clonar a Playback# - + Cue %1 Cue %1 @@ -5494,32 +5602,32 @@ Duración: %3 SpeedDial - + Hours Horas - + Minutes Minutos - + Seconds Segundos - + Milliseconds Milisegundos - + Infinite Infinito - + Tap Tap @@ -5527,17 +5635,17 @@ Duración: %3 SpeedDialWidget - + Fade In Fade In - + Fade Out Fade Out - + Hold Espera @@ -5627,17 +5735,17 @@ Duración: %3 VCButton - + Choose... Elegir... - + None Ninguno - + Button %1 Botón %1 @@ -5652,17 +5760,17 @@ Duración: %3 Imágenes (%1) - + Toggle Blackout Activar/Desactivar Blackout - + Stop ALL functions! ¡Detener TODAS las funciones! - + Icon Ícono @@ -5675,67 +5783,77 @@ Duración: %3 Propiedades del Botón - + + Override priority + Sobreescribe la prioridad + + + + Force LTP + Fuerza LTP + + + General General - + Button label Etiqueta del Botón - + Text to display on the button Texto a mostrar en el botón - + Function Función - + The function that this button controls La función que es controlada por este botón - + Attach a function to this button Enlazar un función a este botón - + Detach the button's function attachment Desenlazar la función de este botón - + Toggle Blackout Blackout On/Off - + Stop All Functions Detiene Todas las funciones - + Fade time: Duración de Fade: - + Adjust function intensity when it is running Ajusta la intensidad de la función cuando está en ejecución - + Adjust Function Intensity Ajustar la intensidad de la función - + Function's adjusted intensity percentage when run Porcentaje ajuste de intensidad de la función cuando se ejecuta @@ -5755,17 +5873,17 @@ Duración: %3 Modo Interruptor - + Flash the assigned function with this button Activa la función asignada mientras el botón se encuentra presionado - + Flash function (only for scenes) Modo Flash (sólo para escenas) - + No function Ninguna función @@ -5856,64 +5974,64 @@ Duración: %3 VCCueList - + Show/Hide crossfade sliders Mostrar/ocultar los sliders de crossfade - - + + Play/Pause Cue list Reproducir/Pausar Lista de Cues - - + + Stop Cue list Detener Lista de Cues - + Go to previous step in the list Ir al paso anterior en la lista - + Go to next step in the list Ir al siguiente paso en la lista - + Cue list Lista de Cues - + Play/Stop Cue list Reproducir/Detener Lista de Cues - + Pause Cue list Pausar Lista de Cues - + Fade In Fade In - + Fade Out Fade Out - + Duration Duración - + Notes Notas @@ -6079,7 +6197,7 @@ Duración: %3 VCFrame - + Add Añadir @@ -6132,17 +6250,17 @@ Duración: %3 Nombre de la página - + External Input - Enable Entrada externa - Hablilitar - + External Input - Previous Page Entrada Externa - Página previa - + External Input - Next Page Entrada Externa - Siguiente página @@ -6175,17 +6293,17 @@ Duración: %3 VCLabel - + Label Etiqueta - + Rename Label Renombrar Etiqueta - + Caption: Título: @@ -6193,42 +6311,42 @@ Duración: %3 VCMatrix - + Animation %1 Animación %1 - + End Color Reset Restablecer el color final - + Start color Red component Componente Rojo del color inicial - + Start color Green component Componente Verde del color inicial - + Start color Blue component Componente Azul del color inicial - + End color Red component Componente Rojo del color final - + End color Green component Componente Verde del color final - + End color Blue component Componente Azul del color final @@ -6431,48 +6549,48 @@ Duración: %3 Añadir texto - + No function Ninguna función - + Start Color Color de inicio - + Start Color Knob Perilla de color inicial - + End Color Color de finalización - + End Color Knob Perilla de color final - + End Color Reset Restablecer color final - + Animation Animación - - + + Text Texto - + Enter a text Ingresar texto @@ -6724,12 +6842,12 @@ Duración: %3 VCSlider - + Slider %1 Slider %1 - + Reset channels override Restaurar el override de canales @@ -6747,42 +6865,42 @@ Duración: %3 General - + Name of the slider Nombre del slider - + Value display style Estilo de Visualización de los Valores - + Show exact DMX values Mostrar el valor DMX exacto - + Show value as percentage Mostrar el valor en porcentaje - + Percentage Porcentaje - + Slider movement Movimiento del slider - + Normal Normal - + Inverted Invertido @@ -6858,32 +6976,32 @@ Duración: %3 Cambiar a Modo Reproducción - + Actual Actual - + Widget name Nombre del widget - + Widget appearance Apariencia del widget - + Slider Slider - + Knob Perilla - + Catch up with the external controller input value Actualizar con el valor de entrada del controlador externo @@ -7281,17 +7399,17 @@ Duración: %3 Mostrar el campo de milisegundos - + Multiply by 2 Input Entrada del Multiplicador por 2 - + Divide by 2 Input Entrada del Divisor por 2 - + Factor Reset Input Entrada de Reinicio de Factor @@ -7299,68 +7417,68 @@ Duración: %3 VCWidget - + Button Botón - + Slider Slider - + XYPad XY Pad - + Frame Marco - + Solo frame Marco Solo - + Speed dial Selector de velocidad - + Cue list Lista de Cues - + Label Etiqueta - + Audio Triggers Disparos de Audio - + Animation Animación - + Clock Reloj + - Unknown Desconocido - + This widget has no properties Este widget no tiene propiedades @@ -7558,12 +7676,12 @@ Duración: %3 Nombre del preset - + Pan / Horizontal Axis Pan /Eje horizontal - + Tilt / Vertical Axis Tilt / Eje vertical @@ -7593,45 +7711,45 @@ Duración: %3 Editar los ejes del fixture seleccionado - + Width Ancho - + Height Alto - + Remove fixtures Quitar fixtures - + Do you want to remove the selected fixtures? ¿Desea eleminar el fixture seleccionado? - - + + Error Error - + The selected Scene does not include any Pan or Tilt channel. Please select one with such channels. La Escena elegida no incluye ningún canal de Pan o Tilt. Por favor elija una que tenga esos canales. - + Please select at least one fixture or head to create this type of preset! Por favor, ¡seleccionar al menos un fixture o cabeza para crear este tipo de preset! - + Fixture Group Grupo de Fixtures @@ -7764,12 +7882,12 @@ Por favor elija una que tenga esos canales. VideoItem - + Fullscreen Pantalla completa - + Screen %1 Pantalla %1 diff --git a/ui/src/qlcplus_fi_FI.ts b/ui/src/qlcplus_fi_FI.ts index 6cf8b97956..6a1e0724a7 100644 --- a/ui/src/qlcplus_fi_FI.ts +++ b/ui/src/qlcplus_fi_FI.ts @@ -189,12 +189,12 @@ Jätä valaisinten kanavien väliin näin monta tyhjää kanavaa - + Fixtures found: %1 - + Dimmers Himmentimet @@ -525,375 +525,375 @@ App - + Cannot exit in Operate mode Ei voida sulkea Käyttötilassa - + You must switch back to Design mode to close the application. Sinun täytyy vaihtaa takaisin Suunnittelu-tilaan sulkeaksesi sovelluksen. - + Close Sulje - + Do you wish to save the current workspace before closing the application? Haluatko tallentaa nykyisen työtilan ennen sovelluksen sulkemista? - + Starting Q Light Controller Plus Starting Q Light Controller Käynnistetään Q Light Controller - + - New Workspace - Uusi työtila - + Switch to Design Mode Vaihda Suunnittelutilaan - + There are still running functions. Really stop them and switch back to Design mode? Joitain funktioita on vielä ajossa. Haluatko varmasti pysäyttää ne ja vaihtaa takaisin Suunnittelutilaan? - + Design Suunnittelu - + Switch to design mode Vaihda Suunnittelutilaan - + Operate Käyttötila - - + + Switch to operate mode Vaihda Käyttötilaan - + &New &Uusi - + CTRL+N File|New - + &Open &Avaa - + CTRL+O File|Open - + &Save &Tallenna - + CTRL+S File|Save - + Save &As... Tallenna &nimellä... - + &Operate &Käyttötila - + &Monitor &Monitorointi - + Toggle &Blackout Kytke &Pimennys - + CTRL+F12 Control|Toggle operate/design mode - + CTRL+M Control|Monitor - + Live edit a function - + Toggle Full Screen Kytke koko näyttö - + CTRL+F11 Control|Toggle Full Screen - + &Index &Hakemisto - + SHIFT+F1 Help|Index - + &About QLC+ &About QLC Ti&etoja QLC:stä - + Fixtures Valaisimet - + Functions - + Shows - + Virtual Console Virtuaalikonsoli - + Simple Desk - + Inputs/Outputs - + Close the application? - + Do you wish to close the application? - + Exit - + Address Tool - + Toggle Virtual Console Live edit - + Dump DMX values to a function - + CTRL+D Control|Dump DMX - + Stop ALL functions! Pysäytä KAIKKI funktiot! - + Fade 1 second and stop - + Fade 5 seconds and stop - + Fade 10 second and stop - + Fade 30 second and stop - + Quit QLC+ - + Workspace Työtila - + Unable to read from file Tiedostoa ei voida lukea - + Unable to write to file Tiedostoon ei voida kirjoittaa - + A fatal error occurred Peruuttamaton virhe on tapahtunut - + Unable to access resource Resurssiin ei voida käsitellä - + Unable to open file for reading or writing Tiedostoa ei voida avata lukemista tai kirjoittamista varten - + Operation was aborted Toiminto peruutettiin - + Operation timed out Toiminto aikakatkaistiin - + An unspecified error has occurred. Nice. Määrittelemätön virhe on tapahtunut. Siistiä. - + File error Tiedostovirhe - - - + + + Do you wish to save the current workspace? Changes will be lost if you don't save them. Haluatko tallentaa nykyisen työtilan? Menetät muutokset jos et tallenna niitä. - + New Workspace Uusi työtila - - - + + + Open Workspace Avaa työtila - - + + Workspaces (*%1) Työtilat (*%1) - - + + All Files (*.*) Kaikki tiedostot (*.*) - - + + All Files (*) Kaikki tiedostot (*) - + Save Workspace As Tallenna työtila nimellä - + Error - + File not found! The selected file has been moved or deleted. - + Warning - + Some errors occurred while loading the project: @@ -916,12 +916,12 @@ The selected file has been moved or deleted. Sulje automaattisesti näppäintä painettaessa - + Assign Key Aseta näppäin - + Hit the key combination that you wish to assign. You may hit either a single key or a combination using %1, %2, and %3. @@ -1048,23 +1048,23 @@ The selected file has been moved or deleted. AudioItem - - + + Preview Left Channel - + Preview Right Channel - + Preview Stereo Channels - + Preview Mono @@ -1132,52 +1132,52 @@ The selected file has been moved or deleted. Sisääntulo - + None Ei mitään - + DMX - + Function Funktio - + VC Widget - + %1 channels - + No function Ei funktiota - + No widget - + Not assigned - + Volume Bar - + #%1 (%2Hz - %3Hz) @@ -1235,12 +1235,12 @@ The selected file has been moved or deleted. - + Error - + You are trying to overwrite a system template! Please choose another name and the template will be saved in your channel modifier's user folder. @@ -1255,13 +1255,13 @@ The selected file has been moved or deleted. - + Name Nimi - + Type Tyyppi @@ -1281,27 +1281,27 @@ The selected file has been moved or deleted. - + Selected - + Channel properties configuration - + Can fade - + Behaviour - + Modifier @@ -1335,13 +1335,13 @@ The selected file has been moved or deleted. - + Fade In - + Fade Out @@ -1382,7 +1382,7 @@ The selected file has been moved or deleted. - + Hold @@ -1557,47 +1557,47 @@ The selected file has been moved or deleted. Takaperin - + Cut Leikkaa - + Copy Kopioi - + Paste Liitä - + Paste error - + Trying to paste on an incompatible Scene. Operation canceled. - + Common Fade In - + Common Fade Out - + Common Hold - + Multiple Steps @@ -1653,12 +1653,12 @@ The selected file has been moved or deleted. ConsoleChannel - + Intensity Intensiteetti - + Reset this channel @@ -1719,6 +1719,83 @@ The selected file has been moved or deleted. + + CustomFeedbackDialog + + + Custom Feedback Configuration + + + + + Value + + + + + Label + Etiketti + + + + Color + + + + + Values + Arvot + + + + Lower Value + + + + + Monitor Value + + + + + Upper Value + + + + + + + Color Selection + + + + + MIDI Channel + + + + + Upper Channel + + + + + Lower Channel + + + + + Monitor Channel + + + + + + + From plugin settings + + + DmxDumpFactory @@ -1778,50 +1855,17 @@ The selected file has been moved or deleted. - + Dump all channels (%1 Universes, %2 Fixtures, %3 Channels) Dump all DMX values (%1 Universes, %2 Fixtures, %3 Channels) - + New Scene From Live %1 - - DocBrowser - - - %1 - Document Browser - %1 - ohjeiden selaus - - - - Backward - Takaisin - - - - Forward - Eteen - - - - Index - Hakemisto - - - - About Qt - - - - - Close this window - - - EFXEditor @@ -2102,12 +2146,12 @@ The selected file has been moved or deleted. - + Remove fixtures Poista valaisimia - + Do you want to remove the selected fixture(s)? Haluatko poistaa valitut valaisimet? @@ -2452,88 +2496,88 @@ The selected file has been moved or deleted. - - + + (remapped) - + Import Fixtures List - + Fixtures List (*%1) - + All Files (*.*) Kaikki tiedostot (*.*) - + All Files (*) Kaikki tiedostot (*) - + Do you want to automatically connect fixtures with the same name? - + Generic Dimmer Yleinen himmennin - + Delete Fixtures Poista valaisimia - + Do you want to delete the selected items? - + Invalid operation - + You are trying to clone a fixture on an address already in use. Please fix the target list first. - - - - + + + + Invalid selection - - - + + + Please select a source and a target fixture or channel to perform this operation. - + To perform a fixture remap, please select fixtures on both lists. - + This might take a while... - + Cancel @@ -2546,12 +2590,12 @@ The selected file has been moved or deleted. Valitse valaisin - + No fixtures available Ei valaisimia saatavilla - + Go to the Fixture Manager and add some fixtures first. Mene Laitehallintaan luodaksesi ensin valaisimia. @@ -2608,7 +2652,7 @@ The selected file has been moved or deleted. FunctionLiveEditDialog - + Function Live Edit @@ -2616,195 +2660,195 @@ The selected file has been moved or deleted. FunctionManager - + New &scene Uusi &tilanne - + New c&haser Uusi &juoksutus - + New se&quence - + New c&ollection Uusi &kokoelma - + New E&FX Uusi &EFX - + New &RGB Matrix - + New scrip&t - + New Scene Uusi tilanne - + New Chaser Uusi juoksutus - + New Sequence - + &Clone K&loonaa - + New au&dio - + New vid&eo - + New fo&lder - + Select Startup Function - + Function &Wizard - + &Delete &Poista - + Select &all Valitse k&aikki - + New Collection - + New EFX - + New RGB Matrix - + New Script - + Open Audio File - + Audio Files (%1) - - + + All Files (*.*) Kaikki tiedostot (*.*) - - + + All Files (*) Kaikki tiedostot (*) - + Unsupported audio file - + This audio file cannot be played with QLC+. Sorry. - + Open Video File - + Video Files (%1) - + Unsupported video file - + This video file cannot be played with QLC+. Sorry. - + Do you want to DELETE folder: Do you want to DELETE foler: - + Do you want to DELETE functions: Haluatko POISTAA funktiot: - + (This will also DELETE: - + Delete Functions Poista funktioita - + Function Funktio - + (Copy) @@ -3067,32 +3111,32 @@ p, li { white-space: pre-wrap; } Poista - + %1 group - + Error - + %1 has no capability supported by this wizard. - + Presets solo frame - + Click & Go RGB - + Click & Go Macro @@ -3100,27 +3144,27 @@ p, li { white-space: pre-wrap; } GrandMasterSlider - + GM - + Grand Master <B>limits</B> the maximum value of - + Grand Master <B>reduces</B> the current value of - + intensity channels intensiteettikanaville - + all channels kaikille kanaville @@ -3221,45 +3265,45 @@ p, li { white-space: pre-wrap; } InputOutputManager - + Add U&niverse - + &Delete Universe Universe Universumi - + Universe name: - + Passthrough - - + + Universe %1 - - + + Delete Universe - + The universe you are trying to delete is patched. Are you sure you want to delete it? - + There are some fixtures using the universe you are trying to delete. Are you sure you want to delete it? @@ -3366,87 +3410,87 @@ p, li { white-space: pre-wrap; } - - - + + + Error - - + + Output line already assigned - + An error occurred while trying to open the selected device line. This can be caused either by a wrong system configuration or an unsupported input/output mode. Please refer to the plugins documentation to troubleshoot this. - - + + Existing Input Profile Olemassaoleva sisääntuloprofiili - - + + An input profile at %1 already exists. Do you wish to overwrite it? Sisääntuloprofiili %1 on jo olemassa. Haluatko ylikirjoittaa sen? - - + + Save Input Profile Tallenna sisääntuloprofiili - - + + Input Profiles (*.qxi) Sisääntuloprofiilit (*.qxi) - - + + Saving failed Tallennus epäonnistui - + Unable to save the profile to %1 Profiilia ei voida tallentaa tiedostoon %1 - + Delete profile Poista profiili - + Do you wish to permanently delete profile "%1"? Haluat poistaa profiilin %1 pysyvästi? - + File deletion failed Tiedoston poisto epäonnistui - + Unable to delete file %1 Tiedostoa %1 ei voida poistaa - + Unable to save %1 to %2 Profiilia %1 ei voida tallentaa tiedostoon %2 - + Default device @@ -3459,176 +3503,233 @@ Please refer to the plugins documentation to troubleshoot this. Sisääntulon profiilin muokkaus - + General Yleinen - + Manufacturer Valmistaja - + The name of the company that made the device Laitteen valmistaneen yrityksen nimi - + Model Malli - + The device's model name Laitteen mallin nimi - - Channels - Kanavat - - - + + Channel Kanava - + + Name Nimi - - + + Type Tyyppi - + MIDI Global Settings - + When MIDI notes are used, send a Note Off when value is 0 - - + + Input Mapping + + + + Behaviour - + Movement Liike - + Absolute - + Relative - + Generate an extra Press/Release when toggled - + Custom feedback - + Upper value - + + + MIDI channel + + + + + Colors + + + + + Remove the selected color + + + + + Add a new color + + + + + Value + + + + + Label + Etiketti + + + + Color + + + + + MIDI Channels + + + + + Add a new MIDI channel + + + + + Remove the selected MIDI channel + + + + Lower value - + Sensitivity - + Add a new channel description Lisää uusi kanavakuvaus - + Remove the selected channels Poista valitut kanavat - + Edit the selected channel Muokkaa valittua kanavaa - + Automatically add channels to the list when you wiggle the device's controls Lisää kanavia listaan automaattisesti kun laitteen toimintoja käytetään - + File not writable Tiedoston ei voida kirjoittaa - + You do not have permission to write to the file %1. You might not be able to save your modifications to the profile. Sinulla ei ole oikeuksia kirjoittaa tiedostoon %1. Et ehkä voi tallettaa muutoksiasi valittuun profiiliin. - + + From plugin settings + + + + Missing information Puutteelliset tiedot - + Manufacturer and/or model name is missing. Valmistaja ja/tai mallinimike puuttuu. - - + + Channel already exists Kanava on jo olemassa - - + + Channel %1 already exists Kanava %1 on jo olemassa - + Delete channels Poista kanavia - + Delete all %1 selected channels? Poistetaanko kaikki %1 valittua kanavaa? - + Channel wizard activated Kanavavelho on aktiivisena - + You have enabled the input channel wizard. After clicking OK, wiggle your mapped input profile's controls. They should appear into the list. Click the wizard button again to stop channel auto-detection. Note that the wizard cannot tell the difference between a knob and a slider so you will have to do the change manually. @@ -3637,12 +3738,39 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Huomaa, että velho ei osaa erottaa pyöritettävää nuppia ja liukua toisistaan, joten sinun täytyy tehdä vastaavat muutokset käsin. - + + + Enter value + + + + + Feedback value + + + + + + Enter label + + + + + Color label + + + + + MIDI channel label + + + + Button %1 Nappi %1 - + Slider %1 Liuku %1 @@ -3675,65 +3803,50 @@ Huomaa, että velho ei osaa erottaa pyöritettävää nuppia ja liukua toisistaa Ulkoinen ohjaus - + When toggled, you can click an external button to assign it to this widget. Alaskytkettynä voit painaa ulkoista kontrollinappia kytkeäksesi sen tähän virtuaalinappiin. - + Auto Detect Automaattinen tunnistus - + Input Universe Sisääntulon universumi - + Input Channel Sisääntulokanava - + The input universe that sends data to this widget - + Custom Feedback - + The particular input channel within the input universe that sends data to this widget - + Choose an external input universe & channel that this widget should listen to. Valitse ulkoinen sisääntulouniversumi ja -kanava, jota tämä nappi kuuntelee. - + Choose... Valitse... - - - Custom feedback - - - - - Lower value - - - - - Upper value - - Monitor @@ -3890,14 +4003,14 @@ Huomaa, että velho ei osaa erottaa pyöritettävää nuppia ja liukua toisistaa - - + + Select background image Valitse taustakuva - - + + Images @@ -4187,12 +4300,12 @@ Huomaa, että velho ei osaa erottaa pyöritettävää nuppia ja liukua toisistaa PlaybackSlider - + Select - + Flash @@ -4208,34 +4321,29 @@ Huomaa, että velho ei osaa erottaa pyöritettävää nuppia ja liukua toisistaa QObject - + Operate Käyttötila - + Design Suunnittelu - - + + Reversed Käänteinen - + Page: %1 RDMManager - - - Form - - Scan for RDM devices... @@ -4655,22 +4763,22 @@ Huomaa, että velho ei osaa erottaa pyöritettävää nuppia ja liukua toisistaa Ei mitään - + No fixture group to control - + Select image - + Images - + Sequence @@ -4730,105 +4838,105 @@ Huomaa, että velho ei osaa erottaa pyöritettävää nuppia ja liukua toisistaa Kytke pois kaikkien valaisinten kanavat - + Enable all channels in current fixture Käytä kaikkia valitun valaisimen kanavia - + Disable all channels in current fixture Poista käytöstä valitun valaisimen kaikki kanavat - + Copy current values to clipboard Kopio nykyiset arvot leikepöydälle - + Paste clipboard values to current fixture Liitä leikepöydälle tallennetut arvot nykyiselle valaisimelle - + Copy current values to all fixtures Kopioi nykyisen valaisimen arvot kaikkiin valittuihin valaisimiin - + Color tool for CMY/RGB-capable fixtures Värityökalu CMY/RGB-toiminnolla varustettuja valaisimia varten - + Position tool for moving heads/scanners - + Switch between tab view and all channels view - + Toggle blind mode - + Show/Hide speed dial window - + Clone this scene and append as a new step to the selected chaser - + Go to next fixture tab - + Go to previous fixture tab - + None Ei mitään - + Scene name: + - All fixtures + - Channels Groups + - Generic Yleinen - + Remove fixtures Poista valaisimia - + Do you want to remove the selected fixture(s)? Haluatko poistaa valitut valaisimet? @@ -5037,7 +5145,7 @@ Huomaa, että velho ei osaa erottaa pyöritettävää nuppia ja liukua toisistaa - + <Double click here to enter channel number manually> <Kaksoisnapauta tähän kirjoittaaksesi kanavanumeron käsin> @@ -5340,118 +5448,118 @@ Duration: %3 SimpleDesk - + Universe Universumi - + Next page - + Current page - + Previous page - + View mode - + Reset universe - + Playback Toisto - - + + Cue Stack - + Previous cue - + Stop cue stack - + Next cue - + Clone cue stack - + Edit cue stack - + Record cue - + Channel groups - + Cue Stack - Playback %1 - + No selection - + Cue name - + Multiple Cues - + Delete cue - + Clone Cue Stack - + Clone To Playback# - + Cue %1 @@ -5459,32 +5567,32 @@ Duration: %3 SpeedDial - + Hours - + Minutes - + Seconds - + Milliseconds - + Infinite - + Tap @@ -5492,17 +5600,17 @@ Duration: %3 SpeedDialWidget - + Fade In - + Fade Out - + Hold @@ -5592,17 +5700,17 @@ Duration: %3 VCButton - + Choose... Valitse... - + None Ei mitään - + Button %1 Nappi %1 @@ -5617,17 +5725,17 @@ Duration: %3 Kuvatiedostot (%1) - + Toggle Blackout - + Stop ALL functions! Pysäytä KAIKKI funktiot! - + Icon Ikoni @@ -5640,67 +5748,77 @@ Duration: %3 Napin asetukset - + + Override priority + + + + + Force LTP + + + + General Yleinen - + Button label Napin teksti - + Text to display on the button Teksti, joka näytetään napissa - + Function Funktio - + The function that this button controls Funktio, jota tämä nappi ohjaa - + Attach a function to this button Liitä funktio tähän nappiin - + Detach the button's function attachment Poista funktio tästä napista - + Toggle Blackout - + Stop All Functions - + Fade time: - + Adjust function intensity when it is running Aseta funktion ajonaikainen intensiteetti - + Adjust Function Intensity Aseta funktion intensiteettiä - + Function's adjusted intensity percentage when run Funktion ajonaikainen intensiteetti prosentteina @@ -5720,17 +5838,17 @@ Duration: %3 Kytke funktio vuorottain päälle/pois - + Flash the assigned function with this button Väläytä liitettyä funktiota painamalla nappi alas - + Flash function (only for scenes) Väläytä funktiota (käytössä vain tilanteille) - + No function Ei funktiota @@ -5821,64 +5939,64 @@ Duration: %3 VCCueList - + Show/Hide crossfade sliders - - + + Play/Pause Cue list - - + + Stop Cue list - + Go to previous step in the list - + Go to next step in the list - + Cue list Cue lista - + Play/Stop Cue list - + Pause Cue list - + Fade In - + Fade Out - + Duration - + Notes @@ -6044,7 +6162,7 @@ Duration: %3 VCFrame - + Add Lisää @@ -6097,17 +6215,17 @@ Duration: %3 - + External Input - Enable - + External Input - Previous Page - + External Input - Next Page @@ -6140,17 +6258,17 @@ Duration: %3 VCLabel - + Label Etiketti - + Rename Label - + Caption: Teksti: @@ -6158,42 +6276,42 @@ Duration: %3 VCMatrix - + Animation %1 - + End Color Reset - + Start color Red component - + Start color Green component - + Start color Blue component - + End color Red component - + End color Green component - + End color Blue component @@ -6396,48 +6514,48 @@ Duration: %3 - + No function Ei funktiota - + Start Color - + Start Color Knob - + End Color - + End Color Knob - + End Color Reset - + Animation - - + + Text - + Enter a text @@ -6689,12 +6807,12 @@ Duration: %3 VCSlider - + Slider %1 Liuku %1 - + Reset channels override @@ -6712,42 +6830,42 @@ Duration: %3 Yleinen - + Name of the slider Liukukomponentin nimi - + Value display style Arvon näyttötapa - + Show exact DMX values Näytä tarkat DMX tai aika-arvot - + Show value as percentage Näytä arvo prosentteina - + Percentage Prosentti - + Slider movement Liu'un liike - + Normal Normaali - + Inverted Käänteinen @@ -6823,32 +6941,32 @@ Duration: %3 Vaihda toisto-tilaan - + Actual - + Widget name - + Widget appearance - + Slider - + Knob - + Catch up with the external controller input value @@ -7246,17 +7364,17 @@ Duration: %3 - + Multiply by 2 Input - + Divide by 2 Input - + Factor Reset Input @@ -7264,68 +7382,68 @@ Duration: %3 VCWidget - + Button - + Slider - + XYPad - + Frame Kehys - + Solo frame - + Speed dial - + Cue list Cue lista - + Label Etiketti - + Audio Triggers - + Animation - + Clock + - Unknown Tuntematon - + This widget has no properties Tällä komponentilla ei ole ominaisuuksia @@ -7533,12 +7651,12 @@ Duration: %3 - + Pan / Horizontal Axis - + Tilt / Vertical Axis @@ -7558,44 +7676,44 @@ Duration: %3 Käänteinen - + Width Leveys - + Height Korkeus - + Remove fixtures Poista valaisimia - + Do you want to remove the selected fixtures? Haluatko poistaa valitut valaisimet? - - + + Error - + The selected Scene does not include any Pan or Tilt channel. Please select one with such channels. - + Please select at least one fixture or head to create this type of preset! - + Fixture Group @@ -7728,12 +7846,12 @@ Please select one with such channels. VideoItem - + Fullscreen - + Screen %1 diff --git a/ui/src/qlcplus_fr_FR.ts b/ui/src/qlcplus_fr_FR.ts index e0782a5464..62c7095d9f 100644 --- a/ui/src/qlcplus_fr_FR.ts +++ b/ui/src/qlcplus_fr_FR.ts @@ -189,12 +189,12 @@ Le nombre de canaux vides à laisser entre chaque 'appareil - + Fixtures found: %1 Appareils trouvés : %1 - + Dimmers Gradateurs @@ -525,318 +525,318 @@ App - + Cannot exit in Operate mode Impossible de quitter en mode Production - + You must switch back to Design mode to close the application. Vous devez basculer vers le mode Création pour quitter l'application. - + Close Quitter - + Do you wish to save the current workspace before closing the application? Voulez-vous enregistrer le projet en cours avant de quitter l'application ? - + Starting Q Light Controller Plus Starting Q Light Controller Démarrage de Q Light Controller Plus - + - New Workspace - Nouveau projet - + Switch to Design Mode Basculer vers le mode Création - + There are still running functions. Really stop them and switch back to Design mode? Des fonctions sont encore en cours d'exécution. Voulez-vous vraiment les arrêter et basculer vers le mode Création ? - + Design Création - + Switch to design mode Basculer vers le mode Création - + Operate Production - - + + Switch to operate mode Basculer vers le mode Production - + &New &Nouveau - + CTRL+N File|New - + &Open &Ouvrir - + CTRL+O File|Open - + &Save Enregi&strer - + CTRL+S File|Save - + Save &As... Enregistrer sous (&A) ... - + &Operate &Produire - + &Monitor &Moniteur - + Toggle &Blackout &Blackout - + CTRL+F12 Control|Toggle operate/design mode - + CTRL+M Control|Monitor - + Live edit a function Éditer une fonction en direct - + Toggle Full Screen Plein écran - + CTRL+F11 Control|Toggle Full Screen - + &Index A&ide - + SHIFT+F1 Help|Index - + &About QLC+ &About QLC &À propos de QLC+ - + Fixtures Appareils - + Functions Fonctions - + Shows Shows - + Virtual Console Console virtuelle - + Simple Desk Pupitre traditionnel - + Inputs/Outputs Entrées/Sorties - + Close the application? Quitter QLCPlus ? - + Do you wish to close the application? Voulez-vous quitter l'application ? - + Exit Quitter - + Address Tool Outil d'adressage - + Toggle Virtual Console Live edit Basculer l'édition live de la console virtuelle - + Dump DMX values to a function Capturer les valeurs DMX vers une fonction - + CTRL+D Control|Dump DMX CTRL+D - + Stop ALL functions! Arrêter TOUTES les fonctions ! - + Fade 1 second and stop Fondu d'1 s en sortie - + Fade 5 seconds and stop Fondu de 5 s en sortie - + Fade 10 second and stop Fondu de 10 s en sortie - + Fade 30 second and stop Fondu de 30 s en sortie - + Quit QLC+ Quitter QLC+ - + Workspace Projet - + Unable to read from file Impossible de lire le fichier - + Unable to write to file Impossible d'écrire dans le fichier - + A fatal error occurred ...la vilaine! Une erreur fatale est survenue - + Unable to access resource Impossible d'accéder à la ressource - + Unable to open file for reading or writing Impossible d'ouvrir le fichier en lectue ou écriture - + Operation was aborted L'opération a été abandonnée - + Operation timed out L'opération a pris trop de temps - + An unspecified error has occurred. Nice. Une erreur indeterminée est survenue, sympa. - + File error Erreur de fichier - - - + + + Do you wish to save the current workspace? Changes will be lost if you don't save them. Tiens tiens...perspicace! @@ -844,59 +844,59 @@ Changes will be lost if you don't save them. Les changements seront perdus si vous ne les sauvegardez pas. - + New Workspace Nouveau projet - - - + + + Open Workspace Ouvrir un projet - - + + Workspaces (*%1) Projets (*%1) - - + + All Files (*.*) Tous les fichiers (*.*) - - + + All Files (*) Tous les fichiers (*) - + Save Workspace As Enregistrer le projet sous - + Error Erreur - + File not found! The selected file has been moved or deleted. Fichier introuvable  Celui-ci a dû être déplacé ou effacé. - + Warning Attention - + Some errors occurred while loading the project: Des erreurs sont survenues lors du chargement du projet : @@ -919,12 +919,12 @@ Celui-ci a dû être déplacé ou effacé. Fermer la fenêtre automatiquement sur appui touche - + Assign Key Assigner une touche - + Hit the key combination that you wish to assign. You may hit either a single key or a combination using %1, %2, and %3. Presser le raccourci clavier que vous voulez assigner. Vous pouvez presser une seule touche ou une combinaison utilisant %1, %2 et %3. @@ -1051,23 +1051,23 @@ Celui-ci a dû être déplacé ou effacé. AudioItem - - + + Preview Left Channel Prévisualiser le canal gauche - + Preview Right Channel Prévisualiser le canal droit - + Preview Stereo Channels Prévisualiser les deux canaux (stéréo) - + Preview Mono Prévisualiser le canal (mono) @@ -1135,52 +1135,52 @@ Celui-ci a dû être déplacé ou effacé. Entrée - + None Aucun - + DMX DMX - + Function Fonction - + VC Widget Widget - + %1 channels %1 canaux - + No function Aucune fonction - + No widget Aucun widget - + Not assigned Non assigné - + Volume Bar Barre de volume - + #%1 (%2Hz - %3Hz) @@ -1240,12 +1240,12 @@ Celui-ci a dû être déplacé ou effacé. Désactiver le modificateur - + Error Erreur - + You are trying to overwrite a system template! Please choose another name and the template will be saved in your channel modifier's user folder. Vous tentez d'écraser un modèle système ! Merci de choisir un nom différent et le modèle sera enregistré dans votre dossier personnel. @@ -1260,13 +1260,13 @@ Celui-ci a dû être déplacé ou effacé. - + Name Nom - + Type Type @@ -1286,27 +1286,27 @@ Celui-ci a dû être déplacé ou effacé. Tout déplier - + Selected Sélectionné - + Channel properties configuration Configuration des propriétés du canal - + Can fade Graduable - + Behaviour Comportement - + Modifier Modificateur @@ -1340,13 +1340,13 @@ Celui-ci a dû être déplacé ou effacé. - + Fade In Montée - + Fade Out Descente @@ -1367,7 +1367,7 @@ Celui-ci a dû être déplacé ou effacé. - + Hold Maintien @@ -1562,47 +1562,47 @@ Celui-ci a dû être déplacé ou effacé. Arrière - + Cut Couper - + Copy Copier - + Paste Coller - + Paste error Erreur de collage - + Trying to paste on an incompatible Scene. Operation canceled. La scène vers laquelle coller est incompatible. Opération annulée. - + Common Fade In Montée commune - + Common Fade Out Descente commune - + Common Hold Maintien commun - + Multiple Steps Pas multiples @@ -1658,12 +1658,12 @@ Celui-ci a dû être déplacé ou effacé. ConsoleChannel - + Intensity Intensité - + Reset this channel Réinitialiser ce canal @@ -1724,6 +1724,83 @@ Celui-ci a dû être déplacé ou effacé. Mémoire + + CustomFeedbackDialog + + + Custom Feedback Configuration + + + + + Value + Valeur + + + + Label + Étiquette + + + + Color + + + + + Values + Valeurs + + + + Lower Value + + + + + Monitor Value + + + + + Upper Value + + + + + + + Color Selection + + + + + MIDI Channel + + + + + Upper Channel + + + + + Lower Channel + + + + + Monitor Channel + + + + + + + From plugin settings + + + DmxDumpFactory @@ -1783,50 +1860,17 @@ Celui-ci a dû être déplacé ou effacé. Nom de la scène : - + Dump all channels (%1 Universes, %2 Fixtures, %3 Channels) Dump all DMX values (%1 Universes, %2 Fixtures, %3 Channels) Capturer tous les canaux (%1 univers, %2 appareils, %3 canaux) - + New Scene From Live %1 Nouvelle scène live %1 - - DocBrowser - - - %1 - Document Browser - %1 - Explorateur de document - - - - Backward - Arrière - - - - Forward - Avant - - - - Index - Aide - - - - About Qt - À propos de Qt - - - - Close this window - Fermer cette fenêtre - - EFXEditor @@ -2110,12 +2154,12 @@ Celui-ci a dû être déplacé ou effacé. Prévisualiser l'EFX - + Remove fixtures Enlever les appareils - + Do you want to remove the selected fixture(s)? Voulez-vous enlever le(s) appareil(s) sélectionné(s) ? @@ -2460,88 +2504,88 @@ Celui-ci a dû être déplacé ou effacé. Reprendre le nom des appareils sources - - + + (remapped) (remappé) - + Import Fixtures List Importer une liste d'appareils - + Fixtures List (*%1) Liste d'appareils (*%1) - + All Files (*.*) Tous les fichiers (*.*) - + All Files (*) Tous les fichiers (*) - + Do you want to automatically connect fixtures with the same name? - + Generic Dimmer Gradateur générique - + Delete Fixtures Supprimer un élément - + Do you want to delete the selected items? Voulez-vous supprimer l'élément cible sélectionné ? - + Invalid operation Opération invalide - + You are trying to clone a fixture on an address already in use. Please fix the target list first. L'adresse de l'appareil à dupliquer est déjà utilisée. Veuillez d'abord modifier la liste des appareils cibles. - - - - + + + + Invalid selection Sélection invalide - - - + + + Please select a source and a target fixture or channel to perform this operation. Veuillez d'abord sélectionner un appareil ou un canal dans la liste des sources et des cibles. - + To perform a fixture remap, please select fixtures on both lists. Veuillez sélectionner soit un appareil soit un canal dans les deux listes. - + This might take a while... Ceci peut prendre un moment... - + Cancel Annuler @@ -2554,12 +2598,12 @@ Celui-ci a dû être déplacé ou effacé. Sélectionner un appareil - + No fixtures available Aucun appareil disponible - + Go to the Fixture Manager and add some fixtures first. Veuillez commencez par ajouter des appareils à partir du gestionnaire d'appareils. @@ -2616,7 +2660,7 @@ Celui-ci a dû être déplacé ou effacé. FunctionLiveEditDialog - + Function Live Edit Edition d'une fonction en direct @@ -2624,195 +2668,195 @@ Celui-ci a dû être déplacé ou effacé. FunctionManager - + New &scene Nouvelle &scène - + New c&haser Nouveau c&haser - + New se&quence Nouvelle sé&quence - + New c&ollection Nouvelle c&ollection - + New E&FX Nouvel E&FX - + New &RGB Matrix Nouvelle matrice &RVB - + New scrip&t Nouveau scrip&t - + New Scene Nouvelle scène - + New Chaser Nouveau chaser - + New Sequence Nouvelle séquence - + &Clone &Dupliquer - + New au&dio Nouveau son (&D) - + New vid&eo Nouvelle vid&éo - + New fo&lder Nouveau dossier (&L) - + Select Startup Function Sélectionner la fonction de démarrage - + Function &Wizard Assistant de fonction (&W) - + &Delete Supprimer (&D) - + Select &all Tout sélectionner (&A) - + New Collection Nouvelle collection - + New EFX Nouvel EFX - + New RGB Matrix Nouvelle matrice RVB - + New Script Nouveau script - + Open Audio File Ouvrir un fichier audio - + Audio Files (%1) Fichiers audio (%1) - - + + All Files (*.*) Tous les fichiers (*.*) - - + + All Files (*) Tous les fichiers (*) - + Unsupported audio file Fichier audio non pris en charge - + This audio file cannot be played with QLC+. Sorry. Ce fichier audio ne peut pas être lu par QLC+, désolé. - + Open Video File Ouvrir un fichier vidéo - + Video Files (%1) Fichiers vidéo (%1) - + Unsupported video file Fichier vidéo non pris en charge - + This video file cannot be played with QLC+. Sorry. Ce fichier vidéo ne peut pas être lu par QLC+, désolé. - + Do you want to DELETE folder: Do you want to DELETE foler: Voulez-vous SUPPRIMER le dossier : - + Do you want to DELETE functions: Voulez-vous SUPPRIMER ces fonctions : - + (This will also DELETE: (Cela SUPPRIMERA également : - + Delete Functions Supprimer les fonctions - + Function Fonctions - + (Copy) (copie) @@ -3099,32 +3143,32 @@ p, li { white-space: pre-wrap; } Enlever - + %1 group Groupe %1 - + Error Erreur - + %1 has no capability supported by this wizard. %1 n'a pas de fonction supportée par cet assistant. - + Presets solo frame Cadre de préréglages solos - + Click & Go RGB Accès rapide RVB - + Click & Go Macro Accès rapide Macro @@ -3132,27 +3176,27 @@ p, li { white-space: pre-wrap; } GrandMasterSlider - + GM GM - + Grand Master <B>limits</B> the maximum value of Le Grand Master <B>limite</B> la valeur maximum - + Grand Master <B>reduces</B> the current value of Le Grand Master <B>reduit</B> la valeur - + intensity channels des canaux d'intensité - + all channels de tous les canaux @@ -3253,45 +3297,45 @@ p, li { white-space: pre-wrap; } InputOutputManager - + Add U&niverse Ajouter un u&nivers - + &Delete Universe Universe Supprimer l'univers (&D) - + Universe name: Nom de l'univers : - + Passthrough Traversé - - + + Universe %1 Univers %1 - - + + Delete Universe Supprimer l'univers - + The universe you are trying to delete is patched. Are you sure you want to delete it? Cet univers est actuellement patché. Êtes-vous sûr(e) de vouloir le supprimer ? - + There are some fixtures using the universe you are trying to delete. Are you sure you want to delete it? Des appareils utilisent actuellement cet univers. Êtes-vous sûr(e) de vouloir le supprimer ? @@ -3398,20 +3442,20 @@ p, li { white-space: pre-wrap; } Moniteur de niveau - - - + + + Error Erreur - - + + Output line already assigned La ligne de sortie est déjà assignée - + An error occurred while trying to open the selected device line. This can be caused either by a wrong system configuration or an unsupported input/output mode. Please refer to the plugins documentation to troubleshoot this. @@ -3420,67 +3464,67 @@ Cela peut être dû à une mauvaise configuration système ou un mode d'ent Veuillez vous référer à la documentation du plugin. - - + + Existing Input Profile Profil d'entrée existant - - + + An input profile at %1 already exists. Do you wish to overwrite it? Un profil d'entrée existe déjà en '%1'. Voulez-vous l'écraser ? - - + + Save Input Profile Enregistrer le profil d'entrée - - + + Input Profiles (*.qxi) Profils d'entrée (*.qxi) - - + + Saving failed L'enregistrement a échoué - + Unable to save the profile to %1 Impossible d'enregistrer le profil sous %1 - + Delete profile Supprimer le profil - + Do you wish to permanently delete profile "%1"? Voulez-vous supprimer définitivement le profil "%1" ? - + File deletion failed L'effacement du fichier a échoué - + Unable to delete file %1 Impossible de supprimer le fichier %1 - + Unable to save %1 to %2 Impossible d'enregistrer %1 sous %2 - + Default device Périphérique par défaut @@ -3493,176 +3537,233 @@ Veuillez vous référer à la documentation du plugin. Éditeur de profil d'entrée - + General Général - + Manufacturer Fabricant - + The name of the company that made the device Le nom de la société qui a fabriqué le périphérique - + Model Modèle - + The device's model name Le nom du modèle du périphérique - - Channels - Canaux - - - + + Channel Canal - + + Name Nom - + Custom feedback Retour d'info personnalisé - + Upper value Valeur supérieure - + Lower value Valeur inférieure - - + + Type Type - + MIDI Global Settings Paramètres MIDI globaux - + When MIDI notes are used, send a Note Off when value is 0 Lors de l'utilisation de notes MIDI, envoyer Note Off quand la valeur est de 0 - - + + Input Mapping + + + + Behaviour Comportement - + Add a new channel description Ajouter un nouveau canal - + + + MIDI channel + + + + + Colors + + + + + Remove the selected color + + + + + Add a new color + + + + + Value + Valeur + + + + Label + Étiquette + + + + Color + + + + + MIDI Channels + + + + + Add a new MIDI channel + + + + + Remove the selected MIDI channel + + + + Remove the selected channels Enlever les canaux sélectionnés - + Edit the selected channel Éditer le canal sélectionné - + Automatically add channels to the list when you wiggle the device's controls Ajouter automatiquement le canal à la liste quand un contrôle du périphérique est sollicité - + Movement Mouvement - + Absolute Absolu - + Relative Relatif - + Generate an extra Press/Release when toggled Générer une pression/relâche supplémentaire quand basculé - + Sensitivity Sensibilité - + File not writable Fichier inaccessible en écriture - + You do not have permission to write to the file %1. You might not be able to save your modifications to the profile. Vous n'avez pas les permissions pour écrire le fichier '%1'. Vous risquez de ne pas pouvoir sauvegarder vos modifications du profil. - + + From plugin settings + + + + Missing information Information manquante - + Manufacturer and/or model name is missing. Le nom du fabricant et/ou du modèle est manquant. - - + + Channel already exists Canal existant - - + + Channel %1 already exists Le canal %1 existe déjà - + Delete channels Supprimer les canaux - + Delete all %1 selected channels? Supprimer les %1 canaux sélectionnés ? - + Channel wizard activated Assistant de canal activé - + You have enabled the input channel wizard. After clicking OK, wiggle your mapped input profile's controls. They should appear into the list. Click the wizard button again to stop channel auto-detection. Note that the wizard cannot tell the difference between a knob and a slider so you will have to do the change manually. @@ -3671,12 +3772,39 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Notez que l'assistant ne peut pas différencier un bouton rotatif d'un fader, vous devrez faire ce changement manuellement. - + + + Enter value + + + + + Feedback value + + + + + + Enter label + + + + + Color label + + + + + MIDI channel label + + + + Button %1 Bouton %1 - + Slider %1 Fader %1 @@ -3709,65 +3837,50 @@ Notez que l'assistant ne peut pas différencier un bouton rotatif d'un Entrée externe - + When toggled, you can click an external button to assign it to this widget. Quand activée, pressez un bouton externe afin de l'assigner à ce widget. - + Auto Detect Auto-détection - + Input Universe Univers d'entrée - + Input Channel Canal d'entrée - + The input universe that sends data to this widget L'univers d'entrée qui contrôle ce widget - + Custom Feedback Retour d'info personnalisé - + The particular input channel within the input universe that sends data to this widget Le canal de l'univers d'entrée qui contrôle ce widget - + Choose an external input universe & channel that this widget should listen to. Choisir l'univers d'entrée et son canal qui contrôlera ce widget. - + Choose... Choisir... - - - Custom feedback - Retour d'info personnalisé - - - - Lower value - Valeur inférieure - - - - Upper value - Valeur suppérieure - Monitor @@ -3924,14 +4037,14 @@ Notez que l'assistant ne peut pas différencier un bouton rotatif d'un Arrière-plan - - + + Select background image Choisir une image d'arrière-plan - - + + Images Images @@ -4221,12 +4334,12 @@ Notez que l'assistant ne peut pas différencier un bouton rotatif d'un PlaybackSlider - + Select Sélectionner - + Flash Flash @@ -4242,34 +4355,29 @@ Notez que l'assistant ne peut pas différencier un bouton rotatif d'un QObject - + Operate Production - + Design Création - - + + Reversed Inversé - + Page: %1 Page : %1 RDMManager - - - Form - - Scan for RDM devices... @@ -4689,22 +4797,22 @@ Notez que l'assistant ne peut pas différencier un bouton rotatif d'un Aucun - + No fixture group to control Aucun groupe d'appareils à controller - + Select image Sélectionner une image - + Images Images - + Sequence Séquence @@ -4764,105 +4872,105 @@ Notez que l'assistant ne peut pas différencier un bouton rotatif d'un Désactiver tous les canaux des appareils - + Enable all channels in current fixture Activer tous les canaux des appareils actuel - + Disable all channels in current fixture Désactiver tous les canaux de l'appareil actuel - + Copy current values to clipboard Copier les valeurs actuelles dans le presse-papier - + Paste clipboard values to current fixture Coller les valeurs du presse-papier vers cet appareil - + Copy current values to all fixtures Copier les valeurs actuelles vers tous les appareils - + Color tool for CMY/RGB-capable fixtures Outil de couleur pour les appareils à composantes CMJ/RVB - + Position tool for moving heads/scanners Outil de positionnement pour les lyres/scanners - + Switch between tab view and all channels view Basculer entre la vue par onglets et la vue de tous les canaux - + Toggle blind mode Basculer le mode aveugle - + Show/Hide speed dial window Afficher/Masquer la fenêtre de réglage des vitesses - + Clone this scene and append as a new step to the selected chaser Cloner cette scène et l'ajouter comme nouveau pas dans le chaser sélectionné - + Go to next fixture tab Aller à l'appareil suivant - + Go to previous fixture tab Aller à l'appareil précédent - + None Aucun - + Scene name: Nom de la scène : + - All fixtures Tous les appareils + - Channels Groups Groupes de canaux + - Generic Générique - + Remove fixtures Enlever les appareils - + Do you want to remove the selected fixture(s)? Voulez-vous enlever le(s) appareil(s) sélectionné(s) ? @@ -5074,7 +5182,7 @@ Notez que l'assistant ne peut pas différencier un bouton rotatif d'un Autoriser les univers non patchés - + <Double click here to enter channel number manually> <Double-cliquer ici pour entrer le numéro du canal manuellement> @@ -5380,118 +5488,118 @@ Durée : %3 SimpleDesk - + Universe Univers - + Next page Page suivante - + Current page Page actuelle - + Previous page Page précédente - + View mode Type de vue - + Reset universe Réinitialiser l'univers - + Playback Faders de lancement - - + + Cue Stack Pile de mémoires - + Previous cue Mémoire précédente - + Stop cue stack Arrêter la pile de mémoires - + Next cue Mémoire suivante - + Clone cue stack Cloner la pile de mémoires - + Edit cue stack Éditer la pile de mémoires - + Record cue Enregistrer une mémoire - + Channel groups Groupes de canaux - + Cue Stack - Playback %1 Pile de mémoires - Fader %1 - + No selection Aucune sélection - + Cue name Nom de la mémoire - + Multiple Cues Mémoires multiples - + Delete cue Supprimer la mémoire - + Clone Cue Stack Cloner la pile de mémoires - + Clone To Playback# Cloner vers le fader - + Cue %1 Mémoire %1 @@ -5499,32 +5607,32 @@ Durée : %3 SpeedDial - + Hours Heures - + Minutes Minutes - + Seconds Secondes - + Milliseconds Millisecondes - + Infinite Infini - + Tap Tap @@ -5532,17 +5640,17 @@ Durée : %3 SpeedDialWidget - + Fade In Montée - + Fade Out Descente - + Hold Maintien @@ -5632,17 +5740,17 @@ Durée : %3 VCButton - + Choose... Choisir... - + None Aucun - + Button %1 Bouton %1 @@ -5657,17 +5765,17 @@ Durée : %3 Images (%1) - + Toggle Blackout Blackout - + Stop ALL functions! Arrêter TOUTES les fonctions ! - + Icon Icône @@ -5680,67 +5788,77 @@ Durée : %3 Propriétés du bouton - + + Override priority + + + + + Force LTP + + + + General Général - + Button label Nom du bouton - + Text to display on the button Le texte à afficher sur le bouton - + Function Fonction - + The function that this button controls La fonction que ce bouton contrôle - + Attach a function to this button Attacher une fonction au bouton - + Detach the button's function attachment Détacher la fonction liée au bouton - + Toggle Blackout Blackout - + Stop All Functions Arrêter toutes les fonctions - + Fade time: Temps de fondu : - + Adjust function intensity when it is running Ajuster l'intensité de la fonction durant son exécution - + Adjust Function Intensity Ajuster l'intensité de la fonction - + Function's adjusted intensity percentage when run Ajustement de l'intensité en pourcentage de la fonction @@ -5760,17 +5878,17 @@ Durée : %3 Interrupteur (Toggle) - + Flash the assigned function with this button Lire la fonction attachée au bouton lorsqu'il est pressé - + Flash function (only for scenes) Flash (uniquement pour les scènes) - + No function Aucune fonction @@ -5861,64 +5979,64 @@ Durée : %3 VCCueList - + Show/Hide crossfade sliders Afficher/Masquer les crossfaders - - + + Play/Pause Cue list Lecture/pause de la liste de cue - - + + Stop Cue list Arrêt de la liste de cue - + Go to previous step in the list Aller au pas précédent - + Go to next step in the list Aller au pas suivant - + Cue list Séquenceur - + Play/Stop Cue list Lecture/arrêt de la liste de cue - + Pause Cue list Mettre la liste de cue en pause - + Fade In Montée - + Fade Out Descente - + Duration Durée - + Notes Notes @@ -6084,7 +6202,7 @@ Durée : %3 VCFrame - + Add Ajouter @@ -6137,17 +6255,17 @@ Durée : %3 Nom de la page - + External Input - Enable Entrée externe - Activation - + External Input - Previous Page Entrée Externe - Page Précédente - + External Input - Next Page Entrée Externe - Page Suivante @@ -6180,17 +6298,17 @@ Durée : %3 VCLabel - + Label Étiquette - + Rename Label Renommer l'étiquette - + Caption: Légende : @@ -6198,42 +6316,42 @@ Durée : %3 VCMatrix - + Animation %1 Animation %1 - + End Color Reset Réinitialiser la couleur de fin - + Start color Red component Couleur de départ : composante rouge - + Start color Green component Couleur de départ : composante verte - + Start color Blue component Couleur de départ : composante bleue - + End color Red component Couleur de fin : composante rouge - + End color Green component Couleur de fin : composante verte - + End color Blue component Couleur de fin : composante bleue @@ -6436,48 +6554,48 @@ Durée : %3 Ajouter du texte - + No function Aucune fonction - + Start Color Couleur de départ - + Start Color Knob Potard de couleur de début - + End Color Couleur de fin - + End Color Knob Potard de couleur de fin - + End Color Reset Réinitialisation de la couleur de fin - + Animation Animation - - + + Text Texte - + Enter a text Saisir le texte @@ -6729,12 +6847,12 @@ Durée : %3 VCSlider - + Slider %1 Fader %1 - + Reset channels override Réinitialiser l'écrasement des canaux @@ -6752,42 +6870,42 @@ Durée : %3 Général - + Name of the slider Le nom du fader en cours d'édition - + Value display style Style d'affichage de la valeur - + Show exact DMX values Afficher la valeur DMX - + Show value as percentage Afficher la valeur en pourcentage - + Percentage Pourcentage - + Slider movement Mouvement du fader - + Normal Normal - + Inverted Inversé @@ -6863,32 +6981,32 @@ Durée : %3 Basculer vers le mode Lancement - + Actual DMX - + Widget name Nom du widget - + Widget appearance Apparence du widget - + Slider Fader - + Knob Bouton rotatif - + Catch up with the external controller input value Se mettre à jour avec la valeur d'entrée du contrôleur externe @@ -7286,17 +7404,17 @@ Durée : %3 Afficher le champ des millisecondes - + Multiply by 2 Input Entrée du bouton de multiplication par 2 - + Divide by 2 Input Entrée du bouton de division par 2 - + Factor Reset Input Entrée du bouton de réinitialisation du facteur @@ -7304,68 +7422,68 @@ Durée : %3 VCWidget - + Button Bouton - + Slider Fader - + XYPad Pad XY - + Frame Cadre - + Solo frame Cadre de solos - + Speed dial Contrôleur de vitesse - + Cue list Séquenceur - + Label Étiquette - + Audio Triggers Déclencheur audio - + Animation Animation - + Clock Horloge + - Unknown Inconnu - + This widget has no properties Ce widget n'a pas de propriétés @@ -7563,12 +7681,12 @@ Durée : %3 Nom du préréglage - + Pan / Horizontal Axis Pan / Axe horizontal (X) - + Tilt / Vertical Axis Tilt / Axe vertical (Y) @@ -7598,45 +7716,45 @@ Durée : %3 Éditer les axes de l'appareil sélectionné - + Width Largeur - + Height Hauteur - + Remove fixtures Enlever les appareils - + Do you want to remove the selected fixtures? Voulez-vous enlever le(s) appareils(s) sélectionné(s) ? - - + + Error Erreur - + The selected Scene does not include any Pan or Tilt channel. Please select one with such channels. La scène sélectionnée n'affecte pas de canal Pan ou Tilt. Veuillez en choisir une qui affecte un des deux. - + Please select at least one fixture or head to create this type of preset! Veuillez sélectionner au moins un appareil ou une tête pour créer ce type de préréglage ! - + Fixture Group Groupe d'appareils @@ -7769,12 +7887,12 @@ Veuillez en choisir une qui affecte un des deux. VideoItem - + Fullscreen Plein écran - + Screen %1 Écran %1 diff --git a/ui/src/qlcplus_it_IT.ts b/ui/src/qlcplus_it_IT.ts index 0a41df3ea0..4cc482a994 100644 --- a/ui/src/qlcplus_it_IT.ts +++ b/ui/src/qlcplus_it_IT.ts @@ -189,12 +189,12 @@ Numero di canali vuoti da lasciare tra le fixture aggiunte - + Fixtures found: %1 Fixture trovate: %1 - + Dimmers Dimmer @@ -525,376 +525,376 @@ App - + Cannot exit in Operate mode Non puoi uscire durante la modalità Operativa - + You must switch back to Design mode to close the application. Devi tornare alla modalità di Design per chiudere l'applicazione. - + Close Chiudi - + Do you wish to save the current workspace before closing the application? Vuoi salvare il progetto corrente prima di chiudere l'applicazione? - + Starting Q Light Controller Plus Starting Q Light Controller Avvio Q Light Controller Plus - + - New Workspace - Nuovo Spazio di Lavoro - + Switch to Design Mode Vai in Modalità Design - + There are still running functions. Really stop them and switch back to Design mode? Ci sono Funzioni Attive. Vuoi veramente fermarle e ritornare in modalità Design? - + Design Design - + Switch to design mode Vai in modalità Design - + Operate Operate - - + + Switch to operate mode Vai in modalità Operate - + &New &Nuovo - + CTRL+N File|New - + &Open &Apri - + CTRL+O File|Open - + &Save &Salva - + CTRL+S File|Save - + Save &As... Salva &Con Nome... - + &Operate &Operativo - + &Monitor &Monitor delle fixture - + Toggle &Blackout &Blackout On/Off - + CTRL+F12 Control|Toggle operate/design mode - + CTRL+M Control|Monitor - + Live edit a function Modifica una funzione in modalità live - + Toggle Full Screen Passa in modalità schermo intero - + CTRL+F11 Control|Toggle Full Screen - + &Index &Indice - + SHIFT+F1 Help|Index - + &About QLC+ &About QLC &A proposito di QLC+ - + Fixtures Fixture - + Functions Funzioni - + Shows Show - + Virtual Console Console Virtuale - + Simple Desk Banco Semplice - + Inputs/Outputs Ingressi/Uscite - + Close the application? Chiudere l'applicazione? - + Do you wish to close the application? Vuoi chiudere l'applicazione? - + Exit Uscita - + Address Tool Strumento per indirizzi - + Toggle Virtual Console Live edit Modalità di modifica live della console virtuale - + Dump DMX values to a function Salva i valori DMX su una funzione - + CTRL+D Control|Dump DMX CTRL+D - + Stop ALL functions! Ferma TUTTE le funzioni! - + Fade 1 second and stop Sfuma per 1 secondo e poi ferma - + Fade 5 seconds and stop Sfuma per 5 secondi e poi ferma - + Fade 10 second and stop Sfuma per 10 secondi e poi ferma - + Fade 30 second and stop Sfuma per 30 secondi e poi ferma - + Quit QLC+ Esci da QLC+ - + Workspace Spazio di lavoro - + Unable to read from file Impossibile leggere dal file - + Unable to write to file Impossibile Salvare il File - + A fatal error occurred Errore fatale - + Unable to access resource Impossibile accedere alla risorsa - + Unable to open file for reading or writing Impossibile leggere o scrivere il file - + Operation was aborted L'operazione è stata annullata - + Operation timed out Operazione scaduta - + An unspecified error has occurred. Nice. Si è verificato un errore sconosciuto. - + File error Errore file - - - + + + Do you wish to save the current workspace? Changes will be lost if you don't save them. Vuoi salvare il presente workspace? Tutti i cambiamenti andranno persi senza salvataggio.. - + New Workspace Nuovo Spazio di Lavoro - - - + + + Open Workspace Apri Spazio di Lavoro - - + + Workspaces (*%1) Spazio di Lavoro (*%1) - - + + All Files (*.*) Tutti i tipi di file (*.*) - - + + All Files (*) Tutti i file (*) - + Save Workspace As Salva lo Spazio di Lavoro come - + Error Errore - + File not found! The selected file has been moved or deleted. File non trovato! Il file selezionato è stato spostato o eliminato. - + Warning Attenzione - + Some errors occurred while loading the project: Si sono verificati degli errori durante il caricamento del progetto: @@ -917,12 +917,12 @@ Il file selezionato è stato spostato o eliminato. Chiudi automaticamente quando viene premuto un tasto - + Assign Key Assegna Tasto - + Hit the key combination that you wish to assign. You may hit either a single key or a combination using %1, %2, and %3. Premi la combinazione di tasti che vuoi assegnare. Puoi premere anche un solo tasto o una combinazione usando %1, %2 e %3. @@ -1049,23 +1049,23 @@ Il file selezionato è stato spostato o eliminato. AudioItem - - + + Preview Left Channel Anteprima Canale Sinistro - + Preview Right Channel Anteprima Canale Destro - + Preview Stereo Channels Anteprima Canali Stereo - + Preview Mono Anteprima Mono @@ -1133,52 +1133,52 @@ Il file selezionato è stato spostato o eliminato. Ingresso - + None Nessuno - + DMX DMX - + Function Funzione - + VC Widget Oggetto VC - + %1 channels %1 canali - + No function Nessuna funzione - + No widget Nessun oggetto - + Not assigned Non assegnato - + Volume Bar Barra del volume - + #%1 (%2Hz - %3Hz) #%1 (%2Hz - %3Hz) @@ -1236,12 +1236,12 @@ Il file selezionato è stato spostato o eliminato. Annulla modificatore - + Error Errore - + You are trying to overwrite a system template! Please choose another name and the template will be saved in your channel modifier's user folder. Stai cercando di sovrascrivere un template di sistema! Per favore scegli un altro nome e il template verrà salvato nella cartella utente dei modificatori di canali. @@ -1256,13 +1256,13 @@ Il file selezionato è stato spostato o eliminato. - + Name Nome - + Type Tipo @@ -1282,27 +1282,27 @@ Il file selezionato è stato spostato o eliminato. Espandi tutti - + Selected Selezionato - + Channel properties configuration Configurazione delle proprietà dei canali - + Can fade Consenti fade - + Behaviour Comportamento - + Modifier Modificatore @@ -1336,13 +1336,13 @@ Il file selezionato è stato spostato o eliminato. - + Fade In Fade In - + Fade Out Fade Out @@ -1363,7 +1363,7 @@ Il file selezionato è stato spostato o eliminato. - + Hold Hold @@ -1558,47 +1558,47 @@ Il file selezionato è stato spostato o eliminato. Indietro - + Cut Taglia - + Copy Copia - + Paste Incolla - + Paste error Errore di incolla - + Trying to paste on an incompatible Scene. Operation canceled. Stai cercando di incollare su una traccia non compatibile. Operazione annullata. - + Common Fade In Fade In Comune - + Common Fade Out Fade Out Comune - + Common Hold Hold Comune - + Multiple Steps Step multipli @@ -1654,12 +1654,12 @@ Il file selezionato è stato spostato o eliminato. ConsoleChannel - + Intensity Intensità - + Reset this channel Resetta questo canale @@ -1720,6 +1720,83 @@ Il file selezionato è stato spostato o eliminato. Coda + + CustomFeedbackDialog + + + Custom Feedback Configuration + Configurazione dei feedback personalizzati + + + + Value + Valore + + + + Label + Etichetta + + + + Color + Colore + + + + Values + Valori + + + + Lower Value + Valore inferiore + + + + Monitor Value + Valore di monitoring + + + + Upper Value + Valore superiore + + + + + + Color Selection + Selezione del colore + + + + MIDI Channel + Canale MIDI + + + + Upper Channel + Canale superiore + + + + Lower Channel + Canale inferiore + + + + Monitor Channel + Canale di monitoring + + + + + + From plugin settings + Dalle impostazioni di plugin + + DmxDumpFactory @@ -1779,50 +1856,17 @@ Il file selezionato è stato spostato o eliminato. Nome della scena: - + Dump all channels (%1 Universes, %2 Fixtures, %3 Channels) Dump all DMX values (%1 Universes, %2 Fixtures, %3 Channels) Salva tutti i canali (%1 Universi, %2 Fixture, %3 Canali) - + New Scene From Live %1 Nuova Scena Da Live %1 - - DocBrowser - - - %1 - Document Browser - %1 - Esplora Risorse - - - - Backward - Indietro - - - - Forward - Avanti - - - - Index - Indice - - - - About Qt - A proposito di Qt - - - - Close this window - Chiudi questa finestra - - EFXEditor @@ -2104,12 +2148,12 @@ Il file selezionato è stato spostato o eliminato. Guarda cosa fa l'EFX quando è in esecuzione - + Remove fixtures Rimuovi fixture - + Do you want to remove the selected fixture(s)? Vuoi rimuovere le fixture selezionate? @@ -2454,88 +2498,88 @@ Il file selezionato è stato spostato o eliminato. Riassegna i nomi delle fixture - - + + (remapped) (riassegnato) - + Import Fixtures List Importa Lista Fixture - + Fixtures List (*%1) Lista Fixture (*%1) - + All Files (*.*) Tutti i file (*.*) - + All Files (*) Tutti i file (*) - + Do you want to automatically connect fixtures with the same name? Vuoi connettere automaticamente le fixture con lo stesso nome? - + Generic Dimmer Dimmer generico - + Delete Fixtures Elimina fixture - + Do you want to delete the selected items? Vuoi eliminare gli elementi selezionati? - + Invalid operation Operazione non valida - + You are trying to clone a fixture on an address already in use. Please fix the target list first. Stai cercando di clonare una fixture su un indirizzo già in uso. Devi prima correggere la lista di destinazione. - - - - + + + + Invalid selection Selezione non valida - - - + + + Please select a source and a target fixture or channel to perform this operation. Selezionare una fixture o un canale di sorgente e di destinazione per eseguire questa operazione. - + To perform a fixture remap, please select fixtures on both lists. Per eseguire una riassegnazione di fixture, seleziona una fixture in entrambe le liste. - + This might take a while... Questo potrebbe richiedere del tempo... - + Cancel Annulla @@ -2548,12 +2592,12 @@ Il file selezionato è stato spostato o eliminato. Seleziona una fixture - + No fixtures available Nessuna fixture disponibile - + Go to the Fixture Manager and add some fixtures first. Vai alla Gestione Fixture e aggiungi delle fixture prima. @@ -2610,7 +2654,7 @@ Il file selezionato è stato spostato o eliminato. FunctionLiveEditDialog - + Function Live Edit Modifica Live di Funzione @@ -2618,195 +2662,195 @@ Il file selezionato è stato spostato o eliminato. FunctionManager - + New &scene Nuova &scena - + New c&haser Nuovo c&haser - + New se&quence Nuova se&quenza - + New c&ollection Nuova c&ollezione - + New E&FX Nuovo E&FX - + New &RGB Matrix Nuova Matrice &RGB - + New scrip&t Nuovo Scrip&t - + New Scene Nuova Scena - + New Chaser Nuovo Chaser - + New Sequence Nuova Sequenza - + &Clone &Clona - + New au&dio Nuovo au&dio - + New vid&eo Nuovo vid&eo - + New fo&lder Nuova carte&lla - + Select Startup Function Seleziona una funzione di avvio automatico - + Function &Wizard Assistente per le &funzioni - + &Delete &Elimina - + Select &all Seleziona &Tutto - + New Collection Nuova Collezione - + New EFX Nuovo EFX - + New RGB Matrix Nuova Matrice RGB - + New Script Nuovo Script - + Open Audio File Apri File Audio - + Audio Files (%1) File Audio (%1) - - + + All Files (*.*) Tutti i file (*.*) - - + + All Files (*) Tutti i file (*) - + Unsupported audio file File audio non supportato - + This audio file cannot be played with QLC+. Sorry. Questo file audio non può essere riprodotto da QLC+. Spiacente. - + Open Video File Apri File Video - + Video Files (%1) File video (%1) - + Unsupported video file File video non supportato - + This video file cannot be played with QLC+. Sorry. Questo file video non può essere riprodotto da QLC+. Spiacente. - + Do you want to DELETE folder: Do you want to DELETE foler: Vuoi ELIMINARE la cartella: - + Do you want to DELETE functions: Vuoi ELIMINARE le funzioni: - + (This will also DELETE: (Questo ELIMINERA' anche: - + Delete Functions CAncella Funzioni - + Function Funzione - + (Copy) (Copia) @@ -3093,32 +3137,32 @@ p, li { white-space: pre-wrap; } Elimina - + %1 group Gruppo %1 - + Error Errore - + %1 has no capability supported by this wizard. %1 non ha funzionalità supportate da questo wizard. - + Presets solo frame Solo frame dei preset - + Click & Go RGB Click & Go RGB - + Click & Go Macro Click & Go Macro @@ -3126,27 +3170,27 @@ p, li { white-space: pre-wrap; } GrandMasterSlider - + GM GM - + Grand Master <B>limits</B> the maximum value of Il Grand Master <B>limita</B> il valore massimo di - + Grand Master <B>reduces</B> the current value of Il Grand Master <B>riduce</B> il valore corrente di - + intensity channels canali di intensità - + all channels tutti i canali @@ -3247,45 +3291,45 @@ p, li { white-space: pre-wrap; } InputOutputManager - + Add U&niverse Aggiungi un u&niverso - + &Delete Universe Universe &Elimina un universo - + Universe name: Nome dell'universo: - + Passthrough Passthrough - - + + Universe %1 Universo %1 - - + + Delete Universe Elimina un universo - + The universe you are trying to delete is patched. Are you sure you want to delete it? L'universo che stai per eliminare è connesso. Sei sicuro di volerlo eliminare? - + There are some fixtures using the universe you are trying to delete. Are you sure you want to delete it? Ci sono delle fixture che usano l'universo che vuoi eliminare. Sei sicuro di volerlo eliminare? @@ -3392,20 +3436,20 @@ p, li { white-space: pre-wrap; } Monitor del livello - - - + + + Error Errore - - + + Output line already assigned La linea di uscita è già assegnata - + An error occurred while trying to open the selected device line. This can be caused either by a wrong system configuration or an unsupported input/output mode. Please refer to the plugins documentation to troubleshoot this. @@ -3414,67 +3458,67 @@ Questo può essere causato dalla configurazione errata del sistema oppure da una Consultare la documentazione relativa alle plugin per risolvere il problema. - - + + Existing Input Profile Profilo di ingresso esistente - - + + An input profile at %1 already exists. Do you wish to overwrite it? Un profilo d'Ingresso al %1 già esiste. Lo vuoi sovrascrivere? - - + + Save Input Profile Salva il profilo di ingresso - - + + Input Profiles (*.qxi) Profilo D'ingresso (*.qxi) - - + + Saving failed Salvataggio Fallito - + Unable to save the profile to %1 Impossibile salvare il profilo in %1 - + Delete profile Elimina Profilo - + Do you wish to permanently delete profile "%1"? Vuoi cancellare definitivamente il profilo "%1"? - + File deletion failed Eliminazione fallita - + Unable to delete file %1 Impossibile eliminare il file%1 - + Unable to save %1 to %2 Impossibile salvare %1 in %2 - + Default device Dispositivo predefinito @@ -3487,176 +3531,233 @@ Consultare la documentazione relativa alle plugin per risolvere il problema.Editor del profilo di ingresso - + General Generale - + Manufacturer Produttore - + The name of the company that made the device Il nome del produttore che ha costruito il dispositivo - + Model Modello - + The device's model name Nome del modello del dispositivo - - Channels - Canali - - - + + Channel Canale - + + Name Nome - + Custom feedback Feedback personalizzati - + Upper value Valore superiore - + Lower value Valore inferiore - - + + Type Tipo - + MIDI Global Settings Impostazioni globali MIDI - + When MIDI notes are used, send a Note Off when value is 0 Quando vengono usate note MIDI, invia una Nota Off quando il valore è 0 - - + + Input Mapping + Mappatura di input + + + Behaviour Comportamento - + Add a new channel description Aggiungi una descrizione per il canale - + + + MIDI channel + Canale MIDI + + + + Colors + Colori + + + + Remove the selected color + Rimuovi il colore selezionato + + + + Add a new color + Aggiungi un nuovo colore + + + + Value + Valore + + + + Label + Etichetta + + + + Color + Colore + + + + MIDI Channels + Canali MIDI + + + + Add a new MIDI channel + Aggiungi un nuovo canale MIDI + + + + Remove the selected MIDI channel + Rimuovi il canale MIDI selezionato + + + Remove the selected channels Elimina i canali selezionati - + Edit the selected channel Edita il canale selezionato - + Automatically add channels to the list when you wiggle the device's controls Aggiungi automaticamente i canali alla lista quando muovi i comandi del dispositivo - + Movement Movimento - + Absolute Assoluto - + Relative Relativo - + Generate an extra Press/Release when toggled Genera un evento extra di Pressione/Rilascio quando attivato - + Sensitivity Sensibilità - + File not writable File di solo Lettura - + You do not have permission to write to the file %1. You might not be able to save your modifications to the profile. Non hai i permessi di scrittura sul file %1. Non è possibile salvare le tue modifiche fatte al profilo. - + + From plugin settings + Dalle impostazioni di plugin + + + Missing information Informazioni mancanti - + Manufacturer and/or model name is missing. Produttore e/o nome modello mancante. - - + + Channel already exists Canale già esistente - - + + Channel %1 already exists Canale %1 già esistente - + Delete channels Elimina canali - + Delete all %1 selected channels? Elimina tutti %1 canali selezionati? - + Channel wizard activated Assistente creazione canali attivato - + You have enabled the input channel wizard. After clicking OK, wiggle your mapped input profile's controls. They should appear into the list. Click the wizard button again to stop channel auto-detection. Note that the wizard cannot tell the difference between a knob and a slider so you will have to do the change manually. @@ -3665,12 +3766,39 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Si noti che la procedura guidata non può dire la differenza tra una manopola e uno slider per cui dovrai aggiustarli manualmente. - + + + Enter value + Inserisci il valore + + + + Feedback value + Valore di feedback + + + + + Enter label + Inserisci l'etichetta + + + + Color label + Etichetta del colore + + + + MIDI channel label + Etichetta del canale MIDI + + + Button %1 Pulsante %1 - + Slider %1 Slider %1 @@ -3703,65 +3831,50 @@ Si noti che la procedura guidata non può dire la differenza tra una manopola e Ingresso esterno - + When toggled, you can click an external button to assign it to this widget. Se attivato, è possibile fare clic su un pulsante esterno per assegnarlo a questo oggetto. - + Auto Detect Rileva automaticamente - + Input Universe Universo di ingresso - + Input Channel Canale di ingresso - + The input universe that sends data to this widget L'universo di ingresso che invia i dati a questo oggetto - + Custom Feedback Feedback personalizzati - + The particular input channel within the input universe that sends data to this widget Il canale di ingresso all'interno dell'universo di ingresso che invia i dati a questo oggetto - + Choose an external input universe & channel that this widget should listen to. Scegli un universo di ingresso esterno con il relativo canale a cui questo oggetto deve rispondere. - + Choose... Scegli... - - - Custom feedback - Feedback personalizzati - - - - Lower value - Valore inferiore - - - - Upper value - Valore superiore - Monitor @@ -3918,14 +4031,14 @@ Si noti che la procedura guidata non può dire la differenza tra una manopola e Sfondo - - + + Select background image Seleziona l'immagine di sfondo - - + + Images Immagini @@ -4215,12 +4328,12 @@ Si noti che la procedura guidata non può dire la differenza tra una manopola e PlaybackSlider - + Select Seleziona - + Flash Flash @@ -4236,43 +4349,38 @@ Si noti che la procedura guidata non può dire la differenza tra una manopola e QObject - + Operate Operativo - + Design Design - - + + Reversed Invertito - + Page: %1 Pagina %1 RDMManager - - - Form - - Scan for RDM devices... - + Cerca dispositivi RDM... Retrieve the selected fixture information - + Recupera le informazioni della fixture selezionata @@ -4302,53 +4410,53 @@ Si noti che la procedura guidata non può dire la differenza tra una manopola e Manual controls - + Controlli manuali Arguments - + Argomenti A list of comma separated arguments Enter the (optional) arguments to read the PID, separated by commas - + Una lista di argomenti separati da virgola Write - + Scrivi Byte - + Byte Short - + Short (16bit) Long - + Long (32bit) Array (Hex) - + Array (Esadecimale) Read - + Leggi Response - + Risposta @@ -4387,12 +4495,12 @@ Si noti che la procedura guidata non può dire la differenza tra una manopola e Personalities - + Personality Personality - + Personality @@ -4683,22 +4791,22 @@ Si noti che la procedura guidata non può dire la differenza tra una manopola e Nessuno - + No fixture group to control Nessun gruppo di fixture da controllare - + Select image Seleziona un'immagine - + Images Immagini - + Sequence Sequenza @@ -4758,105 +4866,105 @@ Si noti che la procedura guidata non può dire la differenza tra una manopola e Disattiva tutti i canali di tutte le fixture - + Enable all channels in current fixture Abilita tutti i canali di questa fixture - + Disable all channels in current fixture Disabilita tutti i canali di questa fixture - + Copy current values to clipboard Copia i valori correnti in memoria - + Paste clipboard values to current fixture Incolla i valori copiati in memoria su questa fixture - + Copy current values to all fixtures Copia questi valori a tutte le fixture - + Color tool for CMY/RGB-capable fixtures Ruota colori per fixture con miscelazione CMY/RGB - + Position tool for moving heads/scanners Strumento di posizionamento per teste mobili e scanner - + Switch between tab view and all channels view Passa dalla vista a tab alla vista a canali - + Toggle blind mode Modalità blind on/off - + Show/Hide speed dial window Mostra/Nascondi finestra speed dial - + Clone this scene and append as a new step to the selected chaser Clona questa scena e aggiungi un nuovo step al chaser selezionato - + Go to next fixture tab Vai al tab della fixture successiva - + Go to previous fixture tab Vai al tab della fixture precedente - + None Nessuno - + Scene name: Nome della scena: + - All fixtures Tutte le fixture + - Channels Groups Gruppi di Canali + - Generic Generico - + Remove fixtures Elimina Fixture - + Do you want to remove the selected fixture(s)? Vuoi eliminare le fixture selezionate? @@ -5068,7 +5176,7 @@ Si noti che la procedura guidata non può dire la differenza tra una manopola e Permetti universi non connessi - + <Double click here to enter channel number manually> <Doppio click qui per inserire il numero del canale manualmente> @@ -5374,118 +5482,118 @@ Durata: %3 SimpleDesk - + Universe Universo - + Next page Pagina successiva - + Current page Pagina corrente - + Previous page Pagina precedente - + View mode Modalità di visualizzazione - + Reset universe Resetta universo - + Playback Riproduzione - - + + Cue Stack Pila Azioni - + Previous cue Azione precedente - + Stop cue stack Ferma pila azioni - + Next cue Azione successiva - + Clone cue stack Clona pila azioni - + Edit cue stack Modifica pila azioni - + Record cue Registra azione - + Channel groups Gruppi di canali - + Cue Stack - Playback %1 Pila azioni - Riproduzione %1 - + No selection Nessuna selezione - + Cue name Nome azione - + Multiple Cues Azioni multiple - + Delete cue Elimina azione - + Clone Cue Stack Clona pila azioni - + Clone To Playback# Clona su riproduzione# - + Cue %1 Azione %1 @@ -5493,32 +5601,32 @@ Durata: %3 SpeedDial - + Hours Ore - + Minutes Minuti - + Seconds Secondi - + Milliseconds Millisecondi - + Infinite Infinito - + Tap Tap @@ -5526,17 +5634,17 @@ Durata: %3 SpeedDialWidget - + Fade In Fade In - + Fade Out Fade Out - + Hold Hold @@ -5626,17 +5734,17 @@ Durata: %3 VCButton - + Choose... Scegli... - + None Nessuno - + Button %1 Pulsante %1 @@ -5651,17 +5759,17 @@ Durata: %3 Immagini (%1) - + Toggle Blackout Blackout On/Off - + Stop ALL functions! Ferma TUTTE le funzioni! - + Icon Icona @@ -5674,67 +5782,77 @@ Durata: %3 Proprietà del pulsante - + + Override priority + Priorità di override + + + + Force LTP + Forza LTP + + + General Generale - + Button label Etichetta del pulsante - + Text to display on the button Testo da mostrare sul pulsante - + Function Funzione - + The function that this button controls La funzione che questo pulsante controlla - + Attach a function to this button Connetti una funzione a questo pulsante - + Detach the button's function attachment Disconnetti la funzione connessa a questo pulsante - + Toggle Blackout Blackout On/Off - + Stop All Functions Ferma tutte le funzioni - + Fade time: Tempo di fade: - + Adjust function intensity when it is running Aggiusta l'intensità della funzione mentre è in esecuzione - + Adjust Function Intensity Aggiusta l'intensità della funzione - + Function's adjusted intensity percentage when run Percentuale di intensità della funzione aggiustata in esecuzione @@ -5754,17 +5872,17 @@ Durata: %3 Attiva la funzione on/off - + Flash the assigned function with this button Modalità Flash alla funzione assegnata con questo pulsante - + Flash function (only for scenes) Modalità Flash (solo per scene) - + No function Nessuna funzione @@ -5855,64 +5973,64 @@ Durata: %3 VCCueList - + Show/Hide crossfade sliders Mostra/Nascondi gli slider di crossfade - - + + Play/Pause Cue list Riproduci/Sospendi la lista di azioni - - + + Stop Cue list Interrompi la lista di azioni - + Go to previous step in the list Vai allo step precedente nella lista - + Go to next step in the list Vai allo step successivo nella lista - + Cue list Lista di azioni - + Play/Stop Cue list Riproduci/Interrompi la lista di azioni - + Pause Cue list Sospendi la lista di azioni - + Fade In Fade In - + Fade Out Fade Out - + Duration Durata - + Notes Note @@ -6078,7 +6196,7 @@ Durata: %3 VCFrame - + Add Aggiungi @@ -6131,17 +6249,17 @@ Durata: %3 Nome della pagina - + External Input - Enable Ingresso esterno - Abilita - + External Input - Previous Page Ingresso esterno - Pagina precedente - + External Input - Next Page Ingresso esterno - Pagina successiva @@ -6174,17 +6292,17 @@ Durata: %3 VCLabel - + Label Etichetta - + Rename Label Rinomina etichetta - + Caption: Titolo: @@ -6192,42 +6310,42 @@ Durata: %3 VCMatrix - + Animation %1 Animazione %1 - + End Color Reset Reset del colore di fine - + Start color Red component Componente rosso del colore di inizio - + Start color Green component Componente verde del colore di inizio - + Start color Blue component Componente blue del colore di inizio - + End color Red component Componente rosso del colore di fine - + End color Green component Componente verde del colore di fine - + End color Blue component Componente blu del colore di fine @@ -6430,48 +6548,48 @@ Durata: %3 Aggiungi testo - + No function Nessuna funzione - + Start Color Colore di inizio - + Start Color Knob Manopola colore iniziale - + End Color Colore di fine - + End Color Knob Manopola colore finale - + End Color Reset Reset del colore finale - + Animation Animazione - - + + Text Testo - + Enter a text Inserisci un testo @@ -6723,12 +6841,12 @@ Durata: %3 VCSlider - + Slider %1 Slider %1 - + Reset channels override Resetta l'override dei canali @@ -6746,42 +6864,42 @@ Durata: %3 Generale - + Name of the slider Nome dello Slider - + Value display style Stile di visualizzazione - + Show exact DMX values Mostra i valori esatti DMX - + Show value as percentage Mostra valori in percentuale - + Percentage Percentuale - + Slider movement Movimento dello Slider - + Normal Normale - + Inverted Invertito @@ -6857,32 +6975,32 @@ Durata: %3 Passa alla modalità di riproduzione - + Actual Valore - + Widget name Nome dell'oggetto - + Widget appearance Aspetto dell'oggetto - + Slider Slider - + Knob Manopola - + Catch up with the external controller input value Sincronizza con il valore di ingresso esterno @@ -7280,17 +7398,17 @@ Durata: %3 Mostra il campo millisecondi - + Multiply by 2 Input Input per la moltiplicazione per 2 - + Divide by 2 Input Input per la divisione per 2 - + Factor Reset Input Input per reimpostare il fattore @@ -7298,68 +7416,68 @@ Durata: %3 VCWidget - + Button Pulsante - + Slider Slider - + XYPad Pad XY - + Frame Frame - + Solo frame Frame esclusivo - + Speed dial Speed dial - + Cue list Lista di azioni - + Label Etichetta - + Audio Triggers Impulsi audio - + Animation Animazione - + Clock Orologio + - Unknown Sconosciuto - + This widget has no properties Questo oggetto non ha proprietà @@ -7557,12 +7675,12 @@ Durata: %3 Nome del preset - + Pan / Horizontal Axis Pan / Asse orizzontale - + Tilt / Vertical Axis Tilt / Asse verticale @@ -7592,45 +7710,45 @@ Durata: %3 Edita l'Asse della fixture selezionata - + Width Larghezza - + Height Altezza - + Remove fixtures Rimuovi fixture - + Do you want to remove the selected fixtures? Vuoi rimuovere le fixture selezionate? - - + + Error Errore - + The selected Scene does not include any Pan or Tilt channel. Please select one with such channels. La Scena selezionata non include alcun canale di Pan o Tilt. Selezionarne una con i suddetti canali. - + Please select at least one fixture or head to create this type of preset! Selezionare almeno una fixture o una testa per creare questo tipo di preset! - + Fixture Group Gruppo di Fixture @@ -7763,12 +7881,12 @@ Selezionarne una con i suddetti canali. VideoItem - + Fullscreen Schermo intero - + Screen %1 Schermo %1 diff --git a/ui/src/qlcplus_ja_JP.ts b/ui/src/qlcplus_ja_JP.ts index 0a79cb4a36..dc20540a38 100644 --- a/ui/src/qlcplus_ja_JP.ts +++ b/ui/src/qlcplus_ja_JP.ts @@ -189,12 +189,12 @@ 機器間のアドレス間隔 - + Fixtures found: %1 Fixtures found: %1 - + Dimmers ディマー @@ -520,377 +520,377 @@ App - + Cannot exit in Operate mode 本番モード中は終了できません - + You must switch back to Design mode to close the application. 仕込みモードに戻ってから閉じてください。 - + Close 閉じる - + Do you wish to save the current workspace before closing the application? 閉じる前に、現在のプロジェクトを保存しますか? - + Starting Q Light Controller Plus Starting Q Light Controller QLC+ を開始 - + - New Workspace - 新規プロジェクト - + Switch to Design Mode 仕込みモードにする - + There are still running functions. Really stop them and switch back to Design mode? 再生中のシーンがあります。 すべて停止して仕込みモードに戻りますか? - + Design 仕込みモード - + Switch to design mode 仕込みモードにする - + Operate 本番モード - - + + Switch to operate mode 本番モードにする - + &New 新規 - + CTRL+N File|New CTRL+N - + &Open 開く - + CTRL+O File|Open CTRL+O - + &Save 上書き保存 - + CTRL+S File|Save CTRL+S - + Save &As... 名前を付けて保存 - + &Operate 本番モード - + &Monitor モニタ - + Toggle &Blackout 暗転 - + CTRL+F12 Control|Toggle operate/design mode CTRL+F12 - + CTRL+M Control|Monitor CTRL+M - + Live edit a function 再生中修正 - + Toggle Full Screen フルスクリーン - + CTRL+F11 Control|Toggle Full Screen CTRL+F11 - + &Index ヘルプ - + SHIFT+F1 Help|Index SHIFT+F1 - + &About QLC+ &About QLC &QLC+ について - + Fixtures 機器 - + Functions ファンクション - + Shows タイムライン - + Virtual Console バーチャルコンソール - + Simple Desk シンプル卓 - + Inputs/Outputs 入力/出力設定 - + Close the application? QLC+ を終了 - + Do you wish to close the application? QLC+ を終了しますか? - + Exit 閉じる - + Address Tool ディップスイッチ設定用ツール - + Toggle Virtual Console Live edit 本番モード時にバーチャルコンソールを編集 - + Dump DMX values to a function 現在のDMX値をシーンにする - + CTRL+D Control|Dump DMX CTRL+D - + Stop ALL functions! 全ファンクション停止 - + Fade 1 second and stop 1秒フェードで停止 - + Fade 5 seconds and stop 5秒フェードで停止 - + Fade 10 second and stop 10秒フェードで停止 - + Fade 30 second and stop 30秒フェードで停止 - + Quit QLC+ QLC+を終了します - + Workspace プロジェクト - + Unable to read from file ファイル読み取り不可 - + Unable to write to file ファイル書き込み不可 - + A fatal error occurred ...la vilaine! 深刻なエラーが発生しました - + Unable to access resource リソースにアクセスできません - + Unable to open file for reading or writing 読み書きのためのファイルを開けません - + Operation was aborted 操作は中断されました - + Operation timed out 操作はタイムアウトしました - + An unspecified error has occurred. Nice. 予期しないエラーが発生しました。な、何だってー!? - + File error ファイルエラー - - - + + + Do you wish to save the current workspace? Changes will be lost if you don't save them. Tiens tiens...perspicace! 開く前に、現在のプロジェクトを保存しますか? - + New Workspace 新規プロジェクト - - - + + + Open Workspace プロジェクトを開く - - + + Workspaces (*%1) プロジェクト (*%1) - - + + All Files (*.*) すべてのファイル (*.*) - - + + All Files (*) すべてのファイル (*) - + Save Workspace As プロジェクトを名前を付けて保存 - + Error エラー - + File not found! The selected file has been moved or deleted. ファイルが見つかりません。 移動または削除された可能性があります。 - + Warning 警告 - + Some errors occurred while loading the project: 次のプロジェクトを読み込み中に何らかのエラーが発生しました: @@ -913,12 +913,12 @@ The selected file has been moved or deleted. キー設定後、自動的に閉じる - + Assign Key キーを押してください(Shift などとの複合も可) - + Hit the key combination that you wish to assign. You may hit either a single key or a combination using %1, %2, and %3. ショートカットに設定したいキーを押してください。 %1, %2, %3 との複合も可能です。 @@ -1045,23 +1045,23 @@ The selected file has been moved or deleted. AudioItem - - + + Preview Left Channel 左チャンネルを可視化 - + Preview Right Channel 右チャンネルを可視化 - + Preview Stereo Channels ステレオ音声を可視化 - + Preview Mono モノラル音声を可視化 @@ -1129,52 +1129,52 @@ The selected file has been moved or deleted. 入力 - + None 無し - + DMX DMX - + Function ファンクション - + VC Widget 部品 - + %1 channels %1 チャンネル - + No function ファンクション無し - + No widget 部品無し - + Not assigned アサイン無し - + Volume Bar ボリュームバー - + #%1 (%2Hz - %3Hz) #%1 (%2Hz - %3Hz) @@ -1232,12 +1232,12 @@ The selected file has been moved or deleted. リセット - + Error エラー - + You are trying to overwrite a system template! Please choose another name and the template will be saved in your channel modifier's user folder. QLC+のデフォルトから入っているテンプレートは上書きできません、別名で保存してください @@ -1252,13 +1252,13 @@ The selected file has been moved or deleted. - + Name 名前 - + Type 属性 @@ -1278,27 +1278,27 @@ The selected file has been moved or deleted. 全て開く - + Selected 選択 - + Channel properties configuration チャンネルの設定を開く - + Can fade フェード操作を許可する - + Behaviour ブレンドモード - + Modifier ディマーカーブ @@ -1332,13 +1332,13 @@ The selected file has been moved or deleted. - + Fade In フェードイン - + Fade Out フェードアウト @@ -1359,7 +1359,7 @@ The selected file has been moved or deleted. - + Hold ホールド @@ -1554,47 +1554,47 @@ The selected file has been moved or deleted. 逆再生 - + Cut カット - + Copy コピー - + Paste ペースト - + Paste error ペーストエラー - + Trying to paste on an incompatible Scene. Operation canceled. ペーストできないシーンです。 - + Common Fade In 全体F.I.時間 - + Common Fade Out 全体F.O.時間 - + Common Hold 全体ホールド時間 - + Multiple Steps 複数ステップ @@ -1650,12 +1650,12 @@ The selected file has been moved or deleted. ConsoleChannel - + Intensity 明るさ - + Reset this channel リセット @@ -1716,6 +1716,83 @@ The selected file has been moved or deleted. キュー + + CustomFeedbackDialog + + + Custom Feedback Configuration + + + + + Value + + + + + Label + メモ + + + + Color + + + + + Values + + + + + Lower Value + + + + + Monitor Value + + + + + Upper Value + + + + + + + Color Selection + + + + + MIDI Channel + + + + + Upper Channel + + + + + Lower Channel + + + + + Monitor Channel + + + + + + + From plugin settings + + + DmxDumpFactory @@ -1775,50 +1852,17 @@ The selected file has been moved or deleted. シーン名 - + Dump all channels (%1 Universes, %2 Fixtures, %3 Channels) Dump all DMX values (%1 Universes, %2 Fixtures, %3 Channels) すべてのチャンネルを出力 (%1 個のuniverse, %2 個のDMX機器, %3 チャンネル) - + New Scene From Live %1 New Scene From Live %1 - - DocBrowser - - - %1 - Document Browser - %1 - ヘルプ - - - - Backward - 前へ - - - - Forward - 次へ - - - - Index - Aide - - - - About Qt - Qt について - - - - Close this window - ウィンドウを閉じる - - EFXEditor @@ -2101,12 +2145,12 @@ The selected file has been moved or deleted. 作成したEFXのプレビュー - + Remove fixtures 機器の削除 - + Do you want to remove the selected fixture(s)? 選択した機器を削除しますか? @@ -2455,88 +2499,88 @@ The selected file has been moved or deleted. 機器の名前をリマップ元に合わせる - - + + (remapped) (remapped) - + Import Fixtures List 機器リストのインポート - + Fixtures List (*%1) 機器リスト (*%1) - + All Files (*.*) すべてのファイル (*.*) - + All Files (*) すべてのファイル (*) - + Do you want to automatically connect fixtures with the same name? - + Generic Dimmer 一般ディマー - + Delete Fixtures 機器の削除 - + Do you want to delete the selected items? 選択したアイテムを削除しますか? - + Invalid operation 無効な操作 - + You are trying to clone a fixture on an address already in use. Please fix the target list first. そのアドレスはリマップ先で既に使われています。 - - - - + + + + Invalid selection 無効な選択 - - - + + + Please select a source and a target fixture or channel to perform this operation. リマップ元とリマップ先の機器またはチャンネルをそれぞれ選択してください。 - + To perform a fixture remap, please select fixtures on both lists. 機器のリマップを実行するには、左右のリストからそれぞれ機器を選択してください。 - + This might take a while... しばらくお待ちください - + Cancel キャンセル @@ -2549,12 +2593,12 @@ The selected file has been moved or deleted. 機器の選択 - + No fixtures available 機器がありません - + Go to the Fixture Manager and add some fixtures first. まずは「機器」タブをクリックし、機器を追加してください。 @@ -2611,7 +2655,7 @@ The selected file has been moved or deleted. FunctionLiveEditDialog - + Function Live Edit 本番モード時にファンクションを編集 @@ -2619,195 +2663,195 @@ The selected file has been moved or deleted. FunctionManager - + New &scene 新しいシーン - + New c&haser 新しいチェイス - + New se&quence 新しいシーケンス - + New c&ollection 新しいコレクション - + New E&FX 新しいE&FX - + New &RGB Matrix 新しいRGBマトリックス - + New scrip&t 新しいスクリプト - + New Scene 新しいシーン - + New Chaser 新しいチェイス - + New Sequence 新しいシーケンス - + &Clone 複製 - + New au&dio 新しいオーディオ - + New vid&eo 新しいビデオ - + New fo&lder 新しいフォルダ - + Select Startup Function スタートアップファンクションの設定 - + Function &Wizard ファンクションウィザード - + &Delete 削除 - + Select &all すべて選択 - + New Collection 新しいコレクション - + New EFX 新しいEFX - + New RGB Matrix 新しいRGBマトリックス - + New Script 新しいスクリプト - + Open Audio File オーディオファイルを開く - + Audio Files (%1) オーディオファイル (%1) - - + + All Files (*.*) すべてのファイル (*.*) - - + + All Files (*) すべてのファイル (*) - + Unsupported audio file サポートしていないファイル - + This audio file cannot be played with QLC+. Sorry. このオーディオファイルは QLC+ では再生できません。 - + Open Video File ビデオファイルを開く - + Video Files (%1) ビデオファイル (%1) - + Unsupported video file サポートしていないファイル - + This video file cannot be played with QLC+. Sorry. このビデオファイルは QLC+ では再生できません。 - + Do you want to DELETE folder: Do you want to DELETE foler: 以下のフォルダを削除しますか? : - + Do you want to DELETE functions: 以下のファンクションを削除しますか? : - + (This will also DELETE: (以下も同時に削除されます : - + Delete Functions ファンクションの削除 - + Function ファンクション - + (Copy) (コピー) @@ -3094,32 +3138,32 @@ p, li { white-space: pre-wrap; } 削除 - + %1 group 機器グループ「 %1 」 - + Error エラー - + %1 has no capability supported by this wizard. %1 は、ファンクション自動生成には対応していない機器です。 - + Presets solo frame ソロフレームに配置 - + Click & Go RGB Click & Go を利用: RGB - + Click & Go Macro Click & Go を利用: マクロ @@ -3127,27 +3171,27 @@ p, li { white-space: pre-wrap; } GrandMasterSlider - + GM GM - + Grand Master <B>limits</B> the maximum value of <B>limits</B> / - + Grand Master <B>reduces</B> the current value of <B>乗算</B> - + intensity channels 明るさチャンネルのみ - + all channels すべてのチャンネルに有効 @@ -3248,45 +3292,45 @@ p, li { white-space: pre-wrap; } InputOutputManager - + Add U&niverse Universe の追加 - + &Delete Universe Universe Universe の削除 - + Universe name: Universe名: - + Passthrough パススルー - - + + Universe %1 Universe %1 - - + + Delete Universe Universe の削除 - + The universe you are trying to delete is patched. Are you sure you want to delete it? この Universe は接続されています。本当に削除しますか? - + There are some fixtures using the universe you are trying to delete. Are you sure you want to delete it? この Universe には使用中の機器があります。本当に削除しますか? @@ -3393,87 +3437,87 @@ p, li { white-space: pre-wrap; } レベルモニター - - - + + + Error エラー - - + + Output line already assigned 出力先はすでに選択されています - + An error occurred while trying to open the selected device line. This can be caused either by a wrong system configuration or an unsupported input/output mode. Please refer to the plugins documentation to troubleshoot this. デバイスを使用することができませんでした、お使いのPCシステムの設定を確認してください - - + + Existing Input Profile 上書き確認 - - + + An input profile at %1 already exists. Do you wish to overwrite it? プロファイル '%1' は既に存在します。上書き保存しますか? - - + + Save Input Profile プロファイルを保存 - - + + Input Profiles (*.qxi) 外部入力用プロファイル (*.qxi) - - + + Saving failed 保存に失敗しました - + Unable to save the profile to %1 プロファイルを '%1'.に保存できませんでした。 - + Delete profile プロファイルの削除 - + Do you wish to permanently delete profile "%1"? 本当にプロファイル "%1" を削除しますか? - + File deletion failed ファイルの削除に失敗しました - + Unable to delete file %1 '%1' を削除できません。 - + Unable to save %1 to %2 '%1' を '%2' に保存できません。 - + Default device 既定のデバイス @@ -3486,176 +3530,233 @@ Please refer to the plugins documentation to troubleshoot this. 入力機器プロファイル設定 - + General 全般 - + Manufacturer メーカー名 - + The name of the company that made the device メーカー名 - + Model 機種名 - + The device's model name 機種名 - - Channels - チャンネル - - - + + Channel チャンネル - + + Name 名前 - + Custom feedback カスタムフィードバック - + Upper value 上限値 - + Lower value 下限値 - - + + Type タイプ - + MIDI Global Settings MIDI全般の設定 - + When MIDI notes are used, send a Note Off when value is 0 MIDIのnoteがoffの時にvalue=0を送信する - - + + Input Mapping + + + + Behaviour モード - + Add a new channel description チャンネルの説明を追加 - + + + MIDI channel + + + + + Colors + + + + + Remove the selected color + + + + + Add a new color + + + + + Value + + + + + Label + メモ + + + + Color + + + + + MIDI Channels + + + + + Add a new MIDI channel + + + + + Remove the selected MIDI channel + + + + Remove the selected channels 選択したチャンネルを削除 - + Edit the selected channel 選択したチャンネルを編集 - + Automatically add channels to the list when you wiggle the device's controls 自動割り当てのために、設定したいチャンネルを動かしてみてください - + Movement 動き - + Absolute 絶対値 - + Relative 相対値 - + Generate an extra Press/Release when toggled 押下・押上を切り替える - + Sensitivity 感度調整 - + File not writable ファイル書き込み不可 - + You do not have permission to write to the file %1. You might not be able to save your modifications to the profile. ファイル %1 に書き込む権限がありません。 - + + From plugin settings + + + + Missing information 不明な情報 - + Manufacturer and/or model name is missing. メーカー名か機種名が見つかりません。 - - + + Channel already exists チャンネルが既に存在しています - - + + Channel %1 already exists チャンネル %1 は既に存在しています。 - + Delete channels チャンネル削除 - + Delete all %1 selected channels? %1 の選択したチャンネルをすべて削除しますか? - + Channel wizard activated チャンネルウィーザード - + You have enabled the input channel wizard. After clicking OK, wiggle your mapped input profile's controls. They should appear into the list. Click the wizard button again to stop channel auto-detection. Note that the wizard cannot tell the difference between a knob and a slider so you will have to do the change manually. @@ -3663,12 +3764,39 @@ Note that the wizard cannot tell the difference between a knob and a slider so y *このウィザードではスライダーとノブの違いを検出することができません、種類は手動で設定する必要があります。 - + + + Enter value + + + + + Feedback value + + + + + + Enter label + + + + + Color label + + + + + MIDI channel label + + + + Button %1 ボタン %1 - + Slider %1 フェーダー %1 @@ -3701,65 +3829,50 @@ Note that the wizard cannot tell the difference between a knob and a slider so y 外部入力 - + When toggled, you can click an external button to assign it to this widget. 自動判別をオンにして、外部入力機器(MIDIコントローラーなど)のフェーダーやボタンを操作してください。 - + Auto Detect 自動判別 - + Input Universe Input Universe - + Input Channel 外部入力 - + The input universe that sends data to this widget 外部入力でウィジェットを操作 - + Custom Feedback カスタムフィードバック - + The particular input channel within the input universe that sends data to this widget 外部入力でウィジェットを操作 - + Choose an external input universe & channel that this widget should listen to. 入力にしようするUniverseとチャンネルを選択してください - + Choose... 選択... - - - Custom feedback - カスタムフィードバック - - - - Lower value - 下限値 - - - - Upper value - 上限値 - Monitor @@ -3916,14 +4029,14 @@ Note that the wizard cannot tell the difference between a knob and a slider so y 背景 - - + + Select background image 背景画像を選択 - - + + Images 画像 @@ -4213,12 +4326,12 @@ Note that the wizard cannot tell the difference between a knob and a slider so y PlaybackSlider - + Select 選択 - + Flash フラッシュ @@ -4234,34 +4347,29 @@ Note that the wizard cannot tell the difference between a knob and a slider so y QObject - + Operate 本番モード - + Design 仕込みモード - - + + Reversed 戻る - + Page: %1 Page : %1 RDMManager - - - Form - - Scan for RDM devices... @@ -4681,22 +4789,22 @@ Note that the wizard cannot tell the difference between a knob and a slider so y 無し - + No fixture group to control 操作する機器グループがありません - + Select image 画像を選択 - + Images 画像 - + Sequence シーケンス @@ -4756,105 +4864,105 @@ Note that the wizard cannot tell the difference between a knob and a slider so y すべての機器とチャンネルを無効 - + Enable all channels in current fixture この機器のすべてのチャンネルを有効 - + Disable all channels in current fixture この機器のすべてのチャンネルを無効 - + Copy current values to clipboard 現在のシーンをコピー - + Paste clipboard values to current fixture クリップボードから貼り付け - + Copy current values to all fixtures すべての機器に現在の値を適用 - + Color tool for CMY/RGB-capable fixtures 色設定ツール(CMY/RGBミックスが可能な機器用) - + Position tool for moving heads/scanners ムービングの位置調整 - + Switch between tab view and all channels view フィクスチャーごとにタブ表示/まとめて表示 - + Toggle blind mode ブラインドモード - + Show/Hide speed dial window スピード設定 - + Clone this scene and append as a new step to the selected chaser このシーンを複製し、選択したチェイスにステップとして登録 - + Go to next fixture tab 次の機器へ - + Go to previous fixture tab 前の機器へ - + None 無し - + Scene name: シーン名: + - All fixtures すべての機器 + - Channels Groups チャンネルグループ + - Generic 全般 - + Remove fixtures 機器を削除 - + Do you want to remove the selected fixture(s)? 選択した機器を削除しますか? @@ -5064,7 +5172,7 @@ Note that the wizard cannot tell the difference between a knob and a slider so y 接続されていないUniversを設定する - + <Double click here to enter channel number manually> チャンネルを手動で入力してください @@ -5370,118 +5478,118 @@ Duration: %3 SimpleDesk - + Universe Universe - + Next page 次のページ - + Current page 現在のページ - + Previous page 前のページ - + View mode ビューモード - + Reset universe Universe のリセット - + Playback プレイバック - - + + Cue Stack キュースタック - + Previous cue 前のキュー - + Stop cue stack キュースタックの停止 - + Next cue 次のキュー - + Clone cue stack キュースタックの複製 - + Edit cue stack キュースタックの編集 - + Record cue キューの記録 - + Channel groups チャンネルグループ - + Cue Stack - Playback %1 キュースタック - フェーダー %1 - + No selection 選択無し - + Cue name キュー名 - + Multiple Cues 複数キュー - + Delete cue キューの削除 - + Clone Cue Stack キュースタックの複製 - + Clone To Playback# 複製先フェーダー: - + Cue %1 キュー %1 @@ -5489,32 +5597,32 @@ Duration: %3 SpeedDial - + Hours - + Minutes - + Seconds - + Milliseconds ミリ秒 - + Infinite - + Tap Tap @@ -5522,17 +5630,17 @@ Duration: %3 SpeedDialWidget - + Fade In フェードイン - + Fade Out フェードアウト - + Hold ホールド @@ -5622,17 +5730,17 @@ Duration: %3 VCButton - + Choose... 選択... - + None 無し - + Button %1 ボタン %1 @@ -5647,17 +5755,17 @@ Duration: %3 画像 (%1) - + Toggle Blackout 暗転 - + Stop ALL functions! 全ファンクション停止 - + Icon アイコン @@ -5670,67 +5778,77 @@ Duration: %3 ボタンの詳細 - + + Override priority + + + + + Force LTP + + + + General 全般 - + Button label 名前 - + Text to display on the button ボタン上に表示するテキスト - + Function ファンクション - + The function that this button controls このボタンで操作するファンクション - + Attach a function to this button このボタンで操作するファンクションを設定 - + Detach the button's function attachment ファンクションを除外 - + Toggle Blackout 暗転 - + Stop All Functions すべてのファンクション停止 - + Fade time: フェードタイム: - + Adjust function intensity when it is running ファンクション再生時の明るさを設定 - + Adjust Function Intensity ファンクション再生時の明るさ - + Function's adjusted intensity percentage when run ファンクション再生時の明るさ(パーセント) @@ -5750,17 +5868,17 @@ Duration: %3 ON/OFF切り替え - + Flash the assigned function with this button ボタンを押している間だけ再生 - + Flash function (only for scenes) フラッシュ(シーンのみ対応) - + No function 無し @@ -5851,64 +5969,64 @@ Duration: %3 VCCueList - + Show/Hide crossfade sliders クロスフェーダー表示 - - + + Play/Pause Cue list キューリストの再生/一時停止 - - + + Stop Cue list キューリストの停止 - + Go to previous step in the list 前のステップへ - + Go to next step in the list 次のステップへ - + Cue list キューリスト - + Play/Stop Cue list キューリストの再生/一時停止 - + Pause Cue list キューリストの停止 - + Fade In フェードイン - + Fade Out フェードアウト - + Duration 再生継続時間 - + Notes メモ @@ -6074,7 +6192,7 @@ Duration: %3 VCFrame - + Add 追加 @@ -6127,17 +6245,17 @@ Duration: %3 ページ名 - + External Input - Enable 外部入力 - + External Input - Previous Page 外部入力 - 前のページへ - + External Input - Next Page @@ -6170,17 +6288,17 @@ Duration: %3 VCLabel - + Label メモ - + Rename Label メモの書き換え - + Caption: 説明: @@ -6188,42 +6306,42 @@ Duration: %3 VCMatrix - + Animation %1 アニメーション %1 - + End Color Reset 第二色のリセット - + Start color Red component 第一色を赤に設定 - + Start color Green component 第一色を緑に設定 - + Start color Blue component 第一色を青に設定 - + End color Red component 第二色を赤に設定 - + End color Green component 第二色を緑に設定 - + End color Blue component 第二色を青に設定 @@ -6426,48 +6544,48 @@ Duration: %3 テキストを追加 - + No function ファンクションなし - + Start Color 第一色 - + Start Color Knob 第一色ノブ - + End Color 第二色 - + End Color Knob 第二色ノブ - + End Color Reset 第二色をリセット - + Animation アニメーション - - + + Text テキスト - + Enter a text テキストを決定 @@ -6719,12 +6837,12 @@ Duration: %3 VCSlider - + Slider %1 フェーダー %1 - + Reset channels override 強制的にリセット @@ -6742,42 +6860,42 @@ Duration: %3 全般 - + Name of the slider 名前 - + Value display style 数値表示 - + Show exact DMX values DMX値を表示 - + Show value as percentage パーセント表示 - + Percentage パーセント - + Slider movement 上下 - + Normal 標準(上が100%) - + Inverted 反転(下が100%) @@ -6853,32 +6971,32 @@ Duration: %3 プレイバックモードにする - + Actual DMX - + Widget name 名前 - + Widget appearance 外見 - + Slider フェーダー - + Knob つまみ - + Catch up with the external controller input value 外部コントローラからの操作を受け付ける @@ -7276,17 +7394,17 @@ Duration: %3 ミリ秒を表示 - + Multiply by 2 Input 2つの入力 - + Divide by 2 Input 2つの入力を分ける - + Factor Reset Input 入力をリセット @@ -7294,68 +7412,68 @@ Duration: %3 VCWidget - + Button ボタン - + Slider フェーダー - + XYPad XYパッド - + Frame フレーム - + Solo frame ソロフレーム - + Speed dial スピードダイヤル - + Cue list キューリスト - + Label メモ - + Audio Triggers オーディオトリガー - + Animation アニメーション - + Clock 現在時刻 + - Unknown 不明 - + This widget has no properties このウィジェットに設定項目はありません @@ -7553,12 +7671,12 @@ Duration: %3 プリセット名 - + Pan / Horizontal Axis パン/X軸 - + Tilt / Vertical Axis チルト/Y軸 @@ -7588,44 +7706,44 @@ Duration: %3 機器の編集 - + Width - + Height 高さ - + Remove fixtures 機器の削除 - + Do you want to remove the selected fixtures? 選択した機器を削除しますか? - - + + Error エラー - + The selected Scene does not include any Pan or Tilt channel. Please select one with such channels. 選択したシーンにはPan,Tiltを操作するチャンネルが含まれていません、ポジションを操作するファンクションを選択してください - + Please select at least one fixture or head to create this type of preset! 選択したフィクスチャーにはPan,Tiltが定義されていません。ポジション操作が定義されているフィクスチャーを選択してください - + Fixture Group 機器グループ @@ -7758,12 +7876,12 @@ Please select one with such channels. VideoItem - + Fullscreen フルスクリーン - + Screen %1 スクリーン %1 diff --git a/ui/src/qlcplus_nl_NL.ts b/ui/src/qlcplus_nl_NL.ts index a1a5601fa3..7f3d2b3039 100644 --- a/ui/src/qlcplus_nl_NL.ts +++ b/ui/src/qlcplus_nl_NL.ts @@ -188,12 +188,12 @@ Fixture model - + Fixtures found: %1 Fixtures gevonden: %1 - + Dimmers Dimmers @@ -524,372 +524,372 @@ App - + Fixtures Fixtures - + Functions Functies - + Shows Shows - + Virtual Console Virtuele Console - + Simple Desk Eenvoudig - + Inputs/Outputs Inputs/Outputs - + Cannot exit in Operate mode Sluiten niet mogelijk in Operate Mode - + You must switch back to Design mode to close the application. Ga eerst terug naar Design Mode om af te sluiten. - + Close Sluiten - + Do you wish to save the current workspace before closing the application? Huidige workspace opslaan voor het afsluiten? - + Close the application? Programma afsluiten? - + Do you wish to close the application? Programma afsluiten? - + Starting Q Light Controller Plus Q Light Controller Plus aan het starten - + - New Workspace - Nieuwe workspace - + Exit Sluiten - + Switch to Design Mode Ga naar Design Mode - + There are still running functions. Really stop them and switch back to Design mode? Eén of meer functies zijn nog actief. Wil je deze stoppen en naar Design Mode gaan? - + Design Design - + Switch to design mode Ga naar Design Mode - + Operate Operate - - + + Switch to operate mode Ga naar Operate Mode - + &New &Nieuw - + CTRL+N File|New CTRL+N - + &Open &Open - + CTRL+O File|Open CTRL+O - + &Save Op&slaan - + CTRL+S File|Save CTRL+S - + Save &As... Opslaan &als... - + &Operate &Operate - + CTRL+F12 Control|Toggle operate/design mode CTRL+F12 - + &Monitor &Monitor - + CTRL+M Control|Monitor CTRL+M - + Address Tool Adres instellen - + Toggle &Blackout &Blackout aan/uit - + Live edit a function Bewerk een functie live - + Toggle Virtual Console Live edit Virtual Console Live Edit aan/uit - + Dump DMX values to a function Dump DMX waarden naar een functie - + CTRL+D Control|Dump DMX CTRL+D - + Stop ALL functions! Stop alle functies! - + Fade 1 second and stop Fade 1 seconde en stop - + Fade 5 seconds and stop Fade 5 seconden en stop - + Fade 10 second and stop Fade 10 seconden en stop - + Fade 30 second and stop Fade 30 seconden en stop - + Toggle Full Screen Volledig scherm aan/uit - + CTRL+F11 Control|Toggle Full Screen CTRL+F11 - + &Index &Index - + SHIFT+F1 Help|Index SHIFT+F1 - + &About QLC+ O&ver QLC+ - + Quit QLC+ - + Workspace Workspace - + Unable to read from file Bestand lezen mislukt - + Unable to write to file Schrijven naar het bestand mislukt - + A fatal error occurred Fatale fout opgetreden - + Unable to access resource Benaderen bron mislukt - + Unable to open file for reading or writing Bestand openen voor lezen of schrijven mislukt - + Operation was aborted Bewerking afgebroken - + Operation timed out Bewerking time-out - + An unspecified error has occurred. Nice. Er is een onbekende fout opgetreden. Fijn. - + File error Bestandsfout - - - + + + Do you wish to save the current workspace? Changes will be lost if you don't save them. Huidige workspace opslaan? De wijzigingen gaan verloren indien ze niet worden opgeslagen. - + New Workspace Nieuwe workspace - - - + + + Open Workspace Open workspace - - + + Workspaces (*%1) Workspaces (*%1) - - + + All Files (*.*) Alle bestanden (*.*) - - + + All Files (*) Alle bestanden (*) - + Save Workspace As Workspace opslaan als - + Error Fout - + File not found! The selected file has been moved or deleted. Bestand niet gevonden! Het geselecteerde bestand is verplaatst of verwijderd. - + Warning Waarschuwing - + Some errors occurred while loading the project: Er is iets fout gegaan tijdens het laden van het project: @@ -912,12 +912,12 @@ The selected file has been moved or deleted. Sluit automatisch bij een toetsaanslag - + Assign Key Wijs toets toe - + Hit the key combination that you wish to assign. You may hit either a single key or a combination using %1, %2, and %3. Sla de toetscombinatie aan die toegewezen moet worden. Toegestaan is een enkele toets of een combinatie met %1, %2, en %3. @@ -1044,23 +1044,23 @@ The selected file has been moved or deleted. AudioItem - - + + Preview Left Channel Voorbeeld linkerkanaal - + Preview Right Channel Voorbeeld rechterkanaal - + Preview Stereo Channels Voorbeeld stereokanalen - + Preview Mono Voorbeeld mono @@ -1128,52 +1128,52 @@ The selected file has been moved or deleted. Input - + None Geen - + DMX DMX - + Function Functie - + VC Widget VC Widget - + %1 channels %1 kanalen - + No function Geen functie - + No widget Geen widget - + Not assigned Niet toegewezen - + Volume Bar Volumemeter - + #%1 (%2Hz - %3Hz) #%1 (%2Hz - %3Hz) @@ -1231,12 +1231,12 @@ The selected file has been moved or deleted. Aanpassingen ongedaan maken - + Error Fout - + You are trying to overwrite a system template! Please choose another name and the template will be saved in your channel modifier's user folder. U probeert een systeem template te overschrijven! Kies een andere naam zodat het template opgeslagen kan worden in de kanaal aanpassingen gebruikers map. @@ -1251,13 +1251,13 @@ The selected file has been moved or deleted. - + Name Naam - + Type Type @@ -1277,27 +1277,27 @@ The selected file has been moved or deleted. - + Selected Geselecteerd - + Channel properties configuration Kanaal eigenschappen configuratie - + Can fade Kan faden - + Behaviour Gedrag - + Modifier Modifier @@ -1321,19 +1321,19 @@ The selected file has been moved or deleted. - + Fade In Fade IN - + Hold Hold - + Fade Out Fade Out @@ -1553,47 +1553,47 @@ The selected file has been moved or deleted. - + Cut Knippen - + Copy Kopiëren - + Paste Plakken - + Paste error Fout bij plakken - + Trying to paste on an incompatible Scene. Operation canceled. Poging om een niet-compatibele scene te plakken. Bewerking geannuleerd. - + Common Fade In Gemeenschappelijke Fade In - + Common Fade Out Gemeenschappelijke Fade Out - + Common Hold Gemeenschappelijke Hold - + Multiple Steps Meerdere stappen @@ -1649,12 +1649,12 @@ The selected file has been moved or deleted. ConsoleChannel - + Intensity Intensiteit - + Reset this channel Reset dit kanaal @@ -1715,6 +1715,83 @@ The selected file has been moved or deleted. Cue + + CustomFeedbackDialog + + + Custom Feedback Configuration + + + + + Value + Waarde + + + + Label + Label + + + + Color + + + + + Values + Waarden + + + + Lower Value + + + + + Monitor Value + + + + + Upper Value + + + + + + + Color Selection + + + + + MIDI Channel + + + + + Upper Channel + + + + + Lower Channel + + + + + Monitor Channel + + + + + + + From plugin settings + + + DmxDumpFactory @@ -1773,49 +1850,16 @@ The selected file has been moved or deleted. Scenenaam: - + Dump all channels (%1 Universes, %2 Fixtures, %3 Channels) Dump alle kanalen (%1 Universes, %2 Fixtures, %3 Kanalen) - + New Scene From Live %1 Nieuwe scene van Live %1 - - DocBrowser - - - %1 - Document Browser - %1 - Documentbrowser - - - - Backward - Terug - - - - Forward - Verder - - - - Index - Index - - - - About Qt - Over Qt - - - - Close this window - - - EFXEditor @@ -2096,12 +2140,12 @@ The selected file has been moved or deleted. Bekijk hoe het eruit ziet als de EFX loopt - + Remove fixtures Verwijder fixtures - + Do you want to remove the selected fixture(s)? Wil je de geselecteerde fixtures verwijderen? @@ -2443,88 +2487,88 @@ The selected file has been moved or deleted. Deel fixturenamen opnieuw in - - + + (remapped) (heringedeeld) - + Import Fixtures List Importeer lijst met fixtures - + Fixtures List (*%1) Fixtures lijst (*%1) - + All Files (*.*) Alle bestanden (*.*) - + All Files (*) Alle bestanden (*) - + Do you want to automatically connect fixtures with the same name? - + Generic Dimmer Algemene dimmer - + Delete Fixtures Verwijder fixtures - + Do you want to delete the selected items? Geselecteerde items verwijderen? - + Invalid operation Ongeldige bewerking - + You are trying to clone a fixture on an address already in use. Please fix the target list first. U probeert een fixture te klonen op een adres dat al in gebruik is. Pas eerst de doellijst aan. - - - - + + + + Invalid selection Ongeldige selectie - - - + + + Please select a source and a target fixture or channel to perform this operation. Selecteer een bron en een doelfixture of kanaal om deze bewerking uit te voeren. - + To perform a fixture remap, please select fixtures on both lists. Om een fixture herindeling uit te voeren dient uit beide lijsten fixtures geselecteerd te worden. - + This might take a while... Even geduld a.u.b... - + Cancel Annuleren @@ -2537,12 +2581,12 @@ The selected file has been moved or deleted. Selecteer fixture - + No fixtures available Geen fixtures beschikbaar - + Go to the Fixture Manager and add some fixtures first. Ga naar de Fixture manager en voeg eerst fixtures toe. @@ -2599,7 +2643,7 @@ The selected file has been moved or deleted. FunctionLiveEditDialog - + Function Live Edit Bewerk een functie live @@ -2607,195 +2651,195 @@ The selected file has been moved or deleted. FunctionManager - + New &scene Nieuwe &scene - + New c&haser Nieuwe c&haser - + New se&quence Nieuwe se&quence - + New c&ollection Nieuwe c&ollectie - + New E&FX Nieuwe E&FX - + New &RGB Matrix Nieuwe &RGB Matrix - + New scrip&t Nieuw scrip&t - + New au&dio Nieuwe au&dio - + New vid&eo Nieuwe vid&eo - + New fo&lder Nieuwe map (fo&lder) - + Select Startup Function Selecteer opstartfunctie - + Function &Wizard Functie&wizard - + &Clone &Klonen - + &Delete Verwij&deren - + Select &all Selecteer &alles - + New Scene Nieuwe scene - + New Chaser Nieuwe chaser - + New Sequence Nieuwe sequence - + New Collection Nieuwe collectie - + New EFX Nieuwe EFX - + New RGB Matrix Nieuwe RGB Matrix - + New Script Nieuw script - + Open Audio File Open audiobestand - + Audio Files (%1) Audiobestanden (%1) - - + + All Files (*.*) Alle bestanden (*.*) - - + + All Files (*) Alle bestanden (*) - + Unsupported audio file Niet ondersteund audiobestand - + This audio file cannot be played with QLC+. Sorry. Dit audiobestand kan niet worden afgespeeld met QLC+. Sorry. - + Open Video File Open videobestand - + Video Files (%1) Videobestanden (%1) - + Unsupported video file Niet ondersteund videobestand - + This video file cannot be played with QLC+. Sorry. Dit videobestand kan niet worden afgespeeld met QLC+. Sorry. - + Do you want to DELETE folder: Do you want to DELETE foler: VERWIJDER map: - + Do you want to DELETE functions: VERWIJDER functies: - + (This will also DELETE: Dit VERWIJDERT tevens: - + Delete Functions Verwijder functies - + Function Functie - + (Copy) (kopie) @@ -3082,32 +3126,32 @@ p, li { white-space: pre-wrap; } Verwijderen - + %1 group %1 groep - + Error Fout - + %1 has no capability supported by this wizard. %1 heeft geen functies die ondersteund worden door deze wizard. - + Presets solo frame Presets solo frame - + Click & Go RGB Klik & Gaan RGB - + Click & Go Macro Click & Go Macro @@ -3115,27 +3159,27 @@ p, li { white-space: pre-wrap; } GrandMasterSlider - + GM GM - + Grand Master <B>limits</B> the maximum value of Grand Master <B>limiteert</B> de maximumwaarde van - + Grand Master <B>reduces</B> the current value of Grand Master <B>verlaagt</B> de huidige waarde van - + intensity channels intensiteit kanalen - + all channels alle kanalen @@ -3237,45 +3281,45 @@ p, li { white-space: pre-wrap; } InputOutputManager - + Add U&niverse U&niverse toevoegen - + &Delete Universe Universe Universe verwij&deren - + Universe name: Universe naam: - + Passthrough Doorgeven - - + + Universe %1 Universe %1 - - + + Delete Universe Universe verwijderen - + The universe you are trying to delete is patched. Are you sure you want to delete it? De universe die u probeert te verwijderen is gepatched. Weet u zeker dat u deze wilt verwijderen? - + There are some fixtures using the universe you are trying to delete. Are you sure you want to delete it? Er zijn fixtures die gebruik maken van de universe die u wilt verwijderen. Weet u zeker dat u deze wilt verwijderen? @@ -3382,20 +3426,20 @@ p, li { white-space: pre-wrap; } Niveau Monitor - - - + + + Error Fout - - + + Output line already assigned Output line is al toegewezen - + An error occurred while trying to open the selected device line. This can be caused either by a wrong system configuration or an unsupported input/output mode. Please refer to the plugins documentation to troubleshoot this. @@ -3404,67 +3448,67 @@ Dit kan komen door een verkeerde systeem configuratie of een niet ondersteunde i Zie de plugin documentatie voor uitleg over dit onderwerp. - - + + Existing Input Profile Bestaand inputprofiel - - + + An input profile at %1 already exists. Do you wish to overwrite it? Inputprofiel %1 bestaat al. Overschijven? - - + + Save Input Profile Sla input profiel op - - + + Input Profiles (*.qxi) Inputprofielen (*.qxi) - - + + Saving failed Opslaan mislukt - + Unable to save the profile to %1 Opslaan als %1 lukt niet - + Delete profile Verwijder profiel - + Do you wish to permanently delete profile "%1"? Profiel "%1" definitief verwijderen? - + File deletion failed Verwijderen bestand mislukt - + Unable to delete file %1 Verwijderen bestand %1 mislukt - + Unable to save %1 to %2 %1 opslaan als %2 mislukt - + Default device Standaard apparaat @@ -3477,176 +3521,233 @@ Zie de plugin documentatie voor uitleg over dit onderwerp. Inputprofiel Editor - + General Algemeen - + The name of the company that made the device De naam van de fabrikant - + The device's model name Modelnaam - + Manufacturer Fabrikant - + Model Model - - + + Type Type - + MIDI Global Settings Globale MIDI Instellingen - + When MIDI notes are used, send a Note Off when value is 0 Indien MIDI notes gebruikt worden, verstuur dan een Note Off als de waarde 0 is - - Channels - Kanalen - - - + + Channel Kanaal - + + Name Naam - + Custom feedback Aangepaste feedback - + Upper value Hoge waarde - + Lower value Lage waarde - - + Behaviour Gedrag - + Add a new channel description Voeg een nieuwe kanaal omschrijving toe - + Remove the selected channels Verwijder de geselecteerde kanalen - + Edit the selected channel Wijzig het geselecteerde kanaal - + Automatically add channels to the list when you wiggle the device's controls Voeg automatisch kanalen toe bij het bedienen van de controls - + + Input Mapping + + + + Movement Beweging - + Absolute Absoluut - + Relative Relatief - + Generate an extra Press/Release when toggled - + + + MIDI channel + + + + + Colors + + + + + Remove the selected color + + + + + Add a new color + + + + + Value + Waarde + + + + Label + Label + + + + Color + + + + + MIDI Channels + + + + + Add a new MIDI channel + + + + + Remove the selected MIDI channel + + + + Sensitivity Gevoeligheid - + File not writable Bestand niet beschrijfbaar - + You do not have permission to write to the file %1. You might not be able to save your modifications to the profile. Onvoldoende permissies om te schrijven naar bestand %1.Mogelijk worden er wijzigingen aan het profiel niet opgeslagen. - + + From plugin settings + + + + Missing information Informatie ontbreekt - + Manufacturer and/or model name is missing. Fabrikant en/of modelnaam ontbreekt. - - + + Channel already exists Kanaal bestaat al - - + + Channel %1 already exists Kanaal %1 bestaat al - + Delete channels Verwijder kanalen - + Delete all %1 selected channels? Alle %1 geselecteerde kanalen verwijderen? - + Channel wizard activated Kanaal wizard geactiveerd - + You have enabled the input channel wizard. After clicking OK, wiggle your mapped input profile's controls. They should appear into the list. Click the wizard button again to stop channel auto-detection. Note that the wizard cannot tell the difference between a knob and a slider so you will have to do the change manually. @@ -3658,12 +3759,39 @@ Let op: de wizard maakt geen onderscheid tussen een knop of een slider, dit zal De wizard kent het verschil tussen een knop en een slider niet. Deze dient handmatig aangepast te worden. - + + + Enter value + + + + + Feedback value + + + + + + Enter label + + + + + Color label + + + + + MIDI channel label + + + + Button %1 Knop %1 - + Slider %1 Slider %1 @@ -3696,65 +3824,50 @@ De wizard kent het verschil tussen een knop en een slider niet. Deze dient handm Externe input - + When toggled, you can click an external button to assign it to this widget. Indien aangezet is het mogelijk om een externe input te koppelen aan deze widget. - + Auto Detect Autodetectie - + Input Universe Input Universe - + Input Channel Input Kanaal - + The input universe that sends data to this widget De input universe die data stuurt naar deze widget - + Custom Feedback Aangepaste Feedback - + The particular input channel within the input universe that sends data to this widget Het input kanaal binnen de input universe dat data verstuurd naar deze widget - + Choose an external input universe & channel that this widget should listen to. Kies een externe input universe en kanaal waarnaar deze widget moet luisteren. - + Choose... Kies... - - - Custom feedback - Aangepaste feedback - - - - Lower value - Lage waarde - - - - Upper value - Hoge waarde - Monitor @@ -3911,14 +4024,14 @@ De wizard kent het verschil tussen een knop en een slider niet. Deze dient handm Achtergrond - - + + Select background image Selecteer achtergrondafbeelding - - + + Images Afbeeldingen @@ -4209,12 +4322,12 @@ De wizard kent het verschil tussen een knop en een slider niet. Deze dient handm PlaybackSlider - + Select Selecteer - + Flash Flits @@ -4230,34 +4343,29 @@ De wizard kent het verschil tussen een knop en een slider niet. Deze dient handm QObject - + Operate Bedienen - + Design Ontwerpen - - + + Reversed Omgekeerd - + Page: %1 Pagina: %1 RDMManager - - - Form - - Scan for RDM devices... @@ -4677,22 +4785,22 @@ De wizard kent het verschil tussen een knop en een slider niet. Deze dient handm Geen - + No fixture group to control Geen fixturegroep om te bedienen - + Select image Selecteer afbeelding - + Images Afbeeldingen - + Sequence @@ -4752,105 +4860,105 @@ De wizard kent het verschil tussen een knop en een slider niet. Deze dient handm Kanalen van alle fixtures aanzetten - + Enable all channels in current fixture Alle kanalen van deze fixture aanzetten - + Disable all channels in current fixture Alle kanalen van deze fixture uitzetten - + Copy current values to clipboard Kopieer huidige waardes naar het klembord - + Paste clipboard values to current fixture Plak klembordwaarden naar deze fixture - + Copy current values to all fixtures Kopieer huidige waarden naar alle fixtures - + Color tool for CMY/RGB-capable fixtures Kleurengereedschap voor CMY/RGB compatibele fixtures - + Position tool for moving heads/scanners Positiegereedschap voor moving heads/scanners - + Switch between tab view and all channels view Wissel tussen tabweergave en alle kanalenweergave - + Toggle blind mode Schakel naar blinde modus - + Show/Hide speed dial window Toon/verberg speed dial venster - + Clone this scene and append as a new step to the selected chaser Kloon deze scene en voeg toe als nieuwe step aan de geselecteerde chaser - + Go to next fixture tab Volgende fixture tab - + Go to previous fixture tab Vorige fixture tab - + None Geen - + Scene name: Scene naam: + - All fixtures Alle fixtures + - Generic Algemeen - + Remove fixtures Verwijder fixtures - + Do you want to remove the selected fixture(s)? Wil je de geselecteerde fixtures verwijderen? + - Channels Groups Kanaalgroepen @@ -5059,7 +5167,7 @@ De wizard kent het verschil tussen een knop en een slider niet. Deze dient handm Ongepatchte universes toestaan - + <Double click here to enter channel number manually> <Dubbelklik hier om een kanaal nummer handmatig in te voeren> @@ -5365,118 +5473,118 @@ Duur: %3 SimpleDesk - + View mode Weergavemodus - + Previous page Vorige pagina - + Current page Huidige pagina - + Next page Volgende pagina - + Reset universe Reset universe - + Universe Universe - + Playback Playback - - + + Cue Stack Cue stack - + Previous cue Vorige cue - + Stop cue stack Stop cue stack - + Next cue Volgende cue - + Clone cue stack Kloon cue stack - + Edit cue stack Wijzig cue stack - + Record cue Neem cue op - + Channel groups Kanaalgroepen - + Cue Stack - Playback %1 Cue Stack - Playback %1 - + No selection Geen selectie - + Cue name Cue naam - + Multiple Cues Meerdere cues - + Delete cue Verwijder cue - + Clone Cue Stack Kloon cue stack - + Clone To Playback# Kloon naar Playback# - + Cue %1 Cue %1 @@ -5484,32 +5592,32 @@ Duur: %3 SpeedDial - + Hours Uren - + Minutes Minuten - + Seconds Seconden - + Milliseconds Milliseconden - + Infinite Oneindig - + Tap Tap @@ -5517,17 +5625,17 @@ Duur: %3 SpeedDialWidget - + Fade In Fade IN - + Fade Out Fade Out - + Hold Hold @@ -5617,17 +5725,17 @@ Duur: %3 VCButton - + Choose... Kies... - + None Geen - + Button %1 Knop %1 @@ -5642,17 +5750,17 @@ Duur: %3 Afbeeldingen (%1) - + Toggle Blackout Blackout aan/uit - + Stop ALL functions! Stop alle functies! - + Icon Icoon @@ -5665,37 +5773,37 @@ Duur: %3 Knop eigenschappen - + General Algemeen - + Button label Knop naam - + Text to display on the button Tekst om te tonen op de knop - + Function Functie - + The function that this button controls De functie die door deze knop bestuurd wordt - + Attach a function to this button Koppel een functie aan deze knop - + Detach the button's function attachment Ontkoppel de functie van de knop @@ -5715,47 +5823,57 @@ Duur: %3 Zet functie aan/uit - + Flash the assigned function with this button Flits de toegewezen functie met deze knop - + Flash function (only for scenes) Flits functie (alleen voor scenes) - + + Override priority + + + + + Force LTP + + + + Toggle Blackout Blackout aan/uit - + Stop All Functions Stop alle functies - + Fade time: Fade tijd: - + Adjust function intensity when it is running Pas de intensiteit van de functie aan als de knop actief is - + Adjust Function Intensity Functie Intensiteit aanpassen - + Function's adjusted intensity percentage when run Aangepaste intensiteit percentage van de functie wanneer het runt - + No function Geen functie @@ -5846,64 +5964,64 @@ Duur: %3 VCCueList - + Show/Hide crossfade sliders Toon/verberg crossfade sliders - - + + Play/Pause Cue list - - + + Stop Cue list - + Go to previous step in the list Ga naar vorige stap in de lijst - + Go to next step in the list Ga naar volgende stap in de lijst - + Cue list Cue list - + Play/Stop Cue list - + Pause Cue list - + Fade In Fade In - + Fade Out Fade Out - + Duration Duur - + Notes Notities @@ -6068,7 +6186,7 @@ Duur: %3 VCFrame - + Add Toevoegen @@ -6121,17 +6239,17 @@ Duur: %3 - + External Input - Enable Externe input - Inschakelen - + External Input - Previous Page - + External Input - Next Page @@ -6164,17 +6282,17 @@ Duur: %3 VCLabel - + Label Label - + Rename Label Hernoem label - + Caption: Opschrift: @@ -6182,42 +6300,42 @@ Duur: %3 VCMatrix - + Animation %1 Animatie %1 - + End Color Reset Eind kleur reset - + Start color Red component Start kleur Rood component - + Start color Green component Start kleur Groen component - + Start color Blue component Start kleur Blauw component - + End color Red component Eind kleur Rood component - + End color Green component Eind kleur Groen component - + End color Blue component Eind kleur Blauw component @@ -6420,48 +6538,48 @@ Duur: %3 Tekst toeveogen - + No function Geen functie - + Start Color Start kleur - + Start Color Knob Start Kleur Knop - + End Color Eind kleur - + End Color Knob Eind Kleur Knop - + End Color Reset Eind Kleur Reset - + Animation Animatie - - + + Text Tekst - + Enter a text Voer een tekst in @@ -6712,12 +6830,12 @@ Duur: %3 VCSlider - + Slider %1 Slider %1 - + Reset channels override @@ -6735,72 +6853,72 @@ Duur: %3 Algemeen - + Value display style Weergavestijl van waarden - + Show exact DMX values Toon exacte DMX waarden - + Actual Huidig - + Show value as percentage Toon waarde als percentage - + Percentage Percentage - + Widget name Widgetnaam - + Name of the slider Naam van de slider - + Slider movement Beweging slider - + Normal Normaal - + Inverted Omgekeerd - + Widget appearance Widget uiterlijk - + Slider Slider - + Knob Knop - + Catch up with the external controller input value @@ -7268,17 +7386,17 @@ Duur: %3 Toon het milliseconden veld - + Multiply by 2 Input Vermenigvuldig met 2 Input - + Divide by 2 Input Deel door 2 Input - + Factor Reset Input Factor Reset Input @@ -7286,68 +7404,68 @@ Duur: %3 VCWidget - + Button Knop - + Slider Slider - + XYPad XYPad - + Frame Frame - + Solo frame Solo frame - + Speed dial Speed dial - + Cue list Cue list - + Label Label - + Audio Triggers Audio Triggers - + Animation Animatie - + Clock Klok + - Unknown Onbekend - + This widget has no properties Deze widget heeft geen eigenschappen @@ -7545,12 +7663,12 @@ Duur: %3 Preset naam - + Pan / Horizontal Axis Pan / Horizontale as - + Tilt / Vertical Axis Tilt / Verticale as @@ -7580,45 +7698,45 @@ Duur: %3 Omgekeerd - + Width Breedte - + Height Hoogte - + Remove fixtures Verwijder fixtures - + Do you want to remove the selected fixtures? Wil je de geselecteerde fixtures verwijderen? - - + + Error Fout - + The selected Scene does not include any Pan or Tilt channel. Please select one with such channels. De geselecteerde Scene bevat geen Pan of Tilt kanaal. Selecteer een Scene met zo'n kanaal. - + Please select at least one fixture or head to create this type of preset! - + Fixture Group Fixturegroep @@ -7751,12 +7869,12 @@ Selecteer een Scene met zo'n kanaal. VideoItem - + Fullscreen Volledig scherm - + Screen %1 Scherm %1 diff --git a/ui/src/qlcplus_pt_BR.ts b/ui/src/qlcplus_pt_BR.ts index a888eb0622..19d13b506a 100644 --- a/ui/src/qlcplus_pt_BR.ts +++ b/ui/src/qlcplus_pt_BR.ts @@ -189,12 +189,12 @@ Quantidade de canais vazios a deixar entre fixtures adicionados - + Fixtures found: %1 Fixtures encontrados: %1 - + Dimmers Dimmers @@ -525,376 +525,376 @@ App - + Cannot exit in Operate mode Não pode sair em Modo de Operação - + You must switch back to Design mode to close the application. Tem que mudar para o Modo de Edição para fechar a aplicação. - + Close Fechar - + Do you wish to save the current workspace before closing the application? Deseja guardar a área de trabalho antes de fechar a aplicação? - + Starting Q Light Controller Plus Starting Q Light Controller Iniciando Q Light Controller Plus - + - New Workspace - Nova área de trabalho - + Switch to Design Mode Mudar para Modo de Edição - + There are still running functions. Really stop them and switch back to Design mode? Ainda há funções a executar. Deseja parar e voltar ao Modo Edição? - + Design Edição - + Switch to design mode Mudar para Modo de Edição - + Operate Operação - - + + Switch to operate mode Mudar para Modo de Operação - + &New &Novo - + CTRL+N File|New - + &Open &Abrir - + CTRL+O File|Open - + &Save &Guardar - + CTRL+S File|Save CTRL+S - + Save &As... Guardar &como... - + &Operate &Operação - + &Monitor &Monitor - + Toggle &Blackout Activar/Desactivar &Blackout - + CTRL+F12 Control|Toggle operate/design mode - + CTRL+M Control|Monitor - + Live edit a function Editar função ao vivo - + Toggle Full Screen Alterar para Ecrã Completo - + CTRL+F11 Control|Toggle Full Screen - + &Index &Indice - + SHIFT+F1 Help|Index - + &About QLC+ &About QLC Acerca &QLC+ - + Fixtures Fixtures - + Functions Funções - + Shows Shows - + Virtual Console Consola Virtual - + Simple Desk Mesa Simples - + Inputs/Outputs Entradas/Saídas - + Close the application? Fechar a aplicação? - + Do you wish to close the application? Deseja fechar a aplicação? - + Exit Sair - + Address Tool Ferramenta de endereçamento - + Toggle Virtual Console Live edit - + Dump DMX values to a function Atribuirvalores DMX a uma função - + CTRL+D Control|Dump DMX - + Stop ALL functions! ¡Detener TODAS las fiunções! - + Fade 1 second and stop Fade 1 segundo e parar - + Fade 5 seconds and stop Fade 5 segundos e parar - + Fade 10 second and stop Fade 10 segundos e parar - + Fade 30 second and stop Fade 30 segundos e parar - + Quit QLC+ - + Workspace Área de trabalho - + Unable to read from file Não é possível ler desde o ficheiro - + Unable to write to file Não é possível escrever para o ficheiro - + A fatal error occurred Ocorreu um erro fatal - + Unable to access resource Não é possível aceder ao recurso - + Unable to open file for reading or writing Não é possível abrir o ficheiro para ler ou escrever - + Operation was aborted Operação cancelada - + Operation timed out Tempo de operação excedido - + An unspecified error has occurred. Nice. Ocorreu um erro desconhecido. - + File error Erro de ficheiro - - - + + + Do you wish to save the current workspace? Changes will be lost if you don't save them. Deseja guardar a àrea de Trabalho actual? As alterações serão perdidas se não as gravar. - + New Workspace Nova área de trabalho - - - + + + Open Workspace Abrir Área de Trabalho - - + + Workspaces (*%1) Áreas de Trabalho (*%1) - - + + All Files (*.*) Todos os ficheiros (*.*) - - + + All Files (*) Todos os ficheiros (*) - + Save Workspace As SalvarÁrea de Trabalho Como - + Error Erro - + File not found! The selected file has been moved or deleted. Ficheiro não encontrado! O ficheiro seleccionado foi movido ou apagado. - + Warning Atenção - + Some errors occurred while loading the project: Ocorreram alguns erros ao carregar o projecto: @@ -917,12 +917,12 @@ O ficheiro seleccionado foi movido ou apagado. Fechar automaticamente ao pressionar uma tecla - + Assign Key Atribuir tecla - + Hit the key combination that you wish to assign. You may hit either a single key or a combination using %1, %2, and %3. Pressione a combinação de teclas que pretende atribuir. Pode presionar uma só tecla ou uma combinação usando %1, %2 e %3. @@ -1049,23 +1049,23 @@ O ficheiro seleccionado foi movido ou apagado. AudioItem - - + + Preview Left Channel Visualizar Canal Esquerdo - + Preview Right Channel Visualizar Canal Direito - + Preview Stereo Channels Visualizar Canais Stereo - + Preview Mono Visualizar Mono @@ -1133,52 +1133,52 @@ O ficheiro seleccionado foi movido ou apagado. Entrada - + None Nenhum - + DMX DMX - + Function Função - + VC Widget Widget CV - + %1 channels %1 canais - + No function Sem função - + No widget Sem widget - + Not assigned Não atribuído - + Volume Bar Barra de volume - + #%1 (%2Hz - %3Hz) #%1 (%2Hz - %3Hz) @@ -1236,12 +1236,12 @@ O ficheiro seleccionado foi movido ou apagado. - + Error Erro - + You are trying to overwrite a system template! Please choose another name and the template will be saved in your channel modifier's user folder. @@ -1256,13 +1256,13 @@ O ficheiro seleccionado foi movido ou apagado. - + Name Nome - + Type Tipo @@ -1282,27 +1282,27 @@ O ficheiro seleccionado foi movido ou apagado. - + Selected - + Channel properties configuration - + Can fade - + Behaviour - + Modifier @@ -1336,13 +1336,13 @@ O ficheiro seleccionado foi movido ou apagado. - + Fade In Fade In - + Fade Out Fade Out @@ -1363,7 +1363,7 @@ O ficheiro seleccionado foi movido ou apagado. - + Hold Pausa @@ -1559,47 +1559,47 @@ O ficheiro seleccionado foi movido ou apagado. Para Trás - + Cut Cortar - + Copy Copiar - + Paste Colar - + Paste error Error ao colar - + Trying to paste on an incompatible Scene. Operation canceled. A tentar colar uma Cena incompatível. Operação cancelada. - + Common Fade In Tempo de Fade In comum - + Common Fade Out Tempo de Fade Out comum - + Common Hold Espera comum - + Multiple Steps Passos múltiplos @@ -1655,12 +1655,12 @@ O ficheiro seleccionado foi movido ou apagado. ConsoleChannel - + Intensity Intensidade - + Reset this channel @@ -1721,6 +1721,83 @@ O ficheiro seleccionado foi movido ou apagado. Cue + + CustomFeedbackDialog + + + Custom Feedback Configuration + + + + + Value + + + + + Label + Etiqueta + + + + Color + + + + + Values + Valores + + + + Lower Value + + + + + Monitor Value + + + + + Upper Value + + + + + + + Color Selection + + + + + MIDI Channel + + + + + Upper Channel + + + + + Lower Channel + + + + + Monitor Channel + + + + + + + From plugin settings + + + DmxDumpFactory @@ -1780,50 +1857,17 @@ O ficheiro seleccionado foi movido ou apagado. Nome da Cena: - + Dump all channels (%1 Universes, %2 Fixtures, %3 Channels) Dump all DMX values (%1 Universes, %2 Fixtures, %3 Channels) Baixar todos os canais (%1 Universos, %2 Fixtures, %3 Canais) - + New Scene From Live %1 Nova Cena a partir de Ao Vivo %1 - - DocBrowser - - - %1 - Document Browser - %1 - Explorador de Documentos - - - - Backward - Para Trás - - - - Forward - Para a Frente - - - - Index - Índice - - - - About Qt - Acerca de Qt - - - - Close this window - - - EFXEditor @@ -2104,12 +2148,12 @@ O ficheiro seleccionado foi movido ou apagado. Ver o qué faz o EFX quando está a ser executado - + Remove fixtures Remover fixtures - + Do you want to remove the selected fixture(s)? Deseja remover os fixtures seleccionados? @@ -2455,89 +2499,89 @@ O ficheiro seleccionado foi movido ou apagado. Reatribuir nome de fixtures - - + + (remapped) (remapeado) - + Import Fixtures List Importar lista de Fixtures - + Fixtures List (*%1) Lista de Fixtures (*%1) - + All Files (*.*) Todos os ficheiros (*.*) - + All Files (*) Todos os ficheiros (*) - + Do you want to automatically connect fixtures with the same name? - + Generic Dimmer Dimmer genérico - + Delete Fixtures Eliminar fixture - + Do you want to delete the selected items? Deseja eliminar os ítems seleccionados? - + Invalid operation Operação inválida - + You are trying to clone a fixture on an address already in use. Please fix the target list first. Está a tentar clonar um fixture para um endereço em uso. Por favor ajuste a lista de destino primeiro. - - - - + + + + Invalid selection Selecção inválida - - - + + + Please select a source and a target fixture or channel to perform this operation. confirmar Por favor, seleccione uma fonte e um destino do fixture ou o canal para realizar esta operação. - + To perform a fixture remap, please select fixtures on both lists. Para realizar la reasignación de fixtures, por favor seleccione fixtures en ambas listas. - + This might take a while... Isto pode demorar um pouco... - + Cancel Cancelar @@ -2550,12 +2594,12 @@ O ficheiro seleccionado foi movido ou apagado. Seleccionar fixture - + No fixtures available Sem fixtures disponíveis - + Go to the Fixture Manager and add some fixtures first. Ir primeiro ao Gestor de Fixtures e adicionar um fixture. @@ -2612,7 +2656,7 @@ O ficheiro seleccionado foi movido ou apagado. FunctionLiveEditDialog - + Function Live Edit Função Edição Ao Vivo @@ -2620,195 +2664,195 @@ O ficheiro seleccionado foi movido ou apagado. FunctionManager - + New &scene Nova &Cena - + New c&haser Novo c&hase - + New se&quence Nova &sequência - + New c&ollection Nova &colecção - + New E&FX Novo E&FX - + New &RGB Matrix Nova Matriz &RGB - + New scrip&t Novo srip&t - + New Scene Nova Cena - + New Chaser Novo Chase - + New Sequence Nova Sequência - + &Clone C&lonar - + New au&dio Novo au&dio - + New vid&eo - + New fo&lder Nova Pas&ta - + Select Startup Function Seleccionar Funçao de arranque - + Function &Wizard &Asistente de Funções - + &Delete &Eliminar - + Select &all Seleccionar &tudo - + New Collection Nova Colecção - + New EFX Novo EFX - + New RGB Matrix Nova Matriz RGB - + New Script Novo Script - + Open Audio File Abrir Ficheiro de Audio - + Audio Files (%1) Ficheiros de Audio (%1) - - + + All Files (*.*) Todos os ficheiros (*.*) - - + + All Files (*) Todos os ficheiros (*) - + Unsupported audio file Ficheiro de audio não suportado - + This audio file cannot be played with QLC+. Sorry. Pedimos desculpa, mas este ficheiro de audio não pode ser reproduzido com o QLC+. - + Open Video File - + Video Files (%1) - + Unsupported video file - + This video file cannot be played with QLC+. Sorry. - + Do you want to DELETE folder: Do you want to DELETE foler: Deseja ELIMINAR a pasta: - + Do you want to DELETE functions: Deseja ELIMINAR as funções: - + (This will also DELETE: (Isto também APAGARÁ: - + Delete Functions Eliminar Funções - + Function Função - + (Copy) (Copiar) @@ -3095,32 +3139,32 @@ p, li { white-space: pre-wrap; } Eliminar - + %1 group %1 grupo - + Error Erro - + %1 has no capability supported by this wizard. %1 não tem capacidades suportadas por este assistente. - + Presets solo frame Moldura solo de presets - + Click & Go RGB RGB Click & Go - + Click & Go Macro Macro Click & Go @@ -3128,27 +3172,27 @@ p, li { white-space: pre-wrap; } GrandMasterSlider - + GM GM - + Grand Master <B>limits</B> the maximum value of Grand Master <B>limita</B> o valor máximo de - + Grand Master <B>reduces</B> the current value of Grand Master <B>reduz</B> o valor actual de - + intensity channels intensidade dos canais - + all channels todos os canais @@ -3249,45 +3293,45 @@ p, li { white-space: pre-wrap; } InputOutputManager - + Add U&niverse Adicionar U&niverso - + &Delete Universe Universe &Apagar universo - + Universe name: Nome do Universo: - + Passthrough Saltar - - + + Universe %1 Universo %1 - - + + Delete Universe Apagar Universo - + The universe you are trying to delete is patched. Are you sure you want to delete it? O universo que está a tentar apagar tem patch efectuado. Tem a certeza que deseja apagá-lo? - + There are some fixtures using the universe you are trying to delete. Are you sure you want to delete it? Existem alguns fixtures a usar o universo que está a tentar apagar. Tem a certeza que deseja apagá-lo? @@ -3394,87 +3438,87 @@ p, li { white-space: pre-wrap; } - - - + + + Error Erro - - + + Output line already assigned Linha de saída já atribuída - + An error occurred while trying to open the selected device line. This can be caused either by a wrong system configuration or an unsupported input/output mode. Please refer to the plugins documentation to troubleshoot this. - - + + Existing Input Profile Perfil de entrada existente - - + + An input profile at %1 already exists. Do you wish to overwrite it? Um perfil de Entrada em %1 já existe. Deseja substitui-lo? - - + + Save Input Profile Guardar o perfil de Entrada - - + + Input Profiles (*.qxi) Perfis de Entrada (*.qxi) - - + + Saving failed Erro ao Guardar - + Unable to save the profile to %1 Não é possível guardar o perfil em %1 - + Delete profile Eliminar perfil - + Do you wish to permanently delete profile "%1"? Deseja eliminar permanentemente este perfil "%1"? - + File deletion failed Erro ao eliminar o ficheiro - + Unable to delete file %1 Não é possível apagar o ficheiro%1 - + Unable to save %1 to %2 Não é possível guardar %1 em %2 - + Default device Dispositivo por defeito @@ -3487,177 +3531,234 @@ Please refer to the plugins documentation to troubleshoot this. Editor de Perfil de Entrada - + General Geral - + Manufacturer Fabricante - + The name of the company that made the device Nome da companhia fabricante do dispositivo - + Model Modelo - + The device's model name Nome do modelo do dispositivo - - Channels - Canais - - - + + Channel Canal - + + Name Nome - + Custom feedback - + Upper value - + Lower value - - + + Type Tipo - + MIDI Global Settings - + When MIDI notes are used, send a Note Off when value is 0 - - + + Input Mapping + + + + Behaviour - + Add a new channel description Adicionar descrição para o canal novo - + + + MIDI channel + + + + + Colors + + + + + Remove the selected color + + + + + Add a new color + + + + + Value + + + + + Label + Etiqueta + + + + Color + + + + + MIDI Channels + + + + + Add a new MIDI channel + + + + + Remove the selected MIDI channel + + + + Remove the selected channels Eliminar os canais seleccionados - + Edit the selected channel Editar canal seleccionado - + Automatically add channels to the list when you wiggle the device's controls procurar melhor tradução Adicionar automaticamente canais à lista quando mover os controlos do dispositivo - + Movement Movimento - + Absolute - + Relative Relativo - + Generate an extra Press/Release when toggled - + Sensitivity - + File not writable Ficheiro só de leitura - + You do not have permission to write to the file %1. You might not be able to save your modifications to the profile. Não tem permissão para escrever no ficheiro %1. Poderá não ser possível guardar as modificações no perfil. - + + From plugin settings + + + + Missing information Informação em falta - + Manufacturer and/or model name is missing. Falta nome do fabricante e/ou do modelo. - - + + Channel already exists Canal já existe - - + + Channel %1 already exists Canal %1 já existe - + Delete channels Eliminar canais - + Delete all %1 selected channels? Eliminar todos os %1 canais seleccionados? - + Channel wizard activated Asistente de Canais activado - + You have enabled the input channel wizard. After clicking OK, wiggle your mapped input profile's controls. They should appear into the list. Click the wizard button again to stop channel auto-detection. Note that the wizard cannot tell the difference between a knob and a slider so you will have to do the change manually. @@ -3667,12 +3768,39 @@ Note that the wizard cannot tell the difference between a knob and a slider so y Note que o assistente não diferencia entre uma roda e um fader pelo que terá de efectuar a alteração manualmente. - + + + Enter value + + + + + Feedback value + + + + + + Enter label + + + + + Color label + + + + + MIDI channel label + + + + Button %1 Botão %1 - + Slider %1 Fader %1 @@ -3705,65 +3833,50 @@ Note que o assistente não diferencia entre uma roda e um fader pelo que terá d Entrada externa - + When toggled, you can click an external button to assign it to this widget. Quando activo, pode pressionar um botão externo para para o atribuir a este widget. - + Auto Detect Detectar automaticamente - + Input Universe Universo de entrada - + Input Channel Canal de entrada - + The input universe that sends data to this widget O universo de entrada que envia dados a este widget - + Custom Feedback - + The particular input channel within the input universe that sends data to this widget O canal de entrada dentro do universo de entrada que envia dados a este widget - + Choose an external input universe & channel that this widget should listen to. Seleccionar um universo de Entrada e um canal externos que este widget deve escutar. - + Choose... Seleccionar... - - - Custom feedback - - - - - Lower value - - - - - Upper value - - Monitor @@ -3920,14 +4033,14 @@ Note que o assistente não diferencia entre uma roda e um fader pelo que terá d - - + + Select background image Seleccionar imagem de fundo - - + + Images @@ -4217,12 +4330,12 @@ Note que o assistente não diferencia entre uma roda e um fader pelo que terá d PlaybackSlider - + Select Seleccionar - + Flash Flash @@ -4238,34 +4351,29 @@ Note que o assistente não diferencia entre uma roda e um fader pelo que terá d QObject - + Operate Operação - + Design Edição - - + + Reversed Invertido - + Page: %1 Página: %1 RDMManager - - - Form - - Scan for RDM devices... @@ -4686,22 +4794,22 @@ Note que o assistente não diferencia entre uma roda e um fader pelo que terá d Nenhum - + No fixture group to control Nenhum grupo de fixtures para controlar - + Select image Seleccionar imagem - + Images - + Sequence @@ -4761,105 +4869,105 @@ Note que o assistente não diferencia entre uma roda e um fader pelo que terá d Desactivar todos os canais de todos os fixtures - + Enable all channels in current fixture Activar todos os canais deste fixture - + Disable all channels in current fixture Desactivar todos os canais deste fixture - + Copy current values to clipboard Copiar os valores actuais para a área de tranferência - + Paste clipboard values to current fixture Colar os valores da área de transferência para o fixture actual - + Copy current values to all fixtures Copiar os valores actuais para todos os fixtures - + Color tool for CMY/RGB-capable fixtures Ferramenta de cor para fixtures com capacidade CMY/RGB - + Position tool for moving heads/scanners - + Switch between tab view and all channels view Pasar de la vista de pestañas a la vista de canales - + Toggle blind mode Activar/Desactivar Modo Blind - + Show/Hide speed dial window Mostrar/Ocultar janela de selector de velocidade - + Clone this scene and append as a new step to the selected chaser Clonar esta cena e adiconá-la como um novo passo nol chase seleccionado - + Go to next fixture tab Ir para a aba do fixture seguinte - + Go to previous fixture tab Ir para a aba do fixture anterior - + None Nenhum - + Scene name: Nome da cena: + - All fixtures Todos os fixtures + - Channels Groups Grupos de Canais + - Generic Genérico - + Remove fixtures Remover fixtures - + Do you want to remove the selected fixture(s)? Deseja eliminar o(s) fixture(s) seleccionado(s)? @@ -5068,7 +5176,7 @@ Note que o assistente não diferencia entre uma roda e um fader pelo que terá d - + <Double click here to enter channel number manually> <Duplo clique aqui para introduzir manualmente o número do canal> @@ -5371,118 +5479,118 @@ Duration: %3 SimpleDesk - + Universe Universo - + Next page Página seguinte - + Current page Página Actual - + Previous page Página Anterior - + View mode Modo Vista - + Reset universe Reiniciar universo - + Playback Reproduzir - - + + Cue Stack Cue Stack - + Previous cue Cue Anterior - + Stop cue stack Parar cue stack - + Next cue Próxima Cue - + Clone cue stack Clonar cue stack - + Edit cue stack Editar Cue Stack - + Record cue Guardar Cue - + Channel groups - + Cue Stack - Playback %1 Cue Stack - Reproduzir %1 - + No selection Nenhuma selecção - + Cue name Nome da Cue - + Multiple Cues Cues múltiplas - + Delete cue Eliminar Cue - + Clone Cue Stack Clonar Cue stack - + Clone To Playback# Clonar para Reproduzção# - + Cue %1 Cue %1 @@ -5490,32 +5598,32 @@ Duration: %3 SpeedDial - + Hours Horas - + Minutes Minutos - + Seconds Segundos - + Milliseconds Milisegundos - + Infinite Infinito - + Tap Tap @@ -5523,17 +5631,17 @@ Duration: %3 SpeedDialWidget - + Fade In Fade In - + Fade Out Fade Out - + Hold Pausa @@ -5623,17 +5731,17 @@ Duration: %3 VCButton - + Choose... Seleccionar... - + None Nenhum - + Button %1 Botão %1 @@ -5648,17 +5756,17 @@ Duration: %3 Imagens (%1) - + Toggle Blackout Activar/Desactivar Blackout - + Stop ALL functions! Parar TODAS as funções! - + Icon Ícone @@ -5671,67 +5779,77 @@ Duration: %3 Propriedades de Botão - + + Override priority + + + + + Force LTP + + + + General Geral - + Button label Etiqueta de Botão - + Text to display on the button Texto a mostrar no botão - + Function Função - + The function that this button controls A função que este botão controla - + Attach a function to this button Anexar uma função a este botão - + Detach the button's function attachment Liberta a função atribuida ao botão - + Toggle Blackout Blackout On/Off - + Stop All Functions Parar TODAS as funções - + Fade time: - + Adjust function intensity when it is running Ajusta a intensidade da funçõ quando está a ser executada - + Adjust Function Intensity Ajustar a intensidade da função - + Function's adjusted intensity percentage when run Percentagem de intensidade de função ajustada quando executa @@ -5751,17 +5869,17 @@ Duration: %3 Modo Interruptor On/Off - + Flash the assigned function with this button Activa a função que foi atribuída enquanto o botão estiver pressionado - + Flash function (only for scenes) Modo Flash (só para cenas) - + No function Sem função @@ -5852,64 +5970,64 @@ Duration: %3 VCCueList - + Show/Hide crossfade sliders Mostrar/ocultar os faders de crossfade - - + + Play/Pause Cue list - - + + Stop Cue list - + Go to previous step in the list Ir para o passo anterior da lista - + Go to next step in the list Ir para o passo seguinte da lista - + Cue list Cue list - + Play/Stop Cue list - + Pause Cue list - + Fade In Fade In - + Fade Out Fade Out - + Duration Duração - + Notes Notas @@ -6075,7 +6193,7 @@ Duration: %3 VCFrame - + Add Adicionar @@ -6128,17 +6246,17 @@ Duration: %3 - + External Input - Enable - + External Input - Previous Page - + External Input - Next Page @@ -6171,17 +6289,17 @@ Duration: %3 VCLabel - + Label Etiqueta - + Rename Label Renomear Etiqueta - + Caption: Legenda: @@ -6189,42 +6307,42 @@ Duration: %3 VCMatrix - + Animation %1 Animação %1 - + End Color Reset - + Start color Red component - + Start color Green component - + Start color Blue component - + End color Red component - + End color Green component - + End color Blue component @@ -6427,48 +6545,48 @@ Duration: %3 - + No function Sem função - + Start Color - + Start Color Knob - + End Color - + End Color Knob - + End Color Reset - + Animation - - + + Text - + Enter a text @@ -6720,12 +6838,12 @@ Duration: %3 VCSlider - + Slider %1 Fader %1 - + Reset channels override @@ -6743,42 +6861,42 @@ Duration: %3 Geral - + Name of the slider Nome do fader - + Value display style Estilo de visualização dos valores - + Show exact DMX values Mostrar o valor DMX exacto - + Show value as percentage Mostrar valor em percentagem - + Percentage Percentagem - + Slider movement Movimento do fader - + Normal Normal - + Inverted Invertido @@ -6854,32 +6972,32 @@ Duration: %3 Alterar para Modo de Reprodução - + Actual Actual - + Widget name Nome do Widget - + Widget appearance Aparência do widget - + Slider Fader - + Knob Roda - + Catch up with the external controller input value @@ -7277,17 +7395,17 @@ Duration: %3 - + Multiply by 2 Input - + Divide by 2 Input - + Factor Reset Input @@ -7295,68 +7413,68 @@ Duration: %3 VCWidget - + Button Botão - + Slider Fader - + XYPad XY Pad - + Frame Moldura - + Solo frame Moldura Solo - + Speed dial Selector de velocidade - + Cue list Lista de Cues - + Label Etiqueta - + Audio Triggers - + Animation - + Clock Relógio + - Unknown Desconhecido - + This widget has no properties Este widget não tem propriedades @@ -7554,12 +7672,12 @@ Duration: %3 - + Pan / Horizontal Axis Pan / Eixo Horizontal - + Tilt / Vertical Axis Tilt / Eixo Vertical @@ -7589,44 +7707,44 @@ Duration: %3 Editar os eixos do fixture seleccionado - + Width Largura - + Height Altura - + Remove fixtures Remover fixtures - + Do you want to remove the selected fixtures? Deseja eliminar os fixtures seleccionados? - - + + Error Erro - + The selected Scene does not include any Pan or Tilt channel. Please select one with such channels. - + Please select at least one fixture or head to create this type of preset! - + Fixture Group Grupo de Fixtures @@ -7759,12 +7877,12 @@ Please select one with such channels. VideoItem - + Fullscreen - + Screen %1 diff --git a/ui/src/qlcui.qrc b/ui/src/qlcui.qrc index d6195acb38..ab3a2c33b0 100644 --- a/ui/src/qlcui.qrc +++ b/ui/src/qlcui.qrc @@ -82,6 +82,8 @@ ../../resources/icons/png/laser.png ../../resources/icons/png/ledbar_beams.png ../../resources/icons/png/ledbar_pixels.png + ../../resources/icons/png/lightning.png + ../../resources/icons/png/lightning_off.png ../../resources/icons/png/liveedit.png ../../resources/icons/png/liveedit_vc.png ../../resources/icons/png/lock.png diff --git a/ui/src/rdmmanager.ui b/ui/src/rdmmanager.ui index 1f1bb91e5c..369c9299f0 100644 --- a/ui/src/rdmmanager.ui +++ b/ui/src/rdmmanager.ui @@ -6,12 +6,12 @@ 0 0 - 396 + 402 617 - Form + diff --git a/ui/src/rgbmatrixeditor.cpp b/ui/src/rgbmatrixeditor.cpp index 25ec5f4c4b..ee0844b2ae 100644 --- a/ui/src/rgbmatrixeditor.cpp +++ b/ui/src/rgbmatrixeditor.cpp @@ -194,8 +194,8 @@ void RGBMatrixEditor::init() this, SLOT(slotSaveToSequenceClicked())); connect(m_shapeButton, SIGNAL(toggled(bool)), this, SLOT(slotShapeToggle(bool))); - connect(m_patternCombo, SIGNAL(activated(const QString&)), - this, SLOT(slotPatternActivated(const QString&))); + connect(m_patternCombo, SIGNAL(activated(int)), + this, SLOT(slotPatternActivated(int))); connect(m_fixtureGroupCombo, SIGNAL(activated(int)), this, SLOT(slotFixtureGroupActivated(int))); connect(m_blendModeCombo, SIGNAL(activated(int)), @@ -212,14 +212,14 @@ void RGBMatrixEditor::init() this, SLOT(slotTextEdited(const QString&))); connect(m_fontButton, SIGNAL(clicked()), this, SLOT(slotFontButtonClicked())); - connect(m_animationCombo, SIGNAL(activated(const QString&)), - this, SLOT(slotAnimationActivated(const QString&))); + connect(m_animationCombo, SIGNAL(activated(int)), + this, SLOT(slotAnimationActivated(int))); connect(m_imageEdit, SIGNAL(editingFinished()), this, SLOT(slotImageEdited())); connect(m_imageButton, SIGNAL(clicked()), this, SLOT(slotImageButtonClicked())); - connect(m_imageAnimationCombo, SIGNAL(activated(const QString&)), - this, SLOT(slotImageAnimationActivated(const QString&))); + connect(m_imageAnimationCombo, SIGNAL(activated(int)), + this, SLOT(slotImageAnimationActivated(int))); connect(m_xOffsetSpin, SIGNAL(valueChanged(int)), this, SLOT(slotOffsetSpinChanged())); connect(m_yOffsetSpin, SIGNAL(valueChanged(int)), @@ -721,9 +721,10 @@ void RGBMatrixEditor::slotDialDestroyed(QObject *) m_speedDialButton->setChecked(false); } -void RGBMatrixEditor::slotPatternActivated(const QString& text) +void RGBMatrixEditor::slotPatternActivated(int patternIndex) { - RGBAlgorithm* algo = RGBAlgorithm::algorithm(m_doc, text); + QString algoName = m_patternCombo->itemText(patternIndex); + RGBAlgorithm *algo = RGBAlgorithm::algorithm(m_doc, algoName); if (algo != NULL) algo->setColors(m_matrix->startColor(), m_matrix->endColor()); m_matrix->setAlgorithm(algo); @@ -808,7 +809,7 @@ void RGBMatrixEditor::slotTextEdited(const QString& text) { if (m_matrix->algorithm() != NULL && m_matrix->algorithm()->type() == RGBAlgorithm::Text) { - RGBText* algo = static_cast (m_matrix->algorithm()); + RGBText *algo = static_cast (m_matrix->algorithm()); Q_ASSERT(algo != NULL); { QMutexLocker algorithmLocker(&m_matrix->algorithmMutex()); @@ -822,7 +823,7 @@ void RGBMatrixEditor::slotFontButtonClicked() { if (m_matrix->algorithm() != NULL && m_matrix->algorithm()->type() == RGBAlgorithm::Text) { - RGBText* algo = static_cast (m_matrix->algorithm()); + RGBText *algo = static_cast (m_matrix->algorithm()); Q_ASSERT(algo != NULL); bool ok = false; @@ -838,14 +839,15 @@ void RGBMatrixEditor::slotFontButtonClicked() } } -void RGBMatrixEditor::slotAnimationActivated(const QString& text) +void RGBMatrixEditor::slotAnimationActivated(int index) { if (m_matrix->algorithm() != NULL && m_matrix->algorithm()->type() == RGBAlgorithm::Text) { - RGBText* algo = static_cast (m_matrix->algorithm()); + RGBText *algo = static_cast (m_matrix->algorithm()); Q_ASSERT(algo != NULL); { QMutexLocker algorithmLocker(&m_matrix->algorithmMutex()); + QString text = m_animationCombo->itemText(index); algo->setAnimationStyle(RGBText::stringToAnimationStyle(text)); } slotRestartTest(); @@ -856,7 +858,7 @@ void RGBMatrixEditor::slotImageEdited() { if (m_matrix->algorithm() != NULL && m_matrix->algorithm()->type() == RGBAlgorithm::Image) { - RGBImage* algo = static_cast (m_matrix->algorithm()); + RGBImage *algo = static_cast (m_matrix->algorithm()); Q_ASSERT(algo != NULL); { QMutexLocker algorithmLocker(&m_matrix->algorithmMutex()); @@ -870,7 +872,7 @@ void RGBMatrixEditor::slotImageButtonClicked() { if (m_matrix->algorithm() != NULL && m_matrix->algorithm()->type() == RGBAlgorithm::Image) { - RGBImage* algo = static_cast (m_matrix->algorithm()); + RGBImage *algo = static_cast (m_matrix->algorithm()); Q_ASSERT(algo != NULL); QString path = algo->filename(); @@ -890,14 +892,15 @@ void RGBMatrixEditor::slotImageButtonClicked() } } -void RGBMatrixEditor::slotImageAnimationActivated(const QString& text) +void RGBMatrixEditor::slotImageAnimationActivated(int index) { if (m_matrix->algorithm() != NULL && m_matrix->algorithm()->type() == RGBAlgorithm::Image) { - RGBImage* algo = static_cast (m_matrix->algorithm()); + RGBImage *algo = static_cast (m_matrix->algorithm()); Q_ASSERT(algo != NULL); { QMutexLocker algorithmLocker(&m_matrix->algorithmMutex()); + QString text = m_imageAnimationCombo->itemText(index); algo->setAnimationStyle(RGBImage::stringToAnimationStyle(text)); } slotRestartTest(); @@ -908,7 +911,7 @@ void RGBMatrixEditor::slotOffsetSpinChanged() { if (m_matrix->algorithm() != NULL && m_matrix->algorithm()->type() == RGBAlgorithm::Text) { - RGBText* algo = static_cast (m_matrix->algorithm()); + RGBText *algo = static_cast (m_matrix->algorithm()); Q_ASSERT(algo != NULL); { QMutexLocker algorithmLocker(&m_matrix->algorithmMutex()); @@ -920,7 +923,7 @@ void RGBMatrixEditor::slotOffsetSpinChanged() if (m_matrix->algorithm() != NULL && m_matrix->algorithm()->type() == RGBAlgorithm::Image) { - RGBImage* algo = static_cast (m_matrix->algorithm()); + RGBImage *algo = static_cast (m_matrix->algorithm()); Q_ASSERT(algo != NULL); { QMutexLocker algorithmLocker(&m_matrix->algorithmMutex()); diff --git a/ui/src/rgbmatrixeditor.h b/ui/src/rgbmatrixeditor.h index 03431b6b8e..4f0abf863c 100644 --- a/ui/src/rgbmatrixeditor.h +++ b/ui/src/rgbmatrixeditor.h @@ -73,7 +73,7 @@ private slots: void slotPreviewTimeout(); void slotNameEdited(const QString& text); void slotSpeedDialToggle(bool state); - void slotPatternActivated(const QString& text); + void slotPatternActivated(int patternIndex); void slotFixtureGroupActivated(int index); void slotBlendModeChanged(int index); void slotControlModeChanged(int index); @@ -83,12 +83,12 @@ private slots: void slotTextEdited(const QString& text); void slotFontButtonClicked(); - void slotAnimationActivated(const QString& text); + void slotAnimationActivated(int index); void slotOffsetSpinChanged(); void slotImageEdited(); void slotImageButtonClicked(); - void slotImageAnimationActivated(const QString& text); + void slotImageAnimationActivated(int index); void slotLoopClicked(); void slotPingPongClicked(); diff --git a/ui/src/showmanager/multitrackview.h b/ui/src/showmanager/multitrackview.h index eca3ac08fe..d3aba100a3 100644 --- a/ui/src/showmanager/multitrackview.h +++ b/ui/src/showmanager/multitrackview.h @@ -32,9 +32,7 @@ #include "trackitem.h" #include "audioitem.h" #include "efxitem.h" -#if QT_VERSION >= 0x050000 #include "videoitem.h" -#endif #include "chaser.h" #include "track.h" diff --git a/ui/src/showmanager/showmanager.cpp b/ui/src/showmanager/showmanager.cpp index ea16be7bc5..be0d9df680 100644 --- a/ui/src/showmanager/showmanager.cpp +++ b/ui/src/showmanager/showmanager.cpp @@ -63,6 +63,7 @@ ShowManager::ShowManager(QWidget* parent, Doc* doc) , m_currentEditor(NULL) , m_editorFunctionID(Function::invalidId()) , m_selectedShowIndex(-1) + , cursorMovedDuringPause(false) , m_splitter(NULL) , m_vsplitter(NULL) , m_showview(NULL) @@ -1201,6 +1202,7 @@ void ShowManager::slotStartPlayback() if (m_show->isRunning() == false) { + cursorMovedDuringPause = false; m_show->start(m_doc->masterTimer(), functionParent(), m_showview->getTimeFromCursor()); m_playAction->setIcon(QIcon(":/player_pause.png")); } @@ -1209,7 +1211,17 @@ void ShowManager::slotStartPlayback() if (m_show->isPaused()) { m_playAction->setIcon(QIcon(":/player_pause.png")); - m_show->setPause(false); + if (cursorMovedDuringPause) + { + m_show->stop(functionParent()); + m_show->stopAndWait(); + cursorMovedDuringPause = false; + m_show->start(m_doc->masterTimer(), functionParent(), m_showview->getTimeFromCursor()); + } + else + { + m_show->setPause(false); + } } else { @@ -1338,7 +1350,7 @@ void ShowManager::slotShowItemMoved(ShowItem *item, quint32 time, bool moved) m_doc->setModified(); } -void ShowManager::slotupdateTimeAndCursor(quint32 msec_time) +void ShowManager::slotUpdateTimeAndCursor(quint32 msec_time) { //qDebug() << Q_FUNC_INFO << "time: " << msec_time; slotUpdateTime(msec_time); @@ -1369,6 +1381,9 @@ void ShowManager::slotUpdateTime(quint32 msec_time) .arg(s, 2, 10, QChar('0')).arg(msec_time / 10, 2, 10, QChar('0')); m_timeLabel->setText(str); + + if (m_show != NULL && m_show->isPaused()) + cursorMovedDuringPause = true; } void ShowManager::slotTrackClicked(Track *track) @@ -1636,7 +1651,7 @@ void ShowManager::updateMultiTrackView() m_timeDivisionCombo->setCurrentIndex(tIdx); connect(m_bpmField, SIGNAL(valueChanged(int)), this, SLOT(slotBPMValueChanged(int))); - connect(m_show, SIGNAL(timeChanged(quint32)), this, SLOT(slotupdateTimeAndCursor(quint32))); + connect(m_show, SIGNAL(timeChanged(quint32)), this, SLOT(slotUpdateTimeAndCursor(quint32))); connect(m_show, SIGNAL(showFinished()), this, SLOT(slotStopPlayback())); connect(m_show, SIGNAL(stopped(quint32)), this, SLOT(slotShowStopped())); diff --git a/ui/src/showmanager/showmanager.h b/ui/src/showmanager/showmanager.h index a19d60e424..822ce39475 100644 --- a/ui/src/showmanager/showmanager.h +++ b/ui/src/showmanager/showmanager.h @@ -74,19 +74,19 @@ class ShowManager : public QWidget void hideEvent(QHideEvent* ev); protected: - static ShowManager* s_instance; + static ShowManager *s_instance; - Doc* m_doc; + Doc *m_doc; /** Currently selected show */ - Show* m_show; + Show *m_show; /** Currently selected track */ Track *m_currentTrack; /** Currently selected scene */ - Scene* m_currentScene; + Scene *m_currentScene; /** Scene editor instance reference */ - QWidget* m_sceneEditor; + QWidget *m_sceneEditor; /** Right editor instance reference (can edit Chaser, Audio, Video) */ - QWidget* m_currentEditor; + QWidget *m_currentEditor; /** ID of the Function currently edited on the right */ quint32 m_editorFunctionID; @@ -94,14 +94,17 @@ class ShowManager : public QWidget * (basically the m_showsCombo index) */ int m_selectedShowIndex; + /** Track if cursor is interactively being moved during pause */ + bool cursorMovedDuringPause; + private: void showSceneEditor(Scene *scene); void hideRightEditor(); void showRightEditor(Function *function); private: - QSplitter* m_splitter; // main view splitter (horizontal) - QSplitter* m_vsplitter; // multitrack view splitter (vertical) + QSplitter *m_splitter; // main view splitter (horizontal) + QSplitter *m_vsplitter; // multitrack view splitter (vertical) MultiTrackView *m_showview; /********************************************************************* @@ -116,25 +119,25 @@ class ShowManager : public QWidget private: bool checkOverlapping(quint32 startTime, quint32 duration); - QToolBar* m_toolbar; - QComboBox* m_showsCombo; - QLabel* m_timeLabel; - QAction* m_addShowAction; - QAction* m_addTrackAction; - QAction* m_addSequenceAction; - QAction* m_addAudioAction; - QAction* m_addVideoAction; - QAction* m_copyAction; - QAction* m_pasteAction; - QAction* m_deleteAction; - QAction* m_colorAction; - QAction* m_lockAction; - QAction* m_timingsAction; - QAction* m_snapGridAction; - QAction* m_stopAction; - QAction* m_playAction; - QComboBox* m_timeDivisionCombo; - QSpinBox* m_bpmField; + QToolBar *m_toolbar; + QComboBox *m_showsCombo; + QLabel *m_timeLabel; + QAction *m_addShowAction; + QAction *m_addTrackAction; + QAction *m_addSequenceAction; + QAction *m_addAudioAction; + QAction *m_addVideoAction; + QAction *m_copyAction; + QAction *m_pasteAction; + QAction *m_deleteAction; + QAction *m_colorAction; + QAction *m_lockAction; + QAction *m_timingsAction; + QAction *m_snapGridAction; + QAction *m_stopAction; + QAction *m_playAction; + QComboBox *m_timeDivisionCombo; + QSpinBox *m_bpmField; protected slots: /** Slot called when the user selects a show from @@ -176,7 +179,7 @@ protected slots: void slotShowItemMoved(ShowItem *item, quint32 time, bool moved); void slotUpdateTime(quint32 msec_time); - void slotupdateTimeAndCursor(quint32 msec_time); + void slotUpdateTimeAndCursor(quint32 msec_time); void slotTrackClicked(Track *track); void slotTrackDoubleClicked(Track *track); void slotTrackMoved(Track *track, int direction); diff --git a/ui/src/src.pro b/ui/src/src.pro index 33a6a456c7..8f80738cca 100644 --- a/ui/src/src.pro +++ b/ui/src/src.pro @@ -68,7 +68,7 @@ HEADERS += aboutbox.h \ createfixturegroup.h \ ctkrangeslider.h \ cuestackmodel.h \ - docbrowser.h \ + customfeedbackdialog.h \ dmxdumpfactory.h \ efxeditor.h \ efxpreviewarea.h \ @@ -187,6 +187,7 @@ FORMS += aboutbox.ui \ channelsselection.ui \ collectioneditor.ui \ createfixturegroup.ui \ + customfeedbackdialog.ui \ dmxdumpfactory.ui \ efxeditor.ui \ fixturegroupeditor.ui \ @@ -249,7 +250,7 @@ SOURCES += aboutbox.cpp \ createfixturegroup.cpp \ ctkrangeslider.cpp \ cuestackmodel.cpp \ - docbrowser.cpp \ + customfeedbackdialog.cpp \ dmxdumpfactory.cpp \ efxeditor.cpp \ efxpreviewarea.cpp \ diff --git a/ui/src/videoprovider.cpp b/ui/src/videoprovider.cpp index fdeef53c7a..47fa5320e1 100644 --- a/ui/src/videoprovider.cpp +++ b/ui/src/videoprovider.cpp @@ -20,6 +20,7 @@ #include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include + #include #endif #include #include @@ -84,6 +85,8 @@ VideoWidget::VideoWidget(Video *video, QObject *parent) m_videoPlayer = new QMediaPlayer(this, QMediaPlayer::VideoSurface); #else m_videoPlayer = new QMediaPlayer(this); + m_audioOutput = new QAudioOutput(this); + m_videoPlayer->setAudioOutput(m_audioOutput); #endif m_videoPlayer->moveToThread(QCoreApplication::instance()->thread()); diff --git a/ui/src/videoprovider.h b/ui/src/videoprovider.h index 748266d396..be53ede371 100644 --- a/ui/src/videoprovider.h +++ b/ui/src/videoprovider.h @@ -60,6 +60,9 @@ protected slots: QMediaPlayer *m_videoPlayer; /** Qt widget that actually displays the video */ QVideoWidget *m_videoWidget; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + QAudioOutput *m_audioOutput; +#endif private: FunctionParent functionParent() const; diff --git a/ui/src/virtualconsole/vcaudiotriggers.cpp b/ui/src/virtualconsole/vcaudiotriggers.cpp index 8372727080..106186041b 100644 --- a/ui/src/virtualconsole/vcaudiotriggers.cpp +++ b/ui/src/virtualconsole/vcaudiotriggers.cpp @@ -181,6 +181,8 @@ void VCAudioTriggers::enableCapture(bool enable) { connect(m_inputCapture, SIGNAL(dataProcessed(double*,int,double,quint32)), this, SLOT(slotDisplaySpectrum(double*,int,double,quint32))); + connect(m_inputCapture, SIGNAL(volumeChanged(int)), + this, SLOT(slotUpdateVolumeSlider(int))); m_inputCapture->registerBandsNumber(m_spectrum->barsNumber()); m_button->blockSignals(true); @@ -199,6 +201,8 @@ void VCAudioTriggers::enableCapture(bool enable) m_inputCapture->unregisterBandsNumber(m_spectrum->barsNumber()); disconnect(m_inputCapture, SIGNAL(dataProcessed(double*,int,double,quint32)), this, SLOT(slotDisplaySpectrum(double*,int,double,quint32))); + disconnect(m_inputCapture, SIGNAL(volumeChanged(int)), + this, SLOT(slotUpdateVolumeSlider(int))); } m_button->blockSignals(true); @@ -224,12 +228,13 @@ void VCAudioTriggers::slotEnableButtonToggled(bool toggle) return; enableCapture(toggle); + updateFeedback(); } void VCAudioTriggers::slotDisplaySpectrum(double *spectrumBands, int size, double maxMagnitude, quint32 power) { - qDebug() << "Display spectrum ----- bars:" << size; + //qDebug() << "Display spectrum ----- bars:" << size; if (size != m_spectrum->barsNumber()) return; @@ -254,12 +259,15 @@ void VCAudioTriggers::slotDisplaySpectrum(double *spectrumBands, int size, } } -#if QT_VERSION >= 0x050000 void VCAudioTriggers::slotVolumeChanged(int volume) { - m_doc->audioInputCapture()->setVolume(intensity() * (qreal)volume / 100); + m_doc->audioInputCapture()->setVolume(intensity() * qreal(volume) / 100.0); +} + +void VCAudioTriggers::slotUpdateVolumeSlider(int volume) +{ + m_volumeSlider->setValue(volume); } -#endif /********************************************************************* * DMXSource @@ -362,6 +370,18 @@ void VCAudioTriggers::slotKeyPressed(const QKeySequence& keySequence) } } +void VCAudioTriggers::updateFeedback() +{ + QSharedPointer src = inputSource(); + if (!src.isNull() && src->isValid() == true) + { + if (m_button->isChecked()) + sendFeedback(src->feedbackValue(QLCInputFeedback::UpperValue)); + else + sendFeedback(src->feedbackValue(QLCInputFeedback::LowerValue)); + } +} + void VCAudioTriggers::slotInputValueChanged(quint32 universe, quint32 channel, uchar value) { /* Don't let input data through in design mode or if disabled */ @@ -407,7 +427,6 @@ bool VCAudioTriggers::copyFrom(const VCWidget *widget) return VCWidget::copyFrom(widget); } - /************************************************************************* * VCWidget-inherited *************************************************************************/ @@ -529,7 +548,6 @@ void VCAudioTriggers::setSpectrumBarType(int index, int type) } } - void VCAudioTriggers::editProperties() { // make a backup copy of the current bars @@ -539,8 +557,7 @@ void VCAudioTriggers::editProperties() tmpSpectrumBars.append(bar->createCopy()); int barsNumber = m_spectrumBars.count(); - AudioTriggersConfiguration atc(this, m_doc, barsNumber, - AudioCapture::maxFrequency()); + AudioTriggersConfiguration atc(this, m_doc, barsNumber, AudioCapture::maxFrequency()); if (atc.exec() == QDialog::Rejected) { @@ -551,7 +568,9 @@ void VCAudioTriggers::editProperties() foreach (AudioBar *bar, tmpSpectrumBars) m_spectrumBars.append(bar); } + m_spectrum->setBarsNumber(m_spectrumBars.count()); + if (barsNumber != m_spectrumBars.count()) { QSharedPointer capture(m_doc->audioInputCapture()); @@ -562,15 +581,20 @@ void VCAudioTriggers::editProperties() { if (!captureIsNew) m_inputCapture->unregisterBandsNumber(barsNumber); + m_inputCapture->registerBandsNumber(m_spectrumBars.count()); + if (captureIsNew) + { connect(m_inputCapture, SIGNAL(dataProcessed(double*,int,double,quint32)), this, SLOT(slotDisplaySpectrum(double*,int,double,quint32))); + connect(m_inputCapture, SIGNAL(volumeChanged(qreal)), + this, SLOT(slotUpdateVolumeSlider(int))); + } } } } - void VCAudioTriggers::adjustIntensity(qreal val) { VCWidget::adjustIntensity(val); @@ -708,7 +732,3 @@ bool VCAudioTriggers::saveXML(QXmlStreamWriter *doc) return true; } - - - - diff --git a/ui/src/virtualconsole/vcaudiotriggers.h b/ui/src/virtualconsole/vcaudiotriggers.h index 0284a0f87c..f838f2afef 100644 --- a/ui/src/virtualconsole/vcaudiotriggers.h +++ b/ui/src/virtualconsole/vcaudiotriggers.h @@ -81,9 +81,8 @@ public slots: protected slots: void slotDisplaySpectrum(double *spectrumBands, int size, double maxMagnitude, quint32 power); -#if QT_VERSION >= 0x050000 void slotVolumeChanged(int volume); -#endif + void slotUpdateVolumeSlider(int volume); protected: QHBoxLayout *m_hbox; @@ -124,7 +123,7 @@ protected slots: * External Input *************************************************************************/ public: - void updateFeedback() { } + void updateFeedback(); protected slots: void slotInputValueChanged(quint32 universe, quint32 channel, uchar value); diff --git a/ui/src/virtualconsole/vcbutton.cpp b/ui/src/virtualconsole/vcbutton.cpp index 0fa251f0a0..d8bbc1873a 100644 --- a/ui/src/virtualconsole/vcbutton.cpp +++ b/ui/src/virtualconsole/vcbutton.cpp @@ -516,16 +516,18 @@ void VCButton::slotKeyReleased(const QKeySequence& keySequence) void VCButton::updateFeedback() { - if (m_state == Monitoring) - return; + //if (m_state == Monitoring) + // return; QSharedPointer src = inputSource(); if (!src.isNull() && src->isValid() == true) { if (m_state == Inactive) - sendFeedback(src->lowerValue()); + sendFeedback(src->feedbackValue(QLCInputFeedback::LowerValue), src, src->feedbackExtraParams(QLCInputFeedback::LowerValue)); + else if (m_state == Monitoring) + sendFeedback(src->feedbackValue(QLCInputFeedback::MonitorValue), src, src->feedbackExtraParams(QLCInputFeedback::MonitorValue)); else - sendFeedback(src->upperValue()); + sendFeedback(src->feedbackValue(QLCInputFeedback::UpperValue), src, src->feedbackExtraParams(QLCInputFeedback::UpperValue)); } } @@ -1115,7 +1117,7 @@ void VCButton::paintEvent(QPaintEvent* e) if (state() == Active) { - if(m_flashForceLTP || m_flashOverrides) + if (m_flashForceLTP || m_flashOverrides) painter.setBrush(QBrush(QColor(230, 0, 0, 255))); else painter.setBrush(QBrush(QColor(0, 230, 0, 255))); @@ -1147,7 +1149,7 @@ void VCButton::paintEvent(QPaintEvent* e) painter.setPen(QPen(QColor(255, 170, 0, 255), borderWidth)); else { - if(m_flashForceLTP || m_flashOverrides) + if (m_flashForceLTP || m_flashOverrides) painter.setPen(QPen(QColor(230, 0, 0, 255), borderWidth)); else painter.setPen(QPen(QColor(0, 230, 0, 255), borderWidth)); diff --git a/ui/src/virtualconsole/vcbuttonproperties.cpp b/ui/src/virtualconsole/vcbuttonproperties.cpp index 5b8359688c..9e6ed9c3a8 100644 --- a/ui/src/virtualconsole/vcbuttonproperties.cpp +++ b/ui/src/virtualconsole/vcbuttonproperties.cpp @@ -49,6 +49,7 @@ VCButtonProperties::VCButtonProperties(VCButton* button, Doc* doc) m_inputSelWidget = new InputSelectionWidget(m_doc, this); m_inputSelWidget->setCustomFeedbackVisibility(true); + m_inputSelWidget->setMonitoringSupport(true); m_inputSelWidget->setKeySequence(m_button->keySequence()); m_inputSelWidget->setInputSource(m_button->inputSource()); m_inputSelWidget->setWidgetPage(m_button->page()); diff --git a/ui/src/virtualconsole/vccuelist.cpp b/ui/src/virtualconsole/vccuelist.cpp index 3c5e4ad7f5..5b2e027764 100644 --- a/ui/src/virtualconsole/vccuelist.cpp +++ b/ui/src/virtualconsole/vccuelist.cpp @@ -880,6 +880,18 @@ void VCCueList::slotItemChanged(QTreeWidgetItem *item, int column) step.note = itemText; ch->replaceStep(step, idx); + + emit stepNoteChanged(idx, itemText); +} + +void VCCueList::slotStepNoteChanged(int idx, QString note) +{ + Chaser *ch = chaser(); + if (ch == NULL) + return; + ChaserStep step = ch->steps().at(idx); + step.note = note; + ch->replaceStep(step, idx); } void VCCueList::slotFunctionRunning(quint32 fid) diff --git a/ui/src/virtualconsole/vccuelist.h b/ui/src/virtualconsole/vccuelist.h index a084832ca2..0349c196d6 100644 --- a/ui/src/virtualconsole/vccuelist.h +++ b/ui/src/virtualconsole/vccuelist.h @@ -180,6 +180,12 @@ public slots: /** Skip to the previous cue */ void slotPreviousCue(); + /** Called when m_runner skips to another step */ + void slotCurrentStepChanged(int stepNumber); + + /** Update cue step note */ + void slotStepNoteChanged(int idx, QString note); + signals: /** progress percent value and text */ void progressStateChanged(); @@ -197,9 +203,6 @@ private slots: /** Update the step list at m_updateTimer timeout */ void slotUpdateStepList(); - /** Called when m_runner skips to another step */ - void slotCurrentStepChanged(int stepNumber); - /** Slot that is called whenever the current item changes (either by pressing the key binding or clicking an item with mouse) */ void slotItemActivated(QTreeWidgetItem *item); @@ -405,6 +408,8 @@ protected slots: /** Signal to webaccess */ void stepChanged(int idx); + void stepNoteChanged(int idx, QString note); + private: FunctionParent functionParent() const; diff --git a/ui/src/virtualconsole/vcframe.cpp b/ui/src/virtualconsole/vcframe.cpp index 571f725e1b..889e41edf9 100644 --- a/ui/src/virtualconsole/vcframe.cpp +++ b/ui/src/virtualconsole/vcframe.cpp @@ -123,6 +123,8 @@ void VCFrame::setDisableState(bool disable) } m_disableState = disable; + + emit disableStateChanged(disable); updateFeedback(); } @@ -748,14 +750,14 @@ void VCFrame::updateFeedback() { if (m_disableState == false) { - sendFeedback(src->upperValue(), enableInputSourceId); + sendFeedback(src->feedbackValue(QLCInputFeedback::UpperValue), enableInputSourceId); } else { // temporarily revert the disabled state otherwise this // feedback will never go through (cause of acceptsInput) m_disableState = false; - sendFeedback(src->lowerValue(), enableInputSourceId); + sendFeedback(src->feedbackValue(QLCInputFeedback::LowerValue), enableInputSourceId); m_disableState = true; } } @@ -766,9 +768,9 @@ void VCFrame::updateFeedback() if (!src.isNull() && src->isValid() == true) { if (m_currentPage == shortcut->m_page) - sendFeedback(src->upperValue(), src); + sendFeedback(src->feedbackValue(QLCInputFeedback::UpperValue), src); else - sendFeedback(src->lowerValue(), src); + sendFeedback(src->feedbackValue(QLCInputFeedback::LowerValue), src); } } diff --git a/ui/src/virtualconsole/vcframe.h b/ui/src/virtualconsole/vcframe.h index 0769ebf07b..be79eb197e 100644 --- a/ui/src/virtualconsole/vcframe.h +++ b/ui/src/virtualconsole/vcframe.h @@ -120,6 +120,9 @@ class VCFrame : public VCWidget QSize originalSize() const; +signals: + void disableStateChanged(bool disable); + protected slots: void slotCollapseButtonToggled(bool toggle); diff --git a/ui/src/virtualconsole/vcmatrix.cpp b/ui/src/virtualconsole/vcmatrix.cpp index bfc872f435..503b538a6d 100644 --- a/ui/src/virtualconsole/vcmatrix.cpp +++ b/ui/src/virtualconsole/vcmatrix.cpp @@ -536,7 +536,7 @@ void VCMatrix::slotUpdate() QString algorithmText; { - QMutexLocker(&matrix->algorithmMutex()); + QMutexLocker locker(&matrix->algorithmMutex()); RGBAlgorithm *algo = matrix->algorithm(); if (algo != NULL) @@ -820,6 +820,16 @@ QList VCMatrix::customControls() const return controls; } +QMap VCMatrix::customControlsMap() const +{ + QMap map; + + foreach (VCMatrixControl *control, m_controls.values()) + map.insert(control->m_id, VCMatrixControl::typeToString(control->m_type)); + + return map; +} + QWidget *VCMatrix::getWidget(VCMatrixControl* control) const { return m_widgets[control]; @@ -1013,8 +1023,8 @@ void VCMatrix::updateFeedback() { QPushButton* button = reinterpret_cast(it.key()); sendFeedback(button->isDown() ? - control->m_inputSource->upperValue() : - control->m_inputSource->lowerValue(), + control->m_inputSource->feedbackValue(QLCInputFeedback::UpperValue) : + control->m_inputSource->feedbackValue(QLCInputFeedback::LowerValue), control->m_inputSource); } } diff --git a/ui/src/virtualconsole/vcmatrix.h b/ui/src/virtualconsole/vcmatrix.h index f0b5787c4b..1926c1ce3b 100644 --- a/ui/src/virtualconsole/vcmatrix.h +++ b/ui/src/virtualconsole/vcmatrix.h @@ -229,6 +229,7 @@ private slots: void addCustomControl(VCMatrixControl const& control); void resetCustomControls(); QList customControls() const; + QMap customControlsMap() const; QWidget *getWidget(VCMatrixControl* control) const; protected slots: diff --git a/ui/src/virtualconsole/vcmatrixcontrol.cpp b/ui/src/virtualconsole/vcmatrixcontrol.cpp index 25879a5224..12472c373f 100644 --- a/ui/src/virtualconsole/vcmatrixcontrol.cpp +++ b/ui/src/virtualconsole/vcmatrixcontrol.cpp @@ -51,7 +51,9 @@ VCMatrixControl &VCMatrixControl::operator=(const VCMatrixControl &vcmc) { m_inputSource = QSharedPointer(new QLCInputSource(vcmc.m_inputSource->universe(), vcmc.m_inputSource->channel())); - m_inputSource->setRange(vcmc.m_inputSource->lowerValue(), vcmc.m_inputSource->upperValue()); + + m_inputSource->setFeedbackValue(QLCInputFeedback::LowerValue, vcmc.m_inputSource->feedbackValue(QLCInputFeedback::LowerValue)); + m_inputSource->setFeedbackValue(QLCInputFeedback::UpperValue, vcmc.m_inputSource->feedbackValue(QLCInputFeedback::UpperValue)); } } diff --git a/ui/src/virtualconsole/vcmatrixcontrol.h b/ui/src/virtualconsole/vcmatrixcontrol.h index dc718eb499..b71854b730 100644 --- a/ui/src/virtualconsole/vcmatrixcontrol.h +++ b/ui/src/virtualconsole/vcmatrixcontrol.h @@ -83,7 +83,7 @@ class VCMatrixControl * get the rgb value for this value of the knob */ QRgb valueToRgb(quint8 value) const; -protected: + static QString typeToString(ControlType type); static ControlType stringToType(QString str); diff --git a/ui/src/virtualconsole/vcslider.cpp b/ui/src/virtualconsole/vcslider.cpp index 0ff131fad7..fcfc70d0bb 100644 --- a/ui/src/virtualconsole/vcslider.cpp +++ b/ui/src/virtualconsole/vcslider.cpp @@ -59,6 +59,7 @@ const quint8 VCSlider::sliderInputSourceId = 0; const quint8 VCSlider::overrideResetInputSourceId = 1; +const quint8 VCSlider::flashButtonInputSourceId = 2; const QSize VCSlider::defaultSize(QSize(60, 200)); @@ -94,6 +95,8 @@ VCSlider::VCSlider(QWidget *parent, Doc *doc) , m_playbackFunction(Function::invalidId()) , m_playbackValue(0) , m_playbackChangeCounter(0) + , m_playbackFlashEnable(false) + , m_playbackIsFlashing(false) , m_externalMovement(false) , m_widgetMode(WSlider) , m_cngType(ClickAndGoWidget::None) @@ -174,6 +177,7 @@ VCSlider::VCSlider(QWidget *parent, Doc *doc) this, SLOT(slotMonitorDMXValueChanged(int))); m_resetButton = NULL; + m_flashButton = NULL; /* Bottom label */ m_bottomLabel = new QLabel(this); @@ -303,6 +307,8 @@ void VCSlider::enableWidgetUI(bool enable) m_cngButton->setEnabled(enable); if (m_resetButton) m_resetButton->setEnabled(enable); + if (m_flashButton) + m_flashButton->setEnabled(enable); if (enable == false) m_lastInputValue = -1; } @@ -572,6 +578,8 @@ QList VCSlider::levelChannels() void VCSlider::setLevelLowLimit(uchar value) { m_levelLowLimit = value; + if (m_cngWidget != NULL) + m_cngWidget->setLevelLowLimit(value); } uchar VCSlider::levelLowLimit() const @@ -582,6 +590,8 @@ uchar VCSlider::levelLowLimit() const void VCSlider::setLevelHighLimit(uchar value) { m_levelHighLimit = value; + if (m_cngWidget != NULL) + m_cngWidget->setLevelHighLimit(value); } uchar VCSlider::levelHighLimit() const @@ -762,6 +772,8 @@ void VCSlider::setupClickAndGoWidget() { const QLCChannel *chan = fxi->channel(lChan.channel); m_cngWidget->setType(m_cngType, chan); + m_cngWidget->setLevelLowLimit(this->levelLowLimit()); + m_cngWidget->setLevelHighLimit(this->levelHighLimit()); } } else @@ -804,7 +816,7 @@ void VCSlider::setClickAndGoWidgetFromLevel(uchar level) void VCSlider::slotClickAndGoLevelChanged(uchar level) { - setSliderValue(level); + setSliderValue(level, false, false); updateFeedback(); QColor col = m_cngWidget->getColorAt(level); @@ -832,7 +844,7 @@ void VCSlider::slotClickAndGoColorChanged(QRgb color) void VCSlider::slotClickAndGoLevelAndPresetChanged(uchar level, QImage img) { - setSliderValue(level); + setSliderValue(level, false, false); updateFeedback(); QPixmap px = QPixmap::fromImage(img); @@ -877,6 +889,51 @@ void VCSlider::slotKeyPressed(const QKeySequence &keySequence) if (m_overrideResetKeySequence == keySequence) slotResetButtonClicked(); + else if (m_playbackFlashKeySequence == keySequence) + flashPlayback(true); +} + +void VCSlider::slotKeyReleased(const QKeySequence &keySequence) +{ + if (m_playbackFlashKeySequence == keySequence && m_playbackIsFlashing) + flashPlayback(false); +} + +/********************************************************************* + * Flash button + *********************************************************************/ + +QKeySequence VCSlider::playbackFlashKeySequence() const +{ + return m_playbackFlashKeySequence; +} + +void VCSlider::setPlaybackFlashKeySequence(const QKeySequence &keySequence) +{ + m_playbackFlashKeySequence = QKeySequence(keySequence); +} + +void VCSlider::mousePressEvent(QMouseEvent *e) +{ + VCWidget::mousePressEvent(e); + + if (mode() != Doc::Design && e->button() == Qt::LeftButton && + m_flashButton && m_flashButton->isDown()) + { + flashPlayback(true); + } +} + +void VCSlider::mouseReleaseEvent(QMouseEvent *e) +{ + if (mode() == Doc::Design) + { + VCWidget::mouseReleaseEvent(e); + } + else if (m_playbackIsFlashing) + { + flashPlayback(false); + } } /***************************************************************************** @@ -977,6 +1034,43 @@ void VCSlider::notifyFunctionStarting(quint32 fid, qreal functionIntensity) } } +bool VCSlider::playbackFlashEnable() +{ + return m_playbackFlashEnable; +} + +void VCSlider::setPlaybackFlashEnable(bool enable) +{ + m_playbackFlashEnable = enable; + + if (enable == false && m_flashButton != NULL) + { + delete m_flashButton; + m_flashButton = NULL; + } + else if (enable == true && m_flashButton == NULL) + { + m_flashButton = new FlashButton(this); + m_flashButton->setIconSize(QSize(32, 32)); + m_flashButton->setStyle(AppUtil::saneStyle()); + m_flashButton->setIcon(QIcon(":/flash.png")); + m_flashButton->setToolTip(tr("Flash Function")); + layout()->addWidget(m_flashButton); + layout()->setAlignment(m_flashButton, Qt::AlignHCenter); + + m_flashButton->show(); + } +} + +void VCSlider::flashPlayback(bool on) +{ + if (on) + m_playbackFlashPreviousValue = m_playbackValue; + m_playbackIsFlashing = on; + + setPlaybackValue(on ? UCHAR_MAX : m_playbackFlashPreviousValue); +} + void VCSlider::slotPlaybackFunctionRunning(quint32 fid) { Q_UNUSED(fid); @@ -1491,6 +1585,10 @@ void VCSlider::slotInputValueChanged(quint32 universe, quint32 channel, uchar va if (value > 0) slotResetButtonClicked(); } + else if (checkInputSource(universe, pagedCh, value, sender(), flashButtonInputSourceId)) + { + flashPlayback(value ? true : false); + } } void VCSlider::adjustIntensity(qreal val) @@ -1697,6 +1795,13 @@ bool VCSlider::loadXMLPlayback(QXmlStreamReader &pb_root) /* Function */ setPlaybackFunction(pb_root.readElementText().toUInt()); } + else if (pb_root.name() == KXMLQLCVCSliderPlaybackFlash) + { + setPlaybackFlashEnable(true); + QString str = loadXMLSources(pb_root, flashButtonInputSourceId); + if (str.isEmpty() == false) + m_playbackFlashKeySequence = stripKeySequence(QKeySequence(str)); + } else { qWarning() << Q_FUNC_INFO << "Unknown slider playback tag:" << pb_root.name().toString(); @@ -1798,6 +1903,16 @@ bool VCSlider::saveXML(QXmlStreamWriter *doc) doc->writeStartElement(KXMLQLCVCSliderPlayback); /* Playback function */ doc->writeTextElement(KXMLQLCVCSliderPlaybackFunction, QString::number(playbackFunction())); + + if (sliderMode() == Playback && playbackFlashEnable() == true) + { + doc->writeStartElement(KXMLQLCVCSliderPlaybackFlash); + if (m_playbackFlashKeySequence.toString().isEmpty() == false) + doc->writeTextElement(KXMLQLCVCWidgetKey, m_playbackFlashKeySequence.toString()); + saveXMLInput(doc, inputSource(flashButtonInputSourceId)); + doc->writeEndElement(); + } + /* End the tag */ doc->writeEndElement(); @@ -1860,3 +1975,19 @@ void VCSlider::LevelChannel::saveXML(QXmlStreamWriter *doc) const doc->writeCharacters(QString::number(this->channel)); doc->writeEndElement(); } + +void VCSlider::FlashButton::mousePressEvent(QMouseEvent *e) +{ + QToolButton::mousePressEvent(e); + // ignore event so that it can be + // forwarded to parent widget + e->ignore(); +} + +void VCSlider::FlashButton::mouseReleaseEvent(QMouseEvent *e) +{ + QToolButton::mouseReleaseEvent(e); + // ignore event so that it can be + // forwarded to parent widget + e->ignore(); +} diff --git a/ui/src/virtualconsole/vcslider.h b/ui/src/virtualconsole/vcslider.h index d67950f780..6e9c8c10cb 100644 --- a/ui/src/virtualconsole/vcslider.h +++ b/ui/src/virtualconsole/vcslider.h @@ -21,6 +21,7 @@ #ifndef VCSLIDER_H #define VCSLIDER_H +#include #include #include @@ -32,7 +33,6 @@ class QXmlStreamReader; class QXmlStreamWriter; -class QToolButton; class QHBoxLayout; class QLabel; @@ -70,6 +70,7 @@ class VCSliderProperties; #define KXMLQLCVCSliderPlayback QString("Playback") #define KXMLQLCVCSliderPlaybackFunction QString("Function") +#define KXMLQLCVCSliderPlaybackFlash QString("Flash") class VCSlider : public VCWidget, public DMXSource { @@ -81,6 +82,7 @@ class VCSlider : public VCWidget, public DMXSource public: static const quint8 sliderInputSourceId; static const quint8 overrideResetInputSourceId; + static const quint8 flashButtonInputSourceId; static const QSize defaultSize; @@ -392,6 +394,13 @@ protected slots: /** @reimp */ virtual void notifyFunctionStarting(quint32 fid, qreal intensity); + /** Get/Set the status of the flash button enablement */ + bool playbackFlashEnable(); + void setPlaybackFlashEnable(bool enable); + +protected: + void flashPlayback(bool on); + protected slots: void slotPlaybackFunctionRunning(quint32 fid); void slotPlaybackFunctionStopped(quint32 fid); @@ -404,6 +413,10 @@ protected slots: int m_playbackChangeCounter; QMutex m_playbackValueMutex; + bool m_playbackFlashEnable; + bool m_playbackIsFlashing; + uchar m_playbackFlashPreviousValue; + private: FunctionParent functionParent() const; @@ -568,7 +581,10 @@ private slots: void slotResetButtonClicked(); protected slots: + /** @reimp */ void slotKeyPressed(const QKeySequence& keySequence); + /** @reimp */ + void slotKeyReleased(const QKeySequence& keySequence); protected: QToolButton *m_resetButton; @@ -577,6 +593,33 @@ protected slots: private: QKeySequence m_overrideResetKeySequence; + /********************************************************************* + * Flash button + *********************************************************************/ +public: + /** Get/set the keyboard key combination to flash the playback */ + QKeySequence playbackFlashKeySequence() const; + void setPlaybackFlashKeySequence(const QKeySequence& keySequence); + +protected: + void mousePressEvent(QMouseEvent *e); + void mouseReleaseEvent(QMouseEvent *e); + +protected: + class FlashButton : public QToolButton + { + public: + FlashButton(QWidget *parent) + : QToolButton(parent) {} + protected: + void mousePressEvent(QMouseEvent *e); + void mouseReleaseEvent(QMouseEvent *e); + }; + FlashButton *m_flashButton; + +private: + QKeySequence m_playbackFlashKeySequence; + /********************************************************************* * External input *********************************************************************/ diff --git a/ui/src/virtualconsole/vcsliderproperties.cpp b/ui/src/virtualconsole/vcsliderproperties.cpp index bb6e416f1e..05656f48f9 100644 --- a/ui/src/virtualconsole/vcsliderproperties.cpp +++ b/ui/src/virtualconsole/vcsliderproperties.cpp @@ -108,19 +108,6 @@ VCSliderProperties::VCSliderProperties(VCSlider* slider, Doc* doc) /* Slider mode */ m_sliderMode = m_slider->sliderMode(); - switch (m_sliderMode) - { - default: - case VCSlider::Level: - slotModeLevelClicked(); - break; - case VCSlider::Playback: - slotModePlaybackClicked(); - break; - case VCSlider::Submaster: - slotModeSubmasterClicked(); - break; - } /* Slider movement (Qt understands inverted appearance vice versa) */ if (m_slider->invertedAppearance() == true) @@ -195,6 +182,33 @@ VCSliderProperties::VCSliderProperties(VCSlider* slider, Doc* doc) /* Function */ m_playbackFunctionId = m_slider->playbackFunction(); updatePlaybackFunctionName(); + + m_flashInputWidget = new InputSelectionWidget(m_doc, this); + m_flashInputWidget->setKeySequence(m_slider->playbackFlashKeySequence()); + m_flashInputWidget->setInputSource(m_slider->inputSource(VCSlider::flashButtonInputSourceId)); + m_flashInputWidget->setWidgetPage(m_slider->page()); + m_flashInputWidget->show(); + m_flashInputWidget->setEnabled(m_slider->playbackFlashEnable()); + m_flashButtonLayout->addWidget(m_flashInputWidget); + + connect(m_flashButtonCheck, SIGNAL(clicked(bool)), + this, SLOT(slotFlashCheckClicked(bool))); + m_flashButtonCheck->setChecked(m_slider->playbackFlashEnable()); + + /* At last, sort out visibility */ + switch (m_sliderMode) + { + default: + case VCSlider::Level: + slotModeLevelClicked(); + break; + case VCSlider::Playback: + slotModePlaybackClicked(); + break; + case VCSlider::Submaster: + slotModeSubmasterClicked(); + break; + } } VCSliderProperties::~VCSliderProperties() @@ -298,6 +312,8 @@ void VCSliderProperties::setLevelPageVisibility(bool visible) void VCSliderProperties::setPlaybackPageVisibility(bool visible) { m_playbackFunctionGroup->setVisible(visible); + m_flashButtonCheck->setVisible(visible); + m_flashInputWidget->setVisible(visible); if (visible == true) { @@ -688,6 +704,11 @@ void VCSliderProperties::slotDetachPlaybackFunctionClicked() updatePlaybackFunctionName(); } +void VCSliderProperties::slotFlashCheckClicked(bool checked) +{ + m_flashInputWidget->setEnabled(checked); +} + void VCSliderProperties::updatePlaybackFunctionName() { Function* function = m_doc->function(m_playbackFunctionId); @@ -847,6 +868,9 @@ void VCSliderProperties::accept() /* Playback page */ m_slider->setPlaybackFunction(m_playbackFunctionId); + m_slider->setPlaybackFlashEnable(m_flashButtonCheck->isChecked()); + m_slider->setPlaybackFlashKeySequence(m_flashInputWidget->keySequence()); + m_slider->setInputSource(m_flashInputWidget->inputSource(), VCSlider::flashButtonInputSourceId); /* Slider mode */ if (m_slider->sliderMode() != m_sliderMode) diff --git a/ui/src/virtualconsole/vcsliderproperties.h b/ui/src/virtualconsole/vcsliderproperties.h index 2d7fdb79d9..01aaf58535 100644 --- a/ui/src/virtualconsole/vcsliderproperties.h +++ b/ui/src/virtualconsole/vcsliderproperties.h @@ -130,6 +130,7 @@ protected slots: /** Callback for tree item expanded/collapsed */ void slotItemExpanded(); + /** Callback for monitoring enable */ void slotMonitorCheckClicked(bool checked); protected: @@ -145,6 +146,9 @@ public slots: /** Callback for playback function detach clicks */ void slotDetachPlaybackFunctionClicked(); + /** Callback for flah button enable */ + void slotFlashCheckClicked(bool checked); + protected: /** Update the name of the playback function, based on m_playbackFunctionId */ void updatePlaybackFunctionName(); @@ -153,6 +157,8 @@ public slots: /** The currently selected playback function */ quint32 m_playbackFunctionId; + InputSelectionWidget *m_flashInputWidget; + /************************************************************************* * Submaster page *************************************************************************/ diff --git a/ui/src/virtualconsole/vcsliderproperties.ui b/ui/src/virtualconsole/vcsliderproperties.ui index 15791f33f8..7d447cfbe5 100644 --- a/ui/src/virtualconsole/vcsliderproperties.ui +++ b/ui/src/virtualconsole/vcsliderproperties.ui @@ -46,63 +46,33 @@ General - - - - - - Widget name - - - - - - - Name of the slider - - - - - - - - - Slider movement + + + + QFrame::NoFrame - - - - - Normal - - - true - - - + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + - - - Inverted - - + - - - - Qt::Vertical - - - - 20 - 40 - - - - @@ -146,29 +116,53 @@ - - - - QFrame::StyledPanel + + + + Catch up with the external controller input value - - QFrame::Raised + + + + + + + + Widget name + + + + + + + Name of the slider + + + + + + + + + Slider movement - - - 0 - - - 0 - - - 0 - - - 0 - + - + + + Normal + + + true + + + + + + + Inverted + + @@ -205,12 +199,18 @@ - - - - Catch up with the external controller input value + + + + Qt::Vertical - + + + 20 + 40 + + + @@ -521,6 +521,16 @@ + + + + Flash Button + + + + + + diff --git a/ui/src/virtualconsole/vcspeeddial.cpp b/ui/src/virtualconsole/vcspeeddial.cpp index 68ab4222af..524eead2f8 100644 --- a/ui/src/virtualconsole/vcspeeddial.cpp +++ b/ui/src/virtualconsole/vcspeeddial.cpp @@ -571,8 +571,8 @@ void VCSpeedDial::updateFeedback() QPushButton* button = reinterpret_cast(it.key()); if (preset->m_inputSource.isNull() == false) sendFeedback(button->isDown() ? - preset->m_inputSource->upperValue() : - preset->m_inputSource->lowerValue(), + preset->m_inputSource->feedbackValue(QLCInputFeedback::UpperValue) : + preset->m_inputSource->feedbackValue(QLCInputFeedback::LowerValue), preset->m_inputSource); } } diff --git a/ui/src/virtualconsole/vcspeeddialpreset.cpp b/ui/src/virtualconsole/vcspeeddialpreset.cpp index d16958fe13..6de7a11d7a 100644 --- a/ui/src/virtualconsole/vcspeeddialpreset.cpp +++ b/ui/src/virtualconsole/vcspeeddialpreset.cpp @@ -52,7 +52,9 @@ VCSpeedDialPreset &VCSpeedDialPreset::operator=(const VCSpeedDialPreset &preset) { m_inputSource = QSharedPointer(new QLCInputSource(preset.m_inputSource->universe(), preset.m_inputSource->channel())); - m_inputSource->setRange(preset.m_inputSource->lowerValue(), preset.m_inputSource->upperValue()); + + m_inputSource->setFeedbackValue(QLCInputFeedback::LowerValue, preset.m_inputSource->feedbackValue(QLCInputFeedback::LowerValue)); + m_inputSource->setFeedbackValue(QLCInputFeedback::UpperValue, preset.m_inputSource->feedbackValue(QLCInputFeedback::UpperValue)); } } return *this; diff --git a/ui/src/virtualconsole/vcwidget.cpp b/ui/src/virtualconsole/vcwidget.cpp index a23643c81f..0c4b0e148f 100644 --- a/ui/src/virtualconsole/vcwidget.cpp +++ b/ui/src/virtualconsole/vcwidget.cpp @@ -40,7 +40,6 @@ #include #include #include -#include #include "qlcinputsource.h" #include "qlcfile.h" @@ -192,6 +191,8 @@ void VCWidget::setDisableState(bool disable) setEnabled(!disable); enableWidgetUI(!disable); } + + emit disableStateChanged(m_disableState); } void VCWidget::enableWidgetUI(bool enable) @@ -255,7 +256,12 @@ bool VCWidget::copyFrom(const VCWidget* widget) it.next(); quint8 id = it.key(); QSharedPointer src(new QLCInputSource(it.value()->universe(), it.value()->channel())); - src->setRange(it.value()->lowerValue(), it.value()->upperValue()); + src->setFeedbackValue(QLCInputFeedback::LowerValue, it.value()->feedbackValue(QLCInputFeedback::LowerValue)); + src->setFeedbackValue(QLCInputFeedback::UpperValue, it.value()->feedbackValue(QLCInputFeedback::UpperValue)); + src->setFeedbackValue(QLCInputFeedback::MonitorValue, it.value()->feedbackValue(QLCInputFeedback::MonitorValue)); + src->setFeedbackExtraParams(QLCInputFeedback::LowerValue, it.value()->feedbackExtraParams(QLCInputFeedback::LowerValue)); + src->setFeedbackExtraParams(QLCInputFeedback::UpperValue, it.value()->feedbackExtraParams(QLCInputFeedback::UpperValue)); + src->setFeedbackExtraParams(QLCInputFeedback::MonitorValue, it.value()->feedbackExtraParams(QLCInputFeedback::MonitorValue)); setInputSource(src, id); } @@ -607,12 +613,22 @@ void VCWidget::setInputSource(QSharedPointer const& source, quin InputPatch *ip = m_doc->inputOutputMap()->inputPatch(source->universe()); if (ip != NULL) { - if (ip->profile() != NULL) + QLCInputProfile *profile = ip->profile(); + if (profile != NULL) { // Do not care about the page since input profiles don't do either - QLCInputChannel *ich = ip->profile()->channel(source->channel() & 0xFFFF); + QLCInputChannel *ich = profile->channel(source->channel() & 0xFFFF); if (ich != NULL) { + // retrieve plugin specific params for feedback + if (source->feedbackExtraParams(QLCInputFeedback::LowerValue).toInt() == -1) + source->setFeedbackExtraParams(QLCInputFeedback::LowerValue, profile->channelExtraParams(ich)); + if (source->feedbackExtraParams(QLCInputFeedback::UpperValue).toInt() == -1 || + !source->feedbackExtraParams(QLCInputFeedback::UpperValue).isValid()) + source->setFeedbackExtraParams(QLCInputFeedback::UpperValue, profile->channelExtraParams(ich)); + if (source->feedbackExtraParams(QLCInputFeedback::MonitorValue).toInt() == -1) + source->setFeedbackExtraParams(QLCInputFeedback::MonitorValue, profile->channelExtraParams(ich)); + if (ich->movementType() == QLCInputChannel::Relative) { source->setWorkingMode(QLCInputSource::Relative); @@ -636,9 +652,16 @@ void VCWidget::setInputSource(QSharedPointer const& source, quin this, SLOT(slotInputValueChanged(quint32,quint32,uchar))); } - // user custom feedbacks have precedence over input profile custom feedbacks - source->setRange((source->lowerValue() != 0) ? source->lowerValue() : ich->lowerValue(), - (source->upperValue() != UCHAR_MAX) ? source->upperValue() : ich->upperValue()); + // user custom feedback have precedence over input profile custom feedback + uchar lower = source->feedbackValue(QLCInputFeedback::LowerValue) != 0 ? + source->feedbackValue(QLCInputFeedback::LowerValue) : + ich->lowerValue(); + uchar upper = source->feedbackValue(QLCInputFeedback::UpperValue) != UCHAR_MAX ? + source->feedbackValue(QLCInputFeedback::UpperValue) : + ich->upperValue(); + + source->setFeedbackValue(QLCInputFeedback::LowerValue, lower); + source->setFeedbackValue(QLCInputFeedback::UpperValue, upper); } } } @@ -677,7 +700,7 @@ void VCWidget::sendFeedback(int value, quint8 id) sendFeedback(value, src); } -void VCWidget::sendFeedback(int value, QSharedPointer src) +void VCWidget::sendFeedback(int value, QSharedPointer src, QVariant extraParams) { if (src.isNull() || src->isValid() == false) return; @@ -691,20 +714,11 @@ void VCWidget::sendFeedback(int value, QSharedPointer src) if (acceptsInput() == false) return; - QString chName = QString(); + //qDebug() << "[VCWidget] Send feedback to uni" << src->universe() << "," << src->channel() << ", param" << extraParams; - InputPatch* pat = m_doc->inputOutputMap()->inputPatch(src->universe()); - if (pat != NULL) - { - QLCInputProfile* profile = pat->profile(); - if (profile != NULL) - { - QLCInputChannel* ich = profile->channel(src->channel()); - if (ich != NULL) - chName = ich->name(); - } - } - m_doc->inputOutputMap()->sendFeedBack(src->universe(), src->channel(), value, chName); + m_doc->inputOutputMap()->sendFeedBack( + src->universe(), src->channel(), value, + extraParams.isValid() ? extraParams : src->feedbackExtraParams(QLCInputFeedback::UpperValue)); } void VCWidget::slotInputValueChanged(quint32 universe, quint32 channel, uchar value) @@ -883,15 +897,27 @@ QSharedPointer VCWidget::getXMLInput(QXmlStreamReader &root) quint32 uni = attrs.value(KXMLQLCVCWidgetInputUniverse).toString().toUInt(); quint32 ch = attrs.value(KXMLQLCVCWidgetInputChannel).toString().toUInt(); - uchar min = 0, max = UCHAR_MAX; + uchar min = 0, max = UCHAR_MAX, mon = UCHAR_MAX; QSharedPointernewSrc = QSharedPointer(new QLCInputSource(uni, ch)); if (attrs.hasAttribute(KXMLQLCVCWidgetInputLowerValue)) min = uchar(attrs.value(KXMLQLCVCWidgetInputLowerValue).toString().toUInt()); if (attrs.hasAttribute(KXMLQLCVCWidgetInputUpperValue)) max = uchar(attrs.value(KXMLQLCVCWidgetInputUpperValue).toString().toUInt()); + if (attrs.hasAttribute(KXMLQLCVCWidgetInputMonitorValue)) + mon = uchar(attrs.value(KXMLQLCVCWidgetInputMonitorValue).toString().toUInt()); + + newSrc->setFeedbackValue(QLCInputFeedback::LowerValue, min); + newSrc->setFeedbackValue(QLCInputFeedback::UpperValue, max); + newSrc->setFeedbackValue(QLCInputFeedback::MonitorValue, mon); - newSrc->setRange(min, max); + // load feedback extra params + if (attrs.hasAttribute(KXMLQLCVCWidgetInputLowerParams)) + newSrc->setFeedbackExtraParams(QLCInputFeedback::LowerValue, attrs.value(KXMLQLCVCWidgetInputLowerParams).toInt()); + if (attrs.hasAttribute(KXMLQLCVCWidgetInputUpperParams)) + newSrc->setFeedbackExtraParams(QLCInputFeedback::UpperValue, attrs.value(KXMLQLCVCWidgetInputUpperParams).toInt()); + if (attrs.hasAttribute(KXMLQLCVCWidgetInputMonitorParams)) + newSrc->setFeedbackExtraParams(QLCInputFeedback::MonitorValue, attrs.value(KXMLQLCVCWidgetInputMonitorParams).toInt()); return newSrc; } @@ -953,6 +979,21 @@ bool VCWidget::loadXMLInput(QXmlStreamReader &root, quint32* uni, quint32* ch) c return true; } +QString VCWidget::extraParamToString(QVariant param) +{ + if (param.isValid() == false) + return QString(); + +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + if (param.type() == QVariant::Int && param.toInt() != -1) + return QString::number(param.toInt()); +#else + if (param.metaType().id() == QMetaType::Int && param.toInt() != -1) + return QString::number(param.toInt()); +#endif + return QString(); +} + bool VCWidget::saveXMLCommon(QXmlStreamWriter *doc) { Q_ASSERT(doc != NULL); @@ -1035,10 +1076,29 @@ bool VCWidget::saveXMLInput(QXmlStreamWriter *doc, doc->writeStartElement(KXMLQLCVCWidgetInput); doc->writeAttribute(KXMLQLCVCWidgetInputUniverse, QString("%1").arg(src->universe())); doc->writeAttribute(KXMLQLCVCWidgetInputChannel, QString("%1").arg(src->channel())); - if (src->lowerValue() != 0) - doc->writeAttribute(KXMLQLCVCWidgetInputLowerValue, QString::number(src->lowerValue())); - if (src->upperValue() != UCHAR_MAX) - doc->writeAttribute(KXMLQLCVCWidgetInputUpperValue, QString::number(src->upperValue())); + if (src->feedbackValue(QLCInputFeedback::LowerValue) != 0) + doc->writeAttribute(KXMLQLCVCWidgetInputLowerValue, QString::number(src->feedbackValue(QLCInputFeedback::LowerValue))); + if (src->feedbackValue(QLCInputFeedback::UpperValue) != UCHAR_MAX) + doc->writeAttribute(KXMLQLCVCWidgetInputUpperValue, QString::number(src->feedbackValue(QLCInputFeedback::UpperValue))); + if (src->feedbackValue(QLCInputFeedback::MonitorValue) != UCHAR_MAX) + doc->writeAttribute(KXMLQLCVCWidgetInputMonitorValue, QString::number(src->feedbackValue(QLCInputFeedback::MonitorValue))); + + // save feedback extra params + QString extraParams = extraParamToString(src->feedbackExtraParams(QLCInputFeedback::LowerValue)); + + if (!extraParams.isEmpty()) + doc->writeAttribute(KXMLQLCVCWidgetInputLowerParams, extraParams); + + extraParams = extraParamToString(src->feedbackExtraParams(QLCInputFeedback::UpperValue)); + + if (!extraParams.isEmpty()) + doc->writeAttribute(KXMLQLCVCWidgetInputUpperParams, extraParams); + + extraParams = extraParamToString(src->feedbackExtraParams(QLCInputFeedback::MonitorValue)); + + if (!extraParams.isEmpty()) + doc->writeAttribute(KXMLQLCVCWidgetInputMonitorParams, extraParams); + doc->writeEndElement(); } diff --git a/ui/src/virtualconsole/vcwidget.h b/ui/src/virtualconsole/vcwidget.h index 63574764b4..460ef6e35d 100644 --- a/ui/src/virtualconsole/vcwidget.h +++ b/ui/src/virtualconsole/vcwidget.h @@ -59,12 +59,16 @@ class QFile; #define KVCFrameStyleRaised (QFrame::Panel | QFrame::Raised) #define KVCFrameStyleNone (QFrame::NoFrame) -#define KXMLQLCVCWidgetKey QString("Key") -#define KXMLQLCVCWidgetInput QString("Input") -#define KXMLQLCVCWidgetInputUniverse QString("Universe") -#define KXMLQLCVCWidgetInputChannel QString("Channel") -#define KXMLQLCVCWidgetInputLowerValue QString("LowerValue") -#define KXMLQLCVCWidgetInputUpperValue QString("UpperValue") +#define KXMLQLCVCWidgetKey QString("Key") +#define KXMLQLCVCWidgetInput QString("Input") +#define KXMLQLCVCWidgetInputUniverse QString("Universe") +#define KXMLQLCVCWidgetInputChannel QString("Channel") +#define KXMLQLCVCWidgetInputLowerValue QString("LowerValue") +#define KXMLQLCVCWidgetInputUpperValue QString("UpperValue") +#define KXMLQLCVCWidgetInputMonitorValue QString("MonitorValue") +#define KXMLQLCVCWidgetInputLowerParams QString("LowerParams") +#define KXMLQLCVCWidgetInputUpperParams QString("UpperParams") +#define KXMLQLCVCWidgetInputMonitorParams QString("MonitorParams") #define KXMLQLCWindowState QString("WindowState") #define KXMLQLCWindowStateVisible QString("Visible") @@ -167,6 +171,9 @@ class VCWidget : public QWidget bool isDisabled(); +signals: + void disableStateChanged(bool disable); + protected: bool m_disableState; @@ -443,7 +450,7 @@ class VCWidget : public QWidget * @param value value from 0 to 255 to be sent * @param src the QLCInputSource reference to send the feedback to */ - void sendFeedback(int value, QSharedPointer src); + void sendFeedback(int value, QSharedPointer src, QVariant extraParams = QVariant()); /** * Send the feedback data again, e.g. after page flip @@ -529,6 +536,7 @@ protected slots: /** Load input source from $root to $uni and $ch */ bool loadXMLInput(QXmlStreamReader &root, quint32* uni, quint32* ch) const; + static QString extraParamToString(QVariant param); bool saveXMLCommon(QXmlStreamWriter *doc); bool saveXMLAppearance(QXmlStreamWriter *doc); /** Save the defualt input source to $root */ @@ -558,7 +566,6 @@ protected slots: bool loadXMLWindowState(QXmlStreamReader &tag, int* x, int* y, int* w, int* h, bool* visible); - /********************************************************************* * QLC+ Mode change *********************************************************************/ diff --git a/ui/src/virtualconsole/vcxypad.cpp b/ui/src/virtualconsole/vcxypad.cpp index e7b4004e44..2f96ddbfaf 100644 --- a/ui/src/virtualconsole/vcxypad.cpp +++ b/ui/src/virtualconsole/vcxypad.cpp @@ -228,6 +228,13 @@ VCWidget* VCXYPad::createCopy(VCWidget* parent) xypad = NULL; } + for (QHash::iterator it = m_presets.begin(); + it != m_presets.end(); ++it) + { + VCXYPadPreset *preset = it.value(); + xypad->addPreset(*preset); + } + return xypad; } @@ -683,6 +690,16 @@ QList VCXYPad::presets() const return presets; } +QMap VCXYPad::presetsMap() const +{ + QMap map; + + foreach (VCXYPadPreset *control, m_presets.values()) + map.insert(control->m_id, VCXYPadPreset::typeToString(control->m_type)); + + return map; +} + void VCXYPad::slotPresetClicked(bool checked) { if (mode() == Doc::Design) @@ -736,7 +753,7 @@ void VCXYPad::slotPresetClicked(bool checked) { cBtn->setChecked(false); if (cPr->m_inputSource.isNull() == false) - sendFeedback(cPr->m_inputSource->lowerValue(), cPr->m_inputSource); + sendFeedback(cPr->m_inputSource->feedbackValue(QLCInputFeedback::LowerValue), cPr->m_inputSource); } } else if (cPr->m_type == VCXYPadPreset::EFX || @@ -746,7 +763,7 @@ void VCXYPad::slotPresetClicked(bool checked) { cBtn->setChecked(false); if (cPr->m_inputSource.isNull() == false) - sendFeedback(cPr->m_inputSource->lowerValue(), cPr->m_inputSource); + sendFeedback(cPr->m_inputSource->feedbackValue(QLCInputFeedback::LowerValue), cPr->m_inputSource); } } else @@ -755,12 +772,12 @@ void VCXYPad::slotPresetClicked(bool checked) { cBtn->setDown(false); if (cPr->m_inputSource.isNull() == false) - sendFeedback(cPr->m_inputSource->lowerValue(), cPr->m_inputSource); + sendFeedback(cPr->m_inputSource->feedbackValue(QLCInputFeedback::LowerValue), cPr->m_inputSource); } } cBtn->blockSignals(false); if (cPr->m_inputSource.isNull() == false) - sendFeedback(cPr->m_inputSource->lowerValue(), cPr->m_inputSource); + sendFeedback(cPr->m_inputSource->feedbackValue(QLCInputFeedback::LowerValue), cPr->m_inputSource); } if (preset->m_type == VCXYPadPreset::EFX) @@ -801,7 +818,7 @@ void VCXYPad::slotPresetClicked(bool checked) connect(m_efx, SIGNAL(durationChanged(uint)), this, SLOT(slotEFXDurationChanged(uint))); if (preset->m_inputSource.isNull() == false) - sendFeedback(preset->m_inputSource->upperValue(), preset->m_inputSource); + sendFeedback(preset->m_inputSource->feedbackValue(QLCInputFeedback::UpperValue), preset->m_inputSource); } else if (preset->m_type == VCXYPadPreset::Scene) { @@ -843,7 +860,7 @@ void VCXYPad::slotPresetClicked(bool checked) m_scene->start(m_doc->masterTimer(), functionParent()); if (preset->m_inputSource.isNull() == false) - sendFeedback(preset->m_inputSource->upperValue(), preset->m_inputSource); + sendFeedback(preset->m_inputSource->feedbackValue(QLCInputFeedback::UpperValue), preset->m_inputSource); } else if (preset->m_type == VCXYPadPreset::Position) { @@ -854,7 +871,7 @@ void VCXYPad::slotPresetClicked(bool checked) m_area->setPosition(preset->m_dmxPos); m_area->repaint(); if (preset->m_inputSource.isNull() == false) - sendFeedback(preset->m_inputSource->upperValue(), preset->m_inputSource); + sendFeedback(preset->m_inputSource->feedbackValue(QLCInputFeedback::UpperValue), preset->m_inputSource); btn->blockSignals(true); btn->setDown(true); btn->blockSignals(false); diff --git a/ui/src/virtualconsole/vcxypad.h b/ui/src/virtualconsole/vcxypad.h index 4eb3511b57..b193b48c59 100644 --- a/ui/src/virtualconsole/vcxypad.h +++ b/ui/src/virtualconsole/vcxypad.h @@ -210,6 +210,7 @@ public slots: void addPreset(VCXYPadPreset const& preset); void resetPresets(); QList presets() const; + QMap presetsMap() const; protected: void updateSceneChannel(FadeChannel *fc, uchar value); diff --git a/ui/src/virtualconsole/vcxypadpreset.cpp b/ui/src/virtualconsole/vcxypadpreset.cpp index cc9f2795da..20f8fcf60d 100644 --- a/ui/src/virtualconsole/vcxypadpreset.cpp +++ b/ui/src/virtualconsole/vcxypadpreset.cpp @@ -103,7 +103,9 @@ VCXYPadPreset &VCXYPadPreset::operator=(const VCXYPadPreset &vcpp) { m_inputSource = QSharedPointer(new QLCInputSource(vcpp.m_inputSource->universe(), vcpp.m_inputSource->channel())); - m_inputSource->setRange(vcpp.m_inputSource->lowerValue(), vcpp.m_inputSource->upperValue()); + + m_inputSource->setFeedbackValue(QLCInputFeedback::LowerValue, vcpp.m_inputSource->feedbackValue(QLCInputFeedback::LowerValue)); + m_inputSource->setFeedbackValue(QLCInputFeedback::UpperValue, vcpp.m_inputSource->feedbackValue(QLCInputFeedback::UpperValue)); } } return *this; diff --git a/ui/src/virtualconsole/vcxypadpreset.h b/ui/src/virtualconsole/vcxypadpreset.h index eebbe496b4..77179671c0 100644 --- a/ui/src/virtualconsole/vcxypadpreset.h +++ b/ui/src/virtualconsole/vcxypadpreset.h @@ -77,7 +77,6 @@ class VCXYPadPreset bool operator<(VCXYPadPreset const& right) const; static bool compare(VCXYPadPreset const* left, VCXYPadPreset const* right); -protected: static QString typeToString(PresetType type); static PresetType stringToType(QString str); diff --git a/variables.cmake b/variables.cmake index 3a89857f8f..12269aa261 100644 --- a/variables.cmake +++ b/variables.cmake @@ -21,7 +21,7 @@ if(qmlui) add_definitions(-DQMLUI) set(APPVERSION "5.0.0 Beta 3") else() - set(APPVERSION "4.12.8 GIT") + set(APPVERSION "4.13.1 GIT") endif() if(UNIX) @@ -89,7 +89,7 @@ if (WIN32) elseif (APPLE) set(LIBSDIR "Frameworks") elseif (UNIX) - set(LIBSDIR "lib/x86_64-linux-gnu") + set(LIBSDIR "lib/${CMAKE_C_LIBRARY_ARCHITECTURE}") endif () if (ANDROID) diff --git a/variables.pri b/variables.pri index 11f5adbb74..760d12376d 100644 --- a/variables.pri +++ b/variables.pri @@ -4,7 +4,7 @@ APPNAME = Q Light Controller Plus FXEDNAME = Fixture Definition Editor -!qmlui: APPVERSION = 4.12.8 GIT +!qmlui: APPVERSION = 4.13.1 GIT qmlui: APPVERSION = 5.0.0 Beta 3 # Disable these if you don't want to see GIT short hash in the About Box @@ -50,6 +50,7 @@ contains(FORCECONFIG, release) { } else { QMAKE_CXXFLAGS += -Wno-unused-local-typedefs # Fix to build with GCC 4.8 + QMAKE_CXXFLAGS += -Wno-template-id-cdtor # Fix to build with GCC 14 } } diff --git a/webaccess/res/Test_Web_API.html b/webaccess/res/Test_Web_API.html index bba18ebb2e..52c6b6fa09 100644 --- a/webaccess/res/Test_Web_API.html +++ b/webaccess/res/Test_Web_API.html @@ -122,6 +122,22 @@ } } +function vcAnimationWidgetControl(animIDObjName, controlIDObjName) +{ + var animObj = document.getElementById(animIDObjName); + var controlIDObj = document.getElementById(controlIDObjName); + + if (animObj && controlIDObj) + { + if (isConnected === true) + { + websocket.send(animObj.value + "|MATRIX_PUSHBUTTON|" + controlIDObj.value); + } + else + alert("You must connect to QLC+ WebSocket first!"); + } +} + function connectToWebSocket(host) { var url = 'ws://' + host + '/qlcplusWS'; websocket = new WebSocket(url); @@ -183,10 +199,10 @@ { document.getElementById('getWidgetsNumberBox').innerHTML = msgParams[2]; } - // Arguments is an array formatted as follows: - // Widget ID|Widget name|Widget ID|Widget name|... else if (msgParams[1] === "getWidgetsList") { + // Arguments is an array formatted as follows: + // Widget ID|Widget name|Widget ID|Widget name|... var tableCode = ""; for (i = 2; i < msgParams.length; i+=2) { @@ -206,6 +222,18 @@ status = msgParams[2] + "(Step: " + msgParams[3] + ")"; document.getElementById('getWidgetStatusBox').innerHTML = status; } + else if (msgParams[1] === "getWidgetSubIdList") + { + // Arguments is an array formatted as follows: + // Widget ID|Preset ID|Preset Type|Preset ID|Preset Type|... + var tableCode = "
    IDName
    "; + for (i = 2; i < msgParams.length; i+=2) + { + tableCode = tableCode + ""; + } + tableCode += "
    IDType
    " + msgParams[i] + "" + msgParams[i + 1] + "
    "; + document.getElementById('getWidgetSubIdBox').innerHTML = tableCode; + } else if (msgParams[1] === "getChannelsValues") { var tableCode = ""; @@ -256,22 +284,30 @@ } .apiTable th { - font-size: 18px; + font-size: 20px; color: white; - border: solid 1px white; + background-color: #3da1ff; + border: solid 1px grey; + padding: 10px 0 10px 0 !important; } .apiTable tr { font-size: 14px; - border: solid 1px white; + border: solid 1px grey; } .apiTable td { - border: solid 1px white; - padding: 2px 5px 2px 5px; + border: solid 1px grey; + padding: 5px 5px 5px 5px; margin: 0 5px 0 5px; } +.apiHeader { + font-size: 18px; + background-color: #3bc247; + padding: 10px 0 10px 0 !important; +} + .apiButton { display: table-cell; vertical-align: middle; @@ -335,9 +371,10 @@

    Q Light Controller+ Web API test page

    - + - + + - + + + + + + - + + @@ -405,6 +448,7 @@

    Q Light Controller+ Web API test page

    + + + + + + + + + + + + + - +
    IndexValueType
    Channels APIsChannels APIs
    getChannelsValues

    Universe index:
    @@ -352,18 +389,21 @@

    Q Light Controller+ Web API test page

    Function APIsFunction APIs
    getFunctionsNumber
    Retrieve the number of functions loaded
    getFunctionsList
    Retrieve the list of functions with their ID and name
    getFunctionType

    @@ -372,6 +412,7 @@

    Q Light Controller+ Web API test page

    Retrieve the type of a function with the given ID
    getFunctionStatus

    @@ -380,6 +421,7 @@

    Q Light Controller+ Web API test page

    Retrieve the running status of a function with the given ID. Possible values are "Running", "Stopped" and "Undefined"
    setFunctionStatus

    @@ -393,8 +435,9 @@

    Q Light Controller+ Web API test page

    Virtual Console Widget APIsVirtual Console Widget APIs
    getWidgetsNumber
    Retrieve the number of widgets loaded Retrieve the list of Virtual Console Widgets with their ID and name
    getWidgetType

    @@ -413,6 +457,7 @@

    Q Light Controller+ Web API test page

    Retrieve the type of a Virtual Console Widget with the given ID
    getWidgetStatus

    @@ -422,10 +467,33 @@

    Q Light Controller+ Web API test page

    +
    getWidgetSubIdList

    + Widget ID: +
    Retrieve information about sub-widgets (aka presets) of a Virtual Console Widget with the given ID
    +
    Animation widget control

    + Animation widget ID:
    + Control ID: +
    + This API demonstrates how to control Virtual Console Animation widget. + The parameters to be used are:
    + Animation widget ID: The Animation widget ID as retrieved with the 'getWidgetsList' API
    + Control ID: The Animation control ID of preset buttons. +
    High rate APIsHigh rate APIs
    Due to the nature of some type of transmissions (for example a slider changing rapidly), diff --git a/webaccess/res/common.css b/webaccess/res/common.css index 4cdc024be3..2ad56818f7 100644 --- a/webaccess/res/common.css +++ b/webaccess/res/common.css @@ -1,36 +1,32 @@ .controlBar { width: 100%; height: 40px; - background: linear-gradient(to bottom, #B2D360 0%, #4B9002 100%); - background: -ms-linear-gradient(top, #B2D360 0%, #4B9002 100%); - background: -moz-linear-gradient(top, #B2D360 0%, #4B9002 100%); - background: -o-linear-gradient(top, #B2D360 0%, #4B9002 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #B2D360), color-stop(1, #4B9002)); - background: -webkit-linear-gradient(top, #B2D360 0%, #4B9002 100%); - font:bold 24px/1.2em sans-serif; + background: #181a1b; + font: 20px/1.2em sans-serif; color: #ffffff; } .button { - height: 35px; + height: 30px; margin-left: 5px; + margin-top: 5px; text-decoration: none; - font: bold 25px/1.2em 'Trebuchet MS',Arial, Helvetica; + font: 22px/1.2em 'Trebuchet MS',Arial, Helvetica; display: inline-block; text-align: center; color: #fff; - border: 1px solid #333; + border: 1px solid #555; } .button, .button span { - -moz-border-radius: .3em; - border-radius: .3em; + -moz-border-radius: .2em; + border-radius: .2em; } .button span { display: block; - padding: 0 10px 0 10px; + padding: 0 20px 0 20px; } .button:hover { @@ -45,15 +41,12 @@ } .button-blue { - background: #4477a1; - background: -webkit-gradient(linear, left top, left bottom, from(#81a8cb), to(#4477a1) ); - background: -moz-linear-gradient(-90deg, #81a8cb, #4477a1); + background: #364e5e; } .button-blue:hover { - background: #81a8cb; - background: -webkit-gradient(linear, left top, left bottom, from(#4477a1), to(#81a8cb) ); - background: -moz-linear-gradient(-90deg, #4477a1, #81a8cb); + background: #ffd42a; + color: #000; } .button-blue:active { background: #4477a1; } @@ -61,7 +54,7 @@ .swInfo { position: absolute; right: 5px; - top: 5px; + top: 7px; font-size: 18px; } diff --git a/webaccess/res/keypad.html b/webaccess/res/keypad.html index 7a1c0258a1..2e625d2703 100644 --- a/webaccess/res/keypad.html +++ b/webaccess/res/keypad.html @@ -5,12 +5,11 @@ diff --git a/webaccess/res/networkconfig.js b/webaccess/res/networkconfig.js index fa792221e5..da6c515e5a 100644 --- a/webaccess/res/networkconfig.js +++ b/webaccess/res/networkconfig.js @@ -23,13 +23,9 @@ function systemCmd(cmd, iface, mode, addr, mask, gw, ssid, wpapsk) } function showStatic(iface, enable) { - var divName = iface + "StaticFields"; - var obj=document.getElementById(divName); - if (enable === true) { - obj.style.visibility="visible"; - } else { - obj.style.visibility="hidden"; - } + document.getElementById(iface + "IPaddr").disabled = !enable; + document.getElementById(iface + "Netmask").disabled = !enable; + document.getElementById(iface + "Gateway").disabled = !enable; } function applyParams(iface) { diff --git a/webaccess/res/simpledesk.css b/webaccess/res/simpledesk.css index 8bb2a379fe..10a5f0e317 100644 --- a/webaccess/res/simpledesk.css +++ b/webaccess/res/simpledesk.css @@ -1,9 +1,8 @@ -html { height: 100%; background-color: #111; } +html { height: 100%; background-color: #222; } body { margin: 0px; - background-image: linear-gradient(to bottom, #45484d 0%, #111 100%); - background-image: -webkit-linear-gradient(top, #45484d 0%, #111 100%); + background: #222; } .styled-select select { diff --git a/webaccess/res/simpledesk.js b/webaccess/res/simpledesk.js index 415cdbaac1..b09bb072b6 100644 --- a/webaccess/res/simpledesk.js +++ b/webaccess/res/simpledesk.js @@ -39,8 +39,9 @@ function connect() { }, 1000); }; - websocket.onerror = function() { + websocket.onerror = function(ev) { console.error("QLC+ connection encountered error. Closing socket"); + console.error("Error: " + ev.data) ws.close(); }; diff --git a/webaccess/res/virtualconsole.css b/webaccess/res/virtualconsole.css index 98287ecc06..0951f7187b 100644 --- a/webaccess/res/virtualconsole.css +++ b/webaccess/res/virtualconsole.css @@ -6,6 +6,10 @@ form { visibility: hidden; } +input:focus-visible { + outline: none; +} + .vcbutton-wrapper { position: absolute; } @@ -23,6 +27,10 @@ form { text-align: center; } +.vcbutton-disabled { + color: #A0A0A0!important; +} + .vccuelist { position: absolute; border: 1px solid #777777; @@ -47,6 +55,11 @@ form { text-align: center; } +.vccuelistButton-disabled { + background: #888; + opacity: 0.5; +} + .vccuelistButtonPaused { background: #5B81FF!important; } @@ -62,6 +75,11 @@ form { width: 27px; } +.vccuelistFadeButton-disabled { + background: #888; + opacity: 0.5; +} + .vccuelistProgress { margin-top: 2px; width: 100%; @@ -106,6 +124,14 @@ table.hovertable tr { background-color:#ffffff; } +table.cell-disabled tr { + background-color: #eee; + } + +table.hovertable tr:hover { + background-color:#CCD9FF; +} + table.hovertable td { border-width: 1px; padding: 3px; @@ -128,16 +154,20 @@ table.hovertable td { background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #666666), color-stop(1, #000000)); background: -webkit-linear-gradient(top, #666666 0%, #000000 100%); border-radius: 3px; - margin: 2px 2px 0 36px; + margin: 2px 0 0 2px; padding: 0 0 0 3px; height: 32px; } .vcFrameText { - display: table-cell; - height: 32px; - vertical-align: middle; - font:normal 18px/1.0em sans-serif; + height: 30px; + font:normal 14px/1.0em sans-serif; + white-space: nowrap; + overflow: hidden; + text-overflow: clip; + display: flex; + align-items: center; + flex-direction: row; } .vcframeButton { @@ -158,7 +188,7 @@ table.hovertable td { display: inline-block; background: #000000; border-radius: 3px; - margin: 2px 0 0 0; + margin: 2px 0 0 2px; height: 32px; width: 100px; text-align: center; @@ -183,7 +213,7 @@ table.hovertable td { background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #BC0A0A), color-stop(1, #370303)); background: -webkit-linear-gradient(top, #BC0A0A 0%, #370303 100%); border-radius: 3px; - margin: 2px 2px 0 36px; + margin: 2px 2px 0 2px; padding: 0 0 0 3px; height: 32px; } @@ -199,6 +229,10 @@ table.hovertable td { vertical-align: middle; } +.vclabel-disabled { + color: #A0A0A0!important; +} + .vcclock, .vcclockcount { font-size: 28px; font-weight: bold; @@ -217,9 +251,17 @@ table.hovertable td { font:normal 16px sans-serif; } +.vcslLabel-disabled { + color: #A0A0A0!important; +} + +input[type=range]{ + -webkit-appearance: none; +} + +/* Chrome, Firefox */ input[type="range"].vVertical { --rotate: 270; - -webkit-appearance: none; height: 4px; border: 1px solid #8E8A86; background-color: #888888; @@ -233,6 +275,10 @@ input[type="range"].vVertical { transform-origin:0% 50%; } +input[type="range"].vVertical-disabled { + background-color: #ccc!important; +} + input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; background-color: #999999; @@ -242,6 +288,21 @@ input[type="range"]::-webkit-slider-thumb { height: 36px; } +input[type="range"]:disabled::-webkit-slider-thumb { + -webkit-appearance: none; + background-color: #ccc; +} + +/* Firefox */ +input[type=range]::-moz-range-thumb { + background-color: #ccc; +} + +input[type="range"]:disabled::-webkit-slider-thumb { + -webkit-appearance: none; + background-color: #ccc; +} + .vcaudiotriggers { position: absolute; border: 1px solid #777777; diff --git a/webaccess/res/virtualconsole.js b/webaccess/res/virtualconsole.js index cecbc0d8a1..5641125ea4 100644 --- a/webaccess/res/virtualconsole.js +++ b/webaccess/res/virtualconsole.js @@ -21,6 +21,18 @@ function initVirtualConsole() { updateTime(); } +function grandMasterValueChanged(value, displayValue) { + obj = document.getElementById("vcGMSlider"); + obj.value = value; + var labelObj = document.getElementById("vcGMSliderLabel"); + labelObj.innerHTML = displayValue; +} + +function grandMasterValueChange() { + obj = document.getElementById("vcGMSlider"); + websocket.send("GM_VALUE|" + obj.value); +} + /* VCButton */ function buttonPress(id) { websocket.send(id + "|255"); @@ -58,38 +70,54 @@ window.addEventListener("load",() => { } }); +function setButtonDisableState(id, disable) { + var btnObj = document.getElementById(id); + if (disable === "1") { + btnObj.removeAttribute("onmousedown"); + btnObj.removeAttribute("onmouseup"); + btnObj.classList.add('vcbutton-disabled'); + } else { + btnObj.setAttribute("onmousedown", "buttonPress("+id+");"); + btnObj.setAttribute("onmouseup", "buttonRelease("+id+");"); + btnObj.classList.remove('vcbutton-disabled'); + } +} + +/* VCLabel */ +function setLabelDisableState(id, disable) { + var lblObj = document.getElementById("lbl" + id); + if (disable === "1") { + lblObj.classList.add('vclabel-disabled'); + } else { + lblObj.classList.remove('vclabel-disabled'); + } +} + /* VCCueList */ var cueListsIndices = new Array(); var showPanel = new Array(); +var isDisableCue = new Array(); function setCueIndex(id, idx) { var oldIdx = cueListsIndices[id]; if (oldIdx != undefined && oldIdx !== "-1") { var oldCueObj = document.getElementById(id + "_" + oldIdx); - oldCueObj.style.backgroundColor="#FFFFFF"; + oldCueObj.style.backgroundColor = ""; } cueListsIndices[id] = idx; var currCueObj = document.getElementById(id + "_" + idx); if (idx !== "-1") { - currCueObj.style.backgroundColor="#5E7FDF"; + currCueObj.style.setProperty("background-color", "#5E7FDF", "important"); } } function sendCueCmd(id, cmd) { + if (isDisableCue[id]) return; websocket.send(id + "|" + cmd); } -function checkMouseOut(id, idx) { - var obj = document.getElementById(id + "_" + idx); - if(idx == cueListsIndices[id]) { - obj.style.backgroundColor="#5E7FDF"; - } - else { - obj.style.backgroundColor="#FFFFFF"; - } -} - function enableCue(id, idx) { + if (isDisableCue[id]) return; setCueIndex(id, idx); websocket.send(id + "|STEP|" + idx); } @@ -105,9 +133,36 @@ function setCueProgress(id, percent, text) { progressValObj.innerHTML = text; } +function changeCueNoteToEditMode(id, idx) { + var cueNoteSpanObj = document.getElementById("cueNoteSpan" + id + "_" + idx); + var cueNoteInputObj = document.getElementById("cueNoteInput" + id + "_" + idx); + cueNoteSpanObj.style.display = "none"; + cueNoteInputObj.style.display = "block"; + cueNoteInputObj.focus(); +} + +function changeCueNoteToTextMode(id, idx) { + var cueNoteSpanObj = document.getElementById("cueNoteSpan" + id + "_" + idx); + var cueNoteInputObj = document.getElementById("cueNoteInput" + id + "_" + idx); + cueNoteSpanObj.style.display = "block"; + cueNoteInputObj.style.display = "none"; + var newNote = cueNoteInputObj.value; + cueNoteSpanObj.innerHTML = newNote; + websocket.send(id + "|CUE_STEP_NOTE|" + idx + "|" + newNote); +} + +function setCueStepNote(id, idx, note) { + var cueNoteSpanObj = document.getElementById("cueNoteSpan" + id + "_" + idx); + var cueNoteInputObj = document.getElementById("cueNoteInput" + id + "_" + idx); + cueNoteSpanObj.style.display = "block"; + cueNoteInputObj.style.display = "none"; + cueNoteSpanObj.innerHTML = note; + cueNoteInputObj.value = note; +} + function showSideFaderPanel(id, checked) { var progressBarObj = document.getElementById("fadePanel" + id); - showPanel[id] = parseInt(checked); + showPanel[id] = parseInt(checked, 10); if (checked === "1") { progressBarObj.style.display="block"; } else { @@ -127,6 +182,7 @@ function setCueButtonStyle(id, playImage, playPaused, stopImage, stopPaused) { } function wsShowCrossfadePanel(id) { + if (isDisableCue[id]) return; websocket.send(id + "|CUE_SHOWPANEL|" + showPanel[id]); } @@ -153,48 +209,103 @@ function setCueSideFaderValues(id, topPercent, bottomPercent, topStep, bottomSte } function cueCVchange(id) { + if (isDisableCue[id]) return; var cueCVObj = document.getElementById("cueC" + id); var msg = id + "|CUE_SIDECHANGE|" + cueCVObj.value; websocket.send(msg); } +function setCueDisableState(id, disable) { + isDisableCue[id] = parseInt(disable, 10); + var cueTable = document.getElementById("cueTable" + id); + var fadeObj = document.getElementById("fade" + id); + var playObj = document.getElementById("play" + id); + var stopObj = document.getElementById("stop" + id); + var nextObj = document.getElementById("next" + id); + var prevObj = document.getElementById("prev" + id); + var cueCObj = document.getElementById("cueC" + id); + var cueCTPObj = document.getElementById("cueCTP" + id); + var cueCBPObj = document.getElementById("cueCBP" + id); + + if (disable === "1") { + fadeObj.classList.add('vccuelistFadeButton-disabled'); + cueTable.classList.add('cell-disabled'); + playObj.classList.add('vccuelistButton-disabled'); + stopObj.classList.add('vccuelistButton-disabled'); + nextObj.classList.add('vccuelistButton-disabled'); + prevObj.classList.add('vccuelistButton-disabled'); + cueCObj.setAttribute("disabled", "diabled"); + cueCObj.classList.add('vVertical-disabled'); + cueCTPObj.classList.add('vcslLabel-disabled'); + cueCBPObj.classList.add('vcslLabel-disabled'); + } else { + fadeObj.classList.remove('vccuelistFadeButton-disabled'); + cueTable.classList.remove('cell-disabled'); + playObj.classList.remove('vccuelistButton-disabled'); + stopObj.classList.remove('vccuelistButton-disabled'); + nextObj.classList.remove('vccuelistButton-disabled'); + prevObj.classList.remove('vccuelistButton-disabled'); + cueCObj.removeAttribute("disabled"); + cueCObj.classList.remove('vVertical-disabled'); + cueCTPObj.classList.remove('vcslLabel-disabled'); + cueCBPObj.classList.remove('vcslLabel-disabled'); + } +} + /* VCFrame */ var framesWidth = new Array(); var framesHeight = new Array(); var framesTotalPages = new Array(); var framesCurrentPage = new Array(); +var frameDisableState = new Array(); +var frameCaption = new Array(); function updateFrameLabel(id) { - var framePageObj = document.getElementById("fr" + id + "Page"); - var newLabel = "Page " + (framesCurrentPage[id] + 1); - framePageObj.innerHTML = newLabel; + var framePageObj = document.getElementById("fr" + id + "Page"); + var newLabel = "Page " + (framesCurrentPage[id] + 1); + framePageObj.innerHTML = newLabel; + + var frameCaptionObj = document.getElementById("fr" + id + "Caption"); + var frMpHdr = document.getElementById("frMpHdr" + id); + var newCaption = frameCaption[id]; + if (frMpHdr) { // if multi page mode + newCaption = frameCaption[id] ? frameCaption[id] + " - " + newLabel : newLabel; + } + frameCaptionObj.innerHTML = newCaption; } function frameToggleCollapse(id) { var frameObj = document.getElementById("fr" + id); - var mpHeader = document.getElementById("frMpHdr" + id); + var vcframeHeader = document.getElementById("vcframeHeader" + id); + var frEnBtn = document.getElementById("frEnBtn" + id); + var frMpHdrPrev = document.getElementById("frMpHdrPrev" + id); + var frMpHdrNext = document.getElementById("frMpHdrNext" + id); + var frPglbl = document.getElementById("frPglbl" + id); + var origWidth = framesWidth[id]; var origHeight = framesHeight[id]; - if (frameObj.clientWidth === origWidth) - { + var ew = frEnBtn ? 36 : 0; + var pw = 0; + + if (frameObj.clientWidth === origWidth) { + pw = frMpHdrPrev && frMpHdrNext ? 64 : 0; frameObj.style.width = "200px"; - if (mpHeader) { - mpHeader.style.visibility = "hidden"; - } - } - else - { + if (frPglbl) frPglbl.style.width = "60px"; + if (frMpHdrPrev) frMpHdrPrev.style.display = "none"; + if (frMpHdrNext) frMpHdrNext.style.display = "none"; + vcframeHeader.style.width = (200 - pw - ew - 36) + "px"; + } else { + pw = frMpHdrPrev && frMpHdrNext ? 168 : 0; frameObj.style.width = origWidth + "px"; - if (mpHeader) { - mpHeader.style.visibility = "visible"; - } + if (frPglbl) frPglbl.style.width = "100px"; + if (frMpHdrPrev) frMpHdrPrev.style.display = "block"; + if (frMpHdrNext) frMpHdrNext.style.display = "block"; + vcframeHeader.style.width = (origWidth - pw - ew - 36) + "px"; } - if (frameObj.clientHeight === origHeight) { frameObj.style.height = "36px"; - } - else { + } else { frameObj.style.height = origHeight + "px"; } } @@ -208,7 +319,7 @@ function framePreviousPage(id) { } function setFramePage(id, page) { - var iPage = parseInt(page); + var iPage = parseInt(page, 10); if (framesCurrentPage[id] === iPage || iPage >= framesTotalPages[id]) { return; } var framePageObj = document.getElementById("fp" + id + "_" + framesCurrentPage[id]); framePageObj.style.visibility = "hidden"; @@ -218,8 +329,24 @@ function setFramePage(id, page) { updateFrameLabel(id); } +function setFrameDisableState(id, disable) { + var frameObj = document.getElementById("frEnBtn" + id); + if (disable === "1") { + frameDisableState[id] = 1; + frameObj.style.background = "#E0DFDF"; + } else { + frameDisableState[id] = 0; + frameObj.style.background = "#D7DE75"; + } +} + +function frameDisableStateChange(id) { + websocket.send(id + "|FRAME_DISABLE|" + frameDisableState[id]); +} + /* VCSlider with Knob */ var isDragging = new Array(); +var isDisableKnob = new Array(); var maxVal = new Array(); var minVal = new Array(); var initVal = new Array(); @@ -241,6 +368,44 @@ function wsSetSliderValue(id, sliderValue, displayValue) { getPositionFromValue(sliderValue, id); } +function setSliderDisableState(id, disable) { + var sliderObj = document.getElementById(id); + var slvObj = document.getElementById("slv" + id); + var slnObj = document.getElementById("sln" + id); + var pie = document.getElementById("pie" + id); + isDisableKnob[id] = parseInt(disable, 10); + isDragging[id] = false; + if (disable === "1") { + if (pie) { + if (inverted[id]) { + pie.style.setProperty('--color1', '#555'); + pie.style.setProperty('--color2', '#c0c0c0'); + } else { + pie.style.setProperty('--color1', '#c0c0c0'); + pie.style.setProperty('--color2', '#555'); + } + } + sliderObj.setAttribute("disabled", "diabled"); + sliderObj.classList.add('vVertical-disabled'); + slvObj.classList.add('vcslLabel-disabled'); + slnObj.classList.add('vcslLabel-disabled'); + } else { + if (pie) { + if (inverted[id]) { + pie.style.setProperty('--color1', '#555'); + pie.style.setProperty('--color2', 'lime'); + } else { + pie.style.setProperty('--color1', 'lime'); + pie.style.setProperty('--color2', '#555'); + } + } + sliderObj.removeAttribute("disabled"); + sliderObj.classList.remove('vVertical-disabled'); + slvObj.classList.remove('vcslLabel-disabled'); + slnObj.classList.remove('vcslLabel-disabled'); + } +} + function getPositionFromValue(val, id) { var knobRect = document.getElementById("knob" + id).getBoundingClientRect(); var pie = document.getElementById("pie" + id); @@ -255,14 +420,15 @@ function getPositionFromValue(val, id) { pie.style.setProperty('--degValue', Math.round(angle)); if (inverted[id]) { pie.style.setProperty('--color1', '#555'); - pie.style.setProperty('--color2', 'lime'); + pie.style.setProperty('--color2', isDisableKnob[id] ? '#c0c0c0' : 'lime'); } else { - pie.style.setProperty('--color1', 'lime'); + pie.style.setProperty('--color1', isDisableKnob[id] ? '#c0c0c0' : 'lime'); pie.style.setProperty('--color2', '#555'); } } function onMouseMove(e) { + if (isDisableKnob[selectedID]) return; if (isDragging[selectedID]) { pie = document.getElementById("pie" + selectedID); knob = document.getElementById("knob" + selectedID); @@ -297,7 +463,8 @@ function onMouseMove(e) { } } } -function onMouseUp() { +function onMouseUp() { + if (isDisableKnob[selectedID]) return; isDragging[selectedID] = false; var knob = document.getElementById("knob" + selectedID); knob.style.transition = "transform 0.2s ease"; @@ -385,15 +552,29 @@ function wsUpdateClockTime(id, time) { var obj = document.getElementById(id); var s = time; var h, m; - h = parseInt(s / 3600); + h = parseInt(s / 3600, 10); s -= (h * 3600); - m = parseInt(s / 60); + m = parseInt(s / 60, 10); s -= (m * 60); var timeString = hmsToString(h, m, s); obj.innerHTML = timeString; } +function setClockDisableState(id, disable) { + var clockObj = document.getElementById(id); + + if (disable === "1") { + clockObj.removeAttribute("href"); + clockObj.removeAttribute("oncontextmenu"); + clockObj.classList.add('vclabel-disabled'); + } else { + clockObj.setAttribute("href", "javascript:controlWatch("+id+", 'S');"); + clockObj.setAttribute("oncontextmenu", "javascript:controlWatch("+id+", 'R'); return false;"); + clockObj.classList.remove('vclabel-disabled'); + } +} + /* VCMatrix */ var matrixID = 0; var m_isDragging = new Array(); @@ -430,7 +611,6 @@ function setMatrixComboValue(id, comboValue) { function matrixStartColorChange(id) { var colorObj = document.querySelector("#msc" + id); var colorMsg = id + "|MATRIX_COLOR_CHANGE|START|" + hexToUint(colorObj.value); - console.log(colorMsg); websocket.send(colorMsg); } @@ -521,7 +701,7 @@ window.addEventListener("load", (event) => { }); function setMatrixControlKnobValue(controlID, value) { - getPositionFromValueForMatrix(parseInt(value), parseInt(controlID)); + getPositionFromValueForMatrix(parseInt(value, 10), parseInt(controlID, 10)); } function wcMatrixPushButtonClicked(controlID) { diff --git a/webaccess/res/websocket.js b/webaccess/res/websocket.js index 6c1e0291ee..8b558babf4 100644 --- a/webaccess/res/websocket.js +++ b/webaccess/res/websocket.js @@ -46,21 +46,39 @@ function connect() { websocket.onmessage = function (ev) { //console.log(ev.data); var msgParams = ev.data.split("|"); + if (msgParams[0] === "GM_VALUE") { + grandMasterValueChanged(msgParams[1], msgParams[2]); + } + if (msgParams[1] === "BUTTON") { wsSetButtonState(msgParams[0], msgParams[2]); + } else if (msgParams[1] === "BUTTON_DISABLE") { + setButtonDisableState(msgParams[0], msgParams[2]); + } else if (msgParams[1] === "LABEL_DISABLE") { + setLabelDisableState(msgParams[0], msgParams[2]); } else if (msgParams[1] === "SLIDER") { // Slider message is |SLIDER|| wsSetSliderValue(msgParams[0], msgParams[2], msgParams[3]); + } else if (msgParams[1] === "SLIDER_DISABLE") { + setSliderDisableState(msgParams[0], msgParams[2]); } else if (msgParams[1] === "AUDIOTRIGGERS") { wsSetAudioTriggersEnabled(msgParams[0], msgParams[2]); } else if (msgParams[1] === "CUE") { wsSetCueIndex(msgParams[0], msgParams[2]); + } else if (msgParams[1] === "CUE_DISABLE") { + setCueDisableState(msgParams[0], msgParams[2]); } else if (msgParams[1] === "CLOCK") { wsUpdateClockTime(msgParams[0], msgParams[2]); + } else if (msgParams[1] === "CLOCK_DISABLE") { + setClockDisableState(msgParams[0], msgParams[2]); } else if (msgParams[1] === "FRAME") { setFramePage(msgParams[0], msgParams[2]); + } else if (msgParams[1] === "FRAME_DISABLE") { + setFrameDisableState(msgParams[0], msgParams[2]); } else if (msgParams[0] === "ALERT") { alert(msgParams[1]); + } else if (msgParams[1] === "CUE_STEP_NOTE") { + setCueStepNote(msgParams[0], msgParams[2], msgParams[3]); } else if (msgParams[1] === "CUE_PROGRESS") { // CUE message is |CUE_PERCENT|| setCueProgress(msgParams[0], msgParams[2], msgParams[3]); diff --git a/webaccess/src/webaccess.cpp b/webaccess/src/webaccess.cpp index 0c6eff9a93..7749d95a22 100644 --- a/webaccess/src/webaccess.cpp +++ b/webaccess/src/webaccess.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "webaccess.h" @@ -29,6 +30,7 @@ #include "webaccessnetwork.h" #include "vcaudiotriggers.h" #include "virtualconsole.h" +#include "rgbalgorithm.h" #include "commonjscss.h" #include "vcsoloframe.h" #include "outputpatch.h" @@ -40,14 +42,15 @@ #include "vcbutton.h" #include "vcslider.h" #include "function.h" +#include "vcmatrix.h" #include "vclabel.h" #include "vcframe.h" #include "vcclock.h" -#include "vcmatrix.h" -#include "rgbalgorithm.h" +#include "vcxypad.h" #include "qlcfile.h" #include "chaser.h" #include "doc.h" +#include "grandmaster.h" #include "audiocapture.h" #include "audiorenderer.h" @@ -466,7 +469,7 @@ void WebAccess::slotHandleWebSocketRequest(QHttpConnection *conn, QString data) if (cmdList.at(1) == "NETWORK") { - if (m_netConfig->updateNetworkFile(cmdList) == true) + if (m_netConfig->updateNetworkSettings(cmdList) == true) { QString wsMessage = QString("ALERT|" + tr("Network configuration changed. Reboot to apply the changes.")); conn->webSocketWrite(QHttpConnection::TextFrame, wsMessage.toUtf8()); @@ -648,7 +651,57 @@ void WebAccess::slotHandleWebSocketRequest(QHttpConnection *conn, QString data) wsAPIMessage.append("STOP"); } break; + case VCWidget::AnimationWidget: + { + VCMatrix *animation = qobject_cast(widget); + wsAPIMessage.append(QString::number(animation->sliderValue())); + } + break; + default: + { + wsAPIMessage.append("0"); + } + break; + } + } + } + else if (apiCmd == "getWidgetSubIdList") + { + if (cmdList.count() < 3) + return; + + quint32 wID = cmdList[2].toUInt(); + VCWidget *widget = m_vc->widget(wID); + switch(widget->type()) + { + case VCWidget::AnimationWidget: + { + VCMatrix *animation = qobject_cast(widget); + + QMapIterator it(animation->customControlsMap()); + while (it.hasNext() == true) + { + it.next(); + wsAPIMessage.append(QString("%1|%2|").arg(it.key()).arg(it.value())); + } + // remove trailing separator + wsAPIMessage.truncate(wsAPIMessage.length() - 1); } + break; + case VCWidget::XYPadWidget: + { + VCXYPad *xypad = qobject_cast(widget); + + QMapIterator it(xypad->presetsMap()); + while (it.hasNext() == true) + { + it.next(); + wsAPIMessage.append(QString("%1|%2|").arg(it.key()).arg(it.value())); + } + // remove trailing separator + wsAPIMessage.truncate(wsAPIMessage.length() - 1); + } + break; } } else if (apiCmd == "getChannelsValues") @@ -712,6 +765,12 @@ void WebAccess::slotHandleWebSocketRequest(QHttpConnection *conn, QString data) return; } + else if (cmdList[0] == "GM_VALUE") + { + uchar value = cmdList[1].toInt(); + m_doc->inputOutputMap()->setGrandMasterValue(value); + + } else if (cmdList[0] == "POLL") return; @@ -772,7 +831,9 @@ void WebAccess::slotHandleWebSocketRequest(QHttpConnection *conn, QString data) else if (cmdList[1] == "NEXT") cue->slotNextCue(); else if (cmdList[1] == "STEP") - cue->playCueAtIndex(cmdList[2].toInt()); + cue->slotCurrentStepChanged(cmdList[2].toInt()); + else if (cmdList[1] == "CUE_STEP_NOTE") + cue->slotStepNoteChanged(cmdList[2].toInt(), cmdList[3]); else if (cmdList[1] == "CUE_SHOWPANEL") cue->slotSideFaderButtonChecked(cmdList[2] == "1" ? false : true); else if (cmdList[1] == "CUE_SIDECHANGE") @@ -787,6 +848,8 @@ void WebAccess::slotHandleWebSocketRequest(QHttpConnection *conn, QString data) frame->slotNextPage(); else if (cmdList[1] == "PREV_PG") frame->slotPreviousPage(); + else if (cmdList[1] == "FRAME_DISABLE") + frame->setDisableState(cmdList[2] == "1" ? false : true); } break; case VCWidget::ClockWidget: @@ -915,52 +978,102 @@ void WebAccess::slotFramePageChanged(int pageNum) sendWebSocketMessage(ba); } +void WebAccess::slotFrameDisableStateChanged(bool disable) +{ + VCWidget *frame = qobject_cast(sender()); + if (frame == NULL) + return; + + QString wsMessage = QString("%1|FRAME_DISABLE|%2").arg(frame->id()).arg(disable); + QByteArray ba = wsMessage.toUtf8(); + + sendWebSocketMessage(ba); +} + + QString WebAccess::getFrameHTML(VCFrame *frame) { QColor border(90, 90, 90); QSize origSize = frame->originalSize(); int w = frame->isCollapsed() ? 200 : origSize.width(); int h = frame->isCollapsed() ? 36 : origSize.height(); + // page select component width + margin + int pw = frame->multipageMode() ? frame->isCollapsed() ? 64 : 168 : 0; + // enable button width + margin + int ew = frame->isEnableButtonVisible() ? 36 : 0; + // collapse button width + margin + int cw = 36; + // header width + int hw = w - pw - ew - cw; + // header caption + QString caption = ""; + if (frame->multipageMode()) { + caption = QString(frame->caption()) != "" + ? QString("%1 - Page: %2").arg(frame->caption()).arg(frame->currentPage() + 1) + : QString("Page: %1").arg(frame->currentPage() + 1); + } else { + caption = QString(frame->caption()); + } QString str = "
    id()) + "\" " - "style=\"left: " + QString::number(frame->x()) + - "px; top: " + QString::number(frame->y()) + "px; width: " + QString::number(w) + - "px; height: " + QString::number(h) + "px; " - "background-color: " + frame->backgroundColor().name() + "; " + - getWidgetBackgroundImage(frame) + - "border: 1px solid " + border.name() + ";\">\n"; + "style=\"left: " + QString::number(frame->x()) + + "px; top: " + QString::number(frame->y()) + "px; width: " + QString::number(w) + + "px; height: " + QString::number(h) + "px; " + "background-color: " + frame->backgroundColor().name() + "; " + getWidgetBackgroundImage(frame) + + "border: 1px solid " + border.name() + ";\">\n"; str += getChildrenHTML(frame, frame->totalPagesNumber(), frame->currentPage()); if (frame->isHeaderVisible()) { - str += "id()) + ");\">\n"; - str += "
    foregroundColor().name() + ";\">
    " + frame->caption() + "
    \n"; + str += "
    "; + str += "id()) + ");\">\n"; + + str += "
    id()) + "\" style=\"color:" + + frame->foregroundColor().name() + "; width: "+ QString::number(hw) +"px \">"; + str += "
    id()) + "Caption\">" +(caption) + "
    \n"; + str += "
    \n"; + + m_JScode += "frameCaption[" + QString::number(frame->id()) + "] = \"" + QString(frame->caption()) + "\";\n"; + + if (frame->isEnableButtonVisible()) { + str += "id()) +"\" " + + "style=\" background-color: " + QString((frame->isDisabled() ? "#E0DFDF" : "#D7DE75" )) + "; \" " + + "href=\"javascript:frameDisableStateChange(" + QString::number(frame->id()) + ");\">" + + "\n"; + + m_JScode += "frameDisableState[" + QString::number(frame->id()) + "] = " + QString::number(frame->isDisabled() ? 1 : 0) + ";\n"; + connect(frame, SIGNAL(disableStateChanged(bool)), this, SLOT(slotFrameDisableStateChanged(bool))); + } m_JScode += "framesWidth[" + QString::number(frame->id()) + "] = " + QString::number(origSize.width()) + ";\n"; m_JScode += "framesHeight[" + QString::number(frame->id()) + "] = " + QString::number(origSize.height()) + ";\n"; if (frame->multipageMode()) { - str += "
    id()) + "\""; - str += "style=\"position: absolute; top: 0; right: 2px;\">\n"; - str += "id()) + ");\">"; - str += ""; - str += "
    id()) + "Page\">"; - str += QString ("%1 %2").arg(tr("Page")).arg(frame->currentPage() + 1) + "
    "; - str += "id()) + ");\">"; - str += "\n"; + str += "
    id()) + "\" style=\"display:flex; align-items:center; justify-content:center; flex-direction:row; margin-right: 2px;\">\n"; + + str += "id()) + "\" href=\"javascript:framePreviousPage(" + + QString::number(frame->id()) + ");\" style=\"display: " + QString(!frame->isCollapsed() ? "block" : "none") + "\">" + + ""; + + str += "
    id()) + "\" style=\"width: "+QString::number(frame->isCollapsed() ? 60 : 100)+"px; \" >"+ + "
    id()) + "Page\">" + + QString("Page: %1").arg(frame->currentPage() + 1) + "
    \n"; + + str += "id()) + "\" href=\"javascript:frameNextPage(" + + QString::number(frame->id()) + ");\" style=\"display: " + QString(!frame->isCollapsed() ? "block" : "none") + "\">" + + "\n"; + + str += "
    \n"; m_JScode += "framesCurrentPage[" + QString::number(frame->id()) + "] = " + QString::number(frame->currentPage()) + ";\n"; m_JScode += "framesTotalPages[" + QString::number(frame->id()) + "] = " + QString::number(frame->totalPagesNumber()) + ";\n\n"; - connect(frame, SIGNAL(pageChanged(int)), - this, SLOT(slotFramePageChanged(int))); + connect(frame, SIGNAL(pageChanged(int)), this, SLOT(slotFramePageChanged(int))); } + str += "
    \n"; } str += "
    \n"; @@ -974,46 +1087,83 @@ QString WebAccess::getSoloFrameHTML(VCSoloFrame *frame) QSize origSize = frame->originalSize(); int w = frame->isCollapsed() ? 200 : origSize.width(); int h = frame->isCollapsed() ? 36 : origSize.height(); + // page select component width + margin + int pw = frame->multipageMode() ? frame->isCollapsed() ? 64 : 168 : 0; + // enable button width + margin + int ew = frame->isEnableButtonVisible() ? 36 : 0; + // collapse button width + margin + int cw = 36; + // header width + int hw = w - pw - ew - cw; + // header caption + QString caption = ""; + if (frame->multipageMode()) { + caption = QString(frame->caption()) != "" + ? QString("%1 - Page: %2").arg(frame->caption()).arg(frame->currentPage() + 1) + : QString("Page: %1").arg(frame->currentPage() + 1); + } else { + caption = QString(frame->caption()); + } QString str = "
    id()) + "\" " - "style=\"left: " + QString::number(frame->x()) + - "px; top: " + QString::number(frame->y()) + "px; width: " + QString::number(w) + - "px; height: " + QString::number(h) + "px; " - "background-color: " + frame->backgroundColor().name() + "; " + - getWidgetBackgroundImage(frame) + - "border: 1px solid " + border.name() + ";\">\n"; + "style=\"left: " + QString::number(frame->x()) + + "px; top: " + QString::number(frame->y()) + "px; width: " + QString::number(w) + + "px; height: " + QString::number(h) + "px; " + "background-color: " + frame->backgroundColor().name() + "; " + getWidgetBackgroundImage(frame) + + "border: 1px solid " + border.name() + ";\">\n"; str += getChildrenHTML(frame, frame->totalPagesNumber(), frame->currentPage()); if (frame->isHeaderVisible()) { - str += "id()) + ");\">\n"; - str += "
    foregroundColor().name() + ";\">
    " + frame->caption() + "
    \n"; + str += "
    "; + str += "id()) + ");\">\n"; + + str += "
    id()) + "\" style=\"color:" + + frame->foregroundColor().name() + "; width: "+ QString::number(hw) +"px \">"; + str += "
    id()) + "Caption\">" +(caption) + "
    \n"; + str += "
    \n"; + + m_JScode += "frameCaption[" + QString::number(frame->id()) + "] = \"" + QString(frame->caption()) + "\";\n"; + + if (frame->isEnableButtonVisible()) { + str += "id()) +"\" " + + "style=\" background-color: " + QString((frame->isDisabled() ? "#E0DFDF" : "#D7DE75")) + "; \" " + + "href=\"javascript:frameDisableStateChange(" + QString::number(frame->id()) + ");\">" + + "\n"; + + m_JScode += "frameDisableState[" + QString::number(frame->id()) + "] = " + QString::number(frame->isDisabled() ? 1 : 0) + ";\n"; + connect(frame, SIGNAL(disableStateChanged(bool)), this, SLOT(slotFrameDisableStateChanged(bool))); + } m_JScode += "framesWidth[" + QString::number(frame->id()) + "] = " + QString::number(origSize.width()) + ";\n"; m_JScode += "framesHeight[" + QString::number(frame->id()) + "] = " + QString::number(origSize.height()) + ";\n"; if (frame->multipageMode()) { - str += "
    id()) + "\""; - str += "style=\"position: absolute; top: 0; right: 2px;\">\n"; - str += "id()) + ");\">"; - str += ""; - str += "
    id()) + "Page\">"; - str += QString ("%1 %2").arg(tr("Page")).arg(frame->currentPage() + 1) + "
    "; - str += "id()) + ");\">"; - str += "\n"; + str += "
    id()) + "\" style=\"display:flex; align-items:center; justify-content:center; flex-direction:row; margin-right: 2px;\">\n"; + + str += "id()) + "\" href=\"javascript:framePreviousPage(" + + QString::number(frame->id()) + ");\" style=\"display: " + QString(!frame->isCollapsed() ? "block" : "none") + "\">" + + ""; + + str += "
    id()) + "\" style=\"width: "+QString::number(frame->isCollapsed() ? 60 : 100)+"px; \" >"+ + "
    id()) + "Page\">" + + QString("Page: %1").arg(frame->currentPage() + 1) + "
    \n"; + + str += "id()) + "\" href=\"javascript:frameNextPage(" + + QString::number(frame->id()) + ");\" style=\"display: " + QString(!frame->isCollapsed() ? "block" : "none") + "\">" + + "\n"; + + str += "
    \n"; m_JScode += "framesCurrentPage[" + QString::number(frame->id()) + "] = " + QString::number(frame->currentPage()) + ";\n"; m_JScode += "framesTotalPages[" + QString::number(frame->id()) + "] = " + QString::number(frame->totalPagesNumber()) + ";\n\n"; - connect(frame, SIGNAL(pageChanged(int)), - this, SLOT(slotFramePageChanged(int))); + connect(frame, SIGNAL(pageChanged(int)), this, SLOT(slotFramePageChanged(int))); } + str += "
    \n"; } str += "
    \n"; @@ -1040,6 +1190,18 @@ void WebAccess::slotButtonStateChanged(int state) sendWebSocketMessage(wsMessage.toUtf8()); } +void WebAccess::slotButtonDisableStateChanged(bool disable) +{ + VCButton *btn = qobject_cast(sender()); + if (btn == NULL) + return; + + QString wsMessage = QString("%1|BUTTON_DISABLE|%2").arg(btn->id()).arg(disable); + QByteArray ba = wsMessage.toUtf8(); + + sendWebSocketMessage(ba); +} + QString WebAccess::getButtonHTML(VCButton *btn) { QString onCSS = ""; @@ -1051,11 +1213,13 @@ QString WebAccess::getButtonHTML(VCButton *btn) QString str = "
    x()) + "px; " "top: " + QString::number(btn->y()) + "px;\">\n"; - str += "id()) + "\" " - "href=\"javascript:void(0);\" " - "onmousedown=\"buttonPress(" + QString::number(btn->id()) + ");\" " - "onmouseup=\"buttonRelease(" + QString::number(btn->id()) + ");\" " - "style=\"" + str += "isDisabled() ? " vcbutton-disabled" : "") + "\" " + " id=\"" + QString::number(btn->id()) + "\" href=\"javascript:void(0);\" "; + if (!btn->isDisabled()) { + str += "onmousedown=\"buttonPress(" + QString::number(btn->id()) + ");\" " + "onmouseup=\"buttonRelease(" + QString::number(btn->id()) + ");\" "; + } + str += "style=\"" "width: " + QString::number(btn->width()) + "px; " "height: " + QString::number(btn->height()) + "px; " "color: " + btn->foregroundColor().name() + "; " + @@ -1065,6 +1229,8 @@ QString WebAccess::getButtonHTML(VCButton *btn) connect(btn, SIGNAL(stateChanged(int)), this, SLOT(slotButtonStateChanged(int))); + connect(btn, SIGNAL(disableStateChanged(bool)), + this, SLOT(slotButtonDisableStateChanged(bool))); return str; } @@ -1081,6 +1247,18 @@ void WebAccess::slotSliderValueChanged(QString val) sendWebSocketMessage(wsMessage.toUtf8()); } +void WebAccess::slotSliderDisableStateChanged(bool disable) +{ + VCSlider *slider = qobject_cast(sender()); + if (slider == NULL) + return; + + QString wsMessage = QString("%1|SLIDER_DISABLE|%2").arg(slider->id()).arg(disable); + QByteArray ba = wsMessage.toUtf8(); + + sendWebSocketMessage(ba); +} + QString WebAccess::getSliderHTML(VCSlider *slider) { QString slID = QString::number(slider->id()); @@ -1095,7 +1273,7 @@ QString WebAccess::getSliderHTML(VCSlider *slider) str += "
    "; - str += "
    " + slider->topLabelText() + "
    \n"; + str += "
    isDisabled() ? " vcslLabel-disabled" : "") + "\">" + slider->topLabelText() + "
    \n"; int mt = slider->invertedAppearance() ? -slider->height() + 50 : slider->height() - 50; int rotate = slider->invertedAppearance() ? 90 : 270; @@ -1106,7 +1284,7 @@ QString WebAccess::getSliderHTML(VCSlider *slider) max = slider->levelHighLimit(); } - str += "isDisabled() ? " vVertical-disabled" : "") + "\" " "id=\"" + slID + "\" " "oninput=\"slVchange(" + slID + ");\" ontouchmove=\"slVchange(" + slID + ");\" " "style=\"display: "+(slider->widgetStyle() == VCSlider::SliderWidgetStyle::WSlider ? "block" : "none") +"; " @@ -1115,7 +1293,10 @@ QString WebAccess::getSliderHTML(VCSlider *slider) "margin-left: " + QString::number(slider->width() / 2) + "px; " "--rotate: "+QString::number(rotate)+"\" " "min=\""+QString::number(min)+"\" max=\""+QString::number(max)+"\" " - "step=\"1\" value=\"" + QString::number(slider->sliderValue()) + "\">\n"; + "step=\"1\" value=\"" + QString::number(slider->sliderValue()) + "\""; + if (slider->isDisabled()) + str += " disabled "; + str += ">\n"; if (slider->widgetStyle() == VCSlider::SliderWidgetStyle::WKnob) { int shortSide = slider->width() > slider->height() ? slider->height() : slider->width(); @@ -1128,10 +1309,10 @@ QString WebAccess::getSliderHTML(VCSlider *slider) if (spotWidth < 6) spotWidth = 6; str += "
    "; - str += "
    "; - str += "
    "; - str += "
    "; - str += "
    "; + str += "
    isDisabled() ? "#c0c0c0" : "lime") + ";--pieWidth: " + QString::number(pieWidth) + "px;\">"; + str += "
    "; + str += "
    "; + str += "
    "; str += "
    \n
    \n
    \n
    \n"; m_JScode += "maxVal[" + slID + "] = " + QString::number(max) + "; \n"; @@ -1139,32 +1320,53 @@ QString WebAccess::getSliderHTML(VCSlider *slider) m_JScode += "initVal[" + slID + "] = " + QString::number(slider->sliderValue()) + "; \n"; m_JScode += "inverted[" + slID + "] = " + QString::number(slider->invertedAppearance()) + "; \n"; m_JScode += "isDragging[" + slID + "] = false;\n"; + m_JScode += "isDisableKnob[" + slID + "] = "+QString::number(slider->isDisabled() ? 1 : 0)+";\n"; } - str += "
    " +slider->caption() + "
    "; + str += "
    isDisabled() ? " vcslLabel-disabled" : "") + "\">" +slider->caption() + "
    "; str += "
    \n"; str += "
    \n"; connect(slider, SIGNAL(valueChanged(QString)), this, SLOT(slotSliderValueChanged(QString))); + connect(slider, SIGNAL(disableStateChanged(bool)), + this, SLOT(slotSliderDisableStateChanged(bool))); return str; } +void WebAccess::slotLabelDisableStateChanged(bool disable) +{ + VCLabel *label = qobject_cast(sender()); + if (label == NULL) + return; + + QString wsMessage = QString("%1|LABEL_DISABLE|%2").arg(label->id()).arg(disable); + QByteArray ba = wsMessage.toUtf8(); + + sendWebSocketMessage(ba); +} + QString WebAccess::getLabelHTML(VCLabel *label) { QString str = "
    x()) + "px; " "top: " + QString::number(label->y()) + "px;\">\n"; - str += "
    width()) + "px; " - "height: " + QString::number(label->height()) + "px; " + str += "
    id()) + "\" " + "class=\"vclabel" + QString(label->isDisabled() ? " vclabel-disabled" : "") + "\" " + "style=\"width: " + QString::number(label->width()) + "px; "; + if (m_doc->mode() != Doc::Design) + str += "border: none!important; "; + str += "height: " + QString::number(label->height()) + "px; " "color: " + label->foregroundColor().name() + "; " "background-color: " + label->backgroundColor().name() + "; " + getWidgetBackgroundImage(label) + "\">" + label->caption() + "
    \n
    \n"; + connect(label, SIGNAL(disableStateChanged(bool)), + this, SLOT(slotLabelDisableStateChanged(bool))); + return str; } @@ -1219,6 +1421,17 @@ void WebAccess::slotCueIndexChanged(int idx) sendWebSocketMessage(wsMessage.toUtf8()); } +void WebAccess::slotCueStepNoteChanged(int idx, QString note) +{ + VCCueList *cue = qobject_cast(sender()); + if (cue == NULL) + return; + + QString wsMessage = QString("%1|CUE_STEP_NOTE|%2|%3").arg(cue->id()).arg(idx).arg(note); + + sendWebSocketMessage(wsMessage.toUtf8()); +} + void WebAccess::slotCueProgressStateChanged() { VCCueList *cue = qobject_cast(sender()); @@ -1302,6 +1515,18 @@ void WebAccess::slotCuePlaybackStateChanged() sendWebSocketMessage(wsMessage.toUtf8()); } +void WebAccess::slotCueDisableStateChanged(bool disable) +{ + VCCueList *cue = qobject_cast(sender()); + if (cue == NULL) + return; + + QString wsMessage = QString("%1|CUE_DISABLE|%2").arg(cue->id()).arg(disable); + QByteArray ba = wsMessage.toUtf8(); + + sendWebSocketMessage(ba); +} + QString WebAccess::getCueListHTML(VCCueList *cue) { QString str = "
    id()) + "\" " @@ -1342,36 +1567,36 @@ QString WebAccess::getCueListHTML(VCCueList *cue) if (cue->sideFaderMode() == VCCueList::FaderMode::Crossfade) { str += "
    "; - str += "
    id())+"\" class=\"vcslLabel\" style=\"top:0px;\">" + + str += "
    id())+"\" class=\"vcslLabel" + QString(cue->isDisabled() ? " vcslLabel-disabled" : "") + "\" style=\"top:0px;\">" + cue->topPercentageValue() + "
    \n"; str += "
    id())+"\" class=\"vcslLabel\" " "style=\"top:25px; border: solid 1px #aaa; background-color: "+ topStepBgColor +" \">" + cue->topStepValue() + "
    \n"; - str += "id())+"\" " + str += "isDisabled() ? " vVertical-disabled" : "") + "\" id=\"cueC"+QString::number(cue->id())+"\" " "oninput=\"cueCVchange("+QString::number(cue->id())+");\" ontouchmove=\"cueCVchange("+QString::number(cue->id())+");\" " "style=\"width: " + QString::number(cue->height() - 100) + "px; margin-top: " + QString::number(cue->height() - 100) + "px; margin-left: 22px;\" "; - str += "min=\"0\" max=\"100\" step=\"1\" value=\"" + QString::number(cue->sideFaderValue()) + "\">\n"; + str += "min=\"0\" max=\"100\" step=\"1\" value=\"" + QString::number(cue->sideFaderValue()) + "\" " + QString(cue->isDisabled() ? "disabled" : "") + " >\n"; str += "
    id())+"\" class=\"vcslLabel\" " "style=\"bottom:25px; border: solid 1px #aaa; background-color: "+ bottomStepBgColor +"\">" + cue->bottomStepValue() + "
    \n"; - str += "
    id())+"\" class=\"vcslLabel\" style=\"bottom:0px;\">" + + str += "
    id())+"\" class=\"vcslLabel" + QString(cue->isDisabled() ? " vcslLabel-disabled" : "") + "\" style=\"bottom:0px;\">" + cue->bottomPercentageValue() + "
    \n"; str += "
    "; } if (cue->sideFaderMode() == VCCueList::FaderMode::Steps) { str += "
    "; - str += "
    id())+"\" class=\"vcslLabel\" style=\"top:0px;\">" + + str += "
    id())+"\" class=\"vcslLabel" + QString(cue->isDisabled() ? " vcslLabel-disabled" : "") + "\" style=\"top:0px;\">" + cue->topPercentageValue() + "
    \n"; - str += "id())+"\" " - "oninput=\"cueCVchange("+QString::number(cue->id())+");\" ontouchmove=\"cueCVchange("+QString::number(cue->id())+");\" " + str += "isDisabled() ? " vVertical-disabled" : "") + "\" id=\"cueC" + QString::number(cue->id()) + "\" " + "oninput=\"cueCVchange(" + QString::number(cue->id()) + ");\" ontouchmove=\"cueCVchange(" + QString::number(cue->id())+");\" " "style=\"width: " + QString::number(cue->height() - 50) + "px; margin-top: " + QString::number(cue->height() - 50) + "px; margin-left: 22px;\" "; - str += "min=\"0\" max=\"255\" step=\"1\" value=\"" + QString::number(cue->sideFaderValue()) + "\">\n"; + str += "min=\"0\" max=\"255\" step=\"1\" value=\"" + QString::number(cue->sideFaderValue()) + "\" " + QString(cue->isDisabled() ? "disabled" : "") + " >\n"; str += "
    id())+"\" class=\"vcslLabel\" style=\"bottom:25px; border: solid 1px #aaa; \">" + cue->bottomStepValue() + "
    \n"; @@ -1383,7 +1608,7 @@ QString WebAccess::getCueListHTML(VCCueList *cue) str += "
    height() - 54) + "px; overflow: scroll;\" >\n"; - str += "\n"; + str += "
    isDisabled() ? " cell-disabled" : "") + "\" id=\"cueTable" + QString::number(cue->id()) + "\" style=\"width: 100%;\">\n"; str += ""; str += ""; str += ""; @@ -1396,9 +1621,8 @@ QString WebAccess::getCueListHTML(VCCueList *cue) { QString stepID = QString::number(cue->id()) + "_" + QString::number(i); str += "id()) + ", " + QString::number(i) + ");\" " - "onmouseover=\"this.style.backgroundColor='#CCD9FF';\" " - "onmouseout=\"checkMouseOut(" + QString::number(cue->id()) + ", " + QString::number(i) + ");\">\n"; + "onclick=\"enableCue(" + QString::number(cue->id()) + ", " + QString::number(i) + ");\">\n"; + ChaserStep *step = chaser->stepAt(i); str += ""; Function* function = doc->function(step->fid); @@ -1479,7 +1703,11 @@ QString WebAccess::getCueListHTML(VCCueList *cue) str += ""; } - str += "\n"; + str += "\n"; } str += "\n"; } @@ -1489,9 +1717,9 @@ QString WebAccess::getCueListHTML(VCCueList *cue) // progress bar str += "
    "; - str += "
    id())+"\" style=\"width: " + - QString::number(cue->progressPercent())+ "%; \">
    "; - str += "
    id())+"\">" + + str += "
    id()) + "\" style=\"width: " + + QString::number(cue->progressPercent()) + "%; \">
    "; + str += "
    id())+"\">" + QString(cue->progressText()) + "
    "; str += "
    "; @@ -1499,7 +1727,7 @@ QString WebAccess::getCueListHTML(VCCueList *cue) if (cue->sideFaderMode() != VCCueList::FaderMode::None) { str += "
    "; - str += "id()) + "\" "; + str += "isDisabled() ? " vccuelistFadeButton-disabled" : "") + "\" id=\"fade" + QString::number(cue->id()) + "\" "; str += "href=\"javascript:wsShowCrossfadePanel(" + QString::number(cue->id()) + ");\">\n"; str += "\n"; } @@ -1533,19 +1761,19 @@ QString WebAccess::getCueListHTML(VCCueList *cue) stopButtonImage = "player_pause.png"; } - str += "id()) + "\" "; + str += "isDisabled() ? " vccuelistButton-disabled" : "") + QString(playbackButtonPaused ? " vccuelistButtonPaused" : "")+"\" id=\"play" + QString::number(cue->id()) + "\" "; str += "href=\"javascript:sendCueCmd(" + QString::number(cue->id()) + ", 'PLAY');\">\n"; str += "\n"; - str += "id()) + "\" "; + str += "isDisabled() ? " vccuelistButton-disabled" : "") + QString(stopButtonPaused ? " vccuelistButtonPaused" : "")+"\" id=\"stop" + QString::number(cue->id()) + "\" "; str += "href=\"javascript:sendCueCmd(" + QString::number(cue->id()) + ", 'STOP');\">\n"; str += "\n"; - str += "isDisabled() ? " vccuelistButton-disabled" : "") + "\" id=\"prev" + QString::number(cue->id()) + "\" href=\"javascript:sendCueCmd("; str += QString::number(cue->id()) + ", 'PREV');\">\n"; str += "\n"; - str += "isDisabled() ? " vccuelistButton-disabled" : "") + "\" id=\"next" + QString::number(cue->id()) + "\" href=\"javascript:sendCueCmd("; str += QString::number(cue->id()) + ", 'NEXT');\" style=\"margin-right: 0px!important;\">\n"; str += "\n"; @@ -1559,8 +1787,12 @@ QString WebAccess::getCueListHTML(VCCueList *cue) str += "
    \n"; + m_JScode += "isDisableCue[" + QString::number(cue->id()) + "] = " + QString::number(cue->isDisabled()) + ";\n"; + connect(cue, SIGNAL(stepChanged(int)), this, SLOT(slotCueIndexChanged(int))); + connect(cue, SIGNAL(stepNoteChanged(int, QString)), + this, SLOT(slotCueStepNoteChanged(int, QString))); connect(cue, SIGNAL(progressStateChanged()), this, SLOT(slotCueProgressStateChanged())); connect(cue, SIGNAL(sideFaderButtonChecked()), @@ -1575,6 +1807,8 @@ QString WebAccess::getCueListHTML(VCCueList *cue) this, SLOT(slotCuePlaybackStateChanged())); connect(cue, SIGNAL(playbackStatusChanged()), this, SLOT(slotCuePlaybackStateChanged())); + connect(cue, SIGNAL(disableStateChanged(bool)), + this, SLOT(slotCueDisableStateChanged(bool))); return str; } @@ -1589,17 +1823,29 @@ void WebAccess::slotClockTimeChanged(quint32 time) sendWebSocketMessage(wsMessage.toUtf8()); } +void WebAccess::slotClockDisableStateChanged(bool disable) +{ + VCClock *clock = qobject_cast(sender()); + if (clock == NULL) + return; + + QString wsMessage = QString("%1|CLOCK_DISABLE|%2").arg(clock->id()).arg(disable); + QByteArray ba = wsMessage.toUtf8(); + + sendWebSocketMessage(ba); +} + QString WebAccess::getClockHTML(VCClock *clock) { QString str = "\n"; + connect(clock, SIGNAL(disableStateChanged(bool)), + this, SLOT(slotClockDisableStateChanged(bool))); + return str; } @@ -1906,12 +2159,72 @@ QString WebAccess::getChildrenHTML(VCWidget *frame, int pagesNum, int currentPag return unifiedHTML; } +void WebAccess::slotGrandMasterValueChanged(uchar value) +{ + GrandMaster::ValueMode gmValueMode = m_vc->properties().grandMasterValueMode(); + QString gmDisplayValue; + if (gmValueMode == GrandMaster::Limit) + { + gmDisplayValue = QString("%1").arg(value, 3, 10, QChar('0')); + } + else + { + int p = qFloor(((double(value) / double(UCHAR_MAX)) * double(100)) + 0.5); + gmDisplayValue = QString("%1%").arg(p, 2, 10, QChar('0')); + } + QString wsMessage = QString("GM_VALUE|%1|%2").arg(value).arg(gmDisplayValue); + sendWebSocketMessage(wsMessage.toUtf8()); +} + +QString WebAccess::getGrandMasterSliderHTML() +{ + GrandMaster::ValueMode gmValueMode = m_vc->properties().grandMasterValueMode(); + GrandMaster::SliderMode gmSliderMode = m_vc->properties().grandMasterSlideMode(); + uchar gmValue = m_doc->inputOutputMap()->grandMasterValue(); + + QString gmDisplayValue; + if (gmValueMode == GrandMaster::Limit) + { + gmDisplayValue = QString("%1").arg(gmValue, 3, 10, QChar('0')); + } + else + { + int p = qFloor(((double(gmValue) / double(UCHAR_MAX)) * double(100)) + 0.5); + gmDisplayValue = QString("%1%").arg(p, 2, 10, QChar('0')); + } + + QString str = "
    \n"; + str += "
    "; + str += "
    "+gmDisplayValue+"
    \n"; + + int rotate = gmSliderMode == GrandMaster::SliderMode::Inverted ? 90 : 270; + QString mt = gmSliderMode == GrandMaster::SliderMode::Inverted ? "calc(-100vh + 120px)" : "calc(100vh - 120px)"; + int min = 0; + int max = 255; + + str += "\n"; + str += "
    GM
    "; + str += "
    \n"; + str += "
    \n"; + + connect(m_doc->inputOutputMap(), SIGNAL(grandMasterValueChanged(uchar)), + this, SLOT(slotGrandMasterValueChanged(uchar))); + + return str; +} + QString WebAccess::getVCHTML() { m_CSScode = "\n"; m_CSScode += "\n"; - m_JScode = "\n" - "\n" + m_JScode = "\n" + "\n" "\n"; - QString str = HTML_HEADER + m_CSScode + m_JScode + "\n\n" + widgetsHTML + "
    \n\n"; + QString str = HTML_HEADER + m_CSScode + "\n\n" + widgetsHTML + "\n\n" + m_JScode + ""; return str; } diff --git a/webaccess/src/webaccess.h b/webaccess/src/webaccess.h index 998ee56de3..a597ba3f60 100644 --- a/webaccess/src/webaccess.h +++ b/webaccess/src/webaccess.h @@ -72,6 +72,7 @@ class WebAccess : public QObject QString getCueListHTML(VCCueList *cue); QString getClockHTML(VCClock *clock); QString getMatrixHTML(VCMatrix *matrix); + QString getGrandMasterSliderHTML(); QString getChildrenHTML(VCWidget *frame, int pagesNum, int currentPageIdx); QString getVCHTML(); @@ -88,21 +89,30 @@ protected slots: void slotVCLoaded(); void slotButtonStateChanged(int state); + void slotButtonDisableStateChanged(bool disable); + void slotLabelDisableStateChanged(bool disable); void slotSliderValueChanged(QString val); + void slotSliderDisableStateChanged(bool disable); void slotAudioTriggersToggled(bool toggle); void slotCueIndexChanged(int idx); + void slotCueStepNoteChanged(int idx, QString note); void slotCueProgressStateChanged(); void slotCueShowSideFaderPanel(); void slotCueSideFaderValueChanged(); void slotCuePlaybackStateChanged(); + void slotCueDisableStateChanged(bool disable); void slotClockTimeChanged(quint32 time); + void slotClockDisableStateChanged(bool disable); void slotFramePageChanged(int pageNum); + void slotFrameDisableStateChanged(bool disable); void slotMatrixSliderValueChanged(int value); void slotMatrixStartColorChanged(); void slotMatrixEndColorChanged(); void slotMatrixAnimationValueChanged(QString name); void slotMatrixControlKnobValueChanged(int controlID, int value); + void slotGrandMasterValueChanged(uchar value); + protected: QString m_JScode; QString m_CSScode; diff --git a/webaccess/src/webaccessconfiguration.cpp b/webaccess/src/webaccessconfiguration.cpp index 7f7d5fb308..ef3b8e91e8 100644 --- a/webaccess/src/webaccessconfiguration.cpp +++ b/webaccess/src/webaccessconfiguration.cpp @@ -303,11 +303,10 @@ QString WebAccessConfiguration::getHTML(Doc *doc, WebAccessAuth *auth) QString m_CSScode = "\n"; @@ -354,233 +298,79 @@ QString WebAccessNetwork::getHTML() return str; } -bool WebAccessNetwork::updateNetworkFile(QStringList cmdList) +bool WebAccessNetwork::updateNetworkSettings(QStringList cmdList) { for (int i = 0; i < m_interfaces.count(); i++) { - if (m_interfaces.at(i).name == cmdList.at(2)) + if (m_interfaces.at(i).devName == cmdList.at(2)) { - m_interfaces[i].enabled = true; - if (cmdList.at(3) == "static") - m_interfaces[i].isStatic = true; - else - m_interfaces[i].isStatic = false; - m_interfaces[i].address = cmdList.at(4); - m_interfaces[i].netmask = cmdList.at(5); - m_interfaces[i].gateway = cmdList.at(6); - if (m_interfaces[i].isWireless == true) + if (!m_interfaces[i].connName.isEmpty()) { - m_interfaces[i].ssid = cmdList.at(7); - m_interfaces[i].wpaPass = cmdList.at(8); + // first off, delete the current connection profile + getNmcliOutput(QStringList() << "con" << "del" << m_interfaces[i].connName); } - return writeNetworkFile(); - } - } - return false; -} - -void WebAccessNetwork::parseWPAConfFile(InterfaceInfo *iface) -{ - bool inNetwork = false; - - if (iface == NULL || iface->wpaConfFile.isEmpty()) - return; - - qDebug() << "Parsing WPA conf file" << iface->wpaConfFile; - - QFile wpaConfFile(iface->wpaConfFile); - if (wpaConfFile.open(QIODevice::ReadOnly | QIODevice::Text) == false) - return; - - QTextStream wpaConfQTS(&wpaConfFile); - while (!wpaConfQTS.atEnd()) - { - QString line = wpaConfQTS.readLine(); - line = line.simplified(); - if (line.startsWith("network")) - { - inNetwork = true; - continue; - } - - if (inNetwork) - { - if (line.contains("}")) - { - inNetwork = false; - continue; - } + m_interfaces[i].enabled = true; + bool staticRequest = cmdList.at(3) == "static" ? true : false; + QString args = "con add con-name qlcplus" + m_interfaces[i].devName + " ifname " + m_interfaces[i].devName; - QStringList tokens = line.split("="); - if (tokens.count() == 2) + if (staticRequest) { - QString param = tokens.at(0); - QString value = tokens.at(1); + // convert netmask to bitwise notation + uint32_t intNetMask; + uint32_t bitCount = 0; - //qDebug() << "Tokens:"<< param << value; - - if (param == "ssid") - iface->ssid = value.remove(QChar('"')); - else if (param == "psk") - iface->wpaPass = value.remove(QChar('"')); - } - } - - } + if (inet_pton(AF_INET, cmdList.at(5).toUtf8().constData(), &intNetMask) == 0) + { + qDebug() << "Invalid netmask"; + return false; + } - wpaConfFile.close(); -} + while (intNetMask > 0) + { + intNetMask = intNetMask >> 1; + bitCount++; + } -bool WebAccessNetwork::writeNetworkFile() -{ - /* Here 3 things again: - * 1- the /etc/network/interfaces file is left untouched - * 2- /etc/dhcpcd.conf is written only if there are static IPs set - * 3- the wpa_supplicant.conf file(s) are written for each wireless adapter - */ - - bool dhcpcdCacheWritten = false; - QFile dhcpcdFile(DHCPCD_CONF_FILE); - if (dhcpcdFile.open(QIODevice::WriteOnly | QIODevice::Text) == false) - return false; - - foreach (InterfaceInfo iface, m_interfaces) - { - if (iface.enabled == false) - continue; + if (m_interfaces[i].isWireless) + args = args + " type wifi ssid " + cmdList.at(7); + else + args = args + " type ethernet"; - if (iface.isStatic == true) - { - if (dhcpcdCacheWritten == false && m_dhcpcdConfCache.isEmpty() == false) + args = args + " ip4 " + cmdList.at(4) + "/" + QString::number(bitCount) + " gw4 " + cmdList.at(6); + } + else // DHCP { - foreach (QString line, m_dhcpcdConfCache) + if (m_interfaces[i].isWireless) { - dhcpcdFile.write(line.toLatin1()); - dhcpcdFile.write("\n"); + //m_interfaces[i].ssid = cmdList.at(7); + //m_interfaces[i].wpaPass = cmdList.at(8); + args = args + " type wifi ssid " + cmdList.at(7); + } + else + { + args += " type ethernet"; } - dhcpcdFile.write("\n######### QLC+ parameters. Do not edit #########\n\n"); - dhcpcdCacheWritten = true; } - else - qDebug() << "[writeNetworkFile] ERROR. No dhcpcd cache found!"; - - dhcpcdFile.write((QString("interface %1\n").arg(iface.name)).toLatin1()); - dhcpcdFile.write((QString("static ip_address=%1/%2\n").arg(iface.address).arg(stringToNetmask(iface.netmask))).toLatin1()); - dhcpcdFile.write((QString("static routers=%1\n").arg(iface.gateway)).toLatin1()); - if (iface.dns1.isEmpty() == false) - dhcpcdFile.write((QString("static domain_name_servers=%1\n\n").arg(iface.dns1)).toLatin1()); - else - dhcpcdFile.write(QString("static domain_name_servers=127.0.0.1\n\n").toLatin1()); - } - if (iface.isWireless) - { - QString wpaConfName = iface.wpaConfFile.isEmpty() ? WPA_SUPP_CONF_FILE : iface.wpaConfFile; - qDebug() << "[writeNetworkFile] Writing wpa conf file:" << wpaConfName; - QFile wpaConfFile(wpaConfName); - if (wpaConfFile.open(QIODevice::WriteOnly | QIODevice::Text) == false) + // add the new/updated connection profile + getNmcliOutput(args.split(" ")); + + // if a password is set, modify the just created connection + if (m_interfaces[i].isWireless && !cmdList.at(8).isEmpty()) { - qDebug() << "[writeNetworkFile] Error opening file" << wpaConfName; - return false; + args = "con mod qlcplus" + m_interfaces[i].devName + " wifi-sec.key-mgmt wpa-psk wifi-sec.psk " + cmdList.at(8); + getNmcliOutput(args.split(" ")); } - wpaConfFile.write(QString("ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev\n").toLatin1()); - wpaConfFile.write(QString("update_config=1\n\n").toLatin1()); - wpaConfFile.write(QString("network={\n").toLatin1()); - wpaConfFile.write(QString("scan_ssid=1\n").toLatin1()); - wpaConfFile.write((QString("ssid=\"%1\"\n").arg(iface.ssid)).toLatin1()); - wpaConfFile.write((QString("psk=\"%1\"\n").arg(iface.wpaPass)).toLatin1()); - wpaConfFile.write(QString("}\n").toLatin1()); - wpaConfFile.close(); - } - } - - dhcpcdFile.close(); + // finally, activate the connection + args = "con up qlcplus" + m_interfaces[i].devName; + getNmcliOutput(args.split(" ")); - return true; -} - -#if 0 // old Wheezy configuration -bool WebAccessNetwork::writeNetworkFile() -{ - QFile netFile(IFACES_SYSTEM_FILE); - if (netFile.open(QIODevice::WriteOnly | QIODevice::Text) == false) - return false; - - netFile.write(QString("auto lo\n").toLatin1()); - netFile.write(QString("iface lo inet loopback\n").toLatin1()); - netFile.write(QString("allow-hotplug eth0\n").toLatin1()); - - foreach (InterfaceInfo iface, m_interfaces) - { - if (iface.enabled == false) - continue; - - if (iface.isWireless) - netFile.write((QString("auto %1\n").arg(iface.name)).toLatin1()); + refreshConnectionsList(); - if (iface.isStatic == false) - netFile.write((QString("iface %1 inet dhcp\n").arg(iface.name)).toLatin1()); - else - { - netFile.write((QString("iface %1 inet static\n").arg(iface.name)).toLatin1()); - netFile.write((QString(" address %1\n").arg(iface.address)).toLatin1()); - netFile.write((QString(" netmask %1\n").arg(iface.netmask)).toLatin1()); - netFile.write((QString(" gateway %1\n").arg(iface.gateway)).toLatin1()); - } - if (iface.isWireless) - { - if (iface.ssid.isEmpty() == false) - netFile.write((QString(" wpa-ssid %1\n").arg(iface.ssid)).toLatin1()); - if (iface.wpaPass.isEmpty() == false) - netFile.write((QString(" wpa-psk %1\n").arg(iface.wpaPass)).toLatin1()); + return true; } } - - netFile.close(); - - return true; -} -#endif - -QString WebAccessNetwork::netmaskToString(int mask) -{ - QString nmString; - - quint32 bitmask = 0; - for (int i = 0; i < mask; i++) - bitmask |= (1 << (31 - i)); - - for (int n = 0; n < 4; n++) - { - if (nmString.isEmpty() == false) - nmString.prepend("."); - nmString.prepend(QString::number((bitmask >> (8 * n)) & 0x00FF)); - } - return nmString; -} - -int WebAccessNetwork::stringToNetmask(QString mask) -{ - quint32 lMask = 0; - int nMask = 0; - - QStringList nibbles = mask.split("."); - if (nibbles.count() != 4) - return 24; - - for (int i = 0; i < 4; i++) - lMask |= (nibbles.at(i).toInt() << (8 * (3 - i))); - - for (int b = 0; b < 32; b++) - { - if (lMask & (1 << (31 - b))) - nMask++; - else - break; - } - - return nMask; + return false; } - diff --git a/webaccess/src/webaccessnetwork.h b/webaccess/src/webaccessnetwork.h index cc1883f879..af65d98ae6 100644 --- a/webaccess/src/webaccessnetwork.h +++ b/webaccess/src/webaccessnetwork.h @@ -25,7 +25,9 @@ typedef struct { bool enabled; - QString name; + QString devName; + QString connName; + QString connUUID; bool isStatic; bool isWireless; QString address; @@ -49,13 +51,11 @@ class WebAccessNetwork: public QObject QString getNetworkHTML(); QString getHTML(); - bool updateNetworkFile(QStringList cmdList); + bool updateNetworkSettings(QStringList cmdList); protected: - void parseWPAConfFile(InterfaceInfo *iface); - bool writeNetworkFile(); - QString netmaskToString(int mask); - int stringToNetmask(QString mask); + QStringList getNmcliOutput(QStringList args, bool verbose = false); + void refreshConnectionsList(); protected: QListm_interfaces;
    #" + tr("Name") + "" + tr("Fade In") + "" + tr("Fade Out") + "
    " + QString::number(i + 1) + "" + step->note + "id()) + ", " + QString::number(i) + ");\">" + + "" + step->note + "" + + "note + "\" style=\"display: none; width: 60px;\" " + + "onfocusout=\"changeCueNoteToTextMode(" + QString::number(cue->id()) + ", " + QString::number(i) + ");\" />" + "