diff options
| -rw-r--r-- | src/plugins/Ui/skinned/horizontalslider.cpp | 104 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/horizontalslider.h | 22 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/listwidget.cpp | 35 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/listwidgetdrawer.cpp | 22 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/listwidgetdrawer.h | 2 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/playlistheader.cpp | 200 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/playlistheader.h | 15 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/playlistslider.cpp | 15 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/playlistslider.h | 10 |
9 files changed, 227 insertions, 198 deletions
diff --git a/src/plugins/Ui/skinned/horizontalslider.cpp b/src/plugins/Ui/skinned/horizontalslider.cpp index 87fc5a938..8545fe14e 100644 --- a/src/plugins/Ui/skinned/horizontalslider.cpp +++ b/src/plugins/Ui/skinned/horizontalslider.cpp @@ -24,18 +24,16 @@ #include "horizontalslider.h" #include "pixmapwidget.h" +#define MIN_SLIDER_SIZE 18 + HorizontalSlider::HorizontalSlider(QWidget *parent) : QWidget(parent) { m_skin = Skin::instance(); - m_moving = false; - m_pressed = false; m_min = 0; m_max = 100; m_value = 0; - pos = 0; connect(m_skin, SIGNAL(skinChanged()), this, SLOT(updateSkin())); - //setCursor(m_skin->getCursor(Skin::CUR_)); updateSkin(); } @@ -44,89 +42,59 @@ HorizontalSlider::~HorizontalSlider() void HorizontalSlider::paintEvent(QPaintEvent *) { - //int sy = (height()-58)/29; - int p = int(ceil(double(m_value - m_min)*(width() - 18*m_skin->ratio())/(m_max - m_min))); + if(m_max <= m_min) + return; + + bool rtl = (layoutDirection() == Qt::RightToLeft); + int p = ceil((m_value - m_min)*(width() - sliderSize())/(m_max - m_min)); + if(rtl) + p = width() - p - sliderSize(); + QPainter paint(this); paint.fillRect(0, 0, width(), height(), m_normal_bg); paint.setPen(m_normal); paint.drawRect(0, 0, width() - 1, height() - 1); - paint.fillRect(p, 0, 18, height() - 1, m_normal); - - - - - /*paint.drawPixmap(0,0,m_skin->getPlPart(Skin::PL_RFILL)); - paint.drawPixmap(0,29,m_skin->getPlPart(Skin::PL_RFILL)); + paint.fillRect(p, 0, sliderSize(), height() - 1, m_normal); - for (int i = 0; i<sy; i++) - { - paint.drawPixmap(0,58+i*29,m_skin->getPlPart(Skin::PL_RFILL)); - } - if (m_pressed) - paint.drawPixmap(5*m_skin->ratio(),p,m_skin->getButton(Skin::PL_BT_SCROLL_P)); - else - paint.drawPixmap(5*m_skin->ratio(),p,m_skin->getButton(Skin::PL_BT_SCROLL_N));*/ - m_pos = p; + m_slider_pos = p; } void HorizontalSlider::mousePressEvent(QMouseEvent *e) { - m_moving = true; - m_pressed = true; - press_pos = e->x(); - if (m_pos < e->x() && e->x() < m_pos + 18 * m_skin->ratio()) + m_press_pos = e->x(); + if (m_slider_pos < e->x() && e->x() < m_slider_pos + sliderSize()) { - press_pos = e->x() - m_pos; - } - else - { - m_value = convert(qMax(qMin(width()-18*m_skin->ratio(),e->x()-9*m_skin->ratio()),0)); - press_pos = 9*m_skin->ratio(); - if (m_value!=m_old) - { - emit sliderMoved(m_value); - m_old = m_value; - qDebug ("%d",m_value); - } + m_press_pos = e->x() - m_slider_pos; } update(); } -void HorizontalSlider::mouseReleaseEvent(QMouseEvent*) -{ - m_moving = false; - m_pressed = false; - update(); -} - void HorizontalSlider::mouseMoveEvent(QMouseEvent* e) { - if (m_moving) + int po = e->x() - m_press_pos; + bool rtl = (layoutDirection() == Qt::RightToLeft); + + if (0 <= po && po <= width() - sliderSize()) { - int po = e->x() - press_pos; + if(rtl) + po = width() - po - sliderSize(); - if (0 <= po && po <= width() - 18*m_skin->ratio()) + m_value = convert(po); + update(); + if (m_value != m_old_value) { - m_value = convert(po); - update(); - if (m_value != m_old) - { - m_old = m_value; - qDebug("moved = %d", m_value); - emit sliderMoved(m_value); - } + m_old_value = m_value; + emit sliderMoved(m_value); } } } -void HorizontalSlider::setPos(int p, int max) +void HorizontalSlider::setPos(int v, int max) { m_max = max; - m_value = p; - if(m_moving) - return; + m_value = v; update(); } @@ -135,11 +103,21 @@ void HorizontalSlider::updateSkin() m_normal.setNamedColor(m_skin->getPLValue("normal")); m_normal_bg.setNamedColor(m_skin->getPLValue("normalbg")); update(); - //setCursor(m_skin->getCursor(Skin::CUR_PVSCROLL)); } -int HorizontalSlider::convert(int p) +int HorizontalSlider::convert(int p) const { - return int(floor(double(m_max-m_min)*(p)/(width()-18*m_skin->ratio())+m_min)); + if(m_max > m_min) + return ceil((m_max - m_min) * p / (width() - sliderSize())) + m_min; + else + return 0; +} + +int HorizontalSlider::sliderSize() const +{ + if(m_max > m_min) + return qMax(width() - abs(m_max - m_min), MIN_SLIDER_SIZE * m_skin->ratio()); + else + return MIN_SLIDER_SIZE; } diff --git a/src/plugins/Ui/skinned/horizontalslider.h b/src/plugins/Ui/skinned/horizontalslider.h index c69bf4bbe..d403c1b3f 100644 --- a/src/plugins/Ui/skinned/horizontalslider.h +++ b/src/plugins/Ui/skinned/horizontalslider.h @@ -37,7 +37,7 @@ public: ~HorizontalSlider(); public slots: - void setPos(int pos, int max); + void setPos(int v, int max); signals: void sliderMoved (int); @@ -46,20 +46,18 @@ private slots: void updateSkin(); private: - Skin *m_skin; - PixmapWidget *m_scroll; - int m_old; - bool m_moving, m_pressed; - int press_pos; - int m_min, m_max, m_value, pos, m_pos; - int convert(int); // value = convert(position); - QColor m_normal, m_normal_bg; - -protected: void paintEvent(QPaintEvent*); void mousePressEvent(QMouseEvent*); - void mouseReleaseEvent(QMouseEvent*); void mouseMoveEvent(QMouseEvent*); + int convert(int) const; // value = convert(position); + int sliderSize() const; + + Skin *m_skin; + int m_old_value, m_value; + int m_press_pos; + int m_min, m_max, m_slider_pos; + QColor m_normal, m_normal_bg; + }; #endif diff --git a/src/plugins/Ui/skinned/listwidget.cpp b/src/plugins/Ui/skinned/listwidget.cpp index 1ec9690c6..893431fe9 100644 --- a/src/plugins/Ui/skinned/listwidget.cpp +++ b/src/plugins/Ui/skinned/listwidget.cpp @@ -97,7 +97,6 @@ void ListWidget::readSettings() if (m_update) { m_drawer.readSettings(); - //m_row_count = (height() - (m_header->isVisibleTo(this) ? m_header->height() : 0)) / m_drawer.rowHeight(); updateList(PlayListModel::STRUCTURE); if(m_popupWidget) { @@ -132,7 +131,7 @@ int ListWidget::anchorIndex() const void ListWidget::setAnchorIndex(int index) { m_anchor_index = index; - updateList(PlayListModel::CURRENT); + updateList(PlayListModel::SELECTION); } QMenu *ListWidget::menu() @@ -155,8 +154,8 @@ void ListWidget::paintEvent(QPaintEvent *) #endif bool rtl = (layoutDirection() == Qt::RightToLeft); - painter.setClipRect(5,0,width() - 10, height()); - painter.translate(-m_header->offset(), 0); + painter.setClipRect(5,0,width() - 9, height()); + painter.translate(rtl ? m_header->offset() : -m_header->offset(), 0); for (int i = 0; i < m_rows.size(); ++i ) { @@ -254,8 +253,6 @@ void ListWidget::resizeEvent(QResizeEvent *e) { m_header->setGeometry(0,0,width(), m_header->requiredHeight()); m_hslider->setGeometry(5,height() - 7, width() - 10, 7); - //m_row_count = (e->size().height() - (m_header->isVisibleTo(this) ? m_header->height() : 0)) / m_drawer.rowHeight(); - //m_row_count = qMax(m_row_count, 0); updateList(PlayListModel::STRUCTURE); QWidget::resizeEvent(e); } @@ -302,8 +299,8 @@ bool ListWidget::event (QEvent *e) void ListWidget::updateList(int flags) { - m_hslider->setVisible(m_header->verticalScrollSize() > 0); - m_hslider->setPos(0, m_header->verticalScrollSize()); + m_hslider->setVisible(m_header->maxScrollValue() > 0); + m_hslider->setPos(m_header->offset(), m_header->maxScrollValue()); if(updateRowCount()) flags |= PlayListModel::STRUCTURE; @@ -352,10 +349,13 @@ void ListWidget::updateList(int flags) } int trackStateColumn = m_header->trackStateColumn(); + int rowWidth = width() + m_header->maxScrollValue() - 10; + bool rtl = (layoutDirection() == Qt::RightToLeft); for(int i = 0; i < items.count(); ++i) { ListWidgetRow *row = m_rows[i]; + row->autoResize = m_header->hasAutoResizeColumn(); row->trackStateColumn = trackStateColumn; items[i]->isSelected() ? row->flags |= ListWidgetRow::SELECTED : row->flags &= ~ListWidgetRow::SELECTED; @@ -366,8 +366,16 @@ void ListWidget::updateList(int flags) if(flags == PlayListModel::SELECTION) continue; - row->rect = QRect(5, (m_header->isVisibleTo(this) ? m_header->height() : 0) + i * m_drawer.rowHeight(), - width() - 10, m_drawer.rowHeight() - 1); + if(rtl) + { + row->rect = QRect(width() - 5 - rowWidth, (m_header->isVisibleTo(this) ? m_header->height() : 0) + i * m_drawer.rowHeight(), + rowWidth, m_drawer.rowHeight() - 1); + } + else + { + row->rect = QRect(5, (m_header->isVisibleTo(this) ? m_header->height() : 0) + i * m_drawer.rowHeight(), + rowWidth, m_drawer.rowHeight() - 1); + } row->titles = items[i]->formattedTitles(); row->sizes = m_header->sizes(); @@ -454,8 +462,11 @@ void ListWidget::scroll(int sc) { if (m_model->count() <= m_row_count) return; - m_first = sc; //*(m_model->count() - m_rows)/99; - updateList(PlayListModel::STRUCTURE); + if(m_first != sc) + { + m_first = sc; + updateList(PlayListModel::STRUCTURE); + } } void ListWidget::updateSkin() diff --git a/src/plugins/Ui/skinned/listwidgetdrawer.cpp b/src/plugins/Ui/skinned/listwidgetdrawer.cpp index 2a4aa0cc8..b03e3edf7 100644 --- a/src/plugins/Ui/skinned/listwidgetdrawer.cpp +++ b/src/plugins/Ui/skinned/listwidgetdrawer.cpp @@ -199,24 +199,26 @@ void ListWidgetDrawer::drawBackground(QPainter *painter, ListWidgetRow *row) void ListWidgetDrawer::drawSeparator(QPainter *painter, ListWidgetRow *row, bool rtl) { - int sx = row->rect.x() + 50; + int sx = 50 + row->numberColumnWidth; // row->rect.x() + 50; int sy = row->rect.y() + m_metrics->overlinePos() - 1; painter->setFont(m_font); painter->setPen(m_normal); - if(row->numberColumnWidth) - sx += row->numberColumnWidth; + /*if(row->numberColumnWidth) + sx += row->numberColumnWidth;*/ if(rtl) sx = row->rect.right() - sx - m_metrics->width(row->titles[0]); + else + sx += row->rect.x(); painter->drawText(sx, sy, row->titles[0]); - sy = sy - m_metrics->lineSpacing()/2 + 2; + sy -= (m_metrics->lineSpacing()/2 - 2); if(rtl) { - painter->drawLine(10, sy, sx - 5, sy); + painter->drawLine(row->rect.x() + 5, sy, sx - 5, sy); painter->drawLine(sx + m_metrics->width(row->titles[0]) + 5, sy, row->rect.right() - row->numberColumnWidth - m_padding, sy); if(row->numberColumnWidth) @@ -295,7 +297,10 @@ void ListWidgetDrawer::drawTrack(QPainter *painter, ListWidgetRow *row, bool rtl } painter->setPen(m_normal); - painter->drawLine(sx, row->rect.top(), sx, row->rect.bottom() + 1); + if(!row->autoResize || i < row->sizes.count() - 1) //do not draw last vertical line + { + painter->drawLine(sx, row->rect.top(), sx, row->rect.bottom() + 1); + } } } } @@ -350,7 +355,10 @@ void ListWidgetDrawer::drawTrack(QPainter *painter, ListWidgetRow *row, bool rtl } painter->setPen(m_normal); - painter->drawLine(sx, row->rect.top(), sx, row->rect.bottom() + 1); + if(!row->autoResize || i < row->sizes.count() - 1) //do not draw last vertical line + { + painter->drawLine(sx, row->rect.top(), sx, row->rect.bottom() + 1); + } } } } diff --git a/src/plugins/Ui/skinned/listwidgetdrawer.h b/src/plugins/Ui/skinned/listwidgetdrawer.h index c2081e44d..228b97513 100644 --- a/src/plugins/Ui/skinned/listwidgetdrawer.h +++ b/src/plugins/Ui/skinned/listwidgetdrawer.h @@ -41,6 +41,7 @@ struct ListWidgetRow lengthColumnWidth = 0; trackStateColumn = -1; number = -1; + autoResize = false; } QStringList titles; QList<int> sizes; @@ -61,6 +62,7 @@ struct ListWidgetRow int flags; QRect rect; //geometry + bool autoResize; }; /** 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); diff --git a/src/plugins/Ui/skinned/playlistheader.h b/src/plugins/Ui/skinned/playlistheader.h index 44621c703..5398e2528 100644 --- a/src/plugins/Ui/skinned/playlistheader.h +++ b/src/plugins/Ui/skinned/playlistheader.h @@ -49,8 +49,10 @@ public: int requiredHeight() const; QList<int> sizes() const; int trackStateColumn() const; - int verticalScrollSize() const; + int maxScrollValue() const; + int totalColumnWidth() const; int offset() const; + bool hasAutoResizeColumn() const; public slots: void scroll(int offset); @@ -63,10 +65,10 @@ private slots: void addColumn(); void editColumn(); void removeColumn(); - void setAutoResize(bool yes); - void showTrackState(bool yes); - void restoreSize(); + void setAutoResize(bool on); + void showTrackState(bool on); void onColumnAdded(int index); + void onColumnRemoved(); private: void mousePressEvent(QMouseEvent *e); @@ -76,11 +78,12 @@ private: void contextMenuEvent(QContextMenuEvent *e); void paintEvent(QPaintEvent *); void loadColors(); + void adjustColumn(int index); + int autoResizeColumn() const; int findColumn(QPoint pos); int size(int index) const; void setSize(int index, int size); const QString name(int index) const; - bool adjustColumns(); void writeSettings(); @@ -105,6 +108,7 @@ private: QAction *m_autoResizeAction; QPixmap m_arrow_up, m_arrow_down; bool m_reverted; + bool m_auto_resize; int m_number_width; int m_pressed_column; int m_old_size; @@ -114,6 +118,7 @@ private: int m_sorting_column; int m_offset; + enum { NO_TASK = -1, diff --git a/src/plugins/Ui/skinned/playlistslider.cpp b/src/plugins/Ui/skinned/playlistslider.cpp index 57fd21f17..72644e8d4 100644 --- a/src/plugins/Ui/skinned/playlistslider.cpp +++ b/src/plugins/Ui/skinned/playlistslider.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2009 by Ilya Kotov * + * Copyright (C) 2006-2015 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -34,7 +34,6 @@ PlayListSlider::PlayListSlider(QWidget *parent) m_min = 0; m_max = 0; m_value = 0; - pos = 0; connect(m_skin, SIGNAL(skinChanged()), this, SLOT(updateSkin())); setCursor(m_skin->getCursor(Skin::CUR_PVSCROLL)); } @@ -66,15 +65,15 @@ void PlayListSlider::mousePressEvent(QMouseEvent *e) { m_moving = true; m_pressed = true; - press_pos = e->y(); + m_press_pos = e->y(); if (m_pos<e->y() && e->y()<m_pos+18*m_skin->ratio()) { - press_pos = e->y()-m_pos; + m_press_pos = e->y()-m_pos; } else { m_value = convert(qMax(qMin(height()-18*m_skin->ratio(),e->y()-9*m_skin->ratio()),0)); - press_pos = 9*m_skin->ratio(); + m_press_pos = 9*m_skin->ratio(); if (m_value!=m_old) { emit sliderMoved(m_value); @@ -97,13 +96,13 @@ void PlayListSlider::mouseMoveEvent(QMouseEvent* e) if (m_moving) { int po = e->y(); - po = po - press_pos; + po = po - m_press_pos; - if (0<=po && po<=height()-18*m_skin->ratio()) + if (0 <= po && po <= height() - 18*m_skin->ratio()) { m_value = convert(po); update(); - if (m_value!=m_old) + if (m_value != m_old) { m_old = m_value; diff --git a/src/plugins/Ui/skinned/playlistslider.h b/src/plugins/Ui/skinned/playlistslider.h index 2b7386242..782aad7f2 100644 --- a/src/plugins/Ui/skinned/playlistslider.h +++ b/src/plugins/Ui/skinned/playlistslider.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2009 by Ilya Kotov * + * Copyright (C) 2006-2015 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -23,9 +23,8 @@ #include <QWidget> class Skin; -class PixmapWidget; /** - @author Ilya Kotov <forkotov02@hotmail.ru> + @author Ilya Kotov <forkotov02@hotmail.ru> */ class PlayListSlider : public QWidget { @@ -46,11 +45,10 @@ private slots: private: Skin *m_skin; - PixmapWidget *m_scroll; int m_old; bool m_moving, m_pressed; - int press_pos; - int m_min, m_max, m_value, pos, m_pos; + int m_press_pos; + int m_min, m_max, m_value, m_pos; int convert(int); // value = convert(position); protected: |
