Skip to content

Commit 1686fa0

Browse files
committed
Fixed an issue, changed mod creation, added onboarding.
1 parent 9f02265 commit 1686fa0

3 files changed

Lines changed: 148 additions & 35 deletions

File tree

src/main/java/dev/ambershadow/cogfly/Cogfly.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.google.gson.JsonObject;
44
import com.sun.jna.Native;
5+
import dev.ambershadow.cogfly.elements.profiles.ProfilesScreenElement;
56
import dev.ambershadow.cogfly.loader.ModData;
67
import dev.ambershadow.cogfly.loader.ModFetcher;
78
import dev.ambershadow.cogfly.util.*;
@@ -255,6 +256,27 @@ private static void showEarlyDialogs(){
255256
prompt.pack();
256257
prompt.setVisible(true);
257258
}
259+
260+
261+
if (ProfileManager.profiles.isEmpty() && !settings.baseGameEnabled){
262+
int confirm = JOptionPane.showConfirmDialog(FrameManager.getOrCreate().frame,
263+
"You don't have any profiles! Are you ready to create one?",
264+
"Profile Onboarding",
265+
JOptionPane.YES_NO_OPTION,
266+
JOptionPane.QUESTION_MESSAGE);
267+
268+
if (confirm == JOptionPane.YES_OPTION) {
269+
FrameManager.getOrCreate().setPage(
270+
FrameManager.CogflyPage.PROFILES,
271+
FrameManager.getOrCreate().profilesPageButton
272+
);
273+
ProfilesScreenElement.promptCreation(() -> JOptionPane.showMessageDialog(
274+
FrameManager.getOrCreate().frame,
275+
"Congratulations on creating your first profile! Click on its icon to manage it and install mods!",
276+
"Profile Onboarding",
277+
JOptionPane.INFORMATION_MESSAGE));
278+
}
279+
}
258280
}
259281

260282

src/main/java/dev/ambershadow/cogfly/elements/profiles/ProfileCardElement.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package dev.ambershadow.cogfly.elements.profiles;
22

33
import com.formdev.flatlaf.FlatLaf;
4+
import dev.ambershadow.cogfly.elements.SelectedPageButtonElement;
45
import dev.ambershadow.cogfly.loader.ModData;
56
import dev.ambershadow.cogfly.util.*;
67

78
import javax.swing.*;
89
import java.awt.*;
10+
import java.awt.event.MouseAdapter;
11+
import java.awt.event.MouseEvent;
912
import java.util.ArrayList;
1013
import java.util.List;
1114
import java.util.concurrent.CompletableFuture;
@@ -69,6 +72,27 @@ public ProfileCardElement(Profile profile, Icon icon) {
6972
add(launchButton, BorderLayout.SOUTH);
7073

7174
setBackground(normal);
75+
MouseAdapter mouseHandler = new MouseAdapter() {
76+
@Override
77+
public void mouseClicked(MouseEvent e) {
78+
if (SwingUtilities.isDescendingFrom(
79+
e.getComponent(), launchButton)) {
80+
return;
81+
}
82+
JPanel pages = FrameManager.getOrCreate().getPagePanel();
83+
panel.reload();
84+
((CardLayout)pages.getLayout()).show(pages, profile.getName());
85+
SelectedPageButtonElement button = FrameManager.getOrCreate().getCurrentPageButton();
86+
button.setBackground(UIManager.getColor("Button.background"));
87+
button.selected = false;
88+
}
89+
};
90+
91+
addMouseListener(mouseHandler);
92+
93+
for (Component c : getComponents()) {
94+
c.addMouseListener(mouseHandler);
95+
}
7296

7397
Timer colorUpdate = new Timer(100, _ -> {
7498
normal = UIManager.getColor("Button.background").darker();
@@ -80,7 +104,6 @@ public ProfileCardElement(Profile profile, Icon icon) {
80104
hover = FlatLaf.isLafDark() ? hover.brighter() : hover.darker();
81105
});
82106
colorUpdate.start();
83-
84107
HoverLerp.install(this, () -> normal, () -> hover);
85108
}
86109
}

src/main/java/dev/ambershadow/cogfly/elements/profiles/ProfilesScreenElement.java

Lines changed: 102 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,114 @@
55
import dev.ambershadow.cogfly.util.*;
66

77
import javax.swing.*;
8+
import javax.swing.event.DocumentEvent;
9+
import javax.swing.event.DocumentListener;
810
import java.awt.*;
11+
import java.awt.event.MouseEvent;
12+
import java.nio.file.Files;
13+
import java.nio.file.Paths;
914
import java.util.ArrayList;
1015
import java.util.List;
1116
import java.util.concurrent.CompletableFuture;
1217

