Skip to content

Commit 78e285a

Browse files
authored
Refactor header (#14)
* Pull header into a widget * Add TODO
1 parent 1988d0f commit 78e285a

File tree

6 files changed

+62
-153
lines changed

6 files changed

+62
-153
lines changed

src/gui/widgets/compressor.rs

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,16 @@
1-
use super::{icon_button, labeled_slider};
1+
use super::{labeled_slider, stage_header};
22
use crate::gui::amp::{CompressorConfig, Message};
3-
use iced::widget::{column, container, row, text};
3+
use iced::widget::{column, container};
44
use iced::{Element, Length};
55

6+
const HEADER_TEXT: &str = "Compressor";
7+
68
pub fn compressor_widget(
79
idx: usize,
810
cfg: &CompressorConfig,
911
total_stages: usize,
1012
) -> Element<Message> {
11-
let mut header = row![text(format!("Compressor {}", idx + 1))].spacing(5);
12-
13-
if idx > 0 {
14-
header = header.push(icon_button(
15-
"↑",
16-
Some(Message::MoveStageUp(idx)),
17-
iced::widget::button::primary,
18-
));
19-
} else {
20-
header = header.push(icon_button("↑", None, iced::widget::button::secondary));
21-
}
22-
23-
if idx < total_stages.saturating_sub(1) {
24-
header = header.push(icon_button(
25-
"↓",
26-
Some(Message::MoveStageDown(idx)),
27-
iced::widget::button::primary,
28-
));
29-
} else {
30-
header = header.push(icon_button("↓", None, iced::widget::button::secondary));
31-
}
32-
33-
header = header.push(icon_button(
34-
"×",
35-
Some(Message::RemoveStage(idx)),
36-
iced::widget::button::danger,
37-
));
13+
let header = stage_header(HEADER_TEXT, idx, total_stages);
3814

3915
let body = column![
4016
labeled_slider(

src/gui/widgets/filter.rs

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
use super::{icon_button, labeled_slider};
1+
use super::{labeled_slider, stage_header};
22
use crate::gui::amp::{FilterConfig, Message};
33
use crate::sim::stages::filter::FilterType;
44
use iced::widget::{column, container, pick_list, row, text};
55
use iced::{Element, Length};
66

7+
const HEADER_TEXT: &str = "Filter";
78
const FILTER_TYPES: [FilterType; 4] = [
89
FilterType::Highpass,
910
FilterType::Lowpass,
@@ -12,33 +13,7 @@ const FILTER_TYPES: [FilterType; 4] = [
1213
];
1314

1415
pub fn filter_widget(idx: usize, cfg: &FilterConfig, total_stages: usize) -> Element<Message> {
15-
let mut header = row![text(format!("Filter {}", idx + 1))].spacing(5);
16-
17-
if idx > 0 {
18-
header = header.push(icon_button(
19-
"↑",
20-
Some(Message::MoveStageUp(idx)),
21-
iced::widget::button::primary,
22-
));
23-
} else {
24-
header = header.push(icon_button("↑", None, iced::widget::button::secondary));
25-
}
26-
27-
if idx < total_stages.saturating_sub(1) {
28-
header = header.push(icon_button(
29-
"↓",
30-
Some(Message::MoveStageDown(idx)),
31-
iced::widget::button::primary,
32-
));
33-
} else {
34-
header = header.push(icon_button("↓", None, iced::widget::button::secondary));
35-
}
36-
37-
header = header.push(icon_button(
38-
"×",
39-
Some(Message::RemoveStage(idx)),
40-
iced::widget::button::danger,
41-
));
16+
let header = stage_header(HEADER_TEXT, idx, total_stages);
4217

4318
let type_picker = row![
4419
text("Type:").width(Length::FillPortion(3)),

src/gui/widgets/mod.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,39 @@ pub fn icon_button<'a>(
4848
btn.into()
4949
}
5050
}
51+
52+
pub fn stage_header(stage_name: &str, idx: usize, total_stages: usize) -> Element<Message> {
53+
let header_text = format!("{} {}", stage_name, idx + 1);
54+
55+
let move_up_btn = if idx > 0 {
56+
icon_button(
57+
"↑",
58+
Some(Message::MoveStageUp(idx)),
59+
iced::widget::button::primary,
60+
)
61+
} else {
62+
icon_button("↑", None, iced::widget::button::secondary)
63+
};
64+
65+
let move_down_btn = if idx < total_stages.saturating_sub(1) {
66+
icon_button(
67+
"↓",
68+
Some(Message::MoveStageDown(idx)),
69+
iced::widget::button::primary,
70+
)
71+
} else {
72+
icon_button("↓", None, iced::widget::button::secondary)
73+
};
74+
75+
let remove_btn = icon_button(
76+
"×",
77+
Some(Message::RemoveStage(idx)),
78+
iced::widget::button::danger,
79+
);
80+
81+
// Build the complete row
82+
row![move_up_btn, move_down_btn, remove_btn, text(header_text)]
83+
.spacing(5)
84+
.align_y(iced::Alignment::Center)
85+
.into()
86+
}

src/gui/widgets/poweramp.rs

Lines changed: 11 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,18 @@
1-
use super::{icon_button, labeled_slider};
1+
use super::{labeled_slider, stage_header};
22
use crate::gui::amp::{Message, PowerAmpConfig};
33
use crate::sim::stages::poweramp::PowerAmpType;
44
use iced::widget::{column, container, pick_list, row, text};
55
use iced::{Element, Length};
66

7+
const HEADER_TEXT: &str = "Power Amp";
78
const POWER_AMP_TYPES: [PowerAmpType; 3] = [
89
PowerAmpType::ClassA,
910
PowerAmpType::ClassAB,
1011
PowerAmpType::ClassB,
1112
];
1213

1314
pub fn poweramp_widget(idx: usize, cfg: &PowerAmpConfig, total_stages: usize) -> Element<Message> {
14-
let mut header = row![text(format!("Power Amp {}", idx + 1))].spacing(5);
15-
16-
if idx > 0 {
17-
header = header.push(icon_button(
18-
"↑",
19-
Some(Message::MoveStageUp(idx)),
20-
iced::widget::button::primary,
21-
));
22-
} else {
23-
header = header.push(icon_button("↑", None, iced::widget::button::secondary));
24-
}
25-
26-
if idx < total_stages.saturating_sub(1) {
27-
header = header.push(icon_button(
28-
"↓",
29-
Some(Message::MoveStageDown(idx)),
30-
iced::widget::button::primary,
31-
));
32-
} else {
33-
header = header.push(icon_button("↓", None, iced::widget::button::secondary));
34-
}
35-
36-
header = header.push(icon_button(
37-
"×",
38-
Some(Message::RemoveStage(idx)),
39-
iced::widget::button::danger,
40-
));
15+
let header = stage_header(HEADER_TEXT, idx, total_stages);
4116

4217
let type_picker = row![
4318
text("Type:").width(Length::FillPortion(3)),
@@ -70,16 +45,12 @@ pub fn poweramp_widget(idx: usize, cfg: &PowerAmpConfig, total_stages: usize) ->
7045
]
7146
.spacing(5);
7247

73-
container(
74-
column![header.align_y(iced::Alignment::Center), body]
75-
.spacing(5)
76-
.padding(10),
77-
)
78-
.width(Length::Fill)
79-
.style(|theme: &iced::Theme| {
80-
container::Style::default()
81-
.background(theme.palette().background)
82-
.border(iced::Border::default().rounded(5))
83-
})
84-
.into()
48+
container(column![header, body].spacing(5).padding(10))
49+
.width(Length::Fill)
50+
.style(|theme: &iced::Theme| {
51+
container::Style::default()
52+
.background(theme.palette().background)
53+
.border(iced::Border::default().rounded(5))
54+
})
55+
.into()
8556
}

src/gui/widgets/preamp.rs

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
use super::{icon_button, labeled_slider};
1+
use super::{labeled_slider, stage_header};
22
use crate::gui::amp::{Message, PreampConfig};
33
use crate::sim::stages::clipper::ClipperType;
44
use iced::widget::{column, container, pick_list, row, text};
55
use iced::{Element, Length};
66

7+
const HEADER_TEXT: &str = "Preamp";
78
const CLIPPER_TYPES: [ClipperType; 5] = [
89
ClipperType::Soft,
910
ClipperType::Medium,
@@ -13,33 +14,7 @@ const CLIPPER_TYPES: [ClipperType; 5] = [
1314
];
1415

1516
pub fn preamp_widget(idx: usize, cfg: &PreampConfig, total_stages: usize) -> Element<Message> {
16-
let mut header = row![text(format!("Preamp {}", idx + 1))].spacing(5);
17-
18-
if idx > 0 {
19-
header = header.push(icon_button(
20-
"↑",
21-
Some(Message::MoveStageUp(idx)),
22-
iced::widget::button::primary,
23-
));
24-
} else {
25-
header = header.push(icon_button("↑", None, iced::widget::button::secondary));
26-
}
27-
28-
if idx < total_stages.saturating_sub(1) {
29-
header = header.push(icon_button(
30-
"↓",
31-
Some(Message::MoveStageDown(idx)),
32-
iced::widget::button::primary,
33-
));
34-
} else {
35-
header = header.push(icon_button("↓", None, iced::widget::button::secondary));
36-
}
37-
38-
header = header.push(icon_button(
39-
"×",
40-
Some(Message::RemoveStage(idx)),
41-
iced::widget::button::danger,
42-
));
17+
let header = stage_header(HEADER_TEXT, idx, total_stages);
4318

4419
let clipper_picker = row![
4520
text("Clipper:").width(Length::FillPortion(3)),
@@ -72,6 +47,7 @@ pub fn preamp_widget(idx: usize, cfg: &PreampConfig, total_stages: usize) -> Ele
7247
]
7348
.spacing(5);
7449

50+
// TODO: Use a better background colour
7551
container(column![header, body].spacing(5).padding(10))
7652
.width(Length::Fill)
7753
.style(|theme: &iced::Theme| {

src/gui/widgets/tonestack.rs

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
use super::{icon_button, labeled_slider};
1+
use super::{labeled_slider, stage_header};
22
use crate::gui::amp::{Message, ToneStackConfig};
33
use crate::sim::stages::tonestack::ToneStackModel;
44
use iced::widget::{column, container, pick_list, row, text};
55
use iced::{Element, Length};
66

7+
const HEADER_TEXT: &str = "ToneStack";
78
const TONE_STACK_MODELS: [ToneStackModel; 4] = [
89
ToneStackModel::Modern,
910
ToneStackModel::British,
@@ -16,33 +17,7 @@ pub fn tonestack_widget(
1617
cfg: &ToneStackConfig,
1718
total_stages: usize,
1819
) -> Element<Message> {
19-
let mut header = row![text(format!("Tonestack {}", idx + 1))].spacing(5);
20-
21-
if idx > 0 {
22-
header = header.push(icon_button(
23-
"↑",
24-
Some(Message::MoveStageUp(idx)),
25-
iced::widget::button::primary,
26-
));
27-
} else {
28-
header = header.push(icon_button("↑", None, iced::widget::button::secondary));
29-
}
30-
31-
if idx < total_stages.saturating_sub(1) {
32-
header = header.push(icon_button(
33-
"↓",
34-
Some(Message::MoveStageDown(idx)),
35-
iced::widget::button::primary,
36-
));
37-
} else {
38-
header = header.push(icon_button("↓", None, iced::widget::button::secondary));
39-
}
40-
41-
header = header.push(icon_button(
42-
"×",
43-
Some(Message::RemoveStage(idx)),
44-
iced::widget::button::danger,
45-
));
20+
let header = stage_header(HEADER_TEXT, idx, total_stages);
4621

4722
let model_picker = row![
4823
text("Model:").width(Length::FillPortion(3)),

0 commit comments

Comments
 (0)