/TempatesEditor/trunk/src/view.cpp

http://cupsfilter.googlecode.com/ · C++ · 432 lines · 345 code · 57 blank · 30 comment · 16 complexity · 91d86048dd6402e8bfdccdd443fd9550 MD5 · raw file

  1. #include "view.h"
  2. #include "ui_view.h"
  3. #define POINT_TO_CM(cm) ((cm)/28.3465058)
  4. #define POINT_TO_MM(mm) ((mm)/2.83465058) //////// 0.352777778
  5. #define POINT_TO_DM(dm) ((dm)/283.465058)
  6. #define POINT_TO_INCH(inch) ((inch)/72.0)
  7. #define MM_TO_POINT(mm) ((mm)*2.83465058)
  8. #define CM_TO_POINT(cm) ((cm)*28.3465058) ///// 28.346456693
  9. #define DM_TO_POINT(dm) ((dm)*283.465058)
  10. #define INCH_TO_POINT(inch) ((inch)*72.0)
  11. static const int ObjectName = 0;
  12. View::View(QWidget *parent) :
  13. QFrame(parent),
  14. m_ui(new Ui::View)
  15. {
  16. m_ui->setupUi(this);
  17. init();
  18. setFrameStyle(Sunken | StyledPanel);
  19. //MM_TO_POINT(210) MM_TO_POINT(297)
  20. createScene();
  21. graphicsView = new QGraphicsView(scene);
  22. graphicsView->setRenderHint(QPainter::Antialiasing, false);
  23. graphicsView->setDragMode(QGraphicsView::RubberBandDrag);
  24. graphicsView->setOptimizationFlags(QGraphicsView::DontSavePainterState);
  25. graphicsView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
  26. graphicsView->setBackgroundBrush(Qt::gray);
  27. int size = style()->pixelMetric(QStyle::PM_ToolBarIconSize);
  28. QSize iconSize(size, size);
  29. QToolButton *zoomInIcon = new QToolButton;
  30. zoomInIcon->setAutoRepeat(true);
  31. zoomInIcon->setAutoRepeatInterval(33);
  32. zoomInIcon->setAutoRepeatDelay(0);
  33. zoomInIcon->setIcon(QPixmap(":/images/zoomin.png"));
  34. zoomInIcon->setIconSize(iconSize);
  35. QToolButton *zoomOutIcon = new QToolButton;
  36. zoomOutIcon->setAutoRepeat(true);
  37. zoomOutIcon->setAutoRepeatInterval(33);
  38. zoomOutIcon->setAutoRepeatDelay(0);
  39. zoomOutIcon->setIcon(QPixmap(":/images/zoomout.png"));
  40. zoomOutIcon->setIconSize(iconSize);
  41. zoomSlider = new QSlider;
  42. zoomSlider->setMinimum(0);
  43. zoomSlider->setMaximum(500);
  44. zoomSlider->setValue(250);
  45. zoomSlider->setTickPosition(QSlider::TicksRight);
  46. // Zoom slider layout
  47. QVBoxLayout *zoomSliderLayout = new QVBoxLayout;
  48. zoomSliderLayout->addWidget(zoomInIcon);
  49. zoomSliderLayout->addWidget(zoomSlider);
  50. zoomSliderLayout->addWidget(zoomOutIcon);
  51. // Label layout
  52. QHBoxLayout *labelLayout = new QHBoxLayout;
  53. printButton = new QToolButton;
  54. printButton->setIcon(QIcon(QPixmap(":/images/print.png")));
  55. printButton->setIconSize(iconSize);
  56. label = new QLabel();
  57. label->setText(QObject::trUtf8("???????"));
  58. //sys_button =new QRadioButton(QObject::trUtf8("???????????"), this);
  59. //user_button =new QRadioButton(QObject::trUtf8("????????????????"), this);
  60. //sys_button->setChecked(true);
  61. templatesCBox = new QComboBox();
  62. addTmplButton = new QToolButton;
  63. addTmplButton->setIcon(QPixmap(":/images/addtmpl.png"));
  64. addTmplButton->setIconSize(iconSize);
  65. delTmplButton = new QToolButton;
  66. delTmplButton->setIcon(QPixmap(":/images/deltmpl.png"));
  67. delTmplButton->setIconSize(iconSize);
  68. saveTmplButton = new QToolButton;
  69. saveTmplButton->setIcon(QPixmap(":/images/savetmpl.png"));
  70. saveTmplButton->setIconSize(iconSize);
  71. firstPageButton = new QToolButton;
  72. firstPageButton->setIcon(QPixmap(":/images/face_page.png"));
  73. firstPageButton->setIconSize(iconSize);
  74. firstPageButton->setToolTip(QObject::trUtf8("????? ??????? ??????? ???????"));
  75. secondPageButton = new QToolButton;
  76. secondPageButton->setIcon(QPixmap(":/images/over_face_page.png"));
  77. secondPageButton->setToolTip(QObject::trUtf8("????? ???????? ??????? ???????"));
  78. secondPageButton->setIconSize(iconSize);
  79. //label_page = new QLabel();
  80. //label_page->setText(QObject::trUtf8("?????? ????????"));
  81. pageSizeCBox =new QComboBox(this);
  82. //QStringList list;// =QString("A4, A3,B5, Letter, Legal, Executive,A0, A1, A2, A5, A6, A7, A8, A9, B0, B1,B10, B2, B3, B4, B6, B7, B8, B9").split(",");
  83. pageSizeCBox->addItems(getPageSizeList());
  84. QButtonGroup *grpBtn = new QButtonGroup();
  85. portretButton = new QToolButton;
  86. portretButton->setIcon(QPixmap(":/images/portret.png"));
  87. portretButton->setIconSize(iconSize);
  88. portretButton->setToolTip(QObject::trUtf8("????? ??????? ?????????? ???????"));
  89. portretButton->setCheckable(true);
  90. portretButton->setChecked(true);
  91. landscapeButton = new QToolButton;
  92. landscapeButton->setIcon(QPixmap(":/images/landscape.png"));
  93. landscapeButton->setIconSize(iconSize);
  94. landscapeButton->setToolTip(QObject::trUtf8("????? ????????? ?????????? ???????"));
  95. landscapeButton->setCheckable(true);
  96. grpBtn->addButton(portretButton,0);
  97. grpBtn->addButton(landscapeButton,1);
  98. labelLayout->addWidget(label);
  99. // labelLayout->addWidget(sys_button);
  100. //labelLayout->addWidget(user_button);
  101. labelLayout->addWidget(templatesCBox);
  102. labelLayout->addWidget(addTmplButton);
  103. labelLayout->addWidget(delTmplButton);
  104. labelLayout->addWidget(saveTmplButton);
  105. labelLayout->addWidget(firstPageButton);
  106. labelLayout->addWidget(secondPageButton);
  107. labelLayout->addWidget(pageSizeCBox);
  108. labelLayout->addWidget(portretButton);
  109. labelLayout->addWidget(landscapeButton);
  110. labelLayout->addStretch();
  111. labelLayout->addWidget(printButton);
  112. //????????? ???????? ???????? ???-???
  113. QGridLayout *topLayout = new QGridLayout;
  114. topLayout->addLayout(labelLayout, 0, 0);
  115. topLayout->addWidget(graphicsView, 1, 0);
  116. topLayout->addLayout(zoomSliderLayout, 1, 1);
  117. setLayout(topLayout);
  118. connect(zoomSlider, SIGNAL(valueChanged(int)), this, SLOT(setupMatrix()));
  119. connect(zoomInIcon, SIGNAL(clicked()), this, SLOT(zoomIn()));
  120. connect(zoomOutIcon, SIGNAL(clicked()), this, SLOT(zoomOut()));
  121. connect(printButton, SIGNAL(clicked()), this, SLOT(print()));
  122. connect(pageSizeCBox ,SIGNAL(currentIndexChanged(QString)),this,SLOT(setPaperSize(QString)));
  123. connect(grpBtn,SIGNAL(buttonClicked(int)),this,SLOT(flipPage(int)));
  124. connect(templatesCBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(readFromStream(QString)));
  125. connect(saveTmplButton,SIGNAL(clicked()),this,SLOT(saveToStream()));
  126. //QPrintPreviewDialog *p = new QPrintPreviewDialog();
  127. //p->show();
  128. setupMatrix();
  129. }
  130. void View::setPaperSize(const QString & text)
  131. {
  132. qDebug() << Q_FUNC_INFO;
  133. QMapIterator<QString, int> i(page_size);
  134. while (i.hasNext()) {
  135. i.next();
  136. if (i.key()==text){
  137. switch (i.value()){
  138. case QPrinter::A4:
  139. page_width=210;
  140. page_height=297;
  141. break;
  142. case QPrinter::A3:
  143. page_width=297;
  144. page_height=420;
  145. break;
  146. }
  147. qDebug() <<Q_FUNC_INFO << page_height <<page_width;
  148. }
  149. }
  150. //drawPage();
  151. }
  152. bool View::get_pageOrient()
  153. {
  154. return page_orient;
  155. }
  156. void View::set_pageOrient(bool orient)
  157. {
  158. page_orient=orient;
  159. }
  160. void View::flipPage(int Btn)
  161. {
  162. qDebug() <<Q_FUNC_INFO<< Btn << page_orient <<get_pageOrient()<< page_height <<page_width;
  163. qDebug() << margin_left << margin_top << margin_left<<margin_right;
  164. if (Btn==0){
  165. if (page_orient){
  166. page_orient=false;
  167. std::swap(page_height,page_width);
  168. drawPage();
  169. }
  170. }else{
  171. if (Btn==1){
  172. if (!page_orient){
  173. page_orient=true;
  174. std::swap(page_height,page_width);
  175. drawPage();
  176. }
  177. }
  178. }
  179. }
  180. void View::drawPage()
  181. {
  182. //?????? ????????????? ????????? ??????? (? ???????? ?????)
  183. qDebug() <<Q_FUNC_INFO<< page_orient << page_height <<page_width;
  184. qDebug() << margin_left << margin_top << margin_left<<margin_right;
  185. scene->clear();
  186. scene->setSceneRect(0, 0, MM_TO_POINT(page_width),MM_TO_POINT(page_height));
  187. qDebug() << scene->sceneRect();
  188. /*
  189. QGraphicsRectItem *paper_rect = new QGraphicsRectItem (QRectF(0,0, MM_TO_POINT(page_width),MM_TO_POINT(page_height)));
  190. qDebug() <<"paper_rect"<<MM_TO_POINT(page_width) << MM_TO_POINT(page_height);
  191. paper_rect->setPen(QPen(Qt::black));
  192. paper_rect->setBrush(QBrush(Qt::white));
  193. paper_rect->setZValue(-1000.0);
  194. paper_rect->setData(ObjectName, "Paper");
  195. scene->addItem(paper_rect);
  196. */
  197. QGraphicsRectItem *border_rect = new QGraphicsRectItem (QRectF(margin_left, margin_top, MM_TO_POINT(page_width)-margin_left-margin_right,MM_TO_POINT(page_height)-margin_top-margin_bottom));
  198. qDebug() <<"margin_rect"<< margin_left << margin_top << margin_left<<margin_right;
  199. border_rect->setPen(QPen(Qt::black,2,Qt::DotLine));
  200. border_rect->setBrush(QBrush(Qt::white));
  201. border_rect->setOpacity(0.5);
  202. border_rect->setZValue(0);
  203. border_rect->setData(ObjectName, "Border");
  204. scene->addItem(border_rect);
  205. scene->update();
  206. }
  207. void View::createScene()
  208. {
  209. scene = new QGraphicsScene();
  210. // default page size A4
  211. setPaperSize(QString("A4 (210 x 297 mm)"));
  212. drawPage();
  213. for (int i = 0; i < scene->items().size(); ++i){
  214. QGraphicsItem *item = scene->items().at(i);
  215. if ( item->data(ObjectName).toString()=="Paper"){
  216. SimpleItem* pSimpleItem = new SimpleItem;
  217. pSimpleItem->setPos(80, 40);
  218. pSimpleItem->setText(QStringList()<<QObject::trUtf8("????????")<<" ????13 ");
  219. pSimpleItem->setFlag(QGraphicsItem::ItemIsMovable);
  220. pSimpleItem->setParentItem(item);
  221. //scene->addItem(pSimpleItem);
  222. SimpleItem* pSimpleItem1 = new SimpleItem;
  223. pSimpleItem1->setParentItem(item);
  224. pSimpleItem1->setPos(10, 40);
  225. pSimpleItem1->setText(QStringList()<<QObject::trUtf8("?? ?12/23-412")<<"??-4134");
  226. pSimpleItem1->setFlag(QGraphicsItem::ItemIsMovable);
  227. //scene->addItem(pSimpleItem1);
  228. }
  229. }
  230. }
  231. QStringList View::getPageSizeList()
  232. {
  233. QMapIterator<QString, int> i(page_size);
  234. QStringList list;
  235. while (i.hasNext()) {
  236. i.next();
  237. list <<i.key();
  238. }
  239. return list;
  240. }
  241. void View::changeEvent(QEvent *e)
  242. {
  243. QFrame::changeEvent(e);
  244. switch (e->type()) {
  245. case QEvent::LanguageChange:
  246. m_ui->retranslateUi(this);
  247. break;
  248. default:
  249. break;
  250. }
  251. }
  252. void View::print()
  253. {
  254. #ifndef QT_NO_PRINTER
  255. QPrinter printer;
  256. QPrintDialog dialog(&printer, this);
  257. if (dialog.exec() == QDialog::Accepted) {
  258. QPainter painter(&printer);
  259. QRectF rect;
  260. double onepoint = printer.logicalDpiY() / 72.0;
  261. scene->render(&painter);
  262. //graphicsView->render(&painter);
  263. }
  264. #endif
  265. }
  266. void View::setupMatrix()
  267. {
  268. qreal scale = qPow(qreal(2), (zoomSlider->value() - 250) / qreal(50));
  269. QMatrix matrix;
  270. matrix.scale(scale, scale);
  271. graphicsView->setMatrix(matrix);
  272. }
  273. void View::init()
  274. {
  275. page_orient= false;
  276. margin_top = MM_TO_POINT(15);
  277. margin_bottom=MM_TO_POINT(15);
  278. margin_left=MM_TO_POINT(35);
  279. margin_right=MM_TO_POINT(15);
  280. qDebug() <<Q_FUNC_INFO<< page_orient <<margin_left << margin_top << margin_left<<margin_right;
  281. page_size.insert(QString("A4 (210 x 297 mm)"), QPrinter::A4);
  282. page_size.insert(QString("A3 (297 x 420 mm)"), QPrinter::A3);
  283. page_size.insert(QString("A0 (841 x 1189 mm)"), QPrinter::A0);
  284. page_size.insert(QString("A1 (594 x 841 mm)"), QPrinter::A1);
  285. page_size.insert(QString("A2 (420 x 594 mm)"), QPrinter::A2);
  286. page_size.insert(QString("A5 (148 x 210 mm)"), QPrinter::A5);
  287. page_size.insert(QString("A6 (105 x 148 mm)"), QPrinter::A6);
  288. page_size.insert(QString("A7 (74 x 105 mm)"), QPrinter::A7);
  289. page_size.insert(QString("A8 (52 x 74 mm)"), QPrinter::A8);
  290. page_size.insert(QString("A9 (37 x 52 mm)"), QPrinter::A9);
  291. page_size.insert(QString("B0 (1000 x 1414 mm)"), QPrinter::B0);
  292. page_size.insert(QString("B1 (707 x 1000 mm)"), QPrinter::B1);
  293. page_size.insert(QString("B2 (500 x 707 mm)"), QPrinter::B2);
  294. page_size.insert(QString("B3 (353 x 500 mm)"), QPrinter::B3);
  295. page_size.insert(QString("B4 (250 x 353 mm)"), QPrinter::B4);
  296. page_size.insert(QString("B5 (176 x 250 mm)"), QPrinter::B5);
  297. page_size.insert(QString("B6 (125 x 176 mm)"), QPrinter::B6);
  298. page_size.insert(QString("B7 (88 x 125 mm)"), QPrinter::B7);
  299. page_size.insert(QString("B8 (62 x 88 mm)"), QPrinter::B8);
  300. page_size.insert(QString("B9 (44 x 62 mm)"), QPrinter::B9);
  301. page_size.insert(QString("B10 (31 x 44 mm)"), QPrinter::B10);
  302. page_size.insert(QString("C5E (163 x 229 mm)"), QPrinter::C5E);
  303. page_size.insert(QString("DLE (110 x 220 mm)"), QPrinter::DLE);
  304. page_size.insert(QString("Executive (191 x 254 mm)"), QPrinter::Executive);
  305. page_size.insert(QString("Folio (210 x 330 mm)"), QPrinter::Folio);
  306. page_size.insert(QString("Ledger (432 x 279 mm)"), QPrinter::Ledger);
  307. page_size.insert(QString("Legal (216 x 356 mm)"), QPrinter::Legal);
  308. page_size.insert(QString("Letter (216 x 279 mm)"), QPrinter::Letter);
  309. page_size.insert(QString("Tabloid (279 x 432 mm)"), QPrinter::Tabloid);
  310. }
  311. void View::setTemplatesList(QStringList & t_list)
  312. {
  313. templatesCBox->addItems(t_list);
  314. }
  315. View::~View()
  316. {
  317. delete m_ui;
  318. }
  319. void View::zoomIn()
  320. {
  321. zoomSlider->setValue(zoomSlider->value() + 1);
  322. }
  323. void View::zoomOut()
  324. {
  325. zoomSlider->setValue(zoomSlider->value() - 1);
  326. }
  327. void View::saveToStream()
  328. {
  329. QString template_name;
  330. template_name=templatesCBox->currentText();
  331. QFile file(template_name+".tmpl");
  332. file.open(QIODevice::WriteOnly);
  333. QDataStream out(&file); // we will serialize the data into the file
  334. out.setVersion(QDataStream::Qt_4_5);
  335. out << page_height << page_width <<page_orient;
  336. out << margin_top << margin_bottom << margin_left << margin_right;
  337. out << scene->items().size();
  338. QString t_str;
  339. for (int i = 0; i < scene->items().size(); ++i){
  340. QGraphicsItem *item = scene->items().at(i);
  341. t_str=item->data(ObjectName).toString();
  342. if ( t_str=="Paper"||t_str==QString("Border")){
  343. out <<item->pos() <<item->data(ObjectName).toString();
  344. }else{
  345. SimpleItem* item =(SimpleItem* )scene->items().at(i);
  346. out << item->pos() << item->getFont() <<item->getColor() << item->getText();
  347. }
  348. }
  349. file.close();
  350. }
  351. void View::readFromStream(QString template_name)
  352. {
  353. elemList.clear();
  354. QFile file(template_name+".tmpl");
  355. file.open(QIODevice::ReadOnly);
  356. QDataStream in(&file);
  357. in.setVersion(QDataStream::Qt_4_5);
  358. //TODO save and read magic word !!!
  359. int items_count;
  360. in >> page_height >> page_width >>page_orient;
  361. in >> margin_top >> margin_bottom >> margin_left >> margin_right;
  362. in >> items_count;
  363. for (int i=0;i <items_count;i++){
  364. SimpleItem* pItem = new SimpleItem;
  365. QPointF ps;
  366. QFont fnt;
  367. QColor col;
  368. QStringList pList;
  369. in >>ps >>fnt >>col >>pList;
  370. pItem->setPos(ps);
  371. pItem->setText(pList);
  372. elemList.append(pItem);
  373. }
  374. file.close();
  375. }