You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
3.6 KiB
148 lines
3.6 KiB
#include "../../maininterface/mainctx.hpp"
|
|
|
|
#include <QQuickWindow>
|
|
#include <QSGImageNode>
|
|
|
|
#include "csdthemeimage.hpp"
|
|
|
|
|
|
CSDThemeImage::CSDThemeImage(QQuickItem *parent)
|
|
: QQuickItem(parent)
|
|
{
|
|
setFlag(ItemHasContents, true);
|
|
m_imageSet.resize(VLC_QT_THEME_BUTTON_STATE_COUNT);
|
|
connect(this, &CSDThemeImage::requestContentUpdate, this, &CSDThemeImage::updateContent, Qt::QueuedConnection);
|
|
}
|
|
|
|
void CSDThemeImage::updateContent()
|
|
{
|
|
for (int i = 0; i < VLC_QT_THEME_BUTTON_STATE_COUNT; i++)
|
|
{
|
|
m_imageSet[i] = m_theme->getCSDImage(
|
|
static_cast<vlc_qt_theme_csd_button_type>(m_buttonType),
|
|
static_cast<vlc_qt_theme_csd_button_state>(i),
|
|
m_maximized, m_active, m_bannerHeight);
|
|
}
|
|
m_needContentUpdate = false;
|
|
m_stateUpdated = true;
|
|
update();
|
|
}
|
|
|
|
QSGNode* CSDThemeImage::updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData*)
|
|
{
|
|
QSGImageNode *imageNode = nullptr;
|
|
auto w = window();
|
|
if (!m_theme || m_bannerHeight <= 0)
|
|
{
|
|
if (oldNode)
|
|
delete oldNode;
|
|
return nullptr;
|
|
}
|
|
|
|
if (!oldNode)
|
|
{
|
|
imageNode = w->createImageNode();
|
|
imageNode->setOwnsTexture(true);
|
|
m_stateUpdated = true;
|
|
}
|
|
else
|
|
{
|
|
imageNode = static_cast<QSGImageNode*>(oldNode);
|
|
}
|
|
|
|
if (m_stateUpdated)
|
|
{
|
|
const QImage& image = m_imageSet[m_buttonState];
|
|
if (image.isNull())
|
|
{
|
|
delete imageNode;
|
|
return nullptr;
|
|
}
|
|
|
|
setImplicitSize(image.width(), image.height());
|
|
|
|
QQuickWindow::CreateTextureOptions flags = image.hasAlphaChannel()
|
|
? QQuickWindow::TextureHasAlphaChannel
|
|
: QQuickWindow::TextureIsOpaque;
|
|
flags |= QQuickWindow::TextureCanUseAtlas;
|
|
|
|
imageNode->setTexture(window()->createTextureFromImage(image, flags));
|
|
|
|
m_stateUpdated = false;
|
|
}
|
|
|
|
if (!imageNode->texture())
|
|
{
|
|
delete imageNode;
|
|
return nullptr;
|
|
}
|
|
|
|
imageNode->setRect(boundingRect());
|
|
imageNode->setFiltering(smooth() ? QSGTexture::Linear : QSGTexture::Nearest);
|
|
return imageNode;
|
|
}
|
|
|
|
void CSDThemeImage::setWindowActive(bool active)
|
|
{
|
|
if (m_active == active)
|
|
return;
|
|
m_active = active;
|
|
emit windowActiveChanged();
|
|
onConfigChanged();
|
|
}
|
|
|
|
void CSDThemeImage::setWindowMaximized(bool maximized)
|
|
{
|
|
if (m_maximized == maximized)
|
|
return;
|
|
m_maximized = maximized;
|
|
emit windowMaximizedChanged();
|
|
onConfigChanged();
|
|
}
|
|
|
|
void CSDThemeImage::setTheme(SystemPalette* val)
|
|
{
|
|
if (val == m_theme)
|
|
return;
|
|
if (m_theme)
|
|
disconnect(m_theme, &SystemPalette::hasCSDImageChanged, this, &CSDThemeImage::onConfigChanged);
|
|
m_theme = val;
|
|
if (m_theme)
|
|
connect(m_theme, &SystemPalette::hasCSDImageChanged, this, &CSDThemeImage::onConfigChanged);
|
|
emit themeChanged();
|
|
onConfigChanged();
|
|
}
|
|
void CSDThemeImage::setButtonType(ButtonType val)
|
|
{
|
|
if (val == m_buttonType)
|
|
return;
|
|
m_buttonType = val;
|
|
emit buttonTypeChanged();
|
|
onConfigChanged();
|
|
}
|
|
void CSDThemeImage::setButtonState(ButtonState val)
|
|
{
|
|
if (val == m_buttonState)
|
|
return;
|
|
m_buttonState = val;
|
|
m_stateUpdated = true;
|
|
emit buttonStateChanged();
|
|
update();
|
|
}
|
|
void CSDThemeImage::setBannerHeight(int val)
|
|
{
|
|
if (val == m_bannerHeight)
|
|
return;
|
|
m_bannerHeight = val;
|
|
emit bannerHeightChanged();
|
|
onConfigChanged();
|
|
}
|
|
|
|
void CSDThemeImage::onConfigChanged()
|
|
{
|
|
if (!m_needContentUpdate)
|
|
{
|
|
m_needContentUpdate = true;
|
|
emit requestContentUpdate();
|
|
}
|
|
}
|
|
|