diff options
| author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2015-09-27 15:07:18 +0200 | 
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2015-09-27 15:07:18 +0200 | 
| commit | e5da485f77b3b8cd3bc32c13e4497a64a2ad10c3 (patch) | |
| tree | b7351c6674108ea5746d70fdc2ff6c59bdc84595 /src/gui | |
| parent | bbabe0f4e471dd984a1c01353c44d4eb1f336473 (diff) | |
| parent | 16fe2e5d0525422ba6ca5db9e92a93d17caae302 (diff) | |
Merge new upstream release
Diffstat (limited to 'src/gui')
| -rw-r--r-- | src/gui/preferencesWindow.vala | 134 | ||||
| -rw-r--r-- | src/gui/themeList.vala | 20 | ||||
| -rw-r--r-- | src/gui/tipViewer.vala | 163 | 
3 files changed, 307 insertions, 10 deletions
diff --git a/src/gui/preferencesWindow.vala b/src/gui/preferencesWindow.vala index 5d22d6b..d671501 100644 --- a/src/gui/preferencesWindow.vala +++ b/src/gui/preferencesWindow.vala @@ -154,6 +154,17 @@ public class PreferencesWindow : GLib.Object {          scroll_area = builder.get_object("theme-scrolledwindow") as Gtk.ScrolledWindow;          scroll_area.add(this.theme_list); +        (builder.get_object("theme-help-button") as Gtk.Button).clicked.connect(() => { +            try{ +                GLib.AppInfo.launch_default_for_uri("http://simmesimme.github.io/lessons/2015/04/26/themes-for-gnome-pie/", null); +            } catch (Error e) { +                warning(e.message); +            } +        }); + +        (builder.get_object("theme-export-button") as Gtk.Button).clicked.connect(on_export_theme_button_clicked); +        (builder.get_object("theme-import-button") as Gtk.Button).clicked.connect(on_import_theme_button_clicked); +          this.autostart = (builder.get_object("autostart-checkbox") as Gtk.ToggleButton);          this.autostart.toggled.connect(on_autostart_toggled); @@ -209,6 +220,33 @@ public class PreferencesWindow : GLib.Object {                  Config.global.max_visible_slices = (int)range_slices.get_value();              }); +        var info_box = (builder.get_object("info-box") as Gtk.Box); + +        // info label +        var info_label = new TipViewer({ +            _("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://simmesimme.github.io/gnome-pie.html'>gnome-pie.simonschneegans.de</a>"), +            _("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 can support the development of Gnome-Pie by donating via %s.").printf("<a href='https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=X65SUVC4ZTQSC'>Paypal</a>"), +            _("Translating Gnome-Pie to your language is easy. Translations are managed at %s.").printf("<a href='https://translate.zanata.org/zanata/iteration/view/gnome-pie/develop'>Zanata</a>"), +            _("It's easy to create new themes for Gnome-Pie. Read the <a href='%s'>Tutorial</a> online.").printf("http://simmesimme.github.io/lessons/2015/04/26/themes-for-gnome-pie/"), +            _("It's usually a good practive to have at most twelve slices per pie."), +            _("You can export themes you created and share them with the community!"), +            _("The source code of Gnome-Pie is available on %s.").printf("<a href='https://github.com/Simmesimme/Gnome-Pie'>Github</a>"), +            _("Bugs can be reported at %s!").printf("<a href='https://github.com/Simmesimme/Gnome-Pie/issues'>Github</a>"), +            _("Suggestions can be posted on %s!").printf("<a href='https://github.com/Simmesimme/Gnome-Pie/issues'>Github</a>"), +            _("An awesome companion of Gnome-Pie is %s. It will make using your computer feel like magic!").printf("<a href='https://github.com/thjaeger/easystroke/wiki'>Easystroke</a>"), +            _("You can drag'n'drop applications from your main menu to the pie above."), +            _("You may drag'n'drop URLs and bookmarks from your internet browser to the pie above."), +            _("You can drag'n'drop files and folders from your file browser to the pie above."), +            _("You can drag'n'drop pies from the list on the left into other pies in order to create sub-pies."), +            _("You can drag'n'drop pies from the list on the left to your desktop or dock to create a launcher for this pie.") +        }); +        this.window.show.connect(info_label.start_slide_show); +        this.window.hide.connect(info_label.stop_slide_show); + +        info_box.pack_end(info_label); +          this.window.hide.connect(() => {              // save settings on close              Config.global.save(); @@ -290,15 +328,105 @@ public class PreferencesWindow : GLib.Object {                  FileUtils.set_contents(Paths.autostart, autostart_entry);                  FileUtils.chmod(Paths.autostart, 0755);              } catch (Error e) { -                var d = new Gtk.MessageDialog (this.window, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, +                var d = new Gtk.MessageDialog(this.window, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE,                                             "%s", e.message); -                d.run (); -                d.destroy (); +                d.run(); +                d.destroy();              }          }      }      ///////////////////////////////////////////////////////////////////// +    /// Saves the current theme to an archive. +    ///////////////////////////////////////////////////////////////////// + +    private void on_export_theme_button_clicked(Gtk.Button button) { +        var dialog = new Gtk.FileChooserDialog("Pick a file", this.window, +                                               Gtk.FileChooserAction.SAVE, +                                               "_Cancel", +                                               Gtk.ResponseType.CANCEL, +                                               "_Save", +                                               Gtk.ResponseType.ACCEPT); + +        dialog.set_do_overwrite_confirmation(true); +        dialog.set_modal(true); +        dialog.filter = new Gtk.FileFilter(); +        dialog.filter.add_pattern ("*.tar.gz"); +        dialog.set_current_name(Config.global.theme.name + ".tar.gz"); + +        dialog.response.connect((d, result) => { +            if (result == Gtk.ResponseType.ACCEPT) { +                var file = dialog.get_filename(); +                if (!file.has_suffix(".tar.gz")) { +                    file = file + ".tar.gz"; +                } +                Config.global.theme.export(file); +            } +            dialog.destroy(); +        }); +        dialog.show(); +    } + +    ///////////////////////////////////////////////////////////////////// +    /// Imports a new theme from an archive. +    ///////////////////////////////////////////////////////////////////// + +    private void on_import_theme_button_clicked(Gtk.Button button) { +        var dialog = new Gtk.FileChooserDialog("Pick a file", this.window, +                                               Gtk.FileChooserAction.OPEN, +                                               "_Cancel", +                                               Gtk.ResponseType.CANCEL, +                                               "_Open", +                                               Gtk.ResponseType.ACCEPT); + +        dialog.set_modal(true); +        dialog.filter = new Gtk.FileFilter(); +        dialog.filter.add_pattern ("*.tar.gz"); + +        var result = Gtk.MessageType.INFO; +        var message = _("Sucessfully imported new theme!"); + +        dialog.response.connect((d, r) => { +            if (r == Gtk.ResponseType.ACCEPT) { +                var file = dialog.get_filename(); + +                var a = new ThemeImporter(); +                if (a.open(file)) { +                    if (a.is_valid_theme) { +                        if (!Config.global.has_theme(a.theme_name)) { +                            if (a.extract_to(Paths.local_themes + "/" + a.theme_name)) { +                                Config.global.load_themes(a.theme_name); +                                this.theme_list.reload(); +                            } else { +                                message = _("An error occured while importing the theme: Failed to extract theme!"); +                                result = Gtk.MessageType.ERROR; +                            } +                        } else { +                            message = _("An error occured while importing the theme: A theme with this name does already exist!"); +                            result = Gtk.MessageType.ERROR; +                        } +                    } else { +                        message = _("An error occured while importing the theme: Theme archive does not contain a valid theme!"); +                        result = Gtk.MessageType.ERROR; +                    } +                } else { +                    message = _("An error occured while importing the theme: Failed to open theme archive!"); +                    result = Gtk.MessageType.ERROR; +                } +                a.close(); + +                var result_dialog = new Gtk.MessageDialog(null, Gtk.DialogFlags.MODAL, +                                                          result, Gtk.ButtonsType.CLOSE, message); +                result_dialog.run(); +                result_dialog.destroy(); +            } +            dialog.destroy(); + +        }); +        dialog.show(); +    } + +    /////////////////////////////////////////////////////////////////////      /// Shows or hides the indicator.      ///////////////////////////////////////////////////////////////////// diff --git a/src/gui/themeList.vala b/src/gui/themeList.vala index 517c6d5..46ae876 100644 --- a/src/gui/themeList.vala +++ b/src/gui/themeList.vala @@ -51,9 +51,6 @@ class ThemeList : Gtk.TreeView {      public ThemeList() {          GLib.Object(); -        var data = new Gtk.ListStore(2, typeof(Gdk.Pixbuf), -                                        typeof(string)); -        this.set_model(data);          this.set_headers_visible(true);          this.set_grid_lines(Gtk.TreeViewGridLines.NONE);          this.set_fixed_height_mode(true); @@ -79,7 +76,7 @@ class ThemeList : Gtk.TreeView {              Gtk.TreeIter active;              if (this.get_selection().get_selected(null, out active)) {                  Timeout.add(10, () => { -                    int index = int.parse(data.get_path(active).to_string()); +                    int index = int.parse(this.model.get_path(active).to_string());                      Config.global.theme = Config.global.themes[index];                      this.on_select_new(); @@ -91,6 +88,15 @@ class ThemeList : Gtk.TreeView {              }          }); +        reload(); +    } + +    public void reload() { + +        var data = new Gtk.ListStore(2, typeof(Gdk.Pixbuf), +                                        typeof(string)); +        this.set_model(data); +          // load all themes into the list          var themes = Config.global.themes;          foreach(var theme in themes) { @@ -99,10 +105,10 @@ class ThemeList : Gtk.TreeView {              data.set(current, DataPos.ICON, theme.preview_icon.to_pixbuf());              data.set(current, DataPos.NAME, GLib.Markup.escape_text(theme.name)+"\n"                                              + "<span font-size='x-small'>" + GLib.Markup.escape_text(theme.description) -                                            + " - <i>"+GLib.Markup.escape_text(_("By")+" "+theme.author) -                                            + "</i></span>"); -            if(theme == Config.global.theme) +                                            + "</span>"); +            if(theme == Config.global.theme) {                  get_selection().select_iter(current); +            }          }      }  } diff --git a/src/gui/tipViewer.vala b/src/gui/tipViewer.vala new file mode 100644 index 0000000..e2158bd --- /dev/null +++ b/src/gui/tipViewer.vala @@ -0,0 +1,163 @@ +///////////////////////////////////////////////////////////////////////// +// Copyright (c) 2011-2015 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 { + +///////////////////////////////////////////////////////////////////////// +/// A widget showing tips. The tips are beautifully faded in and out. +///////////////////////////////////////////////////////////////////////// + +public class TipViewer : Gtk.Label { + +    ///////////////////////////////////////////////////////////////////// +    /// Some settings tweaking the behavior of the TipViewer. +    ///////////////////////////////////////////////////////////////////// + +    private const double fade_time = 0.5; +    private const double frame_rate = 20.0; +    private const double base_delay = 3.0; + +    ///////////////////////////////////////////////////////////////////// +    /// False, if the playback of tips is stopped. +    ///////////////////////////////////////////////////////////////////// + +    private bool playing = false; + +    ///////////////////////////////////////////////////////////////////// +    /// An array containing all tips. +    ///////////////////////////////////////////////////////////////////// + +    private string[] tips; + +    ///////////////////////////////////////////////////////////////////// +    /// The index of the currently displayed tip. +    ///////////////////////////////////////////////////////////////////// + +    private int index = -1; + +    ///////////////////////////////////////////////////////////////////// +    /// The fading value. +    ///////////////////////////////////////////////////////////////////// + +    private AnimatedValue alpha; + +    ///////////////////////////////////////////////////////////////////// +    /// C'tor, initializes all members and sets the basic layout. +    ///////////////////////////////////////////////////////////////////// + +    public TipViewer(string[] tips) { +        this.tips = tips; + +        this.alpha = new AnimatedValue.linear(0.0, 1.0, fade_time); + +        this.set_alignment (0.0f, 0.5f); +        this.opacity = 0; +        this.wrap = true; +        this.valign = Gtk.Align.END; +        this.set_use_markup(true); + +        this.override_font(Pango.FontDescription.from_string("8")); +    } + +    ///////////////////////////////////////////////////////////////////// +    /// Starts the playback of tips. +    ///////////////////////////////////////////////////////////////////// + +    public void start_slide_show() { +        if (!this.playing && tips.length > 1) { +            this.playing = true; +            show_tip(); +        } +    } + +    ///////////////////////////////////////////////////////////////////// +    /// Stops the playback of tips. +    ///////////////////////////////////////////////////////////////////// + +    public void stop_slide_show() { +        this.playing = false; +    } + +    ///////////////////////////////////////////////////////////////////// +    /// Starts the fading in. +    ///////////////////////////////////////////////////////////////////// + +    private void fade_in() { +        this.alpha = new AnimatedValue.linear(this.alpha.val, 1.0, fade_time); + +        GLib.Timeout.add((uint)(1000.0/frame_rate), () => { +            this.alpha.update(1.0/frame_rate); +            this.opacity = this.alpha.val; + +            return (this.alpha.val != 1.0); +        }); +    } + +    ///////////////////////////////////////////////////////////////////// +    /// Starts the fading out. +    ///////////////////////////////////////////////////////////////////// + +    private void fade_out() { +        this.alpha = new AnimatedValue.linear(this.alpha.val, 0.0, fade_time); + +        GLib.Timeout.add((uint)(1000.0/frame_rate), () => { +            this.alpha.update(1.0/frame_rate); +            this.opacity = this.alpha.val; + +            return (this.alpha.val != 0.0); +        }); +    } + +    private void show_tip() { + +        this.set_random_tip(); + +        this.fade_in(); + +        uint delay = (uint)(base_delay*1000.0) + tips[this.index].length*30; + +        GLib.Timeout.add(delay, () => { +            this.fade_out(); + +            if (this.playing) { +                GLib.Timeout.add((uint)(1000.0*fade_time), () => { +                    this.show_tip(); +                    return false; +                }); +            } + +            return false; +        }); +    } + +    ///////////////////////////////////////////////////////////////////// +    /// Chooses the next random tip. +    ///////////////////////////////////////////////////////////////////// + +    private void set_random_tip() { +        if (tips.length > 1) { +            int next_index = -1; +            do { +                next_index = GLib.Random.int_range(0, tips.length); +            } while (next_index == this.index); +            this.index = next_index; +            this.label = tips[this.index]; +        } +    } +} + +}  | 
