aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2015-07-14 10:42:00 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2015-07-14 10:42:00 +0000
commitbe221a1c4f9f8e8c11fc23a34995f1c781552bd9 (patch)
treed11f2b09e7d5162b165107e236389ef88e13fe58
parent16cf50b06b0e696d1737a7af5551bb03bea20368 (diff)
downloadqmmp-be221a1c4f9f8e8c11fc23a34995f1c781552bd9.tar.gz
qmmp-be221a1c4f9f8e8c11fc23a34995f1c781552bd9.tar.bz2
qmmp-be221a1c4f9f8e8c11fc23a34995f1c781552bd9.zip
skinned: added horizontal scroller
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@5249 90c681e8-e032-0410-971d-27865f9a5e38
-rw-r--r--src/plugins/Ui/skinned/horizontalslider.cpp145
-rw-r--r--src/plugins/Ui/skinned/horizontalslider.h65
-rw-r--r--src/plugins/Ui/skinned/listwidget.cpp37
-rw-r--r--src/plugins/Ui/skinned/listwidget.h4
-rw-r--r--src/plugins/Ui/skinned/playlistheader.cpp32
-rw-r--r--src/plugins/Ui/skinned/playlistheader.h4
-rw-r--r--src/plugins/Ui/skinned/skinned.pro6
7 files changed, 285 insertions, 8 deletions
diff --git a/src/plugins/Ui/skinned/horizontalslider.cpp b/src/plugins/Ui/skinned/horizontalslider.cpp
new file mode 100644
index 000000000..87fc5a938
--- /dev/null
+++ b/src/plugins/Ui/skinned/horizontalslider.cpp
@@ -0,0 +1,145 @@
+/***************************************************************************
+ * Copyright (C) 2015 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., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#include <QPainter>
+#include <QResizeEvent>
+#include <math.h>
+#include "skin.h"
+#include "horizontalslider.h"
+#include "pixmapwidget.h"
+
+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();
+}
+
+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)));
+ 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));
+
+ 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;
+}
+
+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())
+ {
+ 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);
+ }
+ }
+ update();
+}
+
+void HorizontalSlider::mouseReleaseEvent(QMouseEvent*)
+{
+ m_moving = false;
+ m_pressed = false;
+ update();
+}
+
+void HorizontalSlider::mouseMoveEvent(QMouseEvent* e)
+{
+ if (m_moving)
+ {
+ int po = e->x() - press_pos;
+
+ if (0 <= po && po <= width() - 18*m_skin->ratio())
+ {
+ m_value = convert(po);
+ update();
+ if (m_value != m_old)
+ {
+ m_old = m_value;
+ qDebug("moved = %d", m_value);
+ emit sliderMoved(m_value);
+ }
+ }
+ }
+}
+
+void HorizontalSlider::setPos(int p, int max)
+{
+ m_max = max;
+ m_value = p;
+ if(m_moving)
+ return;
+ update();
+}
+
+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)
+{
+ return int(floor(double(m_max-m_min)*(p)/(width()-18*m_skin->ratio())+m_min));
+}
+
diff --git a/src/plugins/Ui/skinned/horizontalslider.h b/src/plugins/Ui/skinned/horizontalslider.h
new file mode 100644
index 000000000..c69bf4bbe
--- /dev/null
+++ b/src/plugins/Ui/skinned/horizontalslider.h
@@ -0,0 +1,65 @@
+/***************************************************************************
+ * Copyright (C) 2015 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., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#ifndef HORIZONTALSLIDER_H
+#define HORIZONTALSLIDER_H
+
+#include <QWidget>
+#include <QColor>
+
+class Skin;
+class PixmapWidget;
+/**
+ @author Ilya Kotov <forkotov02@hotmail.ru>
+*/
+class HorizontalSlider : public QWidget
+{
+Q_OBJECT
+public:
+ HorizontalSlider(QWidget *parent = 0);
+
+ ~HorizontalSlider();
+
+public slots:
+ void setPos(int pos, int max);
+
+signals:
+ void sliderMoved (int);
+
+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*);
+};
+
+#endif
diff --git a/src/plugins/Ui/skinned/listwidget.cpp b/src/plugins/Ui/skinned/listwidget.cpp
index 976649fa6..1ec9690c6 100644
--- a/src/plugins/Ui/skinned/listwidget.cpp
+++ b/src/plugins/Ui/skinned/listwidget.cpp
@@ -37,6 +37,7 @@
#include "actionmanager.h"
#include "skin.h"
#include "popupwidget.h"
+#include "horizontalslider.h"
#include "playlist.h"
#define INVALID_INDEX -1
@@ -53,6 +54,7 @@ ListWidget::ListWidget(QWidget *parent)
m_timer->setInterval(50);
m_header = new PlayListHeader(this);
+ m_hslider = new HorizontalSlider(this);
m_update = false;
m_drop_index = INVALID_INDEX;
m_scroll_direction = NONE;
@@ -70,6 +72,8 @@ ListWidget::ListWidget(QWidget *parent)
connect(m_skin, SIGNAL(skinChanged()), SLOT(updateSkin()));
connect(m_ui_settings, SIGNAL(repeatableTrackChanged(bool)), SLOT(updateRepeatIndicator()));
connect(m_timer, SIGNAL(timeout()), SLOT(autoscroll()));
+ connect(m_hslider, SIGNAL(sliderMoved(int)), m_header, SLOT(scroll(int)));
+ connect(m_hslider, SIGNAL(sliderMoved(int)), this, SLOT(update()));
SET_ACTION(ActionManager::PL_SHOW_HEADER, this, SLOT(readSettings()));
}
@@ -93,7 +97,7 @@ void ListWidget::readSettings()
if (m_update)
{
m_drawer.readSettings();
- m_row_count = (height() - (m_header->isVisibleTo(this) ? m_header->height() : 0)) / m_drawer.rowHeight();
+ //m_row_count = (height() - (m_header->isVisibleTo(this) ? m_header->height() : 0)) / m_drawer.rowHeight();
updateList(PlayListModel::STRUCTURE);
if(m_popupWidget)
{
@@ -151,6 +155,9 @@ void ListWidget::paintEvent(QPaintEvent *)
#endif
bool rtl = (layoutDirection() == Qt::RightToLeft);
+ painter.setClipRect(5,0,width() - 10, height());
+ painter.translate(-m_header->offset(), 0);
+
for (int i = 0; i < m_rows.size(); ++i )
{
m_drawer.drawBackground(&painter, m_rows[i]);
@@ -246,8 +253,9 @@ void ListWidget::mousePressEvent(QMouseEvent *e)
void ListWidget::resizeEvent(QResizeEvent *e)
{
m_header->setGeometry(0,0,width(), m_header->requiredHeight());
- 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);
+ 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);
}
@@ -294,6 +302,12 @@ bool ListWidget::event (QEvent *e)
void ListWidget::updateList(int flags)
{
+ m_hslider->setVisible(m_header->verticalScrollSize() > 0);
+ m_hslider->setPos(0, m_header->verticalScrollSize());
+
+ if(updateRowCount())
+ flags |= PlayListModel::STRUCTURE;
+
if(flags & PlayListModel::CURRENT)
recenterCurrent();
@@ -456,7 +470,6 @@ void ListWidget::dragEnterEvent(QDragEnterEvent *event)
event->acceptProposedAction();
}
-
void ListWidget::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasUrls())
@@ -518,6 +531,22 @@ const QString ListWidget::getExtraString(int i)
return extra_string.trimmed(); //remove white space
}
+bool ListWidget::updateRowCount()
+{
+ int h = height();
+ if(m_header->isVisibleTo(this))
+ h -= m_header->requiredHeight();
+ if(m_hslider->isVisibleTo(this))
+ h -= m_hslider->height();
+ int row_count = qMax(0, h / m_drawer.rowHeight());
+ if(m_row_count != row_count)
+ {
+ m_row_count = row_count;
+ return true;
+ }
+ return false;
+}
+
void ListWidget::mouseMoveEvent(QMouseEvent *e)
{
if(e->buttons() == Qt::LeftButton)
diff --git a/src/plugins/Ui/skinned/listwidget.h b/src/plugins/Ui/skinned/listwidget.h
index 395b658c5..0206ef8b1 100644
--- a/src/plugins/Ui/skinned/listwidget.h
+++ b/src/plugins/Ui/skinned/listwidget.h
@@ -36,6 +36,7 @@ class Skin;
class PlayListItem;
class QmmpUiSettings;
class PlayListHeader;
+class HorizontalSlider;
namespace PlayListPopup{
class PopupWidget;
}
@@ -108,6 +109,8 @@ private:
*/
const QString getExtraString(int i);
+ bool updateRowCount();
+
bool m_update;
int m_pressed_index;
QMenu *m_menu;
@@ -129,6 +132,7 @@ private:
QTimer *m_timer;
ListWidgetDrawer m_drawer;
PlayListHeader *m_header;
+ HorizontalSlider *m_hslider;
};
#endif
diff --git a/src/plugins/Ui/skinned/playlistheader.cpp b/src/plugins/Ui/skinned/playlistheader.cpp
index d7427e2b8..4839ac49d 100644
--- a/src/plugins/Ui/skinned/playlistheader.cpp
+++ b/src/plugins/Ui/skinned/playlistheader.cpp
@@ -71,6 +71,7 @@ PlayListHeader::PlayListHeader(QWidget *parent) :
m_padding = 0;
m_pl_padding = 0;
m_number_width = 0;
+ m_offset = 0;
m_sorting_column = -1;
m_reverted = false;
m_task = NO_TASK;
@@ -233,6 +234,32 @@ int PlayListHeader::trackStateColumn() const
return -1;
}
+int PlayListHeader::verticalScrollSize() const
+{
+ if(m_model->count() == 1)
+ return 0;
+
+ int column_width = 0;
+ foreach (int size, sizes())
+ {
+ column_width += size;
+ }
+ return qMax(0, column_width - width() + 10);
+}
+
+int PlayListHeader::offset() const
+{
+ return m_offset;
+}
+
+void PlayListHeader::scroll(int offset)
+{
+ m_offset = offset;
+ qDebug("scroll = %d", offset);
+ //updateColumns();
+ update();
+}
+
void PlayListHeader::showSortIndicator(int column, bool reverted)
{
if(m_sorting_column == column && m_reverted == reverted)
@@ -563,6 +590,7 @@ void PlayListHeader::paintEvent(QPaintEvent *)
painter.setPen(m_normal);
painter.setFont(m_font);
painter.drawRect(5, -1, width() - 10, height() + 1);
+ painter.translate(-m_offset, 0);
painter.setPen(m_normal_bg);
@@ -731,7 +759,7 @@ const QString PlayListHeader::name(int index) const
bool PlayListHeader::adjustColumns()
{
- int total_size = 0;
+ /*int total_size = 0;
foreach (int s, sizes())
{
total_size += s;
@@ -748,7 +776,7 @@ bool PlayListHeader::adjustColumns()
}
updateColumns();
return true;
- }
+ }*/
return false;
}
diff --git a/src/plugins/Ui/skinned/playlistheader.h b/src/plugins/Ui/skinned/playlistheader.h
index 1e6138b11..44621c703 100644
--- a/src/plugins/Ui/skinned/playlistheader.h
+++ b/src/plugins/Ui/skinned/playlistheader.h
@@ -49,8 +49,11 @@ public:
int requiredHeight() const;
QList<int> sizes() const;
int trackStateColumn() const;
+ int verticalScrollSize() const;
+ int offset() const;
public slots:
+ void scroll(int offset);
void updateColumns();
void showSortIndicator(int column, bool reverted);
void hideSortIndicator();
@@ -109,6 +112,7 @@ private:
int m_padding;
int m_pl_padding;
int m_sorting_column;
+ int m_offset;
enum
{
diff --git a/src/plugins/Ui/skinned/skinned.pro b/src/plugins/Ui/skinned/skinned.pro
index d486d7e9b..80f271ca8 100644
--- a/src/plugins/Ui/skinned/skinned.pro
+++ b/src/plugins/Ui/skinned/skinned.pro
@@ -56,7 +56,8 @@ HEADERS += mainwindow.h \
skinnedsettings.h \
hotkeyeditor.h \
listwidgetdrawer.h \
- playlistheader.h
+ playlistheader.h \
+ horizontalslider.h
SOURCES += mainwindow.cpp \
button.cpp \
display.cpp \
@@ -106,7 +107,8 @@ SOURCES += mainwindow.cpp \
skinnedsettings.cpp \
hotkeyeditor.cpp \
listwidgetdrawer.cpp \
- playlistheader.cpp
+ playlistheader.cpp \
+ horizontalslider.cpp
TEMPLATE = lib
unix:QMAKE_LIBDIR += ../../../../lib