From 01141bdeaba7ead937d1096c93f64c79cb2beac4 Mon Sep 17 00:00:00 2001 From: Divyesh000 Date: Mon, 24 Jun 2024 10:41:52 +0400 Subject: [PATCH 1/6] write tutorial for getting started --- .../view/tutorial/GettingStartedTutorial.java | 157 +++++++++++++++++- 1 file changed, 156 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java b/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java index 6b58478c..678d0b4b 100644 --- a/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java +++ b/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java @@ -3,9 +3,16 @@ import static com.github.creme332.utils.IconLoader.loadIcon; import static com.github.creme332.utils.IconLoader.getScaledDimension; -import java.awt.Dimension; +import java.awt.*; +import javax.swing.*; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.DefaultTableModel; +import org.kordamp.ikonli.bootstrapicons.BootstrapIcons; +import org.kordamp.ikonli.swing.FontIcon; import com.github.creme332.model.TutorialModel; +import com.github.creme332.model.Mode; +import com.github.creme332.utils.IconLoader; import com.github.creme332.utils.exception.InvalidIconSizeException; import com.github.creme332.utils.exception.InvalidPathException; @@ -17,6 +24,154 @@ public class GettingStartedTutorial extends TutorialPanel { public GettingStartedTutorial() throws InvalidPathException, InvalidIconSizeException { super(GETTING_STARTED_MODEL, loadIcon(IMAGE_PATH_PREFIX + "background.png", getScaledDimension(new Dimension(753, 453), TutorialCard.IMAGE_DIMENSION))); + setLayout(new BorderLayout()); + + // Create a main panel to hold all content with scrollable area + JPanel mainPanel = new JPanel(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.insets = new Insets(10, 10, 10, 10); + gbc.anchor = GridBagConstraints.NORTHWEST; + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.gridx = 0; + gbc.gridy = 0; + + // Add Introduction + JLabel introLabel = new JLabel("

Getting Started Tutorial

Welcome to the application! This tutorial will guide you through the various components and features of the interface to help you get started.

"); + mainPanel.add(introLabel, gbc); + gbc.gridy++; + + // Add ZoomPanel explanation + JTextArea zoomPanelExplanation = createSectionText("Zoom Panel", + "The zoom panel is located on the right side of the application and allows you to control the zoom level and view of the canvas. The buttons include:"); + mainPanel.add(zoomPanelExplanation, gbc); + gbc.gridy++; + + // Add ZoomPanel buttons as a table + JPanel zoomPanelTable = createButtonTable(new Object[][]{ + {FontIcon.of(BootstrapIcons.HOUSE, 30), "Home", "Reset the view to the home position."}, + {FontIcon.of(BootstrapIcons.ZOOM_IN, 30), "Zoom In", "Zoom into the view."}, + {FontIcon.of(BootstrapIcons.ZOOM_OUT, 30), "Zoom Out", "Zoom out of the view."}, + {FontIcon.of(BootstrapIcons.ARROWS_FULLSCREEN, 30), "Full Screen", "Toggle full-screen mode."} + }); + mainPanel.add(zoomPanelTable, gbc); + gbc.gridy++; + + // Add Toast explanation + JTextArea toastExplanation = createSectionText("Toast Notifications", + "Toast notifications provide quick information about the current mode or action being performed. The toast includes a title and instructions, helping you understand what is expected at each step."); + mainPanel.add(toastExplanation, gbc); + gbc.gridy++; + + // Add Toast explanation as a table + JPanel toastTable = createTextTable(new Object[][]{ + {"Mode", "Drag or select object"}, + {"Freehand Shape", "Sketch a function or geometric object"}, + {"Line: DDA", "Select two points or positions"}, + {"Line: Bresenham", "Select two points or positions"}, + {"Circle with Center through Point", "Select center point, then point on circle"}, + {"Circle: Center & Radius", "Select center point, then enter radius"}, + {"Ellipse", "Select two foci, then point on ellipse"}, + {"Polygon", "Select all vertices, then first vertex again"}, + {"Regular Polygon", "Select two points, then enter number of vertices"}, + {"Reflect about Line", "Select object to reflect, then line of reflection"}, + {"Reflect about Point", "Select object to reflect, then center point"}, + {"Rotate around Point", "Select object to rotate and center point, then enter angle"}, + {"Zoom In", "Click/tap to zoom (or Mouse Wheel)"}, + {"Zoom Out", "Click/tap to zoom (or Mouse Wheel)"}, + {"Delete", "Select object which should be deleted"}, + {"Move Graphics View", "Drag white background or axis"}, + {"Translation", "Select object to translate"}, + {"Normal Rotation", "Select object to rotate"}, + {"Scaling", "Select object to scale then enter scaling factor"}, + {"Shear", "Select object to translate, then enter scaling factor"}, + {"Clipping", "Draw clipping region with mouse drag"} + }); + mainPanel.add(toastTable, gbc); + gbc.gridy++; + + // Add Detailed Button explanations + JTextArea buttonExplanation = createSectionText("Buttons on the right side", + "There are several buttons available in the interface for various actions on the right side of the Menu Bar:"); + mainPanel.add(buttonExplanation, gbc); + gbc.gridy++; + + // Add action buttons as a table + JPanel actionButtonsTable = createButtonTable(new Object[][]{ + {FontIcon.of(BootstrapIcons.LIST, 40), "Sidebar", "Toggle the sidebar visibility."}, + {FontIcon.of(BootstrapIcons.GRID_3X3, 37), "Guidelines", "Show or hide guidelines."}, + {IconLoader.loadIcon("/icons/axes.png", 40), "Axes", "Show or hide axes."}, + {FontIcon.of(BootstrapIcons.QUESTION_CIRCLE, 37), "Help", "Open the help documentation."}, + {FontIcon.of(BootstrapIcons.CAMERA, 37), "Export", "Export the current view as an image."}, + {FontIcon.of(BootstrapIcons.ARROW_COUNTERCLOCKWISE, 40), "Undo", "Undo the last action."}, + {FontIcon.of(BootstrapIcons.ARROW_CLOCKWISE, 40), "Redo", "Redo the last undone action."} + }); + mainPanel.add(actionButtonsTable, gbc); + + // Add scrollable area + JScrollPane scrollPane = new JScrollPane(mainPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrollPane.setBorder(BorderFactory.createEmptyBorder()); + + add(scrollPane, BorderLayout.CENTER); + } + + private JTextArea createSectionText(String title, String content) { + JTextArea textArea = new JTextArea(); + textArea.setText(title + "\n\n" + content); + textArea.setWrapStyleWord(true); + textArea.setLineWrap(true); + textArea.setEditable(false); + textArea.setOpaque(false); + textArea.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + return textArea; } + private JPanel createButtonTable(Object[][] data) { + String[] columnNames = {"Icon", "Title", "Description"}; + + DefaultTableModel tableModel = new DefaultTableModel(data, columnNames) { + @Override + public Class getColumnClass(int column) { + if (column == 0) { + return Icon.class; + } else { + return String.class; + } + } + }; + + JTable table = new JTable(tableModel); + table.setRowHeight(50); + table.setFillsViewportHeight(true); + table.getColumnModel().getColumn(0).setMaxWidth(60); + + DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(); + centerRenderer.setHorizontalAlignment(JLabel.CENTER); + table.getColumnModel().getColumn(0).setCellRenderer(centerRenderer); + + table.setBackground(new Color(245, 245, 245)); + table.setGridColor(new Color(200, 200, 200)); + + JPanel tablePanel = new JPanel(new BorderLayout()); + tablePanel.add(table.getTableHeader(), BorderLayout.PAGE_START); + tablePanel.add(table, BorderLayout.CENTER); + return tablePanel; + } + + private JPanel createTextTable(Object[][] data) { + String[] columnNames = {"Title", "Description"}; + + DefaultTableModel tableModel = new DefaultTableModel(data, columnNames); + + JTable table = new JTable(tableModel); + table.setRowHeight(30); + table.setFillsViewportHeight(true); + + table.setBackground(new Color(245, 245, 245)); + table.setGridColor(new Color(200, 200, 200)); + + JPanel tablePanel = new JPanel(new BorderLayout()); + tablePanel.add(table.getTableHeader(), BorderLayout.PAGE_START); + tablePanel.add(table, BorderLayout.CENTER); + return tablePanel; + } } From 6ab8c1adc686ea8cf40d1eb1ee31e63defcf49c0 Mon Sep 17 00:00:00 2001 From: creme332 <65414576+creme332@users.noreply.github.com> Date: Tue, 25 Jun 2024 14:04:21 +0400 Subject: [PATCH 2/6] fix issue for missing heading panel for custom layout, refactor code --- .../view/tutorial/GettingStartedTutorial.java | 91 ++++++++++--------- 1 file changed, 48 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java b/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java index 678d0b4b..8e83a4a5 100644 --- a/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java +++ b/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java @@ -11,7 +11,6 @@ import org.kordamp.ikonli.swing.FontIcon; import com.github.creme332.model.TutorialModel; -import com.github.creme332.model.Mode; import com.github.creme332.utils.IconLoader; import com.github.creme332.utils.exception.InvalidIconSizeException; import com.github.creme332.utils.exception.InvalidPathException; @@ -24,10 +23,12 @@ public class GettingStartedTutorial extends TutorialPanel { public GettingStartedTutorial() throws InvalidPathException, InvalidIconSizeException { super(GETTING_STARTED_MODEL, loadIcon(IMAGE_PATH_PREFIX + "background.png", getScaledDimension(new Dimension(753, 453), TutorialCard.IMAGE_DIMENSION))); - setLayout(new BorderLayout()); + // remove bodyPanel since default layout is not being used + this.remove(bodyPanel); // Create a main panel to hold all content with scrollable area JPanel mainPanel = new JPanel(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(10, 10, 10, 10); gbc.anchor = GridBagConstraints.NORTHWEST; @@ -36,7 +37,8 @@ public GettingStartedTutorial() throws InvalidPathException, InvalidIconSizeExce gbc.gridy = 0; // Add Introduction - JLabel introLabel = new JLabel("

Getting Started Tutorial

Welcome to the application! This tutorial will guide you through the various components and features of the interface to help you get started.

"); + JLabel introLabel = new JLabel( + "

Getting Started Tutorial

Welcome to Polydraw! This tutorial will guide you through the various components and features of the interface to help you get started.

"); mainPanel.add(introLabel, gbc); gbc.gridy++; @@ -47,44 +49,44 @@ public GettingStartedTutorial() throws InvalidPathException, InvalidIconSizeExce gbc.gridy++; // Add ZoomPanel buttons as a table - JPanel zoomPanelTable = createButtonTable(new Object[][]{ - {FontIcon.of(BootstrapIcons.HOUSE, 30), "Home", "Reset the view to the home position."}, - {FontIcon.of(BootstrapIcons.ZOOM_IN, 30), "Zoom In", "Zoom into the view."}, - {FontIcon.of(BootstrapIcons.ZOOM_OUT, 30), "Zoom Out", "Zoom out of the view."}, - {FontIcon.of(BootstrapIcons.ARROWS_FULLSCREEN, 30), "Full Screen", "Toggle full-screen mode."} + JPanel zoomPanelTable = createButtonTable(new Object[][] { + { FontIcon.of(BootstrapIcons.HOUSE, 30), "Home", "Reset the view to the home position." }, + { FontIcon.of(BootstrapIcons.ZOOM_IN, 30), "Zoom In", "Zoom into the view." }, + { FontIcon.of(BootstrapIcons.ZOOM_OUT, 30), "Zoom Out", "Zoom out of the view." }, + { FontIcon.of(BootstrapIcons.ARROWS_FULLSCREEN, 30), "Full Screen", "Toggle full-screen mode." } }); mainPanel.add(zoomPanelTable, gbc); gbc.gridy++; // Add Toast explanation JTextArea toastExplanation = createSectionText("Toast Notifications", - "Toast notifications provide quick information about the current mode or action being performed. The toast includes a title and instructions, helping you understand what is expected at each step."); + "Toast notifications provide quick information about the current mode or action being performed. The toast includes a title and instructions, helping you understand what is expected at each step."); mainPanel.add(toastExplanation, gbc); gbc.gridy++; // Add Toast explanation as a table - JPanel toastTable = createTextTable(new Object[][]{ - {"Mode", "Drag or select object"}, - {"Freehand Shape", "Sketch a function or geometric object"}, - {"Line: DDA", "Select two points or positions"}, - {"Line: Bresenham", "Select two points or positions"}, - {"Circle with Center through Point", "Select center point, then point on circle"}, - {"Circle: Center & Radius", "Select center point, then enter radius"}, - {"Ellipse", "Select two foci, then point on ellipse"}, - {"Polygon", "Select all vertices, then first vertex again"}, - {"Regular Polygon", "Select two points, then enter number of vertices"}, - {"Reflect about Line", "Select object to reflect, then line of reflection"}, - {"Reflect about Point", "Select object to reflect, then center point"}, - {"Rotate around Point", "Select object to rotate and center point, then enter angle"}, - {"Zoom In", "Click/tap to zoom (or Mouse Wheel)"}, - {"Zoom Out", "Click/tap to zoom (or Mouse Wheel)"}, - {"Delete", "Select object which should be deleted"}, - {"Move Graphics View", "Drag white background or axis"}, - {"Translation", "Select object to translate"}, - {"Normal Rotation", "Select object to rotate"}, - {"Scaling", "Select object to scale then enter scaling factor"}, - {"Shear", "Select object to translate, then enter scaling factor"}, - {"Clipping", "Draw clipping region with mouse drag"} + JPanel toastTable = createTextTable(new Object[][] { + { "Mode", "Drag or select object" }, + { "Freehand Shape", "Sketch a function or geometric object" }, + { "Line: DDA", "Select two points or positions" }, + { "Line: Bresenham", "Select two points or positions" }, + { "Circle with Center through Point", "Select center point, then point on circle" }, + { "Circle: Center & Radius", "Select center point, then enter radius" }, + { "Ellipse", "Select two foci, then point on ellipse" }, + { "Polygon", "Select all vertices, then first vertex again" }, + { "Regular Polygon", "Select two points, then enter number of vertices" }, + { "Reflect about Line", "Select object to reflect, then line of reflection" }, + { "Reflect about Point", "Select object to reflect, then center point" }, + { "Rotate around Point", "Select object to rotate and center point, then enter angle" }, + { "Zoom In", "Click/tap to zoom (or Mouse Wheel)" }, + { "Zoom Out", "Click/tap to zoom (or Mouse Wheel)" }, + { "Delete", "Select object which should be deleted" }, + { "Move Graphics View", "Drag white background or axis" }, + { "Translation", "Select object to translate" }, + { "Normal Rotation", "Select object to rotate" }, + { "Scaling", "Select object to scale then enter scaling factor" }, + { "Shear", "Select object to translate, then enter scaling factor" }, + { "Clipping", "Draw clipping region with mouse drag" } }); mainPanel.add(toastTable, gbc); gbc.gridy++; @@ -96,22 +98,25 @@ public GettingStartedTutorial() throws InvalidPathException, InvalidIconSizeExce gbc.gridy++; // Add action buttons as a table - JPanel actionButtonsTable = createButtonTable(new Object[][]{ - {FontIcon.of(BootstrapIcons.LIST, 40), "Sidebar", "Toggle the sidebar visibility."}, - {FontIcon.of(BootstrapIcons.GRID_3X3, 37), "Guidelines", "Show or hide guidelines."}, - {IconLoader.loadIcon("/icons/axes.png", 40), "Axes", "Show or hide axes."}, - {FontIcon.of(BootstrapIcons.QUESTION_CIRCLE, 37), "Help", "Open the help documentation."}, - {FontIcon.of(BootstrapIcons.CAMERA, 37), "Export", "Export the current view as an image."}, - {FontIcon.of(BootstrapIcons.ARROW_COUNTERCLOCKWISE, 40), "Undo", "Undo the last action."}, - {FontIcon.of(BootstrapIcons.ARROW_CLOCKWISE, 40), "Redo", "Redo the last undone action."} + JPanel actionButtonsTable = createButtonTable(new Object[][] { + { FontIcon.of(BootstrapIcons.LIST, 40), "Sidebar", "Toggle the sidebar visibility." }, + { FontIcon.of(BootstrapIcons.GRID_3X3, 37), "Guidelines", "Show or hide guidelines." }, + { IconLoader.loadIcon("/icons/axes.png", 40), "Axes", "Show or hide axes." }, + { FontIcon.of(BootstrapIcons.QUESTION_CIRCLE, 37), "Help", "Open the help documentation." }, + { FontIcon.of(BootstrapIcons.CAMERA, 37), "Export", "Export the current view as an image." }, + { FontIcon.of(BootstrapIcons.ARROW_COUNTERCLOCKWISE, 40), "Undo", "Undo the last action." }, + { FontIcon.of(BootstrapIcons.ARROW_CLOCKWISE, 40), "Redo", "Redo the last undone action." } }); mainPanel.add(actionButtonsTable, gbc); // Add scrollable area - JScrollPane scrollPane = new JScrollPane(mainPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + JScrollPane scrollPane = new JScrollPane(mainPanel, + javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scrollPane.setBorder(BorderFactory.createEmptyBorder()); - add(scrollPane, BorderLayout.CENTER); + this.add(scrollPane, BorderLayout.CENTER); + } private JTextArea createSectionText(String title, String content) { @@ -126,7 +131,7 @@ private JTextArea createSectionText(String title, String content) { } private JPanel createButtonTable(Object[][] data) { - String[] columnNames = {"Icon", "Title", "Description"}; + String[] columnNames = { "Icon", "Title", "Description" }; DefaultTableModel tableModel = new DefaultTableModel(data, columnNames) { @Override @@ -158,7 +163,7 @@ public Class getColumnClass(int column) { } private JPanel createTextTable(Object[][] data) { - String[] columnNames = {"Title", "Description"}; + String[] columnNames = { "Title", "Description" }; DefaultTableModel tableModel = new DefaultTableModel(data, columnNames); From 99a8f90db116002548ad099256e1df3e75f268d6 Mon Sep 17 00:00:00 2001 From: divyesh000 Date: Tue, 25 Jun 2024 18:07:50 +0400 Subject: [PATCH 3/6] solve the error of "The Java feature 'Text Blocks' is only available with source level 15 and aboveJava(4195411)" --- pom.xml | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index b742937d..03dd7610 100644 --- a/pom.xml +++ b/pom.xml @@ -1,7 +1,8 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.github.creme332 @@ -14,6 +15,8 @@ UTF-8 17 + 17 + 17 @@ -46,14 +49,17 @@ - + - + maven-clean-plugin 3.1.0 - + maven-resources-plugin 3.0.2 @@ -78,7 +84,8 @@ maven-deploy-plugin 2.8.2 - + maven-site-plugin 3.7.1 @@ -88,7 +95,8 @@ 3.0.0 - + org.apache.maven.plugins @@ -117,5 +125,17 @@ + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 17 + 17 + + + - + \ No newline at end of file From ef69ebf2aa55b1a8e5f94a927bdc1cb95e64dd4c Mon Sep 17 00:00:00 2001 From: divyesh000 Date: Tue, 25 Jun 2024 19:52:04 +0400 Subject: [PATCH 4/6] make all the modification about the icons --- .../creme332/utils/IconCellRenderer.java | 24 +++++++++++ .../view/tutorial/GettingStartedTutorial.java | 39 +++++++++++++----- .../tutorials/getting-started/toast.png | Bin 0 -> 5388 bytes .../tutorials/getting-started/zoom-panel.png | Bin 0 -> 8788 bytes 4 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/github/creme332/utils/IconCellRenderer.java create mode 100644 src/main/resources/images/tutorials/getting-started/toast.png create mode 100644 src/main/resources/images/tutorials/getting-started/zoom-panel.png diff --git a/src/main/java/com/github/creme332/utils/IconCellRenderer.java b/src/main/java/com/github/creme332/utils/IconCellRenderer.java new file mode 100644 index 00000000..b1b73a55 --- /dev/null +++ b/src/main/java/com/github/creme332/utils/IconCellRenderer.java @@ -0,0 +1,24 @@ +package com.github.creme332.utils; + +import javax.swing.*; +import javax.swing.table.DefaultTableCellRenderer; +import java.awt.*; + +import org.kordamp.ikonli.swing.FontIcon; + +public class IconCellRenderer extends DefaultTableCellRenderer { + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + // Use JLabel to handle the icon rendering + JLabel label = new JLabel(); + if (value instanceof ImageIcon) { + label.setIcon((ImageIcon) value); + } else if (value instanceof FontIcon) { + label.setIcon((FontIcon) value); + } + // Center the icon + label.setHorizontalAlignment(CENTER); + return label; + } +} + diff --git a/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java b/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java index 8e83a4a5..cbeb8bbe 100644 --- a/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java +++ b/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java @@ -11,7 +11,7 @@ import org.kordamp.ikonli.swing.FontIcon; import com.github.creme332.model.TutorialModel; -import com.github.creme332.utils.IconLoader; +import com.github.creme332.utils.IconCellRenderer; import com.github.creme332.utils.exception.InvalidIconSizeException; import com.github.creme332.utils.exception.InvalidPathException; @@ -48,6 +48,15 @@ public GettingStartedTutorial() throws InvalidPathException, InvalidIconSizeExce mainPanel.add(zoomPanelExplanation, gbc); gbc.gridy++; + // Add ZoomPanel example image + JLabel zoomPanelImageLabel = new JLabel("Here is an example of what the Zoom Panel looks like on the Canvas:"); + mainPanel.add(zoomPanelImageLabel, gbc); + gbc.gridy++; + ImageIcon zoomPanelIcon = loadIcon(IMAGE_PATH_PREFIX + "zoom-panel.png"); + JLabel zoomPanelImage = new JLabel(zoomPanelIcon); + mainPanel.add(zoomPanelImage, gbc); + gbc.gridy++; + // Add ZoomPanel buttons as a table JPanel zoomPanelTable = createButtonTable(new Object[][] { { FontIcon.of(BootstrapIcons.HOUSE, 30), "Home", "Reset the view to the home position." }, @@ -64,6 +73,15 @@ public GettingStartedTutorial() throws InvalidPathException, InvalidIconSizeExce mainPanel.add(toastExplanation, gbc); gbc.gridy++; + // Add Toast example image + JLabel toastImageLabel = new JLabel("Here is an example of what a toast looks like on the Canvas:"); + mainPanel.add(toastImageLabel, gbc); + gbc.gridy++; + ImageIcon toastIcon = loadIcon(IMAGE_PATH_PREFIX + "toast.png"); + JLabel toastImage = new JLabel(toastIcon); + mainPanel.add(toastImage, gbc); + gbc.gridy++; + // Add Toast explanation as a table JPanel toastTable = createTextTable(new Object[][] { { "Mode", "Drag or select object" }, @@ -100,23 +118,20 @@ public GettingStartedTutorial() throws InvalidPathException, InvalidIconSizeExce // Add action buttons as a table JPanel actionButtonsTable = createButtonTable(new Object[][] { { FontIcon.of(BootstrapIcons.LIST, 40), "Sidebar", "Toggle the sidebar visibility." }, - { FontIcon.of(BootstrapIcons.GRID_3X3, 37), "Guidelines", "Show or hide guidelines." }, - { IconLoader.loadIcon("/icons/axes.png", 40), "Axes", "Show or hide axes." }, { FontIcon.of(BootstrapIcons.QUESTION_CIRCLE, 37), "Help", "Open the help documentation." }, - { FontIcon.of(BootstrapIcons.CAMERA, 37), "Export", "Export the current view as an image." }, { FontIcon.of(BootstrapIcons.ARROW_COUNTERCLOCKWISE, 40), "Undo", "Undo the last action." }, { FontIcon.of(BootstrapIcons.ARROW_CLOCKWISE, 40), "Redo", "Redo the last undone action." } }); mainPanel.add(actionButtonsTable, gbc); - // Add scrollable area + // Add scrollable area with faster scrolling JScrollPane scrollPane = new JScrollPane(mainPanel, javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scrollPane.setBorder(BorderFactory.createEmptyBorder()); + scrollPane.getVerticalScrollBar().setUnitIncrement(16); this.add(scrollPane, BorderLayout.CENTER); - } private JTextArea createSectionText(String title, String content) { @@ -137,7 +152,7 @@ private JPanel createButtonTable(Object[][] data) { @Override public Class getColumnClass(int column) { if (column == 0) { - return Icon.class; + return Icon.class; // Set the column class to Icon } else { return String.class; } @@ -149,13 +164,14 @@ public Class getColumnClass(int column) { table.setFillsViewportHeight(true); table.getColumnModel().getColumn(0).setMaxWidth(60); - DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(); - centerRenderer.setHorizontalAlignment(JLabel.CENTER); - table.getColumnModel().getColumn(0).setCellRenderer(centerRenderer); + table.getColumnModel().getColumn(0).setCellRenderer(new IconCellRenderer()); table.setBackground(new Color(245, 245, 245)); table.setGridColor(new Color(200, 200, 200)); + table.setOpaque(true); + ((DefaultTableCellRenderer) table.getDefaultRenderer(Object.class)).setOpaque(true); + JPanel tablePanel = new JPanel(new BorderLayout()); tablePanel.add(table.getTableHeader(), BorderLayout.PAGE_START); tablePanel.add(table, BorderLayout.CENTER); @@ -174,6 +190,9 @@ private JPanel createTextTable(Object[][] data) { table.setBackground(new Color(245, 245, 245)); table.setGridColor(new Color(200, 200, 200)); + table.setOpaque(true); + ((DefaultTableCellRenderer) table.getDefaultRenderer(Object.class)).setOpaque(true); + JPanel tablePanel = new JPanel(new BorderLayout()); tablePanel.add(table.getTableHeader(), BorderLayout.PAGE_START); tablePanel.add(table, BorderLayout.CENTER); diff --git a/src/main/resources/images/tutorials/getting-started/toast.png b/src/main/resources/images/tutorials/getting-started/toast.png new file mode 100644 index 0000000000000000000000000000000000000000..06aee0e79fcc897886d2f81301874fe1747272d4 GIT binary patch literal 5388 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/images/tutorials/getting-started/zoom-panel.png b/src/main/resources/images/tutorials/getting-started/zoom-panel.png new file mode 100644 index 0000000000000000000000000000000000000000..060daf0fea0d5fdbb2c09ce43902746ab95e0c5e GIT binary patch literal 8788 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 ADgXcg literal 0 HcmV?d00001 From 6c86e7b1a134099a1ff2a82198e1442e25203836 Mon Sep 17 00:00:00 2001 From: creme332 <65414576+creme332@users.noreply.github.com> Date: Fri, 28 Jun 2024 16:17:32 +0400 Subject: [PATCH 5/6] refactor tutorial and use better images --- .../view/tutorial/GettingStartedTutorial.java | 110 +++++++++++------- .../tutorials/getting-started/menubar.png | Bin 0 -> 10108 bytes .../tutorials/getting-started/toast.png | Bin 5388 -> 4865 bytes .../tutorials/getting-started/zoom-panel.png | Bin 8788 -> 4129 bytes 4 files changed, 66 insertions(+), 44 deletions(-) create mode 100644 src/main/resources/images/tutorials/getting-started/menubar.png diff --git a/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java b/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java index cbeb8bbe..4bea671f 100644 --- a/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java +++ b/src/main/java/com/github/creme332/view/tutorial/GettingStartedTutorial.java @@ -5,6 +5,7 @@ import java.awt.*; import javax.swing.*; +import javax.swing.border.EmptyBorder; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import org.kordamp.ikonli.bootstrapicons.BootstrapIcons; @@ -20,16 +21,15 @@ public class GettingStartedTutorial extends TutorialPanel { private static final String IMAGE_PATH_PREFIX = "/images/tutorials/getting-started/"; private static final TutorialModel GETTING_STARTED_MODEL = new TutorialModel("Getting Started"); + GridBagConstraints gbc = new GridBagConstraints(); + JPanel mainPanel = new JPanel(new GridBagLayout()); + public GettingStartedTutorial() throws InvalidPathException, InvalidIconSizeException { super(GETTING_STARTED_MODEL, loadIcon(IMAGE_PATH_PREFIX + "background.png", getScaledDimension(new Dimension(753, 453), TutorialCard.IMAGE_DIMENSION))); // remove bodyPanel since default layout is not being used this.remove(bodyPanel); - // Create a main panel to hold all content with scrollable area - JPanel mainPanel = new JPanel(new GridBagLayout()); - - GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(10, 10, 10, 10); gbc.anchor = GridBagConstraints.NORTHWEST; gbc.fill = GridBagConstraints.HORIZONTAL; @@ -38,25 +38,39 @@ public GettingStartedTutorial() throws InvalidPathException, InvalidIconSizeExce // Add Introduction JLabel introLabel = new JLabel( - "

Getting Started Tutorial

Welcome to Polydraw! This tutorial will guide you through the various components and features of the interface to help you get started.

"); + "

Welcome to Polydraw! This tutorial will guide you through the various components of the interface to help you get started.

"); mainPanel.add(introLabel, gbc); gbc.gridy++; - // Add ZoomPanel explanation - JTextArea zoomPanelExplanation = createSectionText("Zoom Panel", - "The zoom panel is located on the right side of the application and allows you to control the zoom level and view of the canvas. The buttons include:"); - mainPanel.add(zoomPanelExplanation, gbc); - gbc.gridy++; + addMenubarSection(); + addZoomPanelSection(); + addToastSection(); + + // Make mainPanel scrollable + JScrollPane scrollPane = new JScrollPane(mainPanel, + javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrollPane.setBorder(BorderFactory.createEmptyBorder()); + scrollPane.getVerticalScrollBar().setUnitIncrement(16); - // Add ZoomPanel example image - JLabel zoomPanelImageLabel = new JLabel("Here is an example of what the Zoom Panel looks like on the Canvas:"); - mainPanel.add(zoomPanelImageLabel, gbc); + this.add(scrollPane, BorderLayout.CENTER); + } + + private void addZoomPanelSection() throws InvalidPathException { + // Add Zoom Panel section title + mainPanel.add(createSectionTitle("Zoom Panel"), gbc); gbc.gridy++; - ImageIcon zoomPanelIcon = loadIcon(IMAGE_PATH_PREFIX + "zoom-panel.png"); - JLabel zoomPanelImage = new JLabel(zoomPanelIcon); + + // add image + JLabel zoomPanelImage = new JLabel(loadIcon(IMAGE_PATH_PREFIX + "zoom-panel.png")); mainPanel.add(zoomPanelImage, gbc); gbc.gridy++; + JTextArea zoomPanelExplanation = createParagraph( + "The zoom panel is located on the bottom right side of the screen and allows you to control the zoom level of the canvas."); + mainPanel.add(zoomPanelExplanation, gbc); + gbc.gridy++; + // Add ZoomPanel buttons as a table JPanel zoomPanelTable = createButtonTable(new Object[][] { { FontIcon.of(BootstrapIcons.HOUSE, 30), "Home", "Reset the view to the home position." }, @@ -66,24 +80,39 @@ public GettingStartedTutorial() throws InvalidPathException, InvalidIconSizeExce }); mainPanel.add(zoomPanelTable, gbc); gbc.gridy++; + } + + private void addToastSection() throws InvalidPathException { + // add title + mainPanel.add(createSectionTitle("Toast"), gbc); + gbc.gridy++; - // Add Toast explanation - JTextArea toastExplanation = createSectionText("Toast Notifications", - "Toast notifications provide quick information about the current mode or action being performed. The toast includes a title and instructions, helping you understand what is expected at each step."); + // add image + mainPanel.add(new JLabel(loadIcon(IMAGE_PATH_PREFIX + "toast.png")), gbc); + gbc.gridy++; + + // add description + JTextArea toastExplanation = createParagraph( + "The toast is a temporary panel that appears on the bottom left side of the screen when you select a new drawing mode. It provides quick instructions about the current mode."); mainPanel.add(toastExplanation, gbc); gbc.gridy++; + } + + private void addMenubarSection() throws InvalidPathException { + // section title + mainPanel.add(createSectionTitle("Menubar"), gbc); + gbc.gridy++; - // Add Toast example image - JLabel toastImageLabel = new JLabel("Here is an example of what a toast looks like on the Canvas:"); - mainPanel.add(toastImageLabel, gbc); + // menubar image + mainPanel.add(new JLabel(loadIcon(IMAGE_PATH_PREFIX + "menubar.png")), gbc); gbc.gridy++; - ImageIcon toastIcon = loadIcon(IMAGE_PATH_PREFIX + "toast.png"); - JLabel toastImage = new JLabel(toastIcon); - mainPanel.add(toastImage, gbc); + + JTextArea buttonExplanation = createParagraph( + "The menubar contains the commonly used buttons which enable you to quickly change the drawing mode. There are several buttons available in the interface for various actions on the right side of the Menu Bar:"); + mainPanel.add(buttonExplanation, gbc); gbc.gridy++; - // Add Toast explanation as a table - JPanel toastTable = createTextTable(new Object[][] { + JPanel modesTable = createTextTable(new Object[][] { { "Mode", "Drag or select object" }, { "Freehand Shape", "Sketch a function or geometric object" }, { "Line: DDA", "Select two points or positions" }, @@ -104,15 +133,9 @@ public GettingStartedTutorial() throws InvalidPathException, InvalidIconSizeExce { "Normal Rotation", "Select object to rotate" }, { "Scaling", "Select object to scale then enter scaling factor" }, { "Shear", "Select object to translate, then enter scaling factor" }, - { "Clipping", "Draw clipping region with mouse drag" } + { "Clip", "Draw clipping region with mouse drag" } }); - mainPanel.add(toastTable, gbc); - gbc.gridy++; - - // Add Detailed Button explanations - JTextArea buttonExplanation = createSectionText("Buttons on the right side", - "There are several buttons available in the interface for various actions on the right side of the Menu Bar:"); - mainPanel.add(buttonExplanation, gbc); + mainPanel.add(modesTable, gbc); gbc.gridy++; // Add action buttons as a table @@ -123,20 +146,19 @@ public GettingStartedTutorial() throws InvalidPathException, InvalidIconSizeExce { FontIcon.of(BootstrapIcons.ARROW_CLOCKWISE, 40), "Redo", "Redo the last undone action." } }); mainPanel.add(actionButtonsTable, gbc); + gbc.gridy++; + } - // Add scrollable area with faster scrolling - JScrollPane scrollPane = new JScrollPane(mainPanel, - javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrollPane.setBorder(BorderFactory.createEmptyBorder()); - scrollPane.getVerticalScrollBar().setUnitIncrement(16); - - this.add(scrollPane, BorderLayout.CENTER); + private JLabel createSectionTitle(String title) { + JLabel titleLabel = new JLabel(title); + titleLabel.setBorder(new EmptyBorder(new Insets(20, 0, 0, 0))); + titleLabel.putClientProperty("FlatLaf.style", "font: bold $h3.font"); + return titleLabel; } - private JTextArea createSectionText(String title, String content) { + private JTextArea createParagraph(String content) { JTextArea textArea = new JTextArea(); - textArea.setText(title + "\n\n" + content); + textArea.setText(content); textArea.setWrapStyleWord(true); textArea.setLineWrap(true); textArea.setEditable(false); diff --git a/src/main/resources/images/tutorials/getting-started/menubar.png b/src/main/resources/images/tutorials/getting-started/menubar.png new file mode 100644 index 0000000000000000000000000000000000000000..74e7b7d4afd88c784bcf7e8007e9847a54a21044 GIT binary patch literal 10108 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 tN;}zr={3i&_)o2&MgwU__8_iygkcP;<` literal 5388 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 diff --git a/src/main/resources/images/tutorials/getting-started/zoom-panel.png b/src/main/resources/images/tutorials/getting-started/zoom-panel.png index 060daf0fea0d5fdbb2c09ce43902746ab95e0c5e..6110e744e185c6d3c9bf9c4f678e9906cc2cf6af 100644 GIT binary patch literal 4129 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 P#(F?oLtnj8%^~hzqf!m4 literal 8788 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 ADgXcg From 9cffcfd72b9b4ee2975da6a13d7a0a9fc7490161 Mon Sep 17 00:00:00 2001 From: creme332 <65414576+creme332@users.noreply.github.com> Date: Fri, 28 Jun 2024 16:20:10 +0400 Subject: [PATCH 6/6] remove incorrectly placed plugins tag --- pom.xml | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 03dd7610..6fe4b023 100644 --- a/pom.xml +++ b/pom.xml @@ -1,8 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.github.creme332 @@ -49,17 +48,14 @@ - + - + maven-clean-plugin 3.1.0 - + maven-resources-plugin 3.0.2 @@ -84,8 +80,7 @@ maven-deploy-plugin 2.8.2 - + maven-site-plugin 3.7.1 @@ -125,17 +120,5 @@ - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 17 - 17 - - - \ No newline at end of file