/* This file is part of Clementine.
Clementine is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see .
*/
#include "playlist.h"
#include "playlistmanager.h"
#include "playlisttabbar.h"
#include "songmimedata.h"
#include "radio/radiomimedata.h"
#include "ui/iconloader.h"
#include
#include
#include
#include
PlaylistTabBar::PlaylistTabBar(QWidget *parent)
: QTabBar(parent),
manager_(NULL),
menu_(new QMenu(this)),
menu_index_(-1),
suppress_current_changed_(false)
{
setAcceptDrops(true);
remove_ = menu_->addAction(IconLoader::Load("list-remove"), tr("Remove playlist"), this, SLOT(Remove()));
rename_ = menu_->addAction(IconLoader::Load("edit-rename"), tr("Rename playlist..."), this, SLOT(Rename()));
save_ = menu_->addAction(IconLoader::Load("document-save"), tr("Save playlist..."), this, SLOT(Save()));
menu_->addSeparator();
connect(this, SIGNAL(currentChanged(int)), this, SLOT(CurrentIndexChanged(int)));
connect(this, SIGNAL(tabMoved(int,int)), this, SLOT(TabMoved()));
}
void PlaylistTabBar::SetActions(
QAction* new_playlist, QAction* load_playlist) {
menu_->insertAction(0, new_playlist);
menu_->insertAction(0, load_playlist);
new_ = new_playlist;
}
void PlaylistTabBar::SetManager(PlaylistManager *manager) {
manager_ = manager;
}
void PlaylistTabBar::contextMenuEvent(QContextMenuEvent* e) {
menu_index_ = tabAt(e->pos());
rename_->setEnabled(menu_index_ != -1);
remove_->setEnabled(menu_index_ != -1 && count() > 1);
save_->setEnabled(menu_index_ != -1);
menu_->popup(e->globalPos());
}
void PlaylistTabBar::mouseReleaseEvent(QMouseEvent* e) {
if (e->button() == Qt::MidButton) {
int index = tabAt(e->pos());
if (index != -1) {
emit Remove(tabData(index).toInt());
}
}
QTabBar::mouseReleaseEvent(e);
}
void PlaylistTabBar::mouseDoubleClickEvent(QMouseEvent *e) {
int index = tabAt(e->pos());
if (index == -1) {
new_->activate(QAction::Trigger);
}
QTabBar::mouseDoubleClickEvent(e);
}
void PlaylistTabBar::Rename() {
if (menu_index_ == -1)
return;
QString name = tabText(menu_index_);
name = QInputDialog::getText(
this, tr("Rename playlist"), tr("Enter a new name for this playlist"),
QLineEdit::Normal, name);
if (name.isNull())
return;
emit Rename(tabData(menu_index_).toInt(), name);
}
void PlaylistTabBar::Remove() {
if (menu_index_ == -1)
return;
emit Remove(tabData(menu_index_).toInt());
}
void PlaylistTabBar::Save() {
if (menu_index_ == -1)
return;
emit Save(tabData(menu_index_).toInt());
}
int PlaylistTabBar::current_id() const {
if (currentIndex() == -1)
return -1;
return tabData(currentIndex()).toInt();
}
int PlaylistTabBar::index_of(int id) const {
for (int i=0 ; i ids;
for (int i=0 ; imimeData()->hasUrls() ||
e->mimeData()->hasFormat(Playlist::kRowsMimetype) ||
qobject_cast(e->mimeData()) ||
qobject_cast(e->mimeData())) {
e->acceptProposedAction();
}
}
void PlaylistTabBar::dragMoveEvent(QDragMoveEvent* e) {
drag_hover_tab_ = tabAt(e->pos());
if (drag_hover_tab_ == -1) {
e->setDropAction(Qt::IgnoreAction);
e->ignore();
drag_hover_timer_.stop();
} else {
e->setDropAction(Qt::CopyAction);
e->accept(tabRect(drag_hover_tab_));
if (!drag_hover_timer_.isActive())
drag_hover_timer_.start(kDragHoverTimeout, this);
}
}
void PlaylistTabBar::dragLeaveEvent(QDragLeaveEvent*) {
drag_hover_timer_.stop();
}
void PlaylistTabBar::timerEvent(QTimerEvent* e) {
QTabBar::timerEvent(e);
if (e->timerId() == drag_hover_timer_.timerId()) {
drag_hover_timer_.stop();
if (drag_hover_tab_ != -1)
setCurrentIndex(drag_hover_tab_);
}
}
void PlaylistTabBar::dropEvent(QDropEvent* e) {
if (drag_hover_tab_ == -1) {
e->ignore();
return;
}
setCurrentIndex(drag_hover_tab_);
manager_->current()->dropMimeData(e->mimeData(), e->proposedAction(), -1, 0, QModelIndex());
}