From: konrad Date: Sun, 5 Dec 2010 21:23:37 +0000 (+0000) Subject: some more infrastructure in label editor X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=ce0df8ddedadbb86f1834e5407e0b9ad1f623c2f;p=web%2Fkonrad%2Fsmoke.git some more infrastructure in label editor git-svn-id: https://silmor.de/svn/softmagic/smoke/trunk@651 6e3c4bff-ac9f-4ac1-96c5-d2ea494d3e33 --- diff --git a/src/templates/templates.cpp b/src/templates/templates.cpp index aeddc64..6a9929d 100644 --- a/src/templates/templates.cpp +++ b/src/templates/templates.cpp @@ -267,6 +267,7 @@ QList MTemplateStore::allTemplates() /****************************************************************************/ MTemplate::MTemplate(){} +MTemplate::MTemplate(QString fn){m_fname=fn;} MTemplate::MTemplate(QString fn,QString chk,QString dsc){m_fname=fn;m_checksum=chk;m_descr=dsc;} QString MTemplate::cacheFileName()const{return m_fname;} diff --git a/src/templates/templates.h b/src/templates/templates.h index aaf8ad6..bcded4c 100644 --- a/src/templates/templates.h +++ b/src/templates/templates.h @@ -22,6 +22,9 @@ class MTemplate /**creates an invalid template*/ MTemplate(); + /**creates a temporary template by a physical file name*/ + MTemplate(QString fn); + /**returns the name/path of the cache file, if it exists*/ QString cacheFileName()const; @@ -96,7 +99,11 @@ class MTemplate protected: friend class MTemplateStore; friend class MTemplateChoice; - /**creates a template wrapper from a cache file name; this constructor is used internally in the storage system*/ + /**creates a template wrapper from a cache file name; this constructor is used internally in the storage system + \param fn physical file name of the template + \param chk server side check sum of the template + \param dsc description of the template + */ MTemplate(QString fn,QString chk,QString dsc); private: QString m_fname,m_checksum,m_descr; diff --git a/src/templates/ticketedit.cpp b/src/templates/ticketedit.cpp index 08688ce..4275d16 100644 --- a/src/templates/ticketedit.cpp +++ b/src/templates/ticketedit.cpp @@ -11,28 +11,105 @@ // #include "ticketedit.h" +#include "centbox.h" +#include "misc.h" +#include "ticketrender.h" + +#include "MOTicket" #include #include #include +#include +#include #include #include #include #include #include +#include #include +#include #include #include #include #include +#include +#include #include #include #include #include #include +#include #include #include +#define HRECT 1 +#define HFONT 2 +#define HFILE 4 +#define HALIGN 8 +#define HSMOOTH 0x10 +#define HCONTENT 0x20 + +class MTEExampleDelegate:public QItemDelegate +{ + public: + MTEExampleDelegate(QObject *parent = 0):QItemDelegate(parent){} + + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, + const QModelIndex &index) const + { + if(index.column()!=1)return 0; + QString tp=index.model()->data(index,Qt::UserRole).toString(); + if(tp=="string")return new QLineEdit(parent); + if(tp=="money")return new MCentSpinBox(parent); + if(tp=="date")return new QDateTimeEdit(parent); + return 0; + } + + void setEditorData(QWidget *editor, const QModelIndex &index) const + { + const QAbstractItemModel*model=index.model(); + QString tp=index.model()->data(index,Qt::UserRole).toString(); + if(tp=="string") + ((QLineEdit*)editor)->setText(model->data(index).toString()); + if(tp=="money") + ((MCentSpinBox*)editor)->setValue(str2cent(model->data(index).toString())); + if(tp=="date") + ((QDateTimeEdit*)editor)->setDateTime(QDateTime::fromString(model->data(index).toString(),Qt::ISODate)); + + } + void setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const + { + QString tp=index.model()->data(index,Qt::UserRole).toString(); + if(tp=="string") + model->setData(index, ((QLineEdit*)editor)->text()); + if(tp=="money") + model->setData(index, cent2str(((MCentSpinBox*)editor)->value())); + if(tp=="date") + model->setData(index, ((QDateTimeEdit*)editor)->dateTime().toString(Qt::ISODate)); + } + + void updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, const QModelIndex &) const + {editor->setGeometry(option.rect);} +}; + +class MTENullDelegate:public QItemDelegate +{ + public: + MTENullDelegate(QObject *parent = 0):QItemDelegate(parent) {} + QWidget *createEditor(QWidget *, const QStyleOptionViewItem &, + const QModelIndex &) const {return 0;} + void setEditorData(QWidget *, const QModelIndex &) const{} + void setModelData(QWidget *, QAbstractItemModel *, + const QModelIndex &) const {} + void updateEditorGeometry(QWidget *,const QStyleOptionViewItem &, + const QModelIndex &) const {} +}; + class DPTR_CLASS_NAME(MTicketEditor) { public: @@ -43,11 +120,11 @@ class DPTR_CLASS_NAME(MTicketEditor) QString mUnit; QSizeF mSize; enum Type{ - Unknown, - LoadFont, - Picture, - Text, - Barcode + Unknown=0, + LoadFont=0x100|HFILE, + Picture=0x200|HFILE|HRECT|HSMOOTH, + Text=0x300|HFONT|HRECT|HALIGN|HCONTENT, + Barcode=0x400|HRECT, }; struct Line_s{ Type type; @@ -58,14 +135,15 @@ class DPTR_CLASS_NAME(MTicketEditor) QString font; double fontsize; Qt::Alignment align; + QString content; }; QListmLines; //widgets QDoubleSpinBox*labelwidth,*labelheight; QComboBox*unitbox; - QTableView*itemtable,*filetable; - QStandardItemModel*itemmodel,*filemodel; - QWidget*labelpicture; + QTableView*itemtable,*filetable,*expltable; + QStandardItemModel*itemmodel,*filemodel,*explmodel; + QWidget*ticketpicture,*voucherpicture; }; DEFINE_DPTR(MTicketEditor); @@ -84,11 +162,17 @@ MTicketEditor::MTicketEditor(QWidget* parent, Qt::WindowFlags f): QMainWindow(pa m->addSeparator(); m->addAction(tr("&Close"),this,SLOT(close())); m=mb->addMenu(tr("&Edit")); - m->addAction(tr("Add Item")); - m->addAction(tr("Delete Item")); + QMenu *aim=m->addMenu(tr("Add Item")); + m->addAction(tr("Delete Item"),this,SLOT(delItem())); m->addSeparator(); - m->addAction(tr("Add File")); - m->addAction(tr("Delete File")); + m->addAction(tr("Add File"),this,SLOT(addFile())); + m->addAction(tr("Delete File"),this,SLOT(delFile())); + QSignalMapper*map=new QSignalMapper(this); + map->setMapping(aim->addAction(tr("Add Text Item"),map,SLOT(map())),(int)Private::Text); + map->setMapping(aim->addAction(tr("Add Picture Item"),map,SLOT(map())),(int)Private::Picture); + map->setMapping(aim->addAction(tr("Add Barcode Item"),map,SLOT(map())),(int)Private::Barcode); + map->setMapping(aim->addAction(tr("Add Load Font Item"),map,SLOT(map())),(int)Private::LoadFont); + connect(map,SIGNAL(mapped(int)),this,SLOT(addItem(int))); //central QSplitter*central=new QSplitter(Qt::Vertical); @@ -115,15 +199,53 @@ MTicketEditor::MTicketEditor(QWidget* parent, Qt::WindowFlags f): QMainWindow(pa central->addWidget(split=new QSplitter); split->addWidget(d->filetable=new QTableView); d->filetable->setModel(d->filemodel=new QStandardItemModel(this)); - split->addWidget(d->labelpicture=new QWidget); d->filetable->horizontalHeader()->show(); d->filetable->verticalHeader()->hide(); + d->filetable->setItemDelegate(new MTENullDelegate(this)); + QTabWidget*tab; + split->addWidget(tab=new QTabWidget); + tab->addTab(d->ticketpicture=new QWidget,tr("As Ticket")); + tab->addTab(d->voucherpicture=new QWidget,tr("As Voucher")); + tab->addTab(d->expltable=new QTableView,tr("Example Data")); + d->expltable->setModel(d->explmodel=new QStandardItemModel(this)); + d->expltable->setItemDelegate(new MTEExampleDelegate(this)); + d->expltable->horizontalHeader()->show(); + d->expltable->verticalHeader()->hide(); //statusbar statusBar()->setSizeGripEnabled(true); setAttribute(Qt::WA_DeleteOnClose); + loadExampleData(); +} + +const QString example( +"BARCODE\tABCDEFGHIJK\tstring\n" +"PRICE\t12.34\tmoney\n" +"ROOM\tThe invisible Cabinet\tstring\n" +"TITLE\tSome title, this is.\tstring\n" +"DATETIME\t2023-01-23T19:54\tdate\n" +"ARTIST\tHenry the Drycleaner\tstring\n" +"PRICECATEGORY\tExpensive\tstring\n" +"PRICECATEGORYABBR\texp\tstring\n" +"VALUE\t12.00\tmoney"); + +void MTicketEditor::loadExampleData() +{ + d->explmodel->clear(); + d->explmodel->setHorizontalHeaderLabels(QStringList()<explmodel->insertRows(0,ex1.size()); + QSettings set; + set.beginGroup("labeleditor/examples"); + for(int i=0;iexplmodel->setData(d->explmodel->index(i,0),ex2[0]); + d->explmodel->setData(d->explmodel->index(i,1), set.value(ex2[0],ex2[1])); + d->explmodel->setData(d->explmodel->index(i,1), ex2[2], Qt::UserRole); + } } + void MTicketEditor::loadFile(QString fn) { //try to open the file @@ -164,6 +286,11 @@ static inline QSizeF str2size(QString s) return QSizeF(sl[0].toDouble(),sl[1].toDouble()); } +static inline QString size2str(QSizeF s) +{ + return QString("%1 %2").arg(s.width()).arg(s.height()); +} + static inline QPointF str2point(QString s) { QStringList sl=s.trimmed().split(" "); @@ -171,6 +298,30 @@ static inline QPointF str2point(QString s) return QPointF(sl[0].toDouble(),sl[1].toDouble()); } +static inline QString point2str(QPointF p) +{ + return QString("%1 %2").arg(p.x()).arg(p.y()); +} + +static inline QString align2str(Qt::Alignment a) +{ + switch(a){ + case Qt::AlignTop: + return QCoreApplication::translate("MTicketEditor","top"); + case Qt::AlignBottom: + return QCoreApplication::translate("MTicketEditor","bottom"); + case Qt::AlignHCenter: + case Qt::AlignVCenter: + return QCoreApplication::translate("MTicketEditor","center"); + case Qt::AlignLeft: + return QCoreApplication::translate("MTicketEditor","left"); + case Qt::AlignRight: + return QCoreApplication::translate("MTicketEditor","right"); + default: + return QCoreApplication::translate("MTicketEditor","align (%1)").arg((int)a); + } +} + void MTicketEditor::parseTemplate(QByteArray bytes) { QDomDocument doc; @@ -188,9 +339,9 @@ void MTicketEditor::parseTemplate(QByteArray bytes) QString tn=el.tagName(); Private::Line_s line; if(tn=="LoadFont")line.type=Private::LoadFont;else - if(tn=="Picture")line.type=Private::LoadFont;else - if(tn=="Text")line.type=Private::LoadFont;else - if(tn=="Barcode")line.type=Private::LoadFont; + if(tn=="Picture")line.type=Private::Picture;else + if(tn=="Text")line.type=Private::Text;else + if(tn=="Barcode")line.type=Private::Barcode; else line.type=Private::Unknown; line.file=el.attribute("file"); line.font=el.attribute("font"); @@ -207,6 +358,7 @@ void MTicketEditor::parseTemplate(QByteArray bytes) if(tn=="top")line.align|=Qt::AlignTop;else if(tn=="bottom")line.align|=Qt::AlignBottom;else if(tn=="center")line.align|=Qt::AlignVCenter; + line.content=el.text(); d->mLines.append(line); } } @@ -264,26 +416,118 @@ void MTicketEditor::updateDisplay() d->filemodel->clear(); if(d->filemodel->columnCount()<2) d->filemodel->insertColumns(0,2); + d->filemodel->insertRows(0,d->mFiles.size()); d->filemodel->setHorizontalHeaderLabels(QStringList()<mFiles.keys(); + for(int i=0;imFiles.size();i++){ + d->filemodel->setData(d->filemodel->index(i,0),fnames[i]); + d->filemodel->setData(d->filemodel->index(i,1),d->mFiles[fnames[i]].size()); + } + d->filetable->resizeColumnsToContents(); //items d->itemmodel->clear(); - if(d->itemmodel->columnCount()==0) - d->itemmodel->insertColumns(0,5); + d->itemmodel->insertRows(0,d->mLines.size()); d->itemmodel->setHorizontalHeaderLabels(QStringList() <mLines.size();i++){ + QString tp; + Private::Type tpe=d->mLines[i].type; + switch(tpe){ + case Private::LoadFont:tp=tr("Load Font File");break; + case Private::Picture:tp=tr("Show Picture");break; + case Private::Text:tp=tr("Show Text Line");break; + case Private::Barcode:tp=tr("Show Barcode");break; + default:tp=tr("Unknown");break; + } + d->itemmodel->setData(d->itemmodel->index(i,0),tp); + d->itemmodel->setData(d->itemmodel->index(i,0),(int)tpe,Qt::UserRole); + if(tpe&HRECT){ + d->itemmodel->setData(d->itemmodel->index(i,2), size2str(d->mLines[i].size)); + d->itemmodel->setData(d->itemmodel->index(i,1), point2str(d->mLines[i].offset)); + } + if(tpe&HFONT){ + d->itemmodel->setData(d->itemmodel->index(i,3),d->mLines[i].font); + d->itemmodel->setData(d->itemmodel->index(i,4),d->mLines[i].fontsize); + } + if(tpe&HFILE) + d->itemmodel->setData(d->itemmodel->index(i,3),d->mLines[i].file); + if(tpe&HSMOOTH) + d->itemmodel->setData(d->itemmodel->index(i,5), d->mLines[i].smooth?tr("smooth"):tr("edged")); + if(tpe&HALIGN){ + d->itemmodel->setData(d->itemmodel->index(i,6), align2str(d->mLines[i].align&Qt::AlignHorizontal_Mask)); + d->itemmodel->setData(d->itemmodel->index(i,7), align2str(d->mLines[i].align&Qt::AlignVertical_Mask)); + } + if(tpe&HCONTENT) + d->itemmodel->setData(d->itemmodel->index(i,8), d->mLines[i].content); + } + d->itemtable->resizeColumnsToContents(); //do rendering rerender(); } void MTicketEditor::rerender() { + QMapexdata; + for(int i=0;iexplmodel->rowCount();i++){ + exdata.insert( + d->explmodel->data(d->explmodel->index(i,0)).toString(), + d->explmodel->data(d->explmodel->index(i,1)).toString() + ); + } + //render ticket + MOTicket t; + t.setticketid(exdata.value("BARCODE")); + t.setprice(str2cent(exdata.value("PRICE"))); + QTemporaryFile tfile(QDir::tempPath()+"/templateXXXXXX.xtt"); + tfile.open(); + saveTemplate(tfile); + MTicketRenderer rend(tfile.fileName()); + rend.render(t,*(d->ticketpicture)); + //render voucher +} + +void MTicketEditor::saveTemplate(QFile& fd) +{ + QZip zip; + zip.open(&fd); + {QBuffer buf;buf.open(QIODevice::ReadWrite); + saveXmlPart(buf);buf.seek(0); + zip.storeFile("template.xml",buf);} + zip.close(); + fd.flush(); +} + +void MTicketEditor::saveXmlPart(QIODevice& fd) +{ + +} + + +void MTicketEditor::addFile() +{ + +} + +void MTicketEditor::delFile() +{ + +} + +void MTicketEditor::addItem(int ) +{ + +} + +void MTicketEditor::delItem() +{ } diff --git a/src/templates/ticketedit.h b/src/templates/ticketedit.h index 1f2878f..2fbb7a8 100644 --- a/src/templates/ticketedit.h +++ b/src/templates/ticketedit.h @@ -18,6 +18,8 @@ #include "dptr.h" +class QFile; +class QIODevice; /**An editor for ticket templates.*/ class MTicketEditor:public QMainWindow { @@ -46,6 +48,13 @@ class MTicketEditor:public QMainWindow void rerender(); void parseTemplate(QByteArray); void updateDisplay(); + void addItem(int); + void delItem(); + void addFile(); + void delFile(); + void loadExampleData(); + void saveTemplate(QFile&); + void saveXmlPart(QIODevice&); }; #endif