TTKMusicPlayer  4.2.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
qkugouwindow.cpp
Go to the documentation of this file.
1 #include "qkugouwindow.h"
2 #include "qkugouuiobject.h"
3 
4 #ifdef TTK_MINIBLINK
5 # include "miniblink/miniblink.h"
6 #elif defined TTK_WEBKIT
7 # if TTK_QT_VERSION_CHECK(5,0,0)
8 # include <QtWebKitWidgets/QWebView>
9 # include <QtWebKitWidgets/QWebFrame>
10 # else
11 # include <QtWebKit/QWebView>
12 # include <QtWebKit/QWebFrame>
13 # endif
14 #elif defined TTK_WEBENGINE
15 # include <QtWebEngineWidgets/QWebEngineView>
16 # include <QtWebEngineWidgets/QWebEngineSettings>
17 #endif
18 
19 #include <QLabel>
20 #include <QTimer>
21 #include <QBoxLayout>
22 #include <QPushButton>
23 #include <QButtonGroup>
24 
28 class QKugouWindowPrivate : public TTKPrivate<QKugouWindow>
29 {
30 public:
31  QKugouWindowPrivate() noexcept;
32  ~QKugouWindowPrivate() noexcept;
33 
34  QWidget *m_webView, *m_topWidget;
35  QButtonGroup *m_buttonGroup;
36 };
37 
39  : m_webView(nullptr),
40  m_topWidget(nullptr),
41  m_buttonGroup(nullptr)
42 {
43 
44 }
45 
47 {
48  delete m_buttonGroup;
49  delete m_topWidget;
50  delete m_webView;
51 }
52 
53 
54 
55 QKugouWindow::QKugouWindow(Module type, QWidget *parent)
56  : QLabel(parent)
57 {
59 
60 #ifdef TTK_WEBKIT
61  QWebSettings *settings = QWebSettings::globalSettings();
62  settings->setAttribute(QWebSettings::PluginsEnabled, true);
63  settings->setAttribute(QWebSettings::JavascriptEnabled, true);
64  settings->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
65  settings->setAttribute(QWebSettings::JavascriptCanOpenWindows, true);
66 #elif defined TTK_WEBENGINE
67  QWebEngineSettings *settings = QWebEngineSettings::defaultSettings();
68  settings->setAttribute(QWebEngineSettings::PluginsEnabled, true);
69  settings->setAttribute(QWebEngineSettings::JavascriptEnabled, true);
70  settings->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, true);
71 #endif
72 
73  setAlignment(Qt::AlignCenter);
74  setStyleSheet(TTK::UI::WidgetStyle01);
75 
76  if(type != Module::Song && type != Module::None)
77  {
78  createWebViewer(type);
79  }
80  else
81  {
82  createKugouSongWidget(type == Module::Song);
83  }
84 }
85 
86 void QKugouWindow::setUrl(const QString &url)
87 {
89 #ifdef TTK_MINIBLINK
91  if(w)
92  {
93  w->setUrl(url);
94  }
95 #elif defined TTK_WEBKIT
96  QWebView *w = TTKObjectCast(QWebView*, d->m_webView);
97  if(w)
98  {
99  w->setUrl(url);
100  }
101 #elif defined TTK_WEBENGINE
102  QWebEngineView *w = TTKObjectCast(QWebEngineView*, d->m_webView);
103  if(w)
104  {
105  w->setUrl(url);
106  }
107 #else
108  Q_UNUSED(url);
109  Q_UNUSED(d);
110 #endif
111 }
112 
114 {
116 #ifdef TTK_MINIBLINK
118  if(w)
119  {
120  w->reload();
121  }
122 #elif defined TTK_WEBKIT
123  QWebView *w = TTKObjectCast(QWebView*, d->m_webView);
124  if(w)
125  {
126  w->reload();
127  }
128 #elif defined TTK_WEBENGINE
129  QWebEngineView *w = TTKObjectCast(QWebEngineView*, d->m_webView);
130  if(w)
131  {
132  w->reload();
133  }
134 #else
135  Q_UNUSED(d);
136 #endif
137 }
138 
140 {
141  if(index == 0)
142  {
143  TTK_D(const QKugouWindow);
144  const QList<QAbstractButton*> &buttons = d->m_buttonGroup->buttons();
145  buttons[index]->setStyleSheet(TTK::UI::PushButtonStyle02);
147  }
148  else
149  {
150  Q_EMIT buttonClicked(index + 5); // from kugou song submoudle
151  }
152 }
153 
155 {
157  delete d->m_webView;
158  d->m_webView = nullptr;
159 #ifdef TTK_MINIBLINK
161  {
162  Miniblink *view = new Miniblink(this);
163  d->m_webView = view;
164  }
165 #elif defined TTK_WEBKIT
166  QWebView *view = new QWebView(this);
167  view->page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
168  view->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
169  d->m_webView = view;
170 #elif defined TTK_WEBENGINE
171  QWebEngineView *view = new QWebEngineView(this);
172  d->m_webView = view;
173 #endif
174 }
175 
177 {
179  QVBoxLayout *layout = new QVBoxLayout(this);
180  layout->setSpacing(0);
181  layout->setContentsMargins(0, 0, 0, 0);
182 #if defined TTK_MINIBLINK || defined TTK_WEBKIT || defined TTK_WEBENGINE
183  createWebViewer();
184  if(d->m_webView)
185  {
186  layout->addWidget(d->m_webView);
187 
188  switch(type)
189  {
190  case Module::Radio: setUrl(QKugouUrl::makeRadioPublicUrl()); break;
191  case Module::Movie: setUrl(QKugouUrl::makeMovieRecommendUrl()); break;
192  case Module::Single: setUrl(QKugouUrl::makeKuiSheUrl()); break;
193  default: break;
194  }
195  }
196  else
197  {
198  QLabel *pix = new QLabel(this);
199  pix->setAlignment(Qt::AlignCenter);
200  pix->setPixmap(QPixmap(":/image/lb_no_module"));
201  layout->addWidget(pix);
202  }
203 #else
204  Q_UNUSED(d);
205  QLabel *pix = new QLabel(this);
206  pix->setAlignment(Qt::AlignCenter);
207  pix->setPixmap(QPixmap(":/image/lb_no_module"));
208  layout->addWidget(pix);
209 #endif
210  setLayout(layout);
211 }
212 
214 {
216  QVBoxLayout *layout = new QVBoxLayout(this);
217  layout->setSpacing(0);
218  layout->setContentsMargins(0, 0, 0, 0);
219 #if defined TTK_MINIBLINK || defined TTK_WEBKIT || defined TTK_WEBENGINE
220  d->m_topWidget = new QWidget(this);
221  d->m_topWidget->setFixedHeight(25);
222  d->m_topWidget->setStyleSheet(TTK::UI::PushButtonStyle01 + TTK::UI::WidgetStyle01);
223  QHBoxLayout *topLayout = new QHBoxLayout(d->m_topWidget);
224  topLayout->setContentsMargins(0, 0, 0, 0);
225  topLayout->setSpacing(25);
226 
227  d->m_buttonGroup = new QButtonGroup(this);
228  QPushButton *bt = new QPushButton(tr("Discovery"), d->m_topWidget);
229  bt->setCursor(QCursor(Qt::PointingHandCursor));
230  d->m_buttonGroup->addButton(bt, 0);
231  bt = new QPushButton(tr("Recommend"), d->m_topWidget);
232  bt->setCursor(QCursor(Qt::PointingHandCursor));
233  d->m_buttonGroup->addButton(bt, 1);
234  bt = new QPushButton(tr("Toplist"), d->m_topWidget);
235  bt->setCursor(QCursor(Qt::PointingHandCursor));
236  d->m_buttonGroup->addButton(bt, 2);
237  bt = new QPushButton(tr("Artists"), d->m_topWidget);
238  bt->setCursor(QCursor(Qt::PointingHandCursor));
239  d->m_buttonGroup->addButton(bt, 3);
240  bt = new QPushButton(tr("Category"), d->m_topWidget);
241  bt->setCursor(QCursor(Qt::PointingHandCursor));
242  d->m_buttonGroup->addButton(bt, 4);
243  QtButtonGroupConnect(d->m_buttonGroup, this, kugouSongIndexChanged, TTK_SLOT);
244 
245  topLayout->addStretch(1);
246  topLayout->addWidget(d->m_buttonGroup->button(0));
247  topLayout->addWidget(d->m_buttonGroup->button(1));
248  topLayout->addWidget(d->m_buttonGroup->button(2));
249  topLayout->addWidget(d->m_buttonGroup->button(3));
250  topLayout->addWidget(d->m_buttonGroup->button(4));
251  topLayout->addStretch(1);
252 
253 #ifdef Q_OS_UNIX
254  d->m_buttonGroup->button(0)->setFocusPolicy(Qt::NoFocus);
255  d->m_buttonGroup->button(1)->setFocusPolicy(Qt::NoFocus);
256  d->m_buttonGroup->button(2)->setFocusPolicy(Qt::NoFocus);
257  d->m_buttonGroup->button(3)->setFocusPolicy(Qt::NoFocus);
258  d->m_buttonGroup->button(4)->setFocusPolicy(Qt::NoFocus);
259 #endif
260 
261  layout->addWidget(d->m_topWidget);
262 
263  if(power)
264  {
265  createWebViewer();
266  if(d->m_webView)
267  {
268  layout->addWidget(d->m_webView);
269  }
270  else
271  {
272  QLabel *pix = new QLabel(this);
273  pix->setAlignment(Qt::AlignCenter);
274  pix->setPixmap(QPixmap(":/image/lb_no_module"));
275  layout->addWidget(pix);
276  }
277  }
278  else
279  {
280  QLabel *pix = new QLabel(this);
281  pix->setAlignment(Qt::AlignCenter);
282  pix->setPixmap(QPixmap(":/image/lb_no_power_mode"));
283  layout->addWidget(pix);
284  }
285 
287 #else
288  Q_UNUSED(d);
289  QLabel *pix = new QLabel(this);
290  pix->setAlignment(Qt::AlignCenter);
291  pix->setPixmap(QPixmap(":/image/lb_no_module"));
292  layout->addWidget(pix);
293 #endif
294  setLayout(layout);
295 }
static QString makeRadioPublicUrl() noexcept
Definition: qkugouurl.cpp:13
~QKugouWindowPrivate() noexcept
static QString makeMovieRecommendUrl() noexcept
Definition: qkugouurl.cpp:18
void createWebViewer()
void buttonClicked(int index)
static const QString PushButtonStyle01
PushButton.
QKugouWindowPrivate() noexcept
static const QString WidgetStyle01
Widget.
QButtonGroup * m_buttonGroup
static const QString PushButtonStyle02
QKugouWindow(Module type, QWidget *parent=nullptr)
The class of the kugou window widget.
Definition: qkugouwindow.h:30
void kugouSongIndexChanged(int index)
static QString makeKuiSheUrl() noexcept
Definition: qkugouurl.cpp:23
#define TTK_SLOT
Definition: ttkqtglobal.h:177
#define QtButtonGroupConnect(p, q, f, s)
Button group connect.
Definition: ttkqtcompat.h:101
The class of the kugou window widget private.
static QString makeSongRecommendUrl() noexcept
Definition: qkugouurl.cpp:8
void createKugouSongWidget(bool power)
#define TTK_INIT_PRIVATE(Class)
Definition: ttkprivate.h:33
The class of the ttk private base.
Definition: ttkprivate.h:48
void setUrl(const QString &url)
#define TTK_D(Class)
Definition: ttkprivate.h:41
#define TTKObjectCast(x, y)
Definition: ttkqtglobal.h:82