Commit 6aa7c19e authored by Radek Ošlejšek's avatar Radek Ošlejšek
Browse files

Added 3-state button to the rendering toolbar

parent 4c4bf4ee
Loading
Loading
Loading
Loading
+0 −139
Original line number Diff line number Diff line
package cz.fidentis.analyst.gui.core;

import com.jogamp.opengl.GL2;
import cz.fidentis.analyst.gui.canvas.Canvas;
import cz.fidentis.analyst.gui.scene.DrawableMesh;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
import org.openide.awt.Mnemonics;

/**
 * Rendering toolbar.
 * 
 * @author Radek Oslejsek
 */
public class RenderingToolBar extends JToolBar {
    
    public static final int WIDTH = 48;
    public static final Color REFLECTIONS_COLOR = Color.DARK_GRAY;
    
    public enum Button {
        WIREFRAME,  // wire-frame vs. filled triangles
        BACKGROUND, // light vs. dark background
        REFLECTIONS; // ligths producing reflections on surface
        
        @Override
        public String toString() {
            switch (this) {
                default:
                    return super.toString().toLowerCase();
            }
        }
    }

    private final Map<Button, JButton> buttons = new HashMap<>();
    
    private final Canvas canvas;
    
    public RenderingToolBar(Canvas canvas) {
        this.canvas = canvas;
        initToolBar();
        initButtons();
        initEvents();
    }
    
    private void initToolBar() {
        setOrientation(javax.swing.SwingConstants.VERTICAL);
        setRollover(true);
        setFloatable(false);
    }
    
    private void initButtons() {
        for (Button butEnum: Button.values()) {
            JButton button = new JButton();
            URL icon = getClass().getResource("/" + butEnum + "28x28.png");
            if (icon != null) {
                button.setIcon(new ImageIcon(icon));
            }
            Mnemonics.setLocalizedText(button, org.openide.util.NbBundle.getMessage(RenderingToolBar.class, "RenderingToolBar." + butEnum +".text"));
            button.setFocusable(false);
            button.setText(null);
            button.setToolTipText(butEnum.toString());
            button.setHorizontalTextPosition(SwingConstants.CENTER);
            button.setVerticalTextPosition(SwingConstants.BOTTOM);
            buttons.put(butEnum, button);
            add(button);
        }
    }
    
    private void initEvents() {
        for (Button butEnum: Button.values()) {
            JButton button = buttons.get(butEnum);
            
            button.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent evt) {
                    switch (butEnum) {
                        case WIREFRAME:
                            wireframeButtonClicked(evt);
                            break;
                        case BACKGROUND:
                            backgroundButtonClicked(evt);
                            break;
                        case REFLECTIONS:
                            reflectionsButtonClicked(evt);
                            break;
                    }
                }
            });
        }
    }
    
    private void wireframeButtonClicked(MouseEvent evt) {
        boolean on = buttons.get(Button.WIREFRAME).isSelected();
        for (DrawableMesh dm: canvas.getScene().getDrawables()) {
            if (on) {
                dm.setRenderMode(GL2.GL_FILL);
                buttons.get(Button.WIREFRAME).setSelected(false);
            } else {
                dm.setRenderMode(GL2.GL_LINE);
                buttons.get(Button.WIREFRAME).setSelected(true);
            }
        }
        canvas.renderScene();
    }
    
    private void backgroundButtonClicked(MouseEvent evt) {
        boolean on = buttons.get(Button.BACKGROUND).isSelected();
        if (on) {
            canvas.getSceneRenderer().setDarkBackground();
            buttons.get(Button.BACKGROUND).setSelected(false);
        } else {
            canvas.getSceneRenderer().setBrightBackground();
            buttons.get(Button.BACKGROUND).setSelected(true);
        }
        canvas.renderScene();
    }
    
    private void reflectionsButtonClicked(MouseEvent evt) {
        boolean on = buttons.get(Button.REFLECTIONS).isSelected();
        for (DrawableMesh dm: canvas.getScene().getDrawables()) {
            if (on) {
                dm.setHighlights(Color.BLACK);
                buttons.get(Button.REFLECTIONS).setSelected(false);
            } else {
                dm.setHighlights(REFLECTIONS_COLOR);
                buttons.get(Button.REFLECTIONS).setSelected(true);
            }
        }
        canvas.renderScene();
    }
}
+36 −0
Original line number Diff line number Diff line
package cz.fidentis.analyst.gui.rndtoolbar;

