diff --git a/CMakeLists.txt b/CMakeLists.txt index 1f7f76f..b2a3469 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,10 @@ cmake_minimum_required(VERSION 3.16.0) project(pipedal - VERSION 0.1.7 + VERSION 0.1.8 DESCRIPTION "PiPedal Guitar Effect Pedal For Raspberry Pi" HOMEPAGE_URL "https://rerdavies.github.io/pipedal" ) -set (DISPLAY_VERSION "v0.1.7-beta.3") +set (DISPLAY_VERSION "v0.1.8-beta-4") set (CMAKE_INSTALL_PREFIX "/usr/") diff --git a/README.md b/README.md index 0e1a5ec..e43eaec 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ - v0.1.7-beta-3 + v0.1.8-beta-4 Use your Raspberry Pi as a guitar effects pedal. Configure and control PiPedal with your phone or tablet. diff --git a/config/plugin_classes.json b/config/plugin_classes.json index 83125bb..9950d84 100644 --- a/config/plugin_classes.json +++ b/config/plugin_classes.json @@ -4,6 +4,29 @@ "parent_uri": "http://lv2plug.in/ns/lv2core#PluginBase", "plugin_type": "Plugin", "children": [ + { + "uri": "http://two_play.com/ns/pluginClass#ampsNode", + "display_name": "Amp", + "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", + "plugin_type": "PiPedalAmpsNode", + "children": [ + { + "uri": "http://lv2plug.in/ns/lv2core#AmplifierPlugin", + "display_name": "Amplifier", + "parent_uri": "http://two_play.com/ns/pluginClass#amp", + "plugin_type": "AmplifierPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#SimulatorPlugin", + "display_name": "Simulator", + "parent_uri": "http://two_play.com/ns/pluginClass#amp", + "plugin_type": "SimulatorPlugin", + "children": [ ] + } + + ] + }, { "uri": "http://lv2plug.in/ns/lv2core#DelayPlugin", "display_name": "Delay", @@ -40,13 +63,6 @@ "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", "plugin_type": "DynamicsPlugin", "children": [ - { - "uri": "http://lv2plug.in/ns/lv2core#AmplifierPlugin", - "display_name": "Amplifier", - "parent_uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", - "plugin_type": "AmplifierPlugin", - "children": [ ] - }, { "uri": "http://lv2plug.in/ns/lv2core#CompressorPlugin", "display_name": "Compressor", @@ -207,13 +223,6 @@ } ] }, - { - "uri": "http://lv2plug.in/ns/lv2core#SimulatorPlugin", - "display_name": "Simulator", - "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", - "plugin_type": "SimulatorPlugin", - "children": [ ] - }, { "uri": "http://lv2plug.in/ns/lv2core#SpatialPlugin", "display_name": "Spatial", diff --git a/debugConfig/plugin_classes.json b/debugConfig/plugin_classes.json index 83125bb..9950d84 100644 --- a/debugConfig/plugin_classes.json +++ b/debugConfig/plugin_classes.json @@ -4,6 +4,29 @@ "parent_uri": "http://lv2plug.in/ns/lv2core#PluginBase", "plugin_type": "Plugin", "children": [ + { + "uri": "http://two_play.com/ns/pluginClass#ampsNode", + "display_name": "Amp", + "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", + "plugin_type": "PiPedalAmpsNode", + "children": [ + { + "uri": "http://lv2plug.in/ns/lv2core#AmplifierPlugin", + "display_name": "Amplifier", + "parent_uri": "http://two_play.com/ns/pluginClass#amp", + "plugin_type": "AmplifierPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#SimulatorPlugin", + "display_name": "Simulator", + "parent_uri": "http://two_play.com/ns/pluginClass#amp", + "plugin_type": "SimulatorPlugin", + "children": [ ] + } + + ] + }, { "uri": "http://lv2plug.in/ns/lv2core#DelayPlugin", "display_name": "Delay", @@ -40,13 +63,6 @@ "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", "plugin_type": "DynamicsPlugin", "children": [ - { - "uri": "http://lv2plug.in/ns/lv2core#AmplifierPlugin", - "display_name": "Amplifier", - "parent_uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", - "plugin_type": "AmplifierPlugin", - "children": [ ] - }, { "uri": "http://lv2plug.in/ns/lv2core#CompressorPlugin", "display_name": "Compressor", @@ -207,13 +223,6 @@ } ] }, - { - "uri": "http://lv2plug.in/ns/lv2core#SimulatorPlugin", - "display_name": "Simulator", - "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", - "plugin_type": "SimulatorPlugin", - "children": [ ] - }, { "uri": "http://lv2plug.in/ns/lv2core#SpatialPlugin", "display_name": "Spatial", diff --git a/docs/Installing.md b/docs/Installing.md index 160c0d5..5bdc5fd 100644 --- a/docs/Installing.md +++ b/docs/Installing.md @@ -4,14 +4,14 @@ Download the most recent Debian (.deb) package for your platform: -- [Ubuntu or Raspberry Pi OS (64-bit)](https://github.com/rerdavies/pipedal/releases/download/v0.1.7-beta-3/pipedal_0.1.7_arm64.deb) v0.1.7-beta-3 +- [Ubuntu or Raspberry Pi OS (64-bit)](https://github.com/rerdavies/pipedal/releases/download/v0.1.8-beta-4/pipedal_0.1.8_arm64.deb) v0.1.8-beta-4 Install the package by running ``` sudo apt update cd ~/Downloads - sudo apt-get install ./pipedal_0.1.7_arm64.deb + sudo apt-get install ./pipedal_0.1.8_arm64.deb ``` -------- diff --git a/docs/download.md b/docs/download.md index 9eb6988..e73350e 100644 --- a/docs/download.md +++ b/docs/download.md @@ -4,14 +4,14 @@ Download the most recent Debian (.deb) package for your platform: -- [Ubuntu or Raspberry Pi OS (64-bit)](https://github.com/rerdavies/pipedal/releases/download/v0.1.7-beta-3/pipedal_0.1.7_arm64.deb) v0.1.7-beta-3 +- [Ubuntu or Raspberry Pi OS (64-bit)](https://github.com/rerdavies/pipedal/releases/download/v0.1.8-beta-4/pipedal_0.1.8_arm64.deb) v0.1.8-beta-4 Install the package by running ``` sudo apt update cd ~/Downloads - sudo apt-get install ./pipedal_0.1.7_arm64.deb + sudo apt-get install ./pipedal_0.1.8_arm64.deb ``` Follow the instructions in [_Configuring PiPedal After Installation_](https://rerdavies.github.io/pipedal/Configuring.html) to complete the installation. diff --git a/docs/index.md b/docs/index.md index efd9e9d..bfdd422 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ -v0.1.7-beta-3 +v0.1.8-beta-4 Use your Raspberry Pi as a guitar effects pedal. Configure and control PiPedal with your phone or tablet. diff --git a/react/CMakeLists.txt b/react/CMakeLists.txt index 34a816d..7ab2011 100644 --- a/react/CMakeLists.txt +++ b/react/CMakeLists.txt @@ -21,88 +21,98 @@ add_custom_command( WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/react DEPENDS - src/SearchControl.tsx - src/SplitControlView.tsx - src/WifiConfigSettings.tsx - src/FullScreenIME.tsx - src/JackHostStatus.tsx - src/SearchFilter.tsx - src/MainPage.tsx - src/PiPedalModel.tsx - src/PluginPresetSelector.tsx - src/Pedal.tsx - src/ToobMLView.tsx - src/SettingsDialog.tsx - src/PiPedalSocket.tsx - src/ToobFrequencyResponseView.tsx - src/ControlViewFactory.tsx - src/Utility.tsx - src/ToobToneStackView.tsx - src/SelectHoverBackground.tsx - src/MidiBindingsDialog.tsx - src/TemporaryDrawer.tsx - src/GxTunerView.tsx - src/ToobInputStageView.tsx - src/DraggableGrid.tsx - src/JackStatusView.tsx - src/PluginControl.tsx - src/XxxSnippet.tsx - src/PluginPreset.tsx - src/Jack.tsx - src/AlsaDeviceInfo.tsx - src/MidiBinding.tsx - src/PiPedalError.tsx - src/IControlViewFactory.tsx - src/Lv2Plugin.tsx - src/PedalBoard.tsx - src/PedalBoardView.tsx - src/PresetDialog.tsx - src/AppThemed.tsx - src/ZoomedDial.tsx - src/RenameDialog.tsx - src/SplitUiControls.tsx - src/GovernorSettings.tsx - src/AboutDialog.tsx - src/ToobSpectrumResponseView.tsx - src/PluginControlView.tsx - src/NoChangePassword.tsx - src/ToobSpectrumAnalyzerView.tsx - src/MidiBindingView.tsx - src/GxTunerControl.tsx - src/Banks.tsx - src/PluginPresetsDialog.tsx - src/BankDialog.tsx - src/UploadDialog.tsx - src/ToobPowerStage2View.tsx - src/index.tsx - src/Units.tsx - src/VuMeter.tsx - src/App.test.tsx - src/DialogEx.tsx - src/StringBuilder.tsx - src/SelectChannelsDialog.tsx - src/Draggable.tsx - src/ZoomedUiControl.tsx - src/Rect.tsx - src/PluginClass.tsx - src/PluginIcon.tsx - src/App.tsx - src/ResizeResponsiveComponent.tsx - src/SvgPathBuilder.tsx - src/NumericInput.tsx - src/JackServerSettings.tsx - src/ListSelectDialog.tsx - src/JackServerSettingsDialog.tsx - src/ObservableProperty.tsx - src/SelectMidiChannelsDialog.tsx - src/WifiChannel.tsx - src/LoadPluginDialog.tsx - src/WifiConfigDialog.tsx - src/PluginInfoDialog.tsx - src/ToobWaveShapeView.tsx - src/ToobCabSimView.tsx - src/PresetSelector.tsx - + src/SearchControl.tsx + src/SplitControlView.tsx + src/WifiConfigSettings.tsx + src/FullScreenIME.tsx + src/JackHostStatus.tsx + src/index.css + src/setupTests.ts + src/SearchFilter.tsx + src/MainPage.tsx + src/PiPedalModel.tsx + src/AppThemed.css + src/PluginPresetSelector.tsx + src/Pedal.tsx + src/ToobMLView.tsx + src/SettingsDialog.tsx + src/WifiDirectConfigDialog.tsx + src/WifiDirectConfigSettings.tsx + src/PiPedalSocket.tsx + src/ToobFrequencyResponseView.tsx + src/ControlViewFactory.tsx + src/Utility.tsx + src/ToobToneStackView.tsx + src/SelectHoverBackground.tsx + src/MidiBindingsDialog.tsx + src/TemporaryDrawer.tsx + src/GxTunerView.tsx + src/ToobInputStageView.tsx + src/DraggableGrid.tsx + src/JackStatusView.tsx + src/PluginControl.tsx + src/XxxSnippet.tsx + src/PluginPreset.tsx + src/Jack.tsx + src/AlsaDeviceInfo.tsx + src/MidiBinding.tsx + src/PiPedalError.tsx + src/IControlViewFactory.tsx + src/Lv2Plugin.tsx + src/PedalBoard.tsx + src/AndroidHost.tsx + src/PedalBoardView.tsx + src/PresetDialog.tsx + src/AppThemed.tsx + src/ZoomedDial.tsx + src/RenameDialog.tsx + src/SplitUiControls.tsx + src/GovernorSettings.tsx + src/AboutDialog.tsx + src/ToobSpectrumResponseView.tsx + src/PluginControlView.tsx + src/NoChangePassword.tsx + src/ToobSpectrumAnalyzerView.tsx + src/MidiBindingView.tsx + src/GxTunerControl.tsx + src/Banks.tsx + src/PluginPresetsDialog.tsx + src/BankDialog.tsx + src/UploadDialog.tsx + src/ToobPowerStage2View.tsx + src/index.tsx + src/Units.tsx + src/VuMeter.tsx + src/App.test.tsx + src/DialogEx.tsx + src/StringBuilder.tsx + src/SelectChannelsDialog.tsx + src/Draggable.tsx + src/ZoomedUiControl.tsx + src/logo.svg + src/Rect.tsx + src/PluginClass.tsx + src/reportWebVitals.ts + src/PluginIcon.tsx + src/App.tsx + src/ResizeResponsiveComponent.tsx + src/SvgPathBuilder.tsx + src/NumericInput.tsx + src/JackServerSettings.tsx + src/ListSelectDialog.tsx + src/react-app-env.d.ts + src/JackServerSettingsDialog.tsx + src/ObservableProperty.tsx + src/SelectMidiChannelsDialog.tsx + src/WifiChannel.tsx + src/LoadPluginDialog.tsx + src/WifiConfigDialog.tsx + src/PluginInfoDialog.tsx + src/ToobWaveShapeView.tsx + src/ToobCabSimView.tsx + src/PresetSelector.tsx + src/OkCancelDialog.tsx + public/css/roboto.css public/fonts/Roboto-BlackItalic.woff2 public/fonts/Roboto-Black.woff2 diff --git a/react/public/var/plugin_classes.json b/react/public/var/plugin_classes.json index a8c42f5..df5c580 100644 --- a/react/public/var/plugin_classes.json +++ b/react/public/var/plugin_classes.json @@ -4,273 +4,282 @@ "parent_uri": "http://lv2plug.in/ns/lv2core#PluginBase", "plugin_type": "Plugin", "children": [ - { - "uri": "http://lv2plug.in/ns/lv2core#DelayPlugin", - "display_name": "Delay", - "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", - "plugin_type": "DelayPlugin", - "children": [ - { - "uri": "http://lv2plug.in/ns/lv2core#ReverbPlugin", - "display_name": "Reverb", - "parent_uri": "http://lv2plug.in/ns/lv2core#DelayPlugin", - "plugin_type": "ReverbPlugin", - "children": [] - } - ] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#DistortionPlugin", - "display_name": "Distortion", - "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", - "plugin_type": "DistortionPlugin", - "children": [ - { - "uri": "http://lv2plug.in/ns/lv2core#WaveshaperPlugin", - "display_name": "Waveshaper", - "parent_uri": "http://lv2plug.in/ns/lv2core#DistortionPlugin", - "plugin_type": "WaveshaperPlugin", - "children": [] - } - ] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", - "display_name": "Dynamics", - "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", - "plugin_type": "DynamicsPlugin", - "children": [ - { - "uri": "http://lv2plug.in/ns/lv2core#AmplifierPlugin", - "display_name": "Amplifier", - "parent_uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", - "plugin_type": "AmplifierPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#CompressorPlugin", - "display_name": "Compressor", - "parent_uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", - "plugin_type": "CompressorPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#EnvelopePlugin", - "display_name": "Envelope", - "parent_uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", - "plugin_type": "EnvelopePlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#ExpanderPlugin", - "display_name": "Expander", - "parent_uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", - "plugin_type": "ExpanderPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#GatePlugin", - "display_name": "Gate", - "parent_uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", - "plugin_type": "GatePlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#LimiterPlugin", - "display_name": "Limiter", - "parent_uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", - "plugin_type": "LimiterPlugin", - "children": [] - } - ] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", - "display_name": "Filter", - "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", - "plugin_type": "FilterPlugin", - "children": [ - { - "uri": "http://lv2plug.in/ns/lv2core#AllpassPlugin", - "display_name": "Allpass", - "parent_uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", - "plugin_type": "AllpassPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#BandpassPlugin", - "display_name": "Bandpass", - "parent_uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", - "plugin_type": "BandpassPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#CombPlugin", - "display_name": "Comb", - "parent_uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", - "plugin_type": "CombPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#EQPlugin", - "display_name": "Equaliser", - "parent_uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", - "plugin_type": "EQPlugin", - "children": [ - { - "uri": "http://lv2plug.in/ns/lv2core#MultiEQPlugin", - "display_name": "Multiband", - "parent_uri": "http://lv2plug.in/ns/lv2core#EQPlugin", - "plugin_type": "MultiEQPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#ParaEQPlugin", - "display_name": "Parametric", - "parent_uri": "http://lv2plug.in/ns/lv2core#EQPlugin", - "plugin_type": "ParaEQPlugin", - "children": [] - } - ] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#HighpassPlugin", - "display_name": "Highpass", - "parent_uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", - "plugin_type": "HighpassPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#LowpassPlugin", - "display_name": "Lowpass", - "parent_uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", - "plugin_type": "LowpassPlugin", - "children": [] - } - ] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#GeneratorPlugin", - "display_name": "Generator", - "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", - "plugin_type": "GeneratorPlugin", - "children": [ - { - "uri": "http://lv2plug.in/ns/lv2core#ConstantPlugin", - "display_name": "Constant", - "parent_uri": "http://lv2plug.in/ns/lv2core#GeneratorPlugin", - "plugin_type": "ConstantPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#InstrumentPlugin", - "display_name": "Instrument", - "parent_uri": "http://lv2plug.in/ns/lv2core#GeneratorPlugin", - "plugin_type": "InstrumentPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#OscillatorPlugin", - "display_name": "Oscillator", - "parent_uri": "http://lv2plug.in/ns/lv2core#GeneratorPlugin", - "plugin_type": "OscillatorPlugin", - "children": [] - } - ] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#ModulatorPlugin", - "display_name": "Modulator", - "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", - "plugin_type": "ModulatorPlugin", - "children": [ - { - "uri": "http://lv2plug.in/ns/lv2core#ChorusPlugin", - "display_name": "Chorus", - "parent_uri": "http://lv2plug.in/ns/lv2core#ModulatorPlugin", - "plugin_type": "ChorusPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#FlangerPlugin", - "display_name": "Flanger", - "parent_uri": "http://lv2plug.in/ns/lv2core#ModulatorPlugin", - "plugin_type": "FlangerPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#PhaserPlugin", - "display_name": "Phaser", - "parent_uri": "http://lv2plug.in/ns/lv2core#ModulatorPlugin", - "plugin_type": "PhaserPlugin", - "children": [] - } - ] - }, - { + { + "uri": "http://two_play.com/ns/pluginClass#amp", + "display_name": "Amps", + "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", + "plugin_type": "PiPedalAmpsNode", + "children": [ + { + "uri": "http://lv2plug.in/ns/lv2core#AmplifierPlugin", + "display_name": "Amplifier", + "parent_uri": "http://two_play.com/ns/pluginClass#amp", + "plugin_type": "AmplifierPlugin", + "children": [ ] + }, + { "uri": "http://lv2plug.in/ns/lv2core#SimulatorPlugin", "display_name": "Simulator", - "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", + "parent_uri": "http://two_play.com/ns/pluginClass#amp", "plugin_type": "SimulatorPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#SpatialPlugin", - "display_name": "Spatial", - "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", - "plugin_type": "SpatialPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#SpectralPlugin", - "display_name": "Spectral", - "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", - "plugin_type": "SpectralPlugin", + "children": [ ] + } + + ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#DelayPlugin", + "display_name": "Delay", + "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", + "plugin_type": "DelayPlugin", + "children": [ + { + "uri": "http://lv2plug.in/ns/lv2core#ReverbPlugin", + "display_name": "Reverb", + "parent_uri": "http://lv2plug.in/ns/lv2core#DelayPlugin", + "plugin_type": "ReverbPlugin", + "children": [ ] + } + ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#DistortionPlugin", + "display_name": "Distortion", + "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", + "plugin_type": "DistortionPlugin", + "children": [ + { + "uri": "http://lv2plug.in/ns/lv2core#WaveshaperPlugin", + "display_name": "Waveshaper", + "parent_uri": "http://lv2plug.in/ns/lv2core#DistortionPlugin", + "plugin_type": "WaveshaperPlugin", + "children": [ ] + } + ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", + "display_name": "Dynamics", + "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", + "plugin_type": "DynamicsPlugin", + "children": [ + { + "uri": "http://lv2plug.in/ns/lv2core#CompressorPlugin", + "display_name": "Compressor", + "parent_uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", + "plugin_type": "CompressorPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#EnvelopePlugin", + "display_name": "Envelope", + "parent_uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", + "plugin_type": "EnvelopePlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#ExpanderPlugin", + "display_name": "Expander", + "parent_uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", + "plugin_type": "ExpanderPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#GatePlugin", + "display_name": "Gate", + "parent_uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", + "plugin_type": "GatePlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#LimiterPlugin", + "display_name": "Limiter", + "parent_uri": "http://lv2plug.in/ns/lv2core#DynamicsPlugin", + "plugin_type": "LimiterPlugin", + "children": [ ] + } + ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", + "display_name": "Filter", + "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", + "plugin_type": "FilterPlugin", + "children": [ + { + "uri": "http://lv2plug.in/ns/lv2core#AllpassPlugin", + "display_name": "Allpass", + "parent_uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", + "plugin_type": "AllpassPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#BandpassPlugin", + "display_name": "Bandpass", + "parent_uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", + "plugin_type": "BandpassPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#CombPlugin", + "display_name": "Comb", + "parent_uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", + "plugin_type": "CombPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#EQPlugin", + "display_name": "Equaliser", + "parent_uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", + "plugin_type": "EQPlugin", "children": [ - { - "uri": "http://lv2plug.in/ns/lv2core#PitchPlugin", - "display_name": "Pitch Shifter", - "parent_uri": "http://lv2plug.in/ns/lv2core#SpectralPlugin", - "plugin_type": "PitchPlugin", - "children": [] - } + { + "uri": "http://lv2plug.in/ns/lv2core#MultiEQPlugin", + "display_name": "Multiband", + "parent_uri": "http://lv2plug.in/ns/lv2core#EQPlugin", + "plugin_type": "MultiEQPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#ParaEQPlugin", + "display_name": "Parametric", + "parent_uri": "http://lv2plug.in/ns/lv2core#EQPlugin", + "plugin_type": "ParaEQPlugin", + "children": [ ] + } ] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#UtilityPlugin", - "display_name": "Utility", - "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", - "plugin_type": "UtilityPlugin", - "children": [ - { - "uri": "http://lv2plug.in/ns/lv2core#AnalyserPlugin", - "display_name": "Analyser", - "parent_uri": "http://lv2plug.in/ns/lv2core#UtilityPlugin", - "plugin_type": "AnalyserPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#ConverterPlugin", - "display_name": "Converter", - "parent_uri": "http://lv2plug.in/ns/lv2core#UtilityPlugin", - "plugin_type": "ConverterPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#FunctionPlugin", - "display_name": "Function", - "parent_uri": "http://lv2plug.in/ns/lv2core#UtilityPlugin", - "plugin_type": "FunctionPlugin", - "children": [] - }, - { - "uri": "http://lv2plug.in/ns/lv2core#MixerPlugin", - "display_name": "Mixer", - "parent_uri": "http://lv2plug.in/ns/lv2core#UtilityPlugin", - "plugin_type": "MixerPlugin", - "children": [] - } - ] - } + }, + { + "uri": "http://lv2plug.in/ns/lv2core#HighpassPlugin", + "display_name": "Highpass", + "parent_uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", + "plugin_type": "HighpassPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#LowpassPlugin", + "display_name": "Lowpass", + "parent_uri": "http://lv2plug.in/ns/lv2core#FilterPlugin", + "plugin_type": "LowpassPlugin", + "children": [ ] + } + ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#GeneratorPlugin", + "display_name": "Generator", + "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", + "plugin_type": "GeneratorPlugin", + "children": [ + { + "uri": "http://lv2plug.in/ns/lv2core#ConstantPlugin", + "display_name": "Constant", + "parent_uri": "http://lv2plug.in/ns/lv2core#GeneratorPlugin", + "plugin_type": "ConstantPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#InstrumentPlugin", + "display_name": "Instrument", + "parent_uri": "http://lv2plug.in/ns/lv2core#GeneratorPlugin", + "plugin_type": "InstrumentPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#OscillatorPlugin", + "display_name": "Oscillator", + "parent_uri": "http://lv2plug.in/ns/lv2core#GeneratorPlugin", + "plugin_type": "OscillatorPlugin", + "children": [ ] + } + ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#ModulatorPlugin", + "display_name": "Modulator", + "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", + "plugin_type": "ModulatorPlugin", + "children": [ + { + "uri": "http://lv2plug.in/ns/lv2core#ChorusPlugin", + "display_name": "Chorus", + "parent_uri": "http://lv2plug.in/ns/lv2core#ModulatorPlugin", + "plugin_type": "ChorusPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#FlangerPlugin", + "display_name": "Flanger", + "parent_uri": "http://lv2plug.in/ns/lv2core#ModulatorPlugin", + "plugin_type": "FlangerPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#PhaserPlugin", + "display_name": "Phaser", + "parent_uri": "http://lv2plug.in/ns/lv2core#ModulatorPlugin", + "plugin_type": "PhaserPlugin", + "children": [ ] + } + ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#SpatialPlugin", + "display_name": "Spatial", + "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", + "plugin_type": "SpatialPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#SpectralPlugin", + "display_name": "Spectral", + "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", + "plugin_type": "SpectralPlugin", + "children": [ + { + "uri": "http://lv2plug.in/ns/lv2core#PitchPlugin", + "display_name": "Pitch Shifter", + "parent_uri": "http://lv2plug.in/ns/lv2core#SpectralPlugin", + "plugin_type": "PitchPlugin", + "children": [ ] + } + ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#UtilityPlugin", + "display_name": "Utility", + "parent_uri": "http://lv2plug.in/ns/lv2core#Plugin", + "plugin_type": "UtilityPlugin", + "children": [ + { + "uri": "http://lv2plug.in/ns/lv2core#AnalyserPlugin", + "display_name": "Analyser", + "parent_uri": "http://lv2plug.in/ns/lv2core#UtilityPlugin", + "plugin_type": "AnalyserPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#ConverterPlugin", + "display_name": "Converter", + "parent_uri": "http://lv2plug.in/ns/lv2core#UtilityPlugin", + "plugin_type": "ConverterPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#FunctionPlugin", + "display_name": "Function", + "parent_uri": "http://lv2plug.in/ns/lv2core#UtilityPlugin", + "plugin_type": "FunctionPlugin", + "children": [ ] + }, + { + "uri": "http://lv2plug.in/ns/lv2core#MixerPlugin", + "display_name": "Mixer", + "parent_uri": "http://lv2plug.in/ns/lv2core#UtilityPlugin", + "plugin_type": "MixerPlugin", + "children": [ ] + } + ] + } ] -} \ No newline at end of file + } \ No newline at end of file diff --git a/react/src/AboutDialog.tsx b/react/src/AboutDialog.tsx index 929926e..10d98ec 100644 --- a/react/src/AboutDialog.tsx +++ b/react/src/AboutDialog.tsx @@ -6,7 +6,7 @@ import { PiPedalModel, PiPedalModelFactory, State } from './PiPedalModel'; import AppBar from '@mui/material/AppBar'; import Toolbar from '@mui/material/Toolbar'; import ArrowBackIcon from '@mui/icons-material//ArrowBack'; -import Divider from '@mui/material/Divider'; + import JackHostStatus from './JackHostStatus'; import {PiPedalError} from './PiPedalError'; import DialogEx from './DialogEx'; @@ -219,22 +219,17 @@ const AboutDialog = withStyles(styles, { withTheme: true })( - Copyright © 2021 Robin Davies. All rights reserved. + Copyright © 2022 Robin Davies. - - - JACK AUDIO STATUS + + {this.model.getAndroidHostVersion() } -
- { - JackHostStatus.getDisplayView("",this.state.jackStatus) - } -
- + + LEGAL NOTICES -
+
diff --git a/react/src/AndroidHost.tsx b/react/src/AndroidHost.tsx index 1d9fd90..c71ea32 100644 --- a/react/src/AndroidHost.tsx +++ b/react/src/AndroidHost.tsx @@ -26,7 +26,7 @@ export interface AndroidHostInterface { isAndroidHosted(): boolean; getHostVersion() : string; chooseNewDevice() : void; - onLostConnection(): void; + setDisconnected(isDisconnected: boolean): void; }; @@ -41,7 +41,7 @@ export class FakeAndroidHost implements AndroidHostInterface chooseNewDevice(): void { } - onLostConnection(): void { + setDisconnected(isDisconnected: boolean): void { } diff --git a/react/src/App.tsx b/react/src/App.tsx index b854f5a..fb590a7 100644 --- a/react/src/App.tsx +++ b/react/src/App.tsx @@ -36,7 +36,7 @@ declare module '@mui/styles/defaultTheme' { const theme = createTheme({ palette: { primary: { - main: "#6750A4" + main: "#6750A4" // #5B5690 #60529A #5C5694 }, secondary: { main: "#FF6060" diff --git a/react/src/AppThemed.tsx b/react/src/AppThemed.tsx index 334c261..d12e121 100644 --- a/react/src/AppThemed.tsx +++ b/react/src/AppThemed.tsx @@ -114,7 +114,7 @@ const appStyles = (theme: Theme) => createStyles({ marginTop: 0, fontWeight: 500, fontSize: "13pt", - maxWidth: 250, + maxWidth: 350, opacity: 1, zIndex: 2010, paddingTop: 12, @@ -785,7 +785,9 @@ const AppThemed = withStyles(appStyles)(class extends ResizeResponsiveComponent< -
@@ -794,7 +796,7 @@ const AppThemed = withStyles(appStyles)(class extends ResizeResponsiveComponent<
- Reconnecting... + { this.state.displayState === State.ApplyingChanges ? "Applying\u00A0changes..." : "Reconnecting..."}
diff --git a/react/src/LoadPluginDialog.tsx b/react/src/LoadPluginDialog.tsx index 5c23f09..7cd4291 100644 --- a/react/src/LoadPluginDialog.tsx +++ b/react/src/LoadPluginDialog.tsx @@ -21,6 +21,7 @@ import React, { ReactNode, SyntheticEvent, CSSProperties } from 'react'; import { PiPedalModel, PiPedalModelFactory, FavoritesList } from './PiPedalModel'; import { UiPlugin, PluginType } from './Lv2Plugin'; +import TextField from '@mui/material/TextField'; import ButtonBase from '@mui/material/ButtonBase'; import Button from '@mui/material/Button'; import MenuItem from '@mui/material/MenuItem'; @@ -34,9 +35,7 @@ import DialogTitle from '@mui/material/DialogTitle'; import SelectHoverBackground from './SelectHoverBackground'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import IconButton from '@mui/material/IconButton'; -import Select from '@mui/material/Select'; import PluginClass from './PluginClass' -import ClearIcon from '@mui/icons-material/Clear'; import ResizeResponsiveComponent from './ResizeResponsiveComponent'; import SearchControl from './SearchControl'; import SearchFilter from './SearchFilter'; @@ -46,6 +45,9 @@ import StarBorderIcon from '@mui/icons-material/StarBorder'; import Slide, { SlideProps } from '@mui/material/Slide'; import { createStyles, Theme } from '@mui/material/styles'; import { WithStyles, withStyles } from '@mui/styles'; +import FilterListIcon from '@mui/icons-material/FilterList'; +import FilterListOffIcon from '@mui/icons-material/FilterListOff'; + export type CloseEventHandler = () => void; @@ -504,15 +506,15 @@ export const LoadPluginDialog =
- - {value.name} - { - isFavorite && ( - + + {value.name} + { + isFavorite && ( + - ) - } - + ) + } +
{value.plugin_display_type} {this.stereo_indicator(value)} @@ -598,19 +600,26 @@ export const LoadPluginDialog = }} />
- -
+
{ this.onClearFilter(); }}> - + {this.state.filterType === PluginType.Plugin ? ( + + ) : ( + + )}
+
+ + { this.onFilterChange(e); }} + sx={{ minWidth: 160}} + > + {this.createFilterOptions()} + +
void; @@ -503,11 +504,18 @@ class PiPedalModelImpl implements PiPedalModel { this.onSocketReconnecting = this.onSocketReconnecting.bind(this); this.onSocketReconnected = this.onSocketReconnected.bind(this); this.onVisibilityChanged = this.onVisibilityChanged.bind(this); + this.onSocketConnectionLost = this.onSocketConnectionLost.bind(this); } + onSocketReconnecting(retry: number, maxRetries: number): void { if (this.visibilityState.get() === VisibilityState.Hidden) return; //if (retry !== 0) { - this.setState(State.Reconnecting); + if (this.restartExpected) + { + this.setState(State.ApplyingChanges); + } else { + this.setState(State.Reconnecting); + } //} } @@ -697,7 +705,20 @@ class PiPedalModelImpl implements PiPedalModel { return this.webSocket; } + onSocketConnectionLost() { + if (this.isAndroidHosted()) + { + this.androidHost?.setDisconnected(true); + } + } onSocketReconnected() { + + if (this.isAndroidHosted()) + { + this.androidHost?.setDisconnected(false); + } + + this.restartExpected = false; if (this.visibilityState.get() === VisibilityState.Hidden) return; // reload state, but not configuration. @@ -778,6 +799,7 @@ class PiPedalModelImpl implements PiPedalModel { maxUploadSize: number = 512 * 1024; debug: boolean = false; + requestConfig(): Promise { const myRequest = new Request(this.varRequest('config.json')); return fetch(myRequest) @@ -808,10 +830,14 @@ class PiPedalModelImpl implements PiPedalModel { this.webSocket = new PiPedalSocket( this.socketServerUrl, - this.onSocketMessage, - this.onSocketError, - this.onSocketReconnecting, - this.onSocketReconnected); + { + onMessageReceived : this.onSocketMessage, + onError: this.onSocketError, + onConnectionLost: this.onSocketConnectionLost, + onReconnect: this.onSocketReconnected, + onReconnecting: this.onSocketReconnecting + } + ); return this.webSocket.connect(); }) .then(() => { @@ -948,7 +974,15 @@ class PiPedalModelImpl implements PiPedalModel { } + backgroundStateTimeout?: NodeJS.Timeout = undefined; + exitBackgroundState() { + if (this.backgroundStateTimeout) + { + clearTimeout(this.backgroundStateTimeout); + this.backgroundStateTimeout = undefined; + return; + } if (this.state.get() === State.Background) { console.log("Exiting background state."); this.visibilityState.set(VisibilityState.Visible); @@ -957,6 +991,24 @@ class PiPedalModelImpl implements PiPedalModel { } enterBackgroundState() { + // on Android, delay entering background state by 3 seconds, + // so that screen-flips don't trigger disconnects. + + if (this.isAndroidHosted()) + { + if (this.backgroundStateTimeout) + { + clearTimeout(this.backgroundStateTimeout); + } + this.backgroundStateTimeout = setTimeout(() => { + this.backgroundStateTimeout = undefined; + this.enterBackgroundState_(); + }, 3000); + } else { + this.enterBackgroundState_(); + } + } + enterBackgroundState_() { if (this.state.get() !== State.Background) { console.log("Entering background state."); this.visibilityState.set(VisibilityState.Hidden); @@ -1438,7 +1490,16 @@ class PiPedalModelImpl implements PiPedalModel { showAlert(message: string): void { this.alertMessage.set(message); } + + restartExpected: boolean = false; + + expectRestart() { + this.restartExpected = true; + + + } setJackSettings(jackSettings: JackChannelSelection): void { + this.expectRestart(); this.webSocket?.send("setJackSettings", jackSettings); } diff --git a/react/src/PiPedalSocket.tsx b/react/src/PiPedalSocket.tsx index bfc88ac..511bed2 100644 --- a/react/src/PiPedalSocket.tsx +++ b/react/src/PiPedalSocket.tsx @@ -36,13 +36,18 @@ export type PiPedalMessageHeader = { type ReplyHandler = (header: PiPedalMessageHeader, body: any | null) => void; - +export interface PiPedalSocketListener { + onMessageReceived : (header: PiPedalMessageHeader, body: any | null) => void; + onError: (message: string, exception?: Error) => void; + onConnectionLost: () => void; + onReconnect: () => void; + onReconnecting: (retry: number, maxRetries: number) => void; +}; class PiPedalSocket { - onMessageReceived: MessageHandler; - onError: ErrorHandler; - onReconnecting: ReconnectingHandler; - onReconnect: ReconnectHandler; + + listener: PiPedalSocketListener; + socket?: WebSocket; nextResponseCode: number = 0; @@ -54,15 +59,10 @@ class PiPedalSocket { constructor( url: string, - onMessageReceived: MessageHandler, - onError: ErrorHandler, - onReconnecting: ReconnectingHandler, - onReconnect: ReconnectHandler) { + listener: PiPedalSocketListener + ) { this.url = url; - this.onMessageReceived = onMessageReceived; - this.onError = onError; - this.onReconnecting = onReconnecting; - this.onReconnect = onReconnect; + this.listener = listener; } handleOpen(event: Event): any { @@ -160,11 +160,11 @@ class PiPedalSocket { if (header.message === "error") { throw new PiPedalStateError("Server error: " + body); } - this.onMessageReceived(header, body); + this.listener.onMessageReceived(header, body); } } catch (error) { - if (this.onError) { - this.onError("Invalid server response. " + error, error as Error); + if (this.listener) { + this.listener.onError("Invalid server response. " + error, error as Error); } else { throw new PiPedalStateError("Invalid server response."); } @@ -172,8 +172,8 @@ class PiPedalSocket { } handleError(_event: Event): any { - if (this.onError) { - this.onError("Server connection lost."); + if (this.listener) { + this.listener.onError("Server connection lost."); } else { throw new PiPedalStateError("Server connection lost."); } @@ -184,8 +184,8 @@ class PiPedalSocket { handleClose(_event: any): any { if (this.retrying) { // treat this as a fatal error. - if (this.onError) { - this.onError("Server connection lost."); + if (this.listener) { + this.listener.onError("Server connection lost."); } else { throw new PiPedalStateError("Server connection closed."); } @@ -194,6 +194,7 @@ class PiPedalSocket { } if (this.canReconnect) { + this.listener.onConnectionLost(); this._reconnect(); } } @@ -229,19 +230,19 @@ class PiPedalSocket { this.close(); } - this.onReconnecting(this.retryCount,MAX_RETRIES); + this.listener.onReconnecting(this.retryCount,MAX_RETRIES); ++this.retryCount; this.connectInternal_() .then((socket) => { this.socket = socket; this.retrying = false; - this.onReconnect(); + this.listener.onReconnect(); }) .catch(error => { if (this.totalRetryDelay === MAX_RETRY_TIME) { - this.onError("Server connection lost."); + this.listener.onError("Server connection lost."); return; } else { this.totalRetryDelay += this.retryDelay; diff --git a/react/src/SelectChannelsDialog.tsx b/react/src/SelectChannelsDialog.tsx index b4d7121..f74ddb1 100644 --- a/react/src/SelectChannelsDialog.tsx +++ b/react/src/SelectChannelsDialog.tsx @@ -70,7 +70,6 @@ function SelectChannelsDialog(props: SelectChannelsDialogProps) { const { onClose, selectedChannels, availableChannels, open } = props; const [currentSelection, setCurrentSelection] = useState(selectedChannels); - let showCheckboxes = availableChannels.length > 2; if (showCheckboxes) { @@ -120,24 +119,27 @@ function SelectChannelsDialog(props: SelectChannelsDialogProps) { } else { - const handleClose = () => { - onClose(selectedChannels); + const handleCancel = () => { + onClose(null); + } + const handleOk = (channels: string[]) => { + onClose(channels); }; const handleListItemClick = (value: string) => { switch (value) { case "Stereo": - onClose(availableChannels); + handleOk(availableChannels); break; case "Left": - onClose([availableChannels[0]]); + handleOk([availableChannels[0]]); break; case "Right": - onClose([availableChannels[1]]); + handleOk([availableChannels[1]]); break; case "None": default: - onClose([availableChannels[1]]); + handleOk([]); } }; let selectionKey = "None"; @@ -152,7 +154,7 @@ function SelectChannelsDialog(props: SelectChannelsDialogProps) { } return ( - + handleListItemClick("Stereo")} key={"Stereo"} selected={selectionKey === "Stereo"} > diff --git a/react/src/WifiDirectConfigDialog.tsx b/react/src/WifiDirectConfigDialog.tsx index 6bedfd4..da0cf19 100644 --- a/react/src/WifiDirectConfigDialog.tsx +++ b/react/src/WifiDirectConfigDialog.tsx @@ -23,12 +23,14 @@ */ import React from 'react'; +import IconButton from '@mui/material/IconButton'; +import ArrowBackIcon from '@mui/icons-material/ArrowBack'; + import Button from '@mui/material/Button'; import TextField from '@mui/material/TextField'; import DialogEx from './DialogEx'; import DialogActions from '@mui/material/DialogActions'; import DialogContent from '@mui/material/DialogContent'; -import DialogTitle from '@mui/material/DialogTitle'; import Switch from '@mui/material/Switch'; import FormControlLabel from '@mui/material/FormControlLabel'; import ResizeResponsiveComponent from './ResizeResponsiveComponent'; @@ -37,9 +39,6 @@ import { Theme } from '@mui/material/styles'; import { WithStyles } from '@mui/styles'; import withStyles from '@mui/styles/withStyles'; import createStyles from '@mui/styles/createStyles'; -import Select from '@mui/material/Select'; -import FormControl from '@mui/material/FormControl'; -import InputLabel from '@mui/material/InputLabel'; import MenuItem from '@mui/material/MenuItem'; import WifiChannel from './WifiChannel'; import { PiPedalModel, PiPedalModelFactory } from './PiPedalModel'; @@ -72,6 +71,9 @@ export interface WifiDirectConfigState { pinErrorMessage: string; countryCode: string; channel: string; + controlWidth: number; + landscapeLayout: boolean; + controlSize: ("medium" | "small" | undefined); wifiChannels: WifiChannel[]; } @@ -88,7 +90,7 @@ const WifiDirectConfigDialog = withStyles(styles, { withTheme: true })( super(props); this.model = PiPedalModelFactory.getInstance(); this.state = { - fullScreen: false, + fullScreen: this.useFullScreen(), enabled: this.props.wifiDirectConfigSettings.enable, name: this.props.wifiDirectConfigSettings.hotspotName, pin: this.props.wifiDirectConfigSettings.pin, @@ -98,6 +100,10 @@ const WifiDirectConfigDialog = withStyles(styles, { withTheme: true })( pinErrorMessage: NBSP, countryCode: this.props.wifiDirectConfigSettings.countryCode, channel: this.props.wifiDirectConfigSettings.channel, + controlWidth: 260, + controlSize: this.windowSize.height < 600 ? "small" : "medium", + landscapeLayout: this.useLandscapeLayout(), + wifiChannels: [] }; this.model.getWifiChannels(this.props.wifiDirectConfigSettings.countryCode) @@ -108,6 +114,10 @@ const WifiDirectConfigDialog = withStyles(styles, { withTheme: true })( this.refName = React.createRef(); this.refPassword = React.createRef(); } + + useLandscapeLayout(): boolean { + return (this.windowSize.height < 690 && this.windowSize.width > this.windowSize.height && this.windowSize.width > 690); + } mounted: boolean = false; handleEnableChanged(e: any) { @@ -116,7 +126,15 @@ const WifiDirectConfigDialog = withStyles(styles, { withTheme: true })( onWindowSizeChanged(width: number, height: number): void { - this.setState({ fullScreen: height < 200 }) + this.setState({ + fullScreen: this.useFullScreen(), + controlSize: height < 600 ? "small" : "medium", + landscapeLayout: this.useLandscapeLayout() + }) + } + + useFullScreen(): boolean { + return this.windowSize.height < 390; } @@ -288,84 +306,94 @@ const WifiDirectConfigDialog = withStyles(styles, { withTheme: true })( }; return ( - - {this.state.fullScreen && ( - Wi-fi Hotspot - )} - - - this.handleEnableChanged(e)} - color="secondary" + {this.state.landscapeLayout && ( + +
+ {this.props.onClose(); }} + aria-label="back" + size="large"> + + + this.handleEnableChanged(e)} + color="secondary" + /> + )} + label="Wi-Fi Direct Hotspot" /> - )} - label="Enable Wi-Fi Direct Hotspot" - /> -
- this.setState({ name: e.target.value, nameError: false, nameErrorMessage: NBSP })} - inputRef={this.refName} - disabled={!this.state.enabled} - variant="filled" - /> -
-
- { this.setState({ pin: e.target.value, pinError: false, pinErrorMessage: NBSP }); }} - label="Pin" - error={this.state.pinError} - helperText={this.state.pinErrorMessage} - defaultValue={this.state.pin} - disabled={!this.state.enabled} - variant="filled" - /> - -
-
-
-
-
- - Country - - + - - -
-
- - Channel - - + -
+
+
+ )} + {(!this.state.landscapeLayout) && ( + + this.handleEnableChanged(e)} + color="secondary" + /> + )} + label="Wi-Fi Direct Hotspot" + /> +
+ this.setState({ name: e.target.value, nameError: false, nameErrorMessage: NBSP })} + inputRef={this.refName} + disabled={!this.state.enabled} + variant="filled" + /> +
+ { this.setState({ pin: e.target.value, pinError: false, pinErrorMessage: NBSP }); }} + label="Pin" + inputProps={{ inputMode: 'numeric' }} + fullWidth + error={this.state.pinError} + helperText={this.state.pinErrorMessage} + defaultValue={this.state.pin} + disabled={!this.state.enabled} + variant="filled" + /> +
+
+ +
+
+ { this.handleCountryChanged(event); }} + > + {Object.entries(this.model.countryCodes).map(([key, value]) => { + return ( + {value} + ); + })} + + + + +
+
+ { this.handleChannelChange(event); }} + > + {this.state.wifiChannels.map((channel) => { + let t = channel.channelId; + if (t.startsWith("a")) t = t.substring(1); + if (t.startsWith("g")) t = t.substring(1); + let name = channel.channelName; + if (name.startsWith("1 ") || name.startsWith("6 ") || name.startsWith("11 ")) { + name += " *Recommended"; + } + return ( + {name} + ) + })} + + +
+
+ )} -