diff --git a/src/boxes.rs b/src/boxes.rs new file mode 100644 index 0000000..64834ef --- /dev/null +++ b/src/boxes.rs @@ -0,0 +1,160 @@ +use gtk4::prelude::*; +use gtk4::{ + glib::*, + ApplicationWindow, + Box, + Button, + FileChooserAction, + FileChooserDialog, + Label, + Orientation, + ResponseType, +}; + +pub trait CustomBox { + fn click_button(&self) {} + fn set_button(&self) {} + fn set_label(&self) {} + fn set_box(&self) {} +} + +pub struct AppBox { + pub app_box: Box, +} + +#[derive(Debug, Downgrade)] +pub struct RomBox { + pub rom_box: Box, + pub rom_button: Button, + pub rom_label: Label, + pub rom_filechooser: FileChooserDialog, +} + +#[derive(Debug, Downgrade)] +pub struct PatchBox { + pub patch_box: Box, + pub patch_button: Button, + pub patch_label: Label, + pub patch_filechooser: FileChooserDialog, +} + +impl AppBox { + pub fn new() -> AppBox { + AppBox { + app_box: Box::new(Orientation::Vertical, 0), + } + } + + pub fn set_box(&self, rom_box: &RomBox, patch_box: &PatchBox) { + self.app_box.set_visible(true); + self.app_box.append(&rom_box.rom_box); + self.app_box.append(&patch_box.patch_box); + } +} + +impl RomBox { + pub fn new(app: &ApplicationWindow) -> RomBox { + RomBox { + rom_box: Box::new(Orientation::Horizontal, 0), + rom_button: Button::new(), + rom_label: Label::new(Some("Choose ROM")), + rom_filechooser: FileChooserDialog::new( + Some("Select a ROM"), + Some(app), + FileChooserAction::Open, + &[("OK", ResponseType::Ok), ("Cancel", ResponseType::Cancel)] + ), + } + } +} + +impl CustomBox for RomBox { + fn click_button(&self) { + self.rom_button.connect_clicked(clone!(@weak self as this => + move |_| { + this.rom_filechooser.show(); + })); + } + + fn set_button(&self) { + self.rom_button.set_margin_top(20); + self.rom_button.set_margin_bottom(0); + self.rom_button.set_margin_start(20); + self.rom_button.set_margin_end(20); + self.rom_button.set_visible(true); + self.rom_button.set_label("Open"); + } + + fn set_label(&self) { + self.rom_label.set_margin_top(20); + self.rom_label.set_margin_bottom(0); + self.rom_label.set_margin_start(20); + self.rom_label.set_margin_end(20); + self.rom_label.set_visible(true); + } + + fn set_box(&self) { + self.rom_box.set_homogeneous(true); + self.rom_box.set_visible(true); + self.rom_box.append(&self.rom_label); + self.rom_box.append(&self.rom_button); + } +} + +impl PatchBox { + pub fn new(app: &ApplicationWindow) -> PatchBox { + PatchBox { + patch_box: Box::new(Orientation::Horizontal, 0), + patch_button: Button::new(), + patch_label: Label::new(Some("Choose Patch")), + patch_filechooser: FileChooserDialog::new( + Some("Select a Patch"), + Some(app), + FileChooserAction::Open, + &[("OK", ResponseType::Ok), ("Cancel", ResponseType::Cancel)] + ), + } + } +} + +impl CustomBox for PatchBox{ + fn click_button(&self) { + self.patch_button.connect_clicked(clone!(@weak self as this => + move |_| { + this.patch_filechooser.show(); + + + + //this.patch_filechooser.close(); + })); + + // self.patch_filechooser.connect_response(clone!(@weak self as this => + // move |_, ResponseType::Ok| { + // this.patch_filechooser.close(); + // })); + } + + fn set_button(&self) { + self.patch_button.set_margin_top(20); + self.patch_button.set_margin_bottom(20); + self.patch_button.set_margin_start(20); + self.patch_button.set_margin_end(20); + self.patch_button.set_visible(true); + self.patch_button.set_label("Open"); + } + + fn set_label(&self) { + self.patch_label.set_margin_top(20); + self.patch_label.set_margin_bottom(20); + self.patch_label.set_margin_start(20); + self.patch_label.set_margin_end(20); + self.patch_label.set_visible(true); + } + + fn set_box(&self) { + self.patch_box.set_homogeneous(true); + self.patch_box.set_visible(true); + self.patch_box.append(&self.patch_label); + self.patch_box.append(&self.patch_button); + } +} \ No newline at end of file diff --git a/src/titlebar.rs b/src/titlebar.rs new file mode 100644 index 0000000..2dce7a8 --- /dev/null +++ b/src/titlebar.rs @@ -0,0 +1,60 @@ +use std::rc::Rc; +use futures::executor::block_on; +use gtk4::prelude::*; +use gtk4::{ + glib::*, + ApplicationWindow, + HeaderBar, + Button, + Window +}; + +#[derive(Debug, Downgrade)] +pub struct CustomTitleBar { + pub window: Window, + pub titlebar: HeaderBar, + pub run_button: Button, + pub type_button: Button, +} + +impl CustomTitleBar { + pub fn new() -> CustomTitleBar { + CustomTitleBar { + window: Window::new(), + titlebar: HeaderBar::new(), + run_button: Button::new(), + type_button: Button::new(), + } + } + + pub fn set_buttons(&self) { + // set labels + self.run_button.set_label("Apply Patch"); + self.type_button.set_label("Patch Type"); + + // set css class; it turns blue! + self.run_button.set_css_classes(&["run_btn"]); + + // set visibility + self.run_button.set_visible(true); + self.type_button.set_visible(true); + + // asdf + + } + + pub fn click_run_button(&self) { + self.run_button.connect_clicked(move |button| { + button.set_label("Avery is awesome!"); + }); + } + + pub fn set_window(&self, window: &ApplicationWindow) { + window.set_titlebar(Some(&self.titlebar)); + } + + pub fn set_titlebar(&self) { + self.titlebar.pack_start(&self.run_button); + self.titlebar.pack_start(&self.type_button); + } +} \ No newline at end of file