import cz.fidentis.analyst.gui.canvas.Canvas;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JToggleButton;

/**
 * Switches between bark and blight background of the scene.
 * 
 * @author Radek Oslejsek
 */
public class BackgroundAction extends AbstractAction {
    
    private final Canvas canvas;
    
    /**
     * Constructor.
     * @param canvas OpenGL canvas
     */
    public BackgroundAction(Canvas canvas) {
        this.canvas = canvas;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        JToggleButton button = (JToggleButton) e.getSource();
        if (button.isSelected()) {
            canvas.getSceneRenderer().setBrightBackground();
        } else {
            canvas.getSceneRenderer().setDarkBackground();
        }
        canvas.renderScene();
    }
    
}
+34 −0
Original line number Diff line number Diff line
package cz.fidentis.analyst.gui.rndtoolbar;

import com.jogamp.opengl.GL2;
import cz.fidentis.analyst.gui.canvas.Canvas;
import cz.fidentis.analyst.gui.scene.DrawableMesh;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;

/**
 * Turns on the rending mode that draws triangle vertices only.
 * 
 * @author Radek Oslejsek
 */
public class PointCloudRenderingAction extends AbstractAction   {

    private final Canvas canvas;

    /**
     * Constructor.
     * @param canvas OpenGL canvas
     */
    public PointCloudRenderingAction(Canvas canvas) {
        this.canvas = canvas;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        for (DrawableMesh dm: canvas.getScene().getDrawables()) {
            dm.setRenderMode(GL2.GL_POINT);
        }
        canvas.renderScene();
    }
    
}
+40 −0
Original line number Diff line number Diff line
package cz.fidentis.analyst.gui.rndtoolbar;

import cz.fidentis.analyst.gui.canvas.Canvas;
import static cz.fidentis.analyst.gui.rndtoolbar.RenderingToolBar.REFLECTIONS_COLOR;
import cz.fidentis.analyst.gui.scene.DrawableMesh;
import java.awt.Color;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JToggleButton;

/**
 * Switches on/off surface reflections.
 * 
 * @author Radek Oslejsek
 */
public class ReflectionsAction extends AbstractAction {
    
    private final Canvas canvas;
    
    /**
     * Constructor.
     * @param canvas OpenGL canvas
     */
    public ReflectionsAction(Canvas canvas) {
        this.canvas = canvas;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        JToggleButton button = (JToggleButton) e.getSource();
        for (DrawableMesh dm: canvas.getScene().getDrawables()) {
            if (button.isSelected()) {
                dm.setHighlights(REFLECTIONS_COLOR);
            } else {
                dm.setHighlights(Color.BLACK);
            }
        }
        canvas.renderScene();
    }
}
+137 −0
Original line number Diff line number Diff line
package cz.fidentis.analyst.gui.rndtoolbar;

import com.jogamp.opengl.GL2;
import cz.fidentis.analyst.gui.canvas.Canvas;
import cz.fidentis.analyst.gui.scene.DrawableMesh;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
import org.openide.awt.Actions;
import org.openide.awt.DropDownButtonFactory;
import org.openide.awt.Mnemonics;
import org.openide.util.NbBundle;

/**
 * Rendering toolbar.
 * 
 * @author Radek Oslejsek
 */
public class RenderingToolBar extends JToolBar {
    
    public static final int WIDTH = 58;
    public static final Color REFLECTIONS_COLOR = Color.DARK_GRAY;
    
    public static final String RENDERING_MODE_BUTTON_ICON = "wireframe28x28.png";
    public static final String BACKGROUND_BUTTON_ICON = "background28x28.png";
    public static final String REFLECTIONS_BUTTON_ICON = "reflections28x28.png";
    
