/*
* Copyright 2017 Laszlo Balazs-Csiki
*
* This file is part of Pixelitor. Pixelitor is free software: you
* can redistribute it and/or modify it under the terms of the GNU
* General Public License, version 3 as published by the Free
* Software Foundation.
*
* Pixelitor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pixelitor. If not, see <http://www.gnu.org/licenses/>.
*/
package pixelitor.filters.gui;
import pixelitor.gui.utils.SliderSpinner;
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Dimension;
import static pixelitor.gui.utils.SliderSpinner.TextPosition.NORTH;
/**
* The GUI component for an ImagePositionParam
*/
public class ImagePositionParamGUI extends JPanel implements ParamGUI {
private final ImagePositionParam model;
private final RangeParam xSliderModel;
private final RangeParam ySliderModel;
private final ImagePositionSelector imagePositionSelector;
private boolean slidersMovedByUser = true;
private final JComponent xSlider;
private final JComponent ySlider;
public ImagePositionParamGUI(ImagePositionParam model, int defaultX, int defaultY) {
this.model = model;
xSliderModel = new RangeParam("Horizontal Position (%)", 0, defaultX, 100, true, NORTH);
ySliderModel = new RangeParam("Vertical Position (%)", 0, defaultY, 100, true, NORTH);
setBorder(BorderFactory.createTitledBorder(model.getName()));
setLayout(new BorderLayout(10, 0));
// add the image position selector
imagePositionSelector = new ImagePositionSelector(this, model, 100);
add(imagePositionSelector, BorderLayout.WEST);
// add the two sliders
Box verticalBox = Box.createVerticalBox();
xSlider = new SliderSpinner(xSliderModel, NORTH, true);
verticalBox.add(xSlider);
ySlider = new SliderSpinner(ySliderModel, NORTH, true);
verticalBox.add(ySlider);
add(verticalBox, BorderLayout.CENTER);
setupPreferredSize();
linkSliderChangesToModel(model);
}
private void setupPreferredSize() {
Dimension origPS = getPreferredSize();
Dimension sliderPS = xSlider.getPreferredSize();
setPreferredSize(new Dimension(sliderPS.width, origPS.height));
}
// if one of the sliders was moved by the users, update the
// image position selector and run the filter
private void linkSliderChangesToModel(ImagePositionParam model) {
xSliderModel.addChangeListener(e -> {
if (slidersMovedByUser) {
model.setRelativeX(xSliderModel.getValue() / 100.0f, xSliderModel.getValueIsAdjusting());
imagePositionSelector.repaint();
}
});
ySliderModel.addChangeListener(e -> {
if (slidersMovedByUser) {
model.setRelativeY(ySliderModel.getValue() / 100.0f, ySliderModel.getValueIsAdjusting());
imagePositionSelector.repaint();
}
});
}
/**
* Updates the sliders based on the model changes.
* This does not trigger the execution of the filter
*/
public void updateSlidersFromModel() {
slidersMovedByUser = false;
int xValue = xSliderModel.getValue();
int modelXValue = (int) (model.getRelativeX() * 100);
if (modelXValue != xValue) {
xSliderModel.setValue(modelXValue);
}
int yValue = ySliderModel.getValue();
int modelYValue = (int) (model.getRelativeY() * 100);
if (modelYValue != yValue) {
ySliderModel.setValue(modelYValue);
}
slidersMovedByUser = true;
}
@Override
public void updateGUI() {
updateSlidersFromModel();
imagePositionSelector.repaint();
}
@Override
public void setEnabled(boolean enabled) {
imagePositionSelector.setEnabled(enabled);
xSlider.setEnabled(enabled);
ySlider.setEnabled(enabled);
super.setEnabled(enabled);
}
@Override
public void setToolTip(String tip) {
// TODO should have some generic tooltip
}
}