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