Merge pull request #2129 from SiboVG/issue-2102
[#2102] Add "Select components of same color" and "Select none" option
This commit is contained in:
commit
52988bf31e
@ -39,6 +39,11 @@ RocketActions.DuplicateAct.Duplicate = Duplicate
|
||||
RocketActions.DuplicateAct.ttip.Duplicate = Duplicate this component (and subcomponents).
|
||||
RocketActions.EditAct.Edit = Edit
|
||||
RocketActions.EditAct.ttip.Edit = Edit the selected component.
|
||||
RocketActions.Select = Select
|
||||
RocketActions.Select.SelectSameColorAct = Components of same color
|
||||
RocketActions.Select.SelectSameColorAct.ttip = Select all components of the same color as this component.
|
||||
RocketActions.Select.DeselectAllAct = Deselect all
|
||||
RocketActions.Select.DeselectAllAct.ttip = Deselect all currently selected components.
|
||||
RocketActions.ScaleAct.Scale = Scale
|
||||
RocketActions.ScaleAct.ttip.Scale = Scale parts of the rocket design
|
||||
RocketActions.NewStageAct.Newstage = New stage
|
||||
|
@ -238,6 +238,13 @@ public class BasicFrame extends JFrame {
|
||||
popupMenu.add(actions.getPasteAction());
|
||||
popupMenu.add(actions.getDuplicateAction());
|
||||
popupMenu.add(actions.getDeleteAction());
|
||||
|
||||
popupMenu.addSeparator();
|
||||
JMenu selectMenu = new JMenu(trans.get("RocketActions.Select"));
|
||||
selectMenu.add(actions.getSelectSameColorAction());
|
||||
selectMenu.add(actions.getDeselectAllAction());
|
||||
popupMenu.add(selectMenu);
|
||||
|
||||
popupMenu.addSeparator();
|
||||
popupMenu.add(actions.getScaleAction());
|
||||
}
|
||||
@ -557,6 +564,15 @@ public class BasicFrame extends JFrame {
|
||||
|
||||
fileMenu.addSeparator();
|
||||
|
||||
JMenu subMenu = new JMenu(trans.get("RocketActions.Select"));
|
||||
menu.add(subMenu);
|
||||
item = new JMenuItem(actions.getSelectSameColorAction());
|
||||
subMenu.add(item);
|
||||
item = new JMenuItem(actions.getDeselectAllAction());
|
||||
subMenu.add(item);
|
||||
|
||||
menu.addSeparator();
|
||||
|
||||
item = new JMenuItem(actions.getScaleAction());
|
||||
fileMenu.add(item);
|
||||
|
||||
|
@ -35,6 +35,7 @@ import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||
import net.sf.openrocket.rocketcomponent.AxialStage;
|
||||
import net.sf.openrocket.startup.Application;
|
||||
import net.sf.openrocket.startup.Preferences;
|
||||
import net.sf.openrocket.util.Color;
|
||||
import net.sf.openrocket.util.Pair;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -74,6 +75,8 @@ public class RocketActions {
|
||||
private final RocketAction pasteAction;
|
||||
private final RocketAction duplicateAction;
|
||||
private final RocketAction editAction;
|
||||
private final RocketAction selectSameColorAction;
|
||||
private final RocketAction deselectAllAction;
|
||||
private final RocketAction scaleAction;
|
||||
private final RocketAction moveUpAction;
|
||||
private final RocketAction moveDownAction;
|
||||
@ -98,6 +101,8 @@ public class RocketActions {
|
||||
this.pasteAction = new PasteAction();
|
||||
this.duplicateAction = new DuplicateAction();
|
||||
this.editAction = new EditAction();
|
||||
this.selectSameColorAction = new SelectSameColorAction();
|
||||
this.deselectAllAction = new DeselectAllAction();
|
||||
this.scaleAction = new ScaleAction();
|
||||
this.moveUpAction = new MoveUpAction();
|
||||
this.moveDownAction = new MoveDownAction();
|
||||
@ -131,6 +136,8 @@ public class RocketActions {
|
||||
pasteAction.clipboardChanged();
|
||||
duplicateAction.clipboardChanged();
|
||||
editAction.clipboardChanged();
|
||||
selectSameColorAction.clipboardChanged();
|
||||
deselectAllAction.clipboardChanged();
|
||||
scaleAction.clipboardChanged();
|
||||
moveUpAction.clipboardChanged();
|
||||
moveDownAction.clipboardChanged();
|
||||
@ -171,6 +178,14 @@ public class RocketActions {
|
||||
return editAction;
|
||||
}
|
||||
|
||||
public Action getSelectSameColorAction() {
|
||||
return selectSameColorAction;
|
||||
}
|
||||
|
||||
public Action getDeselectAllAction() {
|
||||
return deselectAllAction;
|
||||
}
|
||||
|
||||
public Action getScaleAction() {
|
||||
return scaleAction;
|
||||
}
|
||||
@ -1006,6 +1021,115 @@ public class RocketActions {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action to select all components with the same color as the currently selected component.
|
||||
*/
|
||||
private class SelectSameColorAction extends RocketAction {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public SelectSameColorAction() {
|
||||
//// Select same color
|
||||
this.putValue(NAME, trans.get("RocketActions.Select.SelectSameColorAct"));
|
||||
this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.Select.SelectSameColorAct.ttip"));
|
||||
clipboardChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
List<RocketComponent> components = selectionModel.getSelectedComponents();
|
||||
if (components.size() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
RocketComponent component = components.get(0);
|
||||
List<RocketComponent> sameColorComponents;
|
||||
|
||||
// Case 1: component has a default appearance (null)
|
||||
if (component.getAppearance() == null) {
|
||||
sameColorComponents = getComponentsDefaultColor(component);
|
||||
}
|
||||
// Case 2: component has a custom appearance
|
||||
else {
|
||||
sameColorComponents = getComponentsCustomColor(component);
|
||||
}
|
||||
|
||||
selectionModel.setSelectedComponents(sameColorComponents);
|
||||
}
|
||||
|
||||
private List<RocketComponent> getComponentsCustomColor(RocketComponent component) {
|
||||
Color targetColor = component.getAppearance().getPaint();
|
||||
List<RocketComponent> components = new ArrayList<>();
|
||||
components.add(component);
|
||||
|
||||
for (RocketComponent c : rocket) {
|
||||
if (c == component || c.getAppearance() == null || c.getAppearance().getPaint() == null) {
|
||||
continue;
|
||||
}
|
||||
Color color = c.getAppearance().getPaint();
|
||||
// Add components with the same RGB values (ignore alpha)
|
||||
if (color.getRed() == targetColor.getRed() &&
|
||||
color.getGreen() == targetColor.getGreen() &&
|
||||
color.getBlue() == targetColor.getBlue()) {
|
||||
components.add(c);
|
||||
}
|
||||
}
|
||||
|
||||
return components;
|
||||
}
|
||||
|
||||
private List<RocketComponent> getComponentsDefaultColor(RocketComponent component) {
|
||||
List<RocketComponent> components = new ArrayList<>();
|
||||
components.add(component);
|
||||
|
||||
for (RocketComponent c : rocket) {
|
||||
if (c == component) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Only add same components & components that also have the default color
|
||||
if (c.getClass().equals(component.getClass()) && c.getAppearance() == null) {
|
||||
components.add(c);
|
||||
}
|
||||
}
|
||||
|
||||
return components;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clipboardChanged() {
|
||||
List<RocketComponent> components = selectionModel.getSelectedComponents();
|
||||
this.setEnabled(components.size() == 1 && components.get(0).isMassive());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Action to deselect all currently selected components.
|
||||
*/
|
||||
private class DeselectAllAction extends RocketAction {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public DeselectAllAction() {
|
||||
//// Deselect all
|
||||
this.putValue(NAME, trans.get("RocketActions.Select.DeselectAllAct"));
|
||||
this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.Select.DeselectAllAct.ttip"));
|
||||
clipboardChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
selectionModel.clearComponentSelection();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clipboardChanged() {
|
||||
List<RocketComponent> components = selectionModel.getSelectedComponents();
|
||||
this.setEnabled(components.size() > 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Action to scale the currently selected component.
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user