]> Pileus Git - aweather/commitdiff
Convert AWeatherGui to a GtkBuildable
authorAndy Spencer <andy753421@gmail.com>
Sun, 2 May 2010 08:43:18 +0000 (08:43 +0000)
committerAndy Spencer <andy753421@gmail.com>
Sun, 2 May 2010 08:43:18 +0000 (08:43 +0000)
When editing the glade file, GLADE_CATALOG_PATH should be set to the
`data' directory.

data/aweather.xml [new file with mode: 0644]
data/main.ui.in
src/aweather-gui.c
src/main.c

diff --git a/data/aweather.xml b/data/aweather.xml
new file mode 100644 (file)
index 0000000..0616ab3
--- /dev/null
@@ -0,0 +1,16 @@
+<glade-catalog name="AWeather"
+              supports="gtkbuilder"
+               depends="gtk+"> 
+  <glade-widget-classes> 
+    <glade-widget-class name="AWeatherGui" generic-name="Gui" title="Gui" parent="GtkWindow"> 
+    </glade-widget-class> 
+    <glade-widget-class name="GisViewer" generic-name="Viewer" title="Viewer" parent="GtkDrawingArea"> 
+    </glade-widget-class> 
+    <glade-widget-class name="GisOpenGL" generic-name="OpenGL" title="OpenGL" parent="GisViewer"> 
+    </glade-widget-class> 
+  </glade-widget-classes> 
+  <glade-widget-group name="aweather-widgets" title="AWeather Widgets"> 
+    <glade-widget-class-ref name="AWeatherGui"/> 
+    <glade-widget-class-ref name="GisOpenGL"/> 
+  </glade-widget-group> 
+</glade-catalog> 
index 4588d3a959a9ff751712d9c4d693d40e38b5e625..edcc377dae0c3fa260717a7444c5fb72f7cdd8d6 100644 (file)
@@ -1,6 +1,7 @@
 <?xml version="1.0"?>
 <interface>
   <requires lib="gtk+" version="2.16"/>
+  <!-- interface-requires AWeather 0.0 -->
   <!-- interface-naming-policy project-wide -->
   <object class="GtkListStore" id="plugins">
     <columns>
@@ -28,7 +29,7 @@
       <column type="gchararray"/>
     </columns>
   </object>
-  <object class="GtkWindow" id="main_window">
+  <object class="AWeatherGui" id="main_window">
     <property name="title" translatable="yes">AWeather</property>
     <child>
       <object class="GtkVBox" id="main_body">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <child>
-                  <object class="GtkLabel" id="main_placeholder">
+                  <object class="GisOpenGL" id="main_viewer">
+                    <property name="width_request">600</property>
+                    <property name="height_request">400</property>
                     <property name="visible">True</property>
-                    <property name="label" translatable="yes">placeholder
-(it's buggy with blank placeholders)</property>
-                    <property name="justify">center</property>
                   </object>
                   <packing>
                     <property name="resize">False</property>
     <property name="border_width">5</property>
     <property name="title" translatable="yes">Preferences - AWeather</property>
     <property name="type_hint">normal</property>
-    <property name="transient_for">main_window</property>
     <property name="has_separator">False</property>
     <signal name="response" handler="gtk_widget_hide" object="prefs_window"/>
     <signal name="delete_event" handler="gtk_widget_hide_on_delete"/>
     <property name="title" translatable="yes">About - AWeather</property>
     <property name="window_position">center-on-parent</property>
     <property name="type_hint">dialog</property>
-    <property name="transient_for">main_window</property>
     <property name="has_separator">False</property>
     <property name="program_name">AWeather</property>
     <property name="version">@VERSION@</property>
index f93a2ea8c6f0ee9d864c24e312681f3ab4c08985..abc0a687dee2ffd6fbbf4bc7beafbaadd7cf086d 100644 (file)
@@ -347,32 +347,22 @@ void aweather_gui_deattach_plugin(AWeatherGui *self, const gchar *name)
 /****************
  * GObject code *
  ****************/
-G_DEFINE_TYPE(AWeatherGui, aweather_gui, GTK_TYPE_WINDOW);
-static void aweather_gui_init(AWeatherGui *self)
+static void aweather_gui_parser_finished(GtkBuildable *_self, GtkBuilder *builder)
 {
-       g_debug("AWeatherGui: init");
+       g_debug("AWeatherGui: parser finished");
+       AWeatherGui *self = AWEATHER_GUI(_self);
+       self->builder = builder;
 
        /* Simple things */
        gchar *config   = g_build_filename(g_get_user_config_dir(), PACKAGE, "config.ini", NULL);
        gchar *defaults = g_build_filename(PKGDATADIR, "defaults.ini", NULL);
        self->prefs   = gis_prefs_new(config, defaults);
        self->plugins = gis_plugins_new(PLUGINSDIR, self->prefs);
-       self->viewer  = gis_opengl_new(self->plugins, self->prefs);
+       self->viewer  = GIS_VIEWER(aweather_gui_get_widget(self, "main_viewer"));
+       gis_viewer_setup(self->viewer, self->plugins, self->prefs);
        g_free(config);
        g_free(defaults);
 
-       /* Setup window */
-       self->builder = gtk_builder_new();
-       GError *error = NULL;
-       if (!gtk_builder_add_from_file(self->builder, PKGDATADIR "/main.ui", &error))
-               g_error("Failed to create gtk builder: %s", error->message);
-       gtk_widget_reparent(aweather_gui_get_widget(self, "main_body"), GTK_WIDGET(self));
-       GtkWidget *paned = aweather_gui_get_widget(self, "main_paned");
-       gtk_widget_destroy(gtk_paned_get_child1(GTK_PANED(paned)));
-       gtk_paned_pack1(GTK_PANED(paned), GTK_WIDGET(self->viewer), TRUE, FALSE);
-       gtk_widget_set_size_request(GTK_WIDGET(self->viewer), 600, 400);
-       gtk_widget_show_all(GTK_WIDGET(self));
-
        /* Plugins */
        GtkTreeIter iter;
        self->gtk_plugins = GTK_LIST_STORE(aweather_gui_get_object(self, "plugins"));
@@ -401,10 +391,22 @@ static void aweather_gui_init(AWeatherGui *self)
                        G_CALLBACK(gtk_toggle_action_set_active),
                        aweather_gui_get_object(self, "offline"));
 }
+static void aweather_gui_buildable_init(GtkBuildableIface *iface)
+{
+       iface->parser_finished = aweather_gui_parser_finished;
+}
+G_DEFINE_TYPE_WITH_CODE(AWeatherGui, aweather_gui, GTK_TYPE_WINDOW,
+               G_IMPLEMENT_INTERFACE(GTK_TYPE_BUILDABLE,
+                       aweather_gui_buildable_init));
+static void aweather_gui_init(AWeatherGui *self)
+{
+       g_debug("AWeatherGui: init");
+       /* Do all the real work in parser_finished */
+}
 static GObject *aweather_gui_constructor(GType gtype, guint n_properties,
                GObjectConstructParam *properties)
 {
-       g_debug("aweather_gui: constructor");
+       g_debug("AWeatherGui: constructor");
        GObjectClass *parent_class = G_OBJECT_CLASS(aweather_gui_parent_class);
        return parent_class->constructor(gtype, n_properties, properties);
 }
@@ -430,7 +432,6 @@ static void aweather_gui_finalize(GObject *_self)
 {
        g_debug("AWeatherGui: finalize");
        G_OBJECT_CLASS(aweather_gui_parent_class)->finalize(_self);
-       gtk_main_quit();
 
 }
 static void aweather_gui_class_init(AWeatherGuiClass *klass)
index 5f664aa5b78c5f00f65d259c3b30b6af10f170e2..63c5d939cb7873d5efc8bb2adfa6939db3586fb3 100644 (file)
@@ -103,7 +103,12 @@ int main(int argc, char *argv[])
 
        /* Set up AWeather */
        gdk_threads_enter();
-       AWeatherGui *gui = aweather_gui_new();
+       GIS_TYPE_OPENGL; // Pre-load the type for gtkbuilder
+       GtkBuilder *builder = gtk_builder_new();
+       if (!gtk_builder_add_from_file(builder, PKGDATADIR "/main.ui", &error))
+               g_error("Failed to create gtk builder: %s", error->message);
+       AWeatherGui *gui = AWEATHER_GUI(gtk_builder_get_object(builder, "main_window"));
+       g_signal_connect(gui, "destroy", gtk_main_quit, NULL);
 
        gint     prefs_debug   = gis_prefs_get_integer(gui->prefs, "aweather/log_level", NULL);
        gchar   *prefs_site    = gis_prefs_get_string(gui->prefs,  "aweather/initial_site", NULL);