[blam/gtk-builder] Bring in the preferences dialog



commit d73e76dd6cbfdd73d63fc0abf5d71a480ed7f0be
Author: Carlos Martín Nieto <cmn dwim me>
Date:   Fri Oct 11 12:42:24 2013 +0200

    Bring in the preferences dialog
    
    Currently only the toggables work

 blam.csproj    |    1 +
 src/Blam.cs    |    7 +
 src/Conf.cs    |    9 +-
 src/Dialogs.cs |   59 ++++++++-
 src/blam.ui    |    4 +-
 src/dialogs.ui |  394 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 467 insertions(+), 7 deletions(-)
---
diff --git a/blam.csproj b/blam.csproj
index 66d06bf..707d3e5 100644
--- a/blam.csproj
+++ b/blam.csproj
@@ -125,6 +125,7 @@
     <Compile Include="src\EntryExtensions.cs" />
     <Compile Include="src\ClipboardExtensions.cs" />
     <Compile Include="src\MenuItemExtensions.cs" />
+    <Compile Include="src\Toggable.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/src/Blam.cs b/src/Blam.cs
index e5ad61e..b1eda68 100644
--- a/src/Blam.cs
+++ b/src/Blam.cs
@@ -104,6 +104,13 @@ namespace Blam
                                }
                        });
 
+                       item = bld.GetObject<MenuItem>("menu-preferences");
+                       item.ObserveActivated().Subscribe(obj => {
+                               using (var dialog = new PreferencesDialog(MainWindow)) {
+                                       dialog.Run();
+                               }
+                       });
+
                        item = bld.GetObject<MenuItem>("menu-about");
                        Observable.Merge(
                                item.ObserveActivated().Select(_ => Unit.Default),
diff --git a/src/Conf.cs b/src/Conf.cs
index aa6d20a..ef2d6be 100644
--- a/src/Conf.cs
+++ b/src/Conf.cs
@@ -20,7 +20,7 @@ namespace Blam
                        client = new GConf.Client();
                }
 
-               static string fullKey(string key)
+               public static string FullKey(string key)
                {
                        if (key.StartsWith("/")) {
                                return key;
@@ -33,13 +33,18 @@ namespace Blam
                {
                        T res;
                        try {
-                               res = (T) client.Get(fullKey(key));
+                               res = (T) client.Get(FullKey(key));
                        } catch {
                                res = def;
                        }
 
                        return res;
                }
+
+               public static void Set(string key, object value)
+               {
+                       client.Set(FullKey(key), value);
+               }
        }
 }
 
diff --git a/src/Dialogs.cs b/src/Dialogs.cs
index 625688f..59ce904 100644
--- a/src/Dialogs.cs
+++ b/src/Dialogs.cs
@@ -232,13 +232,66 @@ namespace Blam
                        var clickSub = clickable.Subscribe(v => button.Sensitive = v);
                        var actSub = activation.Subscribe(_ => button.Click());
 
-                       int res = dialog.Run();
-                       dialog.Hide();
+                       var res = base.Run() == ResponseType.Ok;
 
                        clickSub.Dispose();
                        actSub.Dispose();
 
-                       return res == (int)ResponseType.Ok;
+                       return res;
+               }
+       }
+
+       class PreferencesDialog : Modal
+       {
+               public class Preference {
+                       public static string REVERSE_ENTRIES   = "behaviour/reverse_entries";
+                       public static string REFRESH_AT_START  = "behaviour/refresh_at_start";
+                       public static string AUTO_REFRESH      = "behaviour/auto_refresh";
+                       public static string AUTO_REFRESH_RATE = "behaviour/auto_refresh_rate";
+                       public static string IGNORE_SSL_ERR    = "behaviour/ignore_ssl_err";
+                       public static string BEHAVIOUR_PATH    = Conf.FullKey("behaviour");
+                       public static string FONT_PATH         = "/desktop/gnome/interface";
+                       public static string VARIABLE_FONT     = "/desktop/gnome/interface/font_name";
+                       public static string FIXED_FONT        = 
"/desktop/gnome/interface/monospace_font_name";
+                       public static string THEME             = "ui/theme";
+                       public static string SHOW_ITEM_LIST    = "ui/show_item_list";
+                       public static string MARK_ITEMS_READ_TIMEOUT = "behaviour/set_item_read_timeout";
+                       public static string MARK_ITEMS_READ    = "behaviour/set_item_read";
+               }
+
+               Togglable reverseEntries;
+               Togglable autoRefresh;
+               SpinButton autoRefreshInterval;
+               Togglable ignoreCertErrors;
+               Togglable refreshOnStartup;
+               ComboBox theme;
+               Togglable markReadDelay;
+               SpinButton markReadDelayTime;
+
+               public PreferencesDialog(Gtk.Window parent)
+                       : base(parent, "preferences")
+               {
+                       reverseEntries = new Togglable(bld, "reverse-entries", Preference.REVERSE_ENTRIES);
+                       autoRefresh = new Togglable(bld, "auto-refresh", Preference.AUTO_REFRESH);
+                       ignoreCertErrors = new Togglable(bld, "ignore-cert-errors", 
Preference.IGNORE_SSL_ERR);
+                       refreshOnStartup = new Togglable(bld, "refresh-on-startup", 
Preference.REFRESH_AT_START);
+                       markReadDelay = new Togglable(bld, "mark-read-delay", Preference.MARK_ITEMS_READ);
+               }
+
+               public new void Run()
+               {
+                       var toggles = Observable.Merge(
+                               reverseEntries.Toggle,
+                               autoRefresh.Toggle,
+                               ignoreCertErrors.Toggle,
+                               refreshOnStartup.Toggle,
+                               markReadDelay.Toggle);
+
+                       var sub = toggles.Subscribe(kv => Conf.Set(kv.Key, kv.Value));
+
+                       base.Run();
+
+                       sub.Dispose();
                }
        }
 
