[brasero] Display the size that would be used by the data to burn in the combo box
- From: Philippe Rouquier <philippr src gnome org>
- To: svn-commits-list gnome org
- Subject: [brasero] Display the size that would be used by the data to burn in the combo box
- Date: Wed, 27 May 2009 14:43:07 -0400 (EDT)
commit 6a3cbb799949930a28526fb5074da336c818dce7
Author: Philippe Rouquier <bonfire-app wanadoo fr>
Date: Wed May 27 20:07:23 2009 +0200
Display the size that would be used by the data to burn in the combo box
---
libbrasero-burn/brasero-dest-selection.c | 77 +++++++++-----
libbrasero-media/brasero-medium-selection-priv.h | 8 ++-
libbrasero-media/brasero-medium-selection.c | 115 ++++++++++++++++++----
3 files changed, 151 insertions(+), 49 deletions(-)
diff --git a/libbrasero-burn/brasero-dest-selection.c b/libbrasero-burn/brasero-dest-selection.c
index aae7b60..aa44683 100644
--- a/libbrasero-burn/brasero-dest-selection.c
+++ b/libbrasero-burn/brasero-dest-selection.c
@@ -46,9 +46,10 @@
#include "brasero-track.h"
#include "brasero-medium.h"
#include "brasero-session.h"
-#include "burn-plugin-manager.h"
#include "brasero-drive.h"
#include "brasero-volume.h"
+#include "brasero-burn-lib.h"
+#include "burn-plugin-manager.h"
#include "brasero-medium-selection-priv.h"
#include "brasero-dest-selection.h"
@@ -74,7 +75,6 @@ enum {
G_DEFINE_TYPE (BraseroDestSelection, brasero_dest_selection, BRASERO_TYPE_MEDIUM_SELECTION);
-
void
brasero_dest_selection_lock (BraseroDestSelection *self,
gboolean locked)
@@ -385,12 +385,15 @@ static gchar *
brasero_dest_selection_format_medium_string (BraseroMediumSelection *selection,
BraseroMedium *medium)
{
+ guint used;
gchar *label;
+ goffset blocks = 0;
gchar *medium_name;
gchar *size_string;
BraseroMedia media;
- gint64 size_bytes = 0;
BraseroBurnFlag flags;
+ goffset size_bytes = 0;
+ goffset data_blocks = 0;
BraseroTrackType *input = NULL;
BraseroDestSelectionPrivate *priv;
@@ -412,6 +415,10 @@ brasero_dest_selection_format_medium_string (BraseroMediumSelection *selection,
path);
g_free (medium_name);
g_free (path);
+
+ brasero_medium_selection_update_used_space (BRASERO_MEDIUM_SELECTION (selection),
+ medium,
+ 0);
return label;
}
@@ -437,43 +444,57 @@ brasero_dest_selection_format_medium_string (BraseroMediumSelection *selection,
* holding the source disc */
label = g_strdup_printf (_("New disc in the burner holding source disc"));
g_free (medium_name);
+
+ brasero_medium_selection_update_used_space (BRASERO_MEDIUM_SELECTION (selection),
+ medium,
+ 0);
return label;
}
}
media = brasero_medium_get_status (medium);
flags = brasero_burn_session_get_flags (priv->session);
+ brasero_burn_session_get_size (priv->session,
+ &data_blocks,
+ NULL);
- if ((media & BRASERO_MEDIUM_BLANK)
- || ((flags & BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE)
- && brasero_burn_session_can_blank (priv->session) == BRASERO_BURN_OK)) {
- brasero_medium_get_capacity (medium,
- &size_bytes,
- NULL);
- }
- else if (flags & (BRASERO_BURN_FLAG_MERGE|BRASERO_BURN_FLAG_APPEND)) {
+ if (flags & (BRASERO_BURN_FLAG_MERGE|BRASERO_BURN_FLAG_APPEND)) {
brasero_medium_get_free_space (medium,
&size_bytes,
- NULL);
+ &blocks);
+ }
+ else {
+ brasero_medium_get_free_space (medium, NULL, &blocks);
+
+ /* if data would not fit, try to see if once blanked it would
+ * work. This also covers the case where the media is closed as
+ * its free space would be 0. This is the best way to do it
+ * instead of checking for a CLOSED medium as it allows the
+ * overwrite media to be appended or merged if need be. */
+ if ((!blocks || blocks > data_blocks)
+ && (brasero_burn_library_get_media_capabilities (media) & BRASERO_MEDIUM_REWRITABLE))
+ brasero_medium_get_capacity (medium,
+ &size_bytes,
+ &blocks);
}
- else if (media & BRASERO_MEDIUM_CLOSED) {
- if (!brasero_burn_session_can_blank (priv->session) == BRASERO_BURN_OK) {
- brasero_track_type_free (input);
-
- /* NOTE for translators, the first %s is the medium name */
- label = g_strdup_printf (_("%s: no free space"), medium_name);
- g_free (medium_name);
- return label;
- }
- brasero_medium_get_capacity (medium,
- &size_bytes,
- NULL);
+ if (blocks) {
+ used = data_blocks * 100 / blocks;
+ used = MIN (100, used);
}
- else {
- brasero_medium_get_capacity (medium,
- &size_bytes,
- NULL);
+ else
+ used = 0;
+
+ brasero_medium_selection_update_used_space (BRASERO_MEDIUM_SELECTION (selection),
+ medium,
+ used);
+ if (!blocks) {
+ brasero_track_type_free (input);
+
+ /* NOTE for translators, the first %s is the medium name */
+ label = g_strdup_printf (_("%s: no free space"), medium_name);
+ g_free (medium_name);
+ return label;
}
/* format the size */
diff --git a/libbrasero-media/brasero-medium-selection-priv.h b/libbrasero-media/brasero-medium-selection-priv.h
index 2662ff2..87a12c1 100644
--- a/libbrasero-media/brasero-medium-selection-priv.h
+++ b/libbrasero-media/brasero-medium-selection-priv.h
@@ -35,7 +35,8 @@
G_BEGIN_DECLS
-typedef gboolean (*BraseroMediumSelectionFunc) (BraseroMedium *medium, gpointer callback_data);
+typedef gboolean (*BraseroMediumSelectionFunc) (BraseroMedium *medium,
+ gpointer callback_data);
guint
brasero_medium_selection_get_media_num (BraseroMediumSelection *selection);
@@ -46,6 +47,11 @@ brasero_medium_selection_foreach (BraseroMediumSelection *selection,
gpointer callback_data);
void
+brasero_medium_selection_update_used_space (BraseroMediumSelection *selection,
+ BraseroMedium *medium,
+ guint used_space);
+
+void
brasero_medium_selection_update_media_string (BraseroMediumSelection *selection);
G_END_DECLS
diff --git a/libbrasero-media/brasero-medium-selection.c b/libbrasero-media/brasero-medium-selection.c
index 9ea5ef5..e2e484b 100644
--- a/libbrasero-media/brasero-medium-selection.c
+++ b/libbrasero-media/brasero-medium-selection.c
@@ -74,6 +74,9 @@ enum {
MEDIUM_COL,
NAME_COL,
ICON_COL,
+ USED_COL,
+ VISIBLE_PROGRESS_COL,
+ VISIBLE_TEXT_COL,
NUM_COL
};
@@ -177,6 +180,75 @@ brasero_medium_selection_get_medium_string (BraseroMediumSelection *self,
}
void
+brasero_medium_selection_update_used_space (BraseroMediumSelection *selector,
+ BraseroMedium *medium_arg,
+ guint used_space)
+{
+ BraseroMediumSelectionPrivate *priv;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ priv = BRASERO_MEDIUM_SELECTION_PRIVATE (selector);
+
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (selector));
+ if (!gtk_tree_model_get_iter_first (model, &iter))
+ return;
+
+ do {
+ BraseroMedium *medium;
+
+ medium = NULL;
+ gtk_tree_model_get (model, &iter,
+ MEDIUM_COL, &medium,
+ -1);
+ if (medium == medium_arg) {
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+ USED_COL, used_space,
+ VISIBLE_PROGRESS_COL, (gboolean) (used_space > 0),
+ VISIBLE_TEXT_COL, (gboolean) (used_space <= 0),
+ -1);
+ break;
+ }
+
+ } while (gtk_tree_model_iter_next (model, &iter));
+}
+
+static void
+brasero_medium_selection_set_show_used_space (BraseroMediumSelection *selector)
+{
+ GtkCellRenderer *renderer;
+ BraseroMediumSelectionPrivate *priv;
+
+ priv = BRASERO_MEDIUM_SELECTION_PRIVATE (selector);
+
+ gtk_cell_layout_clear (GTK_CELL_LAYOUT (selector));
+
+ renderer = gtk_cell_renderer_pixbuf_new ();
+ g_object_set (renderer, "follow-state", TRUE, NULL);
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (selector), renderer, FALSE);
+ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (selector), renderer,
+ "gicon", ICON_COL,
+ NULL);
+
+ renderer = gtk_cell_renderer_progress_new ();
+ g_object_set (renderer, "xpad", 8, NULL);
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (selector), renderer, TRUE);
+ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (selector), renderer,
+ "text", NAME_COL,
+ "value", USED_COL,
+ "visible", VISIBLE_PROGRESS_COL,
+ NULL);
+
+ renderer = gtk_cell_renderer_text_new ();
+ g_object_set (renderer, "xpad", 8, NULL);
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (selector), renderer, TRUE);
+ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (selector), renderer,
+ "markup", NAME_COL,
+ "visible", VISIBLE_TEXT_COL,
+ NULL);
+}
+
+void
brasero_medium_selection_update_media_string (BraseroMediumSelection *self)
{
GtkTreeModel *model;
@@ -370,6 +442,8 @@ brasero_medium_selection_update_no_disc_entry (BraseroMediumSelection *self,
gtk_list_store_set (GTK_LIST_STORE (model), iter,
NAME_COL, _("Searching for available discs"),
ICON_COL, icon,
+ VISIBLE_TEXT_COL, TRUE,
+ VISIBLE_PROGRESS_COL, FALSE,
-1);
}
else {
@@ -377,6 +451,8 @@ brasero_medium_selection_update_no_disc_entry (BraseroMediumSelection *self,
gtk_list_store_set (GTK_LIST_STORE (model), iter,
NAME_COL, _("No available disc"),
ICON_COL, icon,
+ VISIBLE_TEXT_COL, TRUE,
+ VISIBLE_PROGRESS_COL, FALSE,
-1);
}
@@ -477,14 +553,18 @@ brasero_medium_selection_show_media_type (BraseroMediumSelection *selector,
medium = item->data;
- medium_name = brasero_medium_selection_get_medium_string (selector, medium);
- medium_icon = brasero_volume_get_icon (BRASERO_VOLUME (medium));
-
gtk_list_store_append (GTK_LIST_STORE (model), &iter);
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
MEDIUM_COL, medium,
+ -1);
+
+ medium_name = brasero_medium_selection_get_medium_string (selector, medium);
+ medium_icon = brasero_volume_get_icon (BRASERO_VOLUME (medium));
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter,
NAME_COL, medium_name,
ICON_COL, medium_icon,
+ VISIBLE_TEXT_COL, TRUE,
+ VISIBLE_PROGRESS_COL, FALSE,
-1);
g_free (medium_name);
g_object_unref (medium_icon);
@@ -615,13 +695,18 @@ brasero_medium_selection_medium_added_cb (BraseroMediumMonitor *monitor,
g_object_unref (tmp);
}
- medium_name = brasero_medium_selection_get_medium_string (self, medium);
- medium_icon = brasero_volume_get_icon (BRASERO_VOLUME (medium));
gtk_list_store_append (GTK_LIST_STORE (model), &iter);
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
MEDIUM_COL, medium,
+ -1);
+
+ medium_name = brasero_medium_selection_get_medium_string (self, medium);
+ medium_icon = brasero_volume_get_icon (BRASERO_VOLUME (medium));
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter,
NAME_COL, medium_name,
ICON_COL, medium_icon,
+ VISIBLE_TEXT_COL, TRUE,
+ VISIBLE_PROGRESS_COL, FALSE,
-1);
g_free (medium_name);
g_object_unref (medium_icon);
@@ -679,7 +764,6 @@ static void
brasero_medium_selection_init (BraseroMediumSelection *object)
{
GtkListStore *model;
- GtkCellRenderer *renderer;
BraseroMediumMonitor *monitor;
BraseroMediumSelectionPrivate *priv;
@@ -701,24 +785,15 @@ brasero_medium_selection_init (BraseroMediumSelection *object)
model = gtk_list_store_new (NUM_COL,
G_TYPE_OBJECT,
G_TYPE_STRING,
- G_TYPE_ICON);
+ G_TYPE_ICON,
+ G_TYPE_UINT,
+ G_TYPE_BOOLEAN,
+ G_TYPE_BOOLEAN);
gtk_combo_box_set_model (GTK_COMBO_BOX (object), GTK_TREE_MODEL (model));
g_object_unref (model);
- renderer = gtk_cell_renderer_pixbuf_new ();
- g_object_set (renderer, "follow-state", TRUE, NULL);
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (object), renderer, FALSE);
- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (object), renderer,
- "gicon", ICON_COL,
- NULL);
-
- renderer = gtk_cell_renderer_text_new ();
- g_object_set (renderer, "xpad", 8, NULL);
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (object), renderer, TRUE);
- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (object), renderer,
- "markup", NAME_COL,
- NULL);
+ brasero_medium_selection_set_show_used_space (object);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]