aboutsummaryrefslogtreecommitdiff
path: root/src/listwidget.cpp
diff options
context:
space:
mode:
authorvovanec <vovanec@90c681e8-e032-0410-971d-27865f9a5e38>2008-02-07 13:36:34 +0000
committervovanec <vovanec@90c681e8-e032-0410-971d-27865f9a5e38>2008-02-07 13:36:34 +0000
commit06d1877811fa6aa97dddc0e03bcde4e766928c87 (patch)
treec25462d0e58c3d58c728664440412bf4f16a49ec /src/listwidget.cpp
parent3f6b60f23c44a8ba8dd97ca6f41a16e2af7ef2f7 (diff)
downloadqmmp-06d1877811fa6aa97dddc0e03bcde4e766928c87.tar.gz
qmmp-06d1877811fa6aa97dddc0e03bcde4e766928c87.tar.bz2
qmmp-06d1877811fa6aa97dddc0e03bcde4e766928c87.zip
new directory structure
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@232 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/listwidget.cpp')
-rw-r--r--src/listwidget.cpp482
1 files changed, 0 insertions, 482 deletions
diff --git a/src/listwidget.cpp b/src/listwidget.cpp
deleted file mode 100644
index fb2173b33..000000000
--- a/src/listwidget.cpp
+++ /dev/null
@@ -1,482 +0,0 @@
-/***************************************************************************
- * Copyright (C) 2006 by Ilya Kotov *
- * forkotov02@hotmail.ru *
- * *
- * This program 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 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program 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 this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- ***************************************************************************/
-#include <QPixmap>
-#include <QResizeEvent>
-#include <QPainter>
-#include <QFont>
-#include <QFontMetrics>
-#include <QSettings>
-#include <QMenu>
-#include <QUrl>
-#include <QApplication>
-
-#include "mediafile.h"
-#include "textscroller.h"
-#include "listwidget.h"
-#include "skin.h"
-#include "playlistmodel.h"
-#include "playlist.h"
-
-#define INVALID_ROW -1
-
-ListWidget::ListWidget(QWidget *parent)
- : QWidget(parent)
-{
- m_update = FALSE;
- m_skin = Skin::getPointer();
- loadColors();
- setWindowFlags(Qt::FramelessWindowHint);
- m_menu = new QMenu(this);
- m_scroll_direction = NONE;
- m_prev_y = 0;
- m_anchor_row = INVALID_ROW;
-
- m_first = 0;
- m_rows = 0;
- m_scroll = FALSE;
- m_select_on_release = FALSE;
- readSettings();
- connect(m_skin, SIGNAL(skinChanged()), this, SLOT(updateSkin()));
- setAcceptDrops(true);
-}
-
-
-ListWidget::~ListWidget()
-{}
-
-void ListWidget::readSettings()
-{
- QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
- QString fontname = settings.value("PlayList/Font","").toString();
- if (fontname.isEmpty ())
- fontname = QFont("Helvetica [Cronyx]", 10).toString();
- m_font.fromString(fontname);
-
- if (m_update)
- {
- delete m_metrics;
- m_metrics = new QFontMetrics(m_font);
- m_rows = (height() - 10) / m_metrics->ascent ();
- updateList();
- }
- else
- {
- m_update = TRUE;
- m_metrics = new QFontMetrics(m_font);
- }
-}
-
-void ListWidget::loadColors()
-{
- m_normal.setNamedColor(m_skin->getPLValue("normal"));
- m_current.setNamedColor(m_skin->getPLValue("current"));
- m_normal_bg.setNamedColor(m_skin->getPLValue("normalbg"));
- m_selected_bg.setNamedColor(m_skin->getPLValue("selectedbg"));
-}
-
-void ListWidget::paintEvent(QPaintEvent *)
-{
-
- QPainter m_painter(this);
- //m_painter.setPen(Qt::white);
- m_painter.setFont(m_font);
- m_painter.setBrush(QBrush(m_normal_bg));
- m_painter.drawRect(-1,-1,width()+1,height()+1);
-
-
-
- for (int i=0; i<m_titles.size(); ++i )
- {
- if (m_model->isSelected(i + m_first))
- {
- m_painter.setBrush(QBrush(m_selected_bg));
- m_painter.setPen(m_selected_bg);
- m_painter.drawRect ( 6, 15+(i-1)*m_metrics->ascent(),
- width() - 10, m_metrics->ascent());
- }
-
- if (m_model->currentRow() == i + m_first)
- m_painter.setPen(m_current);
- else
- m_painter.setPen(m_normal); //243,58
-
- m_painter.drawText(10,14+i*m_metrics->ascent(),m_titles.at(i));
-
- if (m_model->isQueued(m_model->item(i + m_first)))
- {
- QString queue_string = "|" +
- QString::number(1 + m_model->queuedIndex(m_model->item(m_first + i))) + "|";
-
- int old_size = m_font.pointSize();
- m_font.setPointSize(old_size - 1 );
- m_painter.setFont(m_font);
-
- m_painter.drawText(width() - 10 - m_metrics->width(queue_string) - m_metrics->width(m_times.at(i)), 12+i*m_metrics->ascent (), queue_string);
-
- m_font.setPointSize(old_size);
- m_painter.setFont(m_font);
-
-
- m_painter.setBrush(QBrush(Qt::transparent));
- //m_painter.drawRect(width() - 10 - m_metrics->width(queue_string) - m_metrics->width(m_times.at(i)),
- // /*14+*/i*m_metrics->ascent () + 3,10,12);
- m_painter.setBrush(QBrush(m_normal_bg));
- }
-
-
- m_painter.drawText(width() - 7 - m_metrics->width(m_times.at(i)),
- 14+i*m_metrics->ascent (), m_times.at(i));
-
- }
-
-}
-
-void ListWidget::mouseDoubleClickEvent (QMouseEvent *e)
-{
- int y = e->y();
- int row = rowAt(y);
- if (INVALID_ROW != row)
- {
- m_model->setCurrent(row);
- emit selectionChanged();
- update();
- }
-}
-
-
-void ListWidget::mousePressEvent(QMouseEvent *e)
-{
- m_scroll = TRUE;
- int y = e->y();
- int row = rowAt(y);
-
- if (INVALID_ROW != row && m_model->count() > row)
- {
- if (!(Qt::ControlModifier & e->modifiers () ||
- Qt::ShiftModifier & e->modifiers () ||
- m_model->isSelected(row)))
- m_model->clearSelection();
-
- if (m_model->isSelected(row) && (e->modifiers() == Qt::NoModifier))
- m_select_on_release = TRUE;
-
- //qWarning("m_prev_clicked_row: %d",m_prev_clicked_row);
-
- m_pressed_row = row;
- if ((Qt::ShiftModifier & e->modifiers()))
- {
-
- if (m_pressed_row > m_anchor_row)
- {
- //int upper_selected = m_model->firstSelectedUpper(m_anchor_row);
- //if (INVALID_ROW != upper_selected)
- //{
- /*for (int j = upper_selected;j < m_anchor_row;j++)
- {
- m_model->setSelected(j, false);
- }*/
- m_model->clearSelection();
- for (int j = m_anchor_row;j <= m_pressed_row;j++)
- {
- m_model->setSelected(j, true);
- }
- //}
- }
- else
- {
- m_model->clearSelection();
- for (int j = m_anchor_row;j >= m_pressed_row;j--)
- {
- m_model->setSelected(j, true);
- }
- }
-
- /*
- int upper_selected = m_model->firstSelectedUpper(row);
- int lower_selected = m_model->firstSelectedLower(row);
- if (INVALID_ROW != upper_selected)
- {
- for (int j = upper_selected;j <= row;j++)
- {
- m_model->setSelected(j, true);
- }
- }
- else if (INVALID_ROW != lower_selected)
- {
- for (int j = row;j <= lower_selected;j++)
- {
- m_model->setSelected(j, true);
- }
- }
- else
- m_model->setSelected(row, true);
- */
- }
- else
- {
- if (!m_model->isSelected(row) || (Qt::ControlModifier & e->modifiers()))
- m_model->setSelected(row, !m_model->isSelected(row));
- }
-
- if (m_model->getSelection(m_pressed_row).count() == 1)
- m_anchor_row = m_pressed_row;
- //qWarning("m_anchor_row: %d",m_anchor_row);
-
- update();
- }
- QWidget::mousePressEvent(e);
-}
-
-void ListWidget::resizeEvent(QResizeEvent *e)
-{
- m_rows = (e->size().height() - 10) / m_metrics->ascent ();
-
- m_scroll = TRUE;
-
- updateList();
- QWidget::resizeEvent(e);
-}
-
-void ListWidget::wheelEvent (QWheelEvent *e)
-{
- if (m_model->count() <= m_rows)
- return;
- if ((m_first == 0 && e->delta() > 0) ||
- ((m_first == m_model->count() - m_rows) && e->delta() < 0))
- return;
- m_first -= e->delta()/40; //40*3 TODO: add step to config
- if (m_first < 0)
- m_first = 0;
-
- if (m_first > m_model->count() - m_rows)
- m_first = m_model->count() - m_rows;
-
- m_scroll = FALSE;
- updateList();
-}
-
-void ListWidget::updateList()
-{
- if (m_model->count() < (m_rows+m_first+1) && m_rows< m_model->count())
- {
- m_first = m_model->count() - m_rows;
- }
- if (m_model->count() < m_rows + 1)
- {
- m_first = 0;
- emit positionChanged(0,0);
- }
- else
- {
- //int pos = m_first*99/(m_model->count() - m_rows);
- //emit positionChanged(pos);
- emit positionChanged(m_first, m_model->count() - m_rows);
- }
- if (m_model->count() <= m_first)
- {
- m_first = 0;
- emit positionChanged(0, qMax(0, m_model->count() - m_rows));
- }
-
- m_titles = m_model->getTitles(m_first, m_rows );
- m_times = m_model->getTimes(m_first, m_rows );
- m_scroll = FALSE;
- //add numbers
- for (int i = 0; i < m_titles.size(); ++i)
- {
- QString title = m_titles.at(i);
- m_titles.replace(i, title.prepend(QString("%1").arg(m_first+i+1)+". "));
-
- }
- if (m_model->currentItem())
- {
- TextScroller::getPointer()->setText("*** "+m_model->currentItem()->title());
- parentWidget()->parentWidget()->setWindowTitle(m_model->currentItem()->title());
- }
- cut();
- update();
-}
-
-void ListWidget::setModel(PlayListModel *model)
-{
- m_model = model;
- connect (m_model, SIGNAL(listChanged()), SLOT(updateList()));
- connect (m_model, SIGNAL(currentChanged()), SLOT(recenterCurrent()));
- updateList();
-}
-
-void ListWidget::scroll(int sc)
-{
- if (m_model->count() <= m_rows)
- return;
- m_first = sc; //*(m_model->count() - m_rows)/99;
- m_scroll = TRUE;
- updateList();
-}
-
-void ListWidget::cut()
-{
- bool cut;
- for (int i=0; i<m_titles.size(); ++i )
- {
- QString name;
- cut = FALSE;
-
- int queue_number_space = 0;
- if (m_model->isQueued(m_model->item(i + m_first)))
- {
- int index = m_model->queuedIndex(m_model->item(m_first + i));
- QString queue_string = "|"+QString::number(index)+"|";
- queue_number_space = m_metrics->width(queue_string);
- }
- while ( m_metrics->width(m_titles.at(i)) > (this->width() - 54 - queue_number_space))
- {
- cut = TRUE;
- name = m_titles.at(i);
- m_titles.replace(i, name.left(name.length()-1) );
- }
- if (cut)
- {
- m_titles.replace(i, name.left(name.length()-3).trimmed()+"...");
-
- }
- }
-}
-
-void ListWidget::updateSkin()
-{
- loadColors();
- update();
-}
-
-void ListWidget::dragEnterEvent(QDragEnterEvent *event)
-{
- if (event->mimeData()->hasFormat("text/uri-list"))
- event->acceptProposedAction();
-}
-
-
-void ListWidget::dropEvent(QDropEvent *event)
-{
- if (event->mimeData()->hasUrls())
- {
- QList<QUrl> list_urls = event->mimeData()->urls();
- event->acceptProposedAction();
- QApplication::restoreOverrideCursor();
-
- foreach(QUrl u,list_urls)
- {
- QString add_string = u.toString(QUrl::RemoveScheme);
- if (!add_string.isEmpty())
- processFileInfo(QFileInfo(add_string));
- }
- }
-
-}
-
-void ListWidget::processFileInfo(const QFileInfo& info)
-{
- if (info.isDir())
- {
- m_model->addDirectory(info.absoluteFilePath());
- }
- else
- {
- m_model->addFile(info.absoluteFilePath());
- }
-}
-
-void ListWidget::mouseMoveEvent(QMouseEvent *e)
-{
- m_scroll = true;
- if (m_prev_y > e->y())
- m_scroll_direction = TOP;
- else if (m_prev_y < e->y())
- m_scroll_direction = DOWN;
- else
- m_scroll_direction = NONE;
-
- int row = rowAt(e->y());
-
- if (INVALID_ROW != row)
- {
- SimpleSelection sel = m_model->getSelection(m_pressed_row);
- if ((sel.m_top == 0 && m_scroll_direction == TOP) && sel.count() > 1 ||
- (sel.m_bottom == m_model->count() - 1 && m_scroll_direction == DOWN && sel.count() > 1)
- )
- return;
-
- if (row + 1 == m_first + m_rows && m_scroll_direction == DOWN)
- (m_first + m_rows < m_model->count() ) ? m_first ++ : m_first;
- else if (row == m_first && m_scroll_direction == TOP)
- (m_first > 0) ? m_first -- : 0;
-
- m_model->moveItems(m_pressed_row,row);
- m_prev_y = e->y();
- m_scroll = false;
- m_pressed_row = row;
- }
-}
-
-void ListWidget::mouseReleaseEvent(QMouseEvent *e)
-{
- if (FALSE != m_select_on_release)
- {
- m_model->clearSelection();
- m_model->setSelected(m_pressed_row,true);
- //if(e->modifiers() != Qt::ShiftModifier)
- m_anchor_row = m_pressed_row;
- m_select_on_release = FALSE;
- }
- m_pressed_row = INVALID_ROW;
- m_scroll_direction = NONE;
- QWidget::mouseReleaseEvent(e);
-}
-
-int ListWidget::rowAt( int y) const
-{
- for (int i = 0; i < qMin(m_rows, m_model->count() - m_first); ++i )
- {
- if ((y >= 2+i*m_metrics->ascent())&&(y < 2+(i+1)*m_metrics->ascent()))
- return m_first + i;
- }
- return INVALID_ROW;
-}
-
-
-void ListWidget::contextMenuEvent(QContextMenuEvent * event)
-{
- if (menu())
- menu()->exec(event->globalPos());
-}
-
-void ListWidget::recenterCurrent()
-{
- if (!m_scroll)
- {
- if (m_first + m_rows < m_model->currentRow() + 1)
- m_first = qMin(m_model->count() - m_rows,
- m_model->currentRow() - m_rows/2 + 1);
- else if (m_first > m_model->currentRow())
- m_first = qMax (m_model->currentRow() - m_rows/2 + 1, 0);
- }
-}
-
-