checkbox with image arrow for playing item display
[rugen] / src / dv1394app.c
index d367235..6de7d91 100644 (file)
@@ -162,6 +162,147 @@ void on_item_quit_activate( GtkMenuItem *menuitem, gpointer user_data )
        gtk_main_quit( );
 }
 
+static void playlist_open(dv1394app this, char* filename)
+{
+       FILE* f;
+
+       if( this->selected_unit >= 0 && this->command)
+       {
+               f = fopen(filename, "rt");
+               if (f)
+               {
+                       while( !feof(f) )
+                       {
+                               char* s;
+                               char l[PATH_MAX];
+
+                               /* load string */
+                               fgets(l, sizeof(l), f);
+
+                               /* remove newlines */
+                               if( (s = strchr(l, '\n')) ) *s = 0;
+                               if( (s = strchr(l, '\r')) ) *s = 0;
+                               if( (s = strchr(l, '\t')) ) *s = 0;
+
+                               /* check for empty line */
+                               if(l[0])
+                                       mvcp_unit_append( this->command, this->selected_unit, l, -1, -1 );
+                       }
+
+                       fclose(f);
+               }
+       }
+
+}
+
+static void playlist_save(dv1394app this, char* filename)
+{
+       int index;
+       mvcp_list_entry_t entry;
+       mvcp_list list;
+       FILE* f;
+
+       if( this->selected_unit >= 0 && this->command)
+       {
+               f = fopen(filename, "wt");
+               if (f)
+               {
+                       list = mvcp_list_init( this->command, this->selected_unit);
+
+                       if ( list )
+                       {
+                               for ( index = 0; list && index < mvcp_list_count( list ); index ++ )
+                               {
+                                       mvcp_list_get( list, index, &entry );
+                                       fprintf(f, "%s\n", entry.full);
+                               }
+                               mvcp_list_close( list );
+                       }
+
+                       fclose(f);
+               }
+       }
+}
+
+/** Main window - playlist open menu item selected.
+*/
+
+static void on_item_open_playlist_activate( GtkMenuItem *menuitem, gpointer user_data )
+{
+       dv1394app this = user_data;
+       GtkWidget *dialog;
+
+       dialog = gtk_file_chooser_dialog_new ("Open File",
+               GTK_WINDOW (this->window),
+               GTK_FILE_CHOOSER_ACTION_OPEN,
+               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+               GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+               NULL);
+
+       gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog),
+               (this->playlist_folder)?this->playlist_folder:getenv("HOME"));
+
+       if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+       {
+               char *filename;
+
+               filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+               playlist_open(this, filename);
+
+               if ( this->playlist_folder )
+                       g_free (this->playlist_folder);
+               this->playlist_folder = filename;
+               if ( this->playlist_folder )
+               {
+                       char* e = strrchr(this->playlist_folder, '/');
+                       if(e) *e = 0;
+               }
+       }
+
+       gtk_widget_destroy (dialog);
+}
+
+/** Main window - playlist save menu item selected.
+*/
+
+static void on_item_save_playlist_activate( GtkMenuItem *menuitem, gpointer user_data )
+{
+       dv1394app this = user_data;
+       GtkWidget *dialog;
+
+       dialog = gtk_file_chooser_dialog_new ("Save File",
+               GTK_WINDOW (this->window),
+               GTK_FILE_CHOOSER_ACTION_SAVE,
+               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+               GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+               NULL);
+
+       gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
+
+       gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog),
+               (this->playlist_folder)?this->playlist_folder:getenv("HOME"));
+       gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), "Untitled document");
+
+       if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+       {
+               char *filename;
+
+               filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+               playlist_save(this, filename);
+
+               if ( this->playlist_folder )
+                       g_free (this->playlist_folder);
+               this->playlist_folder = filename;
+               if ( this->playlist_folder )
+               {
+                       char* e = strrchr(this->playlist_folder, '/');
+                       if(e) *e = 0;
+               }
+       }
+
+       gtk_widget_destroy (dialog);
+}
+
 static gboolean on_page_switch_pressed( GtkWidget *button, gpointer user_data )
 {
        dv1394app this = user_data;
@@ -244,12 +385,12 @@ static gboolean on_transport_pressed( GtkWidget *button, gpointer data )
                
                case 11:
                        mvcp_unit_set( dv, unit, "eof", "loop");
-                       this->eof = 0;
+                       this->eof[this->selected_unit] = 0;
                        break;
 
                case 12:
                        mvcp_unit_set( dv, unit, "eof", "pause");
-                       this->eof = 0;
+                       this->eof[this->selected_unit] = 0;
                        break;
 
                default:
@@ -316,8 +457,10 @@ void dv1394app_show_status( dv1394app this, mvcp_status status )
                gtk_signal_emit_by_name( GTK_OBJECT(trim_adj[TRIM_ADJ_POS]), "value_changed" );
        }
 
