~mfisch/brasero/update-to-3.8.0

1.1.7 by Luis Medinas
Import upstream version 0.7.0
1
/***************************************************************************
2
 *            progress.c
3
 *
4
 *  ven mar 10 15:42:01 2006
5
 *  Copyright  2006  Rouquier Philippe
6
 *  brasero-app@wanadoo.fr
7
 ***************************************************************************/
8
9
/*
1.1.11 by Pedro Fragoso
Import upstream version 0.8.1
10
 *  Brasero is free software; you can redistribute it and/or modify
1.1.7 by Luis Medinas
Import upstream version 0.7.0
11
 *  it under the terms of the GNU General Public License as published by
12
 *  the Free Software Foundation; either version 2 of the License, or
13
 *  (at your option) any later version.
14
 *
1.1.11 by Pedro Fragoso
Import upstream version 0.8.1
15
 *  Brasero is distributed in the hope that it will be useful,
1.1.7 by Luis Medinas
Import upstream version 0.7.0
16
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 *  GNU Library General Public License for more details.
19
 *
20
 *  You should have received a copy of the GNU General Public License
1.1.11 by Pedro Fragoso
Import upstream version 0.8.1
21
 *  along with this program; if not, write to:
22
 * 	The Free Software Foundation, Inc.,
23
 * 	51 Franklin Street, Fifth Floor
24
 * 	Boston, MA  02110-1301, USA.
1.1.7 by Luis Medinas
Import upstream version 0.7.0
25
 */
26
27
#include <math.h>
28
29
#ifdef HAVE_CONFIG_H
30
#  include <config.h>
31
#endif
32
33
#include <glib.h>
34
#include <glib/gi18n-lib.h>
35
#include <glib-object.h>
36
37
#include <gtk/gtklabel.h>
38
#include <gtk/gtkbox.h>
39
#include <gtk/gtkhbox.h>
40
#include <gtk/gtkvbox.h>
41
#include <gtk/gtkprogressbar.h>
42
#include <gtk/gtkmisc.h>
43
#include <gtk/gtktable.h>
44
#include <gtk/gtkeventbox.h>
45
#include <gtk/gtkimage.h>
46
47
#include "brasero-utils.h"
48
#include "brasero-progress.h"
49
#include "burn-basics.h"
50
#include "burn-medium.h"
51
52
static void brasero_burn_progress_class_init (BraseroBurnProgressClass *klass);
53
static void brasero_burn_progress_init (BraseroBurnProgress *sp);
54
static void brasero_burn_progress_finalize (GObject *object);
55
56
static void
57
brasero_burn_progress_set_property (GObject *object,
58
				    guint property_id,
59
				    const GValue *value,
60
				    GParamSpec *pspec);
61
static void
62
brasero_burn_progress_get_property (GObject *object,
63
				    guint property_id,
64
				    GValue *value,
65
				    GParamSpec *pspec);