    private final Canvas canvas;
    
    public RenderingToolBar(Canvas canvas) {
        this.canvas = canvas;
        initToolBar();
        initBackgroundButton();
        initReflectionsButton();
        initRenderingModeButton();
    }
    
    private void initToolBar() {
        setOrientation(javax.swing.SwingConstants.VERTICAL);
        setRollover(true);
        setFloatable(false);
    }
    
    private void initRenderingModeButton() {
        JPopupMenu popup = new JPopupMenu();
        
        JMenuItem menuItem1 = new JMenuItem(new SmoothRenderingAction(canvas));
        JMenuItem menuItem2 = new JMenuItem(new WireframeRenderingAction(canvas));
        JMenuItem menuItem3 = new JMenuItem(new PointCloudRenderingAction(canvas));
        
        //menuItem1.setIcon(defaultIcon);
        menuItem1.setText(NbBundle.getMessage(RenderingToolBar.class, "RenderingToolBar.smooth.text"));
        menuItem2.setText(NbBundle.getMessage(RenderingToolBar.class, "RenderingToolBar.wireframe.text"));
        menuItem3.setText(NbBundle.getMessage(RenderingToolBar.class, "RenderingToolBar.pointcloud.text"));
        
        popup.add(menuItem1);
        popup.add(menuItem2);
        popup.add(menuItem3);

        // The button that will display the default action and the
        // dropdown arrow
        JButton button = DropDownButtonFactory.createDropDownButton(
                new ImageIcon(new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB)), 
                popup);
        
        URL icon = getClass().getResource("/" + RenderingToolBar.RENDERING_MODE_BUTTON_ICON);
        if (icon != null) {
            button.setIcon(new ImageIcon(icon));
        }
        
        //Mnemonics.setLocalizedText(button, NbBundle.getMessage(RenderingToolBar.class, "RenderingToolBar.renderingmode.text"));
        button.setToolTipText(NbBundle.getMessage(RenderingToolBar.class, "RenderingToolBar.renderingmode.text"));
        button.setFocusable(false);
        //button.setText(null);
        add(button);
    }
    
    private void initBackgroundButton() {
        JToggleButton button = new JToggleButton();
        button.setAction(new BackgroundAction(canvas));
        URL icon = getClass().getResource("/" + RenderingToolBar.BACKGROUND_BUTTON_ICON);
        if (icon != null) {
            button.setIcon(new ImageIcon(icon));
        }
        //Mnemonics.setLocalizedText(button, NbBundle.getMessage(RenderingToolBar.class, "RenderingToolBar.background.text"));
        button.setFocusable(false);
       // button.setText(null);
        button.setToolTipText(NbBundle.getMessage(RenderingToolBar.class, "RenderingToolBar.background.text"));
        add(button);
    }
    
    private void initReflectionsButton() {
        JToggleButton button = new JToggleButton();
        button.setAction(new ReflectionsAction(canvas));
        URL icon = getClass().getResource("/" + RenderingToolBar.REFLECTIONS_BUTTON_ICON);
        if (icon != null) {
            button.setIcon(new ImageIcon(icon));
        }
        //Mnemonics.setLocalizedText(button, NbBundle.getMessage(RenderingToolBar.class, "RenderingToolBar.background.text"));
        button.setFocusable(false);
       // button.setText(null);
        button.setToolTipText(NbBundle.getMessage(RenderingToolBar.class, "RenderingToolBar.reflections.text"));
        add(button);
    }
    

    /*
    private void reflectionsButtonClicked(MouseEvent evt) {
        boolean on = buttons.get(Button.REFLECTIONS).isSelected();
        for (DrawableMesh dm: canvas.getScene().getDrawables()) {
            if (on) {
                dm.setHighlights(Color.BLACK);
                buttons.get(Button.REFLECTIONS).setSelected(false);
            } else {
                dm.setHighlights(REFLECTIONS_COLOR);
                buttons.get(Button.REFLECTIONS).setSelected(true);
            }
        }
        canvas.renderScene();
    }
*/
}
Loading