diff --git a/dndBuilder/src/FileManagement/FileManager.java b/dndBuilder/src/FileManagement/FileManager.java index 7227b52..9e39c44 100644 --- a/dndBuilder/src/FileManagement/FileManager.java +++ b/dndBuilder/src/FileManagement/FileManager.java @@ -1,5 +1,6 @@ package FileManagement; +import java.awt.*; import java.io.*; import java.util.Arrays; @@ -15,6 +16,21 @@ public class FileManager { findSavedCharacters(); + loadFonts(); + + } + + private void loadFonts() { + + try { + GraphicsEnvironment ge = + GraphicsEnvironment.getLocalGraphicsEnvironment(); + ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File("dndBuilder/src/Resources/Fonts/SanSalvi.ttf"))); + } catch (IOException|FontFormatException e) { + //Handle exception + System.out.println("Error finding font."); + } + } public boolean isReturninguser() { diff --git a/dndBuilder/src/GUI/AppTheme.java b/dndBuilder/src/GUI/AppTheme.java new file mode 100644 index 0000000..d113138 --- /dev/null +++ b/dndBuilder/src/GUI/AppTheme.java @@ -0,0 +1,28 @@ +package GUI; + +import java.awt.*; + +public interface AppTheme { + + public Color lightAccent = Color.decode("#EAF0CE"); + public Color lightBrown = Color.decode("#EBBE9B"); + public Color medBrown = Color.decode("#E4A677"); + + public Color darkBrown = Color.decode("#502419"); + + public Color darkestBrown = Color.decode("#1F0E0A"); + + public Color black = Color.BLACK; + + public Color confirmationBlue = Color.decode("#296EB4"); + + public Color rejectionRed = Color.decode("#A23E48"); + + public Font headerFont = new Font("SanSalvi", Font.BOLD, 45); + public Font subHeaderFont = new Font("SanSalvi", Font.PLAIN, 35); + + public Font paragraphFont = new Font("SanSalvi", Font.PLAIN, 20); + public Font buttonFont = new Font("SanSalvi", Font.PLAIN, 15); + + +} diff --git a/dndBuilder/src/GUI/GUImanager.java b/dndBuilder/src/GUI/GUImanager.java index f5a9458..ab47250 100644 --- a/dndBuilder/src/GUI/GUImanager.java +++ b/dndBuilder/src/GUI/GUImanager.java @@ -1,30 +1,12 @@ package GUI; -import Character.AbilityScores.Stats; -import Character.Classes.*; -import Character.Races.*; import GUI.Panels.*; +import Resources.CustomAssets.DefaultButton; import javax.swing.*; import java.awt.*; import java.awt.event.*; -/* private void getNextPanel() { - - - return switch (currentPanel) { - case 1 -> guiPanels.getRacePanel(); - case 2 -> guiPanels.getClassPanel(); - case 3 -> guiPanels.getAbilityScorePanel(); - case 4 -> guiPanels.getDescriptionPanel(); - case 5 -> guiPanels.getEquipmentPanel(); - case 6 -> guiPanels.getFinalizePanel(); - case 7 -> guiPanels.getLoadMenuPanel(); - default -> guiPanels.getMainMenuPanel(); - }; - - }*/ - public class GUImanager extends JFrame { private static JPanel[] panels; @@ -56,7 +38,7 @@ public class GUImanager extends JFrame { }*/ - add(createMasterPanel()); + add(panels[currentPanel]); } @@ -64,8 +46,10 @@ public class GUImanager extends JFrame { setDefaultCloseOperation(EXIT_ON_CLOSE); setLayout(new BorderLayout()); - setPreferredSize(new Dimension(730,550)); + setPreferredSize(new Dimension(750,550)); setSize(getPreferredSize()); + setResizable(false); + setLocationRelativeTo(null); try { UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() ); @@ -75,38 +59,38 @@ public class GUImanager extends JFrame { } - private JPanel createMasterPanel() { + private DefaultButton createBackButton() { - JPanel masterPanel = new JPanel(); - masterPanel.add(panels[currentPanel]); + DefaultButton button = new DefaultButton("Back"); + button.addActionListener( - JPanel navigationContainer = new JPanel(new GridLayout(1, 2, 10, 10)); - navigationContainer.add(createBackButton()); - navigationContainer.add(createContinueButton()); + e -> { - //masterPanel.add(navigationContainer); + lastPanel--; + currentPanel--; + nextPanel--; + clearAndReset(); -// return masterPanel; + } - return panels[currentPanel]; + ); + + return button; } - private JButton createBackButton() { + private DefaultButton createContinueButton() { - JButton button = new JButton("Back"); + DefaultButton button = new DefaultButton("Continue"); button.addActionListener( - new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { + e -> { - lastPanel--; - currentPanel--; - nextPanel--; - clearAndReset(); + lastPanel++; + currentPanel++; + nextPanel++; + clearAndReset(); - } } ); @@ -115,46 +99,20 @@ public class GUImanager extends JFrame { } - private JButton createContinueButton() { + private DefaultButton createRandomCharacterButton() { - JButton button = new JButton("Continue"); - button.addActionListener( - - new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - - lastPanel++; - currentPanel++; - nextPanel++; - clearAndReset(); - - } - } - - ); - - return button; - - } - - private JButton createRandomCharacterButton() { - - JButton button = new JButton("Create Random Character"); + DefaultButton button = new DefaultButton("Create Random Character"); button.addActionListener( - new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { + e -> { - createRandomCharacter(); + createRandomCharacter(); - lastPanel = currentPanel; - currentPanel = 6; - nextPanel = currentPanel + 1; - clearAndReset(); + lastPanel = currentPanel; + currentPanel = 6; + nextPanel = currentPanel + 1; + clearAndReset(); - } } ); @@ -163,22 +121,19 @@ public class GUImanager extends JFrame { } - private JButton createSaveButton() { + private DefaultButton createSaveButton() { - JButton button = new JButton("Save"); + DefaultButton button = new DefaultButton("Save"); button.addActionListener( - new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { + e -> { - lastPanel = currentPanel; - currentPanel = 6; - nextPanel = currentPanel + 1; - clearAndReset(); + lastPanel = currentPanel; + currentPanel = 6; + nextPanel = currentPanel + 1; + clearAndReset(); - } - } + } ); @@ -186,6 +141,7 @@ public class GUImanager extends JFrame { } + // TODO: Need to implement. private void createRandomCharacter() { @@ -196,10 +152,11 @@ public class GUImanager extends JFrame { getContentPane().removeAll(); - add(createMasterPanel()); + add(panels[currentPanel]); repaint(); revalidate(); + pack(); } diff --git a/dndBuilder/src/GUI/PanelTheme.java b/dndBuilder/src/GUI/PanelTheme.java deleted file mode 100644 index f599b8e..0000000 --- a/dndBuilder/src/GUI/PanelTheme.java +++ /dev/null @@ -1,13 +0,0 @@ -package GUI; - -import java.awt.*; - -public interface PanelTheme { - - public Color deepRed = new Color(165, 42, 42); - public Color lightBrown = new Color(222, 184, 135); - public Color darkBrown = new Color(205, 133, 63); - - public Color black = new Color(0, 0, 0); - -} diff --git a/dndBuilder/src/GUI/Panels/ChooseRacePanel.java b/dndBuilder/src/GUI/Panels/ChooseRacePanel.java index ca38609..dc8e745 100644 --- a/dndBuilder/src/GUI/Panels/ChooseRacePanel.java +++ b/dndBuilder/src/GUI/Panels/ChooseRacePanel.java @@ -1,38 +1,38 @@ package GUI.Panels; -import GUI.PanelTheme; +import GUI.AppTheme; import GUI.Panels.SubPanels.*; +import Resources.CustomAssets.*; import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; import javax.swing.*; import javax.swing.border.*; -public class ChooseRacePanel extends JPanel implements PanelTheme { +public class ChooseRacePanel extends JPanel implements AppTheme { private String[] raceOptions; - private String[] raceDescriptions; - private InfoPanel infoPanel; - private int raceIndex; private JButton backButton; private JButton continueButton; - /** - * Create the panel. - */ - public ChooseRacePanel(JButton backButton, JButton continueButton) { + private DefaultButton[] raceOptionButtons; + + public ChooseRacePanel(JButton backButton, DefaultButton continueButton) { super(); this.backButton = backButton; this.continueButton = continueButton; + raceIndex = 0; createRaces(); this.infoPanel = new InfoPanel(raceOptions, raceDescriptions); panelSetup(); - add(createMasterPanel()); + createMasterPanel(); } @@ -48,41 +48,49 @@ public class ChooseRacePanel extends JPanel implements PanelTheme { } - private JPanel createMasterPanel() { + private void createMasterPanel() { - JLabel lblNewLabel = new JLabel("Step 1: Choose Race"); - lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER); - lblNewLabel.setFont(new Font("Bodoni 72 Oldstyle", Font.PLAIN, 33)); - add(lblNewLabel, BorderLayout.NORTH); - - JPanel racePanel = new JPanel(); - racePanel.setOpaque(false); - racePanel.setLayout(null); - - racePanel.add(infoPanel); + JLabel title = new JLabel("Step 1: Choose Race"); + title.setHorizontalAlignment(SwingConstants.CENTER); + title.setFont(headerFont); + title.setForeground(darkestBrown); + add(title, BorderLayout.NORTH); + JPanel racePanel = new JPanel(); + racePanel.setOpaque(false); + racePanel.setLayout(null); + racePanel.add(infoPanel); racePanel.add(createRaceButtonPanel()); - add(createNavPanel(), BorderLayout.SOUTH); - - return racePanel; + add(racePanel); + add(createNavPanel(), BorderLayout.SOUTH); } private JPanel createRaceButtonPanel() { - JPanel raceBtnPanel = new JPanel(new GridLayout(raceOptions.length, 1, 15, 5)); - raceBtnPanel.setBackground(darkBrown); - raceBtnPanel.setBounds(311, 6, 109, 394); + JPanel buttonPanel = new JPanel(new GridLayout(raceOptions.length, 1, 0, 0)); + buttonPanel.setBackground(lightBrown); + + buttonPanel.setBounds(585, 45, 135, 355); + + raceOptionButtons = new DefaultButton[raceOptions.length]; + + + for (int i = 0; i < raceOptionButtons.length; i++) { + + raceOptionButtons[i] = createButton(raceOptions[i], i); + + } for (int i = 0; i < raceOptions.length; i++) { - raceBtnPanel.add(createButton(raceOptions[i], i)); + buttonPanel.add(raceOptionButtons[i]); } - return raceBtnPanel; + return buttonPanel; } @@ -95,9 +103,9 @@ public class ChooseRacePanel extends JPanel implements PanelTheme { private JPanel createNavPanel() { - JPanel panel = new JPanel(); - panel.setBackground(darkBrown); - + JPanel panel = new JPanel(new GridLayout(1, 2, 30, 0)); + panel.setBackground(darkestBrown); + panel.setBorder(new EmptyBorder(15, 150, 15, 150)); panel.add(backButton); panel.add(continueButton); @@ -105,30 +113,29 @@ public class ChooseRacePanel extends JPanel implements PanelTheme { } - private JButton createButton(String raceName, int index) { + private DefaultButton createButton(String raceName, int index) { - JButton button = new JButton(raceName); - button.addActionListener( - - e -> { - - raceIndex = index; - infoPanel.updateInfo(raceIndex); - - } - - ); + DefaultButton button = new DefaultButton(raceName); + button.addActionListener(e -> updateButtons(raceIndex, index)); return button; } + private void updateButtons(int lastIndex, int newIndex) { + + raceOptionButtons[lastIndex].deSelect(); + raceOptionButtons[newIndex].select(); + + raceIndex = newIndex; + infoPanel.updateInfo(raceIndex); + + } + public int getRaceChoice() { return raceIndex; } - - } diff --git a/dndBuilder/src/GUI/Panels/SubPanels/InfoPanel.java b/dndBuilder/src/GUI/Panels/SubPanels/InfoPanel.java index 8e0f5ff..41de474 100644 --- a/dndBuilder/src/GUI/Panels/SubPanels/InfoPanel.java +++ b/dndBuilder/src/GUI/Panels/SubPanels/InfoPanel.java @@ -1,17 +1,17 @@ package GUI.Panels.SubPanels; -import GUI.PanelTheme; +import GUI.AppTheme; import javax.imageio.ImageIO; import javax.swing.*; -import javax.swing.border.BevelBorder; +import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.util.Objects; import java.util.Random; -public class InfoPanel extends JPanel implements PanelTheme { +public class InfoPanel extends JPanel implements AppTheme { private JTextArea[] descriptions; private String[] holderDescriptions; @@ -48,7 +48,7 @@ public class InfoPanel extends JPanel implements PanelTheme { panelSetup(); - add(descriptions[holderIndex]); + add(descriptions[0]); add(portraits[holderIndex][getNextPortrait(holderIndex)]); repaint(); @@ -77,14 +77,16 @@ public class InfoPanel extends JPanel implements PanelTheme { private void panelSetup() { setOpaque(false); - setBounds(6, 6, 293, 394); + setBounds(5, 5, 600, 400); setLayout(null); - JLabel infoLbl = new JLabel("Information"); - infoLbl.setFont(new Font("Bodoni 72", Font.PLAIN, 20)); - infoLbl.setHorizontalAlignment(SwingConstants.CENTER); - infoLbl.setBounds(92, 6, 105, 16); - add(infoLbl); + JLabel subHeader = new JLabel("Description"); + subHeader.setFont(subHeaderFont); + subHeader.setHorizontalAlignment(SwingConstants.LEFT); + subHeader.setBounds(275, 10, 300, 35); + subHeader.setForeground(darkestBrown); + + add(subHeader); } @@ -101,8 +103,10 @@ public class InfoPanel extends JPanel implements PanelTheme { tmpDesc.setOpaque(false); tmpDesc.setEditable(false); tmpDesc.setFocusable(false); - tmpDesc.setFont(new Font("Bodoni 72", Font.PLAIN, 10)); - tmpDesc.setBounds(6, 21, 281, 196); + tmpDesc.setFont(paragraphFont); + tmpDesc.setBounds(275, 45, 300, 355); + tmpDesc.setBorder(new EmptyBorder(5, 5, 5, 5)); + tmpDesc.setForeground(darkestBrown); descriptions[i] = tmpDesc; @@ -118,32 +122,17 @@ public class InfoPanel extends JPanel implements PanelTheme { File imagesDir; - /* - - WINDOWS: - attempted - dndBuilder/src/GUI/img/category/ - dndBuilder/src/GUI/img/category - /dndBuilder/src/GUI/img/category - /dndBuilder/src/GUI/img/category/ - GUI/img/category/ - /GUI/img/category/ - src/GUI/img/category/ - /src/GUI/img/category/ - - */ - if(OS.startsWith("Windows")) { - imagesDir = new File("dndBuilder\\src\\GUI\\img\\" + categoryHolder[i] + "\\"); + imagesDir = new File("dndBuilder\\src\\Resources\\Img\\" + categoryHolder[i] + "\\"); } else if (OS.startsWith("Mac")) { - imagesDir = new File("dndBuilder/src/GUI/img/" + categoryHolder[i] + "/"); + imagesDir = new File("dndBuilder/src/Resources/Img/" + categoryHolder[i] + "/"); } else if (OS.startsWith("Linux")) { - imagesDir = new File("dndBuilder/src/GUI/img/" + categoryHolder[i] + "/"); + imagesDir = new File("dndBuilder/src/Resources/Img/" + categoryHolder[i] + "/"); } else { @@ -161,7 +150,7 @@ public class InfoPanel extends JPanel implements PanelTheme { portraits[i][index] = image(file); portraits[i][index].setOpaque(true); portraits[i][index].setBackground(lightBrown); - portraits[i][index].setBounds(6, 229, 281, 159); + portraits[i][index].setBounds(10, 45, 250, 355); index++; @@ -180,7 +169,7 @@ public class InfoPanel extends JPanel implements PanelTheme { try { img = ImageIO.read(file); - finalImg = img.getScaledInstance(281, 196, Image.SCALE_SMOOTH); + finalImg = img.getScaledInstance(250, 375, Image.SCALE_SMOOTH); } catch (Exception e) { diff --git a/dndBuilder/src/Resources/CustomAssets/DefaultButton.java b/dndBuilder/src/Resources/CustomAssets/DefaultButton.java new file mode 100644 index 0000000..b731edf --- /dev/null +++ b/dndBuilder/src/Resources/CustomAssets/DefaultButton.java @@ -0,0 +1,87 @@ +package Resources.CustomAssets; + +import GUI.AppTheme; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +public class DefaultButton extends JButton implements AppTheme { + + private boolean selected; + + public DefaultButton(String buttonLabel) { + + super(buttonLabel); + applyDefaultButtonStyle(); + applyCommon(); + + } + + public void deSelect() { + + selected = false; + applyDefaultButtonStyle(); + + } + + public void select() { + + selected = true; + applyFocusedButtonStyle(); + + } + + private void applyDefaultButtonStyle() { + + setBackground(medBrown); + setForeground(darkestBrown); + + } + + private void applyFocusedButtonStyle() { + + setBackground(darkestBrown); + setForeground(lightAccent); + + } + + private void applyCommon() { + + addMouseListener( + new MouseListener() { + @Override + public void mouseClicked(MouseEvent e) {} + @Override + public void mousePressed(MouseEvent e) {} + @Override + public void mouseReleased(MouseEvent e) {} + @Override + public void mouseEntered(MouseEvent e) { applyFocusedButtonStyle(); } + @Override + public void mouseExited(MouseEvent e) { + + if (!selected) { + + applyDefaultButtonStyle(); + + } + + } + } + + ); + + setFocusPainted(false); + setFont(buttonFont); + setBorder(new EmptyBorder(3, 3, 3, 3)); + + repaint(); + revalidate(); + + } + + + +} diff --git a/dndBuilder/src/Resources/CustomAssets/RoundedBorder.java b/dndBuilder/src/Resources/CustomAssets/RoundedBorder.java new file mode 100644 index 0000000..8062375 --- /dev/null +++ b/dndBuilder/src/Resources/CustomAssets/RoundedBorder.java @@ -0,0 +1,33 @@ +package Resources.CustomAssets; + +import javax.swing.border.*; +import java.awt.*; + +public class RoundedBorder implements Border { + + private int radius; + + public RoundedBorder(int radius) { + + this.radius = radius; + + } + + public Insets getBorderInsets(Component c) { + + return new Insets(this.radius+1, this.radius+1, this.radius+2, this.radius); + + } + + public boolean isBorderOpaque() { + + return true; + + } + + public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { + + g.drawRoundRect(x, y, width-1, height-1, radius, radius); + + } +} diff --git a/dndBuilder/src/Resources/Fonts/SanSalvi.ttf b/dndBuilder/src/Resources/Fonts/SanSalvi.ttf new file mode 100644 index 0000000..e0311ea Binary files /dev/null and b/dndBuilder/src/Resources/Fonts/SanSalvi.ttf differ diff --git a/dndBuilder/src/GUI/img/dragonborn/dragonborn.jpg b/dndBuilder/src/Resources/Img/dragonborn/dragonborn.jpg similarity index 100% rename from dndBuilder/src/GUI/img/dragonborn/dragonborn.jpg rename to dndBuilder/src/Resources/Img/dragonborn/dragonborn.jpg diff --git a/dndBuilder/src/GUI/img/dragonborn/dragonborn2.jpg b/dndBuilder/src/Resources/Img/dragonborn/dragonborn2.jpg similarity index 100% rename from dndBuilder/src/GUI/img/dragonborn/dragonborn2.jpg rename to dndBuilder/src/Resources/Img/dragonborn/dragonborn2.jpg diff --git a/dndBuilder/src/GUI/img/dragonborn/dragonborn3.jpg b/dndBuilder/src/Resources/Img/dragonborn/dragonborn3.jpg similarity index 100% rename from dndBuilder/src/GUI/img/dragonborn/dragonborn3.jpg rename to dndBuilder/src/Resources/Img/dragonborn/dragonborn3.jpg diff --git a/dndBuilder/src/GUI/img/dragonborn/dragonborn4.jpg b/dndBuilder/src/Resources/Img/dragonborn/dragonborn4.jpg similarity index 100% rename from dndBuilder/src/GUI/img/dragonborn/dragonborn4.jpg rename to dndBuilder/src/Resources/Img/dragonborn/dragonborn4.jpg diff --git a/dndBuilder/src/GUI/img/dragonborn/dragonborn5.jpg b/dndBuilder/src/Resources/Img/dragonborn/dragonborn5.jpg similarity index 100% rename from dndBuilder/src/GUI/img/dragonborn/dragonborn5.jpg rename to dndBuilder/src/Resources/Img/dragonborn/dragonborn5.jpg diff --git a/dndBuilder/src/GUI/img/dragonborn/dragonborn6.jpg b/dndBuilder/src/Resources/Img/dragonborn/dragonborn6.jpg similarity index 100% rename from dndBuilder/src/GUI/img/dragonborn/dragonborn6.jpg rename to dndBuilder/src/Resources/Img/dragonborn/dragonborn6.jpg diff --git a/dndBuilder/src/GUI/img/dwarf/dwarf.jpg b/dndBuilder/src/Resources/Img/dwarf/dwarf.jpg similarity index 100% rename from dndBuilder/src/GUI/img/dwarf/dwarf.jpg rename to dndBuilder/src/Resources/Img/dwarf/dwarf.jpg diff --git a/dndBuilder/src/GUI/img/elf/elf.jpg b/dndBuilder/src/Resources/Img/elf/elf.jpg similarity index 100% rename from dndBuilder/src/GUI/img/elf/elf.jpg rename to dndBuilder/src/Resources/Img/elf/elf.jpg diff --git a/dndBuilder/src/GUI/img/gnome/gnome.jpg b/dndBuilder/src/Resources/Img/gnome/gnome.jpg similarity index 100% rename from dndBuilder/src/GUI/img/gnome/gnome.jpg rename to dndBuilder/src/Resources/Img/gnome/gnome.jpg diff --git a/dndBuilder/src/GUI/img/halfelf/halfelf.jpg b/dndBuilder/src/Resources/Img/halfelf/halfelf.jpg similarity index 100% rename from dndBuilder/src/GUI/img/halfelf/halfelf.jpg rename to dndBuilder/src/Resources/Img/halfelf/halfelf.jpg diff --git a/dndBuilder/src/GUI/img/halfling/halfling.jpg b/dndBuilder/src/Resources/Img/halfling/halfling.jpg similarity index 100% rename from dndBuilder/src/GUI/img/halfling/halfling.jpg rename to dndBuilder/src/Resources/Img/halfling/halfling.jpg diff --git a/dndBuilder/src/GUI/img/halforc/halforc.jpg b/dndBuilder/src/Resources/Img/halforc/halforc.jpg similarity index 100% rename from dndBuilder/src/GUI/img/halforc/halforc.jpg rename to dndBuilder/src/Resources/Img/halforc/halforc.jpg diff --git a/dndBuilder/src/GUI/img/human/human.jpg b/dndBuilder/src/Resources/Img/human/human.jpg similarity index 100% rename from dndBuilder/src/GUI/img/human/human.jpg rename to dndBuilder/src/Resources/Img/human/human.jpg diff --git a/dndBuilder/src/GUI/img/sheet.jpg b/dndBuilder/src/Resources/Img/sheet.jpg similarity index 100% rename from dndBuilder/src/GUI/img/sheet.jpg rename to dndBuilder/src/Resources/Img/sheet.jpg diff --git a/dndBuilder/src/GUI/img/tiefling/tiefling.jpg b/dndBuilder/src/Resources/Img/tiefling/tiefling.jpg similarity index 100% rename from dndBuilder/src/GUI/img/tiefling/tiefling.jpg rename to dndBuilder/src/Resources/Img/tiefling/tiefling.jpg