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

us.ihmc.scs2.sessionVisualizer.jfx.SCSGuiConfiguration Maven / Gradle / Ivy

package us.ihmc.scs2.sessionVisualizer.jfx;

import javafx.collections.ObservableList;
import javafx.geometry.Rectangle2D;
import javafx.stage.Screen;
import javafx.stage.Stage;
import us.ihmc.commons.nio.FileTools;
import us.ihmc.scs2.definition.configuration.SCSGuiConfigurationDefinition;
import us.ihmc.scs2.definition.configuration.WindowConfigurationDefinition;
import us.ihmc.scs2.sessionVisualizer.jfx.managers.SecondaryWindowManager;
import us.ihmc.scs2.sessionVisualizer.jfx.tools.JavaFXMissingTools;
import us.ihmc.scs2.sessionVisualizer.jfx.xml.XMLTools;

import jakarta.xml.bind.JAXBException;
import java.io.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import static us.ihmc.scs2.sessionVisualizer.jfx.SessionVisualizerIOTools.*;

public class SCSGuiConfiguration
{
   public static final String DEFAULT_ROBOT_CONFIGURATION_NAME = "DefaultRobotConfiguration";
   private final Path configurationFolderPath;

   private final String mainConfigurationFilename;
   private String yoGraphicsFilename;
   private String yoCompositeFilename;
   private String yoEntryConfigurationFilename;
   private String yoSliderboardConfigurationFilename;
   private String yoEquationFilename;
   private String mainYoChartGroupFilename;
   private final List secondaryYoChartGroupFilenames = new ArrayList<>();

   private final Path mainConfigurationPath;
   private Path yoGraphicsPath;
   private Path yoCompositePath;
   private Path yoEntryConfigurationPath;
   private Path yoSliderboardConfigurationPath;
   private Path yoEquationPath;
   private Path mainYoChartGroupPath;
   private final List secondaryYoChartGroupPaths = new ArrayList<>();

   private SCSGuiConfigurationDefinition definition;

   public static SCSGuiConfiguration defaultLoader(String robotName)
   {
      return defaultLoader(robotName, DEFAULT_ROBOT_CONFIGURATION_NAME);
   }

   public static SCSGuiConfiguration defaultLoader(String robotName, String simulationName)
   {
      try
      {
         return new SCSGuiConfiguration(robotName, simulationName, true);
      }
      catch (Exception e)
      {
         e.printStackTrace();
         return null;
      }
   }

   public static SCSGuiConfiguration defaultSaver(String robotName)
   {
      return defaultSaver(robotName, DEFAULT_ROBOT_CONFIGURATION_NAME);
   }

   public static SCSGuiConfiguration defaultSaver(String robotName, String simulationName)
   {
      try
      {
         return new SCSGuiConfiguration(robotName, simulationName, false);
      }
      catch (Exception e)
      {
         e.printStackTrace();
         return null;
      }
   }

   public static SCSGuiConfiguration saverToDirectory(String robotName, String simulationName, File configurationDirectory)
   {
      try
      {
         return new SCSGuiConfiguration(configurationDirectory.toPath(), robotName + "-" + simulationName, false);
      }
      catch (Exception e)
      {
         e.printStackTrace();
         return null;
      }
   }

   public static SCSGuiConfiguration loaderFromDirectory(String robotName, String simulationName, File configurationDirectory)
   {
      try
      {
         return new SCSGuiConfiguration(configurationDirectory.toPath(), robotName + "-" + simulationName, true);
      }
      catch (Exception e)
      {
         e.printStackTrace();
         return null;
      }
   }

   private SCSGuiConfiguration(String robotName, String simulationName, boolean isLoading) throws IOException, JAXBException
   {
      this(Paths.get(SCS2_CONFIGURATION_DEFAULT_PATH.toString(), robotName, simulationName), robotName + "-" + simulationName, isLoading);
   }