-       gtk_widget_set_sensitive( lookup_widget( dv1394app_get_widget( this ), "transport_11" ), this->eof == 'p' );
-       gtk_widget_set_sensitive( lookup_widget( dv1394app_get_widget( this ), "transport_12" ), this->eof == 'l' );
+       gtk_widget_set_sensitive( lookup_widget( dv1394app_get_widget( this ), "transport_11" ),
+               this->eof[this->selected_unit] == 'p' );
+       gtk_widget_set_sensitive( lookup_widget( dv1394app_get_widget( this ), "transport_12" ),
+               this->eof[this->selected_unit] == 'l' );
 }
 
 static gboolean trim_pressed( GtkWidget *button, GdkEventButton *event, gpointer user_data )
@@ -399,10 +542,14 @@ dv1394app dv1394app_init( GtkWidget *window, char *instance )
 //             gtk_signal_connect( GTK_OBJECT( widget ), "activate", GTK_SIGNAL_FUNC( on_item_quit_activate ), this );
 //             widget = lookup_widget( this->window, "button_quit" );
 //             gtk_signal_connect( GTK_OBJECT( widget ), "clicked", GTK_SIGNAL_FUNC( on_item_quit_activate ), this );
-               
+               widget = lookup_widget( this->window, "button_open_playlist" );
+               gtk_signal_connect( GTK_OBJECT( widget ), "clicked", GTK_SIGNAL_FUNC( on_item_open_playlist_activate ), this );
+               widget = lookup_widget( this->window, "button_save_playlist" );
+               gtk_signal_connect( GTK_OBJECT( widget ), "clicked", GTK_SIGNAL_FUNC( on_item_save_playlist_activate ), this );
+
+
                /* Initialise the pages. */
-               dv1394app_register_page( this, page_status_init( this ) );
-               dv1394app_register_page( this, page_clips_init( this ) );
+               dv1394app_register_page( this, page_operate_init( this ) );
                dv1394app_register_page( this, page_command_init( this ) );
                this->guard = 1;
                gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( this->page_buttons[ 0 ] ), TRUE );
@@ -452,6 +599,9 @@ dv1394app dv1394app_init( GtkWidget *window, char *instance )
                        gtk_signal_connect( GTK_OBJECT( trim ), "button_release_event", GTK_SIGNAL_FUNC (trim_released), this );
                }
                this->seek_flag = 1;
+
+               this->playing[0] = create_pixbuf("empty_16x16.png");
+               this->playing[1] = create_pixbuf("item_playing_16x16_(Axialis_Team).png");
        }
 
        if ( instance != NULL )
@@ -555,3 +705,25 @@ void dv1394app_close( dv1394app this )
                page_close( this->pages[ -- this->page_count ] );
        free( this );
 }
+
+char* frames2tc( int f, float fps, char* buf )
+{
+       int tc[4] = { 0, 0, 0, 0 };
+       float d;
+       int t;
+
+       if ( fps && f >= 0)
+       {
+               d = f / fps;
+               t = d;
+
+               tc[0] = (d - t) * fps;
+               tc[1] = t % 60; t /= 60;
+               tc[2] = t % 60; t /= 60;
+               tc[3] = t % 24;
+       }
+
+       sprintf(buf, "%.2d:%.2d:%.2d:%.2d", tc[3], tc[2], tc[1], tc[0]);
+
+       return buf;
+}