diff --git a/collection/ChangeLog b/collection/ChangeLog index 24d49aec..b5a7c18f 100644 --- a/collection/ChangeLog +++ b/collection/ChangeLog @@ -1,3 +1,25 @@ +2001-05-21 Jens Finke This patch enables the collection component to load a bunch of diff --git a/collection/eog-collection-control.c b/collection/eog-collection-control.c index 999f1a47..b6069e33 100644 --- a/collection/eog-collection-control.c +++ b/collection/eog-collection-control.c @@ -172,6 +172,7 @@ EogControl * eog_control_construct (EogControl *eog_ctrl) { BonoboControl *bctrl; + BonoboPropertyBag *property_bag; g_return_val_if_fail (eog_ctrl != NULL, NULL); g_return_val_if_fail (EOG_IS_CONTROL (eog_ctrl), NULL); @@ -193,6 +194,10 @@ eog_control_construct (EogControl *eog_ctrl) gtk_signal_connect (GTK_OBJECT (bctrl), "activate", eog_control_activate, eog_ctrl); + /* add properties */ + property_bag = eog_collection_view_get_property_bag (EOG_COLLECTION_VIEW (eog_ctrl)); + bonobo_control_set_properties (BONOBO_CONTROL (bctrl), property_bag); + bonobo_object_unref (BONOBO_OBJECT (property_bag)); /* connect collection view signals */ gtk_signal_connect (GTK_OBJECT (eog_ctrl), diff --git a/collection/eog-collection-model.c b/collection/eog-collection-model.c index ebe74c42..bedb47a6 100644 --- a/collection/eog-collection-model.c +++ b/collection/eog-collection-model.c @@ -38,6 +38,9 @@ struct _EogCollectionModelPrivate { /* list of images to load with loader */ GSList *images_to_load; + + /* base uri e.g. from a directory */ + gchar *base_uri; }; @@ -56,12 +59,10 @@ static void eog_collection_model_destroy (GtkObject *obj) { EogCollectionModel *model; - CORBA_Environment ev; g_return_if_fail (obj != NULL); g_return_if_fail (EOG_IS_COLLECTION_MODEL (obj)); - CORBA_exception_init (&ev); model = EOG_COLLECTION_MODEL (obj); if (model->priv->loader) @@ -77,7 +78,9 @@ eog_collection_model_destroy (GtkObject *obj) g_hash_table_destroy (model->priv->id_image_mapping); model->priv->id_image_mapping = NULL; - CORBA_exception_free (&ev); + if (model->priv->base_uri) + g_free (model->priv->base_uri); + model->priv->base_uri = NULL; } static void @@ -103,6 +106,7 @@ eog_collection_model_init (EogCollectionModel *obj) priv->id_image_mapping = NULL; priv->selected_images = NULL; priv->images_to_load = NULL; + priv->base_uri = NULL; obj->priv = priv; } @@ -386,7 +390,7 @@ eog_collection_model_set_uri (EogCollectionModel *model, priv = model->priv; ctx = prepare_context (model, uri); - + if (ctx != NULL) { if (ctx->type == LC_BONOBO_STORAGE) gtk_idle_add ((GtkFunction) real_storage_loading, ctx); @@ -395,6 +399,13 @@ eog_collection_model_set_uri (EogCollectionModel *model, } else { g_warning (_("Can't handle URI: %s"), uri); } + + if (priv->base_uri == NULL) + priv->base_uri = g_strdup (uri); + else { + g_free (priv->base_uri); + priv->base_uri = g_strdup("multiple")); + } } void @@ -425,6 +436,10 @@ eog_collection_model_set_uri_list (EogCollectionModel *model, node = node->next; } + + if (model->priv->base_uri != NULL) + g_free (model->priv->base_uri); + model->priv->base_uri = g_strdup ("multiple"); } void @@ -567,3 +582,14 @@ void eog_collection_model_toggle_select_status (EogCollectionModel *model, } +gchar* +eog_collection_model_get_base_uri (EogCollectionModel *model) +{ + g_return_val_if_fail (model != NULL, NULL); + g_return_val_if_fail (EOG_IS_COLLECTION_MODEL (model), NULL); + + if (g_strcasecmp ("multiple", model->priv->base_uri) == 0) + return NULL; + else + return model->priv->base_uri; +} diff --git a/collection/eog-collection-model.h b/collection/eog-collection-model.h index 2c1d0fe6..8949b186 100644 --- a/collection/eog-collection-model.h +++ b/collection/eog-collection-model.h @@ -105,6 +105,9 @@ void eog_collection_model_set_select_status_all (EogCollectionModel *model, gboolean status); +gchar* +eog_collection_model_get_base_uri (EogCollectionModel *model); + END_GNOME_DECLS #endif /* EOG_COLLECTION_MODEL_H */ diff --git a/collection/eog-collection-view.c b/collection/eog-collection-view.c index 4aa6a186..d5ccc660 100644 --- a/collection/eog-collection-view.c +++ b/collection/eog-collection-view.c @@ -30,8 +30,16 @@ struct _EogCollectionViewPrivate { GtkWidget *wraplist; GtkWidget *root; + BonoboPropertyBag *property_bag; + BonoboUIComponent *uic; BonoboPropertyControl *prop_control; + + gint idle_id; +}; + +enum { + PROP_WINDOW_TITLE }; enum { @@ -80,7 +88,7 @@ impl_GNOME_EOG_ImageCollection_openURIList (PortableServer_Servant servant, priv = cview->priv; list = NULL; - g_print ("uri_list->_lenght: %i\n", uri_list->_length); + g_print ("uri_list->_length: %i\n", uri_list->_length); for (i = 0; i < uri_list->_length; i++) { list = g_list_append (list, g_strdup (uri_list->_buffer[i])); @@ -153,6 +161,10 @@ eog_collection_view_destroy (GtkObject *object) bonobo_object_unref (BONOBO_OBJECT (list_view->priv->prop_control)); list_view->priv->prop_control = NULL; + if (list_view->priv->property_bag) + bonobo_object_unref (BONOBO_OBJECT (list_view->priv->property_bag)); + list_view->priv->property_bag = NULL; + list_view->priv->wraplist = NULL; list_view->priv->root = NULL; @@ -206,9 +218,10 @@ eog_collection_view_class_init (EogCollectionViewClass *klass) } static void -eog_collection_view_init (EogCollectionView *image_view) +eog_collection_view_init (EogCollectionView *view) { - image_view->priv = g_new0 (EogCollectionViewPrivate, 1); + view->priv = g_new0 (EogCollectionViewPrivate, 1); + view->priv->idle_id = -1; } BONOBO_X_TYPE_FUNC_FULL (EogCollectionView, @@ -236,6 +249,78 @@ handle_item_dbl_click (GtkObject *obj, gint n, gpointer data) g_free (uri); } + +static void +eog_collection_view_get_prop (BonoboPropertyBag *bag, + BonoboArg *arg, + guint arg_id, + CORBA_Environment *ev, + gpointer user_data) +{ + EogCollectionView *view; + + g_return_if_fail (user_data != NULL); + g_return_if_fail (EOG_IS_COLLECTION_VIEW (user_data)); + + view = EOG_COLLECTION_VIEW (user_data); + + switch (arg_id) { + case PROP_WINDOW_TITLE: { + gchar *base_uri; + gchar *title; + gint length; + gchar *buffer; + + base_uri = eog_collection_model_get_base_uri (view->priv->model); + length = eog_collection_model_get_length (view->priv->model); + if (length == 1) + buffer = g_strdup("(1 image)"); + else { + buffer = g_new0 (guchar, 20); + g_snprintf (buffer, 20, "(%i images)", length); + } + + if (base_uri == NULL) + title = g_strconcat (_("Collection View "), buffer, NULL); + else { + if (g_strncasecmp ("file:", base_uri, 5) == 0) + title = g_strconcat ((base_uri+5*sizeof(guchar)), " ", + buffer, NULL ); + else + title = g_strconcat (base_uri, " ", buffer, NULL); + } + + BONOBO_ARG_SET_STRING (arg, title); + g_free (title); + g_free (buffer); + break; + } + default: + g_assert_not_reached (); + } +} + +static void +eog_collection_view_set_prop (BonoboPropertyBag *bag, + const BonoboArg *arg, + guint arg_id, + CORBA_Environment *ev, + gpointer user_data) +{ + EogCollectionView *view; + + g_return_if_fail (user_data != NULL); + g_return_if_fail (EOG_IS_COLLECTION_VIEW (user_data)); + + view = EOG_COLLECTION_VIEW (user_data); + + switch (arg_id) { + /* all properties are read only yet */ + default: + g_assert_not_reached (); + } +} + static void prop_control_get_prop (BonoboPropertyBag *bag, BonoboArg *arg, @@ -291,6 +376,39 @@ prop_control_get_cb (BonoboPropertyControl *property_control, return control; } +static gint +update_title_property (EogCollectionView *view) +{ + BonoboArg *arg; + + arg = bonobo_arg_new (BONOBO_ARG_STRING); + + eog_collection_view_get_prop (NULL, arg, + PROP_WINDOW_TITLE, + NULL, + view); + + bonobo_property_bag_notify_listeners (view->priv->property_bag, + "window_title", + arg, NULL); + + bonobo_arg_release (arg); + view->priv->idle_id = -1; + + return FALSE; +} + +static void +model_interval_size_changed (EogCollectionModel *model, GList *id_list, gpointer data) +{ + EogCollectionView *view; + + view = EOG_COLLECTION_VIEW (data); + + if (view->priv->idle_id == -1) + view->priv->idle_id = gtk_idle_add ((GtkFunction) update_title_property, view); +} + EogCollectionView * eog_collection_view_construct (EogCollectionView *list_view) { @@ -304,6 +422,12 @@ eog_collection_view_construct (EogCollectionView *list_view) /* construct widget */ priv = list_view->priv; priv->model = eog_collection_model_new (); + gtk_signal_connect (GTK_OBJECT (priv->model), "interval_added", + GTK_SIGNAL_FUNC (model_interval_size_changed), + list_view); + gtk_signal_connect (GTK_OBJECT (priv->model), "interval_removed", + GTK_SIGNAL_FUNC (model_interval_size_changed), + list_view); priv->factory = EOG_ITEM_FACTORY (eog_item_factory_simple_new ()); @@ -322,6 +446,14 @@ eog_collection_view_construct (EogCollectionView *list_view) gtk_widget_show (priv->wraplist); gtk_widget_show (priv->root); + /* Property Bag */ + priv->property_bag = bonobo_property_bag_new (eog_collection_view_get_prop, + eog_collection_view_set_prop, + list_view); + bonobo_property_bag_add (priv->property_bag, "window_title", PROP_WINDOW_TITLE, + BONOBO_ARG_STRING, NULL, _("Window Title"), + BONOBO_PROPERTY_READABLE); + /* Property Control */ priv->prop_control = bonobo_property_control_new (prop_control_get_cb, 2, list_view); @@ -364,4 +496,11 @@ eog_collection_view_set_background_color (EogCollectionView *list_view, color); } +BonoboPropertyBag* +eog_collection_view_get_property_bag (EogCollectionView *view) +{ + g_return_val_if_fail (view != NULL, NULL); + g_return_val_if_fail (EOG_IS_COLLECTION_VIEW (view), NULL); + return view->priv->property_bag; +} diff --git a/collection/eog-collection-view.h b/collection/eog-collection-view.h index 95feb6d3..87c8ccc4 100644 --- a/collection/eog-collection-view.h +++ b/collection/eog-collection-view.h @@ -54,6 +54,9 @@ void eog_collection_view_set_ui_container (EogCollectionView Bonobo_UIContainer ui_container); GtkWidget *eog_collection_view_get_widget (EogCollectionView *list_view); +BonoboPropertyBag *eog_collection_view_get_property_bag (EogCollectionView *view); + + void eog_collection_view_set_layout_mode (EogCollectionView *list_view, EogLayoutMode lm);