99581bc990
- Updated header inclusions from QtGui to QtWidgets for consistency and compatibility with Qt 5 and later. - Replaced deprecated QApplication::desktop() with QApplication::primaryScreen() for obtaining screen DPI. - Modified MyOutputHandler to use QMessageLogContext and QString for improved logging. - Changed QMatrix to QTransform for image rotation in ImageCutout class. - Updated various debug statements to use toLocal8Bit() instead of toAscii() for better string handling. - Refactored several classes to use QElapsedTimer instead of QTime for performance measurement. - Ensured all operator overloads in Section and Tag classes are marked as const for better const-correctness.
577 lines
18 KiB
C++
577 lines
18 KiB
C++
/************************************************************************
|
|
* $Id: issue.cpp 661 2011-04-05 13:16:53Z elzubeir $
|
|
*
|
|
* ------------
|
|
* Description:
|
|
* ------------
|
|
*
|
|
* (C) Copyright 2009-2011 ALLCONTENT. All rights reserved.
|
|
*
|
|
* -----------------
|
|
* Revision Details: (Updated by Revision Control System)
|
|
* -----------------
|
|
* $Date: 2011-04-05 17:16:53 +0400 (Tue, 05 Apr 2011) $
|
|
* $Author: elzubeir $
|
|
* $Revision: 661 $
|
|
* $HeadURL: file:///opt/svn/socialhose/trunk/app/ClippingStation/issue.cpp $
|
|
*
|
|
************************************************************************/
|
|
|
|
#include "issue.h"
|
|
#include "imagecutout.h"
|
|
#include <QRegularExpression>
|
|
|
|
Issue::Issue(int id, QString date, int publication_id) : m_id(id)
|
|
, m_date(date), m_publicationId(publication_id)
|
|
{
|
|
//m_currentSectionIndex = -1;
|
|
m_model = 0;
|
|
m_isArticleLoaded = false;
|
|
m_isLoaded = false;
|
|
}
|
|
|
|
Issue::~Issue()
|
|
{
|
|
//qDebug("~Issue()");
|
|
if(m_model)
|
|
delete m_model;
|
|
|
|
//qDebug("end of ~Issue()");
|
|
}
|
|
|
|
bool Issue::operator == (const Issue &issue)
|
|
{
|
|
//qDebug() << "Compare between " << m_date << " and " << issue.m_date;
|
|
return (this->m_date == issue.m_date);
|
|
}
|
|
|
|
|
|
void Issue::set(int id, QString date, int pubid, int status, QString created)
|
|
{
|
|
m_id = id;
|
|
m_date = date;
|
|
m_publicationId = pubid;
|
|
m_status = status;
|
|
m_created = created;
|
|
}
|
|
|
|
void Issue::setIssuePaths(QString lpath, QString rpath)
|
|
{
|
|
m_localIssuePath = lpath;
|
|
m_remoteIssuePath = rpath;
|
|
}
|
|
|
|
void Issue::addSection(Section section)
|
|
{
|
|
m_sections.append(section);
|
|
}
|
|
|
|
void Issue::setIsLoaded(bool isLoaded)
|
|
{
|
|
m_isLoaded = isLoaded;
|
|
}
|
|
|
|
int Issue::id()
|
|
{
|
|
return m_id;
|
|
}
|
|
|
|
QString Issue::date()
|
|
{
|
|
return m_date;
|
|
}
|
|
|
|
int Issue::status()
|
|
{
|
|
return m_status;
|
|
}
|
|
|
|
QString Issue::created()
|
|
{
|
|
return m_created;
|
|
}
|
|
|
|
bool Issue::isLoaded()
|
|
{
|
|
return m_isLoaded;
|
|
}
|
|
|
|
QList<Section> Issue::sections()
|
|
{
|
|
return m_sections;
|
|
}
|
|
|
|
Section& Issue::section(QString sectionName)
|
|
{
|
|
int index = m_sections.indexOf(Section(0, sectionName) );
|
|
Q_ASSERT(index > -1);
|
|
|
|
return m_sections[index];
|
|
}
|
|
|
|
Article& Issue::preclip(int id)
|
|
{
|
|
//Article x;
|
|
//x.setId(id);
|
|
//int index = m_preclipped.indexOf(x);
|
|
//Q_ASSERT(index > -1);
|
|
for(int i=0; i< m_preclipped.count(); i++)
|
|
{
|
|
if(m_preclipped[i].id() == id)
|
|
return m_preclipped[i];
|
|
}
|
|
return m_preclipped[0];
|
|
|
|
}
|
|
|
|
Article& Issue::clip(int id)
|
|
{
|
|
/* Article x;
|
|
x.setId(id);
|
|
int index = m_clipped.indexOf(x);
|
|
Q_ASSERT(index > -1);
|
|
|
|
return m_clipped[index];*/
|
|
for(int i=0; i< m_clipped.count(); i++)
|
|
{
|
|
if(m_clipped[i].id() == id)
|
|
return m_clipped[i];
|
|
}
|
|
return m_clipped[0];
|
|
}
|
|
|
|
/*
|
|
void Issue::setCurrentSection(QString sectionName)
|
|
{
|
|
//m_currentSectionIndex = m_sections.indexOf(Section(0, sectionName) );
|
|
|
|
//qDebug("Current Issue is %d", m_currentSectionIndex);
|
|
}
|
|
*/
|
|
/*
|
|
Section Issue::currentSection()
|
|
{
|
|
qDebug("*******************Current Issue is %d", m_currentSectionIndex);
|
|
if( m_currentSectionIndex > -1)
|
|
return m_sections[m_currentSectionIndex];
|
|
|
|
return Section(0, "");
|
|
}
|
|
*/
|
|
|
|
|
|
void Issue::loadArticles(QSqlDatabase &database, FILTER_MODE mode)
|
|
{
|
|
if (mode == NO_FILTER)
|
|
{
|
|
m_preclipped = Article::preclippedArticles(database, m_publicationId, m_id, m_localIssuePath, m_remoteIssuePath);
|
|
m_clipped = Article::clippedArticles (database, m_publicationId, m_id, m_localIssuePath, m_remoteIssuePath);
|
|
}
|
|
else
|
|
{
|
|
m_preclipped = Article::preclippedArticles(database, m_publicationId, m_id, m_localIssuePath, m_remoteIssuePath);
|
|
m_clipped = QList<Article>();
|
|
}
|
|
|
|
setModelData();
|
|
}
|
|
|
|
void Issue::showArticlesInView(QSqlDatabase &database, QTreeView *view, FILTER_MODE mode)
|
|
{
|
|
if(!m_isArticleLoaded)
|
|
{
|
|
loadArticles(database, mode);
|
|
m_isArticleLoaded = true;
|
|
}
|
|
|
|
m_model->setParent(view->parent());
|
|
|
|
view->setModel(m_model);
|
|
view->hideColumn(1);
|
|
}
|
|
|
|
|
|
void Issue::addArticleToView(QSqlDatabase &database, QTreeView *view, int articleId, bool isclip, bool frompreclip)
|
|
{
|
|
//the addition can be a clip or a preclip
|
|
//if its a preclip, we get its data from database
|
|
if(!isclip) //its a preclip
|
|
{
|
|
if(frompreclip) //a modification of a preclip
|
|
{
|
|
|
|
Article ar = Article::article(database, articleId, m_localIssuePath, m_remoteIssuePath);
|
|
|
|
int index = -1;
|
|
//we remove the preclip from the preclip itemlist, and add it to the clip item list
|
|
for(int i=0; i< m_preclipped.count(); i++)
|
|
{
|
|
if(m_preclipped[i].id() == articleId)
|
|
{
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(index == -1)
|
|
return; //something wrong, it should not be there
|
|
|
|
m_preclipped.removeAt(index);
|
|
m_preclipped.insert(index, ar);
|
|
|
|
QStandardItemModel *model = static_cast<QStandardItemModel*> ( view->model() );
|
|
QModelIndex preclipRootIndex = model->index(0, 0, QModelIndex() ); //now we remove the data from the model
|
|
QStandardItem * preclipRootItem = model->item(0, 0);
|
|
preclipRootItem->removeRow(index);
|
|
|
|
|
|
QIcon icon( (ar.status() == 1) ? ":/icons/red_circle.png" : ":/icons/green_circle.png");
|
|
QStandardItem * preclipItem = new QStandardItem(icon, QObject::tr("Preclip (%1)").arg(index+1));
|
|
preclipRootItem->insertRow(index, preclipItem);
|
|
preclipRootItem->setChild(index, 1, new QStandardItem(QString("%1").arg( articleId )) );
|
|
|
|
QStringList pages = ar.pageNames();
|
|
for(int i= 0; i < pages.count(); i++)
|
|
preclipItem->appendRow(new QStandardItem(QString("%1").arg(pages[i]) ) );
|
|
}
|
|
else
|
|
{
|
|
//its a fresh preclip
|
|
Article ar = Article::article(database, articleId, m_localIssuePath, m_remoteIssuePath);
|
|
m_preclipped.append(ar);
|
|
|
|
QStandardItemModel *model = static_cast<QStandardItemModel*> ( view->model() );
|
|
QModelIndex preclipRootIndex = model->index(0, 0, QModelIndex() ); //now we remove the data from the model
|
|
|
|
QStandardItem * preclipRootItem = model->item(0, 0);
|
|
|
|
QIcon icon( (ar.status() == 1) ? ":/icons/red_circle.png" : ":/icons/green_circle.png");
|
|
QStandardItem * preclipItem = new QStandardItem(icon, QObject::tr("Preclip (%1)").arg(m_preclipped.count()));
|
|
preclipRootItem->appendRow(preclipItem);
|
|
preclipRootItem->setChild(m_preclipped.count() -1 , 1, new QStandardItem(QString("%1").arg( articleId )) );
|
|
|
|
|
|
QStringList pages = ar.pageNames();
|
|
for(int i= 0; i < pages.count(); i++)
|
|
preclipItem->appendRow(new QStandardItem(QString("%1").arg(pages[i]) ) );
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
//its a clip
|
|
//we have 2 cases, either it came from a preclip
|
|
if(frompreclip)
|
|
{
|
|
int index = -1;
|
|
//we remove the preclip from the preclip itemlist, and add it to the clip item list
|
|
for(int i=0; i< m_preclipped.count(); i++)
|
|
{
|
|
if(m_preclipped[i].id() == articleId)
|
|
{
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(index == -1)
|
|
return; //something wrong, it should not be there
|
|
|
|
//Article ar = m_preclipped[index];
|
|
Article ar = Article::article(database, articleId, m_localIssuePath, m_remoteIssuePath);
|
|
|
|
m_preclipped.removeAt(index);
|
|
|
|
m_clipped.append(ar);
|
|
|
|
QStandardItemModel *model = static_cast<QStandardItemModel*> ( view->model() );
|
|
QModelIndex preclipRootIndex = model->index(0, 0, QModelIndex() ); //now we remove the data from the model
|
|
model->removeRow(index, preclipRootIndex);
|
|
|
|
//add an entry in the model view
|
|
QModelIndex clipIndex = model->index(1, 0, QModelIndex() );
|
|
//now we remove the data from the model
|
|
|
|
QStandardItem * clipRootItem = model->item(1, 0);
|
|
|
|
QStandardItem * clipItem = new QStandardItem( QObject::tr("Clip (%1)").arg(m_clipped.count()));
|
|
clipRootItem->appendRow(clipItem);
|
|
clipRootItem->setChild(m_clipped.count() -1 , 1, new QStandardItem(QString("%1").arg( articleId )) );
|
|
//columns.append(new QStandardItem(QString("%1").arg( articleId ); //save the article ID
|
|
|
|
QStringList pages = ar.pageNames();
|
|
for(int i= 0; i < pages.count(); i++)
|
|
clipItem->appendRow(new QStandardItem(QString("%1").arg(pages[i]) ) );
|
|
|
|
}
|
|
else //or its a new clip, not from a preclip
|
|
{
|
|
Article ar = Article::article(database, articleId, m_localIssuePath, m_remoteIssuePath);
|
|
m_clipped.append(ar);
|
|
|
|
QStandardItemModel *model = static_cast<QStandardItemModel*> ( view->model() );
|
|
|
|
QStandardItem * clipRootItem = model->item(1, 0);
|
|
|
|
QStandardItem * clipItem = new QStandardItem( QObject::tr("Clip (%1)").arg(m_clipped.count()));
|
|
clipRootItem->appendRow(clipItem);
|
|
clipRootItem->setChild(m_clipped.count() -1 , 1, new QStandardItem(QString("%1").arg( articleId )) );
|
|
|
|
QStringList pages = ar.pageNames();
|
|
for(int i= 0; i < pages.count(); i++)
|
|
clipItem->appendRow(new QStandardItem(QString("%1").arg(pages[i]) ) );
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void Issue::deleteArticleFromView(QTreeView *view, int articleId, bool preclip)
|
|
{
|
|
if(preclip)
|
|
{
|
|
int index = -1;
|
|
//we remove the preclip from the preclip itemlist, and add it to the clip item list
|
|
for(int i=0; i< m_preclipped.count(); i++)
|
|
{
|
|
if(m_preclipped[i].id() == articleId)
|
|
{
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(index == -1)
|
|
return; //something wrong, it should not be there
|
|
|
|
m_preclipped.removeAt(index);
|
|
|
|
QStandardItemModel *model = static_cast<QStandardItemModel*> ( view->model() );
|
|
//QModelIndex preclipRootIndex = model->index(0, 0, QModelIndex() ); //now we remove the row from the model
|
|
QStandardItem * preclipRootItem = model->item(0, 0);
|
|
preclipRootItem->removeRow(index); //now we remove the row from the model
|
|
}
|
|
else
|
|
{
|
|
int index = -1;
|
|
//we remove the preclip from the preclip itemlist, and add it to the clip item list
|
|
for(int i=0; i< m_clipped.count(); i++)
|
|
{
|
|
if(m_clipped[i].id() == articleId)
|
|
{
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(index == -1)
|
|
return; //something wrong, it should not be there
|
|
|
|
m_clipped.removeAt(index);
|
|
|
|
QStandardItemModel *model = static_cast<QStandardItemModel*> ( view->model() );
|
|
//QModelIndex clipRootIndex = model->index(1, 0, QModelIndex() ); //now we remove the row from the model
|
|
QStandardItem * clipRootItem = model->item(1, 0);
|
|
clipRootItem->removeRow(index); //now we remove the row from the model
|
|
}
|
|
}
|
|
|
|
void Issue::addImageCutoutsToSections(QSqlDatabase &database, QStandardItem *issueItem)
|
|
{
|
|
QList<Section> sections = Section::sections(database);
|
|
QHash<QString, int> sectionsHash;
|
|
|
|
for(int i=0; i<sections.count(); i++)
|
|
sectionsHash[sections[i].name()] = sections[i].id();
|
|
|
|
//loadClippingCoordinates(database);
|
|
//loadArticles(database, NO_FILTER);
|
|
|
|
QStandardItemModel *model = issueItem->model();
|
|
QModelIndex issueIndex = issueItem->index();
|
|
|
|
int sectionsCount = model->rowCount(issueIndex);
|
|
|
|
for(int j=0; j < sectionsCount; j++)
|
|
{
|
|
QString section = model->index(j, 0, issueIndex).data(Qt::DisplayRole).toString();
|
|
|
|
QModelIndex sectionIndex = model->index(j, 0, issueIndex);
|
|
int pagesCount = model->rowCount(sectionIndex);
|
|
|
|
for(int k=0; k< pagesCount; k++)
|
|
{
|
|
QModelIndex pageIndex = model->index(k, 0, sectionIndex);
|
|
QStandardItem *pageItem = model->itemFromIndex(pageIndex);
|
|
QString pagename = pageIndex.data(Qt::DisplayRole).toString();
|
|
pagename = QString("%1.jpg").arg(pagename.remove(QRegularExpression("[^\\d]")), 4, QChar('0'));
|
|
|
|
pageItem->removeRows(0, pageItem->rowCount() );
|
|
|
|
foreach(Article ar, m_preclipped)
|
|
{
|
|
//QStringList pages = ImageCutout::pages(ar.imageCutoutsList()).split(",");
|
|
|
|
foreach( ImageCutout* rec, ar.imageCutoutsList() )
|
|
{
|
|
if(rec->sectionNumber() != sectionsHash[section])
|
|
continue;
|
|
|
|
if(!rec->pageName().contains(pagename))
|
|
continue;
|
|
|
|
QIcon icon(":/icons/red_selection.png");
|
|
|
|
QStandardItem * selectionItem = new QStandardItem(icon, QString("%1").arg( ar.id() ) );
|
|
pageItem->appendRow(selectionItem);
|
|
break;
|
|
}
|
|
}
|
|
|
|
foreach(Article ar, m_clipped)
|
|
{
|
|
//QStringList pages = ImageCutout::pages(ar.imageCutoutsList()).split(",");
|
|
|
|
foreach( ImageCutout* rec, ar.imageCutoutsList() )
|
|
{
|
|
if(rec->sectionNumber() != sectionsHash[section])
|
|
continue;
|
|
|
|
if(!rec->pageName().contains(pagename))
|
|
continue;
|
|
|
|
QIcon icon(":/icons/green_selection.png");
|
|
//if (rec->areaType() == IMAGE)
|
|
// icon.addFile(":/icons/red_selection.png");
|
|
//else if(rec->areaType() == BODY)
|
|
// icon.addFile(":/icons/green_selection.png");
|
|
//else if(rec->areaType() == TITLE)
|
|
// icon.addFile(":/icons/blue_selection.png");
|
|
|
|
QStandardItem * selectionItem = new QStandardItem(icon, QString("%1").arg( ar.id() ) );
|
|
pageItem->appendRow(selectionItem);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
///////*******************************************************************************////////
|
|
}
|
|
}
|
|
|
|
|
|
QList<ImageCutout*> Issue::getImageCutouts(int articleId)
|
|
{
|
|
foreach(Article ar, m_preclipped)
|
|
{
|
|
if(ar.id() == articleId)
|
|
return ar.imageCutoutsList();
|
|
}
|
|
|
|
foreach(Article ar, m_clipped)
|
|
{
|
|
if(ar.id() == articleId)
|
|
return ar.imageCutoutsList();
|
|
}
|
|
|
|
return QList<ImageCutout*>();
|
|
}
|
|
|
|
|
|
QList<Tag> Issue::articleTags(int articleId)
|
|
{
|
|
foreach(Article ar, m_preclipped)
|
|
{
|
|
if(ar.id() == articleId)
|
|
return ar.tags();
|
|
}
|
|
|
|
foreach(Article ar, m_clipped)
|
|
{
|
|
if(ar.id() == articleId)
|
|
return ar.tags();
|
|
}
|
|
|
|
return QList<Tag>();
|
|
}
|
|
|
|
void Issue::setModelData()
|
|
{
|
|
if(m_model)
|
|
{
|
|
delete m_model;
|
|
}
|
|
|
|
m_model = new QStandardItemModel(2, 2 );
|
|
m_model->setHorizontalHeaderItem(0, new QStandardItem( QObject::tr("Preclipped/Clipped") ) );
|
|
m_model->setHorizontalHeaderItem(1, new QStandardItem( QObject::tr("Values") ) );
|
|
|
|
|
|
//m_date
|
|
QStandardItem * preclipRootItem = new QStandardItem( QObject::tr("Preclippings"));
|
|
m_model->setItem(0, 0, preclipRootItem);
|
|
|
|
QList<QStandardItem*> columns;
|
|
//columns.append(new QStandardItem("PreclippXXX") );
|
|
|
|
int row=0;
|
|
foreach (Article pc, m_preclipped)
|
|
{
|
|
QIcon icon( (pc.status() == 1) ? ":/icons/red_circle.png" : ":/icons/green_circle.png");
|
|
QStandardItem * preclipItem = new QStandardItem(icon, QObject::tr("Preclip (%1)").arg(row+1));
|
|
preclipRootItem->appendRow(preclipItem);
|
|
columns.append(new QStandardItem(QString("%1").arg( pc.id()) ) ); //save the article ID
|
|
|
|
QStringList pages = pc.pageNames();
|
|
for(int i= 0; i < pages.count(); i++)
|
|
preclipItem->appendRow(new QStandardItem(QString("%1").arg(pages[i]) ) );
|
|
|
|
row++;
|
|
}
|
|
preclipRootItem->appendColumn(columns);
|
|
|
|
QStandardItem * clipRootItem = new QStandardItem( QObject::tr("Clippings"));
|
|
m_model->setItem(1, 0, clipRootItem);
|
|
|
|
row=0;
|
|
columns.clear();
|
|
foreach (Article ca, m_clipped)
|
|
{
|
|
QStandardItem * clipItem = new QStandardItem( QObject::tr("Clip (%1)").arg(row+1));
|
|
clipRootItem->appendRow(clipItem);
|
|
columns.append(new QStandardItem(QString("%1").arg( ca.id()) ) ); //save the article ID
|
|
|
|
QStringList pages = ca.pageNames();
|
|
for(int i= 0; i < pages.count(); i++)
|
|
clipItem->appendRow(new QStandardItem(QString("%1").arg(pages[i]) ) );
|
|
|
|
row++;
|
|
}
|
|
clipRootItem->appendColumn(columns);
|
|
|
|
}
|
|
|
|
void Issue::markIssueAsDone(QSqlDatabase &database, bool isDone, int userId)
|
|
{
|
|
if(isDone)
|
|
m_status = 2;
|
|
else
|
|
m_status = 1;
|
|
|
|
QSqlQuery query(database);
|
|
query.prepare("UPDATE publication_issue SET publication_status = :status, done_by = :id, done_time = NOW() "
|
|
"WHERE id_publication = :id_publication AND id_issue = :id_issue "); //AND issue_date = :issue_date
|
|
|
|
query.bindValue(":status", m_status);
|
|
query.bindValue(":id_publication", m_publicationId);
|
|
query.bindValue(":id_issue", m_id ); //query.bindValue(":issue_date", m_date);
|
|
query.bindValue(":id", userId);
|
|
|
|
qDebug() << "mark issue as done by user id: " << userId;
|
|
|
|
if(!query.exec())
|
|
{
|
|
qDebug() << "markIssueAsDone() SQL Error: " << query.lastError().databaseText().toLocal8Bit();
|
|
return;
|
|
}
|
|
}
|