1318
public class ProfilesScreenElement extends JPanel implements ReloadablePage {
19+
public static void promptCreation(Runnable callback){
20+
JDialog prompt = new JDialog(FrameManager.getOrCreate().frame);
21+
prompt.setModal(true);
22+
prompt.setSize(new Dimension(300, 150));
23+
prompt.setResizable(false);
24+
prompt.setLocationRelativeTo(null);
25+
prompt.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
26+
JPanel holder = new JPanel();
27+
JLabel name = new JLabel("Name: ");
28+
JTextField nameField = new JTextField("");
29+
JLabel icon = new JLabel("Icon (optional): ");
30+
JButton button = new JButton("Click here to select a file");
31+
JPanel extraHolder = new JPanel();
32+
extraHolder.add(icon);
33+
extraHolder.add(button);
34+
35+
JButton create = new JButton("Create");
36+
create.setEnabled(false);
37+
create.setPreferredSize(new Dimension(50, 20));
38+
create.addActionListener(_ -> {
39+
prompt.dispose();
40+
ProfileManager.createProfile(nameField.getText(),
41+
button.getText().equals("Click here to select a file") ? "" :
42+
button.getText());
43+
FrameManager.getOrCreate().getCurrentPage().reload();
44+
callback.run();
45+
});
46+
47+
nameField.getDocument().addDocumentListener(new DocumentListener() {
48+
@Override
49+
public void insertUpdate(DocumentEvent e) {
50+
updateValidity();
51+
}
52+
53+
@Override
54+
public void removeUpdate(DocumentEvent e) {
55+
updateValidity();
56+
}
57+
@Override
58+
public void changedUpdate(DocumentEvent e) {}
59+
60+
private void updateValidity(){
61+
boolean valid = nameField.getText().matches("\\w+");
62+
create.setEnabled(valid);
63+
nameField.setToolTipText("Profile names can only contain letters, numbers, and underscores.");
64+
forceTooltip(valid);
65+
if (!valid)
66+
return;
67+
boolean exists = Files.exists(Paths.get(Cogfly.settings.profileSavePath).resolve(nameField.getText()));
68+
create.setEnabled(!exists);
69+
nameField.setToolTipText("A profile with this name already exists in the profile save folder.");
70+
forceTooltip(exists);
71+
}
72+
73+
private void forceTooltip(boolean show){
74+
if (show){
75+
ToolTipManager toolTipManager = ToolTipManager.sharedInstance();
76+
toolTipManager.setInitialDelay(0);
77+
MouseEvent phantomEvent = new MouseEvent(
78+
nameField,
79+
MouseEvent.MOUSE_MOVED,
80+
System.currentTimeMillis(),
81+
0,
82+
nameField.getWidth() / 2,
83+
nameField.getHeight() / 2,
84+
0,
85+
false
86+
);
87+
toolTipManager.mouseMoved(phantomEvent);
88+
} else {
89+
ToolTipManager ttm = ToolTipManager.sharedInstance();
90+
91+
MouseEvent exitEvent = new MouseEvent(
92+
nameField,
93+
MouseEvent.MOUSE_EXITED,
94+
System.currentTimeMillis(),
95+
0,
96+
-1,
97+
-1,
98+
0,
99+
false
100+
);
101+
102+
ttm.mouseExited(exitEvent);
103+
}
104+
}
105+
});
14106

107+
button.addActionListener(_ -> Utils.pickFile((path) -> button.setText(path.toString()), "*", "png", "jpg", "jpeg", "gif"));
108+
create.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
109+
holder.add(name, BorderLayout.WEST);
110+
holder.add(nameField, BorderLayout.EAST);
111+
prompt.add(holder, BorderLayout.NORTH);
112+
prompt.add(extraHolder, BorderLayout.CENTER);
113+
prompt.add(create, BorderLayout.SOUTH);
114+
prompt.setVisible(true);
115+
}
15116
private final JPanel parentPanel;
16117
private final JScrollPane pane;
17118
public ProfilesScreenElement() {
@@ -98,40 +199,7 @@ public ProfilesScreenElement() {
98199

99200

100201
JButton createProfile = new JButton("Create Profile");
101-
createProfile.addActionListener(_ -> {
102-
JDialog prompt = new JDialog(FrameManager.getOrCreate().frame);
103-
prompt.setModal(true);
104-
prompt.setSize(new Dimension(300, 150));
105-
prompt.setResizable(false);
106-
prompt.setLocationRelativeTo(null);
107-
prompt.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
108-
JPanel holder = new JPanel();
109-
JLabel name = new JLabel("Name: ");
110-
JTextField nameField = new JTextField("");
111-
JLabel icon = new JLabel("Icon (optional): ");
112-
JButton button = new JButton("Click here to select a file");
113-
JPanel extraHolder = new JPanel();
114-
extraHolder.add(icon);
115-
extraHolder.add(button);
116-
117-
JButton create = new JButton("Create");
118-
create.setPreferredSize(new Dimension(50, 20));
119-
create.addActionListener(_ -> {
120-
prompt.dispose();
121-
ProfileManager.createProfile(nameField.getText(),
122-
button.getText().equals("Click here to select a file") ? "" :
123-
button.getText());
124-
drawProfiles();
125-
});
126-
button.addActionListener(_ -> Utils.pickFile((path) -> button.setText(path.toString()), "*", "png", "jpg", "jpeg", "gif"));
127-
create.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
128-
holder.add(name, BorderLayout.WEST);
129-
holder.add(nameField, BorderLayout.EAST);
130-
prompt.add(holder, BorderLayout.NORTH);
131-
prompt.add(extraHolder, BorderLayout.CENTER);
132-
prompt.add(create, BorderLayout.SOUTH);
133-
prompt.setVisible(true);
134-
});
202+
createProfile.addActionListener(_ -> promptCreation(() -> {}));
135203

136204
upperPanel.add(createProfile);
137205
upperPanel.add(launchVanilla);

0 commit comments

Comments
 (0)