|
|
|
/*
|
|
|
|
* 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 2 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 <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <QTreeWidget>
|
|
|
|
#include <QVBoxLayout>
|
|
|
|
#include <QComboBox>
|
|
|
|
#include <QColor>
|
|
|
|
#include <QLabel>
|
|
|
|
#include <QDebug>
|
|
|
|
#include <QUrl>
|
|
|
|
#include <QWebSettings>
|
|
|
|
#include <QApplication>
|
|
|
|
#include <QDomElement>
|
|
|
|
#include <QWebFrame>
|
|
|
|
#include <QTextDocument>
|
|
|
|
#include <QTextBlock>
|
|
|
|
#include <QTextCursor>
|
|
|
|
|
|
|
|
#include "UBTeacherGuideWidgetsTools.h"
|
|
|
|
|
|
|
|
#include "core/UBPersistenceManager.h"
|
|
|
|
#include "core/UBApplication.h"
|
|
|
|
|
|
|
|
#include "board/UBBoardController.h"
|
|
|
|
|
|
|
|
#include "domain/UBGraphicsWidgetItem.h"
|
|
|
|
|
|
|
|
#include "globals/UBGlobals.h"
|
|
|
|
|
|
|
|
#include "frameworks/UBFileSystemUtils.h"
|
|
|
|
|
|
|
|
#include "customWidgets/UBMediaWidget.h"
|
|
|
|
|
|
|
|
#include "core/memcheck.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));
|
|
|
|
setData(0,Qt::BackgroundRole,QVariant(QColor(200,200,200)));
|
|
|
|
setData(1,Qt::BackgroundRole,QVariant(QColor(200,200,200)));
|
|
|
|
setData(0,Qt::FontRole,QVariant(QFont(QApplication::font().family(),12)));
|
|
|
|
}
|
|
|
|
|
|
|
|
UBAddItem::~UBAddItem()
|
|
|
|
{
|
|
|
|
//NOOP
|
|
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
* class UBTGActionWidget *
|
|
|
|
***************************************************************************/
|
|
|
|
UBTGActionWidget::UBTGActionWidget(QTreeWidgetItem* widget, QWidget* parent, const char* name) : QWidget(parent)
|
|
|
|
, mpLayout(NULL)
|
|
|
|
, mpOwner(NULL)
|
|
|
|
, mpTask(NULL)
|
|
|
|
{
|
|
|
|
setObjectName(name);
|
|
|
|
SET_STYLE_SHEET();
|
|
|
|
mpLayout = new QVBoxLayout(this);
|
|
|
|
mpOwner = new QComboBox(this);
|
|
|
|
mpOwner->setObjectName("DockPaletteWidgetComboBox");
|
|
|
|
mpOwner->setMinimumHeight(22);
|
|
|
|
QStringList qslOwner;
|
|
|
|
qslOwner << tr("Teacher") << tr("Student");
|
|
|
|
mpOwner->insertItems(0,qslOwner);
|
|
|
|
mpOwner->setCurrentIndex(0);
|
|
|
|
mpTask = new UBTGAdaptableText(widget,this);
|
|
|
|
mpTask->setPlaceHolderText(tr("Type task here ..."));
|
|
|
|
mpTask->setAcceptRichText(true);
|
|
|
|
mpTask->setObjectName("ActionWidgetTaskTextEdit");
|
|
|
|
mpLayout->addWidget(mpOwner);
|
|
|
|
mpLayout->addWidget(mpTask);
|
|
|
|
}
|
|
|
|
|
|
|
|
UBTGActionWidget::~UBTGActionWidget()
|
|
|
|
{
|
|
|
|
DELETEPTR(mpOwner);
|
|
|
|
DELETEPTR(mpTask);
|
|
|
|
DELETEPTR(mpLayout);
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGActionWidget::initializeWithDom(QDomElement element)
|
|
|
|
{
|
|
|
|
mpOwner->setCurrentIndex(element.attribute("owner").toInt());
|
|
|
|
mpTask->setInitialText(element.attribute("task"));
|
|
|
|
}
|
|
|
|
|
|
|
|
tUBGEElementNode* UBTGActionWidget::saveData()
|
|
|
|
{
|
|
|
|
tUBGEElementNode* result = new tUBGEElementNode();
|
|
|
|
result->name = "action";
|
|
|
|
result->attributes.insert("owner",QString("%0").arg(mpOwner->currentIndex()));
|
|
|
|
result->attributes.insert("task",mpTask->text());
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
* class UBTGAdaptableText *
|
|
|
|
***************************************************************************/
|
|
|
|
UBTGAdaptableText::UBTGAdaptableText(QTreeWidgetItem* widget, QWidget* parent, const char* name):QTextEdit(parent)
|
|
|
|
, mBottomMargin(5)
|
|
|
|
, mpTreeWidgetItem(widget)
|
|
|
|
, mMinimumHeight(0)
|
|
|
|
, mHasPlaceHolder(false)
|
|
|
|
, mIsUpdatingSize(false)
|
|
|
|
, mMaximumLength(0)
|
|
|
|
{
|
|
|
|
setObjectName(name);
|
|
|
|
connect(this,SIGNAL(textChanged()),this,SLOT(onTextChanged()));
|
|
|
|
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
|
|
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
|
|
|
|
|
|
mMinimumHeight = document()->size().height() + mBottomMargin;
|
|
|
|
setMinimumHeight(mMinimumHeight);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGAdaptableText::setMaximumLength(int length)
|
|
|
|
{
|
|
|
|
mMaximumLength = length;
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGAdaptableText::setPlaceHolderText(QString text)
|
|
|
|
{
|
|
|
|
mHasPlaceHolder = true;
|
|
|
|
|
|
|
|
// the space addition is to make this string unique and check against it to know
|
|
|
|
// if we are talking about a typed string or the placeholder string
|
|
|
|
mPlaceHolderText = text + " ";
|
|
|
|
setPlainText(mPlaceHolderText);
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGAdaptableText::keyReleaseEvent(QKeyEvent* e)
|
|
|
|
{
|
|
|
|
QTextEdit::keyReleaseEvent(e);
|
|
|
|
|
|
|
|
if(mMaximumLength && toPlainText().length()>mMaximumLength){
|
|
|
|
setPlainText(toPlainText().left(mMaximumLength));
|
|
|
|
QTextCursor tc(document());
|
|
|
|
tc.setPosition(mMaximumLength);
|
|
|
|
setTextCursor(tc);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGAdaptableText::showEvent(QShowEvent* e)
|
|
|
|
{
|
|
|
|
Q_UNUSED(e);
|
|
|
|
if(!mIsUpdatingSize && mHasPlaceHolder && toPlainText().isEmpty() && !isReadOnly()){
|
|
|
|
setTextColor(QColor(Qt::lightGray));
|
|
|
|
setPlainText(mPlaceHolderText);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
// If the teacherguide is collapsed, don't updated the size. Or set the size as the expanded size
|
|
|
|
onTextChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
QString UBTGAdaptableText::text()
|
|
|
|
{
|
|
|
|
QString result = toPlainText();
|
|
|
|
if(mHasPlaceHolder && result == mPlaceHolderText)
|
|
|
|
return "";
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGAdaptableText::onTextChanged()
|
|
|
|
{
|
|
|
|
qreal documentSize = document()->size().height();
|
|
|
|
if(height() == documentSize + mBottomMargin){
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
mIsUpdatingSize = true;
|
|
|
|
|
|
|
|
|
|
|
|
if(documentSize < mMinimumHeight){
|
|
|
|
setFixedHeight(mMinimumHeight);
|
|
|
|
}else{
|
|
|
|
setFixedHeight(documentSize+mBottomMargin);
|
|
|
|
}
|
|
|
|
|
|
|
|
updateGeometry();
|
|
|
|
//to trig a resize on the tree widget item
|
|
|
|
if(mpTreeWidgetItem){
|
|
|
|
mpTreeWidgetItem->setDisabled(true);
|
|
|
|
mpTreeWidgetItem->setExpanded(true);
|
|
|
|
mpTreeWidgetItem->setDisabled(false);
|
|
|
|
setFocus();
|
|
|
|
}
|
|
|
|
mIsUpdatingSize = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGAdaptableText::setInitialText(const QString& text)
|
|
|
|
{
|
|
|
|
setText(text);
|
|
|
|
setReadOnly(false);
|
|
|
|
onTextChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGAdaptableText::showText(const QString & text)
|
|
|
|
{
|
|
|
|
setText(text);
|
|
|
|
setReadOnly(true);
|
|
|
|
onTextChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGAdaptableText::bottomMargin(int newValue)
|
|
|
|
{
|
|
|
|
mBottomMargin = newValue;
|
|
|
|
onTextChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGAdaptableText::focusInEvent(QFocusEvent* e)
|
|
|
|
{
|
|
|
|
if(isReadOnly()){
|
|
|
|
e->ignore();
|
|
|
|
}
|
|
|
|
managePlaceholder(true);
|
|
|
|
QTextEdit::focusInEvent(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGAdaptableText::focusOutEvent(QFocusEvent* e){
|
|
|
|
managePlaceholder(false);
|
|
|
|
QTextEdit::focusOutEvent(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGAdaptableText::managePlaceholder(bool focus){
|
|
|
|
if(focus){
|
|
|
|
if(toPlainText() == mPlaceHolderText){
|
|
|
|
setTextColor(QColor(Qt::black));
|
|
|
|
setPlainText("");
|
|
|
|
}
|
|
|
|
setCursorToTheEnd();
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
if(toPlainText().isEmpty()){
|
|
|
|
setTextColor(QColor(Qt::lightGray));
|
|
|
|
setPlainText(mPlaceHolderText);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGAdaptableText::setCursorToTheEnd(){
|
|
|
|
QTextDocument* doc = document();
|
|
|
|
if(NULL != doc){
|
|
|
|
QTextBlock block = doc->lastBlock();
|
|
|
|
QTextCursor cursor(doc);
|
|
|
|
cursor.setPosition(block.position() + block.length() - 1);
|
|
|
|
setTextCursor(cursor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
* class UBTGDraggableWeb *
|
|
|
|
***************************************************************************/
|
|
|
|
UBDraggableWeb::UBDraggableWeb(QString& relativePath, QWidget* parent): QWebView(parent)
|
|
|
|
, mDragStartPosition(QPoint(-1,-1))
|
|
|
|
, mDragStarted(false)
|
|
|
|
|
|
|
|
{
|
|
|
|
if(!relativePath.startsWith("file://"))
|
|
|
|
mRelativePath = QUrl::fromLocalFile(relativePath).toString();
|
|
|
|
else
|
|
|
|
mRelativePath = relativePath;
|
|
|
|
//NOOP
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBDraggableWeb::mousePressEvent(QMouseEvent* event)
|
|
|
|
{
|
|
|
|
mDragStartPosition = event->pos();
|
|
|
|
mDragStarted = true;
|
|
|
|
QWebView::mousePressEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBDraggableWeb::mouseReleaseEvent(QMouseEvent* event)
|
|
|
|
{
|
|
|
|
mDragStarted = false;
|
|
|
|
QWebView::mouseReleaseEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBDraggableWeb::mouseMoveEvent(QMouseEvent* event)
|
|
|
|
{
|
|
|
|
if(mDragStarted && (event->pos() - mDragStartPosition).manhattanLength() > QApplication::startDragDistance()){
|
|
|
|
QDrag *drag = new QDrag(this);
|
|
|
|
QMimeData *mimeData = new QMimeData;
|
|
|
|
QList<QUrl> urlList;
|
|
|
|
urlList << QUrl(mRelativePath);
|
|
|
|
mimeData->setUrls(urlList);
|
|
|
|
drag->setMimeData(mimeData);
|
|
|
|
|
|
|
|
drag->exec();
|
|
|
|
event->accept();
|
|
|
|
mDragStarted = false;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
QWebView::mouseMoveEvent(event);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
* class UBTGMediaWidget *
|
|
|
|
***************************************************************************/
|
|
|
|
UBTGMediaWidget::UBTGMediaWidget(QTreeWidgetItem* widget, QWidget* parent,const char* name): QStackedWidget(parent)
|
|
|
|
, mpTreeWidgetItem(widget)
|
|
|
|
, mpDropMeWidget(NULL)
|
|
|
|
, mpWorkWidget(NULL)
|
|
|
|
, mpLayout(NULL)
|
|
|
|
, mpMediaLayout(NULL)
|
|
|
|
, mpTitle(NULL)
|
|
|
|
, mpMediaLabelWidget(NULL)
|
|
|
|
, mpMediaWidget(NULL)
|
|
|
|
, mpWebView(NULL)
|
|
|
|
, mMediaPath(QString(""))
|
|
|
|
, mIsPresentationMode(false)
|
|
|
|
, mIsInitializationMode(false)
|
|
|
|
, mMediaWidgetHeight(150)
|
|
|
|
{
|
|
|
|
setObjectName(name);
|
|
|
|
mpDropMeWidget = new QLabel();
|
|
|
|
mpDropMeWidget->setObjectName("UBTGMediaDropMeLabel");
|
|
|
|
mpDropMeWidget->setText(tr("drop media here ..."));
|
|
|
|
mpDropMeWidget->setAlignment(Qt::AlignCenter);
|
|
|
|
setAcceptDrops(true);
|
|
|
|
addWidget(mpDropMeWidget);
|
|
|
|
|
|
|
|
setMinimumHeight(250);
|
|
|
|
}
|
|
|
|
|
|
|
|
UBTGMediaWidget::UBTGMediaWidget(QString mediaPath, QTreeWidgetItem* widget, QWidget* parent,bool forceFlashMediaType,const char* name): QStackedWidget(parent)
|
|
|
|
, mpTreeWidgetItem(widget)
|
|
|
|
, mpDropMeWidget(NULL)
|
|
|
|
, mpWorkWidget(NULL)
|
|
|
|
, mpLayout(NULL)
|
|
|
|
, mpMediaLayout(NULL)
|
|
|
|
, mpTitle(NULL)
|
|
|
|
, mpMediaLabelWidget(NULL)
|
|
|
|
, mpMediaWidget(NULL)
|
|
|
|
, mpWebView(NULL)
|
|
|
|
, mIsPresentationMode(true)
|
|
|
|
, mMediaType("")
|
|
|
|
, mIsInitializationMode(false)
|
|
|
|
, mMediaWidgetHeight(150)
|
|
|
|
{
|
|
|
|
setObjectName(name);
|
|
|
|
mMediaPath = UBApplication::boardController->selectedDocument()->persistencePath()+ "/" + mediaPath;
|
|
|
|
setAcceptDrops(false);
|
|
|
|
createWorkWidget(forceFlashMediaType);
|
|
|
|
setFixedHeight(200);
|
|
|
|
}
|
|
|
|
|
|
|
|
UBTGMediaWidget::~UBTGMediaWidget()
|
|
|
|
{
|
|
|
|
DELETEPTR(mpTitle);
|
|
|
|
DELETEPTR(mpMediaLabelWidget);
|
|
|
|
DELETEPTR(mpMediaWidget);
|
|
|
|
DELETEPTR(mpWebView);
|
|
|
|
DELETEPTR(mpMediaLayout);
|
|
|
|
DELETEPTR(mpLayout);
|
|
|
|
|
|
|
|
removeWidget(mpDropMeWidget);
|
|
|
|
DELETEPTR(mpDropMeWidget);
|
|
|
|
removeWidget(mpWorkWidget);
|
|
|
|
DELETEPTR(mpWorkWidget);
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGMediaWidget::initializeWithDom(QDomElement element)
|
|
|
|
{
|
|
|
|
mIsInitializationMode = true;
|
|
|
|
setAcceptDrops(false);
|
|
|
|
mMediaPath = UBApplication::boardController->selectedDocument()->persistencePath() + "/" + element.attribute("relativePath");
|
|
|
|
createWorkWidget(element.attribute("mediaType").contains("flash"));
|
|
|
|
setFixedHeight(200);
|
|
|
|
mpTitle->setInitialText(element.attribute("title"));
|
|
|
|
mIsInitializationMode = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGMediaWidget::removeSource()
|
|
|
|
{
|
|
|
|
QFileInfo fileInfo(mMediaPath);
|
|
|
|
if(fileInfo.isFile())
|
|
|
|
QFile(mMediaPath).remove();
|
|
|
|
else
|
|
|
|
UBFileSystemUtils::deleteDir(mMediaPath);
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGMediaWidget::hideEvent(QHideEvent* event)
|
|
|
|
{
|
|
|
|
if(mpWebView)
|
|
|
|
mpWebView->page()->mainFrame()->setContent(UBGraphicsW3CWidgetItem::freezedWidgetPage().toAscii());
|
|
|
|
QWidget::hideEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGMediaWidget::showEvent(QShowEvent* event)
|
|
|
|
{
|
|
|
|
QWidget::showEvent(event);
|
|
|
|
if(mpWebView){
|
|
|
|
QString indexPath = mMediaPath+"/index.htm";
|
|
|
|
if(!QFile::exists(indexPath))
|
|
|
|
indexPath += "l";
|
|
|
|
mpWebView->load(QUrl::fromLocalFile(indexPath));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
tUBGEElementNode* UBTGMediaWidget::saveData()
|
|
|
|
{
|
|
|
|
if(!mpTitle)
|
|
|
|
return 0;
|
|
|
|
tUBGEElementNode* result = new tUBGEElementNode();
|
|
|
|
QString relativePath = mMediaPath;
|
|
|
|
relativePath = relativePath.replace(UBApplication::boardController->selectedDocument()->persistencePath()+"/","");
|
|
|
|
result->name = "media";
|
|
|
|
result->attributes.insert("title",mpTitle->text());
|
|
|
|
result->attributes.insert("relativePath",relativePath);
|
|
|
|
result->attributes.insert("mediaType",mMediaType);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGMediaWidget::dragEnterEvent(QDragEnterEvent *event)
|
|
|
|
{
|
|
|
|
event->accept();
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGMediaWidget::createWorkWidget(bool forceFlashMediaType)
|
|
|
|
{
|
|
|
|
QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(mMediaPath);
|
|
|
|
bool setMedia = true;
|
|
|
|
UBDocumentProxy* proxyDocument = UBApplication::boardController->selectedDocument();
|
|
|
|
if(mimeType.contains("audio") || mimeType.contains("video")){
|
|
|
|
mMediaType = mimeType.contains("audio")? "audio":"movie";
|
|
|
|
mpMediaWidget = new UBMediaWidget(mimeType.contains("audio")?eMediaType_Audio:eMediaType_Video);
|
|
|
|
if(mIsPresentationMode || mIsInitializationMode){
|
|
|
|
mpMediaWidget->setFile(mMediaPath);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
mMediaPath = UBPersistenceManager::persistenceManager()->addObjectToTeacherGuideDirectory(proxyDocument, mMediaPath);
|
|
|
|
mpMediaWidget->setFile(mMediaPath);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(mimeType.contains("image")){
|
|
|
|
mMediaType = "image";
|
|
|
|
if(!(mIsPresentationMode || mIsInitializationMode))
|
|
|
|
mMediaPath = UBPersistenceManager::persistenceManager()->addObjectToTeacherGuideDirectory(proxyDocument, mMediaPath);
|
|
|
|
|
|
|
|
mpMediaLabelWidget = new QLabel();
|
|
|
|
QPixmap pixmap = QPixmap(mMediaPath);
|
|
|
|
pixmap = pixmap.scaledToHeight(mMediaWidgetHeight);
|
|
|
|
mpMediaLabelWidget->setPixmap(pixmap);
|
|
|
|
}
|
|
|
|
else if(mimeType.contains("widget") && !forceFlashMediaType){
|
|
|
|
mMediaType = "w3c";
|
|
|
|
if(!(mIsPresentationMode || mIsInitializationMode)){
|
|
|
|
mMediaPath = UBPersistenceManager::persistenceManager()->addWidgetToTeacherGuideDirectory(proxyDocument, mMediaPath);
|
|
|
|
}
|
|
|
|
mpWebView = new UBDraggableWeb(mMediaPath);
|
|
|
|
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);
|
|
|
|
QString indexPath = mMediaPath+"/index.htm";
|
|
|
|
if(!QFile::exists(indexPath))
|
|
|
|
indexPath += "l";
|
|
|
|
mpWebView->load(QUrl::fromLocalFile(indexPath));
|
|
|
|
}
|
|
|
|
else if(mimeType.contains("x-shockwave-flash") || forceFlashMediaType){
|
|
|
|
mMediaType = "flash";
|
|
|
|
if(!(mIsPresentationMode || mIsInitializationMode)){
|
|
|
|
QDir baseW3CDirectory(UBPersistenceManager::persistenceManager()->teacherGuideAbsoluteObjectPath(proxyDocument));
|
|
|
|
mMediaPath = UBGraphicsW3CWidgetItem::createNPAPIWrapperInDir(mMediaPath,baseW3CDirectory,mimeType,QSize(100,100),QUuid::createUuid());
|
|
|
|
}
|
|
|
|
qDebug() << mMediaPath;
|
|
|
|
mpWebView = new UBDraggableWeb(mMediaPath);
|
|
|
|
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);
|
|
|
|
QString indexPath = mMediaPath+"/index.htm";
|
|
|
|
if(!QFile::exists(indexPath))
|
|
|
|
indexPath += "l";
|
|
|
|
mpWebView->load(QUrl::fromLocalFile(indexPath));
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
qDebug() << "createWorkWidget mime type not handled" << mimeType;
|
|
|
|
setMedia=false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(setMedia){
|
|
|
|
setAcceptDrops(false);
|
|
|
|
mpWorkWidget = new QWidget(this);
|
|
|
|
if(!mIsPresentationMode){
|
|
|
|
mpLayout = new QVBoxLayout(mpWorkWidget);
|
|
|
|
mpTitle = new UBTGAdaptableText(mpTreeWidgetItem,mpWorkWidget);
|
|
|
|
mpTitle->setPlaceHolderText(tr("Type title here..."));
|
|
|
|
mpLayout->addWidget(mpTitle);
|
|
|
|
mpMediaLayout = new QHBoxLayout;
|
|
|
|
mpLayout->addLayout(mpMediaLayout);
|
|
|
|
mpWorkWidget->setLayout(mpLayout);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
mpMediaLayout = new QHBoxLayout(mpWorkWidget);
|
|
|
|
mpWorkWidget->setLayout(mpMediaLayout);
|
|
|
|
}
|
|
|
|
|
|
|
|
mpMediaLayout->addStretch(1);
|
|
|
|
|
|
|
|
if(mpMediaLabelWidget){
|
|
|
|
mpMediaLabelWidget->setFixedHeight(mMediaWidgetHeight);
|
|
|
|
mpMediaLabelWidget->setParent(mpWorkWidget);
|
|
|
|
mpMediaLayout->addWidget(mpMediaLabelWidget);
|
|
|
|
}
|
|
|
|
else if (mpMediaWidget){
|
|
|
|
mpMediaWidget->setFixedHeight(mMediaWidgetHeight);
|
|
|
|
mpMediaWidget->setParent(mpWorkWidget);
|
|
|
|
mpMediaLayout->addWidget(mpMediaWidget);
|
|
|
|
}
|
|
|
|
else if (mpWebView){
|
|
|
|
mpWebView->setFixedHeight(mMediaWidgetHeight);
|
|
|
|
mpWebView->setParent(mpWorkWidget);
|
|
|
|
mpMediaLayout->addWidget(mpWebView);
|
|
|
|
mpWebView->show();
|
|
|
|
}
|
|
|
|
mpMediaLayout->addStretch(1);
|
|
|
|
addWidget(mpWorkWidget);
|
|
|
|
setCurrentWidget(mpWorkWidget);
|
|
|
|
mpWorkWidget->show();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGMediaWidget::parseMimeData(const QMimeData* pMimeData)
|
|
|
|
{
|
|
|
|
if(pMimeData){
|
|
|
|
if(pMimeData->hasText()){
|
|
|
|
mMediaPath = QUrl::fromLocalFile(pMimeData->text()).toString();
|
|
|
|
}
|
|
|
|
else if(pMimeData->hasUrls()){
|
|
|
|
mMediaPath = pMimeData->urls().at(0).toString();
|
|
|
|
}
|
|
|
|
else if(pMimeData->hasImage()){
|
|
|
|
qDebug() << "Not yet implemented";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
qDebug() << "No mime data present";
|
|
|
|
|
|
|
|
createWorkWidget();
|
|
|
|
}
|
|
|
|
|
|
|
|
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<QUrl> urlList;
|
|
|
|
#ifdef Q_WS_WIN
|
|
|
|
urlList << QUrl::fromLocalFile(mMediaPath);
|
|
|
|
#else
|
|
|
|
urlList << QUrl(mMediaPath);
|
|
|
|
#endif
|
|
|
|
mimeData->setUrls(urlList);
|
|
|
|
drag->setMimeData(mimeData);
|
|
|
|
|
|
|
|
drag->exec();
|
|
|
|
event->accept();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
* class UBTGUrlWidget *
|
|
|
|
***************************************************************************/
|
|
|
|
UBTGUrlWidget::UBTGUrlWidget(QWidget* parent, const char* name ):QWidget(parent)
|
|
|
|
, mpLayout(NULL)
|
|
|
|
, mpTitle(NULL)
|
|
|
|
, mpUrl(NULL)
|
|
|
|
{
|
|
|
|
setObjectName(name);
|
|
|
|
SET_STYLE_SHEET();
|
|
|
|
mpLayout = new QVBoxLayout(this);
|
|
|
|
setLayout(mpLayout);
|
|
|
|
mpTitle = new QLineEdit(this);
|
|
|
|
mpTitle->setObjectName("UBTGLineEdit");
|
|
|
|
mpTitle->setPlaceholderText(tr("Insert link title here..."));
|
|
|
|
mpUrl = new QLineEdit(this);
|
|
|
|
connect(mpUrl,SIGNAL(editingFinished()),this,SLOT(onUrlEditionFinished()));
|
|
|
|
mpUrl->setObjectName("UBTGLineEdit");
|
|
|
|
mpUrl->setPlaceholderText("http://");
|
|
|
|
mpLayout->addWidget(mpTitle);
|
|
|
|
mpLayout->addWidget(mpUrl);
|
|
|
|
}
|
|
|
|
|
|
|
|
UBTGUrlWidget::~UBTGUrlWidget()
|
|
|
|
{
|
|
|
|
DELETEPTR(mpTitle);
|
|
|
|
DELETEPTR(mpUrl);
|
|
|
|
DELETEPTR(mpLayout);
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGUrlWidget::onUrlEditionFinished()
|
|
|
|
{
|
|
|
|
QString url = mpUrl->text();
|
|
|
|
if(url.length() && !url.startsWith("http://") && !url.startsWith("https://") && !url.startsWith("ftp://") && !url.startsWith("sftp://") && !url.startsWith("http://")){
|
|
|
|
mpUrl->setText("http://" + mpUrl->text());
|
|
|
|
setFocus();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void UBTGUrlWidget::initializeWithDom(QDomElement element)
|
|
|
|
{
|
|
|
|
mpTitle->setText(element.attribute("title"));
|
|
|
|
mpUrl->setText(element.attribute("url"));
|
|
|
|
}
|
|
|
|
|
|
|
|
tUBGEElementNode* UBTGUrlWidget::saveData()
|
|
|
|
{
|
|
|
|
tUBGEElementNode* result = new tUBGEElementNode();
|
|
|
|
result->name = "link";
|
|
|
|
result->attributes.insert("title",mpTitle->text());
|
|
|
|
result->attributes.insert("url",mpUrl->text());
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
* class UBTGDraggableTreeItem *
|
|
|
|
***************************************************************************/
|
|
|
|
UBTGDraggableTreeItem::UBTGDraggableTreeItem(QWidget* parent, const char* name) : QTreeWidget(parent)
|
|
|
|
{
|
|
|
|
setObjectName(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
QMimeData* UBTGDraggableTreeItem::mimeData(const QList<QTreeWidgetItem *> items) const
|
|
|
|
{
|
|
|
|
QMimeData* result = new QMimeData();
|
|
|
|
QList<QUrl> urls;
|
|
|
|
urls << QUrl(items.at(0)->data(0,TG_USER_ROLE_MIME_TYPE).toString());
|
|
|
|
result->setUrls(urls);
|
|
|
|
return result;
|
|
|
|
}
|