~ubuntu-branches/ubuntu/trusty/gupnp-tools/trusty

« back to all changes in this revision

Viewing changes to src/av-cp/playlist-treeview.c

  • Committer: Bazaar Package Importer
  • Author(s): Andreas Henriksson
  • Date: 2011-02-07 10:45:50 UTC
  • mfrom: (5.1.1 experimental)
  • Revision ID: james.westby@ubuntu.com-20110207104550-5ipix1mtq3tmf3lt
Tags: 0.8.1-2
Upload to unstable.

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
#include <string.h>
22
22
#include <stdlib.h>
23
23
#include <config.h>
 
24
#include <gmodule.h>
24
25
 
25
26
#include "playlist-treeview.h"
26
27
#include "renderer-combo.h"
27
28
#include "renderer-controls.h"
28
29
#include "icons.h"
29
30
#include "gui.h"
30
 
#include "main.h"
31
31
 
32
32
#define CONTENT_DIR "urn:schemas-upnp-org:service:ContentDirectory"
33
33
 
43
43
                                     gpointer      user_data);
44
44
 
45
45
static GtkWidget *treeview;
 
46
static GtkWidget *popup;
 
47
static GtkWidget *didl_dialog;
 
48
static GtkWidget *didl_textview;
46
49
static gboolean   expanded;
47
50
 
48
51
typedef struct
56
59
 
57
60
typedef struct
58
61
{
59
 
  GetSelectedItemCallback callback;
 
62
  MetadataFunc callback;
60
63
 
61
64
  gchar *id;
62
65
 
87
90
}
88
91
 
89
92
static BrowseMetadataData *
90
 
browse_metadata_data_new (GetSelectedItemCallback callback,
91
 
                          const char             *id,
92
 
                          gpointer                user_data)
 
93
browse_metadata_data_new (MetadataFunc callback,
 
94
                          const char  *id,
 
95
                          gpointer     user_data)
93
96
{
94
97
        BrowseMetadataData *data;
95
98
 
114
117
        guint32            starting_index,
115
118
        guint32            requested_count);
116
119
 
 
120
G_MODULE_EXPORT
117
121
gboolean
118
122
on_playlist_treeview_button_release (GtkWidget      *widget,
119
123
                                     GdkEventButton *event,
120
124
                                     gpointer        user_data)
121
125
{
122
 
        return FALSE;
 
126
        GtkTreeSelection *selection;
 
127
        GtkTreeModel     *model;
 
128
        GtkTreeIter       iter;
 
129
 
 
130
        if (event->type != GDK_BUTTON_RELEASE ||
 
131
            event->button != 3)
 
132
                return FALSE;
 
133
 
 
134
        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
 
135
        g_assert (selection != NULL);
 
136
 
 
137
        /* Only show the popup menu when a row is selected */
 
138
        if (!gtk_tree_selection_get_selected (selection, &model, &iter))
 
139
                return FALSE;
 
140
 
 
141
        gtk_menu_popup (GTK_MENU (popup),
 
142
                        NULL,
 
143
                        NULL,
 
144
                        NULL,
 
145
                        NULL,
 
146
                        event->button,
 
147
                        event->time);
 
148
 
 
149
        return TRUE;
123
150
}
124
151
 
125
152
static void
132
159
 
133
160
        if (state == PLAYBACK_STATE_PLAYING ||
134
161
            state == PLAYBACK_STATE_PAUSED) {
135
 
                if (!get_selected_item ((GetSelectedItemCallback)
136
 
                                         set_av_transport_uri,
137
 
                                        NULL)) {
 
162
                if (!get_selected_object ((MetadataFunc) set_av_transport_uri,
 
163
                                          NULL)) {
138
164
                        av_transport_send_action ("Stop", NULL);
139
165
                }
140
166
       }
159
185
                                    /* Is container? */
160
186
                                    G_TYPE_BOOLEAN,
161
187
                                    /* childCount */
162
 
                                    G_TYPE_UINT);
 
188
                                    G_TYPE_INT);
163
189
 
164
190
        return GTK_TREE_MODEL (store);
165
191
}
200
226
        gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
201
227
}
202
228
 
 
229
G_MODULE_EXPORT
203
230
void
204
231
on_playlist_row_expanded (GtkTreeView *tree_view,
205
232
                          GtkTreeIter *iter,
220
247
                GUPnPServiceProxy *content_dir;
221
248
                gchar             *id;
222
249
                gboolean           is_container;
223
 
                guint              child_count;
 
250
                gint              child_count;
224
251
 
225
252
                gtk_tree_model_get (model, &child_iter,
226
253
                                    3, &content_dir,
229
256
                                    6, &child_count,
230
257
                                    -1);
231
258
 
232
 
                if (is_container && child_count > 0) {
 
259
                if (is_container && child_count != 0) {
233
260
                        browse (content_dir, id, 0, MAX_BROWSE);
234
261
                }
235
262
 
254
281
                                     &child_iter));
255
282
}
256
283
 
 
284
G_MODULE_EXPORT
257
285
void
258
286
on_playlist_row_collapsed (GtkTreeView *tree_view,
259
287
                           GtkTreeIter *iter,
275
303
        } while (gtk_tree_model_iter_next (model, &child_iter));
276
304
}
277
305
 
278
 
static gboolean
279
 
tree_selection_func (GtkTreeSelection *selection,
280
 
                     GtkTreeModel     *model,
281
 
                     GtkTreePath      *path,
282
 
                     gboolean          path_currently_selected,
283
 
                     gpointer          data)
284
 
{
285
 
        GtkTreeIter iter;
286
 
        gboolean    is_container;
287
 
 
288
 
        if (path_currently_selected) {
289
 
                return TRUE;
290
 
        }
291
 
 
292
 
        if (!gtk_tree_model_get_iter (model, &iter, path)) {
293
 
                return FALSE;
294
 
        }
295
 
 
296
 
        gtk_tree_model_get (model,
297
 
                            &iter,
298
 
                            5, &is_container,
299
 
                            -1);
300
 
 
301
 
        /* Let it be selected if it's an item */
302
 
        return !is_container;
 
306
static void display_metadata (const char *metadata,
 
307
                              gpointer    user_data)
 
308
{
 
309
        GtkTextBuffer *buffer;
 
310
 
 
311
        buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (didl_textview));
 
312
        gtk_text_buffer_set_text (buffer, metadata, -1);
 
313
 
 
314
        gtk_dialog_run (GTK_DIALOG (didl_dialog));
 
315
}
 
316
 
 
317
G_MODULE_EXPORT
 
318
void
 
319
on_didl_menuitem_activate (GtkMenuItem *menuitem,
 
320
                           gpointer     user_data)
 
321
{
 
322
        get_selected_object (display_metadata, NULL);
303
323
}
304
324
 
305
325
void
312
332
                                                       "playlist-treeview"));
313
333
        g_assert (treeview != NULL);
314
334
 
 
335
        popup = GTK_WIDGET (gtk_builder_get_object (builder, "playlist-popup"));
 
336
        g_assert (popup != NULL);
 
337
 
 
338
        didl_dialog = GTK_WIDGET (gtk_builder_get_object (builder,
 
339
                                                          "didl-dialog"));
 
340
        didl_textview = GTK_WIDGET (gtk_builder_get_object (builder,
 
341
                                                          "didl-textview"));
 
342
 
315
343
        model = create_playlist_treemodel ();
316
344
        g_assert (model != NULL);
317
345
 
326
354
                          "changed",
327
355
                          G_CALLBACK (on_item_selected),
328
356
                          NULL);
329
 
        gtk_tree_selection_set_select_function (selection,
330
 
                                                tree_selection_func,
331
 
                                                NULL,
332
 
                                                NULL);
333
357
 
334
358
        expanded = FALSE;
335
359
}
584
608
        const char *parent_id;
585
609
        const char *title;
586
610
        gboolean    is_container;
587
 
        uint        child_count;
 
611
        gint        child_count;
588
612
        GdkPixbuf  *icon;
589
613
        gint        position;
590
614
 
751
775
                if (!gupnp_didl_lite_parser_parse_didl (parser,
752
776
                                                        didl_xml,
753
777
                                                        &error)) {
754
 
                        g_warning ("%s\n", error->message);
 
778
                        g_warning ("%s", error->message);
755
779
                        g_error_free (error);
756
780
                }
757
781
 
774
798
                GUPnPServiceInfo *info;
775
799
 
776
800
                info = GUPNP_SERVICE_INFO (content_dir);
777
 
                g_warning ("Failed to browse '%s': %s\n",
 
801
                g_warning ("Failed to browse '%s': %s",
778
802
                           gupnp_service_info_get_location (info),
779
803
                           error->message);
780
804
 
785
809
}
786
810
 
787
811
static void
 
812
browse_metadata_cb (GUPnPServiceProxy       *content_dir,
 
813
                    GUPnPServiceProxyAction *action,
 
814
                    gpointer                 user_data)
 
815
{
 
816
        BrowseMetadataData *data;
 
817
        char               *metadata;
 
818
        GError             *error;
 
819
 
 
820
        data = (BrowseMetadataData *) user_data;
 
821
 
 
822
        metadata = NULL;
 
823
        error = NULL;
 
824
 
 
825
        gupnp_service_proxy_end_action (content_dir,
 
826
                                        action,
 
827
                                        &error,
 
828
                                        /* OUT args */
 
829
                                        "Result",
 
830
                                        G_TYPE_STRING,
 
831
                                        &metadata,
 
832
                                        NULL);
 
833
        if (metadata) {
 
834
                data->callback (metadata, data->user_data);
 
835
 
 
836
                g_free (metadata);
 
837
        } else if (error) {
 
838
                g_warning ("Failed to get metadata for '%s': %s",
 
839
                           data->id,
 
840
                           error->message);
 
841
 
 
842
                g_error_free (error);
 
843
        }
 
844
 
 
845
        browse_metadata_data_free (data);
 
846
        g_object_unref (content_dir);
 
847
}
 
848
 
 
849
static void
788
850
browse (GUPnPServiceProxy *content_dir,
789
851
        const char        *container_id,
790
852
        guint32            starting_index,
824
886
}
825
887
 
826
888
static void
 
889
browse_metadata (GUPnPServiceProxy *content_dir,
 
890
                 const char        *id,
 
891
                 MetadataFunc       callback,
 
892
                 gpointer           user_data)
 
893
{
 
894
        BrowseMetadataData *data;
 
895
 
 
896
        data = browse_metadata_data_new (callback, id, user_data);
 
897
 
 
898
        gupnp_service_proxy_begin_action
 
899
                                (g_object_ref (content_dir),
 
900
                                 "Browse",
 
901
                                 browse_metadata_cb,
 
902
                                 data,
 
903
                                 /* IN args */
 
904
                                 "ObjectID",
 
905
                                 G_TYPE_STRING,
 
906
                                 data->id,
 
907
                                 "BrowseFlag",
 
908
                                 G_TYPE_STRING,
 
909
                                 "BrowseMetadata",
 
910
                                 "Filter",
 
911
                                 G_TYPE_STRING,
 
912
                                 "*",
 
913
                                 "StartingIndex",
 
914
                                 G_TYPE_UINT,
 
915
                                 0,
 
916
                                 "RequestedCount",
 
917
                                 G_TYPE_UINT, 0,
 
918
                                 "SortCriteria",
 
919
                                 G_TYPE_STRING,
 
920
                                 "",
 
921
                                 NULL);
 
922
}
 
923
 
 
924
static void
827
925
append_media_server (GUPnPDeviceProxy *proxy,
828
926
                     GtkTreeModel     *model,
829
927
                     GtkTreeIter      *parent_iter)
848
946
                                 1, friendly_name,
849
947
                                 2, info,
850
948
                                 3, content_dir,
 
949
                                 4, "0",
851
950
                                 5, TRUE,
852
951
                                 -1);
853
952
                g_free (friendly_name);
930
1029
        }
931
1030
}
932
1031
 
933
 
void
934
 
browse_metadata_cb (GUPnPServiceProxy       *content_dir,
935
 
                    GUPnPServiceProxyAction *action,
936
 
                    gpointer                 user_data)
937
 
{
938
 
        BrowseMetadataData *data;
939
 
        char               *metadata;
940
 
        GError             *error;
941
 
 
942
 
        data = (BrowseMetadataData *) user_data;
943
 
 
944
 
        metadata = NULL;
945
 
        error = NULL;
946
 
 
947
 
        gupnp_service_proxy_end_action (content_dir,
948
 
                                        action,
949
 
                                        &error,
950
 
                                        /* OUT args */
951
 
                                        "Result",
952
 
                                        G_TYPE_STRING,
953
 
                                        &metadata,
954
 
                                        NULL);
955
 
        if (metadata) {
956
 
                data->callback (metadata, data->user_data);
957
 
 
958
 
                g_free (metadata);
959
 
        } else if (error) {
960
 
                g_warning ("Failed to get metadata for '%s': %s\n",
961
 
                           data->id,
962
 
                           error->message);
963
 
 
964
 
                g_error_free (error);
965
 
        }
966
 
 
967
 
        browse_metadata_data_free (data);
968
 
        g_object_unref (content_dir);
969
 
}
970
 
 
971
1032
gboolean
972
 
get_selected_item (GetSelectedItemCallback callback,
973
 
                   gpointer                user_data)
 
1033
get_selected_object (MetadataFunc callback,
 
1034
                     gpointer     user_data)
974
1035
{
975
1036
        GUPnPServiceProxy  *content_dir;
976
1037
        GtkTreeSelection   *selection;
977
1038
        GtkTreeModel       *model;
978
1039
        GtkTreeIter         iter;
979
 
        gboolean            is_container;
980
 
        BrowseMetadataData *data;
981
1040
        char               *id = NULL;
982
1041
        gboolean            ret = FALSE;
983
1042
 
992
1051
                            &iter,
993
1052
                            3, &content_dir,
994
1053
                            4, &id,
995
 
                            5, &is_container,
996
1054
                            -1);
997
1055
 
998
 
        if (is_container) {
999
 
                goto free_and_return;
1000
 
        }
1001
 
 
1002
 
        data = browse_metadata_data_new (callback, id, user_data);
1003
 
 
1004
 
        gupnp_service_proxy_begin_action
1005
 
                                (g_object_ref (content_dir),
1006
 
                                 "Browse",
1007
 
                                 browse_metadata_cb,
1008
 
                                 data,
1009
 
                                 /* IN args */
1010
 
                                 "ObjectID",
1011
 
                                 G_TYPE_STRING,
1012
 
                                 data->id,
1013
 
                                 "BrowseFlag",
1014
 
                                 G_TYPE_STRING,
1015
 
                                 "BrowseMetadata",
1016
 
                                 "Filter",
1017
 
                                 G_TYPE_STRING,
1018
 
                                 "*",
1019
 
                                 "StartingIndex",
1020
 
                                 G_TYPE_UINT,
1021
 
                                 0,
1022
 
                                 "RequestedCount",
1023
 
                                 G_TYPE_UINT, 0,
1024
 
                                 "SortCriteria",
1025
 
                                 G_TYPE_STRING,
1026
 
                                 "",
1027
 
                                 NULL);
 
1056
        browse_metadata (g_object_ref (content_dir), id, callback, user_data);
 
1057
 
1028
1058
        ret = TRUE;
1029
1059
 
1030
 
free_and_return:
1031
1060
        if (id) {
1032
1061
                g_free (id);
1033
1062
        }