diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index 4cc1a631..6347997d 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -2845,7 +2845,11 @@ 2020-04-03 00:00:00.000 CET - + + + NEW_FEATURE + Exposed the most commonly used configuration items in the top-right toolbar for faster access + NEW_FEATURE Added "Ruler Inch Subdivision" config option that allows inch rulers to be subdivided either using base of 2 (1/4", 1/8, 1/16) or base of 10 (1/10) diff --git a/diylc/diylc-swing/src/org/diylc/images/IconLoader.java b/diylc/diylc-swing/src/org/diylc/images/IconLoader.java index fdb10d80..4f700320 100644 --- a/diylc/diylc-swing/src/org/diylc/images/IconLoader.java +++ b/diylc/diylc-swing/src/org/diylc/images/IconLoader.java @@ -64,7 +64,8 @@ public enum IconLoader { "documents_gear.png"), SplashResistor("splash_resistor.png"), SplashCeramic("splash_ceramic.png"), SplashElectrolytic( "splash_electrolytic.png"), SplashFilm("splash_film.png"), Splash("splash.png"), Help("help2.png"), ScrollInformation("scroll_information.png"), Node("node.png"), Web("web.png"), Guitar("guitar.png"), Scientist("scientist.png"), StarGrey("star_grey.png"), StarBlue("star_blue.png"), - JarBeanInto("jar_bean_into.png"), GraphEdgeDirected("graph_edge_directed.png"), LaserPointer("laserpointer.png"), TapeMeasure("tape_measure1.png"); + JarBeanInto("jar_bean_into.png"), GraphEdgeDirected("graph_edge_directed.png"), LaserPointer("laserpointer.png"), TapeMeasure("tape_measure1.png"), + Elements("elements1.png"), GraphNodes("graph_nodes.png"); protected String name; diff --git a/diylc/diylc-swing/src/org/diylc/images/elements1.png b/diylc/diylc-swing/src/org/diylc/images/elements1.png new file mode 100644 index 00000000..5b7f0cd5 Binary files /dev/null and b/diylc/diylc-swing/src/org/diylc/images/elements1.png differ diff --git a/diylc/diylc-swing/src/org/diylc/images/graph_nodes.png b/diylc/diylc-swing/src/org/diylc/images/graph_nodes.png new file mode 100644 index 00000000..200d75ab Binary files /dev/null and b/diylc/diylc-swing/src/org/diylc/images/graph_nodes.png differ diff --git a/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java index 04da622e..2f6bee25 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java +++ b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java @@ -46,6 +46,7 @@ import javax.swing.KeyStroke; import org.apache.log4j.Logger; import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.appframework.miscutils.IConfigListener; import org.diylc.common.BuildingBlockPackage; import org.diylc.common.ComponentType; import org.diylc.common.IComponentTransformer; @@ -1562,6 +1563,13 @@ public class ActionFactory { putValue(AbstractAction.NAME, title); putValue(IView.CHECK_BOX_MENU_ITEM, true); putValue(AbstractAction.SELECTED_KEY, ConfigurationManager.getInstance().readBoolean(configKey, defaultValue)); + ConfigurationManager.getInstance().addConfigListener(configKey, new IConfigListener() { + + @Override + public void valueChanged(String key, Object value) { + putValue(AbstractAction.SELECTED_KEY, (Boolean)value); + } + }); } public ConfigAction(IPlugInPort plugInPort, String title, String configKey, boolean defaultValue) { diff --git a/diylc/diylc-swing/src/org/diylc/swing/gui/actionbar/ActionBarPlugin.java b/diylc/diylc-swing/src/org/diylc/swing/gui/actionbar/ActionBarPlugin.java index 4cf795df..f34b8124 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/gui/actionbar/ActionBarPlugin.java +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/actionbar/ActionBarPlugin.java @@ -17,16 +17,20 @@ */ package org.diylc.swing.gui.actionbar; -import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; import java.util.EnumSet; import javax.swing.BorderFactory; +import javax.swing.JLabel; import javax.swing.JPanel; import org.diylc.common.EventType; import org.diylc.common.IComponentTransformer; import org.diylc.common.IPlugIn; import org.diylc.common.IPlugInPort; +import org.diylc.images.IconLoader; import org.diylc.swing.ActionFactory; import org.diylc.swing.ISwingUI; @@ -41,7 +45,8 @@ public class ActionBarPlugin implements IPlugIn { private ISwingUI swingUI; private JPanel actionPanel; - private MiniToolbar miniToolbar; + private ActionToolbar contextActionToolbar; + private ConfigToolbar configToolbar; public ActionBarPlugin(ISwingUI swingUI) { this.swingUI = swingUI; @@ -51,31 +56,67 @@ public class ActionBarPlugin implements IPlugIn { if (actionPanel == null) { actionPanel = new JPanel(); actionPanel.setOpaque(false); - actionPanel.setLayout(new BorderLayout()); - actionPanel.add(getMiniToolbar(), BorderLayout.EAST); + actionPanel.setLayout(new GridBagLayout()); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.gridy = 0; + gbc.weightx = 1; + + actionPanel.add(new JPanel(), gbc); + + gbc.gridx = 1; + gbc.weightx = 0; + actionPanel.add(getConfigToolbar(), gbc); + + gbc.gridx = 2; + // add some space to separate the two toolbars + actionPanel.add(new JLabel() { + + private static final long serialVersionUID = 1L; + + @Override + public Dimension getPreferredSize() { + return new Dimension(16, 16); + } + }, gbc); + + gbc.gridx = 3; + actionPanel.add(getContextActionToolbar(), gbc); + actionPanel.setBorder(BorderFactory.createEmptyBorder()); } return actionPanel; } - public MiniToolbar getMiniToolbar() { - if (miniToolbar == null) { - miniToolbar = new MiniToolbar(); - miniToolbar.add(ActionFactory.getInstance().createRotateSelectionAction(plugInPort, 1)); - miniToolbar.add(ActionFactory.getInstance().createRotateSelectionAction(plugInPort, -1)); - miniToolbar.addSpacer(); - miniToolbar.add(ActionFactory.getInstance().createMirrorSelectionAction(plugInPort, IComponentTransformer.HORIZONTAL)); - miniToolbar.add(ActionFactory.getInstance().createMirrorSelectionAction(plugInPort, IComponentTransformer.VERTICAL)); - miniToolbar.addSpacer(); - miniToolbar.add(ActionFactory.getInstance().createNudgeAction(plugInPort)); - miniToolbar.addSpacer(); - miniToolbar.add(ActionFactory.getInstance().createSendToBackAction(plugInPort)); - miniToolbar.add(ActionFactory.getInstance().createBringToFrontAction(plugInPort)); - miniToolbar.addSpacer(); - miniToolbar.add(ActionFactory.getInstance().createGroupAction(plugInPort)); - miniToolbar.add(ActionFactory.getInstance().createUngroupAction(plugInPort)); + public ConfigToolbar getConfigToolbar() { + if (configToolbar == null) { + configToolbar = new ConfigToolbar(); + configToolbar.add("Continuous Creation", IPlugInPort.CONTINUOUS_CREATION_KEY, IconLoader.Elements.getIcon(), false); + configToolbar.add("Highlight Connected Areas", IPlugInPort.HIGHLIGHT_CONTINUITY_AREA, IconLoader.LaserPointer.getIcon(), false); + configToolbar.add("Sticky Points", IPlugInPort.STICKY_POINTS_KEY, IconLoader.GraphNodes.getIcon(), true); } - return miniToolbar; + return configToolbar; + } + + public ActionToolbar getContextActionToolbar() { + if (contextActionToolbar == null) { + contextActionToolbar = new ActionToolbar(); + contextActionToolbar.add(ActionFactory.getInstance().createRotateSelectionAction(plugInPort, 1)); + contextActionToolbar.add(ActionFactory.getInstance().createRotateSelectionAction(plugInPort, -1)); + contextActionToolbar.addSpacer(); + contextActionToolbar.add(ActionFactory.getInstance().createMirrorSelectionAction(plugInPort, IComponentTransformer.HORIZONTAL)); + contextActionToolbar.add(ActionFactory.getInstance().createMirrorSelectionAction(plugInPort, IComponentTransformer.VERTICAL)); + contextActionToolbar.addSpacer(); + contextActionToolbar.add(ActionFactory.getInstance().createNudgeAction(plugInPort)); + contextActionToolbar.addSpacer(); + contextActionToolbar.add(ActionFactory.getInstance().createSendToBackAction(plugInPort)); + contextActionToolbar.add(ActionFactory.getInstance().createBringToFrontAction(plugInPort)); + contextActionToolbar.addSpacer(); + contextActionToolbar.add(ActionFactory.getInstance().createGroupAction(plugInPort)); + contextActionToolbar.add(ActionFactory.getInstance().createUngroupAction(plugInPort)); + } + return contextActionToolbar; } @Override @@ -94,6 +135,6 @@ public class ActionBarPlugin implements IPlugIn { if (eventType != EventType.SELECTION_CHANGED) return; boolean enabled = !plugInPort.getSelectedComponents().isEmpty(); - getMiniToolbar().setEnabled(enabled); + getContextActionToolbar().setEnabled(enabled); } } diff --git a/diylc/diylc-swing/src/org/diylc/swing/gui/actionbar/MiniToolbar.java b/diylc/diylc-swing/src/org/diylc/swing/gui/actionbar/ActionToolbar.java similarity index 93% rename from diylc/diylc-swing/src/org/diylc/swing/gui/actionbar/MiniToolbar.java rename to diylc/diylc-swing/src/org/diylc/swing/gui/actionbar/ActionToolbar.java index 40aaeeb2..ab0dd8d5 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/gui/actionbar/MiniToolbar.java +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/actionbar/ActionToolbar.java @@ -34,11 +34,11 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSeparator; -public class MiniToolbar extends JPanel { +public class ActionToolbar extends JPanel { private static final long serialVersionUID = 1L; - public MiniToolbar() { + public ActionToolbar() { setOpaque(false); setBorder(BorderFactory.createEmptyBorder()); } diff --git a/diylc/diylc-swing/src/org/diylc/swing/gui/actionbar/ConfigToolbar.java b/diylc/diylc-swing/src/org/diylc/swing/gui/actionbar/ConfigToolbar.java new file mode 100644 index 00000000..454d2477 --- /dev/null +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/actionbar/ConfigToolbar.java @@ -0,0 +1,88 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DIYLC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DIYLC. If not, see . + +*/ +package org.diylc.swing.gui.actionbar; + +import java.awt.Component; +import java.awt.Cursor; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import javax.swing.BorderFactory; +import javax.swing.Icon; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JSeparator; + +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.appframework.miscutils.IConfigListener; + +public class ConfigToolbar extends JPanel { + + private static final long serialVersionUID = 1L; + + private final String CHECK = "\u2611"; + private final String UNCHECK = "\u2610"; + + public ConfigToolbar() { + setOpaque(false); + setBorder(BorderFactory.createEmptyBorder()); + } + + public void add(String title, String configKey, Icon icon, boolean defaultValue) { + final JLabel label = new JLabel(); + boolean checked = ConfigurationManager.getInstance().readBoolean(configKey, defaultValue); + label.setText(checked ? CHECK : UNCHECK); + label.setIcon(icon); + label.setToolTipText(title); + label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + label.addMouseListener(new MouseAdapter() { + + @Override + public void mouseClicked(MouseEvent e) { + boolean checked = ConfigurationManager.getInstance().readBoolean(configKey, defaultValue); + checked = !checked; + ConfigurationManager.getInstance().writeValue(configKey, checked); + } + }); + add(label); + + ConfigurationManager.getInstance().addConfigListener(configKey, new IConfigListener() { + + @Override + public void valueChanged(String key, Object value) { + boolean checked = (boolean) value; + label.setText(checked ? CHECK : UNCHECK); + } + }); + } + + @Override + public void setEnabled(boolean enabled) { + for (Component c : getComponents()) + c.setEnabled(enabled); + } + + public void addSpacer() { + JSeparator l = new JSeparator(); + add(l); + } +}