[frogr] Implemented "Save Session..." action



commit a9683e392c09a24ff330fc47c9436458842ca4ab
Author: Mario Sanchez Prada <msanchez2 gnome org>
Date:   Thu Nov 8 13:25:05 2012 +0100

    Implemented "Save Session..." action

 src/frogr-main-view.c |  121 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 109 insertions(+), 12 deletions(-)
---
diff --git a/src/frogr-main-view.c b/src/frogr-main-view.c
index b88207b..8ca819a 100644
--- a/src/frogr-main-view.c
+++ b/src/frogr-main-view.c
@@ -73,6 +73,8 @@ typedef struct _FrogrMainViewPrivate {
   gint n_selected_pictures;
 
   GtkWindow *window;
+  gchar *project_name;
+  gchar *project_filepath;
 
   GtkWidget *icon_view;
   GtkWidget *status_bar;
@@ -94,6 +96,7 @@ typedef struct _FrogrMainViewPrivate {
 
   GtkBuilder *builder;
 
+  GtkAction *save_session_action;
   GtkAction *save_session_as_action;
   GtkAction *load_pictures_action;
   GtkAction *remove_pictures_action;
@@ -127,6 +130,9 @@ enum {
 
 /* Prototypes */
 
+static void _update_project_path (FrogrMainView *self, const gchar *path);
+static void _update_window_title (FrogrMainView *self);
+
 static gboolean _maybe_show_auth_dialog_on_idle (FrogrMainView *self);
 
 #ifdef MAC_INTEGRATION
@@ -172,9 +178,13 @@ static GSList *_get_selected_pictures (FrogrMainView *self);
 static gint _n_pictures (FrogrMainView *self);
 static void _open_pictures_in_external_viewer (FrogrMainView *self);
 
+static void _save_current_session (FrogrMainView *self);
+
+static void _save_session_to_file (FrogrMainView *self, const gchar *filepath);
+
 static void _save_session_as_dialog_response_cb (GtkDialog *dialog,
-                                              gint response,
-                                              gpointer data);
+                                                 gint response,
+                                                 gpointer data);
 
 static void _save_session_as_dialog (FrogrMainView *self);
 
@@ -240,6 +250,61 @@ static void _update_ui (FrogrMainView *self);
 
 /* Private API */
 
+static void
+_update_project_path (FrogrMainView *self, const gchar *path)
+{
+  FrogrMainViewPrivate *priv = FROGR_MAIN_VIEW_GET_PRIVATE (self);
+
+  /* Early return if nothing changed */
+  if (!g_strcmp0 (priv->project_filepath, path))
+      return;
+
+  g_free (priv->project_name);
+  g_free (priv->project_filepath);
+
+  if (!path)
+    {
+      priv->project_name = NULL;
+      priv->project_filepath = NULL;
+    }
+  else
+    {
+      GFile *file = NULL;
+      GFileInfo *file_info;
+
+      file = g_file_new_for_path (path);
+      file_info = g_file_query_info (file,
+                                     G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
+                                     G_FILE_QUERY_INFO_NONE,
+                                     NULL,
+                                     NULL);
+
+      priv->project_name = g_strdup (g_file_info_get_display_name (file_info));
+      priv->project_filepath = g_strdup (path);
+    }
+
+  _update_window_title (self);
+}
+
+static void
+_update_window_title (FrogrMainView *self)
+{
+  FrogrMainViewPrivate *priv = FROGR_MAIN_VIEW_GET_PRIVATE (self);
+
+  gchar *session_string = NULL;
+  gchar *window_title = NULL;
+
+  session_string = priv->project_name
+    ? g_strdup_printf ("%s - ", priv->project_name)
+    : g_strdup("");
+
+  window_title = g_strdup_printf ("%s%s", session_string, APP_SHORTNAME);
+  g_free (session_string);
+
+  gtk_window_set_title (GTK_WINDOW (priv->window), window_title);
+  g_free (window_title);
+}
+
 static gboolean
 _maybe_show_auth_dialog_on_idle (FrogrMainView *self)
 {
@@ -493,7 +558,9 @@ _on_action_activated (GtkAction *action, gpointer data)
   FrogrMainViewPrivate *priv = NULL;
 
   priv = FROGR_MAIN_VIEW_GET_PRIVATE (data);
-  if (action == priv->save_session_as_action)
+  if (action == priv->save_session_action)
+    _save_current_session (mainview);
+  else if (action == priv->save_session_as_action)
     _save_session_as_dialog (mainview);
   else if (action == priv->load_pictures_action)
     _load_pictures_dialog (mainview);
@@ -863,21 +930,43 @@ _n_pictures (FrogrMainView *self)
 }
 
 static void
+_save_current_session (FrogrMainView *self)
+{
+  FrogrMainViewPrivate *priv = FROGR_MAIN_VIEW_GET_PRIVATE (self);
+
+  if (priv->project_filepath)
+    _save_session_to_file (self, priv->project_filepath);
+  else
+    _save_session_as_dialog (self);
+}
+
+static void
+_save_session_to_file (FrogrMainView *self, const gchar *filepath)
+{
+  FrogrMainViewPrivate *priv = FROGR_MAIN_VIEW_GET_PRIVATE (self);
+  GFile *file = NULL;
+
+  /* Add selected pictures to icon view area */
+  file = g_file_new_for_path (filepath);
+  frogr_controller_save_session_to_file (priv->controller, filepath);
+  _update_project_path (self, filepath);
+
+  g_object_unref (file);
+}
+
+static void
 _save_session_as_dialog_response_cb (GtkDialog *dialog, gint response, gpointer data)
 {
   FrogrMainView *self = FROGR_MAIN_VIEW (data);
 
   if (response == GTK_RESPONSE_ACCEPT)
-    { 
+    {
       gchar *filename = NULL;
 
-      /* Add selected pictures to icon view area */
       filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
       if (filename != NULL)
-        {
-          FrogrMainViewPrivate *priv = FROGR_MAIN_VIEW_GET_PRIVATE (self);
-          frogr_controller_save_session_to_file (priv->controller, filename);
-        }
+        _save_session_to_file (self, filename);
+
       g_free (filename);
     }
 
@@ -897,7 +986,7 @@ _save_session_as_dialog (FrogrMainView *self)
                                         GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
                                         NULL);
 
-  gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), _("Untitled.frogr"));
+  gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), _("Untitled Project"));
   gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), FALSE);
   gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), TRUE);
 