66
67
struct BraseroBurnProgressPrivate {
68
	GtkWidget *progress;
69
	GtkWidget *action;
70
	GtkWidget *time;
71
	GtkWidget *speed;
72
	GtkWidget *bytes_written;
73
	GtkWidget *speed_time_info;
74
75
	BraseroBurnAction current;
76
	gdouble current_progress;
77
78
	guint pulse_id;
79
};
80
81
static GObjectClass *parent_class = NULL;
82
83
enum {
84
	PROP_NONE,
85
	PROP_SHOW_INFO,
86
};
87
88
GType
89
brasero_burn_progress_get_type ()
90
{
91
	static GType type = 0;
92
93
	if(type == 0) {
94
		static const GTypeInfo our_info = {
95
			sizeof (BraseroBurnProgressClass),
96
			NULL,
97
			NULL,
98
			(GClassInitFunc)brasero_burn_progress_class_init,
99
			NULL,
100
			NULL,
101
			sizeof (BraseroBurnProgress),
102
			0,
103
			(GInstanceInitFunc)brasero_burn_progress_init,
104
		};
105
106
		type = g_type_register_static(GTK_TYPE_VBOX, 
107
					      "BraseroBurnProgress",
108
					      &our_info,
109
					      0);
110
	}
111
112
	return type;
113
}
114
115
static void
116
brasero_burn_progress_class_init (BraseroBurnProgressClass *klass)
117
{
118
	GObjectClass *object_class = G_OBJECT_CLASS(klass);
119
120
	parent_class = g_type_class_peek_parent(klass);
121
	object_class->finalize = brasero_burn_progress_finalize;
122
	object_class->set_property = brasero_burn_progress_set_property;
123
	object_class->get_property = brasero_burn_progress_get_property;
124
125
	g_object_class_install_property (object_class,
126
					 PROP_SHOW_INFO,
127
					 g_param_spec_boolean ("show-info", NULL, NULL,
128
							       TRUE, G_PARAM_READWRITE));
129
}
130
131
static void
132
brasero_burn_progress_create_info (BraseroBurnProgress *obj)
133
{
134
	GtkWidget *label;
135
	GtkWidget *table;
136
137
	table = gtk_table_new (2, 2, FALSE);
138
	obj->priv->speed_time_info = table;
139
	gtk_container_set_border_width (GTK_CONTAINER (table), 0);
140
141
	label = gtk_label_new (_("Estimated remaining time:"));
142
	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 1.0);
143
	gtk_table_attach (GTK_TABLE (table), label,
144
			  0,
145
			  1,
146
			  0,
147
			  1, 
148
			  GTK_EXPAND|GTK_FILL,
149
			  GTK_EXPAND|GTK_FILL,
150
			  0,
151
			  0);
152
153
	obj->priv->time = gtk_label_new (" ");
154
	gtk_misc_set_alignment (GTK_MISC (obj->priv->time), 1.0, 1.0);
155
	gtk_table_attach (GTK_TABLE (table), obj->priv->time,
156
			  1,
157
			  2,
158
			  0,
159
			  1, 
160
			  GTK_FILL,
161
			  GTK_FILL,
162
			  0,
163
			  0);
164
165
	label = gtk_label_new (_("Estimated drive speed:"));
166
	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 1.0);
167
	gtk_table_attach (GTK_TABLE (table), label,
168
			  0,
169
			  1,
170
			  1,
171
			  2, 
172
			  GTK_EXPAND|GTK_FILL,
173
			  GTK_EXPAND|GTK_FILL,
174
			  0,
175
			  0);
176
177
	obj->priv->speed = gtk_label_new (" ");
178
	gtk_misc_set_alignment (GTK_MISC (obj->priv->speed), 1.0, 0.0);
179
	gtk_table_attach (GTK_TABLE (table), obj->priv->speed,
180
			  1,
181
			  2,
182
			  1,
183
			  2, 
184
			  GTK_FILL,
185
			  GTK_FILL,
186
			  0,
187
			  0);
188
	gtk_box_pack_start (GTK_BOX (obj), table, TRUE, TRUE, 20);
189
	gtk_widget_show_all (table);
190
}
191
1.1.12 by Pedro Fragoso
Import upstream version 0.8.2
192
void
193
brasero_burn_progress_display_session_info (BraseroBurnProgress *obj,
194
					    glong time,
195
					    gint64 rate,
1.1.13 by Pedro Fragoso
Import upstream version 0.8.3
196
					    BraseroMedia media,
1.1.12 by Pedro Fragoso
Import upstream version 0.8.2
197
					    gint written)
198
{
199
	GtkWidget *label;
200
	GtkWidget *table;
201
	int hrs, mn, sec;
202
	gdouble speed;
203
	gchar *text;
204
205
	if (obj->priv->speed_time_info)
206
		gtk_widget_destroy (obj->priv->speed_time_info);
207
208
	table = gtk_table_new (2, 2, FALSE);
209
	obj->priv->speed_time_info = table;
210
	gtk_container_set_border_width (GTK_CONTAINER (table), 0);
211
212
	label = gtk_label_new (_("Total time:"));
213
	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 1.0);
