void Idlist::move( unsigned int index, unsigned int newindex ) { if( !xmmsv_coll_idlist_move( coll_, index, newindex ) ) { std::stringstream err; err << "Failed to move idlist entry from index " << index << " to " << newindex; throw collection_operation_error( err.str() ); } }
/** * Move an entry in playlist * */ static void xmms_playlist_client_move_entry (xmms_playlist_t *playlist, const gchar *plname, gint32 pos, gint32 newpos, xmms_error_t *err) { xmmsv_t *dict; xmms_medialib_entry_t id; gint currpos, size; gint64 ipos, inewpos; xmmsv_coll_t *plcoll; g_return_if_fail (playlist); XMMS_DBG ("Moving %d, to %d", pos, newpos); g_mutex_lock (playlist->mutex); plcoll = xmms_playlist_get_coll (playlist, plname, err); if (plcoll == NULL) { /* FIXME: happens ? */ g_mutex_unlock (playlist->mutex); return; } currpos = xmms_playlist_coll_get_currpos (plcoll); size = xmms_playlist_coll_get_size (plcoll); if (size == 0 || newpos > (size - 1)) { xmms_error_set (err, XMMS_ERROR_NOENT, "Cannot move entry outside playlist"); g_mutex_unlock (playlist->mutex); return; } if (!xmmsv_coll_idlist_move (plcoll, pos, newpos)) { xmms_error_set (err, XMMS_ERROR_NOENT, "Entry was not in list!"); g_mutex_unlock (playlist->mutex); return; } /* Update the current position pointer */ ipos = pos; inewpos = newpos; if (inewpos <= currpos && ipos > currpos) currpos++; else if (inewpos >= currpos && ipos < currpos) currpos--; else if (ipos == currpos) currpos = inewpos; xmms_collection_set_int_attr (plcoll, "position", currpos); xmmsv_coll_idlist_get_index (plcoll, newpos, &id); dict = xmms_playlist_changed_msg_new (playlist, XMMS_PLAYLIST_CHANGED_MOVE, id, plname); xmmsv_dict_set_int (dict, "position", pos); xmmsv_dict_set_int (dict, "newposition", newpos); xmms_playlist_changed_msg_send (playlist, dict); XMMS_PLAYLIST_CURRPOS_MSG (currpos, plname); g_mutex_unlock (playlist->mutex); return; }
/** Sorts the playlist by properties. * * This will sort the list. * @param playlist The playlist to sort. * @param properties Tells xmms_playlist_sort which properties it * should use when sorting. * @param err An #xmms_error_t - needed since xmms_playlist_sort is an ipc * method handler. */ static void xmms_playlist_client_replace (xmms_playlist_t *playlist, const gchar *plname, xmmsv_coll_t *coll, xmms_playlist_position_action_t action, xmms_error_t *err) { xmms_medialib_entry_t id, current_id; xmmsv_coll_t *plcoll; xmmsv_t *result; gint current_position, i; g_return_if_fail (playlist); g_return_if_fail (coll); g_mutex_lock (playlist->mutex); plcoll = xmms_playlist_get_coll (playlist, plname, err); if (plcoll == NULL) { xmms_error_set (err, XMMS_ERROR_NOENT, "no such playlist!"); g_mutex_unlock (playlist->mutex); return; } current_position = xmms_playlist_coll_get_currpos (plcoll); xmmsv_coll_idlist_get_index (plcoll, current_position, ¤t_id); result = xmms_collection_query_ids (playlist->colldag, coll, err); if (result == NULL) { g_mutex_unlock (playlist->mutex); return; } xmmsv_coll_idlist_clear (plcoll); current_position = -1; for (i = 0; xmmsv_list_get_int (result, i, &id); i++) { if (id == current_id) current_position = i; xmmsv_coll_idlist_append (plcoll, id); } switch (action) { case XMMS_PLAYLIST_CURRENT_ID_FORGET: current_position = -1; break; case XMMS_PLAYLIST_CURRENT_ID_MOVE_TO_FRONT: if (current_position > 0) { xmmsv_coll_idlist_move (plcoll, current_position, 0); current_position = 0; } break; default: break; } xmmsv_unref (result); xmms_collection_set_int_attr (plcoll, "position", current_position); XMMS_PLAYLIST_CHANGED_MSG (XMMS_PLAYLIST_CHANGED_REPLACE, (current_position < 0) ? 0 : current_id, plname); XMMS_PLAYLIST_CURRPOS_MSG (current_position, plname); g_mutex_unlock (playlist->mutex); }