diff --git a/CMakeLists.txt b/CMakeLists.txt
index d053763..86c47f4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -48,9 +48,10 @@ install (FILES ${PROJECT_SOURCE_DIR}/build/src/notices.txt
DESTINATION /etc/pipedal/react/var/)
install (FILES ${PROJECT_SOURCE_DIR}/src/template.service
- ${PROJECT_SOURCE_DIR}/src/templateShutdown.service
+ ${PROJECT_SOURCE_DIR}/src/templateAdmin.service
${PROJECT_SOURCE_DIR}/src/templateJack.service
- DESTINATION /etc/pipedal )
+ ${PROJECT_SOURCE_DIR}/src/defaultFavorites.json
+ DESTINATION /etc/pipedal/config )
install (DIRECTORY ${LV2_SOURCE_DIRECTORY}
DESTINATION /usr/lib/lv2
diff --git a/react/public/var/config.json b/react/public/var/config.json
index 2d62624..0e07f34 100644
--- a/react/public/var/config.json
+++ b/react/public/var/config.json
@@ -1,5 +1,5 @@
{
- "socket_server_port": 80,
+ "socket_server_port": 8080,
"socket_server_address": "*",
"debug": true,
"max_upload_size": 1048576,
diff --git a/react/src/LoadPluginDialog.tsx b/react/src/LoadPluginDialog.tsx
index 0234d89..d4730f1 100644
--- a/react/src/LoadPluginDialog.tsx
+++ b/react/src/LoadPluginDialog.tsx
@@ -19,7 +19,7 @@
import React, { ReactNode, SyntheticEvent, CSSProperties } from 'react';
-import { PiPedalModel, PiPedalModelFactory } from './PiPedalModel';
+import { PiPedalModel, PiPedalModelFactory, FavoritesList } from './PiPedalModel';
import { UiPlugin, PluginType } from './Lv2Plugin';
import ButtonBase from '@mui/material/ButtonBase';
import Button from '@mui/material/Button';
@@ -42,10 +42,10 @@ import SearchControl from './SearchControl';
import SearchFilter from './SearchFilter';
import { FixedSizeGrid } from 'react-window';
import AutoSizer from 'react-virtualized-auto-sizer';
-
-import Slide, {SlideProps} from '@mui/material/Slide';
+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 { WithStyles, withStyles } from '@mui/styles';
export type CloseEventHandler = () => void;
@@ -119,6 +119,9 @@ const pluginGridStyles = (theme: Theme) => createStyles({
paddingLeft: 16, whiteSpace: "nowrap"
},
+ favoriteDecoration: {
+ flex: "0 0 auto"
+ },
table: {
borderCollapse: "collapse",
},
@@ -167,6 +170,7 @@ type PluginGridState = {
grid_cell_width: number,
grid_cell_columns: number,
minimumItemWidth: number,
+ favoritesList: FavoritesList
}
@@ -203,7 +207,8 @@ export const LoadPluginDialog =
client_height: window.innerHeight,
grid_cell_width: this.getCellWidth(window.innerWidth),
grid_cell_columns: this.getCellColumns(window.innerWidth),
- minimumItemWidth: props.minimumItemWidth ? props.minimumItemWidth : 220
+ minimumItemWidth: props.minimumItemWidth ? props.minimumItemWidth : 220,
+ favoritesList: this.model.favorites.get()
};
this.updateWindowSize = this.updateWindowSize.bind(this);
@@ -211,6 +216,7 @@ export const LoadPluginDialog =
this.handleOk = this.handleOk.bind(this);
this.handleSearchStringReady = this.handleSearchStringReady.bind(this);
this.handleKeyPress = this.handleKeyPress.bind(this);
+ this.handleFavoritesChanged = this.handleFavoritesChanged.bind(this);
}
nominal_column_width: number = 250;
@@ -264,12 +270,23 @@ export const LoadPluginDialog =
grid_cell_columns: this.getCellColumns(window.innerWidth)
});
}
+
+ handleFavoritesChanged() {
+ this.setState(
+ {
+ favoritesList: this.model.favorites.get()
+ });
+ }
componentDidMount() {
super.componentDidMount();
this.updateWindowSize();
window.addEventListener('resize', this.updateWindowSize);
+ this.model.favorites.addOnChangedHandler(this.handleFavoritesChanged);
+ this.setState({ favoritesList: this.model.favorites.get() });
+
}
componentWillUnmount() {
+ this.model.favorites.removeOnChangedHandler(this.handleFavoritesChanged);
super.componentWillUnmount();
window.removeEventListener('resize', this.updateWindowSize);
}
@@ -352,18 +369,17 @@ export const LoadPluginDialog =
let isDoubleClick = e.detail === 2;
// we have to synthesize double clicks because
// DOM rewrites interfere with natural double click.
- if (isDoubleClick)
- {
+ if (isDoubleClick) {
this.props.onOk(uri);
}
}
handleMouseEnter(e: SyntheticEvent, uri: string): void {
- // this.setHoverUri(uri);
+ // this.setHoverUri(uri);
}
handleMouseLeave(e: SyntheticEvent, uri: string): void {
- // this.setHoverUri("");
+ // this.setHoverUri("");
}
onInfoClicked(): void {
@@ -421,6 +437,9 @@ export const LoadPluginDialog =
let score = searchFilter.score(plugin.name, plugin.plugin_display_type, plugin.author_name);
if (score !== 0) {
+ if (this.state.favoritesList[plugin.uri]) {
+ score += 32768;
+ }
results.push({ score: score, plugin: plugin });
}
}
@@ -469,6 +488,7 @@ export const LoadPluginDialog =
let value = this.gridItems[item];
let classes = this.props.classes;
+ let isFavorite: boolean = this.state.favoritesList[value.uri] ?? false;
return (
{ this.onDoubleClick(e, value.uri) }}
@@ -491,12 +511,19 @@ export const LoadPluginDialog =
+
+
+
);
}
+ setFavorite(pluginUri: string | undefined, isFavorite: boolean): void {
+ if (!pluginUri) return;
+ this.model.setFavorite(pluginUri, isFavorite);
+ }
gridItems: UiPlugin[] = [];
gridColumnCount: number = 1;
@@ -516,6 +543,7 @@ export const LoadPluginDialog =
this.gridItems = this.getFilteredPlugins();
let gridColumnCount = this.state.grid_cell_columns;
this.gridColumnCount = gridColumnCount;
+ let isFavorite = this.state.favoritesList[this.state.selected_uri ?? ""];
return (