214
	gtk_table_attach (GTK_TABLE (table), label,
215
			  0,
216
			  1,
217
			  0,
218
			  1, 
219
			  GTK_EXPAND|GTK_FILL,
220
			  GTK_EXPAND|GTK_FILL,
221
			  0,
222
			  0);
223
224
	hrs = time / 3600;
225
	time = ((int) time) % 3600;
226
	mn = time / 60;
227
	sec = ((int) time) % 60;
228
229
	text = g_strdup_printf ("%02i:%02i:%02i", hrs, mn, sec);
230
	obj->priv->time = gtk_label_new (text);
231
	g_free (text);
232
233
	gtk_misc_set_alignment (GTK_MISC (obj->priv->time), 1.0, 1.0);
234
	gtk_table_attach (GTK_TABLE (table), obj->priv->time,
235
			  1,
236
			  2,
237
			  0,
238
			  1, 
239
			  GTK_FILL,
240
			  GTK_FILL,
241
			  0,
242
			  0);
243
	if (rate > 0) {
244
		label = gtk_label_new (_("Average drive speed:"));
245
		gtk_misc_set_alignment (GTK_MISC (label), 0.0, 1.0);
246
		gtk_table_attach (GTK_TABLE (table), label,
247
				  0,
248
				  1,
249
				  1,
250
				  2, 
251
				  GTK_EXPAND|GTK_FILL,
252
				  GTK_EXPAND|GTK_FILL,
253
				  0,
254
				  0);
255
1.1.13 by Pedro Fragoso
Import upstream version 0.8.3
256
		if (media & BRASERO_MEDIUM_DVD)
1.1.12 by Pedro Fragoso
Import upstream version 0.8.2
257
			speed = (gfloat) BRASERO_RATE_TO_SPEED_DVD (rate);
1.1.13 by Pedro Fragoso
Import upstream version 0.8.3
258
		else if (media & BRASERO_MEDIUM_BD)
259
			speed = (gfloat) BRASERO_RATE_TO_SPEED_BD (rate);
1.1.12 by Pedro Fragoso
Import upstream version 0.8.2
260
		else
261
			speed = (gfloat) BRASERO_RATE_TO_SPEED_CD (rate);
262
263
		text = g_strdup_printf ("%"G_GINT64_FORMAT" KiB/s (%.1f x)", rate / 1024, speed);
264
		obj->priv->speed = gtk_label_new (text);
265
		g_free (text);
266
267
		gtk_misc_set_alignment (GTK_MISC (obj->priv->speed), 1.0, 0.0);
268
		gtk_table_attach (GTK_TABLE (table), obj->priv->speed,
269
				  1,
270
				  2,
271
				  1,
272
				  2, 
273
				  GTK_FILL,
274
				  GTK_FILL,
275
				  0,
276
				  0);
277
	}
278
279
	gtk_box_pack_start (GTK_BOX (obj), table, TRUE, TRUE, 20);
280
	gtk_widget_show_all (table);
281
1.1.13 by Pedro Fragoso
Import upstream version 0.8.3
282
	text = g_format_size_for_display (written);
1.1.12 by Pedro Fragoso
Import upstream version 0.8.2
283
	gtk_label_set_text (GTK_LABEL (obj->priv->bytes_written), text);
284
	gtk_widget_show (obj->priv->bytes_written);
285
	g_free (text);
286
}
287
1.1.7 by Luis Medinas
Import upstream version 0.7.0
288
static void
289
brasero_burn_progress_set_property (GObject *object,
290
				    guint property_id,
291
				    const GValue *value,
292
				    GParamSpec *pspec)
