/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "UBTeacherGuideWidgetsTools.h"
#include "globals/UBGlobals.h"
#include "frameworks/UBFileSystemUtils.h"
/***************************************************************************
* class UBAddItem *
***************************************************************************/
UBAddItem::UBAddItem(const QString &string, int addSubItemWidgetType, QTreeWidget* parent): QTreeWidgetItem(parent)
{
setIcon(0,QIcon(":images/increase.svg"));
setText(0,string);
setData(0,Qt::UserRole,QVariant(addSubItemWidgetType));
setData(1,Qt::UserRole,QVariant(addSubItemWidgetType));
}
UBAddItem::~UBAddItem()
{
//NOOP
}
/***************************************************************************
* class UBTGActionWidget *
***************************************************************************/
UBTGActionWidget::UBTGActionWidget(QTreeWidgetItem* widget, QWidget* parent, const char* name) : QWidget(parent)
, mpLayout(NULL)
, mpOwner(NULL)
, mpTask(NULL)
{
setObjectName(name);
mpLayout = new QVBoxLayout(this);
mpOwner = new QComboBox(this);
QStringList qslOwner;
qslOwner << tr("Teacher") << tr("Student");
mpOwner->insertItems(0,qslOwner);
mpOwner->setCurrentIndex(0);
connect(mpOwner,SIGNAL(currentIndexChanged(int)),this,SLOT(onOwnerChange(int)));
mpTask = new UBTGAdaptableText(widget,this);
mpTask->setAcceptRichText(true);
mpTask->setTextColor(QColor().green());
mpTask->setObjectName("ActionWidgetTaskTextEdit");
mpLayout->addWidget(mpOwner,0);
mpLayout->addWidget(mpTask,1);
setStyleSheet( "QWidget {background-color: white}");
}
UBTGActionWidget::~UBTGActionWidget()
{
DELETEPTR(mpOwner);
DELETEPTR(mpTask);
DELETEPTR(mpLayout);
}
void UBTGActionWidget::onOwnerChange(int ownerId)
{
if(ownerId == 0)
mpTask->setTextColor(QColor().red());
else
mpTask->setTextColor(QColor().green());
}
tUBGEElementNode* UBTGActionWidget::saveData()
{
tUBGEElementNode* result = new tUBGEElementNode();
result->type = "action";
result->attributes.insert("owner",QString(mpOwner->currentIndex()));
result->attributes.insert("task",mpTask->toPlainText());
return result;
}
/***************************************************************************
* class UBTGAdaptableText *
***************************************************************************/
UBTGAdaptableText::UBTGAdaptableText(QTreeWidgetItem* widget, QWidget* parent, const char* name):QTextEdit(parent)
, mBottomMargin(5)
, mpTreeWidgetItem(widget)
{
setObjectName(name);
setStyleSheet( "QWidget {background-color: white}");
connect(this,SIGNAL(textChanged()),this,SLOT(onTextChanged()));
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
}
void UBTGAdaptableText::onTextChanged()
{
setFixedHeight(document()->size().height()+mBottomMargin);
updateGeometry();
//to trig the widget item to resize it
if(mpTreeWidgetItem){
mpTreeWidgetItem->setExpanded(false);
mpTreeWidgetItem->setExpanded(true);
setFocus();
}
}
void UBTGAdaptableText::showText(const QString & text)
{
setText(text);
//A first rendering has to be done to calculate the text's size.
show();
hide();
setReadOnly(true);
onTextChanged();
}
void UBTGAdaptableText::bottomMargin(int newValue)
{
mBottomMargin = newValue;
onTextChanged();
}
/***************************************************************************
* class UBTGMediaWidget *
***************************************************************************/
UBTGMediaWidget::UBTGMediaWidget(QTreeWidgetItem* widget, QWidget* parent,const char* name): QStackedWidget(parent)
, mpTreeWidgetItem(widget)
, mpDropMeWidget(NULL)
, mpWorkWidget(NULL)
, mpLayout(NULL)
, mpTitle(NULL)
, mpMediaLabelWidget(NULL)
, mpMediaWidget(NULL)
, mpWebView(NULL)
, mRelativePath(QString(""))
, mIsPresentationMode(false)
{
setObjectName(name);
setStyleSheet( "QWidget {background-color: white}");
mpDropMeWidget = new QLabel();
mpDropMeWidget->setText(tr("drop media here ..."));
mpDropMeWidget->setAlignment(Qt::AlignCenter);
setAcceptDrops(true);
addWidget(mpDropMeWidget);
setMinimumHeight(40);
}
UBTGMediaWidget::UBTGMediaWidget(QString relativePath, QTreeWidgetItem* widget, QWidget* parent,const char* name): QStackedWidget(parent)
, mpTreeWidgetItem(widget)
, mpDropMeWidget(NULL)
, mpWorkWidget(NULL)
, mpLayout(NULL)
, mpTitle(NULL)
, mpMediaLabelWidget(NULL)
, mpMediaWidget(NULL)
, mpWebView(NULL)
, mRelativePath(relativePath)
, mIsPresentationMode(true)
{
setObjectName(name);
setAcceptDrops(false);
createWorkWidget(mRelativePath);
}
UBTGMediaWidget::~UBTGMediaWidget()
{
DELETEPTR(mpTitle);
DELETEPTR(mpMediaLabelWidget);
DELETEPTR(mpMediaWidget);
DELETEPTR(mpWebView);
DELETEPTR(mpLayout);
removeWidget(mpDropMeWidget);
DELETEPTR(mpDropMeWidget);
removeWidget(mpWorkWidget);
DELETEPTR(mpWorkWidget);
}
tUBGEElementNode* UBTGMediaWidget::saveData()
{
tUBGEElementNode* result = new tUBGEElementNode();
result->type = "media";
result->attributes.insert("title",mpTitle->toPlainText());
result->attributes.insert("relativePath",mRelativePath);
return result;
}
void UBTGMediaWidget::dragEnterEvent(QDragEnterEvent *event)
{
event->accept();
}
void UBTGMediaWidget::createWorkWidget(QString& path)
{
QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(path);
qDebug() << mimeType;
bool setMedia = true;
if(mimeType.contains("audio") || mimeType.contains("video")){
mpMediaWidget = new UBMediaWidget(mimeType.contains("audio")?eMediaType_Audio:eMediaType_Video);
mpMediaWidget->setFile(path);
}
else if(mimeType.contains("image")){
mpMediaLabelWidget = new QLabel();
mpMediaLabelWidget->setPixmap(QPixmap(QUrl(path).toLocalFile()));
mpMediaLabelWidget->setScaledContents(true);
}
else if(mimeType.contains("application")){
mpWebView = new QWebView(0);
mpWebView->setAcceptDrops(false);
mpWebView->settings()->setAttribute(QWebSettings::JavaEnabled, true);
mpWebView->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
mpWebView->settings()->setAttribute(QWebSettings::LocalStorageDatabaseEnabled, true);
mpWebView->settings()->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, true);
mpWebView->settings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true);
mpWebView->settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, true);
mpWebView->settings()->setAttribute(QWebSettings::DnsPrefetchEnabled, true);
mpWebView->load(QUrl(path));
mpWebView->show();
}
else{
qDebug() << "createWorkWidget mime type not handled" << mimeType;
setMedia=false;
}
if(setMedia){
mRelativePath = path;
setAcceptDrops(false);
mpWorkWidget = new QWidget(this);
mpLayout = new QVBoxLayout(mpWorkWidget);
if(!mIsPresentationMode){
mpTitle = new UBTGAdaptableText(mpTreeWidgetItem,mpWorkWidget);
mpLayout->addWidget(mpTitle);
}
if(mpMediaLabelWidget){
mpMediaLabelWidget->setParent(mpWorkWidget);
mpLayout->addWidget(mpMediaLabelWidget);
}
else if (mpMediaWidget){
mpMediaWidget->setParent(mpWorkWidget);
mpLayout->addWidget(mpMediaWidget);
}
else if (mpWebView){
mpWebView->setParent(mpWorkWidget);
mpLayout->addWidget(mpWebView);
}
addWidget(mpWorkWidget);
setCurrentWidget(mpWorkWidget);
updateSize();
}
}
void UBTGMediaWidget::parseMimeData(const QMimeData* pMimeData)
{
QString path;
if(pMimeData){
if(pMimeData->hasText()){
path = QUrl::fromLocalFile(pMimeData->text()).toString();
}
else if(pMimeData->hasUrls()){
path = pMimeData->urls().at(0).toString();
}
else if(pMimeData->hasImage()){
qDebug() << "Not yet implemented";
}
}
else
qDebug() << "No mime data present";
createWorkWidget(path);
QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(path);
qDebug() << mimeType;
}
void UBTGMediaWidget::dropEvent(QDropEvent* event)
{
parseMimeData(event->mimeData());
event->accept();
}
void UBTGMediaWidget::mousePressEvent(QMouseEvent *event)
{
if (!mIsPresentationMode)
event->ignore();
else{
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
QList urlList;
urlList << QUrl(mRelativePath);
mimeData->setUrls(urlList);
drag->setMimeData(mimeData);
drag->exec();
event->accept();
}
}
void UBTGMediaWidget::updateSize()
{
if(mpTreeWidgetItem){
mpTreeWidgetItem->setExpanded(false);
mpTreeWidgetItem->setExpanded(true);
if(!mIsPresentationMode)
mpTitle->setFocus();
}
}
/***************************************************************************
* class UBTGUrlWdiget *
***************************************************************************/
UBTGUrlWidget::UBTGUrlWidget(QWidget* parent, const char* name ):QWidget(parent)
, mpLayout(NULL)
, mpTitle(NULL)
, mpUrl(NULL)
{
setObjectName(name);
setStyleSheet( "QWidget {background-color: white}");
mpLayout = new QVBoxLayout(this);
mpTitle = new QLineEdit("title",this);
mpUrl = new QLineEdit("url",this);
mpLayout->addWidget(mpTitle);
mpLayout->addWidget(mpUrl);
}
UBTGUrlWidget::~UBTGUrlWidget()
{
DELETEPTR(mpTitle);
DELETEPTR(mpUrl);
DELETEPTR(mpLayout);
}
tUBGEElementNode* UBTGUrlWidget::saveData()
{
tUBGEElementNode* result = new tUBGEElementNode();
result->type = "link";
result->attributes.insert("title",mpTitle->text());
result->attributes.insert("url",mpUrl->text());
return result;
}