@@ -1486,6 +1575,7 @@ _update_sensitiveness (FrogrMainView *self)
     {
     case FROGR_STATE_LOADING_PICTURES:
     case FROGR_STATE_UPLOADING_PICTURES:
+      gtk_action_set_sensitive (priv->save_session_action, FALSE);
       gtk_action_set_sensitive (priv->save_session_as_action, FALSE);
       gtk_action_set_sensitive (priv->load_pictures_action, FALSE);
       gtk_action_set_sensitive (priv->remove_pictures_action, FALSE);
@@ -1506,6 +1596,7 @@ _update_sensitiveness (FrogrMainView *self)
       has_accounts = (priv->accounts_menu != NULL);
       n_selected_pics = priv->n_selected_pictures;
 
+      gtk_action_set_sensitive (priv->save_session_action, TRUE);
       gtk_action_set_sensitive (priv->save_session_as_action, TRUE);
       gtk_action_set_sensitive (priv->load_pictures_action, TRUE);
       gtk_action_set_sensitive (priv->auth_action, TRUE);
@@ -1583,8 +1674,10 @@ _frogr_main_view_finalize (GObject *object)
 {
   FrogrMainViewPrivate *priv = FROGR_MAIN_VIEW_GET_PRIVATE (object);
 
-  gtk_widget_destroy (GTK_WIDGET (priv->window));
+  g_free (priv->project_name);
+  g_free (priv->project_filepath);
   g_free (priv->state_description);
+  gtk_widget_destroy (GTK_WIDGET (priv->window));
 
   G_OBJECT_CLASS(frogr_main_view_parent_class)->finalize (object);
 }
@@ -1668,7 +1761,6 @@ frogr_main_view_init (FrogrMainView *self)
   g_free (full_path);
 
   window = GTK_WINDOW(gtk_builder_get_object (builder, "main_window"));
-  gtk_window_set_title (GTK_WINDOW (window), _(APP_NAME));
   priv->window = window;
 
   priv->menu_bar = GTK_WIDGET (gtk_builder_get_object (builder, "menu_bar"));
@@ -1693,6 +1785,8 @@ frogr_main_view_init (FrogrMainView *self)
   priv->status_bar = status_bar;
 
   /* Get actions from GtkBuilder */
+  priv->save_session_action =
+    GTK_ACTION (gtk_builder_get_object (builder, "save_session_action"));
   priv->save_session_as_action =
     GTK_ACTION (gtk_builder_get_object (builder, "save_session_as_action"));
   priv->load_pictures_action =
@@ -1748,6 +1842,9 @@ frogr_main_view_init (FrogrMainView *self)
   /* Init main model's state description */
   _update_state_description (self);
 
+  /* Init the details of the current project */
+  _update_project_path (self, NULL);
+
   /* Initialize sorting criteria and reverse */
   priv->sorting_criteria = frogr_config_get_mainview_sorting_criteria (priv->config);
   if (priv->sorting_criteria == SORT_BY_TITLE)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]