   private SCSGuiConfiguration(Path configurationFolderPath, String configurationName, boolean isLoading) throws IOException, JAXBException
   {
      this.configurationFolderPath = configurationFolderPath;

      if (isLoading)
      { // TODO This is backward compatibility, the name extension changed
         if (!toPath(toFilename("Main", scsMainConfigurationFileExtension)).toFile().exists())
            mainConfigurationFilename = toFilename("Main", scsConfigurationFileExtension);
         else
            mainConfigurationFilename = toFilename("Main", scsMainConfigurationFileExtension);
      }
      else
      {
         mainConfigurationFilename = toFilename("Main", scsMainConfigurationFileExtension);
      }

      mainConfigurationPath = toPath(mainConfigurationFilename);

      if (isLoading)
      {
         if (mainConfigurationPath.toFile().exists())
         {
            try
            {
               definition = XMLTools.loadSCSGuiConfigurationDefinition(new FileInputStream(mainConfigurationPath.toFile()));

               yoGraphicsFilename = definition.getYoGraphicsFilename();
               yoCompositeFilename = definition.getYoCompositePatternListFilename();
               yoEntryConfigurationFilename = definition.getYoEntryConfigurationFilename();
               yoSliderboardConfigurationFilename = definition.getYoSliderboardConfigurationFilename();
               yoEquationFilename = definition.getYoEquationFilename();
               mainYoChartGroupFilename = definition.getMainYoChartGroupConfigurationFilename();
               if (definition.getSecondaryYoChartGroupConfigurationsFilenames() != null)
                  secondaryYoChartGroupFilenames.addAll(definition.getSecondaryYoChartGroupConfigurationsFilenames());

               yoGraphicsPath = toPath(yoGraphicsFilename);
               yoCompositePath = toPath(yoCompositeFilename);
               yoEntryConfigurationPath = toPath(yoEntryConfigurationFilename);
               yoSliderboardConfigurationPath = toPath(yoSliderboardConfigurationFilename);
               yoEquationPath = toPath(yoEquationFilename);
               mainYoChartGroupPath = toPath(mainYoChartGroupFilename);

               for (String filename : secondaryYoChartGroupFilenames)
               {
                  secondaryYoChartGroupPaths.add(toPath(filename));
               }

               for (int i = secondaryYoChartGroupFilenames.size() - 1; i >= 0; i--)
               {
                  if (!secondaryYoChartGroupPaths.get(i).toFile().exists())
                  {
                     secondaryYoChartGroupFilenames.remove(i);
                     secondaryYoChartGroupPaths.remove(i);
                  }
               }
            }
            catch (FileNotFoundException | JAXBException e)
            {
               e.printStackTrace();
            }
         }
      }
      else
      {
         FileTools.ensureFileExists(mainConfigurationPath);

         yoGraphicsFilename = toFilename("YoGraphics", yoGraphicConfigurationFileExtension);
         yoCompositeFilename = toFilename("YoComposite", yoCompositeConfigurationFileExtension);
         yoEntryConfigurationFilename = toFilename("YoEntry", yoEntryConfigurationFileExtension);
         yoSliderboardConfigurationFilename = toFilename("YoSliderboard", yoSliderboardConfigurationFileExtension);
         yoEquationFilename = toFilename("YoEquation", yoEquationFileExtension);
         mainYoChartGroupFilename = toFilename("MainYoChartGroup", yoChartGroupConfigurationFileExtension);

         yoGraphicsPath = toPath(yoGraphicsFilename);
         yoCompositePath = toPath(yoCompositeFilename);
         yoEntryConfigurationPath = toPath(yoEntryConfigurationFilename);
         yoSliderboardConfigurationPath = toPath(yoSliderboardConfigurationFilename);
         yoEquationPath = toPath(yoEquationFilename);
         mainYoChartGroupPath = toPath(mainYoChartGroupFilename);

         definition = new SCSGuiConfigurationDefinition();
         definition.setName(configurationName);
         definition.setYoGraphicsFilename(yoGraphicsFilename);
         definition.setYoCompositePatternListFilename(yoCompositeFilename);
         definition.setYoEntryConfigurationFilename(yoEntryConfigurationFilename);
         definition.setYoSliderboardConfigurationFilename(yoSliderboardConfigurationFilename);
         definition.setYoEquationFilename(yoEquationFilename);
         definition.setMainYoChartGroupConfigurationFilename(mainYoChartGroupFilename);
         definition.setSecondaryYoChartGroupConfigurationsFilenames(secondaryYoChartGroupFilenames);
      }
   }

   public void setBufferSize(int bufferSize)
   {
      definition.setBufferSize(bufferSize);
   }

