diff --git a/react/CMakeLists.txt b/react/CMakeLists.txt
index 862f75d..d69c08b 100644
--- a/react/CMakeLists.txt
+++ b/react/CMakeLists.txt
@@ -21,161 +21,178 @@ add_custom_command(
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/react
DEPENDS
- src/Updater.tsx
- src/OkCancelDialog.tsx
- src/PluginControl.tsx
- src/svg/ic_save_bank_as.svg
- src/svg/fx_constant.svg
- src/svg/fx_distortion.svg
- src/svg/ic_help_outline.svg
- src/svg/fx_oscillator.svg
- src/svg/fx_filter.svg
- src/svg/fx_function.svg
- src/svg/fx_generator.svg
- src/svg/fx_compressor.svg
- src/svg/file_download_black_24dp.svg
- src/svg/fx_filter_hp.svg
- src/svg/fx_plugin.svg
- src/svg/fx_error.svg
- src/svg/fx_gate.svg
- src/svg/ic_midi.svg
- src/svg/ic_pluginpreset.svg
- src/svg/fx_split_a.svg
- src/svg/fx_utility.svg
- src/svg/ic_pluginpreset2.svg
- src/svg/fx_parametric_eq.svg
- src/svg/fx_terminal.svg
- src/svg/ic_presets.svg
- src/svg/fx_flanger.svg
- src/svg/fx_analyzer.svg
- src/svg/fx_delay.svg
- src/svg/fx_spectral.svg
- src/svg/fx_chorus.svg
- src/svg/fx_simulator.svg
- src/svg/drive_file_rename_outline_black_24dp.svg
- src/svg/fx_mixer.svg
- src/svg/fx_eq.svg
- src/svg/fx_modulator.svg
- src/svg/file_upload_black_24dp.svg
- src/svg/fx_pitch.svg
- src/svg/fx_phaser.svg
- src/svg/fx_amplifier.svg
- src/svg/fx_lr.svg
- src/svg/fx_instrument.svg
- src/svg/fx_reverb.svg
- src/svg/ic_edit_banks.svg
- src/svg/fx_limiter.svg
- src/svg/fx_empty.svg
- src/svg/fx_dial.svg
- src/svg/fx_flanger2.svg
- src/svg/fx_split_b.svg
- src/svg/fx_spatial.svg
- src/svg/fx_converter.svg
- src/svg/old_delete_outline_24dp.svg
- src/svg/ic_settings.svg
- src/reportWebVitals.ts
- src/JackHostStatus.tsx
- src/PluginPresetsDialog.tsx
- src/ToobSpectrumAnalyzerView.tsx
- src/MidiBindingsDialog.tsx
- src/MidiBinding.tsx
- src/TemporaryDrawer.tsx
- src/ToobFrequencyResponseView.tsx
- src/index.css
- src/PluginOutputControl.tsx
- src/BankDialog.tsx
- src/VuMeter.tsx
- src/StringBuilder.tsx
- src/FilePropertyDialog.tsx
- src/GxTunerControl.tsx
- src/DarkMode.tsx
- src/App.tsx
- src/GxTunerView.tsx
- src/Rect.tsx
- src/ToobSpectrumResponseView.tsx
- src/DialogEx.tsx
- src/GovernorSettings.tsx
- src/FilePropertyControl.tsx
- src/JackServerSettingsDialog.tsx
- src/ZoomedUiControl.tsx
- src/Pedal.tsx
- src/FullScreenIME.tsx
- src/PluginPreset.tsx
- src/SystemMidiBindingsDialog.tsx
- src/AppThemed.tsx
- src/MainPage.tsx
- src/PiPedalModel.tsx
- src/PedalboardView.tsx
- src/ControlViewFactory.tsx
- src/PiPedalSocket.tsx
- src/PluginClass.tsx
- src/SplitControlView.tsx
- src/logo.svg
- src/ToobToneStackView.tsx
- src/Banks.tsx
- src/ToobPowerStage2View.tsx
- src/ListSelectDialog.tsx
- src/ToobWaveShapeView.tsx
- src/SelectThemeDialog.tsx
- src/PluginInfoDialog.tsx
- src/SearchFilter.tsx
- src/SearchControl.tsx
- src/JackServerSettings.tsx
- src/WifiChannel.tsx
- src/WifiConfigDialog.tsx
- src/FilePropertyDirectoryTree.tsx
- src/App.test.tsx
- src/PluginPresetSelector.tsx
- src/ObservableProperty.tsx
- src/PresetDialog.tsx
- src/AndroidHost.tsx
- src/SelectHoverBackground.tsx
- src/WifiDirectConfigDialog.tsx
- src/WifiDirectConfigSettings.tsx
- src/WifiConfigSettings.tsx
- src/Draggable.tsx
- src/JsonAtom.tsx
- src/SplitUiControls.tsx
- src/SelectChannelsDialog.tsx
- src/ToobMLView.tsx
- src/IControlViewFactory.tsx
- src/AppThemed.css
- src/ZoomedDial.tsx
- src/Units.tsx
- src/UploadPresetDialog.tsx
- src/NumericInput.tsx
+ src/PiPedalError.tsx
+ src/OldDeleteIcon.tsx
+ src/MaterialColors.tsx
src/Pedalboard.tsx
+ src/SystemMidiBindingView.tsx
+ src/GovernorSettings.tsx
+ src/ObservableProperty.tsx
+ src/SnapshotEditor.tsx
src/SelectMidiChannelsDialog.tsx
src/AlsaMidiDeviceInfo.tsx
- src/ResizeResponsiveComponent.tsx
- src/RenameDialog.tsx
- src/FilePropertyDirectorySelectDialog.tsx
- src/SystemMidiBindingView.tsx
- src/OldDeleteIcon.tsx
+ src/WifiDirectConfigSettings.tsx
+ src/WifiConfigSettings.tsx
+ src/JsonAtom.tsx
+ src/PiPedalSocket.tsx
+ src/TemporaryDrawer.tsx
+ src/DarkMode.tsx
+ src/MidiBindingsDialog.tsx
+ src/MidiBinding.tsx
+ src/SnapshotDialog.tsx
+ src/SettingsDialog.tsx
+ src/PedalboardView.tsx
+ src/reportWebVitals.ts
+ src/SelectChannelsDialog.tsx
+ src/PluginPresetSelector.tsx
+ src/VuMeter.tsx
+ src/ToobFrequencyResponseView.tsx
+ src/SystemMidiBindingsDialog.tsx
+ src/FullScreenIME.tsx
+ src/App.tsx
src/ToobInputStageView.tsx
src/XxxSnippet.tsx
+ src/JackServerSettings.tsx
+ src/ToobWaveShapeView.tsx
+ src/ToobPowerStage2View.tsx
+ src/PluginPreset.tsx
+ src/logo.svg
+ src/Banks.tsx
src/NoChangePassword.tsx
- src/react-app-env.d.ts
- src/PiPedalError.tsx
- src/AlsaDeviceInfo.tsx
- src/index.tsx
- src/SettingsDialog.tsx
- src/PluginControlView.tsx
- src/PresetSelector.tsx
- src/ToobCabSimView.tsx
- src/Utility.tsx
- src/Lv2Plugin.tsx
- src/Jack.tsx
- src/JackStatusView.tsx
- src/AboutDialog.tsx
+ src/SearchFilter.tsx
+ src/FilePropertyDirectorySelectDialog.tsx
+ src/GxTunerView.tsx
+ src/UpdateDialog.tsx
+ src/svg/file_download_black_24dp.svg
+ src/svg/fx_filter.svg
+ src/svg/fx_pitch.svg
+ src/svg/fx_distortion.svg
+ src/svg/fx_split_b.svg
+ src/svg/fx_chorus.svg
+ src/svg/fx_limiter.svg
+ src/svg/fx_phaser.svg
+ src/svg/snapshot_0.svg
+ src/svg/snapshot_3.svg
+ src/svg/file_upload_black_24dp.svg
+ src/svg/ic_bank.svg
+ src/svg/fx_function.svg
+ src/svg/fx_dial.svg
+ src/svg/ic_settings.svg
+ src/svg/fx_split_a.svg
+ src/svg/fx_empty.svg
+ src/svg/fx_amplifier.svg
+ src/svg/fx_spectral.svg
+ src/svg/fx_eq.svg
+ src/svg/ic_edit_banks.svg
+ src/svg/ic_help_outline.svg
+ src/svg/ic_save_bank_as.svg
+ src/svg/ic_pluginpreset2.svg
+ src/svg/fx_flanger2.svg
+ src/svg/snapshot_6.svg
+ src/svg/fx_lr.svg
+ src/svg/fx_generator.svg
+ src/svg/snapshot_1.svg
+ src/svg/fx_reverb.svg
+ src/svg/fx_plugin.svg
+ src/svg/snapshot_4.svg
+ src/svg/drive_file_rename_outline_black_24dp.svg
+ src/svg/snapshot_2.svg
+ src/svg/fx_instrument.svg
+ src/svg/fx_modulator.svg
+ src/svg/fx_error.svg
+ src/svg/fx_simulator.svg
+ src/svg/fx_filter_hp.svg
+ src/svg/fx_compressor.svg
+ src/svg/fx_gate.svg
+ src/svg/fx_terminal.svg
+ src/svg/ic_midi.svg
+ src/svg/fx_oscillator.svg
+ src/svg/fx_analyzer.svg
+ src/svg/fx_flanger.svg
+ src/svg/old_delete_outline_24dp.svg
+ src/svg/ic_presets.svg
+ src/svg/fx_delay.svg
+ src/svg/fx_parametric_eq.svg
+ src/svg/fx_spatial.svg
+ src/svg/fx_converter.svg
+ src/svg/fx_constant.svg
+ src/svg/snapshot_5.svg
+ src/svg/ic_pluginpreset.svg
+ src/svg/fx_mixer.svg
+ src/svg/fx_utility.svg
+ src/Updater.tsx
+ src/UploadPresetDialog.tsx
src/setupTests.ts
+ src/ToobCabSimView.tsx
+ src/RenameDialog.tsx
+ src/SplitControlView.tsx
+ src/SelectHoverBackground.tsx
+ src/IControlViewFactory.tsx
+ src/OkCancelDialog.tsx
+ src/BankDialog.tsx
+ src/PluginPresetsDialog.tsx
+ src/App.test.tsx
+ src/ControlViewFactory.tsx
src/DraggableGrid.tsx
- src/SvgPathBuilder.tsx
- src/LoadPluginDialog.tsx
- src/MidiBindingView.tsx
+ src/ZoomedDial.tsx
+ src/index.css
+ src/Pedal.tsx
+ src/Draggable.tsx
src/PluginIcon.tsx
+ src/react-app-env.d.ts
+ src/FilePropertyDialog.tsx
+ src/FilePropertyDirectoryTree.tsx
+ src/StringBuilder.tsx
+ src/MainPage.tsx
+ src/PluginInfoDialog.tsx
+ src/AppThemed.tsx
+ src/Lv2Plugin.tsx
+ src/ToobSpectrumResponseView.tsx
+ src/PerformanceView.tsx
+ src/JackServerSettingsDialog.tsx
+ src/ListSelectDialog.tsx
+ src/Utility.tsx
+ src/JackStatusView.tsx
+ src/ToobSpectrumAnalyzerView.tsx
+ src/SvgPathBuilder.tsx
+ src/PresetSelector.tsx
+ src/PresetDialog.tsx
+ src/WifiChannel.tsx
+ src/AboutDialog.tsx
+ src/GxTunerControl.tsx
+ src/PluginControl.tsx
+ src/LoadPluginDialog.tsx
+ src/ZoomedUiControl.tsx
+ src/AlsaDeviceInfo.tsx
+ src/ToobToneStackView.tsx
src/UploadFileDialog.tsx
-
+ src/PluginOutputControl.tsx
+ src/SelectThemeDialog.tsx
+ src/Rect.tsx
+ src/AppThemed.css
+ src/ColorDropdownButton.tsx
+ src/AndroidHost.tsx
+ src/SnapshotPanel.tsx
+ src/ToobMLView.tsx
+ src/WifiConfigDialog.tsx
+ src/SnapshotColors.tsx
+ src/PiPedalModel.tsx
+ src/JackHostStatus.tsx
+ src/index.tsx
+ src/FilePropertyControl.tsx
+ src/WifiDirectConfigDialog.tsx
+ src/MidiBindingView.tsx
+ src/PluginControlView.tsx
+ src/SplitUiControls.tsx
+ src/PluginClass.tsx
+ src/DialogEx.tsx
+ src/Jack.tsx
+ src/ResizeResponsiveComponent.tsx
+ src/NumericInput.tsx
+ src/SnapshotPropertiesDialog.tsx
+ src/SearchControl.tsx
+ src/Units.tsx
+
)
add_custom_target (
diff --git a/react/src/App.tsx b/react/src/App.tsx
index d1daccd..b7c8603 100644
--- a/react/src/App.tsx
+++ b/react/src/App.tsx
@@ -20,6 +20,7 @@
import React from 'react';
import { ThemeProvider, createTheme, StyledEngineProvider, Theme } from '@mui/material/styles';
+import VirtualKeyboardHandler from './VirtualKeyboardHandler';
import AppThemed from "./AppThemed";
import { isDarkMode } from './DarkMode';
@@ -152,6 +153,8 @@ const theme = createTheme(
type AppThemeProps = {
};
+
+
const App = (class extends React.Component {
// Before the component mounts, we initialise our state
@@ -159,13 +162,19 @@ const App = (class extends React.Component {
super(props);
this.state = {
};
+ if (!App.virtualKeyboardHandler)
+ {
+ App.virtualKeyboardHandler = new VirtualKeyboardHandler();
+ }
}
+ static virtualKeyboardHandler?: VirtualKeyboardHandler;
+
render() {
return (
-
+
);
diff --git a/react/src/AppThemed.tsx b/react/src/AppThemed.tsx
index bbf4d5a..73615d5 100644
--- a/react/src/AppThemed.tsx
+++ b/react/src/AppThemed.tsx
@@ -232,10 +232,11 @@ const appStyles = (theme: Theme) => createStyles({
});
+
function supportsFullScreen(): boolean {
let doc: any = window.document;
let docEl: any = doc.documentElement;
- var requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen;
+ var requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullscreen || docEl.msRequestFullScreen;
return (!!requestFullScreen);
}
@@ -244,10 +245,20 @@ function setFullScreen(value: boolean) {
let doc: any = window.document;
let docEl: any = doc.documentElement;
- var requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen;
- var cancelFullScreen = doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen;
+ if (docEl.requestFullscren) // the latest offical api.
+ {
+ if (value)
+ {
+ window.document.documentElement.requestFullscreen({navigationUI: "show"});
+ } else {
+ window.document.exitFullscreen();
+ }
+ }
- if (!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement) {
+ var requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullscreen || docEl.msRequestFullScreen;
+ var cancelFullScreen = docEl.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen;
+
+ if (value) {
requestFullScreen.call(docEl);
}
else {
@@ -547,7 +558,7 @@ const AppThemed = withStyles(appStyles)(class extends ResizeResponsiveComponent<
});
}
toggleFullScreen(): void {
- setFullScreen(this.state.isFullScreen);
+ setFullScreen(!this.state.isFullScreen);
this.setState({ isFullScreen: !this.state.isFullScreen });
}
@@ -735,7 +746,7 @@ const AppThemed = withStyles(appStyles)(class extends ResizeResponsiveComponent<
return (
{this.state.performanceView ? (
-
{ this.setState({ performanceView: false }); }}
/>
) : (
@@ -1028,8 +1039,8 @@ const AppThemed = withStyles(appStyles)(class extends ResizeResponsiveComponent<
-
@@ -1056,7 +1067,7 @@ const AppThemed = withStyles(appStyles)(class extends ResizeResponsiveComponent<
{/* initial load mask*/}
-
+
@@ -1069,7 +1080,7 @@ const AppThemed = withStyles(appStyles)(class extends ResizeResponsiveComponent<
{/* Reloading mask */}
void;
+ dropdownAlignment: DropdownAlignment;
}
const ColorDropdownButton: React.FC
= ({
currentColor = colors[0],
onColorChange,
+ dropdownAlignment = DropdownAlignment.SE
}) => {
const [anchorEl, setAnchorEl] = useState(null);
const [selectedColor, setSelectedColor] = useState(currentColor);
@@ -38,7 +45,6 @@ const ColorDropdownButton: React.FC = ({
setSelectedColor(color);
onColorChange(color);
};
-
return (
= ({
onClose={handleClose}
anchorOrigin={{
vertical: 'bottom',
- horizontal: 'right',
+ horizontal: (dropdownAlignment === DropdownAlignment.SW ? 'right' : 'left')
}}
transformOrigin={{
vertical: 'top',
- horizontal: 'right',
+ horizontal: (dropdownAlignment === DropdownAlignment.SW ? 'right' : 'left'),
}}
>
diff --git a/react/src/DialogEx.tsx b/react/src/DialogEx.tsx
index 1fe4e28..4879613 100644
--- a/react/src/DialogEx.tsx
+++ b/react/src/DialogEx.tsx
@@ -28,29 +28,34 @@ interface DialogExProps extends DialogProps {
}
interface DialogExState {
+}
+export interface IDialogStackable {
+ getTag: ()=> string;
+ isOpen: ()=> boolean;
+ onDialogStackClose(): void;
}
class DialogStackEntry {
- constructor(dialog: DialogEx)
+ constructor(dialog: IDialogStackable)
{
- this.tag = dialog.props.tag;
+ this.tag = dialog.getTag();
this.dialog = dialog;
}
tag: string;
- dialog: DialogEx;
+ dialog: IDialogStackable;
};
let dialogStack: DialogStackEntry[] = [];
-function popDialogStack(): void {
+export function popDialogStack(): void {
if (dialogStack.length !== 0)
{
dialogStack.splice(dialogStack.length-1,1);
}
}
-function pushDialogStack(dialog: DialogEx): void {
+export function pushDialogStack(dialog: IDialogStackable): void {
dialogStack.push(new DialogStackEntry(dialog));
}
@@ -66,18 +71,19 @@ export function removeDialogStackEntriesAbove(tag: string)
for (let i = dialogStack.length-1; i >= 0; --i)
{
let entry = dialogStack[i];
- if (entry.tag === tag)
+ if (entry.dialog.getTag() === tag)
{
return;
}
popDialogStack();
- if (entry.dialog.props.open && entry.dialog.props.onClose)
+ if (entry.dialog.isOpen())
{
- entry.dialog.props.onClose({}, "backdropClick");
+ entry.dialog.onDialogStackClose();
}
+
}
}
-class DialogEx extends React.Component
{
+class DialogEx extends React.Component implements IDialogStackable {
constructor(props: DialogExProps)
{
super(props);
@@ -93,6 +99,16 @@ class DialogEx extends React.Component {
hasHooks: boolean = false;
stateWasPopped: boolean = false;
+ getTag() {
+ return this.props.tag;
+ }
+ isOpen(): boolean {
+ return this.props.open;
+ }
+ onDialogStackClose() {
+ this.props.onClose?.({},"backdropClick");
+ }
+
handlePopState(ev: PopStateEvent): any
{
let evTag: DialogStackState | null = ev.state as DialogStackState | null;
@@ -169,11 +185,25 @@ class DialogEx extends React.Component {
if (this.props.onClose) this.props.onClose(event,reason);
}
+ onEnterKey() {
+
+ }
+ onKeyDown(evt: React.KeyboardEvent)
+ {
+ if (evt.key === 'Enter')
+ {
+ this.onEnterKey();
+ }
+ }
render() {
- let { tag,onClose, ...extra} = this.props;
+ let { tag,onClose,...extra} = this.props;
return (
-