void MeltedPlaylistDock::onDropped(QString clip, int row)
{
    if (row == -1)
        onAppend(clip);
    else
        onInsert(clip, row);
}
void 
View_Unlabeled::cb_insert(cache_t::iterator src)
{
   if ( ! src->second.annotations.count(label) )
   {
      members.insert(make_pair(src->first, src));
      onInsert(src);
   }
}
void 
View_Unlabeled::cb_erase_annotation(cache_t::iterator it, std::string attr)
{
   if ( label == attr )
   {
      std::pair<key_map_t::iterator, bool> inserted = 
         members.insert(make_pair(it->first, it));
      if ( ! inserted.second )
         EXCEPTION_MNGR(std::runtime_error, "View_Unlabeled::"
                        "cb_erase_annotation: somehow the item was already "
                        "in the View!");
      onInsert(it);
   }
   else
   {
      key_map_t::iterator tmp = members.find(it->first);
      if ( tmp != members.end() && tmp->second.src_it == it )
         onEraseAnnotation(it, attr);
   }
}
void 
View_Unlabeled::
cb_rebuild(const utilib::ReadOnly_Property&)
{
   // Notify consumers that any old cache values are disappearing
   onClear(NULL);
   members.clear();

   if ( core_cache.empty() )
      return;

   // Rebuild the membership
   for ( iterator it = core_cache->begin(); it != core_cache->end(); ++it )
   {
      if ( ! it->second.annotations.count(label) )
      {
         cache_t::iterator raw_it = extract_iterator(it);
         members.insert(make_pair(raw_it->first, raw_it));
         onInsert(raw_it);
      }
   }
}