diff --git a/src/blam.ui b/src/blam.ui
index eadf4c6..c3dc5d3 100644
--- a/src/blam.ui
+++ b/src/blam.ui
@@ -54,8 +54,8 @@
                       </object>
                     </child>
                     <child>
-                      <object class="GtkImageMenuItem" id="imagemenuitem4">
-                        <property name="label">gtk-save-as</property>
+                      <object class="GtkImageMenuItem" id="menu-preferences">
+                        <property name="label">gtk-preferences</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_action_appearance">False</property>
diff --git a/src/dialogs.ui b/src/dialogs.ui
index 5e583ea..334b6e1 100644
--- a/src/dialogs.ui
+++ b/src/dialogs.ui
@@ -562,6 +562,400 @@
       <action-widget response="-10">edit-channel-apply</action-widget>
     </action-widgets>
   </object>
+  <object class="GtkDialog" id="preferences">
+    <property name="can_focus">False</property>
+    <property name="border_width">6</property>
+    <property name="title" translatable="yes">Preferences</property>
+    <property name="resizable">False</property>
+    <property name="type_hint">dialog</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox4">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">12</property>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area4">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="closeButton">
+                <property name="label">gtk-close</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_action_appearance">False</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox11">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="border_width">6</property>
+            <property name="spacing">12</property>
+            <child>
+              <object class="GtkVBox" id="vbox13">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="spacing">6</property>
+                <child>
+                  <object class="GtkLabel" id="boldBehaviourLabel">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Behavior</property>
+                    <property name="use_markup">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="hbox10">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkLabel" id="label22">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">    </property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="reverse-entries">
+                        <property name="label" translatable="yes">_Newest entries at the top</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="hbox15">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkLabel" id="label28">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">    </property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkHBox" id="hbox16">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <object class="GtkCheckButton" id="auto-refresh">
+                            <property name="label" translatable="yes">_Automatically refresh all channels 
every</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkSpinButton" id="auto-refresh-interval">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="invisible_char">●</property>
+                            <property name="invisible_char_set">True</property>
+                            <property name="primary_icon_activatable">False</property>
+                            <property name="secondary_icon_activatable">False</property>
+                            <property name="primary_icon_sensitive">True</property>
+                            <property name="secondary_icon_sensitive">True</property>
+                            <property name="adjustment"/>
+                            <property name="climb_rate">1</property>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkLabel" id="label29">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="label" translatable="yes">minutes</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="hbox18">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkLabel" id="label36">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">    </property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="ignore-cert-errors">
+                        <property name="label" translatable="yes">_Ignore SSL certificate check 
errors</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="hbox4">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkLabel" id="label8">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">    </property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="refresh-on-startup">
+                        <property name="label" translatable="yes">Refresh feeds on startup</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">4</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="boldThemeLabel">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">0</property>
+                    <property name="xpad">6</property>
+                    <property name="label" translatable="yes">Theme</property>
+                    <property name="use_markup">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">5</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="hbox17">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkLabel" id="label31">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">    </property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkComboBox" id="theme">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="border_width">1</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">6</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="hbox3">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <object class="GtkCheckButton" id="mark-read-delay">
+                        <property name="label" translatable="yes">_Mark items read after</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkSpinButton" id="mark-read-delay-time">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="invisible_char">●</property>
+                        <property name="invisible_char_set">True</property>
+                        <property name="primary_icon_activatable">False</property>
+                        <property name="secondary_icon_activatable">False</property>
+                        <property name="primary_icon_sensitive">True</property>
+                        <property name="secondary_icon_sensitive">True</property>
+                        <property name="adjustment"/>
+                      </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label9">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="label" translatable="yes">seconds</property>
+                      </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">7</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-7">closeButton</action-widget>
+    </action-widgets>
+  </object>
   <object class="GtkDialog" id="remove-channel">
     <property name="can_focus">False</property>
     <property name="border_width">5</property>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]