feat: wire up keybinds

- added keybinds for existing file actions
- added keybinds to support zooming
This commit is contained in:
Stevan Freeborn
2026-01-10 08:02:21 -06:00
parent c2a9685b5b
commit 1704441315
2 changed files with 82 additions and 11 deletions
+1 -1
View File
@@ -7,7 +7,7 @@ pub fn save_file_to_disk(path: PathBuf, text: String) {
let save_result = write(path, text); let save_result = write(path, text);
match save_result { match save_result {
Ok(_) => println!("Save file successfully"), Ok(_) => {},
Err(err) => eprintln!("Error: {}", err), Err(err) => eprintln!("Error: {}", err),
} }
} }
+81 -10
View File
@@ -2,18 +2,23 @@ mod file;
use std::path::PathBuf; use std::path::PathBuf;
use iced::Element;
use iced::widget::text_editor::{Binding, KeyPress};
use iced::widget::{column, container, pick_list, row, text, text_editor}; use iced::widget::{column, container, pick_list, row, text, text_editor};
use iced::window;
use iced::window::icon; use iced::window::icon;
use iced::{Element, Font, Length, Theme}; use iced::{Font, Length, Theme};
use iced::{keyboard, window};
use rfd::FileDialog; use rfd::FileDialog;
const CUSTOM_FONT: Font = Font::with_name("CaskaydiaCove Nerd Font Mono"); const CUSTOM_FONT: Font = Font::with_name("CaskaydiaCove Nerd Font Mono");
const MAX_EDITOR_FONT_SIZE: u32 = 80;
const MIN_EDITOR_FONT_SIZE: u32 = 12;
#[derive(Default)] #[derive(Default)]
struct State { struct State {
file_path: Option<PathBuf>, file_path: Option<PathBuf>,
content: text_editor::Content, content: text_editor::Content,
editor_font_size: u32,
selected_file_action: Option<FileAction>, selected_file_action: Option<FileAction>,
} }
@@ -42,6 +47,8 @@ impl std::fmt::Display for FileAction {
enum Message { enum Message {
Edit(text_editor::Action), Edit(text_editor::Action),
FileActionSelected(FileAction), FileActionSelected(FileAction),
IncreaseFont,
DecreaseFont,
} }
fn theme(_state: &State) -> Theme { fn theme(_state: &State) -> Theme {
@@ -49,6 +56,9 @@ fn theme(_state: &State) -> Theme {
} }
fn view(state: &State) -> Element<'_, Message> { fn view(state: &State) -> Element<'_, Message> {
// TODO: Expose the zooming functionality
// through a menu
let file_menu = pick_list( let file_menu = pick_list(
FileAction::ALL, FileAction::ALL,
state.selected_file_action, state.selected_file_action,
@@ -59,8 +69,52 @@ fn view(state: &State) -> Element<'_, Message> {
let action_bar = container(row![file_menu]); let action_bar = container(row![file_menu]);
let editor = text_editor(&state.content) let editor = text_editor(&state.content)
.size(state.editor_font_size)
.height(Length::Fill) .height(Length::Fill)
.on_action(Message::Edit); .on_action(Message::Edit)
.key_binding(|key_press: KeyPress| {
let s = keyboard::Key::Character("s".into());
let o = keyboard::Key::Character("o".into());
let minus = keyboard::Key::Character("-".into());
let equals = keyboard::Key::Character("=".into());
let is_open = key_press.modifiers.command() && key_press.key == o;
let is_save = key_press.modifiers.command() && key_press.key == s;
let is_save_as =
key_press.modifiers.command() && key_press.modifiers.shift() && key_press.key == s;
let is_increase_font = key_press.modifiers.command() && key_press.modifiers.shift() && key_press.key == equals;
let is_decrease_font = key_press.modifiers.command() && key_press.key == minus;
if is_increase_font {
return Some(Binding::Custom(Message::IncreaseFont));
}
if is_decrease_font {
return Some(Binding::Custom(Message::DecreaseFont));
}
if is_save_as {
return Some(Binding::Custom(Message::FileActionSelected(
FileAction::SaveAs,
)));
}
if is_save {
return Some(Binding::Custom(Message::FileActionSelected(
FileAction::Save,
)));
}
if is_open {
return Some(Binding::Custom(Message::FileActionSelected(
FileAction::Open,
)));
}
text_editor::Binding::from_key_press(key_press)
});
let editor_container = container(row![editor]).height(Length::Fill); let editor_container = container(row![editor]).height(Length::Fill);
@@ -102,14 +156,15 @@ fn save_file(path: Option<PathBuf>, text: String) -> Option<PathBuf> {
} }
} }
fn save_file_as(text: String) { fn save_file_as(text: String) -> Option<PathBuf> {
let files = FileDialog::new().set_directory("/").save_file(); let files = FileDialog::new().set_directory("/").save_file();
match files { match files {
Some(path) => file::save_file_to_disk(path, text), Some(path) => {
None => { file::save_file_to_disk(path.clone(), text);
println!("No file to save to"); Some(path)
} }
None => None,
} }
} }
@@ -130,12 +185,11 @@ fn update(state: &mut State, message: Message) {
Message::Edit(action) => { Message::Edit(action) => {
state.content.perform(action); state.content.perform(action);
} }
Message::FileActionSelected(action) => { Message::FileActionSelected(action) => {
state.selected_file_action = None; state.selected_file_action = None;
match action { match action {
FileAction::SaveAs => save_file_as(state.content.text()), FileAction::SaveAs => state.file_path = save_file_as(state.content.text()),
FileAction::Open => { FileAction::Open => {
let (path, content) = open_file(); let (path, content) = open_file();
state.content = text_editor::Content::with_text(&content); state.content = text_editor::Content::with_text(&content);
@@ -146,11 +200,28 @@ fn update(state: &mut State, message: Message) {
} }
} }
} }
Message::IncreaseFont => {
if state.editor_font_size >= MAX_EDITOR_FONT_SIZE {
return;
}
state.editor_font_size += 2;
},
Message::DecreaseFont => {
if state.editor_font_size <= MIN_EDITOR_FONT_SIZE {
return;
}
state.editor_font_size -= 2;
}
} }
} }
fn boot() -> State { fn boot() -> State {
State::default() State {
editor_font_size: 16,
..Default::default()
}
} }
pub fn main() -> iced::Result { pub fn main() -> iced::Result {