   public void setRecordTickPeriod(int recordTickPeriod)
   {
      definition.setRecordTickPeriod(recordTickPeriod);
   }

   public void setNumberPrecision(int numberPrecision)
   {
      definition.setNumberPrecision(numberPrecision);
   }

   public void setShowYoSearchPanel(boolean showYoSearchPanel)
   {
      definition.setShowYoSearchPanel(showYoSearchPanel);
   }

   public void setShowOverheadPlotter(boolean showOverheadPlotter)
   {
      definition.setShowOverheadPlotter(showOverheadPlotter);
   }

   public void setShowAdvancedControls(boolean showAdvancedControls)
   {
      definition.setShowAdvancedControls(showAdvancedControls);
   }

   public void setShowYoVariableUniqueNames(boolean showYoVariableUniqueNames)
   {
      definition.setShowYoVariableUniqueNames(showYoVariableUniqueNames);
   }

   public void setMainStage(Stage stage)
   {
      definition.setMainWindowConfiguration(toWindowConfigurationDefinition(stage));
   }

   public void addSecondaryWindowConfiguration(WindowConfigurationDefinition definitionConfigurationDefinition)
   {
      if (definition.getSecondaryWindowConfigurations() == null)
         definition.setSecondaryWindowConfigurations(new ArrayList<>());
      definition.getSecondaryWindowConfigurations().add(definitionConfigurationDefinition);
   }

   public void setSecondaryWindowConfigurations(List secondaryWindowConfigurations)
   {
      definition.setSecondaryWindowConfigurations(secondaryWindowConfigurations);
   }

   public void setSecondaryWindows(List stages)
   {
      List definitions = stages.stream().map(SCSGuiConfiguration::toWindowConfigurationDefinition).collect(Collectors.toList());
      setSecondaryWindowConfigurations(definitions);
   }

   public boolean exists()
   {
      return mainConfigurationPath.toFile().exists();
   }

   public void writeConfiguration()
   {
      try
      {
         XMLTools.saveSCSGuiConfigurationDefinition(new FileOutputStream(getMainConfigurationFile()), definition);
      }
      catch (JAXBException | IOException e)
      {
         e.printStackTrace();
      }
   }

   public boolean hasYoGraphicsConfiguration()
   {
      return yoGraphicsPath != null && yoGraphicsPath.toFile().exists();
   }

   public boolean hasYoCompositeConfiguration()
   {
      return yoCompositePath != null && yoCompositePath.toFile().exists();
   }

   public boolean hasYoEntryConfiguration()
   {
      return yoEntryConfigurationPath != null && yoEntryConfigurationPath.toFile().exists();
   }

   public boolean hasYoSliderboardConfiguration()
   {
      return yoSliderboardConfigurationPath != null && yoSliderboardConfigurationPath.toFile().exists();
   }

   public boolean hasYoEquationConfiguration()
   {
      return yoEquationPath != null && yoEquationPath.toFile().exists();
   }

   public boolean hasMainYoChartGroupConfiguration()
   {
      return mainYoChartGroupPath != null && mainYoChartGroupPath.toFile().exists();
   }

   public int getNumberOfSecondaryYoChartGroupConfigurations()
   {
      return secondaryYoChartGroupPaths.size();
   }

   public boolean hasBufferSize()
   {
      return definition != null && definition.getBufferSize() > 0;
   }

   public boolean hasRecordTickPeriod()
   {
      return definition != null && definition.getRecordTickPeriod() > 0;
   }

   public boolean hasNumberPrecision()
   {
      return definition != null && definition.getNumberPrecision() > 1;
   }

   public boolean hasMainWindowConfiguration()
   {
      return definition != null && definition.getMainWindowConfiguration() != null;
   }

   public boolean hasSecondaryWindowConfigurations()
   {
      return definition != null && definition.getSecondaryWindowConfigurations() != null
             && definition.getSecondaryWindowConfigurations().size() == getNumberOfSecondaryYoChartGroupConfigurations();
   }

   public File getMainConfigurationFile()
   {
      return mainConfigurationPath.toFile();
   }

   public File getYoGraphicsConfigurationFile()
   {
      return yoGraphicsPath.toFile();
   }

   public File getYoCompositeConfigurationFile()
   {
      return yoCompositePath.toFile();
   }

