456
402
play_item = g_value_peek_pointer (&v);
459
if (!gtk_tree_model_iter_parent (GTK_TREE_MODEL (mm_store),
404
in_root = !gtk_tree_model_iter_parent (GTK_TREE_MODEL (mm_store),
465
407
GtkTreePath *path;
467
408
path = gtk_tree_model_get_path (GTK_TREE_MODEL (mm_store), &iter);
469
410
if (gtk_tree_view_row_expanded (tree, path)) {
472
412
memcpy (&parent, &iter, sizeof (iter));
476
if (!gtk_tree_model_iter_parent (GTK_TREE_MODEL (mm_store),
414
in_root = !gtk_tree_model_iter_parent (GTK_TREE_MODEL (mm_store),
483
418
gtk_tree_path_free (path);
485
420
g_value_unset (&v);
491
* create new category
495
gtk_tree_store_append (mm_store, &cat_iter, NULL);
497
gtk_tree_store_append (mm_store, &cat_iter, &parent);
498
gtk_tree_store_set (mm_store, &cat_iter, 0, "New Category", -1);
499
/* create dummy entry so d&d works */
500
gtk_tree_store_append (mm_store, &iter, &cat_iter);
501
gtk_tree_store_set (mm_store, &iter, 0, PLACEHOLDER, -1);
504
424
* show dialog, ask for section name
507
gtk_entry_set_text (GTK_ENTRY (cat_entry), "New Category");
508
gtk_widget_show_all (cat_dlg);
509
gtk_widget_map (cat_dlg);
510
gtk_widget_grab_focus (cat_entry);
427
gtk_entry_set_text (GTK_ENTRY (cat_entry), _("New Category"));
429
if (do_category_edit ())
431
/* create new category */
432
gtk_tree_store_append (mm_store, &cat_iter, in_root ? NULL : &parent);
433
gtk_tree_store_set (mm_store, &cat_iter, 0,
434
gtk_entry_get_text (GTK_ENTRY(cat_entry)), -1);
513
438
static void tree_changed_cb (GtkTreeModel *treemodel,
514
439
GtkTreePath *arg1,
515
440
gpointer user_data) {
516
update_menu (media_menu);
441
update_menu (media_menu[0]);
442
update_menu (media_menu[1]);
519
static int load_mediamarks (gchar *fname) {
523
mmfile = read_entire_file_ascii (fname);
445
static int load_mediamarks (gchar *fname)
447
char *mmfile = read_entire_file (fname, NULL);
526
450
xml_node_t *node;
546
fname = modal_file_dialog ("Select mediamarks file to load...", NULL);
470
fname = modal_file_dialog (_("Select media marks file to load..."), NULL);
550
if (!load_mediamarks (fname))
551
display_error ("Mediamarks load failed",
552
"Couldn't load mediamarks file"
474
if (!load_mediamarks (fname) && errno != ENOENT)
475
display_error (_("Media marks load failed"),
476
_("Couldn't load media marks file %s\n%s"),
477
fname, strerror (errno));
481
void mm_add_show () {
483
play_item_t *play_item;
485
int pos, pos_time, len;
487
const char *title = xine_get_meta_info (stream, XINE_META_INFO_TITLE);
489
play_item = play_item_copy (playlist_get_item (playlist_get_list_pos()));
491
/* default title? try to get title from meta-info */
492
dot = strrchr (play_item->mrl, '.');
494
dot = play_item->mrl + strlen (play_item->mrl);
495
len = strlen (play_item->title);
496
if (title && dot - len > play_item->mrl &&
497
!strncmp (dot - len, play_item->title, len))
499
free (play_item->title);
500
play_item->title = strdup (title);
503
xine_get_pos_length (stream, &pos, &pos_time, &len);
504
play_item->start_time = (len >= 0) ? pos_time : 0;
506
if (play_item_edit (play_item, PLAY_ITEM_MEDIAMARK_NEW, title))
508
gtk_tree_store_append (mm_store, &iter, NULL);
509
gtk_tree_store_set (mm_store, &iter, 0, play_item->title,
510
1, play_item->mrl, 2, play_item, -1);
515
void mm_manage_show () {
519
gtk_widget_hide (manage_dlg);
523
gtk_widget_show_all (manage_dlg);
527
static void print_depth (FILE *f, int depth) {
536
static void save_items (FILE *f, int depth, GtkTreeIter *iter) {
541
play_item_t *play_item;
544
memset (&v, 0, sizeof (GValue));
545
gtk_tree_model_get_value (GTK_TREE_MODEL (mm_store),
547
id = g_value_peek_pointer (&v);
553
memset (&vi, 0, sizeof (GValue));
554
gtk_tree_model_get_value (GTK_TREE_MODEL (mm_store),
556
play_item = g_value_peek_pointer (&vi);
560
play_item_save (play_item, f, depth);
564
GtkTreeIter children;
566
print_depth (f, depth);
567
fprintf (f, "<SUB NAME=\"%s\">\n", id);
569
if (gtk_tree_model_iter_children (GTK_TREE_MODEL(mm_store), &children, iter))
570
save_items (f, depth+2, &children);
572
print_depth (f, depth);
573
fprintf (f, "</SUB>\n");
582
} while (gtk_tree_model_iter_next (GTK_TREE_MODEL(mm_store), iter));
585
void mm_save (void) {
590
fname = g_strconcat(g_get_home_dir(), "/.gxine/mediamarks", NULL);
592
f = fopen (fname, "w") ;
598
fprintf (f, "<GXINEMM VERSION=\"1\">\n");
600
if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (mm_store), &iter))
601
save_items (f, 0, &iter);
603
fprintf (f, "</GXINEMM>\n");
606
printf (_("mediamarks: save to '%s' failed: %s\n"),
607
fname, strerror (errno));
609
printf (_("mediamarks: save to '%s' failed: %s\n"),
610
fname, strerror (errno));
612
printf (_("mediamarks: save to '%s' failed: %s\n"),
613
fname, strerror (errno));
618
static JSBool js_mm_add_show (JSContext *cx, JSObject *obj, uintN argc,
619
jsval *argv, jsval *rval) {
621
/* se_t *se = (se_t *) JS_GetContextPrivate(cx); */
623
se_log_fncall ("mm_add_show");
630
static JSBool js_mm_manage_show (JSContext *cx, JSObject *obj, uintN argc,
631
jsval *argv, jsval *rval) {
633
/* se_t *se = (se_t *) JS_GetContextPrivate(cx); */
635
se_log_fncall ("mm_manage_show");
642
static JSBool js_import_mediamarks (JSContext *cx, JSObject *obj, uintN argc,
643
jsval *argv, jsval *rval) {
645
/* se_t *se = (se_t *) JS_GetContextPrivate(cx); */
647
se_log_fncall ("import_mediamarks");
654
static void mm_response_cb (GtkDialog *dbox, int response, gpointer data)
658
case GTK_RESPONSE_ACCEPT:
663
gtk_widget_hide (manage_dlg);
557
667
void mediamarks_init (void) {
559
GtkWidget *tree, *b, *scrolled_window, *hbox;
560
GtkWidget *button, *label;
669
GtkWidget *tree, *b, *scrolled_window, *hbox, *label;
562
671
GtkCellRenderer *cell;
563
672
GtkTreeViewColumn *column;
596
705
g_signal_connect (G_OBJECT (mm_store), "rows-reordered",
597
706
G_CALLBACK (tree_changed_cb), NULL);
599
update_menu (media_menu);
708
update_menu (media_menu[0]);
709
update_menu (media_menu[1]);
603
712
* create (for now invisible) mm_manage dialog
606
manage_dlg = gtk_dialog_new ();
607
gtk_window_set_title (GTK_WINDOW (manage_dlg), "Manage Mediamarks...");
715
manage_dlg = gtk_dialog_new_with_buttons (_("Manage media marks..."), NULL, 0,
716
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
717
GTK_STOCK_CLOSE, GTK_RESPONSE_DELETE_EVENT,
608
719
gtk_window_set_default_size (GTK_WINDOW (manage_dlg), 400, 250);
609
g_signal_connect( GTK_OBJECT (manage_dlg), "delete_event",
610
G_CALLBACK (win_delete_cb), NULL );
611
b = gtk_dialog_add_button (GTK_DIALOG (manage_dlg), GTK_STOCK_CLOSE, 1);
612
g_signal_connect (GTK_OBJECT(b), "clicked",
613
G_CALLBACK (close_cb),
720
g_signal_connect (GTK_OBJECT(manage_dlg), "response",
721
G_CALLBACK(mm_response_cb), NULL);
722
hide_on_delete (manage_dlg, &is_visible);
616
724
/* add a nice tree view widget here */
618
tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL(mm_store));
726
mm_tree = tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL(mm_store));
619
727
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree), TRUE);
621
729
cell = gtk_cell_renderer_text_new ();
622
column = gtk_tree_view_column_new_with_attributes ("Mediamarks",
730
column = gtk_tree_view_column_new_with_attributes (_("Media mark"), cell,
626
732
gtk_tree_view_append_column (GTK_TREE_VIEW (tree),
627
733
GTK_TREE_VIEW_COLUMN (column));
629
column = gtk_tree_view_column_new_with_attributes ("mrl",
735
column = gtk_tree_view_column_new_with_attributes ("MRL", cell,
633
737
gtk_tree_view_append_column (GTK_TREE_VIEW (tree),
634
738
GTK_TREE_VIEW_COLUMN (column));
641
745
GTK_POLICY_AUTOMATIC);
642
746
gtk_container_add (GTK_CONTAINER (scrolled_window), tree);
748
g_signal_connect (GTK_OBJECT (tree), "row-activated",
749
G_CALLBACK (edit_cb), NULL);
751
/* add edit button bar */
752
hbox = gtk_hbox_new (FALSE, 2);
754
b = gtk_button_new_with_mnemonic (_("_New media mark"));
755
gtk_box_pack_start (GTK_BOX(hbox), b, FALSE, FALSE, 0);
756
g_signal_connect (GTK_OBJECT(b), "clicked",
757
G_CALLBACK(mm_add_show), NULL);
759
b = gtk_button_new_with_mnemonic (_("New _category"));
760
gtk_box_pack_start (GTK_BOX(hbox), b, FALSE, FALSE, 0);
761
g_signal_connect (GTK_OBJECT(b), "clicked",
762
G_CALLBACK(new_category_cb), tree);
764
b = gtk_button_new_with_mnemonic (_("_Edit"));
765
gtk_box_pack_start (GTK_BOX(hbox), b, FALSE, FALSE, 0);
766
g_signal_connect (GTK_OBJECT(b), "clicked",
767
G_CALLBACK(edit_cb), NULL);
769
b = gtk_button_new_from_stock (GTK_STOCK_DELETE);
770
gtk_box_pack_start (GTK_BOX(hbox), b, FALSE, FALSE, 0);
771
g_signal_connect (GTK_OBJECT(b), "clicked",
772
G_CALLBACK(delete_cb), NULL);
774
gtk_box_pack_start (GTK_BOX(GTK_DIALOG(manage_dlg)->vbox), hbox,
644
777
gtk_box_pack_start (GTK_BOX(GTK_DIALOG(manage_dlg)->vbox), scrolled_window,
647
/* add edit button bar */
648
hbox = gtk_hbox_new (2, 2);
650
button = gtk_button_new_with_label ("New Category...");
651
g_signal_connect (button, "clicked", G_CALLBACK(new_category_cb), tree);
652
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 2);
654
button = gtk_button_new_with_label ("Edit...");
655
g_signal_connect (button, "clicked", G_CALLBACK(edit_cb), tree);
656
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 2);
658
button = gtk_button_new_with_label ("Delete");
659
g_signal_connect (button, "clicked", G_CALLBACK(delete_cb), tree);
660
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 2);
662
gtk_box_pack_end (GTK_BOX(GTK_DIALOG(manage_dlg)->vbox), hbox,
665
780
is_visible = FALSE;
668
783
* create (for now invisible) category name entry dialog
671
cat_dlg = gtk_dialog_new ();
672
gtk_window_set_title (GTK_WINDOW (cat_dlg), "Enter category name...");
673
g_signal_connect( GTK_OBJECT (cat_dlg), "delete_event",
674
G_CALLBACK (cat_delete_cb), NULL );
676
b = gtk_dialog_add_button (GTK_DIALOG (cat_dlg), GTK_STOCK_CLOSE, 1);
677
g_signal_connect (GTK_OBJECT(b), "clicked",
678
G_CALLBACK (cat_close_cb),
786
cat_dlg = gtk_dialog_new_with_buttons (_("Enter category name..."), NULL, 0,
787
GTK_STOCK_CANCEL, GTK_RESPONSE_DELETE_EVENT,
788
GTK_STOCK_OK, GTK_RESPONSE_OK,
790
hide_on_delete (cat_dlg, NULL);
791
g_signal_connect (GTK_OBJECT (cat_dlg), "response",
792
G_CALLBACK (cat_response_cb), NULL);
793
gtk_dialog_set_default_response (GTK_DIALOG(cat_dlg), GTK_RESPONSE_OK);
681
795
/* all we have is a simple text entry */
683
797
hbox = gtk_hbox_new (2, 2);
685
label = gtk_label_new ("Category name:");
799
label = gtk_label_new (_("Category name:"));
687
801
gtk_box_pack_start (GTK_BOX (hbox), label,
688
802
FALSE, FALSE, 0);
690
cat_entry = gtk_entry_new ();
804
cat_entry = gtk_entry_new ();
691
806
gtk_signal_connect (GTK_OBJECT(cat_entry), "activate",
692
807
GTK_SIGNAL_FUNC (cat_close_cb),
694
gtk_box_pack_start (GTK_BOX (hbox), cat_entry,
697
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (cat_dlg)->vbox), hbox,
701
void mm_add_show () {
703
play_item_t *play_item;
705
int pos, pos_time, len;
707
play_item = play_item_copy (playlist_get_item (playlist_get_list_pos()));
709
gtk_xine_get_pos_length (GTK_XINE (gtx),
710
&pos, &pos_time, &len);
712
play_item->start_time = pos_time;
713
play_item_edit (play_item);
714
gtk_tree_store_append (mm_store, &iter, NULL);
715
gtk_tree_store_set (mm_store, &iter, 0, play_item->title,
716
1, play_item->mrl, 2, play_item, -1);
720
void mm_manage_show () {
724
gtk_widget_hide (manage_dlg);
727
gtk_widget_show_all (manage_dlg);
728
gtk_widget_map (manage_dlg);
732
static void print_depth (FILE *f, int depth) {
741
static void save_items (FILE *f, int depth, GtkTreeIter *iter) {
746
play_item_t *play_item;
749
memset (&v, 0, sizeof (GValue));
750
gtk_tree_model_get_value (GTK_TREE_MODEL (mm_store),
752
id = g_value_peek_pointer (&v);
754
if (id && strcmp (id, PLACEHOLDER)) {
758
memset (&vi, 0, sizeof (GValue));
759
gtk_tree_model_get_value (GTK_TREE_MODEL (mm_store),
761
play_item = g_value_peek_pointer (&vi);
765
play_item_save (play_item, f, depth);
769
GtkTreeIter children;
771
print_depth (f, depth);
772
fprintf (f, "<SUB NAME=\"%s\">\n", id);
774
if (gtk_tree_model_iter_children (GTK_TREE_MODEL(mm_store), &children, iter))
775
save_items (f, depth+2, &children);
777
print_depth (f, depth);
778
fprintf (f, "</SUB>\n");
787
} while (gtk_tree_model_iter_next (GTK_TREE_MODEL(mm_store), iter));
790
void mm_save (void) {
795
fname = g_strconcat(g_get_home_dir(), "/.gxine/mediamarks", NULL);
797
f = fopen (fname, "w") ;
803
fprintf (f, "<GXINEMM VERSION=\"1\">\n");
805
if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (mm_store), &iter))
806
save_items (f, 0, &iter);
808
fprintf (f, "</GXINEMM>\n");
812
printf ("mediamarks: save to '%s' failed!\n", fname);
810
gtk_box_pack_start_defaults (GTK_BOX (hbox), cat_entry);
812
gtk_box_pack_start_defaults (GTK_BOX (GTK_DIALOG (cat_dlg)->vbox), hbox);
814
/* script engine functions */
817
static const se_f_def_t defs[] = {
818
{ "mm_add_show", js_mm_add_show, 0, 0,
819
SE_GROUP_DIALOGUE, NULL, NULL },
820
{ "mm_manage_show", js_mm_manage_show, 0, 0,
821
SE_GROUP_DIALOGUE, NULL, NULL },
822
{ "import_mediamarks", js_import_mediamarks, 0, 0,
823
SE_GROUP_FILE, NULL, NULL },
826
se_defuns (gse, NULL, defs);