added ability to save default model

This commit is contained in:
Bane Stojkovic
2026-11-03 21:35:17 +01:00
parent 12ac7fe809
commit e751c20e93
20 changed files with 505 additions and 68 deletions
@@ -351,7 +351,7 @@ public class ComponentPopupMenu extends TranslatedPopupMenu implements Clipboard
}
applyMenu.setEnabled(true);
List<Component> datasheetItems = ComponentButtonFactory.createDatasheetItems(plugInPort, componentType, new ArrayList<String>(), model -> {
List<Component> datasheetItems = ComponentButtonFactory.createDatasheetItems(plugInPort, componentType, new ArrayList<String>(), false, model -> {
LOG.info("Applying datasheet model " + String.join(", ", model));
plugInPort.applyModelToSelection(model);
});
@@ -42,9 +42,9 @@ import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.MenuSelectionManager;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
@@ -59,6 +59,7 @@ import org.diylc.common.IPlugInPort;
import org.diylc.common.IBlockProcessor.InvalidBlockException;
import org.diylc.core.IDIYComponent;
import org.diylc.core.Template;
import org.diylc.lang.LangUtil;
import org.diylc.utils.IconLoader;
/**
@@ -170,34 +171,14 @@ public class ComponentButtonFactory {
}
});
String defaultVariant = plugInPort.getDefaultVariant(componentType);
JLabel label =
new JLabel(variant.getName().equals(defaultVariant) ? IconLoader.PinGreen.getIcon()
: IconLoader.PinGrey.getIcon());
label.setToolTipText(variant.getName().equals(defaultVariant) ? "Remove default variant"
: "Set default variant");
label.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// Hide the menu
Container c = item.getParent();
if (c != null && c instanceof JPopupMenu) {
JPopupMenu m = (JPopupMenu) c;
m.setVisible(false);
}
plugInPort.setDefaultVariant(componentType, variant.getName());
e.consume();
}
});
Border margin = new EmptyBorder(4, 0, 0, 0);
label.setBorder(margin);
boolean isDefault = variant.getName().equals(plugInPort.getDefaultVariant(componentType));
item.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 0));
item.add(label);
item.add(createDefaultPin(isDefault,
isDefault ? "Remove default variant" : "Set default variant",
() -> plugInPort.setDefaultVariant(componentType, variant.getName())));
label = new JLabel(IconLoader.Garbage.getIcon());
label.setToolTipText("Delete variant");
JLabel label = new JLabel(IconLoader.Garbage.getIcon());
label.setToolTipText(LangUtil.translate("Delete variant"));
label.addMouseListener(new MouseAdapter() {
@Override
@@ -209,8 +190,10 @@ public class ComponentButtonFactory {
m.setVisible(false);
}
int result = JOptionPane.showConfirmDialog(SwingUtilities.getRoot(item),
"Are you sure you want to delete variant \"" + variant.getName() + "\"", "Delete",
JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
String.format(LangUtil.translate("Are you sure you want to delete variant \"%s\"?"),
variant.getName()),
LangUtil.translate("Delete"), JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE);
if (result != JOptionPane.YES_OPTION) {
return;
}
@@ -218,15 +201,18 @@ public class ComponentButtonFactory {
e.consume();
}
});
margin = new EmptyBorder(4, 2, 0, 0);
label.setBorder(margin);
item.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 0));
label.setBorder(new EmptyBorder(4, 2, 0, 0));
item.add(label);
return item;
}
/**
* @param showDefaultPin whether model items get the pin that makes a model the default of the
* type; only meaningful where the items place a new component
*/
public static List<Component> createDatasheetItems(final IPlugInPort plugInPort,
final ComponentType componentType, List<String> path, Consumer<String[]> modelConsumer) {
final ComponentType componentType, List<String> path, boolean showDefaultPin,
Consumer<String[]> modelConsumer) {
int depth = path.size();
List<String[]> datasheet = componentType.getDatasheet();
if (datasheet == null) {
@@ -253,7 +239,8 @@ public class ComponentButtonFactory {
submenu.removeAll();
List<String> newPath = new ArrayList<String>(path);
newPath.add(value);
List<Component> childItems = createDatasheetItems(plugInPort, componentType, newPath, modelConsumer);
List<Component> childItems = createDatasheetItems(plugInPort, componentType, newPath,
showDefaultPin, modelConsumer);
if (childItems.size() > MAX_MENU_ITEMS) {
List<List<Component>> partitions = Lists.partition(childItems, MAX_MENU_ITEMS);
for (List<Component> partition : partitions) {
@@ -293,15 +280,24 @@ public class ComponentButtonFactory {
return (Component) submenu;
}
JMenuItem item = new JMenuItem(value);
Optional<String[]> findFirst =
filteredDatasheet.stream().filter(line -> line[depth].equals(value)).findFirst();
final JMenuItem item = new JMenuItem(value) {
private static final long serialVersionUID = 1L;
// Customize item size to fit the pin
public java.awt.Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
return new Dimension(d.width + (showDefaultPin ? 16 : 0), d.height);
}
};
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Optional<String[]> findFirst =
filteredDatasheet.stream().filter(line -> line[depth].equals(value)).findFirst();
if (findFirst.isPresent()) {
modelConsumer.accept(findFirst.get());
} else {
@@ -310,6 +306,15 @@ public class ComponentButtonFactory {
}
});
if (showDefaultPin && findFirst.isPresent()) {
String[] model = findFirst.get();
boolean isDefault = plugInPort.isDefaultModel(componentType, model);
item.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 0));
item.add(createDefaultPin(isDefault,
isDefault ? "Remove default model" : "Set default model",
() -> plugInPort.setDefaultModel(componentType, model)));
}
return (Component) item;
}).collect(Collectors.toList());
}
@@ -347,4 +352,28 @@ public class ComponentButtonFactory {
});
return button;
}
private static JLabel createDefaultPin(boolean isDefault, String tooltip,
final Runnable toggle) {
JLabel label = new JLabel(
isDefault ? IconLoader.PinGreen.getIcon() : IconLoader.PinGrey.getIcon());
label.setToolTipText(LangUtil.translate(tooltip));
label.addMouseListener(new MouseAdapter() {
// a click is not reported when the pointer moves between press and release, which happens
// easily on a 16px icon, so react to the release instead, as menu items themselves do
@Override
public void mouseReleased(MouseEvent e) {
if (!label.contains(e.getPoint())) {
return;
}
// closes the whole cascade, not just the submenu that holds a datasheet model
MenuSelectionManager.defaultManager().clearSelectedPath();
toggle.run();
e.consume();
}
});
label.setBorder(new EmptyBorder(4, 0, 0, 0));
return label;
}
}
@@ -508,7 +508,7 @@ class ComponentTabbedPane extends JTabbedPane {
variantPopup.add(new JSeparator());
if (componentType.getDatasheet() != null && !componentType.getDatasheet().isEmpty()) {
List<Component> items = ComponentButtonFactory.createDatasheetItems(plugInPort, componentType, new ArrayList<String>(), model -> {
List<Component> items = ComponentButtonFactory.createDatasheetItems(plugInPort, componentType, new ArrayList<String>(), true, model -> {
LOG.info("Creating datasheet model " + String.join(", ", model));
plugInPort.setNewComponentTypeSlot(componentType, null, model, false);
});
@@ -610,7 +610,7 @@ public class TreePanel extends JPanel {
boolean showEmpty) {
if (componentType.getDatasheet() != null) {
List<Component> items = ComponentButtonFactory.createDatasheetItems(plugInPort,
componentType, new ArrayList<String>(), model -> {
componentType, new ArrayList<String>(), true, model -> {
LOG.info("Creating datasheet model " + String.join(", ", model));
plugInPort.setNewComponentTypeSlot(componentType, null, model, false);
});
@@ -722,3 +722,10 @@ All|Alle
Front and Back|Vorne und hinten
Click to choose from %s variants|Klicken, um aus %s Varianten zu wählen
Flange|Flansch
Set default variant|Als Standardvariante festlegen
Remove default variant|Standardvariante entfernen
Delete variant|Variante löschen
Are you sure you want to delete variant "%s"?|Möchten Sie die Variante "%s" wirklich löschen?
Delete|Löschen
Set default model|Als Standardmodell festlegen
Remove default model|Standardmodell entfernen
@@ -715,3 +715,10 @@ All
Front and Back
Click to choose from %s variants
Flange
Set default variant
Remove default variant
Delete variant
Are you sure you want to delete variant "%s"?
Delete
Set default model
Remove default model
@@ -718,3 +718,10 @@ All|Todos
Front and Back|Frente y parte trasera
Click to choose from %s variants|Haga clic para elegir entre %s variantes
Flange|Brida
Set default variant|Establecer como variante predeterminada
Remove default variant|Quitar variante predeterminada
Delete variant|Eliminar variante
Are you sure you want to delete variant "%s"?|¿Seguro que desea eliminar la variante "%s"?
Delete|Eliminar
Set default model|Establecer como modelo predeterminado
Remove default model|Quitar modelo predeterminado
@@ -717,3 +717,10 @@ All|Tous
Front and Back|Avant et arrière
Click to choose from %s variants|Cliquez pour choisir parmi %s variantes
Flange|Collerette
Set default variant|Définir comme variante par défaut
Remove default variant|Retirer la variante par défaut
Delete variant|Supprimer la variante
Are you sure you want to delete variant "%s"?|Voulez-vous vraiment supprimer la variante "%s" ?
Delete|Supprimer
Set default model|Définir comme modèle par défaut
Remove default model|Retirer le modèle par défaut
@@ -719,3 +719,10 @@ All|Tutti
Front and Back|Fronte e retro
Click to choose from %s variants|Fai clic per scegliere tra %s varianti
Flange|Flangia
Set default variant|Imposta come variante predefinita
Remove default variant|Rimuovi variante predefinita
Delete variant|Elimina variante
Are you sure you want to delete variant "%s"?|Eliminare davvero la variante "%s"?
Delete|Elimina
Set default model|Imposta come modello predefinito
Remove default model|Rimuovi modello predefinito
@@ -723,3 +723,10 @@ All|Alle
Front and Back|Voor- en achterkant
Click to choose from %s variants|Klik om te kiezen uit %s varianten
Flange|Flens
Set default variant|Instellen als standaardvariant
Remove default variant|Standaardvariant verwijderen
Delete variant|Variant verwijderen
Are you sure you want to delete variant "%s"?|Weet u zeker dat u variant "%s" wilt verwijderen?
Delete|Verwijderen
Set default model|Instellen als standaardmodel
Remove default model|Standaardmodel verwijderen
@@ -718,3 +718,10 @@ All|Todos
Front and Back|Frente e traseira
Click to choose from %s variants|Clique para escolher entre %s variantes
Flange|Flange
Set default variant|Definir como variante padrão
Remove default variant|Remover variante padrão
Delete variant|Excluir variante
Are you sure you want to delete variant "%s"?|Tem certeza de que deseja excluir a variante "%s"?
Delete|Excluir
Set default model|Definir como modelo padrão
Remove default model|Remover modelo padrão
@@ -714,3 +714,10 @@ All|Sve
Front and Back|Prednja i zadnja
Click to choose from %s variants|Kliknite da izaberete jednu od %s varijanti
Flange|Obod
Set default variant|Postavi kao podrazumevanu varijantu
Remove default variant|Ukloni podrazumevanu varijantu
Delete variant|Obriši varijantu
Are you sure you want to delete variant "%s"?|Da li ste sigurni da želite da obrišete varijantu "%s"?
Delete|Obriši
Set default model|Postavi kao podrazumevani model
Remove default model|Ukloni podrazumevani model
@@ -716,3 +716,10 @@ All|सभी
Front and Back|आगे और पीछे
Click to choose from %s variants|%s वेरिएंट में से चुनने के लिए क्लिक करें
Flange|फ़्लैंज
Set default variant|डिफ़ॉल्ट वेरिएंट सेट करें
Remove default variant|डिफ़ॉल्ट वेरिएंट हटाएँ
Delete variant|वेरिएंट हटाएँ
Are you sure you want to delete variant "%s"?|क्या आप वाकई वेरिएंट "%s" हटाना चाहते हैं?
Delete|हटाएँ
Set default model|डिफ़ॉल्ट मॉडल सेट करें
Remove default model|डिफ़ॉल्ट मॉडल हटाएँ
@@ -716,3 +716,10 @@ All|全部
Front and Back|前后
Click to choose from %s variants|点击从 %s 个变体中选择
Flange|法兰
Set default variant|设为默认变体
Remove default variant|取消默认变体
Delete variant|删除变体
Are you sure you want to delete variant "%s"?|确定要删除变体“%s”吗?
Delete|删除
Set default model|设为默认型号
Remove default model|取消默认型号