diff --git a/README.md b/README.md index d025768..e7c5e3e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # Projet TDS MASI 4 + --- # Ce qui a changé diff --git a/src/main/java/Main.java b/src/main/java/Main.java index eb73a46..fd71b26 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -4,7 +4,7 @@ import com.google.inject.Injector; import nu.pattern.OpenCV; import ui.implementation.components.nav.NavBar; import ui.implementation.views.MainView; -import ui.interfaces.IMainView; +import ui.abstractions.IMainView; import javax.swing.*; @@ -18,7 +18,6 @@ public class Main { Injector injector = Guice.createInjector(new AppModule()); SwingUtilities.invokeLater(() -> { - NavBar navBar = injector.getInstance(NavBar.class); MainView view = (MainView) injector.getInstance(IMainView.class); view.setNavBar(navBar); diff --git a/src/main/java/app/AppModule.java b/src/main/java/app/AppModule.java index 4c1ba76..12b015c 100644 --- a/src/main/java/app/AppModule.java +++ b/src/main/java/app/AppModule.java @@ -14,10 +14,10 @@ import ui.implementation.components.nav.NavBar; import ui.implementation.views.DoubleMatrix; import ui.implementation.views.FilteringView; import ui.implementation.views.MainView; -import ui.interfaces.IDoubleMatrix; -import ui.interfaces.IFilteringView; -import ui.interfaces.IMainView; -import ui.interfaces.INavBar; +import ui.abstractions.IDoubleMatrix; +import ui.abstractions.IFilteringView; +import ui.abstractions.IMainView; +import ui.abstractions.INavBar; /** * Gathers some configurations in order to set the dependency injection container up diff --git a/src/main/java/app/SwingNavigator.java b/src/main/java/app/SwingNavigator.java index 2f81574..a8f8522 100644 --- a/src/main/java/app/SwingNavigator.java +++ b/src/main/java/app/SwingNavigator.java @@ -4,6 +4,9 @@ import com.google.inject.Inject; import com.google.inject.Provider; import ui.implementation.views.DoubleMatrix; import ui.implementation.views.FilteringView; +import ui.implementation.views.ViewInitializer; + +import javax.swing.text.View; /** * Concrete implement of the INavigator interface. @@ -27,12 +30,14 @@ public class SwingNavigator implements INavigator { @Override public void showFourier() { DoubleMatrix doubleMatrix = doubleMatrixProvider.get(); + ViewInitializer.Initialize(doubleMatrix); doubleMatrix.setVisible(true); } @Override public void showFiltering() { FilteringView filteringView = filteringProvider.get(); + ViewInitializer.Initialize(filteringView); filteringView.setVisible(true); } } diff --git a/src/main/java/app/state/FilteringState.java b/src/main/java/app/state/FilteringState.java new file mode 100644 index 0000000..03d64ee --- /dev/null +++ b/src/main/java/app/state/FilteringState.java @@ -0,0 +1,27 @@ +package app.state; + +import com.google.common.eventbus.EventBus; +import com.google.inject.Inject; +import domain.events.filtering.HighPassChangedEvent; +import domain.events.filtering.LowPassChangedEvent; +import domain.events.fourier.ModuleChangedEvent; +import domain.image.GrayScaleMatrix; +import domain.image.Image; + +public class FilteringState extends State { + + private Image lowPass; + private Image highPass; + + @Inject + public FilteringState() { super(new EventBus()); } + + public void setLowPass(Image image) { + this.eventBus.post(new LowPassChangedEvent(image)); + } + + public void setHighPass(Image image) { + this.eventBus.post(new HighPassChangedEvent(image)); + } + +} diff --git a/src/main/java/domain/events/filtering/HighPassChangedEvent.java b/src/main/java/domain/events/filtering/HighPassChangedEvent.java new file mode 100644 index 0000000..4095576 --- /dev/null +++ b/src/main/java/domain/events/filtering/HighPassChangedEvent.java @@ -0,0 +1,5 @@ +package domain.events.filtering; + +import domain.image.Image; + +public record HighPassChangedEvent(Image image) { } \ No newline at end of file diff --git a/src/main/java/domain/events/filtering/LowPassChangedEvent.java b/src/main/java/domain/events/filtering/LowPassChangedEvent.java new file mode 100644 index 0000000..f5bbca4 --- /dev/null +++ b/src/main/java/domain/events/filtering/LowPassChangedEvent.java @@ -0,0 +1,5 @@ +package domain.events.filtering; + +import domain.image.Image; + +public record LowPassChangedEvent(Image image) { } \ No newline at end of file diff --git a/src/main/java/domain/image/processing/filtering/GlobalLinearFiltering.java b/src/main/java/domain/image/processing/filtering/GlobalLinearFiltering.java index a7f5d92..d04a52f 100644 --- a/src/main/java/domain/image/processing/filtering/GlobalLinearFiltering.java +++ b/src/main/java/domain/image/processing/filtering/GlobalLinearFiltering.java @@ -12,7 +12,7 @@ import java.util.List; public class GlobalLinearFiltering { - public static GrayScaleMatrix lowPassFiltering(GrayScaleMatrix matrix, int cutoff) { + public static GrayScaleMatrix lowPassFiltering(GrayScaleMatrix matrix, double cutoff) { int width = matrix.getWidth(); int height = matrix.getHeight(); @@ -97,7 +97,7 @@ public class GlobalLinearFiltering { return new GrayScaleMatrix(pixels); } - public static GrayScaleMatrix highPassFiltering(GrayScaleMatrix matrix, int cutoff){ + public static GrayScaleMatrix highPassFiltering(GrayScaleMatrix matrix, double cutoff){ int width = matrix.getWidth(); int height = matrix.getHeight(); diff --git a/src/main/java/presenters/DoubleMatrixPresenter.java b/src/main/java/presenters/DoubleMatrixPresenter.java index b21a629..5e1e232 100644 --- a/src/main/java/presenters/DoubleMatrixPresenter.java +++ b/src/main/java/presenters/DoubleMatrixPresenter.java @@ -11,7 +11,7 @@ import domain.image.GrayScaleMatrix; import domain.image.Image; import domain.image.processing.complex.ComplexMatrix; import services.ImageService; -import ui.interfaces.IDoubleMatrix; +import ui.abstractions.IDoubleMatrix; import java.io.IOException; diff --git a/src/main/java/presenters/FilteringPresenter.java b/src/main/java/presenters/FilteringPresenter.java index 2b656ce..51a55c5 100644 --- a/src/main/java/presenters/FilteringPresenter.java +++ b/src/main/java/presenters/FilteringPresenter.java @@ -1,21 +1,28 @@ package presenters; +import app.state.FilteringState; +import com.google.common.eventbus.Subscribe; import com.google.inject.Inject; +import domain.events.filtering.HighPassChangedEvent; +import domain.events.filtering.LowPassChangedEvent; import domain.image.GrayScaleMatrix; import domain.image.Image; import services.FilteringService; import services.ImageService; -import ui.implementation.views.FilteringView; -import ui.interfaces.IFilteringView; +import ui.abstractions.IFilteringView; public class FilteringPresenter { + private final FilteringState state; private final ImageService imageService; private final FilteringService filteringService; private IFilteringView view; @Inject - public FilteringPresenter(ImageService imageService, FilteringService filteringService) { + public FilteringPresenter(FilteringState state, ImageService imageService, FilteringService filteringService) { + this.state = state; + this.state.register(this); + this.imageService = imageService; this.filteringService = filteringService; } @@ -24,17 +31,25 @@ public class FilteringPresenter { this.view = view; } - public Image computeLowPassFiltering(){ + public void computeLowPassFiltering(int percentage){ GrayScaleMatrix matrix = imageService.getGrayScale(); - return filteringService.lowPassFiltering(matrix); + Image image = filteringService.lowPassFiltering(matrix, (double) percentage /100); + this.state.setLowPass(image); } - public Image computeHighPassFiltering(){ + public void computeHighPassFiltering(int percentage){ GrayScaleMatrix matrix = imageService.getGrayScale(); - return filteringService.highPassFiltering(matrix); + Image image = filteringService.highPassFiltering(matrix, (double) percentage /100); + this.state.setHighPass(image); } - public Image getImage(){ - return imageService.getImage(); + @Subscribe + public void onLowPassUpdate(LowPassChangedEvent event){ + view.updateLowPassFiltering(event.image()); + } + + @Subscribe + public void onHighPassUpdate(HighPassChangedEvent event){ + view.updateHighPassFiltering(event.image()); } } diff --git a/src/main/java/presenters/MainPresenter.java b/src/main/java/presenters/MainPresenter.java index ca33501..225a5d6 100644 --- a/src/main/java/presenters/MainPresenter.java +++ b/src/main/java/presenters/MainPresenter.java @@ -9,7 +9,7 @@ import domain.events.ModeChangedEvent; import domain.image.Image; import services.ImageService; import services.ModeService; -import ui.interfaces.IMainView; +import ui.abstractions.IMainView; /** * @author Laurent Crema diff --git a/src/main/java/presenters/NavPresenter.java b/src/main/java/presenters/NavPresenter.java index 01e1b8b..bec43f4 100644 --- a/src/main/java/presenters/NavPresenter.java +++ b/src/main/java/presenters/NavPresenter.java @@ -6,7 +6,7 @@ import domain.common.Mode; import domain.image.GrayScaleMatrix; import services.ImageService; import services.ModeService; -import ui.interfaces.INavBar; +import ui.abstractions.INavBar; import java.io.File; import java.io.IOException; diff --git a/src/main/java/services/FilteringService.java b/src/main/java/services/FilteringService.java index f966c26..0afd7cf 100644 --- a/src/main/java/services/FilteringService.java +++ b/src/main/java/services/FilteringService.java @@ -6,14 +6,20 @@ import domain.image.processing.filtering.GlobalLinearFiltering; public class FilteringService { - public Image lowPassFiltering(GrayScaleMatrix matrix) { - GrayScaleMatrix filteredMatrix = GlobalLinearFiltering.lowPassFiltering(matrix, 10); + public Image lowPassFiltering(GrayScaleMatrix matrix, double percentage) { + double cutoff = percentage * getMaxCutoff(matrix.getWidth(), matrix.getHeight()); + GrayScaleMatrix filteredMatrix = GlobalLinearFiltering.lowPassFiltering(matrix, cutoff); return filteredMatrix.toImage(); } - public Image highPassFiltering(GrayScaleMatrix matrix) { - GrayScaleMatrix filteredMatrix = GlobalLinearFiltering.highPassFiltering(matrix, 10); + public Image highPassFiltering(GrayScaleMatrix matrix, double percentage) { + double cutoff = percentage * getMaxCutoff(matrix.getWidth(), matrix.getHeight()); + GrayScaleMatrix filteredMatrix = GlobalLinearFiltering.highPassFiltering(matrix, cutoff); return filteredMatrix.toImage(); } + private double getMaxCutoff(int width, int height) { + return Math.sqrt(Math.pow(width / 2.0, 2) + Math.pow(height / 2.0, 2)); + } + } diff --git a/src/main/java/ui/abstractions/AbstractView.java b/src/main/java/ui/abstractions/AbstractView.java new file mode 100644 index 0000000..6145f67 --- /dev/null +++ b/src/main/java/ui/abstractions/AbstractView.java @@ -0,0 +1,8 @@ +package ui.abstractions; + +import javax.swing.*; + +public abstract class AbstractView extends JFrame { + public abstract void initComponents(); + public abstract void initValues(); +} diff --git a/src/main/java/ui/interfaces/IDoubleMatrix.java b/src/main/java/ui/abstractions/IDoubleMatrix.java similarity index 93% rename from src/main/java/ui/interfaces/IDoubleMatrix.java rename to src/main/java/ui/abstractions/IDoubleMatrix.java index 42ec9c3..d2c1bc8 100644 --- a/src/main/java/ui/interfaces/IDoubleMatrix.java +++ b/src/main/java/ui/abstractions/IDoubleMatrix.java @@ -1,4 +1,4 @@ -package ui.interfaces; +package ui.abstractions; import domain.image.GrayScaleMatrix; diff --git a/src/main/java/ui/abstractions/IFilteringView.java b/src/main/java/ui/abstractions/IFilteringView.java new file mode 100644 index 0000000..74c2ce1 --- /dev/null +++ b/src/main/java/ui/abstractions/IFilteringView.java @@ -0,0 +1,10 @@ +package ui.abstractions; + +import domain.image.Image; + +public interface IFilteringView { + void updateLowPassFiltering(Image image); + void updateHighPassFiltering(Image image); + void updateButterworthHighPassFiltering(Image image); + void updateButterworthLowPassFiltering(Image image); +} diff --git a/src/main/java/ui/interfaces/IMainView.java b/src/main/java/ui/abstractions/IMainView.java similarity index 53% rename from src/main/java/ui/interfaces/IMainView.java rename to src/main/java/ui/abstractions/IMainView.java index 54ed61b..da1f93c 100644 --- a/src/main/java/ui/interfaces/IMainView.java +++ b/src/main/java/ui/abstractions/IMainView.java @@ -1,11 +1,7 @@ -package ui.interfaces; +package ui.abstractions; import domain.common.Mode; import domain.image.Image; -import presenters.DoubleMatrixPresenter; -import presenters.MainPresenter; - -import java.awt.image.BufferedImage; public interface IMainView { diff --git a/src/main/java/ui/abstractions/INavBar.java b/src/main/java/ui/abstractions/INavBar.java new file mode 100644 index 0000000..cee9f24 --- /dev/null +++ b/src/main/java/ui/abstractions/INavBar.java @@ -0,0 +1,6 @@ +package ui.abstractions; + +public interface INavBar { + + +} diff --git a/src/main/java/ui/implementation/components/button/SaveButton.java b/src/main/java/ui/implementation/components/button/SaveButton.java new file mode 100644 index 0000000..554319a --- /dev/null +++ b/src/main/java/ui/implementation/components/button/SaveButton.java @@ -0,0 +1,14 @@ +package ui.implementation.components.button; + +import javax.swing.*; +import java.net.URL; +import java.util.Objects; + +public class SaveButton extends JButton { + + public SaveButton(){ + super(new ImageIcon()); + URL icon = Objects.requireNonNull(getClass().getResource("/dd_27_p3.jpg")); + setIcon(new ImageIcon(Objects.requireNonNull(icon))); + } +} diff --git a/src/main/java/ui/implementation/components/nav/NavBar.java b/src/main/java/ui/implementation/components/nav/NavBar.java index a0ea0c4..ac35a65 100644 --- a/src/main/java/ui/implementation/components/nav/NavBar.java +++ b/src/main/java/ui/implementation/components/nav/NavBar.java @@ -4,7 +4,6 @@ import domain.image.GrayScaleMatrix; import domain.image.processing.histogram.Histogramme; import domain.common.Mode; import jakarta.inject.Inject; -import jdk.jshell.spi.ExecutionControl; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartFrame; import org.jfree.chart.JFreeChart; @@ -18,7 +17,7 @@ import ui.implementation.components.intent.FileChooser; import ui.implementation.dialogs.ImageCreatorDialog; import ui.implementation.dialogs.GreyScaleImageCreatorDialog; import ui.implementation.dialogs.RGBImageCreatorDialog; -import ui.interfaces.INavBar; +import ui.abstractions.INavBar; import javax.swing.*; import java.awt.event.ActionEvent; @@ -83,11 +82,12 @@ public class NavBar extends JMenuBar implements INavBar { linearMenu = new Menu("Linéaire","/cp_51_p1.jpg", new Menu("Global", - new Menu("Formes", - new MenuItem("PasseBasIdeal", this::displayFilter), - new MenuItem("PasseHautIdeal", this::displayFilter), - new MenuItem("PasseBasButterworth", this::displayFilter), - new MenuItem("PasseHautButterworth", this::displayFilter) + new Menu("Ideal", + new MenuItem("Passe-bas", this::displayFilter), + new MenuItem("Passe-haut", this::displayFilter)), + new Menu("Butterworth", + new MenuItem("Passe-bas", this::displayFilter), + new MenuItem("Passe-haut", this::displayFilter) ) ) ); @@ -111,7 +111,7 @@ public class NavBar extends JMenuBar implements INavBar { //#################################################### private File chooseFile(){ - FileChooser chooser = new FileChooser("./"); + FileChooser chooser = new FileChooser("./src/main/resources"); int dialogResult = chooser.showOpenDialog(this); if (dialogResult != JFileChooser.APPROVE_OPTION) return null; diff --git a/src/main/java/ui/implementation/views/DoubleMatrix.java b/src/main/java/ui/implementation/views/DoubleMatrix.java index 45e922b..858bff0 100644 --- a/src/main/java/ui/implementation/views/DoubleMatrix.java +++ b/src/main/java/ui/implementation/views/DoubleMatrix.java @@ -1,17 +1,17 @@ package ui.implementation.views; import domain.image.GrayScaleMatrix; -import domain.image.Image; import jakarta.inject.Inject; import presenters.DoubleMatrixPresenter; +import ui.abstractions.AbstractView; +import ui.implementation.components.button.SaveButton; import ui.implementation.components.image.ImagePanel; import ui.implementation.components.intent.FileChooser; -import ui.interfaces.IDoubleMatrix; +import ui.abstractions.IDoubleMatrix; import java.awt.*; import java.awt.event.ActionEvent; import java.io.*; -import java.util.Objects; import javax.swing.*; import javax.swing.event.ChangeEvent; @@ -19,7 +19,7 @@ import javax.swing.event.ChangeEvent; /** * @author Jean-Marc Wagner, Laurent Crema */ -public class DoubleMatrix extends JFrame implements IDoubleMatrix +public class DoubleMatrix extends AbstractView implements IDoubleMatrix { private double normalizedWhite; private double normalizedBlack; @@ -32,6 +32,8 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix private ImagePanel realPreviewContainer; private ImagePanel imaginaryPreviewContainer; + private SaveButton saveButton; + private JSlider whiteSlider; private JTextField whiteTextField; private JLabel maxLabel; @@ -46,17 +48,16 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix public DoubleMatrix(DoubleMatrixPresenter presenter) { this.presenter = presenter; - initComponents(); - presenter.setView(this); - initValues(); } - private void initComponents() { - - modulePreviewContainer = new ImagePanel(); - phasePreviewContainer = new ImagePanel(); - realPreviewContainer = new ImagePanel(); - imaginaryPreviewContainer = new ImagePanel(); + @Override + public void initComponents() { + this.presenter.setView(this); + this.modulePreviewContainer = new ImagePanel(); + this.phasePreviewContainer = new ImagePanel(); + this.realPreviewContainer = new ImagePanel(); + this.imaginaryPreviewContainer = new ImagePanel(); + this.saveButton = new SaveButton(); blackSlider = buildSlider(); whiteSlider = buildSlider(); @@ -69,15 +70,6 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix JLabel minValueText = new JLabel("Valeur MIN :"); JLabel maxValueText = new JLabel("Valeur MAX :"); - JButton saveButton = new JButton(new ImageIcon(Objects.requireNonNull(getClass().getResource("/dd_27_p3.jpg")))); - saveButton.addActionListener(this::saveImage); - - blackSlider.addChangeListener(this::onValueUpdate); - whiteSlider.addChangeListener(this::onValueUpdate); - - blackTextField.addActionListener(this::jTextFieldNoirActionPerformed); - whiteTextField.addActionListener(this::jTextFieldBlancActionPerformed); - modeTab = buildModeTab(); buildLayout(modeTab, maxValueText, minValueText, minLabel, maxLabel, saveButton); @@ -86,11 +78,22 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix pack(); } - private void initValues(){ - modeTab.setSelectedIndex(1); + @Override + public void initValues(){ + this.presenter.setView(this); - blackSlider.setValue(0); - whiteSlider.setValue(1000); + this.modeTab.setSelectedIndex(1); + + this.blackSlider.setValue(0); + this.whiteSlider.setValue(1000); + + this.saveButton.addActionListener(this::saveImage); + + this.blackSlider.addChangeListener(this::onValueUpdate); + this.whiteSlider.addChangeListener(this::onValueUpdate); + + this.blackTextField.addActionListener(this::jTextFieldNoirActionPerformed); + this.whiteTextField.addActionListener(this::jTextFieldBlancActionPerformed); } private JSlider buildSlider() { @@ -224,7 +227,7 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix } private File chooseFile(){ - FileChooser chooser = new FileChooser("./"); + FileChooser chooser = new FileChooser("./src/main/resources"); int dialogResult = chooser.showOpenDialog(this); if (dialogResult != JFileChooser.APPROVE_OPTION) return null; diff --git a/src/main/java/ui/implementation/views/FilteringView.java b/src/main/java/ui/implementation/views/FilteringView.java index 40eb2cc..70d7718 100644 --- a/src/main/java/ui/implementation/views/FilteringView.java +++ b/src/main/java/ui/implementation/views/FilteringView.java @@ -1,58 +1,190 @@ package ui.implementation.views; import com.google.inject.Inject; +import domain.image.Image; import infrastructure.ui.ImageMapper; import presenters.FilteringPresenter; +import ui.abstractions.AbstractView; +import ui.implementation.components.button.SaveButton; import ui.implementation.components.image.ImagePanel; -import ui.interfaces.IFilteringView; +import ui.abstractions.IFilteringView; import javax.swing.*; -import java.awt.*; -import java.awt.image.BufferedImage; +import javax.swing.event.ChangeEvent; -public class FilteringView extends JFrame implements IFilteringView { +public class FilteringView extends AbstractView implements IFilteringView { - private ImagePanel imagePanel; + private ImagePanel lowPassContainer; + private ImagePanel highPassContainer; + private JTabbedPane modeTab; + private JSlider intensitySlider; + private JLabel intensityLabel; private final FilteringPresenter presenter; + private boolean isUpdating; @Inject public FilteringView(FilteringPresenter presenter) { this.presenter = presenter; - this.presenter.setView(this); - initComponents(); } - private void initComponents(){ - this.imagePanel = new ImagePanel(); - this.imagePanel.loadImage(ImageMapper.toBufferedImage(presenter.computeHighPassFiltering())); - buildLayout(); + @Override + public void initComponents(){ + this.lowPassContainer = new ImagePanel(); + this.highPassContainer = new ImagePanel(); + this.modeTab = buildModeTab(); + this.intensitySlider = new JSlider(0,100,0); + this.intensitySlider.setOrientation(JSlider.VERTICAL); + this.intensityLabel = new JLabel(); + JButton saveButton = new SaveButton(); + + saveButton.addActionListener(e -> {}); + + buildLayout(modeTab, intensityLabel, intensitySlider, saveButton); setTitle("Filtering"); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); pack(); } - private void buildLayout(){ - setLayout(new BorderLayout()); - add(imagePanel, BorderLayout.CENTER); + @Override + public void initValues(){ + this.presenter.setView(this); + + this.intensitySlider.setMinimum(0); + this.intensitySlider.setMaximum(100); + this.intensitySlider.setValue(50); + this.intensitySlider.addChangeListener(this::onCutoffUpdate); + + this.intensityLabel.setText(String.valueOf(intensitySlider.getValue())); + + this.modeTab.addChangeListener(e -> { + switch (modeTab.getSelectedIndex()) { + case 0 -> presenter.computeLowPassFiltering(intensitySlider.getValue()); + case 1 -> presenter.computeHighPassFiltering(intensitySlider.getValue()); + } + }); + + this.presenter.computeLowPassFiltering(intensitySlider.getValue()); + } + + private JTabbedPane buildModeTab(){ + JTabbedPane modeTabs = new JTabbedPane(); + modeTabs.addTab("Passe-bas", lowPassContainer); + modeTabs.addTab("Passe-haut", highPassContainer); + return modeTabs; + } + + private void buildLayout(JTabbedPane modeTab, + JLabel valueTextField, + JSlider intensitySlider, + JButton saveButton) { + + JPanel rightPanel = new JPanel(); + GroupLayout rightLayout = new GroupLayout(rightPanel); + rightPanel.setLayout(rightLayout); + + rightLayout.setHorizontalGroup( + rightLayout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(valueTextField, GroupLayout.PREFERRED_SIZE, 90, GroupLayout.PREFERRED_SIZE) + .addGroup(rightLayout.createSequentialGroup() + .addComponent(intensitySlider) + .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) + ) + ); + + rightLayout.setVerticalGroup( + rightLayout.createSequentialGroup() + .addComponent(valueTextField, GroupLayout.PREFERRED_SIZE, + GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addGroup(rightLayout.createParallelGroup(GroupLayout.Alignment.CENTER) + .addComponent(intensitySlider) + ) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + ); + + // ------------------------- + // MAIN LAYOUT + // ------------------------- + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + + // TOP BAR + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + //.addComponent(valeurMin) + .addGap(50) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + //.addComponent(valeurMax) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, + GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(saveButton) + .addContainerGap() + ) + + // MAIN ROW + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(modeTab, 400, 400, Short.MAX_VALUE) + .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(rightPanel, GroupLayout.PREFERRED_SIZE, + GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addContainerGap() + ) + ); + + layout.setVerticalGroup( + layout.createSequentialGroup() + + // TOP BAR + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(saveButton) + ) + + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + + // MAIN CONTENT + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(modeTab) + .addComponent(rightPanel) + ) + ); + } + + private void onCutoffUpdate(ChangeEvent e) { + if (isUpdating) return; + isUpdating = true; + try { + this.intensityLabel.setText(String.valueOf(intensitySlider.getValue())); + switch (modeTab.getSelectedIndex()) { + case 0 -> presenter.computeLowPassFiltering(intensitySlider.getValue()); + case 1 -> presenter.computeHighPassFiltering(intensitySlider.getValue()); + } + } finally { + isUpdating = false; + } } @Override - public void updateLowPassFiltering(BufferedImage image) { - this.imagePanel.loadImage(image); + public void updateLowPassFiltering(Image image) { + lowPassContainer.loadImage(ImageMapper.toBufferedImage(image)); } @Override - public void updateHighPassFiltering(BufferedImage image) { + public void updateHighPassFiltering(Image image) { + highPassContainer.loadImage(ImageMapper.toBufferedImage(image)); + } + + @Override + public void updateButterworthHighPassFiltering(Image image) { } @Override - public void updateButterworthHighPassFiltering(BufferedImage image) { - - } - - @Override - public void updateButterworthLowPassFiltering(BufferedImage image) { + public void updateButterworthLowPassFiltering(Image image) { } } diff --git a/src/main/java/ui/implementation/views/MainView.java b/src/main/java/ui/implementation/views/MainView.java index 3251daa..9f4a5bd 100644 --- a/src/main/java/ui/implementation/views/MainView.java +++ b/src/main/java/ui/implementation/views/MainView.java @@ -7,7 +7,7 @@ import infrastructure.ui.ImageMapper; import presenters.MainPresenter; import ui.implementation.components.image.ImagePanel; import ui.implementation.components.nav.NavBar; -import ui.interfaces.IMainView; +import ui.abstractions.IMainView; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/ui/implementation/views/ViewInitializer.java b/src/main/java/ui/implementation/views/ViewInitializer.java new file mode 100644 index 0000000..e33f799 --- /dev/null +++ b/src/main/java/ui/implementation/views/ViewInitializer.java @@ -0,0 +1,11 @@ +package ui.implementation.views; + +import ui.abstractions.AbstractView; + +public class ViewInitializer { + + public static void Initialize(AbstractView view) { + view.initComponents(); + view.initValues(); + } +} diff --git a/src/main/java/ui/interfaces/IFilteringView.java b/src/main/java/ui/interfaces/IFilteringView.java deleted file mode 100644 index 0ed228f..0000000 --- a/src/main/java/ui/interfaces/IFilteringView.java +++ /dev/null @@ -1,10 +0,0 @@ -package ui.interfaces; - -import java.awt.image.BufferedImage; - -public interface IFilteringView { - void updateLowPassFiltering(BufferedImage image); - void updateHighPassFiltering(BufferedImage image); - void updateButterworthHighPassFiltering(BufferedImage image); - void updateButterworthLowPassFiltering(BufferedImage image); -} diff --git a/src/main/java/ui/interfaces/INavBar.java b/src/main/java/ui/interfaces/INavBar.java deleted file mode 100644 index 7f9b597..0000000 --- a/src/main/java/ui/interfaces/INavBar.java +++ /dev/null @@ -1,8 +0,0 @@ -package ui.interfaces; - -import presenters.NavPresenter; - -public interface INavBar { - - -}