diff --git a/Comparison/src/main/java/cz/fidentis/analyst/Project.java b/Comparison/src/main/java/cz/fidentis/analyst/Project.java index ffcf7cfa5eb69eb99007f00411e244486bc58b3b..73a0fd18cc968d03230a432a07cf1572814c2951 100644 --- a/Comparison/src/main/java/cz/fidentis/analyst/Project.java +++ b/Comparison/src/main/java/cz/fidentis/analyst/Project.java @@ -4,6 +4,7 @@ import cz.fidentis.analyst.face.HumanFace; import java.io.File; import java.io.IOException; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -218,7 +219,8 @@ public class Project { Path path = this.getCfg().getPathToFaceByName(name); File file = path.toFile(); face = new HumanFace(file, true); // loads also landmarks, if exist - Path preview = path.resolveSibling(name.concat("_preview.jpg")); + //Path preview = path.resolveSibling(name.concat("_preview.jpg")); + Path preview = Paths.get(face.getPath().split(".obj")[0] + "_preview.jpg"); face.setPreview(preview); this.addFace(face); out.printDuration("Loaded model " + face.getShortName() +" with " + face.getMeshModel().getNumVertices() + " vertices"); diff --git a/GUI/pom.xml b/GUI/pom.xml index 7af2194f284388d483ad7965ea6a3a375fa75e60..68f43d641799751d76bac53620b4b559bc8eaad4 100644 --- a/GUI/pom.xml +++ b/GUI/pom.xml @@ -159,6 +159,11 @@ <artifactId>guava</artifactId> <version>30.1-jre</version> </dependency> + <dependency> + <groupId>org.imgscalr</groupId> + <artifactId>imgscalr-lib</artifactId> + <version>4.2</version> + </dependency> </dependencies> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> diff --git a/GUI/src/main/java/cz/fidentis/analyst/project/FaceStatePanel.java b/GUI/src/main/java/cz/fidentis/analyst/project/FaceStatePanel.java index 3ef282855a4d3048d5a1b931f822418da15ef418..db5d4b3acb23fd8577f1438ab3475f62d68425af 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/project/FaceStatePanel.java +++ b/GUI/src/main/java/cz/fidentis/analyst/project/FaceStatePanel.java @@ -3,9 +3,9 @@ package cz.fidentis.analyst.project; import cz.fidentis.analyst.core.ControlPanel; import cz.fidentis.analyst.face.HumanFace; import java.awt.Dimension; -import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -14,6 +14,7 @@ import java.nio.file.Paths; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JOptionPane; +import org.imgscalr.Scalr; /** * @@ -23,8 +24,7 @@ public class FaceStatePanel extends ControlPanel { private final ImageIcon notCheck = new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + "notCheck16x16.png")); private final ImageIcon check = new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + "check16x16.png")); - //private final ImageIcon warning = new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + "warning16x16.png")); - private final ImageIcon anonymousFace = new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + "face160x160.png")); + private final ImageIcon previewBasic = new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + "face160x160.png")); private ImageIcon previewFace = null; public static final String ICON = "head28x28.png"; @@ -316,38 +316,46 @@ public class FaceStatePanel extends ControlPanel { * @return ImageIcon either loaded face preview or anonymous face when preview is not found */ private ImageIcon getPhoto(HumanFace face, Path path) { - - ImageIcon image; + previewFace = null; - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + BufferedImage image = null; + // If face is loaded to project, preview is loaded from face if (face != null) { if (face.getPreview() != null) { - previewFace = new ImageIcon(face.getPreview().getScaledInstance((int)screenSize.getWidth() - 100, (int)screenSize.getHeight() - 100, Image.SCALE_FAST)); - photo.setToolTipText("Click to enlarge the image"); - return new ImageIcon(face.getPreview().getScaledInstance(240, 160, Image.SCALE_FAST)); + image = face.getPreview(); + + } else { + photo.setToolTipText(""); + return previewBasic; } - photo.setToolTipText(""); - return anonymousFace; - } - - if (path != null && path.toFile().exists()) { - String pathString = path.toString(); - Path preview = Paths.get(pathString.substring(0, pathString.lastIndexOf(".")).concat("_preview.jpg")); + } else if (path != null && path.toFile().exists()) { + Path preview = Paths.get(path.toString().split(".obj")[0] + "_preview.jpg"); try { - - previewFace = new ImageIcon(ImageIO.read(preview.toFile()).getScaledInstance((int)screenSize.getWidth() - 200, (int)screenSize.getHeight() - 200, Image.SCALE_FAST)); - image = new ImageIcon(previewFace.getImage().getScaledInstance(240, 160, Image.SCALE_FAST)); - photo.setToolTipText("Click to enlarge the image"); - return image; + image = ImageIO.read(preview.toFile()); } catch (IOException ex) { //Exceptions.printStackTrace(ex);) } + } - photo.setToolTipText(""); - return anonymousFace; + + if (image == null) { + + // Basic black siluete + photo.setToolTipText(""); + return previewBasic; + } + + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + image = Scalr.resize(image, (int)screenSize.getHeight() - 200); + + previewFace = new ImageIcon(image); + photo.setToolTipText("Click to enlarge the image"); + + return new ImageIcon(Scalr.resize(image, 240, 160)); + } /** diff --git a/GUI/src/main/java/cz/fidentis/analyst/project/ModelsTableModel.java b/GUI/src/main/java/cz/fidentis/analyst/project/ModelsTableModel.java index ae5643e0ab21cfd0f979236c61e793799d0d6fe5..980ca3270b0a90925c9c2df2aac3448d4b1f0f2f 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/project/ModelsTableModel.java +++ b/GUI/src/main/java/cz/fidentis/analyst/project/ModelsTableModel.java @@ -1,6 +1,5 @@ package cz.fidentis.analyst.project; -import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; import java.nio.file.Path; @@ -8,6 +7,7 @@ import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.table.DefaultTableModel; import org.openide.util.Exceptions; +import org.imgscalr.Scalr; /** * List of faces TableModel @@ -61,7 +61,7 @@ public class ModelsTableModel extends DefaultTableModel { /** * Adds new row to model * @param name String name of the face - * @param hasKD Boolean if face has KD tree calculated + * @param Path path to preview (if null than default preview is set) */ public void addRowWithName(String name, Path path) { if (!path.toFile().exists()) { @@ -69,7 +69,11 @@ public class ModelsTableModel extends DefaultTableModel { } else { try { BufferedImage image = ImageIO.read(path.toFile()); - addRow(new Object[]{false, name, new ImageIcon(image.getScaledInstance(75, 50, Image.SCALE_FAST))}); + + // Scale image to fit into column + BufferedImage scaledImage = Scalr.resize(image, 70, 55); + addRow(new Object[]{false, name, new ImageIcon(scaledImage)}); + } catch (IOException ex) { Exceptions.printStackTrace(ex); } diff --git a/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.form b/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.form index f11e510ff7541445b442531ec4d579346c6b6821..4ea426830f46d797a04ebab6d34c16dbba61fbc3 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.form +++ b/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.form @@ -18,26 +18,28 @@ <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0"> <EmptySpace min="-2" pref="41" max="-2" attributes="0"/> - <Group type="103" groupAlignment="1" attributes="0"> - <Component id="saveProjectButton" min="-2" max="-2" attributes="0"/> - <Group type="102" alignment="1" attributes="0"> - <Group type="103" groupAlignment="1" max="-2" attributes="0"> - <Component id="faceTableScrollPanel" pref="863" max="32767" attributes="0"/> - <Component id="buttonsPanel" max="32767" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> + <Component id="tablePanel" alignment="1" min="-2" max="-2" attributes="0"/> + <Component id="buttonsPanel" min="-2" pref="969" max="-2" attributes="0"/> + </Group> + <EmptySpace min="-2" pref="4" max="-2" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="103" alignment="1" groupAlignment="0" attributes="0"> + <Group type="102" alignment="0" attributes="0"> + <EmptySpace min="-2" pref="78" max="-2" attributes="0"/> + <Component id="newProjectButton" min="-2" max="-2" attributes="0"/> </Group> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="-2" pref="78" max="-2" attributes="0"/> - <Component id="newProjectButton" min="-2" max="-2" attributes="0"/> - </Group> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace max="-2" attributes="0"/> - <Component id="openProjectButton" min="-2" max="-2" attributes="0"/> - </Group> + <Group type="102" alignment="1" attributes="0"> + <EmptySpace max="-2" attributes="0"/> + <Component id="openProjectButton" min="-2" max="-2" attributes="0"/> </Group> </Group> + <Group type="102" alignment="1" attributes="0"> + <EmptySpace min="-2" pref="78" max="-2" attributes="0"/> + <Component id="saveProjectButton" min="-2" max="-2" attributes="0"/> + </Group> </Group> - <EmptySpace pref="41" max="32767" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> @@ -56,14 +58,14 @@ </Group> <EmptySpace max="-2" attributes="0"/> <Group type="103" groupAlignment="0" attributes="0"> - <Component id="faceTableScrollPanel" min="-2" pref="768" max="-2" attributes="0"/> <Group type="102" alignment="0" attributes="0"> <Component id="saveProjectButton" min="-2" max="-2" attributes="0"/> <EmptySpace type="separate" max="-2" attributes="0"/> <Component id="openProjectButton" min="-2" max="-2" attributes="0"/> </Group> + <Component id="tablePanel" min="-2" max="-2" attributes="0"/> </Group> - <EmptySpace pref="12" max="32767" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> @@ -97,7 +99,7 @@ </Events> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription"> - <GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="20" ipadY="0" insetsTop="16" insetsLeft="0" insetsBottom="13" insetsRight="4" anchor="13" weightX="0.0" weightY="0.0"/> + <GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="20" ipadY="0" insetsTop="16" insetsLeft="0" insetsBottom="13" insetsRight="8" anchor="13" weightX="0.0" weightY="0.0"/> </Constraint> </Constraints> </Component> @@ -115,7 +117,7 @@ </Events> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription"> - <GridBagConstraints gridX="1" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="16" insetsLeft="22" insetsBottom="13" insetsRight="4" anchor="18" weightX="0.0" weightY="0.0"/> + <GridBagConstraints gridX="1" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="16" insetsLeft="22" insetsBottom="13" insetsRight="8" anchor="18" weightX="0.0" weightY="0.0"/> </Constraint> </Constraints> </Component> @@ -133,7 +135,7 @@ </Events> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription"> - <GridBagConstraints gridX="2" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="16" insetsLeft="22" insetsBottom="13" insetsRight="4" anchor="18" weightX="0.0" weightY="0.0"/> + <GridBagConstraints gridX="2" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="16" insetsLeft="22" insetsBottom="13" insetsRight="8" anchor="18" weightX="0.0" weightY="0.0"/> </Constraint> </Constraints> </Component> @@ -151,7 +153,7 @@ </Events> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription"> - <GridBagConstraints gridX="3" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="16" insetsLeft="22" insetsBottom="13" insetsRight="4" anchor="18" weightX="0.0" weightY="0.0"/> + <GridBagConstraints gridX="3" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="16" insetsLeft="22" insetsBottom="13" insetsRight="8" anchor="18" weightX="0.0" weightY="0.0"/> </Constraint> </Constraints> </Component> @@ -170,7 +172,7 @@ </Events> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription"> - <GridBagConstraints gridX="4" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="16" insetsLeft="22" insetsBottom="13" insetsRight="4" anchor="18" weightX="0.0" weightY="0.0"/> + <GridBagConstraints gridX="4" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="16" insetsLeft="22" insetsBottom="13" insetsRight="8" anchor="18" weightX="0.0" weightY="0.0"/> </Constraint> </Constraints> </Component> @@ -188,54 +190,12 @@ </Events> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription"> - <GridBagConstraints gridX="5" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="16" insetsLeft="75" insetsBottom="13" insetsRight="4" anchor="10" weightX="0.0" weightY="0.0"/> + <GridBagConstraints gridX="5" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="16" insetsLeft="170" insetsBottom="13" insetsRight="4" anchor="10" weightX="0.0" weightY="0.0"/> </Constraint> </Constraints> </Component> </SubComponents> </Container> - <Container class="javax.swing.JScrollPane" name="faceTableScrollPanel"> - <Properties> - <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> - <Dimension value="[812, 750]"/> - </Property> - </Properties> - <AuxValues> - <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/> - </AuxValues> - - <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> - <SubComponents> - <Component class="javax.swing.JTable" name="table"> - <Properties> - <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor" postCode="table.getTableHeader().setOpaque(false);
table.getTableHeader().setBackground(new java.awt.Color(204,204,204));
table.getTableHeader().setFont(new java.awt.Font("Tahoma", 0, 18));
model.addTableModelListener(new TableModelListener() {
 public void tableChanged(TableModelEvent e) {
 jTable1TableChanged(e);
 }
});"> - <Font name="Tahoma" size="18" style="0"/> - </Property> - <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor" postCode="table.getColumnModel().getColumn(0).setMaxWidth(50);
table.getColumnModel().getColumn(2).setMaxWidth(75);
table.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(50);
table.getTableHeader().getColumnModel().getColumn(2).setMaxWidth(75);"> - <Connection code="model" type="code"/> - </Property> - <Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor"> - <TableColumnModel selectionModel="0"/> - </Property> - <Property name="dragEnabled" type="boolean" value="true"/> - <Property name="rowHeight" type="int" value="60"/> - <Property name="selectionBackground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> - <Color blue="ff" green="cc" red="66" type="rgb"/> - </Property> - <Property name="selectionMode" type="int" value="0"/> - <Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor"> - <TableHeader reorderingAllowed="false" resizingAllowed="true"/> - </Property> - </Properties> - <Events> - <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="tableMouseClicked"/> - </Events> - <AuxValues> - <AuxValue name="JavaCodeGenerator_InitCodePre" type="java.lang.String" value="table.setSize(faceTableScrollPanel.getWidth(), faceTableScrollPanel.getHeight());"/> - </AuxValues> - </Component> - </SubComponents> - </Container> <Component class="javax.swing.JButton" name="saveProjectButton"> <Properties> <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> @@ -281,5 +241,63 @@ <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="newProjectButtonMouseClicked"/> </Events> </Component> + <Container class="javax.swing.JPanel" name="tablePanel"> + <Properties> + <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor"> + <Border info="org.netbeans.modules.form.compat2.border.EtchedBorderInfo"> + <EtchetBorder/> + </Border> + </Property> + </Properties> + + <Layout> + <DimensionLayout dim="0"> + <Group type="103" groupAlignment="0" attributes="0"> + <EmptySpace min="0" pref="965" max="32767" attributes="0"/> + <Group type="103" rootIndex="1" groupAlignment="0" attributes="0"> + <Component id="table" alignment="0" pref="965" max="32767" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + <DimensionLayout dim="1"> + <Group type="103" groupAlignment="0" attributes="0"> + <EmptySpace min="0" pref="788" max="32767" attributes="0"/> + <Group type="103" rootIndex="1" groupAlignment="0" attributes="0"> + <Component id="table" alignment="0" pref="788" max="32767" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Component class="javax.swing.JTable" name="table"> + <Properties> + <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor" postCode="table.getTableHeader().setOpaque(false);
table.getTableHeader().setBackground(new java.awt.Color(204,204,204));
table.getTableHeader().setFont(new java.awt.Font("Tahoma", 0, 18));
model.addTableModelListener(new TableModelListener() {
 public void tableChanged(TableModelEvent e) {
 jTable1TableChanged(e);
 }
});"> + <Font name="Tahoma" size="18" style="0"/> + </Property> + <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor" postCode="table.getColumnModel().getColumn(0).setMaxWidth(50);
table.getColumnModel().getColumn(2).setMaxWidth(85);
table.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(50);
table.getTableHeader().getColumnModel().getColumn(2).setMaxWidth(75);"> + <Connection code="model" type="code"/> + </Property> + <Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor"> + <TableColumnModel selectionModel="0"/> + </Property> + <Property name="dragEnabled" type="boolean" value="true"/> + <Property name="rowHeight" type="int" value="60"/> + <Property name="selectionBackground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="ff" green="cc" red="66" type="rgb"/> + </Property> + <Property name="selectionMode" type="int" value="0"/> + <Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor"> + <TableHeader reorderingAllowed="false" resizingAllowed="true"/> + </Property> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="tableMouseClicked"/> + </Events> + <AuxValues> + <AuxValue name="JavaCodeGenerator_InitCodePre" type="java.lang.String" value="table.setSize(tablePanel.getWidth(), tablePanel.getHeight());"/> + </AuxValues> + </Component> + </SubComponents> + </Container> </SubComponents> </Form> 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 a9807f150ad30eca5c3e0f46aac8e693fc41be6f..e1cb10bfb1eacbe39d3f2e5d6bfaf8a174973872 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.java +++ b/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.java @@ -77,11 +77,11 @@ public class ProjectPanel extends JPanel { deselectAllButton = new javax.swing.JButton(); inflateButton = new javax.swing.JButton(); analyseButton = new javax.swing.JButton(); - faceTableScrollPanel = new javax.swing.JScrollPane(); - table = new javax.swing.JTable(); saveProjectButton = new javax.swing.JButton(); openProjectButton = new javax.swing.JButton(); newProjectButton = new javax.swing.JButton(); + tablePanel = new javax.swing.JPanel(); + table = new javax.swing.JTable(); buttonsPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); buttonsPanel.setMinimumSize(new java.awt.Dimension(0, 0)); @@ -99,7 +99,7 @@ public class ProjectPanel extends JPanel { gridBagConstraints.gridy = 0; gridBagConstraints.ipadx = 20; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; - gridBagConstraints.insets = new java.awt.Insets(16, 0, 13, 4); + gridBagConstraints.insets = new java.awt.Insets(16, 0, 13, 8); buttonsPanel.add(addButton, gridBagConstraints); removeButton.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N @@ -113,7 +113,7 @@ public class ProjectPanel extends JPanel { gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; - gridBagConstraints.insets = new java.awt.Insets(16, 22, 13, 4); + gridBagConstraints.insets = new java.awt.Insets(16, 22, 13, 8); buttonsPanel.add(removeButton, gridBagConstraints); selectAllButton.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N @@ -127,7 +127,7 @@ public class ProjectPanel extends JPanel { gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; - gridBagConstraints.insets = new java.awt.Insets(16, 22, 13, 4); + gridBagConstraints.insets = new java.awt.Insets(16, 22, 13, 8); buttonsPanel.add(selectAllButton, gridBagConstraints); deselectAllButton.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N @@ -141,7 +141,7 @@ public class ProjectPanel extends JPanel { gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; - gridBagConstraints.insets = new java.awt.Insets(16, 22, 13, 4); + gridBagConstraints.insets = new java.awt.Insets(16, 22, 13, 8); buttonsPanel.add(deselectAllButton, gridBagConstraints); inflateButton.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N @@ -156,7 +156,7 @@ public class ProjectPanel extends JPanel { gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; - gridBagConstraints.insets = new java.awt.Insets(16, 22, 13, 4); + gridBagConstraints.insets = new java.awt.Insets(16, 22, 13, 8); buttonsPanel.add(inflateButton, gridBagConstraints); analyseButton.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N @@ -169,38 +169,9 @@ public class ProjectPanel extends JPanel { gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 5; gridBagConstraints.gridy = 0; - gridBagConstraints.insets = new java.awt.Insets(16, 75, 13, 4); + gridBagConstraints.insets = new java.awt.Insets(16, 170, 13, 4); buttonsPanel.add(analyseButton, gridBagConstraints); - faceTableScrollPanel.setPreferredSize(new java.awt.Dimension(812, 750)); - - table.setSize(faceTableScrollPanel.getWidth(), faceTableScrollPanel.getHeight()); - table.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N - table.getTableHeader().setOpaque(false); - table.getTableHeader().setBackground(new java.awt.Color(204,204,204)); - table.getTableHeader().setFont(new java.awt.Font("Tahoma", 0, 18)); - model.addTableModelListener(new TableModelListener() { - public void tableChanged(TableModelEvent e) { - jTable1TableChanged(e); - } - }); - table.setModel(model); - table.getColumnModel().getColumn(0).setMaxWidth(50); - table.getColumnModel().getColumn(2).setMaxWidth(75); - table.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(50); - table.getTableHeader().getColumnModel().getColumn(2).setMaxWidth(75); - table.setDragEnabled(true); - table.setRowHeight(60); - table.setSelectionBackground(new java.awt.Color(102, 204, 255)); - table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); - table.getTableHeader().setReorderingAllowed(false); - table.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - tableMouseClicked(evt); - } - }); - faceTableScrollPanel.setViewportView(table); - saveProjectButton.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N saveProjectButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/save100x24.png"))); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(saveProjectButton, org.openide.util.NbBundle.getMessage(ProjectPanel.class, "ProjectPanel.saveProjectButton.text")); // NOI18N @@ -227,26 +198,71 @@ public class ProjectPanel extends JPanel { } }); + tablePanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); + + table.setSize(tablePanel.getWidth(), tablePanel.getHeight()); + table.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N + table.getTableHeader().setOpaque(false); + table.getTableHeader().setBackground(new java.awt.Color(204,204,204)); + table.getTableHeader().setFont(new java.awt.Font("Tahoma", 0, 18)); + model.addTableModelListener(new TableModelListener() { + public void tableChanged(TableModelEvent e) { + jTable1TableChanged(e); + } + }); + table.setModel(model); + table.getColumnModel().getColumn(0).setMaxWidth(50); + table.getColumnModel().getColumn(2).setMaxWidth(85); + table.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(50); + table.getTableHeader().getColumnModel().getColumn(2).setMaxWidth(75); + table.setDragEnabled(true); + table.setRowHeight(60); + table.setSelectionBackground(new java.awt.Color(102, 204, 255)); + table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + table.getTableHeader().setReorderingAllowed(false); + table.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + tableMouseClicked(evt); + } + }); + + javax.swing.GroupLayout tablePanelLayout = new javax.swing.GroupLayout(tablePanel); + tablePanel.setLayout(tablePanelLayout); + tablePanelLayout.setHorizontalGroup( + tablePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 965, Short.MAX_VALUE) + .addGroup(tablePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(table, javax.swing.GroupLayout.DEFAULT_SIZE, 965, Short.MAX_VALUE)) + ); + tablePanelLayout.setVerticalGroup( + tablePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 788, Short.MAX_VALUE) + .addGroup(tablePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(table, javax.swing.GroupLayout.DEFAULT_SIZE, 788, Short.MAX_VALUE)) + ); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(41, 41, 41) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(saveProjectButton) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addComponent(faceTableScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 863, Short.MAX_VALUE) - .addComponent(buttonsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(78, 78, 78) - .addComponent(newProjectButton)) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(openProjectButton))))) - .addContainerGap(41, Short.MAX_VALUE)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(tablePanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(buttonsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 969, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(4, 4, 4) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(78, 78, 78) + .addComponent(newProjectButton)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(openProjectButton))) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(78, 78, 78) + .addComponent(saveProjectButton))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -260,12 +276,12 @@ public class ProjectPanel extends JPanel { .addComponent(buttonsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(faceTableScrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 768, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createSequentialGroup() .addComponent(saveProjectButton) .addGap(18, 18, 18) - .addComponent(openProjectButton))) - .addContainerGap(12, Short.MAX_VALUE)) + .addComponent(openProjectButton)) + .addComponent(tablePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); }// </editor-fold>//GEN-END:initComponents @@ -344,8 +360,25 @@ public class ProjectPanel extends JPanel { if (project.getFaceByName(name2) == null) { project.addFace(face2); } + + Object[] options = {face1.getShortName(), face2.getShortName()}; + + int choice = JOptionPane.showOptionDialog(this, + "Faces: ", + "Select primary face", + JOptionPane.DEFAULT_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, + options, + options[0]); - createFaceToFaceTab(face1, face2, name1 + ":" + name2, false); + + if (choice == 0) { + createFaceToFaceTab(face1, face2, name1 + ":" + name2, false); + } else { + createFaceToFaceTab(face2, face1, name2 + ":" + name1, false); + } + } /** @@ -354,7 +387,7 @@ public class ProjectPanel extends JPanel { private void analyseManyToManyFaces() { List<Path> faces = selectedRows.stream() - .map(i -> model.getValueAt(selectedRows.get(i), 1).toString()) + .map(i -> model.getValueAt(i, 1).toString()) .map(s -> project.getCfg().getPathToFaceByName(s)) .collect(Collectors.toList()); @@ -502,8 +535,8 @@ public class ProjectPanel extends JPanel { path.toString().lastIndexOf('.')); if (project.addNewPath(path)) { - - Path preview = path.resolveSibling(name.concat("_preview_small.jpg")); + + Path preview = Paths.get(path.toString().split(".obj")[0] + "_preview.jpg"); model.addRowWithName(name, preview); filterPanel.checkAllFacesLoaded(false); @@ -694,9 +727,9 @@ public class ProjectPanel extends JPanel { } Collections.sort(names); names.forEach(name -> { + HumanFace face = project.getFaceByName(name); - String pathString = face.getPath(); - Path preview = Paths.get(pathString.substring(0, pathString.lastIndexOf(".")).concat("_preview.jpg")); + Path preview = Paths.get(face.getPath().split(".obj")[0] + "_preview.jpg"); model.addRowWithName(name, preview); }); @@ -727,37 +760,28 @@ public class ProjectPanel extends JPanel { * project */ public void openExistingOrNewProject() { - ImageIcon recentProjectImage = new ImageIcon(ProjectTopComp.class.getClassLoader().getResource("/" + "recent_project.png")); - ImageIcon newProjectImage = new ImageIcon(ProjectTopComp.class.getClassLoader().getResource("/" + "new.png")); - ImageIcon existingProjectImage = new ImageIcon(ProjectTopComp.class.getClassLoader().getResource("/" + "open.png")); - Object[] options = {recentProjectImage, newProjectImage, existingProjectImage}; File recentProjectFile = getRecentProject(); - String recentProjectInfo; if (recentProjectFile != null) { - recentProjectInfo = "\n\nMost recent project is : " + recentProjectFile.getAbsolutePath(); - } else { - recentProjectInfo = "\n\nCouldn't find most recent project"; + openProjectFromFile(recentProjectFile); + return; } + ImageIcon newProjectImage = new ImageIcon(ProjectTopComp.class.getClassLoader().getResource("/" + "new.png")); + ImageIcon existingProjectImage = new ImageIcon(ProjectTopComp.class.getClassLoader().getResource("/" + "open.png")); + Object[] options = {newProjectImage, existingProjectImage}; + + int choice = JOptionPane.showOptionDialog(this, - "Would you like to create a new project or open an existing project?" - + recentProjectInfo, + "Would you like to create a new project or open an existing project?", "Select project", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, - options[1]); + options[0]); - switch (choice) { - case 0: - openRecentProject(); - break; - case 2: - openProject(); - break; - default: - break; + if (choice == 1) { + openProject(); } } @@ -773,6 +797,7 @@ public class ProjectPanel extends JPanel { model.setRowCount(0); checkFaceState(null, false); selectedRows.clear(); + userPreferences.remove("pathToMostRecentProject"); } /** @@ -804,13 +829,23 @@ public class ProjectPanel extends JPanel { */ public void saveProject() { - JFileChooser chooser = new JFileChooser(); - //chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - chooser.setFileFilter(new FileNameExtensionFilter("json files (*.json)", "json")); - chooser.setAcceptAllFileFilterUsed(true); - chooser.showSaveDialog(null); + File file; - File file = chooser.getSelectedFile(); + // If current project was saved before + String path = userPreferences.get("pathToMostRecentProject", ""); + if (path != null && !path.isEmpty()) { + file = Paths.get(path).toFile(); + + // Project was not saved before, user chooses new path where to save project + } else { + JFileChooser chooser = new JFileChooser(); + //chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + chooser.setFileFilter(new FileNameExtensionFilter("json files (*.json)", "json")); + chooser.setAcceptAllFileFilterUsed(true); + chooser.showSaveDialog(null); + + file = chooser.getSelectedFile(); + } if (file != null) { String filePath = file.getAbsolutePath(); @@ -854,14 +889,6 @@ public class ProjectPanel extends JPanel { } } - /** - * Opens most recent project (loads project from user preferences) - */ - private void openRecentProject() { - File f = getRecentProject(); - openProjectFromFile(f); - } - /** * Loads most recent project from user preferences * @return File where project is saved, null if no project was found @@ -973,7 +1000,6 @@ public class ProjectPanel extends JPanel { private javax.swing.JButton analyseButton; private javax.swing.JPanel buttonsPanel; private javax.swing.JButton deselectAllButton; - private javax.swing.JScrollPane faceTableScrollPanel; private javax.swing.JButton inflateButton; private javax.swing.JButton newProjectButton; private javax.swing.JButton openProjectButton; @@ -981,5 +1007,6 @@ public class ProjectPanel extends JPanel { private javax.swing.JButton saveProjectButton; private javax.swing.JButton selectAllButton; private javax.swing.JTable table; + private javax.swing.JPanel tablePanel; // End of variables declaration//GEN-END:variables } diff --git a/GUI/src/main/java/cz/fidentis/analyst/project/ProjectTopComp.java b/GUI/src/main/java/cz/fidentis/analyst/project/ProjectTopComp.java index 06ae6879e7d23e8b12247f75312d4134590aaa93..ad98c996f180e8c9c8ce659a3da2fbb14fbf3b98 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/project/ProjectTopComp.java +++ b/GUI/src/main/java/cz/fidentis/analyst/project/ProjectTopComp.java @@ -108,7 +108,7 @@ public final class ProjectTopComp extends TopComponent { // Asks user whether he wants to create new project or open existing projectPanel.openExistingOrNewProject(); - + // Pass this class to installer so it can call method of this class on close Installer inst = new Installer(this); }