public boolean visualConfigure(Frame parent) {
   // First check for Python.
   boolean hasPython =
       PythonUtils.interactiveCheckVersion(
           parent,
           "Generating gcode",
           new PythonUtils.Version(2, 5, 0),
           new PythonUtils.Version(3, 0, 0));
   if (!hasPython) {
     return false;
   }
   boolean hasTkInter = PythonUtils.interactiveCheckTkInter(parent, "Generating gcode");
   if (!hasTkInter) {
     return false;
   }
   ConfigurationDialog cd = new ConfigurationDialog(parent);
   double x = parent.getBounds().getCenterX();
   double y = parent.getBounds().getCenterY();
   cd.pack();
   x -= cd.getWidth() / 2.0;
   y -= cd.getHeight() / 2.0;
   cd.setLocation((int) x, (int) y);
   cd.setVisible(true);
   return configSuccess;
 }