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);
+ }
+}