TTKMusicPlayer  3.7.0.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  setAcceptDrops(true);
21  setFixedHeight(40);
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  m_suffixString = text.right(text.length() - index);
88  text = text.left(index);
89  }
90  return text;
91 }
92 
94 {
95  return false;
96 }
97 
99 {
100  if(event->mimeData()->hasFormat(DRAG_FORMAT))
101  {
102  event->setDropAction(Qt::MoveAction);
103  event->accept();
104  }
105  else
106  {
107  event->ignore();
108  }
109 }
110 
112 {
113  if(event->mimeData()->hasFormat(DRAG_FORMAT) && isItemEnabled())
114  {
115  m_isDrawMoveState = true;
116  m_isDrawTopState = event->pos().y() < height() / 2;
117  update();
118  }
119 }
120 
122 {
123  Q_UNUSED(event);
124  m_isDrawTopState = false;
125  m_isDrawMoveState = false;
126  update();
127 }
128 
130 {
131  m_isDrawMoveState = false;
132  update();
133 
134  if(event->mimeData()->hasFormat(DRAG_FORMAT) && isItemEnabled())
135  {
136  Q_EMIT swapDragItemIndex(event->mimeData()->data(DRAG_FORMAT).toInt(), m_index);
137  }
138 }
139 
141 {
142  QWidget::mousePressEvent(event);
143  if(event->button() == Qt::LeftButton)
144  {
145  Q_EMIT itemIndexChanged(m_index);
146  m_pressAt = event->pos();
147  }
148 }
149 
151 {
152  QWidget::mouseMoveEvent(event);
153  QRect itemRect(m_pressAt.x() - 2, m_pressAt.y() - 2, m_pressAt.x() + 2, m_pressAt.y() + 2);
154  if(!itemRect.contains(event->pos()) && isItemEnabled())
155  {
156  if(!m_isBlockMoveExpand && isExpand())
157  {
158  Q_EMIT itemIndexChanged(m_index);
159  }
160 
161  QMimeData *mimeData = new QMimeData;
162  mimeData->setData(DRAG_FORMAT, QByteArray::number(m_index));
163  mimeData->setText(title(true));
164 
165  QDrag *drag = new QDrag(this);
166  drag->setMimeData(mimeData);
167  drag->setHotSpot(QPoint(0, height() / 2));
168  drag->setPixmap(TTKDesktopWrapper::grabWidget(this, rect()));
169  drag->exec(Qt::MoveAction);
170  }
171 }
172 
174 {
175  QWidget::paintEvent(event);
176  QPainter painter(this);
177  painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
178  painter.setPen(QPen(QBrush(QColor(0, 0, 0)), 0.1, Qt::SolidLine));
179  painter.drawLine(0, height(), width(), height());
180 
182  {
183  painter.setPen(QPen(QBrush(QColor(0, 0, 0)), 1, Qt::SolidLine));
184  if(m_isDrawTopState)
185  {
186  painter.drawLine(0, 0, width(), 0);
187  }
188  else
189  {
190  painter.drawLine(0, height() - 1, width(), height() - 1);
191  }
192  }
193 }
194 
195 
196 
198  : QWidget(parent),
199  m_layout(nullptr),
200  m_item(nullptr),
201  m_topWidget(nullptr)
202 {
203 
204 }
205 
206 MusicFunctionToolBoxWidgetItem::MusicFunctionToolBoxWidgetItem(int index, const QString &text, QWidget *parent)
208 {
209  Q_UNUSED(index);
210  Q_UNUSED(text);
211 }
212 
214 {
215  delete m_topWidget;
216  delete m_layout;
217 }
218 
220 {
221  return m_item;
222 }
223 
225 {
226  m_item = item;
227  m_layout->addWidget(item);
228 }
229 
231 {
232  m_topWidget->setTitle(text);
233 }
234 
236 {
237  m_topWidget->setExpand(expand);
238  if(m_item)
239  {
240  m_item->setVisible(expand);
241  }
242 }
243 
245 {
246  return m_item ? m_item->isVisible() : false;
247 }
248 
250 {
251  return m_topWidget->isActive();
252 }
253 
255 {
256  connect(m_topWidget, SIGNAL(itemIndexChanged(int)), parent(), SLOT(itemIndexChanged(int)));
257  connect(m_topWidget, SIGNAL(swapDragItemIndex(int,int)), SIGNAL(swapDragItemIndex(int,int)));
258 
259  m_layout = new QVBoxLayout(this);
260  m_layout->setContentsMargins(0, 0, 0, 0);
261  m_layout->setSpacing(0);
262  m_layout->addWidget(m_topWidget);
263  setLayout(m_layout);
264 }
265 
267 {
268  Q_UNUSED(event);
269 }
270 
271 
272 
273 MusicNormalToolBoxWidgetItem::MusicNormalToolBoxWidgetItem(int index, const QString &text, QWidget *parent)
275 {
276  m_topWidget = new MusicFunctionToolBoxTopWidget(index, text, this);
277  initialize();
278 }
279 
280 
281 
283  : QWidget(parent),
284  m_currentIndex(-1),
285  m_itemIndexRaise(0)
286 {
287  setAttribute(Qt::WA_TranslucentBackground);
288 
289  QVBoxLayout *mainLayout = new QVBoxLayout(this);
290  mainLayout->setContentsMargins(0, 0, 0, 0);
291  mainLayout->setSpacing(0);
292 
293  m_contentsWidget = new QWidget(this);
294  m_contentsWidget->setObjectName("ContentsWidget");
295  m_contentsWidget->setStyleSheet("#ContentsWidget{background-color:transparent; }");
296 
297  m_layout = new QVBoxLayout(m_contentsWidget);
298  m_layout->setContentsMargins(0, 0, 0 ,0);
299  m_layout->setSpacing(0);
300  m_contentsWidget->setLayout(m_layout);
301 
302  m_scrollArea = new QScrollArea(this);
304 
305  setTransparent(0);
306 
307  mainLayout->addWidget(m_scrollArea);
308  setLayout(mainLayout);
309 }
310 
312 {
313  while(!m_itemList.isEmpty())
314  {
315  delete m_itemList.takeLast().m_widgetItem;
316  }
317  delete m_layout;
318  delete m_scrollArea;
319 }
320 
321 void MusicFunctionToolBoxWidget::addCellItem(QWidget *item, const QString &text)
322 {
323  const int count = m_layout->count();
324  if(count > 1)
325  {
326  m_layout->removeItem(m_layout->itemAt(count - 1));
327  }
328 
329  //hide before widget
330  for(int i = 0; i < m_itemList.count(); ++i)
331  {
332  m_itemList[i].m_widgetItem->setExpand(false);
333  }
334 
335  // Add item and make sure it stretches the remaining space.
336  MusicToolBoxWidgetItem widgetItem;
337  widgetItem.m_widgetItem = initialItem(item, text);
338  widgetItem.m_itemIndex = m_itemIndexRaise++;
339  m_itemList.append(widgetItem);
340 
341  m_currentIndex = m_itemList.count() - 1;
342 
343  m_layout->addWidget(widgetItem.m_widgetItem);
344  m_layout->addStretch(5);
345 }
346 
348 {
349  for(int i = 0; i < m_itemList.count(); ++i)
350  {
351  MusicFunctionToolBoxWidgetItem *it = m_itemList[i].m_widgetItem;
352  if(it->item() == item)
353  {
354  m_layout->removeWidget(item);
355  m_itemList.takeAt(i).m_widgetItem->deleteLater();
356  m_currentIndex = 0;
357  return;
358  }
359  }
360 }
361 
362 void MusicFunctionToolBoxWidget::swapItem(int start, int end)
363 {
364  const MusicToolBoxWidgetItem &widgetItem = m_itemList.takeAt(start);
365  m_itemList.insert(end, widgetItem);
366 
367  m_layout->removeWidget(widgetItem.m_widgetItem);
368  const int count = m_layout->count();
369  if(count > 1)
370  {
371  m_layout->removeItem(m_layout->itemAt(count - 1));
372  }
373  m_layout->insertWidget(end, widgetItem.m_widgetItem);
374  m_layout->addStretch(5);
375 }
376 
377 void MusicFunctionToolBoxWidget::setTitle(QWidget *item, const QString &text)
378 {
379  for(int i = 0; i < m_itemList.count(); ++i)
380  {
381  MusicFunctionToolBoxWidgetItem *it = m_itemList[i].m_widgetItem;
382  if(it->item() == item)
383  {
384  it->setTitle(text);
385  return;
386  }
387  }
388 }
389 
391 {
392  QScrollBar *bar = m_scrollArea->verticalScrollBar();
393  if(bar)
394  {
395  bar->setSliderPosition(index);
396  }
397 }
398 
400 {
401  return m_currentIndex;
402 }
403 
405 {
406  return m_itemList.count();
407 }
408 
410 {
411  m_currentIndex = index;
412  for(int i = 0; i < m_itemList.count(); ++i)
413  {
414  m_itemList[i].m_widgetItem->setExpand(i == index);
415  }
416 }
417 
419 {
421  for(int i = 0; i < m_itemList.count(); ++i)
422  {
423  const bool hide = (i == m_currentIndex) ? !m_itemList[i].m_widgetItem->isExpand() : false;
424  m_itemList[i].m_widgetItem->setExpand(hide);
425  }
426 }
427 
429 {
430  const QString &alphaStr = QString("background:rgba(255, 255, 255, %1)").arg(alpha);
431  QWidget *view = m_scrollArea->viewport();
432  view->setObjectName("Viewport");
433  view->setStyleSheet(QString("#Viewport{%1}").arg(alphaStr));
434 
435  m_scrollArea->verticalScrollBar()->setStyleSheet(" \
436  QScrollBar{ background:transparent; width:8px; padding-top:0px; padding-bottom:0px; } \
437  QScrollBar::handle:vertical{ border-radius:4px; background:#CFCFCF; min-height: 30px; } \
438  QScrollBar::handle:vertical::disabled{ background:#DBDBDB; } \
439  QScrollBar::handle:vertical:hover{ background:#BBBBBB; } \
440  QScrollBar::add-line, QScrollBar::sub-line{ background:none; border:none; } \
441  QScrollBar::add-page, QScrollBar::sub-page{ background:none; }");
442 }
443 
445 {
446  Q_UNUSED(event);
447 }
448 
450 {
451  int id = -1;
452  for(int i = 0; i < m_itemList.count(); ++i)
453  {
454  if(m_itemList[i].m_itemIndex == index)
455  {
456  id = i;
457  break;
458  }
459  }
460  return id;
461 }
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)
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
static constexpr int RENAME_WIDTH
TTK_MODULE_EXPORT void generateVScrollAreaFormat(QWidget *widget, QWidget *parent, bool background=true)
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