feat(options): offer the file association in Options

Registering as the .dwg/.dxf handler was reachable only by typing
FILEASSOC, which is also the only thing that installs the icons the
desktop shows — so a user with no reason to know the command had no way
to arrive at either.

The checkbox makes the same two calls the command does, so the stored
setting and the actual registration cannot drift apart. A registration
the system refuses puts the checkbox back rather than leaving it showing
a state that is not true.

The line under it says the icons come with it, since that is what sends
people looking for this in the first place.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
Hakan SevenandClaude Opus 5 committed 2026-08-07 17:51:06 +03:00
1 parent 7c8271c716
commit 26b4f29a13
4 files changed
+54

No files matched your search

+3
View File
@@ -1767,6 +1767,9 @@ pub enum Message {
OptionsThemeChanged(String),
/// Edit one of Custom theme's six base colours as #RRGGBB.
OptionsThemeColorChanged(usize, String),
/// Register or unregister as the .dwg/.dxf handler, from Options. Same
/// setting the FILEASSOC command carries.
FileAssocChanged(bool),
/// Switch the interface language and redraw localized views.
LanguageChanged(crate::i18n::Language),
/// Drop every entity from the active drawing.
+33
View File
@@ -5087,6 +5087,39 @@ impl OpenCADStudio {
Task::none()
}
Message::FileAssocChanged(enabled) => {
// The same two calls FILEASSOC makes, so the checkbox and the
// command cannot leave the setting and the registration
// disagreeing.
self.file_assoc_enabled = enabled;
self.persist_settings_if_changed();
let outcome = if enabled {
crate::io::file_association::register_as_handler()
} else {
crate::io::file_association::unregister_handler()
};
match outcome {
Ok(()) => {
let said = if enabled {
crate::t!("Registered as a .dwg/.dxf handler.")
} else {
crate::t!("No longer registered as a file handler.")
};
self.command_line.push_output(said.as_ref());
}
Err(why) => {
// The setting is what the user asked for; the
// registration is what the system allowed. Put the
// checkbox back rather than showing a state that is not
// true.
self.file_assoc_enabled = !enabled;
self.persist_settings_if_changed();
self.command_line
.push_error(crate::tf!("File association failed: {why}").as_ref());
}
}
Task::none()
}
Message::LanguageChanged(language) => {
if self.language == language {
return Task::none();
+1
View File
@@ -91,6 +91,7 @@ impl OpenCADStudio {
|flow| {
crate::ui::window::options::view_window(
&self.default_save_format,
self.file_assoc_enabled,
&self.ui_theme,
&self.theme_color_inputs,
self.language,
+17
View File
@@ -20,6 +20,7 @@ impl<T> fmt::Display for Labelled<T> {
pub fn view_window<'a>(
default_save_format: &'a str,
file_assoc_enabled: bool,
ui_theme: &'a UiThemeConfig,
theme_color_inputs: &'a [String; 6],
language: crate::i18n::Language,
@@ -137,6 +138,22 @@ pub fn view_window<'a>(
text(crate::tr!("options-default-save-format-help"))
.size(11)
.width(sizing.width),
Space::new().height(14),
row![
iced::widget::checkbox(file_assoc_enabled)
.on_toggle(Message::FileAssocChanged)
.size(15),
text(crate::t!("Open .dwg and .dxf files with Open CAD Studio"))
.size(12),
]
.spacing(8)
.align_y(iced::Center),
Space::new().height(6),
text(crate::t!(
"Also installs the application and file-type icons the desktop shows."
))
.size(11)
.width(sizing.width),
Space::new().height(22),
text(crate::tr!("options-theme-section")).size(15),
Space::new().height(10),