[queue] Fix moving a song to the last position in the queue failed

This commit is contained in:
chme 2016-03-05 14:02:06 +01:00
parent 7aba0bf332
commit 1ec7ad683e
1 changed files with 56 additions and 112 deletions

View File

@ -698,6 +698,46 @@ queue_add_after(struct queue *queue, struct queue_item *item, unsigned int item_
queue_add_afteritem(queue, item, item_prev); queue_add_afteritem(queue, item, item_prev);
} }
static void
queue_move_item_before_item(struct queue *queue, struct queue_item *item, struct queue_item *item_next, char shuffle)
{
if (!item_next)
{
// If item_next is NULL the item should be inserted at the end of the queue (directly before the head item)
item_next = queue->head;
}
// Remove item from the queue
if (shuffle)
{
item->shuffle_prev->shuffle_next = item->shuffle_next;
item->shuffle_next->shuffle_prev = item->shuffle_prev;
}
else
{
item->prev->next = item->next;
item->next->prev = item->prev;
}
// Insert item into the queue before the item at the target postion
if (shuffle)
{
item_next->shuffle_prev->shuffle_next = item;
item->shuffle_prev = item_next->shuffle_prev;
item_next->shuffle_prev = item;
item->shuffle_next = item_next;
}
else
{
item_next->prev->next = item;
item->prev = item_next->prev;
item_next->prev = item;
item->next = item_next;
}
}
/* /*
* Moves the item at from_pos to to_pos in the play-queue (shuffle = 0) or shuffle-queue (shuffle = 1) * Moves the item at from_pos to to_pos in the play-queue (shuffle = 0) or shuffle-queue (shuffle = 1)
* *
@ -726,48 +766,15 @@ queue_move_bypos(struct queue *queue, unsigned int item_id, unsigned int from_po
// Get the item at the target position // Get the item at the target position
item_next = queueitem_get_bypos(queue, item_id, (to_offset + 1), shuffle); item_next = queueitem_get_bypos(queue, item_id, (to_offset + 1), shuffle);
if (!item_next)
{
DPRINTF(E_LOG, L_PLAYER, "Invalid position given to move items\n");
return;
}
// Remove item from the queue queue_move_item_before_item(queue, item, item_next, shuffle);
if (shuffle)
{
item->shuffle_prev->shuffle_next = item->shuffle_next;
item->shuffle_next->shuffle_prev = item->shuffle_prev;
}
else
{
item->prev->next = item->next;
item->next->prev = item->prev;
}
// Insert item into the queue before the item at the target postion
if (shuffle)
{
item_next->shuffle_prev->shuffle_next = item;
item->shuffle_prev = item_next->shuffle_prev;
item_next->shuffle_prev = item;
item->shuffle_next = item_next;
}
else
{
item_next->prev->next = item;
item->prev = item_next->prev;
item_next->prev = item;
item->next = item_next;
}
} }
void void
queue_move_byindex(struct queue *queue, unsigned int from_pos, unsigned int to_pos, char shuffle) queue_move_byindex(struct queue *queue, unsigned int from_pos, unsigned int to_pos, char shuffle)
{ {
struct queue_item *item; struct queue_item *item;
struct queue_item *itemnext; struct queue_item *item_next;
if (from_pos == to_pos) if (from_pos == to_pos)
return; return;
@ -780,46 +787,16 @@ queue_move_byindex(struct queue *queue, unsigned int from_pos, unsigned int to_p
return; return;
} }
// Check if the index of the item to move is lower than the target index
// If that is the case, increment the target position, because the given to_pos
// is based on the queue without the moved item.
if (from_pos < to_pos)
to_pos++;
// Get the item at the target position // Get the item at the target position
itemnext = queueitem_get_byindex(queue, to_pos, shuffle); item_next = queueitem_get_byindex(queue, to_pos, shuffle);
if (!itemnext)
{
DPRINTF(E_LOG, L_PLAYER, "Invalid position given to move items\n");
return;
}
if (to_pos > from_pos) queue_move_item_before_item(queue, item, item_next, shuffle);
itemnext = item_next(itemnext, shuffle);
// Remove item from the queue
if (shuffle)
{
item->shuffle_prev->shuffle_next = item->shuffle_next;
item->shuffle_next->shuffle_prev = item->shuffle_prev;
}
else
{
item->prev->next = item->next;
item->next->prev = item->prev;
}
// Insert item into the queue before the item at the target postion
if (shuffle)
{
itemnext->shuffle_prev->shuffle_next = item;
item->shuffle_prev = itemnext->shuffle_prev;
itemnext->shuffle_prev = item;
item->shuffle_next = itemnext;
}
else
{
itemnext->prev->next = item;
item->prev = itemnext->prev;
itemnext->prev = item;
item->next = itemnext;
}
} }
/* /*
@ -836,7 +813,7 @@ queue_move_byitemid(struct queue *queue, unsigned int item_id, unsigned int to_p
{ {
struct queue_item *item; struct queue_item *item;
struct queue_item *item_next; struct queue_item *item_next;
int index; int from_pos;
// Get the item to be moved // Get the item to be moved
item = queueitem_get_byitemid(queue, item_id); item = queueitem_get_byitemid(queue, item_id);
@ -846,57 +823,24 @@ queue_move_byitemid(struct queue *queue, unsigned int item_id, unsigned int to_p
return; return;
} }
index = queue_index_byitemid(queue, item_id, shuffle); from_pos = queue_index_byitemid(queue, item_id, shuffle);
if (index == to_pos) if (from_pos == to_pos)
{ {
DPRINTF(E_DBG, L_PLAYER, "Ignore moving item %d from index %d to %d\n", item_id, index, to_pos); DPRINTF(E_DBG, L_PLAYER, "Ignore moving item %d from index %d to %d\n", item_id, from_pos, to_pos);
return; return;
} }
// Check if the index of the item to move is lower than the target index // Check if the index of the item to move is lower than the target index
// If that is the case, increment the target position, because the given to_pos // If that is the case, increment the target position, because the given to_pos
// is based on the queue without the moved item. // is based on the queue without the moved item.
if (index < to_pos) if (from_pos < to_pos)
to_pos++; to_pos++;
// Get the item at the target position // Get the item at the target position
item_next = queueitem_get_byindex(queue, to_pos, shuffle); item_next = queueitem_get_byindex(queue, to_pos, shuffle);
if (!item_next)
{
DPRINTF(E_LOG, L_PLAYER, "Invalid position given to move items\n");
return;
}
// Remove item from the queue queue_move_item_before_item(queue, item, item_next, shuffle);
if (shuffle)
{
item->shuffle_prev->shuffle_next = item->shuffle_next;
item->shuffle_next->shuffle_prev = item->shuffle_prev;
}
else
{
item->prev->next = item->next;
item->next->prev = item->prev;
}
// Insert item into the queue before the item at the target postion
if (shuffle)
{
item_next->shuffle_prev->shuffle_next = item;
item->shuffle_prev = item_next->shuffle_prev;
item_next->shuffle_prev = item;
item->shuffle_next = item_next;
}
else
{
item_next->prev->next = item;
item->prev = item_next->prev;
item_next->prev = item;
item->next = item_next;
}
} }
/* /*