2020import edu .wpi .first .networktables .NetworkTableType ;
2121import edu .wpi .first .networktables .NetworkTableValue ;
2222import edu .wpi .first .networktables .StringArraySubscriber ;
23+ import edu .wpi .first .networktables .StringSubscriber ;
24+ import edu .wpi .first .networktables .PubSubOption ;
2325import edu .wpi .first .networktables .Topic ;
2426
2527import java .util .EnumSet ;
@@ -55,6 +57,8 @@ final class TabGenerator {
5557 private final NetworkTableInstance inst ;
5658 private StringArraySubscriber tabsSubscriber ;
5759 private int tabsListener ;
60+ private StringSubscriber tabSelectionSubscriber ;
61+ private int tabSelectionListener ;
5862 private int metadataListener ;
5963 private int dataListener ;
6064 private final Components componentRegistry ;
@@ -79,6 +83,21 @@ public void start() {
7983 tabs .dirty ();
8084 });
8185
86+ tabSelectionSubscriber = rootMetaTable .getStringTopic (SELECTED_ENTRY_NAME )
87+ .subscribe ("" , PubSubOption .keepDuplicates (true ));
88+ tabSelectionListener = inst .addListener (
89+ tabSelectionSubscriber ,
90+ EnumSet .of (NetworkTableEvent .Kind .kValueAll , NetworkTableEvent .Kind .kImmediate ),
91+ event -> {
92+ // If the value can be parsed as an int, assume it's the tab index, otherwise assume tab title.
93+ String str = event .valueData .value .getString ();
94+ try {
95+ tabs .setSelectedTab (Integer .parseInt (str ));
96+ } catch (NumberFormatException e ) {
97+ tabs .setSelectedTab (str );
98+ }
99+ });
100+
82101 metadataListener = inst .addListener (
83102 new String [] {METADATA_TABLE_NAME + "/" },
84103 EnumSet .of (NetworkTableEvent .Kind .kValueAll , NetworkTableEvent .Kind .kImmediate ),
@@ -95,6 +114,8 @@ public void start() {
95114 public void stop () {
96115 tabsSubscriber .close ();
97116 inst .removeListener (tabsListener );
117+ tabSelectionSubscriber .close ();
118+ inst .removeListener (tabSelectionListener );
98119 inst .removeListener (metadataListener );
99120 inst .removeListener (dataListener );
100121 }
@@ -109,18 +130,6 @@ public TabStructure getStructure() {
109130 private void metadataChanged (NetworkTableEvent event ) {
110131 String name = event .valueData .getTopic ().getName ();
111132
112- // Special case for global metadata, not tab or widget data
113- if (name .equals ("/Shuffleboard/.metadata/Selected" )) {
114- // If the value can be parsed as an int, assume it's the tab index, otherwise assume tab title.
115- String str = event .valueData .value .getString ();
116- try {
117- tabs .setSelectedTab (Integer .parseInt (str ));
118- } catch (NumberFormatException e ) {
119- tabs .setSelectedTab (str );
120- }
121- return ;
122- }
123-
124133 List <String > metaHierarchy = NetworkTable .getHierarchy (name );
125134 if (metaHierarchy .size () < 5 ) {
126135 // Not metadata for a component or a tab, bail
@@ -206,16 +215,12 @@ private void dataChanged(NetworkTableEvent event) {
206215 .takeWhile (s -> !s .contains ("/." ))
207216 .collect (Collectors .toList ());
208217 if (tables .size () >= 3 ) {
209- updateFrom (tables );
218+ updateStructure (tables );
219+ tabs .dirty ();
210220 }
211221 return ;
212222 }
213- updateFrom (hierarchy );
214- }
215-
216- private void updateFrom (List <String > tables ) {
217- updateStructure (tables );
218- tabs .dirty ();
223+ updateStructure (hierarchy );
219224 }
220225
221226 private void updateStructure (List <String > hierarchy ) {
0 commit comments