293
{
294
	BraseroBurnProgress *progress;
295
296
	progress = BRASERO_BURN_PROGRESS (object);
297
	switch (property_id) {
298
	case PROP_SHOW_INFO:
299
		if (!g_value_get_boolean (value)) {
300
			if (progress->priv->speed_time_info) {
301
				gtk_widget_destroy (progress->priv->speed_time_info);
302
				progress->priv->speed_time_info = NULL;
303
				progress->priv->speed = NULL;
304
				progress->priv->time = NULL;
305
			}
306
		}
307
		else if (progress->priv->speed_time_info)
308
			brasero_burn_progress_create_info (progress);
309
		break;
310
311
	default:
312
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
313
	}
314
}
315
316
static void
317
brasero_burn_progress_get_property (GObject *object,
318
				    guint property_id,
319
				    GValue *value,
320
				    GParamSpec *pspec)
321
{
322
	BraseroBurnProgress *progress;
323
324
	progress = BRASERO_BURN_PROGRESS (object);
325
	switch (property_id) {
326
	case PROP_SHOW_INFO:
327
		g_value_set_boolean (value, (progress->priv->speed_time_info != NULL));
328
		break;
329
330
	default:
331
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
332
	}
333
}
334
335
static void
336
brasero_burn_progress_init (BraseroBurnProgress *obj)
337
{
338
	GtkWidget *box;
339
340
	obj->priv = g_new0 (BraseroBurnProgressPrivate, 1);
341
	gtk_box_set_spacing (GTK_BOX (obj), 2);
342
343
	box = gtk_hbox_new (FALSE, 24);
344
	gtk_box_pack_start (GTK_BOX (obj), box, FALSE, FALSE, 0);
345
346
	obj->priv->action = gtk_label_new (NULL);
347
	gtk_label_set_ellipsize (GTK_LABEL (obj->priv->action), PANGO_ELLIPSIZE_END);
348
	gtk_label_set_max_width_chars (GTK_LABEL (obj->priv->action), 32);
349
	gtk_misc_set_alignment (GTK_MISC (obj->priv->action), 0, 0.5);
350
	gtk_misc_set_padding (GTK_MISC (obj->priv->action), 0, 0);
351
	gtk_box_pack_start (GTK_BOX (box), obj->priv->action, TRUE, TRUE, 0);
352
353
	obj->priv->bytes_written = gtk_label_new (NULL);
354
	gtk_misc_set_alignment (GTK_MISC (obj->priv->bytes_written), 1.0, 0.5);
355
	gtk_misc_set_padding (GTK_MISC (obj->priv->bytes_written), 0, 0);
356
	gtk_box_pack_start (GTK_BOX (box), obj->priv->bytes_written, TRUE, TRUE, 0);
357
358
	box = gtk_hbox_new (FALSE, 0);
359
	obj->priv->progress = gtk_progress_bar_new ();
360
	gtk_progress_bar_set_text (GTK_PROGRESS_BAR (obj->priv->progress), " ");
361
	gtk_box_pack_start (GTK_BOX (box), obj->priv->progress, TRUE, TRUE, 0);
362
	gtk_box_pack_start (GTK_BOX (obj), box, TRUE, TRUE, 0);
363
	
364
	brasero_burn_progress_create_info (obj);
365
	
366
	gtk_widget_show_all (GTK_WIDGET (obj));
367
}
368
369
static void
370
brasero_burn_progress_stop_blinking (BraseroBurnProgress *self)
371
{
372
	if (self->priv->pulse_id) {
373
		g_source_remove (self->priv->pulse_id);
374
		self->priv->pulse_id = 0;
375
	
376
		gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (self->priv->progress),
377
					       self->priv->current_progress);
378
	}
379
}
380
381
static void
382
brasero_burn_progress_finalize (GObject *object)
383
{
384
	BraseroBurnProgress *cobj;
385
386
	cobj = BRASERO_BURN_PROGRESS (object);
387
	if (cobj->priv->pulse_id) {
388
		g_source_remove (cobj->priv->pulse_id);
389
		cobj->priv->pulse_id = 0;
390
	}
391
392
	g_free (cobj->priv);
393
	G_OBJECT_CLASS (parent_class)->finalize (object);
394
}
395
396
GtkWidget *
397
brasero_burn_progress_new ()
398
{
399
	BraseroBurnProgress *obj;
400
	
401
	obj = BRASERO_BURN_PROGRESS (g_object_new (BRASERO_TYPE_BURN_PROGRESS, NULL));
402
	
403
	return GTK_WIDGET (obj);
404
}
405
406
static gboolean
407
brasero_burn_progress_pulse_cb (BraseroBurnProgress *self)
408
{
409
	gtk_progress_bar_pulse (GTK_PROGRESS_BAR (self->priv->progress));
410
	return TRUE;
411
}
412
413
static void
414
brasero_burn_progress_start_blinking (BraseroBurnProgress *self)
415
{
416
	self->priv->current_progress = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (self->priv->progress));
417
	if (!self->priv->pulse_id)
418
		self->priv->pulse_id = g_timeout_add (150,
419
						      (GSourceFunc) brasero_burn_progress_pulse_cb,
420
						      self);
421
}
422
423
void
424
brasero_burn_progress_set_status (BraseroBurnProgress *self,
1.1.13 by Pedro Fragoso
Import upstream version 0.8.3
425
				  BraseroMedia media,
1.1.7 by Luis Medinas
Import upstream version 0.7.0
426
				  gdouble overall_progress,
427
				  gdouble action_progress,
428
				  glong remaining,
429
				  gint mb_isosize,
430
				  gint mb_written,
431
				  gint64 rate)
432
{
433
	gchar *text;
434
435
	if (action_progress < 0.0) {
436
		gtk_progress_bar_set_text (GTK_PROGRESS_BAR (self->priv->progress), " ");
437
		brasero_burn_progress_start_blinking (self);
438
		return;
439
	}
440
441
	if (self->priv->current == BRASERO_BURN_ACTION_NONE) {
442
		if (self->priv->time)
443
			gtk_label_set_text (GTK_LABEL (self->priv->time), " ");
444
		if (self->priv->bytes_written)
445
			gtk_label_set_text (GTK_LABEL (self->priv->bytes_written), " ");
446
		if (self->priv->speed)
447
			gtk_label_set_text (GTK_LABEL (self->priv->speed), " ");
448
449
		return;
450
	}
451
452
	if (self->priv->pulse_id)
453
		brasero_burn_progress_stop_blinking (self);
454
455
	gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (self->priv->progress), 
456
				       action_progress);
457
458
	text = g_strdup_printf ("%i%%", (gint) (action_progress * 100));
459
	gtk_progress_bar_set_text (GTK_PROGRESS_BAR (self->priv->progress), text);
460
	g_free (text);
461
462
	if (remaining >= 0 && self->priv->time) {
463
		int hrs, mn, sec;
464
465
		hrs = remaining / 3600;
466
		remaining = ((int) remaining) % 3600;
467
		mn = remaining / 60;
468
		sec = ((int) remaining) % 60;
469
470
		text = g_strdup_printf ("%02i:%02i:%02i", hrs, mn, sec);
471
		gtk_label_set_text (GTK_LABEL (self->priv->time), text);
472
		g_free (text);
473
	}
474
	else if (self->priv->time)
475
		gtk_label_set_text (GTK_LABEL (self->priv->time), " ");
476
477
	if (self->priv->current == BRASERO_BURN_ACTION_BLANKING) {
478
		if (self->priv->bytes_written)
479
			gtk_label_set_text (GTK_LABEL (self->priv->bytes_written), " ");
480
		if (self->priv->speed)
481
			gtk_label_set_text (GTK_LABEL (self->priv->speed), " ");
482
		return;
483
	}
484
485
	if (rate > 0 && self->priv->speed) {
486
		gfloat speed;
487
1.1.13 by Pedro Fragoso
Import upstream version 0.8.3
488
		if (media & BRASERO_MEDIUM_DVD)
1.1.12 by Pedro Fragoso
Import upstream version 0.8.2
489
			speed = (gfloat) BRASERO_RATE_TO_SPEED_DVD (rate);
1.1.13 by Pedro Fragoso
Import upstream version 0.8.3
490
		else if (media & BRASERO_MEDIUM_BD)
491
			speed = (gfloat) BRASERO_RATE_TO_SPEED_BD (rate);
1.1.7 by Luis Medinas
Import upstream version 0.7.0
492
		else
1.1.12 by Pedro Fragoso
Import upstream version 0.8.2
493
			speed = (gfloat) BRASERO_RATE_TO_SPEED_CD (rate);
1.1.7 by Luis Medinas
Import upstream version 0.7.0
494
495
		text = g_strdup_printf ("%"G_GINT64_FORMAT" KiB/s (%.1f x)", rate / 1024, speed);
496
		gtk_label_set_text (GTK_LABEL (self->priv->speed), text);
497
		g_free (text);
498
	}
499
	else if (self->priv->speed)
500
		gtk_label_set_text (GTK_LABEL (self->priv->speed), " ");
501
502
	if (mb_isosize > 0 || mb_written > 0) {
503
		/* if we have just one, we can find the other */
504
		if (mb_isosize <= 0)
505
			mb_isosize = mb_written / action_progress;
506
507
		if (mb_written <= 0)
508
			mb_written = mb_isosize * action_progress;
509
510
		text = g_strdup_printf (_("%i MiB of %i MiB"), mb_written, mb_isosize);
511
		gtk_label_set_text (GTK_LABEL (self->priv->bytes_written), text);
512
		g_free (text);
513
	}
514
	else if (self->priv->bytes_written)
515
		gtk_label_set_text (GTK_LABEL (self->priv->bytes_written), " ");
516
}
517
518
void
519
brasero_burn_progress_set_action (BraseroBurnProgress *self,
520
				  BraseroBurnAction action,
521
				  const gchar *string)
522
{
523
	gchar *final_text;
524
525
	if (action != BRASERO_BURN_ACTION_NONE) {
526
		if (!string)
527
			string = brasero_burn_action_to_string (action);
528
	
529
		final_text = g_strconcat ("<i>", string, "</i>", NULL);
530
		gtk_label_set_markup (GTK_LABEL (self->priv->action), final_text);
531
		g_free (final_text);
532
533
		if (self->priv->current != action) {
534
			gtk_label_set_text (GTK_LABEL (self->priv->bytes_written), " ");
535
			if (self->priv->time)
536
				gtk_label_set_text (GTK_LABEL (self->priv->time), " ");
537
			if (self->priv->speed)
538
				gtk_label_set_text (GTK_LABEL (self->priv->speed), " ");
539
		}
540
	}
541
	else
542
		gtk_label_set_text (GTK_LABEL (self->priv->action), NULL);
543
544
	self->priv->current = action;
545
546
	if (action == BRASERO_BURN_ACTION_BLANKING)
547
		brasero_burn_progress_start_blinking (self);
548
	else if (action == BRASERO_BURN_ACTION_FINISHED)
549
		brasero_burn_progress_stop_blinking (self);
550
}
551
552
void
553
brasero_burn_progress_reset (BraseroBurnProgress *progress)
554
{
555
	brasero_burn_progress_stop_blinking (progress);
556
557
	progress->priv->current = BRASERO_BURN_ACTION_NONE;
558
	if (progress->priv->time)
559
		gtk_label_set_text (GTK_LABEL (progress->priv->time), NULL);
560
	if (progress->priv->speed)
561
		gtk_label_set_text (GTK_LABEL (progress->priv->speed), NULL);
562
	if (progress->priv->speed_time_info)
563
		gtk_label_set_text (GTK_LABEL (progress->priv->speed_time_info), NULL);
564
565
	gtk_label_set_text (GTK_LABEL (progress->priv->action), NULL);
566
	gtk_label_set_text (GTK_LABEL (progress->priv->bytes_written), NULL);
567
568
	gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress->priv->progress), 0.0);
569
	gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progress->priv->progress), NULL);
570
}