TTKMusicPlayer  3.7.0.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  switch(type())
106  {
107  case PluginDecoder: TTKStaticCast(DecoderFactory*, m_factory)->showSettings(treeWidget()); break;
108  case PluginEffect: break;
109  case PluginVisual: break;
110  case PluginTransports: TTKStaticCast(InputSourceFactory*, m_factory)->showSettings(treeWidget()); break;
111  case PluginOutput: TTKStaticCast(OutputFactory*, m_factory)->showSettings(treeWidget()); break;
112  default: break;
113  }
114  }
115 
116  inline void setEnabled(bool enabled)
117  {
118  switch(type())
119  {
121  case PluginEffect: break;
122  case PluginVisual: break;
124  case PluginOutput:
125  {
126  if(enabled)
127  {
129  }
130  break;
131  }
132  default: break;
133  }
134  }
135 
136  inline void initialize(bool state, bool enabled, const MusicPluginProperty &property)
137  {
138  setData(0, TTK_CHECKED_ROLE, state ? Qt::Checked : Qt::Unchecked);
139  setData(0, TTK_ENABLED_ROLE, enabled);
140  setData(1, TTK_DISPLAY_ROLE, property.m_name);
141  setData(2, TTK_DISPLAY_ROLE, property.m_type.section('/', -1));
142 
143  if(!property.m_description.isEmpty())
144  {
145  setToolTip(1, property.m_description);
146  setToolTip(2, property.m_description);
147  }
148 
149  if(property.m_hasSettings)
150  {
151  setIcon(3, QIcon(":/contextMenu/btn_setting"));
152  }
153 
154  const QColor &color = enabled ? (state ? QColor(0xE6, 0x73, 0x00) : QColor(0x00, 0x00, 0x00)) : QColor(0xBB, 0xBB, 0xBB);
155  setData(1, Qt::ForegroundRole, color);
156  setData(2, Qt::ForegroundRole, color);
157  }
158 
159 private:
160  void *m_factory;
161 
162 };
163 
164 
165 
167  : MusicAbstractMoveDialog(parent),
168  m_ui(new Ui::MusicPluginWidget)
169 {
170  m_ui->setupUi(this);
171  setFixedSize(size());
172  setBackgroundLabel(m_ui->background);
173 
174  m_ui->topTitleCloseButton->setIcon(QIcon(":/functions/btn_close_hover"));
175  m_ui->topTitleCloseButton->setStyleSheet(TTK::UI::ToolButtonStyle04);
176  m_ui->topTitleCloseButton->setCursor(QCursor(Qt::PointingHandCursor));
177  m_ui->topTitleCloseButton->setToolTip(tr("Close"));
178  connect(m_ui->topTitleCloseButton, SIGNAL(clicked()), SLOT(close()));
179 
180 #if TTK_QT_VERSION_CHECK(5,0,0)
181  m_ui->treeWidget->header()->setSectionsMovable(false);
182  m_ui->treeWidget->header()->setSectionResizeMode(0, QHeaderView::Fixed);
183 #else
184  m_ui->treeWidget->header()->setMovable(false);
185  m_ui->treeWidget->header()->setResizeMode(0, QHeaderView::Fixed);
186 #endif
187  m_ui->treeWidget->setHeaderLabels({{}, tr("Description"), tr("Name"), {}});
188 
189  TTKCheckBoxItemDelegate *delegateCheck = new TTKCheckBoxItemDelegate(this);
190  delegateCheck->setStyleSheet(TTK::UI::CheckBoxStyle01);
192  m_ui->treeWidget->setItemDelegateForColumn(0, delegateCheck);
193 
194  TTKLabelItemDelegate *delegateTitle = new TTKLabelItemDelegate(this);
196  delegateTitle->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
198  m_ui->treeWidget->setItemDelegateForColumn(1, delegateTitle);
199 
200  TTKLabelItemDelegate *delegateName = new TTKLabelItemDelegate(this);
202  delegateName->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
204  m_ui->treeWidget->setItemDelegateForColumn(2, delegateName);
205 
206  QItemDelegate *delegateSetting = new QItemDelegate(this);
207  m_ui->treeWidget->setItemDelegateForColumn(3, delegateSetting);
208 
209  m_ui->treeWidget->setColumnWidth(0, 65);
210  m_ui->treeWidget->setColumnWidth(1, 210);
211  m_ui->treeWidget->setColumnWidth(2, 120);
212  m_ui->treeWidget->setColumnWidth(3, 70);
213 
214  m_ui->settingButton->setStyleSheet(TTK::UI::PushButtonStyle03);
218  m_ui->treeWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
219  m_ui->treeWidget->verticalScrollBar()->setStyleSheet(TTK::UI::ScrollBarStyle03);
220  m_ui->treeWidget->setFocusPolicy(Qt::NoFocus);
221 
222  loadPluginsInfo();
223 
224  connect(m_ui->settingButton, SIGNAL(clicked()), SLOT(pluginButtonClicked()));
225  connect(m_ui->treeWidget, SIGNAL(itemClicked(QTreeWidgetItem*,int)), SLOT(pluginItemChanged(QTreeWidgetItem*,int)));
226 }
227 
228 void MusicPluginWidget::pluginItemChanged(QTreeWidgetItem *item, int column)
229 {
230  if(column == 0 && (item->type() == MusicPluginItem::PluginDecoder || item->type() == MusicPluginItem::PluginTransports || item->type() == MusicPluginItem::PluginOutput))
231  {
232  if(item->type() == MusicPluginItem::PluginOutput)
233  {
234  QTreeWidgetItem *parent = item->parent();
235  if(!parent)
236  {
237  return;
238  }
239 
240  for(int i = 0; i < parent->childCount(); ++i)
241  {
242  QTreeWidgetItem *it = parent->child(i);
243  it->setData(column, TTK_CHECKED_ROLE, Qt::Unchecked);
244  it->setData(1, Qt::ForegroundRole, QColor(0x00, 0x00, 0x00));
245  it->setData(2, Qt::ForegroundRole, QColor(0x00, 0x00, 0x00));
246  }
247  }
248 
249  const Qt::CheckState status = TTKStaticCast(Qt::CheckState, item->data(column, TTK_CHECKED_ROLE).toInt());
250  item->setData(column, TTK_CHECKED_ROLE, status == Qt::Checked ? Qt::Unchecked : Qt::Checked);
251  TTKDynamicCast(MusicPluginItem*, item)->setEnabled(status != Qt::Checked);
252 
253  const QColor &color = (status != Qt::Checked) ? QColor(0xE6, 0x73, 0x00) : QColor(0x00, 0x00, 0x00);
254  item->setData(1, Qt::ForegroundRole, color);
255  item->setData(2, Qt::ForegroundRole, color);
256  }
257 
259  m_ui->settingButton->setEnabled(it ? it->hasSettings() : false);
260 }
261 
263 {
264  MusicPluginItem *item = TTKDynamicCast(MusicPluginItem*, m_ui->treeWidget->currentItem());
265  if(item)
266  {
267  item->showSettingWidget();
268  }
269 }
270 
272 {
273  m_ui->treeWidget->blockSignals(true);
274 
275  QTreeWidgetItem *item = nullptr;
276  item = new QTreeWidgetItem(m_ui->treeWidget, {tr("Decoder")});
277  item->setFirstColumnSpanned(true);
278  item->setExpanded(true);
279  for(DecoderFactory *factory : Decoder::factories())
280  {
281  new MusicPluginItem(item, factory, Decoder::file(factory));
282  }
283  m_ui->treeWidget->addTopLevelItem(item);
284 
285  item = new QTreeWidgetItem(m_ui->treeWidget, {tr("Effect")});
286  item->setFirstColumnSpanned(true);
287  item->setExpanded(true);
288  for(EffectFactory *factory : Effect::factories())
289  {
290  new MusicPluginItem(item, factory, Effect::file(factory));
291  }
292  m_ui->treeWidget->addTopLevelItem(item);
293 
294  item = new QTreeWidgetItem(m_ui->treeWidget, {tr("Visualization")});
295  item->setFirstColumnSpanned(true);
296  item->setExpanded(true);
297  for(VisualFactory *factory : Visual::factories())
298  {
299  new MusicPluginItem(item, factory, Visual::file(factory));
300  }
301  m_ui->treeWidget->addTopLevelItem(item);
302 
303  item = new QTreeWidgetItem(m_ui->treeWidget, {tr("Transport")});
304  item->setFirstColumnSpanned(true);
305  item->setExpanded(true);
307  {
308  new MusicPluginItem(item, factory, InputSource::file(factory));
309  }
310  m_ui->treeWidget->addTopLevelItem(item);
311 
312  item = new QTreeWidgetItem(m_ui->treeWidget, {tr("Output")});
313  item->setFirstColumnSpanned(true);
314  item->setExpanded(true);
315  for(OutputFactory *factory : Output::factories())
316  {
317  new MusicPluginItem(item, factory, Output::file(factory));
318  }
319  m_ui->treeWidget->addTopLevelItem(item);
320 
321  m_ui->treeWidget->blockSignals(false);
322 }
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
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
virtual const EffectProperties properties() const =0
void showSettingWidget() const