diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/app/WorkspaceService.java b/src/main/java/dev/mateuszkowalczyk/ffm/app/WorkspaceService.java index 32567d6..e3c9eda 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/app/WorkspaceService.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/app/WorkspaceService.java @@ -34,7 +34,7 @@ public class WorkspaceService { public void loadImages() { if (imagesContainerController != null) { Platform.runLater(() -> {this.imagesContainerController.clearImages();}); - var t = new Thread(new WorkspaceWrapper()); + var t = new Thread(WorkspaceWrapper.getInstance()); t.start(); } else { System.out.println("Cannot load images if imagesContainerController isn't exists"); diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/app/WorkspaceWrapper.java b/src/main/java/dev/mateuszkowalczyk/ffm/app/WorkspaceWrapper.java index 0aa8a3f..0d0c463 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/app/WorkspaceWrapper.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/app/WorkspaceWrapper.java @@ -6,20 +6,29 @@ import dev.mateuszkowalczyk.ffm.data.database.photo.PhotoDAO; import javafx.scene.image.Image; import javafx.scene.image.ImageView; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileNotFoundException; import java.util.List; public class WorkspaceWrapper implements Runnable { + private static WorkspaceWrapper instance = new WorkspaceWrapper(); private PhotoDAO photoDAO = PhotoDAO.getInstance(); private ThumbnailCacheService thumbnailCacheService = ThumbnailCacheService.getInstance(); private WorkspaceService workspaceService = WorkspaceService.getInstance(); + private Thread directoryScannerThread; + + private WorkspaceWrapper () {} @Override public void run() { this.setFromDatabase(); - new DirectoryScanner().run(); + + if (this.directoryScannerThread == null || !this.directoryScannerThread.isAlive()) { + this.directoryScannerThread = new Thread(new DirectoryScanner()); + this.directoryScannerThread.start(); + } + } + + public static WorkspaceWrapper getInstance() { + return instance; } private void setFromDatabase() { diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/app/cache/FacesCacheService.java b/src/main/java/dev/mateuszkowalczyk/ffm/app/cache/FacesCacheService.java index 43f2e7e..abefab1 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/app/cache/FacesCacheService.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/app/cache/FacesCacheService.java @@ -59,4 +59,16 @@ public class FacesCacheService implements Runnable { } } } + + public BufferedImage getFaceImage(Face face) { + File file = new File(face.getPath()); + BufferedImage image = null; + try { + image = ImageIO.read(file); + } catch (IOException e) { + e.printStackTrace(); + } + + return image; + } } diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/app/people/PeopleWorkspace.java b/src/main/java/dev/mateuszkowalczyk/ffm/app/people/PeopleWorkspace.java index 1e56485..72d9fd8 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/app/people/PeopleWorkspace.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/app/people/PeopleWorkspace.java @@ -5,8 +5,10 @@ import dev.mateuszkowalczyk.ffm.data.database.person.PersonDAO; import dev.mateuszkowalczyk.ffm.utils.ResourceLoader; import dev.mateuszkowalczyk.ffm.view.workspace.elements.people.PeopleContainerController; import dev.mateuszkowalczyk.ffm.view.workspace.elements.people.PeopleController; +import dev.mateuszkowalczyk.ffm.view.workspace.elements.people.PersonPaneController; import javafx.fxml.FXMLLoader; import javafx.scene.Node; +import javafx.scene.control.Button; import java.io.IOException; @@ -33,7 +35,13 @@ public class PeopleWorkspace { for (Person person : list) { Node node = null; try { - node = FXMLLoader.load(ResourceLoader.getInstance().getResource("templates/workspace/elements/person_pane.fxml")); + FXMLLoader fxmlLoader = new FXMLLoader(); + fxmlLoader.setController(new PersonPaneController(person)); + fxmlLoader.setLocation((ResourceLoader.getInstance().getResource("templates/workspace/elements/person_pane.fxml"))); +// node = FXMLLoader.load); + + node = fxmlLoader.load(); +// node = new Button(); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/data/DatabaseService.java b/src/main/java/dev/mateuszkowalczyk/ffm/data/DatabaseService.java index b3f19b2..c2cd0f9 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/data/DatabaseService.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/data/DatabaseService.java @@ -7,25 +7,37 @@ import dev.mateuszkowalczyk.ffm.utils.ResourceLoader; import java.io.File; import java.sql.Connection; import java.sql.DriverManager; +import java.sql.ResultSet; import java.sql.SQLException; public class DatabaseService { + private final String path; private ResourceLoader resourceLoader = ResourceLoader.getInstance(); private CacheService cacheService = CacheService.getInstance(); private static final DatabaseService instance = new DatabaseService(); private Connection connection; private DatabaseService() { + this.path = this.cacheService.getPath("app.db"); this.checkIfDatabaseExists(); } private void checkIfDatabaseExists() { - String path = this.cacheService.getPath("app.db"); - var file = new File(path); + var file = new File(this.path); if (!file.exists()) { DatabaseCreator creator = new DatabaseCreator(); - this.connection = creator.create(path); + this.connection = creator.create(this.path); + + try { + ResultSet resultSet = this.connection.prepareStatement("SELECT name FROM sqlite_master WHERE type ='table' AND name NOT LIKE 'sqlite_%';").executeQuery(); + + while (resultSet.next()) { + System.out.println(resultSet.getString("name")); + } + } catch (SQLException e) { + e.printStackTrace(); + } } else { this.connect(); } @@ -37,13 +49,22 @@ public class DatabaseService { public void connect() { if (this.connection == null) { - String path = ResourceLoader.getInstance().getPath("app.db"); try { - this.connection = DriverManager.getConnection("jdbc:sqlite:" + path); + this.connection = DriverManager.getConnection("jdbc:sqlite:" + this.path); } catch (SQLException e) { System.out.println(e.getMessage()); } + + try { + ResultSet resultSet = this.connection.prepareStatement("SELECT name FROM sqlite_master WHERE type ='table' AND name NOT LIKE 'sqlite_%';").executeQuery(); + + while (resultSet.next()) { + System.out.println(resultSet.getString("name")); + } + } catch (SQLException e) { + e.printStackTrace(); + } } } diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/Face.java b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/Face.java index c1a456b..d02eb4e 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/Face.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/Face.java @@ -6,6 +6,7 @@ import dev.mateuszkowalczyk.ffm.data.database.annotation.PrimaryKey; import dev.mateuszkowalczyk.ffm.data.database.annotation.Table; import org.opencv.core.Mat; +import java.awt.image.BufferedImage; import java.sql.ResultSet; import java.sql.SQLException; import java.util.UUID; @@ -24,10 +25,14 @@ public class Face { @Column(type = Column.Type.INT) private long photoId; + @Column(type = Column.Type.INT) private long personId; + private Mat faceToProcess; + private BufferedImage faceImage; + public Face() { this.name = UUID.randomUUID().toString(); } @@ -89,7 +94,21 @@ public class Face { return faceToProcess; } + public void setFaceToProcess(Mat faceToProcess) { this.faceToProcess = faceToProcess; } + + public BufferedImage getFaceImage() { + if (this.faceImage == null) { + FacesCacheService facesCacheService = new FacesCacheService(); + this.faceImage = facesCacheService.getFaceImage(this); + } + + return faceImage; + } + + public void setFaceImage(BufferedImage faceImage) { + this.faceImage = faceImage; + } } diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/FaceDAO.java b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/FaceDAO.java index 77aa995..93aea69 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/FaceDAO.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/face/FaceDAO.java @@ -2,6 +2,7 @@ package dev.mateuszkowalczyk.ffm.data.database.face; import dev.mateuszkowalczyk.ffm.data.DatabaseService; import dev.mateuszkowalczyk.ffm.data.database.Dao; +import dev.mateuszkowalczyk.ffm.data.database.person.Person; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -95,4 +96,26 @@ public class FaceDAO implements Dao { public void delete(Face face) { } + + public Face getFirstFace(Person person) { + String sql = "SELECT * FROM face WHERE face.personId = :personId LIMIT 1"; + + try { + PreparedStatement preparedStatement = this.databaseService.getConnection().prepareStatement(sql); + preparedStatement.setLong(1, person.getId()); + + ResultSet resultSet = preparedStatement.executeQuery(); + + Face face = null; + while(resultSet.next()) { + face = new Face(resultSet); + + return face; + } + } catch (SQLException e) { + e.printStackTrace(); + } + + return null; + } } diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/person/Person.java b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/person/Person.java index 398f4dd..2c66dc6 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/person/Person.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/person/Person.java @@ -8,7 +8,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.UUID; -@Table +@Table(name = "persons") public class Person { @PrimaryKey @Column(type = Column.Type.INT) diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/person/PersonDAO.java b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/person/PersonDAO.java index ffb2398..c61e4a7 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/data/database/person/PersonDAO.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/data/database/person/PersonDAO.java @@ -2,6 +2,7 @@ package dev.mateuszkowalczyk.ffm.data.database.person; import dev.mateuszkowalczyk.ffm.data.DatabaseService; import dev.mateuszkowalczyk.ffm.data.database.Dao; +import dev.mateuszkowalczyk.ffm.data.database.face.Face; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -38,7 +39,7 @@ public class PersonDAO implements Dao { @Override public List getAll(boolean refresh) { if (this.personList.size() == 0 || refresh) { - String sql = "SELECT * FROM person"; + String sql = "SELECT * FROM persons"; try { PreparedStatement preparedStatement = this.databaseService.getConnection().prepareStatement(sql); ResultSet resultSet = preparedStatement.executeQuery(); @@ -57,14 +58,14 @@ public class PersonDAO implements Dao { @Override public void add(Person person) { - String sql = "INSERT INTO person (name) values(?)"; + String sql = "INSERT INTO persons (name) values(?)"; try { PreparedStatement preparedStatement = databaseService.getConnection().prepareStatement(sql); preparedStatement.setString(1, person.getName()); preparedStatement.executeUpdate(); - sql = "SELECT id FROM person ORDER BY id DESC LIMIT 1"; + sql = "SELECT id FROM persons ORDER BY id DESC LIMIT 1"; ResultSet resultSet = databaseService.getConnection().prepareStatement(sql).executeQuery(); diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/image/FaceDetector.java b/src/main/java/dev/mateuszkowalczyk/ffm/image/FaceDetector.java index 4b6906d..eb37f63 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/image/FaceDetector.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/image/FaceDetector.java @@ -55,7 +55,7 @@ public class FaceDetector { Imgproc.cvtColor(imageMat, imageGrey, Imgproc.COLOR_RGB2GRAY); MatOfRect matOfRect = new MatOfRect(); - cascadeClassifier.detectMultiScale(imageGrey, matOfRect, 1.10, 6); + cascadeClassifier.detectMultiScale(imageGrey, matOfRect, 1.10, 8); try { BufferedImage bufferedImage = ImageIO.read(new File(this.photo.getPath())); diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/view/workspace/elements/people/PeopleContainerController.java b/src/main/java/dev/mateuszkowalczyk/ffm/view/workspace/elements/people/PeopleContainerController.java index f9f3e85..35ac015 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/view/workspace/elements/people/PeopleContainerController.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/view/workspace/elements/people/PeopleContainerController.java @@ -14,6 +14,7 @@ import java.util.ResourceBundle; public class PeopleContainerController implements Initializable { private PeopleWorkspace peopleWorkspace = PeopleWorkspace.getInstance(); + private Integer numberOfAdded = 0; @FXML public GridPane peopleContainer; @@ -23,7 +24,16 @@ public class PeopleContainerController implements Initializable { } public void addPerson(Node node, int i) { - this.peopleContainer.getChildren().add(i, node); + this.peopleContainer.add(node, getX(), getY()); + numberOfAdded++; + } + + public Integer getX() { + return this.numberOfAdded % 2; + } + + public Integer getY() { + return (Integer) this.numberOfAdded / 2; } @Override diff --git a/src/main/java/dev/mateuszkowalczyk/ffm/view/workspace/elements/people/PersonPaneController.java b/src/main/java/dev/mateuszkowalczyk/ffm/view/workspace/elements/people/PersonPaneController.java index 8460690..cb9499f 100644 --- a/src/main/java/dev/mateuszkowalczyk/ffm/view/workspace/elements/people/PersonPaneController.java +++ b/src/main/java/dev/mateuszkowalczyk/ffm/view/workspace/elements/people/PersonPaneController.java @@ -1,7 +1,54 @@ package dev.mateuszkowalczyk.ffm.view.workspace.elements.people; -public class PersonPaneController { +import dev.mateuszkowalczyk.ffm.data.database.face.Face; +import dev.mateuszkowalczyk.ffm.data.database.face.FaceDAO; +import dev.mateuszkowalczyk.ffm.data.database.person.Person; +import dev.mateuszkowalczyk.ffm.data.database.person.PersonDAO; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.text.Text; + +import javax.imageio.ImageIO; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.ResourceBundle; + +public class PersonPaneController implements Initializable { + private FaceDAO faceDAO = FaceDAO.getInstance(); + private Person person; + @FXML + private Text personName; + @FXML + private ImageView faceImage; + public PersonPaneController () { System.out.println("Hi person"); } + + public PersonPaneController(Person person) { + this.person = person; + } + + public void editPerson(ActionEvent actionEvent) { + + } + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + this.personName.setText(person.getName()); + var face = this.faceDAO.getFirstFace(person); + + this.setFace(face); + } + + private void setFace(Face face) { +// File file = new File(face.getPath()); + Image image = new Image("file:" + face.getPath()); + + this.faceImage.setImage(image); + } } diff --git a/src/main/resources/templates/workspace/elements/people_container.fxml b/src/main/resources/templates/workspace/elements/people_container.fxml index 9273446..48e233d 100644 --- a/src/main/resources/templates/workspace/elements/people_container.fxml +++ b/src/main/resources/templates/workspace/elements/people_container.fxml @@ -4,14 +4,12 @@ - + - - - + diff --git a/src/main/resources/templates/workspace/elements/person_pane.fxml b/src/main/resources/templates/workspace/elements/person_pane.fxml index a711862..aff2f87 100644 --- a/src/main/resources/templates/workspace/elements/person_pane.fxml +++ b/src/main/resources/templates/workspace/elements/person_pane.fxml @@ -5,11 +5,10 @@ - - + - - -