All Downloads are FREE. Search and download functionalities are using the official Maven repository.

us.ihmc.scs2.sessionVisualizer.jfx.controllers.menu.DataBufferMenuController Maven / Gradle / Ivy

package us.ihmc.scs2.sessionVisualizer.jfx.controllers.menu;

import org.apache.commons.lang3.mutable.MutableBoolean;

import javafx.beans.property.Property;
import javafx.fxml.FXML;
import javafx.scene.control.CheckMenuItem;
import javafx.scene.control.CustomMenuItem;
import javafx.scene.control.Menu;
import javafx.scene.control.Spinner;
import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.util.converter.IntegerStringConverter;
import us.ihmc.messager.javafx.JavaFXMessager;
import us.ihmc.scs2.session.SessionState;
import us.ihmc.scs2.sessionVisualizer.jfx.SessionVisualizerTopics;
import us.ihmc.scs2.sessionVisualizer.jfx.controllers.VisualizerController;
import us.ihmc.scs2.sessionVisualizer.jfx.managers.SessionVisualizerWindowToolkit;
import us.ihmc.scs2.sessionVisualizer.jfx.tools.MenuTools;
import us.ihmc.scs2.sessionVisualizer.jfx.tools.PositiveIntegerValueFilter;
import us.ihmc.scs2.sharedMemory.CropBufferRequest;
import us.ihmc.scs2.sharedMemory.FillBufferRequest;
import us.ihmc.scs2.sharedMemory.interfaces.YoBufferPropertiesReadOnly;
import us.ihmc.scs2.sharedMemory.tools.SharedMemoryTools;

public class DataBufferMenuController implements VisualizerController
{
   @FXML
   private Menu menu;
   @FXML
   private CustomMenuItem bufferSizeMenuItem, bufferRecordTickPeriodMenuItem, numberPrecisionMenuItem;
   @FXML
   private TextField bufferSizeTextField;
   @FXML
   private TextField bufferRecordTickPeriodTextField;
   @FXML
   private Spinner numberPrecisionSpinner;
   @FXML
   private CheckMenuItem enableFuzzyYoSearchMenuItem;
   @FXML
   private CheckMenuItem showSCS2YoVariablesMenuItem;

   private JavaFXMessager messager;
   private SessionVisualizerTopics topics;

   private boolean initializeBufferSizeTextField = true;
   private Property bufferProperties;

   @Override
   public void initialize(SessionVisualizerWindowToolkit toolkit)
   {
      messager = toolkit.getMessager();
      topics = toolkit.getTopics();
      bufferProperties = messager.createPropertyInput(topics.getYoBufferCurrentProperties(), null);
      messager.addTopicListener(topics.getSessionCurrentState(), m ->
      {
         if (m == SessionState.INACTIVE)
            initializeBufferSizeTextField = true;
      });
      messager.addFXTopicListener(topics.getDisableUserControls(), disable -> menu.setDisable(disable));

      TextFormatter bufferSizeFormatter = new TextFormatter<>(new IntegerStringConverter(), 0, new PositiveIntegerValueFilter());
      bufferSizeTextField.setTextFormatter(bufferSizeFormatter);

      MenuTools.configureTextFieldForCustomMenuItem(bufferSizeMenuItem, bufferSizeTextField);
      MenuTools.configureTextFieldForCustomMenuItem(bufferRecordTickPeriodMenuItem, bufferRecordTickPeriodTextField);

      MutableBoolean updatingBufferResize = new MutableBoolean(false);

      bufferProperties.addListener((o, oldValue, newValue) ->
      {
         if (!initializeBufferSizeTextField && (oldValue == null || newValue.getSize() == oldValue.getSize()))
            return;

         if (updatingBufferResize.isFalse())
         {
            updatingBufferResize.setTrue();
            bufferSizeFormatter.setValue(newValue.getSize());
            initializeBufferSizeTextField = false;
            updatingBufferResize.setFalse();
         }
      });

      bufferSizeFormatter.valueProperty().addListener((o, oldValue, newValue) ->
      {
         if (bufferProperties.getValue() != null && bufferProperties.getValue().getSize() == newValue.intValue())
            return;

         if (updatingBufferResize.isFalse())
         {
            updatingBufferResize.setTrue();
            messager.submitMessage(topics.getYoBufferCurrentSizeRequest(), newValue);
            updatingBufferResize.setFalse();
         }
      });

      TextFormatter recordPeriodFormatter = new TextFormatter<>(new IntegerStringConverter(), 0, new PositiveIntegerValueFilter());
      bufferRecordTickPeriodTextField.setTextFormatter(recordPeriodFormatter);

      messager.bindBidirectional(topics.getBufferRecordTickPeriod(), recordPeriodFormatter.valueProperty(), false);

      IntegerSpinnerValueFactory numberPrecisionSpinnerValueFactory = new IntegerSpinnerValueFactory(1, 30, 3, 1);
      numberPrecisionSpinner.setValueFactory(numberPrecisionSpinnerValueFactory);
      if (numberPrecisionSpinner.isEditable())
      {
         numberPrecisionSpinner.focusedProperty().addListener((o, oldValue, newValue) ->
         {
            if (!newValue)
            { // Losing focus
              // Workaround: manually reset to the current value
               numberPrecisionSpinner.getEditor()
                                     .setText(numberPrecisionSpinnerValueFactory.getConverter().toString(numberPrecisionSpinnerValueFactory.getValue()));
            }
         });
      }
      messager.bindBidirectional(topics.getControlsNumberPrecision(), numberPrecisionSpinnerValueFactory.valueProperty(), false);
      messager.bindBidirectional(topics.getShowSCS2YoVariables(), showSCS2YoVariablesMenuItem.selectedProperty(), false);
      enableFuzzyYoSearchMenuItem.selectedProperty().bindBidirectional(toolkit.getYoManager().enableFuzzyYoSearchProperty());
   }

   @FXML
   private void requestCropDataBuffer()
   {
      if (bufferProperties.getValue() != null)
      {
         CropBufferRequest cropBufferRequest = new CropBufferRequest(bufferProperties.getValue().getInPoint(), bufferProperties.getValue().getOutPoint());
         messager.submitMessage(topics.getYoBufferCropRequest(), cropBufferRequest);
      }
   }

   @FXML
   private void requestFlushDataBuffer()
   {
      YoBufferPropertiesReadOnly properties = bufferProperties.getValue();
      if (properties != null)
      {
         FillBufferRequest fillBufferRequest = new FillBufferRequest(false,
                                                                     SharedMemoryTools.increment(properties.getOutPoint(), 1, properties.getSize()),
                                                                     SharedMemoryTools.decrement(properties.getInPoint(), 1, properties.getSize()));
         messager.submitMessage(topics.getYoBufferFillRequest(), fillBufferRequest);
      }
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy