diff --git a/src/file_chooser_dialog.rs b/src/file_chooser_dialog.rs index 271cbed118..8e5d70dcc1 100644 --- a/src/file_chooser_dialog.rs +++ b/src/file_chooser_dialog.rs @@ -5,20 +5,31 @@ use ffi; use glib::translate::*; use glib::object::{Downcast, IsA}; +use libc::c_char; use std::ptr; use FileChooserAction; use FileChooserDialog; +use ResponseType; use Widget; use Window; impl FileChooserDialog { - pub fn new>(title: Option<&str>, parent: Option<&T>, action: FileChooserAction) - -> FileChooserDialog { + pub fn new>(title: Option<&str>, parent: Option<&T>, action: FileChooserAction, buttons: &[(&str, ResponseType)]) -> FileChooserDialog { assert_initialized_main_thread!(); unsafe { - Widget::from_glib_none( - ffi::gtk_file_chooser_dialog_new(title.to_glib_none().0, parent.to_glib_none().0, - action.to_glib(), ptr::null_mut())) + Widget::from_glib_none(match buttons.len() { + 0 => ffi::gtk_file_chooser_dialog_new(title.to_glib_none().0, parent.to_glib_none().0, action.to_glib(), ptr::null::()), + 1 => ffi::gtk_file_chooser_dialog_new(title.to_glib_none().0, parent.to_glib_none().0, action.to_glib(), buttons[0].0.to_glib_none().0, buttons[0].1.to_glib(), ptr::null::()), + 2 => { + let second_button_text: *const c_char = buttons[1].0.to_glib_none().0; + ffi::gtk_file_chooser_dialog_new(title.to_glib_none().0, parent.to_glib_none().0, action.to_glib(), buttons[0].0.to_glib_none().0, buttons[0].1.to_glib(), second_button_text, buttons[1].1.to_glib(), ptr::null::()) + }, + _ => { + let second_button_text: *const c_char = buttons[1].0.to_glib_none().0; + let third_button_text: *const c_char = buttons[2].0.to_glib_none().0; + ffi::gtk_file_chooser_dialog_new(title.to_glib_none().0, parent.to_glib_none().0, action.to_glib(), buttons[0].0.to_glib_none().0, buttons[0].1.to_glib(), second_button_text, buttons[1].1.to_glib(), third_button_text, buttons[2].1.to_glib(), ptr::null::()) + }, + }) .downcast_unchecked() } }