Skip to content

Instantly share code, notes, and snippets.

@koji-m
Last active November 25, 2017 03:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koji-m/b88a887543f2ffd0b9ce689c532ee466 to your computer and use it in GitHub Desktop.
Save koji-m/b88a887543f2ffd0b9ce689c532ee466 to your computer and use it in GitHub Desktop.
Vanilla Text version 0.0.1
//main.rs ver.0.0.1
extern crate gtk;
extern crate gio;
extern crate gdk;
mod win;
use gtk::{ WidgetExt,
GtkApplicationExt,
DialogExt, FileChooserExt,
};
use gio::{ ApplicationExt, MenuExt, SimpleActionExt,
ActionMapExt,
FileExt
};
use win::{
Window, WindowExtend
};
fn main() {
match gtk::Application::new("com.github.koji-m.vanilla_text", gio::APPLICATION_HANDLES_OPEN) {
Ok(app) => {
app.connect_activate(|app| {
let new_window_action = gio::SimpleAction::new("new_window", None);
{
let app = app.clone();
new_window_action.connect_activate(move |_, _| {
let w = Window::create(&app);
w.init();
});
}
let open_action = gio::SimpleAction::new("open", None);
{
let app = app.clone();
open_action.connect_activate(move |_, _| {
if let Some(file) = run_file_chooser_dialog() {
open(file, app.clone());
}
});
}
let quit_action = gio::SimpleAction::new("quit", None);
{
let app = app.clone();
quit_action.connect_activate(move |_, _| {
app.quit();
});
}
app.add_action(&new_window_action);
app.add_action(&open_action);
app.add_action(&quit_action);
{
use gio::{Menu, MenuItem};
let menubar = Menu::new();
let submenu_file = Menu::new();
let newwindow = MenuItem::new("New Window", "app.new_window");
let open = MenuItem::new("Open", "app.open");
let save = MenuItem::new("Save", "win.save");
let quit = MenuItem::new("Quit", "app.quit");
submenu_file.append_item(&newwindow);
submenu_file.append_item(&open);
submenu_file.append_item(&save);
submenu_file.append_item(&quit);
let submenu_edit = Menu::new();
let copy = MenuItem::new("Copy", "win.copy");
let paste = MenuItem::new("Paste", "win.paste");
submenu_edit.append_item(&copy);
submenu_edit.append_item(&paste);
menubar.append_submenu("File", &submenu_file);
menubar.append_submenu("Edit", &submenu_edit);
app.set_menubar(&menubar);
}
let w = Window::create(&app);
w.init();
});
app.run(&[""]);
},
Err(_) => {
println!("Application start up error");
}
};
}
fn run_file_chooser_dialog() -> Option<gio::File> {
let dialog = gtk::FileChooserDialog::new::<gtk::Window>(Some("Open File"),
None,
gtk::FileChooserAction::Open);
dialog.add_button("Cancel", gtk::ResponseType::Cancel.into());
dialog.add_button("Open", gtk::ResponseType::Accept.into());
let file;
if dialog.run() == gtk::ResponseType::Accept.into() {
if let Some(path) = dialog.get_filename() {
file = Some(gio::File::new_for_path(path.as_path()))
} else {
file = None
}
} else {
file = None
}
dialog.destroy();
file
}
fn open(file: gio::File, app: gtk::Application) {
let win = Window::create(&app);
win.load_file(file.clone());
win.set_file(Some(file.clone()));
win.set_title(file.get_basename().unwrap().to_str().unwrap());
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment