playlist_position_reference_tracker.h

Go to the documentation of this file.
00001 class playlist_position_reference_tracker : public playlist_callback_impl_base {
00002 public:
00004         playlist_position_reference_tracker(bool p_trackitem = true) : playlist_callback_impl_base(~0), m_trackitem(p_trackitem), m_playlist(infinite), m_item(infinite) {}
00005         
00006         void on_items_added(t_size p_playlist,t_size p_start, const pfc::list_base_const_t<metadb_handle_ptr> & p_data,const bit_array & p_selection) {
00007                 if (p_playlist == m_playlist && m_item != infinite && p_start <= m_item) {
00008                         m_item += p_data.get_count();
00009                 }
00010         }
00011         void on_items_reordered(t_size p_playlist,const t_size * p_order,t_size p_count) {
00012                 if (p_playlist == m_playlist) {
00013                         if (m_item < p_count) {
00014                                 m_item = order_helper::g_find_reverse(p_order,m_item);
00015                         } else {
00016                                 m_item = infinite;
00017                         }
00018                 }
00019         }
00020 
00021         void on_items_removed(t_size p_playlist,const bit_array & p_mask,t_size p_old_count,t_size p_new_count) {
00022                 if (p_playlist == m_playlist) {
00023                         if (m_item < p_old_count) {
00024                                 const t_size item_before = m_item;
00025                                 for(t_size walk = p_mask.find_first(true,0,p_old_count); walk < p_old_count; walk = p_mask.find_next(true,walk,p_old_count)) {
00026                                         if (walk < item_before) { 
00027                                                 m_item--;
00028                                         } else if (walk == item_before) {
00029                                                 if (m_trackitem) m_item = infinite;
00030                                                 break;
00031                                         } else {
00032                                                 break;
00033                                         }
00034                                 }
00035                                 if (m_item >= p_new_count) m_item = infinite;
00036                         } else {
00037                                 m_item = infinite;
00038                         }
00039                 }
00040         }
00041 
00042         //todo? could be useful in some cases
00043         void on_items_replaced(t_size p_playlist,const bit_array & p_mask,const pfc::list_base_const_t<t_on_items_replaced_entry> & p_data) {}
00044 
00045         void on_playlist_created(t_size p_index,const char * p_name,t_size p_name_len) {
00046                 if (m_playlist != infinite && p_index <= m_playlist) m_playlist++;
00047         }
00048         void on_playlists_reorder(const t_size * p_order,t_size p_count) {
00049                 if (m_playlist < p_count) m_playlist = order_helper::g_find_reverse(p_order,m_playlist);
00050                 else m_playlist = infinite;
00051         }
00052         void on_playlists_removed(const bit_array & p_mask,t_size p_old_count,t_size p_new_count) {
00053                 if (m_playlist < p_old_count) {
00054                         const t_size playlist_before = m_playlist;
00055                         for(t_size walk = p_mask.find_first(true,0,p_old_count); walk < p_old_count; walk = p_mask.find_next(true,walk,p_old_count)) {
00056                                 if (walk < playlist_before) {
00057                                         m_playlist--;
00058                                 } else if (walk == playlist_before) {
00059                                         m_playlist = infinite;
00060                                         break;
00061                                 } else {
00062                                         break;
00063                                 }
00064                         }
00065                 } else {
00066                         m_playlist = infinite;
00067                 }
00068         }
00069 
00070         t_size m_playlist, m_item;
00071 private:
00072         const bool m_trackitem;
00073 };

Generated on Thu Aug 28 21:15:31 2008 for foobar2000 SDK by  doxygen 1.5.5