новые иконки в OpenBoard
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.
 
 
 
 
 
 
OpenBoard/src/gui/UBTBPageEditWidget.cpp

534 lines
15 KiB

#include "customWidgets/UBGlobals.h"
#include "core/UBApplication.h"
#include "frameworks/UBFileSystemUtils.h"
#include "gui/UBMediaPlayer.h"
#include "customWidgets/UBMediaWidget.h"
#include "UBTBPageEditWidget.h"
UBTBPageEditWidget::UBTBPageEditWidget(UBTeacherBarDataMgr *pDataMgr, QWidget *parent, const char *name):QWidget(parent)
, mpDataMgr(NULL)
, mpTitleLabel(NULL)
, mpTitle(NULL)
, mpMediaLabel(NULL)
, mpActionLabel(NULL)
, mpActions(NULL)
, mpActionButton(NULL)
, mpLinkLabel(NULL)
, mpLinks(NULL)
, mpLinkButton(NULL)
, mpCommentLabel(NULL)
, mpComments(NULL)
, mpDocumentEditbutton(NULL)
, mpPagePreviewButton(NULL)
, mpContainer(NULL)
{
Q_UNUSED(name);
mpDataMgr = pDataMgr;
mActions.clear();
mUrls.clear();
setAttribute(Qt::WA_StyledBackground, true);
setStyleSheet(UBApplication::globalStyleSheet());
mClearingFields = false;
mLayout.setContentsMargins(0, 0, 0, 0);
setLayout(&mLayout);
mpContainer = new QWidget(this);
mpContainer->setObjectName("DockPaletteWidgetBox");
mpContainer->setLayout(&mContainerLayout);
mLayout.addWidget(mpContainer, 1);
// Title
mpTitleLabel = new QLabel(tr("Title"), mpContainer);
mpTitle = new QLineEdit(mpContainer);
mpTitle->setObjectName("DockPaletteWidgetLineEdit");
mContainerLayout.addWidget(mpTitleLabel, 0);
mContainerLayout.addWidget(mpTitle, 0);
// Actions
mpActionLabel = new QLabel(tr("Actions"), mpContainer);
mContainerLayout.addWidget(mpActionLabel, 0);
mpActions = new UBWidgetList(mpContainer);
mpActions->setEmptyText(tr("Add actions"));
mContainerLayout.addWidget(mpActions, 1);
mpActionButton = new QPushButton(mpContainer);
mpActionButton->setObjectName("DockPaletteWidgetButton");
mpActionButton->setText(tr("Add action"));
mActionLayout.addWidget(mpActionButton, 0);
mActionLayout.addStretch(1);
mContainerLayout.addLayout(&mActionLayout, 0);
// Media
mpMediaLabel = new QLabel(tr("Medias"), mpContainer);
mContainerLayout.addWidget(mpMediaLabel, 0);
mpMediaContainer = new UBTBMediaContainer(mpContainer);
mpMediaContainer->setEmptyText(tr("Drop media here"));
mContainerLayout.addWidget(mpMediaContainer, 1);
// Links
mpLinkLabel = new QLabel(tr("Links"), mpContainer);
mContainerLayout.addWidget(mpLinkLabel, 0);
mpLinks = new UBWidgetList(mpContainer);
mContainerLayout.addWidget(mpLinks, 1);
mpLinkButton = new QPushButton(tr("Add link"), mpContainer);
mpLinkButton->setObjectName("DockPaletteWidgetButton");
mLinkLayout.addWidget(mpLinkButton, 0);
mLinkLayout.addStretch(1);
mContainerLayout.addLayout(&mLinkLayout, 0);
// Comments
mpCommentLabel = new QLabel(tr("Comments"), mpContainer);
mContainerLayout.addWidget(mpCommentLabel, 0);
mpComments = new QTextEdit(mpContainer);
mpComments->setObjectName("DockPaletteWidgetBox");
mpComments->setStyleSheet("background:white;");
mContainerLayout.addWidget(mpComments, 1);
mpPagePreviewButton = new QPushButton(tr("Preview"), this);
mpPagePreviewButton->setObjectName("DockPaletteWidgetButton");
mpDocumentEditbutton = new QPushButton(tr("Document View"), this);
mpDocumentEditbutton->setObjectName("DockPaletteWidgetButton");
mPagePreviewLayout.addWidget(mpDocumentEditbutton, 0);
mPagePreviewLayout.addWidget(mpPagePreviewButton, 0);
mPagePreviewLayout.addStretch(1);
mLayout.addLayout(&mPagePreviewLayout, 0);
connect(mpTitle, SIGNAL(textChanged(QString)), this, SLOT(onTitleChanged()));
connect(mpComments, SIGNAL(textChanged()), this, SLOT(onCommentsChanged()));
connect(mpActionButton, SIGNAL(clicked()), this, SLOT(onActionButton()));
connect(mpLinkButton, SIGNAL(clicked()), this, SLOT(onLinkButton()));
connect(mpDocumentEditbutton, SIGNAL(clicked()), this, SLOT(onDocumentEditClicked()));
connect(mpPagePreviewButton, SIGNAL(clicked()), this, SLOT(onPagePreviewClicked()));
connect(mpMediaContainer, SIGNAL(mediaDropped(QString)), this, SLOT(onMediaDropped(QString)));
}
UBTBPageEditWidget::~UBTBPageEditWidget()
{
DELETEPTR(mpDocumentEditbutton);
DELETEPTR(mpPagePreviewButton);
DELETEPTR(mpComments);
DELETEPTR(mpCommentLabel);
DELETEPTR(mpLinks);
DELETEPTR(mpLinkLabel);
DELETEPTR(mpLinkButton);
DELETEPTR(mpMediaLabel);
DELETEPTR(mpActionButton);
DELETEPTR(mpActionLabel);
DELETEPTR(mpTitleLabel);
DELETEPTR(mpTitle);
}
void UBTBPageEditWidget::onTitleChanged()
{
if(!mClearingFields){
mpDataMgr->setPageTitle(mpTitle->text());
emit valueChanged();
}
}
void UBTBPageEditWidget::onCommentsChanged()
{
if(!mClearingFields){
mpDataMgr->setComments(mpComments->document()->toPlainText());
emit valueChanged();
}
}
void UBTBPageEditWidget::onActionButton()
{
UBTeacherStudentAction* pAction = new UBTeacherStudentAction(this);
mActions << pAction;
mpActions->addWidget(pAction);
emit valueChanged();
}
void UBTBPageEditWidget::onLinkButton()
{
UBUrlWidget* pUrl = new UBUrlWidget(this);
mUrls << pUrl;
mpLinks->addWidget(pUrl);
emit valueChanged();
}
void UBTBPageEditWidget::onMediaDropped(const QString &url)
{
if("" != url){
QWidget* pMedia = mpMediaContainer->generateMediaWidget(url);
if(NULL != pMedia){
mMedias << pMedia;
mMediaUrls << url;
//mpDataMgr->medias()->append(pMedia);
//mpDataMgr->addMediaUrl(url);
mpMediaContainer->addWidget(pMedia);
emit valueChanged();
}
}
}
void UBTBPageEditWidget::onDocumentEditClicked()
{
emit changeTBState(eTeacherBarState_DocumentEdit);
}
void UBTBPageEditWidget::onPagePreviewClicked()
{
emit changeTBState(eTeacherBarState_PagePreview);
}
void UBTBPageEditWidget::saveFields()
{
mpDataMgr->actions()->clear();
mpDataMgr->urls()->clear();
mpDataMgr->mediaUrls()->clear();
mpDataMgr->medias()->clear();
foreach(UBTeacherStudentAction* pAct, mActions){
sAction action;
action.type = pAct->comboValue().toInt();
action.content = pAct->text();
mpDataMgr->actions()->append(action);
}
foreach(UBUrlWidget* pUrl, mUrls){
sLink link;
link.title = pUrl->title();
link.link = pUrl->url();
mpDataMgr->urls()->append(link);
}
foreach(QString url, mMediaUrls){
qDebug() << "saving media :" << url;
mpDataMgr->mediaUrls()->append(url);
}
foreach(QWidget* pMedia, mMedias){
mpDataMgr->medias()->append(pMedia);
}
}
void UBTBPageEditWidget::updateFields()
{
// Title
mpTitle->setText(mpDataMgr->pageTitle());
// Actions
foreach(sAction action, *mpDataMgr->actions()){
UBTeacherStudentAction* pAction = new UBTeacherStudentAction(this);
pAction->setComboValue(action.type);
pAction->setText(action.content);
mActions << pAction;
mpActions->addWidget(pAction);
}
// Medias
foreach(QString url, *mpDataMgr->mediaUrls()){
if(!url.isEmpty()){
mMediaUrls << url;
QWidget* pWidget = mpMediaContainer->generateMediaWidget(url);
if(pWidget != NULL){
mMedias << pWidget;
mpMediaContainer->addWidget(pWidget);
}
}
}
// Links
foreach(sLink link, *mpDataMgr->urls()){
UBUrlWidget* urlWidget = new UBUrlWidget(this);
urlWidget->setTitle(link.title);
urlWidget->setUrl(link.link);
mUrls << urlWidget;
mpLinks->addWidget(urlWidget);
}
// Comments
mpComments->document()->setPlainText(mpDataMgr->comments());
}
void UBTBPageEditWidget::clearFields()
{
mClearingFields = true;
// Title
mpTitle->setText("");
// Actions
foreach(UBTeacherStudentAction* pAction, mActions){
mpActions->removeWidget(pAction);
DELETEPTR(pAction);
}
mActions.clear();
// Medias
foreach(QWidget* pMedia, mMedias){
if(NULL != pMedia){
mpMediaContainer->removeWidget(pMedia);
DELETEPTR(pMedia);
}
}
mMedias.clear();
mMediaUrls.clear();
// Links
foreach(UBUrlWidget* pLink, mUrls){
mpLinks->removeWidget(pLink);
DELETEPTR(pLink);
}
mUrls.clear();
// Comments
mpComments->setText("");
mClearingFields = false;
}
// ---------------------------------------------------------------------------------------------
UBUrlWidget::UBUrlWidget(QWidget *parent, const char *name):QWidget(parent)
, mpLayout(NULL)
, mpUrlLabel(NULL)
, mpUrl(NULL)
{
setObjectName(name);
setAttribute(Qt::WA_StyledBackground, true);
setStyleSheet(UBApplication::globalStyleSheet());
mpLayout = new QVBoxLayout(this);
setLayout(mpLayout);
mpLabelLayout = new QHBoxLayout(0);
mpUrlLabel = new QLabel(tr("Url"), this);
mpLabelLayout->addWidget(mpUrlLabel, 0);
mpUrl = new QLineEdit(this);
mpUrl->setObjectName("DockPaletteWidgetLineEdit");
mpUrl->setMinimumHeight(20);
mpLabelLayout->addWidget(mpUrl, 1);
mpTitleLayout = new QHBoxLayout(0);
mpTitleLabel = new QLabel(tr("Title"),this);
mpTitleLayout->addWidget(mpTitleLabel,0);
mpTitle = new QLineEdit(this);
mpTitle->setObjectName("DockPaletteWidgetLineEdit");
mpTitle->setMinimumHeight(20);
mpTitleLayout->addWidget(mpTitle,1);
mpLayout->addLayout(mpTitleLayout);
mpLayout->addLayout(mpLabelLayout);
}
UBUrlWidget::~UBUrlWidget()
{
DELETEPTR(mpTitle);
DELETEPTR(mpTitleLabel);
DELETEPTR(mpUrlLabel);
DELETEPTR(mpUrl);
DELETEPTR(mpTitleLayout);
DELETEPTR(mpLabelLayout);
DELETEPTR(mpLayout);
}
QString UBUrlWidget::url()
{
QString str;
if(NULL != mpUrl){
str = mpUrl->text();// + ";" + mpTitle->text();
}
return str;
}
void UBUrlWidget::setUrl(const QString &url)
{
if(NULL != mpUrl){
mpUrl->setText(url);
}
}
// ------------------------------------------------------------------------------------------------------------------------------------
UBTBMediaContainer::UBTBMediaContainer(QWidget *parent, const char *name) : UBWidgetList(parent)
{
setObjectName(name);
setAcceptDrops(true);
}
UBTBMediaContainer::~UBTBMediaContainer()
{
}
void UBTBMediaContainer::dropEvent(QDropEvent* pEvent)
{
QPixmap pixFromDropEvent;
QString mimeType;
QString resourcePath;
if(pEvent->mimeData()->hasText()){
resourcePath = pEvent->mimeData()->text();
}
else if(pEvent->mimeData()->hasUrls()){
resourcePath = pEvent->mimeData()->urls().at(0).toLocalFile();
}
else if(pEvent->mimeData()->hasImage()){
pixFromDropEvent.loadFromData(pEvent->mimeData()->imageData().toByteArray());
if(!pixFromDropEvent.isNull())
mimeType = "image";
}
if (mimeType.isEmpty() && resourcePath.isEmpty()){
pEvent->acceptProposedAction();
return;
}
if(!resourcePath.isEmpty()){
emit mediaDropped(resourcePath);
pEvent->acceptProposedAction();
}
}
void UBTBMediaContainer::dragEnterEvent(QDragEnterEvent* pEvent)
{
pEvent->acceptProposedAction();
}
void UBTBMediaContainer::dragMoveEvent(QDragMoveEvent* pEvent)
{
pEvent->acceptProposedAction();
}
void UBTBMediaContainer::dragLeaveEvent(QDragLeaveEvent* pEvent)
{
pEvent->accept();
}
void UBTBMediaContainer::addMedia(const QString& mediaPath)
{
if(!mediaPath.isEmpty())
mMediaList.append(mediaPath);
else
qWarning() << __FUNCTION__ << "empty path";
QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(mediaPath);
if(mimeType.contains("image")){
QPixmap pix = QPixmap(mediaPath);
QLabel* label = new QLabel();
label->setPixmap(pix);
label->setScaledContents(true);
addWidget(label);
}
else if(mimeType.contains("video") || mimeType.contains("audio")){
UBMediaPlayer* mediaPlayer = new UBMediaPlayer();
mediaPlayer->setFile(mediaPath);
addWidget(mediaPlayer);
}
else{
qWarning() << "pMediaPath" << mediaPath;
qWarning() << "bad idea to come here";
}
}
QStringList UBTBMediaContainer::mediaUrls()
{
return mMediaList;
}
void UBTBMediaContainer::cleanMedias()
{
mMediaList.clear();
}
QWidget* UBTBMediaContainer::generateMediaWidget(const QString& url)
{
QWidget* pW = NULL;
if(!url.isEmpty())
mMediaList.append(url);
else
qWarning() << __FUNCTION__ << "empty path";
QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(url);
if(mimeType.contains("image")){
QPixmap pix = QPixmap(url);
QLabel* label = new QLabel();
pix.scaledToWidth(label->width());
label->resize(pix.width(), pix.height());
label->setPixmap(pix);
label->setScaledContents(true);
pW = label;
}
else if(mimeType.contains("video") || mimeType.contains("audio")){
UBMediaWidget* mediaPlayer = new UBMediaWidget(mimeType.contains("audio")?eMediaType_Audio:eMediaType_Video);
mediaPlayer->setFile(url);
pW = mediaPlayer;
}
else{
qWarning() << "pMediaPath" << url;
qWarning() << "bad idea to come here";
}
return pW;
}
UBTeacherStudentAction::UBTeacherStudentAction(QWidget *parent, const char *name):QWidget(parent)
, mpText(NULL)
, mpLayout(NULL)
, mpComboLayout(NULL)
, mpCombo(NULL)
{
setObjectName(name);
setAttribute(Qt::WA_StyledBackground, true);
setStyleSheet(UBApplication::globalStyleSheet());
// Create the GUI
mpLayout = new QHBoxLayout(this);
setLayout(mpLayout);
mpComboLayout = new QVBoxLayout();
mpCombo = new QComboBox(this);
mpCombo->setObjectName("DockPaletteWidgetComboBox");
mpCombo->setMinimumWidth(80);
mpCombo->addItem(tr("Teacher"));
mpCombo->addItem(tr("Student"));
mpComboLayout->addWidget(mpCombo, 0);
mpComboLayout->addStretch(1);
mpLayout->addLayout(mpComboLayout, 0);
mpText = new QTextEdit(this);
mpText->setObjectName("DockPaletteWidgetBox");
mpText->setStyleSheet("background:white;");
mpLayout->addWidget(mpText, 1);
}
UBTeacherStudentAction::~UBTeacherStudentAction()
{
DELETEPTR(mpCombo);
DELETEPTR(mpText);
DELETEPTR(mpComboLayout);
DELETEPTR(mpLayout);
}
QString UBTeacherStudentAction::text()
{
QString str;
if(NULL != mpText){
str = mpText->document()->toPlainText();
}
return str;
}
QString UBTeacherStudentAction::comboValue()
{
QString str;
if(NULL != mpCombo){
str = QString("%0").arg(mpCombo->currentIndex());
}
return str;
}
void UBTeacherStudentAction::setComboValue(int value)
{
if(NULL != mpCombo){
mpCombo->setCurrentIndex(value);
}
}
void UBTeacherStudentAction::setText(const QString& text)
{
if(NULL != mpText){
mpText->document()->setPlainText(text);
}
}