Skip to content

Commit 66af4e4

Browse files
committed
feat(ProjectMeta): support project meta edit
1 parent 6364b9a commit 66af4e4

File tree

3 files changed

+151
-2
lines changed

3 files changed

+151
-2
lines changed

src/main/java/chiloven/xamlsorter/modules/ProjectManager.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,39 @@
1717
public class ProjectManager {
1818
private static final Logger logger = LogManager.getLogger(ProjectManager.class);
1919

20+
/**
21+
* Edit the current project metadata.
22+
*
23+
* @param mainPage the MainPage instance to update
24+
*/
25+
public static void editProjectMeta(MainPage mainPage) {
26+
logger.debug("Opening project metadata edit dialog...");
27+
try {
28+
ProjectMeta currentMeta = MainPage.getCurrentProjectMeta();
29+
ProjectMeta updatedMeta = chiloven.xamlsorter.ui.dialogs.ProjectMetaEditDialog.show(
30+
mainPage.getRootPane().getScene().getWindow(),
31+
currentMeta
32+
);
33+
34+
if (updatedMeta != null) {
35+
logger.debug("User confirmed project metadata edit: {}", updatedMeta.getName());
36+
mainPage.setCurrentProjectMeta(updatedMeta);
37+
mainPage.setModified(true);
38+
logger.info("Project metadata updated: {}", updatedMeta.getName());
39+
} else {
40+
logger.debug("User cancelled project metadata edit dialog.");
41+
}
42+
} catch (Exception e) {
43+
logger.error("Failed to edit project metadata", e);
44+
ShowAlert.error(
45+
getLang("general.alert.error"),
46+
getLang("dialog.edit_proj.exception.alert.header"),
47+
getLang("dialog.edit_proj.exception.alert.content"),
48+
e
49+
);
50+
}
51+
}
52+
2053
/**
2154
* Open an existing project file (.xsproject), load data and update the main page.
2255
*
@@ -180,7 +213,7 @@ public static boolean createProject(MainPage mainPage) {
180213
/**
181214
* Import a XAML file into the current project.
182215
*
183-
* @param mainPage the MainPage instance to access grouped data
216+
* @param mainPage the MainPage instance to access grouped data
184217
* @param isTranslated true if importing a translation XAML file, false for an original XAML file
185218
*/
186219
public static void importXaml(MainPage mainPage, boolean isTranslated) {
@@ -226,7 +259,7 @@ public static void importXaml(MainPage mainPage, boolean isTranslated) {
226259
/**
227260
* Create a new project from a XAML file.
228261
*
229-
* @param mainPage the MainPage instance to access grouped data
262+
* @param mainPage the MainPage instance to access grouped data
230263
* @param isTranslated true if importing a translation XAML file, false for an original XAML file
231264
* @see #createProject(MainPage)
232265
* @see #importXaml(MainPage, boolean)
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package chiloven.xamlsorter.ui.dialogs;
2+
3+
import chiloven.xamlsorter.entities.ProjectMeta;
4+
import chiloven.xamlsorter.modules.I18n;
5+
import chiloven.xamlsorter.utils.ShowAlert;
6+
import javafx.geometry.Insets;
7+
import javafx.scene.Scene;
8+
import javafx.scene.control.*;
9+
import javafx.scene.layout.VBox;
10+
import javafx.stage.Modality;
11+
import javafx.stage.Window;
12+
import org.apache.logging.log4j.LogManager;
13+
import org.apache.logging.log4j.Logger;
14+
15+
import static chiloven.xamlsorter.modules.I18n.getLang;
16+
17+
public class ProjectMetaEditDialog extends Dialog<ProjectMeta> {
18+
private static final Logger logger = LogManager.getLogger(ProjectMetaEditDialog.class);
19+
20+
private final TextField projectNameField;
21+
private final TextField projectAuthorField;
22+
private final TextArea projectDescField;
23+
24+
public ProjectMetaEditDialog(Window owner, ProjectMeta currentMeta) {
25+
this.projectNameField = new TextField(currentMeta.getName());
26+
this.projectAuthorField = new TextField(currentMeta.getAuthor());
27+
this.projectDescField = new TextArea(currentMeta.getDescription());
28+
29+
try {
30+
setupDialog(owner);
31+
} catch (Exception e) {
32+
logger.error("Failed to create Project Meta Edit dialog", e);
33+
ShowAlert.error(
34+
getLang("general.alert.error"),
35+
getLang("dialog.edit_proj.exception.alert.header"),
36+
getLang("dialog.edit_proj.exception.alert.content"),
37+
e
38+
);
39+
}
40+
}
41+
42+
public static ProjectMeta show(Window owner, ProjectMeta currentMeta) {
43+
logger.debug("Opening Project Meta Edit dialog");
44+
try {
45+
ProjectMetaEditDialog dialog = new ProjectMetaEditDialog(owner, currentMeta);
46+
return dialog.showAndWait().orElse(null);
47+
} catch (Exception e) {
48+
logger.error("Failed to show Project Meta Edit dialog", e);
49+
ShowAlert.error(
50+
getLang("general.alert.error"),
51+
getLang("dialog.edit_proj.exception.alert.header"),
52+
getLang("dialog.edit_proj.exception.alert.content"),
53+
e
54+
);
55+
return null;
56+
}
57+
}
58+
59+
private void setupDialog(Window owner) {
60+
setTitle(getLang("dialog.edit_proj.title"));
61+
initModality(Modality.WINDOW_MODAL);
62+
initOwner(owner);
63+
64+
VBox content = new VBox(10);
65+
content.setPrefHeight(160.0);
66+
content.setPrefWidth(320.0);
67+
68+
Label titleLabel = new Label(getLang("dialog.edit_proj.title.label"));
69+
titleLabel.setStyle("-fx-font-size: 16px; -fx-font-weight: bold;");
70+
71+
projectNameField.setPromptText(getLang("dialog.new_proj.name.label"));
72+
projectAuthorField.setPromptText(getLang("dialog.new_proj.author.label"));
73+
projectDescField.setPromptText(getLang("dialog.new_proj.description.label"));
74+
projectDescField.setPrefRowCount(2);
75+
76+
content.getChildren().addAll(
77+
titleLabel,
78+
projectNameField,
79+
projectAuthorField,
80+
projectDescField
81+
);
82+
83+
ButtonType saveButton = new ButtonType(getLang("general.button.save"),
84+
ButtonBar.ButtonData.OK_DONE);
85+
ButtonType cancelButton = new ButtonType(getLang("general.button.cancel"),
86+
ButtonBar.ButtonData.CANCEL_CLOSE);
87+
getDialogPane().getButtonTypes().addAll(saveButton, cancelButton);
88+
89+
getDialogPane().setContent(content);
90+
getDialogPane().setPadding(new Insets(10));
91+
92+
setResultConverter(buttonType -> {
93+
if (buttonType == saveButton) {
94+
return getProjectMeta();
95+
}
96+
return null;
97+
});
98+
99+
Scene scene = getDialogPane().getScene();
100+
I18n.applyDefaultFont(scene);
101+
102+
logger.debug("Project Meta Edit dialog initialized");
103+
}
104+
105+
private ProjectMeta getProjectMeta() {
106+
return new ProjectMeta(
107+
projectNameField.getText().trim(),
108+
projectDescField.getText().trim(),
109+
projectAuthorField.getText().trim()
110+
);
111+
}
112+
}

src/main/java/chiloven/xamlsorter/ui/widgets/TopMenuBar.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ private Menu createEditMenu() {
123123
MenuItem preferences = new MenuItem(getLang("widget.menu_bar.edit.preferences"));
124124
preferences.setOnAction(e -> PreferencesDialog.show(mainPage.getRootPane().getScene().getWindow()));
125125

126+
MenuItem editProjectMeta = new MenuItem(getLang("widget.menu_bar.edit.project_meta"));
127+
editProjectMeta.setOnAction(e -> ProjectManager.editProjectMeta(mainPage));
128+
126129
menu.getItems().addAll(
127130
undo,
128131
redo,
@@ -137,6 +140,7 @@ private Menu createEditMenu() {
137140
selectAll,
138141
unselectAll,
139142
new SeparatorMenuItem(),
143+
editProjectMeta,
140144
preferences
141145
);
142146

0 commit comments

Comments
 (0)