Author: post
Date: 2011-04-12 17:42:57 +0200 (Tue, 12 Apr 2011)
New Revision: 3978
Modified:
trunk/src/application.c
trunk/src/application.h
trunk/src/gtk-interface.c
trunk/src/rs-preview-widget.c
trunk/src/rs-store.c
Log:
Add delayed file loading & file rendering cancellation, so image can be
cancelled if another is selected before it is rendered in high quality, and it
is possible to skip to other images than the next or previous.
Modified: trunk/src/application.c
===================================================================
--- trunk/src/application.c 2011-04-11 12:34:46 UTC (rev 3977)
+++ trunk/src/application.c 2011-04-12 15:42:57 UTC (rev 3978)
@@ -79,6 +79,8 @@
/* Save photo in blob */
rs->photo = photo;
+ if (rs->photo)
+ rs->photo->signal = &rs->signal;
if (rs->photo)
{
@@ -233,6 +235,7 @@
rs->photo = NULL;
rs->queue = rs_batch_new_queue(rs);
rs->current_setting = 0;
+ rs->signal = MAIN_SIGNAL_NONE;
/* Build basic filter chain */
rs->filter_input = rs_filter_new("RSInputImage16", NULL);
Modified: trunk/src/application.h
===================================================================
--- trunk/src/application.h 2011-04-11 12:34:46 UTC (rev 3977)
+++ trunk/src/application.h 2011-04-12 15:42:57 UTC (rev 3978)
@@ -35,6 +35,13 @@
/* Opaque definition, declared in rs-batch.h */
typedef struct _RS_QUEUE RS_QUEUE;
+typedef enum {
+ MAIN_SIGNAL_NONE,
+ MAIN_SIGNAL_LOADING,
+ MAIN_SIGNAL_CANCEL_LOAD,
+ MAIN_SIGNAL_IDLE
+} RS_MAIN_SIGNAL;
+
typedef struct _photo {
GObject parent;
gchar *filename;
@@ -56,8 +63,10 @@
RS_RECT *proposed_crop;
RSFilter *auto_wb_filter;
gdouble *auto_wb_mul;
+ RS_MAIN_SIGNAL* signal;
} RS_PHOTO;
+
typedef struct {
RS_PHOTO *photo;
RSSettings *settings_buffer;
@@ -67,6 +76,7 @@
gint current_setting;
RS_QUEUE *queue;
RSStore *store;
+ RS_MAIN_SIGNAL signal;
/* These should be moved to a future RS_WINDOW */
GtkWidget *window;
Modified: trunk/src/gtk-interface.c
===================================================================
--- trunk/src/gtk-interface.c 2011-04-11 12:34:46 UTC (rev 3977)
+++ trunk/src/gtk-interface.c 2011-04-12 15:42:57 UTC (rev 3978)
@@ -220,11 +220,10 @@
{
GList *selected = NULL;
rs_io_idle_pause();
- g_signal_handlers_block_by_func(instance, icon_activated, rs);
gui_set_busy(TRUE);
msgid = gui_status_push(_("Opening photo ..."));
+ rs->signal = MAIN_SIGNAL_LOADING;
GTK_CATCHUP();
- g_signal_handlers_unblock_by_func(instance, icon_activated, rs);
/* Read currently selected filename, it may or may not (!) be
the same as served in name */
selected = rs_store_get_selected_names(rs->store);
@@ -240,6 +239,7 @@
gui_status_pop(msgid);
gui_set_busy(FALSE);
rs_io_idle_unpause();
+ rs->signal = MAIN_SIGNAL_IDLE;
return;
}
@@ -258,6 +258,8 @@
GTK_CATCHUP();
gui_set_busy(FALSE);
rs_io_idle_unpause();
+ rs->signal = MAIN_SIGNAL_IDLE;
+
}
static void
Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c 2011-04-11 12:34:46 UTC (rev 3977)
+++ trunk/src/rs-preview-widget.c 2011-04-12 15:42:57 UTC (rev 3978)
@@ -1549,11 +1549,23 @@
g_object_unref(buffer);
}
- if(rs_filter_request_get_quick(new_request) &&
!preview->keep_quick_enabled)
+ if(preview->views > 1 &&
rs_filter_request_get_quick(new_request) && !preview->keep_quick_enabled)
{
rs_filter_request_set_quick(preview->request[i], FALSE);
gdk_window_invalidate_rect(window, &area,
FALSE);
}
+ else if(rs_filter_request_get_quick(new_request) &&
!preview->keep_quick_enabled)
+ {
+ /* Catch up, so we can get new signals */
+ gdk_window_end_paint(window);
+ GTK_CATCHUP();
+ if (!(preview->photo && preview->photo->signal
&& *preview->photo->signal == MAIN_SIGNAL_CANCEL_LOAD))
+ {
+
rs_filter_request_set_quick(preview->request[i], FALSE);
+ gdk_window_invalidate_rect(window,
&area, FALSE);
+ }
+ return;
+ }
else if (preview->photo && NULL==preview->photo->crop
&& NULL==preview->photo->proposed_crop)
{
preview->photo->proposed_crop =
g_new(RS_RECT,1);
Modified: trunk/src/rs-store.c
===================================================================
--- trunk/src/rs-store.c 2011-04-11 12:34:46 UTC (rev 3977)
+++ trunk/src/rs-store.c 2011-04-12 15:42:57 UTC (rev 3978)
@@ -107,6 +107,8 @@
volatile gint jobs_to_do;
gboolean counter_blocked; /* Only access when thread has
gdk lock */
gint open_selected; /* Contains status message ID, if enabled, 0
otherwise */
+ gchar *next_file;
+ gulong delay_load;
};
/* Define the boiler plate stuff using the predefined macro */
@@ -358,6 +360,8 @@
gtk_box_pack_start(GTK_BOX (hbox), GTK_WIDGET(store->notebook), TRUE,
TRUE, 0);
store->last_path = NULL;
+ store->next_file = NULL;
+ store->delay_load = 0;
gint sort_method = RS_STORE_SORT_BY_NAME;
rs_conf_get_integer(CONF_STORE_SORT_METHOD, &sort_method);
rs_store_set_sort_method(store, sort_method);
@@ -527,6 +531,27 @@
return ret;
}
+static gboolean
+delayed_fileload(gpointer data)
+{
+ RSStore *store = RS_STORE(data);
+ RS_BLOB* rs = rs_get_blob();
+ /* Did we arrive here before we are ready for it? */
+ if (rs->signal == MAIN_SIGNAL_LOADING || rs->signal ==
MAIN_SIGNAL_CANCEL_LOAD)
+ return TRUE;
+
+ if (store->next_file)
+ {
+ gchar *name = g_strdup(store->next_file);
+ g_free(store->next_file);
+ store->next_file = NULL;
+ store->delay_load = 0;
+ g_signal_emit(G_OBJECT(data), signals[THUMB_ACTIVATED_SIGNAL],
0, name);
+ predict_preload(data, FALSE);
+ }
+ return FALSE;
+}
+
static void
selection_changed(GtkIconView *iconview, gpointer data)
{
@@ -534,11 +559,11 @@
GtkTreeModel *model = GTK_TREE_MODEL(store->store);
GtkTreeIter iter;
gint type;
- gchar *name;
GList *group_member_list;
GList *filename_list;
GList *selected = NULL;
gint num_selected;
+ RS_BLOB* rs = rs_get_blob();
/* Get list of selected icons */
selected = rs_store_get_selected_iters(store);
@@ -560,11 +585,17 @@
g_list_free(filename_list);
break;
default:
-
gtk_tree_model_get(GTK_TREE_MODEL(store->store), &iter, FULLNAME_COLUMN, &name,
-1);
- g_signal_emit(G_OBJECT(data),
signals[THUMB_ACTIVATED_SIGNAL], 0, name);
+ if (store->next_file)
+ g_free(store->next_file);
+ if (rs->signal == MAIN_SIGNAL_LOADING)
+ rs->signal = MAIN_SIGNAL_CANCEL_LOAD;
+ if (store->delay_load > 0)
+ g_source_remove(store->delay_load);
+
gtk_tree_model_get(GTK_TREE_MODEL(store->store), &iter, FULLNAME_COLUMN,
&store->next_file, -1);
+ /* Delay loading of file, so it is possible to
select another image */
+ store->delay_load = g_timeout_add(300,
delayed_fileload, data);
break;
}
- predict_preload(data, FALSE);
}
rs_core_actions_update_menu_items(rs_get_blob());
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit