1 #ifdef HAVE_CONFIG_H
2 #  include "config.h"
3 #endif
4 
5 #include <glib.h>
6 #include <glib/gi18n.h>
7 #include "misc_utils.h"
8 #include "job_control.h"
display_info(const char * fpath,const struct stat * sb,int tflag,struct FTW * ftwbuf)9 #include "interface_common.h"
10 #include "main_window_handler.h"
11 
12 #include "status_frame_handler.h"
13 
14 #include "xpms/ripperX_box.xpm"
15 
16 
17 #define WMS_P_C_BUTTON_ACT          100
18 #define WMS_ABORT_BUTTON_ACT        101
19 #define WMS_ABORT_ALL_BUTTON_ACT    102
20 
21 #define WMS_TIME_UPDATE_CYCLE       1
22 
23 void time_status_frame_handler( int ops, GtkWidget *time_frame, _stat *stat );
24 
25 /* Callback data is a pinter to the int type */
26 void wms_p_c_button_clicked( GtkWidget *widget, gpointer callback_data );
27 void wms_abort_button_clicked( GtkWidget *widget, gpointer callback_data );
28 void wms_abort_all_button_clicked( GtkWidget *widget, gpointer callback_data );
29 
30 
31 void time_status_frame_handler( int ops, GtkWidget *time_frame, _stat *stat )
32 {
33 	static GtkWidget * table = NULL;
34 	static GtkWidget *total_time_elapsed_label, *total_time_remain_label;
35 	static GtkWidget *tracks_done_label, *tracks_remain_label;
36 	char buf[ 100 ];
37 
38 	switch ( ops ) {
39 	case WIDGET_CREATE : {
40 			GtkWidget * label;
41 
42 			if ( table != NULL )
43 				return;
44 
45 			table = gtk_table_new( 4, 2, TRUE );
46 
47 			gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
48 			gtk_container_add( GTK_CONTAINER( time_frame ), table );
49 
50 			label = gtk_label_new(_("Total time elapsed: "));
51 			gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
52 			gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
53 			                  GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0 );
54 			total_time_elapsed_label = gtk_label_new( time_to_readable( 0 ) );
55 			gtk_label_set_justify( GTK_LABEL( total_time_elapsed_label ), GTK_JUSTIFY_LEFT );
56 			gtk_table_attach( GTK_TABLE( table ), total_time_elapsed_label, 1, 2, 0, 1,
57 			                  GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0 );
58 
59 			label = gtk_label_new(_("Total time remaining: "));
60 			gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
61 			gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
62 			                  GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0 );
63 			total_time_remain_label = gtk_label_new( time_to_readable( 0 ) );
64 			gtk_label_set_justify( GTK_LABEL( total_time_remain_label ), GTK_JUSTIFY_LEFT );
65 			gtk_table_attach( GTK_TABLE( table ), total_time_remain_label, 1, 2, 1, 2,
66 			                  GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0 );
67 
68 			label = gtk_label_new(_("Tracks completed: "));
69 			gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
70 			gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 2, 3,
71 			                  GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0 );
72 			tracks_done_label = gtk_label_new( "0" );
73 			gtk_label_set_justify( GTK_LABEL( tracks_done_label ), GTK_JUSTIFY_LEFT );
74 			gtk_table_attach( GTK_TABLE( table ), tracks_done_label, 1, 2, 2, 3,
75 			                  GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0 );
76 
77 			label = gtk_label_new(_("Tracks remaining: "));
78 			gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
79 			gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 3, 4,
80 			                  GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0 );
81 			tracks_remain_label = gtk_label_new( "0" );
82 			gtk_label_set_justify( GTK_LABEL( tracks_remain_label ), GTK_JUSTIFY_LEFT );
83 			gtk_table_attach( GTK_TABLE( table ), tracks_remain_label, 1, 2, 3, 4,
84 			                  GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0 );
85 
86 			gtk_widget_show_all( table );
87 			return;
88 		}
89 
90 	case WIDGET_UPDATE :
91 
92 		gtk_label_set_text( GTK_LABEL( total_time_elapsed_label ), time_to_readable( stat->total_time_elapsed ) );
93 		gtk_label_set_text( GTK_LABEL( total_time_remain_label ), time_to_readable( stat->total_time_remain ) );
94 		snprintf( buf, sizeof( buf ), "%d", stat->tracks_done );
95 		gtk_label_set_text( GTK_LABEL( tracks_done_label ), buf );
96 		snprintf( buf, sizeof( buf ), "%d", stat->tracks_remain );
97 		gtk_label_set_text( GTK_LABEL( tracks_remain_label ), buf );
98 
99 		return;
100 
101 	case WIDGET_DESTROY :
102 		if ( table == NULL )
103 			return;
104 		gtk_widget_destroy( table );
105 		table = NULL;
106 		return;
107 	}
108 }
109 
110 /* Callback data is pointer to type */
111 
112 void wms_p_c_button_clicked( GtkWidget *widget, gpointer callback_data )
113 {
114 	wm_status_frame_handler( WMS_P_C_BUTTON_ACT, *( int *) callback_data,
115 	                         NULL, NULL );
116 }
117 
118 void wms_abort_button_clicked( GtkWidget *widget, gpointer callback_data )
119 {
120 	wm_status_frame_handler( WMS_ABORT_BUTTON_ACT, *( int *) callback_data,
121 	                         NULL, NULL );
122 }
123 
124 void wm_status_frame_handler( int ops, int type,
125                               _stat *stat, char *graph_string )
126 {
127 	static GtkWidget * vbox = NULL, *wav_pbar, *mp3_pbar, *total_pbar;
128 	static GtkWidget *time_frame, *wav_plabel, *mp3_plabel, *total_plabel;
129 	static GtkWidget *wav_tlabel, *mp3_tlabel;
130 	static GtkWidget *hbox;
131 	static GtkWidget *p_c_button, *pause_label, *cont_label;
132 	static GtkWidget *pixmap = NULL;
133 	static char percentage_buf[ 10 ];
134 	static char graph_string_buf[ 50 ];
135 	static int count;
136 	static GdkPixmap *gdk_pixmap;
137 	static GdkBitmap *mask;
138 	char buf[ MAX_FILE_NAME_LENGTH + 100 ];
139 
140 	switch ( ops ) {
141 	case WIDGET_CREATE : {
142 			GtkWidget * main_frame, *label, *button, *temp_hbox, *separator;
143 			GtkStyle *style;
144 			GdkGC *gc;
145 
146 			if ( vbox != NULL )
147 				return;
148 
149 			count = WMS_TIME_UPDATE_CYCLE - 1;
150 			main_frame = main_window_handler( MW_REQUEST_MF, 0, NULL );
151 
152 			vbox = gtk_vbox_new( FALSE, 5 );
153 			gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
154 			gtk_container_add( GTK_CONTAINER( main_frame ), vbox );
155 			gtk_widget_realize( vbox );
156 
157 			/* Create pixmap */
158 			if ( pixmap == NULL ) {
159 				style = gtk_widget_get_default_style();
160 				gc = style->black_gc;
161 				gdk_pixmap = gdk_pixmap_create_from_xpm_d( vbox->window, &mask,
162 				             &style->bg[ GTK_STATE_NORMAL ],
163 				             ripperX_box_xpm );
164 			}
165 
166 			/* ripping progress */
167 			hbox = gtk_hbox_new( FALSE, 0 );
168 			gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, FALSE, 0 );
169 			sprintf( buf, _("Ripping track %d"), stat->wav_track + 1 );
170 			wav_tlabel = gtk_label_new( buf );
171 			gtk_label_set_justify( GTK_LABEL( wav_tlabel ), GTK_JUSTIFY_LEFT );
172 			gtk_widget_set_size_request( wav_tlabel, 130, -1 );
173 			gtk_box_pack_start( GTK_BOX( hbox ), wav_tlabel, FALSE, FALSE, 0 );
174 
175 			wav_pbar = gtk_progress_bar_new();
176 			gtk_widget_set_size_request( wav_pbar, 250, 22 );
177 			gtk_box_pack_start( GTK_BOX( hbox ), wav_pbar, FALSE, FALSE, 0 );
178 			wav_plabel = gtk_label_new( " 0%" );
179 			gtk_box_pack_start( GTK_BOX( hbox ), wav_plabel, FALSE, FALSE, 0 );
180 
181 			/* encoding progress */
182 			hbox = gtk_hbox_new( FALSE, 0 );
183 			gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, FALSE, 0 );
184 			sprintf( buf, _("Encoding track %d"), stat->wav_track + 1 );
185 			mp3_tlabel = gtk_label_new( buf );
186 			gtk_label_set_justify( GTK_LABEL( mp3_tlabel ), GTK_JUSTIFY_LEFT );
187 			gtk_widget_set_size_request( mp3_tlabel, 130, -1 );
188 			gtk_box_pack_start( GTK_BOX( hbox ), mp3_tlabel, FALSE, FALSE, 0 );
189 
190 			mp3_pbar = gtk_progress_bar_new();
191 			gtk_widget_set_size_request( mp3_pbar, 250, 22 );
192 			gtk_box_pack_start( GTK_BOX( hbox ), mp3_pbar, FALSE, FALSE, 0 );
193 			mp3_plabel = gtk_label_new( " 0%" );
194 			gtk_box_pack_start( GTK_BOX( hbox ), mp3_plabel, FALSE, FALSE, 0 );
195 
196 			/* total progress */
197 			hbox = gtk_hbox_new( FALSE, 0 );
198 			gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, FALSE, 0 );
199 			label = gtk_label_new(_("Total progress"));
200 			gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
201 			gtk_widget_set_size_request( label, 130, -1 );
202 			gtk_box_pack_start( GTK_BOX( hbox ), label, FALSE, FALSE, 0 );
203 
204 			total_pbar = gtk_progress_bar_new();
205 			gtk_widget_set_size_request( total_pbar, 250, 22 );
206 			gtk_box_pack_start( GTK_BOX( hbox ), total_pbar, FALSE, FALSE, 0 );
207 			total_plabel = gtk_label_new( " 0%" );
208 			gtk_box_pack_start( GTK_BOX( hbox ), total_plabel, FALSE, FALSE, 0 );
209 
210 
211 			/* Row with time frame & pixmap */
212 			temp_hbox = gtk_hbox_new( FALSE, 10 );
213 			gtk_box_pack_start( GTK_BOX( vbox ), temp_hbox, TRUE, TRUE, 0 );
214 
215 			time_frame = gtk_frame_new(_("Time info"));
216 			gtk_widget_set_size_request( time_frame, 275, 0 );
217 			gtk_box_pack_start( GTK_BOX( temp_hbox ), time_frame, FALSE, FALSE, 0 );
218 
219 			time_status_frame_handler( WIDGET_CREATE, time_frame, stat );
220 
221 			/* Pixmap */
222 			pixmap = gtk_pixmap_new( gdk_pixmap, mask );
223 			gtk_box_pack_start( GTK_BOX( temp_hbox ), pixmap, TRUE, TRUE, 0 );
224 
225 			/* Separator */
226 			separator = gtk_hseparator_new();
227 			gtk_widget_set_size_request( separator, 0, 10 );
228 			gtk_box_pack_start( GTK_BOX( vbox ), separator, FALSE, FALSE, 0 );
229 
230 			/* Buttons row */
231 			temp_hbox = gtk_hbox_new( FALSE, 0 );
232 			gtk_box_pack_start( GTK_BOX( vbox ), temp_hbox, TRUE, TRUE, 0 );
233 
234 			/* Abort button */
235 			button = gtk_button_new_with_label(_("Abort"));
236 			GTK_WIDGET_SET_FLAGS( button, GTK_CAN_DEFAULT );
237 			gtk_widget_set_size_request( button, 80, -1 );
238 			g_signal_connect ( G_OBJECT ( button ), "clicked",
239 			                     G_CALLBACK ( wms_abort_button_clicked ),
240 			                     &type );
241 			gtk_box_pack_end( GTK_BOX( temp_hbox ), button, FALSE, FALSE, 0 );
242 
243 			/* Pause continue button */
244 			p_c_button = gtk_button_new();
245 			GTK_WIDGET_SET_FLAGS( p_c_button, GTK_CAN_DEFAULT );
246 			gtk_widget_set_size_request( p_c_button, 80, 0 );
247 			pause_label = gtk_label_new(_("Pause"));
248 			gtk_container_add( GTK_CONTAINER( p_c_button ), pause_label );
249 			g_signal_connect ( G_OBJECT ( p_c_button ), "clicked",
250 			                     G_CALLBACK ( wms_p_c_button_clicked ),
251 			                     &type );
252 			gtk_box_pack_end( GTK_BOX( temp_hbox ), p_c_button, FALSE, FALSE, 0 );
253 			gtk_widget_grab_default( p_c_button );
254 
255 			cont_label = NULL;
256 
257 			gtk_widget_show_all( vbox );
258 			return;
259 		}
260 
261 	case WIDGET_UPDATE :
262 
263 		if ( count++ < WMS_TIME_UPDATE_CYCLE )
264 			return;
265 
266 		if ( stat->ripping ) {
267 			gtk_widget_set_sensitive( wav_tlabel, TRUE );
268 			gtk_widget_set_sensitive( wav_pbar, TRUE );
269 			gtk_widget_set_sensitive( wav_plabel, TRUE );
270 			sprintf( buf, _("Ripping track %d"), stat->wav_track + 1 );
271 			gtk_label_set_text( GTK_LABEL( wav_tlabel ), buf );
272 			gtk_progress_bar_update( GTK_PROGRESS_BAR( wav_pbar ), stat->wav_progress );
273 
274 			snprintf( percentage_buf, sizeof( percentage_buf ),
275 			          "%2d%%", ( int ) ( stat->wav_progress * 100 ) );
276 			gtk_label_set_text( GTK_LABEL( wav_plabel ), percentage_buf );
277 		} else {
278 			gtk_widget_set_sensitive( wav_tlabel, FALSE );
279 			gtk_widget_set_sensitive( wav_pbar, FALSE );
280 			gtk_widget_set_sensitive( wav_plabel, FALSE );
281 			gtk_label_set_text( GTK_LABEL( wav_tlabel ), _("Not ripping") );
282 			gtk_progress_bar_update( GTK_PROGRESS_BAR( wav_pbar ), 0 );
283 			gtk_label_set_text( GTK_LABEL( wav_plabel ), "-" );
284 		}
285 
286 		if ( stat->encoding ) {
287 			gtk_widget_set_sensitive( mp3_tlabel, TRUE );
288 			gtk_widget_set_sensitive( mp3_pbar, TRUE );
289 			gtk_widget_set_sensitive( mp3_plabel, TRUE );
290 			sprintf( buf, _("Encoding track %d"), stat->mp3_track + 1 );
291 			gtk_label_set_text( GTK_LABEL( mp3_tlabel ), buf );
292 			gtk_progress_bar_update( GTK_PROGRESS_BAR( mp3_pbar ), stat->mp3_progress );
293 
294 			snprintf( percentage_buf, sizeof( percentage_buf ),
295 			          "%2d%%", ( int ) ( stat->mp3_progress * 100 ) );
296 			gtk_label_set_text( GTK_LABEL( mp3_plabel ), percentage_buf );
297 		} else {
298 			gtk_widget_set_sensitive( mp3_tlabel, FALSE );
299 			gtk_widget_set_sensitive( mp3_pbar, FALSE );
300 			gtk_widget_set_sensitive( mp3_plabel, FALSE );
301 			gtk_label_set_text( GTK_LABEL( mp3_tlabel ), _("Not encoding") );
302 			gtk_progress_bar_update( GTK_PROGRESS_BAR( mp3_pbar ), 0 );
303 			gtk_label_set_text( GTK_LABEL( mp3_plabel ), "-" );
304 		}
305 
306                 /* 2002/03/15 - <tmancill@debian.org> - hack to ensure that
307                   stat->total_progress is always between 0 and 1 */
308 
309 		gtk_progress_bar_update( GTK_PROGRESS_BAR( total_pbar ),
310                                       (stat->total_progress < 0.0) ? 0.0
311                                       : (stat->total_progress > 1.0) ? 1.0
312                                       : stat->total_progress );
313 
314                 snprintf( percentage_buf, sizeof( percentage_buf ), "%2d%%",
315                          ( int ) ( ((stat->total_progress < 0.0) ? 0.0
316                                : (stat->total_progress > 1.0) ? 1.0
317                                : stat->total_progress) * 100 ) );
318 
319 		gtk_label_set_text( GTK_LABEL( total_plabel ), percentage_buf );
320 
321 		if ( graph_string != NULL ) {
322 			snprintf( graph_string_buf, sizeof( graph_string_buf ),
323 			          "Cdparanoia: %s", graph_string );
324 			main_window_handler( MW_UPDATE_STATUSBAR, graph_string_buf, NULL );
325 		}
326 
327 		if ( !stat->ripping )
328 			main_window_handler( MW_UPDATE_STATUSBAR, "", NULL );
329 
330 
331 		time_status_frame_handler( WIDGET_UPDATE, time_frame, stat );
332 		count = 0;
333 
334 		return;
335 
336 	case WMS_P_C_BUTTON_ACT :
337 		if ( pause_label != NULL ) {
338 			job_controller( JC_PAUSE, NULL );
339 
340 			gtk_widget_destroy( pause_label );
341 			pause_label = NULL;
342 			cont_label = gtk_label_new(_("Continue"));
343 			gtk_container_add( GTK_CONTAINER( p_c_button ), cont_label );
344 			gtk_widget_show( cont_label );
345 		} else {
346 			job_controller( JC_CONT, NULL );
347 
348 			gtk_widget_destroy( cont_label );
349 			cont_label = NULL;
350 			pause_label = gtk_label_new(_("Pause"));
351 			gtk_container_add( GTK_CONTAINER( p_c_button ), pause_label );
352 			gtk_widget_show( pause_label );
353 		}
354 		return;
355 
356 	case WMS_ABORT_BUTTON_ACT :
357 	case WMS_ABORT_ALL_BUTTON_ACT :
358 
359 		job_controller( JC_PAUSE, NULL );
360 
361 		if ( dialog_handler( WIDGET_CREATE, FALSE, DL_ABORT_CONFIRM,
362 			                     FALSE, NULL, NULL, 0 ) == FALSE ) {
363 			job_controller( JC_CONT, NULL );
364 			return;
365 		}
366 
367 		if ( dialog_handler( WIDGET_CREATE, FALSE, DL_DELETE_ON_ABORT,
368 			                     FALSE, NULL, NULL, 0 ) == TRUE ) {
369 			if ( ops == WMS_ABORT_BUTTON_ACT )
370 				job_controller( JC_ABORT_DELETE, NULL );
371 
372 			else
373 				job_controller( JC_ABORT_ALL_DELETE, NULL );
374 		} else {
375 			if ( ops == WMS_ABORT_BUTTON_ACT )
376 				job_controller( JC_ABORT, NULL );
377 			else
378 				job_controller( JC_ABORT_ALL, NULL );
379 		}
380 		return;
381 
382 	case WIDGET_DESTROY :
383 		main_window_handler( MW_CLEAR_STATUSBAR, NULL , NULL );
384 		time_status_frame_handler( WIDGET_DESTROY, NULL, NULL );
385 		if ( vbox == NULL )
386 			return;
387 		gtk_widget_destroy( vbox );
388 		vbox = NULL;
389 		return;
390 	}
391 }
392