diff --git a/app/src/main/java/edu/wpi/first/shuffleboard/app/WidgetPaneDragHandler.java b/app/src/main/java/edu/wpi/first/shuffleboard/app/WidgetPaneDragHandler.java index 9bf0c599a..b43ea2ec9 100644 --- a/app/src/main/java/edu/wpi/first/shuffleboard/app/WidgetPaneDragHandler.java +++ b/app/src/main/java/edu/wpi/first/shuffleboard/app/WidgetPaneDragHandler.java @@ -140,7 +140,8 @@ private boolean previewSource(GridPoint point, Dragboard dragboard) { } SourceEntry entry = DeserializationHelper.sourceFromDrag(dragboard.getContent(DataFormats.source)); DataSource source = entry.get(); - Optional componentName = Components.getDefault().pickComponentNameFor(source.getDataType()); + Optional componentName = source.preferredWidget() + .or(() -> Components.getDefault().pickComponentNameFor(source.getDataType())); Optional> dummySource = DummySource.forTypes(source.getDataType()); if (componentName.isPresent() && dummySource.isPresent()) { if (tilePreviewSize == null) { diff --git a/plugins/networktables/src/main/java/edu/wpi/first/shuffleboard/plugin/networktables/TabGenerator.java b/plugins/networktables/src/main/java/edu/wpi/first/shuffleboard/plugin/networktables/TabGenerator.java index 56f1e90d8..6c0eaf84e 100644 --- a/plugins/networktables/src/main/java/edu/wpi/first/shuffleboard/plugin/networktables/TabGenerator.java +++ b/plugins/networktables/src/main/java/edu/wpi/first/shuffleboard/plugin/networktables/TabGenerator.java @@ -1,7 +1,7 @@ package edu.wpi.first.shuffleboard.plugin.networktables; -import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.google.gson.JsonPrimitive; import edu.wpi.first.shuffleboard.api.sources.DataSource; import edu.wpi.first.shuffleboard.api.sources.SourceTypes; import edu.wpi.first.shuffleboard.api.tab.model.ComponentModel; @@ -40,8 +40,8 @@ @SuppressWarnings("PMD.GodClass") final class TabGenerator { - public static final String ROOT_TABLE_NAME = "/Shuffleboard"; - public static final String METADATA_TABLE_NAME = ROOT_TABLE_NAME + "/.metadata"; + public static final String ROOT_TABLE_NAME = ""; + public static final String METADATA_TABLE_NAME = ROOT_TABLE_NAME + "/Shuffleboard/.metadata"; public static final String PREF_COMPONENT_ENTRY_NAME = "PreferredComponent"; public static final String PROPERTIES_TABLE_NAME = "Properties"; public static final String TABS_ENTRY_KEY = "Tabs"; @@ -198,16 +198,16 @@ private void dataChanged(NetworkTableEvent event) { return; } List hierarchy = NetworkTable.getHierarchy(name); - if (hierarchy.size() < 3) { - // Not enough data - return; - } +// if (hierarchy.size() < 3) { +// // Not enough data +// return; +// } if (name.contains("/.")) { // The entry is metadata, but may be the only entry in a table, so make sure it's updated correctly var tables = hierarchy.stream() .takeWhile(s -> !s.contains("/.")) .collect(Collectors.toList()); - if (tables.size() >= 3) { + if (tables.size() >= 2) { updateFrom(tables); } return; @@ -222,7 +222,13 @@ private void updateFrom(List tables) { private void updateStructure(List hierarchy) { // 0='/', 1='/Shuffleboard', 2='/Shuffleboard/' - TabModel tab = tabs.getTab(NetworkTable.basenameKey(hierarchy.get(2))); + String tabName; + if (hierarchy.get(1).equals("/Shuffleboard")) { + tabName = NetworkTable.basenameKey(hierarchy.get(2)); + } else { + tabName = NetworkTable.basenameKey(hierarchy.get(1)); + } + TabModel tab = tabs.getTab(tabName); ParentModel parent = tab; int index = 0; boolean end = false; @@ -233,6 +239,9 @@ private void updateStructure(List hierarchy) { continue; } NetworkTable table = inst.getTable(path); +// if (table.getEntry(".widget").getType() == NetworkTableType.kString) { +// updateWidget(parent, path); +// } else if (table.getKeys().contains(".type")) { String type = table.getEntry(".type").getString(null); switch (type) { @@ -334,14 +343,27 @@ private Map properties(String realPath) { props.put(k, propsTable.getEntry(k).getValue().getValue()); } } - String metadata = inst.getTopic(realPath).getProperties(); - JsonParser parser = new JsonParser(); - var obj = parser.parse(metadata).getAsJsonObject(); - obj.entrySet().forEach(entry -> { - System.out.println("TabGenerator.properties : " + entry); - props.put(entry.getKey(), entry.getValue().getAsString()); - }); - + if (!inst.getTopic(realPath).exists()) { + var propsTable = inst.getTable(realPath); + for (String k : propsTable.getKeys()) { + props.put(k, propsTable.getEntry(k).getValue().getValue()); + } + } else { + String metadata = inst.getTopic(realPath).getProperties(); + JsonParser parser = new JsonParser(); + var obj = parser.parse(metadata).getAsJsonObject(); + obj.entrySet().forEach(entry -> { + System.out.println("TabGenerator.properties : " + entry); + JsonPrimitive primitive = entry.getValue().getAsJsonPrimitive(); + if (primitive.isBoolean()) { + props.put(entry.getKey(), primitive.getAsBoolean()); + } else if (primitive.isNumber()) { + props.put(entry.getKey(), primitive.getAsNumber()); + } else { + props.put(entry.getKey(), primitive.getAsString()); + } + }); + } return props; } diff --git a/plugins/networktables/src/main/java/edu/wpi/first/shuffleboard/plugin/networktables/sources/SingleKeyNetworkTableSource.java b/plugins/networktables/src/main/java/edu/wpi/first/shuffleboard/plugin/networktables/sources/SingleKeyNetworkTableSource.java index 070d07850..d1de80c02 100644 --- a/plugins/networktables/src/main/java/edu/wpi/first/shuffleboard/plugin/networktables/sources/SingleKeyNetworkTableSource.java +++ b/plugins/networktables/src/main/java/edu/wpi/first/shuffleboard/plugin/networktables/sources/SingleKeyNetworkTableSource.java @@ -1,5 +1,6 @@ package edu.wpi.first.shuffleboard.plugin.networktables.sources; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import edu.wpi.first.networktables.NetworkTableEvent.Kind; @@ -106,7 +107,12 @@ private static Optional loadWidgetFromTopicProps(Topic topic) { System.err.println(metadata); JsonObject obj = parser.parse(metadata).getAsJsonObject(); obj.entrySet().forEach(System.err::println); - String widget = obj.get("widget").getAsString(); + JsonElement widgetProp = obj.get("widget"); + if (widgetProp == null || !widgetProp.isJsonPrimitive()) { + System.err.println("Metadata widget field for topic `" + topic.getName() + "` doesn't exist or is "); + return Optional.empty(); + } + String widget = widgetProp.getAsString(); System.out.println("widget = " + widget); return Optional.of(widget); } catch (Exception e) {