You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Tools/News/NewsShared/Qt/ArticleView.cpp

160 lines
5.3 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include "ArticleView.h"
#include <AzQtComponents/Components/ExtendedLabel.h>
AZ_PUSH_DISABLE_WARNING(4251, "-Wunknown-warning-option") // 4251: '...' needs to have dll-interface to be used by clients of class '...'
#include "NewsShared/ResourceManagement/ArticleDescriptor.h"
#include "NewsShared/Qt/ui_ArticleView.h"
#include "NewsShared/Qt/ui_PinnedArticleView.h"
#include "NewsShared/ResourceManagement/ResourceManifest.h"
#include "NewsShared/ResourceManagement/Resource.h"
#include <QDesktopServices>
#include <QUrl>
AZ_POP_DISABLE_WARNING
using namespace News;
ArticleView::ArticleView(
QWidget* parent,
const ArticleDescriptor& article,
const ResourceManifest& manifest)
: QWidget(parent)
, m_pArticle(new ArticleDescriptor(article))
, m_manifest(manifest)
, m_icon(nullptr)
{
}
void ArticleView::Update()
{
Q_ASSERT(m_widgetImageFrame && m_widgetTitle && m_widgetBody);
auto pResource = m_manifest.FindById(m_pArticle->GetResource().GetId());
m_pArticle.reset();
if (pResource)
{
m_pArticle = QSharedPointer<ArticleDescriptor>(new ArticleDescriptor(*pResource));
m_widgetTitle->setText(m_pArticle->GetTitle());
m_widgetBody->setText(m_pArticle->GetBody());
auto pImageResource = m_manifest.FindById(m_pArticle->GetImageId());
if (pImageResource)
{
QPixmap pixmap;
if (pixmap.loadFromData(pImageResource->GetData()))
{
if (!m_icon)
{
m_icon = new AzQtComponents::ExtendedLabel(this);
m_icon->setStyleSheet("border: none;");
m_icon->setAlignment(Qt::AlignCenter);
static_cast<QVBoxLayout*>(
m_widgetImageFrame->layout())->insertWidget(0, m_icon);
connect(m_icon, &AzQtComponents::ExtendedLabel::clicked, this, &ArticleView::articleSelectedSlot);
}
m_icon->setPixmap(pixmap.scaled(m_widgetImageFrame->minimumWidth(),
m_widgetImageFrame->minimumHeight(),
Qt::KeepAspectRatioByExpanding));
}
else
{
RemoveIcon();
}
}
else
{
RemoveIcon();
}
}
}
void ArticleView::mousePressEvent([[maybe_unused]] QMouseEvent* event)
{
articleSelectedSlot();
}
void ArticleView::RemoveIcon()
{
if (m_icon)
{
delete m_icon;
m_icon = nullptr;
}
}
void ArticleView::linkActivatedSlot(const QString& link)
{
QDesktopServices::openUrl(QUrl(link));
Q_EMIT linkActivatedSignal(link);
}
void ArticleView::articleSelectedSlot()
{
Q_EMIT articleSelectedSignal(m_pArticle->GetResource().GetId());
}
QSharedPointer<const ArticleDescriptor> ArticleView::GetArticle() const
{
return m_pArticle;
}
void ArticleView::SetupViewWidget(QFrame* widgetImageFrame, AzQtComponents::ExtendedLabel* widgetTitle, AzQtComponents::ExtendedLabel* widgetBody)
{
Q_ASSERT(m_widgetImageFrame == nullptr && m_widgetTitle == nullptr && m_widgetBody == nullptr);
m_widgetImageFrame = widgetImageFrame;
m_widgetTitle = widgetTitle;
m_widgetBody = widgetBody;
connect(m_widgetTitle, &QLabel::linkActivated, this, &ArticleView::linkActivatedSlot);
connect(m_widgetBody, &QLabel::linkActivated, this, &ArticleView::linkActivatedSlot);
connect(m_widgetTitle, &AzQtComponents::ExtendedLabel::clicked, this, &ArticleView::articleSelectedSlot);
connect(m_widgetBody, &AzQtComponents::ExtendedLabel::clicked, this, &ArticleView::articleSelectedSlot);
Q_ASSERT(m_widgetImageFrame && m_widgetTitle && m_widgetBody);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// ArticleViewDefaultWidget
////////////////////////////////////////////////////////////////////////////////////////////////////
ArticleViewDefaultWidget::ArticleViewDefaultWidget(QWidget* parent,
const ArticleDescriptor& article,
const ResourceManifest& manifest)
: ArticleView(parent, article, manifest)
, m_ui(new Ui::ArticleViewWidget())
{
m_ui->setupUi(this);
SetupViewWidget(m_ui->imageFrame, m_ui->titleLabel, m_ui->bodyLabel);
Update();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// ArticleViewPinnedWidget
////////////////////////////////////////////////////////////////////////////////////////////////////
ArticleViewPinnedWidget::ArticleViewPinnedWidget(QWidget* parent,
const ArticleDescriptor& article,
const ResourceManifest& manifest)
: ArticleView(parent, article, manifest)
, m_ui(new Ui::PinnedArticleViewWidget())
{
m_ui->setupUi(this);
SetupViewWidget(m_ui->imageFrame, m_ui->titleLabel, m_ui->bodyLabel);
Update();
}
#include "NewsShared/Qt/moc_ArticleView.cpp"