aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/Ui/skinned/horizontalslider.cpp104
-rw-r--r--src/plugins/Ui/skinned/horizontalslider.h22
-rw-r--r--src/plugins/Ui/skinned/listwidget.cpp35
-rw-r--r--src/plugins/Ui/skinned/listwidgetdrawer.cpp22
-rw-r--r--src/plugins/Ui/skinned/listwidgetdrawer.h2
-rw-r--r--src/plugins/Ui/skinned/playlistheader.cpp200
-rw-r--r--src/plugins/Ui/skinned/playlistheader.h15
-rw-r--r--src/plugins/Ui/skinned/playlistslider.cpp15
-rw-r--r--src/plugins/Ui/skinned/playlistslider.h10
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: