summaryrefslogtreecommitdiff
path: root/src/gui/preferences.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/preferences.vala')
-rw-r--r--src/gui/preferences.vala338
1 files changed, 338 insertions, 0 deletions
diff --git a/src/gui/preferences.vala b/src/gui/preferences.vala
new file mode 100644
index 0000000..f43fd4a
--- /dev/null
+++ b/src/gui/preferences.vala
@@ -0,0 +1,338 @@
+/*
+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 <http://www.gnu.org/licenses/>.
+*/
+
+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 ("<b>%s</b>", _("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("<b>%s</b>", _("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("<a href='http://gnome-pie.simonschneegans.de'>gnome-pie.simonschneegans.de</a>"),
+ _("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("<a href='mailto:code@simonschneegans.de'>code@simonschneegans.de</a>"),
+ _("You may drag'n'drop URLs and bookmarks from your internet browser to the list above."),
+ _("Bugs can be reported at %s!").printf("<a href='https://github.com/Simmesimme/Gnome-Pie'>Github</a>"),
+ _("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;
+ }
+}
+
+}