   public File getYoEntryConfigurationFile()
   {
      return yoEntryConfigurationPath.toFile();
   }

   public File getYoSliderboardConfigurationFile()
   {
      return yoSliderboardConfigurationPath.toFile();
   }

   public File getYoEquationConfigurationFile()
   {
      return yoEquationPath.toFile();
   }

   public File getMainYoChartGroupConfigurationFile()
   {
      return mainYoChartGroupPath.toFile();
   }

   public File addSecondaryYoChartGroupConfigurationFile()
   {
      String filename = toFilename("SecondaryYoChartGroup" + secondaryYoChartGroupFilenames.size(), yoChartGroupConfigurationFileExtension);
      secondaryYoChartGroupFilenames.add(filename);
      Path newPath = toPath(filename);
      secondaryYoChartGroupPaths.add(newPath);
      return newPath.toFile();
   }

   public File getSecondaryYoChartGroupConfigurationFile(int index)
   {
      return secondaryYoChartGroupPaths.get(index).toFile();
   }

   public int getBufferSize()
   {
      return definition.getBufferSize();
   }

   public int getRecordTickPeriod()
   {
      return definition.getRecordTickPeriod();
   }

   public int getNumberPrecision()
   {
      return definition.getNumberPrecision();
   }

   public boolean getShowYoSearchPanel()
   {
      return definition.isShowYoSearchPanel();
   }

   public boolean getShowOverheadPlotter()
   {
      return definition.isShowOverheadPlotter();
   }

   public boolean getShowAdvancedControls()
   {
      return definition.isShowAdvancedControls();
   }

   public boolean getShowYoVariableUniqueNames()
   {
      return definition.isShowYoVariableUniqueNames();
   }

   public void getMainWindowConfiguration(Stage stage)
   {
      loadWindowConfigurationDefinition(definition.getMainWindowConfiguration(), stage);
   }

   public List getSecondaryWindowConfigurations()
   {
      return definition.getSecondaryWindowConfigurations();
   }

   public void getSecondaryWindowConfigurations(List stages)
   {
      for (int i = 0; i < definition.getSecondaryWindowConfigurations().size(); i++)
      {
         loadWindowConfigurationDefinition(definition.getSecondaryWindowConfigurations().get(i), stages.get(i));
      }
   }

   private String toFilename(String suffix, String extension)
   {
      return suffix + extension;
   }

   private Path toPath(String filename)
   {
      if (filename == null)
         return null;
      else
         return configurationFolderPath.resolve(filename);
   }

   public static WindowConfigurationDefinition toWindowConfigurationDefinition(Stage stage)
   {
      return SecondaryWindowManager.toWindowConfigurationDefinition(stage);
   }

   public static void loadWindowConfigurationDefinition(WindowConfigurationDefinition definition, Stage stage)
   {
      double positionX = definition.getPositionX();
      double positionY = definition.getPositionY();
      double width;
      if (definition.getWidth() > 0.0)
         width = definition.getWidth();
      else
         width = stage.getWidth();

      double height;
      if (definition.getHeight() > 0.0)
         height = definition.getHeight();
      else
         height = stage.getHeight();

      ObservableList screensForRectangle = Screen.getScreensForRectangle(positionX, positionY, width, height);

      if (screensForRectangle.isEmpty())
      {
         // The window would be outside the visible bounds of the screens.
         // We'll reset the window so it appears in the middle of the primary screen.
         Screen primary = Screen.getPrimary();
         Rectangle2D visualBounds = primary.getVisualBounds();
         width = Math.min(width, visualBounds.getWidth());
         height = Math.min(height, visualBounds.getHeight());
         positionX = 0.5 * (visualBounds.getMinX() + visualBounds.getMaxX() - width);
         positionY = 0.5 * (visualBounds.getMinY() + visualBounds.getMaxY() - height);
      }

      stage.setX(positionX);
      stage.setY(positionY);

      double finalWidth = width;
      double finalHeight = height;

      JavaFXMissingTools.runLater(SCSGuiConfiguration.class, () ->
      {
         if (definition.isMaximized())
         {
            JavaFXMissingTools.runNFramesLater(1, () -> stage.setMaximized(true));
         }
         else
         {
            stage.setWidth(finalWidth);
            stage.setHeight(finalHeight);
         }
      });
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy