|
1
|
1 #pragma once
|
|
|
2
|
|
|
3 #include "tracks.h"
|
|
|
4
|
|
|
5 class track_property_provider_v5_info_source;
|
|
|
6 class track_property_provider_v3_info_source;
|
|
|
7
|
|
|
8 //! Callback interface for track_property_provider::enumerate_properties().
|
|
|
9 class NOVTABLE track_property_callback {
|
|
|
10 public:
|
|
|
11 //! Sets a property list entry to display. Called by track_property_provider::enumerate_properties() implementation.
|
|
|
12 //! @param p_group Name of group to put the entry in, case-sensitive. Note that non-standard groups are sorted alphabetically.
|
|
|
13 //! @param p_sortpriority Sort priority of the property inside its group (smaller value means earlier in the list), pass 0 if you don't care (alphabetic order by name used when more than one item has same priority).
|
|
|
14 //! @param p_name Name of the property.
|
|
|
15 //! @param p_value Value of the property.
|
|
|
16 virtual void set_property(const char * p_group,double p_sortpriority,const char * p_name,const char * p_value) = 0;
|
|
|
17 protected:
|
|
|
18 track_property_callback() {}
|
|
|
19 ~track_property_callback() {}
|
|
|
20 track_property_callback(track_property_callback const &) {};
|
|
|
21 void operator=(track_property_callback const &) {};
|
|
|
22 };
|
|
|
23
|
|
|
24 //! Extended version of track_property_callback
|
|
|
25 class NOVTABLE track_property_callback_v2 : public track_property_callback {
|
|
|
26 public:
|
|
|
27 //! Returns a boolean value indicating whether the specified group is wanted; can be used to suppress expensive processing of information that will not be actually shown. \n
|
|
|
28 //! See also set_property() p_group parameter.
|
|
|
29 virtual bool is_group_wanted(const char * p_group) = 0;
|
|
|
30 protected:
|
|
|
31 ~track_property_callback_v2() {}
|
|
|
32 };
|
|
|
33
|
|
|
34 //! \since 1.3
|
|
|
35 class NOVTABLE track_property_provider_v3_info_source {
|
|
|
36 public:
|
|
|
37 virtual trackInfoContainer::ptr get_info(size_t index) = 0;
|
|
|
38
|
|
|
39 protected:
|
|
|
40 track_property_provider_v3_info_source() {}
|
|
|
41 ~track_property_provider_v3_info_source() {}
|
|
|
42 track_property_provider_v3_info_source( const track_property_provider_v3_info_source & ) {};
|
|
|
43 void operator=( const track_property_provider_v3_info_source & ) {};
|
|
|
44 };
|
|
|
45
|
|
|
46 //! Service for adding custom entries in "Properties" tab of the properties dialog.
|
|
|
47 class NOVTABLE track_property_provider : public service_base {
|
|
|
48 public:
|
|
|
49 //! Enumerates properties of specified track list.
|
|
|
50 //! @param p_tracks List of tracks to enumerate properties on.
|
|
|
51 //! @param p_out Callback interface receiving enumerated properties.
|
|
|
52 virtual void enumerate_properties(trackListRef p_tracks, track_property_callback & p_out) = 0;
|
|
|
53 //! Returns whether specified tech info filed is processed by our service and should not be displayed among unknown fields.
|
|
|
54 //! @param p_name Name of tech info field being queried.
|
|
|
55 //! @returns True if the field is among fields processed by this track_property_provider implementation and should not be displayed among unknown fields, false otherwise.
|
|
|
56 virtual bool is_our_tech_info(const char * p_name) = 0;
|
|
|
57
|
|
|
58
|
|
|
59 //! Helper; calls modern versions of this API where appropriate.
|
|
|
60 //! @param items List of tracks to enumerate properties on.
|
|
|
61 //! @param info Callback object to fetch info from. Pass null to use a generic implementation querying the metadb.
|
|
|
62 //! @param callback Callback interface receiving enumerated properties.
|
|
|
63 //! @param abort The aborter for this operation.
|
|
|
64 void enumerate_properties_helper(trackListRef items, track_property_provider_v3_info_source * info, track_property_callback_v2 & callback, abort_callback & abort);
|
|
|
65 void enumerate_properties_helper(trackListRef items, track_property_provider_v5_info_source* info, track_property_callback_v2& callback, abort_callback& abort);
|
|
|
66 void enumerate_properties_helper(trackListRef items, std::nullptr_t, track_property_callback_v2& callback, abort_callback& abort);
|
|
|
67
|
|
|
68 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(track_property_provider);
|
|
|
69 };
|
|
|
70
|
|
|
71 class NOVTABLE track_property_provider_v2 : public track_property_provider {
|
|
|
72 FB2K_MAKE_SERVICE_INTERFACE(track_property_provider_v2,track_property_provider)
|
|
|
73 public:
|
|
|
74 virtual void enumerate_properties_v2(trackListRef p_tracks, track_property_callback_v2 & p_out) = 0;
|
|
|
75 };
|
|
|
76
|
|
|
77
|
|
|
78 //! \since 1.3
|
|
|
79 class NOVTABLE track_property_provider_v3 : public track_property_provider_v2 {
|
|
|
80 FB2K_MAKE_SERVICE_INTERFACE(track_property_provider_v3,track_property_provider_v2)
|
|
|
81 public:
|
|
|
82 virtual void enumerate_properties_v3(trackListRef items, track_property_provider_v3_info_source & info, track_property_callback_v2 & callback) = 0;
|
|
|
83
|
|
|
84 void enumerate_properties(trackListRef p_tracks, track_property_callback & p_out) override;
|
|
|
85 void enumerate_properties_v2(trackListRef p_tracks, track_property_callback_v2 & p_out) override;
|
|
|
86 };
|
|
|
87
|
|
|
88 template<typename T>
|
|
|
89 class track_property_provider_factory_t : public service_factory_single_t<T> {};
|
|
|
90
|
|
|
91 //! \since 1.5
|
|
|
92 //! Adds abortability on top of track_property_provider_v3 interface. \n
|
|
|
93 //! The previous revisions of this API were only legal to call from the main thread. \n
|
|
|
94 //! track_property_provider_v4 implementers should make NO ASSUMPTIONS about the thread they are in. \n
|
|
|
95 //! Implementing track_property_provider_v4 declares your class as safe to call from any thread. \n
|
|
|
96 //! If called via enumerate_properties_v4() method or off-main-thread, the implementation can assume the info source object to be thread-safe.
|
|
|
97 class NOVTABLE track_property_provider_v4 : public track_property_provider_v3 {
|
|
|
98 FB2K_MAKE_SERVICE_INTERFACE(track_property_provider_v4, track_property_provider_v3 );
|
|
|
99 public:
|
|
|
100 void enumerate_properties_v3(trackListRef items, track_property_provider_v3_info_source & info, track_property_callback_v2 & callback) override;
|
|
|
101
|
|
|
102 virtual void enumerate_properties_v4(trackListRef items, track_property_provider_v3_info_source & info, track_property_callback_v2 & callback, abort_callback & abort) = 0;
|
|
|
103 };
|
|
|
104
|
|
|
105 //! \since 2.0
|
|
|
106 //! Allows metadb v2 info records to be handed over transparently.
|
|
|
107 class NOVTABLE track_property_provider_v5_info_source {
|
|
|
108 public:
|
|
|
109 virtual metadb_v2_rec_t get_info(size_t index) = 0;
|
|
|
110 };
|
|
|
111
|
|
|
112 //! \since 2.0
|
|
|
113 //! Allows metadb v2 info records to be handed over transparently.
|
|
|
114 class NOVTABLE track_property_provider_v5 : public track_property_provider_v4 {
|
|
|
115 FB2K_MAKE_SERVICE_INTERFACE(track_property_provider_v5, track_property_provider_v4);
|
|
|
116 public:
|
|
|
117 void enumerate_properties_v4(trackListRef items, track_property_provider_v3_info_source& info, track_property_callback_v2& callback, abort_callback& abort) override;
|
|
|
118
|
|
|
119 virtual void enumerate_properties_v5(trackListRef items, track_property_provider_v5_info_source& info, track_property_callback_v2& callback, abort_callback& abort) = 0;
|
|
|
120 };
|
|
|
121
|
|
|
122 class track_property_provider_v5_info_source_impl : public track_property_provider_v5_info_source {
|
|
|
123 public:
|
|
|
124 track_property_provider_v5_info_source_impl(trackListRef items, abort_callback &a);
|
|
|
125 metadb_v2_rec_t get_info(size_t index) override;
|
|
|
126 private:
|
|
|
127 pfc::array_t< metadb_v2_rec_t > m_infos;
|
|
|
128 #if FOOBAR2000_TARGET_VERSION < 81
|
|
|
129 metadb_handle_list m_tracks;
|
|
|
130 #endif
|
|
|
131 }; |