Skip to content

Commit 8562df5

Browse files
edfloreshzEduardo Flores
authored and
Eduardo Flores
committed
feat: snapshots taken on app start
1 parent 27518f8 commit 8562df5

File tree

6 files changed

+159
-295
lines changed

6 files changed

+159
-295
lines changed

i18n/en/cosmic_ext_tweaks.ftl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@ create-snapshot-description = You are about to create a snapshot, this will save
5050
restore-snapshot = Restore snapshot
5151
delete-snapshot = Delete snapshot
5252
no-snapshots = No snapshots available
53+
snapshot-name = Snapshot name
54+
name = Name
55+
type = Type
56+
created = Created
57+
actions = Actions
58+
system = System
59+
user = User
5360
5461
color-scheme-name = Color scheme name
5562

src/app.rs

Lines changed: 31 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use crate::{
2929
self,
3030
color_schemes::{config::ColorScheme, preview, ColorSchemeProvider, ColorSchemes},
3131
layouts::Layouts,
32-
snapshots::Snapshots,
32+
snapshots::{config::SnapshotKind, Snapshots},
3333
},
3434
settings::{AppTheme, TweaksSettings, CONFIG_VERSION},
3535
};
@@ -66,8 +66,7 @@ pub enum Status {
6666
#[derive(Clone, Debug, Eq, PartialEq)]
6767
pub enum DialogPage {
6868
SaveCurrentColorScheme(String),
69-
SaveCurrentLayout(String),
70-
CreateSnapshot,
69+
CreateSnapshot(String),
7170
AvailableColorSchemes,
7271
}
7372

@@ -91,7 +90,6 @@ pub enum Message {
9190
Key(Modifiers, Key),
9291
Modifiers(Modifiers),
9392
SystemThemeModeChange,
94-
SaveNewLayout(String),
9593
}
9694

9795
#[derive(Debug, Clone, Eq, PartialEq)]
@@ -227,39 +225,28 @@ impl Application for TweakTool {
227225
.on_input(move |name| {
228226
Message::DialogUpdate(DialogPage::SaveCurrentColorScheme(name))
229227
})
228+
.on_submit(Message::DialogComplete)
230229
.into(),
231230
])
232231
.spacing(spacing.space_xxs),
233232
)
234233
}
235-
DialogPage::SaveCurrentLayout(name) => widget::dialog(fl!("save-current-layout"))
236-
.primary_action(
237-
widget::button::suggested(fl!("save"))
238-
.on_press_maybe(Some(Message::DialogComplete)),
239-
)
240-
.secondary_action(
241-
widget::button::standard(fl!("cancel")).on_press(Message::DialogCancel),
242-
)
243-
.control(
244-
widget::column::with_children(vec![
245-
widget::text::body(fl!("color-scheme-name")).into(),
246-
widget::text_input("", name.as_str())
247-
.id(self.dialog_text_input.clone())
248-
.on_input(move |name| {
249-
Message::DialogUpdate(DialogPage::SaveCurrentLayout(name))
250-
})
251-
.into(),
252-
])
253-
.spacing(spacing.space_xxs),
254-
),
255-
DialogPage::CreateSnapshot => widget::dialog(fl!("create-snapshot"))
234+
DialogPage::CreateSnapshot(name) => widget::dialog(fl!("create-snapshot"))
256235
.body(fl!("create-snapshot-description"))
257236
.primary_action(
258237
widget::button::suggested(fl!("create"))
259238
.on_press_maybe(Some(Message::DialogComplete)),
260239
)
261240
.secondary_action(
262241
widget::button::standard(fl!("cancel")).on_press(Message::DialogCancel),
242+
)
243+
.control(
244+
widget::text_input(fl!("snapshot-name"), name.as_str())
245+
.id(self.dialog_text_input.clone())
246+
.on_input(move |name| {
247+
Message::DialogUpdate(DialogPage::CreateSnapshot(name))
248+
})
249+
.on_submit(Message::DialogComplete),
263250
),
264251
DialogPage::AvailableColorSchemes => {
265252
let show_more_button: Option<Element<Message>> = match self.status {
@@ -335,10 +322,18 @@ impl Application for TweakTool {
335322
offset: 0,
336323
};
337324

338-
let mut tasks = vec![app.update(Message::FetchAvailableColorSchemes(
339-
ColorSchemeProvider::CosmicThemes,
340-
app.limit,
341-
))];
325+
let mut tasks = vec![
326+
app.update(Message::FetchAvailableColorSchemes(
327+
ColorSchemeProvider::CosmicThemes,
328+
app.limit,
329+
)),
330+
app.update(Message::Snapshots(
331+
pages::snapshots::Message::CreateSnapshot(
332+
"Application opened".into(),
333+
SnapshotKind::System,
334+
),
335+
)),
336+
];
342337

343338
if let Some(id) = app.core.main_window_id() {
344339
tasks.push(app.set_window_title(fl!("app-title"), id));
@@ -476,14 +471,12 @@ impl Application for TweakTool {
476471
.map(cosmic::app::Message::App),
477472
),
478473
Message::Layouts(message) => match message {
479-
pages::layouts::Message::OpenSaveDialog => commands.push(self.update(
480-
Message::ToggleDialogPage(DialogPage::SaveCurrentLayout(String::new())),
481-
)),
482474
_ => commands.push(self.layouts.update(message).map(cosmic::app::Message::App)),
483475
},
484476
Message::Snapshots(message) => match message {
485-
pages::snapshots::Message::OpenSaveDialog => commands
486-
.push(self.update(Message::ToggleDialogPage(DialogPage::CreateSnapshot))),
477+
pages::snapshots::Message::OpenSaveDialog => commands.push(self.update(
478+
Message::ToggleDialogPage(DialogPage::CreateSnapshot(String::new())),
479+
)),
487480
_ => commands.push(
488481
self.snapshots
489482
.update(message)
@@ -512,9 +505,6 @@ impl Application for TweakTool {
512505
pages::color_schemes::Message::SaveCurrentColorScheme(Some(name)),
513506
))))
514507
}
515-
Message::SaveNewLayout(name) => commands.push(self.update(Message::Layouts(
516-
pages::layouts::Message::SaveCurrentLayout(name),
517-
))),
518508
Message::ToggleDialogPage(dialog_page) => {
519509
self.dialog_pages.push_back(dialog_page);
520510
commands.push(widget::text_input::focus(self.dialog_text_input.clone()));
@@ -528,12 +518,11 @@ impl Application for TweakTool {
528518
DialogPage::SaveCurrentColorScheme(name) => {
529519
commands.push(self.update(Message::SaveNewColorScheme(name)))
530520
}
531-
DialogPage::SaveCurrentLayout(name) => {
532-
commands.push(self.update(Message::SaveNewLayout(name)))
521+
DialogPage::CreateSnapshot(name) => {
522+
commands.push(self.update(Message::Snapshots(
523+
pages::snapshots::Message::CreateSnapshot(name, SnapshotKind::User),
524+
)))
533525
}
534-
DialogPage::CreateSnapshot => commands.push(self.update(
535-
Message::Snapshots(pages::snapshots::Message::CreateSnapshot),
536-
)),
537526
DialogPage::AvailableColorSchemes => (),
538527
}
539528
}

src/pages/layouts.rs

Lines changed: 18 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,22 @@
1-
use config::{CustomLayout, Layout, LayoutsConfig};
2-
use cosmic::{
3-
cosmic_config::Config, iced::alignment::Horizontal, widget, Application, Apply, Element, Task,
4-
};
5-
use cosmic_ext_config_templates::{load_template, panel::PanelSchema, Schema};
6-
use dirs::data_local_dir;
1+
use config::Layout;
2+
use cosmic::{iced::alignment::Horizontal, widget, Apply, Element, Task};
3+
use cosmic_ext_config_templates::load_template;
74

8-
use crate::{app::TweakTool, core::icons, fl};
5+
use crate::fl;
96

107
pub mod config;
118
pub mod preview;
129

1310
#[derive(Debug)]
1411
pub struct Layouts {
15-
pub helper: Option<Config>,
16-
pub config: LayoutsConfig,
12+
layouts: Vec<Layout>,
1713
selected_layout: Option<Layout>,
1814
}
1915

2016
impl Default for Layouts {
2117
fn default() -> Self {
22-
let (helper, config) = (LayoutsConfig::helper(), LayoutsConfig::config());
2318
Self {
24-
helper,
25-
config,
19+
layouts: Layout::list(),
2620
selected_layout: None,
2721
}
2822
}
@@ -31,17 +25,12 @@ impl Default for Layouts {
3125
#[derive(Debug, Clone)]
3226
pub enum Message {
3327
ApplyLayout(Layout),
34-
SelectLayout(Layout),
35-
DeleteLayout,
36-
OpenSaveDialog,
37-
SaveCurrentLayout(String),
3828
}
3929

4030
impl Layouts {
4131
pub fn view(&self) -> Element<Message> {
4232
let spacing = cosmic::theme::active().cosmic().spacing;
4333
let layouts = self
44-
.config
4534
.layouts
4635
.iter()
4736
.map(|layout| {
@@ -54,108 +43,27 @@ impl Layouts {
5443
})
5544
.collect::<Vec<Element<Message>>>();
5645

57-
widget::scrollable(
58-
widget::column::with_children(vec![
59-
widget::row::with_children(vec![
60-
widget::text::title3(fl!("layouts")).into(),
61-
widget::horizontal_space().into(),
62-
widget::tooltip::tooltip(
63-
icons::get_handle("arrow-into-box-symbolic", 16)
64-
.apply(widget::button::icon)
65-
.padding(spacing.space_xxs)
66-
.on_press(Message::OpenSaveDialog)
67-
.class(cosmic::style::Button::Standard),
68-
widget::text(fl!("save-current-layout")),
69-
widget::tooltip::Position::Bottom,
70-
)
71-
.into(),
72-
])
73-
.spacing(spacing.space_xxs)
74-
.into(),
75-
widget::settings::section()
76-
.add(
77-
widget::flex_row(layouts)
78-
.row_spacing(spacing.space_s)
79-
.column_spacing(spacing.space_s)
80-
.apply(widget::container)
81-
.padding([0, spacing.space_xxs]),
82-
)
83-
.into(),
84-
])
85-
.spacing(spacing.space_xs),
86-
)
87-
.into()
46+
widget::settings::section()
47+
.title(fl!("layouts"))
48+
.add(widget::scrollable(
49+
widget::flex_row(layouts)
50+
.row_spacing(spacing.space_s)
51+
.column_spacing(spacing.space_s)
52+
.apply(widget::container)
53+
.padding([0, spacing.space_xxs]),
54+
))
55+
.into()
8856
}
8957

9058
pub fn update(&mut self, message: Message) -> Task<crate::app::Message> {
91-
let mut commands = vec![];
9259
match message {
9360
Message::ApplyLayout(layout) => {
61+
self.selected_layout = Some(layout.clone());
9462
if let Err(e) = load_template(layout.schema().clone()) {
9563
eprintln!("Failed to load template: {}", e);
9664
}
9765
}
98-
Message::SelectLayout(layout) => self.selected_layout = Some(layout),
99-
Message::OpenSaveDialog => commands.push(self.update(Message::OpenSaveDialog)),
100-
Message::SaveCurrentLayout(name) => {
101-
let path = data_local_dir()
102-
.unwrap()
103-
.join(TweakTool::APP_ID)
104-
.join("layouts");
105-
106-
if !path.exists() {
107-
if let Err(e) = std::fs::create_dir_all(&path) {
108-
log::error!("{e}");
109-
}
110-
}
111-
let mut path = path.join(&name);
112-
path.set_extension("ron");
113-
match PanelSchema::generate()
114-
.and_then(|panel_schema| Schema::Panel(panel_schema).save(&path))
115-
{
116-
Ok(_) => {
117-
if let Some(helper) = &self.helper {
118-
let layout = CustomLayout::new(name, &path);
119-
let mut layouts = self.config.layouts.clone();
120-
layouts.push(Layout::Custom(layout));
121-
match self.config.set_layouts(helper, layouts) {
122-
Ok(written) => {
123-
if !written {
124-
log::error!("Failed to write layouts to config");
125-
}
126-
}
127-
Err(e) => log::error!("Failed to set layouts: {}", e),
128-
}
129-
}
130-
}
131-
Err(e) => log::error!("Failed to generate template: {}", e),
132-
}
133-
}
134-
Message::DeleteLayout => {
135-
if let Some(layout) = &self.selected_layout {
136-
if let Layout::Custom(existing_layout) = &layout {
137-
if existing_layout.path().exists() {
138-
if let Err(e) = std::fs::remove_file(existing_layout.path()) {
139-
log::error!("Failed to delete layout: {}", e);
140-
return Task::batch(commands);
141-
}
142-
}
143-
let mut layouts = self.config.layouts.clone();
144-
layouts.retain(|l| l != layout);
145-
if let Some(helper) = &self.helper {
146-
match self.config.set_layouts(helper, layouts) {
147-
Ok(written) => {
148-
if !written {
149-
log::error!("Failed to write layouts to config");
150-
}
151-
}
152-
Err(e) => log::error!("Failed to set layouts: {}", e),
153-
}
154-
}
155-
}
156-
}
157-
}
15866
}
159-
Task::batch(commands)
67+
Task::none()
16068
}
16169
}

0 commit comments

Comments
 (0)