diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-07-26 08:30:52 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-07-26 08:30:52 +0000 |
| commit | 968c05fe1856fb8ee586bb1ebbb0e66fd2661b5a (patch) | |
| tree | e4e4e1dfe4f6a07cef6198b608d80bf92f68cb17 /src/plugins/Ui/skinned/playlistheader.cpp | |
| parent | 4c87a6d0b7f3674b3661cfe20a8a51f231ef559c (diff) | |
| download | qmmp-968c05fe1856fb8ee586bb1ebbb0e66fd2661b5a.tar.gz qmmp-968c05fe1856fb8ee586bb1ebbb0e66fd2661b5a.tar.bz2 qmmp-968c05fe1856fb8ee586bb1ebbb0e66fd2661b5a.zip | |
restore playlist changes
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@5255 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Ui/skinned/playlistheader.cpp')
| -rw-r--r-- | src/plugins/Ui/skinned/playlistheader.cpp | 200 |
1 files changed, 115 insertions, 85 deletions
diff --git a/src/plugins/Ui/skinned/playlistheader.cpp b/src/plugins/Ui/skinned/playlistheader.cpp index 4839ac49d..7a77df8f2 100644 --- a/src/plugins/Ui/skinned/playlistheader.cpp +++ b/src/plugins/Ui/skinned/playlistheader.cpp @@ -74,6 +74,7 @@ PlayListHeader::PlayListHeader(QWidget *parent) : m_offset = 0; m_sorting_column = -1; m_reverted = false; + m_auto_resize = false; m_task = NO_TASK; m_model = PlayListManager::instance()->headerModel(); m_skin = Skin::instance(); @@ -84,13 +85,12 @@ PlayListHeader::PlayListHeader(QWidget *parent) : m_trackStateAction->setCheckable(true); m_autoResizeAction = m_menu->addAction(tr("Auto-resize"), this, SLOT(setAutoResize(bool))); m_autoResizeAction->setCheckable(true); - m_menu->addAction(tr("Restore Size"), this, SLOT(restoreSize())); m_menu->addSeparator(); m_menu->addAction(QIcon::fromTheme("list-remove"), tr("Remove Column"), this, SLOT(removeColumn())); connect(m_skin, SIGNAL(skinChanged()), this, SLOT(updateSkin())); connect(m_model, SIGNAL(columnAdded(int)), SLOT(onColumnAdded(int))); - connect(m_model, SIGNAL(columnRemoved(int)), SLOT(updateColumns())); + connect(m_model, SIGNAL(columnRemoved(int)), SLOT(onColumnRemoved())); connect(m_model, SIGNAL(columnMoved(int,int)), SLOT(updateColumns())); connect(m_model, SIGNAL(columnChanged(int)), SLOT(updateColumns())); loadColors(); @@ -137,7 +137,10 @@ void PlayListHeader::readSettings() if(i < sizes.count()) m_model->setData(i, SIZE, sizes.at(i).toInt()); if(i == autoResizeColumn) + { m_model->setData(i, AUTO_RESIZE, true); + m_auto_resize = true; + } if(i == trackStateColumn) m_model->setData(i,TRACK_STATE, true); } @@ -164,7 +167,6 @@ void PlayListHeader::updateColumns() int sx = 5; - if(m_model->count() == 1) { if(m_number_width) @@ -234,17 +236,17 @@ int PlayListHeader::trackStateColumn() const return -1; } -int PlayListHeader::verticalScrollSize() const +int PlayListHeader::maxScrollValue() const { if(m_model->count() == 1) return 0; - int column_width = 0; + int row_width = 0; foreach (int size, sizes()) { - column_width += size; + row_width += size; } - return qMax(0, column_width - width() + 10); + return qMax(0, row_width - width() + 10); } int PlayListHeader::offset() const @@ -252,11 +254,14 @@ int PlayListHeader::offset() const return m_offset; } +bool PlayListHeader::hasAutoResizeColumn() const +{ + return m_auto_resize; +} + void PlayListHeader::scroll(int offset) { m_offset = offset; - qDebug("scroll = %d", offset); - //updateColumns(); update(); } @@ -322,50 +327,55 @@ void PlayListHeader::removeColumn() m_model->remove(m_pressed_column); } -void PlayListHeader::setAutoResize(bool yes) +void PlayListHeader::setAutoResize(bool on) { if(m_pressed_column < 0) return; - if(yes) + m_auto_resize = on; + + if(on) { for(int i = 0; i < m_model->count(); ++i) m_model->setData(i, AUTO_RESIZE, false); } - m_model->setData(m_pressed_column, AUTO_RESIZE, yes); + m_model->setData(m_pressed_column, AUTO_RESIZE, on); + + if(on) + { + adjustColumn(m_pressed_column); + updateColumns(); + } + PlayListManager::instance()->selectedPlayList()->updateMetaData(); } -void PlayListHeader::showTrackState(bool yes) +void PlayListHeader::showTrackState(bool on) { if(m_pressed_column < 0) return; - if(yes) + if(on) { for(int i = 0; i < m_model->count(); ++i) m_model->setData(i, TRACK_STATE, false); } - m_model->setData(m_pressed_column, TRACK_STATE, yes); + m_model->setData(m_pressed_column, TRACK_STATE, on); PlayListManager::instance()->selectedPlayList()->updateMetaData(); } -void PlayListHeader::restoreSize() +void PlayListHeader::onColumnAdded(int index) { - if(m_pressed_column < 0) - return; - - m_model->setData(m_pressed_column, SIZE, INITAL_SIZE); - adjustColumns(); + m_model->setData(index, SIZE, INITAL_SIZE); + adjustColumn(autoResizeColumn()); updateColumns(); - PlayListManager::instance()->selectedPlayList()->updateMetaData(); } -void PlayListHeader::onColumnAdded(int index) +void PlayListHeader::onColumnRemoved() { - m_model->setData(index, SIZE, INITAL_SIZE); - adjustColumns(); + adjustColumn(autoResizeColumn()); + m_auto_resize = autoResizeColumn() >= 0; updateColumns(); } @@ -380,30 +390,32 @@ void PlayListHeader::mousePressEvent(QMouseEvent *e) { m_pressed_pos = e->pos(); m_mouse_pos = e->pos(); + m_pressed_pos.rx() += m_offset; + m_mouse_pos.rx() += m_offset; if(rtl) { - if(e->pos().x() < m_model->data(m_pressed_column, RECT).toRect().x() + m_metrics->width("9")) + if(m_pressed_pos.x() < m_model->data(m_pressed_column, RECT).toRect().x() + m_metrics->width("9")) { m_old_size = size(m_pressed_column); m_task = RESIZE; } else { - m_press_offset = e->pos().x() - m_model->data(m_pressed_column, RECT).toRect().x(); + m_press_offset = m_pressed_pos.x() - m_model->data(m_pressed_column, RECT).toRect().x(); m_task = SORT; } } else { - if(e->pos().x() > m_model->data(m_pressed_column, RECT).toRect().right() - m_metrics->width("9")) + if(m_pressed_pos.x() > m_model->data(m_pressed_column, RECT).toRect().right() - m_metrics->width("9")) { m_old_size = size(m_pressed_column); m_task = RESIZE; } else { - m_press_offset = e->pos().x() - m_model->data(m_pressed_column, RECT).toRect().x(); + m_press_offset = m_pressed_pos.x() - m_model->data(m_pressed_column, RECT).toRect().x(); m_task = SORT; } } @@ -434,21 +446,37 @@ void PlayListHeader::mouseMoveEvent(QMouseEvent *e) m_task = MOVE; } + int x = e->pos().x() + m_offset; + if(m_task == RESIZE && m_model->count() > 1) { - if(rtl) - setSize(m_pressed_column, m_old_size - e->pos().x() + m_pressed_pos.x()); - else - setSize(m_pressed_column, m_old_size + e->pos().x() - m_pressed_pos.x()); - setSize(m_pressed_column, qMax(size(m_pressed_column), MIN_SIZE)); + int index = autoResizeColumn(); - adjustColumns(); + if(index == -1 || m_pressed_column < m_model->count() - 1) + { + if(rtl) + setSize(m_pressed_column, m_old_size - x + m_pressed_pos.x()); + else + setSize(m_pressed_column, m_old_size + x - m_pressed_pos.x()); + setSize(m_pressed_column, qMax(size(m_pressed_column), MIN_SIZE)); + } + + if(m_pressed_column < index) + { + adjustColumn(index); + } + else if(index != -1 && m_pressed_column < m_model->count() - 1) + { + adjustColumn(m_pressed_column + 1); + } + m_offset = qMin(m_offset, maxScrollValue()); updateColumns(); PlayListManager::instance()->selectedPlayList()->updateMetaData(); } else if(m_task == MOVE) { m_mouse_pos = e->pos(); + m_mouse_pos.rx() += m_offset; int dest = -1; for(int i = 0; i < m_model->count(); ++i) @@ -491,19 +519,26 @@ void PlayListHeader::mouseMoveEvent(QMouseEvent *e) { int column = findColumn(e->pos()); - if(rtl) + if(!m_auto_resize || column < m_model->count() - 1) { - if(column >= 0 && e->pos().x() < m_model->data(column, RECT).toRect().x() + m_metrics->width("9")) - setCursor(Qt::SplitHCursor); + if(rtl) + { + if(column >= 0 && x < m_model->data(column, RECT).toRect().x() + m_metrics->width("9")) + setCursor(Qt::SplitHCursor); + else + setCursor(Qt::ArrowCursor); + } else - setCursor(Qt::ArrowCursor); + { + if(column >= 0 && x > m_model->data(column, RECT).toRect().right() - m_metrics->width("9")) + setCursor(Qt::SplitHCursor); + else + setCursor(Qt::ArrowCursor); + } } else { - if(column >= 0 && e->pos().x() > m_model->data(column, RECT).toRect().right() - m_metrics->width("9")) - setCursor(Qt::SplitHCursor); - else - setCursor(Qt::ArrowCursor); + setCursor(Qt::ArrowCursor); } } } @@ -516,27 +551,19 @@ void PlayListHeader::resizeEvent(QResizeEvent *e) return; } - int delta = e->size().width() - e->oldSize().width(); - int index = -1; - for(int i = 0; i < m_model->count(); ++i) - { - if(m_model->data(i, AUTO_RESIZE).toBool()) - { - index = i; - break; - } - } + int index = autoResizeColumn(); if(index >= 0 && e->oldSize().width() > 10) { - setSize(index, qMax(MIN_SIZE, size(index) + delta)); - adjustColumns(); + adjustColumn(index); + m_offset = qMin(m_offset, maxScrollValue()); updateColumns(); return; } - if(adjustColumns()) + if(m_offset > maxScrollValue()) { + m_offset = maxScrollValue(); updateColumns(); return; } @@ -584,18 +611,16 @@ void PlayListHeader::contextMenuEvent(QContextMenuEvent *e) void PlayListHeader::paintEvent(QPaintEvent *) { + bool rtl = (layoutDirection() == Qt::RightToLeft); QPainter painter(this); painter.setBrush(m_normal); painter.setPen(m_normal); painter.setFont(m_font); painter.drawRect(5, -1, width() - 10, height() + 1); - painter.translate(-m_offset, 0); - + painter.translate(rtl ? m_offset : -m_offset, 0); painter.setPen(m_normal_bg); - bool rtl = (layoutDirection() == Qt::RightToLeft); - QRect rect = m_model->data(0, RECT).toRect(); if(rtl) @@ -693,7 +718,8 @@ void PlayListHeader::paintEvent(QPaintEvent *) painter.drawText(rect.x() + m_padding, m_metrics->ascent(), name(i)); - painter.drawLine(rect.right()+1, 0, rect.right() + 1, height() + 1); + if(!m_auto_resize || i != m_model->count() - 1) + painter.drawLine(rect.right()+1, 0, rect.right() + 1, height() + 1); if(i == m_sorting_column) { @@ -732,8 +758,36 @@ void PlayListHeader::loadColors() m_arrow_down.setMask(px2.createMaskFromColor(Qt::transparent)); } +void PlayListHeader::adjustColumn(int index) +{ + int w = 0; + + for(int i = 0; i < m_model->count(); ++i) + { + if(i != index) + w += size(i); + } + + setSize(index, qMax(width() - 10 - w, MIN_SIZE)); +} + +int PlayListHeader::autoResizeColumn() const +{ + int index = -1; + for(int i = 0; i < m_model->count(); ++i) + { + if(m_model->data(i, AUTO_RESIZE).toBool()) + { + index = i; + break; + } + } + return index; +} + int PlayListHeader::findColumn(QPoint pos) { + pos.rx() += m_offset; for(int i = 0; i < m_model->count(); ++i) { if(m_model->data(i,RECT).toRect().contains(pos)) @@ -757,30 +811,6 @@ const QString PlayListHeader::name(int index) const return m_model->data(index, NAME).toString(); } -bool PlayListHeader::adjustColumns() -{ - /*int total_size = 0; - foreach (int s, sizes()) - { - total_size += s; - } - - if(total_size > width() - 10) - { - int delta = total_size - width() + 10; - for(int i = m_model->count() - 1; i >= 0 && delta > 0; i--) - { - int dx = size(i) - qMax(MIN_SIZE, size(i) - delta); - setSize(i, qMax(MIN_SIZE, size(i) - delta)); - delta -= dx; - } - updateColumns(); - return true; - }*/ - - return false; -} - void PlayListHeader::writeSettings() { QSettings settings(Qmmp::configFile(), QSettings::IniFormat); |
