2 * page_clips.c -- Clips Page Handling
3 * Copyright (C) 2002-2003 Charles Yates <charles.yates@pandora.be>
4 * Copyright (C) 2010 Dan Dennedy <dan@dennedy.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
29 #include <gdk/gdkkeysyms.h>
31 #include "interface.h"
33 #include "dv1394app.h"
47 // TODO: This comes out later
49 GtkWidget
*modes
[ 4 ];
51 struct page_t
*parent_page
;
53 *page_clips
, page_clips_t
;
55 static GtkWidget
*this_page_get_widget( page_clips
this );
57 static void list_clips( page_clips
this, char *path
)
59 GtkWidget
*treeview
= lookup_widget( this_page_get_widget( this ), "list_clips" );
60 GtkWidget
*dirview
= lookup_widget( this_page_get_widget( this ), "list_dir" );
61 GtkWidget
*label
= lookup_widget( this_page_get_widget( this ), "label_directory" );
64 mvcp_dir dir
= mvcp_dir_init( this->dv
, path
);
65 GtkListStore
*dir_store
= NULL
;
66 GtkListStore
*clip_store
= NULL
;
69 mvcp_dir_entry_t entry
;
72 this->path
= strdup( path
);
74 gtk_label_set_text( GTK_LABEL( label
), this->path
);
76 if ( gtk_tree_view_get_model( GTK_TREE_VIEW( treeview
) ) == NULL
)
78 GtkCellRenderer
*renderer
;
79 GtkTreeViewColumn
*column
;
81 clip_store
= gtk_list_store_new( 2, G_TYPE_STRING
, G_TYPE_STRING
);
82 gtk_tree_view_set_model( GTK_TREE_VIEW( treeview
), GTK_TREE_MODEL( clip_store
) );
84 renderer
= gtk_cell_renderer_text_new( );
85 column
= gtk_tree_view_column_new_with_attributes ( "Description", renderer
, "text", 0, NULL
);
86 gtk_tree_view_column_set_sort_column_id( column
, 0 );
87 gtk_tree_view_append_column( GTK_TREE_VIEW( treeview
), column
);
89 dir_store
= gtk_list_store_new( 2, G_TYPE_STRING
, G_TYPE_STRING
);
90 gtk_tree_view_set_model( GTK_TREE_VIEW( dirview
), GTK_TREE_MODEL( dir_store
) );
92 renderer
= gtk_cell_renderer_text_new( );
93 column
= gtk_tree_view_column_new_with_attributes ( "Description", renderer
, "text", 0, NULL
);
94 gtk_tree_view_column_set_sort_column_id( column
, 0 );
95 gtk_tree_view_append_column( GTK_TREE_VIEW( dirview
), column
);
99 clip_store
= GTK_LIST_STORE( gtk_tree_view_get_model( GTK_TREE_VIEW( treeview
) ) );
100 dir_store
= GTK_LIST_STORE( gtk_tree_view_get_model( GTK_TREE_VIEW( dirview
) ) );
101 gtk_list_store_clear( clip_store
);
102 gtk_list_store_clear( dir_store
);
105 if ( strcmp( path
, "/" ) )
107 gtk_list_store_append( clip_store
, &iter
);
108 gtk_list_store_set( clip_store
, &iter
, 0, "..", -1 );
109 gtk_list_store_append( dir_store
, &iter
);
110 gtk_list_store_set( dir_store
, &iter
, 0, "..", -1 );
113 for ( index
= 0; index
< mvcp_dir_count( dir
); index
++ )
115 mvcp_dir_get( dir
, index
, &entry
);
116 if ( strchr( entry
.name
, '/' ) )
118 gtk_list_store_append( dir_store
, &iter
);
119 gtk_list_store_set( dir_store
, &iter
, 0, entry
.name
, -1 );
123 gtk_list_store_append( clip_store
, &iter
);
124 gtk_list_store_set( clip_store
, &iter
, 0, entry
.name
, -1 );
128 mvcp_dir_close( dir
);
132 gtk_label_set_text( GTK_LABEL( label
), "Disconnected" );
133 if ( gtk_tree_view_get_model( GTK_TREE_VIEW( treeview
) ) )
135 GtkListStore
*list_store
= GTK_LIST_STORE( gtk_tree_view_get_model( GTK_TREE_VIEW( treeview
) ) );
136 gtk_list_store_clear( list_store
);
137 list_store
= GTK_LIST_STORE( gtk_tree_view_get_model( GTK_TREE_VIEW( dirview
) ) );
138 gtk_list_store_clear( list_store
);
139 treeview
= lookup_widget( this_page_get_widget( this ), "treeview1" );
140 gtk_list_store_clear( list_store
);
145 static void list_queue( page_clips
this, int clip
)
147 GtkWidget
*treeview
= lookup_widget( this_page_get_widget( this ), "treeview1" );
148 mvcp_list list
= mvcp_list_init( this->dv
, dv1394app_get_selected_unit( this->app
) );
149 GtkListStore
*list_store
= NULL
;
153 mvcp_list_entry_t entry
;
155 if ( gtk_tree_view_get_model( GTK_TREE_VIEW( treeview
) ) == NULL
)
157 GtkCellRenderer
*renderer
;
158 GtkTreeViewColumn
*column
;
160 list_store
= gtk_list_store_new( 6,
167 gtk_tree_view_set_model( GTK_TREE_VIEW( treeview
), GTK_TREE_MODEL( list_store
) );
169 renderer
= gtk_cell_renderer_toggle_new( );
170 column
= gtk_tree_view_column_new_with_attributes ( "", renderer
, "active", 0, NULL
);
171 gtk_tree_view_append_column( GTK_TREE_VIEW( treeview
), column
);
173 renderer
= gtk_cell_renderer_text_new( );
174 column
= gtk_tree_view_column_new_with_attributes ( "Clip", renderer
, "text", 1, NULL
);
175 gtk_tree_view_append_column( GTK_TREE_VIEW( treeview
), column
);
177 renderer
= gtk_cell_renderer_text_new( );
178 column
= gtk_tree_view_column_new_with_attributes ( "In", renderer
, "text", 2, NULL
);
179 gtk_tree_view_append_column( GTK_TREE_VIEW( treeview
), column
);
181 renderer
= gtk_cell_renderer_text_new( );
182 column
= gtk_tree_view_column_new_with_attributes ( "Out", renderer
, "text", 3, NULL
);
183 gtk_tree_view_append_column( GTK_TREE_VIEW( treeview
), column
);
185 renderer
= gtk_cell_renderer_text_new( );
186 column
= gtk_tree_view_column_new_with_attributes ( "Length", renderer
, "text", 4, NULL
);
187 gtk_tree_view_append_column( GTK_TREE_VIEW( treeview
), column
);
192 list_store
= GTK_LIST_STORE( gtk_tree_view_get_model( GTK_TREE_VIEW( treeview
) ) );
193 gtk_list_store_clear( list_store
);
196 this->generation
= list
->generation
;
198 for ( index
= 0; index
< mvcp_list_count( list
); index
++ )
200 char tc1
[12], tc2
[12], tc3
[12];
201 mvcp_list_get( list
, index
, &entry
);
202 gtk_list_store_append( list_store
, &iter
);
203 gtk_list_store_set( list_store
, &iter
,
206 2, frames2tc( entry
.in
, entry
.fps
, tc1
),
207 3, frames2tc( entry
.out
, entry
.fps
, tc2
),
208 4, frames2tc( entry
.size
, entry
.fps
, tc3
),
214 if ( clip
< mvcp_list_count( list
) )
216 path
= gtk_tree_path_new_from_indices( this->clip
, -1 );
217 gtk_tree_view_scroll_to_cell( GTK_TREE_VIEW( treeview
), path
, NULL
, TRUE
, 0.5, 0 );
218 gtk_tree_path_free( path
);
221 mvcp_list_close( list
);
224 static void list_active( page_clips
this, int clip
)
226 GtkWidget
*treeview
= lookup_widget( this_page_get_widget( this ), "treeview1" );
227 GtkListStore
*list_store
= GTK_LIST_STORE( gtk_tree_view_get_model( GTK_TREE_VIEW( treeview
) ) );
228 GtkTreePath
*path
= gtk_tree_path_new_from_indices( this->clip
, -1 );
231 gtk_tree_model_get_iter( GTK_TREE_MODEL (list_store
), &iter
, path
);
232 gtk_tree_path_free( path
);
233 gtk_list_store_set( list_store
, &iter
, 0, FALSE
, -1 );
236 path
= gtk_tree_path_new_from_indices( this->clip
, -1 );
237 gtk_tree_view_scroll_to_cell( GTK_TREE_VIEW( treeview
), path
, NULL
, TRUE
, 0.5, 0 );
238 gtk_tree_model_get_iter( GTK_TREE_MODEL (list_store
), &iter
, path
);
239 gtk_tree_path_free( path
);
240 gtk_list_store_set( list_store
, &iter
, 0, TRUE
, -1 );
243 static gboolean
on_ok( GtkWidget
*dummy
, gpointer data
)
245 page_clips
this = data
;
246 GtkWidget
*widget
= lookup_widget( this_page_get_widget( this ), "list_clips" );
247 GtkTreeSelection
*select
= gtk_tree_view_get_selection( GTK_TREE_VIEW( widget
) );
252 if ( gtk_tree_selection_get_selected( select
, &model
, &iter
) )
254 gtk_tree_model_get( model
, &iter
, 0, &text
, -1 );
256 if ( !strcmp( text
, ".." ) )
258 char *temp
= strdup( this->path
);
259 temp
[ strlen( temp
) - 1 ] = '\0';
260 *( strrchr( temp
, '/' ) + 1 ) = '\0';
261 list_clips( this, temp
);
266 char *temp
= malloc( strlen( this->path
) + strlen( text
) + 1 );
267 strcpy( temp
, this->path
);
268 strcat( temp
, text
);
272 mvcp_unit_load_back( this->dv
, dv1394app_get_selected_unit( this->app
), temp
);
273 mvcp_unit_play( this->dv
, dv1394app_get_selected_unit( this->app
) );
276 mvcp_unit_load( this->dv
, dv1394app_get_selected_unit( this->app
), temp
);
279 mvcp_unit_append( this->dv
, dv1394app_get_selected_unit( this->app
), temp
, -1, -1 );
283 GtkWidget
*widget
= lookup_widget( this_page_get_widget( this ), "treeview1" );
284 GtkTreeSelection
*select
= gtk_tree_view_get_selection( GTK_TREE_VIEW( widget
) );
289 if ( gtk_tree_selection_get_selected( select
, &model
, &iter
) )
291 gtk_tree_model_get( model
, &iter
, 5, &clip
, -1 );
292 mvcp_unit_clip_insert( this->dv
, dv1394app_get_selected_unit( this->app
), mvcp_absolute
, clip
, temp
, -1, -1 );
307 static gboolean
on_dir( GtkWidget
*dummy
, gpointer data
)
309 page_clips
this = data
;
310 GtkWidget
*widget
= lookup_widget( this_page_get_widget( this ), "list_dir" );
311 GtkTreeSelection
*select
= gtk_tree_view_get_selection( GTK_TREE_VIEW( widget
) );
316 if ( gtk_tree_selection_get_selected( select
, &model
, &iter
) )
318 gtk_tree_model_get( model
, &iter
, 0, &text
, -1 );
320 if ( !strcmp( text
, ".." ) )
322 char *temp
= strdup( this->path
);
323 temp
[ strlen( temp
) - 1 ] = '\0';
324 *( strrchr( temp
, '/' ) + 1 ) = '\0';
325 list_clips( this, temp
);
328 else if ( text
[ strlen( text
) - 1 ] == '/' )
330 char *temp
= malloc( strlen( this->path
) + strlen( text
) + 1 );
331 strcpy( temp
, this->path
);
332 strcat( temp
, text
);
333 list_clips( this, temp
);
343 static gboolean
on_queue_item( GtkWidget
*dummy
, gpointer data
)
345 page_clips
this = data
;
346 GtkWidget
*widget
= lookup_widget( this_page_get_widget( this ), "treeview1" );
347 GtkTreeSelection
*select
= gtk_tree_view_get_selection( GTK_TREE_VIEW( widget
) );
352 if ( gtk_tree_selection_get_selected( select
, &model
, &iter
) )
354 gtk_tree_model_get( model
, &iter
, 5, &clip
, -1 );
355 mvcp_unit_clip_goto( this->dv
, dv1394app_get_selected_unit( this->app
), mvcp_absolute
, clip
, 0 );
356 mvcp_unit_play( this->dv
, dv1394app_get_selected_unit( this->app
) );
362 static gboolean
on_clip_selected( GtkWidget
*widget
, GdkEventButton
*event
, gpointer data
)
364 if ( event
->button
==1 && event
->type
==GDK_2BUTTON_PRESS
)
365 return on_ok( widget
, data
);
369 static gboolean
on_clip_key_press( GtkWidget
*widget
, GdkEventKey
*event
, gpointer data
)
371 if ( event
->keyval
== GDK_Return
)
372 return on_ok( widget
, data
);
376 static gboolean
on_dir_selected( GtkWidget
*widget
, GdkEventButton
*event
, gpointer data
)
378 if ( event
->button
==1 && event
->type
==GDK_2BUTTON_PRESS
)
379 return on_dir( widget
, data
);
383 static gboolean
on_dir_key_press( GtkWidget
*widget
, GdkEventKey
*event
, gpointer data
)
385 if ( event
->keyval
== GDK_Return
)
386 return on_dir( widget
, data
);
390 static gboolean
on_queue_selected( GtkWidget
*widget
, GdkEventButton
*event
, gpointer data
)
392 if ( event
->button
==1 && event
->type
==GDK_2BUTTON_PRESS
)
393 return on_queue_item( widget
, data
);
397 static gboolean
on_queue_key_press( GtkWidget
*widget
, GdkEventKey
*event
, gpointer data
)
399 if ( event
->keyval
== GDK_Return
)
400 return on_queue_item( widget
, data
);
404 static gboolean
on_home( GtkWidget
*button
, gpointer data
)
406 page_clips
this = data
;
407 list_clips( this, "/" );
411 static gboolean
on_refresh( GtkWidget
*button
, gpointer data
)
413 page_clips
this = data
;
414 char *temp
= strdup( this->path
);
415 list_clips( this, temp
);
421 static gboolean
on_up( GtkWidget
*dummy
, gpointer data
)
423 page_clips
this = data
;
424 GtkWidget
*widget
= lookup_widget( this_page_get_widget( this ), "treeview1" );
425 GtkTreeSelection
*select
= gtk_tree_view_get_selection( GTK_TREE_VIEW( widget
) );
430 if ( gtk_tree_selection_get_selected( select
, &model
, &iter
) )
432 gtk_tree_model_get( model
, &iter
, 5, &clip
, -1 );
433 mvcp_unit_clip_move( this->dv
, dv1394app_get_selected_unit( this->app
), mvcp_absolute
, clip
, mvcp_absolute
, clip
- 1 < 0 ?
0 : clip
- 1 );
438 static gboolean
on_down( GtkWidget
*dummy
, gpointer data
)
440 page_clips
this = data
;
441 GtkWidget
*widget
= lookup_widget( this_page_get_widget( this ), "treeview1" );
442 GtkTreeSelection
*select
= gtk_tree_view_get_selection( GTK_TREE_VIEW( widget
) );
447 if ( gtk_tree_selection_get_selected( select
, &model
, &iter
) )
449 gtk_tree_model_get( model
, &iter
, 5, &clip
, -1 );
450 mvcp_unit_clip_move( this->dv
, dv1394app_get_selected_unit( this->app
), mvcp_absolute
, clip
, mvcp_absolute
, clip
+ 1 );
455 static gboolean
on_remove( GtkWidget
*dummy
, gpointer data
)
457 page_clips
this = data
;
458 GtkWidget
*widget
= lookup_widget( this_page_get_widget( this ), "treeview1" );
459 GtkTreeSelection
*select
= gtk_tree_view_get_selection( GTK_TREE_VIEW( widget
) );
464 if ( gtk_tree_selection_get_selected( select
, &model
, &iter
) )
466 gtk_tree_model_get( model
, &iter
, 5, &clip
, -1 );
467 mvcp_unit_clip_remove( this->dv
, dv1394app_get_selected_unit( this->app
), mvcp_absolute
, clip
);
472 static gboolean
on_clean( GtkWidget
*dummy
, gpointer data
)
474 page_clips
this = data
;
475 mvcp_unit_clean( this->dv
, dv1394app_get_selected_unit( this->app
) );
479 void on_mode_change( GtkMenuItem
*menuitem
, gpointer data
)
481 page_clips
this = data
;
484 for ( index
= 0; index
< 4; index
++ )
485 if ( GTK_WIDGET( menuitem
) == this->modes
[ index
] )
491 static GtkWidget
*this_page_get_widget( page_clips
this )
493 if ( this->widget
== NULL
)
494 this->widget
= this->parent_page
->get_widget(this->parent_page
);
498 static void this_page_get_toolbar_info( page
this, GtkIconSize size
, GtkWidget
**icon
, char **label
)
500 *icon
= gtk_image_new_from_stock( "gtk-justify-fill", size
);
501 *label
= _("_Playlist");
504 static void this_page_on_connect( page_clips
this )
506 this->dv
= mvcp_init( dv1394app_get_parser( this->app
) );
507 list_clips( this, "/" );
510 static void this_page_on_unit_change( page_clips
this, int unit
)
512 if ( unit
!= this->unit
)
516 static void this_page_on_disconnect( page_clips
this )
518 list_clips( this, NULL
);
519 mvcp_close( this->dv
);
522 static void this_page_show_status( page_clips
this, mvcp_status status
)
524 if ( status
->status
!= unit_disconnected
)
526 if ( this->generation
!= status
->generation
)
527 list_queue( this, status
->clip_index
);
528 else if ( this->clip
!= status
->clip_index
)
529 list_active( this, status
->clip_index
);
533 static void this_page_close( page_clips
this )
539 page
page_clips_init( dv1394app app
, struct page_t
*parent_page
)
541 page_clips
this = calloc( 1, sizeof( page_clips_t
) );
545 this->parent_page
= parent_page
;
546 this->parent
.get_widget
= ( GtkWidget
*(*)( page
) )this_page_get_widget
;
547 this->parent
.get_toolbar_info
= this_page_get_toolbar_info
;
548 this->parent
.on_connect
= ( void (*)( page
) )this_page_on_connect
;
549 this->parent
.on_unit_change
= ( void (*)( page
, int ) )this_page_on_unit_change
;
550 this->parent
.on_disconnect
= ( void (*)( page
) )this_page_on_disconnect
;
551 this->parent
.show_status
= ( void (*)( page
, mvcp_status
) )this_page_show_status
;
552 this->parent
.close
= ( void (*)( page
) )this_page_close
;
554 this->generation
= -1;
556 widget
= lookup_widget( this_page_get_widget( this ), "list_clips" );
557 g_signal_connect( G_OBJECT( widget
), "button-press-event", G_CALLBACK( on_clip_selected
), this );
558 g_signal_connect( G_OBJECT( widget
), "key-press-event", G_CALLBACK( on_clip_key_press
), this );
559 widget
= lookup_widget( this_page_get_widget( this ), "list_dir" );
560 g_signal_connect( G_OBJECT( widget
), "button-press-event", G_CALLBACK( on_dir_selected
), this );
561 g_signal_connect( G_OBJECT( widget
), "key-press-event", G_CALLBACK( on_dir_key_press
), this );
562 widget
= lookup_widget( this_page_get_widget( this ), "button_clips_refresh" );
563 gtk_signal_connect( GTK_OBJECT( widget
), "clicked", GTK_SIGNAL_FUNC( on_refresh
), this );
564 widget
= lookup_widget( this_page_get_widget( this ), "button_clips_home" );
565 gtk_signal_connect( GTK_OBJECT( widget
), "clicked", GTK_SIGNAL_FUNC( on_home
), this );
566 widget
= lookup_widget( this_page_get_widget( this ), "button_up" );
567 gtk_signal_connect( GTK_OBJECT( widget
), "clicked", GTK_SIGNAL_FUNC( on_up
), this );
568 widget
= lookup_widget( this_page_get_widget( this ), "button_down" );
569 gtk_signal_connect( GTK_OBJECT( widget
), "clicked", GTK_SIGNAL_FUNC( on_down
), this );
570 widget
= lookup_widget( this_page_get_widget( this ), "button_remove" );
571 gtk_signal_connect( GTK_OBJECT( widget
), "clicked", GTK_SIGNAL_FUNC( on_remove
), this );
572 widget
= lookup_widget( this_page_get_widget( this ), "button_clean" );
573 gtk_signal_connect( GTK_OBJECT( widget
), "clicked", GTK_SIGNAL_FUNC( on_clean
), this );
575 widget
= lookup_widget( this_page_get_widget( this ), "table4" );
576 gtk_widget_show( widget
);
578 widget
= lookup_widget( this_page_get_widget( this ), "treeview1" );
579 g_signal_connect( G_OBJECT( widget
), "button-press-event", G_CALLBACK( on_queue_selected
), this );
580 g_signal_connect( G_OBJECT( widget
), "key-press-event", G_CALLBACK( on_queue_key_press
), this );
582 for ( index
= 0; index
< 4; index
++ )
585 sprintf( item
, "mode_%d", index
);
586 widget
= lookup_widget( this_page_get_widget( this ), item
);
587 gtk_signal_connect( GTK_OBJECT( widget
), "activate", GTK_SIGNAL_FUNC( on_mode_change
), this );
588 this->modes
[ index
] = widget
;