fix: replace broken version filters with custom Save As dialog

rfd does not expose the selected filter index, so the old DWG/DXF version
filters had no effect — every file was always saved as AC1032 (R2018).

Replace with a single custom iced Save As window that shows:
- File name text input
- Save-in folder input + Browse button (rfd folder picker)
- Format dropdown: DWG/DXF × 2018/2013/2010/2007/2004/2000/R14
- Save / Cancel buttons

The selected format is passed to save_as_version() which temporarily sets
doc.version before writing, so DwgWriter/DxfWriter emit the correct file
format. Also works in the unsaved-changes Save flow.

Closes #9

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Hakan SevenandClaude Sonnet 4.6 committed 2026-05-01 16:12:32 +03:00
1 parent 9974456a5d
commit 9cd8eff77f
4 files changed
+308 -67

No files matched your search

+28
View File
@@ -153,6 +153,18 @@ pub(super) struct H7CAD {
/// OS window for the unsaved-changes confirmation dialog.
unsaved_dialog_window: Option<window::Id>,
// ── Custom Save-As dialog ─────────────────────────────────────────────
/// OS window for the custom Save As dialog (format + filename + folder).
save_dialog_window: Option<window::Id>,
/// Currently selected format string, e.g. "DWG 2013".
save_dialog_format: String,
/// Editable filename (without path), e.g. "drawing.dwg".
save_dialog_filename: String,
/// Target folder path (as a string for editing).
save_dialog_folder: String,
/// True when triggered from the unsaved-changes flow.
save_dialog_for_unsaved: bool,
// ── DimStyle Dialog ───────────────────────────────────────────────────
/// Name of the style currently shown in the dialog.
dimstyle_selected: String,
@@ -201,6 +213,14 @@ pub enum Message {
SaveFile,
SaveAs,
PickedSavePath(Option<PathBuf>),
// ── Custom Save-As dialog ─────────────────────────────────────────────
SaveDialogFormatChanged(String),
SaveDialogFilenameChanged(String),
SaveDialogFolderChanged(String),
SaveDialogBrowse,
SaveDialogFolderPicked(Option<std::path::PathBuf>),
SaveDialogConfirm,
SaveDialogCancel,
ClearScene,
SetWireframe(bool),
/// Switch camera projection: true = Orthographic, false = Perspective.
@@ -624,6 +644,13 @@ impl H7CAD {
page_setup_scale: "Fit".to_string(),
pending_close: None,
unsaved_dialog_window: None,
save_dialog_window: None,
save_dialog_format: "DWG 2018".to_string(),
save_dialog_filename: "drawing.dwg".to_string(),
save_dialog_folder: std::env::var("HOME")
.or_else(|_| std::env::var("USERPROFILE"))
.unwrap_or_else(|_| ".".to_string()),
save_dialog_for_unsaved: false,
// Plot style
active_plot_style: None,
// Color scheme (default: dark CAD-style)
@@ -705,6 +732,7 @@ pub fn run() -> iced::Result {
if Some(window_id) == state.shortcuts_window { return "Keyboard Shortcuts".into(); }
if Some(window_id) == state.about_window { return "About H7CAD".into(); }
if Some(window_id) == state.unsaved_dialog_window { return "Unsaved Changes".into(); }
if Some(window_id) == state.save_dialog_window { return "Save As".into(); }
if let Some(tab) = state.tabs.get(state.active_tab) {
let dot = if tab.dirty { "● " } else { "" };
let name = tab.tab_display_name();