Commit 6805be54 authored by Paolo Bacchilega's avatar Paolo Bacchilega
Browse files

slideshow: added back the random order option

[bug #621244]
parent 1411107f
......@@ -85,11 +85,13 @@ gth_browser_activate_action_view_slideshow (GtkAction *action,
gth_slideshow_set_delay (GTH_SLIDESHOW (slideshow), g_file_info_get_attribute_int32 (location->info, "slideshow::delay"));
gth_slideshow_set_automatic (GTH_SLIDESHOW (slideshow), g_file_info_get_attribute_boolean (location->info, "slideshow::automatic"));
gth_slideshow_set_wrap_around (GTH_SLIDESHOW (slideshow), g_file_info_get_attribute_boolean (location->info, "slideshow::wrap-around"));
gth_slideshow_set_random_order (GTH_SLIDESHOW (slideshow), g_file_info_get_attribute_boolean (location->info, "slideshow::random-order"));
}
else {
gth_slideshow_set_delay (GTH_SLIDESHOW (slideshow), (guint) (1000.0 * eel_gconf_get_float (PREF_SLIDESHOW_CHANGE_DELAY, 5.0)));
gth_slideshow_set_automatic (GTH_SLIDESHOW (slideshow), eel_gconf_get_boolean (PREF_SLIDESHOW_AUTOMATIC, TRUE));
gth_slideshow_set_wrap_around (GTH_SLIDESHOW (slideshow), eel_gconf_get_boolean (PREF_SLIDESHOW_WRAP_AROUND, FALSE));
gth_slideshow_set_random_order (GTH_SLIDESHOW (slideshow), eel_gconf_get_boolean (PREF_SLIDESHOW_RANDOM_ORDER, FALSE));
}
if (g_file_info_get_attribute_status (location->info, "slideshow::playlist") == G_FILE_ATTRIBUTE_STATUS_SET)
......
......@@ -151,6 +151,10 @@ ss__gth_catalog_read_metadata (GthCatalog *catalog,
g_value_hash_set_boolean (catalog->attributes,
"slideshow::wrap-around",
g_file_info_get_attribute_boolean (file_data->info, "slideshow::wrap-around"));
if (g_file_info_get_attribute_status (file_data->info, "slideshow::random-order") == G_FILE_ATTRIBUTE_STATUS_SET)
g_value_hash_set_boolean (catalog->attributes,
"slideshow::random-order",
g_file_info_get_attribute_boolean (file_data->info, "slideshow::random-order"));
if (g_file_info_get_attribute_status (file_data->info, "slideshow::delay") == G_FILE_ATTRIBUTE_STATUS_SET)
g_value_hash_set_int (catalog->attributes,
"slideshow::delay",
......@@ -194,6 +198,14 @@ ss__gth_catalog_write_metadata (GthCatalog *catalog,
"slideshow::wrap-around",
G_FILE_ATTRIBUTE_STATUS_SET);
}
if (g_value_hash_is_set (catalog->attributes, "slideshow::random-order")) {
g_file_info_set_attribute_boolean (file_data->info,
"slideshow::random-order",
g_value_hash_get_boolean (catalog->attributes, "slideshow::random-order"));
g_file_info_set_attribute_status (file_data->info,
"slideshow::random-order",
G_FILE_ATTRIBUTE_STATUS_SET);
}
if (g_value_hash_is_set (catalog->attributes, "slideshow::delay")) {
g_file_info_set_attribute_int32 (file_data->info,
"slideshow::delay",
......@@ -242,6 +254,9 @@ ss__gth_catalog_read_from_doc (GthCatalog *catalog,
g_value_hash_set_boolean (catalog->attributes,
"slideshow::wrap-around",
g_strcmp0 (dom_element_get_attribute (node, "wrap-around"), "true") == 0);
g_value_hash_set_boolean (catalog->attributes,
"slideshow::random-order",
g_strcmp0 (dom_element_get_attribute (node, "random-order"), "true") == 0);
for (child = node->first_child; child; child = child->next_sibling) {
if (g_strcmp0 (child->tag_name, "delay") == 0) {
......@@ -303,6 +318,7 @@ ss__gth_catalog_write_to_doc (GthCatalog *catalog,
"personalize", (g_value_hash_get_boolean_or_default (catalog->attributes, "slideshow::personalize", FALSE) ? "true" : "false"),
"automatic", (g_value_hash_get_boolean_or_default (catalog->attributes, "slideshow::automatic", FALSE) ? "true" : "false"),
"wrap-around", (g_value_hash_get_boolean_or_default (catalog->attributes, "slideshow::wrap-around", FALSE) ? "true" : "false"),
"random-order", (g_value_hash_get_boolean_or_default (catalog->attributes, "slideshow::random-order", FALSE) ? "true" : "false"),
NULL);
dom_element_append_child (root, slideshow);
......@@ -358,7 +374,8 @@ ss__dlg_catalog_properties (GtkBuilder *builder,
slideshow_preferences = gth_slideshow_preferences_new (current_transition,
eel_gconf_get_boolean (PREF_SLIDESHOW_AUTOMATIC, TRUE),
(int) (1000.0 * eel_gconf_get_float (PREF_SLIDESHOW_CHANGE_DELAY, 5.0)),
eel_gconf_get_boolean (PREF_SLIDESHOW_WRAP_AROUND, FALSE));
eel_gconf_get_boolean (PREF_SLIDESHOW_WRAP_AROUND, FALSE),
eel_gconf_get_boolean (PREF_SLIDESHOW_RANDOM_ORDER, FALSE));
gtk_widget_set_sensitive (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences), "personalize_box"), FALSE);
g_free (current_transition);
......@@ -367,7 +384,8 @@ ss__dlg_catalog_properties (GtkBuilder *builder,
slideshow_preferences = gth_slideshow_preferences_new (g_value_hash_get_string (catalog->attributes, "slideshow::transition"),
g_value_hash_get_boolean (catalog->attributes, "slideshow::automatic"),
g_value_hash_get_int (catalog->attributes, "slideshow::delay"),
g_value_hash_get_boolean (catalog->attributes, "slideshow::wrap-around"));
g_value_hash_get_boolean (catalog->attributes, "slideshow::wrap-around"),
g_value_hash_get_boolean (catalog->attributes, "slideshow::random-order"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences), "personalize_checkbutton")), TRUE);
gtk_widget_set_sensitive (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences), "personalize_box"), TRUE);
}
......@@ -423,6 +441,9 @@ ss__dlg_catalog_properties_save (GtkBuilder *builder,
g_value_hash_set_boolean (catalog->attributes,
"slideshow::wrap-around",
gth_slideshow_preferences_get_wrap_around (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences)));
g_value_hash_set_boolean (catalog->attributes,
"slideshow::random-order",
gth_slideshow_preferences_get_random_order (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences)));
files = gth_slideshow_preferences_get_audio_files (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences));
g_value_hash_set_stringv (catalog->attributes,
......
......@@ -53,5 +53,18 @@
</locale>
</schema>
<schema>
<key>/schemas/apps/gthumb/ext/slideshow/random-order</key>
<applyto>/apps/gthumb/ext/slideshow/random-order</applyto>
<owner>gthumb</owner>
<type>bool</type>
<default>false</default>
<locale name="C">
<short></short>
<long>
</long>
</locale>
</schema>
</schemalist>
</gconfschemafile>
......@@ -3,9 +3,9 @@
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkAdjustment" id="delay_adjustment">
<property name="value">5</property>
<property name="lower">0.10000000000000001</property>
<property name="upper">100</property>
<property name="value">5</property>
<property name="step_increment">0.10000000000000001</property>
</object>
<object class="GtkListStore" id="files_liststore">
......@@ -176,6 +176,19 @@
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="random_order_checkbutton">
<property name="label" translatable="yes">R_andom order</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
......
......@@ -237,7 +237,8 @@ gth_slideshow_preferences_construct (GthSlideshowPreferences *self,
const char *current_transition,
gboolean automatic,
int delay,
gboolean wrap_around)
gboolean wrap_around,
gboolean random_order)
{
GtkListStore *model;
GtkCellRenderer *renderer;
......@@ -291,6 +292,7 @@ gth_slideshow_preferences_construct (GthSlideshowPreferences *self,
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (_gtk_builder_get_widget (self->priv->builder, "automatic_checkbutton")), automatic);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (_gtk_builder_get_widget (self->priv->builder, "change_delay_spinbutton")), ((float) delay) / 1000.0);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (_gtk_builder_get_widget (self->priv->builder, "wrap_around_checkbutton")), wrap_around);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (_gtk_builder_get_widget (self->priv->builder, "random_order_checkbutton")), random_order);
/* signals */
......@@ -317,7 +319,8 @@ GtkWidget *
gth_slideshow_preferences_new (const char *transition,
gboolean automatic,
int delay,
gboolean wrap_around)
gboolean wrap_around,
gboolean random_order)
{
GtkWidget *widget;
......@@ -326,7 +329,8 @@ gth_slideshow_preferences_new (const char *transition,
transition,
automatic,
delay,
wrap_around);
wrap_around,
random_order);
return widget;
}
......@@ -426,6 +430,13 @@ gth_slideshow_preferences_get_wrap_around (GthSlideshowPreferences *self)
}
gboolean
gth_slideshow_preferences_get_random_order (GthSlideshowPreferences *self)
{
return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_builder_get_object (self->priv->builder, "random_order_checkbutton")));
}
char **
gth_slideshow_preferences_get_audio_files (GthSlideshowPreferences *self)
{
......
......@@ -52,7 +52,8 @@ GType gth_slideshow_preferences_get_type (void);
GtkWidget * gth_slideshow_preferences_new (const char *transition,
gboolean automatic,
int delay,
gboolean wrap_around);
gboolean wrap_around,
gboolean random_order);
void gth_slideshow_preferences_set_audio (GthSlideshowPreferences *self,
char **files);
GtkWidget * gth_slideshow_preferences_get_widget (GthSlideshowPreferences *self,
......@@ -62,6 +63,7 @@ char * gth_slideshow_preferences_get_transition_id (GthSlideshowPreferen
gboolean gth_slideshow_preferences_get_automatic (GthSlideshowPreferences *self);
int gth_slideshow_preferences_get_delay (GthSlideshowPreferences *self);
gboolean gth_slideshow_preferences_get_wrap_around (GthSlideshowPreferences *self);
gboolean gth_slideshow_preferences_get_random_order (GthSlideshowPreferences *self);
char ** gth_slideshow_preferences_get_audio_files (GthSlideshowPreferences *self);
G_END_DECLS
......
......@@ -75,6 +75,7 @@ struct _GthSlideshowPrivate {
#endif
gboolean paused;
gboolean animating;
gboolean random_order;
};
......@@ -96,6 +97,28 @@ _gth_slideshow_close (GthSlideshow *self)
}
static int
shuffle_func (gconstpointer a,
gconstpointer b)
{
return g_random_int_range (-1, 2);
}
static void
_gth_slideshow_reset_current (GthSlideshow *self)
{
if (self->priv->random_order)
self->priv->file_list = g_list_sort (self->priv->file_list, shuffle_func);
if (self->priv->direction == GTH_SLIDESHOW_DIRECTION_FORWARD)
self->priv->current = g_list_first (self->priv->file_list);
else
self->priv->current = g_list_last (self->priv->file_list);
}
static void
_gth_slideshow_load_current_image (GthSlideshow *self)
{
......@@ -113,11 +136,7 @@ _gth_slideshow_load_current_image (GthSlideshow *self)
_gth_slideshow_close (self);
return;
}
if (self->priv->direction == GTH_SLIDESHOW_DIRECTION_FORWARD)
self->priv->current = g_list_first (self->priv->file_list);
else
self->priv->current = g_list_last (self->priv->file_list);
_gth_slideshow_reset_current (self);
}
requested_file = (GthFileData *) self->priv->current->data;
......@@ -239,6 +258,7 @@ gth_slideshow_init (GthSlideshow *self)
self->priv->paused = FALSE;
self->priv->animating = FALSE;
self->priv->direction = GTH_SLIDESHOW_DIRECTION_FORWARD;
self->priv->random_order = FALSE;
self->priv->preloader = gth_image_preloader_new ();
g_signal_connect (self->priv->preloader,
......@@ -383,6 +403,8 @@ gth_slideshow_show_cb (GtkWidget *widget,
if (! self->priv->first_show)
return;
self->priv->first_show = FALSE;
#if HAVE_GSTREAMER
if ((self->priv->audio_files != NULL)
&& (self->priv->audio_files[0] != NULL)
......@@ -404,8 +426,8 @@ gth_slideshow_show_cb (GtkWidget *widget,
}
#endif
_gth_slideshow_reset_current (self);
_gth_slideshow_load_current_image (self);
self->priv->first_show = FALSE;
}
......@@ -418,7 +440,6 @@ _gth_slideshow_construct (GthSlideshow *self,
self->priv->projector = projector;
self->priv->browser = _g_object_ref (browser);
self->priv->file_list = _g_object_list_ref (file_list);
self->priv->current = self->priv->file_list;
self->priv->one_loaded = FALSE;
self->priv->projector->construct (self);
......@@ -486,6 +507,14 @@ gth_slideshow_set_playlist (GthSlideshow *self,
}
void
gth_slideshow_set_random_order (GthSlideshow *self,
gboolean random)
{
self->priv->random_order = random;
}
/* -- default projector -- */
......
......@@ -76,20 +76,22 @@ extern GthProjector default_projector;
extern GthProjector clutter_projector;
#endif /* HAVE_CLUTTER */
GType gth_slideshow_get_type (void);
GtkWidget * gth_slideshow_new (GthProjector *projector,
GthBrowser *browser,
GList *file_list /* GthFileData */);
void gth_slideshow_set_delay (GthSlideshow *self,
guint msecs);
void gth_slideshow_set_automatic (GthSlideshow *self,
gboolean automatic);
void gth_slideshow_set_wrap_around (GthSlideshow *self,
gboolean wrap_around);
void gth_slideshow_set_transitions (GthSlideshow *self,
GList *transitions);
void gth_slideshow_set_playlist (GthSlideshow *self,
char **files);
GType gth_slideshow_get_type (void);
GtkWidget * gth_slideshow_new (GthProjector *projector,
GthBrowser *browser,
GList *file_list /* GthFileData */);
void gth_slideshow_set_delay (GthSlideshow *self,
guint msecs);
void gth_slideshow_set_automatic (GthSlideshow *self,
gboolean automatic);
void gth_slideshow_set_wrap_around (GthSlideshow *self,
gboolean wrap_around);
void gth_slideshow_set_transitions (GthSlideshow *self,
GList *transitions);
void gth_slideshow_set_playlist (GthSlideshow *self,
char **files);
void gth_slideshow_set_random_order (GthSlideshow *self,
gboolean random);
G_END_DECLS
......
......@@ -72,6 +72,14 @@ wrap_around_checkbutton_toggled_cb (GtkToggleButton *button,
}
static void
random_order_checkbutton_toggled_cb (GtkToggleButton *button,
BrowserData *data)
{
eel_gconf_set_boolean (PREF_SLIDESHOW_RANDOM_ORDER, gtk_toggle_button_get_active (button));
}
static void
change_delay_spinbutton_value_changed_cb (GtkSpinButton *spinbutton,
BrowserData *data)
......@@ -97,7 +105,8 @@ ss__dlg_preferences_construct_cb (GtkWidget *dialog,
data->preferences_page = gth_slideshow_preferences_new (current_transition,
eel_gconf_get_boolean (PREF_SLIDESHOW_AUTOMATIC, TRUE),
(int) (1000.0 * eel_gconf_get_float (PREF_SLIDESHOW_CHANGE_DELAY, 5.0)),
eel_gconf_get_boolean (PREF_SLIDESHOW_WRAP_AROUND, FALSE));
eel_gconf_get_boolean (PREF_SLIDESHOW_WRAP_AROUND, FALSE),
eel_gconf_get_boolean (PREF_SLIDESHOW_RANDOM_ORDER, FALSE));
gtk_widget_show (data->preferences_page);
g_free (current_transition);
......@@ -117,6 +126,10 @@ ss__dlg_preferences_construct_cb (GtkWidget *dialog,
"toggled",
G_CALLBACK (wrap_around_checkbutton_toggled_cb),
data);
g_signal_connect (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (data->preferences_page), "random_order_checkbutton"),
"toggled",
G_CALLBACK (random_order_checkbutton_toggled_cb),
data);
g_signal_connect (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (data->preferences_page), "change_delay_spinbutton"),
"value-changed",
G_CALLBACK (change_delay_spinbutton_value_changed_cb),
......
......@@ -28,6 +28,7 @@
#define PREF_SLIDESHOW_WRAP_AROUND "/apps/gthumb/ext/slideshow/wrap_around"
#define PREF_SLIDESHOW_AUTOMATIC "/apps/gthumb/ext/slideshow/automatic"
#define PREF_SLIDESHOW_TRANSITION "/apps/gthumb/ext/slideshow/transition"
#define PREF_SLIDESHOW_RANDOM_ORDER "/apps/gthumb/ext/slideshow/random-order"
#define DEFAULT_TRANSITION "random"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment