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.DuplicateAct.ttip.Duplicate = Duplicate this component (and subcomponents).
|
||||||
RocketActions.EditAct.Edit = Edit
|
RocketActions.EditAct.Edit = Edit
|
||||||
RocketActions.EditAct.ttip.Edit = Edit the selected component.
|
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.Scale = Scale
|
||||||
RocketActions.ScaleAct.ttip.Scale = Scale parts of the rocket design
|
RocketActions.ScaleAct.ttip.Scale = Scale parts of the rocket design
|
||||||
RocketActions.NewStageAct.Newstage = New stage
|
RocketActions.NewStageAct.Newstage = New stage
|
||||||
|
@ -238,6 +238,13 @@ public class BasicFrame extends JFrame {
|
|||||||
popupMenu.add(actions.getPasteAction());
|
popupMenu.add(actions.getPasteAction());
|
||||||
popupMenu.add(actions.getDuplicateAction());
|
popupMenu.add(actions.getDuplicateAction());
|
||||||
popupMenu.add(actions.getDeleteAction());
|
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.addSeparator();
|
||||||
popupMenu.add(actions.getScaleAction());
|
popupMenu.add(actions.getScaleAction());
|
||||||
}
|
}
|
||||||
@ -557,6 +564,15 @@ public class BasicFrame extends JFrame {
|
|||||||
|
|
||||||
fileMenu.addSeparator();
|
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());
|
item = new JMenuItem(actions.getScaleAction());
|
||||||
fileMenu.add(item);
|
fileMenu.add(item);
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@ import net.sf.openrocket.rocketcomponent.RocketComponent;
|
|||||||
import net.sf.openrocket.rocketcomponent.AxialStage;
|
import net.sf.openrocket.rocketcomponent.AxialStage;
|
||||||
import net.sf.openrocket.startup.Application;
|
import net.sf.openrocket.startup.Application;
|
||||||
import net.sf.openrocket.startup.Preferences;
|
import net.sf.openrocket.startup.Preferences;
|
||||||
|
import net.sf.openrocket.util.Color;
|
||||||
import net.sf.openrocket.util.Pair;
|
import net.sf.openrocket.util.Pair;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@ -74,6 +75,8 @@ public class RocketActions {
|
|||||||
private final RocketAction pasteAction;
|
private final RocketAction pasteAction;
|
||||||
private final RocketAction duplicateAction;
|
private final RocketAction duplicateAction;
|
||||||
private final RocketAction editAction;
|
private final RocketAction editAction;
|
||||||
|
private final RocketAction selectSameColorAction;
|
||||||
|
private final RocketAction deselectAllAction;
|
||||||
private final RocketAction scaleAction;
|
private final RocketAction scaleAction;
|
||||||
private final RocketAction moveUpAction;
|
private final RocketAction moveUpAction;
|
||||||
private final RocketAction moveDownAction;
|
private final RocketAction moveDownAction;
|
||||||
@ -98,6 +101,8 @@ public class RocketActions {
|
|||||||
this.pasteAction = new PasteAction();
|
this.pasteAction = new PasteAction();
|
||||||
this.duplicateAction = new DuplicateAction();
|
this.duplicateAction = new DuplicateAction();
|
||||||
this.editAction = new EditAction();
|
this.editAction = new EditAction();
|
||||||
|
this.selectSameColorAction = new SelectSameColorAction();
|
||||||
|
this.deselectAllAction = new DeselectAllAction();
|
||||||
this.scaleAction = new ScaleAction();
|
this.scaleAction = new ScaleAction();
|
||||||
this.moveUpAction = new MoveUpAction();
|
this.moveUpAction = new MoveUpAction();
|
||||||
this.moveDownAction = new MoveDownAction();
|
this.moveDownAction = new MoveDownAction();
|
||||||
@ -131,6 +136,8 @@ public class RocketActions {
|
|||||||
pasteAction.clipboardChanged();
|
pasteAction.clipboardChanged();
|
||||||
duplicateAction.clipboardChanged();
|
duplicateAction.clipboardChanged();
|
||||||
editAction.clipboardChanged();
|
editAction.clipboardChanged();
|
||||||
|
selectSameColorAction.clipboardChanged();
|
||||||
|
deselectAllAction.clipboardChanged();
|
||||||
scaleAction.clipboardChanged();
|
scaleAction.clipboardChanged();
|
||||||
moveUpAction.clipboardChanged();
|
moveUpAction.clipboardChanged();
|
||||||
moveDownAction.clipboardChanged();
|
moveDownAction.clipboardChanged();
|
||||||
@ -171,6 +178,14 @@ public class RocketActions {
|
|||||||
return editAction;
|
return editAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Action getSelectSameColorAction() {
|
||||||
|
return selectSameColorAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action getDeselectAllAction() {
|
||||||
|
return deselectAllAction;
|
||||||
|
}
|
||||||
|
|
||||||
public Action getScaleAction() {
|
public Action getScaleAction() {
|
||||||
return scaleAction;
|
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.
|
* Action to scale the currently selected component.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user