On Fri, Jan 13, 2017 at 07:11:09PM -0200, Eduardo Lima (Etrunko) wrote: > Signed-off-by: Eduardo Lima (Etrunko) <etrunko@xxxxxxxxxx> > --- > src/remote-viewer-iso-list-dialog.c | 205 ++++++++++++++++++++++++++++- > src/resources/ui/remote-viewer-iso-list.ui | 5 +- > 2 files changed, 206 insertions(+), 4 deletions(-) > > diff --git a/src/remote-viewer-iso-list-dialog.c b/src/remote-viewer-iso-list-dialog.c > index 858719c..00371ff 100644 > --- a/src/remote-viewer-iso-list-dialog.c > +++ b/src/remote-viewer-iso-list-dialog.c > @@ -20,12 +20,16 @@ > > #include <config.h> > > +#include <stdlib.h> > #include <glib/gi18n.h> > > #include "remote-viewer-iso-list-dialog.h" > #include "virt-viewer-util.h" > #include "ovirt-foreign-menu.h" > > +static void ovirt_foreign_menu_iso_name_changed(OvirtForeignMenu *foreign_menu, GAsyncResult *result, RemoteViewerISOListDialog *self); > +static void remote_viewer_iso_list_dialog_show_error(RemoteViewerISOListDialog *self, gchar *message); > + > G_DEFINE_TYPE(RemoteViewerISOListDialog, remote_viewer_iso_list_dialog, GTK_TYPE_DIALOG) > > #define DIALOG_PRIVATE(o) \ > @@ -33,17 +37,32 @@ G_DEFINE_TYPE(RemoteViewerISOListDialog, remote_viewer_iso_list_dialog, GTK_TYPE > > struct _RemoteViewerISOListDialogPrivate > { > + GtkListStore *list_store; > GtkWidget *stack; > + GtkWidget *tree_view; > OvirtForeignMenu *foreign_menu; > }; > > +enum RemoteViewerISOListDialogModel > +{ > + ISO_IS_ACTIVE = 0, > + ISO_NAME, > + FONT_WEIGHT, > +}; > + > +void remote_viewer_iso_list_dialog_toggled(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data); > +void remote_viewer_iso_list_dialog_row_activated(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer user_data); > + > static void > remote_viewer_iso_list_dialog_dispose(GObject *object) > { > RemoteViewerISOListDialog *self = REMOTE_VIEWER_ISO_LIST_DIALOG(object); > RemoteViewerISOListDialogPrivate *priv = self->priv; > > - g_clear_object(&priv->foreign_menu); > + if (priv->foreign_menu) { > + g_signal_handlers_disconnect_by_data(priv->foreign_menu, object); > + g_clear_object(&priv->foreign_menu); > + } > G_OBJECT_CLASS(remote_viewer_iso_list_dialog_parent_class)->dispose(object); > } > > @@ -58,6 +77,74 @@ remote_viewer_iso_list_dialog_class_init(RemoteViewerISOListDialogClass *klass) > } > > static void > +remote_viewer_iso_list_dialog_show_files(RemoteViewerISOListDialog *self) > +{ > + RemoteViewerISOListDialogPrivate *priv = self->priv = DIALOG_PRIVATE(self); > + gtk_stack_set_visible_child_full(GTK_STACK(priv->stack), "iso-list", > + GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT); > + gtk_dialog_set_response_sensitive(GTK_DIALOG(self), GTK_RESPONSE_NONE, TRUE); > +} > + > +static void > +remote_viewer_iso_list_dialog_foreach(char *name, RemoteViewerISOListDialog *self) > +{ > + RemoteViewerISOListDialogPrivate *priv = self->priv; > + char * current_iso = ovirt_foreign_menu_get_current_iso_name(self->priv->foreign_menu); > + gboolean active = g_strcmp0(current_iso, name) == 0; > + gint weight = active ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL; > + GtkTreeIter iter; > + > + gtk_list_store_append(priv->list_store, &iter); > + gtk_list_store_set(priv->list_store, &iter, > + ISO_IS_ACTIVE, active, > + ISO_NAME, name, > + FONT_WEIGHT, weight, -1); > + > + if (active) { > + GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(priv->list_store), &iter); > + gtk_tree_view_set_cursor(GTK_TREE_VIEW(priv->tree_view), path, NULL, FALSE); > + gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(priv->tree_view), path, NULL, TRUE, 0.5, 0.5); > + gtk_tree_path_free(path); > + } > + > + free(current_iso); > +} > + > +static void > +fetch_iso_names_cb(OvirtForeignMenu *foreign_menu, > + GAsyncResult *result, > + RemoteViewerISOListDialog *self) > +{ > + RemoteViewerISOListDialogPrivate *priv = self->priv; > + GError *error = NULL; > + GList *iso_list; > + > + iso_list = ovirt_foreign_menu_fetch_iso_names_finish(foreign_menu, result, &error); > + > + if (!iso_list) { > + remote_viewer_iso_list_dialog_show_error(self, error ? error->message : _("Failed to fetch CD names")); > + g_clear_error(&error); You need to stop showing the spinner when an error occurred here or it will spin indefinitely. > + return; > + } > + > + iso_list = ovirt_foreign_menu_get_iso_names(priv->foreign_menu); Is it intended that you get iso_list once from ovirt_foreign_menu_fetch_iso_names_finish and then from ovirt_foreign_menu_get_iso_names? Christophe
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list