/* Copyright (c) 2011 by Simon Schneegans This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ namespace GnomePie { ///////////////////////////////////////////////////////////////////////// /// The Gtk settings menu of Gnome-Pie. ///////////////////////////////////////////////////////////////////////// public class Preferences : Gtk.Window { ///////////////////////////////////////////////////////////////////// /// C'tor, constructs the whole dialog. Many thanks to the /// synapse-project, since some of this code is taken from there! ///////////////////////////////////////////////////////////////////// public Preferences() { this.title = _("Gnome-Pie - Settings"); this.set_position(Gtk.WindowPosition.CENTER); this.set_size_request(550, 550); this.resizable = false; this.icon_name = "gnome-pie"; this.delete_event.connect(hide_on_delete); // main container var main_vbox = new Gtk.VBox(false, 12); main_vbox.border_width = 12; add(main_vbox); // tab container var tabs = new Gtk.Notebook(); // general tab var general_tab = new Gtk.VBox(false, 6); general_tab.border_width = 12; // behavior frame var behavior_frame = new Gtk.Frame(null); behavior_frame.set_shadow_type(Gtk.ShadowType.NONE); var behavior_frame_label = new Gtk.Label(null); behavior_frame_label.set_markup(Markup.printf_escaped ("%s", _("Behavior"))); behavior_frame.set_label_widget(behavior_frame_label); var behavior_vbox = new Gtk.VBox (false, 6); var align = new Gtk.Alignment (0.5f, 0.5f, 1.0f, 1.0f); align.set_padding (6, 12, 12, 12); align.add (behavior_vbox); behavior_frame.add (align); // Autostart checkbox var autostart = new Gtk.CheckButton.with_label (_("Startup on Login")); autostart.tooltip_text = _("If checked, Gnome-Pie will start when you log in."); autostart.active = Config.global.auto_start; autostart.toggled.connect(autostart_toggled); behavior_vbox.pack_start(autostart, false); // Indicator icon var indicator = new Gtk.CheckButton.with_label (_("Show Indicator")); indicator.tooltip_text = _("If checked, an indicator for easy access of the settings menu is shown in your panel."); indicator.active = Config.global.show_indicator; indicator.toggled.connect(indicator_toggled); behavior_vbox.pack_start(indicator, false); // Open Pies at Mouse var open_at_mouse = new Gtk.CheckButton.with_label (_("Open Pies at Mouse")); open_at_mouse.tooltip_text = _("If checked, pies will open at your pointer. Otherwise they'll pop up in the middle of the screen."); open_at_mouse.active = Config.global.open_at_mouse; open_at_mouse.toggled.connect(open_at_mouse_toggled); behavior_vbox.pack_start(open_at_mouse, false); // Click to activate var click_to_activate = new Gtk.CheckButton.with_label (_("Turbo mode")); click_to_activate.tooltip_text = _("If checked, the pie closes when its keystroke is released. The currently hovered slice gets executed. This allows very fast selection but disables keyboard navigation."); click_to_activate.active = Config.global.turbo_mode; click_to_activate.toggled.connect(turbo_mode_toggled); behavior_vbox.pack_start(click_to_activate, false); // Slider var slider_hbox = new Gtk.HBox (false, 6); behavior_vbox.pack_start(slider_hbox); var scale_label = new Gtk.Label(_("Global Scale")); slider_hbox.pack_start(scale_label, false, false); var scale_slider = new Gtk.HScale.with_range(0.5, 2.0, 0.05); scale_slider.set_value(Config.global.global_scale); scale_slider.value_pos = Gtk.PositionType.RIGHT; bool changing = false; bool changed_again = false; scale_slider.value_changed.connect(() => { if (!changing) { changing = true; Timeout.add(300, () => { if (changed_again) { changed_again = false; return true; } Config.global.global_scale = scale_slider.get_value(); Config.global.load_themes(Config.global.theme.name); changing = false; return false; }); } else { changed_again = true; } }); slider_hbox.pack_end(scale_slider, true, true); general_tab.pack_start (behavior_frame, false); // theme frame var theme_frame = new Gtk.Frame(null); theme_frame.set_shadow_type(Gtk.ShadowType.NONE); var theme_frame_label = new Gtk.Label(null); theme_frame_label.set_markup(Markup.printf_escaped("%s", _("Themes"))); theme_frame.set_label_widget(theme_frame_label); // scrollable frame var scroll = new Gtk.ScrolledWindow (null, null); align = new Gtk.Alignment(0.5f, 0.5f, 1.0f, 1.0f); align.set_padding(6, 12, 12, 12); align.add(scroll); theme_frame.add(align); scroll.set_policy (Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); scroll.set_shadow_type (Gtk.ShadowType.IN); // themes list var theme_list = new ThemeList(); scroll.add(theme_list); general_tab.pack_start (theme_frame, true, true); tabs.append_page(general_tab, new Gtk.Label(_("General"))); // pies tab var pies_tab = new Gtk.VBox(false, 6); pies_tab.border_width = 12; tabs.append_page(pies_tab, new Gtk.Label(_("Pies"))); // scrollable frame scroll = new Gtk.ScrolledWindow (null, null); align = new Gtk.Alignment(0.5f, 0.5f, 1.0f, 1.0f); align.add(scroll); pies_tab.add(align); scroll.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); scroll.set_shadow_type (Gtk.ShadowType.IN); // pies list var pie_list = new PieList(); scroll.add(pie_list); // bottom box var info_box = new Gtk.HBox (false, 6); // info image var info_image = new Gtk.Image.from_stock (Gtk.Stock.INFO, Gtk.IconSize.MENU); info_box.pack_start (info_image, false); // info label var info_label = new TipViewer({ _("You can right-click in the list for adding or removing entries."), _("You can reset Gnome-Pie to its default options with the terminal command \"gnome-pie --reset\"."), _("The radiobutton at the beginning of each slice-line indicates the QuickAction of the pie."), _("Pies can be opened with the terminal command \"gnome-pie --open=ID\"."), _("Feel free to visit Gnome-Pie's homepage at %s!").printf("gnome-pie.simonschneegans.de"), _("You can drag'n'drop applications from your main menu to the list above."), _("If you want to give some feedback, please write an e-mail to %s!").printf("code@simonschneegans.de"), _("You may drag'n'drop URLs and bookmarks from your internet browser to the list above."), _("Bugs can be reported at %s!").printf("Github"), _("It's possible to drag'n'drop files and folders from your file browser to the list above."), _("In order to create a launcher for a Pie, drag the Pie from the list to your desktop!") }); this.show.connect(info_label.start_slide_show); this.hide.connect(info_label.stop_slide_show); info_box.pack_start (info_label); // down Button var down_button = new Gtk.Button(); down_button.tooltip_text = _("Moves the selected Slice down"); down_button.sensitive = false; var down_image = new Gtk.Image.from_stock (Gtk.Stock.GO_DOWN, Gtk.IconSize.LARGE_TOOLBAR); down_button.add(down_image); down_button.clicked.connect (() => { pie_list.selection_down(); }); info_box.pack_end(down_button, false, false); // up Button var up_button = new Gtk.Button(); up_button.tooltip_text = _("Moves the selected Slice up"); up_button.sensitive = false; var up_image = new Gtk.Image.from_stock (Gtk.Stock.GO_UP, Gtk.IconSize.LARGE_TOOLBAR); up_button.add(up_image); up_button.clicked.connect (() => { pie_list.selection_up(); }); info_box.pack_end(up_button, false, false); pie_list.get_selection().changed.connect(() => { Gtk.TreeIter selected; if (pie_list.get_selection().get_selected(null, out selected)) { Gtk.TreePath path = pie_list.model.get_path(selected); if (path.get_depth() == 1) { up_button.sensitive = false; down_button.sensitive = false; } else { up_button.sensitive = true; down_button.sensitive = true; int child_pos = path.get_indices()[1]; if (child_pos == 0) up_button.sensitive = false; path.up(); Gtk.TreeIter parent_iter; pie_list.model.get_iter(out parent_iter, path); if (child_pos == pie_list.model.iter_n_children(parent_iter)-1) down_button.sensitive = false; } } }); pies_tab.pack_start (info_box, false); main_vbox.pack_start(tabs); // close button var bbox = new Gtk.HButtonBox (); bbox.set_layout (Gtk.ButtonBoxStyle.END); var close_button = new Gtk.Button.from_stock (Gtk.Stock.CLOSE); close_button.clicked.connect (() => { hide(); // save settings on close Config.global.save(); Pies.save(); }); bbox.pack_start (close_button); main_vbox.pack_start(bbox, false); main_vbox.show_all(); } ///////////////////////////////////////////////////////////////////// /// Creates or deletes the autostart file. This code is inspired /// by project synapse as well. ///////////////////////////////////////////////////////////////////// private void autostart_toggled(Gtk.ToggleButton check_box) { bool active = check_box.active; if (!active && FileUtils.test(Paths.autostart, FileTest.EXISTS)) { // delete the autostart file FileUtils.remove (Paths.autostart); } else if (active && !FileUtils.test(Paths.autostart, FileTest.EXISTS)) { string autostart_entry = "#!/usr/bin/env xdg-open\n" + "[Desktop Entry]\n" + "Name=Gnome-Pie\n" + "Exec=gnome-pie\n" + "Encoding=UTF-8\n" + "Type=Application\n" + "X-GNOME-Autostart-enabled=true\n" + "Icon=gnome-pie\n"; // create the autostart file string autostart_dir = GLib.Path.get_dirname(Paths.autostart); if (!FileUtils.test(autostart_dir, FileTest.EXISTS | FileTest.IS_DIR)) { DirUtils.create_with_parents(autostart_dir, 0755); } try { FileUtils.set_contents(Paths.autostart, autostart_entry); FileUtils.chmod(Paths.autostart, 0755); } catch (Error e) { var d = new Gtk.MessageDialog (this, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, "%s", e.message); d.run (); d.destroy (); } } } ///////////////////////////////////////////////////////////////////// /// Shows or hides the indicator. ///////////////////////////////////////////////////////////////////// private void indicator_toggled(Gtk.ToggleButton check_box) { var check = check_box as Gtk.CheckButton; Config.global.show_indicator = check.active; } ///////////////////////////////////////////////////////////////////// /// Toggles whether the Pies are shown at the mouse or in the middle /// of the screen. ///////////////////////////////////////////////////////////////////// private void open_at_mouse_toggled(Gtk.ToggleButton check_box) { var check = check_box as Gtk.CheckButton; Config.global.open_at_mouse = check.active; } ///////////////////////////////////////////////////////////////////// /// Toggles whether the user has to click with the mouse in order to /// activate a slice. ///////////////////////////////////////////////////////////////////// private void turbo_mode_toggled(Gtk.ToggleButton check_box) { var check = check_box as Gtk.CheckButton; Config.global.turbo_mode = check.active; } } }