TTKMusicPlayer  4.1.3.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicfunctiontoolboxwidget.cpp
Go to the documentation of this file.
2 #include "musicwidgetutils.h"
3 #include "ttkdesktopwrapper.h"
4 
5 #include <QDrag>
6 #include <QMimeData>
7 #include <QScrollArea>
8 #include <QMouseEvent>
9 
10 static constexpr const char *DRAG_FORMAT = "Swap Item";
11 
12 MusicFunctionToolBoxTopWidget::MusicFunctionToolBoxTopWidget(int index, const QString &text, QWidget *parent)
13  : QWidget(parent),
14  m_index(index),
15  m_isDrawTopState(false),
16  m_isDrawMoveState(false),
17  m_isBlockMoveExpand(false),
18  m_isActive(false)
19 {
20  setFixedHeight(40);
21  setAcceptDrops(true);
22 
23  QHBoxLayout *topLayout = new QHBoxLayout(this);
24  topLayout->setContentsMargins(3, 0, 0, 0);
25  topLayout->setSpacing(0);
26 
27  m_labelIcon = new QLabel(this);
28  m_labelIcon->setPixmap(QPixmap(":/tiny/lb_arrow_up_normal"));
29 
30  m_labelText = new QLabel(this);
31  m_labelText->setStyleSheet(TTK::UI::ColorStyle02);
32  m_labelText->setText(text);
34 
35  topLayout->addWidget(m_labelIcon);
36  topLayout->addWidget(m_labelText);
37  topLayout->addStretch(1);
38 
39  setLayout(topLayout);
40 }
41 
43 {
44  delete m_labelIcon;
45  delete m_labelText;
46 }
47 
49 {
50  m_isActive = geometry().contains(mapFromGlobal(QCursor::pos()));
51  update();
52  return m_isActive;
53 }
54 
56 {
57  m_labelIcon->setPixmap(QPixmap(expand ? ":/tiny/lb_arrow_down_normal" : ":/tiny/lb_arrow_up_normal"));
58 }
59 
61 {
62  const QPixmap &pixmap = QtLablePixmap(m_labelIcon);
63  return pixmap.cacheKey() == QPixmap(":/tiny/lb_arrow_down_normal").cacheKey();
64 }
65 
66 void MusicFunctionToolBoxTopWidget::setTitle(const QString &text)
67 {
68  m_labelText->setToolTip(text);
69  const int index = text.lastIndexOf("[");
70 
71  if(index == -1)
72  {
73  m_labelText->setText(TTK::Widget::elidedText(m_labelText->font(), text, Qt::ElideRight, RENAME_WIDTH - 10));
74  }
75  else
76  {
78  }
79 }
80 
82 {
83  QString text = m_labelText->toolTip().trimmed();
84  if(!suffix)
85  {
86  const int index = text.lastIndexOf("[");
87  text = text.left(index);
88  }
89  return text;
90 }
91 
93 {
94  return false;
95 }
96 
98 {
99  if(event->mimeData()->hasFormat(DRAG_FORMAT))
100  {
101  event->setDropAction(Qt::MoveAction);
102  event->accept();
103  }
104  else
105  {
106  event->ignore();
107  }
108 }
109 
111 {
112  if(event->mimeData()->hasFormat(DRAG_FORMAT) && isItemEnabled())
113  {
114  m_isDrawMoveState = true;
115  m_isDrawTopState = event->pos().y() < height() / 2;
116  update();
117  }
118 }
119 
121 {
122  Q_UNUSED(event);
123  m_isDrawTopState = false;
124  m_isDrawMoveState = false;
125  update();
126 }
127 
129 {
130  m_isDrawMoveState = false;
131  update();
132 
133  if(event->mimeData()->hasFormat(DRAG_FORMAT) && isItemEnabled())
134  {
135  Q_EMIT swapDragItemIndex(event->mimeData()->data(DRAG_FORMAT).toInt(), m_index);
136  }
137 }
138 
140 {
141  QWidget::mousePressEvent(event);
142  if(event->button() == Qt::LeftButton)
143  {
144  Q_EMIT itemIndexChanged(m_index);
145  m_mousePressedAt = event->pos();
146  }
147 }
148 
150 {
151  QWidget::mouseMoveEvent(event);
152  QRect itemRect(m_mousePressedAt.x() - 2, m_mousePressedAt.y() - 2, m_mousePressedAt.x() + 2, m_mousePressedAt.y() + 2);
153  if(!itemRect.contains(event->pos()) && isItemEnabled())
154  {
155  if(!m_isBlockMoveExpand && isExpand())
156  {
157  Q_EMIT itemIndexChanged(m_index);
158  }
159 
160  QMimeData *mimeData = new QMimeData;
161  mimeData->setData(DRAG_FORMAT, QByteArray::number(m_index));
162  mimeData->setText(title(true));
163 
164  QDrag *drag = new QDrag(this);
165  drag->setMimeData(mimeData);
166  drag->setHotSpot(QPoint(0, height() / 2));
167  drag->setPixmap(TTKDesktopWrapper::grabWidget(this, rect()));
168  drag->exec(Qt::MoveAction);
169  }
170 }
171 
173 {
174  QWidget::paintEvent(event);
175  QPainter painter(this);
176  painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
177  painter.setPen(QPen(QBrush(QColor(0, 0, 0)), 0.1, Qt::SolidLine));
178  painter.drawLine(0, height(), width(), height());
179 
181  {
182  painter.setPen(QPen(QBrush(QColor(0, 0, 0)), 1, Qt::SolidLine));
183  if(m_isDrawTopState)
184  {
185  painter.drawLine(0, 0, width(), 0);
186  }
187  else
188  {
189  painter.drawLine(0, height() - 1, width(), height() - 1);
190  }
191  }
192 }
193 
194 
195 
197  : QWidget(parent),
198  m_layout(nullptr),
199  m_item(nullptr),
200  m_topWidget(nullptr)
201 {
202 
203 }
204 
205 MusicFunctionToolBoxWidgetItem::MusicFunctionToolBoxWidgetItem(int index, const QString &text, QWidget *parent)
207 {
208  Q_UNUSED(index);
209  Q_UNUSED(text);
210 }
211 
213 {
214  delete m_topWidget;
215  delete m_layout;
216 }
217 
219 {
220  return m_item;
221 }
222 
224 {
225  m_item = item;
226  m_layout->addWidget(item);
227 }
228 
230 {
231  m_topWidget->setTitle(text);
232 }
233 
235 {
236  m_topWidget->setExpand(expand);
237  if(m_item)
238  {
239  m_item->setVisible(expand);
240  }
241 }
242 
244 {
245  return m_item ? m_item->isVisible() : false;
246 }
247 
249 {
250  return m_topWidget->isActive();
251 }
252 
254 {
255  connect(m_topWidget, SIGNAL(itemIndexChanged(int)), parent(), SLOT(itemIndexChanged(int)));
256  connect(m_topWidget, SIGNAL(swapDragItemIndex(int,int)), SIGNAL(swapDragItemIndex(int,int)));
257 
258  m_layout = new QVBoxLayout(this);
259  m_layout->setContentsMargins(0, 0, 0, 0);
260  m_layout->setSpacing(0);
261  m_layout->addWidget(m_topWidget);
262  setLayout(m_layout);
263 }
264 
266 {
267  Q_UNUSED(event);
268 }
269 
270 
271 
272 MusicNormalToolBoxWidgetItem::MusicNormalToolBoxWidgetItem(int index, const QString &text, QWidget *parent)
274 {
275  m_topWidget = new MusicFunctionToolBoxTopWidget(index, text, this);
276  initialize();
277 }
278 
279 
280 
282  : QWidget(parent),
283  m_currentIndex(-1),
284  m_itemIndexRaise(0)
285 {
286  setAttribute(Qt::WA_TranslucentBackground);
287 
288  QVBoxLayout *mainLayout = new QVBoxLayout(this);
289  mainLayout->setContentsMargins(0, 0, 0, 0);
290  mainLayout->setSpacing(0);
291 
292  m_contentsWidget = new QWidget(this);
293  m_contentsWidget->setObjectName("ContentsWidget");
294  m_contentsWidget->setStyleSheet(QString("#%1{ %2 }").arg(m_contentsWidget->objectName(), TTK::UI::BackgroundStyle01));
295 
296  m_layout = new QVBoxLayout(m_contentsWidget);
297  m_layout->setContentsMargins(0, 0, 0 ,0);
298  m_layout->setSpacing(0);
299  m_contentsWidget->setLayout(m_layout);
300 
301  m_scrollArea = new QScrollArea(this);
303 
304  setTransparent(0);
305 
306  mainLayout->addWidget(m_scrollArea);
307  setLayout(mainLayout);
308 }
309 
311 {
312  while(!m_itemList.isEmpty())
313  {
314  delete m_itemList.takeLast().m_widgetItem;
315  }
316  delete m_layout;
317  delete m_scrollArea;
318 }
319 
320 void MusicFunctionToolBoxWidget::addCellItem(QWidget *item, const QString &text)
321 {
322  const int count = m_layout->count();
323  if(count > 1)
324  {
325  m_layout->removeItem(m_layout->itemAt(count - 1));
326  }
327 
328  //hide before widget
329  for(int i = 0; i < m_itemList.count(); ++i)
330  {
331  m_itemList[i].m_widgetItem->setExpand(false);
332  }
333 
334  // Add item and make sure it stretches the remaining space.
335  MusicToolBoxWidgetItem widgetItem;
336  widgetItem.m_widgetItem = initialItem(item, text);
337  widgetItem.m_itemIndex = m_itemIndexRaise++;
338  m_itemList.append(widgetItem);
339 
340  m_currentIndex = m_itemList.count() - 1;
341 
342  m_layout->addWidget(widgetItem.m_widgetItem);
343  m_layout->addStretch(5);
344 }
345 
347 {
348  for(int i = 0; i < m_itemList.count(); ++i)
349  {
350  MusicFunctionToolBoxWidgetItem *it = m_itemList[i].m_widgetItem;
351  if(it->item() == item)
352  {
353  m_layout->removeWidget(item);
354  m_itemList.takeAt(i).m_widgetItem->deleteLater();
355  m_currentIndex = 0;
356  return;
357  }
358  }
359 }
360 
361 void MusicFunctionToolBoxWidget::swapItem(int start, int end)
362 {
363  const MusicToolBoxWidgetItem &widgetItem = m_itemList.takeAt(start);
364  m_itemList.insert(end, widgetItem);
365 
366  m_layout->removeWidget(widgetItem.m_widgetItem);
367  const int count = m_layout->count();
368  if(count > 1)
369  {
370  m_layout->removeItem(m_layout->itemAt(count - 1));
371  }
372  m_layout->insertWidget(end, widgetItem.m_widgetItem);
373  m_layout->addStretch(5);
374 }
375 
376 void MusicFunctionToolBoxWidget::setTitle(QWidget *item, const QString &text)
377 {
378  for(int i = 0; i < m_itemList.count(); ++i)
379  {
380  MusicFunctionToolBoxWidgetItem *it = m_itemList[i].m_widgetItem;
381  if(it->item() == item)
382  {
383  it->setTitle(text);
384  return;
385  }
386  }
387 }
388 
390 {
391  QScrollBar *bar = m_scrollArea->verticalScrollBar();
392  if(bar)
393  {
394  bar->setSliderPosition(index);
395  }
396 }
397 
399 {
400  return m_currentIndex;
401 }
402 
404 {
405  return m_itemList.count();
406 }
407 
409 {
410  m_currentIndex = index;
411  for(int i = 0; i < m_itemList.count(); ++i)
412  {
413  m_itemList[i].m_widgetItem->setExpand(i == index);
414  }
415 }
416 
418 {
420  for(int i = 0; i < m_itemList.count(); ++i)
421  {
422  const bool hide = (i == m_currentIndex) ? !m_itemList[i].m_widgetItem->isExpand() : false;
423  m_itemList[i].m_widgetItem->setExpand(hide);
424  }
425 }
426 
428 {
429  const QString &alphaStr = QString("background:rgba(255, 255, 255, %1)").arg(alpha);
430  QWidget *view = m_scrollArea->viewport();
431  view->setObjectName("Viewport");
432  view->setStyleSheet(QString("#%1{ %2 }").arg(view->objectName(), alphaStr));
433 
434  m_scrollArea->verticalScrollBar()->setStyleSheet(" \
435  QScrollBar{ background:transparent; width:8px; padding-top:0px; padding-bottom:0px; } \
436  QScrollBar::handle:vertical{ border-radius:4px; background:#CFCFCF; min-height: 30px; } \
437  QScrollBar::handle:vertical::disabled{ background:#DBDBDB; } \
438  QScrollBar::handle:vertical:hover{ background:#BBBBBB; } \
439  QScrollBar::add-line, QScrollBar::sub-line{ background:none; border:none; } \
440  QScrollBar::add-page, QScrollBar::sub-page{ background:none; }");
441 }
442 
444 {
445  Q_UNUSED(event);
446 }
447 
449 {
450  int id = -1;
451  for(int i = 0; i < m_itemList.count(); ++i)
452  {
453  if(m_itemList[i].m_itemIndex == index)
454  {
455  id = i;
456  break;
457  }
458  }
459  return id;
460 }
void setTitle(QWidget *item, const QString &text)
MusicFunctionToolBoxWidgetItem(QWidget *parent=nullptr)
static QPixmap grabWidget(QWidget *widget, const QRect &rect)
virtual void dropEvent(QDropEvent *event) overridefinal
MusicFunctionToolBoxTopWidget(int index, const QString &text, QWidget *parent=nullptr)
virtual MusicFunctionToolBoxWidgetItem * initialItem(QWidget *item, const QString &text)=0
The class of the function tool box top widget.
virtual void dragLeaveEvent(QDragLeaveEvent *event) overridefinal
virtual void dragMoveEvent(QDragMoveEvent *event) overridefinal
virtual void dragEnterEvent(QDragEnterEvent *event) overridefinal
TTK_MODULE_EXPORT void setFontStyle(QWidget *widget, TTK::FontStyleMode type)
MusicNormalToolBoxWidgetItem(int index, const QString &text, QWidget *parent=nullptr)
void itemIndexChanged(int index)
virtual void paintEvent(QPaintEvent *event) override
The class of the tool box widget item.
static const QString ColorStyle02
Definition: musicuiobject.h:40
virtual void mousePressEvent(QMouseEvent *event) overridefinal
TTK_MODULE_EXPORT QString suffix(const QString &name)
The class of the function tool box widget item.
void addCellItem(QWidget *item, const QString &text)
static const QString BackgroundStyle01
Background.
Definition: musicuiobject.h:77
virtual void mousePressEvent(QMouseEvent *event) overridefinal
TTK_MODULE_EXPORT QString elidedText(const QFont &font, const QString &text, Qt::TextElideMode mode, int width)
MusicToolBoxWidgetItemList m_itemList
TTK_MODULE_EXPORT void generateVScrollAreaStyle(QWidget *widget, QWidget *parent, bool background=true)
static constexpr int RENAME_WIDTH
MusicFunctionToolBoxWidgetItem * m_widgetItem
TTK_MODULE_EXPORT QString elidedTitleText(const QFont &font, const QString &text, int width)
static unsigned char alpha[symbols+1]
Definition: rsecc.c:50
virtual void mouseMoveEvent(QMouseEvent *event) overridefinal
static constexpr const char * DRAG_FORMAT
MusicFunctionToolBoxWidget(QWidget *parent=nullptr)
virtual void mousePressEvent(QMouseEvent *event) overridefinal
void swapDragItemIndex(int start, int end)
void swapDragItemIndex(int start, int end)
MusicFunctionToolBoxTopWidget * m_topWidget
#define QtLablePixmap(p)
Lable pixmap.
Definition: ttkqtcompat.h:122