TTKMusicPlayer  4.1.3.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicpluginwidget.cpp
Go to the documentation of this file.
1 #include "musicpluginwidget.h"
2 #include "ui_musicpluginwidget.h"
3 #include "musicitemdelegate.h"
4 #include "musicpluginproperty.h"
5 
6 #include <qmmp/decoderfactory.h>
7 #include <qmmp/effectfactory.h>
8 #include <qmmp/visualfactory.h>
10 #include <qmmp/outputfactory.h>
11 #include <qmmp/decoder.h>
12 #include <qmmp/effect.h>
13 #include <qmmp/visual.h>
14 #include <qmmp/inputsource.h>
15 #include <qmmp/output.h>
16 
17 #include <QScrollBar>
18 
22 class MusicPluginItem : public QTreeWidgetItem
23 {
24 public:
25  MusicPluginItem(QTreeWidgetItem *parent, DecoderFactory *factory, const QString &path)
26  : QTreeWidgetItem(parent, PluginDecoder),
27  m_factory(factory)
28  {
29  MusicPluginProperty property;
30  property.m_name = factory->properties().name;
31  property.m_hasSettings = factory->properties().hasSettings;
32  property.m_description = factory->properties().description;
33  property.m_type = path;
34  initialize(Decoder::isEnabled(factory), true, property);
35  }
36 
37  MusicPluginItem(QTreeWidgetItem *parent, EffectFactory *factory, const QString &path)
38  : QTreeWidgetItem(parent, PluginEffect),
39  m_factory(factory)
40  {
41  MusicPluginProperty property;
42  property.m_name = factory->properties().name;
43  property.m_hasSettings = factory->properties().hasSettings;
44  property.m_type = path;
45  initialize(Effect::isEnabled(factory), false, property);
46  }
47 
48  MusicPluginItem(QTreeWidgetItem *parent, VisualFactory *factory, const QString &path)
49  : QTreeWidgetItem(parent, PluginVisual),
50  m_factory(factory)
51  {
52  MusicPluginProperty property;
53  property.m_name = factory->properties().name;
54  property.m_hasSettings = factory->properties().hasSettings;
55  property.m_type = path;
56  initialize(Visual::isEnabled(factory), false, property);
57  }
58 
59  MusicPluginItem(QTreeWidgetItem *parent, InputSourceFactory *factory, const QString &path)
60  : QTreeWidgetItem(parent, PluginTransports),
61  m_factory(factory)
62  {
63  MusicPluginProperty property;
64  property.m_name = factory->properties().name;
65  property.m_hasSettings = factory->properties().hasSettings;
66  property.m_type = path;
67  initialize(InputSource::isEnabled(factory), true, property);
68  }
69 
70  MusicPluginItem(QTreeWidgetItem *parent, OutputFactory *factory, const QString &path)
71  : QTreeWidgetItem(parent, PluginOutput),
72  m_factory(factory)
73  {
74  MusicPluginProperty property;
75  property.m_name = factory->properties().name;
76  property.m_hasSettings = factory->properties().hasSettings;
77  property.m_type = path;
78  initialize(Output::currentFactory() == factory, true, property);
79  }
80 
81  enum Module
82  {
83  PluginDecoder = QTreeWidgetItem::UserType,
88  };
89 
90  inline bool hasSettings() const
91  {
92  switch(type())
93  {
94  case PluginDecoder: return TTKStaticCast(DecoderFactory*, m_factory)->properties().hasSettings;
95  case PluginEffect: return false;
96  case PluginVisual: return false;
97  case PluginTransports: return TTKStaticCast(InputSourceFactory*, m_factory)->properties().hasSettings;
98  case PluginOutput: return TTKStaticCast(OutputFactory*, m_factory)->properties().hasSettings;
99  default: return false;
100  }
101  }
102 
103  inline void showSettingWidget() const
104  {
105  QDialog *dialog = nullptr;
106 
107  switch(type())
108  {
109  case PluginDecoder: dialog = TTKStaticCast(DecoderFactory*, m_factory)->createSettings(nullptr); break;
110  case PluginEffect: break;
111  case PluginVisual: break;
112  case PluginTransports: dialog = TTKStaticCast(InputSourceFactory*, m_factory)->createSettings(nullptr); break;
113  case PluginOutput: dialog = TTKStaticCast(OutputFactory*, m_factory)->createSettings(nullptr); break;
114  default: break;
115  }
116 
117  if(dialog)
118  {
119  dialog->exec();
120  dialog->deleteLater();
121  }
122  }
123 
124  inline void setEnabled(bool enabled)
125  {
126  switch(type())
127  {
129  case PluginEffect: break;
130  case PluginVisual: break;
132  case PluginOutput:
133  {
134  if(enabled)
135  {
137  }
138  break;
139  }
140  default: break;
141  }
142  }
143 
144  inline void initialize(bool state, bool enabled, const MusicPluginProperty &property)
145  {
146  setData(0, TTK_CHECKED_ROLE, state ? Qt::Checked : Qt::Unchecked);
147  setData(0, TTK_ENABLED_ROLE, enabled);
148  setData(1, TTK_DISPLAY_ROLE, property.m_name);
149  setData(2, TTK_DISPLAY_ROLE, property.m_type.section('/', -1));
150 
151  if(!property.m_description.isEmpty())
152  {
153  setToolTip(1, property.m_description);
154  setToolTip(2, property.m_description);
155  }
156 
157  if(property.m_hasSettings)
158  {
159  setIcon(3, QIcon(":/contextMenu/btn_setting"));
160  }
161 
162  const QColor &color = enabled ? (state ? QColor(0xE6, 0x73, 0x00) : QColor(0x00, 0x00, 0x00)) : QColor(0xBB, 0xBB, 0xBB);
163  setData(1, Qt::ForegroundRole, color);
164  setData(2, Qt::ForegroundRole, color);
165  }
166 
167 private:
168  void *m_factory;
169 
170 };
171 
172 
173 
175  : MusicAbstractMoveDialog(parent),
176  m_ui(new Ui::MusicPluginWidget)
177 {
178  m_ui->setupUi(this);
179  setFixedSize(size());
180  setBackgroundLabel(m_ui->background);
181 
182  m_ui->topTitleCloseButton->setIcon(QIcon(":/functions/btn_close_hover"));
183  m_ui->topTitleCloseButton->setStyleSheet(TTK::UI::ToolButtonStyle04);
184  m_ui->topTitleCloseButton->setCursor(QCursor(Qt::PointingHandCursor));
185  m_ui->topTitleCloseButton->setToolTip(tr("Close"));
186  connect(m_ui->topTitleCloseButton, SIGNAL(clicked()), SLOT(close()));
187 
188 #if TTK_QT_VERSION_CHECK(5,0,0)
189  m_ui->treeWidget->header()->setSectionsMovable(false);
190  m_ui->treeWidget->header()->setSectionResizeMode(0, QHeaderView::Fixed);
191 #else
192  m_ui->treeWidget->header()->setMovable(false);
193  m_ui->treeWidget->header()->setResizeMode(0, QHeaderView::Fixed);
194 #endif
195  m_ui->treeWidget->setHeaderLabels({{}, tr("Description"), tr("Name"), {}});
196 
197  TTKCheckBoxItemDelegate *delegateCheck = new TTKCheckBoxItemDelegate(this);
198  delegateCheck->setStyleSheet(TTK::UI::CheckBoxStyle01);
200  m_ui->treeWidget->setItemDelegateForColumn(0, delegateCheck);
201 
202  TTKLabelItemDelegate *delegateTitle = new TTKLabelItemDelegate(this);
204  delegateTitle->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
206  m_ui->treeWidget->setItemDelegateForColumn(1, delegateTitle);
207 
208  TTKLabelItemDelegate *delegateName = new TTKLabelItemDelegate(this);
210  delegateName->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
212  m_ui->treeWidget->setItemDelegateForColumn(2, delegateName);
213 
214  QItemDelegate *delegateSetting = new QItemDelegate(this);
215  m_ui->treeWidget->setItemDelegateForColumn(3, delegateSetting);
216 
217  m_ui->treeWidget->setColumnWidth(0, 65);
218  m_ui->treeWidget->setColumnWidth(1, 210);
219  m_ui->treeWidget->setColumnWidth(2, 120);
220  m_ui->treeWidget->setColumnWidth(3, 70);
221 
222  m_ui->settingButton->setStyleSheet(TTK::UI::PushButtonStyle03);
226  m_ui->treeWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
227  m_ui->treeWidget->verticalScrollBar()->setStyleSheet(TTK::UI::ScrollBarStyle03);
228  m_ui->treeWidget->setFocusPolicy(Qt::NoFocus);
229 
230  loadPluginsInfo();
231 
232  connect(m_ui->settingButton, SIGNAL(clicked()), SLOT(pluginButtonClicked()));
233  connect(m_ui->treeWidget, SIGNAL(itemClicked(QTreeWidgetItem*,int)), SLOT(pluginItemChanged(QTreeWidgetItem*,int)));
234 }
235 
236 void MusicPluginWidget::pluginItemChanged(QTreeWidgetItem *item, int column)
237 {
238  if(column == 0 && (item->type() == MusicPluginItem::PluginDecoder || item->type() == MusicPluginItem::PluginTransports || item->type() == MusicPluginItem::PluginOutput))
239  {
240  if(item->type() == MusicPluginItem::PluginOutput)
241  {
242  QTreeWidgetItem *parent = item->parent();
243  if(!parent)
244  {
245  return;
246  }
247 
248  for(int i = 0; i < parent->childCount(); ++i)
249  {
250  QTreeWidgetItem *it = parent->child(i);
251  it->setData(column, TTK_CHECKED_ROLE, Qt::Unchecked);
252  it->setData(1, Qt::ForegroundRole, QColor(0x00, 0x00, 0x00));
253  it->setData(2, Qt::ForegroundRole, QColor(0x00, 0x00, 0x00));
254  }
255  }
256 
257  const Qt::CheckState status = TTKStaticCast(Qt::CheckState, item->data(column, TTK_CHECKED_ROLE).toInt());
258  item->setData(column, TTK_CHECKED_ROLE, status == Qt::Checked ? Qt::Unchecked : Qt::Checked);
259  TTKDynamicCast(MusicPluginItem*, item)->setEnabled(status != Qt::Checked);
260 
261  const QColor &color = (status != Qt::Checked) ? QColor(0xE6, 0x73, 0x00) : QColor(0x00, 0x00, 0x00);
262  item->setData(1, Qt::ForegroundRole, color);
263  item->setData(2, Qt::ForegroundRole, color);
264  }
265 
267  m_ui->settingButton->setEnabled(it ? it->hasSettings() : false);
268 }
269 
271 {
272  MusicPluginItem *item = TTKDynamicCast(MusicPluginItem*, m_ui->treeWidget->currentItem());
273  if(item)
274  {
275  item->showSettingWidget();
276  }
277 }
278 
280 {
281  m_ui->treeWidget->blockSignals(true);
282 
283  QTreeWidgetItem *item = nullptr;
284  item = new QTreeWidgetItem(m_ui->treeWidget, {tr("Decoder")});
285  item->setFirstColumnSpanned(true);
286  item->setExpanded(true);
287  for(DecoderFactory *factory : Decoder::factories())
288  {
289  new MusicPluginItem(item, factory, Decoder::file(factory));
290  }
291  m_ui->treeWidget->addTopLevelItem(item);
292 
293  item = new QTreeWidgetItem(m_ui->treeWidget, {tr("Effect")});
294  item->setFirstColumnSpanned(true);
295  item->setExpanded(true);
296  for(EffectFactory *factory : Effect::factories())
297  {
298  new MusicPluginItem(item, factory, Effect::file(factory));
299  }
300  m_ui->treeWidget->addTopLevelItem(item);
301 
302  item = new QTreeWidgetItem(m_ui->treeWidget, {tr("Visualization")});
303  item->setFirstColumnSpanned(true);
304  item->setExpanded(true);
305  for(VisualFactory *factory : Visual::factories())
306  {
307  new MusicPluginItem(item, factory, Visual::file(factory));
308  }
309  m_ui->treeWidget->addTopLevelItem(item);
310 
311  item = new QTreeWidgetItem(m_ui->treeWidget, {tr("Transport")});
312  item->setFirstColumnSpanned(true);
313  item->setExpanded(true);
315  {
316  new MusicPluginItem(item, factory, InputSource::file(factory));
317  }
318  m_ui->treeWidget->addTopLevelItem(item);
319 
320  item = new QTreeWidgetItem(m_ui->treeWidget, {tr("Output")});
321  item->setFirstColumnSpanned(true);
322  item->setExpanded(true);
323  for(OutputFactory *factory : Output::factories())
324  {
325  new MusicPluginItem(item, factory, Output::file(factory));
326  }
327  m_ui->treeWidget->addTopLevelItem(item);
328 
329  m_ui->treeWidget->blockSignals(false);
330 }
MusicPluginItem(QTreeWidgetItem *parent, OutputFactory *factory, const QString &path)
#define TTKStaticCast(x, y)
Definition: ttkglobal.h:159
void setBackgroundLabel(QLabel *label)
Transport plugin interface.
static QList< VisualFactory * > factories()
virtual OutputProperties properties() const =0
The class of the label item delegate.
#define TTK_DISPLAY_ROLE
static bool isEnabled(const InputSourceFactory *factory)
#define TTK_ENABLED_ROLE
static QString file(const InputSourceFactory *factory)
static const QString CheckBoxStyle01
CheckBox.
static const QString SliderStyle06
voidpf void uLong size
Definition: ioapi.h:136
void setStyleSheet(const QString &style) const
static bool isEnabled(const DecoderFactory *factory)
The class of the plugin manager widget.
static const QString PushButtonStyle12
MusicPluginWidget(QWidget *parent=nullptr)
The class of the plugin item widget.
Ui::MusicPluginWidget * m_ui
virtual EffectProperties properties() const =0
MusicPluginItem(QTreeWidgetItem *parent, EffectFactory *factory, const QString &path)
static void setCurrentFactory(const OutputFactory *factory)
static OutputFactory * currentFactory()
Effect plugin interface (effect factory).
Definition: effectfactory.h:54
static QList< OutputFactory * > factories()
void setEnabled(bool enabled)
static QString file(const DecoderFactory *factory)
MusicPluginItem(QTreeWidgetItem *parent, VisualFactory *factory, const QString &path)
static bool isEnabled(const VisualFactory *factory)
void setAlignment(Qt::Alignment alignment) const
static const QString ScrollBarStyle03
static const QString GroupBoxStyle01
GroupBox.
static const QString ScrollBarStyle01
ScrollBar.
virtual InputSourceProperties properties() const =0
MusicPluginItem(QTreeWidgetItem *parent, InputSourceFactory *factory, const QString &path)
static const QString PushButtonStyle03
Input plugin interface (decoder factory).
static const QString SpinBoxStyle01
SpinBox.
static bool isEnabled(const EffectFactory *factory)
virtual DecoderProperties properties() const =0
static const QString BackgroundStyle01
Background.
Definition: musicuiobject.h:77
void initialize(bool state, bool enabled, const MusicPluginProperty &property)
static QList< EffectFactory * > factories()
static void setEnabled(InputSourceFactory *factory, bool enable=true)
static QString file(const OutputFactory *factory)
The class of the moving dialog base.
static QString file(const EffectFactory *factory)
static QList< InputSourceFactory * > factories()
static void setEnabled(DecoderFactory *factory, bool enable=true)
static const QString LineEditStyle01
LineEdit.
MusicPluginItem(QTreeWidgetItem *parent, DecoderFactory *factory, const QString &path)
Visual plugin interface (visual factory).
Definition: visualfactory.h:42
static const QString ToolButtonStyle04
void setModuleMode(TTKUInt8 mode)
void pluginItemChanged(QTreeWidgetItem *item, int column)
static const QString RadioButtonStyle01
RadioButton.
static QList< DecoderFactory * > factories()
virtual VisualProperties properties() const =0
The class of the checkbox item delegate.
static const QString ComboBoxStyle01
ComboBox.
Output plugin interface (output factory).
Definition: outputfactory.h:44
bool hasSettings() const
static QString file(const VisualFactory *factory)
The class of the plugin property.
#define TTK_CHECKED_ROLE
state
Definition: http_parser.c:279
#define TTKDynamicCast(x, y)
Definition: ttkglobal.h:147
void showSettingWidget() const