diff --git a/GUI/src/main/java/cz/fidentis/analyst/core/FaceTab.java b/GUI/src/main/java/cz/fidentis/analyst/core/FaceTab.java index ee6301ec11140ebca95709fb7a9a0efa486b3955..307d7d40658f61c404dccca3fae435f0839d508b 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/core/FaceTab.java +++ b/GUI/src/main/java/cz/fidentis/analyst/core/FaceTab.java @@ -1,5 +1,6 @@ package cz.fidentis.analyst.core; +import cz.fidentis.analyst.Project; import cz.fidentis.analyst.batch.BatchAction; import cz.fidentis.analyst.canvas.Canvas; import cz.fidentis.analyst.canvas.toolbar.SceneToolboxFaceToFace; @@ -7,6 +8,7 @@ import cz.fidentis.analyst.canvas.toolbar.SceneToolboxSingleFace; import cz.fidentis.analyst.curvature.CurvatureAction; import cz.fidentis.analyst.distance.DistanceAction; import cz.fidentis.analyst.face.HumanFace; +import cz.fidentis.analyst.faceState.FaceStatePanel; import cz.fidentis.analyst.registration.RegistrationAction; import cz.fidentis.analyst.symmetry.ProfilesAction; import cz.fidentis.analyst.symmetry.SymmetryAction; @@ -15,6 +17,7 @@ import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; import java.util.Objects; import javax.swing.GroupLayout; @@ -45,7 +48,7 @@ public class FaceTab extends TopComponent { * @param name Tab name * @param listener action listener */ - public FaceTab(HumanFace primary, HumanFace secondary, String name, ActionListener listener) { + public FaceTab(HumanFace primary, HumanFace secondary, String name, ActionListener listener, Project project) { canvas = new Canvas(); this.listener = listener; @@ -79,16 +82,31 @@ public class FaceTab extends TopComponent { }); controlPanel.addChangeListener(e -> getCanvas().renderScene()); - + if (secondary == null) { // single face analysis new CurvatureAction(getCanvas(), controlPanel); new SymmetryAction(getCanvas(), controlPanel); new ProfilesAction(getCanvas(), controlPanel); + + // Face State Panel for primary face + FaceStatePanel facePanel = this.createFacePanelStateForFace(primary, project); + controlPanel.addTab(facePanel.getName(), facePanel.getIcon(), facePanel); + } else { // 1:1 new RegistrationAction(canvas, controlPanel); new DistanceAction(canvas, controlPanel); new SymmetryAction(canvas, controlPanel); new ProfilesAction(canvas, controlPanel); + + // Face State Panel for primary face + FaceStatePanel facePanel = this.createFacePanelStateForFace(primary, project); + facePanel.setTypeOfIcon(FaceStatePanel.TypeOfIcon.MANY_TO_MANY_PRIMARY); + controlPanel.addTab(facePanel.getName(), facePanel.getIcon(), facePanel); + + // Face State Panel for secondary face + FaceStatePanel secondaryFacePanel = this.createFacePanelStateForFace(secondary, project); + secondaryFacePanel.setTypeOfIcon(FaceStatePanel.TypeOfIcon.MANY_TO_MANY_SECONDARY); + controlPanel.addTab(secondaryFacePanel.getName(), secondaryFacePanel.getIcon(), secondaryFacePanel); } } @@ -179,6 +197,22 @@ public class FaceTab extends TopComponent { return canvas; } + /** + * Create FaceStatePanel for face + * @param face which will be shown on panel + * @param project project where path to this face is stored + * @return new created face state panel + */ + private FaceStatePanel createFacePanelStateForFace(HumanFace face, Project project) { + Path pathToFace = Paths.get(face.getPath()); + String faceName = face.getShortName(); + FaceStatePanel facePanel = new FaceStatePanel(project, faceName, pathToFace); + facePanel.loadFaceGeometryInfo(face); + facePanel.showFaceState(faceName, pathToFace); + //controlPanel.addTab(facePanel.getName(), facePanel.getIcon(), facePanel); + return facePanel; + } + @Override public boolean canClose() { diff --git a/GUI/src/main/java/cz/fidentis/analyst/faceState/FaceStatePanel.java b/GUI/src/main/java/cz/fidentis/analyst/faceState/FaceStatePanel.java index c1e3376e3a1c7b203322a1615c85d11014155917..3e9bdcf2a74636c2ec0d5d3753467254dbd72739 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/faceState/FaceStatePanel.java +++ b/GUI/src/main/java/cz/fidentis/analyst/faceState/FaceStatePanel.java @@ -1,9 +1,11 @@ package cz.fidentis.analyst.faceState; +import cz.fidentis.analyst.Project; import cz.fidentis.analyst.core.ControlPanel; import cz.fidentis.analyst.face.HumanFace; import java.awt.Dimension; import java.awt.Toolkit; +import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; @@ -31,9 +33,23 @@ public class FaceStatePanel extends ControlPanel { private final ImageIcon anonymousFace = new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + "face160x160.png")); private ImageIcon previewFace = null; - public static final String ICON = "head28x28.png"; + public static final String DEFAULT_ICON = "head28x28.png"; + public static final String PRIMARY_FACE_ICON = "primaryFace28x28.png"; + public static final String SECONDARY_FACE_ICON = "secondaryFace28x28.png"; public static final String NAME = "Face State"; + /** + * All types of icons which this panel can have + * @author Matej Kovar + */ + public enum TypeOfIcon { + DEFAULT, + MANY_TO_MANY_PRIMARY, + MANY_TO_MANY_SECONDARY + } + + private TypeOfIcon typeOfIcon = TypeOfIcon.DEFAULT; + // Loaded geometry info of face private Map<String, FaceGeometryInfo> loadedFaces = new HashMap<>(); @@ -48,7 +64,28 @@ public class FaceStatePanel extends ControlPanel { loadInfoButton.addActionListener(loadFaceListener); loadInfoButton.setToolTipText("Loads face geometry info from file in specified file path"); //210 140 - + } + + /** + * Panel with face information + * @param project where path to face is stored + * @param faceName name of the displayed face + * @param path path to face + */ + public FaceStatePanel(Project project, String faceName, Path path) { + + // Listener for loading currently selected face (to show face state) + ActionListener listenerLoadFace = (ActionEvent e) -> { + HumanFace face = project.loadFace(faceName); + this.loadFaceGeometryInfo(face); + this.showFaceState(faceName, path); + }; + + this.setName(NAME); + initComponents(); + loadInfoButton.addActionListener(listenerLoadFace); + loadInfoButton.setToolTipText("Loads face geometry info from file in specified file path"); + //this.project = project; } /** @@ -284,6 +321,11 @@ public class FaceStatePanel extends ControlPanel { filePanel.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.filePanel.AccessibleContext.accessibleName")); // NOI18N }// </editor-fold>//GEN-END:initComponents + public void setTypeOfIcon(TypeOfIcon typeOfIcon) { + this.typeOfIcon = typeOfIcon; + } + + private void photoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_photoMouseClicked if (previewFace != null) { @@ -315,7 +357,15 @@ public class FaceStatePanel extends ControlPanel { @Override public ImageIcon getIcon() { - return new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + ICON)); + switch (typeOfIcon) { + case MANY_TO_MANY_PRIMARY: + return new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + PRIMARY_FACE_ICON)); + case MANY_TO_MANY_SECONDARY: + return new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + SECONDARY_FACE_ICON)); + default: + break; + } + return new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + DEFAULT_ICON)); } /** diff --git a/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.java b/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.java index e9e58496e18c7ae2177227a14162c8c79579d759..1c1d82d62e8475474455b02530fb54e0602e32d5 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.java +++ b/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.java @@ -60,6 +60,7 @@ public class ProjectPanel extends JPanel { project = new Project(); initComponents(); + } /** @@ -588,7 +589,7 @@ public class ProjectPanel extends JPanel { }; - FaceTab newTab = new FaceTab(face, null, name, tabCloseListener); + FaceTab newTab = new FaceTab(face, null, name, tabCloseListener, project); if (!tabs.contains(newTab)) { tabs.add(newTab); @@ -619,7 +620,8 @@ public class ProjectPanel extends JPanel { closeTab(e); } }; - FaceTab newTab = new FaceTab(face1, face2, nameOfTab, tabCloseListener); + + FaceTab newTab = new FaceTab(face1, face2, nameOfTab, tabCloseListener, project); if (!tabs.contains(newTab)) {