public SparkleSetup() : base() { Controller.HideWindowEvent += delegate { Application.Invoke (delegate { HideAll (); }); }; Controller.ShowWindowEvent += delegate { Application.Invoke (delegate { ShowAll (); Present (); }); }; Controller.ChangePageEvent += delegate (PageType type, string [] warnings) { Application.Invoke (delegate { Reset (); switch (type) { case PageType.Setup: { Header = _("Welcome to SparkleShare!"); Description = "First off, what's your name and email?\nThis information is only visible to team members."; Table table = new Table (2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label name_label = new Label ("<b>" + _("Full Name:") + "</b>") { UseMarkup = true, Xalign = 1 }; Entry name_entry = new Entry (Controller.GuessedUserName) { Xalign = 0, ActivatesDefault = true }; Entry email_entry = new Entry (Controller.GuessedUserEmail) { Xalign = 0, ActivatesDefault = true }; name_entry.Changed += delegate { Controller.CheckSetupPage (name_entry.Text, email_entry.Text); }; email_entry.Changed += delegate { Controller.CheckSetupPage (name_entry.Text, email_entry.Text); }; Label email_label = new Label ("<b>" + _("Email:") + "</b>") { UseMarkup = true, Xalign = 1 }; table.Attach (name_label, 0, 1, 0, 1); table.Attach (name_entry, 1, 2, 0, 1); table.Attach (email_label, 0, 1, 1, 2); table.Attach (email_entry, 1, 2, 1, 2); VBox wrapper = new VBox (false, 9); wrapper.PackStart (table, true, false, 0); Button cancel_button = new Button (_("Cancel")); cancel_button.Clicked += delegate { Controller.SetupPageCancelled (); }; Button continue_button = new Button (_("Continue")) { Sensitive = false }; continue_button.Clicked += delegate (object o, EventArgs args) { string full_name = name_entry.Text; string email = email_entry.Text; Controller.SetupPageCompleted (full_name, email); }; AddButton (cancel_button); AddButton (continue_button); Add (wrapper); Controller.UpdateSetupContinueButtonEvent += delegate (bool button_enabled) { Application.Invoke (delegate { continue_button.Sensitive = button_enabled; }); }; Controller.CheckSetupPage (name_entry.Text, email_entry.Text); break; } case PageType.Add: { Header = _("Where's your project hosted?"); VBox layout_vertical = new VBox (false, 12); HBox layout_fields = new HBox (true, 12); VBox layout_address = new VBox (true, 0); VBox layout_path = new VBox (true, 0); ListStore store = new ListStore (typeof (Gdk.Pixbuf), typeof (string), typeof (SparklePlugin)); SparkleTreeView tree = new SparkleTreeView (store) { HeadersVisible = false }; ScrolledWindow scrolled_window = new ScrolledWindow (); scrolled_window.AddWithViewport (tree); // Icon column tree.AppendColumn ("Icon", new Gtk.CellRendererPixbuf (), "pixbuf", 0); tree.Columns [0].Cells [0].Xpad = 6; // Service column TreeViewColumn service_column = new TreeViewColumn () { Title = "Service" }; CellRendererText service_cell = new CellRendererText () { Ypad = 4 }; service_column.PackStart (service_cell, true); service_column.SetCellDataFunc (service_cell, new TreeCellDataFunc (RenderServiceColumn)); foreach (SparklePlugin plugin in Controller.Plugins) { store.AppendValues ( new Gdk.Pixbuf (plugin.ImagePath), "<span size=\"small\"><b>" + plugin.Name + "</b>\n" + "<span fgcolor=\"" + SecondaryTextColorSelected + "\">" + plugin.Description + "</span>" + "</span>", plugin); } tree.AppendColumn (service_column); Entry address_entry = new Entry () { Text = Controller.PreviousAddress, Sensitive = (Controller.SelectedPlugin.Address == null), ActivatesDefault = true }; Entry path_entry = new Entry () { Text = Controller.PreviousPath, Sensitive = (Controller.SelectedPlugin.Path == null), ActivatesDefault = true }; Label address_example = new Label () { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + Controller.SelectedPlugin.AddressExample + "</span>" }; Label path_example = new Label () { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + Controller.SelectedPlugin.PathExample + "</span>" }; // Select the first plugin by default TreeSelection default_selection = tree.Selection; TreePath default_path = new TreePath ("0"); default_selection.SelectPath (default_path); Controller.SelectedPluginChanged (0); Controller.ChangeAddressFieldEvent += delegate (string text, string example_text, FieldState state) { Application.Invoke (delegate { address_entry.Text = text; address_entry.Sensitive = (state == FieldState.Enabled); address_example.Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.ChangePathFieldEvent += delegate (string text, string example_text, FieldState state) { Application.Invoke (delegate { path_entry.Text = text; path_entry.Sensitive = (state == FieldState.Enabled); path_example.Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.CheckAddPage (address_entry.Text, path_entry.Text, 1); // Update the address field text when the selection changes tree.CursorChanged += delegate (object sender, EventArgs e) { Controller.SelectedPluginChanged (tree.SelectedRow); // TODO: Scroll to selected row when using arrow keys }; tree.Model.Foreach (new TreeModelForeachFunc (delegate (TreeModel model, TreePath path, TreeIter iter) { string address; try { address = (model.GetValue (iter, 2) as SparklePlugin).Address; } catch (NullReferenceException) { address = ""; } if (!string.IsNullOrEmpty (address) && address.Equals (Controller.PreviousAddress)) { tree.SetCursor (path, service_column, false); SparklePlugin plugin = (SparklePlugin) model.GetValue (iter, 2); if (plugin.Address != null) { address_entry.Sensitive = false;} if (plugin.Path != null) path_entry.Sensitive = false; // TODO: Scroll to the selection return true; } else { return false; } })); address_entry.Changed += delegate { Controller.CheckAddPage (address_entry.Text, path_entry.Text, tree.SelectedRow); }; layout_address.PackStart (new Label () { Markup = "<b>" + _("Address:") + "</b>", Xalign = 0 }, true, true, 0); layout_address.PackStart (address_entry, false, false, 0); layout_address.PackStart (address_example, false, false, 0); path_entry.Changed += delegate { Controller.CheckAddPage (address_entry.Text, path_entry.Text, tree.SelectedRow); }; layout_path.PackStart (new Label () { Markup = "<b>" + _("Remote Path:") + "</b>", Xalign = 0 }, true, true, 0); layout_path.PackStart (path_entry, false, false, 0); layout_path.PackStart (path_example, false, false, 0); layout_fields.PackStart (layout_address); layout_fields.PackStart (layout_path); layout_vertical.PackStart (new Label (""), false, false, 0); layout_vertical.PackStart (scrolled_window, true, true, 0); layout_vertical.PackStart (layout_fields, false, false, 0); Add (layout_vertical); // Cancel button Button cancel_button = new Button (_("Cancel")); cancel_button.Clicked += delegate { Controller.PageCancelled (); }; Button add_button = new Button (_("Add")) { Sensitive = false }; add_button.Clicked += delegate { string server = address_entry.Text; string folder_name = path_entry.Text; Controller.AddPageCompleted (server, folder_name); }; Controller.UpdateAddProjectButtonEvent += delegate (bool button_enabled) { Application.Invoke (delegate { add_button.Sensitive = button_enabled; }); }; CheckButton check_button = new CheckButton ("Fetch prior history") { Active = false }; check_button.Toggled += delegate { Controller.HistoryItemChanged (check_button.Active); }; AddOption (check_button); AddButton (cancel_button); AddButton (add_button); Controller.CheckAddPage (address_entry.Text, path_entry.Text, 1); break; } case PageType.Invite: { Header = _("You've received an invite!"); Description = _("Do you want to add this project to SparkleShare?"); Table table = new Table (2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label address_label = new Label (_("Address:")) { Xalign = 1 }; Label path_label = new Label (_("Remote Path:")) { Xalign = 1 }; Label address_value = new Label ("<b>" + Controller.PendingInvite.Address + "</b>") { UseMarkup = true, Xalign = 0 }; Label path_value = new Label ("<b>" + Controller.PendingInvite.RemotePath + "</b>") { UseMarkup = true, Xalign = 0 }; table.Attach (address_label, 0, 1, 0, 1); table.Attach (address_value, 1, 2, 0, 1); table.Attach (path_label, 0, 1, 1, 2); table.Attach (path_value, 1, 2, 1, 2); VBox wrapper = new VBox (false, 9); wrapper.PackStart (table, true, false, 0); Button cancel_button = new Button (_("Cancel")); cancel_button.Clicked += delegate { Controller.PageCancelled (); }; Button add_button = new Button (_("Add")); add_button.Clicked += delegate { Controller.InvitePageCompleted (); }; AddButton (cancel_button); AddButton (add_button); Add (wrapper); break; } case PageType.Syncing: { Header = String.Format (_("Adding project ‘{0}’…"), Controller.SyncingFolder); Description = _("This may either take a short or a long time depending on the project's size."); this.progress_bar.Fraction = Controller.ProgressBarPercentage / 100; Button finish_button = new Button () { Sensitive = false, Label = _("Finish") }; Button cancel_button = new Button () { Label = _("Cancel") }; cancel_button.Clicked += delegate { Controller.SyncingCancelled (); }; AddButton (cancel_button); AddButton (finish_button); Controller.UpdateProgressBarEvent += delegate (double percentage) { Application.Invoke (delegate { this.progress_bar.Fraction = percentage / 100; }); }; if (this.progress_bar.Parent != null) (this.progress_bar.Parent as Container).Remove (this.progress_bar); VBox bar_wrapper = new VBox (false, 0); bar_wrapper.PackStart (this.progress_bar, false, false, 15); Add (bar_wrapper); break; } case PageType.Error: { Header = _("Oops! Something went wrong") + "…"; VBox points = new VBox (false, 0); Image list_point_one = new Image (SparkleUIHelpers.GetIcon ("go-next", 16)); Image list_point_two = new Image (SparkleUIHelpers.GetIcon ("go-next", 16)); Image list_point_three = new Image (SparkleUIHelpers.GetIcon ("go-next", 16)); Label label_one = new Label () { Markup = "<b>" + Controller.PreviousUrl + "</b> is the address we've compiled. " + "Does this look alright?", Wrap = true, Xalign = 0 }; Label label_two = new Label () { Text = "Do you have access rights to this remote project?", Wrap = true, Xalign = 0 }; points.PackStart (new Label ("Please check the following:") { Xalign = 0 }, false, false, 6); HBox point_one = new HBox (false, 0); point_one.PackStart (list_point_one, false, false, 0); point_one.PackStart (label_one, true, true, 12); points.PackStart (point_one, false, false, 12); HBox point_two = new HBox (false, 0); point_two.PackStart (list_point_two, false, false, 0); point_two.PackStart (label_two, true, true, 12); points.PackStart (point_two, false, false, 12); if (warnings.Length > 0) { string warnings_markup = ""; foreach (string warning in warnings) warnings_markup += "\n<b>" + warning + "</b>"; Label label_three = new Label () { Markup = "Here's the raw error message:" + warnings_markup, Wrap = true, Xalign = 0 }; HBox point_three = new HBox (false, 0); point_three.PackStart (list_point_three, false, false, 0); point_three.PackStart (label_three, true, true, 12); points.PackStart (point_three, false, false, 12); } points.PackStart (new Label (""), true, true, 0); Button cancel_button = new Button (_("Cancel")); cancel_button.Clicked += delegate { Controller.PageCancelled (); }; Button try_again_button = new Button (_("Try Again…")) { Sensitive = true }; try_again_button.Clicked += delegate { Controller.ErrorPageCompleted (); }; AddButton (cancel_button); AddButton (try_again_button); Add (points); break; } case PageType.CryptoSetup: { Header = "Set up file encryption"; Description = "This project is supposed to be encrypted, but it doesn't yet have a password set. Please provide one below."; Label password_label = new Label ("<b>" + _("Password:"******"</b>") { UseMarkup = true, Xalign = 1 }; Entry password_entry = new Entry () { Xalign = 0, Visibility = false, ActivatesDefault = true }; CheckButton show_password_check_button = new CheckButton ("Show password") { Active = false, Xalign = 0, }; show_password_check_button.Toggled += delegate { password_entry.Visibility = !password_entry.Visibility; }; password_entry.Changed += delegate { Controller.CheckCryptoSetupPage (password_entry.Text); }; Button continue_button = new Button ("Continue") { Sensitive = false }; continue_button.Clicked += delegate { Controller.CryptoSetupPageCompleted (password_entry.Text); }; Button cancel_button = new Button ("Cancel"); cancel_button.Clicked += delegate { Controller.CryptoPageCancelled (); }; Controller.UpdateCryptoSetupContinueButtonEvent += delegate (bool button_enabled) { Application.Invoke (delegate { continue_button.Sensitive = button_enabled; }); }; Table table = new Table (2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; table.Attach (password_label, 0, 1, 0, 1); table.Attach (password_entry, 1, 2, 0, 1); table.Attach (show_password_check_button, 1, 2, 1, 2); VBox wrapper = new VBox (false, 9); wrapper.PackStart (table, true, false, 0); Image warning_image = new Image ( SparkleUIHelpers.GetIcon ("dialog-information", 24) ); Label warning_label = new Label () { Xalign = 0, Wrap = true, Text = "This password can't be changed later, and your files can't be recovered if it's forgotten." }; HBox warning_layout = new HBox (false, 0); warning_layout.PackStart (warning_image, false, false, 15); warning_layout.PackStart (warning_label, true, true, 0); VBox warning_wrapper = new VBox (false, 0); warning_wrapper.PackStart (warning_layout, false, false, 15); wrapper.PackStart (warning_wrapper, false, false, 0); Add (wrapper); AddButton (cancel_button); AddButton (continue_button); break; } case PageType.CryptoPassword: { Header = "This project contains encrypted files"; Description = "Please enter the password to see their contents."; Label password_label = new Label ("<b>" + _("Password:"******"</b>") { UseMarkup = true, Xalign = 1 }; Entry password_entry = new Entry () { Xalign = 0, Visibility = false, ActivatesDefault = true }; CheckButton show_password_check_button = new CheckButton ("Show password") { Active = false, Xalign = 0 }; show_password_check_button.Toggled += delegate { password_entry.Visibility = !password_entry.Visibility; }; password_entry.Changed += delegate { Controller.CheckCryptoPasswordPage (password_entry.Text); }; Button continue_button = new Button ("Continue") { Sensitive = false }; continue_button.Clicked += delegate { Controller.CryptoPasswordPageCompleted (password_entry.Text); }; Button cancel_button = new Button ("Cancel"); cancel_button.Clicked += delegate { Controller.CryptoPageCancelled (); }; Controller.UpdateCryptoPasswordContinueButtonEvent += delegate (bool button_enabled) { Application.Invoke (delegate { continue_button.Sensitive = button_enabled; }); }; Table table = new Table (2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; table.Attach (password_label, 0, 1, 0, 1); table.Attach (password_entry, 1, 2, 0, 1); table.Attach (show_password_check_button, 1, 2, 1, 2); VBox wrapper = new VBox (false, 9); wrapper.PackStart (table, true, false, 0); Add (wrapper); AddButton (cancel_button); AddButton (continue_button); break; } case PageType.Finished: { UrgencyHint = true; if (!HasToplevelFocus) { string title = _("Your shared project is ready!"); string subtext = _("You can find the files in your SparkleShare folder."); SparkleUI.Bubbles.Controller.ShowBubble (title, subtext, null); } Header = _("Your shared project is ready!"); Description = _("You can find it in your SparkleShare folder"); // A button that opens the synced folder Button open_folder_button = new Button (string.Format ("Open {0}", System.IO.Path.GetFileName (Controller.PreviousPath))); open_folder_button.Clicked += delegate { Controller.OpenFolderClicked (); }; Button finish_button = new Button (_("Finish")); finish_button.Clicked += delegate { Controller.FinishPageCompleted (); }; if (warnings.Length > 0) { Image warning_image = new Image ( SparkleUIHelpers.GetIcon ("dialog-information", 24) ); Label warning_label = new Label (warnings [0]) { Xalign = 0, Wrap = true }; HBox warning_layout = new HBox (false, 0); warning_layout.PackStart (warning_image, false, false, 15); warning_layout.PackStart (warning_label, true, true, 0); VBox warning_wrapper = new VBox (false, 0); warning_wrapper.PackStart (warning_layout, false, false, 0); Add (warning_wrapper); } else { Add (null); } AddButton (open_folder_button); AddButton (finish_button); break; } case PageType.Tutorial: { switch (Controller.TutorialPageNumber) { case 1: { Header = _("What's happening next?"); Description = "SparkleShare creates a special folder on your computer " + "that will keep track of your projects."; Button skip_tutorial_button = new Button (_("Skip Tutorial")); skip_tutorial_button.Clicked += delegate { Controller.TutorialSkipped (); }; Button continue_button = new Button (_("Continue")); continue_button.Clicked += delegate { Controller.TutorialPageCompleted (); }; Image slide = SparkleUIHelpers.GetImage ("tutorial-slide-1.png"); Add (slide); AddButton (skip_tutorial_button); AddButton (continue_button); break; } case 2: { Header = _("Sharing files with others"); Description = _("All files added to your project folders are synced automatically with " + "the host and your team members."); Button continue_button = new Button (_("Continue")); continue_button.Clicked += delegate { Controller.TutorialPageCompleted (); }; Image slide = SparkleUIHelpers.GetImage ("tutorial-slide-2.png"); Add (slide); AddButton (continue_button); break; } case 3: { Header = _("The status icon is here to help"); Description = _("It shows the syncing progress, provides easy access to " + "your projects and let's you view recent changes."); Button continue_button = new Button (_("Continue")); continue_button.Clicked += delegate { Controller.TutorialPageCompleted (); }; Image slide = SparkleUIHelpers.GetImage ("tutorial-slide-3.png"); Add (slide); AddButton (continue_button); break; } case 4: { Header = _("Adding projects to SparkleShare"); Description = _("You can do this through the status icon menu, or by clicking " + "magic buttons on webpages that look like this:"); Image slide = SparkleUIHelpers.GetImage ("tutorial-slide-4.png"); Button finish_button = new Button (_("Finish")); finish_button.Clicked += delegate { Controller.TutorialPageCompleted (); }; CheckButton check_button = new CheckButton ("Add SparkleShare to startup items") { Active = true }; check_button.Toggled += delegate { Controller.StartupItemChanged (check_button.Active); }; Add (slide); AddOption (check_button); AddButton (finish_button); break; } } break; } } ShowAll (); }); }; }
public void ShowPage(PageType type, string [] warnings) { if (type == PageType.Setup) { Header = "Welcome to SparkleShare!"; Description = "First off, what’s your name and email?\n(visible only to team members)"; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label name_label = new Label("<b>" + "Your Name:" + "</b>") { UseMarkup = true, Xalign = 1 }; Entry name_entry = new Entry() { Xalign = 0, ActivatesDefault = true }; try { UnixUserInfo user_info = UnixUserInfo.GetRealUser(); if (user_info != null && user_info.RealName != null) { // Some systems append a series of "," for some reason, TODO: Report upstream name_entry.Text = user_info.RealName.TrimEnd(",".ToCharArray()); } } catch (ArgumentException) { // No username, not a big deal } Entry email_entry = new Entry() { Xalign = 0, ActivatesDefault = true }; Label email_label = new Label("<b>" + "Email:" + "</b>") { UseMarkup = true, Xalign = 1 }; table.Attach(name_label, 0, 1, 0, 1); table.Attach(name_entry, 1, 2, 0, 1); table.Attach(email_label, 0, 1, 1, 2); table.Attach(email_entry, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Button cancel_button = new Button("Cancel"); Button continue_button = new Button("Continue") { Sensitive = false }; Controller.UpdateSetupContinueButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { continue_button.Sensitive = button_enabled; }); }; name_entry.Changed += delegate { Controller.CheckSetupPage(name_entry.Text, email_entry.Text); }; email_entry.Changed += delegate { Controller.CheckSetupPage(name_entry.Text, email_entry.Text); }; cancel_button.Clicked += delegate { Controller.SetupPageCancelled(); }; continue_button.Clicked += delegate { Controller.SetupPageCompleted(name_entry.Text, email_entry.Text); }; AddButton(cancel_button); AddButton(continue_button); Add(wrapper); Controller.CheckSetupPage(name_entry.Text, email_entry.Text); if (name_entry.Text.Equals("")) { name_entry.GrabFocus(); } else { email_entry.GrabFocus(); } } if (type == PageType.Add) { Header = "Where’s your project hosted?"; VBox layout_vertical = new VBox(false, 16); HBox layout_fields = new HBox(true, 32); VBox layout_address = new VBox(true, 0); VBox layout_path = new VBox(true, 0); ListStore store = new ListStore(typeof(string), typeof(Gdk.Pixbuf), typeof(string), typeof(Preset)); SparkleTreeView tree_view = new SparkleTreeView(store) { HeadersVisible = false, SearchColumn = -1, EnableSearch = false }; ScrolledWindow scrolled_window = new ScrolledWindow() { ShadowType = ShadowType.In }; scrolled_window.SetPolicy(PolicyType.Never, PolicyType.Automatic); // Padding column tree_view.AppendColumn("Padding", new Gtk.CellRendererText(), "text", 0); tree_view.Columns [0].Cells [0].Xpad = 4; // Icon column tree_view.AppendColumn("Icon", new Gtk.CellRendererPixbuf(), "pixbuf", 1); tree_view.Columns [1].Cells [0].Xpad = 4; // Service column TreeViewColumn service_column = new TreeViewColumn() { Title = "Service" }; CellRendererText service_cell = new CellRendererText() { Ypad = 8 }; service_column.PackStart(service_cell, true); service_column.SetCellDataFunc(service_cell, new TreeCellDataFunc(RenderServiceColumn)); foreach (Preset preset in Controller.Presets) { store.AppendValues("", new Gdk.Pixbuf(preset.ImagePath), "<span size=\"small\"><b>" + preset.Name + "</b>\n" + "<span fgcolor=\"" + SparkleShare.UI.SecondaryTextColor + "\">" + preset.Description + "</span>" + "</span>", preset); } tree_view.AppendColumn(service_column); scrolled_window.Add(tree_view); Entry address_entry = new Entry() { Text = Controller.PreviousAddress, Sensitive = (Controller.SelectedPreset.Address == null), ActivatesDefault = true }; Entry path_entry = new Entry() { Text = Controller.PreviousPath, Sensitive = (Controller.SelectedPreset.Path == null), ActivatesDefault = true }; tree_view.ButtonReleaseEvent += delegate { path_entry.GrabFocus(); }; Label address_example = new Label() { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + SparkleShare.UI.SecondaryTextColor + "\">" + Controller.SelectedPreset.AddressExample + "</span>" }; Label path_example = new Label() { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + SparkleShare.UI.SecondaryTextColor + "\">" + Controller.SelectedPreset.PathExample + "</span>" }; TreeSelection default_selection = tree_view.Selection; TreePath default_path = new TreePath("" + Controller.SelectedPresetIndex); default_selection.SelectPath(default_path); tree_view.Model.Foreach(new TreeModelForeachFunc( delegate(ITreeModel model, TreePath path, TreeIter iter) { string address; try { address = (model.GetValue(iter, 2) as Preset).Address; } catch (NullReferenceException) { address = ""; } if (!string.IsNullOrEmpty(address) && address.Equals(Controller.PreviousAddress)) { tree_view.SetCursor(path, service_column, false); Preset preset = (Preset)model.GetValue(iter, 2); if (preset.Address != null) { address_entry.Sensitive = false; } if (preset.Path != null) { path_entry.Sensitive = false; } return(true); } else { return(false); } } )); layout_address.PackStart(new Label() { Markup = "<b>" + "Address" + "</b>", Xalign = 0 }, true, true, 0); layout_address.PackStart(address_entry, false, false, 0); layout_address.PackStart(address_example, false, false, 0); path_entry.Changed += delegate { Controller.CheckAddPage(address_entry.Text, path_entry.Text, tree_view.SelectedRow); }; layout_path.PackStart(new Label() { Markup = "<b>" + "Remote Path" + "</b>", Xalign = 0 }, true, true, 0); layout_path.PackStart(path_entry, false, false, 0); layout_path.PackStart(path_example, false, false, 0); layout_fields.PackStart(layout_address, true, true, 0); layout_fields.PackStart(layout_path, true, true, 0); layout_vertical.PackStart(scrolled_window, true, true, 0); layout_vertical.PackStart(layout_fields, false, false, 0); tree_view.ScrollToCell(new TreePath("" + Controller.SelectedPresetIndex), null, true, 0, 0); Add(layout_vertical); if (string.IsNullOrEmpty(path_entry.Text)) { address_entry.GrabFocus(); address_entry.Position = -1; } else { path_entry.GrabFocus(); path_entry.Position = -1; } Button cancel_button = new Button("Cancel"); Button add_button = new Button("Add") { Sensitive = false }; Controller.ChangeAddressFieldEvent += delegate(string text, string example_text, FieldState state) { Application.Invoke(delegate { address_entry.Text = text; address_entry.Sensitive = (state == FieldState.Enabled); address_example.Markup = "<span size=\"small\" fgcolor=\"" + SparkleShare.UI.SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.ChangePathFieldEvent += delegate(string text, string example_text, FieldState state) { Application.Invoke(delegate { path_entry.Text = text; path_entry.Sensitive = (state == FieldState.Enabled); path_example.Markup = "<span size=\"small\" fgcolor=\"" + SparkleShare.UI.SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.UpdateAddProjectButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { add_button.Sensitive = button_enabled; }); }; tree_view.CursorChanged += delegate(object sender, EventArgs e) { Controller.SelectedPresetChanged(tree_view.SelectedRow); }; address_entry.Changed += delegate { Controller.CheckAddPage(address_entry.Text, path_entry.Text, tree_view.SelectedRow); }; cancel_button.Clicked += delegate { Controller.PageCancelled(); }; add_button.Clicked += delegate { Controller.AddPageCompleted(address_entry.Text, path_entry.Text); }; CheckButton check_button = new CheckButton("Fetch prior revisions") { Active = false }; check_button.Toggled += delegate { Controller.HistoryItemChanged(check_button.Active); }; AddOption(check_button); AddButton(cancel_button); AddButton(add_button); Controller.HistoryItemChanged(check_button.Active); Controller.CheckAddPage(address_entry.Text, path_entry.Text, 1); } if (type == PageType.Invite) { Header = "You’ve received an invite!"; Description = "Do you want to add this project to SparkleShare?"; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label address_label = new Label("Address:") { Xalign = 1 }; Label path_label = new Label("Remote Path:") { Xalign = 1 }; Label address_value = new Label("<b>" + Controller.PendingInvite.Address + "</b>") { UseMarkup = true, Xalign = 0 }; Label path_value = new Label("<b>" + Controller.PendingInvite.RemotePath + "</b>") { UseMarkup = true, Xalign = 0 }; table.Attach(address_label, 0, 1, 0, 1); table.Attach(address_value, 1, 2, 0, 1); table.Attach(path_label, 0, 1, 1, 2); table.Attach(path_value, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Button cancel_button = new Button("Cancel"); Button add_button = new Button("Add"); cancel_button.Clicked += delegate { Controller.PageCancelled(); }; add_button.Clicked += delegate { Controller.InvitePageCompleted(); }; AddButton(cancel_button); AddButton(add_button); Add(wrapper); } if (type == PageType.Syncing) { Header = String.Format("Adding project ‘{0}’…", Controller.SyncingFolder); Description = "This may take a while for large projects.\nIsn’t it coffee-o’clock?"; ProgressBar progress_bar = new ProgressBar(); progress_bar.Fraction = Controller.ProgressBarPercentage / 100; Button cancel_button = new Button() { Label = "Cancel" }; Button finish_button = new Button("Finish") { Sensitive = false }; Label progress_label = new Label("Preparing to fetch files…") { Justify = Justification.Right, Xalign = 1 }; Controller.UpdateProgressBarEvent += delegate(double percentage, string speed) { Application.Invoke(delegate { progress_bar.Fraction = percentage / 100; progress_label.Text = speed; }); }; cancel_button.Clicked += delegate { Controller.SyncingCancelled(); }; VBox bar_wrapper = new VBox(false, 0); bar_wrapper.PackStart(progress_bar, false, false, 21); bar_wrapper.PackStart(progress_label, false, true, 0); Add(bar_wrapper); AddButton(cancel_button); AddButton(finish_button); } if (type == PageType.Error) { Header = "Oops! Something went wrong" + "…"; VBox points = new VBox(false, 0); Image list_point_one = new Image(UserInterfaceHelpers.GetIcon("list-point", 16)); Image list_point_two = new Image(UserInterfaceHelpers.GetIcon("list-point", 16)); Image list_point_three = new Image(UserInterfaceHelpers.GetIcon("list-point", 16)); Label label_one = new Label() { Markup = "<b>" + Controller.PreviousUrl + "</b> is the address we’ve compiled. " + "Does this look alright?", Wrap = true, Xalign = 0 }; Label label_two = new Label() { Text = "Is this computer’s Client ID known by the host?", Wrap = true, Xalign = 0 }; points.PackStart(new Label("Please check the following:") { Xalign = 0 }, false, false, 6); HBox point_one = new HBox(false, 0); point_one.PackStart(list_point_one, false, false, 0); point_one.PackStart(label_one, true, true, 12); points.PackStart(point_one, false, false, 12); HBox point_two = new HBox(false, 0); point_two.PackStart(list_point_two, false, false, 0); point_two.PackStart(label_two, true, true, 12); points.PackStart(point_two, false, false, 12); if (warnings.Length > 0) { string warnings_markup = ""; foreach (string warning in warnings) { warnings_markup += "\n<b>" + warning + "</b>"; } Label label_three = new Label() { Markup = "Here’s the raw error message:" + warnings_markup, Wrap = true, Xalign = 0 }; HBox point_three = new HBox(false, 0); point_three.PackStart(list_point_three, false, false, 0); point_three.PackStart(label_three, true, true, 12); points.PackStart(point_three, false, false, 12); } points.PackStart(new Label(""), true, true, 0); Button cancel_button = new Button("Cancel"); Button try_again_button = new Button("Retry") { Sensitive = true }; cancel_button.Clicked += delegate { Controller.PageCancelled(); }; try_again_button.Clicked += delegate { Controller.ErrorPageCompleted(); }; AddButton(cancel_button); AddButton(try_again_button); Add(points); } if (type == PageType.StorageSetup) { Header = string.Format("Storage type for ‘{0}’", Controller.SyncingFolder); Description = "What type of storage would you like to use?"; VBox layout_vertical = new VBox(false, 0); VBox layout_radio_buttons = new VBox(false, 0) { BorderWidth = 12 }; foreach (StorageTypeInfo storage_type in SparkleShare.Controller.FetcherAvailableStorageTypes) { RadioButton radio_button = new RadioButton(null, storage_type.Name + "\n" + storage_type.Description); (radio_button.Child as Label).Markup = string.Format( "<b>{0}</b>\n<span fgcolor=\"{1}\">{2}</span>", storage_type.Name, SparkleShare.UI.SecondaryTextColor, storage_type.Description); (radio_button.Child as Label).Xpad = 9; layout_radio_buttons.PackStart(radio_button, false, false, 9); radio_button.Group = (layout_radio_buttons.Children [0] as RadioButton).Group; } layout_vertical.PackStart(new Label(""), true, true, 0); layout_vertical.PackStart(layout_radio_buttons, false, false, 0); layout_vertical.PackStart(new Label(""), true, true, 0); Add(layout_vertical); Button cancel_button = new Button("Cancel"); Button continue_button = new Button("Continue"); continue_button.Clicked += delegate { int checkbox_index = 0; foreach (RadioButton radio_button in layout_radio_buttons.Children) { if (radio_button.Active) { StorageTypeInfo selected_storage_type = SparkleShare.Controller.FetcherAvailableStorageTypes [checkbox_index]; Controller.StoragePageCompleted(selected_storage_type.Type); return; } checkbox_index++; } }; cancel_button.Clicked += delegate { Controller.SyncingCancelled(); }; AddButton(cancel_button); AddButton(continue_button); } if (type == PageType.CryptoSetup || type == PageType.CryptoPassword) { if (type == PageType.CryptoSetup) { Header = string.Format("Encryption password for ‘{0}’", Controller.SyncingFolder); Description = "Please a provide a strong password that you don’t use elsewhere."; } else { Header = string.Format("‘{0}’ contains encrypted files", Controller.SyncingFolder); Description = "Please enter the password to see their contents."; } Label password_label = new Label("<b>" + "Password" + "</b>") { UseMarkup = true, Xalign = 1 }; Entry password_entry = new Entry() { Xalign = 0, Visibility = false, ActivatesDefault = true }; CheckButton show_password_check_button = new CheckButton("Make visible") { Active = false, Xalign = 0, }; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; table.Attach(password_label, 0, 1, 0, 1); table.Attach(password_entry, 1, 2, 0, 1); table.Attach(show_password_check_button, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Image warning_image = new Image( UserInterfaceHelpers.GetIcon("dialog-information", 24)); Label warning_label = new Label() { Xalign = 0, Wrap = true, Text = "This password can’t be changed later, and your files can’t be recovered if it’s forgotten." }; HBox warning_layout = new HBox(false, 0); warning_layout.PackStart(warning_image, false, false, 15); warning_layout.PackStart(warning_label, true, true, 0); VBox warning_wrapper = new VBox(false, 0); warning_wrapper.PackStart(warning_layout, false, false, 15); if (type == PageType.CryptoSetup) { wrapper.PackStart(warning_wrapper, false, false, 0); } Button cancel_button = new Button("Cancel"); Button continue_button = new Button("Continue") { Sensitive = false }; Controller.UpdateCryptoSetupContinueButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { continue_button.Sensitive = button_enabled; }); }; Controller.UpdateCryptoPasswordContinueButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { continue_button.Sensitive = button_enabled; }); }; show_password_check_button.Toggled += delegate { password_entry.Visibility = !password_entry.Visibility; }; password_entry.Changed += delegate { if (type == PageType.CryptoSetup) { Controller.CheckCryptoSetupPage(password_entry.Text); } else { Controller.CheckCryptoPasswordPage(password_entry.Text); } }; cancel_button.Clicked += delegate { Controller.CryptoPageCancelled(); }; continue_button.Clicked += delegate { if (type == PageType.CryptoSetup) { Controller.CryptoSetupPageCompleted(password_entry.Text); } else { Controller.CryptoPasswordPageCompleted(password_entry.Text); } }; Add(wrapper); AddButton(cancel_button); AddButton(continue_button); password_entry.GrabFocus(); } if (type == PageType.Finished) { Header = "Your shared project is ready!"; Description = "You can find the files in your SparkleShare folder."; UrgencyHint = true; Button show_files_button = new Button("Show Files"); Button finish_button = new Button("Finish"); show_files_button.Clicked += delegate { Controller.ShowFilesClicked(); }; finish_button.Clicked += delegate { Controller.FinishPageCompleted(); }; if (warnings.Length > 0) { Image warning_image = new Image(UserInterfaceHelpers.GetIcon("dialog-information", 24)); Label warning_label = new Label(warnings [0]) { Xalign = 0, Wrap = true }; HBox warning_layout = new HBox(false, 0); warning_layout.PackStart(warning_image, false, false, 15); warning_layout.PackStart(warning_label, true, true, 0); VBox warning_wrapper = new VBox(false, 0); warning_wrapper.PackStart(warning_layout, false, false, 0); Add(warning_wrapper); } else { Add(null); } AddButton(show_files_button); AddButton(finish_button); } }
public SparkleSetup() : base() { Controller.HideWindowEvent += delegate { Application.Invoke(delegate { HideAll(); }); }; Controller.ShowWindowEvent += delegate { Application.Invoke(delegate { ShowAll(); Present(); }); }; Controller.ChangePageEvent += delegate(PageType type, string [] warnings) { Application.Invoke(delegate { Reset(); switch (type) { case PageType.Setup: { Header = "Welcome to SparkleShare!"; Description = "First off, what's your name and email?\nThis information is only visible to team members."; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label name_label = new Label("<b>" + "Full Name:" + "</b>") { UseMarkup = true, Xalign = 1 }; Entry name_entry = new Entry() { Xalign = 0, ActivatesDefault = true }; UnixUserInfo user_info = UnixUserInfo.GetRealUser(); if (user_info != null && user_info.RealName != null) { name_entry.Text = user_info.RealName.TrimEnd(",".ToCharArray()); } Entry email_entry = new Entry() { Xalign = 0, ActivatesDefault = true }; name_entry.Changed += delegate { Controller.CheckSetupPage(name_entry.Text, email_entry.Text); }; email_entry.Changed += delegate { Controller.CheckSetupPage(name_entry.Text, email_entry.Text); }; Label email_label = new Label("<b>" + "Email:" + "</b>") { UseMarkup = true, Xalign = 1 }; table.Attach(name_label, 0, 1, 0, 1); table.Attach(name_entry, 1, 2, 0, 1); table.Attach(email_label, 0, 1, 1, 2); table.Attach(email_entry, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Button cancel_button = new Button("Cancel"); cancel_button.Clicked += delegate { Controller.SetupPageCancelled(); }; Button continue_button = new Button("Continue") { Sensitive = false }; continue_button.Clicked += delegate { Controller.SetupPageCompleted(name_entry.Text, email_entry.Text); }; AddButton(cancel_button); AddButton(continue_button); Add(wrapper); Controller.UpdateSetupContinueButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { continue_button.Sensitive = button_enabled; }); }; Controller.CheckSetupPage(name_entry.Text, email_entry.Text); break; } case PageType.Add: { Header = "Where's your project hosted?"; VBox layout_vertical = new VBox(false, 12); HBox layout_fields = new HBox(true, 12); VBox layout_address = new VBox(true, 0); VBox layout_path = new VBox(true, 0); ListStore store = new ListStore(typeof(Gdk.Pixbuf), typeof(string), typeof(SparklePlugin)); SparkleTreeView tree = new SparkleTreeView(store) { HeadersVisible = false }; ScrolledWindow scrolled_window = new ScrolledWindow(); scrolled_window.AddWithViewport(tree); // Icon column tree.AppendColumn("Icon", new Gtk.CellRendererPixbuf(), "pixbuf", 0); tree.Columns [0].Cells [0].Xpad = 6; // Service column TreeViewColumn service_column = new TreeViewColumn() { Title = "Service" }; CellRendererText service_cell = new CellRendererText() { Ypad = 4 }; service_column.PackStart(service_cell, true); service_column.SetCellDataFunc(service_cell, new TreeCellDataFunc(RenderServiceColumn)); foreach (SparklePlugin plugin in Controller.Plugins) { store.AppendValues( new Gdk.Pixbuf(plugin.ImagePath), "<span size=\"small\"><b>" + plugin.Name + "</b>\n" + "<span fgcolor=\"" + SecondaryTextColorSelected + "\">" + plugin.Description + "</span>" + "</span>", plugin); } tree.AppendColumn(service_column); Entry address_entry = new Entry() { Text = Controller.PreviousAddress, Sensitive = (Controller.SelectedPlugin.Address == null), ActivatesDefault = true }; Entry path_entry = new Entry() { Text = Controller.PreviousPath, Sensitive = (Controller.SelectedPlugin.Path == null), ActivatesDefault = true }; Label address_example = new Label() { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + Controller.SelectedPlugin.AddressExample + "</span>" }; Label path_example = new Label() { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + Controller.SelectedPlugin.PathExample + "</span>" }; // Select the first plugin by default TreeSelection default_selection = tree.Selection; TreePath default_path = new TreePath("0"); default_selection.SelectPath(default_path); Controller.SelectedPluginChanged(0); Controller.ChangeAddressFieldEvent += delegate(string text, string example_text, FieldState state) { Application.Invoke(delegate { address_entry.Text = text; address_entry.Sensitive = (state == FieldState.Enabled); address_example.Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.ChangePathFieldEvent += delegate(string text, string example_text, FieldState state) { Application.Invoke(delegate { path_entry.Text = text; path_entry.Sensitive = (state == FieldState.Enabled); path_example.Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.CheckAddPage(address_entry.Text, path_entry.Text, 1); // Update the address field text when the selection changes tree.CursorChanged += delegate(object sender, EventArgs e) { Controller.SelectedPluginChanged(tree.SelectedRow); // TODO: Scroll to selected row when using arrow keys }; tree.Model.Foreach(new TreeModelForeachFunc(delegate(TreeModel model, TreePath path, TreeIter iter) { string address; try { address = (model.GetValue(iter, 2) as SparklePlugin).Address; } catch (NullReferenceException) { address = ""; } if (!string.IsNullOrEmpty(address) && address.Equals(Controller.PreviousAddress)) { tree.SetCursor(path, service_column, false); SparklePlugin plugin = (SparklePlugin)model.GetValue(iter, 2); if (plugin.Address != null) { address_entry.Sensitive = false; } if (plugin.Path != null) { path_entry.Sensitive = false; } // TODO: Scroll to the selection return(true); } else { return(false); } })); address_entry.Changed += delegate { Controller.CheckAddPage(address_entry.Text, path_entry.Text, tree.SelectedRow); }; layout_address.PackStart(new Label() { Markup = "<b>" + "Address:" + "</b>", Xalign = 0 }, true, true, 0); layout_address.PackStart(address_entry, false, false, 0); layout_address.PackStart(address_example, false, false, 0); path_entry.Changed += delegate { Controller.CheckAddPage(address_entry.Text, path_entry.Text, tree.SelectedRow); }; layout_path.PackStart(new Label() { Markup = "<b>" + "Remote Path:" + "</b>", Xalign = 0 }, true, true, 0); layout_path.PackStart(path_entry, false, false, 0); layout_path.PackStart(path_example, false, false, 0); layout_fields.PackStart(layout_address); layout_fields.PackStart(layout_path); layout_vertical.PackStart(new Label(""), false, false, 0); layout_vertical.PackStart(scrolled_window, true, true, 0); layout_vertical.PackStart(layout_fields, false, false, 0); Add(layout_vertical); // Cancel button Button cancel_button = new Button("Cancel"); cancel_button.Clicked += delegate { Controller.PageCancelled(); }; Button add_button = new Button("Add") { Sensitive = false }; add_button.Clicked += delegate { Controller.AddPageCompleted(address_entry.Text, path_entry.Text); }; Controller.UpdateAddProjectButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { add_button.Sensitive = button_enabled; }); }; CheckButton check_button = new CheckButton("Fetch prior history") { Active = false }; check_button.Toggled += delegate { Controller.HistoryItemChanged(check_button.Active); }; AddOption(check_button); AddButton(cancel_button); AddButton(add_button); Controller.CheckAddPage(address_entry.Text, path_entry.Text, 1); break; } case PageType.Invite: { Header = "You've received an invite!"; Description = "Do you want to add this project to SparkleShare?"; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label address_label = new Label("Address:") { Xalign = 1 }; Label path_label = new Label("Remote Path:") { Xalign = 1 }; Label address_value = new Label("<b>" + Controller.PendingInvite.Address + "</b>") { UseMarkup = true, Xalign = 0 }; Label path_value = new Label("<b>" + Controller.PendingInvite.RemotePath + "</b>") { UseMarkup = true, Xalign = 0 }; table.Attach(address_label, 0, 1, 0, 1); table.Attach(address_value, 1, 2, 0, 1); table.Attach(path_label, 0, 1, 1, 2); table.Attach(path_value, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Button cancel_button = new Button("Cancel"); cancel_button.Clicked += delegate { Controller.PageCancelled(); }; Button add_button = new Button("Add"); add_button.Clicked += delegate { Controller.InvitePageCompleted(); }; AddButton(cancel_button); AddButton(add_button); Add(wrapper); break; } case PageType.Syncing: { Header = String.Format("Adding project ‘{0}’…", Controller.SyncingFolder); Description = "This may take a while for large projects.\nIsn't it coffee-o'clock?"; this.progress_bar.Fraction = Controller.ProgressBarPercentage / 100; Button finish_button = new Button() { Sensitive = false, Label = "Finish" }; Button cancel_button = new Button() { Label = "Cancel" }; cancel_button.Clicked += delegate { Controller.SyncingCancelled(); }; AddButton(cancel_button); AddButton(finish_button); Controller.UpdateProgressBarEvent += delegate(double percentage) { Application.Invoke(delegate { this.progress_bar.Fraction = percentage / 100; }); }; if (this.progress_bar.Parent != null) { (this.progress_bar.Parent as Container).Remove(this.progress_bar); } VBox bar_wrapper = new VBox(false, 0); bar_wrapper.PackStart(this.progress_bar, false, false, 15); Add(bar_wrapper); break; } case PageType.Error: { Header = "Oops! Something went wrong" + "…"; VBox points = new VBox(false, 0); Image list_point_one = new Image(SparkleUIHelpers.GetIcon("list-point", 16)); Image list_point_two = new Image(SparkleUIHelpers.GetIcon("list-point", 16)); Image list_point_three = new Image(SparkleUIHelpers.GetIcon("list-point", 16)); Label label_one = new Label() { Markup = "<b>" + Controller.PreviousUrl + "</b> is the address we've compiled. " + "Does this look alright?", Wrap = true, Xalign = 0 }; Label label_two = new Label() { Text = "Do you have access rights to this remote project?", Wrap = true, Xalign = 0 }; points.PackStart(new Label("Please check the following:") { Xalign = 0 }, false, false, 6); HBox point_one = new HBox(false, 0); point_one.PackStart(list_point_one, false, false, 0); point_one.PackStart(label_one, true, true, 12); points.PackStart(point_one, false, false, 12); HBox point_two = new HBox(false, 0); point_two.PackStart(list_point_two, false, false, 0); point_two.PackStart(label_two, true, true, 12); points.PackStart(point_two, false, false, 12); if (warnings.Length > 0) { string warnings_markup = ""; foreach (string warning in warnings) { warnings_markup += "\n<b>" + warning + "</b>"; } Label label_three = new Label() { Markup = "Here's the raw error message:" + warnings_markup, Wrap = true, Xalign = 0 }; HBox point_three = new HBox(false, 0); point_three.PackStart(list_point_three, false, false, 0); point_three.PackStart(label_three, true, true, 12); points.PackStart(point_three, false, false, 12); } points.PackStart(new Label(""), true, true, 0); Button cancel_button = new Button("Cancel"); cancel_button.Clicked += delegate { Controller.PageCancelled(); }; Button try_again_button = new Button("Try Again…") { Sensitive = true }; try_again_button.Clicked += delegate { Controller.ErrorPageCompleted(); }; AddButton(cancel_button); AddButton(try_again_button); Add(points); break; } case PageType.CryptoSetup: { Header = "Set up file encryption"; Description = "Please a provide a strong password that you don't use elsewhere below:"; Label password_label = new Label("<b>" + "Password:"******"</b>") { UseMarkup = true, Xalign = 1 }; Entry password_entry = new Entry() { Xalign = 0, Visibility = false, ActivatesDefault = true }; CheckButton show_password_check_button = new CheckButton("Show password") { Active = false, Xalign = 0, }; show_password_check_button.Toggled += delegate { password_entry.Visibility = !password_entry.Visibility; }; password_entry.Changed += delegate { Controller.CheckCryptoSetupPage(password_entry.Text); }; Button continue_button = new Button("Continue") { Sensitive = false }; continue_button.Clicked += delegate { Controller.CryptoSetupPageCompleted(password_entry.Text); }; Button cancel_button = new Button("Cancel"); cancel_button.Clicked += delegate { Controller.CryptoPageCancelled(); }; Controller.UpdateCryptoSetupContinueButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { continue_button.Sensitive = button_enabled; }); }; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; table.Attach(password_label, 0, 1, 0, 1); table.Attach(password_entry, 1, 2, 0, 1); table.Attach(show_password_check_button, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Image warning_image = new Image( SparkleUIHelpers.GetIcon("dialog-information", 24) ); Label warning_label = new Label() { Xalign = 0, Wrap = true, Text = "This password can't be changed later, and your files can't be recovered if it's forgotten." }; HBox warning_layout = new HBox(false, 0); warning_layout.PackStart(warning_image, false, false, 15); warning_layout.PackStart(warning_label, true, true, 0); VBox warning_wrapper = new VBox(false, 0); warning_wrapper.PackStart(warning_layout, false, false, 15); wrapper.PackStart(warning_wrapper, false, false, 0); Add(wrapper); AddButton(cancel_button); AddButton(continue_button); break; } case PageType.CryptoPassword: { Header = "This project contains encrypted files"; Description = "Please enter the password to see their contents."; Label password_label = new Label("<b>" + "Password:"******"</b>") { UseMarkup = true, Xalign = 1 }; Entry password_entry = new Entry() { Xalign = 0, Visibility = false, ActivatesDefault = true }; CheckButton show_password_check_button = new CheckButton("Show password") { Active = false, Xalign = 0 }; show_password_check_button.Toggled += delegate { password_entry.Visibility = !password_entry.Visibility; }; password_entry.Changed += delegate { Controller.CheckCryptoPasswordPage(password_entry.Text); }; Button continue_button = new Button("Continue") { Sensitive = false }; continue_button.Clicked += delegate { Controller.CryptoPasswordPageCompleted(password_entry.Text); }; Button cancel_button = new Button("Cancel"); cancel_button.Clicked += delegate { Controller.CryptoPageCancelled(); }; Controller.UpdateCryptoPasswordContinueButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { continue_button.Sensitive = button_enabled; }); }; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; table.Attach(password_label, 0, 1, 0, 1); table.Attach(password_entry, 1, 2, 0, 1); table.Attach(show_password_check_button, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Add(wrapper); AddButton(cancel_button); AddButton(continue_button); break; } case PageType.Finished: { UrgencyHint = true; if (!HasToplevelFocus) { string title = "Your shared project is ready!"; string subtext = "You can find the files in your SparkleShare folder."; Program.UI.Bubbles.Controller.ShowBubble(title, subtext, null); } Header = "Your shared project is ready!"; Description = "You can find it in your SparkleShare folder"; // A button that opens the synced folder Button show_files_button = new Button("Show Files…"); show_files_button.Clicked += delegate { Controller.ShowFilesClicked(); }; Button finish_button = new Button("Finish"); finish_button.Clicked += delegate { Controller.FinishPageCompleted(); }; if (warnings.Length > 0) { Image warning_image = new Image( SparkleUIHelpers.GetIcon("dialog-information", 24)); Label warning_label = new Label(warnings [0]) { Xalign = 0, Wrap = true }; HBox warning_layout = new HBox(false, 0); warning_layout.PackStart(warning_image, false, false, 15); warning_layout.PackStart(warning_label, true, true, 0); VBox warning_wrapper = new VBox(false, 0); warning_wrapper.PackStart(warning_layout, false, false, 0); Add(warning_wrapper); } else { Add(null); } AddButton(show_files_button); AddButton(finish_button); break; } case PageType.Tutorial: { switch (Controller.TutorialPageNumber) { case 1: { Header = "What's happening next?"; Description = "SparkleShare creates a special folder on your computer " + "that will keep track of your projects."; Button skip_tutorial_button = new Button("Skip Tutorial"); skip_tutorial_button.Clicked += delegate { Controller.TutorialSkipped(); }; Button continue_button = new Button("Continue"); continue_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; Image slide = SparkleUIHelpers.GetImage("tutorial-slide-1.png"); Add(slide); AddButton(skip_tutorial_button); AddButton(continue_button); break; } case 2: { Header = "Sharing files with others"; Description = "All files added to your project folders are synced automatically with " + "the host and your team members."; Button continue_button = new Button("Continue"); continue_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; Image slide = SparkleUIHelpers.GetImage("tutorial-slide-2.png"); Add(slide); AddButton(continue_button); break; } case 3: { Header = "The status icon helps you"; Description = "It shows the syncing progress, provides easy access to " + "your projects and let's you view recent changes."; Button continue_button = new Button("Continue"); continue_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; Image slide = SparkleUIHelpers.GetImage("tutorial-slide-3.png"); Add(slide); AddButton(continue_button); break; } case 4: { Header = "Here's your unique link code"; Description = "You'll need it whenever you want to link this computer to a host" + " (we keep a copy in your SparkleShare folder)."; Button finish_button = new Button("Finish"); VBox layout_vertical = new VBox(false, 0) { BorderWidth = 48 }; HBox layout_horizontal = new HBox(false, 6); Entry link_code_entry = new Entry() { Text = Program.Controller.CurrentUser.PublicKey, Sensitive = false }; Button copy_button = new Button(" Copy "); CheckButton check_button = new CheckButton("Add SparkleShare to startup items") { Active = true }; check_button.Toggled += delegate { Controller.StartupItemChanged(check_button.Active); }; copy_button.Clicked += delegate { Clipboard clip_board = Clipboard.Get(Gdk.Atom.Intern("CLIPBOARD", false)); clip_board.Text = link_code_entry.Text; }; finish_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; layout_horizontal.PackStart(link_code_entry, true, true, 0); layout_horizontal.PackStart(copy_button, false, false, 0); layout_vertical.PackStart(new Label(""), true, true, 0); layout_vertical.PackStart(layout_horizontal, false, false, 0); layout_vertical.PackStart(new Label(""), true, true, 18); Add(layout_vertical); AddOption(check_button); AddButton(finish_button); break; } } break; } } ShowAll(); }); }; }
public void ShowPage(PageType type, string [] warnings) { if (type == PageType.Setup) { Header = "Welcome to SparkleShare!"; Description = "First off, what's your name and email?\nThis information is only visible to team members."; Table table = new Table (2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label name_label = new Label ("<b>" + "Full Name:" + "</b>") { UseMarkup = true, Xalign = 1 }; Entry name_entry = new Entry () { Xalign = 0, ActivatesDefault = true }; UnixUserInfo user_info = UnixUserInfo.GetRealUser (); if (user_info != null && user_info.RealName != null) name_entry.Text = user_info.RealName.TrimEnd (",".ToCharArray ()); Entry email_entry = new Entry () { Xalign = 0, ActivatesDefault = true }; Label email_label = new Label ("<b>" + "Email:" + "</b>") { UseMarkup = true, Xalign = 1 }; table.Attach (name_label, 0, 1, 0, 1); table.Attach (name_entry, 1, 2, 0, 1); table.Attach (email_label, 0, 1, 1, 2); table.Attach (email_entry, 1, 2, 1, 2); VBox wrapper = new VBox (false, 9); wrapper.PackStart (table, true, false, 0); Button cancel_button = new Button ("Cancel"); Button continue_button = new Button ("Continue") { Sensitive = false }; Controller.UpdateSetupContinueButtonEvent += delegate (bool button_enabled) { Application.Invoke (delegate { continue_button.Sensitive = button_enabled; }); }; name_entry.Changed += delegate { Controller.CheckSetupPage (name_entry.Text, email_entry.Text); }; email_entry.Changed += delegate { Controller.CheckSetupPage (name_entry.Text, email_entry.Text); }; cancel_button.Clicked += delegate { Controller.SetupPageCancelled (); }; continue_button.Clicked += delegate { Controller.SetupPageCompleted (name_entry.Text, email_entry.Text); }; AddButton (cancel_button); AddButton (continue_button); Add (wrapper); Controller.CheckSetupPage (name_entry.Text, email_entry.Text); } if (type == PageType.Add) { Header = "Where's your project hosted?"; VBox layout_vertical = new VBox (false, 12); HBox layout_fields = new HBox (true, 12); VBox layout_address = new VBox (true, 0); VBox layout_path = new VBox (true, 0); ListStore store = new ListStore (typeof (Gdk.Pixbuf), typeof (string), typeof (SparklePlugin)); SparkleTreeView tree = new SparkleTreeView (store) { HeadersVisible = false }; ScrolledWindow scrolled_window = new ScrolledWindow (); scrolled_window.AddWithViewport (tree); // Icon column tree.AppendColumn ("Icon", new Gtk.CellRendererPixbuf (), "pixbuf", 0); tree.Columns [0].Cells [0].Xpad = 6; // Service column TreeViewColumn service_column = new TreeViewColumn () { Title = "Service" }; CellRendererText service_cell = new CellRendererText () { Ypad = 4 }; service_column.PackStart (service_cell, true); service_column.SetCellDataFunc (service_cell, new TreeCellDataFunc (RenderServiceColumn)); foreach (SparklePlugin plugin in Controller.Plugins) { store.AppendValues (new Gdk.Pixbuf (plugin.ImagePath), "<span size=\"small\"><b>" + plugin.Name + "</b>\n" + "<span fgcolor=\"" + SecondaryTextColorSelected + "\">" + plugin.Description + "</span>" + "</span>", plugin); } tree.AppendColumn (service_column); Entry address_entry = new Entry () { Text = Controller.PreviousAddress, Sensitive = (Controller.SelectedPlugin.Address == null), ActivatesDefault = true }; Entry path_entry = new Entry () { Text = Controller.PreviousPath, Sensitive = (Controller.SelectedPlugin.Path == null), ActivatesDefault = true }; Label address_example = new Label () { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + Controller.SelectedPlugin.AddressExample + "</span>" }; Label path_example = new Label () { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + Controller.SelectedPlugin.PathExample + "</span>" }; // Select the first plugin by default TreeSelection default_selection = tree.Selection; TreePath default_path = new TreePath ("0"); default_selection.SelectPath (default_path); Controller.SelectedPluginChanged (0); Controller.ChangeAddressFieldEvent += delegate (string text, string example_text, FieldState state) { Application.Invoke (delegate { address_entry.Text = text; address_entry.Sensitive = (state == FieldState.Enabled); address_example.Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.ChangePathFieldEvent += delegate (string text, string example_text, FieldState state) { Application.Invoke (delegate { path_entry.Text = text; path_entry.Sensitive = (state == FieldState.Enabled); path_example.Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.CheckAddPage (address_entry.Text, path_entry.Text, 1); // Update the address field text when the selection changes tree.CursorChanged += delegate (object sender, EventArgs e) { Controller.SelectedPluginChanged (tree.SelectedRow); // TODO: Scroll to selected row when using arrow keys }; tree.Model.Foreach (new TreeModelForeachFunc (delegate (TreeModel model, TreePath path, TreeIter iter) { string address; try { address = (model.GetValue (iter, 2) as SparklePlugin).Address; } catch (NullReferenceException) { address = ""; } if (!string.IsNullOrEmpty (address) && address.Equals (Controller.PreviousAddress)) { tree.SetCursor (path, service_column, false); SparklePlugin plugin = (SparklePlugin) model.GetValue (iter, 2); if (plugin.Address != null) { address_entry.Sensitive = false;} if (plugin.Path != null) path_entry.Sensitive = false; // TODO: Scroll to the selection return true; } else { return false; } })); address_entry.Changed += delegate { Controller.CheckAddPage (address_entry.Text, path_entry.Text, tree.SelectedRow); }; layout_address.PackStart (new Label () { Markup = "<b>" + "Address:" + "</b>", Xalign = 0 }, true, true, 0); layout_address.PackStart (address_entry, false, false, 0); layout_address.PackStart (address_example, false, false, 0); path_entry.Changed += delegate { Controller.CheckAddPage (address_entry.Text, path_entry.Text, tree.SelectedRow); }; layout_path.PackStart (new Label () { Markup = "<b>" + "Remote Path:" + "</b>", Xalign = 0 }, true, true, 0); layout_path.PackStart (path_entry, false, false, 0); layout_path.PackStart (path_example, false, false, 0); layout_fields.PackStart (layout_address); layout_fields.PackStart (layout_path); layout_vertical.PackStart (new Label (""), false, false, 0); layout_vertical.PackStart (scrolled_window, true, true, 0); layout_vertical.PackStart (layout_fields, false, false, 0); Add (layout_vertical); Button cancel_button = new Button ("Cancel"); Button add_button = new Button ("Add") { Sensitive = false }; cancel_button.Clicked += delegate { Controller.PageCancelled (); }; add_button.Clicked += delegate { Controller.AddPageCompleted (address_entry.Text, path_entry.Text); }; Controller.UpdateAddProjectButtonEvent += delegate (bool button_enabled) { Application.Invoke (delegate { add_button.Sensitive = button_enabled; }); }; CheckButton check_button = new CheckButton ("Fetch prior history") { Active = false }; check_button.Toggled += delegate { Controller.HistoryItemChanged (check_button.Active); }; AddOption (check_button); AddButton (cancel_button); AddButton (add_button); Controller.CheckAddPage (address_entry.Text, path_entry.Text, 1); } if (type == PageType.Invite) { Header = "You've received an invite!"; Description = "Do you want to add this project to SparkleShare?"; Table table = new Table (2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label address_label = new Label ("Address:") { Xalign = 1 }; Label path_label = new Label ("Remote Path:") { Xalign = 1 }; Label address_value = new Label ("<b>" + Controller.PendingInvite.Address + "</b>") { UseMarkup = true, Xalign = 0 }; Label path_value = new Label ("<b>" + Controller.PendingInvite.RemotePath + "</b>") { UseMarkup = true, Xalign = 0 }; table.Attach (address_label, 0, 1, 0, 1); table.Attach (address_value, 1, 2, 0, 1); table.Attach (path_label, 0, 1, 1, 2); table.Attach (path_value, 1, 2, 1, 2); VBox wrapper = new VBox (false, 9); wrapper.PackStart (table, true, false, 0); Button cancel_button = new Button ("Cancel"); Button add_button = new Button ("Add"); cancel_button.Clicked += delegate { Controller.PageCancelled (); }; add_button.Clicked += delegate { Controller.InvitePageCompleted (); }; AddButton (cancel_button); AddButton (add_button); Add (wrapper); } if (type == PageType.Syncing) { Header = String.Format ("Adding project ‘{0}’…", Controller.SyncingFolder); Description = "This may take a while for large projects.\nIsn't it coffee-o'clock?"; ProgressBar progress_bar = new ProgressBar (); progress_bar.Fraction = Controller.ProgressBarPercentage / 100; Button cancel_button = new Button () { Label = "Cancel" }; Button finish_button = new Button ("Finish") { Sensitive = false }; Controller.UpdateProgressBarEvent += delegate (double percentage) { Application.Invoke (delegate { progress_bar.Fraction = percentage / 100; }); }; cancel_button.Clicked += delegate { Controller.SyncingCancelled (); }; VBox bar_wrapper = new VBox (false, 0); bar_wrapper.PackStart (progress_bar, false, false, 21); Add (bar_wrapper); AddButton (cancel_button); AddButton (finish_button); } if (type == PageType.Error) { Header = "Oops! Something went wrong" + "…"; VBox points = new VBox (false, 0); Image list_point_one = new Image (SparkleUIHelpers.GetIcon ("list-point", 16)); Image list_point_two = new Image (SparkleUIHelpers.GetIcon ("list-point", 16)); Image list_point_three = new Image (SparkleUIHelpers.GetIcon ("list-point", 16)); Label label_one = new Label () { Markup = "<b>" + Controller.PreviousUrl + "</b> is the address we've compiled. " + "Does this look alright?", Wrap = true, Xalign = 0 }; Label label_two = new Label () { Text = "Is this computer's Client ID known by the host?", Wrap = true, Xalign = 0 }; points.PackStart (new Label ("Please check the following:") { Xalign = 0 }, false, false, 6); HBox point_one = new HBox (false, 0); point_one.PackStart (list_point_one, false, false, 0); point_one.PackStart (label_one, true, true, 12); points.PackStart (point_one, false, false, 12); HBox point_two = new HBox (false, 0); point_two.PackStart (list_point_two, false, false, 0); point_two.PackStart (label_two, true, true, 12); points.PackStart (point_two, false, false, 12); if (warnings.Length > 0) { string warnings_markup = ""; foreach (string warning in warnings) warnings_markup += "\n<b>" + warning + "</b>"; Label label_three = new Label () { Markup = "Here's the raw error message:" + warnings_markup, Wrap = true, Xalign = 0 }; HBox point_three = new HBox (false, 0); point_three.PackStart (list_point_three, false, false, 0); point_three.PackStart (label_three, true, true, 12); points.PackStart (point_three, false, false, 12); } points.PackStart (new Label (""), true, true, 0); Button cancel_button = new Button ("Cancel"); Button try_again_button = new Button ("Try Again…") { Sensitive = true }; cancel_button.Clicked += delegate { Controller.PageCancelled (); }; try_again_button.Clicked += delegate { Controller.ErrorPageCompleted (); }; AddButton (cancel_button); AddButton (try_again_button); Add (points); } if (type == PageType.CryptoSetup || type == PageType.CryptoPassword) { if (type == PageType.CryptoSetup) { Header = "Set up file encryption"; Description = "Please a provide a strong password that you don't use elsewhere below:"; } else { Header = "This project contains encrypted files"; Description = "Please enter the password to see their contents."; } Label password_label = new Label ("<b>" + "Password:"******"</b>") { UseMarkup = true, Xalign = 1 }; Entry password_entry = new Entry () { Xalign = 0, Visibility = false, ActivatesDefault = true }; CheckButton show_password_check_button = new CheckButton ("Show password") { Active = false, Xalign = 0, }; Table table = new Table (2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; table.Attach (password_label, 0, 1, 0, 1); table.Attach (password_entry, 1, 2, 0, 1); table.Attach (show_password_check_button, 1, 2, 1, 2); VBox wrapper = new VBox (false, 9); wrapper.PackStart (table, true, false, 0); Image warning_image = new Image ( SparkleUIHelpers.GetIcon ("dialog-information", 24)); Label warning_label = new Label () { Xalign = 0, Wrap = true, Text = "This password can't be changed later, and your files can't be recovered if it's forgotten." }; HBox warning_layout = new HBox (false, 0); warning_layout.PackStart (warning_image, false, false, 15); warning_layout.PackStart (warning_label, true, true, 0); VBox warning_wrapper = new VBox (false, 0); warning_wrapper.PackStart (warning_layout, false, false, 15); if (type == PageType.CryptoSetup) wrapper.PackStart (warning_wrapper, false, false, 0); Button cancel_button = new Button ("Cancel"); Button continue_button = new Button ("Continue") { Sensitive = false }; Controller.UpdateCryptoSetupContinueButtonEvent += delegate (bool button_enabled) { Application.Invoke (delegate { continue_button.Sensitive = button_enabled; }); }; Controller.UpdateCryptoPasswordContinueButtonEvent += delegate (bool button_enabled) { Application.Invoke (delegate { continue_button.Sensitive = button_enabled; }); }; show_password_check_button.Toggled += delegate { password_entry.Visibility = !password_entry.Visibility; }; password_entry.Changed += delegate { if (type == PageType.CryptoSetup) Controller.CheckCryptoSetupPage (password_entry.Text); else Controller.CheckCryptoPasswordPage (password_entry.Text); }; cancel_button.Clicked += delegate { Controller.CryptoPageCancelled (); }; continue_button.Clicked += delegate { if (type == PageType.CryptoSetup) Controller.CryptoSetupPageCompleted (password_entry.Text); else Controller.CryptoPasswordPageCompleted (password_entry.Text); }; Add (wrapper); AddButton (cancel_button); AddButton (continue_button); } if (type == PageType.Finished) { Header = "Your shared project is ready!"; Description = "You can find it in your SparkleShare folder"; UrgencyHint = true; Button show_files_button = new Button ("Show Files…"); Button finish_button = new Button ("Finish"); show_files_button.Clicked += delegate { Controller.ShowFilesClicked (); }; finish_button.Clicked += delegate { Controller.FinishPageCompleted (); }; if (warnings.Length > 0) { Image warning_image = new Image (SparkleUIHelpers.GetIcon ("dialog-information", 24)); Label warning_label = new Label (warnings [0]) { Xalign = 0, Wrap = true }; HBox warning_layout = new HBox (false, 0); warning_layout.PackStart (warning_image, false, false, 15); warning_layout.PackStart (warning_label, true, true, 0); VBox warning_wrapper = new VBox (false, 0); warning_wrapper.PackStart (warning_layout, false, false, 0); Add (warning_wrapper); } else { Add (null); } AddButton (show_files_button); AddButton (finish_button); } if (type == PageType.Tutorial) { switch (Controller.TutorialPageNumber) { case 1: { Header = "What's happening next?"; Description = "SparkleShare creates a special folder on your computer " + "that will keep track of your projects."; Button skip_tutorial_button = new Button ("Skip Tutorial"); Button continue_button = new Button ("Continue"); skip_tutorial_button.Clicked += delegate { Controller.TutorialSkipped (); }; continue_button.Clicked += delegate { Controller.TutorialPageCompleted (); }; AddButton (skip_tutorial_button); AddButton (continue_button); break; } case 2: { Header = "Sharing files with others"; Description = "All files added to your project folders are synced automatically with " + "the host and your team members."; Button continue_button = new Button ("Continue"); continue_button.Clicked += delegate { Controller.TutorialPageCompleted (); }; AddButton (continue_button); break; } case 3: { Header = "The status icon helps you"; Description = "It shows the syncing progress, provides easy access to " + "your projects and let's you view recent changes."; Button continue_button = new Button ("Continue"); continue_button.Clicked += delegate { Controller.TutorialPageCompleted (); }; AddButton (continue_button); break; } case 4: { Header = "Here's your unique client ID"; Description = "You'll need it whenever you want to link this computer to a host. " + "You can also find it in the status icon menu."; Button finish_button = new Button ("Finish"); VBox layout_vertical = new VBox (false, 0) { BorderWidth = 48 }; HBox layout_horizontal = new HBox (false, 6); Entry link_code_entry = new Entry () { Text = Program.Controller.CurrentUser.PublicKey, Sensitive = false }; Button copy_button = new Button (" Copy "); CheckButton check_button = new CheckButton ("Add SparkleShare to startup items"); check_button.Active = true; copy_button.Clicked += delegate { Controller.CopyToClipboardClicked (); }; check_button.Toggled += delegate { Controller.StartupItemChanged (check_button.Active); }; finish_button.Clicked += delegate { Controller.TutorialPageCompleted (); }; layout_horizontal.PackStart (link_code_entry, true, true, 0); layout_horizontal.PackStart (copy_button, false, false, 0); layout_vertical.PackStart (new Label (""), true, true, 0); layout_vertical.PackStart (layout_horizontal, false, false, 0); layout_vertical.PackStart (new Label (""), true, true, 18); Add (layout_vertical); AddOption (check_button); AddButton (finish_button); break; } } if (Controller.TutorialPageNumber < 4) { Image slide = SparkleUIHelpers.GetImage ("tutorial-slide-" + Controller.TutorialPageNumber + ".png"); Add (slide); } } }
public SparkleSetup() : base() { SecondaryTextColor = SparkleUIHelpers.GdkColorToHex (Style.Foreground (StateType.Insensitive)); SecondaryTextColorSelected = SparkleUIHelpers.GdkColorToHex ( MixColors ( new TreeView ().Style.Foreground (StateType.Selected), new TreeView ().Style.Background (StateType.Selected), 0.15 ) ); Controller.ChangePageEvent += delegate (PageType type, string [] warnings) { Application.Invoke (delegate { Reset (); switch (type) { case PageType.Setup: { Header = _("Welcome to SparkleShare!"); Description = "We'll need some info to mark your changes in the event log. " + "Don't worry, this stays between you and your peers."; Table = new Table (4, 2, true) { RowSpacing = 6 }; Label name_label = new Label ("<b>" + _("Full Name:") + "</b>") { UseMarkup = true, Xalign = 0 }; NameEntry = new Entry (Controller.GuessedUserName); NameEntry.Changed += delegate { Controller.CheckSetupPage (NameEntry.Text, EmailEntry.Text); }; EmailEntry = new Entry (Controller.GuessedUserEmail); EmailEntry.Changed += delegate { Controller.CheckSetupPage (NameEntry.Text, EmailEntry.Text); }; Label email_label = new Label ("<b>" + _("Email:") + "</b>") { UseMarkup = true, Xalign = 0 }; Table.Attach (name_label, 0, 1, 0, 1); Table.Attach (NameEntry, 1, 2, 0, 1); Table.Attach (email_label, 0, 1, 1, 2); Table.Attach (EmailEntry, 1, 2, 1, 2); NextButton = new Button (_("Next")) { Sensitive = false }; NextButton.Clicked += delegate (object o, EventArgs args) { string full_name = NameEntry.Text; string email = EmailEntry.Text; Controller.SetupPageCompleted (full_name, email); }; AddButton (NextButton); Add (Table); Controller.UpdateSetupContinueButtonEvent += delegate (bool button_enabled) { Application.Invoke (delegate { NextButton.Sensitive = button_enabled; }); }; Controller.CheckSetupPage (NameEntry.Text, EmailEntry.Text); break; } case PageType.Add: { Header = _("Where's your project hosted?"); VBox layout_vertical = new VBox (false, 12); HBox layout_fields = new HBox (true, 12); VBox layout_address = new VBox (true, 0); VBox layout_path = new VBox (true, 0); ListStore store = new ListStore (typeof (Gdk.Pixbuf), typeof (string), typeof (SparklePlugin)); SparkleTreeView tree = new SparkleTreeView (store) { HeadersVisible = false }; ScrolledWindow scrolled_window = new ScrolledWindow (); scrolled_window.AddWithViewport (tree); // Icon column tree.AppendColumn ("Icon", new Gtk.CellRendererPixbuf (), "pixbuf", 0); tree.Columns [0].Cells [0].Xpad = 6; // Service column TreeViewColumn service_column = new TreeViewColumn () { Title = "Service" }; CellRendererText service_cell = new CellRendererText () { Ypad = 4 }; service_column.PackStart (service_cell, true); service_column.SetCellDataFunc (service_cell, new TreeCellDataFunc (RenderServiceColumn)); foreach (SparklePlugin plugin in Controller.Plugins) { store.AppendValues ( new Gdk.Pixbuf (plugin.ImagePath), "<span size=\"small\"><b>" + plugin.Name + "</b>\n" + "<span fgcolor=\"" + SecondaryTextColorSelected + "\">" + plugin.Description + "</span>" + "</span>", plugin); } tree.AppendColumn (service_column); PathEntry = new SparkleEntry (); AddressEntry = new SparkleEntry (); // Select the first plugin by default TreeSelection default_selection = tree.Selection; TreePath default_path = new TreePath ("0"); default_selection.SelectPath (default_path); Controller.SelectedPluginChanged (0); Controller.ChangeAddressFieldEvent += delegate (string text, string example_text, FieldState state) { Console.WriteLine ("> " + text); Application.Invoke (delegate { AddressEntry.Text = text; AddressEntry.Sensitive = (state == FieldState.Enabled); if (string.IsNullOrEmpty (example_text)) AddressEntry.ExampleText = null; else AddressEntry.ExampleText = example_text; if (string.IsNullOrEmpty (text)) AddressEntry.ExampleTextActive = true; else AddressEntry.ExampleTextActive = false; }); }; Controller.ChangePathFieldEvent += delegate (string text, string example_text, FieldState state) { Application.Invoke (delegate { PathEntry.Text = text; PathEntry.Sensitive = (state == FieldState.Enabled); if (string.IsNullOrEmpty (example_text)) PathEntry.ExampleText = null; else PathEntry.ExampleText = example_text; if (string.IsNullOrEmpty (text)) PathEntry.ExampleTextActive = true; else PathEntry.ExampleTextActive = false; }); }; // Update the address field text when the selection changes tree.CursorChanged += delegate (object sender, EventArgs e) { Controller.SelectedPluginChanged (tree.SelectedRow); // TODO: Scroll to selected row when using arrow keys }; tree.Model.Foreach (new TreeModelForeachFunc (delegate (TreeModel model, TreePath path, TreeIter iter) { string address; try { address = (model.GetValue (iter, 2) as SparklePlugin).Address; } catch (NullReferenceException) { address = ""; } if (!string.IsNullOrEmpty (address) && address.Equals (Controller.PreviousAddress)) { tree.SetCursor (path, service_column, false); SparklePlugin plugin = (SparklePlugin) model.GetValue (iter, 2); if (plugin.Address != null) { AddressEntry.Sensitive = false;} if (plugin.Path != null) PathEntry.Sensitive = false; // TODO: Scroll to the selection return true; } else { return false; } })); AddressEntry.Completion = new EntryCompletion(); ListStore server_store = new ListStore (typeof (string)); foreach (string host in Program.Controller.PreviousHosts) server_store.AppendValues (host); AddressEntry.Completion.Model = server_store; AddressEntry.Completion.TextColumn = 0; AddressEntry.Changed += delegate { Controller.CheckAddPage (AddressEntry.Text, PathEntry.Text, tree.SelectedRow); }; layout_address.PackStart (new Label () { Markup = "<b>" + _("Address") + "</b>", Xalign = 0 }, true, true, 0); layout_address.PackStart (AddressEntry, true, true, 0); PathEntry.Completion = new EntryCompletion(); ListStore folder_store = new ListStore (typeof (string)); //foreach (string host in Program.Controller.FolderPaths) // folder_store.AppendValues (host); PathEntry.Completion.Model = folder_store; PathEntry.Completion.TextColumn = 0; PathEntry.Changed += delegate { Controller.CheckAddPage (AddressEntry.Text, PathEntry.Text, tree.SelectedRow); }; layout_path.PackStart (new Label () { Markup = "<b>" + _("Remote Path") + "</b>", Xalign = 0 }, true, true, 0); layout_path.PackStart (PathEntry, true, true, 0); layout_fields.PackStart (layout_address); layout_fields.PackStart (layout_path); layout_vertical.PackStart (new Label (""), false, false, 0); layout_vertical.PackStart (scrolled_window, true, true, 0); layout_vertical.PackStart (layout_fields, false, false, 0); Add (layout_vertical); // Cancel button Button cancel_button = new Button (_("Cancel")); cancel_button.Clicked += delegate { Close (); }; // Sync button SyncButton = new Button (_("Add")); SyncButton.Clicked += delegate { string server = AddressEntry.Text; string folder_name = PathEntry.Text; Controller.AddPageCompleted (server, folder_name); }; AddButton (cancel_button); AddButton (SyncButton); Controller.CheckAddPage (AddressEntry.Text, PathEntry.Text, tree.SelectedRow); break; } case PageType.Syncing: { Header = String.Format (_("Adding project ‘{0}’…"), Controller.SyncingFolder); Description = _("This may take a while.") + Environment.NewLine + _("Are you sure it’s not coffee o'clock?"); Button finish_button = new Button () { Sensitive = false, Label = _("Finish") }; Button cancel_button = new Button () { Label = _("Cancel") }; cancel_button.Clicked += delegate { Controller.SyncingCancelled (); }; AddButton (cancel_button); AddButton (finish_button); Controller.UpdateProgressBarEvent += delegate (double percentage) { Application.Invoke (delegate { this.progress_bar.Fraction = percentage / 100; }); }; if (this.progress_bar.Parent != null) (this.progress_bar.Parent as Container).Remove (this.progress_bar); VBox bar_wrapper = new VBox (false , 0); bar_wrapper.PackStart (this.progress_bar, false, false, 0); Add (bar_wrapper); break; } case PageType.Error: { Header = _("Something went wrong") + "…"; VBox points = new VBox (false, 0); Image list_point_one = new Image (SparkleUIHelpers.GetIcon ("list-point", 16)) { }; Image list_point_two = new Image (SparkleUIHelpers.GetIcon ("list-point", 16)) { }; Image list_point_three = new Image (SparkleUIHelpers.GetIcon ("list-point", 16)) { }; Label label_one = new Label () { Text = "First, have you tried turning it off and on again?", Wrap = true, Xalign = 0 }; Label label_two = new Label () { Markup = "<b>" + Controller.PreviousUrl + "</b> is the address we've compiled. " + "Does this look alright?", Wrap = true, Xalign = 0 }; Label label_three = new Label () { Text = "The host needs to know who you are. Did you upload the key that's in " + "your SparkleShare folder?", Wrap = true, Xalign = 0 }; points.PackStart (new Label ("Please check the following:") { Xalign = 0 }, false, false, 6); HBox point_one = new HBox (false, 0); point_one.PackStart (list_point_one, false, false, 0); point_one.PackStart (label_one, true, true, 12); points.PackStart (point_one, false, false, 12); HBox point_two = new HBox (false, 0); point_two.PackStart (list_point_two, false, false, 0); point_two.PackStart (label_two, true, true, 12); points.PackStart (point_two, false, false, 12); HBox point_three = new HBox (false, 0); point_three.PackStart (list_point_three, false, false, 0); point_three.PackStart (label_three, true, true, 12); points.PackStart (point_three, false, false, 12); points.PackStart (new Label (""), true, true, 0); Button try_again_button = new Button (_("Try Again…")) { Sensitive = true }; try_again_button.Clicked += delegate { Controller.ErrorPageCompleted (); }; AddButton (try_again_button); Add (points); break; } case PageType.Finished: { UrgencyHint = true; if (!HasToplevelFocus) { string title = String.Format (_("‘{0}’ has been successfully added"), Controller.SyncingFolder); string subtext = ""; SparkleUI.Bubbles.Controller.ShowBubble (title, subtext, null); } Header = _("Project successfully added!"); Description = _("Access the files from your SparkleShare folder."); // A button that opens the synced folder Button open_folder_button = new Button (_("Open Folder")); open_folder_button.Clicked += delegate { Program.Controller.OpenSparkleShareFolder (Controller.SyncingFolder); }; Button finish_button = new Button (_("Finish")); finish_button.Clicked += delegate { Controller.FinishedPageCompleted (); Close (); }; if (warnings != null) { Image warning_image = new Image (SparkleUIHelpers.GetIcon ("dialog-warning", 24)); Label warning_label = new Label (warnings [0]) { Xalign = 0 }; HBox warning_layout = new HBox (false, 0); warning_layout.PackStart (warning_image, false, false, 0); warning_layout.PackStart (warning_label, true, true, 0); Add (warning_layout); } else { Add (null); } AddButton (open_folder_button); AddButton (finish_button); break; } case PageType.Tutorial: { switch (Controller.TutorialPageNumber) { case 1: { Header = _("What's happening next?"); Description = _("SparkleShare creates a special folder in your personal folder " + "that will keep track of your projects."); Button skip_tutorial_button = new Button (_("Skip Tutorial")); skip_tutorial_button.Clicked += delegate { Controller.TutorialSkipped (); }; Button continue_button = new Button (_("Continue")); continue_button.Clicked += delegate { Controller.TutorialPageCompleted (); }; Image slide = SparkleUIHelpers.GetImage ("tutorial-slide-1.png"); Add (slide); AddButton (skip_tutorial_button); AddButton (continue_button); break; } case 2: { Header = _("Sharing files with others"); Description = _("All files added to your project folders are synced with the host " + "automatically, as well as with your collaborators."); Button continue_button = new Button (_("Continue")); continue_button.Clicked += delegate { Controller.TutorialPageCompleted (); }; Image slide = SparkleUIHelpers.GetImage ("tutorial-slide-2.png"); Add (slide); AddButton (continue_button); break; } case 3: { Header = _("The status icon is here to help"); Description = _("It shows the syncing process status, " + "and contains links to your projects and the event log."); Button continue_button = new Button (_("Continue")); continue_button.Clicked += delegate { Controller.TutorialPageCompleted (); }; Image slide = SparkleUIHelpers.GetImage ("tutorial-slide-3.png"); Add (slide); AddButton (continue_button); break; } case 4: { Header = _("Adding projects to SparkleShare"); Description = _("Just click this button when you see it on the web, and " + "the project will be automatically added:"); Label label = new Label (_("…or select <b>‘Add Hosted Project…’</b> from the status icon menu " + "to add one by hand.")) { Wrap = true, Xalign = 0, UseMarkup = true }; Image slide = SparkleUIHelpers.GetImage ("tutorial-slide-4.png"); Button finish_button = new Button (_("Finish")); finish_button.Clicked += delegate { Close (); }; VBox box = new VBox (false, 0); box.Add (slide); box.Add (label); Add (box); AddButton (finish_button); break; } } break; } } ShowAll (); }); }; }
public void ShowPage(PageType type, string [] warnings) { if (type == PageType.Setup) { Header = "Welcome to SparkleShare!"; Description = "First off, what’s your name and email?\n(visible only to team members)"; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label name_label = new Label("<b>" + "Full Name:" + "</b>") { UseMarkup = true, Xalign = 1 }; Entry name_entry = new Entry() { Xalign = 0, ActivatesDefault = true }; try { UnixUserInfo user_info = UnixUserInfo.GetRealUser(); if (user_info != null && user_info.RealName != null) { // Some systems append a series of "," for some reason name_entry.Text = user_info.RealName.TrimEnd(",".ToCharArray()); } } catch (ArgumentException) { // No username, not a big deal } Entry email_entry = new Entry() { Xalign = 0, ActivatesDefault = true }; Label email_label = new Label("<b>" + "Email:" + "</b>") { UseMarkup = true, Xalign = 1 }; table.Attach(name_label, 0, 1, 0, 1); table.Attach(name_entry, 1, 2, 0, 1); table.Attach(email_label, 0, 1, 1, 2); table.Attach(email_entry, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Button cancel_button = new Button("Cancel"); Button continue_button = new Button("Continue") { Sensitive = false }; Controller.UpdateSetupContinueButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { continue_button.Sensitive = button_enabled; }); }; name_entry.Changed += delegate { Controller.CheckSetupPage(name_entry.Text, email_entry.Text); }; email_entry.Changed += delegate { Controller.CheckSetupPage(name_entry.Text, email_entry.Text); }; cancel_button.Clicked += delegate { Controller.SetupPageCancelled(); }; continue_button.Clicked += delegate { Controller.SetupPageCompleted(name_entry.Text, email_entry.Text); }; AddButton(cancel_button); AddButton(continue_button); Add(wrapper); Controller.CheckSetupPage(name_entry.Text, email_entry.Text); if (name_entry.Text.Equals("")) { name_entry.GrabFocus(); } else { email_entry.GrabFocus(); } } if (type == PageType.Add) { Header = "Where’s your project hosted?"; VBox layout_vertical = new VBox(false, 16); HBox layout_fields = new HBox(true, 32); VBox layout_address = new VBox(true, 0); VBox layout_path = new VBox(true, 0); ListStore store = new ListStore(typeof(string), typeof(Gdk.Pixbuf), typeof(string), typeof(SparklePlugin)); SparkleTreeView tree_view = new SparkleTreeView(store) { HeadersVisible = false }; ScrolledWindow scrolled_window = new ScrolledWindow() { ShadowType = ShadowType.In }; scrolled_window.SetPolicy(PolicyType.Never, PolicyType.Automatic); // Padding column tree_view.AppendColumn("Padding", new Gtk.CellRendererText(), "text", 0); tree_view.Columns [0].Cells [0].Xpad = 4; // Icon column tree_view.AppendColumn("Icon", new Gtk.CellRendererPixbuf(), "pixbuf", 1); tree_view.Columns [1].Cells [0].Xpad = 4; // Service column TreeViewColumn service_column = new TreeViewColumn() { Title = "Service" }; CellRendererText service_cell = new CellRendererText() { Ypad = 8 }; service_column.PackStart(service_cell, true); service_column.SetCellDataFunc(service_cell, new TreeCellDataFunc(RenderServiceColumn)); foreach (SparklePlugin plugin in Controller.Plugins) { store.AppendValues("", new Gdk.Pixbuf(plugin.ImagePath), "<span size=\"small\"><b>" + plugin.Name + "</b>\n" + "<span fgcolor=\"" + Program.UI.SecondaryTextColor + "\">" + plugin.Description + "</span>" + "</span>", plugin); } tree_view.AppendColumn(service_column); scrolled_window.Add(tree_view); Entry address_entry = new Entry() { Text = Controller.PreviousAddress, Sensitive = (Controller.SelectedPlugin.Address == null), ActivatesDefault = true }; Entry path_entry = new Entry() { Text = Controller.PreviousPath, Sensitive = (Controller.SelectedPlugin.Path == null), ActivatesDefault = true }; Label address_example = new Label() { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + Program.UI.SecondaryTextColor + "\">" + Controller.SelectedPlugin.AddressExample + "</span>" }; Label path_example = new Label() { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + Program.UI.SecondaryTextColor + "\">" + Controller.SelectedPlugin.PathExample + "</span>" }; TreeSelection default_selection = tree_view.Selection; TreePath default_path = new TreePath("" + Controller.SelectedPluginIndex); default_selection.SelectPath(default_path); tree_view.Model.Foreach(new TreeModelForeachFunc( delegate(ITreeModel model, TreePath path, TreeIter iter) { string address; try { address = (model.GetValue(iter, 2) as SparklePlugin).Address; } catch (NullReferenceException) { address = ""; } if (!string.IsNullOrEmpty(address) && address.Equals(Controller.PreviousAddress)) { tree_view.SetCursor(path, service_column, false); SparklePlugin plugin = (SparklePlugin)model.GetValue(iter, 2); if (plugin.Address != null) { address_entry.Sensitive = false; } if (plugin.Path != null) { path_entry.Sensitive = false; } return(true); } else { return(false); } } )); layout_address.PackStart(new Label() { Markup = "<b>" + "Address" + "</b>", Xalign = 0 }, true, true, 0); layout_address.PackStart(address_entry, false, false, 0); layout_address.PackStart(address_example, false, false, 0); path_entry.Changed += delegate { Controller.CheckAddPage(address_entry.Text, path_entry.Text, tree_view.SelectedRow); }; layout_path.PackStart(new Label() { Markup = "<b>" + "Remote Path" + "</b>", Xalign = 0 }, true, true, 0); layout_path.PackStart(path_entry, false, false, 0); layout_path.PackStart(path_example, false, false, 0); layout_fields.PackStart(layout_address, true, true, 0); layout_fields.PackStart(layout_path, true, true, 0); layout_vertical.PackStart(new Label(""), false, false, 0); layout_vertical.PackStart(scrolled_window, true, true, 0); layout_vertical.PackStart(layout_fields, false, false, 0); tree_view.ScrollToCell(new TreePath("" + Controller.SelectedPluginIndex), null, true, 0, 0); Add(layout_vertical); if (string.IsNullOrEmpty(path_entry.Text)) { address_entry.GrabFocus(); address_entry.Position = -1; } else { path_entry.GrabFocus(); path_entry.Position = -1; } Button cancel_button = new Button("Cancel"); Button add_button = new Button("Add") { Sensitive = false }; Controller.ChangeAddressFieldEvent += delegate(string text, string example_text, FieldState state) { Application.Invoke(delegate { address_entry.Text = text; address_entry.Sensitive = (state == FieldState.Enabled); address_example.Markup = "<span size=\"small\" fgcolor=\"" + Program.UI.SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.ChangePathFieldEvent += delegate(string text, string example_text, FieldState state) { Application.Invoke(delegate { path_entry.Text = text; path_entry.Sensitive = (state == FieldState.Enabled); path_example.Markup = "<span size=\"small\" fgcolor=\"" + Program.UI.SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.UpdateAddProjectButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { add_button.Sensitive = button_enabled; }); }; tree_view.CursorChanged += delegate(object sender, EventArgs e) { Controller.SelectedPluginChanged(tree_view.SelectedRow); }; address_entry.Changed += delegate { Controller.CheckAddPage(address_entry.Text, path_entry.Text, tree_view.SelectedRow); }; cancel_button.Clicked += delegate { Controller.PageCancelled(); }; add_button.Clicked += delegate { Controller.AddPageCompleted(address_entry.Text, path_entry.Text); }; CheckButton check_button = new CheckButton("Fetch prior revisions") { Active = true }; check_button.Toggled += delegate { Controller.HistoryItemChanged(check_button.Active); }; AddOption(check_button); AddButton(cancel_button); AddButton(add_button); Controller.HistoryItemChanged(check_button.Active); Controller.CheckAddPage(address_entry.Text, path_entry.Text, 1); } if (type == PageType.Invite) { Header = "You’ve received an invite!"; Description = "Do you want to add this project to SparkleShare?"; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label address_label = new Label("Address:") { Xalign = 1 }; Label path_label = new Label("Remote Path:") { Xalign = 1 }; Label address_value = new Label("<b>" + Controller.PendingInvite.Address + "</b>") { UseMarkup = true, Xalign = 0 }; Label path_value = new Label("<b>" + Controller.PendingInvite.RemotePath + "</b>") { UseMarkup = true, Xalign = 0 }; table.Attach(address_label, 0, 1, 0, 1); table.Attach(address_value, 1, 2, 0, 1); table.Attach(path_label, 0, 1, 1, 2); table.Attach(path_value, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Button cancel_button = new Button("Cancel"); Button add_button = new Button("Add"); cancel_button.Clicked += delegate { Controller.PageCancelled(); }; add_button.Clicked += delegate { Controller.InvitePageCompleted(); }; AddButton(cancel_button); AddButton(add_button); Add(wrapper); } if (type == PageType.Syncing) { Header = String.Format("Adding project ‘{0}’…", Controller.SyncingFolder); Description = "This may take a while for large projects.\nIsn’t it coffee-o’clock?"; ProgressBar progress_bar = new ProgressBar(); progress_bar.Fraction = Controller.ProgressBarPercentage / 100; Button cancel_button = new Button() { Label = "Cancel" }; Button finish_button = new Button("Finish") { Sensitive = false }; Label progress_label = new Label("Preparing to fetch files…") { Justify = Justification.Right, Xalign = 1 }; Controller.UpdateProgressBarEvent += delegate(double percentage, string speed) { Application.Invoke(delegate { progress_bar.Fraction = percentage / 100; progress_label.Text = speed; }); }; cancel_button.Clicked += delegate { Controller.SyncingCancelled(); }; VBox bar_wrapper = new VBox(false, 0); bar_wrapper.PackStart(progress_bar, false, false, 21); bar_wrapper.PackStart(progress_label, false, true, 0); Add(bar_wrapper); AddButton(cancel_button); AddButton(finish_button); } if (type == PageType.Error) { Header = "Oops! Something went wrong" + "…"; VBox points = new VBox(false, 0); Image list_point_one = new Image(SparkleUIHelpers.GetIcon("list-point", 16)); Image list_point_two = new Image(SparkleUIHelpers.GetIcon("list-point", 16)); Image list_point_three = new Image(SparkleUIHelpers.GetIcon("list-point", 16)); Label label_one = new Label() { Markup = "<b>" + Controller.PreviousUrl + "</b> is the address we’ve compiled. " + "Does this look alright?", Wrap = true, Xalign = 0 }; Label label_two = new Label() { Text = "Is this computer’s Client ID known by the host?", Wrap = true, Xalign = 0 }; points.PackStart(new Label("Please check the following:") { Xalign = 0 }, false, false, 6); HBox point_one = new HBox(false, 0); point_one.PackStart(list_point_one, false, false, 0); point_one.PackStart(label_one, true, true, 12); points.PackStart(point_one, false, false, 12); HBox point_two = new HBox(false, 0); point_two.PackStart(list_point_two, false, false, 0); point_two.PackStart(label_two, true, true, 12); points.PackStart(point_two, false, false, 12); if (warnings.Length > 0) { string warnings_markup = ""; foreach (string warning in warnings) { warnings_markup += "\n<b>" + warning + "</b>"; } Label label_three = new Label() { Markup = "Here’s the raw error message:" + warnings_markup, Wrap = true, Xalign = 0 }; HBox point_three = new HBox(false, 0); point_three.PackStart(list_point_three, false, false, 0); point_three.PackStart(label_three, true, true, 12); points.PackStart(point_three, false, false, 12); } points.PackStart(new Label(""), true, true, 0); Button cancel_button = new Button("Cancel"); Button try_again_button = new Button("Try Again…") { Sensitive = true }; cancel_button.Clicked += delegate { Controller.PageCancelled(); }; try_again_button.Clicked += delegate { Controller.ErrorPageCompleted(); }; AddButton(cancel_button); AddButton(try_again_button); Add(points); } if (type == PageType.CryptoSetup || type == PageType.CryptoPassword) { if (type == PageType.CryptoSetup) { Header = "Set up file encryption"; Description = "Please a provide a strong password that you don’t use elsewhere."; } else { Header = "This project contains encrypted files"; Description = "Please enter the password to see their contents."; } Label password_label = new Label("<b>" + "Password" + "</b>") { UseMarkup = true, Xalign = 1 }; Entry password_entry = new Entry() { Xalign = 0, Visibility = false, ActivatesDefault = true }; CheckButton show_password_check_button = new CheckButton("Show password") { Active = false, Xalign = 0, }; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; table.Attach(password_label, 0, 1, 0, 1); table.Attach(password_entry, 1, 2, 0, 1); table.Attach(show_password_check_button, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Image warning_image = new Image( SparkleUIHelpers.GetIcon("dialog-information", 24)); Label warning_label = new Label() { Xalign = 0, Wrap = true, Text = "This password can’t be changed later, and your files can’t be recovered if it’s forgotten." }; HBox warning_layout = new HBox(false, 0); warning_layout.PackStart(warning_image, false, false, 15); warning_layout.PackStart(warning_label, true, true, 0); VBox warning_wrapper = new VBox(false, 0); warning_wrapper.PackStart(warning_layout, false, false, 15); if (type == PageType.CryptoSetup) { wrapper.PackStart(warning_wrapper, false, false, 0); } Button cancel_button = new Button("Cancel"); Button continue_button = new Button("Continue") { Sensitive = false }; Controller.UpdateCryptoSetupContinueButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { continue_button.Sensitive = button_enabled; }); }; Controller.UpdateCryptoPasswordContinueButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { continue_button.Sensitive = button_enabled; }); }; show_password_check_button.Toggled += delegate { password_entry.Visibility = !password_entry.Visibility; }; password_entry.Changed += delegate { if (type == PageType.CryptoSetup) { Controller.CheckCryptoSetupPage(password_entry.Text); } else { Controller.CheckCryptoPasswordPage(password_entry.Text); } }; cancel_button.Clicked += delegate { Controller.CryptoPageCancelled(); }; continue_button.Clicked += delegate { if (type == PageType.CryptoSetup) { Controller.CryptoSetupPageCompleted(password_entry.Text); } else { Controller.CryptoPasswordPageCompleted(password_entry.Text); } }; Add(wrapper); AddButton(cancel_button); AddButton(continue_button); password_entry.GrabFocus(); } if (type == PageType.Finished) { Header = "Your shared project is ready!"; Description = "You can find the files in your SparkleShare folder."; UrgencyHint = true; Button show_files_button = new Button("Show Files…"); Button finish_button = new Button("Finish"); show_files_button.Clicked += delegate { Controller.ShowFilesClicked(); }; finish_button.Clicked += delegate { Controller.FinishPageCompleted(); }; if (warnings.Length > 0) { Image warning_image = new Image(SparkleUIHelpers.GetIcon("dialog-information", 24)); Label warning_label = new Label(warnings [0]) { Xalign = 0, Wrap = true }; HBox warning_layout = new HBox(false, 0); warning_layout.PackStart(warning_image, false, false, 15); warning_layout.PackStart(warning_label, true, true, 0); VBox warning_wrapper = new VBox(false, 0); warning_wrapper.PackStart(warning_layout, false, false, 0); Add(warning_wrapper); } else { Add(null); } AddButton(show_files_button); AddButton(finish_button); } if (type == PageType.Tutorial) { switch (Controller.TutorialPageNumber) { case 1: { Header = "What’s happening next?"; Description = "SparkleShare creates a special folder on your computer " + "that will keep track of your projects."; Button skip_tutorial_button = new Button("Skip Tutorial"); Button continue_button = new Button("Continue"); skip_tutorial_button.Clicked += delegate { Controller.TutorialSkipped(); }; continue_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; AddButton(skip_tutorial_button); AddButton(continue_button); break; } case 2: { Header = "Sharing files with others"; Description = "All files added to your project folders are synced automatically with " + "the host and your team members."; Button continue_button = new Button("Continue"); continue_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; AddButton(continue_button); break; } case 3: { Header = "The status icon helps you"; Description = "It shows the syncing progress, provides easy access to " + "your projects, and lets you view recent changes."; Button continue_button = new Button("Continue"); continue_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; AddButton(continue_button); break; } case 4: { Header = "Here’s your unique Client ID"; Description = "You’ll need it whenever you want to link this computer to a host. " + "You can also find it in the status icon menu."; Button finish_button = new Button("Finish"); VBox layout_vertical = new VBox(false, 0) { BorderWidth = 48 }; HBox layout_horizontal = new HBox(false, 6); Entry link_code_entry = new Entry() { Text = Program.Controller.CurrentUser.PublicKey, Sensitive = false }; Button copy_button = new Button(" Copy "); CheckButton check_button = new CheckButton("Add SparkleShare to startup items"); check_button.Active = true; copy_button.Clicked += delegate { Controller.CopyToClipboardClicked(); }; check_button.Toggled += delegate { Controller.StartupItemChanged(check_button.Active); }; finish_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; layout_horizontal.PackStart(link_code_entry, true, true, 0); layout_horizontal.PackStart(copy_button, false, false, 0); layout_vertical.PackStart(new Label(""), true, true, 0); layout_vertical.PackStart(layout_horizontal, false, false, 0); layout_vertical.PackStart(new Label(""), true, true, 18); Add(layout_vertical); AddOption(check_button); AddButton(finish_button); break; } } if (Controller.TutorialPageNumber < 4) { Image slide = SparkleUIHelpers.GetImage("tutorial-slide-" + Controller.TutorialPageNumber + ".png"); Add(slide); } } }
public void ShowPage(PageType type, string [] warnings) { if (type == PageType.Setup) { Header = "Welcome to SparkleShare!"; Description = "First off, what’s your name and email?\n(visible only to team members)"; Table table = new Table (2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label name_label = new Label ("<b>" + "Your Name:" + "</b>") { UseMarkup = true, Xalign = 1 }; Entry name_entry = new Entry () { Xalign = 0, ActivatesDefault = true }; try { UnixUserInfo user_info = UnixUserInfo.GetRealUser (); if (user_info != null && user_info.RealName != null) // Some systems append a series of "," for some reason, TODO: Report upstream name_entry.Text = user_info.RealName.TrimEnd (",".ToCharArray ()); } catch (ArgumentException) { // No username, not a big deal } Entry email_entry = new Entry () { Xalign = 0, ActivatesDefault = true }; Label email_label = new Label ("<b>" + "Email:" + "</b>") { UseMarkup = true, Xalign = 1 }; table.Attach (name_label, 0, 1, 0, 1); table.Attach (name_entry, 1, 2, 0, 1); table.Attach (email_label, 0, 1, 1, 2); table.Attach (email_entry, 1, 2, 1, 2); VBox wrapper = new VBox (false, 9); wrapper.PackStart (table, true, false, 0); Button cancel_button = new Button ("Cancel"); Button continue_button = new Button ("Continue") { Sensitive = false }; Controller.UpdateSetupContinueButtonEvent += delegate (bool button_enabled) { Application.Invoke (delegate { continue_button.Sensitive = button_enabled; }); }; name_entry.Changed += delegate { Controller.CheckSetupPage (name_entry.Text, email_entry.Text); }; email_entry.Changed += delegate { Controller.CheckSetupPage (name_entry.Text, email_entry.Text); }; cancel_button.Clicked += delegate { Controller.SetupPageCancelled (); }; continue_button.Clicked += delegate { Controller.SetupPageCompleted (name_entry.Text, email_entry.Text); }; AddButton (cancel_button); AddButton (continue_button); Add (wrapper); Controller.CheckSetupPage (name_entry.Text, email_entry.Text); if (name_entry.Text.Equals ("")) name_entry.GrabFocus (); else email_entry.GrabFocus (); } if (type == PageType.Add) { Header = "Where’s your project hosted?"; VBox layout_vertical = new VBox (false, 16); HBox layout_fields = new HBox (true, 32); VBox layout_address = new VBox (true, 0); VBox layout_path = new VBox (true, 0); ListStore store = new ListStore (typeof (string), typeof (Gdk.Pixbuf), typeof (string), typeof (Preset)); SparkleTreeView tree_view = new SparkleTreeView (store) { HeadersVisible = false, SearchColumn = -1, EnableSearch = false }; ScrolledWindow scrolled_window = new ScrolledWindow () { ShadowType = ShadowType.In }; scrolled_window.SetPolicy (PolicyType.Never, PolicyType.Automatic); // Padding column tree_view.AppendColumn ("Padding", new Gtk.CellRendererText (), "text", 0); tree_view.Columns [0].Cells [0].Xpad = 4; // Icon column tree_view.AppendColumn ("Icon", new Gtk.CellRendererPixbuf (), "pixbuf", 1); tree_view.Columns [1].Cells [0].Xpad = 4; // Service column TreeViewColumn service_column = new TreeViewColumn () { Title = "Service" }; CellRendererText service_cell = new CellRendererText () { Ypad = 8 }; service_column.PackStart (service_cell, true); service_column.SetCellDataFunc (service_cell, new TreeCellDataFunc (RenderServiceColumn)); foreach (Preset preset in Controller.Presets) { store.AppendValues ("", new Gdk.Pixbuf (preset.ImagePath), "<span size=\"small\"><b>" + preset.Name + "</b>\n" + "<span fgcolor=\"" + SparkleShare.UI.SecondaryTextColor + "\">" + preset.Description + "</span>" + "</span>", preset); } tree_view.AppendColumn (service_column); scrolled_window.Add (tree_view); Entry address_entry = new Entry () { Text = Controller.PreviousAddress, Sensitive = (Controller.SelectedPreset.Address == null), ActivatesDefault = true }; Entry path_entry = new Entry () { Text = Controller.PreviousPath, Sensitive = (Controller.SelectedPreset.Path == null), ActivatesDefault = true }; tree_view.ButtonReleaseEvent += delegate { path_entry.GrabFocus (); }; Label address_example = new Label () { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + SparkleShare.UI.SecondaryTextColor + "\">" + Controller.SelectedPreset.AddressExample + "</span>" }; Label path_example = new Label () { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + SparkleShare.UI.SecondaryTextColor + "\">" + Controller.SelectedPreset.PathExample + "</span>" }; TreeSelection default_selection = tree_view.Selection; TreePath default_path = new TreePath ("" + Controller.SelectedPresetIndex); default_selection.SelectPath (default_path); tree_view.Model.Foreach (new TreeModelForeachFunc ( delegate (ITreeModel model, TreePath path, TreeIter iter) { string address; try { address = (model.GetValue (iter, 2) as Preset).Address; } catch (NullReferenceException) { address = ""; } if (!string.IsNullOrEmpty (address) && address.Equals (Controller.PreviousAddress)) { tree_view.SetCursor (path, service_column, false); Preset preset = (Preset) model.GetValue (iter, 2); if (preset.Address != null) address_entry.Sensitive = false; if (preset.Path != null) path_entry.Sensitive = false; return true; } else { return false; } } )); layout_address.PackStart (new Label () { Markup = "<b>" + "Address" + "</b>", Xalign = 0 }, true, true, 0); layout_address.PackStart (address_entry, false, false, 0); layout_address.PackStart (address_example, false, false, 0); path_entry.Changed += delegate { Controller.CheckAddPage (address_entry.Text, path_entry.Text, tree_view.SelectedRow); }; layout_path.PackStart (new Label () { Markup = "<b>" + "Remote Path" + "</b>", Xalign = 0 }, true, true, 0); layout_path.PackStart (path_entry, false, false, 0); layout_path.PackStart (path_example, false, false, 0); layout_fields.PackStart (layout_address, true, true, 0); layout_fields.PackStart (layout_path, true, true, 0); layout_vertical.PackStart (scrolled_window, true, true, 0); layout_vertical.PackStart (layout_fields, false, false, 0); tree_view.ScrollToCell (new TreePath ("" + Controller.SelectedPresetIndex), null, true, 0, 0); Add (layout_vertical); if (string.IsNullOrEmpty (path_entry.Text)) { address_entry.GrabFocus (); address_entry.Position = -1; } else { path_entry.GrabFocus (); path_entry.Position = -1; } Button cancel_button = new Button ("Cancel"); Button add_button = new Button ("Add") { Sensitive = false }; Controller.ChangeAddressFieldEvent += delegate (string text, string example_text, FieldState state) { Application.Invoke (delegate { address_entry.Text = text; address_entry.Sensitive = (state == FieldState.Enabled); address_example.Markup = "<span size=\"small\" fgcolor=\"" + SparkleShare.UI.SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.ChangePathFieldEvent += delegate (string text, string example_text, FieldState state) { Application.Invoke (delegate { path_entry.Text = text; path_entry.Sensitive = (state == FieldState.Enabled); path_example.Markup = "<span size=\"small\" fgcolor=\"" + SparkleShare.UI.SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.UpdateAddProjectButtonEvent += delegate (bool button_enabled) { Application.Invoke (delegate { add_button.Sensitive = button_enabled; }); }; tree_view.CursorChanged += delegate (object sender, EventArgs e) { Controller.SelectedPresetChanged (tree_view.SelectedRow); }; address_entry.Changed += delegate { Controller.CheckAddPage (address_entry.Text, path_entry.Text, tree_view.SelectedRow); }; cancel_button.Clicked += delegate { Controller.PageCancelled (); }; add_button.Clicked += delegate { Controller.AddPageCompleted (address_entry.Text, path_entry.Text); }; CheckButton check_button = new CheckButton ("Fetch prior revisions") { Active = false }; check_button.Toggled += delegate { Controller.HistoryItemChanged (check_button.Active); }; AddOption (check_button); AddButton (cancel_button); AddButton (add_button); Controller.HistoryItemChanged (check_button.Active); Controller.CheckAddPage (address_entry.Text, path_entry.Text, 1); } if (type == PageType.Invite) { Header = "You’ve received an invite!"; Description = "Do you want to add this project to SparkleShare?"; Table table = new Table (2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label address_label = new Label ("Address:") { Xalign = 1 }; Label path_label = new Label ("Remote Path:") { Xalign = 1 }; Label address_value = new Label ("<b>" + Controller.PendingInvite.Address + "</b>") { UseMarkup = true, Xalign = 0 }; Label path_value = new Label ("<b>" + Controller.PendingInvite.RemotePath + "</b>") { UseMarkup = true, Xalign = 0 }; table.Attach (address_label, 0, 1, 0, 1); table.Attach (address_value, 1, 2, 0, 1); table.Attach (path_label, 0, 1, 1, 2); table.Attach (path_value, 1, 2, 1, 2); VBox wrapper = new VBox (false, 9); wrapper.PackStart (table, true, false, 0); Button cancel_button = new Button ("Cancel"); Button add_button = new Button ("Add"); cancel_button.Clicked += delegate { Controller.PageCancelled (); }; add_button.Clicked += delegate { Controller.InvitePageCompleted (); }; AddButton (cancel_button); AddButton (add_button); Add (wrapper); } if (type == PageType.Syncing) { Header = String.Format ("Adding project ‘{0}’…", Controller.SyncingFolder); Description = "This may take a while for large projects.\nIsn’t it coffee-o’clock?"; ProgressBar progress_bar = new ProgressBar (); progress_bar.Fraction = Controller.ProgressBarPercentage / 100; Button cancel_button = new Button () { Label = "Cancel" }; Button finish_button = new Button ("Finish") { Sensitive = false }; Label progress_label = new Label ("Preparing to fetch files…") { Justify = Justification.Right, Xalign = 1 }; Controller.UpdateProgressBarEvent += delegate (double percentage, string speed) { Application.Invoke (delegate { progress_bar.Fraction = percentage / 100; progress_label.Text = speed; }); }; cancel_button.Clicked += delegate { Controller.SyncingCancelled (); }; VBox bar_wrapper = new VBox (false, 0); bar_wrapper.PackStart (progress_bar, false, false, 21); bar_wrapper.PackStart (progress_label, false, true, 0); Add (bar_wrapper); AddButton (cancel_button); AddButton (finish_button); } if (type == PageType.Error) { Header = "Oops! Something went wrong" + "…"; VBox points = new VBox (false, 0); Image list_point_one = new Image (UserInterfaceHelpers.GetIcon ("list-point", 16)); Image list_point_two = new Image (UserInterfaceHelpers.GetIcon ("list-point", 16)); Image list_point_three = new Image (UserInterfaceHelpers.GetIcon ("list-point", 16)); Label label_one = new Label () { Markup = "<b>" + Controller.PreviousUrl + "</b> is the address we’ve compiled. " + "Does this look alright?", Wrap = true, Xalign = 0 }; Label label_two = new Label () { Text = "Is this computer’s Client ID known by the host?", Wrap = true, Xalign = 0 }; points.PackStart (new Label ("Please check the following:") { Xalign = 0 }, false, false, 6); HBox point_one = new HBox (false, 0); point_one.PackStart (list_point_one, false, false, 0); point_one.PackStart (label_one, true, true, 12); points.PackStart (point_one, false, false, 12); HBox point_two = new HBox (false, 0); point_two.PackStart (list_point_two, false, false, 0); point_two.PackStart (label_two, true, true, 12); points.PackStart (point_two, false, false, 12); if (warnings.Length > 0) { string warnings_markup = ""; foreach (string warning in warnings) warnings_markup += "\n<b>" + warning + "</b>"; Label label_three = new Label () { Markup = "Here’s the raw error message:" + warnings_markup, Wrap = true, Xalign = 0 }; HBox point_three = new HBox (false, 0); point_three.PackStart (list_point_three, false, false, 0); point_three.PackStart (label_three, true, true, 12); points.PackStart (point_three, false, false, 12); } points.PackStart (new Label (""), true, true, 0); Button cancel_button = new Button ("Cancel"); Button try_again_button = new Button ("Retry") { Sensitive = true }; cancel_button.Clicked += delegate { Controller.PageCancelled (); }; try_again_button.Clicked += delegate { Controller.ErrorPageCompleted (); }; AddButton (cancel_button); AddButton (try_again_button); Add (points); } if (type == PageType.StorageSetup) { Header = string.Format ("Storage type for ‘{0}’", Controller.SyncingFolder); Description = "What type of storage would you like to use?"; VBox layout_vertical = new VBox (false, 0); VBox layout_radio_buttons = new VBox (false, 0) { BorderWidth = 12 }; foreach (StorageTypeInfo storage_type in SparkleShare.Controller.FetcherAvailableStorageTypes) { RadioButton radio_button = new RadioButton (null, storage_type.Name + "\n" + storage_type.Description); (radio_button.Child as Label).Markup = string.Format( "<b>{0}</b>\n<span fgcolor=\"{1}\">{2}</span>", storage_type.Name, SparkleShare.UI.SecondaryTextColor, storage_type.Description); (radio_button.Child as Label).Xpad = 9; layout_radio_buttons.PackStart (radio_button, false, false, 9); radio_button.Group = (layout_radio_buttons.Children [0] as RadioButton).Group; } layout_vertical.PackStart (new Label (""), true, true, 0); layout_vertical.PackStart (layout_radio_buttons, false, false, 0); layout_vertical.PackStart (new Label (""), true, true, 0); Add (layout_vertical); Button cancel_button = new Button ("Cancel"); Button continue_button = new Button ("Continue"); continue_button.Clicked += delegate { int checkbox_index= 0; foreach (RadioButton radio_button in layout_radio_buttons.Children) { if (radio_button.Active) { StorageTypeInfo selected_storage_type = SparkleShare.Controller.FetcherAvailableStorageTypes [checkbox_index]; Controller.StoragePageCompleted (selected_storage_type.Type); return; } checkbox_index++; } }; cancel_button.Clicked += delegate { Controller.SyncingCancelled (); }; AddButton (cancel_button); AddButton (continue_button); } if (type == PageType.CryptoSetup || type == PageType.CryptoPassword) { if (type == PageType.CryptoSetup) { Header = string.Format ("Encryption password for ‘{0}’", Controller.SyncingFolder); Description = "Please a provide a strong password that you don’t use elsewhere."; } else { Header = string.Format ("‘{0}’ contains encrypted files", Controller.SyncingFolder); Description = "Please enter the password to see their contents."; } Label password_label = new Label ("<b>" + "Password" + "</b>") { UseMarkup = true, Xalign = 1 }; Entry password_entry = new Entry () { Xalign = 0, Visibility = false, ActivatesDefault = true }; CheckButton show_password_check_button = new CheckButton ("Make visible") { Active = false, Xalign = 0, }; Table table = new Table (2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; table.Attach (password_label, 0, 1, 0, 1); table.Attach (password_entry, 1, 2, 0, 1); table.Attach (show_password_check_button, 1, 2, 1, 2); VBox wrapper = new VBox (false, 9); wrapper.PackStart (table, true, false, 0); Image warning_image = new Image ( UserInterfaceHelpers.GetIcon ("dialog-information", 24)); Label warning_label = new Label () { Xalign = 0, Wrap = true, Text = "This password can’t be changed later, and your files can’t be recovered if it’s forgotten." }; HBox warning_layout = new HBox (false, 0); warning_layout.PackStart (warning_image, false, false, 15); warning_layout.PackStart (warning_label, true, true, 0); VBox warning_wrapper = new VBox (false, 0); warning_wrapper.PackStart (warning_layout, false, false, 15); if (type == PageType.CryptoSetup) wrapper.PackStart (warning_wrapper, false, false, 0); Button cancel_button = new Button ("Cancel"); Button continue_button = new Button ("Continue") { Sensitive = false }; Controller.UpdateCryptoSetupContinueButtonEvent += delegate (bool button_enabled) { Application.Invoke (delegate { continue_button.Sensitive = button_enabled; }); }; Controller.UpdateCryptoPasswordContinueButtonEvent += delegate (bool button_enabled) { Application.Invoke (delegate { continue_button.Sensitive = button_enabled; }); }; show_password_check_button.Toggled += delegate { password_entry.Visibility = !password_entry.Visibility; }; password_entry.Changed += delegate { if (type == PageType.CryptoSetup) Controller.CheckCryptoSetupPage (password_entry.Text); else Controller.CheckCryptoPasswordPage (password_entry.Text); }; cancel_button.Clicked += delegate { Controller.CryptoPageCancelled (); }; continue_button.Clicked += delegate { if (type == PageType.CryptoSetup) Controller.CryptoSetupPageCompleted (password_entry.Text); else Controller.CryptoPasswordPageCompleted (password_entry.Text); }; Add (wrapper); AddButton (cancel_button); AddButton (continue_button); password_entry.GrabFocus (); } if (type == PageType.Finished) { Header = "Your shared project is ready!"; Description = "You can find the files in your SparkleShare folder."; UrgencyHint = true; Button show_files_button = new Button ("Show Files"); Button finish_button = new Button ("Finish"); show_files_button.Clicked += delegate { Controller.ShowFilesClicked (); }; finish_button.Clicked += delegate { Controller.FinishPageCompleted (); }; if (warnings.Length > 0) { Image warning_image = new Image (UserInterfaceHelpers.GetIcon ("dialog-information", 24)); Label warning_label = new Label (warnings [0]) { Xalign = 0, Wrap = true }; HBox warning_layout = new HBox (false, 0); warning_layout.PackStart (warning_image, false, false, 15); warning_layout.PackStart (warning_label, true, true, 0); VBox warning_wrapper = new VBox (false, 0); warning_wrapper.PackStart (warning_layout, false, false, 0); Add (warning_wrapper); } else { Add (null); } AddButton (show_files_button); AddButton (finish_button); } }
public SparkleSetup() : base() { SecondaryTextColor = SparkleUIHelpers.GdkColorToHex(Style.Foreground(StateType.Insensitive)); SecondaryTextColorSelected = SparkleUIHelpers.GdkColorToHex( MixColors( new TreeView().Style.Foreground(StateType.Selected), new TreeView().Style.Background(StateType.Selected), 0.15 ) ); Controller.ChangePageEvent += delegate(PageType type, string [] warnings) { Application.Invoke(delegate { Reset(); switch (type) { case PageType.Setup: { Header = _("Welcome to SparkleShare!"); Description = "We'll need some info to mark your changes in the event log. " + "Don't worry, this stays between you and your peers."; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label name_label = new Label("<b>" + _("Full Name:") + "</b>") { UseMarkup = true, Xalign = 1 }; Entry name_entry = new Entry(Controller.GuessedUserName) { Xalign = 0 }; Entry email_entry = new Entry(Controller.GuessedUserEmail) { Xalign = 0 }; name_entry.Changed += delegate { Controller.CheckSetupPage(name_entry.Text, email_entry.Text); }; email_entry.Changed += delegate { Controller.CheckSetupPage(name_entry.Text, email_entry.Text); }; Label email_label = new Label("<b>" + _("Email:") + "</b>") { UseMarkup = true, Xalign = 1 }; table.Attach(name_label, 0, 1, 0, 1); table.Attach(name_entry, 1, 2, 0, 1); table.Attach(email_label, 0, 1, 1, 2); table.Attach(email_entry, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Button continue_button = new Button(_("Continue")) { Sensitive = false }; continue_button.Clicked += delegate(object o, EventArgs args) { string full_name = name_entry.Text; string email = email_entry.Text; Controller.SetupPageCompleted(full_name, email); }; AddButton(continue_button); Add(wrapper); Controller.UpdateSetupContinueButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { continue_button.Sensitive = button_enabled; }); }; Controller.CheckSetupPage(name_entry.Text, email_entry.Text); break; } case PageType.Add: { Header = _("Where's your project hosted?"); VBox layout_vertical = new VBox(false, 12); HBox layout_fields = new HBox(true, 12); VBox layout_address = new VBox(true, 0); VBox layout_path = new VBox(true, 0); ListStore store = new ListStore(typeof(Gdk.Pixbuf), typeof(string), typeof(SparklePlugin)); SparkleTreeView tree = new SparkleTreeView(store) { HeadersVisible = false }; ScrolledWindow scrolled_window = new ScrolledWindow(); scrolled_window.AddWithViewport(tree); // Icon column tree.AppendColumn("Icon", new Gtk.CellRendererPixbuf(), "pixbuf", 0); tree.Columns [0].Cells [0].Xpad = 6; // Service column TreeViewColumn service_column = new TreeViewColumn() { Title = "Service" }; CellRendererText service_cell = new CellRendererText() { Ypad = 4 }; service_column.PackStart(service_cell, true); service_column.SetCellDataFunc(service_cell, new TreeCellDataFunc(RenderServiceColumn)); foreach (SparklePlugin plugin in Controller.Plugins) { store.AppendValues( new Gdk.Pixbuf(plugin.ImagePath), "<span size=\"small\"><b>" + plugin.Name + "</b>\n" + "<span fgcolor=\"" + SecondaryTextColorSelected + "\">" + plugin.Description + "</span>" + "</span>", plugin); } tree.AppendColumn(service_column); SparkleEntry path_entry = new SparkleEntry(); SparkleEntry address_entry = new SparkleEntry(); // Select the first plugin by default TreeSelection default_selection = tree.Selection; TreePath default_path = new TreePath("0"); default_selection.SelectPath(default_path); Controller.SelectedPluginChanged(0); Controller.ChangeAddressFieldEvent += delegate(string text, string example_text, FieldState state) { Application.Invoke(delegate { address_entry.Text = text; address_entry.Sensitive = (state == FieldState.Enabled); if (string.IsNullOrEmpty(example_text)) { address_entry.ExampleText = null; } else { address_entry.ExampleText = example_text; } if (string.IsNullOrEmpty(text)) { address_entry.ExampleTextActive = true; } else { address_entry.ExampleTextActive = false; } }); }; Controller.ChangePathFieldEvent += delegate(string text, string example_text, FieldState state) { Application.Invoke(delegate { path_entry.Text = text; path_entry.Sensitive = (state == FieldState.Enabled); if (string.IsNullOrEmpty(example_text)) { path_entry.ExampleText = null; } else { path_entry.ExampleText = example_text; } if (string.IsNullOrEmpty(text)) { path_entry.ExampleTextActive = true; } else { path_entry.ExampleTextActive = false; } }); }; // Update the address field text when the selection changes tree.CursorChanged += delegate(object sender, EventArgs e) { Controller.SelectedPluginChanged(tree.SelectedRow); // TODO: Scroll to selected row when using arrow keys }; tree.Model.Foreach(new TreeModelForeachFunc(delegate(TreeModel model, TreePath path, TreeIter iter) { string address; try { address = (model.GetValue(iter, 2) as SparklePlugin).Address; } catch (NullReferenceException) { address = ""; } if (!string.IsNullOrEmpty(address) && address.Equals(Controller.PreviousAddress)) { tree.SetCursor(path, service_column, false); SparklePlugin plugin = (SparklePlugin)model.GetValue(iter, 2); if (plugin.Address != null) { address_entry.Sensitive = false; } if (plugin.Path != null) { path_entry.Sensitive = false; } // TODO: Scroll to the selection return(true); } else { return(false); } })); address_entry.Completion = new EntryCompletion(); ListStore server_store = new ListStore(typeof(string)); foreach (string host in Program.Controller.PreviousHosts) { server_store.AppendValues(host); } address_entry.Completion.Model = server_store; address_entry.Completion.TextColumn = 0; address_entry.Changed += delegate { Controller.CheckAddPage(address_entry.Text, path_entry.Text, tree.SelectedRow); }; layout_address.PackStart(new Label() { Markup = "<b>" + _("Address") + "</b>", Xalign = 0 }, true, true, 0); layout_address.PackStart(address_entry, true, true, 0); path_entry.Completion = new EntryCompletion(); ListStore folder_store = new ListStore(typeof(string)); //foreach (string host in Program.Controller.FolderPaths) // folder_store.AppendValues (host); path_entry.Completion.Model = folder_store; path_entry.Completion.TextColumn = 0; path_entry.Changed += delegate { Controller.CheckAddPage(address_entry.Text, path_entry.Text, tree.SelectedRow); }; layout_path.PackStart(new Label() { Markup = "<b>" + _("Remote Path") + "</b>", Xalign = 0 }, true, true, 0); layout_path.PackStart(path_entry, true, true, 0); layout_fields.PackStart(layout_address); layout_fields.PackStart(layout_path); layout_vertical.PackStart(new Label(""), false, false, 0); layout_vertical.PackStart(scrolled_window, true, true, 0); layout_vertical.PackStart(layout_fields, false, false, 0); Add(layout_vertical); // Cancel button Button cancel_button = new Button(_("Cancel")); cancel_button.Clicked += delegate { Close(); }; // Sync button Button add_button = new Button(_("Add")); add_button.Clicked += delegate { string server = address_entry.Text; string folder_name = path_entry.Text; Controller.AddPageCompleted(server, folder_name); }; AddButton(cancel_button); AddButton(add_button); Controller.CheckAddPage(address_entry.Text, path_entry.Text, tree.SelectedRow); break; } case PageType.Syncing: { Header = String.Format(_("Adding project ‘{0}’…"), Controller.SyncingFolder); Description = _("This may take a while.") + Environment.NewLine + _("Are you sure it’s not coffee o'clock?"); Button finish_button = new Button() { Sensitive = false, Label = _("Finish") }; Button cancel_button = new Button() { Label = _("Cancel") }; cancel_button.Clicked += delegate { Controller.SyncingCancelled(); }; AddButton(cancel_button); AddButton(finish_button); Controller.UpdateProgressBarEvent += delegate(double percentage) { Application.Invoke(delegate { this.progress_bar.Fraction = percentage / 100; }); }; if (this.progress_bar.Parent != null) { (this.progress_bar.Parent as Container).Remove(this.progress_bar); } VBox bar_wrapper = new VBox(false, 0); bar_wrapper.PackStart(this.progress_bar, false, false, 0); Add(bar_wrapper); break; } case PageType.Error: { Header = _("Something went wrong") + "…"; VBox points = new VBox(false, 0); Image list_point_one = new Image(SparkleUIHelpers.GetIcon("list-point", 16)) { }; Image list_point_two = new Image(SparkleUIHelpers.GetIcon("list-point", 16)) { }; Image list_point_three = new Image(SparkleUIHelpers.GetIcon("list-point", 16)) { }; Label label_one = new Label() { Text = "First, have you tried turning it off and on again?", Wrap = true, Xalign = 0 }; Label label_two = new Label() { Markup = "<b>" + Controller.PreviousUrl + "</b> is the address we've compiled. " + "Does this look alright?", Wrap = true, Xalign = 0 }; Label label_three = new Label() { Text = "The host needs to know who you are. Did you upload the key that's in " + "your SparkleShare folder?", Wrap = true, Xalign = 0 }; points.PackStart(new Label("Please check the following:") { Xalign = 0 }, false, false, 6); HBox point_one = new HBox(false, 0); point_one.PackStart(list_point_one, false, false, 0); point_one.PackStart(label_one, true, true, 12); points.PackStart(point_one, false, false, 12); HBox point_two = new HBox(false, 0); point_two.PackStart(list_point_two, false, false, 0); point_two.PackStart(label_two, true, true, 12); points.PackStart(point_two, false, false, 12); HBox point_three = new HBox(false, 0); point_three.PackStart(list_point_three, false, false, 0); point_three.PackStart(label_three, true, true, 12); points.PackStart(point_three, false, false, 12); points.PackStart(new Label(""), true, true, 0); Button try_again_button = new Button(_("Try Again…")) { Sensitive = true }; try_again_button.Clicked += delegate { Controller.ErrorPageCompleted(); }; AddButton(try_again_button); Add(points); break; } case PageType.Finished: { UrgencyHint = true; if (!HasToplevelFocus) { string title = String.Format(_("‘{0}’ has been successfully added"), Controller.SyncingFolder); string subtext = ""; SparkleUI.Bubbles.Controller.ShowBubble(title, subtext, null); } Header = _("Project successfully added!"); Description = _("Access the files from your SparkleShare folder."); // A button that opens the synced folder Button open_folder_button = new Button(_("Open Folder")); open_folder_button.Clicked += delegate { Program.Controller.OpenSparkleShareFolder(Controller.SyncingFolder); }; Button finish_button = new Button(_("Finish")); finish_button.Clicked += delegate { Controller.FinishedPageCompleted(); Close(); }; if (warnings != null) { Image warning_image = new Image( SparkleUIHelpers.GetIcon("dialog-warning", 24) ); Label warning_label = new Label(warnings [0]) { Xalign = 0, Wrap = true }; HBox warning_layout = new HBox(false, 0); warning_layout.PackStart(warning_image, false, false, 0); warning_layout.PackStart(warning_label, true, true, 15); VBox warning_wrapper = new VBox(false, 0); warning_wrapper.PackStart(warning_layout, false, false, 0); Add(warning_wrapper); } else { Add(null); } AddButton(open_folder_button); AddButton(finish_button); break; } case PageType.Tutorial: { switch (Controller.TutorialPageNumber) { case 1: { Header = _("What's happening next?"); Description = _("SparkleShare creates a special folder in your personal folder " + "that will keep track of your projects."); Button skip_tutorial_button = new Button(_("Skip Tutorial")); skip_tutorial_button.Clicked += delegate { Controller.TutorialSkipped(); }; Button continue_button = new Button(_("Continue")); continue_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; Image slide = SparkleUIHelpers.GetImage("tutorial-slide-1.png"); Add(slide); AddButton(skip_tutorial_button); AddButton(continue_button); break; } case 2: { Header = _("Sharing files with others"); Description = _("All files added to your project folders are synced with the host " + "automatically, as well as with your collaborators."); Button continue_button = new Button(_("Continue")); continue_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; Image slide = SparkleUIHelpers.GetImage("tutorial-slide-2.png"); Add(slide); AddButton(continue_button); break; } case 3: { Header = _("The status icon is here to help"); Description = _("It shows the syncing process status, " + "and contains links to your projects and the event log."); Button continue_button = new Button(_("Continue")); continue_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; Image slide = SparkleUIHelpers.GetImage("tutorial-slide-3.png"); Add(slide); AddButton(continue_button); break; } case 4: { Header = _("Adding projects to SparkleShare"); Description = _("Just click this button when you see it on the web, and " + "the project will be automatically added:"); Label label = new Label(_("…or select <b>‘Add Hosted Project…’</b> from the status icon menu " + "to add one by hand.")) { Wrap = true, Xalign = 0, UseMarkup = true }; Image slide = SparkleUIHelpers.GetImage("tutorial-slide-4.png"); Button finish_button = new Button(_("Finish")); finish_button.Clicked += delegate { Close(); }; VBox box = new VBox(false, 0); box.Add(slide); box.Add(label); Add(box); AddButton(finish_button); break; } } break; } } ShowAll(); }); }; }
public SparkleSetup() : base() { Controller.HideWindowEvent += delegate { Application.Invoke(delegate { HideAll(); }); }; Controller.ShowWindowEvent += delegate { Application.Invoke(delegate { ShowAll(); Present(); }); }; Controller.ChangePageEvent += delegate(PageType type, string [] warnings) { Application.Invoke(delegate { Reset(); switch (type) { case PageType.Setup: { Header = _("Welcome to SparkleShare!"); Description = "Before we get started, what's your name and email? " + "Don't worry, this information will only be visible to team members."; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label name_label = new Label("<b>" + _("Full Name:") + "</b>") { UseMarkup = true, Xalign = 1 }; Entry name_entry = new Entry(Controller.GuessedUserName) { Xalign = 0 }; Entry email_entry = new Entry(Controller.GuessedUserEmail) { Xalign = 0 }; name_entry.Changed += delegate { Controller.CheckSetupPage(name_entry.Text, email_entry.Text); }; email_entry.Changed += delegate { Controller.CheckSetupPage(name_entry.Text, email_entry.Text); }; Label email_label = new Label("<b>" + _("Email:") + "</b>") { UseMarkup = true, Xalign = 1 }; table.Attach(name_label, 0, 1, 0, 1); table.Attach(name_entry, 1, 2, 0, 1); table.Attach(email_label, 0, 1, 1, 2); table.Attach(email_entry, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Button cancel_button = new Button(_("Cancel")); cancel_button.Clicked += delegate { Controller.SetupPageCancelled(); }; Button continue_button = new Button(_("Continue")) { Sensitive = false }; continue_button.Clicked += delegate(object o, EventArgs args) { string full_name = name_entry.Text; string email = email_entry.Text; Controller.SetupPageCompleted(full_name, email); }; AddButton(cancel_button); AddButton(continue_button); Add(wrapper); Controller.UpdateSetupContinueButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { continue_button.Sensitive = button_enabled; }); }; Controller.CheckSetupPage(name_entry.Text, email_entry.Text); break; } case PageType.Add: { Header = _("Where's your project hosted?"); VBox layout_vertical = new VBox(false, 12); HBox layout_fields = new HBox(true, 12); VBox layout_address = new VBox(true, 0); VBox layout_path = new VBox(true, 0); ListStore store = new ListStore(typeof(Gdk.Pixbuf), typeof(string), typeof(SparklePlugin)); SparkleTreeView tree = new SparkleTreeView(store) { HeadersVisible = false }; ScrolledWindow scrolled_window = new ScrolledWindow(); scrolled_window.AddWithViewport(tree); // Icon column tree.AppendColumn("Icon", new Gtk.CellRendererPixbuf(), "pixbuf", 0); tree.Columns [0].Cells [0].Xpad = 6; // Service column TreeViewColumn service_column = new TreeViewColumn() { Title = "Service" }; CellRendererText service_cell = new CellRendererText() { Ypad = 4 }; service_column.PackStart(service_cell, true); service_column.SetCellDataFunc(service_cell, new TreeCellDataFunc(RenderServiceColumn)); foreach (SparklePlugin plugin in Controller.Plugins) { store.AppendValues( new Gdk.Pixbuf(plugin.ImagePath), "<span size=\"small\"><b>" + plugin.Name + "</b>\n" + "<span fgcolor=\"" + SecondaryTextColorSelected + "\">" + plugin.Description + "</span>" + "</span>", plugin); } tree.AppendColumn(service_column); Entry address_entry = new Entry() { Text = Controller.PreviousAddress, Sensitive = (Controller.SelectedPlugin.Address == null) }; Entry path_entry = new Entry() { Text = Controller.PreviousPath, Sensitive = (Controller.SelectedPlugin.Path == null) }; Label address_example = new Label() { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + Controller.SelectedPlugin.AddressExample + "</span>" }; Label path_example = new Label() { Xalign = 0, UseMarkup = true, Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + Controller.SelectedPlugin.PathExample + "</span>" }; // Select the first plugin by default TreeSelection default_selection = tree.Selection; TreePath default_path = new TreePath("0"); default_selection.SelectPath(default_path); Controller.SelectedPluginChanged(0); Controller.ChangeAddressFieldEvent += delegate(string text, string example_text, FieldState state) { Application.Invoke(delegate { address_entry.Text = text; address_entry.Sensitive = (state == FieldState.Enabled); address_example.Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.ChangePathFieldEvent += delegate(string text, string example_text, FieldState state) { Application.Invoke(delegate { path_entry.Text = text; path_entry.Sensitive = (state == FieldState.Enabled); path_example.Markup = "<span size=\"small\" fgcolor=\"" + SecondaryTextColor + "\">" + example_text + "</span>"; }); }; Controller.CheckAddPage(address_entry.Text, path_entry.Text, 1); // Update the address field text when the selection changes tree.CursorChanged += delegate(object sender, EventArgs e) { Controller.SelectedPluginChanged(tree.SelectedRow); // TODO: Scroll to selected row when using arrow keys }; tree.Model.Foreach(new TreeModelForeachFunc(delegate(TreeModel model, TreePath path, TreeIter iter) { string address; try { address = (model.GetValue(iter, 2) as SparklePlugin).Address; } catch (NullReferenceException) { address = ""; } if (!string.IsNullOrEmpty(address) && address.Equals(Controller.PreviousAddress)) { tree.SetCursor(path, service_column, false); SparklePlugin plugin = (SparklePlugin)model.GetValue(iter, 2); if (plugin.Address != null) { address_entry.Sensitive = false; } if (plugin.Path != null) { path_entry.Sensitive = false; } // TODO: Scroll to the selection return(true); } else { return(false); } })); address_entry.Changed += delegate { Controller.CheckAddPage(address_entry.Text, path_entry.Text, tree.SelectedRow); }; layout_address.PackStart(new Label() { Markup = "<b>" + _("Address:") + "</b>", Xalign = 0 }, true, true, 0); layout_address.PackStart(address_entry, false, false, 0); layout_address.PackStart(address_example, false, false, 0); path_entry.Changed += delegate { Controller.CheckAddPage(address_entry.Text, path_entry.Text, tree.SelectedRow); }; layout_path.PackStart(new Label() { Markup = "<b>" + _("Remote Path:") + "</b>", Xalign = 0 }, true, true, 0); layout_path.PackStart(path_entry, false, false, 0); layout_path.PackStart(path_example, false, false, 0); layout_fields.PackStart(layout_address); layout_fields.PackStart(layout_path); layout_vertical.PackStart(new Label(""), false, false, 0); layout_vertical.PackStart(scrolled_window, true, true, 0); layout_vertical.PackStart(layout_fields, false, false, 0); Add(layout_vertical); // Cancel button Button cancel_button = new Button(_("Cancel")); cancel_button.Clicked += delegate { Controller.PageCancelled(); }; Button add_button = new Button(_("Add")); add_button.Clicked += delegate { string server = address_entry.Text; string folder_name = path_entry.Text; Controller.AddPageCompleted(server, folder_name); }; Controller.UpdateAddProjectButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { add_button.Sensitive = button_enabled; }); }; CheckButton check_button = new CheckButton("Fetch prior history") { Active = false }; check_button.Toggled += delegate { Controller.HistoryItemChanged(check_button.Active); }; AddOption(check_button); AddButton(cancel_button); AddButton(add_button); break; } case PageType.Invite: { Header = _("You've received an invite!"); Description = _("Do you want to add this project to SparkleShare?"); Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; Label address_label = new Label(_("Address:")) { Xalign = 1 }; Label path_label = new Label(_("Remote Path:")) { Xalign = 1 }; Label address_value = new Label("<b>" + Controller.PendingInvite.Address + "</b>") { UseMarkup = true, Xalign = 0 }; Label path_value = new Label("<b>" + Controller.PendingInvite.RemotePath + "</b>") { UseMarkup = true, Xalign = 0 }; table.Attach(address_label, 0, 1, 0, 1); table.Attach(address_value, 1, 2, 0, 1); table.Attach(path_label, 0, 1, 1, 2); table.Attach(path_value, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Button cancel_button = new Button(_("Cancel")); cancel_button.Clicked += delegate { Controller.PageCancelled(); }; Button add_button = new Button(_("Add")); add_button.Clicked += delegate { Controller.InvitePageCompleted(); }; AddButton(cancel_button); AddButton(add_button); Add(wrapper); break; } case PageType.Syncing: { Header = String.Format(_("Adding project ‘{0}’…"), Controller.SyncingFolder); Description = _("This may either take a short or a long time depending on the project's size."); this.progress_bar.Fraction = Controller.ProgressBarPercentage / 100; Button finish_button = new Button() { Sensitive = false, Label = _("Finish") }; Button cancel_button = new Button() { Label = _("Cancel") }; cancel_button.Clicked += delegate { Controller.SyncingCancelled(); }; AddButton(cancel_button); AddButton(finish_button); Controller.UpdateProgressBarEvent += delegate(double percentage) { Application.Invoke(delegate { this.progress_bar.Fraction = percentage / 100; }); }; if (this.progress_bar.Parent != null) { (this.progress_bar.Parent as Container).Remove(this.progress_bar); } VBox bar_wrapper = new VBox(false, 0); bar_wrapper.PackStart(this.progress_bar, false, false, 15); Add(bar_wrapper); break; } case PageType.Error: { Header = _("Something went wrong") + "…"; VBox points = new VBox(false, 0); Image list_point_one = new Image(SparkleUIHelpers.GetIcon("list-point", 16)); Image list_point_two = new Image(SparkleUIHelpers.GetIcon("list-point", 16)); Image list_point_three = new Image(SparkleUIHelpers.GetIcon("list-point", 16)); Label label_one = new Label() { Text = "Is the host online?", Wrap = true, Xalign = 0 }; Label label_two = new Label() { Markup = "<b>" + Controller.PreviousUrl + "</b> is the address we've compiled. " + "Does this look alright?", Wrap = true, Xalign = 0 }; Label label_three = new Label() { Text = "The host needs to know who you are. Did you upload the key that's in " + "your SparkleShare folder?", Wrap = true, Xalign = 0 }; points.PackStart(new Label("Please check the following:") { Xalign = 0 }, false, false, 6); HBox point_one = new HBox(false, 0); point_one.PackStart(list_point_one, false, false, 0); point_one.PackStart(label_one, true, true, 12); points.PackStart(point_one, false, false, 12); HBox point_two = new HBox(false, 0); point_two.PackStart(list_point_two, false, false, 0); point_two.PackStart(label_two, true, true, 12); points.PackStart(point_two, false, false, 12); HBox point_three = new HBox(false, 0); point_three.PackStart(list_point_three, false, false, 0); point_three.PackStart(label_three, true, true, 12); points.PackStart(point_three, false, false, 12); points.PackStart(new Label(""), true, true, 0); Button cancel_button = new Button(_("Cancel")); cancel_button.Clicked += delegate { Controller.PageCancelled(); }; Button try_again_button = new Button(_("Try Again…")) { Sensitive = true }; try_again_button.Clicked += delegate { Controller.ErrorPageCompleted(); }; AddButton(cancel_button); AddButton(try_again_button); Add(points); break; } case PageType.CryptoSetup: { Header = "Set up file encryption"; Description = "This project is supposed to be encrypted, but it doesn't yet have a password set. Please provide one below."; Label password_label = new Label("<b>" + _("Password:"******"</b>") { UseMarkup = true, Xalign = 1 }; Entry password_entry = new Entry() { Xalign = 0, Visibility = false }; CheckButton show_password_check_button = new CheckButton("Show password") { Active = false, Xalign = 0 }; show_password_check_button.Toggled += delegate { password_entry.Visibility = !password_entry.Visibility; }; password_entry.Changed += delegate { Controller.CheckCryptoSetupPage(password_entry.Text); }; Button continue_button = new Button("Continue") { Sensitive = false }; continue_button.Clicked += delegate { Controller.CryptoSetupPageCompleted(password_entry.Text); }; Button cancel_button = new Button("Cancel"); cancel_button.Clicked += delegate { Controller.CryptoPageCancelled(); }; Controller.UpdateCryptoSetupContinueButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { continue_button.Sensitive = button_enabled; }); }; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; table.Attach(password_label, 0, 1, 0, 1); table.Attach(password_entry, 1, 2, 0, 1); table.Attach(show_password_check_button, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Image warning_image = new Image( SparkleUIHelpers.GetIcon("dialog-information", 24) ); Label warning_label = new Label() { Xalign = 0, Wrap = true, Text = "This password can't be changed later, and your files can't be recovered if it's forgotten." }; HBox warning_layout = new HBox(false, 0); warning_layout.PackStart(warning_image, false, false, 15); warning_layout.PackStart(warning_label, true, true, 0); VBox warning_wrapper = new VBox(false, 0); warning_wrapper.PackStart(warning_layout, false, false, 15); wrapper.PackStart(warning_wrapper, false, false, 0); Add(wrapper); AddButton(cancel_button); AddButton(continue_button); break; } case PageType.CryptoPassword: { Header = "This project contains encrypted files"; Description = "Please enter the password to see their contents."; Label password_label = new Label("<b>" + _("Password:"******"</b>") { UseMarkup = true, Xalign = 1 }; Entry password_entry = new Entry() { Xalign = 0, Visibility = false }; CheckButton show_password_check_button = new CheckButton("Show password") { Active = false, Xalign = 0 }; show_password_check_button.Toggled += delegate { password_entry.Visibility = !password_entry.Visibility; }; password_entry.Changed += delegate { Controller.CheckCryptoPasswordPage(password_entry.Text); }; Button continue_button = new Button("Continue") { Sensitive = false }; continue_button.Clicked += delegate { Controller.CryptoPasswordPageCompleted(password_entry.Text); }; Button cancel_button = new Button("Cancel"); cancel_button.Clicked += delegate { Controller.CryptoPageCancelled(); }; Controller.UpdateCryptoPasswordContinueButtonEvent += delegate(bool button_enabled) { Application.Invoke(delegate { continue_button.Sensitive = button_enabled; }); }; Table table = new Table(2, 3, true) { RowSpacing = 6, ColumnSpacing = 6 }; table.Attach(password_label, 0, 1, 0, 1); table.Attach(password_entry, 1, 2, 0, 1); table.Attach(show_password_check_button, 1, 2, 1, 2); VBox wrapper = new VBox(false, 9); wrapper.PackStart(table, true, false, 0); Add(wrapper); AddButton(cancel_button); AddButton(continue_button); break; } case PageType.Finished: { UrgencyHint = true; if (!HasToplevelFocus) { string title = _("Your shared project is ready!"); string subtext = _("You can find the files in your SparkleShare folder."); SparkleUI.Bubbles.Controller.ShowBubble(title, subtext, null); } Header = _("Your shared project is ready!"); Description = _("You can find it in your SparkleShare folder"); // A button that opens the synced folder Button open_folder_button = new Button(string.Format("Open {0}", System.IO.Path.GetFileName(Controller.PreviousPath))); open_folder_button.Clicked += delegate { Controller.OpenFolderClicked(); }; Button finish_button = new Button(_("Finish")); finish_button.Clicked += delegate { Controller.FinishPageCompleted(); }; if (warnings.Length > 0) { Image warning_image = new Image( SparkleUIHelpers.GetIcon("dialog-information", 24) ); Label warning_label = new Label(warnings [0]) { Xalign = 0, Wrap = true }; HBox warning_layout = new HBox(false, 0); warning_layout.PackStart(warning_image, false, false, 15); warning_layout.PackStart(warning_label, true, true, 0); VBox warning_wrapper = new VBox(false, 0); warning_wrapper.PackStart(warning_layout, false, false, 0); Add(warning_wrapper); } else { Add(null); } AddButton(open_folder_button); AddButton(finish_button); break; } case PageType.Tutorial: { switch (Controller.TutorialPageNumber) { case 1: { Header = _("What's happening next?"); Description = "SparkleShare creates a special folder on your computer " + "that will keep track of your projects."; Button skip_tutorial_button = new Button(_("Skip Tutorial")); skip_tutorial_button.Clicked += delegate { Controller.TutorialSkipped(); }; Button continue_button = new Button(_("Continue")); continue_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; Image slide = SparkleUIHelpers.GetImage("tutorial-slide-1.png"); Add(slide); AddButton(skip_tutorial_button); AddButton(continue_button); break; } case 2: { Header = _("Sharing files with others"); Description = _("All files added to your project folders are synced automatically with " + "the host and your team members."); Button continue_button = new Button(_("Continue")); continue_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; Image slide = SparkleUIHelpers.GetImage("tutorial-slide-2.png"); Add(slide); AddButton(continue_button); break; } case 3: { Header = _("The status icon is here to help"); Description = _("It shows the syncing progress, provides easy access to " + "your projects and let's you view recent changes."); Button continue_button = new Button(_("Continue")); continue_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; Image slide = SparkleUIHelpers.GetImage("tutorial-slide-3.png"); Add(slide); AddButton(continue_button); break; } case 4: { Header = _("Adding projects to SparkleShare"); Description = _("You can do this through the status icon menu, or by clicking " + "magic buttons on webpages that look like this:"); Image slide = SparkleUIHelpers.GetImage("tutorial-slide-4.png"); Button finish_button = new Button(_("Finish")); finish_button.Clicked += delegate { Controller.TutorialPageCompleted(); }; CheckButton check_button = new CheckButton("Add SparkleShare to startup items") { Active = true }; check_button.Toggled += delegate { Controller.StartupItemChanged(check_button.Active); }; Add(slide); AddOption(check_button); AddButton(finish_button); break; } } break; } } ShowAll(); }); }; }