mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-12 08:37:25 -05:00
#766 Resolves issue with playlist alias editor clone alias feature causing multiple copies of alias. Changed clone feature to only use a shallow copy (no ids or actions). Removed alias event framework from code since all change notifications can now be detected by the alias model's aliasList property. (#791)
Co-authored-by: Denny <denny@denny-desktop>
This commit is contained in:
@@ -74,6 +74,7 @@ import org.slf4j.LoggerFactory;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
* Editor for aliases
|
||||
@@ -97,7 +98,8 @@ public class AliasConfigurationEditor extends SplitPane
|
||||
private ComboBox<String> mAliasListNameComboBox;
|
||||
private Button mNewAliasListButton;
|
||||
private FilteredList<Alias> mAliasFilteredList;
|
||||
private AliasFilterMonitor mAliasFilterMonitor;
|
||||
private SortedList<Alias> mAliasSortedList;
|
||||
private AliasPredicate mAliasPredicate;
|
||||
|
||||
public AliasConfigurationEditor(PlaylistManager playlistManager, UserPreferences userPreferences)
|
||||
{
|
||||
@@ -124,7 +126,6 @@ public class AliasConfigurationEditor extends SplitPane
|
||||
*/
|
||||
public void show(Alias alias)
|
||||
{
|
||||
mLog.debug("Showing: " + alias.getName());
|
||||
if(alias != null)
|
||||
{
|
||||
String aliasList = alias.getAliasListName();
|
||||
@@ -224,20 +225,40 @@ public class AliasConfigurationEditor extends SplitPane
|
||||
if(mSearchField == null)
|
||||
{
|
||||
mSearchField = TextFields.createClearableTextField();
|
||||
|
||||
mSearchField.textProperty().addListener((observable, oldValue, newValue) -> update());
|
||||
}
|
||||
|
||||
return mSearchField;
|
||||
}
|
||||
|
||||
private void update()
|
||||
{
|
||||
getAliasFilteredList().setPredicate(null);
|
||||
getAliasPredicate().setAliasListName(getAliasListNameComboBox().getSelectionModel().getSelectedItem());
|
||||
getAliasPredicate().setSearchText(getSearchField().getText());
|
||||
getAliasFilteredList().setPredicate(getAliasPredicate());
|
||||
}
|
||||
|
||||
private AliasPredicate getAliasPredicate()
|
||||
{
|
||||
if(mAliasPredicate == null)
|
||||
{
|
||||
mAliasPredicate = new AliasPredicate();
|
||||
mAliasPredicate.setAliasListName(getAliasListNameComboBox().getSelectionModel().getSelectedItem());
|
||||
}
|
||||
|
||||
return mAliasPredicate;
|
||||
}
|
||||
|
||||
private ComboBox<String> getAliasListNameComboBox()
|
||||
{
|
||||
if(mAliasListNameComboBox == null)
|
||||
{
|
||||
mAliasListNameComboBox = new ComboBox<>(mPlaylistManager.getAliasModel().aliasListNames());
|
||||
mAliasListNameComboBox.getSelectionModel().selectedItemProperty()
|
||||
.addListener((observable, oldValue, newValue) -> {
|
||||
.addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
|
||||
getNewAliasButton().setDisable(newValue == null || newValue.contentEquals(AliasModel.NO_ALIAS_LIST));
|
||||
update();
|
||||
});
|
||||
|
||||
if(mAliasListNameComboBox.getItems().size() > 1)
|
||||
@@ -362,15 +383,7 @@ public class AliasConfigurationEditor extends SplitPane
|
||||
recordColumn, streamColumn, idsColumn, errorsColumn);
|
||||
|
||||
mAliasTableView.setPlaceholder(getPlaceholderLabel());
|
||||
|
||||
//Sorting and filtering for the table
|
||||
mAliasFilteredList = new FilteredList<>(mPlaylistManager.getAliasModel().aliasList(),
|
||||
alias -> alias.matchesAliasList(getAliasListNameComboBox().getSelectionModel().getSelectedItem()));
|
||||
mAliasFilterMonitor = new AliasFilterMonitor();
|
||||
|
||||
SortedList<Alias> sortedList = new SortedList<>(mAliasFilteredList);
|
||||
sortedList.comparatorProperty().bind(mAliasTableView.comparatorProperty());
|
||||
mAliasTableView.setItems(sortedList);
|
||||
mAliasTableView.setItems(getAliasSortedList());
|
||||
mAliasTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
|
||||
mAliasTableView.getSelectionModel().selectedItemProperty()
|
||||
.addListener((observable, oldValue, newValue) -> {
|
||||
@@ -381,6 +394,27 @@ public class AliasConfigurationEditor extends SplitPane
|
||||
return mAliasTableView;
|
||||
}
|
||||
|
||||
private FilteredList<Alias> getAliasFilteredList()
|
||||
{
|
||||
if(mAliasFilteredList == null)
|
||||
{
|
||||
mAliasFilteredList = new FilteredList<>(mPlaylistManager.getAliasModel().aliasList(), getAliasPredicate());
|
||||
}
|
||||
|
||||
return mAliasFilteredList;
|
||||
}
|
||||
|
||||
private SortedList<Alias> getAliasSortedList()
|
||||
{
|
||||
if(mAliasSortedList == null)
|
||||
{
|
||||
mAliasSortedList = new SortedList<>(getAliasFilteredList());
|
||||
mAliasSortedList.comparatorProperty().bind(getAliasTableView().comparatorProperty());
|
||||
}
|
||||
|
||||
return mAliasSortedList;
|
||||
}
|
||||
|
||||
private Label getPlaceholderLabel()
|
||||
{
|
||||
if(mPlaceholderLabel == null)
|
||||
@@ -417,7 +451,7 @@ public class AliasConfigurationEditor extends SplitPane
|
||||
mNewAliasButton.setAlignment(Pos.CENTER);
|
||||
mNewAliasButton.setMaxWidth(Double.MAX_VALUE);
|
||||
mNewAliasButton.setOnAction(event -> {
|
||||
Alias alias = new Alias();
|
||||
Alias alias = new Alias("New Alias");
|
||||
alias.setAliasListName(getAliasListNameComboBox().getSelectionModel().getSelectedItem());
|
||||
mPlaylistManager.getAliasModel().addAlias(alias);
|
||||
|
||||
@@ -477,7 +511,7 @@ public class AliasConfigurationEditor extends SplitPane
|
||||
mCloneAliasButton.setMaxWidth(Double.MAX_VALUE);
|
||||
mCloneAliasButton.setOnAction(event -> {
|
||||
Alias original = getAliasTableView().getSelectionModel().getSelectedItem();
|
||||
Alias copy = AliasFactory.copyOf(original);
|
||||
Alias copy = AliasFactory.shallowCopyOf(original);
|
||||
mPlaylistManager.getAliasModel().addAlias(copy);
|
||||
getAliasTableView().getSelectionModel().clearSelection();
|
||||
getAliasTableView().getSelectionModel().select(copy);
|
||||
@@ -765,47 +799,57 @@ public class AliasConfigurationEditor extends SplitPane
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the filtered set of aliases any time there is a change in the selected alias list name box, or when the
|
||||
* user types text in the search box.
|
||||
* Alias filter predicate
|
||||
*/
|
||||
public class AliasFilterMonitor
|
||||
public class AliasPredicate implements Predicate<Alias>
|
||||
{
|
||||
public AliasFilterMonitor()
|
||||
{
|
||||
getAliasListNameComboBox().getSelectionModel().selectedItemProperty()
|
||||
.addListener((observable, oldValue, newValue) -> {
|
||||
refresh();
|
||||
});
|
||||
private String mAliasListName;
|
||||
private String mSearchText;
|
||||
|
||||
getSearchField().textProperty().addListener((observable, oldValue, newValue) -> {
|
||||
refresh();
|
||||
});
|
||||
@Override
|
||||
public boolean test(Alias alias)
|
||||
{
|
||||
if(mAliasListName == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if(mAliasListName.equals(alias.getAliasListName()))
|
||||
{
|
||||
if(alias.getName() == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if(alias.getName().toLowerCase().contains(mSearchText))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if(alias.getGroup() != null && alias.getGroup().toLowerCase().contains(mSearchText))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void refresh()
|
||||
public void setAliasListName(String aliasListName)
|
||||
{
|
||||
final String aliasListName = getAliasListNameComboBox().getSelectionModel().getSelectedItem();
|
||||
final String filter = getSearchField().getText();
|
||||
if(aliasListName != null)
|
||||
{
|
||||
mAliasListName = aliasListName;
|
||||
}
|
||||
}
|
||||
|
||||
mAliasFilteredList.setPredicate(alias -> {
|
||||
if(filter == null || filter.isEmpty())
|
||||
{
|
||||
return alias.matchesAliasList(aliasListName);
|
||||
}
|
||||
|
||||
String lowerFilter = filter.toLowerCase();
|
||||
|
||||
if(alias.getName() != null && alias.getName().toLowerCase().contains(lowerFilter))
|
||||
{
|
||||
return alias.matchesAliasList(aliasListName);
|
||||
}
|
||||
else if(alias.getGroup() != null && alias.getGroup().toLowerCase().contains(lowerFilter))
|
||||
{
|
||||
return alias.matchesAliasList(aliasListName);
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
public void setSearchText(String searchText)
|
||||
{
|
||||
if(searchText != null)
|
||||
{
|
||||
mSearchText = searchText.toLowerCase();
|
||||
}
|
||||
else
|
||||
{
|
||||
mSearchText = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,7 +104,6 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
@@ -360,49 +359,15 @@ public class AliasItemEditor extends Editor<Alias>
|
||||
alias.addAliasID(selected);
|
||||
}
|
||||
|
||||
AliasList aliasList = mPlaylistManager.getAliasModel().getAliasList(alias.getAliasListName());
|
||||
aliasList.removeAlias(alias);
|
||||
|
||||
//Cleanup any alias identifiers that are marked as overlapping. To do this, we remove all of the
|
||||
//affected aliases, reset all of the overlap flags, and then add the aliases back to the alias list.
|
||||
Set<Alias> aliasesToReset = new HashSet<>();
|
||||
for(AliasID aliasID: alias.getAliasIdentifiers())
|
||||
{
|
||||
if(aliasID.overlapProperty().get())
|
||||
{
|
||||
aliasID.overlapProperty().set(false);
|
||||
List<Alias> overlapAliases = aliasList.getOverlappingAliases(alias, aliasID);
|
||||
aliasesToReset.addAll(overlapAliases);
|
||||
}
|
||||
}
|
||||
|
||||
//Remove overlap aliases, reset them, and readd back to the alias list
|
||||
for(Alias resetAlias: aliasesToReset)
|
||||
{
|
||||
aliasList.removeAlias(resetAlias);
|
||||
for(AliasID aliasID: resetAlias.getAliasIdentifiers())
|
||||
{
|
||||
aliasID.setOverlap(false);
|
||||
}
|
||||
}
|
||||
|
||||
//Remove and replace the remaining non-audio identifiers
|
||||
alias.removeNonAudioIdentifiers();
|
||||
|
||||
for(AliasID aliasID: getIdentifiersList().getItems())
|
||||
{
|
||||
aliasID.setOverlap(false);
|
||||
//Create a copy of the identifier so that the alias and the editor don't have the same instance
|
||||
alias.addAliasID(AliasFactory.copyOf(aliasID));
|
||||
}
|
||||
|
||||
//Add the aliases back to the alias list
|
||||
for(Alias resetAlias: aliasesToReset)
|
||||
{
|
||||
aliasList.addAlias(resetAlias);
|
||||
}
|
||||
aliasList.addAlias(alias);
|
||||
|
||||
//Remove and replace alias actions
|
||||
alias.removeAllActions();
|
||||
for(AliasAction aliasAction: getActionsList().getItems())
|
||||
@@ -411,6 +376,9 @@ public class AliasItemEditor extends Editor<Alias>
|
||||
}
|
||||
}
|
||||
|
||||
AliasList aliasList = mPlaylistManager.getAliasModel().getAliasList(alias.getAliasListName());
|
||||
aliasList.updateAlias(alias);
|
||||
|
||||
//Reset the alias to refresh the editor.
|
||||
setItem(alias);
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
package io.github.dsheirer.gui.playlist.alias;
|
||||
|
||||
import io.github.dsheirer.alias.Alias;
|
||||
import io.github.dsheirer.alias.AliasEvent;
|
||||
import io.github.dsheirer.alias.AliasModel;
|
||||
import io.github.dsheirer.playlist.PlaylistManager;
|
||||
import javafx.collections.ListChangeListener;
|
||||
@@ -315,7 +314,6 @@ public class AliasViewByRecordingEditor extends VBox
|
||||
if(selectedAlias != null)
|
||||
{
|
||||
selectedAlias.setRecordable(true);
|
||||
mPlaylistManager.getAliasModel().broadcast(new AliasEvent(selectedAlias, AliasEvent.Event.CHANGE));
|
||||
updateListFilters();
|
||||
}
|
||||
});
|
||||
@@ -342,7 +340,6 @@ public class AliasViewByRecordingEditor extends VBox
|
||||
for(Alias selectedAlias: selectedAliases)
|
||||
{
|
||||
selectedAlias.setRecordable(true);
|
||||
mPlaylistManager.getAliasModel().broadcast(new AliasEvent(selectedAlias, AliasEvent.Event.CHANGE));
|
||||
}
|
||||
|
||||
updateListFilters();
|
||||
@@ -368,7 +365,6 @@ public class AliasViewByRecordingEditor extends VBox
|
||||
if(selectedAlias != null)
|
||||
{
|
||||
selectedAlias.setRecordable(false);
|
||||
mPlaylistManager.getAliasModel().broadcast(new AliasEvent(selectedAlias, AliasEvent.Event.CHANGE));
|
||||
updateListFilters();
|
||||
}
|
||||
});
|
||||
@@ -395,7 +391,6 @@ public class AliasViewByRecordingEditor extends VBox
|
||||
for(Alias selectedAlias: selectedAliases)
|
||||
{
|
||||
selectedAlias.setRecordable(false);
|
||||
mPlaylistManager.getAliasModel().broadcast(new AliasEvent(selectedAlias, AliasEvent.Event.CHANGE));
|
||||
}
|
||||
|
||||
updateListFilters();
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
package io.github.dsheirer.gui.playlist.streaming;
|
||||
|
||||
import io.github.dsheirer.alias.Alias;
|
||||
import io.github.dsheirer.alias.AliasEvent;
|
||||
import io.github.dsheirer.alias.id.broadcast.BroadcastChannel;
|
||||
import io.github.dsheirer.audio.broadcast.BroadcastConfiguration;
|
||||
import io.github.dsheirer.playlist.PlaylistManager;
|
||||
@@ -312,7 +311,6 @@ public class StreamAliasSelectionEditor extends VBox
|
||||
if(selectedAlias != null && stream != null)
|
||||
{
|
||||
selectedAlias.addAliasID(new BroadcastChannel(stream));
|
||||
mPlaylistManager.getAliasModel().broadcast(new AliasEvent(selectedAlias, AliasEvent.Event.CHANGE));
|
||||
updateListFilters();
|
||||
}
|
||||
});
|
||||
@@ -344,7 +342,6 @@ public class StreamAliasSelectionEditor extends VBox
|
||||
for(Alias selectedAlias: selectedAliases)
|
||||
{
|
||||
selectedAlias.addAliasID(new BroadcastChannel(stream));
|
||||
mPlaylistManager.getAliasModel().broadcast(new AliasEvent(selectedAlias, AliasEvent.Event.CHANGE));
|
||||
}
|
||||
|
||||
updateListFilters();
|
||||
@@ -372,7 +369,6 @@ public class StreamAliasSelectionEditor extends VBox
|
||||
if(selectedAlias != null && stream != null)
|
||||
{
|
||||
selectedAlias.removeBroadcastChannel(stream);
|
||||
mPlaylistManager.getAliasModel().broadcast(new AliasEvent(selectedAlias, AliasEvent.Event.CHANGE));
|
||||
updateListFilters();
|
||||
}
|
||||
});
|
||||
@@ -400,7 +396,6 @@ public class StreamAliasSelectionEditor extends VBox
|
||||
for(Alias selectedAlias: selectedAliases)
|
||||
{
|
||||
selectedAlias.removeBroadcastChannel(stream);
|
||||
mPlaylistManager.getAliasModel().broadcast(new AliasEvent(selectedAlias, AliasEvent.Event.CHANGE));
|
||||
}
|
||||
|
||||
updateListFilters();
|
||||
|
||||
Reference in New Issue
Block a user