feat(ui): migrate dialogs across application to shared dialog_button and form_radio builders

This commit is contained in:
Karim Jerbi committed 2026-09-24 17:33:45 +01:00
1 parent 1a6279e841
commit 6b37476687
36 files changed
+214 -197

No files matched your search

+1 -5
View File
@@ -1751,11 +1751,7 @@ fn dialog_button<'a>(
message: Message,
style: fn(&Theme, button::Status) -> button::Style,
) -> Element<'a, Message> {
button(text(label.into()).size(13))
.on_press(message)
.style(style)
.padding([6, 18])
.into()
crate::ui::style::form::dialog_button_styled(label.into(), message, style).into()
}
fn dialog_body_style(theme: &Theme) -> container::Style {
+12 -21
View File
@@ -1498,7 +1498,8 @@ fn qselect_content<'a>(
candidate_count: usize,
sizing: crate::ui::modal::ModalSizing,
) -> Element<'a, Message> {
use iced::widget::{checkbox, radio, rule};
use iced::widget::{checkbox, rule};
use crate::ui::style::form::{dialog_button, dialog_button_styled_opt, form_radio};
let mut type_options: Vec<String> = vec![QSELECT_ANY_TYPE.to_string()];
type_options.extend(types.iter().cloned());
@@ -1627,18 +1628,12 @@ fn qselect_content<'a>(
append = append.on_toggle(Message::QSelectSetAppend);
}
let cancel = button(text(t!("Cancel")).size(12))
.on_press(Message::QSelectClose)
.style(button::subtle)
.padding([5, 16]);
let apply = button(text(t!("Apply")).size(12))
.style(button::primary)
.padding([5, 18]);
let apply = if error.is_none() {
apply.on_press(Message::QSelectApply)
} else {
apply
};
let cancel = dialog_button(t!("Cancel"), Message::QSelectClose, false);
let apply = dialog_button_styled_opt(
t!("Apply"),
error.is_none().then_some(Message::QSelectApply),
button::primary,
);
let panel_body = column![
section_label(t!("Scope")),
@@ -1722,22 +1717,18 @@ fn qselect_content<'a>(
section_label(t!("Result")),
Space::new().height(5),
column![
radio(
form_radio(
t!("Include matching objects"),
crate::app::QSelectMode::Include,
Some(state.mode),
Message::QSelectSetMode,
)
.size(14)
.text_size(12),
radio(
),
form_radio(
t!("Exclude matching objects"),
crate::app::QSelectMode::Exclude,
Some(state.mode),
Message::QSelectSetMode,
)
.size(14)
.text_size(12),
),
]
.spacing(5),
Space::new().height(8),
+27 -5
View File
@@ -19,14 +19,36 @@ pub fn dialog_button<'a>(
on_press: Message,
primary: bool,
) -> button::Button<'a, Message> {
button(text(label).size(12))
.on_press(on_press)
.padding([6, 18])
.style(if primary {
dialog_button_styled(
label,
on_press,
if primary {
button::primary
} else {
button::secondary
})
},
)
}
/// Standard dialog action button with an explicit button style and optional on_press action.
pub fn dialog_button_styled_opt<'a>(
label: impl text::IntoFragment<'a>,
on_press: Option<Message>,
style: fn(&Theme, button::Status) -> button::Style,
) -> button::Button<'a, Message> {
button(text(label).size(12))
.on_press_maybe(on_press)
.padding([6, 18])
.style(style)
}
/// Standard dialog action button with an explicit button style (primary, secondary, danger, warning, etc.).
pub fn dialog_button_styled<'a>(
label: impl text::IntoFragment<'a>,
on_press: Message,
style: fn(&Theme, button::Status) -> button::Style,
) -> button::Button<'a, Message> {
dialog_button_styled_opt(label, Some(on_press), style)
}
/// Unified radio button helper ensuring consistent 16px size for exact pixel-grid concentric alignment.
+8 -14
View File
@@ -6,9 +6,10 @@
//! does the same without the dialog.
use crate::app::Message;
use iced::widget::{button, canvas, column, container, radio, row, text, text_input, Space};
use iced::{mouse, Background, Border, Element, Length, Point, Rectangle, Size, Theme};
use crate::ui::style::common::muted_style;
use crate::ui::style::form::{dialog_button, form_radio};
use iced::widget::{button, canvas, column, container, row, text, text_input, Space};
use iced::{mouse, Background, Border, Element, Length, Point, Rectangle, Size, Theme};
use crate::t;
use std::borrow::Cow;
@@ -162,29 +163,22 @@ pub fn view_window<'a>(
.align_y(iced::Center);
let radios = column![
radio(
form_radio(
t!("Set Size Relative to Screen"),
true,
Some(relative),
Message::PointStyleSizeRelative,
)
.size(16)
.text_size(13),
radio(
),
form_radio(
t!("Set Size in Absolute Units"),
false,
Some(relative),
Message::PointStyleSizeRelative,
)
.size(16)
.text_size(13),
),
]
.spacing(6);
let ok = button(text(t!("OK")).size(13))
.padding([5, 22])
.on_press(Message::PointStyleOk)
.style(button::primary);
let ok = dialog_button(t!("OK"), Message::PointStyleOk, true);
container(
column![
+3 -5
View File
@@ -1,7 +1,8 @@
use crate::app::Message;
use crate::t;
use crate::ui::style::common::muted_style;
use iced::widget::{button, column, container, row, svg, text, Space};
use crate::ui::style::form::dialog_button;
use iced::widget::{column, container, row, svg, text, Space};
use iced::{Background, Border, Element, Fill, Length, Shrink, Theme};
fn primary_style(theme: &Theme) -> iced::widget::text::Style {
@@ -136,10 +137,7 @@ pub fn view_window(
.spacing(8)
.width(content_width);
let copy = button(text(t!("Copy Info")).size(11))
.on_press(Message::AboutCopyInfo)
.style(button::primary)
.padding([6, 16]);
let copy = dialog_button(t!("Copy Info"), Message::AboutCopyInfo, true);
container(
column![
+38 -12
View File
@@ -13,6 +13,7 @@ use iced::{Border, Element, Fill, Length, Theme};
use crate::app::Message;
use crate::t;
use crate::ui::style::form::{dialog_button, dialog_button_styled_opt, form_radio};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum TableSource {
@@ -435,9 +436,7 @@ fn cell_style_picker<'a>(
}
fn radio_button<'a>(selected: bool, label: impl Into<String>, msg: Message) -> Element<'a, Message> {
let mark = if selected { "◉" } else { "○" };
button(row![text(mark).size(13), text(label.into()).size(12)].spacing(6))
.on_press(msg).padding([4, 7]).style(button::text).into()
form_radio(label, true, selected.then_some(true), move |_| msg.clone()).into()
}
fn preview_grid<'a>(rows: &'a [Vec<String>]) -> Element<'a, Message> {
@@ -484,7 +483,11 @@ pub fn table_insert_view(state: &TableInsertState, sizing: crate::ui::modal::Mod
group(t!("Set cell styles"), cell_styles.into()),
checkbox(state.preview).label(t!("Preview")).on_toggle(|v| Message::TableInsertField(TableInsertField::Preview(v))).size(14),
text(&state.error).size(11),
row![Space::new().width(Fill), button(text(t!("Cancel")).size(12)).on_press(Message::CloseModal).padding([5, 12]), button(text(t!("OK")).size(12)).on_press(Message::TableInsertApply).style(button::primary).padding([5, 12])].spacing(7),
row![
Space::new().width(Fill),
dialog_button(t!("Cancel"), Message::CloseModal, false),
dialog_button(t!("OK"), Message::TableInsertApply, true),
].spacing(8),
].spacing(8).padding(10).width(sizing.width).height(sizing.height).into()
}
@@ -542,22 +545,45 @@ pub fn data_link_view(state: &DataLinkManagerState, sizing: crate::ui::modal::Mo
group(t!("Details"), text(t!("Select a data link or create a new one.")).size(11).style(muted).into())
};
let actions = if state.editing {
row![Space::new().width(Fill), button(text(t!("Cancel")).size(12)).on_press(Message::DataLinkEditCancel).padding([5, 11]), button(text(t!("OK")).size(12)).on_press(Message::DataLinkSave).style(button::primary).padding([5, 11])].spacing(7)
row![
Space::new().width(Fill),
dialog_button(t!("Cancel"), Message::DataLinkEditCancel, false),
dialog_button(t!("OK"), Message::DataLinkSave, true),
]
.spacing(8)
} else {
let enabled = state.selected.is_some();
let edit = button(text(t!("Edit")).size(12)).padding([5, 11]);
let delete = button(text(t!("Delete")).size(12)).padding([5, 11]);
let insert = button(text(t!("Insert Table")).size(12)).padding([5, 11]);
row![if enabled { edit.on_press(Message::DataLinkEdit) } else { edit }, if enabled { delete.on_press(Message::DataLinkDelete) } else { delete }, Space::new().width(Fill), if enabled { insert.on_press(Message::DataLinkInsert) } else { insert }, button(text(t!("Close")).size(12)).on_press(Message::DataLinkClose).padding([5, 11])].spacing(7)
let edit = dialog_button_styled_opt(t!("Edit"), enabled.then_some(Message::DataLinkEdit), button::secondary);
let delete = dialog_button_styled_opt(t!("Delete"), enabled.then_some(Message::DataLinkDelete), button::secondary);
let insert = dialog_button_styled_opt(t!("Insert Table"), enabled.then_some(Message::DataLinkInsert), button::primary);
let close = dialog_button(t!("Close"), Message::DataLinkClose, false);
row![edit, delete, Space::new().width(Fill), insert, close].spacing(8)
};
column![row![tree, container(right).width(Fill).height(Fill)].spacing(8).height(Fill), text(&state.status).size(11), actions]
.spacing(7).padding(10).width(sizing.width).height(sizing.height).into()
}
fn wizard_nav(state: &DataExtractionState) -> iced::widget::Row<'_, Message> {
let back = button(text(t!("Back")).size(12)).padding([5, 12]);
let next = button(text(if state.page == ExtractionPage::Finish { t!("Finish") } else { t!("Next") }).size(12)).padding([5, 12]).style(button::primary);
row![Space::new().width(Fill), if state.page == ExtractionPage::Begin { back } else { back.on_press(Message::DataExtractionBack) }, button(text(t!("Cancel")).size(12)).on_press(Message::CloseModal).padding([5, 12]), if state.error.is_empty() { next.on_press(if state.page == ExtractionPage::Finish { Message::DataExtractionFinish } else { Message::DataExtractionNext }) } else { next }].spacing(7)
let back = dialog_button_styled_opt(
t!("Back"),
(state.page != ExtractionPage::Begin).then_some(Message::DataExtractionBack),
button::secondary,
);
let cancel = dialog_button(t!("Cancel"), Message::CloseModal, false);
let next = dialog_button_styled_opt(
if state.page == ExtractionPage::Finish {
t!("Finish")
} else {
t!("Next")
},
state.error.is_empty().then_some(if state.page == ExtractionPage::Finish {
Message::DataExtractionFinish
} else {
Message::DataExtractionNext
}),
button::primary,
);
row![Space::new().width(Fill), back, cancel, next].spacing(8)
}
pub fn data_extraction_view(state: &DataExtractionState, sizing: crate::ui::modal::ModalSizing) -> Element<'_, Message> {
+4 -12
View File
@@ -1,5 +1,6 @@
use crate::app::settings::AutoConstrainSettings;
use crate::app::Message;
use crate::ui::style::form::dialog_button;
use iced::widget::{button, checkbox, column, container, row, scrollable, text, text_input, Space};
use iced::{Element, Fill};
@@ -106,18 +107,9 @@ pub fn view_window<'a>(
let actions = row![
Space::new().width(Fill),
button(text(crate::t!("OK")))
.on_press(Message::AutoConstrainOk)
.style(button::primary)
.padding([6, 18]),
button(text(crate::t!("Apply")))
.on_press(Message::AutoConstrainApply)
.style(button::secondary)
.padding([6, 18]),
button(text(crate::t!("Cancel")))
.on_press(Message::AutoConstrainCancel)
.style(button::secondary)
.padding([6, 18]),
dialog_button(crate::t!("OK"), Message::AutoConstrainOk, true),
dialog_button(crate::t!("Apply"), Message::AutoConstrainApply, false),
dialog_button(crate::t!("Cancel"), Message::AutoConstrainCancel, false),
]
.spacing(8)
.align_y(iced::Center);
+10 -14
View File
@@ -1,6 +1,7 @@
use crate::app::settings::IsoPlane;
use crate::app::Message;
use crate::snap::{SnapType, ALL_3D_SNAP_MODES, ALL_SNAP_MODES};
use crate::ui::style::form::{dialog_button, dialog_button_styled_opt};
use iced::widget::{button, checkbox, column, container, row, scrollable, text, text_input, Space};
use iced::{Background, Border, Element, Fill, Theme};
use std::borrow::Cow;
@@ -664,28 +665,23 @@ pub fn view_window<'a>(
};
// ── Bottom Action Buttons ────────────────────────────────────────────
let ok_button = button(text(crate::t!("OK")).size(12))
.on_press(Message::DraftingSettingsOk)
.style(button::primary)
.padding([6, 18]);
let ok_button = dialog_button(crate::t!("OK"), Message::DraftingSettingsOk, true);
let apply_button = button(text(crate::t!("Apply")).size(12))
.on_press_maybe(if dirty {
let apply_button = dialog_button_styled_opt(
crate::t!("Apply"),
if dirty {
Some(Message::DraftingSettingsApply)
} else {
None
})
.style(if dirty {
},
if dirty {
button::secondary
} else {
button::text
})
.padding([6, 18]);
},
);
let close_button = button(text(crate::t!("Close")).size(12))
.on_press(Message::DraftingSettingsClose)
.style(button::secondary)
.padding([6, 18]);
let close_button = dialog_button(crate::t!("Close"), Message::DraftingSettingsClose, false);
let action_row = row![
Space::new().width(Fill),
+5 -9
View File
@@ -12,12 +12,13 @@
use std::fmt;
use iced::widget::{button, checkbox, column, container, row, text, text_input, Space};
use iced::widget::{checkbox, column, container, row, text, text_input, Space};
use iced::{Border, Element, Fill, Length, Theme};
use crate::app::Message;
use crate::modules::draw::units;
use crate::t;
use crate::ui::style::form::dialog_button;
/// The dialog's working copy. Nothing reaches the drawing until OK, so a format
/// can be tried against the sample and abandoned.
@@ -265,15 +266,10 @@ pub fn view_window<'a>(
let actions = row![
Space::new().width(Fill),
button(text(t!("Cancel")).size(12))
.on_press(Message::CloseModal)
.padding([4, 12]),
button(text(t!("OK")).size(12))
.on_press(Message::DrawingUnitsApply)
.style(button::primary)
.padding([4, 12]),
dialog_button(t!("OK"), Message::DrawingUnitsApply, true),
dialog_button(t!("Cancel"), Message::CloseModal, false),
]
.spacing(6)
.spacing(8)
.align_y(iced::Center);
column![row![length, angle].spacing(8), insertion, sample, actions,]
+17 -16
View File
@@ -1,8 +1,8 @@
use crate::app::Message;
use crate::t;
use crate::ui::style::form::{dialog_button, dialog_button_styled_opt};
use iced::widget::{button, column, row, text, text_input, Space};
use iced::{Element, Fill, Length, Shrink};
use std::borrow::Cow;
pub const FIND_INPUT_ID: &str = "find-replace-search";
@@ -29,14 +29,6 @@ pub fn view_window<'a>(
.size(13);
let enabled = !search.trim().is_empty();
let action = |label: Cow<'static, str>, message: Message| {
let button = button(text(label).size(12)).padding([6, 12]);
if enabled {
button.on_press(message)
} else {
button
}
};
column![
row![
@@ -56,13 +48,22 @@ pub fn view_window<'a>(
text(status).size(11),
row![
Space::new().width(field_width),
button(text(t!("Close")).size(12))
.on_press(Message::CloseModal)
.padding([6, 12])
.style(button::secondary),
action(t!("Replace"), Message::FindReplaceOne).style(button::secondary),
action(t!("Replace All"), Message::FindReplaceAll).style(button::danger),
action(t!("Find Next"), Message::FindReplaceNext).style(button::primary),
dialog_button(t!("Close"), Message::CloseModal, false),
dialog_button_styled_opt(
t!("Replace"),
enabled.then_some(Message::FindReplaceOne),
button::secondary,
),
dialog_button_styled_opt(
t!("Replace All"),
enabled.then_some(Message::FindReplaceAll),
button::danger,
),
dialog_button_styled_opt(
t!("Find Next"),
enabled.then_some(Message::FindReplaceNext),
button::primary,
),
]
.spacing(8)
.align_y(iced::Center),
+12 -14
View File
@@ -13,6 +13,7 @@ use iced::{Border, Element, Fill, Length, Theme};
use crate::app::Message;
use crate::t;
use crate::ui::style::form::{dialog_button, dialog_button_styled_opt};
const EMPTY: &str = "";
@@ -539,25 +540,22 @@ pub fn view_window<'a>(
let mut actions = row![
Space::new().width(Fill),
button(text(t!("Cancel")).size(12))
.on_press(Message::CloseModal)
.padding([4, 12]),
dialog_button(t!("Cancel"), Message::CloseModal, false),
]
.spacing(6)
.align_y(iced::Center);
if state.editing.is_some() {
actions = actions.push(
button(text(t!("Apply")).size(12))
.on_press_maybe(state.is_valid().then_some(Message::ToleranceDialogApply))
.padding([4, 12]),
);
actions = actions.push(dialog_button_styled_opt(
t!("Apply"),
state.is_valid().then_some(Message::ToleranceDialogApply),
button::secondary,
));
}
actions = actions.push(
button(text(t!("OK")).size(12))
.on_press_maybe(state.is_valid().then_some(Message::ToleranceDialogOk))
.style(button::primary)
.padding([4, 12]),
);
actions = actions.push(dialog_button_styled_opt(
t!("OK"),
state.is_valid().then_some(Message::ToleranceDialogOk),
button::primary,
));
column![symbol, tolerances, datums, additions, actions]
.spacing(8)
+7 -9
View File
@@ -12,6 +12,7 @@ use iced::{Background, Border, Element, Fill, Length, Theme};
use crate::app::Message;
use crate::modules::draw::layers::laytrans::{Mapping, TargetLayer};
use crate::t;
use crate::ui::style::form::{dialog_button, dialog_button_styled_opt};
/// The dialog's working state: what was loaded, what is selected, and the
/// mappings built so far. None of it touches the drawing until Translate.
@@ -183,15 +184,12 @@ pub fn view_window<'a>(
.on_press(Message::LayerTranslatorLoadMappings)
.padding([4, 10]),
Space::new().width(Fill),
button(text(t!("Cancel")).size(12))
.on_press(Message::CloseModal)
.padding([4, 12]),
button(text(t!("Translate")).size(12))
.on_press_maybe(
(!state.mappings.is_empty()).then_some(Message::LayerTranslatorTranslate)
)
.style(button::primary)
.padding([4, 12]),
dialog_button(t!("Cancel"), Message::CloseModal, false),
dialog_button_styled_opt(
t!("Translate"),
(!state.mappings.is_empty()).then_some(Message::LayerTranslatorTranslate),
button::primary,
),
]
.spacing(6)
.align_y(iced::Center);
+12 -12
View File
@@ -4,6 +4,7 @@
// mismatched substitute.
use crate::app::Message;
use crate::ui::style::form::dialog_button_styled_opt;
use iced::widget::{button, column, container, row, scrollable, text, text_input, Space};
use iced::{Element, Fill, Length, Shrink, Theme};
@@ -34,23 +35,22 @@ pub fn view_window<'a>(
.iter()
.map(|name| text(format!(" {name}")).size(12).into())
.collect();
let download = button(
text(if downloading {
let download = dialog_button_styled_opt(
if downloading {
crate::t!("Downloading...")
} else {
crate::t!("Download available")
})
.size(12),
)
.on_press_maybe((!downloading).then_some(Message::MissingFontsDownload))
.style(button::primary)
.padding([6, 14]);
},
(!downloading).then_some(Message::MissingFontsDownload),
button::primary,
);
let actions = row![
Space::new().width(content_width),
button(text(crate::t!("Skip")).size(12))
.on_press_maybe((!downloading).then_some(Message::MissingFontsDismiss))
.style(button::secondary)
.padding([6, 14]),
dialog_button_styled_opt(
crate::t!("Skip"),
(!downloading).then_some(Message::MissingFontsDismiss),
button::secondary,
),
download,
]
.spacing(8);
+12 -12
View File
@@ -2,6 +2,7 @@ pub(crate) mod spacemouse;
use crate::app::config::UiThemeConfig;
use crate::app::settings::{CursorType, RightClickMode};
use crate::app::Message;
use crate::ui::style::form::{dialog_button, dialog_button_styled_opt};
use iced::widget::{
button, column, container, row, scrollable, slider, text, text_input, Space,
};
@@ -315,18 +316,17 @@ pub fn view_window<'a>(
// Changes show at once but are committed by OK / Apply; Close puts them
// back (asking first when there is something to lose).
let ok = button(text(crate::t!("OK")).size(12))
.on_press(Message::OptionsOk)
.padding([6, 18])
.style(button::primary);
let apply = button(text(crate::t!("Apply")).size(12))
.on_press_maybe(dirty.then_some(Message::OptionsApply))
.padding([6, 18])
.style(if dirty { button::secondary } else { button::text });
let close = button(text(crate::tr!("action", "close")).size(12))
.on_press(Message::OptionsClose)
.padding([6, 18])
.style(button::secondary);
let ok = dialog_button(crate::t!("OK"), Message::OptionsOk, true);
let apply = dialog_button_styled_opt(
crate::t!("Apply"),
dirty.then_some(Message::OptionsApply),
if dirty {
button::secondary
} else {
button::text
},
);
let close = dialog_button(crate::tr!("action", "close"), Message::OptionsClose, false);
let general = column![
text(crate::tr!("options", "language-section")).size(15),
+18 -28
View File
@@ -5,7 +5,7 @@
use std::fmt;
use iced::widget::{
button, column, combo_box, container, image, pick_list, radio, row, text, text_input, Space,
button, column, combo_box, container, image, pick_list, row, text, text_input, Space,
};
use iced::{Element, Fill, Length, Theme};
@@ -13,7 +13,7 @@ use crate::app::Message;
use crate::io::xref_model::Pathtype;
use crate::t;
use crate::ui::style::common::muted_style;
use crate::ui::style::form::{button_style, field_style};
use crate::ui::style::form::{button_style, dialog_button, field_style, form_radio};
use crate::ui::window::block_definition::{group, labeled_checkbox};
/// One edit in the dialog.
@@ -236,19 +236,18 @@ pub fn view_window<'a>(
let reference_type = group(
t!("Reference Type").into_owned(),
column![
radio(
form_radio(
t!("Attachment"),
false,
Some(state.overlay),
|v| msg(XrefAttachMsg::Overlay(v))
)
.size(14)
.text_size(11),
radio(t!("Overlay"), true, Some(state.overlay), |v| msg(
XrefAttachMsg::Overlay(v)
))
.size(14)
.text_size(11),
|v| msg(XrefAttachMsg::Overlay(v)),
),
form_radio(
t!("Overlay"),
true,
Some(state.overlay),
|v| msg(XrefAttachMsg::Overlay(v)),
),
]
.spacing(6),
Length::Shrink,
@@ -385,25 +384,16 @@ pub fn view_window<'a>(
t!("Show Details")
};
let footer = row![
button(text(details_label).size(11))
button(text(details_label).size(12))
.on_press(msg(XrefAttachMsg::Details(!state.details)))
.style(button_style(false))
.padding([4, 12]),
.style(button::secondary)
.padding([6, 18]),
Space::new().width(Fill),
button(text(t!("OK")).size(11))
.on_press(msg(XrefAttachMsg::Apply))
.style(button_style(true))
.padding([4, 16]),
button(text(t!("Cancel")).size(11))
.on_press(Message::CloseModal)
.style(button_style(false))
.padding([4, 12]),
button(text(t!("Help")).size(11))
.on_press(msg(XrefAttachMsg::Help))
.style(button_style(false))
.padding([4, 12]),
dialog_button(t!("OK"), msg(XrefAttachMsg::Apply), true),
dialog_button(t!("Cancel"), Message::CloseModal, false),
dialog_button(t!("Help"), msg(XrefAttachMsg::Help), false),
]
.spacing(6)
.spacing(8)
.align_y(iced::Center);
column![name_section, body, details, footer]
+8 -9
View File
@@ -6,7 +6,8 @@
use crate::app::Message;
use crate::ui::style::common::muted_style;
use iced::widget::{button, column, container, row, text, Space};
use crate::ui::style::form::dialog_button;
use iced::widget::{column, container, row, text, Space};
use iced::{Background, Element, Fill, Length, Theme};
/// GitHub issues page linked from the help window, so web users can report
@@ -41,14 +42,12 @@ pub fn view_window(sizing: crate::ui::modal::ModalSizing) -> Element<'static, Me
.into_owned(),
);
let report_button = button(text(crate::t!("Report an issue")).size(12))
.on_press(Message::OpenUrl(XREF_ISSUES_URL.to_string()))
.style(button::primary)
.padding([6, 18]);
let close_button = button(text(crate::t!("Close")).size(12))
.on_press(Message::CloseModal)
.style(button::secondary)
.padding([6, 18]);
let report_button = dialog_button(
crate::t!("Report an issue"),
Message::OpenUrl(XREF_ISSUES_URL.to_string()),
true,
);
let close_button = dialog_button(crate::t!("Close"), Message::CloseModal, false);
let action_row: Element<'static, Message> = row![
Space::new().width(Fill),
report_button,